@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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../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/core/telemetry-sink.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/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/wrappers/wire-engine.ts","../src/wrappers/ads-client.ts","../src/wrappers/iife-boot.ts"],"names":["OOP_FORMATS","isDomainAllowed","normalize","plan","CONSERVATIVE_CONSENT_DEFAULTS","ensureGtag"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\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 * Telemetry seam — subscribes to the event bus and forwards normalized events to a\n * sink. No-op in v1 (the sink does nothing); the seam exists so a reporting backend\n * (P3) can subscribe without engine changes.\n */\n\nimport type { EngineEvent, EventBus } from \"./event-bus.js\";\n\nexport type TelemetrySink = (ev: EngineEvent) => void;\n\nconst noopSink: TelemetrySink = () => {};\n\n/** Wire a sink to the bus. Returns an unsubscribe for all event types. */\nexport function attachTelemetry(bus: EventBus, sink: TelemetrySink = noopSink): () => void {\n const types: EngineEvent[\"type\"][] = [\n \"slot:registered\",\n \"slot:requested\",\n \"slot:rendered\",\n \"slot:empty\",\n \"slot:destroyed\",\n \"consent:changed\",\n \"tag:injected\",\n \"vendor:event\",\n \"error\",\n \"warning\",\n ];\n const unsubs = types.map((t) => bus.on(t, (ev) => sink(ev as EngineEvent)));\n return () => unsubs.forEach((u) => u());\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 * 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 * 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"]}
@@ -0,0 +1,256 @@
1
+ import { P as ProviderHandle, E as EngineEvent, a as EventBus, C as ConsentGate, V as VendorConsentId, T as TagInjector, R as RenderProvider, b as TagVendor, A as AdsClient, c as PlacementSource } from './ads-client-BVlLFVQU.cjs';
2
+ export { d as AdapterSlotRegistry, e as AdsClientConfig, f as AdsEngine, g as AdsEngineDeps, h as AssembledEngine, B as BOOT_SPINE, i as BootStep, j as ConsentSnapshot, k as EngineEventType, I as InjectOptions, L as LazyObserver, l as ProviderLifecycleEvent, m as ProviderRegistry, n as RefreshOptions, o as RequestOptions, p as VendorContext, q as VendorKind, W as WireOptions, r as assembleEngine, s as assembleEngineForPlacement, t as createAdapterSlotRegistry, u as createAdsClient, v as createAdsEngine, w as createAllowAllConsentGate, x as createEventBus, y as createLazyObserver, z as createProviderRegistry, D as createTagInjector } from './ads-client-BVlLFVQU.cjs';
3
+ import { SlotFormat, PlanSlot, ConsentModeSignals, ConsentConfig, Manifest, PlanContext, DynamicParams } from '@hientran0208/ads-manifest';
4
+
5
+ /**
6
+ * Capability lookup table: how each format is requested. Pure routing — it asks the
7
+ * registry to resolve and classifies the format; it NEVER calls googletag.
8
+ *
9
+ * - display/native → div path, eager/lazy, rides the batched request.
10
+ * - anchor/side-rail/oop → no-div path, no sizes; ride the batch.
11
+ * - interstitial → no-div, on-demand display, NOT in the eager batch, never refresh.
12
+ */
13
+
14
+ interface DispatchTraits {
15
+ /** Has a div in the DOM (display/native) vs out-of-page. */
16
+ usesDiv: boolean;
17
+ /** Eligible for the batched eager request (Single Request Architecture). */
18
+ ridesEagerBatch: boolean;
19
+ /** On-demand display only (interstitial). */
20
+ onDemandOnly: boolean;
21
+ /** May be refreshed in-page. */
22
+ refreshable: boolean;
23
+ }
24
+ declare function dispatchTraits(format: SlotFormat): DispatchTraits;
25
+
26
+ /**
27
+ * Epoch-keyed slot lifecycle state machine. The epoch key prevents a stale render
28
+ * callback (fired after an SPA nav) from reporting to the wrong/new slot
29
+ * (sdk-sample high-risk). Illegal transitions are rejected.
30
+ *
31
+ * registered → gated → requested → rendered → (refreshed → requested) | destroyed
32
+ */
33
+
34
+ type SlotState = "registered" | "gated" | "requested" | "rendered" | "destroyed";
35
+ interface SlotRecord {
36
+ slot: PlanSlot;
37
+ handle: ProviderHandle | null;
38
+ state: SlotState;
39
+ /** Monotonic epoch; bumped on new page view. Stale callbacks are ignored. */
40
+ epoch: number;
41
+ }
42
+ interface SlotLifecycle {
43
+ register(slot: PlanSlot, epoch: number): SlotRecord;
44
+ get(uid: string): SlotRecord | undefined;
45
+ all(): SlotRecord[];
46
+ /** Attempt a transition; returns false (no-op) if illegal. */
47
+ transition(uid: string, to: SlotState): boolean;
48
+ attachHandle(uid: string, handle: ProviderHandle | null): void;
49
+ /** True if the uid exists AND its epoch matches (callback not stale). */
50
+ isCurrent(uid: string, epoch: number): boolean;
51
+ destroyAll(): void;
52
+ }
53
+ declare function createSlotLifecycle(): SlotLifecycle;
54
+
55
+ /**
56
+ * Telemetry seam — subscribes to the event bus and forwards normalized events to a
57
+ * sink. No-op in v1 (the sink does nothing); the seam exists so a reporting backend
58
+ * (P3) can subscribe without engine changes.
59
+ */
60
+
61
+ type TelemetrySink = (ev: EngineEvent) => void;
62
+ /** Wire a sink to the bus. Returns an unsubscribe for all event types. */
63
+ declare function attachTelemetry(bus: EventBus, sink?: TelemetrySink): () => void;
64
+
65
+ /**
66
+ * Isolates ALL `gtag('consent', …)` interaction (Google Consent Mode v2). Two jobs:
67
+ * 1. `setDefaults` — conservative defaults set SYNCHRONOUSLY before any vendor or
68
+ * gpt.js load. No CMP read required, so the Approach C fast-path never stalls on
69
+ * an async/absent `__tcfapi` (red-team #4).
70
+ * 2. `update` — called asynchronously once the CMP signal is read.
71
+ */
72
+
73
+ type GtagFn = (...args: unknown[]) => void;
74
+ interface GtagHost {
75
+ dataLayer?: unknown[];
76
+ gtag?: GtagFn;
77
+ }
78
+ interface ConsentMode {
79
+ setDefaults(signals: ConsentModeSignals): void;
80
+ update(signals: ConsentModeSignals): void;
81
+ defaultsSet(): boolean;
82
+ }
83
+ declare function createConsentMode(host?: GtagHost): ConsentMode;
84
+
85
+ /**
86
+ * THE deliverable (red-team #3): the explicit IAB TCF v2.2 purpose →
87
+ * Consent-Mode-v2 signal mapping. TCF purposes do NOT map 1:1 to the four signals.
88
+ * This table is spec-driven and CMP-agnostic — built to the standard, smoke-tested
89
+ * against Cookiebot in P8, with the `__tcfapi` stub authoritative for acceptance.
90
+ *
91
+ * TCF v2.2 purposes (subset relevant to Google Consent Mode):
92
+ * P1 Store and/or access information on a device → storage
93
+ * P2 Use limited data to select advertising
94
+ * P3 Create profiles for personalised advertising → ad personalization
95
+ * P4 Use profiles to select personalised advertising → ad personalization
96
+ * P7 Measure advertising performance → ad user data (measurement)
97
+ * P8 Measure content performance → analytics
98
+ *
99
+ * Google Consent Mode v2 signals:
100
+ * ad_storage ← P1 (device storage for ads)
101
+ * analytics_storage ← P1 (device storage for analytics)
102
+ * ad_user_data ← P1 AND P7 (sending user data for ad measurement)
103
+ * ad_personalization ← P3 AND P4 (personalised advertising)
104
+ */
105
+
106
+ /** Per-purpose consent booleans as exposed by `__tcfapi` (`tcData.purpose.consents`). */
107
+ type PurposeConsents = Record<number, boolean>;
108
+ /**
109
+ * Map TCF purpose consents to the four Consent Mode v2 signals. Conservative:
110
+ * an absent/false purpose yields `denied`.
111
+ */
112
+ declare function purposesToSignals(consents: PurposeConsents): ConsentModeSignals;
113
+
114
+ /**
115
+ * Isolates ALL `__tcfapi` interaction (IAB TCF). Mockable. Subscribes via
116
+ * `addEventListener`, surfaces purpose consents, and falls back to conservative
117
+ * deny if the CMP never responds within the timeout. v1 reads the boolean purpose
118
+ * signals `__tcfapi` exposes — NO raw TC-string parsing (staged to P3).
119
+ */
120
+
121
+ /** Minimal shape of the TCF `tcData` payload we consume. */
122
+ interface TcData {
123
+ eventStatus?: "tcloaded" | "cmpuishown" | "useractioncomplete" | string;
124
+ gdprApplies?: boolean;
125
+ purpose?: {
126
+ consents?: PurposeConsents;
127
+ };
128
+ }
129
+ type TcfApi = (command: "addEventListener" | "removeEventListener" | "getTCData", version: number, callback: (tcData: TcData, success: boolean) => void, listenerId?: number) => void;
130
+ interface TcfHost {
131
+ __tcfapi?: TcfApi;
132
+ }
133
+ interface TcfBridge {
134
+ /** Subscribe to CMP consent changes. Fires for each `useractioncomplete`/`tcloaded`. */
135
+ onConsent(cb: (consents: PurposeConsents, applies: boolean) => void): void;
136
+ /** True if a `__tcfapi` is present on the page. */
137
+ present(): boolean;
138
+ }
139
+ interface TcfBridgeOptions {
140
+ /** Ms to wait for the first CMP event before invoking the timeout fallback. */
141
+ timeoutMs?: number;
142
+ /** Called if the CMP never responds (keep conservative deny). */
143
+ onTimeout?: () => void;
144
+ setTimeoutFn?: typeof setTimeout;
145
+ }
146
+ declare function createTcfBridge(host?: TcfHost, opts?: TcfBridgeOptions): TcfBridge;
147
+
148
+ /**
149
+ * The real `ConsentGate` (P2 contract). Orchestrates: synchronous conservative
150
+ * Consent Mode defaults → async CMP read via the TCF bridge → `gtag consent update`
151
+ * → per-vendor decision via the matrix → notify subscribers so the engine arms
152
+ * previously-gated vendors AND re-requests already-defined GPT slots.
153
+ *
154
+ * Require client CMP — no bundled banner (locked decision; P3 seam).
155
+ */
156
+
157
+ interface ConsentGateDeps {
158
+ config?: ConsentConfig;
159
+ bus?: EventBus;
160
+ consentMode?: ConsentMode;
161
+ tcfBridge?: TcfBridge;
162
+ }
163
+ declare function createConsentGate(deps?: ConsentGateDeps): ConsentGate;
164
+
165
+ /**
166
+ * Pure signals → per-vendor allow/deny decision. Unit-tested without any globals.
167
+ * One snapshot gates BOTH paths: GPT (render) and GA4/Pixel (tag) all derive from
168
+ * the same Consent Mode signals.
169
+ */
170
+
171
+ /**
172
+ * v1 decision rules (conservative):
173
+ * - gpt → needs `ad_storage` (serve personalised/standard ads).
174
+ * - ga4 → needs `analytics_storage`.
175
+ * - meta-pixel → needs `ad_storage` (sets ad cookies / user data).
176
+ *
177
+ * Restricted/limited-ads mode (serving non-personalised under denied storage) is a
178
+ * P3 refinement; v1 gates the request outright when storage is denied.
179
+ */
180
+ declare function vendorAllowed(vendor: VendorConsentId, signals: ConsentModeSignals): boolean;
181
+ /** Build a per-vendor decision map for the known v1 vendors. */
182
+ declare function vendorDecisionMap(signals: ConsentModeSignals): Record<"gpt" | "ga4" | "meta-pixel", boolean>;
183
+
184
+ /**
185
+ * GPT render-path provider — implements the neutral `RenderProvider` contract. Every
186
+ * googletag call goes through `cmd.push` (gpt.js may not be loaded yet). Slots are
187
+ * null-guarded. PPID is set before the request; targeting/privacy via the Config API.
188
+ * gpt.js itself loads through the single TagInjector (allowlisted host).
189
+ */
190
+
191
+ interface GptProviderDeps {
192
+ bus: EventBus;
193
+ injector?: TagInjector;
194
+ /** Allowlisted hosts (from plan.allowedTagHosts) used to load gpt.js. */
195
+ allowedHosts?: string[];
196
+ win?: Window;
197
+ }
198
+ declare function createGptProvider(deps: GptProviderDeps): RenderProvider;
199
+
200
+ /**
201
+ * GA4 tag-path vendor (`kind:'analytics'`). Injects gtag.js via the single
202
+ * TagInjector (allowlisted host) and calls `gtag('config', id)`. Consent Mode
203
+ * defaults are set by Phase 4 BEFORE this loads (post-boot timing) — GA4 honors
204
+ * them; we never fire before defaults exist.
205
+ *
206
+ * (Dir named `tag-path/` rather than `vendor/` per the repo's scout-ignore filter;
207
+ * role is identical — the tag-path vendors from phase-03.)
208
+ */
209
+
210
+ declare function createGa4Vendor(win?: Window): TagVendor;
211
+
212
+ /**
213
+ * Meta Pixel tag-path vendor (`kind:'analytics'`). Injects fbevents.js via the
214
+ * single TagInjector (allowlisted host), `fbq('init', pixelId)` + `fbq('track', …)`.
215
+ * Each track emits a NORMALIZED event on the engine bus so a future CAPI forwarder
216
+ * can subscribe (brainstorm §5 seam) — client-side Pixel only captures ~50-60%
217
+ * under ATT; CAPI is P3-scope, no rework needed here.
218
+ *
219
+ * (Dir named `tag-path/` rather than `vendor/` per the repo's scout-ignore filter.)
220
+ */
221
+
222
+ declare function createMetaPixelVendor(win?: Window): TagVendor;
223
+
224
+ /**
225
+ * Script-tag (IIFE) surface. Exposes `window.AdsSDK` with a `cmd.push(...)`
226
+ * stub-queue: calls made before boot are queued, then drained in order once the
227
+ * client initializes. Auto-boot reads an inlined manifest + `data-*` intent markup.
228
+ */
229
+
230
+ interface AdsSdkInitConfig {
231
+ /** Static fast-path: inlined manifest. */
232
+ manifest?: Manifest;
233
+ /** Approach-C path: fetch the plan from the public `/placement` endpoint. */
234
+ placement?: PlacementSource;
235
+ consent?: ConsentConfig;
236
+ context?: Partial<PlanContext>;
237
+ }
238
+ interface AdsSdkGlobal {
239
+ cmd: {
240
+ push: (fn: (client: AdsClient) => void) => void;
241
+ };
242
+ init(config: AdsSdkInitConfig): Promise<void>;
243
+ client?: AdsClient;
244
+ }
245
+ /** Parse `data-*` intent attributes from the booting <script> element. */
246
+ declare function parseDataIntent(el: Element | null): {
247
+ dynamic: DynamicParams;
248
+ pageUrl?: string;
249
+ };
250
+ /**
251
+ * Install `window.AdsSDK`. Idempotent — a second install reuses the existing global
252
+ * (the engine's own page guard still prevents a second boot).
253
+ */
254
+ declare function installAdsSdk(win?: Window): AdsSdkGlobal;
255
+
256
+ export { AdsClient, type AdsSdkGlobal, type AdsSdkInitConfig, ConsentGate, type ConsentGateDeps, type ConsentMode, type DispatchTraits, EngineEvent, EventBus, type GptProviderDeps, PlacementSource, ProviderHandle, type PurposeConsents, RenderProvider, type SlotLifecycle, type SlotRecord, type SlotState, TagInjector, TagVendor, type TcData, type TcfApi, type TcfBridge, type TelemetrySink, VendorConsentId, attachTelemetry, createConsentGate, createConsentMode, createGa4Vendor, createGptProvider, createMetaPixelVendor, createSlotLifecycle, createTcfBridge, dispatchTraits, installAdsSdk, parseDataIntent, purposesToSignals, vendorAllowed, vendorDecisionMap };