@beworke/pixel 0.1.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/CHANGELOG.md +194 -0
  2. package/README.md +163 -0
  3. package/RELEASE_CANDIDATE.md +256 -0
  4. package/dist/PixelLogger-B21lEjep.d.mts +8 -0
  5. package/dist/PixelLogger-B21lEjep.d.ts +8 -0
  6. package/dist/StorageFactory-BhpbB6Jj.d.mts +8 -0
  7. package/dist/StorageFactory-CAkJJqVD.d.ts +8 -0
  8. package/dist/config/index.cjs.js +3 -0
  9. package/dist/config/index.cjs.js.map +1 -0
  10. package/dist/config/index.d.mts +19 -0
  11. package/dist/config/index.d.ts +19 -0
  12. package/dist/config/index.esm.js +3 -0
  13. package/dist/config/index.esm.js.map +1 -0
  14. package/dist/events/index.cjs.js +3 -0
  15. package/dist/events/index.cjs.js.map +1 -0
  16. package/dist/events/index.d.mts +1 -0
  17. package/dist/events/index.d.ts +1 -0
  18. package/dist/events/index.esm.js +3 -0
  19. package/dist/events/index.esm.js.map +1 -0
  20. package/dist/examples/html-script/README.md +71 -0
  21. package/dist/examples/html-script/RELEASE_CANDIDATE.md +121 -0
  22. package/dist/examples/html-script/add-payment-info/README.md +46 -0
  23. package/dist/examples/html-script/add-payment-info/example-add-payment-info-card-autocomplete.html +494 -0
  24. package/dist/examples/html-script/add-payment-info/example-add-payment-info-card-disabled.html +478 -0
  25. package/dist/examples/html-script/add-payment-info/example-add-payment-info-card-fields.html +486 -0
  26. package/dist/examples/html-script/add-payment-info/example-add-payment-info-data-track.html +479 -0
  27. package/dist/examples/html-script/add-payment-info/example-add-payment-info-dedupe.html +492 -0
  28. package/dist/examples/html-script/add-payment-info/example-add-payment-info-manual.html +495 -0
  29. package/dist/examples/html-script/add-payment-info/example-add-payment-info-rules-card.html +469 -0
  30. package/dist/examples/html-script/add-payment-info/example-add-payment-info-security.html +489 -0
  31. package/dist/examples/html-script/add-to-cart/README.md +36 -0
  32. package/dist/examples/html-script/add-to-cart/example-add-to-cart-attribute.html +517 -0
  33. package/dist/examples/html-script/add-to-cart/example-add-to-cart-auto.html +512 -0
  34. package/dist/examples/html-script/add-to-cart/example-add-to-cart-click.html +519 -0
  35. package/dist/examples/html-script/add-to-cart/example-add-to-cart-dedupe.html +514 -0
  36. package/dist/examples/html-script/add-to-cart/example-add-to-cart-manual.html +517 -0
  37. package/dist/examples/html-script/add-to-cart/example-add-to-cart-order-bump.html +527 -0
  38. package/dist/examples/html-script/add-to-cart/example-add-to-cart-text.html +524 -0
  39. package/dist/examples/html-script/example-basic.html +350 -0
  40. package/dist/examples/html-script/example-behavior.html +435 -0
  41. package/dist/examples/html-script/example-conversion.html +479 -0
  42. package/dist/examples/html-script/example-integration.html +709 -0
  43. package/dist/examples/html-script/example-transport.html +748 -0
  44. package/dist/examples/html-script/initiate-checkout/README.md +38 -0
  45. package/dist/examples/html-script/initiate-checkout/example-initiate-checkout-attribute.html +485 -0
  46. package/dist/examples/html-script/initiate-checkout/example-initiate-checkout-auto.html +491 -0
  47. package/dist/examples/html-script/initiate-checkout/example-initiate-checkout-click.html +493 -0
  48. package/dist/examples/html-script/initiate-checkout/example-initiate-checkout-manual.html +494 -0
  49. package/dist/examples/html-script/initiate-checkout/example-initiate-checkout-snapshot.html +497 -0
  50. package/dist/examples/html-script/initiate-checkout/example-initiate-checkout-submit.html +502 -0
  51. package/dist/examples/html-script/initiate-checkout/example-initiate-checkout-text.html +496 -0
  52. package/dist/examples/html-script/lead/README.md +25 -0
  53. package/dist/examples/html-script/lead/example-lead-trigger-attribute.html +594 -0
  54. package/dist/examples/html-script/lead/example-lead-trigger-auto.html +431 -0
  55. package/dist/examples/html-script/lead/example-lead-trigger-click.html +587 -0
  56. package/dist/examples/html-script/release-candidate.html +726 -0
  57. package/dist/examples/html-script/remove-from-cart/README.md +36 -0
  58. package/dist/examples/html-script/remove-from-cart/example-remove-from-cart-attribute.html +532 -0
  59. package/dist/examples/html-script/remove-from-cart/example-remove-from-cart-css.html +524 -0
  60. package/dist/examples/html-script/remove-from-cart/example-remove-from-cart-dedupe.html +540 -0
  61. package/dist/examples/html-script/remove-from-cart/example-remove-from-cart-manual.html +533 -0
  62. package/dist/examples/html-script/remove-from-cart/example-remove-from-cart-multi.html +557 -0
  63. package/dist/examples/html-script/remove-from-cart/example-remove-from-cart-state.html +539 -0
  64. package/dist/examples/html-script/remove-from-cart/example-remove-from-cart-text.html +524 -0
  65. package/dist/examples/html-script/search/README.md +41 -0
  66. package/dist/examples/html-script/search/example-search-attribute.html +454 -0
  67. package/dist/examples/html-script/search/example-search-button-sync.html +455 -0
  68. package/dist/examples/html-script/search/example-search-dedupe.html +466 -0
  69. package/dist/examples/html-script/search/example-search-input.html +456 -0
  70. package/dist/examples/html-script/search/example-search-manual.html +473 -0
  71. package/dist/examples/html-script/search/example-search-submit.html +450 -0
  72. package/dist/examples/html-script/search/example-search-text.html +441 -0
  73. package/dist/examples/html-script/view-content/README.md +48 -0
  74. package/dist/examples/html-script/view-content/example-view-content-attribute.html +488 -0
  75. package/dist/examples/html-script/view-content/example-view-content-css.html +467 -0
  76. package/dist/examples/html-script/view-content/example-view-content-dedupe.html +485 -0
  77. package/dist/examples/html-script/view-content/example-view-content-empty.html +469 -0
  78. package/dist/examples/html-script/view-content/example-view-content-manual.html +496 -0
  79. package/dist/examples/html-script/view-content/example-view-content-product-card.html +478 -0
  80. package/dist/examples/html-script/view-content/example-view-content-text.html +473 -0
  81. package/dist/examples/release-candidate/README.md +14 -0
  82. package/dist/examples/v2/README.md +33 -0
  83. package/dist/index-DUfFzniE.d.mts +274 -0
  84. package/dist/index-DUfFzniE.d.ts +274 -0
  85. package/dist/index.cjs.js +3 -0
  86. package/dist/index.cjs.js.map +1 -0
  87. package/dist/index.d.mts +364 -0
  88. package/dist/index.d.ts +364 -0
  89. package/dist/index.esm.js +3 -0
  90. package/dist/index.esm.js.map +1 -0
  91. package/dist/logger/index.cjs.js +3 -0
  92. package/dist/logger/index.cjs.js.map +1 -0
  93. package/dist/logger/index.d.mts +12 -0
  94. package/dist/logger/index.d.ts +12 -0
  95. package/dist/logger/index.esm.js +3 -0
  96. package/dist/logger/index.esm.js.map +1 -0
  97. package/dist/pixel-CbeF25mD.d.mts +555 -0
  98. package/dist/pixel-CbeF25mD.d.ts +555 -0
  99. package/dist/pixel-default-config-1VgLFOiL.d.mts +5 -0
  100. package/dist/pixel-default-config-Bxb-Vdd8.d.ts +5 -0
  101. package/dist/runtime/index.cjs.js +3 -0
  102. package/dist/runtime/index.cjs.js.map +1 -0
  103. package/dist/runtime/index.d.mts +48 -0
  104. package/dist/runtime/index.d.ts +48 -0
  105. package/dist/runtime/index.esm.js +3 -0
  106. package/dist/runtime/index.esm.js.map +1 -0
  107. package/dist/services/index.cjs.js +3 -0
  108. package/dist/services/index.cjs.js.map +1 -0
  109. package/dist/services/index.d.mts +169 -0
  110. package/dist/services/index.d.ts +169 -0
  111. package/dist/services/index.esm.js +3 -0
  112. package/dist/services/index.esm.js.map +1 -0
  113. package/dist/types-CTpRvFKZ.d.ts +71 -0
  114. package/dist/types-DGlBdsAy.d.mts +71 -0
  115. package/dist/v2/global.global.js +3 -0
  116. package/dist/v2/global.global.js.map +1 -0
  117. package/dist/v2/index.cjs.js +3 -0
  118. package/dist/v2/index.cjs.js.map +1 -0
  119. package/dist/v2/index.d.mts +7 -0
  120. package/dist/v2/index.d.ts +7 -0
  121. package/dist/v2/index.esm.js +3 -0
  122. package/dist/v2/index.esm.js.map +1 -0
  123. package/package.json +101 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/runtime/index.ts","../../src/runtime/ModuleRegistry.ts","../../src/events/builder/BaseEventBuilder.ts","../../src/logger/ConsolePixelLogger.ts","../../src/services/attribution/types.ts","../../src/services/attribution/ClickIdParser.ts","../../src/services/attribution/CookieCollector.ts","../../src/services/attribution/AttributionCollector.ts","../../src/services/attribution/AttributionStore.ts","../../src/services/attribution/AttributionService.ts","../../src/services/browser-metadata/BrowserMetadataService.ts","../../src/services/dispatcher/DispatcherService.ts","../../src/services/fingerprint/FingerprintService.ts","../../src/services/storage/BrowserStorageAdapter.ts","../../src/services/storage/MemoryStorageAdapter.ts","../../src/services/storage/StorageService.ts","../../src/services/storage/StorageFactory.ts","../../src/services/session/session-id.ts","../../src/services/session/SessionService.ts","../../src/services/visitor/visitor-id.ts","../../src/services/visitor/VisitorService.ts","../../src/runtime/PixelRuntime.ts"],"sourcesContent":["export { ModuleRegistry } from './ModuleRegistry';\nexport { PixelRuntime } from './PixelRuntime';\nexport type { PixelRuntimeContext } from './PixelRuntimeContext';\nexport type { PixelRuntimeServices } from './PixelRuntimeServices';\nexport type { ModuleName, PixelModule } from './types';\n","import type { PixelModule } from './types';\n\nexport class ModuleRegistry {\n private readonly modules: PixelModule[] = [];\n\n register(module: PixelModule): void {\n if (this.modules.some(existing => existing.name === module.name)) {\n throw new Error(`[Pixel] Module \"${module.name}\" is already registered`);\n }\n\n this.modules.push(module);\n }\n\n getAll(): readonly PixelModule[] {\n return this.modules;\n }\n\n size(): number {\n return this.modules.length;\n }\n}\n","import type { AttributionService } from '@/services/attribution/types';\nimport type { BrowserMetadataService } from '@/services/browser-metadata';\n\nimport type { BasePixelEvent } from '../base';\n\nexport class BaseEventBuilder {\n private readonly metadataService: BrowserMetadataService;\n\n private readonly attribution: AttributionService | null;\n\n constructor(\n metadataService: BrowserMetadataService,\n attribution?: AttributionService | null\n ) {\n this.metadataService = metadataService;\n this.attribution = attribution ?? null;\n }\n\n build<T extends { type: string }>(event: T): T & BasePixelEvent {\n const metadata = this.metadataService.getMetadata();\n const identifiers = this.attribution?.getSnapshot();\n const hasIdentifiers =\n identifiers !== undefined &&\n Object.keys(identifiers).some(key => {\n const value = identifiers[key as keyof typeof identifiers];\n return value !== undefined && value !== null && value !== '';\n });\n\n return {\n ...event,\n timestamp: Date.now(),\n path: metadata.path,\n url: metadata.url,\n hostname: metadata.hostname,\n language: metadata.language,\n timezone: metadata.timezone,\n ...(hasIdentifiers ? { identifiers } : {}),\n };\n }\n}\n","import type { PixelLogger } from './PixelLogger';\n\nexport class ConsolePixelLogger implements PixelLogger {\n constructor(private readonly debugEnabled: boolean) {}\n\n debug(...args: unknown[]): void {\n if (!this.debugEnabled) return;\n if (typeof console === 'undefined') return;\n console.debug(...args);\n }\n\n info(...args: unknown[]): void {\n if (typeof console === 'undefined') return;\n console.info(...args);\n }\n\n warn(...args: unknown[]): void {\n if (typeof console === 'undefined') return;\n console.warn(...args);\n }\n\n error(...args: unknown[]): void {\n if (typeof console === 'undefined') return;\n console.error(...args);\n }\n}\n","export type AttributionIdentifiers = {\n readonly fbclid?: string;\n readonly fbp?: string;\n readonly fbc?: string;\n\n readonly gclid?: string;\n readonly gbraid?: string;\n readonly wbraid?: string;\n readonly ga?: string;\n readonly gid?: string;\n readonly gclAu?: string;\n\n readonly ttclid?: string;\n readonly ttp?: string;\n\n readonly msclkid?: string;\n readonly liFatId?: string;\n readonly epik?: string;\n\n readonly customClickIds?: Readonly<Record<string, string>>;\n\n readonly firstCollectedAt?: number;\n readonly lastCollectedAt?: number;\n readonly landingUrl?: string;\n readonly referrer?: string;\n};\n\nexport type AttributionConfig = {\n readonly enabled: boolean;\n readonly ttlDays?: number;\n readonly persist?: boolean;\n readonly captureUrlParams?: boolean;\n readonly captureCookies?: boolean;\n readonly customClickIdParams?: string[];\n};\n\nexport const DEFAULT_ATTRIBUTION_CONFIG: AttributionConfig = {\n enabled: true,\n ttlDays: 90,\n persist: true,\n captureUrlParams: true,\n captureCookies: true,\n customClickIdParams: [],\n};\n\nexport const ATTRIBUTION_STORAGE_KEY = 'attribution';\n\nexport interface AttributionService {\n init(): void;\n destroy(): void;\n collect(): AttributionIdentifiers;\n getSnapshot(): AttributionIdentifiers;\n update(partial: Partial<AttributionIdentifiers>): AttributionIdentifiers;\n clear(): void;\n}\n","import type { AttributionIdentifiers } from './types';\n\nconst BUILTIN_CLICK_PARAMS = [\n 'fbclid',\n 'gclid',\n 'gbraid',\n 'wbraid',\n 'ttclid',\n 'msclkid',\n 'epik',\n 'li_fat_id',\n] as const;\n\n/**\n * Parses click IDs from URL search params and maps to AttributionIdentifiers fields.\n */\nexport class ClickIdParser {\n parse(\n customParams: readonly string[] = []\n ): Partial<AttributionIdentifiers> {\n if (typeof window === 'undefined' || !window.location?.search) {\n return {};\n }\n\n try {\n const params = new URLSearchParams(window.location.search);\n const result: Record<string, unknown> = {};\n const customClickIds: Record<string, string> = {};\n\n for (const key of BUILTIN_CLICK_PARAMS) {\n const value = params.get(key);\n if (!value) continue;\n\n if (key === 'li_fat_id') {\n result.liFatId = value;\n } else {\n result[key] = value;\n }\n }\n\n for (const key of customParams) {\n const value = params.get(key);\n if (value) customClickIds[key] = value;\n }\n\n if (Object.keys(customClickIds).length > 0) {\n result.customClickIds = customClickIds;\n }\n\n return result as Partial<AttributionIdentifiers>;\n } catch {\n return {};\n }\n }\n\n /**\n * Meta convention: when fbclid is present and _fbc cookie is missing,\n * synthesize fbc = fb.1.<timestamp_ms>.<fbclid>\n */\n synthesizeFbc(fbclid: string, existingFbc?: string): string | undefined {\n if (existingFbc) return existingFbc;\n if (!fbclid) return undefined;\n return `fb.1.${Date.now()}.${fbclid}`;\n }\n}\n","/**\n * SSR-safe cookie reader for attribution identifiers.\n */\nexport class CookieCollector {\n collectKnown(): Readonly<Record<string, string>> {\n if (typeof document === 'undefined') return {};\n\n const cookies = this.parseCookies();\n const result: Record<string, string> = {};\n\n const map: Record<string, string> = {\n _fbp: 'fbp',\n _fbc: 'fbc',\n _ga: 'ga',\n _gid: 'gid',\n _gcl_au: 'gclAu',\n _ttp: 'ttp',\n li_fat_id: 'liFatId',\n epik: 'epik',\n };\n\n for (const [cookieName, field] of Object.entries(map)) {\n const value = cookies[cookieName];\n if (value) result[field] = value;\n }\n\n return result;\n }\n\n private parseCookies(): Record<string, string> {\n if (typeof document === 'undefined') return {};\n\n try {\n return document.cookie.split(';').reduce(\n (acc, part) => {\n const [rawKey, ...rest] = part.trim().split('=');\n if (!rawKey) return acc;\n acc[rawKey] = decodeURIComponent(rest.join('=') || '');\n return acc;\n },\n {} as Record<string, string>\n );\n } catch {\n return {};\n }\n }\n}\n","import type { AttributionIdentifiers } from './types';\nimport { ClickIdParser } from './ClickIdParser';\nimport { CookieCollector } from './CookieCollector';\n\n/**\n * Collects attribution signals from URL + cookies and merges them.\n */\nexport class AttributionCollector {\n private readonly clickIdParser = new ClickIdParser();\n\n private readonly cookieCollector = new CookieCollector();\n\n private readonly customParams: readonly string[];\n\n private readonly captureUrlParams: boolean;\n\n private readonly captureCookies: boolean;\n\n constructor(\n options: {\n customParams?: readonly string[];\n captureUrlParams?: boolean;\n captureCookies?: boolean;\n } = {}\n ) {\n this.customParams = options.customParams ?? [];\n this.captureUrlParams = options.captureUrlParams !== false;\n this.captureCookies = options.captureCookies !== false;\n }\n\n collectFresh(): Partial<AttributionIdentifiers> {\n const fromUrl = this.captureUrlParams\n ? this.clickIdParser.parse(this.customParams)\n : {};\n const fromCookies = this.captureCookies\n ? this.cookieCollector.collectKnown()\n : {};\n\n const merged: Record<string, unknown> = {\n ...fromCookies,\n ...fromUrl,\n };\n\n const customClickIds = {\n ...((fromCookies as AttributionIdentifiers).customClickIds ?? {}),\n ...(fromUrl.customClickIds ?? {}),\n };\n if (Object.keys(customClickIds).length > 0) {\n merged.customClickIds = customClickIds;\n }\n\n if (typeof merged.fbclid === 'string' && merged.fbclid) {\n const fbc = this.clickIdParser.synthesizeFbc(\n merged.fbclid,\n typeof merged.fbc === 'string' ? merged.fbc : undefined\n );\n if (fbc) merged.fbc = fbc;\n }\n\n if (typeof window !== 'undefined') {\n try {\n merged.landingUrl = window.location.href;\n } catch {\n // ignore\n }\n }\n\n if (typeof document !== 'undefined') {\n try {\n if (document.referrer) merged.referrer = document.referrer;\n } catch {\n // ignore\n }\n }\n\n return merged as Partial<AttributionIdentifiers>;\n }\n\n /**\n * Merge: never overwrite existing defined values with undefined.\n */\n merge(\n existing: AttributionIdentifiers,\n incoming: Partial<AttributionIdentifiers>\n ): AttributionIdentifiers {\n const next: Record<string, unknown> = { ...existing };\n\n for (const [key, value] of Object.entries(incoming)) {\n if (value === undefined || value === null || value === '') continue;\n\n if (key === 'customClickIds' && typeof value === 'object') {\n next.customClickIds = {\n ...((existing.customClickIds as Record<string, string>) ?? {}),\n ...(value as Record<string, string>),\n };\n continue;\n }\n\n next[key] = value;\n }\n\n const now = Date.now();\n if (!existing.firstCollectedAt) {\n next.firstCollectedAt = now;\n }\n next.lastCollectedAt = now;\n\n return next as AttributionIdentifiers;\n }\n}\n","import type { StorageService } from '@/services/storage/types';\n\nimport { ATTRIBUTION_STORAGE_KEY, type AttributionIdentifiers } from './types';\n\n/**\n * Persists AttributionIdentifiers via StorageService only (no direct localStorage).\n */\nexport class AttributionStore {\n private readonly storage: StorageService;\n\n private readonly persist: boolean;\n\n private readonly ttlMs: number;\n\n private readonly storageKey: string;\n\n constructor(\n storage: StorageService,\n options: { persist: boolean; ttlDays: number; storageKey?: string }\n ) {\n this.storage = storage;\n this.persist = options.persist;\n this.ttlMs = options.ttlDays * 24 * 60 * 60 * 1000;\n this.storageKey = options.storageKey ?? ATTRIBUTION_STORAGE_KEY;\n }\n\n load(): AttributionIdentifiers | null {\n if (!this.persist) return null;\n\n try {\n const snapshot = this.storage.get<AttributionIdentifiers>(this.storageKey);\n if (!snapshot) return null;\n\n if (this.isExpired(snapshot)) {\n this.clear();\n return null;\n }\n\n return snapshot;\n } catch {\n return null;\n }\n }\n\n save(snapshot: AttributionIdentifiers): void {\n if (!this.persist) return;\n\n try {\n this.storage.set(this.storageKey, snapshot);\n } catch {\n // quota / SSR — keep in-memory only\n }\n }\n\n clear(): void {\n try {\n this.storage.remove(this.storageKey);\n } catch {\n // ignore\n }\n }\n\n private isExpired(snapshot: AttributionIdentifiers): boolean {\n const anchor = snapshot.lastCollectedAt ?? snapshot.firstCollectedAt;\n if (!anchor) return false;\n return Date.now() - anchor > this.ttlMs;\n }\n}\n","import type { StorageService } from '@/services/storage/types';\n\nimport { AttributionCollector } from './AttributionCollector';\nimport { AttributionStore } from './AttributionStore';\nimport {\n DEFAULT_ATTRIBUTION_CONFIG,\n type AttributionConfig,\n type AttributionIdentifiers,\n type AttributionService,\n} from './types';\n\nexport class AttributionServiceImpl implements AttributionService {\n private readonly store: AttributionStore;\n\n private readonly collector: AttributionCollector;\n\n private readonly enabled: boolean;\n\n private snapshot: AttributionIdentifiers = {};\n\n private active = false;\n\n constructor(storage: StorageService, config: AttributionConfig = DEFAULT_ATTRIBUTION_CONFIG) {\n this.enabled = config.enabled !== false;\n this.store = new AttributionStore(storage, {\n persist: config.persist !== false,\n ttlDays: config.ttlDays ?? 90,\n });\n this.collector = new AttributionCollector({\n customParams: config.customClickIdParams ?? [],\n captureUrlParams: config.captureUrlParams !== false,\n captureCookies: config.captureCookies !== false,\n });\n }\n\n init(): void {\n if (this.active) return;\n this.active = true;\n\n if (!this.enabled) return;\n\n const stored = this.store.load();\n if (stored) {\n this.snapshot = stored;\n }\n\n this.collect();\n }\n\n destroy(): void {\n if (!this.active) return;\n this.active = false;\n }\n\n collect(): AttributionIdentifiers {\n if (!this.enabled) return this.snapshot;\n\n const fresh = this.collector.collectFresh();\n this.snapshot = this.collector.merge(this.snapshot, fresh);\n this.store.save(this.snapshot);\n return this.snapshot;\n }\n\n getSnapshot(): AttributionIdentifiers {\n return { ...this.snapshot };\n }\n\n update(partial: Partial<AttributionIdentifiers>): AttributionIdentifiers {\n this.snapshot = this.collector.merge(this.snapshot, partial);\n this.store.save(this.snapshot);\n return this.getSnapshot();\n }\n\n clear(): void {\n this.snapshot = {};\n this.store.clear();\n }\n}\n","import type { BrowserMetadata, BrowserMetadataService } from './types';\n\nexport class BrowserMetadataServiceImpl implements BrowserMetadataService {\n getMetadata(): BrowserMetadata {\n if (typeof window === 'undefined') {\n return {};\n }\n\n const timezone = (() => {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch {\n return undefined;\n }\n })();\n\n return {\n url: location.href,\n path: location.pathname,\n hostname: location.hostname,\n origin: location.origin,\n title: typeof document !== 'undefined' ? document.title : undefined,\n referrer: typeof document !== 'undefined' ? document.referrer : undefined,\n language: navigator.language,\n timezone,\n userAgent: navigator.userAgent,\n platform: navigator.platform,\n screenWidth: screen.width,\n screenHeight: screen.height,\n colorDepth: screen.colorDepth,\n };\n }\n}\n","import type { PixelEvent } from '@/events';\n\nimport type { DispatcherService } from './types';\n\ntype EventListener = (event: PixelEvent) => void;\n\nexport class DispatcherServiceImpl implements DispatcherService {\n private readonly listeners = new Set<EventListener>();\n\n private lastEvent: PixelEvent | null = null;\n\n dispatch(event: PixelEvent): void {\n this.lastEvent = event;\n\n for (const listener of this.listeners) {\n listener(event);\n }\n }\n\n subscribe(listener: (event: PixelEvent) => void): () => void {\n this.listeners.add(listener);\n\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n clear(): void {\n this.listeners.clear();\n this.lastEvent = null;\n }\n\n getListenerCount(): number {\n return this.listeners.size;\n }\n\n getLastEvent(): PixelEvent | null {\n return this.lastEvent;\n }\n}\n","import type { PixelConfig } from '@/config';\nimport type { BrowserMetadataService } from '@/services/browser-metadata';\nimport type { StorageService } from '@/services/storage';\n\nimport type { FingerprintService } from './types';\n\nconst DEFAULT_FINGERPRINT_KEY = 'fingerprint';\n\nfunction hashFingerprintInput(input: string): string {\n let hash = 0;\n\n for (let index = 0; index < input.length; index++) {\n hash = (hash << 5) - hash + input.charCodeAt(index);\n hash |= 0;\n }\n\n const positiveHash = Math.abs(hash).toString(16).padStart(8, '0');\n let secondaryHash = 0;\n\n for (let index = input.length - 1; index >= 0; index--) {\n secondaryHash = (secondaryHash << 5) - secondaryHash + input.charCodeAt(index);\n secondaryHash |= 0;\n }\n\n return `fp_${positiveHash}${Math.abs(secondaryHash).toString(16).padStart(8, '0')}`;\n}\n\nfunction computeLightFingerprint(\n metadataService: BrowserMetadataService\n): string {\n const metadata = metadataService.getMetadata();\n\n const components = [\n metadata.userAgent ?? '',\n metadata.language ?? '',\n metadata.platform ?? '',\n String(metadata.screenWidth ?? ''),\n String(metadata.screenHeight ?? ''),\n String(metadata.colorDepth ?? ''),\n metadata.timezone ?? '',\n ];\n\n return hashFingerprintInput(components.join('|'));\n}\n\nexport class FingerprintServiceImpl implements FingerprintService {\n private readonly storage: StorageService;\n\n private readonly storageKey: string;\n\n private readonly metadataService: BrowserMetadataService;\n\n constructor(\n storage: StorageService,\n config: PixelConfig,\n metadataService: BrowserMetadataService\n ) {\n this.storage = storage;\n this.storageKey =\n config.storage.keys?.fingerprint ?? DEFAULT_FINGERPRINT_KEY;\n this.metadataService = metadataService;\n }\n\n getFingerprint(): string | null {\n return this.storage.get<string>(this.storageKey);\n }\n\n ensureFingerprint(): string {\n const existing = this.getFingerprint();\n if (existing) return existing;\n\n const fingerprint = computeLightFingerprint(this.metadataService);\n this.storage.set(this.storageKey, fingerprint);\n return fingerprint;\n }\n}\n","import type { StorageAdapter } from './types';\n\nexport class BrowserStorageAdapter implements StorageAdapter {\n private readonly storage: Storage | null;\n\n private readonly memoryFallback = new Map<string, string>();\n\n constructor(storage: Storage) {\n this.storage = typeof window === 'undefined' ? null : storage;\n }\n\n get(key: string): string | null {\n if (this.storage) {\n return this.storage.getItem(key);\n }\n\n return this.memoryFallback.get(key) ?? null;\n }\n\n set(key: string, value: string): void {\n if (this.storage) {\n this.storage.setItem(key, value);\n return;\n }\n\n this.memoryFallback.set(key, value);\n }\n\n remove(key: string): void {\n if (this.storage) {\n this.storage.removeItem(key);\n return;\n }\n\n this.memoryFallback.delete(key);\n }\n\n clear(): void {\n // Never clear entire browser storage — namespace removal uses removeKeysMatching.\n if (!this.storage) {\n this.memoryFallback.clear();\n }\n }\n\n removeKeysMatching(predicate: (key: string) => boolean): void {\n if (this.storage) {\n const keysToRemove: string[] = [];\n\n for (let index = 0; index < this.storage.length; index++) {\n const key = this.storage.key(index);\n if (key && predicate(key)) {\n keysToRemove.push(key);\n }\n }\n\n for (const key of keysToRemove) {\n this.storage.removeItem(key);\n }\n\n return;\n }\n\n for (const key of this.memoryFallback.keys()) {\n if (predicate(key)) {\n this.memoryFallback.delete(key);\n }\n }\n }\n}\n","import type { StorageAdapter } from './types';\n\nexport class MemoryStorageAdapter implements StorageAdapter {\n private readonly store = new Map<string, string>();\n\n get(key: string): string | null {\n return this.store.get(key) ?? null;\n }\n\n set(key: string, value: string): void {\n this.store.set(key, value);\n }\n\n remove(key: string): void {\n this.store.delete(key);\n }\n\n clear(): void {\n this.store.clear();\n }\n\n removeKeysMatching(predicate: (key: string) => boolean): void {\n for (const key of this.store.keys()) {\n if (predicate(key)) {\n this.store.delete(key);\n }\n }\n }\n}\n","import type { StorageAdapter, StorageService } from './types';\n\ntype NamespaceClearableAdapter = StorageAdapter & {\n removeKeysMatching(predicate: (key: string) => boolean): void;\n};\n\nfunction supportsNamespaceClear(\n adapter: StorageAdapter\n): adapter is NamespaceClearableAdapter {\n return (\n 'removeKeysMatching' in adapter &&\n typeof adapter.removeKeysMatching === 'function'\n );\n}\n\nexport class StorageServiceImpl implements StorageService {\n private readonly adapter: StorageAdapter;\n\n private readonly namespace: string;\n\n private readonly prefix?: string;\n\n constructor(adapter: StorageAdapter, namespace: string, prefix?: string) {\n this.adapter = adapter;\n this.namespace = namespace;\n this.prefix = prefix;\n }\n\n get<T>(key: string): T | null {\n const raw = this.adapter.get(this.createKey(key));\n if (raw === null) return null;\n\n try {\n return JSON.parse(raw) as T;\n } catch {\n return null;\n }\n }\n\n set<T>(key: string, value: T): void {\n this.adapter.set(this.createKey(key), JSON.stringify(value));\n }\n\n remove(key: string): void {\n this.adapter.remove(this.createKey(key));\n }\n\n has(key: string): boolean {\n return this.adapter.get(this.createKey(key)) !== null;\n }\n\n clear(): void {\n const namespaceKeyPrefix = this.getNamespaceKeyPrefix();\n\n if (supportsNamespaceClear(this.adapter)) {\n this.adapter.removeKeysMatching(key =>\n key.startsWith(namespaceKeyPrefix)\n );\n return;\n }\n\n this.adapter.clear();\n }\n\n createKey(key: string): string {\n if (this.prefix) {\n return `${this.prefix}:${this.namespace}:${key}`;\n }\n\n return `${this.namespace}:${key}`;\n }\n\n private getNamespaceKeyPrefix(): string {\n if (this.prefix) {\n return `${this.prefix}:${this.namespace}:`;\n }\n\n return `${this.namespace}:`;\n }\n}\n","import type {\n AttributionStoragePersistence,\n QueueStoragePersistence,\n SessionStoragePersistence,\n VisitorStoragePersistence,\n} from '@/config/shared/persistence';\n\nimport { BrowserStorageAdapter } from './BrowserStorageAdapter';\nimport { MemoryStorageAdapter } from './MemoryStorageAdapter';\nimport type { StorageAdapter } from './types';\n\nexport type StoragePersistence =\n | VisitorStoragePersistence\n | SessionStoragePersistence\n | AttributionStoragePersistence\n | QueueStoragePersistence;\n\nexport function createStorageAdapter(\n persistence?: StoragePersistence\n): StorageAdapter {\n const mode = persistence ?? 'memory';\n\n if (typeof window === 'undefined') {\n return new MemoryStorageAdapter();\n }\n\n switch (mode) {\n case 'memory':\n return new MemoryStorageAdapter();\n case 'localStorage':\n return new BrowserStorageAdapter(window.localStorage);\n case 'sessionStorage':\n return new BrowserStorageAdapter(window.sessionStorage);\n case 'cookie_localStorage':\n // TODO: implementar cookie fallback.\n return new BrowserStorageAdapter(window.localStorage);\n case 'cookie':\n return new MemoryStorageAdapter();\n case 'indexedDB':\n return new MemoryStorageAdapter();\n default:\n return new MemoryStorageAdapter();\n }\n}\n\nexport function resolveStorageAdapterName(\n persistence?: StoragePersistence\n): string {\n const mode = persistence ?? 'memory';\n\n switch (mode) {\n case 'localStorage':\n case 'sessionStorage':\n case 'cookie_localStorage':\n return 'BrowserStorageAdapter';\n default:\n return 'MemoryStorageAdapter';\n }\n}\n","function createRandomSuffix(): string {\n if (\n typeof crypto !== 'undefined' &&\n typeof crypto.randomUUID === 'function'\n ) {\n return crypto.randomUUID().replace(/-/g, '');\n }\n\n return `${Date.now()}${Math.random().toString(36).slice(2)}`;\n}\n\nexport function generateSessionId(): string {\n return `ses_${createRandomSuffix()}`;\n}\n","import type { PixelConfig } from '@/config';\nimport type { StorageService } from '@/services/storage';\n\nimport type { EnsureSessionResult, SessionData, SessionService } from './types';\nimport { generateSessionId } from './session-id';\n\nconst DEFAULT_SESSION_KEY = 'session';\n\nexport class SessionServiceImpl implements SessionService {\n private readonly storage: StorageService;\n\n private readonly storageKey: string;\n\n constructor(storage: StorageService, config: PixelConfig) {\n this.storage = storage;\n this.storageKey = config.storage.keys?.session ?? DEFAULT_SESSION_KEY;\n }\n\n getSessionId(): string | null {\n return this.getSessionData()?.sessionId ?? null;\n }\n\n getSessionData(): SessionData | null {\n const raw = this.storage.get<SessionData | string>(this.storageKey);\n if (!raw) return null;\n\n if (typeof raw === 'string') {\n const now = Date.now();\n return {\n sessionId: raw,\n lastActivityAt: now,\n createdAt: now,\n };\n }\n\n return raw;\n }\n\n getLastActivityAt(): number | null {\n return this.getSessionData()?.lastActivityAt ?? null;\n }\n\n isExpired(ttlMs: number): boolean {\n const data = this.getSessionData();\n if (!data) return true;\n\n return Date.now() - data.lastActivityAt > ttlMs;\n }\n\n ensureSession(ttlMs: number): EnsureSessionResult {\n const data = this.getSessionData();\n const now = Date.now();\n\n if (!data) {\n const sessionId = generateSessionId();\n this.writeSessionData({\n sessionId,\n lastActivityAt: now,\n createdAt: now,\n });\n\n return {\n sessionId,\n expired: false,\n created: true,\n };\n }\n\n if (now - data.lastActivityAt > ttlMs) {\n const previousSessionId = data.sessionId;\n const sessionId = generateSessionId();\n\n this.writeSessionData({\n sessionId,\n lastActivityAt: now,\n createdAt: now,\n });\n\n return {\n sessionId,\n expired: true,\n previousSessionId,\n created: false,\n };\n }\n\n return {\n sessionId: data.sessionId,\n expired: false,\n created: false,\n };\n }\n\n ensureSessionId(): string {\n return this.ensureSession(Number.MAX_SAFE_INTEGER).sessionId;\n }\n\n touchActivity(): void {\n const data = this.getSessionData();\n if (!data) return;\n\n this.writeSessionData({\n ...data,\n lastActivityAt: Date.now(),\n });\n }\n\n renew(): string {\n const now = Date.now();\n const sessionId = generateSessionId();\n\n this.writeSessionData({\n sessionId,\n lastActivityAt: now,\n createdAt: now,\n });\n\n return sessionId;\n }\n\n clear(): void {\n this.storage.remove(this.storageKey);\n }\n\n private writeSessionData(data: SessionData): void {\n this.storage.set(this.storageKey, data);\n }\n}\n","function createRandomSuffix(): string {\n if (\n typeof crypto !== 'undefined' &&\n typeof crypto.randomUUID === 'function'\n ) {\n return crypto.randomUUID().replace(/-/g, '');\n }\n\n return `${Date.now()}${Math.random().toString(36).slice(2)}`;\n}\n\nexport function generateVisitorId(): string {\n return `vst_${createRandomSuffix()}`;\n}\n","import type { PixelConfig } from '@/config';\nimport type { StorageService } from '@/services/storage';\n\nimport type { VisitorService } from './types';\nimport { generateVisitorId } from './visitor-id';\n\nconst DEFAULT_VISITOR_KEY = 'visitor';\n\nexport class VisitorServiceImpl implements VisitorService {\n private readonly storage: StorageService;\n\n private readonly storageKey: string;\n\n constructor(storage: StorageService, config: PixelConfig) {\n this.storage = storage;\n this.storageKey = config.storage.keys?.visitor ?? DEFAULT_VISITOR_KEY;\n }\n\n getVisitorId(): string | null {\n return this.storage.get<string>(this.storageKey);\n }\n\n ensureVisitorId(): string {\n const existing = this.getVisitorId();\n if (existing) return existing;\n\n const visitorId = generateVisitorId();\n this.storage.set(this.storageKey, visitorId);\n return visitorId;\n }\n\n clearVisitorId(): void {\n this.storage.remove(this.storageKey);\n }\n}\n","import type { PixelConfig } from '@/config';\nimport { BaseEventBuilder } from '@/events/builder';\nimport { ConsolePixelLogger, type PixelLogger } from '@/logger';\nimport {\n AttributionServiceImpl,\n DEFAULT_ATTRIBUTION_CONFIG,\n} from '@/services/attribution';\nimport { BrowserMetadataServiceImpl } from '@/services/browser-metadata/BrowserMetadataService';\nimport { DispatcherServiceImpl } from '@/services/dispatcher/DispatcherService';\nimport { FingerprintServiceImpl } from '@/services/fingerprint/FingerprintService';\nimport {\n createStorageAdapter,\n StorageServiceImpl,\n} from '@/services/storage';\nimport type { StoragePersistence } from '@/services/storage/StorageFactory';\nimport { SessionServiceImpl } from '@/services/session/SessionService';\nimport type { PixelRuntimeServices } from '@/services/types';\nimport { VisitorServiceImpl } from '@/services/visitor/VisitorService';\n\nimport { ModuleRegistry } from './ModuleRegistry';\nimport type { PixelRuntimeContext } from './PixelRuntimeContext';\nimport type { ModuleName } from './shared/module';\nimport type { PixelModule } from './types';\n\nexport class PixelRuntime {\n private initialized = false;\n\n private readonly initializedModules: PixelModule[] = [];\n\n private readonly registry: ModuleRegistry;\n\n private readonly config: PixelConfig;\n\n private readonly fallbackLogger: ConsolePixelLogger;\n\n private context: PixelRuntimeContext | null = null;\n\n constructor(config: PixelConfig) {\n this.config = config;\n this.registry = new ModuleRegistry();\n this.fallbackLogger = new ConsolePixelLogger(config.app.debug === true);\n }\n\n register(module: PixelModule): void {\n this.registry.register(module);\n }\n\n async init(): Promise<void> {\n if (this.initialized) {\n this.getLogger().debug('[PixelRuntime] Runtime already initialized');\n return;\n }\n\n this.fallbackLogger.debug('[PixelRuntime] Initializing runtime');\n\n this.context = this.createContext();\n this.context.services.attribution.init();\n\n for (const module of this.registry.getAll()) {\n if (!this.isModuleEnabled(module)) {\n this.fallbackLogger.debug(\n `[PixelRuntime] Skipping disabled module: ${module.name}`\n );\n continue;\n }\n\n this.fallbackLogger.debug(\n `[PixelRuntime] Initializing module: ${module.name}`\n );\n\n try {\n await module.init(this.context);\n this.initializedModules.push(module);\n } catch (error) {\n this.fallbackLogger.error(\n `[Pixel] Failed to initialize module \"${module.name}\"`,\n error\n );\n }\n }\n\n this.initialized = true;\n }\n\n async destroy(): Promise<void> {\n if (!this.initialized) return;\n\n const logger = this.getLogger();\n\n for (let index = this.initializedModules.length - 1; index >= 0; index--) {\n const module = this.initializedModules[index];\n\n logger.debug(`[PixelRuntime] Destroying module: ${module.name}`);\n\n try {\n await module.destroy?.();\n } catch (error) {\n logger.error(\n `[Pixel] Failed to destroy module \"${module.name}\"`,\n error\n );\n }\n }\n\n this.context?.services.attribution.destroy();\n this.context?.services.dispatcher.clear();\n\n this.initialized = false;\n this.initializedModules.length = 0;\n this.context = null;\n\n this.fallbackLogger.debug('[PixelRuntime] Runtime destroyed');\n }\n\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /** @internal For playground and development only. Not part of the stable public API. */\n getDebugServices(): PixelRuntimeServices | null {\n return this.context?.services ?? null;\n }\n\n private createServices(): PixelRuntimeServices {\n const { namespace, prefix, persistence } = this.config.storage;\n\n const visitorStorage = this.createStorageService(\n namespace,\n prefix,\n persistence?.visitor\n );\n const sessionStorage = this.createStorageService(\n namespace,\n prefix,\n persistence?.session\n );\n const fingerprintStorage = this.createStorageService(\n namespace,\n prefix,\n persistence?.attribution\n );\n const attributionStorage = this.createStorageService(\n namespace,\n prefix,\n persistence?.attribution ?? 'localStorage'\n );\n const storage = this.createStorageService(namespace, prefix, 'memory');\n const browserMetadata = new BrowserMetadataServiceImpl();\n\n const attribution = new AttributionServiceImpl(\n attributionStorage,\n this.config.attribution ?? DEFAULT_ATTRIBUTION_CONFIG\n );\n\n const eventBuilder = new BaseEventBuilder(browserMetadata, attribution);\n\n const visitor = new VisitorServiceImpl(visitorStorage, this.config);\n const session = new SessionServiceImpl(sessionStorage, this.config);\n const fingerprint = new FingerprintServiceImpl(\n fingerprintStorage,\n this.config,\n browserMetadata\n );\n const dispatcher = new DispatcherServiceImpl();\n\n return {\n storage,\n visitor,\n session,\n fingerprint,\n dispatcher,\n browserMetadata,\n eventBuilder,\n attribution,\n };\n }\n\n private createStorageService(\n namespace: string,\n prefix: string | undefined,\n persistence: StoragePersistence | undefined\n ): StorageServiceImpl {\n return new StorageServiceImpl(\n createStorageAdapter(persistence),\n namespace,\n prefix\n );\n }\n\n private createContext(): PixelRuntimeContext {\n return {\n config: this.config,\n logger: this.fallbackLogger,\n services: this.createServices(),\n };\n }\n\n private getLogger(): PixelLogger {\n return this.context?.logger ?? this.fallbackLogger;\n }\n\n private isModuleEnabled(module: PixelModule): boolean {\n const enabledModules: Record<ModuleName, boolean> = {\n privacy: this.config.modules.privacy.enabled,\n core: this.config.modules.core.enabled,\n behavior: this.config.modules.behavior.enabled,\n conversion: this.config.modules.conversion.enabled,\n transport: this.config.modules.transport.enabled,\n integrations: this.config.modules.integrations.enabled,\n };\n\n return enabledModules[module.name];\n }\n}\n"],"mappings":"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","names":["runtime_exports","__export","ModuleRegistry","PixelRuntime","__toCommonJS","ModuleRegistry","module","existing","BaseEventBuilder","metadataService","attribution","event","metadata","identifiers","hasIdentifiers","key","value","ConsolePixelLogger","debugEnabled","args","DEFAULT_ATTRIBUTION_CONFIG","ATTRIBUTION_STORAGE_KEY","BUILTIN_CLICK_PARAMS","ClickIdParser","customParams","params","result","customClickIds","key","value","fbclid","existingFbc","CookieCollector","cookies","result","map","cookieName","field","value","acc","part","rawKey","rest","AttributionCollector","options","ClickIdParser","CookieCollector","fromUrl","fromCookies","merged","customClickIds","fbc","existing","incoming","next","key","value","now","AttributionStore","storage","options","ATTRIBUTION_STORAGE_KEY","snapshot","anchor","AttributionServiceImpl","storage","config","DEFAULT_ATTRIBUTION_CONFIG","AttributionStore","AttributionCollector","stored","fresh","partial","BrowserMetadataServiceImpl","timezone","DispatcherServiceImpl","event","listener","DEFAULT_FINGERPRINT_KEY","hashFingerprintInput","input","hash","index","positiveHash","secondaryHash","computeLightFingerprint","metadataService","metadata","components","FingerprintServiceImpl","storage","config","existing","fingerprint","BrowserStorageAdapter","storage","key","value","predicate","keysToRemove","index","MemoryStorageAdapter","key","value","predicate","supportsNamespaceClear","adapter","StorageServiceImpl","namespace","prefix","key","raw","value","namespaceKeyPrefix","createStorageAdapter","persistence","mode","MemoryStorageAdapter","BrowserStorageAdapter","createRandomSuffix","generateSessionId","DEFAULT_SESSION_KEY","SessionServiceImpl","storage","config","raw","now","ttlMs","data","sessionId","generateSessionId","previousSessionId","createRandomSuffix","generateVisitorId","DEFAULT_VISITOR_KEY","VisitorServiceImpl","storage","config","existing","visitorId","generateVisitorId","PixelRuntime","config","ModuleRegistry","ConsolePixelLogger","module","error","logger","index","namespace","prefix","persistence","visitorStorage","sessionStorage","fingerprintStorage","attributionStorage","storage","browserMetadata","BrowserMetadataServiceImpl","attribution","AttributionServiceImpl","DEFAULT_ATTRIBUTION_CONFIG","eventBuilder","BaseEventBuilder","visitor","VisitorServiceImpl","session","SessionServiceImpl","fingerprint","FingerprintServiceImpl","dispatcher","DispatcherServiceImpl","StorageServiceImpl","createStorageAdapter"]}
@@ -0,0 +1,48 @@
1
+ import { P as PixelConfig } from '../pixel-CbeF25mD.mjs';
2
+ import { P as PixelLogger } from '../PixelLogger-B21lEjep.mjs';
3
+ import { P as PixelRuntimeServices } from '../types-DGlBdsAy.mjs';
4
+ import '../index-DUfFzniE.mjs';
5
+
6
+ type PixelRuntimeContext = {
7
+ readonly config: PixelConfig;
8
+ readonly logger: PixelLogger;
9
+ readonly services: PixelRuntimeServices;
10
+ };
11
+
12
+ type ModuleName = 'privacy' | 'core' | 'behavior' | 'conversion' | 'transport' | 'integrations';
13
+
14
+ interface PixelModule {
15
+ readonly name: ModuleName;
16
+ init(context: PixelRuntimeContext): void | Promise<void>;
17
+ destroy?(): void | Promise<void>;
18
+ }
19
+
20
+ declare class ModuleRegistry {
21
+ private readonly modules;
22
+ register(module: PixelModule): void;
23
+ getAll(): readonly PixelModule[];
24
+ size(): number;
25
+ }
26
+
27
+ declare class PixelRuntime {
28
+ private initialized;
29
+ private readonly initializedModules;
30
+ private readonly registry;
31
+ private readonly config;
32
+ private readonly fallbackLogger;
33
+ private context;
34
+ constructor(config: PixelConfig);
35
+ register(module: PixelModule): void;
36
+ init(): Promise<void>;
37
+ destroy(): Promise<void>;
38
+ isInitialized(): boolean;
39
+ /** @internal For playground and development only. Not part of the stable public API. */
40
+ getDebugServices(): PixelRuntimeServices | null;
41
+ private createServices;
42
+ private createStorageService;
43
+ private createContext;
44
+ private getLogger;
45
+ private isModuleEnabled;
46
+ }
47
+
48
+ export { type ModuleName, ModuleRegistry, type PixelModule, PixelRuntime, type PixelRuntimeContext, PixelRuntimeServices };
@@ -0,0 +1,48 @@
1
+ import { P as PixelConfig } from '../pixel-CbeF25mD.js';
2
+ import { P as PixelLogger } from '../PixelLogger-B21lEjep.js';
3
+ import { P as PixelRuntimeServices } from '../types-CTpRvFKZ.js';
4
+ import '../index-DUfFzniE.js';
5
+
6
+ type PixelRuntimeContext = {
7
+ readonly config: PixelConfig;
8
+ readonly logger: PixelLogger;
9
+ readonly services: PixelRuntimeServices;
10
+ };
11
+
12
+ type ModuleName = 'privacy' | 'core' | 'behavior' | 'conversion' | 'transport' | 'integrations';
13
+
14
+ interface PixelModule {
15
+ readonly name: ModuleName;
16
+ init(context: PixelRuntimeContext): void | Promise<void>;
17
+ destroy?(): void | Promise<void>;
18
+ }
19
+
20
+ declare class ModuleRegistry {
21
+ private readonly modules;
22
+ register(module: PixelModule): void;
23
+ getAll(): readonly PixelModule[];
24
+ size(): number;
25
+ }
26
+
27
+ declare class PixelRuntime {
28
+ private initialized;
29
+ private readonly initializedModules;
30
+ private readonly registry;
31
+ private readonly config;
32
+ private readonly fallbackLogger;
33
+ private context;
34
+ constructor(config: PixelConfig);
35
+ register(module: PixelModule): void;
36
+ init(): Promise<void>;
37
+ destroy(): Promise<void>;
38
+ isInitialized(): boolean;
39
+ /** @internal For playground and development only. Not part of the stable public API. */
40
+ getDebugServices(): PixelRuntimeServices | null;
41
+ private createServices;
42
+ private createStorageService;
43
+ private createContext;
44
+ private getLogger;
45
+ private isModuleEnabled;
46
+ }
47
+
48
+ export { type ModuleName, ModuleRegistry, type PixelModule, PixelRuntime, type PixelRuntimeContext, PixelRuntimeServices };
@@ -0,0 +1,3 @@
1
+ /* Pixel v2 — SDK de analytics e conversão */
2
+ var c=class{constructor(){this.modules=[]}register(e){if(this.modules.some(t=>t.name===e.name))throw new Error(`[Pixel] Module "${e.name}" is already registered`);this.modules.push(e)}getAll(){return this.modules}size(){return this.modules.length}};var d=class{constructor(e,t){this.metadataService=e,this.attribution=t??null}build(e){let t=this.metadataService.getMetadata(),r=this.attribution?.getSnapshot(),i=r!==void 0&&Object.keys(r).some(n=>{let s=r[n];return s!=null&&s!==""});return{...e,timestamp:Date.now(),path:t.path,url:t.url,hostname:t.hostname,language:t.language,timezone:t.timezone,...i?{identifiers:r}:{}}}};var g=class{constructor(e){this.debugEnabled=e}debug(...e){this.debugEnabled&&(typeof console>"u"||console.debug(...e))}info(...e){typeof console>"u"||console.info(...e)}warn(...e){typeof console>"u"||console.warn(...e)}error(...e){typeof console>"u"||console.error(...e)}};var u={enabled:!0,ttlDays:90,persist:!0,captureUrlParams:!0,captureCookies:!0,customClickIdParams:[]},k="attribution";var N=["fbclid","gclid","gbraid","wbraid","ttclid","msclkid","epik","li_fat_id"],p=class{parse(e=[]){if(typeof window>"u"||!window.location?.search)return{};try{let t=new URLSearchParams(window.location.search),r={},i={};for(let n of N){let s=t.get(n);s&&(n==="li_fat_id"?r.liFatId=s:r[n]=s)}for(let n of e){let s=t.get(n);s&&(i[n]=s)}return Object.keys(i).length>0&&(r.customClickIds=i),r}catch{return{}}}synthesizeFbc(e,t){if(t)return t;if(e)return`fb.1.${Date.now()}.${e}`}};var m=class{collectKnown(){if(typeof document>"u")return{};let e=this.parseCookies(),t={},r={_fbp:"fbp",_fbc:"fbc",_ga:"ga",_gid:"gid",_gcl_au:"gclAu",_ttp:"ttp",li_fat_id:"liFatId",epik:"epik"};for(let[i,n]of Object.entries(r)){let s=e[i];s&&(t[n]=s)}return t}parseCookies(){if(typeof document>"u")return{};try{return document.cookie.split(";").reduce((e,t)=>{let[r,...i]=t.trim().split("=");return r&&(e[r]=decodeURIComponent(i.join("=")||"")),e},{})}catch{return{}}}};var f=class{constructor(e={}){this.clickIdParser=new p;this.cookieCollector=new m;this.customParams=e.customParams??[],this.captureUrlParams=e.captureUrlParams!==!1,this.captureCookies=e.captureCookies!==!1}collectFresh(){let e=this.captureUrlParams?this.clickIdParser.parse(this.customParams):{},t=this.captureCookies?this.cookieCollector.collectKnown():{},r={...t,...e},i={...t.customClickIds??{},...e.customClickIds??{}};if(Object.keys(i).length>0&&(r.customClickIds=i),typeof r.fbclid=="string"&&r.fbclid){let n=this.clickIdParser.synthesizeFbc(r.fbclid,typeof r.fbc=="string"?r.fbc:void 0);n&&(r.fbc=n)}if(typeof window<"u")try{r.landingUrl=window.location.href}catch{}if(typeof document<"u")try{document.referrer&&(r.referrer=document.referrer)}catch{}return r}merge(e,t){let r={...e};for(let[n,s]of Object.entries(t))if(!(s==null||s==="")){if(n==="customClickIds"&&typeof s=="object"){r.customClickIds={...e.customClickIds??{},...s};continue}r[n]=s}let i=Date.now();return e.firstCollectedAt||(r.firstCollectedAt=i),r.lastCollectedAt=i,r}};var h=class{constructor(e,t){this.storage=e,this.persist=t.persist,this.ttlMs=t.ttlDays*24*60*60*1e3,this.storageKey=t.storageKey??k}load(){if(!this.persist)return null;try{let e=this.storage.get(this.storageKey);return e?this.isExpired(e)?(this.clear(),null):e:null}catch{return null}}save(e){if(this.persist)try{this.storage.set(this.storageKey,e)}catch{}}clear(){try{this.storage.remove(this.storageKey)}catch{}}isExpired(e){let t=e.lastCollectedAt??e.firstCollectedAt;return t?Date.now()-t>this.ttlMs:!1}};var y=class{constructor(e,t=u){this.snapshot={};this.active=!1;this.enabled=t.enabled!==!1,this.store=new h(e,{persist:t.persist!==!1,ttlDays:t.ttlDays??90}),this.collector=new f({customParams:t.customClickIdParams??[],captureUrlParams:t.captureUrlParams!==!1,captureCookies:t.captureCookies!==!1})}init(){if(this.active||(this.active=!0,!this.enabled))return;let e=this.store.load();e&&(this.snapshot=e),this.collect()}destroy(){this.active&&(this.active=!1)}collect(){if(!this.enabled)return this.snapshot;let e=this.collector.collectFresh();return this.snapshot=this.collector.merge(this.snapshot,e),this.store.save(this.snapshot),this.snapshot}getSnapshot(){return{...this.snapshot}}update(e){return this.snapshot=this.collector.merge(this.snapshot,e),this.store.save(this.snapshot),this.getSnapshot()}clear(){this.snapshot={},this.store.clear()}};var S=class{getMetadata(){if(typeof window>"u")return{};let e=(()=>{try{return Intl.DateTimeFormat().resolvedOptions().timeZone}catch{return}})();return{url:location.href,path:location.pathname,hostname:location.hostname,origin:location.origin,title:typeof document<"u"?document.title:void 0,referrer:typeof document<"u"?document.referrer:void 0,language:navigator.language,timezone:e,userAgent:navigator.userAgent,platform:navigator.platform,screenWidth:screen.width,screenHeight:screen.height,colorDepth:screen.colorDepth}}};var b=class{constructor(){this.listeners=new Set;this.lastEvent=null}dispatch(e){this.lastEvent=e;for(let t of this.listeners)t(e)}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}clear(){this.listeners.clear(),this.lastEvent=null}getListenerCount(){return this.listeners.size}getLastEvent(){return this.lastEvent}};var B="fingerprint";function z(o){let e=0;for(let i=0;i<o.length;i++)e=(e<<5)-e+o.charCodeAt(i),e|=0;let t=Math.abs(e).toString(16).padStart(8,"0"),r=0;for(let i=o.length-1;i>=0;i--)r=(r<<5)-r+o.charCodeAt(i),r|=0;return`fp_${t}${Math.abs(r).toString(16).padStart(8,"0")}`}function O(o){let e=o.getMetadata(),t=[e.userAgent??"",e.language??"",e.platform??"",String(e.screenWidth??""),String(e.screenHeight??""),String(e.colorDepth??""),e.timezone??""];return z(t.join("|"))}var x=class{constructor(e,t,r){this.storage=e,this.storageKey=t.storage.keys?.fingerprint??B,this.metadataService=r}getFingerprint(){return this.storage.get(this.storageKey)}ensureFingerprint(){let e=this.getFingerprint();if(e)return e;let t=O(this.metadataService);return this.storage.set(this.storageKey,t),t}};var l=class{constructor(e){this.memoryFallback=new Map;this.storage=typeof window>"u"?null:e}get(e){return this.storage?this.storage.getItem(e):this.memoryFallback.get(e)??null}set(e,t){if(this.storage){this.storage.setItem(e,t);return}this.memoryFallback.set(e,t)}remove(e){if(this.storage){this.storage.removeItem(e);return}this.memoryFallback.delete(e)}clear(){this.storage||this.memoryFallback.clear()}removeKeysMatching(e){if(this.storage){let t=[];for(let r=0;r<this.storage.length;r++){let i=this.storage.key(r);i&&e(i)&&t.push(i)}for(let r of t)this.storage.removeItem(r);return}for(let t of this.memoryFallback.keys())e(t)&&this.memoryFallback.delete(t)}};var a=class{constructor(){this.store=new Map}get(e){return this.store.get(e)??null}set(e,t){this.store.set(e,t)}remove(e){this.store.delete(e)}clear(){this.store.clear()}removeKeysMatching(e){for(let t of this.store.keys())e(t)&&this.store.delete(t)}};function $(o){return"removeKeysMatching"in o&&typeof o.removeKeysMatching=="function"}var v=class{constructor(e,t,r){this.adapter=e,this.namespace=t,this.prefix=r}get(e){let t=this.adapter.get(this.createKey(e));if(t===null)return null;try{return JSON.parse(t)}catch{return null}}set(e,t){this.adapter.set(this.createKey(e),JSON.stringify(t))}remove(e){this.adapter.remove(this.createKey(e))}has(e){return this.adapter.get(this.createKey(e))!==null}clear(){let e=this.getNamespaceKeyPrefix();if($(this.adapter)){this.adapter.removeKeysMatching(t=>t.startsWith(e));return}this.adapter.clear()}createKey(e){return this.prefix?`${this.prefix}:${this.namespace}:${e}`:`${this.namespace}:${e}`}getNamespaceKeyPrefix(){return this.prefix?`${this.prefix}:${this.namespace}:`:`${this.namespace}:`}};function C(o){let e=o??"memory";if(typeof window>"u")return new a;switch(e){case"memory":return new a;case"localStorage":return new l(window.localStorage);case"sessionStorage":return new l(window.sessionStorage);case"cookie_localStorage":return new l(window.localStorage);case"cookie":return new a;case"indexedDB":return new a;default:return new a}}function V(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID().replace(/-/g,""):`${Date.now()}${Math.random().toString(36).slice(2)}`}function A(){return`ses_${V()}`}var G="session",I=class{constructor(e,t){this.storage=e,this.storageKey=t.storage.keys?.session??G}getSessionId(){return this.getSessionData()?.sessionId??null}getSessionData(){let e=this.storage.get(this.storageKey);if(!e)return null;if(typeof e=="string"){let t=Date.now();return{sessionId:e,lastActivityAt:t,createdAt:t}}return e}getLastActivityAt(){return this.getSessionData()?.lastActivityAt??null}isExpired(e){let t=this.getSessionData();return t?Date.now()-t.lastActivityAt>e:!0}ensureSession(e){let t=this.getSessionData(),r=Date.now();if(!t){let i=A();return this.writeSessionData({sessionId:i,lastActivityAt:r,createdAt:r}),{sessionId:i,expired:!1,created:!0}}if(r-t.lastActivityAt>e){let i=t.sessionId,n=A();return this.writeSessionData({sessionId:n,lastActivityAt:r,createdAt:r}),{sessionId:n,expired:!0,previousSessionId:i,created:!1}}return{sessionId:t.sessionId,expired:!1,created:!1}}ensureSessionId(){return this.ensureSession(Number.MAX_SAFE_INTEGER).sessionId}touchActivity(){let e=this.getSessionData();e&&this.writeSessionData({...e,lastActivityAt:Date.now()})}renew(){let e=Date.now(),t=A();return this.writeSessionData({sessionId:t,lastActivityAt:e,createdAt:e}),t}clear(){this.storage.remove(this.storageKey)}writeSessionData(e){this.storage.set(this.storageKey,e)}};function j(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID().replace(/-/g,""):`${Date.now()}${Math.random().toString(36).slice(2)}`}function D(){return`vst_${j()}`}var Y="visitor",w=class{constructor(e,t){this.storage=e,this.storageKey=t.storage.keys?.visitor??Y}getVisitorId(){return this.storage.get(this.storageKey)}ensureVisitorId(){let e=this.getVisitorId();if(e)return e;let t=D();return this.storage.set(this.storageKey,t),t}clearVisitorId(){this.storage.remove(this.storageKey)}};var M=class{constructor(e){this.initialized=!1;this.initializedModules=[];this.context=null;this.config=e,this.registry=new c,this.fallbackLogger=new g(e.app.debug===!0)}register(e){this.registry.register(e)}async init(){if(this.initialized){this.getLogger().debug("[PixelRuntime] Runtime already initialized");return}this.fallbackLogger.debug("[PixelRuntime] Initializing runtime"),this.context=this.createContext(),this.context.services.attribution.init();for(let e of this.registry.getAll()){if(!this.isModuleEnabled(e)){this.fallbackLogger.debug(`[PixelRuntime] Skipping disabled module: ${e.name}`);continue}this.fallbackLogger.debug(`[PixelRuntime] Initializing module: ${e.name}`);try{await e.init(this.context),this.initializedModules.push(e)}catch(t){this.fallbackLogger.error(`[Pixel] Failed to initialize module "${e.name}"`,t)}}this.initialized=!0}async destroy(){if(!this.initialized)return;let e=this.getLogger();for(let t=this.initializedModules.length-1;t>=0;t--){let r=this.initializedModules[t];e.debug(`[PixelRuntime] Destroying module: ${r.name}`);try{await r.destroy?.()}catch(i){e.error(`[Pixel] Failed to destroy module "${r.name}"`,i)}}this.context?.services.attribution.destroy(),this.context?.services.dispatcher.clear(),this.initialized=!1,this.initializedModules.length=0,this.context=null,this.fallbackLogger.debug("[PixelRuntime] Runtime destroyed")}isInitialized(){return this.initialized}getDebugServices(){return this.context?.services??null}createServices(){let{namespace:e,prefix:t,persistence:r}=this.config.storage,i=this.createStorageService(e,t,r?.visitor),n=this.createStorageService(e,t,r?.session),s=this.createStorageService(e,t,r?.attribution),E=this.createStorageService(e,t,r?.attribution??"localStorage"),K=this.createStorageService(e,t,"memory"),P=new S,R=new y(E,this.config.attribution??u),T=new d(P,R),_=new w(i,this.config),F=new I(n,this.config),L=new x(s,this.config,P),U=new b;return{storage:K,visitor:_,session:F,fingerprint:L,dispatcher:U,browserMetadata:P,eventBuilder:T,attribution:R}}createStorageService(e,t,r){return new v(C(r),e,t)}createContext(){return{config:this.config,logger:this.fallbackLogger,services:this.createServices()}}getLogger(){return this.context?.logger??this.fallbackLogger}isModuleEnabled(e){return{privacy:this.config.modules.privacy.enabled,core:this.config.modules.core.enabled,behavior:this.config.modules.behavior.enabled,conversion:this.config.modules.conversion.enabled,transport:this.config.modules.transport.enabled,integrations:this.config.modules.integrations.enabled}[e.name]}};export{c as ModuleRegistry,M as PixelRuntime};
3
+ //# sourceMappingURL=index.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/runtime/ModuleRegistry.ts","../../src/events/builder/BaseEventBuilder.ts","../../src/logger/ConsolePixelLogger.ts","../../src/services/attribution/types.ts","../../src/services/attribution/ClickIdParser.ts","../../src/services/attribution/CookieCollector.ts","../../src/services/attribution/AttributionCollector.ts","../../src/services/attribution/AttributionStore.ts","../../src/services/attribution/AttributionService.ts","../../src/services/browser-metadata/BrowserMetadataService.ts","../../src/services/dispatcher/DispatcherService.ts","../../src/services/fingerprint/FingerprintService.ts","../../src/services/storage/BrowserStorageAdapter.ts","../../src/services/storage/MemoryStorageAdapter.ts","../../src/services/storage/StorageService.ts","../../src/services/storage/StorageFactory.ts","../../src/services/session/session-id.ts","../../src/services/session/SessionService.ts","../../src/services/visitor/visitor-id.ts","../../src/services/visitor/VisitorService.ts","../../src/runtime/PixelRuntime.ts"],"sourcesContent":["import type { PixelModule } from './types';\n\nexport class ModuleRegistry {\n private readonly modules: PixelModule[] = [];\n\n register(module: PixelModule): void {\n if (this.modules.some(existing => existing.name === module.name)) {\n throw new Error(`[Pixel] Module \"${module.name}\" is already registered`);\n }\n\n this.modules.push(module);\n }\n\n getAll(): readonly PixelModule[] {\n return this.modules;\n }\n\n size(): number {\n return this.modules.length;\n }\n}\n","import type { AttributionService } from '@/services/attribution/types';\nimport type { BrowserMetadataService } from '@/services/browser-metadata';\n\nimport type { BasePixelEvent } from '../base';\n\nexport class BaseEventBuilder {\n private readonly metadataService: BrowserMetadataService;\n\n private readonly attribution: AttributionService | null;\n\n constructor(\n metadataService: BrowserMetadataService,\n attribution?: AttributionService | null\n ) {\n this.metadataService = metadataService;\n this.attribution = attribution ?? null;\n }\n\n build<T extends { type: string }>(event: T): T & BasePixelEvent {\n const metadata = this.metadataService.getMetadata();\n const identifiers = this.attribution?.getSnapshot();\n const hasIdentifiers =\n identifiers !== undefined &&\n Object.keys(identifiers).some(key => {\n const value = identifiers[key as keyof typeof identifiers];\n return value !== undefined && value !== null && value !== '';\n });\n\n return {\n ...event,\n timestamp: Date.now(),\n path: metadata.path,\n url: metadata.url,\n hostname: metadata.hostname,\n language: metadata.language,\n timezone: metadata.timezone,\n ...(hasIdentifiers ? { identifiers } : {}),\n };\n }\n}\n","import type { PixelLogger } from './PixelLogger';\n\nexport class ConsolePixelLogger implements PixelLogger {\n constructor(private readonly debugEnabled: boolean) {}\n\n debug(...args: unknown[]): void {\n if (!this.debugEnabled) return;\n if (typeof console === 'undefined') return;\n console.debug(...args);\n }\n\n info(...args: unknown[]): void {\n if (typeof console === 'undefined') return;\n console.info(...args);\n }\n\n warn(...args: unknown[]): void {\n if (typeof console === 'undefined') return;\n console.warn(...args);\n }\n\n error(...args: unknown[]): void {\n if (typeof console === 'undefined') return;\n console.error(...args);\n }\n}\n","export type AttributionIdentifiers = {\n readonly fbclid?: string;\n readonly fbp?: string;\n readonly fbc?: string;\n\n readonly gclid?: string;\n readonly gbraid?: string;\n readonly wbraid?: string;\n readonly ga?: string;\n readonly gid?: string;\n readonly gclAu?: string;\n\n readonly ttclid?: string;\n readonly ttp?: string;\n\n readonly msclkid?: string;\n readonly liFatId?: string;\n readonly epik?: string;\n\n readonly customClickIds?: Readonly<Record<string, string>>;\n\n readonly firstCollectedAt?: number;\n readonly lastCollectedAt?: number;\n readonly landingUrl?: string;\n readonly referrer?: string;\n};\n\nexport type AttributionConfig = {\n readonly enabled: boolean;\n readonly ttlDays?: number;\n readonly persist?: boolean;\n readonly captureUrlParams?: boolean;\n readonly captureCookies?: boolean;\n readonly customClickIdParams?: string[];\n};\n\nexport const DEFAULT_ATTRIBUTION_CONFIG: AttributionConfig = {\n enabled: true,\n ttlDays: 90,\n persist: true,\n captureUrlParams: true,\n captureCookies: true,\n customClickIdParams: [],\n};\n\nexport const ATTRIBUTION_STORAGE_KEY = 'attribution';\n\nexport interface AttributionService {\n init(): void;\n destroy(): void;\n collect(): AttributionIdentifiers;\n getSnapshot(): AttributionIdentifiers;\n update(partial: Partial<AttributionIdentifiers>): AttributionIdentifiers;\n clear(): void;\n}\n","import type { AttributionIdentifiers } from './types';\n\nconst BUILTIN_CLICK_PARAMS = [\n 'fbclid',\n 'gclid',\n 'gbraid',\n 'wbraid',\n 'ttclid',\n 'msclkid',\n 'epik',\n 'li_fat_id',\n] as const;\n\n/**\n * Parses click IDs from URL search params and maps to AttributionIdentifiers fields.\n */\nexport class ClickIdParser {\n parse(\n customParams: readonly string[] = []\n ): Partial<AttributionIdentifiers> {\n if (typeof window === 'undefined' || !window.location?.search) {\n return {};\n }\n\n try {\n const params = new URLSearchParams(window.location.search);\n const result: Record<string, unknown> = {};\n const customClickIds: Record<string, string> = {};\n\n for (const key of BUILTIN_CLICK_PARAMS) {\n const value = params.get(key);\n if (!value) continue;\n\n if (key === 'li_fat_id') {\n result.liFatId = value;\n } else {\n result[key] = value;\n }\n }\n\n for (const key of customParams) {\n const value = params.get(key);\n if (value) customClickIds[key] = value;\n }\n\n if (Object.keys(customClickIds).length > 0) {\n result.customClickIds = customClickIds;\n }\n\n return result as Partial<AttributionIdentifiers>;\n } catch {\n return {};\n }\n }\n\n /**\n * Meta convention: when fbclid is present and _fbc cookie is missing,\n * synthesize fbc = fb.1.<timestamp_ms>.<fbclid>\n */\n synthesizeFbc(fbclid: string, existingFbc?: string): string | undefined {\n if (existingFbc) return existingFbc;\n if (!fbclid) return undefined;\n return `fb.1.${Date.now()}.${fbclid}`;\n }\n}\n","/**\n * SSR-safe cookie reader for attribution identifiers.\n */\nexport class CookieCollector {\n collectKnown(): Readonly<Record<string, string>> {\n if (typeof document === 'undefined') return {};\n\n const cookies = this.parseCookies();\n const result: Record<string, string> = {};\n\n const map: Record<string, string> = {\n _fbp: 'fbp',\n _fbc: 'fbc',\n _ga: 'ga',\n _gid: 'gid',\n _gcl_au: 'gclAu',\n _ttp: 'ttp',\n li_fat_id: 'liFatId',\n epik: 'epik',\n };\n\n for (const [cookieName, field] of Object.entries(map)) {\n const value = cookies[cookieName];\n if (value) result[field] = value;\n }\n\n return result;\n }\n\n private parseCookies(): Record<string, string> {\n if (typeof document === 'undefined') return {};\n\n try {\n return document.cookie.split(';').reduce(\n (acc, part) => {\n const [rawKey, ...rest] = part.trim().split('=');\n if (!rawKey) return acc;\n acc[rawKey] = decodeURIComponent(rest.join('=') || '');\n return acc;\n },\n {} as Record<string, string>\n );\n } catch {\n return {};\n }\n }\n}\n","import type { AttributionIdentifiers } from './types';\nimport { ClickIdParser } from './ClickIdParser';\nimport { CookieCollector } from './CookieCollector';\n\n/**\n * Collects attribution signals from URL + cookies and merges them.\n */\nexport class AttributionCollector {\n private readonly clickIdParser = new ClickIdParser();\n\n private readonly cookieCollector = new CookieCollector();\n\n private readonly customParams: readonly string[];\n\n private readonly captureUrlParams: boolean;\n\n private readonly captureCookies: boolean;\n\n constructor(\n options: {\n customParams?: readonly string[];\n captureUrlParams?: boolean;\n captureCookies?: boolean;\n } = {}\n ) {\n this.customParams = options.customParams ?? [];\n this.captureUrlParams = options.captureUrlParams !== false;\n this.captureCookies = options.captureCookies !== false;\n }\n\n collectFresh(): Partial<AttributionIdentifiers> {\n const fromUrl = this.captureUrlParams\n ? this.clickIdParser.parse(this.customParams)\n : {};\n const fromCookies = this.captureCookies\n ? this.cookieCollector.collectKnown()\n : {};\n\n const merged: Record<string, unknown> = {\n ...fromCookies,\n ...fromUrl,\n };\n\n const customClickIds = {\n ...((fromCookies as AttributionIdentifiers).customClickIds ?? {}),\n ...(fromUrl.customClickIds ?? {}),\n };\n if (Object.keys(customClickIds).length > 0) {\n merged.customClickIds = customClickIds;\n }\n\n if (typeof merged.fbclid === 'string' && merged.fbclid) {\n const fbc = this.clickIdParser.synthesizeFbc(\n merged.fbclid,\n typeof merged.fbc === 'string' ? merged.fbc : undefined\n );\n if (fbc) merged.fbc = fbc;\n }\n\n if (typeof window !== 'undefined') {\n try {\n merged.landingUrl = window.location.href;\n } catch {\n // ignore\n }\n }\n\n if (typeof document !== 'undefined') {\n try {\n if (document.referrer) merged.referrer = document.referrer;\n } catch {\n // ignore\n }\n }\n\n return merged as Partial<AttributionIdentifiers>;\n }\n\n /**\n * Merge: never overwrite existing defined values with undefined.\n */\n merge(\n existing: AttributionIdentifiers,\n incoming: Partial<AttributionIdentifiers>\n ): AttributionIdentifiers {\n const next: Record<string, unknown> = { ...existing };\n\n for (const [key, value] of Object.entries(incoming)) {\n if (value === undefined || value === null || value === '') continue;\n\n if (key === 'customClickIds' && typeof value === 'object') {\n next.customClickIds = {\n ...((existing.customClickIds as Record<string, string>) ?? {}),\n ...(value as Record<string, string>),\n };\n continue;\n }\n\n next[key] = value;\n }\n\n const now = Date.now();\n if (!existing.firstCollectedAt) {\n next.firstCollectedAt = now;\n }\n next.lastCollectedAt = now;\n\n return next as AttributionIdentifiers;\n }\n}\n","import type { StorageService } from '@/services/storage/types';\n\nimport { ATTRIBUTION_STORAGE_KEY, type AttributionIdentifiers } from './types';\n\n/**\n * Persists AttributionIdentifiers via StorageService only (no direct localStorage).\n */\nexport class AttributionStore {\n private readonly storage: StorageService;\n\n private readonly persist: boolean;\n\n private readonly ttlMs: number;\n\n private readonly storageKey: string;\n\n constructor(\n storage: StorageService,\n options: { persist: boolean; ttlDays: number; storageKey?: string }\n ) {\n this.storage = storage;\n this.persist = options.persist;\n this.ttlMs = options.ttlDays * 24 * 60 * 60 * 1000;\n this.storageKey = options.storageKey ?? ATTRIBUTION_STORAGE_KEY;\n }\n\n load(): AttributionIdentifiers | null {\n if (!this.persist) return null;\n\n try {\n const snapshot = this.storage.get<AttributionIdentifiers>(this.storageKey);\n if (!snapshot) return null;\n\n if (this.isExpired(snapshot)) {\n this.clear();\n return null;\n }\n\n return snapshot;\n } catch {\n return null;\n }\n }\n\n save(snapshot: AttributionIdentifiers): void {\n if (!this.persist) return;\n\n try {\n this.storage.set(this.storageKey, snapshot);\n } catch {\n // quota / SSR — keep in-memory only\n }\n }\n\n clear(): void {\n try {\n this.storage.remove(this.storageKey);\n } catch {\n // ignore\n }\n }\n\n private isExpired(snapshot: AttributionIdentifiers): boolean {\n const anchor = snapshot.lastCollectedAt ?? snapshot.firstCollectedAt;\n if (!anchor) return false;\n return Date.now() - anchor > this.ttlMs;\n }\n}\n","import type { StorageService } from '@/services/storage/types';\n\nimport { AttributionCollector } from './AttributionCollector';\nimport { AttributionStore } from './AttributionStore';\nimport {\n DEFAULT_ATTRIBUTION_CONFIG,\n type AttributionConfig,\n type AttributionIdentifiers,\n type AttributionService,\n} from './types';\n\nexport class AttributionServiceImpl implements AttributionService {\n private readonly store: AttributionStore;\n\n private readonly collector: AttributionCollector;\n\n private readonly enabled: boolean;\n\n private snapshot: AttributionIdentifiers = {};\n\n private active = false;\n\n constructor(storage: StorageService, config: AttributionConfig = DEFAULT_ATTRIBUTION_CONFIG) {\n this.enabled = config.enabled !== false;\n this.store = new AttributionStore(storage, {\n persist: config.persist !== false,\n ttlDays: config.ttlDays ?? 90,\n });\n this.collector = new AttributionCollector({\n customParams: config.customClickIdParams ?? [],\n captureUrlParams: config.captureUrlParams !== false,\n captureCookies: config.captureCookies !== false,\n });\n }\n\n init(): void {\n if (this.active) return;\n this.active = true;\n\n if (!this.enabled) return;\n\n const stored = this.store.load();\n if (stored) {\n this.snapshot = stored;\n }\n\n this.collect();\n }\n\n destroy(): void {\n if (!this.active) return;\n this.active = false;\n }\n\n collect(): AttributionIdentifiers {\n if (!this.enabled) return this.snapshot;\n\n const fresh = this.collector.collectFresh();\n this.snapshot = this.collector.merge(this.snapshot, fresh);\n this.store.save(this.snapshot);\n return this.snapshot;\n }\n\n getSnapshot(): AttributionIdentifiers {\n return { ...this.snapshot };\n }\n\n update(partial: Partial<AttributionIdentifiers>): AttributionIdentifiers {\n this.snapshot = this.collector.merge(this.snapshot, partial);\n this.store.save(this.snapshot);\n return this.getSnapshot();\n }\n\n clear(): void {\n this.snapshot = {};\n this.store.clear();\n }\n}\n","import type { BrowserMetadata, BrowserMetadataService } from './types';\n\nexport class BrowserMetadataServiceImpl implements BrowserMetadataService {\n getMetadata(): BrowserMetadata {\n if (typeof window === 'undefined') {\n return {};\n }\n\n const timezone = (() => {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch {\n return undefined;\n }\n })();\n\n return {\n url: location.href,\n path: location.pathname,\n hostname: location.hostname,\n origin: location.origin,\n title: typeof document !== 'undefined' ? document.title : undefined,\n referrer: typeof document !== 'undefined' ? document.referrer : undefined,\n language: navigator.language,\n timezone,\n userAgent: navigator.userAgent,\n platform: navigator.platform,\n screenWidth: screen.width,\n screenHeight: screen.height,\n colorDepth: screen.colorDepth,\n };\n }\n}\n","import type { PixelEvent } from '@/events';\n\nimport type { DispatcherService } from './types';\n\ntype EventListener = (event: PixelEvent) => void;\n\nexport class DispatcherServiceImpl implements DispatcherService {\n private readonly listeners = new Set<EventListener>();\n\n private lastEvent: PixelEvent | null = null;\n\n dispatch(event: PixelEvent): void {\n this.lastEvent = event;\n\n for (const listener of this.listeners) {\n listener(event);\n }\n }\n\n subscribe(listener: (event: PixelEvent) => void): () => void {\n this.listeners.add(listener);\n\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n clear(): void {\n this.listeners.clear();\n this.lastEvent = null;\n }\n\n getListenerCount(): number {\n return this.listeners.size;\n }\n\n getLastEvent(): PixelEvent | null {\n return this.lastEvent;\n }\n}\n","import type { PixelConfig } from '@/config';\nimport type { BrowserMetadataService } from '@/services/browser-metadata';\nimport type { StorageService } from '@/services/storage';\n\nimport type { FingerprintService } from './types';\n\nconst DEFAULT_FINGERPRINT_KEY = 'fingerprint';\n\nfunction hashFingerprintInput(input: string): string {\n let hash = 0;\n\n for (let index = 0; index < input.length; index++) {\n hash = (hash << 5) - hash + input.charCodeAt(index);\n hash |= 0;\n }\n\n const positiveHash = Math.abs(hash).toString(16).padStart(8, '0');\n let secondaryHash = 0;\n\n for (let index = input.length - 1; index >= 0; index--) {\n secondaryHash = (secondaryHash << 5) - secondaryHash + input.charCodeAt(index);\n secondaryHash |= 0;\n }\n\n return `fp_${positiveHash}${Math.abs(secondaryHash).toString(16).padStart(8, '0')}`;\n}\n\nfunction computeLightFingerprint(\n metadataService: BrowserMetadataService\n): string {\n const metadata = metadataService.getMetadata();\n\n const components = [\n metadata.userAgent ?? '',\n metadata.language ?? '',\n metadata.platform ?? '',\n String(metadata.screenWidth ?? ''),\n String(metadata.screenHeight ?? ''),\n String(metadata.colorDepth ?? ''),\n metadata.timezone ?? '',\n ];\n\n return hashFingerprintInput(components.join('|'));\n}\n\nexport class FingerprintServiceImpl implements FingerprintService {\n private readonly storage: StorageService;\n\n private readonly storageKey: string;\n\n private readonly metadataService: BrowserMetadataService;\n\n constructor(\n storage: StorageService,\n config: PixelConfig,\n metadataService: BrowserMetadataService\n ) {\n this.storage = storage;\n this.storageKey =\n config.storage.keys?.fingerprint ?? DEFAULT_FINGERPRINT_KEY;\n this.metadataService = metadataService;\n }\n\n getFingerprint(): string | null {\n return this.storage.get<string>(this.storageKey);\n }\n\n ensureFingerprint(): string {\n const existing = this.getFingerprint();\n if (existing) return existing;\n\n const fingerprint = computeLightFingerprint(this.metadataService);\n this.storage.set(this.storageKey, fingerprint);\n return fingerprint;\n }\n}\n","import type { StorageAdapter } from './types';\n\nexport class BrowserStorageAdapter implements StorageAdapter {\n private readonly storage: Storage | null;\n\n private readonly memoryFallback = new Map<string, string>();\n\n constructor(storage: Storage) {\n this.storage = typeof window === 'undefined' ? null : storage;\n }\n\n get(key: string): string | null {\n if (this.storage) {\n return this.storage.getItem(key);\n }\n\n return this.memoryFallback.get(key) ?? null;\n }\n\n set(key: string, value: string): void {\n if (this.storage) {\n this.storage.setItem(key, value);\n return;\n }\n\n this.memoryFallback.set(key, value);\n }\n\n remove(key: string): void {\n if (this.storage) {\n this.storage.removeItem(key);\n return;\n }\n\n this.memoryFallback.delete(key);\n }\n\n clear(): void {\n // Never clear entire browser storage — namespace removal uses removeKeysMatching.\n if (!this.storage) {\n this.memoryFallback.clear();\n }\n }\n\n removeKeysMatching(predicate: (key: string) => boolean): void {\n if (this.storage) {\n const keysToRemove: string[] = [];\n\n for (let index = 0; index < this.storage.length; index++) {\n const key = this.storage.key(index);\n if (key && predicate(key)) {\n keysToRemove.push(key);\n }\n }\n\n for (const key of keysToRemove) {\n this.storage.removeItem(key);\n }\n\n return;\n }\n\n for (const key of this.memoryFallback.keys()) {\n if (predicate(key)) {\n this.memoryFallback.delete(key);\n }\n }\n }\n}\n","import type { StorageAdapter } from './types';\n\nexport class MemoryStorageAdapter implements StorageAdapter {\n private readonly store = new Map<string, string>();\n\n get(key: string): string | null {\n return this.store.get(key) ?? null;\n }\n\n set(key: string, value: string): void {\n this.store.set(key, value);\n }\n\n remove(key: string): void {\n this.store.delete(key);\n }\n\n clear(): void {\n this.store.clear();\n }\n\n removeKeysMatching(predicate: (key: string) => boolean): void {\n for (const key of this.store.keys()) {\n if (predicate(key)) {\n this.store.delete(key);\n }\n }\n }\n}\n","import type { StorageAdapter, StorageService } from './types';\n\ntype NamespaceClearableAdapter = StorageAdapter & {\n removeKeysMatching(predicate: (key: string) => boolean): void;\n};\n\nfunction supportsNamespaceClear(\n adapter: StorageAdapter\n): adapter is NamespaceClearableAdapter {\n return (\n 'removeKeysMatching' in adapter &&\n typeof adapter.removeKeysMatching === 'function'\n );\n}\n\nexport class StorageServiceImpl implements StorageService {\n private readonly adapter: StorageAdapter;\n\n private readonly namespace: string;\n\n private readonly prefix?: string;\n\n constructor(adapter: StorageAdapter, namespace: string, prefix?: string) {\n this.adapter = adapter;\n this.namespace = namespace;\n this.prefix = prefix;\n }\n\n get<T>(key: string): T | null {\n const raw = this.adapter.get(this.createKey(key));\n if (raw === null) return null;\n\n try {\n return JSON.parse(raw) as T;\n } catch {\n return null;\n }\n }\n\n set<T>(key: string, value: T): void {\n this.adapter.set(this.createKey(key), JSON.stringify(value));\n }\n\n remove(key: string): void {\n this.adapter.remove(this.createKey(key));\n }\n\n has(key: string): boolean {\n return this.adapter.get(this.createKey(key)) !== null;\n }\n\n clear(): void {\n const namespaceKeyPrefix = this.getNamespaceKeyPrefix();\n\n if (supportsNamespaceClear(this.adapter)) {\n this.adapter.removeKeysMatching(key =>\n key.startsWith(namespaceKeyPrefix)\n );\n return;\n }\n\n this.adapter.clear();\n }\n\n createKey(key: string): string {\n if (this.prefix) {\n return `${this.prefix}:${this.namespace}:${key}`;\n }\n\n return `${this.namespace}:${key}`;\n }\n\n private getNamespaceKeyPrefix(): string {\n if (this.prefix) {\n return `${this.prefix}:${this.namespace}:`;\n }\n\n return `${this.namespace}:`;\n }\n}\n","import type {\n AttributionStoragePersistence,\n QueueStoragePersistence,\n SessionStoragePersistence,\n VisitorStoragePersistence,\n} from '@/config/shared/persistence';\n\nimport { BrowserStorageAdapter } from './BrowserStorageAdapter';\nimport { MemoryStorageAdapter } from './MemoryStorageAdapter';\nimport type { StorageAdapter } from './types';\n\nexport type StoragePersistence =\n | VisitorStoragePersistence\n | SessionStoragePersistence\n | AttributionStoragePersistence\n | QueueStoragePersistence;\n\nexport function createStorageAdapter(\n persistence?: StoragePersistence\n): StorageAdapter {\n const mode = persistence ?? 'memory';\n\n if (typeof window === 'undefined') {\n return new MemoryStorageAdapter();\n }\n\n switch (mode) {\n case 'memory':\n return new MemoryStorageAdapter();\n case 'localStorage':\n return new BrowserStorageAdapter(window.localStorage);\n case 'sessionStorage':\n return new BrowserStorageAdapter(window.sessionStorage);\n case 'cookie_localStorage':\n // TODO: implementar cookie fallback.\n return new BrowserStorageAdapter(window.localStorage);\n case 'cookie':\n return new MemoryStorageAdapter();\n case 'indexedDB':\n return new MemoryStorageAdapter();\n default:\n return new MemoryStorageAdapter();\n }\n}\n\nexport function resolveStorageAdapterName(\n persistence?: StoragePersistence\n): string {\n const mode = persistence ?? 'memory';\n\n switch (mode) {\n case 'localStorage':\n case 'sessionStorage':\n case 'cookie_localStorage':\n return 'BrowserStorageAdapter';\n default:\n return 'MemoryStorageAdapter';\n }\n}\n","function createRandomSuffix(): string {\n if (\n typeof crypto !== 'undefined' &&\n typeof crypto.randomUUID === 'function'\n ) {\n return crypto.randomUUID().replace(/-/g, '');\n }\n\n return `${Date.now()}${Math.random().toString(36).slice(2)}`;\n}\n\nexport function generateSessionId(): string {\n return `ses_${createRandomSuffix()}`;\n}\n","import type { PixelConfig } from '@/config';\nimport type { StorageService } from '@/services/storage';\n\nimport type { EnsureSessionResult, SessionData, SessionService } from './types';\nimport { generateSessionId } from './session-id';\n\nconst DEFAULT_SESSION_KEY = 'session';\n\nexport class SessionServiceImpl implements SessionService {\n private readonly storage: StorageService;\n\n private readonly storageKey: string;\n\n constructor(storage: StorageService, config: PixelConfig) {\n this.storage = storage;\n this.storageKey = config.storage.keys?.session ?? DEFAULT_SESSION_KEY;\n }\n\n getSessionId(): string | null {\n return this.getSessionData()?.sessionId ?? null;\n }\n\n getSessionData(): SessionData | null {\n const raw = this.storage.get<SessionData | string>(this.storageKey);\n if (!raw) return null;\n\n if (typeof raw === 'string') {\n const now = Date.now();\n return {\n sessionId: raw,\n lastActivityAt: now,\n createdAt: now,\n };\n }\n\n return raw;\n }\n\n getLastActivityAt(): number | null {\n return this.getSessionData()?.lastActivityAt ?? null;\n }\n\n isExpired(ttlMs: number): boolean {\n const data = this.getSessionData();\n if (!data) return true;\n\n return Date.now() - data.lastActivityAt > ttlMs;\n }\n\n ensureSession(ttlMs: number): EnsureSessionResult {\n const data = this.getSessionData();\n const now = Date.now();\n\n if (!data) {\n const sessionId = generateSessionId();\n this.writeSessionData({\n sessionId,\n lastActivityAt: now,\n createdAt: now,\n });\n\n return {\n sessionId,\n expired: false,\n created: true,\n };\n }\n\n if (now - data.lastActivityAt > ttlMs) {\n const previousSessionId = data.sessionId;\n const sessionId = generateSessionId();\n\n this.writeSessionData({\n sessionId,\n lastActivityAt: now,\n createdAt: now,\n });\n\n return {\n sessionId,\n expired: true,\n previousSessionId,\n created: false,\n };\n }\n\n return {\n sessionId: data.sessionId,\n expired: false,\n created: false,\n };\n }\n\n ensureSessionId(): string {\n return this.ensureSession(Number.MAX_SAFE_INTEGER).sessionId;\n }\n\n touchActivity(): void {\n const data = this.getSessionData();\n if (!data) return;\n\n this.writeSessionData({\n ...data,\n lastActivityAt: Date.now(),\n });\n }\n\n renew(): string {\n const now = Date.now();\n const sessionId = generateSessionId();\n\n this.writeSessionData({\n sessionId,\n lastActivityAt: now,\n createdAt: now,\n });\n\n return sessionId;\n }\n\n clear(): void {\n this.storage.remove(this.storageKey);\n }\n\n private writeSessionData(data: SessionData): void {\n this.storage.set(this.storageKey, data);\n }\n}\n","function createRandomSuffix(): string {\n if (\n typeof crypto !== 'undefined' &&\n typeof crypto.randomUUID === 'function'\n ) {\n return crypto.randomUUID().replace(/-/g, '');\n }\n\n return `${Date.now()}${Math.random().toString(36).slice(2)}`;\n}\n\nexport function generateVisitorId(): string {\n return `vst_${createRandomSuffix()}`;\n}\n","import type { PixelConfig } from '@/config';\nimport type { StorageService } from '@/services/storage';\n\nimport type { VisitorService } from './types';\nimport { generateVisitorId } from './visitor-id';\n\nconst DEFAULT_VISITOR_KEY = 'visitor';\n\nexport class VisitorServiceImpl implements VisitorService {\n private readonly storage: StorageService;\n\n private readonly storageKey: string;\n\n constructor(storage: StorageService, config: PixelConfig) {\n this.storage = storage;\n this.storageKey = config.storage.keys?.visitor ?? DEFAULT_VISITOR_KEY;\n }\n\n getVisitorId(): string | null {\n return this.storage.get<string>(this.storageKey);\n }\n\n ensureVisitorId(): string {\n const existing = this.getVisitorId();\n if (existing) return existing;\n\n const visitorId = generateVisitorId();\n this.storage.set(this.storageKey, visitorId);\n return visitorId;\n }\n\n clearVisitorId(): void {\n this.storage.remove(this.storageKey);\n }\n}\n","import type { PixelConfig } from '@/config';\nimport { BaseEventBuilder } from '@/events/builder';\nimport { ConsolePixelLogger, type PixelLogger } from '@/logger';\nimport {\n AttributionServiceImpl,\n DEFAULT_ATTRIBUTION_CONFIG,\n} from '@/services/attribution';\nimport { BrowserMetadataServiceImpl } from '@/services/browser-metadata/BrowserMetadataService';\nimport { DispatcherServiceImpl } from '@/services/dispatcher/DispatcherService';\nimport { FingerprintServiceImpl } from '@/services/fingerprint/FingerprintService';\nimport {\n createStorageAdapter,\n StorageServiceImpl,\n} from '@/services/storage';\nimport type { StoragePersistence } from '@/services/storage/StorageFactory';\nimport { SessionServiceImpl } from '@/services/session/SessionService';\nimport type { PixelRuntimeServices } from '@/services/types';\nimport { VisitorServiceImpl } from '@/services/visitor/VisitorService';\n\nimport { ModuleRegistry } from './ModuleRegistry';\nimport type { PixelRuntimeContext } from './PixelRuntimeContext';\nimport type { ModuleName } from './shared/module';\nimport type { PixelModule } from './types';\n\nexport class PixelRuntime {\n private initialized = false;\n\n private readonly initializedModules: PixelModule[] = [];\n\n private readonly registry: ModuleRegistry;\n\n private readonly config: PixelConfig;\n\n private readonly fallbackLogger: ConsolePixelLogger;\n\n private context: PixelRuntimeContext | null = null;\n\n constructor(config: PixelConfig) {\n this.config = config;\n this.registry = new ModuleRegistry();\n this.fallbackLogger = new ConsolePixelLogger(config.app.debug === true);\n }\n\n register(module: PixelModule): void {\n this.registry.register(module);\n }\n\n async init(): Promise<void> {\n if (this.initialized) {\n this.getLogger().debug('[PixelRuntime] Runtime already initialized');\n return;\n }\n\n this.fallbackLogger.debug('[PixelRuntime] Initializing runtime');\n\n this.context = this.createContext();\n this.context.services.attribution.init();\n\n for (const module of this.registry.getAll()) {\n if (!this.isModuleEnabled(module)) {\n this.fallbackLogger.debug(\n `[PixelRuntime] Skipping disabled module: ${module.name}`\n );\n continue;\n }\n\n this.fallbackLogger.debug(\n `[PixelRuntime] Initializing module: ${module.name}`\n );\n\n try {\n await module.init(this.context);\n this.initializedModules.push(module);\n } catch (error) {\n this.fallbackLogger.error(\n `[Pixel] Failed to initialize module \"${module.name}\"`,\n error\n );\n }\n }\n\n this.initialized = true;\n }\n\n async destroy(): Promise<void> {\n if (!this.initialized) return;\n\n const logger = this.getLogger();\n\n for (let index = this.initializedModules.length - 1; index >= 0; index--) {\n const module = this.initializedModules[index];\n\n logger.debug(`[PixelRuntime] Destroying module: ${module.name}`);\n\n try {\n await module.destroy?.();\n } catch (error) {\n logger.error(\n `[Pixel] Failed to destroy module \"${module.name}\"`,\n error\n );\n }\n }\n\n this.context?.services.attribution.destroy();\n this.context?.services.dispatcher.clear();\n\n this.initialized = false;\n this.initializedModules.length = 0;\n this.context = null;\n\n this.fallbackLogger.debug('[PixelRuntime] Runtime destroyed');\n }\n\n isInitialized(): boolean {\n return this.initialized;\n }\n\n /** @internal For playground and development only. Not part of the stable public API. */\n getDebugServices(): PixelRuntimeServices | null {\n return this.context?.services ?? null;\n }\n\n private createServices(): PixelRuntimeServices {\n const { namespace, prefix, persistence } = this.config.storage;\n\n const visitorStorage = this.createStorageService(\n namespace,\n prefix,\n persistence?.visitor\n );\n const sessionStorage = this.createStorageService(\n namespace,\n prefix,\n persistence?.session\n );\n const fingerprintStorage = this.createStorageService(\n namespace,\n prefix,\n persistence?.attribution\n );\n const attributionStorage = this.createStorageService(\n namespace,\n prefix,\n persistence?.attribution ?? 'localStorage'\n );\n const storage = this.createStorageService(namespace, prefix, 'memory');\n const browserMetadata = new BrowserMetadataServiceImpl();\n\n const attribution = new AttributionServiceImpl(\n attributionStorage,\n this.config.attribution ?? DEFAULT_ATTRIBUTION_CONFIG\n );\n\n const eventBuilder = new BaseEventBuilder(browserMetadata, attribution);\n\n const visitor = new VisitorServiceImpl(visitorStorage, this.config);\n const session = new SessionServiceImpl(sessionStorage, this.config);\n const fingerprint = new FingerprintServiceImpl(\n fingerprintStorage,\n this.config,\n browserMetadata\n );\n const dispatcher = new DispatcherServiceImpl();\n\n return {\n storage,\n visitor,\n session,\n fingerprint,\n dispatcher,\n browserMetadata,\n eventBuilder,\n attribution,\n };\n }\n\n private createStorageService(\n namespace: string,\n prefix: string | undefined,\n persistence: StoragePersistence | undefined\n ): StorageServiceImpl {\n return new StorageServiceImpl(\n createStorageAdapter(persistence),\n namespace,\n prefix\n );\n }\n\n private createContext(): PixelRuntimeContext {\n return {\n config: this.config,\n logger: this.fallbackLogger,\n services: this.createServices(),\n };\n }\n\n private getLogger(): PixelLogger {\n return this.context?.logger ?? this.fallbackLogger;\n }\n\n private isModuleEnabled(module: PixelModule): boolean {\n const enabledModules: Record<ModuleName, boolean> = {\n privacy: this.config.modules.privacy.enabled,\n core: this.config.modules.core.enabled,\n behavior: this.config.modules.behavior.enabled,\n conversion: this.config.modules.conversion.enabled,\n transport: this.config.modules.transport.enabled,\n integrations: this.config.modules.integrations.enabled,\n };\n\n return enabledModules[module.name];\n }\n}\n"],"mappings":"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","names":["ModuleRegistry","module","existing","BaseEventBuilder","metadataService","attribution","event","metadata","identifiers","hasIdentifiers","key","value","ConsolePixelLogger","debugEnabled","args","DEFAULT_ATTRIBUTION_CONFIG","ATTRIBUTION_STORAGE_KEY","BUILTIN_CLICK_PARAMS","ClickIdParser","customParams","params","result","customClickIds","key","value","fbclid","existingFbc","CookieCollector","cookies","result","map","cookieName","field","value","acc","part","rawKey","rest","AttributionCollector","options","ClickIdParser","CookieCollector","fromUrl","fromCookies","merged","customClickIds","fbc","existing","incoming","next","key","value","now","AttributionStore","storage","options","ATTRIBUTION_STORAGE_KEY","snapshot","anchor","AttributionServiceImpl","storage","config","DEFAULT_ATTRIBUTION_CONFIG","AttributionStore","AttributionCollector","stored","fresh","partial","BrowserMetadataServiceImpl","timezone","DispatcherServiceImpl","event","listener","DEFAULT_FINGERPRINT_KEY","hashFingerprintInput","input","hash","index","positiveHash","secondaryHash","computeLightFingerprint","metadataService","metadata","components","FingerprintServiceImpl","storage","config","existing","fingerprint","BrowserStorageAdapter","storage","key","value","predicate","keysToRemove","index","MemoryStorageAdapter","key","value","predicate","supportsNamespaceClear","adapter","StorageServiceImpl","namespace","prefix","key","raw","value","namespaceKeyPrefix","createStorageAdapter","persistence","mode","MemoryStorageAdapter","BrowserStorageAdapter","createRandomSuffix","generateSessionId","DEFAULT_SESSION_KEY","SessionServiceImpl","storage","config","raw","now","ttlMs","data","sessionId","generateSessionId","previousSessionId","createRandomSuffix","generateVisitorId","DEFAULT_VISITOR_KEY","VisitorServiceImpl","storage","config","existing","visitorId","generateVisitorId","PixelRuntime","config","ModuleRegistry","ConsolePixelLogger","module","error","logger","index","namespace","prefix","persistence","visitorStorage","sessionStorage","fingerprintStorage","attributionStorage","storage","browserMetadata","BrowserMetadataServiceImpl","attribution","AttributionServiceImpl","DEFAULT_ATTRIBUTION_CONFIG","eventBuilder","BaseEventBuilder","visitor","VisitorServiceImpl","session","SessionServiceImpl","fingerprint","FingerprintServiceImpl","dispatcher","DispatcherServiceImpl","StorageServiceImpl","createStorageAdapter"]}
@@ -0,0 +1,3 @@
1
+ /* Pixel v2 — SDK de analytics e conversão */
2
+ "use strict";var w=Object.defineProperty;var P=Object.getOwnPropertyDescriptor;var D=Object.getOwnPropertyNames;var E=Object.prototype.hasOwnProperty;var K=(s,e)=>{for(var t in e)w(s,t,{get:e[t],enumerable:!0})},T=(s,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of D(e))!E.call(s,i)&&i!==t&&w(s,i,{get:()=>e[i],enumerable:!(r=P(e,i))||r.enumerable});return s};var _=s=>T(w({},"__esModule",{value:!0}),s);var V={};K(V,{ATTRIBUTION_STORAGE_KEY:()=>m,AttributionCollector:()=>p,AttributionServiceImpl:()=>y,AttributionStore:()=>g,BrowserMetadataServiceImpl:()=>v,BrowserStorageAdapter:()=>c,ClickIdParser:()=>l,CookieCollector:()=>d,DEFAULT_ATTRIBUTION_CONFIG:()=>f,DispatcherServiceImpl:()=>h,FingerprintServiceImpl:()=>S,MemoryStorageAdapter:()=>a,SessionServiceImpl:()=>A,StorageServiceImpl:()=>b,VisitorServiceImpl:()=>x,createStorageAdapter:()=>k,generateSessionId:()=>u,generateVisitorId:()=>I,resolveStorageAdapterName:()=>C});module.exports=_(V);var h=class{constructor(){this.listeners=new Set;this.lastEvent=null}dispatch(e){this.lastEvent=e;for(let t of this.listeners)t(e)}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}clear(){this.listeners.clear(),this.lastEvent=null}getListenerCount(){return this.listeners.size}getLastEvent(){return this.lastEvent}};var v=class{getMetadata(){if(typeof window>"u")return{};let e=(()=>{try{return Intl.DateTimeFormat().resolvedOptions().timeZone}catch{return}})();return{url:location.href,path:location.pathname,hostname:location.hostname,origin:location.origin,title:typeof document<"u"?document.title:void 0,referrer:typeof document<"u"?document.referrer:void 0,language:navigator.language,timezone:e,userAgent:navigator.userAgent,platform:navigator.platform,screenWidth:screen.width,screenHeight:screen.height,colorDepth:screen.colorDepth}}};var R="fingerprint";function U(s){let e=0;for(let i=0;i<s.length;i++)e=(e<<5)-e+s.charCodeAt(i),e|=0;let t=Math.abs(e).toString(16).padStart(8,"0"),r=0;for(let i=s.length-1;i>=0;i--)r=(r<<5)-r+s.charCodeAt(i),r|=0;return`fp_${t}${Math.abs(r).toString(16).padStart(8,"0")}`}function F(s){let e=s.getMetadata(),t=[e.userAgent??"",e.language??"",e.platform??"",String(e.screenWidth??""),String(e.screenHeight??""),String(e.colorDepth??""),e.timezone??""];return U(t.join("|"))}var S=class{constructor(e,t,r){this.storage=e,this.storageKey=t.storage.keys?.fingerprint??R,this.metadataService=r}getFingerprint(){return this.storage.get(this.storageKey)}ensureFingerprint(){let e=this.getFingerprint();if(e)return e;let t=F(this.metadataService);return this.storage.set(this.storageKey,t),t}};function M(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID().replace(/-/g,""):`${Date.now()}${Math.random().toString(36).slice(2)}`}function u(){return`ses_${M()}`}var N="session",A=class{constructor(e,t){this.storage=e,this.storageKey=t.storage.keys?.session??N}getSessionId(){return this.getSessionData()?.sessionId??null}getSessionData(){let e=this.storage.get(this.storageKey);if(!e)return null;if(typeof e=="string"){let t=Date.now();return{sessionId:e,lastActivityAt:t,createdAt:t}}return e}getLastActivityAt(){return this.getSessionData()?.lastActivityAt??null}isExpired(e){let t=this.getSessionData();return t?Date.now()-t.lastActivityAt>e:!0}ensureSession(e){let t=this.getSessionData(),r=Date.now();if(!t){let i=u();return this.writeSessionData({sessionId:i,lastActivityAt:r,createdAt:r}),{sessionId:i,expired:!1,created:!0}}if(r-t.lastActivityAt>e){let i=t.sessionId,o=u();return this.writeSessionData({sessionId:o,lastActivityAt:r,createdAt:r}),{sessionId:o,expired:!0,previousSessionId:i,created:!1}}return{sessionId:t.sessionId,expired:!1,created:!1}}ensureSessionId(){return this.ensureSession(Number.MAX_SAFE_INTEGER).sessionId}touchActivity(){let e=this.getSessionData();e&&this.writeSessionData({...e,lastActivityAt:Date.now()})}renew(){let e=Date.now(),t=u();return this.writeSessionData({sessionId:t,lastActivityAt:e,createdAt:e}),t}clear(){this.storage.remove(this.storageKey)}writeSessionData(e){this.storage.set(this.storageKey,e)}};var c=class{constructor(e){this.memoryFallback=new Map;this.storage=typeof window>"u"?null:e}get(e){return this.storage?this.storage.getItem(e):this.memoryFallback.get(e)??null}set(e,t){if(this.storage){this.storage.setItem(e,t);return}this.memoryFallback.set(e,t)}remove(e){if(this.storage){this.storage.removeItem(e);return}this.memoryFallback.delete(e)}clear(){this.storage||this.memoryFallback.clear()}removeKeysMatching(e){if(this.storage){let t=[];for(let r=0;r<this.storage.length;r++){let i=this.storage.key(r);i&&e(i)&&t.push(i)}for(let r of t)this.storage.removeItem(r);return}for(let t of this.memoryFallback.keys())e(t)&&this.memoryFallback.delete(t)}};var a=class{constructor(){this.store=new Map}get(e){return this.store.get(e)??null}set(e,t){this.store.set(e,t)}remove(e){this.store.delete(e)}clear(){this.store.clear()}removeKeysMatching(e){for(let t of this.store.keys())e(t)&&this.store.delete(t)}};function O(s){return"removeKeysMatching"in s&&typeof s.removeKeysMatching=="function"}var b=class{constructor(e,t,r){this.adapter=e,this.namespace=t,this.prefix=r}get(e){let t=this.adapter.get(this.createKey(e));if(t===null)return null;try{return JSON.parse(t)}catch{return null}}set(e,t){this.adapter.set(this.createKey(e),JSON.stringify(t))}remove(e){this.adapter.remove(this.createKey(e))}has(e){return this.adapter.get(this.createKey(e))!==null}clear(){let e=this.getNamespaceKeyPrefix();if(O(this.adapter)){this.adapter.removeKeysMatching(t=>t.startsWith(e));return}this.adapter.clear()}createKey(e){return this.prefix?`${this.prefix}:${this.namespace}:${e}`:`${this.namespace}:${e}`}getNamespaceKeyPrefix(){return this.prefix?`${this.prefix}:${this.namespace}:`:`${this.namespace}:`}};function k(s){let e=s??"memory";if(typeof window>"u")return new a;switch(e){case"memory":return new a;case"localStorage":return new c(window.localStorage);case"sessionStorage":return new c(window.sessionStorage);case"cookie_localStorage":return new c(window.localStorage);case"cookie":return new a;case"indexedDB":return new a;default:return new a}}function C(s){switch(s??"memory"){case"localStorage":case"sessionStorage":case"cookie_localStorage":return"BrowserStorageAdapter";default:return"MemoryStorageAdapter"}}function B(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID().replace(/-/g,""):`${Date.now()}${Math.random().toString(36).slice(2)}`}function I(){return`vst_${B()}`}var $="visitor",x=class{constructor(e,t){this.storage=e,this.storageKey=t.storage.keys?.visitor??$}getVisitorId(){return this.storage.get(this.storageKey)}ensureVisitorId(){let e=this.getVisitorId();if(e)return e;let t=I();return this.storage.set(this.storageKey,t),t}clearVisitorId(){this.storage.remove(this.storageKey)}};var f={enabled:!0,ttlDays:90,persist:!0,captureUrlParams:!0,captureCookies:!0,customClickIdParams:[]},m="attribution";var L=["fbclid","gclid","gbraid","wbraid","ttclid","msclkid","epik","li_fat_id"],l=class{parse(e=[]){if(typeof window>"u"||!window.location?.search)return{};try{let t=new URLSearchParams(window.location.search),r={},i={};for(let o of L){let n=t.get(o);n&&(o==="li_fat_id"?r.liFatId=n:r[o]=n)}for(let o of e){let n=t.get(o);n&&(i[o]=n)}return Object.keys(i).length>0&&(r.customClickIds=i),r}catch{return{}}}synthesizeFbc(e,t){if(t)return t;if(e)return`fb.1.${Date.now()}.${e}`}};var d=class{collectKnown(){if(typeof document>"u")return{};let e=this.parseCookies(),t={},r={_fbp:"fbp",_fbc:"fbc",_ga:"ga",_gid:"gid",_gcl_au:"gclAu",_ttp:"ttp",li_fat_id:"liFatId",epik:"epik"};for(let[i,o]of Object.entries(r)){let n=e[i];n&&(t[o]=n)}return t}parseCookies(){if(typeof document>"u")return{};try{return document.cookie.split(";").reduce((e,t)=>{let[r,...i]=t.trim().split("=");return r&&(e[r]=decodeURIComponent(i.join("=")||"")),e},{})}catch{return{}}}};var p=class{constructor(e={}){this.clickIdParser=new l;this.cookieCollector=new d;this.customParams=e.customParams??[],this.captureUrlParams=e.captureUrlParams!==!1,this.captureCookies=e.captureCookies!==!1}collectFresh(){let e=this.captureUrlParams?this.clickIdParser.parse(this.customParams):{},t=this.captureCookies?this.cookieCollector.collectKnown():{},r={...t,...e},i={...t.customClickIds??{},...e.customClickIds??{}};if(Object.keys(i).length>0&&(r.customClickIds=i),typeof r.fbclid=="string"&&r.fbclid){let o=this.clickIdParser.synthesizeFbc(r.fbclid,typeof r.fbc=="string"?r.fbc:void 0);o&&(r.fbc=o)}if(typeof window<"u")try{r.landingUrl=window.location.href}catch{}if(typeof document<"u")try{document.referrer&&(r.referrer=document.referrer)}catch{}return r}merge(e,t){let r={...e};for(let[o,n]of Object.entries(t))if(!(n==null||n==="")){if(o==="customClickIds"&&typeof n=="object"){r.customClickIds={...e.customClickIds??{},...n};continue}r[o]=n}let i=Date.now();return e.firstCollectedAt||(r.firstCollectedAt=i),r.lastCollectedAt=i,r}};var g=class{constructor(e,t){this.storage=e,this.persist=t.persist,this.ttlMs=t.ttlDays*24*60*60*1e3,this.storageKey=t.storageKey??m}load(){if(!this.persist)return null;try{let e=this.storage.get(this.storageKey);return e?this.isExpired(e)?(this.clear(),null):e:null}catch{return null}}save(e){if(this.persist)try{this.storage.set(this.storageKey,e)}catch{}}clear(){try{this.storage.remove(this.storageKey)}catch{}}isExpired(e){let t=e.lastCollectedAt??e.firstCollectedAt;return t?Date.now()-t>this.ttlMs:!1}};var y=class{constructor(e,t=f){this.snapshot={};this.active=!1;this.enabled=t.enabled!==!1,this.store=new g(e,{persist:t.persist!==!1,ttlDays:t.ttlDays??90}),this.collector=new p({customParams:t.customClickIdParams??[],captureUrlParams:t.captureUrlParams!==!1,captureCookies:t.captureCookies!==!1})}init(){if(this.active||(this.active=!0,!this.enabled))return;let e=this.store.load();e&&(this.snapshot=e),this.collect()}destroy(){this.active&&(this.active=!1)}collect(){if(!this.enabled)return this.snapshot;let e=this.collector.collectFresh();return this.snapshot=this.collector.merge(this.snapshot,e),this.store.save(this.snapshot),this.snapshot}getSnapshot(){return{...this.snapshot}}update(e){return this.snapshot=this.collector.merge(this.snapshot,e),this.store.save(this.snapshot),this.getSnapshot()}clear(){this.snapshot={},this.store.clear()}};0&&(module.exports={ATTRIBUTION_STORAGE_KEY,AttributionCollector,AttributionServiceImpl,AttributionStore,BrowserMetadataServiceImpl,BrowserStorageAdapter,ClickIdParser,CookieCollector,DEFAULT_ATTRIBUTION_CONFIG,DispatcherServiceImpl,FingerprintServiceImpl,MemoryStorageAdapter,SessionServiceImpl,StorageServiceImpl,VisitorServiceImpl,createStorageAdapter,generateSessionId,generateVisitorId,resolveStorageAdapterName});
3
+ //# sourceMappingURL=index.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/services/index.ts","../../src/services/dispatcher/DispatcherService.ts","../../src/services/browser-metadata/BrowserMetadataService.ts","../../src/services/fingerprint/FingerprintService.ts","../../src/services/session/session-id.ts","../../src/services/session/SessionService.ts","../../src/services/storage/BrowserStorageAdapter.ts","../../src/services/storage/MemoryStorageAdapter.ts","../../src/services/storage/StorageService.ts","../../src/services/storage/StorageFactory.ts","../../src/services/visitor/visitor-id.ts","../../src/services/visitor/VisitorService.ts","../../src/services/attribution/types.ts","../../src/services/attribution/ClickIdParser.ts","../../src/services/attribution/CookieCollector.ts","../../src/services/attribution/AttributionCollector.ts","../../src/services/attribution/AttributionStore.ts","../../src/services/attribution/AttributionService.ts"],"sourcesContent":["export type { PixelRuntimeServices } from './types';\n\nexport type { BasePixelEvent, PageViewEvent, PixelEvent } from '@/events';\nexport type {\n SessionRenewedEvent,\n SessionExpiredEvent,\n} from '@/events/session';\nexport type { DispatcherService } from './dispatcher/types';\nexport { DispatcherServiceImpl } from './dispatcher/DispatcherService';\n\nexport type { BrowserMetadata, BrowserMetadataService } from './browser-metadata';\nexport { BrowserMetadataServiceImpl } from './browser-metadata/BrowserMetadataService';\n\nexport type { FingerprintService } from './fingerprint/types';\nexport { FingerprintServiceImpl } from './fingerprint/FingerprintService';\n\nexport type { SessionService } from './session/types';\nexport { SessionServiceImpl } from './session/SessionService';\n\nexport type { StorageAdapter, StorageService } from './storage/types';\nexport { BrowserStorageAdapter } from './storage/BrowserStorageAdapter';\nexport { MemoryStorageAdapter } from './storage/MemoryStorageAdapter';\nexport { StorageServiceImpl } from './storage/StorageService';\nexport {\n createStorageAdapter,\n resolveStorageAdapterName,\n type StoragePersistence,\n} from './storage/StorageFactory';\n\nexport type { VisitorService } from './visitor/types';\nexport { VisitorServiceImpl } from './visitor/VisitorService';\nexport { generateVisitorId } from './visitor/visitor-id';\nexport { generateSessionId } from './session/session-id';\n\nexport type {\n AttributionConfig,\n AttributionIdentifiers,\n AttributionService,\n} from './attribution';\nexport {\n ATTRIBUTION_STORAGE_KEY,\n DEFAULT_ATTRIBUTION_CONFIG,\n AttributionServiceImpl,\n AttributionCollector,\n AttributionStore,\n ClickIdParser,\n CookieCollector,\n} from './attribution';\n","import type { PixelEvent } from '@/events';\n\nimport type { DispatcherService } from './types';\n\ntype EventListener = (event: PixelEvent) => void;\n\nexport class DispatcherServiceImpl implements DispatcherService {\n private readonly listeners = new Set<EventListener>();\n\n private lastEvent: PixelEvent | null = null;\n\n dispatch(event: PixelEvent): void {\n this.lastEvent = event;\n\n for (const listener of this.listeners) {\n listener(event);\n }\n }\n\n subscribe(listener: (event: PixelEvent) => void): () => void {\n this.listeners.add(listener);\n\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n clear(): void {\n this.listeners.clear();\n this.lastEvent = null;\n }\n\n getListenerCount(): number {\n return this.listeners.size;\n }\n\n getLastEvent(): PixelEvent | null {\n return this.lastEvent;\n }\n}\n","import type { BrowserMetadata, BrowserMetadataService } from './types';\n\nexport class BrowserMetadataServiceImpl implements BrowserMetadataService {\n getMetadata(): BrowserMetadata {\n if (typeof window === 'undefined') {\n return {};\n }\n\n const timezone = (() => {\n try {\n return Intl.DateTimeFormat().resolvedOptions().timeZone;\n } catch {\n return undefined;\n }\n })();\n\n return {\n url: location.href,\n path: location.pathname,\n hostname: location.hostname,\n origin: location.origin,\n title: typeof document !== 'undefined' ? document.title : undefined,\n referrer: typeof document !== 'undefined' ? document.referrer : undefined,\n language: navigator.language,\n timezone,\n userAgent: navigator.userAgent,\n platform: navigator.platform,\n screenWidth: screen.width,\n screenHeight: screen.height,\n colorDepth: screen.colorDepth,\n };\n }\n}\n","import type { PixelConfig } from '@/config';\nimport type { BrowserMetadataService } from '@/services/browser-metadata';\nimport type { StorageService } from '@/services/storage';\n\nimport type { FingerprintService } from './types';\n\nconst DEFAULT_FINGERPRINT_KEY = 'fingerprint';\n\nfunction hashFingerprintInput(input: string): string {\n let hash = 0;\n\n for (let index = 0; index < input.length; index++) {\n hash = (hash << 5) - hash + input.charCodeAt(index);\n hash |= 0;\n }\n\n const positiveHash = Math.abs(hash).toString(16).padStart(8, '0');\n let secondaryHash = 0;\n\n for (let index = input.length - 1; index >= 0; index--) {\n secondaryHash = (secondaryHash << 5) - secondaryHash + input.charCodeAt(index);\n secondaryHash |= 0;\n }\n\n return `fp_${positiveHash}${Math.abs(secondaryHash).toString(16).padStart(8, '0')}`;\n}\n\nfunction computeLightFingerprint(\n metadataService: BrowserMetadataService\n): string {\n const metadata = metadataService.getMetadata();\n\n const components = [\n metadata.userAgent ?? '',\n metadata.language ?? '',\n metadata.platform ?? '',\n String(metadata.screenWidth ?? ''),\n String(metadata.screenHeight ?? ''),\n String(metadata.colorDepth ?? ''),\n metadata.timezone ?? '',\n ];\n\n return hashFingerprintInput(components.join('|'));\n}\n\nexport class FingerprintServiceImpl implements FingerprintService {\n private readonly storage: StorageService;\n\n private readonly storageKey: string;\n\n private readonly metadataService: BrowserMetadataService;\n\n constructor(\n storage: StorageService,\n config: PixelConfig,\n metadataService: BrowserMetadataService\n ) {\n this.storage = storage;\n this.storageKey =\n config.storage.keys?.fingerprint ?? DEFAULT_FINGERPRINT_KEY;\n this.metadataService = metadataService;\n }\n\n getFingerprint(): string | null {\n return this.storage.get<string>(this.storageKey);\n }\n\n ensureFingerprint(): string {\n const existing = this.getFingerprint();\n if (existing) return existing;\n\n const fingerprint = computeLightFingerprint(this.metadataService);\n this.storage.set(this.storageKey, fingerprint);\n return fingerprint;\n }\n}\n","function createRandomSuffix(): string {\n if (\n typeof crypto !== 'undefined' &&\n typeof crypto.randomUUID === 'function'\n ) {\n return crypto.randomUUID().replace(/-/g, '');\n }\n\n return `${Date.now()}${Math.random().toString(36).slice(2)}`;\n}\n\nexport function generateSessionId(): string {\n return `ses_${createRandomSuffix()}`;\n}\n","import type { PixelConfig } from '@/config';\nimport type { StorageService } from '@/services/storage';\n\nimport type { EnsureSessionResult, SessionData, SessionService } from './types';\nimport { generateSessionId } from './session-id';\n\nconst DEFAULT_SESSION_KEY = 'session';\n\nexport class SessionServiceImpl implements SessionService {\n private readonly storage: StorageService;\n\n private readonly storageKey: string;\n\n constructor(storage: StorageService, config: PixelConfig) {\n this.storage = storage;\n this.storageKey = config.storage.keys?.session ?? DEFAULT_SESSION_KEY;\n }\n\n getSessionId(): string | null {\n return this.getSessionData()?.sessionId ?? null;\n }\n\n getSessionData(): SessionData | null {\n const raw = this.storage.get<SessionData | string>(this.storageKey);\n if (!raw) return null;\n\n if (typeof raw === 'string') {\n const now = Date.now();\n return {\n sessionId: raw,\n lastActivityAt: now,\n createdAt: now,\n };\n }\n\n return raw;\n }\n\n getLastActivityAt(): number | null {\n return this.getSessionData()?.lastActivityAt ?? null;\n }\n\n isExpired(ttlMs: number): boolean {\n const data = this.getSessionData();\n if (!data) return true;\n\n return Date.now() - data.lastActivityAt > ttlMs;\n }\n\n ensureSession(ttlMs: number): EnsureSessionResult {\n const data = this.getSessionData();\n const now = Date.now();\n\n if (!data) {\n const sessionId = generateSessionId();\n this.writeSessionData({\n sessionId,\n lastActivityAt: now,\n createdAt: now,\n });\n\n return {\n sessionId,\n expired: false,\n created: true,\n };\n }\n\n if (now - data.lastActivityAt > ttlMs) {\n const previousSessionId = data.sessionId;\n const sessionId = generateSessionId();\n\n this.writeSessionData({\n sessionId,\n lastActivityAt: now,\n createdAt: now,\n });\n\n return {\n sessionId,\n expired: true,\n previousSessionId,\n created: false,\n };\n }\n\n return {\n sessionId: data.sessionId,\n expired: false,\n created: false,\n };\n }\n\n ensureSessionId(): string {\n return this.ensureSession(Number.MAX_SAFE_INTEGER).sessionId;\n }\n\n touchActivity(): void {\n const data = this.getSessionData();\n if (!data) return;\n\n this.writeSessionData({\n ...data,\n lastActivityAt: Date.now(),\n });\n }\n\n renew(): string {\n const now = Date.now();\n const sessionId = generateSessionId();\n\n this.writeSessionData({\n sessionId,\n lastActivityAt: now,\n createdAt: now,\n });\n\n return sessionId;\n }\n\n clear(): void {\n this.storage.remove(this.storageKey);\n }\n\n private writeSessionData(data: SessionData): void {\n this.storage.set(this.storageKey, data);\n }\n}\n","import type { StorageAdapter } from './types';\n\nexport class BrowserStorageAdapter implements StorageAdapter {\n private readonly storage: Storage | null;\n\n private readonly memoryFallback = new Map<string, string>();\n\n constructor(storage: Storage) {\n this.storage = typeof window === 'undefined' ? null : storage;\n }\n\n get(key: string): string | null {\n if (this.storage) {\n return this.storage.getItem(key);\n }\n\n return this.memoryFallback.get(key) ?? null;\n }\n\n set(key: string, value: string): void {\n if (this.storage) {\n this.storage.setItem(key, value);\n return;\n }\n\n this.memoryFallback.set(key, value);\n }\n\n remove(key: string): void {\n if (this.storage) {\n this.storage.removeItem(key);\n return;\n }\n\n this.memoryFallback.delete(key);\n }\n\n clear(): void {\n // Never clear entire browser storage — namespace removal uses removeKeysMatching.\n if (!this.storage) {\n this.memoryFallback.clear();\n }\n }\n\n removeKeysMatching(predicate: (key: string) => boolean): void {\n if (this.storage) {\n const keysToRemove: string[] = [];\n\n for (let index = 0; index < this.storage.length; index++) {\n const key = this.storage.key(index);\n if (key && predicate(key)) {\n keysToRemove.push(key);\n }\n }\n\n for (const key of keysToRemove) {\n this.storage.removeItem(key);\n }\n\n return;\n }\n\n for (const key of this.memoryFallback.keys()) {\n if (predicate(key)) {\n this.memoryFallback.delete(key);\n }\n }\n }\n}\n","import type { StorageAdapter } from './types';\n\nexport class MemoryStorageAdapter implements StorageAdapter {\n private readonly store = new Map<string, string>();\n\n get(key: string): string | null {\n return this.store.get(key) ?? null;\n }\n\n set(key: string, value: string): void {\n this.store.set(key, value);\n }\n\n remove(key: string): void {\n this.store.delete(key);\n }\n\n clear(): void {\n this.store.clear();\n }\n\n removeKeysMatching(predicate: (key: string) => boolean): void {\n for (const key of this.store.keys()) {\n if (predicate(key)) {\n this.store.delete(key);\n }\n }\n }\n}\n","import type { StorageAdapter, StorageService } from './types';\n\ntype NamespaceClearableAdapter = StorageAdapter & {\n removeKeysMatching(predicate: (key: string) => boolean): void;\n};\n\nfunction supportsNamespaceClear(\n adapter: StorageAdapter\n): adapter is NamespaceClearableAdapter {\n return (\n 'removeKeysMatching' in adapter &&\n typeof adapter.removeKeysMatching === 'function'\n );\n}\n\nexport class StorageServiceImpl implements StorageService {\n private readonly adapter: StorageAdapter;\n\n private readonly namespace: string;\n\n private readonly prefix?: string;\n\n constructor(adapter: StorageAdapter, namespace: string, prefix?: string) {\n this.adapter = adapter;\n this.namespace = namespace;\n this.prefix = prefix;\n }\n\n get<T>(key: string): T | null {\n const raw = this.adapter.get(this.createKey(key));\n if (raw === null) return null;\n\n try {\n return JSON.parse(raw) as T;\n } catch {\n return null;\n }\n }\n\n set<T>(key: string, value: T): void {\n this.adapter.set(this.createKey(key), JSON.stringify(value));\n }\n\n remove(key: string): void {\n this.adapter.remove(this.createKey(key));\n }\n\n has(key: string): boolean {\n return this.adapter.get(this.createKey(key)) !== null;\n }\n\n clear(): void {\n const namespaceKeyPrefix = this.getNamespaceKeyPrefix();\n\n if (supportsNamespaceClear(this.adapter)) {\n this.adapter.removeKeysMatching(key =>\n key.startsWith(namespaceKeyPrefix)\n );\n return;\n }\n\n this.adapter.clear();\n }\n\n createKey(key: string): string {\n if (this.prefix) {\n return `${this.prefix}:${this.namespace}:${key}`;\n }\n\n return `${this.namespace}:${key}`;\n }\n\n private getNamespaceKeyPrefix(): string {\n if (this.prefix) {\n return `${this.prefix}:${this.namespace}:`;\n }\n\n return `${this.namespace}:`;\n }\n}\n","import type {\n AttributionStoragePersistence,\n QueueStoragePersistence,\n SessionStoragePersistence,\n VisitorStoragePersistence,\n} from '@/config/shared/persistence';\n\nimport { BrowserStorageAdapter } from './BrowserStorageAdapter';\nimport { MemoryStorageAdapter } from './MemoryStorageAdapter';\nimport type { StorageAdapter } from './types';\n\nexport type StoragePersistence =\n | VisitorStoragePersistence\n | SessionStoragePersistence\n | AttributionStoragePersistence\n | QueueStoragePersistence;\n\nexport function createStorageAdapter(\n persistence?: StoragePersistence\n): StorageAdapter {\n const mode = persistence ?? 'memory';\n\n if (typeof window === 'undefined') {\n return new MemoryStorageAdapter();\n }\n\n switch (mode) {\n case 'memory':\n return new MemoryStorageAdapter();\n case 'localStorage':\n return new BrowserStorageAdapter(window.localStorage);\n case 'sessionStorage':\n return new BrowserStorageAdapter(window.sessionStorage);\n case 'cookie_localStorage':\n // TODO: implementar cookie fallback.\n return new BrowserStorageAdapter(window.localStorage);\n case 'cookie':\n return new MemoryStorageAdapter();\n case 'indexedDB':\n return new MemoryStorageAdapter();\n default:\n return new MemoryStorageAdapter();\n }\n}\n\nexport function resolveStorageAdapterName(\n persistence?: StoragePersistence\n): string {\n const mode = persistence ?? 'memory';\n\n switch (mode) {\n case 'localStorage':\n case 'sessionStorage':\n case 'cookie_localStorage':\n return 'BrowserStorageAdapter';\n default:\n return 'MemoryStorageAdapter';\n }\n}\n","function createRandomSuffix(): string {\n if (\n typeof crypto !== 'undefined' &&\n typeof crypto.randomUUID === 'function'\n ) {\n return crypto.randomUUID().replace(/-/g, '');\n }\n\n return `${Date.now()}${Math.random().toString(36).slice(2)}`;\n}\n\nexport function generateVisitorId(): string {\n return `vst_${createRandomSuffix()}`;\n}\n","import type { PixelConfig } from '@/config';\nimport type { StorageService } from '@/services/storage';\n\nimport type { VisitorService } from './types';\nimport { generateVisitorId } from './visitor-id';\n\nconst DEFAULT_VISITOR_KEY = 'visitor';\n\nexport class VisitorServiceImpl implements VisitorService {\n private readonly storage: StorageService;\n\n private readonly storageKey: string;\n\n constructor(storage: StorageService, config: PixelConfig) {\n this.storage = storage;\n this.storageKey = config.storage.keys?.visitor ?? DEFAULT_VISITOR_KEY;\n }\n\n getVisitorId(): string | null {\n return this.storage.get<string>(this.storageKey);\n }\n\n ensureVisitorId(): string {\n const existing = this.getVisitorId();\n if (existing) return existing;\n\n const visitorId = generateVisitorId();\n this.storage.set(this.storageKey, visitorId);\n return visitorId;\n }\n\n clearVisitorId(): void {\n this.storage.remove(this.storageKey);\n }\n}\n","export type AttributionIdentifiers = {\n readonly fbclid?: string;\n readonly fbp?: string;\n readonly fbc?: string;\n\n readonly gclid?: string;\n readonly gbraid?: string;\n readonly wbraid?: string;\n readonly ga?: string;\n readonly gid?: string;\n readonly gclAu?: string;\n\n readonly ttclid?: string;\n readonly ttp?: string;\n\n readonly msclkid?: string;\n readonly liFatId?: string;\n readonly epik?: string;\n\n readonly customClickIds?: Readonly<Record<string, string>>;\n\n readonly firstCollectedAt?: number;\n readonly lastCollectedAt?: number;\n readonly landingUrl?: string;\n readonly referrer?: string;\n};\n\nexport type AttributionConfig = {\n readonly enabled: boolean;\n readonly ttlDays?: number;\n readonly persist?: boolean;\n readonly captureUrlParams?: boolean;\n readonly captureCookies?: boolean;\n readonly customClickIdParams?: string[];\n};\n\nexport const DEFAULT_ATTRIBUTION_CONFIG: AttributionConfig = {\n enabled: true,\n ttlDays: 90,\n persist: true,\n captureUrlParams: true,\n captureCookies: true,\n customClickIdParams: [],\n};\n\nexport const ATTRIBUTION_STORAGE_KEY = 'attribution';\n\nexport interface AttributionService {\n init(): void;\n destroy(): void;\n collect(): AttributionIdentifiers;\n getSnapshot(): AttributionIdentifiers;\n update(partial: Partial<AttributionIdentifiers>): AttributionIdentifiers;\n clear(): void;\n}\n","import type { AttributionIdentifiers } from './types';\n\nconst BUILTIN_CLICK_PARAMS = [\n 'fbclid',\n 'gclid',\n 'gbraid',\n 'wbraid',\n 'ttclid',\n 'msclkid',\n 'epik',\n 'li_fat_id',\n] as const;\n\n/**\n * Parses click IDs from URL search params and maps to AttributionIdentifiers fields.\n */\nexport class ClickIdParser {\n parse(\n customParams: readonly string[] = []\n ): Partial<AttributionIdentifiers> {\n if (typeof window === 'undefined' || !window.location?.search) {\n return {};\n }\n\n try {\n const params = new URLSearchParams(window.location.search);\n const result: Record<string, unknown> = {};\n const customClickIds: Record<string, string> = {};\n\n for (const key of BUILTIN_CLICK_PARAMS) {\n const value = params.get(key);\n if (!value) continue;\n\n if (key === 'li_fat_id') {\n result.liFatId = value;\n } else {\n result[key] = value;\n }\n }\n\n for (const key of customParams) {\n const value = params.get(key);\n if (value) customClickIds[key] = value;\n }\n\n if (Object.keys(customClickIds).length > 0) {\n result.customClickIds = customClickIds;\n }\n\n return result as Partial<AttributionIdentifiers>;\n } catch {\n return {};\n }\n }\n\n /**\n * Meta convention: when fbclid is present and _fbc cookie is missing,\n * synthesize fbc = fb.1.<timestamp_ms>.<fbclid>\n */\n synthesizeFbc(fbclid: string, existingFbc?: string): string | undefined {\n if (existingFbc) return existingFbc;\n if (!fbclid) return undefined;\n return `fb.1.${Date.now()}.${fbclid}`;\n }\n}\n","/**\n * SSR-safe cookie reader for attribution identifiers.\n */\nexport class CookieCollector {\n collectKnown(): Readonly<Record<string, string>> {\n if (typeof document === 'undefined') return {};\n\n const cookies = this.parseCookies();\n const result: Record<string, string> = {};\n\n const map: Record<string, string> = {\n _fbp: 'fbp',\n _fbc: 'fbc',\n _ga: 'ga',\n _gid: 'gid',\n _gcl_au: 'gclAu',\n _ttp: 'ttp',\n li_fat_id: 'liFatId',\n epik: 'epik',\n };\n\n for (const [cookieName, field] of Object.entries(map)) {\n const value = cookies[cookieName];\n if (value) result[field] = value;\n }\n\n return result;\n }\n\n private parseCookies(): Record<string, string> {\n if (typeof document === 'undefined') return {};\n\n try {\n return document.cookie.split(';').reduce(\n (acc, part) => {\n const [rawKey, ...rest] = part.trim().split('=');\n if (!rawKey) return acc;\n acc[rawKey] = decodeURIComponent(rest.join('=') || '');\n return acc;\n },\n {} as Record<string, string>\n );\n } catch {\n return {};\n }\n }\n}\n","import type { AttributionIdentifiers } from './types';\nimport { ClickIdParser } from './ClickIdParser';\nimport { CookieCollector } from './CookieCollector';\n\n/**\n * Collects attribution signals from URL + cookies and merges them.\n */\nexport class AttributionCollector {\n private readonly clickIdParser = new ClickIdParser();\n\n private readonly cookieCollector = new CookieCollector();\n\n private readonly customParams: readonly string[];\n\n private readonly captureUrlParams: boolean;\n\n private readonly captureCookies: boolean;\n\n constructor(\n options: {\n customParams?: readonly string[];\n captureUrlParams?: boolean;\n captureCookies?: boolean;\n } = {}\n ) {\n this.customParams = options.customParams ?? [];\n this.captureUrlParams = options.captureUrlParams !== false;\n this.captureCookies = options.captureCookies !== false;\n }\n\n collectFresh(): Partial<AttributionIdentifiers> {\n const fromUrl = this.captureUrlParams\n ? this.clickIdParser.parse(this.customParams)\n : {};\n const fromCookies = this.captureCookies\n ? this.cookieCollector.collectKnown()\n : {};\n\n const merged: Record<string, unknown> = {\n ...fromCookies,\n ...fromUrl,\n };\n\n const customClickIds = {\n ...((fromCookies as AttributionIdentifiers).customClickIds ?? {}),\n ...(fromUrl.customClickIds ?? {}),\n };\n if (Object.keys(customClickIds).length > 0) {\n merged.customClickIds = customClickIds;\n }\n\n if (typeof merged.fbclid === 'string' && merged.fbclid) {\n const fbc = this.clickIdParser.synthesizeFbc(\n merged.fbclid,\n typeof merged.fbc === 'string' ? merged.fbc : undefined\n );\n if (fbc) merged.fbc = fbc;\n }\n\n if (typeof window !== 'undefined') {\n try {\n merged.landingUrl = window.location.href;\n } catch {\n // ignore\n }\n }\n\n if (typeof document !== 'undefined') {\n try {\n if (document.referrer) merged.referrer = document.referrer;\n } catch {\n // ignore\n }\n }\n\n return merged as Partial<AttributionIdentifiers>;\n }\n\n /**\n * Merge: never overwrite existing defined values with undefined.\n */\n merge(\n existing: AttributionIdentifiers,\n incoming: Partial<AttributionIdentifiers>\n ): AttributionIdentifiers {\n const next: Record<string, unknown> = { ...existing };\n\n for (const [key, value] of Object.entries(incoming)) {\n if (value === undefined || value === null || value === '') continue;\n\n if (key === 'customClickIds' && typeof value === 'object') {\n next.customClickIds = {\n ...((existing.customClickIds as Record<string, string>) ?? {}),\n ...(value as Record<string, string>),\n };\n continue;\n }\n\n next[key] = value;\n }\n\n const now = Date.now();\n if (!existing.firstCollectedAt) {\n next.firstCollectedAt = now;\n }\n next.lastCollectedAt = now;\n\n return next as AttributionIdentifiers;\n }\n}\n","import type { StorageService } from '@/services/storage/types';\n\nimport { ATTRIBUTION_STORAGE_KEY, type AttributionIdentifiers } from './types';\n\n/**\n * Persists AttributionIdentifiers via StorageService only (no direct localStorage).\n */\nexport class AttributionStore {\n private readonly storage: StorageService;\n\n private readonly persist: boolean;\n\n private readonly ttlMs: number;\n\n private readonly storageKey: string;\n\n constructor(\n storage: StorageService,\n options: { persist: boolean; ttlDays: number; storageKey?: string }\n ) {\n this.storage = storage;\n this.persist = options.persist;\n this.ttlMs = options.ttlDays * 24 * 60 * 60 * 1000;\n this.storageKey = options.storageKey ?? ATTRIBUTION_STORAGE_KEY;\n }\n\n load(): AttributionIdentifiers | null {\n if (!this.persist) return null;\n\n try {\n const snapshot = this.storage.get<AttributionIdentifiers>(this.storageKey);\n if (!snapshot) return null;\n\n if (this.isExpired(snapshot)) {\n this.clear();\n return null;\n }\n\n return snapshot;\n } catch {\n return null;\n }\n }\n\n save(snapshot: AttributionIdentifiers): void {\n if (!this.persist) return;\n\n try {\n this.storage.set(this.storageKey, snapshot);\n } catch {\n // quota / SSR — keep in-memory only\n }\n }\n\n clear(): void {\n try {\n this.storage.remove(this.storageKey);\n } catch {\n // ignore\n }\n }\n\n private isExpired(snapshot: AttributionIdentifiers): boolean {\n const anchor = snapshot.lastCollectedAt ?? snapshot.firstCollectedAt;\n if (!anchor) return false;\n return Date.now() - anchor > this.ttlMs;\n }\n}\n","import type { StorageService } from '@/services/storage/types';\n\nimport { AttributionCollector } from './AttributionCollector';\nimport { AttributionStore } from './AttributionStore';\nimport {\n DEFAULT_ATTRIBUTION_CONFIG,\n type AttributionConfig,\n type AttributionIdentifiers,\n type AttributionService,\n} from './types';\n\nexport class AttributionServiceImpl implements AttributionService {\n private readonly store: AttributionStore;\n\n private readonly collector: AttributionCollector;\n\n private readonly enabled: boolean;\n\n private snapshot: AttributionIdentifiers = {};\n\n private active = false;\n\n constructor(storage: StorageService, config: AttributionConfig = DEFAULT_ATTRIBUTION_CONFIG) {\n this.enabled = config.enabled !== false;\n this.store = new AttributionStore(storage, {\n persist: config.persist !== false,\n ttlDays: config.ttlDays ?? 90,\n });\n this.collector = new AttributionCollector({\n customParams: config.customClickIdParams ?? [],\n captureUrlParams: config.captureUrlParams !== false,\n captureCookies: config.captureCookies !== false,\n });\n }\n\n init(): void {\n if (this.active) return;\n this.active = true;\n\n if (!this.enabled) return;\n\n const stored = this.store.load();\n if (stored) {\n this.snapshot = stored;\n }\n\n this.collect();\n }\n\n destroy(): void {\n if (!this.active) return;\n this.active = false;\n }\n\n collect(): AttributionIdentifiers {\n if (!this.enabled) return this.snapshot;\n\n const fresh = this.collector.collectFresh();\n this.snapshot = this.collector.merge(this.snapshot, fresh);\n this.store.save(this.snapshot);\n return this.snapshot;\n }\n\n getSnapshot(): AttributionIdentifiers {\n return { ...this.snapshot };\n }\n\n update(partial: Partial<AttributionIdentifiers>): AttributionIdentifiers {\n this.snapshot = this.collector.merge(this.snapshot, partial);\n this.store.save(this.snapshot);\n return this.getSnapshot();\n }\n\n clear(): void {\n this.snapshot = {};\n this.store.clear();\n }\n}\n"],"mappings":"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","names":["services_exports","__export","ATTRIBUTION_STORAGE_KEY","AttributionCollector","AttributionServiceImpl","AttributionStore","BrowserMetadataServiceImpl","BrowserStorageAdapter","ClickIdParser","CookieCollector","DEFAULT_ATTRIBUTION_CONFIG","DispatcherServiceImpl","FingerprintServiceImpl","MemoryStorageAdapter","SessionServiceImpl","StorageServiceImpl","VisitorServiceImpl","createStorageAdapter","generateSessionId","generateVisitorId","resolveStorageAdapterName","__toCommonJS","DispatcherServiceImpl","event","listener","BrowserMetadataServiceImpl","timezone","DEFAULT_FINGERPRINT_KEY","hashFingerprintInput","input","hash","index","positiveHash","secondaryHash","computeLightFingerprint","metadataService","metadata","components","FingerprintServiceImpl","storage","config","existing","fingerprint","createRandomSuffix","generateSessionId","DEFAULT_SESSION_KEY","SessionServiceImpl","storage","config","raw","now","ttlMs","data","sessionId","generateSessionId","previousSessionId","BrowserStorageAdapter","storage","key","value","predicate","keysToRemove","index","MemoryStorageAdapter","key","value","predicate","supportsNamespaceClear","adapter","StorageServiceImpl","namespace","prefix","key","raw","value","namespaceKeyPrefix","createStorageAdapter","persistence","mode","MemoryStorageAdapter","BrowserStorageAdapter","resolveStorageAdapterName","createRandomSuffix","generateVisitorId","DEFAULT_VISITOR_KEY","VisitorServiceImpl","storage","config","existing","visitorId","generateVisitorId","DEFAULT_ATTRIBUTION_CONFIG","ATTRIBUTION_STORAGE_KEY","BUILTIN_CLICK_PARAMS","ClickIdParser","customParams","params","result","customClickIds","key","value","fbclid","existingFbc","CookieCollector","cookies","result","map","cookieName","field","value","acc","part","rawKey","rest","AttributionCollector","options","ClickIdParser","CookieCollector","fromUrl","fromCookies","merged","customClickIds","fbc","existing","incoming","next","key","value","now","AttributionStore","storage","options","ATTRIBUTION_STORAGE_KEY","snapshot","anchor","AttributionServiceImpl","storage","config","DEFAULT_ATTRIBUTION_CONFIG","AttributionStore","AttributionCollector","stored","fresh","partial"]}