@hientran0208/ads-sdk 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +53 -0
- package/dist/ads-client-BVlLFVQU.d.cts +352 -0
- package/dist/ads-client-BVlLFVQU.d.ts +352 -0
- package/dist/ads-sa.global.js +3 -0
- package/dist/ads-sa.global.js.map +1 -0
- package/dist/chunk-GA4VEFSM.js +900 -0
- package/dist/chunk-GA4VEFSM.js.map +1 -0
- package/dist/index.cjs +1012 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +256 -0
- package/dist/index.d.ts +256 -0
- package/dist/index.js +88 -0
- package/dist/index.js.map +1 -0
- package/dist/react.cjs +960 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.cts +50 -0
- package/dist/react.d.ts +50 -0
- package/dist/react.js +63 -0
- package/dist/react.js.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../ads-manifest/src/types.ts","../../ads-manifest/src/errors.ts","../../ads-manifest/src/normalize.ts","../../ads-manifest/src/plan.ts","../../ads-manifest/src/domain-match.ts","../src/core/boot-spine.ts","../src/core/consent-gate-contract.ts","../src/core/dynamic-params.ts","../src/core/event-bus.ts","../src/core/format-dispatch.ts","../src/core/gate-chain.ts","../src/core/registries/adapter-slot-registry.ts","../src/core/registries/provider-registry.ts","../src/core/slot-lifecycle.ts","../src/inject/tag-injector.ts","../src/inject/lazy-observer.ts","../src/core/ads-engine.ts","../src/adapters/provider/gpt/define-slot.ts","../src/adapters/provider/gpt/oop-formats.ts","../src/adapters/provider/gpt/config-api.ts","../src/adapters/provider/gpt/ppid.ts","../src/adapters/provider/gpt/index.ts","../src/adapters/tag-path/ga4.ts","../src/adapters/tag-path/meta-pixel.ts","../src/consent/consent-mode.ts","../src/consent/tcf-bridge.ts","../src/consent/tcf-purpose-signal-map.ts","../src/consent/vendor-map.ts","../src/consent/consent-gate.ts","../src/wrappers/wire-engine.ts","../src/wrappers/ads-client.ts","../src/wrappers/iife-boot.ts","../src/iife.ts"],"names":["OOP_FORMATS","DEFAULT_NETWORK_CODE","CONSERVATIVE_CONSENT_DEFAULTS","deriveAdUnitPath","gam","publisherId","slotId","networkCode","siteDomain","normalizeConsent","consent","normalizePlaceholder","ph","isOop","adUnitPath","normalize","manifest","normGam","GPT_HOSTS","TAG_HOSTS","deriveUid","id","input","hash","i","oopViewportUnmet","viewport","minW","minH","mergeDynamic","ctxDynamic","merged","toPlanSlot","ctx","dynamic","slot","computeAllowedTagHosts","tags","hosts","tag","h","plan","normalized","ALWAYS_ALLOWED_SUFFIXES","ALWAYS_ALLOWED_HOSTS","normalizeHost","host","isAlwaysAllowed","hostname","suffix","isDomainAllowed","allowDomains","raw","entry","apex","BOOT_SPINE","createAllowAllConsentGate","signals","snap","createDynamicParamsStore","store","p","createEventBus","onHandlerError","handlers","type","handler","set","ev","err","dispatchTraits","format","runGateChain","deps","bus","createAdapterSlotRegistry","byType","vendor","createProviderRegistry","providers","provider","LEGAL","createSlotLifecycle","records","epoch","rec","uid","to","handle","hostOf","src","createTagInjector","doc","injected","key","allowedHosts","opts","el","k","v","createLazyObserver","win","observers","Ctor","rootMargin","onEnter","io","entries","obs","GUARD_KEY","createAdsEngine","providerRegistry","adapterRegistry","consentGate","injector","lazyObserver","dynamicStore","lifecycle","booted","current","consentUnsub","planContext","overridePageView","base","defineSlots","rp","eagerHandles","r","requestHandles","handles","changeCorrelator","armLazy","arm","armTagVendors","bootResolved","autoShow","step","onConsentChange","claimPageGuard","ids","newPageView","targets","baseSizes","m","toGptSize","size","buildSizeMapping","gt","mapping","builder","defineDisplaySlot","gptSlot","oopFormatValue","formats","defineOopSlot","fmt","applyPageConfig","cfg","applySlotConfig","planSlot","targeting","applyPpid","ppid","GPT_SRC","GPT_HOST","V1_FORMATS","createGptProvider","lifecycleCbs","gptLoaded","gtCmd","fn","loadGpt","pagePpid","pageDynamic","pubads","e","findUidByElementId","cb","gptSlots","s","elementId","GTAG_HOST","createGa4Vendor","initialized","ensureGtag","gtag","args","FB_SRC","createMetaPixelVendor","ensureFbq","fbq","track","event","payload","createConsentMode","defaultsApplied","READY_STATUSES","createTcfBridge","api","setTimeoutFn","fired","timer","tcData","success","state","granted","g","n","purposesToSignals","consents","vendorAllowed","snapshotFor","resolved","createConsentGate","config","consentMode","tcfBridge","defaults","listeners","started","applySignals","l","buildEngine","assembleEngine","assembleEngineForPlacement","resolveContext","partial","w","fetchPlacement","endpoint","res","createAdsClient","wire","engine","parseDataIntent","get","name","pageUrl","privacy","cc","installAdsSdk","existing","preStubbed","queued","scriptEl","intent","context","client"],"mappings":"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","file":"ads-sa.global.js","sourcesContent":["/**\n * @hientran0208/ads-manifest — the single source of truth for the manifest contract.\n *\n * Mirrors the sdk-sample `MANIFEST.md` proven schema, with this plan's deliberate\n * additions (per-site Meta Pixel, real Consent Mode v2 config, dynamic-params seam,\n * server-driven `allowedTagHosts`). EVERY consumer — Worker, console, browser SDK —\n * imports these types; none redefine them.\n */\n\n// ---------------------------------------------------------------------------\n// Slot formats (two-path model — render path)\n// ---------------------------------------------------------------------------\n\n/**\n * Render-path slot formats. `display`/`native` carry sizes + a div; the OOP family\n * (`anchor`/`interstitial`/`side-rail`/`oop`) skip the div and ignore `sizes`.\n * `native` renders as GPT fluid.\n */\nexport type SlotFormat =\n | \"display\"\n | \"native\"\n | \"anchor\"\n | \"interstitial\"\n | \"side-rail\"\n | \"oop\";\n\n/** Formats whose entries are out-of-page: no div lookup, no size mapping. */\nexport const OOP_FORMATS: readonly SlotFormat[] = [\n \"anchor\",\n \"interstitial\",\n \"side-rail\",\n \"oop\",\n];\n\nexport type LoadingStrategy = \"eager\" | \"lazy\";\nexport type AnchorPosition = \"top\" | \"bottom\";\nexport type SideRailSide = \"left\" | \"right\";\n\n/** A single viewport→sizes breakpoint. `size` is `[w,h]` or the string `\"fluid\"`. */\nexport type AdSize = [number, number] | \"fluid\";\n\nexport interface SizeMappingEntry {\n /** `[w, h]` viewport floor; `[0,0]` is the base breakpoint. */\n viewport: [number, number];\n sizes: AdSize[];\n}\n\nexport interface RefreshConfig {\n enabled: boolean;\n}\n\n/**\n * A render-path ad slot. Static config is frozen at first display; the\n * {@link DynamicParams} (targeting/ppid/privacy/pageUrl/refresh) are merged at plan\n * time from `context.dynamic` — never baked into the stored slot.\n */\nexport interface Placeholder {\n /** Slot id; used in the div (`data-adhub`) and the derived ad unit path. */\n id: string;\n format: SlotFormat;\n /** display/native only. */\n loading?: LoadingStrategy;\n /** display/native lazy only — IntersectionObserver pre-roll margin, e.g. \"300px\". */\n rootMargin?: string;\n /** display/native only — pause content for the ad (Config API). */\n contentPause?: boolean;\n /** anchor only. */\n position?: AnchorPosition;\n /** side-rail only. */\n side?: SideRailSide;\n /** display/native only. */\n sizeMapping?: SizeMappingEntry[];\n /** display/native only. */\n refresh?: RefreshConfig;\n /** Collapse the div on no-fill. Defaults to true (display/native). */\n collapse?: boolean;\n /** Explicit ad unit path; overrides derivation. */\n adUnitPath?: string;\n /** Minimum viewport `[w,h]` for OOP formats (anchor/side-rail). */\n minViewport?: [number, number];\n /** Viewport label gate; advisory pass-through. */\n availableOn?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Tag path (managed third-party tags)\n// ---------------------------------------------------------------------------\n\nexport type ManagedTagType = \"ga4\" | \"meta-pixel\";\n\n/** A tag-path vendor the SDK injects then steps back from. */\nexport interface ManagedTag {\n type: ManagedTagType;\n /** GA4 measurement id (`G-…`) or Meta Pixel id. */\n id: string;\n}\n\n// ---------------------------------------------------------------------------\n// Video (GAM-managed VAST — render-path)\n// ---------------------------------------------------------------------------\n\nexport interface VideoTag {\n kind: string; // \"preroll\" | \"midroll\" | …\n adUnitPath?: string;\n sz?: string;\n /** Direct VAST tag URL (instead of adUnitPath). */\n tagUrl?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Provider binding + consent\n// ---------------------------------------------------------------------------\n\nexport interface GamBinding {\n /** GAM network code. Defaults to OUR network when omitted (operator-managed). */\n networkCode?: string;\n /** Site domain; shapes the derived ad unit path. */\n siteDomain?: string;\n}\n\n/**\n * Consent config. v1 upgrades sdk-sample's `{mode, assumed}` pass-through to real\n * Consent Mode v2: conservative defaults applied synchronously, then `__tcfapi`\n * drives `update`. See Phase 4.\n */\nexport interface ConsentConfig {\n mode?: \"v2\";\n /** Legacy sdk-sample flag — treated as \"assume granted\" when no CMP present. */\n assumed?: boolean;\n /** Default Consent Mode v2 signals before any CMP read (conservative = denied). */\n defaults?: ConsentModeSignals;\n /** Milliseconds to wait for `__tcfapi` before falling back to defaults. */\n cmpTimeoutMs?: number;\n}\n\nexport type ConsentSignalState = \"granted\" | \"denied\";\n\n/** The four Consent Mode v2 signals. */\nexport interface ConsentModeSignals {\n ad_storage: ConsentSignalState;\n analytics_storage: ConsentSignalState;\n ad_user_data: ConsentSignalState;\n ad_personalization: ConsentSignalState;\n}\n\n// ---------------------------------------------------------------------------\n// Manifest\n// ---------------------------------------------------------------------------\n\nexport interface Manifest {\n publisherId: string;\n version?: number;\n injection?: \"head\";\n autoShow?: boolean;\n gam: GamBinding;\n consent?: ConsentConfig;\n allowDomains?: string[];\n placeholders: Placeholder[];\n managedTags?: ManagedTag[];\n video?: VideoTag[];\n killed?: boolean;\n /** Internal `__`-prefixed keys are stripped by {@link stripMeta} before storage. */\n [internal: `__${string}`]: unknown;\n}\n\n/** Manifest after {@link normalize}: defaults filled, ad unit paths derived. */\nexport interface NormalizedManifest extends Manifest {\n version: number;\n autoShow: boolean;\n killed: boolean;\n allowDomains: string[];\n managedTags: ManagedTag[];\n video: VideoTag[];\n consent: ConsentConfig;\n}\n\n// ---------------------------------------------------------------------------\n// Plan (render plan — output of plan(), shared shape across all producers)\n// ---------------------------------------------------------------------------\n\n/** Runtime dynamic parameters merged at plan time (never stored on the slot). */\nexport interface DynamicParams {\n /** Targeting key→value(s). Unknown keys are warned, not rejected (loose). */\n targeting?: Record<string, string | string[]>;\n /** Publisher-provided id (hashing is the publisher's responsibility). */\n ppid?: string;\n /** Privacy flags passed to the Config API (e.g. restrictDataProcessing). */\n privacy?: Record<string, unknown>;\n /** Override page URL for targeting/correlator (SPA navigation). */\n pageUrl?: string;\n /**\n * Correlator resolution is context-dependent: SPA nav → true (new page view);\n * in-page refresh/infinite-scroll → false. Never a blanket default.\n */\n changeCorrelator?: boolean;\n}\n\nexport interface PlanContext {\n url: string;\n viewport: { w: number; h: number };\n dynamic?: DynamicParams;\n}\n\n/** A single render-path slot in the resolved plan. */\nexport interface PlanSlot {\n id: string;\n format: SlotFormat;\n adUnitPath: string;\n /** DOM identity for stale-callback protection; the only `__` key the plan keeps. */\n __uid: string;\n /** display/native only. */\n sizeMapping?: SizeMappingEntry[];\n loading?: LoadingStrategy;\n rootMargin?: string;\n contentPause?: boolean;\n collapse?: boolean;\n refresh?: RefreshConfig;\n position?: AnchorPosition;\n side?: SideRailSide;\n /** Merged dynamic params for this slot/page (targeting/ppid/privacy/correlator). */\n dynamic?: DynamicParams;\n}\n\n/**\n * The vendor-agnostic instruction set the SDK executes. Identical shape whether\n * produced by the Worker, the console preview, or the SDK static fast-path — this\n * is what the parity gate (generation == execution) asserts.\n */\nexport interface RenderPlan {\n slots: PlanSlot[];\n managedTags: ManagedTag[];\n video: VideoTag[];\n /** Server-driven host allowlist for the single TagInjector choke point. */\n allowedTagHosts: string[];\n}\n","/** Validation result shapes. Errors block save; warnings are advisory. */\n\nexport interface ValidationError {\n /** Dotted path to the offending field, e.g. `placeholders[2].format`. */\n path: string;\n message: string;\n code: string;\n}\n\nexport type Warning = ValidationError;\n\nexport interface ValidationResult {\n errors: ValidationError[];\n warnings: Warning[];\n}\n\n/** Default network code for operator-managed sites that omit `gam.networkCode`. */\nexport const DEFAULT_NETWORK_CODE = \"23174336345\";\n\n/** Known GAM test network codes — surfaced as the real-vs-test indicator (P9). */\nexport const TEST_NETWORK_CODES: readonly string[] = [\"6355419\"];\n","import { DEFAULT_NETWORK_CODE } from \"./errors.js\";\nimport {\n type ConsentConfig,\n type ConsentModeSignals,\n type GamBinding,\n type Manifest,\n type NormalizedManifest,\n OOP_FORMATS,\n type Placeholder,\n} from \"./types.js\";\n\n/** Conservative Consent Mode v2 defaults — everything denied until a CMP grants. */\nexport const CONSERVATIVE_CONSENT_DEFAULTS: ConsentModeSignals = {\n ad_storage: \"denied\",\n analytics_storage: \"denied\",\n ad_user_data: \"denied\",\n ad_personalization: \"denied\",\n};\n\n/**\n * Derive a slot's ad unit path.\n * - With `siteDomain`: `/<networkCode>/<siteDomain>/<siteDomain>_<slotId>`\n * - Without: `/<networkCode>/<publisherId>/<slotId>`\n * An explicit per-slot `adUnitPath` always wins (handled by the caller).\n * `networkCode` defaults to OUR network when the site omits it.\n */\nexport function deriveAdUnitPath(\n gam: GamBinding,\n publisherId: string,\n slotId: string,\n): string {\n const networkCode = gam.networkCode?.trim() || DEFAULT_NETWORK_CODE;\n const siteDomain = gam.siteDomain?.trim();\n if (siteDomain) {\n return `/${networkCode}/${siteDomain}/${siteDomain}_${slotId}`;\n }\n return `/${networkCode}/${publisherId}/${slotId}`;\n}\n\nfunction normalizeConsent(consent: ConsentConfig | undefined): ConsentConfig {\n return {\n mode: \"v2\",\n assumed: consent?.assumed ?? false,\n defaults: consent?.defaults ?? CONSERVATIVE_CONSENT_DEFAULTS,\n cmpTimeoutMs: consent?.cmpTimeoutMs ?? 2000,\n };\n}\n\nfunction normalizePlaceholder(\n ph: Placeholder,\n gam: GamBinding,\n publisherId: string,\n): Placeholder {\n const isOop = OOP_FORMATS.includes(ph.format);\n const adUnitPath =\n ph.adUnitPath ?? deriveAdUnitPath(gam, publisherId, ph.id);\n\n if (isOop) {\n // OOP immutability: no sizes, no size mapping, no collapse semantics.\n return {\n id: ph.id,\n format: ph.format,\n adUnitPath,\n ...(ph.position ? { position: ph.position } : {}),\n ...(ph.side ? { side: ph.side } : {}),\n ...(ph.minViewport ? { minViewport: ph.minViewport } : {}),\n ...(ph.availableOn ? { availableOn: ph.availableOn } : {}),\n };\n }\n\n // display / native: fill render defaults. NOTE: no blanket correlator default —\n // changeCorrelator is resolved by context at refresh time, never baked here.\n return {\n ...ph,\n adUnitPath,\n loading: ph.loading ?? \"eager\",\n collapse: ph.collapse ?? true,\n refresh: ph.refresh ?? { enabled: false },\n sizeMapping: ph.sizeMapping ?? [],\n };\n}\n\n/** Fill defaults and derive ad unit paths. Pure; deterministic (parity-critical). */\nexport function normalize(manifest: Manifest): NormalizedManifest {\n const gam = manifest.gam ?? {};\n const normGam: GamBinding = {\n networkCode: gam.networkCode?.trim() || DEFAULT_NETWORK_CODE,\n ...(gam.siteDomain ? { siteDomain: gam.siteDomain.trim() } : {}),\n };\n\n return {\n ...manifest,\n version: manifest.version ?? 1,\n injection: manifest.injection ?? \"head\",\n autoShow: manifest.autoShow ?? true,\n killed: manifest.killed ?? false,\n gam: normGam,\n consent: normalizeConsent(manifest.consent),\n allowDomains: manifest.allowDomains ?? [],\n managedTags: manifest.managedTags ?? [],\n video: manifest.video ?? [],\n placeholders: (manifest.placeholders ?? []).map((ph) =>\n normalizePlaceholder(ph, normGam, manifest.publisherId),\n ),\n };\n}\n","import { normalize } from \"./normalize.js\";\nimport {\n type DynamicParams,\n type Manifest,\n type ManagedTag,\n OOP_FORMATS,\n type Placeholder,\n type PlanContext,\n type PlanSlot,\n type RenderPlan,\n} from \"./types.js\";\n\n/** Official, allowlisted hosts per concern. The single TagInjector enforces these. */\nconst GPT_HOSTS = [\"securepubads.g.doubleclick.net\", \"www.googletagservices.com\"];\nconst TAG_HOSTS: Record<ManagedTag[\"type\"], string[]> = {\n ga4: [\"www.googletagmanager.com\"],\n \"meta-pixel\": [\"connect.facebook.net\"],\n};\n\n/**\n * Deterministic DOM identity for a slot. Parity-critical: must depend only on\n * stable inputs (no randomness, no time) so the same (manifest, context) always\n * yields the same plan. djb2 over `id|adUnitPath`.\n */\nfunction deriveUid(id: string, adUnitPath: string): string {\n const input = `${id}|${adUnitPath}`;\n let hash = 5381;\n for (let i = 0; i < input.length; i++) {\n hash = ((hash << 5) + hash + input.charCodeAt(i)) >>> 0;\n }\n return `u${hash.toString(36)}`;\n}\n\n/** True when an OOP slot's viewport gate is unmet (slot is silently omitted). */\nfunction oopViewportUnmet(ph: Placeholder, viewport: { w: number; h: number }): boolean {\n if (!ph.minViewport) return false;\n const [minW, minH] = ph.minViewport;\n return viewport.w < minW || viewport.h < minH;\n}\n\nfunction mergeDynamic(\n slotId: string,\n ctxDynamic: DynamicParams | undefined,\n): DynamicParams | undefined {\n if (!ctxDynamic) return undefined;\n // Page-level dynamic params apply to every slot in v1; per-slot scoping is a seam.\n const merged: DynamicParams = {};\n if (ctxDynamic.targeting) merged.targeting = ctxDynamic.targeting;\n if (ctxDynamic.ppid !== undefined) merged.ppid = ctxDynamic.ppid;\n if (ctxDynamic.privacy) merged.privacy = ctxDynamic.privacy;\n if (ctxDynamic.pageUrl !== undefined) merged.pageUrl = ctxDynamic.pageUrl;\n if (ctxDynamic.changeCorrelator !== undefined) {\n merged.changeCorrelator = ctxDynamic.changeCorrelator;\n }\n void slotId;\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\nfunction toPlanSlot(ph: Placeholder, ctx: PlanContext): PlanSlot {\n const adUnitPath = ph.adUnitPath!; // normalize always derives this\n const isOop = OOP_FORMATS.includes(ph.format);\n const dynamic = mergeDynamic(ph.id, ctx.dynamic);\n\n const slot: PlanSlot = {\n id: ph.id,\n format: ph.format,\n adUnitPath,\n __uid: deriveUid(ph.id, adUnitPath),\n };\n\n if (!isOop) {\n if (ph.sizeMapping) slot.sizeMapping = ph.sizeMapping;\n if (ph.loading) slot.loading = ph.loading;\n if (ph.rootMargin) slot.rootMargin = ph.rootMargin;\n if (ph.contentPause !== undefined) slot.contentPause = ph.contentPause;\n if (ph.collapse !== undefined) slot.collapse = ph.collapse;\n if (ph.refresh) slot.refresh = ph.refresh;\n } else {\n if (ph.position) slot.position = ph.position;\n if (ph.side) slot.side = ph.side;\n }\n if (dynamic) slot.dynamic = dynamic;\n\n return slot;\n}\n\n/** Compute the allowlisted tag hosts from the manifest's vendors + GPT. */\nfunction computeAllowedTagHosts(tags: ManagedTag[]): string[] {\n const hosts = new Set<string>(GPT_HOSTS);\n for (const tag of tags) {\n for (const h of TAG_HOSTS[tag.type] ?? []) hosts.add(h);\n }\n return [...hosts].sort();\n}\n\n/**\n * Resolve a manifest + page context into the vendor-agnostic {@link RenderPlan}.\n *\n * THE shared planner: the Worker, the console preview, and the SDK static fast-path\n * all call this one function — there is no second implementation. The parity gate\n * asserts generation == execution against this output. Deterministic for a fixed\n * (manifest, context).\n */\nexport function plan(manifest: Manifest, ctx: PlanContext): RenderPlan {\n const normalized = normalize(manifest);\n\n const slots: PlanSlot[] = normalized.placeholders\n .filter((ph) => !oopViewportUnmet(ph, ctx.viewport))\n .map((ph) => toPlanSlot(ph, ctx));\n\n return {\n slots,\n managedTags: normalized.managedTags,\n video: normalized.video,\n allowedTagHosts: computeAllowedTagHosts(normalized.managedTags),\n };\n}\n","/**\n * `allowDomains` gate (mirrors sdk-sample MANIFEST.md). Checks the PAGE hostname,\n * not where the SDK/config is served from.\n *\n * Rules:\n * - localhost / 127.0.0.1 / known tunnel & preview suffixes → always allowed.\n * - leading-dot `\".site.com\"` → matches apex AND subdomains.\n * - no-dot `\"site.com\"` → that host only.\n * - empty array → allow all.\n */\n\n/** Suffixes always allowed regardless of `allowDomains` (dev/tunnel/preview). */\nconst ALWAYS_ALLOWED_SUFFIXES: readonly string[] = [\n \".trycloudflare.com\",\n \".pages.dev\",\n \".workers.dev\",\n \".ngrok.io\",\n \".ngrok-free.app\",\n \".loca.lt\",\n \".local\",\n];\n\nconst ALWAYS_ALLOWED_HOSTS: readonly string[] = [\"localhost\", \"127.0.0.1\"];\n\nfunction normalizeHost(host: string): string {\n return host.trim().toLowerCase().replace(/\\.$/, \"\");\n}\n\nexport function isAlwaysAllowed(hostname: string): boolean {\n const host = normalizeHost(hostname);\n if (ALWAYS_ALLOWED_HOSTS.includes(host)) return true;\n return ALWAYS_ALLOWED_SUFFIXES.some((suffix) => host.endsWith(suffix));\n}\n\n/** True if `hostname` is permitted by `allowDomains`. */\nexport function isDomainAllowed(\n hostname: string,\n allowDomains: string[] | undefined,\n): boolean {\n const host = normalizeHost(hostname);\n if (isAlwaysAllowed(host)) return true;\n // Empty / missing list = allow all.\n if (!allowDomains || allowDomains.length === 0) return true;\n\n return allowDomains.some((raw) => {\n const entry = normalizeHost(raw);\n if (!entry) return false;\n if (entry.startsWith(\".\")) {\n // Leading dot: apex + subdomains.\n const apex = entry.slice(1);\n return host === apex || host.endsWith(entry);\n }\n return host === entry;\n });\n}\n","/**\n * The load-bearing boot order (sdk-sample SDK.md §7/§8). Reordering breaks Single\n * Request Architecture or fires ads early — high-risk, locked by test.\n *\n * The engine drives these abstract steps in order; the render provider (GPT in v1)\n * maps each to its concrete call (`disableInitialLoad` → `googletag.pubads()\n * .disableInitialLoad()`, etc.). A future provider may map or no-op them.\n */\nexport const BOOT_SPINE = [\n \"disableInitialLoad\",\n \"enableSingleRequest\",\n \"collapseEmptyDivs\",\n \"enableServices\",\n] as const;\n\nexport type BootStep = (typeof BOOT_SPINE)[number];\n","/**\n * Consent gate contract consumed by the gate chain (the real implementation lands\n * in Phase 4). ONE snapshot gates BOTH paths (render + tag). The engine depends on\n * this interface only — never on `__tcfapi`/`gtag`.\n */\n\nimport type { ConsentModeSignals } from \"@hientran0208/ads-manifest\";\n\nexport type VendorConsentId = \"gpt\" | \"ga4\" | \"meta-pixel\" | (string & {});\n\nexport interface ConsentSnapshot {\n signals: ConsentModeSignals;\n /** Per-vendor allow/deny derived from the TCF→signal→vendor matrix. */\n allows(vendor: VendorConsentId): boolean;\n /** True once a real CMP signal has been read (vs conservative defaults). */\n resolved: boolean;\n}\n\nexport interface ConsentGate {\n /** Synchronous conservative defaults — never blocks the fast-path. */\n snapshot(): ConsentSnapshot;\n /** Subscribe to mid-session consent changes (grant/deny). */\n onChange(cb: (snap: ConsentSnapshot) => void): () => void;\n /** Begin async CMP read (idempotent). */\n start(): void;\n}\n\n/** Pass-through gate (everything allowed) — DI default for engine unit tests. */\nexport function createAllowAllConsentGate(\n signals?: ConsentModeSignals,\n): ConsentGate {\n const snap: ConsentSnapshot = {\n signals: signals ?? {\n ad_storage: \"granted\",\n analytics_storage: \"granted\",\n ad_user_data: \"granted\",\n ad_personalization: \"granted\",\n },\n allows: () => true,\n resolved: true,\n };\n return {\n snapshot: () => snap,\n onChange: () => () => {},\n start: () => {},\n };\n}\n","/**\n * Mutable dynamic-params store merged into `plan()` context on each (re)plan.\n * Holds page-level params and per-slot overrides. Correlator is resolved by the\n * caller's context (newPageView), never stored as a blanket default.\n */\n\nimport type { DynamicParams } from \"@hientran0208/ads-manifest\";\n\nexport interface DynamicParamsStore {\n page: DynamicParams;\n perSlot: Map<string, DynamicParams>;\n setPage(p: DynamicParams): void;\n setSlot(id: string, p: DynamicParams): void;\n /** Page params merged with a slot's overrides (slot wins). */\n resolved(slotId?: string): DynamicParams;\n}\n\nexport function createDynamicParamsStore(): DynamicParamsStore {\n const store: DynamicParamsStore = {\n page: {},\n perSlot: new Map(),\n setPage(p) {\n store.page = { ...store.page, ...p };\n },\n setSlot(id, p) {\n store.perSlot.set(id, { ...(store.perSlot.get(id) ?? {}), ...p });\n },\n resolved(slotId) {\n const slot = slotId ? store.perSlot.get(slotId) : undefined;\n return { ...store.page, ...(slot ?? {}) };\n },\n };\n return store;\n}\n","/**\n * Typed pub/sub — where the two paths (render + tag) meet without coupling.\n * The telemetry sink and (later) CAPI forwarder subscribe here; vendors emit\n * normalized events. Synchronous delivery; a throwing handler is isolated so one\n * bad subscriber cannot break dispatch.\n */\n\nimport type { ConsentModeSignals } from \"@hientran0208/ads-manifest\";\n\nexport type EngineEvent =\n | { type: \"slot:registered\"; slotId: string; uid: string }\n | { type: \"slot:requested\"; slotId: string; uid: string }\n | { type: \"slot:rendered\"; slotId: string; uid: string; isEmpty: boolean }\n | { type: \"slot:empty\"; slotId: string; uid: string }\n | { type: \"slot:destroyed\"; slotId: string; uid: string }\n | { type: \"consent:changed\"; signals: ConsentModeSignals }\n | { type: \"tag:injected\"; host: string; key: string }\n | { type: \"vendor:event\"; vendor: string; name: string; payload?: unknown }\n | { type: \"error\"; scope: string; message: string; cause?: unknown }\n | { type: \"warning\"; scope: string; message: string };\n\nexport type EngineEventType = EngineEvent[\"type\"];\nexport type Handler<T extends EngineEventType = EngineEventType> = (\n ev: Extract<EngineEvent, { type: T }>,\n) => void;\n\nexport interface EventBus {\n on<T extends EngineEventType>(type: T, handler: Handler<T>): () => void;\n emit(ev: EngineEvent): void;\n}\n\nexport function createEventBus(\n onHandlerError?: (err: unknown) => void,\n): EventBus {\n const handlers = new Map<EngineEventType, Set<Handler>>();\n\n return {\n on(type, handler) {\n let set = handlers.get(type);\n if (!set) {\n set = new Set();\n handlers.set(type, set);\n }\n set.add(handler as unknown as Handler);\n return () => set!.delete(handler as unknown as Handler);\n },\n emit(ev) {\n const set = handlers.get(ev.type);\n if (!set) return;\n for (const handler of [...set]) {\n try {\n (handler as Handler)(ev);\n } catch (err) {\n onHandlerError?.(err);\n }\n }\n },\n };\n}\n","/**\n * Capability lookup table: how each format is requested. Pure routing — it asks the\n * registry to resolve and classifies the format; it NEVER calls googletag.\n *\n * - display/native → div path, eager/lazy, rides the batched request.\n * - anchor/side-rail/oop → no-div path, no sizes; ride the batch.\n * - interstitial → no-div, on-demand display, NOT in the eager batch, never refresh.\n */\n\nimport { OOP_FORMATS, type SlotFormat } from \"@hientran0208/ads-manifest\";\n\nexport interface DispatchTraits {\n /** Has a div in the DOM (display/native) vs out-of-page. */\n usesDiv: boolean;\n /** Eligible for the batched eager request (Single Request Architecture). */\n ridesEagerBatch: boolean;\n /** On-demand display only (interstitial). */\n onDemandOnly: boolean;\n /** May be refreshed in-page. */\n refreshable: boolean;\n}\n\nexport function dispatchTraits(format: SlotFormat): DispatchTraits {\n const isOop = OOP_FORMATS.includes(format);\n if (format === \"interstitial\") {\n return { usesDiv: false, ridesEagerBatch: false, onDemandOnly: true, refreshable: false };\n }\n if (isOop) {\n // anchor / side-rail / oop\n return { usesDiv: false, ridesEagerBatch: true, onDemandOnly: false, refreshable: false };\n }\n // display / native\n return { usesDiv: true, ridesEagerBatch: true, onDemandOnly: false, refreshable: true };\n}\n","/**\n * Ordered, short-circuiting gate chain run before any ad activity:\n * kill-switch → domain-check → consent.\n *\n * If ANY gate aborts, the engine's `_booted` stays false and hydrate stops — no\n * display, no lazy arming (the `isBooted()` invariant; sdk-sample high-risk seam).\n */\n\nimport { isDomainAllowed, type NormalizedManifest } from \"@hientran0208/ads-manifest\";\nimport type { ConsentGate } from \"./consent-gate-contract.js\";\nimport type { EventBus } from \"./event-bus.js\";\n\nexport type GateOutcome =\n | { ok: true }\n | { ok: false; gate: \"kill\" | \"domain\" | \"consent\"; reason: string };\n\nexport interface GateChainDeps {\n manifest: NormalizedManifest;\n consentGate: ConsentGate;\n bus: EventBus;\n hostname: string;\n}\n\n/**\n * Run the chain. Render-path consent is keyed to the GPT vendor decision; tag\n * vendors consult the same snapshot at init time. A denied consent snapshot does\n * NOT abort boot here — it gates per-vendor arming downstream — UNLESS the manifest\n * has zero servable surface. The chain's hard aborts are kill + domain; consent is\n * reported so the engine can gate, then re-arm on grant.\n */\nexport function runGateChain(deps: GateChainDeps): GateOutcome {\n const { manifest, bus, hostname } = deps;\n\n if (manifest.killed) {\n bus.emit({ type: \"warning\", scope: \"gate:kill\", message: \"kill switch active\" });\n return { ok: false, gate: \"kill\", reason: \"killed\" };\n }\n\n if (!isDomainAllowed(hostname, manifest.allowDomains)) {\n bus.emit({\n type: \"error\",\n scope: \"gate:domain\",\n message: `host not allowed: ${hostname}`,\n });\n return { ok: false, gate: \"domain\", reason: \"domain_not_allowed\" };\n }\n\n // Consent does not hard-abort boot; the engine gates each path against the\n // snapshot and re-arms on grant. Boot proceeds so the consent listener is wired.\n return { ok: true };\n}\n","/**\n * Tag-path vendor registry, keyed by manifest tag type. Maps `managedTags[].type`\n * → the vendor that injects it.\n */\n\nimport type { ManagedTagType } from \"@hientran0208/ads-manifest\";\nimport type { TagVendor } from \"./vendor-contract.js\";\n\nexport interface AdapterSlotRegistry {\n register(type: ManagedTagType, vendor: TagVendor): void;\n resolve(type: ManagedTagType): TagVendor | null;\n all(): TagVendor[];\n}\n\nexport function createAdapterSlotRegistry(): AdapterSlotRegistry {\n const byType = new Map<ManagedTagType, TagVendor>();\n\n return {\n register(type, vendor) {\n byType.set(type, vendor);\n },\n resolve(type) {\n return byType.get(type) ?? null;\n },\n all() {\n return [...byType.values()];\n },\n };\n}\n","/**\n * Resolves a render provider per (format) — not one global provider. v1 registers\n * one provider (GPT) covering all formats; the registry exists so a 2nd provider\n * slots in without engine changes.\n */\n\nimport type { SlotFormat } from \"@hientran0208/ads-manifest\";\nimport type { RenderProvider } from \"./provider-contract.js\";\n\nexport interface ProviderRegistry {\n register(provider: RenderProvider): void;\n /** Provider that can serve `format`, or null if none. */\n resolve(format: SlotFormat): RenderProvider | null;\n all(): RenderProvider[];\n}\n\nexport function createProviderRegistry(): ProviderRegistry {\n const providers: RenderProvider[] = [];\n\n return {\n register(provider) {\n providers.push(provider);\n },\n resolve(format) {\n return providers.find((p) => p.capabilities().includes(format)) ?? null;\n },\n all() {\n return [...providers];\n },\n };\n}\n","/**\n * Epoch-keyed slot lifecycle state machine. The epoch key prevents a stale render\n * callback (fired after an SPA nav) from reporting to the wrong/new slot\n * (sdk-sample high-risk). Illegal transitions are rejected.\n *\n * registered → gated → requested → rendered → (refreshed → requested) | destroyed\n */\n\nimport type { PlanSlot } from \"@hientran0208/ads-manifest\";\nimport type { ProviderHandle } from \"./registries/provider-contract.js\";\n\nexport type SlotState =\n | \"registered\"\n | \"gated\"\n | \"requested\"\n | \"rendered\"\n | \"destroyed\";\n\nconst LEGAL: Record<SlotState, SlotState[]> = {\n registered: [\"gated\", \"destroyed\"],\n gated: [\"requested\", \"destroyed\"],\n requested: [\"rendered\", \"destroyed\"],\n rendered: [\"requested\", \"destroyed\"], // refresh re-enters requested\n destroyed: [],\n};\n\nexport interface SlotRecord {\n slot: PlanSlot;\n handle: ProviderHandle | null;\n state: SlotState;\n /** Monotonic epoch; bumped on new page view. Stale callbacks are ignored. */\n epoch: number;\n}\n\nexport interface SlotLifecycle {\n register(slot: PlanSlot, epoch: number): SlotRecord;\n get(uid: string): SlotRecord | undefined;\n all(): SlotRecord[];\n /** Attempt a transition; returns false (no-op) if illegal. */\n transition(uid: string, to: SlotState): boolean;\n attachHandle(uid: string, handle: ProviderHandle | null): void;\n /** True if the uid exists AND its epoch matches (callback not stale). */\n isCurrent(uid: string, epoch: number): boolean;\n destroyAll(): void;\n}\n\nexport function createSlotLifecycle(): SlotLifecycle {\n const records = new Map<string, SlotRecord>();\n\n return {\n register(slot, epoch) {\n const rec: SlotRecord = { slot, handle: null, state: \"registered\", epoch };\n records.set(slot.__uid, rec);\n return rec;\n },\n get(uid) {\n return records.get(uid);\n },\n all() {\n return [...records.values()];\n },\n transition(uid, to) {\n const rec = records.get(uid);\n if (!rec) return false;\n if (!LEGAL[rec.state].includes(to)) return false;\n rec.state = to;\n return true;\n },\n attachHandle(uid, handle) {\n const rec = records.get(uid);\n if (rec) rec.handle = handle;\n },\n isCurrent(uid, epoch) {\n const rec = records.get(uid);\n return !!rec && rec.epoch === epoch && rec.state !== \"destroyed\";\n },\n destroyAll() {\n for (const rec of records.values()) rec.state = \"destroyed\";\n records.clear();\n },\n };\n}\n","/**\n * The SINGLE choke point for every external script — vendors AND gpt.js. Enforces a\n * server-driven host allowlist (`plan.allowedTagHosts`), dedupes by key, and injects\n * async-by-default (defer override). Nothing else in the SDK appends a <script>.\n */\n\nimport type { EventBus } from \"../core/event-bus.js\";\n\nexport interface InjectOptions {\n /** Dedupe key; a repeated key is a no-op. Defaults to the src URL. */\n key?: string;\n /** `false` → async (default); `true` → defer. */\n defer?: boolean;\n attrs?: Record<string, string>;\n}\n\nexport interface TagInjector {\n /**\n * Inject a <script src>. Rejects (emits `error`, returns false) if the src host\n * is not in `allowedHosts`. Idempotent per key.\n */\n inject(src: string, allowedHosts: string[], opts?: InjectOptions): boolean;\n /** True if a key was already injected. */\n has(key: string): boolean;\n}\n\nfunction hostOf(src: string): string | null {\n try {\n return new URL(src, \"https://invalid.local\").hostname;\n } catch {\n return null;\n }\n}\n\nexport function createTagInjector(\n bus: EventBus,\n doc: Document = document,\n): TagInjector {\n const injected = new Set<string>();\n\n return {\n has(key) {\n return injected.has(key);\n },\n inject(src, allowedHosts, opts = {}) {\n const key = opts.key ?? src;\n if (injected.has(key)) return true; // dedupe — already loaded\n\n const host = hostOf(src);\n if (!host || !allowedHosts.includes(host)) {\n bus.emit({\n type: \"error\",\n scope: \"tag-injector\",\n message: `blocked script from disallowed host: ${host ?? src}`,\n });\n return false;\n }\n\n const el = doc.createElement(\"script\");\n el.src = src;\n if (opts.defer) el.defer = true;\n else el.async = true;\n for (const [k, v] of Object.entries(opts.attrs ?? {})) {\n el.setAttribute(k, v);\n }\n (doc.head ?? doc.documentElement).appendChild(el);\n\n injected.add(key);\n bus.emit({ type: \"tag:injected\", host, key });\n return true;\n },\n };\n}\n","/**\n * IntersectionObserver wrapper for lazy slots. Fires `onEnter` once when a slot's\n * element nears the viewport (`rootMargin`). SSR/no-IO guarded: if\n * IntersectionObserver is absent, treats the slot as immediately visible.\n */\n\nexport interface LazyObserver {\n observe(el: Element, rootMargin: string, onEnter: () => void): void;\n disconnect(): void;\n}\n\nexport function createLazyObserver(win: Window = window): LazyObserver {\n const observers: IntersectionObserver[] = [];\n const Ctor: typeof IntersectionObserver | undefined = (\n win as unknown as { IntersectionObserver?: typeof IntersectionObserver }\n ).IntersectionObserver;\n\n return {\n observe(el, rootMargin, onEnter) {\n if (!Ctor) {\n onEnter(); // no IO → eager fallback\n return;\n }\n const io = new Ctor(\n (entries: IntersectionObserverEntry[], obs: IntersectionObserver) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n obs.disconnect();\n onEnter();\n }\n }\n },\n { rootMargin },\n );\n io.observe(el);\n observers.push(io);\n },\n disconnect() {\n for (const io of observers) io.disconnect();\n observers.length = 0;\n },\n };\n}\n","/**\n * The framework-agnostic AdsEngine — the brain that consumes a RenderPlan, runs the\n * gate chain, drives both paths (render registry/dispatch + tag injector), manages\n * epoch-keyed slot lifecycle, and exposes the dynamic-params API.\n *\n * It does NOT re-implement planning — it imports `plan()` from @hientran0208/ads-manifest.\n * The parity gate (P5) asserts generation == execution against that one planner.\n */\n\nimport {\n type DynamicParams,\n type Manifest,\n normalize,\n plan,\n type PlanContext,\n type PlanSlot,\n type RenderPlan,\n} from \"@hientran0208/ads-manifest\";\n\nimport { BOOT_SPINE } from \"./boot-spine.js\";\nimport type { ConsentGate } from \"./consent-gate-contract.js\";\nimport { createAllowAllConsentGate } from \"./consent-gate-contract.js\";\nimport { createDynamicParamsStore } from \"./dynamic-params.js\";\nimport { type EngineEvent, type EventBus, createEventBus } from \"./event-bus.js\";\nimport { dispatchTraits } from \"./format-dispatch.js\";\nimport { runGateChain } from \"./gate-chain.js\";\nimport { createAdapterSlotRegistry, type AdapterSlotRegistry } from \"./registries/adapter-slot-registry.js\";\nimport { createProviderRegistry, type ProviderRegistry } from \"./registries/provider-registry.js\";\nimport type { ProviderHandle } from \"./registries/provider-contract.js\";\nimport { createSlotLifecycle, type SlotLifecycle } from \"./slot-lifecycle.js\";\nimport { createTagInjector, type TagInjector } from \"../inject/tag-injector.js\";\nimport { createLazyObserver, type LazyObserver } from \"../inject/lazy-observer.js\";\n\nexport interface AdsEngineDeps {\n providerRegistry?: ProviderRegistry;\n adapterRegistry?: AdapterSlotRegistry;\n consentGate?: ConsentGate;\n injector?: TagInjector;\n lazyObserver?: LazyObserver;\n bus?: EventBus;\n win?: Window;\n doc?: Document;\n}\n\nexport interface RefreshOptions {\n /** SPA nav → new page view (correlator true, epoch bump); else in-page (false). */\n newPageView?: boolean;\n}\n\nexport interface AdsEngine {\n init(manifest: Manifest, ctx: PlanContext): void;\n /**\n * Approach C: boot directly from a server-resolved RenderPlan (the public\n * `/placement` response) — no manifest needed. Used by publisher pages that are\n * not operator-authenticated. Kill-switch/domain gating is the server's job here;\n * consent is still driven client-side by the injected ConsentGate.\n */\n initFromPlan(rp: RenderPlan, ctx: PlanContext, opts?: { autoShow?: boolean }): void;\n isBooted(): boolean;\n setPageParams(p: DynamicParams): void;\n setSlotParams(id: string, p: DynamicParams): void;\n refresh(ids: string[] | null, opts?: RefreshOptions): void;\n display(id: string): void;\n destroy(): void;\n on(type: EngineEvent[\"type\"], handler: (ev: EngineEvent) => void): () => void;\n /** Dev-only debug hook: the plan the engine actually executed (parity capture). */\n getExecutedPlan(): RenderPlan | null;\n readonly providerRegistry: ProviderRegistry;\n readonly adapterRegistry: AdapterSlotRegistry;\n}\n\nconst GUARD_KEY = \"__adsEngine\";\n\nexport function createAdsEngine(deps: AdsEngineDeps = {}): AdsEngine {\n const win = deps.win ?? (typeof window !== \"undefined\" ? window : undefined);\n const doc = deps.doc ?? (typeof document !== \"undefined\" ? document : undefined);\n const bus = deps.bus ?? createEventBus();\n const providerRegistry = deps.providerRegistry ?? createProviderRegistry();\n const adapterRegistry = deps.adapterRegistry ?? createAdapterSlotRegistry();\n const consentGate = deps.consentGate ?? createAllowAllConsentGate();\n const injector = deps.injector ?? (doc ? createTagInjector(bus, doc) : undefined);\n const lazyObserver = deps.lazyObserver ?? (win ? createLazyObserver(win) : undefined);\n const dynamicStore = createDynamicParamsStore();\n const lifecycle: SlotLifecycle = createSlotLifecycle();\n\n let booted = false;\n let epoch = 0;\n // `manifest` is absent when booted from a server plan (initFromPlan).\n let current: { manifest?: Manifest; ctx: PlanContext; plan: RenderPlan } | null = null;\n let consentUnsub: (() => void) | null = null;\n\n function planContext(overridePageView?: boolean): PlanContext {\n const base = current!.ctx;\n const dyn = dynamicStore.resolved();\n const merged: DynamicParams = { ...dyn };\n if (overridePageView !== undefined) merged.changeCorrelator = overridePageView;\n return {\n url: merged.pageUrl ?? base.url,\n viewport: base.viewport,\n ...(Object.keys(merged).length ? { dynamic: merged } : {}),\n };\n }\n\n /** Define every plan slot (no request yet). disableInitialLoad makes this safe. */\n function defineSlots(rp: RenderPlan): void {\n for (const slot of rp.slots) {\n const provider = providerRegistry.resolve(slot.format);\n if (!provider) {\n bus.emit({ type: \"warning\", scope: \"dispatch\", message: `no provider for format ${slot.format}` });\n continue;\n }\n const rec = lifecycle.register(slot, epoch);\n bus.emit({ type: \"slot:registered\", slotId: slot.id, uid: slot.__uid });\n const handle = provider.prepare(slot); // null-guarded (e.g. interstitial)\n lifecycle.attachHandle(slot.__uid, handle);\n lifecycle.transition(slot.__uid, \"gated\");\n void rec;\n }\n }\n\n function eagerHandles(): ProviderHandle[] {\n return lifecycle\n .all()\n .filter((r) => r.handle && dispatchTraits(r.slot.format).ridesEagerBatch && r.slot.loading !== \"lazy\")\n .map((r) => r.handle!)\n .filter(Boolean);\n }\n\n function requestHandles(handles: ProviderHandle[], changeCorrelator: boolean): void {\n if (!handles.length) return;\n for (const h of handles) {\n const rec = lifecycle.get(h.uid);\n if (rec && lifecycle.transition(h.uid, \"requested\")) {\n bus.emit({ type: \"slot:requested\", slotId: rec.slot.id, uid: h.uid });\n }\n }\n // v1 ships one render provider; it does its own batched request (Single Request).\n providerRegistry.all()[0]?.request(handles, { changeCorrelator });\n }\n\n function armLazy(): void {\n for (const rec of lifecycle.all()) {\n if (rec.slot.loading !== \"lazy\" || !rec.handle) continue;\n const el = doc?.getElementById(rec.slot.id) ?? undefined;\n const arm = () => {\n if (!consentGate.snapshot().allows(\"gpt\")) return;\n requestHandles([rec.handle!], false);\n };\n if (lazyObserver && el) lazyObserver.observe(el, rec.slot.rootMargin ?? \"0px\", arm);\n else if (lazyObserver && !el) lazyObserver.observe(doc!.body, rec.slot.rootMargin ?? \"0px\", arm);\n }\n }\n\n /** Inject tag-path vendors that consent currently allows. */\n function armTagVendors(): void {\n if (!current || !injector) return;\n for (const tag of current.plan.managedTags) {\n const vendor = adapterRegistry.resolve(tag.type);\n if (!vendor) continue;\n if (!consentGate.snapshot().allows(tag.type)) continue; // gated; re-armed on grant\n vendor.init(tag, { injector, bus, allowedHosts: current.plan.allowedTagHosts });\n }\n }\n\n /** Shared boot tail: drive the spine, define slots, wire consent, arm both paths.\n * Used by BOTH the manifest path (init) and the server-plan path (initFromPlan). */\n function bootResolved(rp: RenderPlan, autoShow: boolean): void {\n // Render-path boot spine — exact order is load-bearing.\n for (const provider of providerRegistry.all()) {\n for (const step of BOOT_SPINE) provider.bootStep(step);\n }\n defineSlots(rp);\n booted = true;\n\n consentGate.start();\n consentUnsub = consentGate.onChange(() => onConsentChange());\n\n // Tag path.\n armTagVendors();\n\n // Render path requests (only if consent allows; else withheld, re-armed on grant).\n if (autoShow && consentGate.snapshot().allows(\"gpt\")) {\n requestHandles(eagerHandles(), false);\n armLazy();\n }\n }\n\n function claimPageGuard(): boolean {\n if (win && (win as unknown as Record<string, unknown>)[GUARD_KEY]) {\n bus.emit({ type: \"warning\", scope: \"dual-load\", message: \"an AdsEngine already booted on this page; ignoring second init\" });\n return false;\n }\n if (win) (win as unknown as Record<string, unknown>)[GUARD_KEY] = true;\n return true;\n }\n\n /** When consent flips to granted mid-session: arm vendors + re-request slots. */\n function onConsentChange(): void {\n if (!booted || !current) return;\n armTagVendors();\n if (consentGate.snapshot().allows(\"gpt\")) {\n const handles = eagerHandles().filter((h) => {\n const rec = lifecycle.get(h.uid);\n return rec && rec.state !== \"requested\";\n });\n requestHandles(handles, false);\n }\n }\n\n return {\n providerRegistry,\n adapterRegistry,\n isBooted: () => booted,\n getExecutedPlan: () => current?.plan ?? null,\n on: (type, handler) => bus.on(type, handler as never),\n\n init(manifest, ctx) {\n // Dual-load page guard: a second engine warns-and-noops (\"use one mode\").\n if (!claimPageGuard()) return;\n\n const normalized = normalize(manifest);\n const hostname = win?.location?.hostname ?? new URL(ctx.url).hostname;\n const gate = runGateChain({ manifest: normalized, consentGate, bus, hostname });\n if (!gate.ok) {\n booted = false; // isBooted invariant: no display, no lazy arming\n return;\n }\n\n // Seed `current` so planContext() can read the base ctx, then resolve the plan.\n current = { manifest, ctx, plan: { slots: [], managedTags: [], video: [], allowedTagHosts: [] } };\n current.plan = plan(manifest, planContext());\n bootResolved(current.plan, normalized.autoShow);\n },\n\n initFromPlan(rp, ctx, opts = {}) {\n // Publisher/Approach-C path: boot from a server-resolved plan, no manifest.\n // Kill/domain gating already enforced server-side when producing the plan.\n if (!claimPageGuard()) return;\n current = { ctx, plan: rp };\n bootResolved(rp, opts.autoShow ?? true);\n },\n\n setPageParams(p) {\n dynamicStore.setPage(p);\n },\n setSlotParams(id, p) {\n dynamicStore.setSlot(id, p);\n },\n\n refresh(ids, opts = {}) {\n if (!booted || !current) return;\n const newPageView = opts.newPageView ?? false;\n if (newPageView) epoch += 1; // new epoch invalidates stale callbacks\n\n // Re-plan with current dynamic params + correlator-by-context — only possible\n // on the manifest path. Plan-booted engines re-request the existing slots\n // (a fresh /placement fetch is the caller's responsibility for re-targeting).\n if (current.manifest) {\n current = { ...current, plan: plan(current.manifest, planContext(newPageView)) };\n }\n\n const targets =\n ids && ids.length\n ? lifecycle.all().filter((r) => ids.includes(r.slot.id) && r.handle)\n : lifecycle.all().filter((r) => r.handle && dispatchTraits(r.slot.format).refreshable);\n\n const handles = targets.map((r) => r.handle!).filter(Boolean);\n if (!handles.length) return;\n for (const r of targets) lifecycle.transition(r.slot.__uid, \"requested\");\n providerRegistry.all()[0]?.refresh(handles, { changeCorrelator: newPageView });\n },\n\n display(id) {\n if (!booted) return;\n const rec = lifecycle.all().find((r) => r.slot.id === id);\n if (!rec?.handle) return;\n if (!consentGate.snapshot().allows(\"gpt\")) return;\n providerRegistry.all()[0]?.display(rec.handle);\n },\n\n destroy() {\n consentUnsub?.();\n lazyObserver?.disconnect();\n for (const provider of providerRegistry.all()) {\n const handles = lifecycle.all().map((r) => r.handle).filter(Boolean) as ProviderHandle[];\n if (handles.length) provider.destroy(handles);\n }\n lifecycle.destroyAll();\n booted = false;\n current = null;\n if (win) delete (win as unknown as Record<string, unknown>)[GUARD_KEY];\n },\n };\n}\n","/**\n * display / native (fluid) slot definition. Builds the GPT size mapping, defines\n * the slot against its div, attaches pubads. Native → SIZE.FLUID. Every returned\n * slot is null-guarded by the caller (gpt.js may be blocked).\n */\n\nimport type { AdSize, PlanSlot, SizeMappingEntry } from \"@hientran0208/ads-manifest\";\nimport type { Googletag, GoogletagSlot } from \"../../globals.js\";\n\n/** Flatten manifest sizes for the base defineSlot call; \"fluid\" → \"fluid\" string. */\nfunction baseSizes(slot: PlanSlot): unknown {\n const base = slot.sizeMapping?.find((m) => m.viewport[0] === 0 && m.viewport[1] === 0);\n const sizes = base?.sizes ?? slot.sizeMapping?.[0]?.sizes ?? [];\n return sizes.map(toGptSize);\n}\n\nfunction toGptSize(size: AdSize): unknown {\n return size === \"fluid\" ? \"fluid\" : size;\n}\n\n/** Build a googletag size mapping from the manifest breakpoints. */\nfunction buildSizeMapping(gt: Googletag, mapping: SizeMappingEntry[]): unknown {\n const builder = gt.sizeMapping();\n for (const entry of mapping) {\n builder.addSize(entry.viewport, entry.sizes.map(toGptSize));\n }\n return builder.build();\n}\n\nexport function defineDisplaySlot(gt: Googletag, slot: PlanSlot): GoogletagSlot | null {\n const gptSlot = gt.defineSlot(slot.adUnitPath, baseSizes(slot), slot.id);\n if (!gptSlot) return null; // null-guard: gpt.js blocked or bad config\n if (slot.sizeMapping && slot.sizeMapping.length > 0) {\n gptSlot.defineSizeMapping(buildSizeMapping(gt, slot.sizeMapping));\n }\n gptSlot.addService(gt.pubads());\n return gptSlot;\n}\n","/**\n * Out-of-page formats: anchor / interstitial / side-rail. Each maps to a GPT\n * OutOfPageFormat. OOP slots never receive sizes or a div. Position is deterministic\n * from the manifest (never random). interstitial often returns `null` → caller\n * guards, displays once, never refreshes.\n */\n\nimport type { PlanSlot } from \"@hientran0208/ads-manifest\";\nimport type { Googletag, GoogletagSlot } from \"../../globals.js\";\n\n/** Resolve the GPT OutOfPageFormat enum value for a plan slot. */\nfunction oopFormatValue(gt: Googletag, slot: PlanSlot): unknown {\n const formats = gt.enums?.OutOfPageFormat ?? {};\n switch (slot.format) {\n case \"anchor\":\n return slot.position === \"bottom\" ? formats[\"BOTTOM_ANCHOR\"] : formats[\"TOP_ANCHOR\"];\n case \"interstitial\":\n return formats[\"INTERSTITIAL\"];\n case \"side-rail\":\n return slot.side === \"right\" ? formats[\"RIGHT_SIDE_RAIL\"] : formats[\"LEFT_SIDE_RAIL\"];\n default:\n return formats[\"INTERSTITIAL\"];\n }\n}\n\nexport function defineOopSlot(gt: Googletag, slot: PlanSlot): GoogletagSlot | null {\n const fmt = oopFormatValue(gt, slot);\n const gptSlot = gt.defineOutOfPageSlot(slot.adUnitPath, fmt);\n if (!gptSlot) return null; // interstitial commonly returns null → guarded\n gptSlot.addService(gt.pubads());\n return gptSlot;\n}\n","/**\n * Modern Config API (`googletag.setConfig` / `slot.setConfig`) for targeting,\n * privacy, contentPause, and pageUrl — NOT legacy `setTargeting` (red-team).\n * Targeting key validation is loose: unknown keys are passed through (warned\n * upstream), never rejected.\n */\n\nimport type { DynamicParams, PlanSlot } from \"@hientran0208/ads-manifest\";\nimport type { Googletag, GoogletagSlot } from \"../../globals.js\";\n\n/** Page-level config (pageUrl, privacy) via `googletag.setConfig`. */\nexport function applyPageConfig(gt: Googletag, dynamic: DynamicParams | undefined): void {\n if (!dynamic) return;\n const cfg: Record<string, unknown> = {};\n if (dynamic.pageUrl) cfg[\"pageUrl\"] = dynamic.pageUrl;\n if (dynamic.privacy) cfg[\"privacyTreatments\"] = dynamic.privacy;\n if (Object.keys(cfg).length) gt.setConfig(cfg);\n}\n\n/** Per-slot config (targeting, contentPause) via `slot.setConfig`. */\nexport function applySlotConfig(slot: GoogletagSlot, planSlot: PlanSlot): void {\n const cfg: Record<string, unknown> = {};\n const targeting = planSlot.dynamic?.targeting;\n if (targeting && Object.keys(targeting).length) {\n cfg[\"targeting\"] = targeting; // loose: unknown keys passed through\n }\n if (planSlot.contentPause) {\n cfg[\"adsenseAttributes\"] = { content_pause: true };\n }\n if (Object.keys(cfg).length) slot.setConfig(cfg);\n}\n","/**\n * PPID — Publisher Provided Id. Set via `pubads().setPublisherProvidedId(id)`,\n * page-scoped, BEFORE the ad request. NOT `setConfig` (red-team #1: setConfig has no\n * PPID field). Hashing is the publisher's responsibility (we pass the id through).\n */\n\nimport type { Googletag } from \"../../globals.js\";\n\nexport function applyPpid(gt: Googletag, ppid: string | undefined): void {\n if (!ppid) return;\n gt.pubads().setPublisherProvidedId(ppid);\n}\n","/**\n * GPT render-path provider — implements the neutral `RenderProvider` contract. Every\n * googletag call goes through `cmd.push` (gpt.js may not be loaded yet). Slots are\n * null-guarded. PPID is set before the request; targeting/privacy via the Config API.\n * gpt.js itself loads through the single TagInjector (allowlisted host).\n */\n\nimport { OOP_FORMATS, type PlanSlot, type SlotFormat } from \"@hientran0208/ads-manifest\";\nimport type { BootStep } from \"../../../core/boot-spine.js\";\nimport type { EventBus } from \"../../../core/event-bus.js\";\nimport type {\n ProviderHandle,\n ProviderLifecycleEvent,\n RenderProvider,\n RequestOptions,\n} from \"../../../core/registries/provider-contract.js\";\nimport type { TagInjector } from \"../../../inject/tag-injector.js\";\nimport type { Googletag, GoogletagSlot } from \"../../globals.js\";\nimport { defineDisplaySlot } from \"./define-slot.js\";\nimport { defineOopSlot } from \"./oop-formats.js\";\nimport { applyPageConfig, applySlotConfig } from \"./config-api.js\";\nimport { applyPpid } from \"./ppid.js\";\n\nconst GPT_SRC = \"https://securepubads.g.doubleclick.net/tag/js/gpt.js\";\nconst GPT_HOST = \"securepubads.g.doubleclick.net\";\nconst V1_FORMATS: SlotFormat[] = [\"display\", \"native\", \"anchor\", \"interstitial\", \"side-rail\", \"oop\"];\n\nexport interface GptProviderDeps {\n bus: EventBus;\n injector?: TagInjector;\n /** Allowlisted hosts (from plan.allowedTagHosts) used to load gpt.js. */\n allowedHosts?: string[];\n win?: Window;\n}\n\ninterface SlotEntry {\n planSlot: PlanSlot;\n gptSlot: GoogletagSlot;\n}\n\nexport function createGptProvider(deps: GptProviderDeps): RenderProvider {\n const win = deps.win ?? window;\n const entries = new Map<string, SlotEntry>();\n const lifecycleCbs: ((ev: ProviderLifecycleEvent) => void)[] = [];\n let gptLoaded = false;\n\n /** Run a fn inside the googletag command queue (safe before gpt.js loads). */\n function gtCmd(fn: (gt: Googletag) => void): void {\n const gt = ((win.googletag = win.googletag ?? ({ cmd: [] } as unknown as Googletag)));\n gt.cmd.push(() => {\n try {\n fn(win.googletag as Googletag);\n } catch (err) {\n deps.bus.emit({ type: \"error\", scope: \"gpt\", message: String(err), cause: err });\n }\n });\n }\n\n function loadGpt(): void {\n if (gptLoaded || !deps.injector) return;\n const hosts = deps.allowedHosts ?? [GPT_HOST];\n const ok = deps.injector.inject(GPT_SRC, hosts, { key: \"gpt.js\" });\n if (!ok) {\n // blocked (e.g. file:// or off-allowlist) — error already emitted; no throw\n return;\n }\n gptLoaded = true;\n }\n\n /** Read the page-level PPID from any slot's merged dynamic params. */\n function pagePpid(): string | undefined {\n for (const { planSlot } of entries.values()) {\n if (planSlot.dynamic?.ppid) return planSlot.dynamic.ppid;\n }\n return undefined;\n }\n\n function pageDynamic() {\n for (const { planSlot } of entries.values()) {\n if (planSlot.dynamic) return planSlot.dynamic;\n }\n return undefined;\n }\n\n return {\n id: \"gpt\",\n capabilities: () => V1_FORMATS,\n\n bootStep(step: BootStep) {\n // Load gpt.js on the first spine step so all subsequent cmd.push calls drain.\n if (step === \"disableInitialLoad\") loadGpt();\n gtCmd((gt) => {\n const pubads = gt.pubads();\n switch (step) {\n case \"disableInitialLoad\":\n pubads.disableInitialLoad();\n break;\n case \"enableSingleRequest\":\n pubads.enableSingleRequest();\n break;\n case \"collapseEmptyDivs\":\n pubads.collapseEmptyDivs();\n break;\n case \"enableServices\":\n gt.enableServices();\n pubads.addEventListener(\"slotRenderEnded\", (e) => {\n const ev = e as { slot?: { getSlotElementId?: () => string }; isEmpty?: boolean };\n const uid = findUidByElementId(ev.slot?.getSlotElementId?.());\n for (const cb of lifecycleCbs) {\n cb({ type: \"rendered\", uid: uid ?? \"\", isEmpty: !!ev.isEmpty });\n }\n });\n break;\n }\n });\n },\n\n prepare(slot: PlanSlot): ProviderHandle | null {\n let gptSlot: GoogletagSlot | null = null;\n const isOop = OOP_FORMATS.includes(slot.format);\n gtCmd((gt) => {\n gptSlot = isOop ? defineOopSlot(gt, slot) : defineDisplaySlot(gt, slot);\n if (gptSlot) {\n entries.set(slot.__uid, { planSlot: slot, gptSlot });\n applySlotConfig(gptSlot, slot);\n } else {\n // null-guard: interstitial/blocked — emit, no entry, no throw\n deps.bus.emit({ type: \"warning\", scope: \"gpt\", message: `slot ${slot.id} returned null (${slot.format})` });\n }\n });\n // The handle is returned synchronously; native slot is attached when cmd drains.\n return { uid: slot.__uid, slotId: slot.id, format: slot.format, native: () => entries.get(slot.__uid)?.gptSlot };\n },\n\n request(handles: ProviderHandle[], opts: RequestOptions) {\n gtCmd((gt) => {\n // PPID BEFORE the request (page-scoped). Then page config, then refresh.\n applyPpid(gt, pagePpid());\n applyPageConfig(gt, pageDynamic());\n const gptSlots = handles\n .map((h) => entries.get(h.uid)?.gptSlot)\n .filter((s): s is GoogletagSlot => !!s);\n if (gptSlots.length) gt.pubads().refresh(gptSlots, { changeCorrelator: opts.changeCorrelator });\n });\n },\n\n display(handle: ProviderHandle) {\n gtCmd((gt) => {\n const entry = entries.get(handle.uid);\n if (entry) gt.display(entry.gptSlot);\n });\n },\n\n refresh(handles: ProviderHandle[], opts: RequestOptions) {\n gtCmd((gt) => {\n const gptSlots = handles\n .map((h) => entries.get(h.uid)?.gptSlot)\n .filter((s): s is GoogletagSlot => !!s);\n if (gptSlots.length) gt.pubads().refresh(gptSlots, { changeCorrelator: opts.changeCorrelator });\n });\n },\n\n destroy(handles: ProviderHandle[]) {\n gtCmd((gt) => {\n const gptSlots = handles\n .map((h) => entries.get(h.uid)?.gptSlot)\n .filter((s): s is GoogletagSlot => !!s);\n if (gptSlots.length && gt.destroySlots) gt.destroySlots(gptSlots);\n for (const h of handles) entries.delete(h.uid);\n });\n },\n\n onLifecycle(cb) {\n lifecycleCbs.push(cb);\n },\n };\n\n function findUidByElementId(elementId: string | undefined): string | undefined {\n if (!elementId) return undefined;\n for (const [uid, entry] of entries) {\n if (entry.planSlot.id === elementId) return uid;\n }\n return undefined;\n }\n}\n","/**\n * GA4 tag-path vendor (`kind:'analytics'`). Injects gtag.js via the single\n * TagInjector (allowlisted host) and calls `gtag('config', id)`. Consent Mode\n * defaults are set by Phase 4 BEFORE this loads (post-boot timing) — GA4 honors\n * them; we never fire before defaults exist.\n *\n * (Dir named `tag-path/` rather than `vendor/` per the repo's scout-ignore filter;\n * role is identical — the tag-path vendors from phase-03.)\n */\n\nimport type { ManagedTag } from \"@hientran0208/ads-manifest\";\nimport type { TagVendor, VendorContext, VendorKind } from \"../../core/registries/vendor-contract.js\";\nimport type { GtagFn } from \"../globals.js\";\n\nconst GTAG_HOST = \"www.googletagmanager.com\";\n\nexport function createGa4Vendor(win: Window = window): TagVendor {\n let initialized = false;\n\n function ensureGtag(): GtagFn {\n if (typeof win.gtag === \"function\") return win.gtag;\n win.dataLayer = win.dataLayer ?? [];\n const gtag: GtagFn = (...args: unknown[]) => {\n win.dataLayer!.push(args);\n };\n win.gtag = gtag;\n return gtag;\n }\n\n return {\n id: \"ga4\",\n kind: (): VendorKind => \"analytics\",\n init(tag: ManagedTag, ctx: VendorContext) {\n if (initialized) return; // idempotent\n const src = `https://${GTAG_HOST}/gtag/js?id=${encodeURIComponent(tag.id)}`;\n const ok = ctx.injector.inject(src, ctx.allowedHosts, { key: `ga4:${tag.id}` });\n if (!ok) return; // blocked host — error already emitted, no throw\n const gtag = ensureGtag();\n gtag(\"js\", new Date());\n gtag(\"config\", tag.id);\n initialized = true;\n ctx.bus.emit({ type: \"vendor:event\", vendor: \"ga4\", name: \"config\", payload: { id: tag.id } });\n },\n };\n}\n","/**\n * Meta Pixel tag-path vendor (`kind:'analytics'`). Injects fbevents.js via the\n * single TagInjector (allowlisted host), `fbq('init', pixelId)` + `fbq('track', …)`.\n * Each track emits a NORMALIZED event on the engine bus so a future CAPI forwarder\n * can subscribe (brainstorm §5 seam) — client-side Pixel only captures ~50-60%\n * under ATT; CAPI is P3-scope, no rework needed here.\n *\n * (Dir named `tag-path/` rather than `vendor/` per the repo's scout-ignore filter.)\n */\n\nimport type { ManagedTag } from \"@hientran0208/ads-manifest\";\nimport type { TagVendor, VendorContext, VendorKind } from \"../../core/registries/vendor-contract.js\";\nimport type { FbqFn } from \"../globals.js\";\n\nconst FB_HOST = \"connect.facebook.net\";\nconst FB_SRC = \"https://connect.facebook.net/en_US/fbevents.js\";\n\nexport function createMetaPixelVendor(win: Window = window): TagVendor {\n let initialized = false;\n\n /** Standard Meta Pixel bootstrap stub (queues calls until fbevents.js loads). */\n function ensureFbq(): FbqFn {\n if (typeof win.fbq === \"function\") return win.fbq;\n const fbq = function (this: unknown, ...args: unknown[]) {\n if (fbq.callMethod) fbq.callMethod(...args);\n else fbq.queue!.push(args);\n } as FbqFn;\n fbq.queue = [];\n fbq.loaded = true;\n fbq.version = \"2.0\";\n win.fbq = fbq;\n win._fbq = win._fbq ?? fbq;\n return fbq;\n }\n\n return {\n id: \"meta-pixel\",\n kind: (): VendorKind => \"analytics\",\n init(tag: ManagedTag, ctx: VendorContext) {\n if (initialized) return; // idempotent\n const ok = ctx.injector.inject(FB_SRC, ctx.allowedHosts, { key: `meta-pixel:${tag.id}` });\n if (!ok) return; // blocked host — error already emitted, no throw\n const fbq = ensureFbq();\n fbq(\"init\", tag.id);\n track(ctx, fbq, \"PageView\");\n initialized = true;\n },\n };\n\n /** Fire a Pixel event AND mirror it as a normalized bus event (CAPI seam). */\n function track(ctx: VendorContext, fbq: FbqFn, event: string, payload?: Record<string, unknown>): void {\n fbq(\"track\", event, payload);\n ctx.bus.emit({ type: \"vendor:event\", vendor: \"meta-pixel\", name: event, payload });\n }\n}\n","/**\n * Isolates ALL `gtag('consent', …)` interaction (Google Consent Mode v2). Two jobs:\n * 1. `setDefaults` — conservative defaults set SYNCHRONOUSLY before any vendor or\n * gpt.js load. No CMP read required, so the Approach C fast-path never stalls on\n * an async/absent `__tcfapi` (red-team #4).\n * 2. `update` — called asynchronously once the CMP signal is read.\n */\n\nimport type { ConsentModeSignals } from \"@hientran0208/ads-manifest\";\n\ntype GtagFn = (...args: unknown[]) => void;\n\ninterface GtagHost {\n dataLayer?: unknown[];\n gtag?: GtagFn;\n}\n\n/** Ensure a `gtag` shim + dataLayer exist (the standard Google bootstrap). */\nfunction ensureGtag(host: GtagHost): GtagFn {\n if (typeof host.gtag === \"function\") return host.gtag;\n host.dataLayer = host.dataLayer ?? [];\n const gtag: GtagFn = (...args: unknown[]) => {\n host.dataLayer!.push(args);\n };\n host.gtag = gtag;\n return gtag;\n}\n\nexport interface ConsentMode {\n setDefaults(signals: ConsentModeSignals): void;\n update(signals: ConsentModeSignals): void;\n defaultsSet(): boolean;\n}\n\nexport function createConsentMode(host: GtagHost = window as unknown as GtagHost): ConsentMode {\n let defaultsApplied = false;\n\n return {\n defaultsSet: () => defaultsApplied,\n setDefaults(signals) {\n const gtag = ensureGtag(host);\n gtag(\"consent\", \"default\", { ...signals, wait_for_update: 500 });\n defaultsApplied = true;\n },\n update(signals) {\n const gtag = ensureGtag(host);\n gtag(\"consent\", \"update\", { ...signals });\n },\n };\n}\n","/**\n * Isolates ALL `__tcfapi` interaction (IAB TCF). Mockable. Subscribes via\n * `addEventListener`, surfaces purpose consents, and falls back to conservative\n * deny if the CMP never responds within the timeout. v1 reads the boolean purpose\n * signals `__tcfapi` exposes — NO raw TC-string parsing (staged to P3).\n */\n\nimport type { PurposeConsents } from \"./tcf-purpose-signal-map.js\";\n\n/** Minimal shape of the TCF `tcData` payload we consume. */\nexport interface TcData {\n eventStatus?: \"tcloaded\" | \"cmpuishown\" | \"useractioncomplete\" | string;\n gdprApplies?: boolean;\n purpose?: { consents?: PurposeConsents };\n}\n\nexport type TcfApi = (\n command: \"addEventListener\" | \"removeEventListener\" | \"getTCData\",\n version: number,\n callback: (tcData: TcData, success: boolean) => void,\n listenerId?: number,\n) => void;\n\ninterface TcfHost {\n __tcfapi?: TcfApi;\n}\n\nexport interface TcfBridge {\n /** Subscribe to CMP consent changes. Fires for each `useractioncomplete`/`tcloaded`. */\n onConsent(cb: (consents: PurposeConsents, applies: boolean) => void): void;\n /** True if a `__tcfapi` is present on the page. */\n present(): boolean;\n}\n\nexport interface TcfBridgeOptions {\n /** Ms to wait for the first CMP event before invoking the timeout fallback. */\n timeoutMs?: number;\n /** Called if the CMP never responds (keep conservative deny). */\n onTimeout?: () => void;\n setTimeoutFn?: typeof setTimeout;\n}\n\nconst READY_STATUSES = new Set([\"tcloaded\", \"useractioncomplete\"]);\n\nexport function createTcfBridge(\n host: TcfHost = window as unknown as TcfHost,\n opts: TcfBridgeOptions = {},\n): TcfBridge {\n const api = host.__tcfapi;\n const setTimeoutFn = opts.setTimeoutFn ?? setTimeout;\n\n return {\n present: () => typeof api === \"function\",\n onConsent(cb) {\n if (typeof api !== \"function\") {\n // No CMP — caller keeps conservative defaults. Fire timeout fallback path.\n opts.onTimeout?.();\n return;\n }\n let fired = false;\n const timer = setTimeoutFn(() => {\n if (!fired) opts.onTimeout?.();\n }, opts.timeoutMs ?? 2000);\n\n api(\"addEventListener\", 2, (tcData, success) => {\n if (!success || !tcData) return;\n if (!tcData.eventStatus || READY_STATUSES.has(tcData.eventStatus)) {\n fired = true;\n clearTimeout(timer as unknown as number);\n cb(tcData.purpose?.consents ?? {}, tcData.gdprApplies ?? true);\n }\n });\n },\n };\n}\n","/**\n * THE deliverable (red-team #3): the explicit IAB TCF v2.2 purpose →\n * Consent-Mode-v2 signal mapping. TCF purposes do NOT map 1:1 to the four signals.\n * This table is spec-driven and CMP-agnostic — built to the standard, smoke-tested\n * against Cookiebot in P8, with the `__tcfapi` stub authoritative for acceptance.\n *\n * TCF v2.2 purposes (subset relevant to Google Consent Mode):\n * P1 Store and/or access information on a device → storage\n * P2 Use limited data to select advertising\n * P3 Create profiles for personalised advertising → ad personalization\n * P4 Use profiles to select personalised advertising → ad personalization\n * P7 Measure advertising performance → ad user data (measurement)\n * P8 Measure content performance → analytics\n *\n * Google Consent Mode v2 signals:\n * ad_storage ← P1 (device storage for ads)\n * analytics_storage ← P1 (device storage for analytics)\n * ad_user_data ← P1 AND P7 (sending user data for ad measurement)\n * ad_personalization ← P3 AND P4 (personalised advertising)\n */\n\nimport type { ConsentModeSignals, ConsentSignalState } from \"@hientran0208/ads-manifest\";\n\n/** Per-purpose consent booleans as exposed by `__tcfapi` (`tcData.purpose.consents`). */\nexport type PurposeConsents = Record<number, boolean>;\n\nfunction state(granted: boolean): ConsentSignalState {\n return granted ? \"granted\" : \"denied\";\n}\n\nconst g = (p: PurposeConsents, n: number): boolean => p[n] === true;\n\n/**\n * Map TCF purpose consents to the four Consent Mode v2 signals. Conservative:\n * an absent/false purpose yields `denied`.\n */\nexport function purposesToSignals(consents: PurposeConsents): ConsentModeSignals {\n return {\n ad_storage: state(g(consents, 1)),\n analytics_storage: state(g(consents, 1)),\n ad_user_data: state(g(consents, 1) && g(consents, 7)),\n ad_personalization: state(g(consents, 3) && g(consents, 4)),\n };\n}\n","/**\n * Pure signals → per-vendor allow/deny decision. Unit-tested without any globals.\n * One snapshot gates BOTH paths: GPT (render) and GA4/Pixel (tag) all derive from\n * the same Consent Mode signals.\n */\n\nimport type { ConsentModeSignals } from \"@hientran0208/ads-manifest\";\nimport type { VendorConsentId } from \"../core/consent-gate-contract.js\";\n\n/**\n * v1 decision rules (conservative):\n * - gpt → needs `ad_storage` (serve personalised/standard ads).\n * - ga4 → needs `analytics_storage`.\n * - meta-pixel → needs `ad_storage` (sets ad cookies / user data).\n *\n * Restricted/limited-ads mode (serving non-personalised under denied storage) is a\n * P3 refinement; v1 gates the request outright when storage is denied.\n */\nexport function vendorAllowed(\n vendor: VendorConsentId,\n signals: ConsentModeSignals,\n): boolean {\n switch (vendor) {\n case \"gpt\":\n return signals.ad_storage === \"granted\";\n case \"ga4\":\n return signals.analytics_storage === \"granted\";\n case \"meta-pixel\":\n return signals.ad_storage === \"granted\";\n default:\n // Unknown vendor: gate by ad_storage as the safe default.\n return signals.ad_storage === \"granted\";\n }\n}\n\n/** Build a per-vendor decision map for the known v1 vendors. */\nexport function vendorDecisionMap(\n signals: ConsentModeSignals,\n): Record<\"gpt\" | \"ga4\" | \"meta-pixel\", boolean> {\n return {\n gpt: vendorAllowed(\"gpt\", signals),\n ga4: vendorAllowed(\"ga4\", signals),\n \"meta-pixel\": vendorAllowed(\"meta-pixel\", signals),\n };\n}\n","/**\n * The real `ConsentGate` (P2 contract). Orchestrates: synchronous conservative\n * Consent Mode defaults → async CMP read via the TCF bridge → `gtag consent update`\n * → per-vendor decision via the matrix → notify subscribers so the engine arms\n * previously-gated vendors AND re-requests already-defined GPT slots.\n *\n * Require client CMP — no bundled banner (locked decision; P3 seam).\n */\n\nimport {\n type ConsentConfig,\n type ConsentModeSignals,\n CONSERVATIVE_CONSENT_DEFAULTS,\n} from \"@hientran0208/ads-manifest\";\nimport type {\n ConsentGate,\n ConsentSnapshot,\n VendorConsentId,\n} from \"../core/consent-gate-contract.js\";\nimport type { EventBus } from \"../core/event-bus.js\";\nimport { createConsentMode, type ConsentMode } from \"./consent-mode.js\";\nimport { createTcfBridge, type TcfBridge } from \"./tcf-bridge.js\";\nimport { purposesToSignals } from \"./tcf-purpose-signal-map.js\";\nimport { vendorAllowed } from \"./vendor-map.js\";\n\nexport interface ConsentGateDeps {\n config?: ConsentConfig;\n bus?: EventBus;\n consentMode?: ConsentMode;\n tcfBridge?: TcfBridge;\n}\n\nfunction snapshotFor(signals: ConsentModeSignals, resolved: boolean): ConsentSnapshot {\n return {\n signals,\n resolved,\n allows: (vendor: VendorConsentId) => vendorAllowed(vendor, signals),\n };\n}\n\nexport function createConsentGate(deps: ConsentGateDeps = {}): ConsentGate {\n const config = deps.config ?? {};\n const consentMode = deps.consentMode ?? createConsentMode();\n const tcfBridge =\n deps.tcfBridge ?? createTcfBridge(undefined, { timeoutMs: config.cmpTimeoutMs ?? 2000 });\n\n // Defaults: conservative unless the manifest explicitly assumes granted.\n const defaults: ConsentModeSignals = config.defaults ?? CONSERVATIVE_CONSENT_DEFAULTS;\n let current = snapshotFor(defaults, false);\n const listeners = new Set<(s: ConsentSnapshot) => void>();\n let started = false;\n\n // Synchronous, before any vendor/gpt.js load — never blocks the fast-path.\n consentMode.setDefaults(defaults);\n\n function applySignals(signals: ConsentModeSignals): void {\n current = snapshotFor(signals, true);\n consentMode.update(signals);\n deps.bus?.emit({ type: \"consent:changed\", signals });\n for (const l of [...listeners]) l(current);\n }\n\n return {\n snapshot: () => current,\n onChange(cb) {\n listeners.add(cb);\n return () => listeners.delete(cb);\n },\n start() {\n if (started) return; // idempotent\n started = true;\n tcfBridge.onConsent((consents) => {\n applySignals(purposesToSignals(consents));\n });\n },\n };\n}\n","/**\n * Single assembly point used by ALL three public surfaces (IIFE / imperative /\n * React) so dual-load behavior and wiring are identical everywhere (DRY). Registers\n * the GPT provider + GA4/Meta-Pixel vendors + real ConsentGate into one engine.\n *\n * Two entry points: from a manifest (static fast-path) or from just a consent config\n * (Approach-C placement path, where the plan arrives later from `/placement`).\n */\n\nimport { type ConsentConfig, type Manifest, plan, type PlanContext } from \"@hientran0208/ads-manifest\";\nimport { createAdsEngine, type AdsEngine } from \"../core/ads-engine.js\";\nimport { createEventBus, type EventBus } from \"../core/event-bus.js\";\nimport { createProviderRegistry } from \"../core/registries/provider-registry.js\";\nimport { createAdapterSlotRegistry } from \"../core/registries/adapter-slot-registry.js\";\nimport { createTagInjector } from \"../inject/tag-injector.js\";\nimport { createGptProvider } from \"../adapters/provider/gpt/index.js\";\nimport { createGa4Vendor } from \"../adapters/tag-path/ga4.js\";\nimport { createMetaPixelVendor } from \"../adapters/tag-path/meta-pixel.js\";\nimport { createConsentGate } from \"../consent/consent-gate.js\";\n\nexport interface AssembledEngine {\n engine: AdsEngine;\n bus: EventBus;\n}\n\nexport interface WireOptions {\n win?: Window;\n doc?: Document;\n bus?: EventBus;\n}\n\ninterface BuildArgs extends WireOptions {\n /** Allowlisted hosts for gpt.js. Omit → provider uses its default GPT host. */\n allowedHosts?: string[];\n consent?: ConsentConfig;\n}\n\n/** Shared builder: wire registries + injector + consent gate into one engine. */\nfunction buildEngine(args: BuildArgs): AssembledEngine {\n const win = args.win ?? (typeof window !== \"undefined\" ? window : undefined);\n const doc = args.doc ?? (typeof document !== \"undefined\" ? document : undefined);\n const bus = args.bus ?? createEventBus();\n const injector = doc ? createTagInjector(bus, doc) : undefined;\n\n const providerRegistry = createProviderRegistry();\n if (injector) {\n providerRegistry.register(\n createGptProvider({ bus, injector, ...(args.allowedHosts ? { allowedHosts: args.allowedHosts } : {}), win }),\n );\n }\n\n const adapterRegistry = createAdapterSlotRegistry();\n if (win) {\n adapterRegistry.register(\"ga4\", createGa4Vendor(win));\n adapterRegistry.register(\"meta-pixel\", createMetaPixelVendor(win));\n }\n\n const consentGate = createConsentGate({ ...(args.consent ? { config: args.consent } : {}), bus });\n\n const engine = createAdsEngine({ providerRegistry, adapterRegistry, consentGate, injector, bus, win, doc });\n return { engine, bus };\n}\n\n/** Build a wired (not booted) engine for a manifest + context (static fast-path). */\nexport function assembleEngine(\n manifest: Manifest,\n ctx: PlanContext,\n opts: WireOptions = {},\n): AssembledEngine {\n // The plan's allowedTagHosts drives the single TagInjector allowlist (incl. gpt.js).\n const allowedHosts = plan(manifest, ctx).allowedTagHosts;\n return buildEngine({ allowedHosts, ...(manifest.consent ? { consent: manifest.consent } : {}), ...opts });\n}\n\n/**\n * Build a wired engine for the Approach-C placement path — no manifest. The plan\n * (and its allowedTagHosts) arrives later from `/placement`; vendors read the\n * allowlist from that plan at arm time, and gpt.js uses the provider's default host.\n */\nexport function assembleEngineForPlacement(\n consent: ConsentConfig | undefined,\n opts: WireOptions = {},\n): AssembledEngine {\n return buildEngine({ ...(consent ? { consent } : {}), ...opts });\n}\n","/**\n * Imperative public surface: `createAdsClient({...})` → `await ads.init()`. Thin,\n * idempotent wrapper over the assembled engine. Double-init is safe.\n *\n * Two modes:\n * - **manifest** (static fast-path): pass `{ manifest }`.\n * - **placement** (Approach C, publisher pages — no auth): pass\n * `{ placement: { endpoint?, siteUuid } }`; init() POSTs to the public\n * `/placement` endpoint and boots from the returned plan. Drive consent with the\n * optional `consent` config (or a CMP on the page).\n */\n\nimport type {\n ConsentConfig,\n DynamicParams,\n Manifest,\n PlanContext,\n RenderPlan,\n} from \"@hientran0208/ads-manifest\";\nimport type { EngineEvent } from \"../core/event-bus.js\";\nimport type { RefreshOptions } from \"../core/ads-engine.js\";\nimport {\n assembleEngine,\n assembleEngineForPlacement,\n type WireOptions,\n} from \"./wire-engine.js\";\n\nexport interface PlacementSource {\n /** Public placement endpoint. Defaults to same-origin `/placement`. */\n endpoint?: string;\n siteUuid: string;\n}\n\nexport interface AdsClientConfig {\n /** Static fast-path: the inlined manifest. */\n manifest?: Manifest;\n /** Approach-C path: fetch the plan from `/placement` for this site. */\n placement?: PlacementSource;\n /** Consent config for the placement path (manifest mode reads manifest.consent). */\n consent?: ConsentConfig;\n /** Page context; defaults to the live window URL + viewport. */\n context?: Partial<PlanContext>;\n wire?: WireOptions;\n}\n\nexport interface AdsClient {\n init(): Promise<void>;\n showAds(id?: string): void;\n setPageParams(p: DynamicParams): void;\n setSlotParams(id: string, p: DynamicParams): void;\n refresh(ids: string[] | null, opts?: RefreshOptions): void;\n display(id: string): void;\n destroy(): void;\n on(type: EngineEvent[\"type\"], handler: (ev: EngineEvent) => void): () => void;\n getExecutedPlan(): RenderPlan | null;\n}\n\nfunction resolveContext(partial: Partial<PlanContext> | undefined, win?: Window): PlanContext {\n const w = win ?? (typeof window !== \"undefined\" ? window : undefined);\n return {\n url: partial?.url ?? w?.location?.href ?? \"\",\n viewport: partial?.viewport ?? { w: w?.innerWidth ?? 1280, h: w?.innerHeight ?? 800 },\n ...(partial?.dynamic ? { dynamic: partial.dynamic } : {}),\n };\n}\n\nasync function fetchPlacement(src: PlacementSource, ctx: PlanContext): Promise<RenderPlan> {\n const endpoint = src.endpoint ?? \"/placement\";\n const res = await fetch(endpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ siteUuid: src.siteUuid, context: ctx }),\n });\n if (!res.ok) throw new Error(`placement ${res.status}`);\n const data = (await res.json()) as { plan: RenderPlan };\n return data.plan;\n}\n\nexport function createAdsClient(config: AdsClientConfig): AdsClient {\n const ctx = resolveContext(config.context, config.wire?.win);\n const wire = config.wire ?? {};\n\n // Assemble the engine for the chosen mode.\n const { engine } =\n config.manifest !== undefined\n ? assembleEngine(config.manifest, ctx, wire)\n : assembleEngineForPlacement(config.consent, wire);\n\n let booted = false;\n\n return {\n async init() {\n if (booted) return; // idempotent\n if (config.manifest !== undefined) {\n engine.init(config.manifest, ctx);\n } else if (config.placement) {\n const plan = await fetchPlacement(config.placement, ctx);\n engine.initFromPlan(plan, ctx);\n } else {\n throw new Error(\"createAdsClient: provide `manifest` or `placement`\");\n }\n booted = true;\n },\n showAds(id) {\n if (id) engine.display(id);\n },\n setPageParams: (p) => engine.setPageParams(p),\n setSlotParams: (id, p) => engine.setSlotParams(id, p),\n refresh: (ids, opts) => engine.refresh(ids, opts),\n display: (id) => engine.display(id),\n destroy: () => {\n engine.destroy();\n booted = false;\n },\n on: (type, handler) => engine.on(type, handler),\n getExecutedPlan: () => engine.getExecutedPlan(),\n };\n}\n","/**\n * Script-tag (IIFE) surface. Exposes `window.AdsSDK` with a `cmd.push(...)`\n * stub-queue: calls made before boot are queued, then drained in order once the\n * client initializes. Auto-boot reads an inlined manifest + `data-*` intent markup.\n */\n\nimport type { ConsentConfig, DynamicParams, Manifest, PlanContext } from \"@hientran0208/ads-manifest\";\nimport { createAdsClient, type AdsClient, type PlacementSource } from \"./ads-client.js\";\n\nexport interface AdsSdkInitConfig {\n /** Static fast-path: inlined manifest. */\n manifest?: Manifest;\n /** Approach-C path: fetch the plan from the public `/placement` endpoint. */\n placement?: PlacementSource;\n consent?: ConsentConfig;\n context?: Partial<PlanContext>;\n}\n\nexport interface AdsSdkGlobal {\n cmd: { push: (fn: (client: AdsClient) => void) => void };\n init(config: AdsSdkInitConfig): Promise<void>;\n client?: AdsClient;\n}\n\n/** Parse `data-*` intent attributes from the booting <script> element. */\nexport function parseDataIntent(el: Element | null): { dynamic: DynamicParams; pageUrl?: string } {\n const dynamic: DynamicParams = {};\n if (!el) return { dynamic };\n const get = (name: string) => el.getAttribute(name);\n\n const targeting = get(\"data-targeting\");\n if (targeting) {\n try {\n dynamic.targeting = JSON.parse(targeting);\n } catch {\n /* loose: ignore malformed targeting */\n }\n }\n const ppid = get(\"data-ppid\");\n if (ppid) dynamic.ppid = ppid;\n const pageUrl = get(\"data-page-url\");\n if (pageUrl) dynamic.pageUrl = pageUrl;\n const privacy = get(\"data-privacy\");\n if (privacy) {\n try {\n dynamic.privacy = JSON.parse(privacy);\n } catch {\n /* ignore */\n }\n }\n const cc = get(\"data-change-correlator\");\n if (cc != null) dynamic.changeCorrelator = cc === \"true\";\n\n return { dynamic, ...(pageUrl ? { pageUrl } : {}) };\n}\n\n/**\n * Install `window.AdsSDK`. Idempotent — a second install reuses the existing global\n * (the engine's own page guard still prevents a second boot).\n */\nexport function installAdsSdk(win: Window = window): AdsSdkGlobal {\n const existing = (win as unknown as { AdsSDK?: AdsSdkGlobal | { cmd?: unknown } }).AdsSDK;\n if (existing && (existing as AdsSdkGlobal).client) return existing as AdsSdkGlobal;\n\n // A page may pre-stub `window.AdsSDK = { cmd: [] }` (array) and push commands\n // before this IIFE loads; capture them to drain after init, in order.\n const preStubbed = existing?.cmd;\n const queued: Array<(client: AdsClient) => void> = Array.isArray(preStubbed)\n ? [...(preStubbed as Array<(c: AdsClient) => void>)]\n : [];\n\n const api: AdsSdkGlobal = {\n cmd: {\n push(fn) {\n if (api.client) fn(api.client);\n else queued.push(fn);\n },\n },\n async init(config) {\n const scriptEl = win.document?.currentScript ?? win.document?.querySelector(\"script[data-ads-sdk]\");\n const intent = parseDataIntent(scriptEl);\n const context: Partial<PlanContext> = {\n ...(config.context ?? {}),\n dynamic: { ...(config.context?.dynamic ?? {}), ...intent.dynamic },\n };\n const client = createAdsClient({\n ...(config.manifest !== undefined ? { manifest: config.manifest } : {}),\n ...(config.placement ? { placement: config.placement } : {}),\n ...(config.consent ? { consent: config.consent } : {}),\n context,\n wire: { win },\n });\n await client.init();\n api.client = client;\n // Drain any pre-init queued commands in order.\n for (const fn of queued.splice(0)) fn(client);\n },\n };\n\n (win as unknown as { AdsSDK?: AdsSdkGlobal }).AdsSDK = api;\n return api;\n}\n","/**\n * IIFE entry — the CDN artifact. Installs `window.AdsSDK` immediately so a page can\n * `AdsSDK.cmd.push(...)` and `AdsSDK.init({manifest})`. Side-effectful by design\n * (this entry is excluded from the package's `sideEffects:false` tree-shaking).\n */\n\nimport { installAdsSdk } from \"./wrappers/iife-boot.js\";\n\nif (typeof window !== \"undefined\") {\n installAdsSdk(window);\n}\n\nexport { installAdsSdk } from \"./wrappers/iife-boot.js\";\n"]}
|