@intenque/network-sdk 0.0.0-stage → 2.2.0-beta.2
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/CHANGELOG.md +145 -0
- package/README.md +254 -2
- package/dist/capture/index.cjs +1 -0
- package/dist/capture/index.d.cts +57 -0
- package/dist/capture/index.d.ts +57 -0
- package/dist/capture/index.js +1 -0
- package/dist/cli/index.js +1745 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/constants-C_6Zxu_k.d.cts +20 -0
- package/dist/constants-C_6Zxu_k.d.ts +20 -0
- package/dist/react/index.cjs +3 -0
- package/dist/react/index.cjs.map +1 -0
- package/dist/react/index.d.cts +421 -0
- package/dist/react/index.d.ts +421 -0
- package/dist/react/index.js +3 -0
- package/dist/react/index.js.map +1 -0
- package/dist/server/index.cjs +2 -0
- package/dist/server/index.cjs.map +1 -0
- package/dist/server/index.d.cts +350 -0
- package/dist/server/index.d.ts +350 -0
- package/dist/server/index.js +2 -0
- package/dist/server/index.js.map +1 -0
- package/dist/styles.css +141 -0
- package/package.json +111 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/react/context.tsx","../../src/constants.ts","../../src/react/clickId.ts","../../src/rootPublicKeys.ts","../../src/react/config.ts","../../src/transport.ts","../../src/react/impression.ts","../../src/react/signals.ts","../../src/verify/base64url.ts","../../src/verify/schema.ts","../../src/verify/p1363.ts","../../src/canonicalJson.ts","../../src/verify/verifyManifest.ts","../../src/react/loader.ts","../../src/react/useNetworkDirectory.ts","../../src/react/useNetworkLink.ts","../../src/react/DiscoverBusinesses.tsx"],"names":["NetworkConfigContext","createContext","DirectoryContext","SignalsContext","NetworkProvider","props","jsx","useNetworkConfig","override","fromContext","useContext","SDK_VERSION","MANIFEST_SCHEMA_MAJOR","DEFAULT_CDN_BASE","UTM","IMPRESSION_TIMER_MS","HREF_RESTORE_MS","SEEN_MS","NO_SECTION_SEEN_MS","VISIBLE_RATIO","SIGNAL_MS_MAX","SIGNAL_VP_MAX","SIGNAL_ITEMS_MAX","SIGNAL_FLAGS_MAX","SIGNAL_BODY_MAX","IMPRESSION_SENDS_MAX","CLICK_IDS_REMEMBERED","HEADLESS_BITS","CLIENT_FLAGS","manifestUrlFor","cdnBase","siteKey","channel","B64","base64url","b","s","i","n","randomBytes","uuidV4","random","h","x","mintClickId","siteIndex","idx","nowMs","u16","v","min","r","withClickId","href","clickId","base","frag","q","parts","p","rootPublicKeys","DEV_ROOT_PUBLIC_KEYS","THEME_SLOTS","isRecord","isLocalHost","host","isLocalUrl","url","signalsSilenced","config","pageHost","endpoint","defineNetworkConfig","input","fb","fbSite","fbCdn","analytics","fbEndpoint","dev","consentMode","sendSignal","body","done","report","ok","post","keepalive","browserEnv","fn","ms","id","target","el","clampMs","clampVp","RATIO_EPSILON","CLIENT_FLAG_SET","headlessBits","nav","win","wireFlags","flags","out","f","g","guard","createPageView","ctx","env","pv","a","m","smp","hd","fl","rr","withheld","cards","section","off","order","sent","sends","last","lastScored","io","cancelTimer","timerDone","attached","active","shown","tick","t","counting","now","dwell","snap","open","sync","vis","any","flush","onEntries","entries","e","c","common","kind","why","scored","sec","items","pos","fp","score","w","kept","activate","IO","d","hide","show","ids","slug","go","PENDING_MAX_AGE_MS","createSignalHooks","getConfig","state","emit","manifest","src","page","cfg","silent","clicksOn","pending","sentIds","mint","safe","business","via","button","ip","ALPHABET","LOOKUP","isBase64urlAlphabet","decodeCanonicalBase64url","bytes","acc","bits","bytesToHex","SLUG_RE","SLUG_MAX","MAX_ITEMS_CEILING","KID_RE","P1363_RE","COORD_RE","ISO_DATE_RE","TOKEN_RE","HOST_RE","URL_TAIL_RE","Invalid","fail","obj","keys","o","k","codePoints","_","str","max","re","int","bool","nullable","literal","lit","oneOf","list","baseUrlProblem","u","local","baseUrl","destinationUrlProblem","destinationUrl","parsePublicJwk","image","BUSINESS_KEYS","name","domain","tags","signer","revoked","MANIFEST_KEYS","parseManifest","l","sig","P256_N","HALF_N","subtle","p1363Problem","signature","keyCache","importKey","jwk","api","hit","kty","crv","y","verifyP1363","data","key","CanonicalJsonError","message","path","canonicalJson","value","serialise","proto","child","certificatePayload","signedPayload","_sig","payload","isKidList","parseIso","verifyManifest","opts","root","notBefore","notAfter","verifyManifestBytes","raw","text","parsed","INITIAL_STATE","isEmptyPlaceholder","semverGreater","pa","pb","parseUnverified","expect","fetchWithTimeout","cache","ac","timer","res","belowFloor","live","floor","reasonFlag","loadDirectory","deps","warn","devWarn","roots","mode","insecure","verify","source","revokedKids","verifyBytes","trusted","renderFallback","again","currentHostname","fallbackIdentity","loadKey","sameDirectory","useNetworkDirectory","latest","useRef","useEffect","setState","useState","prev","alive","loading","buildHref","links","hash","setHref","defaultButton","HOOK_METHODS","isSignalHooks","guarded","useNetworkLink","hooks","legacy","observe","useCallback","useMemo","cancelRestore","stopRestore","restoreLater","send","trackClick","HEADING_ID","kebab","slotClass","slot","theme","unstyled","own","splitAccent","title","DiscoverBusinesses","onEvent","configRef","dir","signals","sectionRef","cls","subtitle","lead","accent","jsxs","Card","link","broken","setBroken","Fragment","meta"],"mappings":"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","file":"index.js","sourcesContent":["/** `<NetworkProvider config>` — spec §6.3: does nothing until a `DiscoverBusinesses` mounts (zero cost elsewhere). */\nimport { createContext, useContext, type ReactNode } from 'react'\nimport type { NetworkConfig } from './config.js'\nimport type { SignalHooks } from './signals.js'\nimport type { Manifest } from '../verify/schema.js'\n\nexport const NetworkConfigContext = createContext<NetworkConfig | null>(null)\n\n/** The loaded manifest of the nearest `DiscoverBusinesses` (for `useNetworkLink`). */\nexport const DirectoryContext = createContext<Manifest | null>(null)\n\n/** The signal hooks of the nearest `DiscoverBusinesses` (§5.1 / §6.3); `null` outside a section. */\nexport const SignalsContext = createContext<SignalHooks | null>(null)\n\nexport function NetworkProvider(props: { config: NetworkConfig; children?: ReactNode }) {\n return (\n <NetworkConfigContext.Provider value={props.config}>\n {props.children}\n </NetworkConfigContext.Provider>\n )\n}\n\nexport function useNetworkConfig(override?: NetworkConfig | null): NetworkConfig | null {\n const fromContext = useContext(NetworkConfigContext)\n return override ?? fromContext\n}\n","/**\n * Network-wide constants the SDK must agree on with the hub (packages/shared/src/constants.ts) — spec §4.2, §4.3,\n * §4.5, §5.3, §6.1. Kept in a dependency-free file so every entry (react, capture, server, cli) can import it without\n * pulling the others in.\n */\n\n/** Semver of this package; SDK major = manifest schema major (§6.1). Bumped by the version script. */\nexport const SDK_VERSION = '2.2.0-beta.2'\n/** `schema` this SDK reads (§4.3). A greater major → failure → fallback. */\nexport const MANIFEST_SCHEMA_MAJOR = 2\n/**\n * §6.1 compiled `DEFAULT_CDN_BASE`: the production manifest base. Decision 15: default DigitalOcean domains until the\n * agency domain exists, so this is the Spaces CDN default endpoint plus the production prefix (`network/v1`). It is\n * only the last resort for a site with no committed fallback (§4.2 URL precedence: `config.manifestUrl ??\n * (config.cdnBase ?? fallback.cdnBase ?? DEFAULT_CDN_BASE)`); a domain cutover is a publish + `sync-fallback`, not an\n * SDK release.\n */\nexport const DEFAULT_CDN_BASE =\n 'https://inr-network-public.nyc3.cdn.digitaloceanspaces.com/network/v1'\n/** §4.3 \"hard fail at publish if > 24 KB\": the verifier refuses larger input before parsing. */\nexport const MANIFEST_MAX_BYTES = 24 * 1024\n/** §4.5 SDK step 2: 7 d grace after `notAfter`. */\nexport const SIGNER_GRACE_MS = 7 * 86_400_000\n/** §4.6 SDK fetch: 4 s timeout through an AbortController. */\nexport const FETCH_TIMEOUT_MS = 4000\n/** §5.3 referral query parameter and storage key. */\nexport const REFERRAL_PARAM = 'inr'\nexport const REFERRAL_STORAGE_KEY = 'inr_ref'\n/** §5.3: a referral older than 30 d is ignored. */\nexport const REFERRAL_TTL_MS = 30 * 86_400_000\nexport const CLICK_ID_RE = /^[A-Za-z0-9_-]{32}$/\n/** §6.3 UTM defaults, used only when no manifest is loaded (the manifest's `links` win). */\nexport const UTM = { medium: 'network', campaign: 'cross-promo' } as const\n\n// §5.1 signals — the SDK-side copies of the hub's `ANALYTICS_LIMITS` / `HEADLESS_BITS` / `CLIENT_FLAGS`\n// (packages/shared); `test/signals-contract.test.ts` asserts they agree, so neither side can drift.\n/** The impression goes 10 s after the section first became visible, unless a click, `hidden` or `pagehide` came first. */\nexport const IMPRESSION_TIMER_MS = 10_000\n/**\n * Decision row 6 (\"precise claim\", §6.3): a link rewritten with `inr=<clickId>` returns to its at-rest href (UTMs only)\n * this long after the gesture ends (pointerup / pointercancel, or the click / context menu / drag that used it), or at\n * once on blur (release 2b review round 2).\n */\nexport const HREF_RESTORE_MS = 2_000\n/** `seen` = ≥ 50 % visible for ≥ 1000 ms continuous (section and card alike). */\nexport const SEEN_MS = 1000\n/** The hub's `no_section_seen` threshold (`sm < 300`, §5.2 step 5): a click re-sends the impression when it crossed it. */\nexport const NO_SECTION_SEEN_MS = 300\nexport const VISIBLE_RATIO = 0.5\n/** Every `ms` / `sm` / `fv` offset is bounded to one day, `vp.w/h` to 20 000, `items` to 24, `fl` to 8 (§2.4). */\nexport const SIGNAL_MS_MAX = 86_400_000\nexport const SIGNAL_VP_MAX = 20_000\nexport const SIGNAL_ITEMS_MAX = 24\nexport const SIGNAL_FLAGS_MAX = 8\n/** The hub refuses bodies over 4 KB (413); the SDK trims never-visible cards before it gets there. */\nexport const SIGNAL_BODY_MAX = 4096\n/**\n * Impression sends per page view (first send + re-sends at the end of later visibility episodes). Below the hub's 20\n * (`sendsMax`, beyond which a page view is `dup_pv` / suspect), so a visitor who switches tabs all afternoon never\n * turns a real page view suspect.\n */\nexport const IMPRESSION_SENDS_MAX = 10\n/** Click ids remembered per page view to send each one once (a `contextmenu` then `auxclick`, a doubled handler). */\nexport const CLICK_IDS_REMEMBERED = 64\n/** §2.4 `hd` bitmask bits (client signals); the hub treats `webdriver | headlessUa` as `bot`. */\nexport const HEADLESS_BITS = {\n webdriver: 1,\n noLanguages: 2,\n zeroPlugins: 4,\n headlessUa: 8,\n noOuterWindow: 16,\n} as const\n/**\n * §5.1 flags the SDK reports on the next impression (`fl`): the §2.4 vocabulary the directory loader can set. The\n * loader's `sig_revoked` travels as `sig_fail` (a revoked kid is a signature failure; §2.4 has no `sig_revoked`) and\n * the SDK-local `fetch_fail` / `insecure_context` are never transmitted.\n */\nexport const CLIENT_FLAGS = [\n 'sig_fail',\n 'rev_rollback',\n 'stale_cache',\n 'fallback_invalid',\n 'fallback_key_expired',\n 'sitekey_from_fallback',\n 'sdk_outdated',\n] as const\nexport type ClientFlag = (typeof CLIENT_FLAGS)[number]\n/** §4.6 fallback file path inside a site repo. */\nexport const FALLBACK_PATH = 'src/data/network.fallback.json'\nexport const CONFIG_PATH = 'src/network.config.js'\n\nexport type SiteChannel = 'production' | 'preview'\n\n/** §4.2: the alias URL for a site. */\nexport function manifestUrlFor(cdnBase: string, siteKey: string, channel: SiteChannel): string {\n return `${cdnBase.replace(/\\/+$/, '')}/${channel === 'preview' ? 'preview/' : ''}sites/${siteKey}/manifest.json`\n}\n","/**\n * Self-describing click id — spec §2.4 `clicks.clickId`: `base64url( siteIndex (2 B BE) ‖ toIdx (2 B BE) ‖\n * minutesSinceEpoch (4 B BE) ‖ random (16 B) )` = 24 bytes = 32 characters, minted on `pointerdown` (§6.3). A\n * dependency-free mirror of packages/shared `encodeClickId` (the suite asserts both produce the same id from the same\n * inputs and that `decodeClickId` reads back the site, the business and the minute, which the hub ingest checks:\n * `bad_click_id` otherwise). The prefix is public and unauthenticated; the 16 random bytes come from\n * `crypto.getRandomValues` and nothing else — without a CSPRNG no id is minted and no signal is sent. Also the page-view\n * uuid v4 (§2.4 `pv`) and the `inr=<clickId>` href rewrite (§6.3).\n */\nimport { REFERRAL_PARAM } from '../constants.js'\n\nconst B64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'\n\n/** Unpadded base64url (RFC 4648 §5). */\nexport function base64url(b: Uint8Array): string {\n let s = ''\n for (let i = 0; i < b.length; i += 3) {\n const n = (b[i]! << 16) | ((b[i + 1] ?? 0) << 8) | (b[i + 2] ?? 0)\n s += B64[n >> 18]! + B64[(n >> 12) & 63]!\n if (i + 1 < b.length) s += B64[(n >> 6) & 63]!\n if (i + 2 < b.length) s += B64[n & 63]!\n }\n return s\n}\n\n/** `n` CSPRNG bytes, or `null` when the runtime has no `crypto.getRandomValues` (no weak fallback, ever). */\nexport function randomBytes(n: number): Uint8Array | null {\n try {\n return crypto.getRandomValues(new Uint8Array(n))\n } catch {\n return null\n }\n}\n\nexport type RandomSource = (n: number) => Uint8Array | null\n\n/** Lower-case uuid v4 (the hub's `{ siteKey, pv }` upsert key is canonical); `crypto.randomUUID` needs a secure context. */\nexport function uuidV4(random: RandomSource = randomBytes): string | null {\n const b = random(16)\n if (!b || b.length < 16) return null\n b[6] = (b[6]! & 0x0f) | 0x40\n b[8] = (b[8]! & 0x3f) | 0x80\n const h = Array.from(b.subarray(0, 16), (x) => x.toString(16).padStart(2, '0')).join('')\n return `${h.slice(0, 8)}-${h.slice(8, 12)}-${h.slice(12, 16)}-${h.slice(16, 20)}-${h.slice(20)}`\n}\n\n/**\n * The click id for a click on business `idx` shown by site `siteIndex` at `nowMs` (the minute is `floor(now / 60 000)`,\n * the click's own minute: the hub refuses an id whose minute is more than 10 min from the signal's `t`). `null` without\n * a CSPRNG or for an index outside uint16 (the manifest schema already bounds both to 1–65535).\n */\nexport function mintClickId(\n siteIndex: number,\n idx: number,\n nowMs: number,\n random: RandomSource = randomBytes,\n): string | null {\n const u16 = (v: number) => Number.isInteger(v) && v >= 0 && v <= 0xffff\n const min = Math.floor(nowMs / 60_000)\n if (!u16(siteIndex) || !u16(idx) || !(min >= 0 && min <= 0xffff_ffff)) return null\n const r = random(16)\n if (!r || r.length < 16) return null\n const b = new Uint8Array(24)\n b[0] = siteIndex >>> 8\n b[1] = siteIndex & 255\n b[2] = idx >>> 8\n b[3] = idx & 255\n b[4] = min >>> 24\n b[5] = (min >>> 16) & 255\n b[6] = (min >>> 8) & 255\n b[7] = min & 255\n b.set(r.subarray(0, 16), 8)\n return base64url(b)\n}\n\n/**\n * `href` with `inr=<clickId>` as the last query parameter, before any fragment. The rest of the query is kept byte for\n * byte; an `inr` the destination URL already carried is removed, because `captureReferral` reads the first `inr` and\n * would otherwise attribute the visit to a stale id.\n */\nexport function withClickId(href: string, clickId: string): string {\n const h = href.indexOf('#')\n const base = h < 0 ? href : href.slice(0, h)\n const frag = h < 0 ? '' : href.slice(h)\n const q = base.indexOf('?')\n const parts =\n q < 0\n ? []\n : base\n .slice(q + 1)\n .split('&')\n .filter((p) => p !== '' && p.split('=')[0] !== REFERRAL_PARAM)\n parts.push(`${REFERRAL_PARAM}=${clickId}`)\n return `${q < 0 ? base : base.slice(0, q)}?${parts.join('&')}${frag}`\n}\n","/**\n * Trusted root public keys — spec §4.5 (`rootPublicKeys`, \"an array to allow overlap\").\n *\n * The root private key is generated offline by the owner (`npm run keys -- root:new`) and never reaches the hub; the\n * public JWK printed by that command is what goes here. The hub holds the same list in `MANIFEST_ROOT_PUBLIC_KEYS`\n * and refuses to certify or sign with a key the SDK would reject.\n *\n * HOW PRODUCTION ROOTS ARE ADDED (release step, see docs/install-guide.md \"Adding a production root\"):\n * 1. `npm run keys -- root:new --kid root-<year> --out <file>` on the owner's machine; store the private file in\n * the password manager (+ printed backup).\n * 2. Append `{ kid: 'root-<year>', jwk: { kty: 'EC', crv: 'P-256', x, y } }` to `rootPublicKeys` below.\n * 3. Release an SDK **minor** (`npm version minor` / changeset); every site picks it up as an ordinary dependency\n * bump. Removing an old root is a **major** (§4.5 \"Root rotation\").\n * 4. Add the same entry to `MANIFEST_ROOT_PUBLIC_KEYS` on the hub, certify the manifest key under the new root.\n *\n * `rootPublicKeys` is EMPTY up to 2.2.0-beta.1: no production root exists yet (nothing is published in production). A\n * site that does not pass `manifestRootKeys` therefore trusts no manifest and renders nothing — the correct result\n * for an environment that has no signed content. The development root below is exported separately and is only ever\n * referenced explicitly (`network-sdk init --root-keys …` writes it into `manifestRootKeys` of the site's\n * `network.config.js`); it must never be merged into `rootPublicKeys`, because its private key lives on a developer\n * machine and the dev bucket (`network-dev/v1`) is not production content.\n */\nexport type RootPublicKey = {\n kid: string\n jwk: { kty: 'EC'; crv: 'P-256'; x: string; y: string }\n}\n\n/** Production roots (none yet; see the file comment). */\nexport const rootPublicKeys: readonly RootPublicKey[] = []\n\n/**\n * The DEVELOPMENT root (hub `.env` `MANIFEST_ROOT_PUBLIC_KEYS`, dev bucket `network-dev/v1`, kid `root-dev-a01e0d`).\n * Public key, not a secret. Used by the test suite and by `init --root-keys` for the JCM pilot; never trusted by\n * default.\n */\nexport const DEV_ROOT_PUBLIC_KEYS: readonly RootPublicKey[] = [\n {\n kid: 'root-dev-a01e0d',\n jwk: {\n kty: 'EC',\n crv: 'P-256',\n x: '4dO5Ybuh3aMQMYvVUYd82CZ2y-tM2wM4SeunZvxMKHQ',\n y: 'Tw6MyboNkggXo9jV7_Tng8tCGNMin7Dxuept8AY0Anc',\n },\n },\n]\n","/**\n * `defineNetworkConfig` — spec §6.2 (the only per-site file is `src/network.config.js`) and §4.2 / §6.3 URL precedence:\n * `config.manifestUrl ?? (config.cdnBase ?? fallback.cdnBase ?? DEFAULT_CDN_BASE) + '/' + (preview?) + 'sites/<siteKey>/manifest.json'`.\n * It also derives `capture = { siteKey, endpoint: fallback.analytics.endpoint, consent, consentMode }` for `main.jsx`\n * (§5.3) so nothing is assembled by hand. Release 2b review round 2: the endpoint is the fallback's whatever its\n * `analytics.landings` says — the bundled copy is refreshed only by a site build, while §2.2 makes the switch a publish;\n * the hub refuses a landing for a destination whose live `landings` is off (`disabled`, 0 operations). It is `null`\n * only for a DEV build of a production-channel site whose endpoint is not a local hub (the v2.2 changelog's \"SDK\n * silent on localhost / DEV\"). Pure: no DOM, no network.\n */\nimport { DEFAULT_CDN_BASE, manifestUrlFor, type SiteChannel } from '../constants.js'\nimport { rootPublicKeys, type RootPublicKey } from '../rootPublicKeys.js'\n\nexport type ConsentState = 'granted' | 'denied' | null\n/** §6.2: the consent adapter contract, stated once. */\nexport type ConsentAdapter = { get: () => ConsentState }\nexport type ConsentMode = 'session-default' | 'require-consent'\n\nexport const THEME_SLOTS = [\n 'section',\n 'container',\n 'heading',\n 'accentWord',\n 'subheading',\n 'grid',\n 'card',\n 'imageBox',\n 'image',\n 'placeholder',\n 'body',\n 'name',\n 'meta',\n 'description',\n 'button',\n 'buttonIcon',\n] as const\nexport type ThemeSlot = (typeof THEME_SLOTS)[number]\n/** §6.1 headless className slots: the site's own Tailwind classes live in the site's source. */\nexport type NetworkTheme = Partial<Record<ThemeSlot, string>>\n\nexport type NetworkEvent =\n | { type: 'directory'; payload: { source: string; revision: number | null; flags: string[] } }\n | { type: 'impression'; payload: { ids: string[]; revision: number | null } }\n /** `href` is the at-rest link (UTMs only): the click id never reaches the site's own tracker (§5.3). */\n | { type: 'click'; payload: { id: string; href: string; via: string } }\n /** §5.1: a beacon was handed to the browser (`sent`) or could not be; `why` is the impression's send reason. */\n | {\n type: 'signal'\n payload: { kind: 'impression' | 'click'; sent: boolean; why?: string }\n }\n\nexport type NetworkConfigInput = {\n /** 1) per site. When omitted the SDK uses `fallback.site` and flags `sitekey_from_fallback` (§5.1). */\n siteKey?: string | undefined\n /** `'preview'` → `/network/v1/preview/sites/…` on the production CDN. Default `'production'`. */\n channel?: SiteChannel | string | undefined\n /** Optional override of `DEFAULT_CDN_BASE` (normally the manifest's `cdnBase` wins once loaded). */\n cdnBase?: string | undefined\n /** Full override: the separate staging hub only, together with `manifestRootKeys`. */\n manifestUrl?: string | undefined\n /** `src/data/network.fallback.json`, written by `network-sdk sync-fallback`; also the rollback floor. */\n fallback?: unknown\n /** Staging / dev override of the compiled `rootPublicKeys` (§4.5). */\n manifestRootKeys?: readonly RootPublicKey[] | undefined\n /** 2) per site adapter; omitted → treated as `null`. */\n consent?: ConsentAdapter | undefined\n consentMode?: ConsentMode | undefined\n /** 3) per site brand classes. */\n theme?: NetworkTheme | undefined\n /** Drop the `inr-*` default class names (Tailwind-only sites). */\n unstyled?: boolean | undefined\n /** Defaults to true (§4.5). `false` skips the signature (schema + identity still run); development only. */\n verifySignature?: boolean | undefined\n /** §4.6 insecure contexts: render the fallback unverified when `crypto.subtle` is missing in production. */\n allowInsecureFallback?: boolean | undefined\n /** The site's `import.meta.env.DEV`: enables the single `console.warn` per failure and the insecure-context skip. */\n dev?: boolean | undefined\n /** Mirror events into the site's own tracker (§6.3). */\n onEvent?: ((event: NetworkEvent) => void) | undefined\n}\n\nexport type CaptureConfig = {\n siteKey: string\n endpoint: string | null\n consent: ConsentAdapter | undefined\n consentMode: ConsentMode\n}\n\nexport type NetworkConfig = {\n siteKey: string\n siteKeyFromFallback: boolean\n channel: SiteChannel\n manifestUrl: string\n fallback: unknown\n roots: readonly RootPublicKey[]\n consent: ConsentAdapter | undefined\n consentMode: ConsentMode\n theme: NetworkTheme\n unstyled: boolean\n verifySignature: boolean\n allowInsecureFallback: boolean\n dev: boolean\n onEvent: ((event: NetworkEvent) => void) | undefined\n /** For `captureReferral(networkConfig.capture)` in `main.jsx` (§5.3). */\n capture: CaptureConfig\n}\n\nconst isRecord = (v: unknown): v is Record<string, unknown> =>\n v !== null && typeof v === 'object' && !Array.isArray(v)\n\n/** `localhost`, `*.localhost`, `127.0.0.1`, `[::1]`: a developer's own machine (release 2b review round 2). */\nexport function isLocalHost(host: string | undefined | null): boolean {\n return !!host && /^(localhost|.+\\.localhost|127\\.0\\.0\\.1|\\[::1\\]|::1)$/i.test(host)\n}\n\n/** Whether a signal endpoint is a hub on the developer's own machine (the dev hub of a local pilot). */\nexport function isLocalUrl(url: string | undefined | null): boolean {\n try {\n return !!url && isLocalHost(new URL(url).hostname)\n } catch {\n return false\n }\n}\n\n/**\n * The v2.2 changelog's \"SDK silent on localhost / DEV\" (release 2b review round 2): a DEV build, or a page served from\n * the developer's machine, of a **production**-channel site sends no signal to a non-local hub (a developer's\n * `npm run dev` would otherwise be stored as `origin_mismatch` suspects on the production site). Preview-channel sites\n * keep sending (their localhost traffic is the hub's `preview_origin`), and so does any page whose endpoint is a local\n * dev hub.\n */\nexport function signalsSilenced(\n config: Pick<NetworkConfig, 'dev' | 'channel'>,\n pageHost: string | undefined,\n endpoint: string | undefined | null,\n): boolean {\n return (\n config.channel !== 'preview' && (config.dev || isLocalHost(pageHost)) && !isLocalUrl(endpoint)\n )\n}\n\nexport function defineNetworkConfig(input: NetworkConfigInput): NetworkConfig {\n const fb = isRecord(input.fallback) ? input.fallback : null\n const fbSite = fb && typeof fb['site'] === 'string' ? (fb['site'] as string) : ''\n const siteKey = typeof input.siteKey === 'string' && input.siteKey ? input.siteKey : fbSite\n const channel: SiteChannel = input.channel === 'preview' ? 'preview' : 'production'\n const fbCdn = fb && typeof fb['cdnBase'] === 'string' ? (fb['cdnBase'] as string) : undefined\n const analytics = fb && isRecord(fb['analytics']) ? fb['analytics'] : null\n // §4.3 / §5.3: the landing signal is governed by this site's `analytics.landings` alone (its kill switch as a\n // destination), never by `analytics.enabled` — and enforced by the hub against the live switch, so the bundled copy\n // of the switch does not gate it (release 2b review round 2); `endpoint: null` tells `captureReferral` to send none\n const fbEndpoint =\n analytics && typeof analytics['endpoint'] === 'string'\n ? (analytics['endpoint'] as string)\n : null\n const dev = input.dev === true\n const endpoint = signalsSilenced({ dev, channel }, undefined, fbEndpoint) ? null : fbEndpoint\n const consentMode: ConsentMode =\n input.consentMode === 'require-consent' ? 'require-consent' : 'session-default'\n return {\n siteKey,\n siteKeyFromFallback: !input.siteKey && !!fbSite,\n channel,\n manifestUrl:\n input.manifestUrl ??\n manifestUrlFor(input.cdnBase ?? fbCdn ?? DEFAULT_CDN_BASE, siteKey, channel),\n fallback: input.fallback,\n roots: input.manifestRootKeys ?? rootPublicKeys,\n consent: input.consent,\n consentMode,\n theme: input.theme ?? {},\n unstyled: input.unstyled === true,\n verifySignature: input.verifySignature !== false,\n allowInsecureFallback: input.allowInsecureFallback === true,\n dev,\n onEvent: input.onEvent,\n capture: { siteKey, endpoint, consent: input.consent, consentMode },\n }\n}\n","/**\n * Signal transport — spec §5.1: `navigator.sendBeacon(url, body)` with a string body (sent as `text/plain`, so no\n * preflight, and it survives navigation); when `sendBeacon` is absent, throws **or returns `false`** (the per-origin\n * in-flight queue is full, which happens on pages that already queue beacons, such as JCM's own tracker), fall back to\n * `fetch(url, { method: 'POST', mode: 'no-cors', keepalive: true, credentials: 'omit', body }).catch(() => {})`.\n * `mode: 'no-cors'` is required: the response is opaque anyway and a `cors` request would reject (an unhandled\n * rejection in the console) on every fallback send. Never throws, never awaits, never logs: signals never block\n * navigation (§6.4). Dependency-free, so tsup inlines it into both the `react` entry (impression, click) and the\n * `capture` entry (landing). Returns whether the body was handed to the browser. Release 2b review: an `http:` signal\n * endpoint is never used from an `https:` page (a dev fallback's `http://localhost` endpoint shipped by mistake must\n * not beacon to visitors' own machines, nor trip the browser's local-network prompt).\n *\n * Release 2b review round 2: when the keepalive fetch rejects (its bytes count against the same per-document keepalive\n * quota sendBeacon just found full) and the page is still visible, it is retried once without `keepalive`. `done`\n * reports the outcome — at once for a beacon, when the fetch settles otherwise — so a signal every path failed to send\n * is reported `sent: false`.\n */\nexport function sendSignal(url: string, body: string, done?: (sent: boolean) => void): boolean {\n const report = (ok: boolean) => {\n try {\n done?.(ok)\n } catch {\n /* a reporter never breaks the send */\n }\n return ok\n }\n try {\n if (location.protocol == 'https:' && /^http:/i.test(url)) return report(false)\n } catch {\n /* no location (SSR): nothing to compare */\n }\n try {\n if (navigator.sendBeacon(url, body)) return report(true)\n } catch {\n /* no navigator / no sendBeacon (old browser, SSR), or a URL it refuses */\n }\n const post = (keepalive: boolean) =>\n fetch(url, { method: 'POST', mode: 'no-cors', keepalive, credentials: 'omit', body })\n try {\n post(true).then(\n () => report(true),\n () => {\n // release 2b review round 2: a keepalive fetch shares sendBeacon's 64 KB per-document quota, so it fails in\n // exactly the case it is for; while the page is not unloading, one plain request can still go out\n try {\n if (document.visibilityState == 'visible')\n return void post(false).then(\n () => report(true),\n () => report(false),\n )\n } catch {\n /* no document */\n }\n report(false)\n },\n )\n return true\n } catch {\n return report(false)\n }\n}\n","/**\n * Page view + impression tracker — spec §5.1 (impression signal, sampling, prerender and bfcache guards), §2.4\n * `impressions`. One `PageView` per `<DiscoverBusinesses>` mount and loaded directory = one page view (`pv`, kept only\n * in memory). The sampling roll happens once, before any observer attaches. A sampled-in view watches the section and\n * every card with **one** `IntersectionObserver` (threshold 0.5) for its whole life: `seen` = ≥ 50 % visible for\n * ≥ 1000 ms continuous, `ms` = cumulative dwell counted only while `document.visibilityState === 'visible'`, `fv` = ms\n * from mount (`m`) to first ≥ 50 % visibility. The section counts as visible while it is ≥ 50 % visible **or any of its\n * cards is** (a one-column phone shows whole cards of a section far taller than twice the viewport, which can never\n * itself reach 50 %).\n *\n * The impression goes at the first of: 10 s after the section first became visible (`timer`), the first card click\n * (`click`, synchronously before the click signal), `visibilitychange → hidden`, `pagehide` (and an SPA unmount, sent\n * as `hidden`). Later `hidden` / `pagehide` re-send only when a `seen` / `ms` changed (one send per visibility episode;\n * the hub merges sends per `pv`), at most `IMPRESSION_SENDS_MAX` sends. Release 2b review (§5.1 \"flushed synchronously\n * before the click signal\", §5.2 step 5): a click after an earlier send re-sends the impression (`why: 'click'`) when\n * what the hub scores the click against changed since that send — the section became seen or crossed the 300 ms\n * `no_section_seen` threshold, or a card became seen or visible for the first time (its `fv`, for `too_fast`) — so\n * a visitor who scrolled past, came back and read for 20 s is never scored on the first glimpse. Nothing is sent for a page view in which nothing\n * was ever on screen — not even at a click (the click then carries `ip: false`): a zero-visibility impression followed\n * by a click is the hub's forgery signature (§5.2 step 5, `bot`). Observers do not attach while `document.prerendering`\n * (they attach on `prerenderingchange`); a bfcache `pageshow` keeps `pv` and `sent` (the heap survives) and sends\n * nothing by itself. Observers, listeners and timers attach only in `start()` (an effect); construction (during render)\n * only reads `navigator` / `window` through the lazy env for the `hd` bits, and no page view exists before a manifest\n * has loaded, so SSR is safe. Nothing here throws: every callback is guarded.\n */\nimport {\n CLIENT_FLAGS,\n HEADLESS_BITS,\n IMPRESSION_SENDS_MAX,\n IMPRESSION_TIMER_MS,\n NO_SECTION_SEEN_MS,\n SDK_VERSION,\n SEEN_MS,\n SIGNAL_BODY_MAX,\n SIGNAL_FLAGS_MAX,\n SIGNAL_ITEMS_MAX,\n SIGNAL_MS_MAX,\n SIGNAL_VP_MAX,\n VISIBLE_RATIO,\n} from '../constants.js'\nimport { sendSignal } from '../transport.js'\nimport type { Manifest, ManifestBusiness } from '../verify/schema.js'\nimport { randomBytes, uuidV4, type RandomSource } from './clickId.js'\n\nexport type SendReason = 'timer' | 'click' | 'hidden' | 'pagehide'\nexport type SignalKind = 'impression' | 'click'\n\ntype Listener = (e: { persisted?: boolean }) => void\ntype Events = {\n addEventListener(type: string, fn: Listener, opts?: { once?: boolean }): void\n removeEventListener(type: string, fn: Listener): void\n}\n/** The slice of `document` the tracker reads. */\nexport type DocLike = Events & { visibilityState: string; prerendering?: boolean }\n/** The slice of `window` the tracker reads. */\nexport type WinLike = Events & {\n innerWidth?: number\n innerHeight?: number\n outerWidth?: number\n outerHeight?: number\n}\nexport type NavLike = {\n webdriver?: boolean\n globalPrivacyControl?: boolean\n languages?: readonly string[]\n plugins?: { length: number }\n userAgent?: string\n}\nexport type ObserverEntry = { target: unknown; isIntersecting: boolean; intersectionRatio: number }\nexport type ObserverLike = {\n observe(el: Element): void\n unobserve(el: Element): void\n disconnect(): void\n}\nexport type ObserverCtor = new (\n cb: (entries: ObserverEntry[]) => void,\n opts: { threshold: number },\n) => ObserverLike\n\n/** Everything the tracker takes from the browser, injectable for tests and resolved lazily (SSR-safe). */\nexport type SignalEnv = {\n /** Epoch ms. */\n now: () => number\n random: RandomSource\n /** The sampling roll, a number in [0, 1). */\n roll: () => number\n /** Hands the body to the browser (returns whether it did); `done` reports the outcome (release 2b review round 2). */\n send: (url: string, body: string, done?: (sent: boolean) => void) => boolean\n /** One-shot timer; returns its cancel function. */\n later: (fn: () => void, ms: number) => () => void\n doc: () => DocLike | undefined\n win: () => WinLike | undefined\n nav: () => NavLike | undefined\n IO: () => ObserverCtor | undefined\n /** The page's `location.hostname` (the DEV / localhost silence, release 2b review round 2). */\n host?: () => string | undefined\n}\n\nexport const browserEnv: SignalEnv = {\n now: () => Date.now(),\n random: randomBytes,\n roll: () => Math.random(),\n send: sendSignal,\n later: (fn, ms) => {\n const id = setTimeout(fn, ms)\n return () => clearTimeout(id)\n },\n doc: () => (typeof document == 'undefined' ? undefined : (document as unknown as DocLike)),\n win: () => (typeof window == 'undefined' ? undefined : (window as unknown as WinLike)),\n nav: () => (typeof navigator == 'undefined' ? undefined : (navigator as NavLike)),\n host: () => (typeof location == 'undefined' ? undefined : location.hostname),\n IO: () =>\n typeof IntersectionObserver == 'function'\n ? (IntersectionObserver as unknown as ObserverCtor)\n : undefined,\n}\n\nexport type PageViewContext = {\n manifest: Manifest\n src: 'live' | 'fallback'\n /** `DirectoryState.flags`; only the §5.1 vocabulary is transmitted, as `fl`. */\n flags: readonly string[]\n /** `DirectoryState.rr`: the live revision rejected (`rev_rollback`) or first received stale (`stale_cache`). */\n rr: number | null\n /** Mirror into the site's `onEvent` (`{ type: 'signal' }`); wrapped, a throwing tracker breaks nothing. */\n onSignal: (kind: SignalKind, sent: boolean, why: SendReason | null) => void\n /**\n * Release 2b review round 2 (§5.9 wording, v2.2 changelog \"hd / vp withheld pre-consent\"): true while the device\n * bits and the viewport must not leave the browser — a `require-consent` site before consent (GPC counts as a\n * denial); `hd: 0` and `vp: 0 × 0` are sent instead. Read at every send.\n */\n withhold?: () => boolean\n}\n\ntype Target = {\n el: Element | null\n /** ≥ 50 % visible per the last observer entry. */\n inter: boolean\n /** Start of the open counted episode, or null. */\n since: number | null\n ms: number\n seen: boolean\n fv: number | null\n}\ntype Snap = { seen: boolean; ms: number; fv: number | null }\ntype Item = Snap & { id: string; pos: number }\n\nconst target = (el: Element | null): Target => ({\n el,\n inter: false,\n since: null,\n ms: 0,\n seen: false,\n fv: null,\n})\nconst clampMs = (n: number) => Math.min(SIGNAL_MS_MAX, Math.max(0, Math.round(n)))\nconst clampVp = (n: unknown) =>\n typeof n == 'number' && n > 0 ? Math.min(SIGNAL_VP_MAX, Math.round(n)) : 0\n/** Rect rounding can report a crossing of 0.5 as 0.4999…; the observer only calls back at the crossing anyway. */\nconst RATIO_EPSILON = 0.005\nconst CLIENT_FLAG_SET: ReadonlySet<string> = new Set(CLIENT_FLAGS)\n\n/** §2.4 `hd` bitmask from the client signals the hub lists (only `webdriver | headlessUa` make a signal `bot`). */\nexport function headlessBits(nav: NavLike | undefined, win: WinLike | undefined): number {\n let b = 0\n try {\n if (nav) {\n if (nav.webdriver === true) b |= HEADLESS_BITS.webdriver\n if (!nav.languages || nav.languages.length === 0) b |= HEADLESS_BITS.noLanguages\n if (nav.plugins && nav.plugins.length === 0) b |= HEADLESS_BITS.zeroPlugins\n if (/HeadlessChrome/.test(nav.userAgent ?? '')) b |= HEADLESS_BITS.headlessUa\n }\n if (win && win.outerWidth === 0 && win.outerHeight === 0) b |= HEADLESS_BITS.noOuterWindow\n } catch {\n /* exotic navigator */\n }\n return b\n}\n\n/** `DirectoryState.flags` → the wire `fl` (§2.4 vocabulary, `sig_revoked` as `sig_fail`, ≤ 8, no duplicates). */\nexport function wireFlags(flags: readonly string[]): string[] {\n const out: string[] = []\n for (const f of flags) {\n const g = f === 'sig_revoked' ? 'sig_fail' : f\n if (CLIENT_FLAG_SET.has(g) && !out.includes(g)) out.push(g)\n }\n return out.slice(0, SIGNAL_FLAGS_MAX)\n}\n\nconst guard = (fn: () => void) => {\n try {\n fn()\n } catch {\n /* the section never throws */\n }\n}\n\n/** One page view (§2.4 `pv`): the impression tracker plus the fields every click of the page view carries. */\nexport type PageView = {\n readonly pv: string\n /** Mount epoch ms (§2.4 `m`): the same value on the impression and every click of this `pv`. */\n readonly m: number\n /** §5.1 sampling, rolled once: `1` = impressions measured for this page view. Clicks always go, with `smp: 0`. */\n readonly smp: 0 | 1\n readonly hd: number\n /** An impression for this `pv` has been sent (survives bfcache with the heap): the click's `ip`. */\n readonly sent: boolean\n /** Rendered slugs in order: `pos` on the impression items and on the click signal is the index here. */\n setOrder(ids: readonly string[]): void\n /** The clicked card's position: its rendered index (the hub requires `pos < itemCount`). */\n pos(b: ManifestBusiness): number\n /** Registers (or, with `null`, forgets) a card element; works before and after `start()`. Dwell is kept per slug. */\n observe(slug: string, el: Element | null): void\n /** From the component's effect with the `<section>` element; honours the §5.1 prerender guard. */\n start(section: Element | null): void\n /** Unmount (SPA route change): a due impression is sent first (`hidden`), then everything is detached. */\n stop(): void\n /** §5.1 common payload fields, shared with the click signal (every ms / epoch value an integer). */\n common(now: number): Record<string, unknown>\n post(kind: SignalKind, body: Record<string, unknown>, why?: SendReason | null): boolean\n /** The synchronous flush before a click signal; returns `ip` (an impression exists for this page view). */\n flushForClick(): boolean\n /**\n * Sends the impression when it is due: never when sampled out or unmeasured; the first send needs something to\n * have been on screen; a re-send only from `hidden` / `pagehide` and only when a `seen` / `ms` / `fv` changed.\n */\n flush(why: SendReason): boolean\n}\n\n/** `null` without a CSPRNG (no page-view id, no click id: nothing is sent). */\nexport function createPageView(ctx: PageViewContext, env: SignalEnv): PageView | null {\n const pv = uuidV4(env.random)\n if (!pv) return null\n const a = ctx.manifest.analytics\n const m = Math.round(env.now())\n // §5.1: `Math.random() * 1000 < samplePermille`, once, before observers attach; rate 0 / impressions off → 0\n const smp: 0 | 1 =\n a.enabled && a.impressions && a.samplePermille > 0 && env.roll() * 1000 < a.samplePermille\n ? 1\n : 0\n const hd = headlessBits(env.nav(), env.win())\n const fl = wireFlags(ctx.flags)\n const rr =\n ctx.rr !== null && (fl.includes('rev_rollback') || fl.includes('stale_cache')) ? ctx.rr : null\n const withheld = () => {\n try {\n return ctx.withhold?.() === true\n } catch {\n return true // an adapter that throws gives no consent\n }\n }\n const cards = new Map<string, Target>()\n const section = target(null)\n const off: (() => void)[] = []\n let order: string[] = []\n let sent = false\n let sends = 0\n let last = ''\n /** What the hub scores a click against, as last sent (release 2b review). */\n let lastScored = ''\n let io: ObserverLike | null = null\n let cancelTimer: (() => void) | null = null\n let timerDone = false\n /** Between `start()` and `stop()`. */\n let attached = false\n /** Observers attached (after any prerender). */\n let active = false\n /** False between a `pagehide` and the next `pageshow` (bfcache). */\n let shown = true\n\n const tick = (t: Target, counting: boolean, now: number) => {\n if (counting) {\n if (t.since === null) {\n t.since = now\n if (t.fv === null) t.fv = clampMs(now - m)\n }\n } else if (t.since !== null) {\n const dwell = Math.max(0, now - t.since)\n t.ms += dwell\n if (dwell >= SEEN_MS) t.seen = true\n t.since = null\n }\n }\n\n const snap = (t: Target | undefined, now: number): Snap => {\n if (!t) return { seen: false, ms: 0, fv: null }\n const open = t.since === null ? 0 : Math.max(0, now - t.since)\n return { seen: t.seen || open >= SEEN_MS, ms: clampMs(t.ms + open), fv: t.fv }\n }\n\n /** Opens / closes the counted episodes and arms the 10 s timer at the section's first visibility. */\n const sync = () => {\n const now = env.now()\n const vis = active && shown && env.doc()?.visibilityState === 'visible'\n let any = false\n for (const t of cards.values()) {\n const counting = vis && t.inter && t.el !== null\n any = any || counting\n tick(t, counting, now)\n }\n tick(section, vis && (section.inter || any), now)\n if (section.fv !== null && !sent && !cancelTimer && !timerDone)\n cancelTimer = env.later(\n () =>\n guard(() => {\n cancelTimer = null\n timerDone = true\n sync()\n flush('timer')\n }),\n IMPRESSION_TIMER_MS,\n )\n }\n\n const onEntries = (entries: readonly ObserverEntry[]) => {\n for (const e of entries) {\n const t =\n section.el === e.target ? section : [...cards.values()].find((c) => c.el === e.target)\n if (t) t.inter = e.isIntersecting && e.intersectionRatio >= VISIBLE_RATIO - RATIO_EPSILON\n }\n sync()\n }\n\n const common = (now: number): Record<string, unknown> => ({\n v: 2,\n k: ctx.manifest.site,\n pv,\n r: ctx.manifest.revision,\n src: ctx.src,\n sdk: SDK_VERSION,\n tok: a.token,\n sp: a.samplePermille,\n smp,\n t: Math.round(now),\n hd: withheld() ? 0 : hd,\n m,\n })\n\n const post = (kind: SignalKind, body: Record<string, unknown>, why: SendReason | null = null) =>\n env.send(`${a.endpoint.replace(/\\/+$/, '')}/${kind}`, JSON.stringify(body), (ok) =>\n guard(() => ctx.onSignal(kind, ok, why)),\n )\n\n /** The fields a click is scored on at the hub (§5.2 step 5): section seen / ≥ 300 ms, each card seen / first seen. */\n const scored = (sec: Snap, items: Item[]) =>\n JSON.stringify([\n sec.seen,\n sec.ms >= NO_SECTION_SEEN_MS,\n items.map((i) => [i.seen, i.fv !== null]),\n ])\n\n const flush = (why: SendReason): boolean => {\n if (!active || !io || sends >= IMPRESSION_SENDS_MAX) return false\n if (sent && why === 'timer') return false\n const now = env.now()\n const sec = snap(section, now)\n if (section.fv === null || sec.ms < 1) return false\n const items: Item[] = order.map((id, pos) => ({ id, pos, ...snap(cards.get(id), now) }))\n const fp = JSON.stringify([sec, items])\n if (sent && fp === last) return false\n const score = scored(sec, items)\n // a click re-sends only when the scoring inputs moved; dwell growth alone waits for `hidden` / `pagehide`\n if (sent && why === 'click' && score === lastScored) return false\n cancelTimer?.()\n cancelTimer = null\n sent = true\n sends += 1\n last = fp\n lastScored = score\n const w = env.win()\n const body: Record<string, unknown> = {\n ...common(now),\n items,\n ss: sec.seen,\n sm: sec.ms,\n vp: withheld() ? { w: 0, h: 0 } : { w: clampVp(w?.innerWidth), h: clampVp(w?.innerHeight) },\n why,\n }\n if (fl.length) body['fl'] = fl\n if (rr !== null) body['rr'] = rr\n // the hub refuses > 4 KB: never-visible cards go first, then the tail (24 slugs of 48 characters fit anyway)\n if (JSON.stringify(body).length > SIGNAL_BODY_MAX) {\n const kept = items.filter((i) => i.fv !== null)\n body['items'] = kept\n while (JSON.stringify(body).length > SIGNAL_BODY_MAX && kept.length) kept.pop()\n }\n post('impression', body, why)\n return true\n }\n\n const activate = () => {\n const IO = env.IO()\n const d = env.doc()\n const w = env.win()\n if (!attached || active || !IO || !d) return // no IntersectionObserver: nothing measured, nothing sent\n active = true\n // one observer per page view, reused across a StrictMode / re-attach cycle\n io ??= new IO((entries) => guard(() => onEntries(entries)), { threshold: VISIBLE_RATIO })\n if (section.el) io.observe(section.el)\n for (const t of cards.values()) if (t.el) io.observe(t.el)\n const vis: Listener = () =>\n guard(() => {\n sync()\n if (d.visibilityState === 'hidden') flush('hidden')\n })\n const hide: Listener = () =>\n guard(() => {\n sync()\n flush('pagehide')\n shown = false\n sync()\n })\n // bfcache restore: same pv, same `sent`; re-open the counted episodes, send nothing\n const show: Listener = () =>\n guard(() => {\n shown = true\n sync()\n })\n d.addEventListener('visibilitychange', vis)\n w?.addEventListener('pagehide', hide)\n w?.addEventListener('pageshow', show)\n off.push(\n () => d.removeEventListener('visibilitychange', vis),\n () => w?.removeEventListener('pagehide', hide),\n () => w?.removeEventListener('pageshow', show),\n )\n sync()\n }\n\n return {\n pv,\n m,\n smp,\n hd,\n get sent() {\n return sent\n },\n setOrder(ids) {\n order = ids.slice(0, SIGNAL_ITEMS_MAX)\n },\n pos(b) {\n const i = order.indexOf(b.id)\n return i >= 0 ? i : Math.min(Math.max(0, b.position), SIGNAL_ITEMS_MAX - 1)\n },\n observe(slug, el) {\n guard(() => {\n const t = cards.get(slug)\n if (t && t.el === el) return\n if (t?.el) io?.unobserve(t.el)\n if (t) {\n t.el = el\n t.inter = false\n sync()\n } else if (el) cards.set(slug, target(el))\n if (el && io && active) io.observe(el)\n })\n },\n start(el) {\n guard(() => {\n if (el) section.el = el\n const d = env.doc()\n if (attached || smp === 0 || !d) return\n attached = true\n if (d.prerendering) {\n const go = () => guard(activate)\n d.addEventListener('prerenderingchange', go, { once: true })\n off.push(() => d.removeEventListener('prerenderingchange', go))\n } else activate()\n })\n },\n stop() {\n guard(() => {\n if (!attached) return\n sync()\n flush('hidden')\n attached = false\n active = false\n cancelTimer?.()\n cancelTimer = null\n io?.disconnect()\n for (const f of off.splice(0)) f()\n sync() // closes the open episodes (not active → not counting)\n })\n },\n common,\n post,\n flushForClick() {\n guard(() => {\n sync()\n flush('click')\n })\n return sent\n },\n flush,\n }\n}\n","/**\n * Signal hooks — spec §5.1 / §6.3. The one place where the section's beacons are decided: the impression (through\n * `PageView`), the click id minted on `pointerdown` (§2.4 self-describing id, `inr=<clickId>` rewrite) and the click\n * signal sent from `click` / `auxclick` / `contextmenu` / `dragstart` (`via`), after the impression is flushed\n * synchronously. Gated by the manifest: nothing at all is sent unless `analytics.enabled`; the impression additionally\n * needs `analytics.impressions` and a sampled-in page view; click ids and click signals need `analytics.clicks` (with\n * clicks off the href is never rewritten, so no `inr` reaches a destination for a click the hub never saw). Each click\n * id is sent once; a click id older than `PENDING_MAX_AGE_MS` is replaced (the hub refuses an id whose minute is more\n * than 10 min from the signal's clock). Everything is mirrored to the site's `onEvent` — the `click` event carries the\n * at-rest href, never the click id, so the site's own tracker cannot store it (§5.3). Handlers never await, never call\n * `preventDefault` and never throw.\n *\n * Release 2b review round 2 (the v2.2 changelog rows the body never stated; addendum WP4):\n * - `inr` is appended only for destinations whose `instrumentation !== 'none'` (Decision row 6): such a destination\n * has no `captureReferral` to strip it, so the id would stay in its URL bar, its analytics and every shared copy. The\n * click is still minted and signalled (§5.8 measures clicks to `none` destinations).\n * - On a `require-consent` site the `hd` bits and the viewport are withheld (`hd: 0`, `vp: 0 × 0`) until consent is\n * granted (GPC counts as a denial), as the §5.9 wording promises.\n * - A DEV build or a localhost page of a production-channel site sends nothing to a non-local hub\n * (`signalsSilenced`); preview sites and a local dev hub are unaffected.\n */\nimport { CLICK_IDS_REMEMBERED } from '../constants.js'\nimport type { ManifestBusiness } from '../verify/schema.js'\nimport { mintClickId, withClickId } from './clickId.js'\nimport { signalsSilenced, type NetworkConfig, type NetworkEvent } from './config.js'\nimport { browserEnv, createPageView, type PageView, type SignalEnv } from './impression.js'\nimport type { DirectoryState } from './loader.js'\n\nexport type ClickVia = 'click' | 'auxclick' | 'contextmenu' | 'drag'\nexport type ClickButton = 0 | 1 | 2\n\n/** A pointerdown id is reused by the click that follows it; one kept longer than this is re-minted at click time. */\nexport const PENDING_MAX_AGE_MS = 5 * 60_000\n\nexport type SignalHooks = {\n /** The section rendered these cards (the Phase 1 `impression` `onEvent` mirror, kept as is). */\n rendered: (ids: string[]) => void\n /** `pointerdown`: mints the card's click id; returns the rewritten href, or `null` when clicks are off. */\n pointerDown: (business: ManifestBusiness, href: string) => string | null\n /**\n * `click` / `auxclick` / `contextmenu` / `dragstart` (or a custom card's `trackClick`): flushes the impression, sends\n * the click signal with the id minted at pointerdown (minted now for a keyboard activation) and returns the href to\n * navigate with (`href` itself when clicks are off).\n */\n click: (business: ManifestBusiness, href: string, via: ClickVia, button: ClickButton) => string\n /** Card element registration for per-card viewability (ref callbacks). */\n observe: (slug: string, el: Element | null) => void\n /** Rendered order: `pos` on the impression items and on the click signal. */\n setOrder: (ids: readonly string[]) => void\n /** From the component's effect with the `<section>` element; the cleanup calls `stop()`. */\n start: (section: Element | null) => void\n stop: () => void\n /** `null` when analytics is off in the manifest, nothing is loaded, or the runtime has no CSPRNG. */\n readonly page: PageView | null\n}\n\nexport function createSignalHooks(\n getConfig: () => NetworkConfig | null,\n state: DirectoryState,\n env: SignalEnv = browserEnv,\n): SignalHooks {\n const emit = (e: NetworkEvent) => {\n try {\n getConfig()?.onEvent?.(e)\n } catch {\n /* a site tracker must never break the section */\n }\n }\n const manifest = state.manifest\n const src = state.source\n let page: PageView | null = null\n try {\n const cfg = getConfig()\n const silent =\n cfg !== null && signalsSilenced(cfg, env.host?.(), manifest?.analytics.endpoint ?? null)\n if (manifest && !silent && manifest.analytics.enabled && (src === 'live' || src === 'fallback'))\n page = createPageView(\n {\n manifest,\n src,\n flags: state.flags,\n rr: state.rr,\n onSignal: (kind, sent, why) =>\n emit({ type: 'signal', payload: why ? { kind, sent, why } : { kind, sent } }),\n withhold: () => {\n const c = getConfig()\n return (\n c?.consentMode === 'require-consent' &&\n !(c.consent?.get() === 'granted' && env.nav()?.globalPrivacyControl !== true)\n )\n },\n },\n env,\n )\n } catch {\n page = null\n }\n const clicksOn = page !== null && manifest !== null && manifest.analytics.clicks\n /** Click id minted at pointerdown, consumed by the next click-like event on that card. */\n const pending = new Map<string, { id: string; at: number }>()\n /** Ids already signalled for this page view (send each click id once). */\n const sentIds: string[] = []\n const mint = (b: ManifestBusiness) =>\n manifest ? mintClickId(manifest.siteIndex, b.idx, env.now(), env.random) : null\n const safe = (fn: () => void) => {\n try {\n fn()\n } catch {\n /* the section never throws */\n }\n }\n\n return {\n page,\n rendered(ids) {\n emit({ type: 'impression', payload: { ids, revision: manifest?.revision ?? null } })\n },\n pointerDown(business, href) {\n let out: string | null = null\n safe(() => {\n if (!clicksOn) return\n const id = mint(business)\n if (!id) return\n pending.set(business.id, { id, at: env.now() })\n if (business.instrumentation !== 'none') out = withClickId(href, id)\n })\n return out\n },\n click(business, href, via, button) {\n let out = href\n safe(() => {\n if (!clicksOn || !page) return\n const p = pending.get(business.id)\n pending.delete(business.id)\n const id = p && env.now() - p.at <= PENDING_MAX_AGE_MS ? p.id : mint(business)\n if (!id) return\n if (business.instrumentation !== 'none') out = withClickId(href, id)\n if (sentIds.includes(id)) return\n sentIds.push(id)\n if (sentIds.length > CLICK_IDS_REMEMBERED) sentIds.shift()\n // §5.1: the impression is flushed synchronously before the click signal; `ip` says whether one exists\n const ip = page.flushForClick()\n page.post('click', {\n ...page.common(env.now()),\n c: id,\n b: business.id,\n pos: page.pos(business),\n btn: button,\n via,\n ip,\n })\n })\n emit({ type: 'click', payload: { id: business.id, href, via } })\n return out\n },\n observe: (slug, el) => safe(() => page?.observe(slug, el)),\n setOrder: (ids) => safe(() => page?.setOrder(ids)),\n start: (section) => safe(() => page?.start(section)),\n stop: () => safe(() => page?.stop()),\n }\n}\n","/**\n * Strict base64url without padding (browser-safe, no Buffer) — spec §4.5 \"Signature encoding\", KNOWN-ISSUES 21(c).\n * A string is accepted only when it is THE canonical encoding of exactly `bytes` bytes: right length, alphabet only,\n * and zero spare low bits in the last character, so two strings can never decode to the same value.\n */\nconst ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'\nconst LOOKUP: Record<string, number> = {}\nfor (let i = 0; i < 64; i++) LOOKUP[ALPHABET[i]!] = i\n\nexport function isBase64urlAlphabet(s: string): boolean {\n return /^[A-Za-z0-9_-]*$/.test(s)\n}\n\n/** Decodes a canonical base64url string of exactly `bytes` bytes; `null` for anything else. */\nexport function decodeCanonicalBase64url(\n s: unknown,\n bytes: number,\n): Uint8Array<ArrayBuffer> | null {\n if (typeof s !== 'string' || !isBase64urlAlphabet(s)) return null\n if (s.length !== Math.ceil((bytes * 4) / 3)) return null\n const out = new Uint8Array(bytes)\n let acc = 0\n let bits = 0\n let o = 0\n for (let i = 0; i < s.length; i++) {\n acc = ((acc << 6) | LOOKUP[s[i]!]!) & 0xffff\n bits += 6\n if (bits >= 8) {\n bits -= 8\n if (o >= bytes) return null\n out[o++] = (acc >> bits) & 0xff\n }\n }\n if (o !== bytes) return null\n // spare bits (the low `bits` bits of `acc`) must be zero\n if (bits > 0 && (acc & ((1 << bits) - 1)) !== 0) return null\n return out\n}\n\nexport function encodeBase64url(bytes: Uint8Array): string {\n let s = ''\n let acc = 0\n let bits = 0\n for (const b of bytes) {\n acc = ((acc << 8) | b) & 0xffff\n bits += 8\n while (bits >= 6) {\n bits -= 6\n s += ALPHABET[(acc >> bits) & 63]\n }\n }\n if (bits > 0) s += ALPHABET[(acc << (6 - bits)) & 63]\n return s\n}\n\nexport function bytesToHex(b: Uint8Array): string {\n let h = ''\n for (const x of b) h += x.toString(16).padStart(2, '0')\n return h\n}\n","/**\n * Strict schema-2 manifest validator — a hand-written port of packages/shared `ManifestSchema` (spec §4.3) so the\n * browser bundle carries no zod. Every object is strict (unknown keys reject), every number is an integer, absent\n * optional values are `null`, string limits count Unicode code points (zod 4 `.max()` semantics). Differences from the\n * hub's schema are listed in docs/spec-addendum (Phase 1c):\n * - destination/base URLs: no public-suffix check (the hub uses tldts; 50 KB is not worth it in a homepage bundle);\n * the SDK still requires `https:`, a dotted lowercase hostname, no IP literal, no userinfo, no port (or 443),\n * and the string to be its own normalisation.\n * - dates: `YYYY-MM-DDTHH:mm:ss(.sss)?Z` only (KNOWN-ISSUES 21(b)); the worker emits `toISOString()`; the signer\n * window must also be its own `toISOString()` in both verifiers (K23).\n * - destination URLs: after the authority only RFC 3986 characters (`URL_TAIL_RE`, as in the hub's schema).\n */\nimport { MANIFEST_SCHEMA_MAJOR } from '../constants.js'\n\nexport type PublicJwk = { kty: 'EC'; crv: 'P-256'; x: string; y: string }\nexport type ManifestImage = { src: string; src2x: string; alt: string; width: 640; height: 360 }\nexport type Instrumentation = 'none' | 'landings' | 'conversions'\nexport type ManifestBusiness = {\n id: string\n idx: number\n name: string\n description: string\n url: string\n domain: string\n image: ManifestImage\n category: string | null\n location: string | null\n region: string | null\n tags: string[]\n pinned: boolean\n position: number\n instrumentation: Instrumentation\n}\nexport type ManifestSigner = {\n kid: string\n jwk: PublicJwk\n notBefore: string\n notAfter: string\n rootKid: string\n rootSig: string\n revokedKids: string[]\n}\nexport type ManifestSig = { alg: 'ES256'; kid: string; value: string }\nexport type ManifestAnalytics = {\n enabled: boolean\n endpoint: string\n impressions: boolean\n clicks: boolean\n landings: boolean\n samplePermille: number\n token: string\n}\nexport type ManifestLinks = {\n utmMedium: string\n utmCampaign: string\n utmSource: string\n refParam: string\n nofollow: boolean\n}\nexport type Manifest = {\n schema: 2\n revision: number\n publishedAt: string\n site: string\n siteIndex: number\n channel: 'production' | 'preview'\n cdnBase: string\n minSdkVersion: string\n analytics: ManifestAnalytics\n links: ManifestLinks\n section: { title: string; subtitle: string | null }\n businesses: ManifestBusiness[]\n signer: ManifestSigner\n sig: ManifestSig\n}\n\n// Limits (packages/shared directory.ts LISTING_LIMITS, SLUG_MAX, MAX_ITEMS_CEILING)\nexport const SLUG_RE = /^[a-z0-9]+(-[a-z0-9]+)*$/\nconst SLUG_MAX = 48\nexport const MAX_ITEMS_CEILING = 24\nexport const KID_RE = /^[a-z0-9][a-z0-9-]{1,63}$/\n/** 64 bytes → 86 chars, last one with 4 spare bits zero; 32 bytes → 43 chars, 2 spare bits zero. */\nexport const P1363_RE = /^[A-Za-z0-9_-]{85}[AQgw]$/\nexport const COORD_RE = /^[A-Za-z0-9_-]{42}[AEIMQUYcgkosw048]$/\nexport const ISO_DATE_RE = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{3})?Z$/\nconst TOKEN_RE = /^[a-z0-9-]+\\.\\d+\\.\\d{8}\\.[0-9a-f]{12}$/\nconst HOST_RE = /^[a-z0-9.-]+$/\n/** packages/shared `URL_TAIL_RE`: RFC 3986 path / query / fragment characters only, one `#` (K23 verdict parity). */\nconst URL_TAIL_RE =\n /^([\\w.~!$&'()*+,;=:@/?-]|%[\\da-f]{2})*(#([\\w.~!$&'()*+,;=:@/?-]|%[\\da-f]{2})*)?$/i\n\nclass Invalid extends Error {}\nexport const fail = (): never => {\n throw new Invalid()\n}\n\ntype Rec = Record<string, unknown>\nfunction obj(v: unknown, keys: readonly string[]): Rec {\n if (v === null || typeof v !== 'object' || Array.isArray(v)) fail()\n const o = v as Rec\n for (const k of Object.keys(o)) if (!keys.includes(k)) fail()\n for (const k of keys) if (!(k in o)) fail()\n return o\n}\n/**\n * String length in Unicode code points, like zod 4's `.min()` / `.max()` (an emoji counts once, not twice as in\n * `String.prototype.length`); otherwise a hub-signed manifest full of astral characters would fail here.\n */\nfunction codePoints(s: string): number {\n let n = 0\n for (const _ of s) n++\n return n\n}\nfunction str(v: unknown, min: number, max: number): string {\n if (typeof v !== 'string') fail()\n const n = codePoints(v as string)\n if (n < min || n > max) fail()\n return v as string\n}\nfunction re(v: unknown, r: RegExp, max = 1024): string {\n const s = str(v, 0, max)\n if (!r.test(s)) fail()\n return s\n}\nfunction int(v: unknown, min: number, max: number): number {\n if (typeof v !== 'number' || !Number.isInteger(v) || v < min || v > max) fail()\n return v as number\n}\nfunction bool(v: unknown): boolean {\n if (typeof v !== 'boolean') fail()\n return v as boolean\n}\nfunction nullable<T>(v: unknown, f: (x: unknown) => T): T | null {\n return v === null ? null : f(v)\n}\nfunction literal<T extends string | number>(v: unknown, lit: T): T {\n if (v !== lit) fail()\n return lit\n}\nfunction oneOf<T extends string>(v: unknown, list: readonly T[]): T {\n if (typeof v !== 'string' || !list.includes(v as T)) fail()\n return v as T\n}\n\n/** `cdnBase`, `analytics.endpoint`, image URLs: absolute; `http:` only for a local development host. */\nexport function baseUrlProblem(v: string): string | null {\n let u: URL\n try {\n u = new URL(v)\n } catch {\n return 'must be an absolute URL'\n }\n const local = u.hostname === 'localhost' || u.hostname === '127.0.0.1'\n if (u.protocol !== 'https:' && !(u.protocol === 'http:' && local)) return 'must be https'\n if (u.username || u.password || u.search || u.hash) return 'no userinfo, query or fragment'\n return null\n}\nfunction baseUrl(v: unknown): string {\n const s = str(v, 1, 1024)\n if (baseUrlProblem(s) !== null) fail()\n return s\n}\n\n/** §2.2 `url`: absolute `https:`, ≤ 200, public-looking hostname, no IP literal / userinfo / port, normalised. */\nexport function destinationUrlProblem(v: string): string | null {\n if (v.length > 200) return 'must be at most 200 characters'\n let u: URL\n try {\n u = new URL(v)\n } catch {\n return 'must be an absolute URL'\n }\n if (u.protocol !== 'https:') return 'must use https'\n if (u.username || u.password) return 'must not contain credentials'\n if (u.port !== '' && u.port !== '443') return 'port must be 443'\n const host = u.hostname\n if (host.startsWith('[') || /^\\d+(\\.\\d+){3}$/.test(host)) return 'IP addresses are not allowed'\n if (!HOST_RE.test(host) || !host.includes('.') || host.startsWith('.') || host.endsWith('.'))\n return 'invalid hostname'\n if (u.toString() !== v || !URL_TAIL_RE.test(v.slice(u.origin.length))) return 'must be normalised'\n return null\n}\nfunction destinationUrl(v: unknown): string {\n const s = str(v, 1, 200)\n if (destinationUrlProblem(s) !== null) fail()\n return s\n}\n\nexport function parsePublicJwk(v: unknown): PublicJwk {\n const o = obj(v, ['kty', 'crv', 'x', 'y'])\n return {\n kty: literal(o['kty'], 'EC'),\n crv: literal(o['crv'], 'P-256'),\n x: re(o['x'], COORD_RE),\n y: re(o['y'], COORD_RE),\n }\n}\n\nfunction image(v: unknown): ManifestImage {\n const o = obj(v, ['src', 'src2x', 'alt', 'width', 'height'])\n return {\n src: baseUrl(o['src']),\n src2x: baseUrl(o['src2x']),\n alt: str(o['alt'], 1, 120),\n width: literal(o['width'], 640),\n height: literal(o['height'], 360),\n }\n}\n\nconst BUSINESS_KEYS = [\n 'id',\n 'idx',\n 'name',\n 'description',\n 'url',\n 'domain',\n 'image',\n 'category',\n 'location',\n 'region',\n 'tags',\n 'pinned',\n 'position',\n 'instrumentation',\n] as const\n\nfunction business(v: unknown): ManifestBusiness {\n const o = obj(v, BUSINESS_KEYS)\n const name = str(o['name'], 2, 60)\n if (/^[=+@]/.test(name)) fail()\n const domain = re(o['domain'], HOST_RE, 253)\n if (domain.length < 1 || domain.startsWith('www.')) fail()\n const tags = o['tags']\n if (!Array.isArray(tags) || tags.length > 10) fail()\n return {\n id: re(o['id'], SLUG_RE, SLUG_MAX),\n idx: int(o['idx'], 1, 65535),\n name,\n description: str(o['description'], 1, 140),\n url: destinationUrl(o['url']),\n domain,\n image: image(o['image']),\n category: nullable(o['category'], (x) => str(x, 0, 40)),\n location: nullable(o['location'], (x) => str(x, 0, 60)),\n region: nullable(o['region'], (x) => str(x, 0, 40)),\n tags: (tags as unknown[]).map((t) => str(t, 0, 24)),\n pinned: bool(o['pinned']),\n position: int(o['position'], 0, MAX_ITEMS_CEILING - 1),\n instrumentation: oneOf(o['instrumentation'], ['none', 'landings', 'conversions'] as const),\n }\n}\n\nfunction signer(v: unknown): ManifestSigner {\n const o = obj(v, ['kid', 'jwk', 'notBefore', 'notAfter', 'rootKid', 'rootSig', 'revokedKids'])\n const revoked = o['revokedKids']\n if (!Array.isArray(revoked)) fail()\n return {\n kid: re(o['kid'], KID_RE),\n jwk: parsePublicJwk(o['jwk']),\n notBefore: re(o['notBefore'], ISO_DATE_RE),\n notAfter: re(o['notAfter'], ISO_DATE_RE),\n rootKid: re(o['rootKid'], KID_RE),\n rootSig: re(o['rootSig'], P1363_RE),\n revokedKids: (revoked as unknown[]).map((k) => re(k, KID_RE)),\n }\n}\n\nconst MANIFEST_KEYS = [\n 'schema',\n 'revision',\n 'publishedAt',\n 'site',\n 'siteIndex',\n 'channel',\n 'cdnBase',\n 'minSdkVersion',\n 'analytics',\n 'links',\n 'section',\n 'businesses',\n 'signer',\n 'sig',\n] as const\n\n/** Returns the typed manifest, or `null` when the input is not a valid schema-2 manifest. Never throws. */\nexport function parseManifest(input: unknown): Manifest | null {\n try {\n const o = obj(input, MANIFEST_KEYS)\n const a = obj(o['analytics'], [\n 'enabled',\n 'endpoint',\n 'impressions',\n 'clicks',\n 'landings',\n 'samplePermille',\n 'token',\n ])\n const l = obj(o['links'], ['utmMedium', 'utmCampaign', 'utmSource', 'refParam', 'nofollow'])\n const sec = obj(o['section'], ['title', 'subtitle'])\n const sig = obj(o['sig'], ['alg', 'kid', 'value'])\n const list = o['businesses']\n if (!Array.isArray(list) || list.length > MAX_ITEMS_CEILING) fail()\n return {\n schema: literal(o['schema'], MANIFEST_SCHEMA_MAJOR as 2),\n revision: int(o['revision'], 1, Number.MAX_SAFE_INTEGER),\n publishedAt: re(o['publishedAt'], ISO_DATE_RE),\n site: re(o['site'], SLUG_RE, SLUG_MAX),\n siteIndex: int(o['siteIndex'], 1, 65535),\n channel: oneOf(o['channel'], ['production', 'preview'] as const),\n cdnBase: baseUrl(o['cdnBase']),\n minSdkVersion: re(o['minSdkVersion'], /^\\d+\\.\\d+\\.\\d+$/),\n analytics: {\n enabled: bool(a['enabled']),\n endpoint: baseUrl(a['endpoint']),\n impressions: bool(a['impressions']),\n clicks: bool(a['clicks']),\n landings: bool(a['landings']),\n samplePermille: int(a['samplePermille'], 0, 1000),\n token: re(a['token'], TOKEN_RE),\n },\n links: {\n utmMedium: str(l['utmMedium'], 1, 40),\n utmCampaign: str(l['utmCampaign'], 1, 40),\n utmSource: re(l['utmSource'], SLUG_RE, SLUG_MAX),\n refParam: re(l['refParam'], /^[a-z]{1,8}$/),\n nofollow: bool(l['nofollow']),\n },\n section: {\n title: str(sec['title'], 1, 60),\n subtitle: nullable(sec['subtitle'], (x) => str(x, 0, 120)),\n },\n businesses: (list as unknown[]).map(business),\n signer: signer(o['signer']),\n sig: {\n alg: literal(sig['alg'], 'ES256'),\n kid: re(sig['kid'], KID_RE),\n value: re(sig['value'], P1363_RE),\n },\n }\n } catch {\n return null\n }\n}\n","/**\n * ECDSA P-256 / SHA-256 with IEEE P1363 (`r ‖ s`, 64 bytes) signatures through WebCrypto — spec §4.5, KNOWN-ISSUES\n * 21(c). WebCrypto accepts the high-S twin of every signature and does not care how the bytes were encoded, so the\n * strict checks of packages/shared `verifyP1363` are re-implemented here BEFORE `crypto.subtle.verify` runs:\n * canonical base64url of exactly 64 bytes, `1 ≤ r < n`, `1 ≤ s ≤ n/2` (low-S). Never throws.\n */\nimport { bytesToHex, decodeCanonicalBase64url } from './base64url.js'\nimport { parsePublicJwk } from './schema.js'\n\n/** The order n of the P-256 group. */\nexport const P256_N = BigInt('0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551')\nconst HALF_N = P256_N >> 1n\n\nexport type PublicJwk = { kty: 'EC'; crv: 'P-256'; x: string; y: string }\n\n/**\n * `crypto.subtle` when the context has it (secure contexts; Node ≥ 19, or Node 18 once the CLI entry polyfills it from\n * `node:crypto`); `null` on `http://<lan-ip>`.\n */\nexport function subtle(): SubtleCrypto | null {\n const c = (globalThis as { crypto?: Crypto }).crypto\n return c && c.subtle ? c.subtle : null\n}\n\n/** The structural checks alone (no key, no hashing): used by the verifier and by the tests. */\nexport function p1363Problem(signature: unknown): 'encoding' | 'range' | null {\n const sig = decodeCanonicalBase64url(signature, 64)\n if (!sig) return 'encoding'\n const r = BigInt(`0x${bytesToHex(sig.subarray(0, 32))}`)\n const s = BigInt(`0x${bytesToHex(sig.subarray(32))}`)\n if (r === 0n || r >= P256_N || s === 0n || s > HALF_N) return 'range'\n return null\n}\n\nconst keyCache = new WeakMap<object, Promise<CryptoKey>>()\n\n/**\n * A root key from the site's options is not schema-checked by the manifest parse, so the four members are checked\n * here (parsePublicJwk throws): kty `EC`, crv `P-256`, x / y canonical 43-character base64url, as the hub requires of\n * its own roots (`PublicJwkSchema`). No engine then imports what another refuses (K23: Firefox took `p-256`, WebKit a\n * padded x, every engine `kty: \"ec\"` or none, as importKey was handed kty `EC`, while Node refuses them). Other\n * members are ignored (never imported).\n */\nasync function importKey(jwk: PublicJwk, api: SubtleCrypto): Promise<CryptoKey> {\n const hit = keyCache.get(jwk)\n if (hit) return hit\n const { kty, crv, x, y } = jwk\n const p = api.importKey(\n 'jwk',\n { ...parsePublicJwk({ kty, crv, x, y }), ext: true },\n { name: 'ECDSA', namedCurve: 'P-256' },\n false,\n ['verify'],\n )\n keyCache.set(jwk, p)\n return p\n}\n\n/**\n * Verify `signature` (base64url P1363) over the UTF-8 bytes of `data` with a P-256 public JWK. Returns `false` on any\n * malformed input, on a high-S twin, on a non-canonical encoding and when WebCrypto is unavailable.\n */\nexport async function verifyP1363(\n jwk: PublicJwk,\n data: string,\n signature: unknown,\n): Promise<boolean> {\n try {\n const api = subtle()\n if (!api) return false\n if (p1363Problem(signature) !== null) return false\n const sig = decodeCanonicalBase64url(signature, 64)!\n const key = await importKey(jwk, api)\n return await api.verify(\n { name: 'ECDSA', hash: 'SHA-256' },\n key,\n sig,\n new TextEncoder().encode(data),\n )\n } catch {\n return false\n }\n}\n","/** Browser-safe copy of packages/shared canonicalJson (spec §4.5); both run the same vectors in CI. */\nexport class CanonicalJsonError extends Error {\n constructor(\n message: string,\n public readonly path: string,\n ) {\n super(`${message} at ${path || '$'}`)\n this.name = 'CanonicalJsonError'\n }\n}\nexport function canonicalJson(value: unknown): string {\n return serialise(value, '$')\n}\nfunction serialise(v: unknown, path: string): string {\n if (v === null) return 'null'\n switch (typeof v) {\n case 'boolean':\n return v ? 'true' : 'false'\n case 'string':\n return JSON.stringify(v)\n case 'number':\n if (!Number.isSafeInteger(v))\n throw new CanonicalJsonError(`non-integer or unsafe number ${String(v)}`, path)\n return String(v)\n case 'object': {\n if (Array.isArray(v)) return `[${v.map((x, i) => serialise(x, `${path}[${i}]`)).join(',')}]`\n const proto = Object.getPrototypeOf(v)\n if (proto !== Object.prototype && proto !== null)\n throw new CanonicalJsonError('unsupported object type', path)\n const obj = v as Record<string, unknown>\n return `{${Object.keys(obj)\n .sort()\n .map((k) => {\n const child = obj[k]\n if (child === undefined)\n throw new CanonicalJsonError(`undefined value for key \"${k}\" (use null)`, path)\n return `${JSON.stringify(k)}:${serialise(child, `${path}.${k}`)}`\n })\n .join(',')}}`\n }\n default:\n throw new CanonicalJsonError(`unsupported type ${typeof v}`, path)\n }\n}\n","/**\n * The SDK manifest verifier — spec §4.5 (steps 1–4 and the `source: 'fallback'` exception), §4.6 (identity),\n * KNOWN-ISSUES 21(c). Mirrors packages/shared `verifyManifest` / `verifyManifestBytes` (the reference, Node) check for\n * check so both sides agree on accept/reject for the shared vectors; WebCrypto replaces node:crypto, and the strict\n * low-S / canonical-encoding / canonical-bytes checks are done here because WebCrypto does not do them. Never throws.\n */\nimport { canonicalJson } from '../canonicalJson.js'\nimport { MANIFEST_MAX_BYTES, SIGNER_GRACE_MS } from '../constants.js'\nimport { verifyP1363, type PublicJwk } from './p1363.js'\nimport { fail, parseManifest, type Manifest, type ManifestSigner } from './schema.js'\n\nexport type RootKey = { kid: string; jwk: PublicJwk }\nexport type ManifestVerifyReason =\n | 'malformed'\n | 'identity'\n | 'root_unknown'\n | 'root_sig'\n | 'window'\n | 'kid_mismatch'\n | 'sig'\n | 'revoked'\nexport type ManifestVerifyResult =\n { ok: true; manifest: Manifest } | { ok: false; reason: ManifestVerifyReason }\n\nexport type VerifyManifestOptions = {\n /** Trusted root public keys (`rootPublicKeys` or `manifestRootKeys`); empty → `root_unknown`. */\n roots: readonly RootKey[]\n /** Must be a finite date. */\n now: Date\n /** `site`, `channel` and `links.utmSource` must match. */\n expect: { site: string; channel: 'production' | 'preview' }\n /** `live`: window applies and the trusted `revokedKids` is required. `fallback`: only the window is skipped. */\n source: 'live' | 'fallback'\n revokedKids?: readonly string[]\n}\n\n/** §4.5: `rootSig` covers `canonical({ kid, jwk, notBefore, notAfter, rootKid })`. */\nexport function certificatePayload(s: ManifestSigner): string {\n return canonicalJson({\n kid: s.kid,\n jwk: { kty: s.jwk.kty, crv: s.jwk.crv, x: s.jwk.x, y: s.jwk.y },\n notBefore: s.notBefore,\n notAfter: s.notAfter,\n rootKid: s.rootKid,\n })\n}\n\n/** The manifest minus `sig`: the bytes `sig.value` covers. */\nexport function signedPayload(m: Manifest): string {\n const { sig: _sig, ...payload } = m\n return canonicalJson(payload)\n}\n\nconst isKidList = (v: unknown): v is readonly string[] =>\n Array.isArray(v) && v.every((k) => typeof k === 'string')\n\n/**\n * Date.parse of the strict `…Z` form (the schema enforces the shape) that is also its own `toISOString()`, like\n * packages/shared `strictIsoTime` (K23: engines disagree on 2027-02-30, T24:00, second 60). With the shape fixed,\n * comparing the first 19 characters is the same rule (the `.sss` part, when present, always parses as written).\n * Anything else throws (`verifyManifest` answers `malformed`), so the result is always finite.\n */\nfunction parseIso(s: string): number {\n const t = Date.parse(s)\n if (!new Date(t).toISOString().startsWith(s.slice(0, 19))) fail()\n return t\n}\n\nexport async function verifyManifest(\n input: unknown,\n opts: VerifyManifestOptions,\n): Promise<ManifestVerifyResult> {\n try {\n if (!opts || typeof opts !== 'object') return { ok: false, reason: 'malformed' }\n const t = opts.now instanceof Date ? opts.now.getTime() : NaN\n if (!Number.isFinite(t)) return { ok: false, reason: 'malformed' }\n if (opts.source !== 'live' && opts.source !== 'fallback')\n return { ok: false, reason: 'malformed' }\n if (\n !opts.expect ||\n typeof opts.expect.site !== 'string' ||\n typeof opts.expect.channel !== 'string'\n )\n return { ok: false, reason: 'malformed' }\n if (opts.source === 'live' && !isKidList(opts.revokedKids))\n return { ok: false, reason: 'malformed' }\n if (opts.revokedKids !== undefined && !isKidList(opts.revokedKids))\n return { ok: false, reason: 'malformed' }\n const m = parseManifest(input)\n if (!m) return { ok: false, reason: 'malformed' }\n // (0) identity — §4.6: the manifest must be the one this site asked for\n if (\n m.site !== opts.expect.site ||\n m.channel !== opts.expect.channel ||\n m.links.utmSource !== opts.expect.site\n )\n return { ok: false, reason: 'identity' }\n const s = m.signer\n // (1) root certificate\n const roots = Array.isArray(opts.roots) ? opts.roots : []\n const root = roots.find((r) => r && r.kid === s.rootKid)\n if (!root) return { ok: false, reason: 'root_unknown' }\n if (!(await verifyP1363(root.jwk, certificatePayload(s), s.rootSig)))\n return { ok: false, reason: 'root_sig' }\n // (2) time window — live only (§4.5 fallback exception)\n const notBefore = parseIso(s.notBefore)\n const notAfter = parseIso(s.notAfter)\n if (notAfter < notBefore) return { ok: false, reason: 'malformed' }\n if (opts.source === 'live' && (t < notBefore || t > notAfter + SIGNER_GRACE_MS))\n return { ok: false, reason: 'window' }\n // (3) manifest signature\n if (m.sig.kid !== s.kid) return { ok: false, reason: 'kid_mismatch' }\n if (!(await verifyP1363(s.jwk, signedPayload(m), m.sig.value)))\n return { ok: false, reason: 'sig' }\n // (4) revocation: the trusted list (the bundled fallback's) and the signer's own\n if ((opts.revokedKids ?? []).includes(m.sig.kid) || s.revokedKids.includes(m.sig.kid))\n return { ok: false, reason: 'revoked' }\n return { ok: true, manifest: m }\n } catch {\n return { ok: false, reason: 'malformed' }\n }\n}\n\n/**\n * The bytes entry point for a fetched manifest: refuses input over 24 KB before decoding or parsing, decodes fatal\n * UTF-8 **keeping** a leading BOM (which then fails to parse), requires `canonicalJson(JSON.parse(raw)) === raw`\n * (no whitespace, sorted keys, no duplicate keys, no alternative escapes), then `verifyManifest`.\n */\nexport async function verifyManifestBytes(\n raw: string | Uint8Array,\n opts: VerifyManifestOptions,\n): Promise<ManifestVerifyResult> {\n try {\n let text: string\n if (typeof raw === 'string') {\n if (\n raw.length > MANIFEST_MAX_BYTES ||\n new TextEncoder().encode(raw).length > MANIFEST_MAX_BYTES\n )\n return { ok: false, reason: 'malformed' }\n text = raw\n } else {\n if (!(raw instanceof Uint8Array) || raw.length > MANIFEST_MAX_BYTES)\n return { ok: false, reason: 'malformed' }\n text = new TextDecoder('utf-8', { fatal: true, ignoreBOM: true }).decode(raw)\n }\n const parsed: unknown = JSON.parse(text)\n if (canonicalJson(parsed) !== text) return { ok: false, reason: 'malformed' }\n return await verifyManifest(parsed, opts)\n } catch {\n return { ok: false, reason: 'malformed' }\n }\n}\n","/**\n * Directory loader — spec §6.3 (`useNetworkDirectory` behaviour), §4.5 (verification, fallback exception), §4.6\n * (fallback identity, rollback floor with one `cache: 'reload'` retry, insecure contexts, 4 s AbortController fetch).\n * Framework-free so the hook, the tests and (later) a non-React site can share it. Never throws, never toasts.\n */\nimport { FETCH_TIMEOUT_MS, SDK_VERSION } from '../constants.js'\nimport { subtle } from '../verify/p1363.js'\nimport { parseManifest, type Manifest, type ManifestBusiness } from '../verify/schema.js'\nimport {\n verifyManifest,\n verifyManifestBytes,\n type ManifestVerifyReason,\n type ManifestVerifyResult,\n type RootKey,\n} from '../verify/verifyManifest.js'\nimport type { NetworkConfig } from './config.js'\n\nexport type DirectorySource = 'live' | 'fallback' | 'empty'\n/** §5.1 flag vocabulary (the subset the directory path sets) plus the SDK-local `fetch_fail` / `insecure_context`. */\nexport type DirectoryFlag =\n | 'sig_fail'\n | 'sig_revoked'\n | 'rev_rollback'\n | 'stale_cache'\n | 'fallback_invalid'\n | 'fallback_key_expired'\n | 'sitekey_from_fallback'\n | 'sdk_outdated'\n | 'fetch_fail'\n | 'insecure_context'\n\nexport type DirectoryState = {\n businesses: ManifestBusiness[]\n loading: boolean\n source: DirectorySource\n revision: number | null\n manifest: Manifest | null\n flags: DirectoryFlag[]\n /**\n * The revision of the live manifest rejected below the floor (`rev_rollback`) or first received stale and resolved\n * by the reload (`stale_cache`); sent as `rr` with those flags so the hub can judge the `manifest_replay` tolerance\n * (§4.6). `null` otherwise.\n */\n rr: number | null\n}\n\nexport const INITIAL_STATE: DirectoryState = {\n businesses: [],\n loading: true,\n source: 'empty',\n revision: null,\n manifest: null,\n flags: [],\n rr: null,\n}\n\nexport type LoaderDeps = {\n fetch?: typeof fetch | undefined\n now?: () => Date\n hostname?: string\n warn?: (message: string) => void\n}\n\n/** `sync-fallback --allow-empty` writes this shape (no signer, no sig): an explicit \"no content\", not an invalid file. */\nexport function isEmptyPlaceholder(fb: unknown): boolean {\n if (fb === null || typeof fb !== 'object') return false\n const o = fb as Record<string, unknown>\n return (\n o['schema'] === 2 &&\n o['revision'] === 0 &&\n Array.isArray(o['businesses']) &&\n o['businesses'].length === 0 &&\n !('sig' in o)\n )\n}\n\n/** `major.minor.patch` of `a` is greater than `b` (prerelease tags ignored). */\nexport function semverGreater(a: string, b: string): boolean {\n const pa = a.split('-')[0]!.split('.').map(Number)\n const pb = b.split('-')[0]!.split('.').map(Number)\n for (let i = 0; i < 3; i++) {\n const x = pa[i] ?? 0\n const y = pb[i] ?? 0\n if (x !== y) return x > y\n }\n return false\n}\n\ntype VerifyMode = 'full' | 'unverified'\n\n/** Schema + identity only (dev insecure context, `verifySignature: false`, `allowInsecureFallback`). */\nfunction parseUnverified(\n input: unknown,\n expect: { site: string; channel: 'production' | 'preview' },\n): ManifestVerifyResult {\n const m = parseManifest(input)\n if (!m) return { ok: false, reason: 'malformed' }\n if (m.site !== expect.site || m.channel !== expect.channel || m.links.utmSource !== expect.site)\n return { ok: false, reason: 'identity' }\n return { ok: true, manifest: m }\n}\n\n/**\n * The served bytes, not `res.text()`: `text()` strips a leading BOM, which would let a BOM twin of the signed bytes\n * verify here while the hub (and `verifyManifestBytes`, fatal UTF-8 with `ignoreBOM: true`) rejects it.\n */\nasync function fetchWithTimeout(\n f: typeof fetch,\n url: string,\n cache: RequestCache,\n): Promise<Uint8Array | null> {\n const ac = new AbortController()\n const timer = setTimeout(() => ac.abort(), FETCH_TIMEOUT_MS)\n try {\n const res = await f(url, {\n mode: 'cors',\n credentials: 'omit',\n cache,\n signal: ac.signal,\n })\n if (!res.ok) return null\n return new Uint8Array(await res.arrayBuffer())\n } catch {\n return null\n } finally {\n clearTimeout(timer)\n }\n}\n\nfunction belowFloor(live: Manifest, floor: Manifest): boolean {\n return (\n live.revision < floor.revision || Date.parse(live.publishedAt) < Date.parse(floor.publishedAt)\n )\n}\n\nconst reasonFlag = (r: ManifestVerifyReason): DirectoryFlag =>\n r === 'revoked' ? 'sig_revoked' : 'sig_fail'\n\nexport async function loadDirectory(\n config: NetworkConfig,\n deps: LoaderDeps = {},\n): Promise<DirectoryState> {\n const flags: DirectoryFlag[] = []\n let rr: number | null = null\n const warn = deps.warn ?? ((m: string) => console.warn(`[network-sdk] ${m}`))\n const devWarn = (m: string) => {\n if (config.dev) warn(m)\n }\n try {\n const f = deps.fetch ?? (typeof fetch === 'function' ? fetch.bind(globalThis) : undefined)\n const now = (deps.now ?? (() => new Date()))()\n const expect = { site: config.siteKey, channel: config.channel }\n const roots: readonly RootKey[] = config.roots\n if (config.siteKeyFromFallback) flags.push('sitekey_from_fallback')\n if (!config.siteKey) {\n devWarn('no siteKey and no fallback.site: rendering nothing (§4.6)')\n return done('empty', null, flags)\n }\n\n // §4.6 insecure contexts and the verifySignature switch\n let mode: VerifyMode = 'full'\n const insecure = subtle() === null\n if (!config.verifySignature) {\n mode = 'unverified'\n devWarn('verifySignature is false: signatures are NOT checked')\n } else if (insecure) {\n flags.push('insecure_context')\n if (config.dev) {\n mode = 'unverified'\n warn(\n 'crypto.subtle is unavailable (insecure context): signature verification skipped in dev (§4.6)',\n )\n } else if (config.allowInsecureFallback) {\n const r = parseUnverified(config.fallback, expect)\n return r.ok ? done('fallback', r.manifest, flags) : done('empty', null, flags)\n } else {\n return done('empty', null, flags)\n }\n }\n const verify = (input: unknown, source: 'live' | 'fallback', revokedKids: readonly string[]) =>\n mode === 'full'\n ? verifyManifest(input, { roots, now, expect, source, revokedKids })\n : Promise.resolve(parseUnverified(input, expect))\n const verifyBytes = (bytes: Uint8Array, revokedKids: readonly string[]) =>\n mode === 'full'\n ? verifyManifestBytes(bytes, { roots, now, expect, source: 'live', revokedKids })\n : (() => {\n try {\n const text = new TextDecoder('utf-8', { fatal: true, ignoreBOM: true }).decode(bytes)\n return Promise.resolve(parseUnverified(JSON.parse(text), expect))\n } catch {\n return Promise.resolve({ ok: false, reason: 'malformed' } as ManifestVerifyResult)\n }\n })()\n\n // 1. Trust the bundled fallback (§4.6): identity + root + signature, time window skipped (§4.5)\n let trusted: Manifest | null = null\n if (config.fallback !== undefined && !isEmptyPlaceholder(config.fallback)) {\n const r = await verify(config.fallback, 'fallback', [])\n if (r.ok) trusted = r.manifest\n else {\n flags.push('fallback_invalid')\n devWarn(\n `bundled fallback rejected (${r.reason}): floor ignored, fallback will not render (§4.6)`,\n )\n }\n }\n const revokedKids = trusted ? trusted.signer.revokedKids : []\n const renderFallback = (): DirectoryState => {\n if (!trusted) return done('empty', null, flags)\n if (Date.parse(trusted.signer.notAfter) < now.getTime()) flags.push('fallback_key_expired')\n return done('fallback', trusted, flags)\n }\n\n // 2. Live manifest (§4.6 SDK fetch)\n if (!f) {\n flags.push('fetch_fail')\n return renderFallback()\n }\n let body = await fetchWithTimeout(f, config.manifestUrl, 'default')\n if (body === null) {\n flags.push('fetch_fail')\n devWarn(`manifest fetch failed (${config.manifestUrl}): rendering the fallback`)\n return renderFallback()\n }\n let live = await verifyBytes(body, revokedKids)\n if (!live.ok) {\n flags.push(reasonFlag(live.reason))\n devWarn(`live manifest rejected (${live.reason}): rendering the fallback`)\n return renderFallback()\n }\n\n // 3. Rollback floor (§4.6): one `cache: 'reload'` retry before rejecting\n if (trusted && belowFloor(live.manifest, trusted)) {\n body = await fetchWithTimeout(f, config.manifestUrl, 'reload')\n const again = body === null ? null : await verifyBytes(body, revokedKids)\n if (again && again.ok && !belowFloor(again.manifest, trusted)) {\n flags.push('stale_cache')\n rr = live.manifest.revision\n live = again\n } else {\n flags.push('rev_rollback')\n rr = again && again.ok ? again.manifest.revision : live.manifest.revision\n devWarn(\n `live manifest revision ${live.manifest.revision} is below the bundled floor ${trusted.revision}: rendering the fallback (rev_rollback)`,\n )\n return renderFallback()\n }\n }\n\n // 4. §6.8 minSdkVersion: warn, flag, keep rendering\n if (semverGreater(live.manifest.minSdkVersion, SDK_VERSION)) {\n flags.push('sdk_outdated')\n devWarn(`manifest requires SDK ≥ ${live.manifest.minSdkVersion}, this is ${SDK_VERSION}`)\n }\n return done('live', live.manifest, flags)\n } catch {\n return done('empty', null, flags)\n }\n\n function done(source: DirectorySource, m: Manifest | null, fl: DirectoryFlag[]): DirectoryState {\n const host = (deps.hostname ?? currentHostname()).replace(/^www\\./, '')\n const businesses = m\n ? m.businesses.filter(\n (b) => b.domain !== host && b.id !== config.siteKey && b.url.startsWith('https:'),\n )\n : []\n const state: DirectoryState = {\n businesses,\n loading: false,\n source: m ? source : 'empty',\n revision: m ? m.revision : null,\n manifest: m,\n flags: fl,\n rr,\n }\n try {\n config.onEvent?.({\n type: 'directory',\n payload: { source: state.source, revision: state.revision, flags: [...fl] },\n })\n } catch {\n /* a site tracker must never break the section */\n }\n return state\n }\n}\n\nfunction currentHostname(): string {\n try {\n return typeof location !== 'undefined' ? location.hostname.toLowerCase() : ''\n } catch {\n return ''\n }\n}\n","/**\n * `useNetworkDirectory()` — spec §6.3: `{ businesses, loading, source, revision, manifest }` (+ `flags`). Fetches\n * after mount; a result that arrives after unmount is dropped; the loader itself never throws.\n *\n * Release 2b review (§5.1 one `pv` per mount, §12 \"exactly one merged impression document per page view\"): the load is\n * keyed on what changes what is fetched or verified (`loadKey`), never on the config object's identity, so a site that\n * passes an inline `config={defineNetworkConfig(…)}`, `onEvent` or `theme` neither refetches the manifest nor starts a\n * new page view on a parent re-render. The latest config (and its `onEvent`, for the loader's `directory` event) is\n * read through a ref. A reload that yields the same verified manifest keeps the previous state object.\n */\nimport { useEffect, useRef, useState } from 'react'\nimport type { NetworkConfig } from './config.js'\nimport { useNetworkConfig } from './context.js'\nimport { INITIAL_STATE, loadDirectory, type DirectoryState } from './loader.js'\n\nconst fallbackIdentity = (fb: unknown): unknown[] => {\n if (fb === null || typeof fb !== 'object') return [typeof fb]\n const o = fb as Record<string, unknown>\n const sig = o['sig'] && typeof o['sig'] === 'object' ? (o['sig'] as Record<string, unknown>) : {}\n return [o['site'], o['revision'], o['publishedAt'], sig['value']]\n}\n\n/** What a load depends on: the site, channel, URL, roots, fallback and verification switches — not callbacks. */\nexport function loadKey(config: NetworkConfig | null): string | null {\n if (!config) return null\n try {\n return JSON.stringify([\n config.siteKey,\n config.siteKeyFromFallback,\n config.channel,\n config.manifestUrl,\n config.verifySignature,\n config.allowInsecureFallback,\n config.dev,\n config.roots.map((r) => [r.kid, r.jwk.x, r.jwk.y]),\n fallbackIdentity(config.fallback),\n ])\n } catch {\n return `${config.siteKey}|${config.manifestUrl}`\n }\n}\n\n/** Two loads that verified the same manifest (and flagged the same things) are one directory state. */\nfunction sameDirectory(a: DirectoryState, b: DirectoryState): boolean {\n return (\n !a.loading &&\n a.source === b.source &&\n a.revision === b.revision &&\n a.rr === b.rr &&\n a.manifest?.sig.value === b.manifest?.sig.value &&\n a.businesses.length === b.businesses.length &&\n a.flags.join() === b.flags.join()\n )\n}\n\nexport function useNetworkDirectory(override?: NetworkConfig | null): DirectoryState {\n const config = useNetworkConfig(override)\n const latest = useRef(config)\n // declared before the load effect, so the load (same commit) reads this render's config\n useEffect(() => {\n latest.current = config\n })\n const key = loadKey(config)\n const [state, setState] = useState<DirectoryState>(INITIAL_STATE)\n useEffect(() => {\n const c = latest.current\n if (!c) {\n setState((prev) =>\n !prev.loading && !prev.manifest ? prev : { ...INITIAL_STATE, loading: false },\n )\n return\n }\n let alive = true\n const loading: NetworkConfig = {\n ...c,\n // the `directory` event goes to whatever tracker the site passes now\n onEvent: (e) => latest.current?.onEvent?.(e),\n }\n void loadDirectory(loading).then((s) => {\n if (alive) setState((prev) => (sameDirectory(prev, s) ? prev : s))\n })\n return () => {\n alive = false\n }\n }, [key])\n return state\n}\n","/**\n * `useNetworkLink(business)` — spec §6.3: `href` = `url` + `utm_source=<site-key>&utm_medium=network&\n * utm_campaign=cross-promo&utm_content=<slug>` (appended with `&` when a query exists), `target=\"_blank\"`,\n * `rel=\"noopener noreferrer\"` (+ `nofollow` when the manifest says so), `aria-label=\"Visit {name} website (opens in a\n * new tab)\"`. UTM values come from `manifest.links` only, never from `window.location`.\n *\n * Signals (§5.1, §6.3; inside a `<DiscoverBusinesses>` with analytics on): the DOM `href` at rest carries UTMs only;\n * `onPointerDown` mints the click id and rewrites the link to `…&inr=<clickId>` (so right-click → \"copy link\" after a\n * pointerdown still works); `onClick` / `onAuxClick` (middle button) flush the impression and send the click signal;\n * `onContextMenu` / `onDragStart` send an indirect click (`btn: 2`, `via: 'contextmenu' | 'drag'`), because \"Open in\n * new tab\" and drag-to-tab-bar navigate with the rewritten href but fire neither `click` nor `auxclick`. A keyboard\n * activation (no pointerdown) mints the id in `onClick`, before the browser follows the link. The handlers never call\n * `preventDefault`, never await and never throw. Custom cards spread `linkProps` onto their `<a>` (a site handler set\n * after the spread replaces ours), use `trackClick(via)` for a non-anchor control, and pass `observe` as the card's\n * `ref` for per-card viewability.\n *\n * Release 2b review (§6.3 \"never throws\", §6.1 semver): the second argument is the section's `SignalHooks` (tests, a\n * custom section) only when it is an object with the hook methods. A 2.0-style `onClick(business, href, via)` callback\n * is accepted as a deprecated mirror: the signals still come from the nearest section and `trackClick` returns the\n * callback's string when it gives one. Every handler and the ref callback are guarded.\n *\n * Release 2b review round 2 (Decision row 6 \"precise claim\": the click id is in the href only between pointerdown and\n * pointerup / pointercancel + 2 s, or blur): the rewritten href is put back to the at-rest href `HREF_RESTORE_MS`\n * after the gesture ends — pointerup, pointercancel (a touch scroll that started on the card), or the click /\n * auxclick / context menu / drag that used the id (the browser reads the link as the menu opens or the drag starts) —\n * and at once on blur; a new pointerdown cancels a pending restore. A link copied, previewed or prefetched later\n * carries no used id.\n */\nimport { useCallback, useContext, useMemo } from 'react'\nimport { HREF_RESTORE_MS, UTM } from '../constants.js'\nimport type { ManifestBusiness, ManifestLinks } from '../verify/schema.js'\nimport { DirectoryContext, SignalsContext, useNetworkConfig } from './context.js'\nimport type { ClickButton, ClickVia, SignalHooks } from './signals.js'\n\n/** Structural event type: React synthetic events and native DOM events both fit. */\nexport type LinkEvent = { currentTarget: unknown; button?: number }\n\nexport type NetworkLinkProps = {\n href: string\n target: '_blank'\n rel: string\n 'aria-label': string\n onPointerDown: (e: LinkEvent) => void\n onClick: (e: LinkEvent) => void\n onAuxClick: (e: LinkEvent) => void\n onContextMenu: (e: LinkEvent) => void\n onDragStart: (e: LinkEvent) => void\n /** Release 2b review round 2: the end of the gesture starts the restore of the at-rest href. */\n onPointerUp: (e: LinkEvent) => void\n onPointerCancel: (e: LinkEvent) => void\n onBlur: (e: LinkEvent) => void\n}\n\nexport type NetworkLink = {\n href: string\n linkProps: NetworkLinkProps\n /**\n * For a custom control that is not an `<a {...linkProps}>`: sends the click signal (flushing the impression first)\n * and returns the href to navigate with (`…&inr=<clickId>` when the manifest enables clicks).\n */\n trackClick: (via?: ClickVia, button?: ClickButton) => string\n /** Ref callback for the card element: per-card viewability (`seen` / `ms` / `fv`, §5.1). Stable per card. */\n observe: (el: Element | null) => void\n}\n\nexport function buildHref(url: string, links: ManifestLinks, slug: string): string {\n const q = new URLSearchParams({\n utm_source: links.utmSource,\n utm_medium: links.utmMedium,\n utm_campaign: links.utmCampaign,\n utm_content: slug,\n }).toString()\n const hash = url.indexOf('#')\n const base = hash >= 0 ? url.slice(0, hash) : url\n const frag = hash >= 0 ? url.slice(hash) : ''\n return `${base}${base.includes('?') ? '&' : '?'}${q}${frag}`\n}\n\n/** Points the clicked anchor at `href` (the browser follows the link after the handler returns). */\nfunction setHref(e: LinkEvent, href: string | null): void {\n try {\n const el = e.currentTarget as { href?: unknown } | null\n if (href && el && typeof el === 'object' && typeof el.href === 'string' && el.href !== href)\n el.href = href\n } catch {\n /* not an anchor */\n }\n}\n\nconst defaultButton = (via: ClickVia): ClickButton =>\n via === 'click' ? 0 : via === 'auxclick' ? 1 : 2\n\n/** 2.0.0's second argument (`trackClick` returned its result); kept as a deprecated mirror in 2.x. */\nexport type LegacyOnClick = (business: ManifestBusiness, href: string, via: string) => string\n\nconst HOOK_METHODS = ['pointerDown', 'click', 'observe'] as const\n\n/** A real `SignalHooks` object, never a function or any other value a caller happens to pass. */\nfunction isSignalHooks(v: unknown): v is SignalHooks {\n return (\n typeof v === 'object' &&\n v !== null &&\n HOOK_METHODS.every((m) => typeof (v as Record<string, unknown>)[m] === 'function')\n )\n}\n\nconst guarded = <A extends unknown[]>(fn: (...a: A) => void) => {\n return (...a: A) => {\n try {\n fn(...a)\n } catch {\n /* the section never throws (§6.3) */\n }\n }\n}\n\nexport function useNetworkLink(\n business: ManifestBusiness,\n hooks?: SignalHooks | LegacyOnClick | null,\n): NetworkLink {\n const manifest = useContext(DirectoryContext)\n const config = useNetworkConfig()\n const fromContext = useContext(SignalsContext)\n // `null` opts out; an object with the hook methods replaces the section's; anything else (a 2.0 `onClick`\n // callback, a stray value) keeps the nearest section's hooks\n const h: SignalHooks | null =\n hooks === null\n ? null\n : isSignalHooks(hooks)\n ? hooks\n : isSignalHooks(fromContext)\n ? fromContext\n : null\n const legacy = typeof hooks === 'function' ? hooks : null\n const slug = business.id\n const observe = useCallback(\n (el: Element | null) => {\n try {\n h?.observe(slug, el)\n } catch {\n /* the section never throws (§6.3) */\n }\n },\n [h, slug],\n )\n return useMemo(() => {\n const links: ManifestLinks = manifest?.links ?? {\n utmSource: config?.siteKey ?? '',\n utmMedium: UTM.medium,\n utmCampaign: UTM.campaign,\n refParam: 'inr',\n nofollow: false,\n }\n const href = buildHref(business.url, links, business.id)\n // the pending restore of the at-rest href (Decision row 6): one per link, cancelled by the next pointerdown\n let cancelRestore: (() => void) | null = null\n const stopRestore = () => {\n cancelRestore?.()\n cancelRestore = null\n }\n const restoreLater = (e: LinkEvent, ms: number) => {\n stopRestore()\n const target = { currentTarget: e.currentTarget }\n if (ms <= 0) return setHref(target, href)\n const id = setTimeout(() => {\n cancelRestore = null\n setHref(target, href)\n }, ms)\n cancelRestore = () => clearTimeout(id)\n }\n const send = (e: LinkEvent, via: ClickVia) => {\n if (!h) return\n setHref(e, h.click(business, href, via, defaultButton(via)))\n restoreLater(e, HREF_RESTORE_MS)\n }\n const trackClick = (via: ClickVia = 'click', button?: ClickButton): string => {\n let out = href\n try {\n if (h) out = h.click(business, href, via, button ?? defaultButton(via))\n } catch {\n out = href\n }\n if (legacy) {\n try {\n const r = legacy(business, out, via)\n if (typeof r === 'string' && r) return r\n } catch {\n /* a site callback never breaks the click */\n }\n }\n return out\n }\n return {\n href,\n linkProps: {\n href,\n target: '_blank',\n rel: `noopener noreferrer${links.nofollow ? ' nofollow' : ''}`,\n 'aria-label': `Visit ${business.name} website (opens in a new tab)`,\n onPointerDown: guarded((e: LinkEvent) => {\n stopRestore()\n if (h) setHref(e, h.pointerDown(business, href))\n }),\n onPointerUp: guarded((e: LinkEvent) => restoreLater(e, HREF_RESTORE_MS)),\n onPointerCancel: guarded((e: LinkEvent) => restoreLater(e, HREF_RESTORE_MS)),\n onBlur: guarded((e: LinkEvent) => restoreLater(e, 0)),\n onClick: guarded((e: LinkEvent) => send(e, 'click')),\n // only the middle button opens a link; the right button is `contextmenu`'s, back / forward are not clicks\n onAuxClick: guarded((e: LinkEvent) => {\n if (e.button === 1) send(e, 'auxclick')\n }),\n onContextMenu: guarded((e: LinkEvent) => send(e, 'contextmenu')),\n onDragStart: guarded((e: LinkEvent) => send(e, 'drag')),\n },\n trackClick,\n observe,\n }\n }, [business, manifest, config, h, legacy, observe])\n}\n","/**\n * `<DiscoverBusinesses />` — spec §6.3 (markup, a11y, image attributes, link), §6.1 (headless className slots +\n * optional `styles.css`), §5.1 (one `PageView` per mount and loaded directory: the impression tracker and the click\n * signals, gated by the manifest's `analytics`). Renders `null` while loading or when empty (below the fold, no\n * skeleton). Never throws.\n *\n * Release 2b review: the page view does not depend on prop identity. `theme` / `unstyled` apply at render, `onEvent`\n * is read through a ref, and the directory is keyed on what is fetched (`useNetworkDirectory`), so an inline\n * `onEvent={() => …}`, `theme={{…}}` or `config={defineNetworkConfig(…)}` on a re-rendering parent keeps one `pv`, one\n * manifest fetch and one impression (§5.1, §12).\n */\nimport { useEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport type { ManifestBusiness } from '../verify/schema.js'\nimport type { NetworkConfig, NetworkEvent, NetworkTheme, ThemeSlot } from './config.js'\nimport { DirectoryContext, SignalsContext, useNetworkConfig } from './context.js'\nimport { createSignalHooks } from './signals.js'\nimport { useNetworkDirectory } from './useNetworkDirectory.js'\nimport { useNetworkLink, type NetworkLink } from './useNetworkLink.js'\n\nexport const HEADING_ID = 'discover-businesses-heading'\n\n/** `href`, `linkProps` (spread onto the card's `<a>`), `trackClick(via)` and `observe` (the card's `ref`). */\nexport type RenderCardArgs = NetworkLink\n\nexport type DiscoverBusinessesProps = {\n title?: string | undefined\n subtitle?: string | null | undefined\n maxItems?: number | undefined\n renderCard?: ((business: ManifestBusiness, args: RenderCardArgs) => ReactNode) | undefined\n theme?: NetworkTheme | undefined\n unstyled?: boolean | undefined\n onEvent?: ((event: NetworkEvent) => void) | undefined\n /** Use without `<NetworkProvider>`: pass the config directly. */\n config?: NetworkConfig | undefined\n}\n\nconst kebab = (s: string) => s.replace(/[A-Z]/g, (c) => `-${c.toLowerCase()}`)\n\nexport function slotClass(\n slot: ThemeSlot,\n theme: NetworkTheme,\n unstyled: boolean,\n): string | undefined {\n const own = theme[slot]\n if (unstyled) return own || undefined\n return own ? `inr-${kebab(slot)} ${own}` : `inr-${kebab(slot)}`\n}\n\n/** \"Discover Other Businesses\" → [\"Discover Other \", \"Businesses\"]: one accent word (the last). */\nexport function splitAccent(title: string): [string, string] {\n const i = title.trimEnd().lastIndexOf(' ')\n return i < 0 ? ['', title] : [title.slice(0, i + 1), title.slice(i + 1)]\n}\n\nexport function DiscoverBusinesses(props: DiscoverBusinessesProps) {\n const base = useNetworkConfig(props.config)\n // the site's tracker for this render; read through a ref by the loader's and the signals' events\n const onEvent = props.onEvent ?? base?.onEvent\n const config = useMemo<NetworkConfig | null>(\n () => (base ? (onEvent === base.onEvent ? base : { ...base, onEvent }) : null),\n [base, onEvent],\n )\n const configRef = useRef(config)\n useEffect(() => {\n configRef.current = config\n })\n // keyed on what is fetched, never on the config object (useNetworkDirectory): one load per mount\n const dir = useNetworkDirectory(config)\n // one set of hooks (one page view) per loaded directory state; a new `onEvent` / `theme` never starts another\n const signals = useMemo(() => createSignalHooks(() => configRef.current, dir), [dir])\n\n const items = useMemo(() => {\n const n = props.maxItems && props.maxItems > 0 ? props.maxItems : dir.businesses.length\n return dir.businesses.slice(0, n)\n }, [dir.businesses, props.maxItems])\n\n const sent = useRef(false)\n useEffect(() => {\n if (items.length > 0 && !sent.current) {\n sent.current = true\n signals.rendered(items.map((b) => b.id))\n }\n }, [items, signals])\n useEffect(() => {\n signals.setOrder(items.map((b) => b.id))\n }, [items, signals])\n const shown = !!config && !dir.loading && items.length > 0 && !!dir.manifest\n const sectionRef = useRef<HTMLElement | null>(null)\n // after the cards' ref callbacks (commit) and the order effect above: observers attach to a complete section\n useEffect(() => {\n if (!shown) return\n signals.start(sectionRef.current)\n return () => signals.stop()\n }, [signals, shown])\n\n if (!config || dir.loading || items.length === 0 || !dir.manifest) return null\n // render-only: a new `theme` object restyles the section and changes nothing else\n const theme = props.theme ? { ...config.theme, ...props.theme } : config.theme\n const unstyled = props.unstyled ?? config.unstyled\n const cls = (slot: ThemeSlot) => slotClass(slot, theme, unstyled)\n const title = props.title ?? dir.manifest.section.title\n const subtitle = props.subtitle === undefined ? dir.manifest.section.subtitle : props.subtitle\n const [lead, accent] = splitAccent(title)\n\n return (\n <DirectoryContext.Provider value={dir.manifest}>\n <SignalsContext.Provider value={signals}>\n <section\n ref={sectionRef}\n className={cls('section')}\n aria-labelledby={HEADING_ID}\n data-inr-rev={dir.revision ?? undefined}\n data-inr-source={dir.source}\n >\n <div className={cls('container')}>\n <h2 id={HEADING_ID} className={cls('heading')}>\n {lead}\n <span className={cls('accentWord')}>{accent}</span>\n </h2>\n {subtitle ? <p className={cls('subheading')}>{subtitle}</p> : null}\n <div className={cls('grid')}>\n {items.map((b) => (\n <Card key={b.id} business={b} cls={cls} renderCard={props.renderCard} />\n ))}\n </div>\n </div>\n </section>\n </SignalsContext.Provider>\n </DirectoryContext.Provider>\n )\n}\n\nfunction Card(props: {\n business: ManifestBusiness\n cls: (slot: ThemeSlot) => string | undefined\n renderCard: DiscoverBusinessesProps['renderCard']\n}) {\n const { business: b, cls } = props\n const link = useNetworkLink(b)\n const [broken, setBroken] = useState(false)\n if (props.renderCard) return <>{props.renderCard(b, link)}</>\n const meta = [b.category, b.location].filter(Boolean).join(' · ')\n return (\n <article ref={link.observe} className={cls('card')} data-inr-id={b.id}>\n <div className={cls('imageBox')}>\n {broken ? (\n <div className={cls('placeholder')} role=\"img\" aria-label={b.image.alt}>\n {b.name.trim().charAt(0).toUpperCase()}\n </div>\n ) : (\n <img\n className={cls('image')}\n src={b.image.src}\n srcSet={`${b.image.src} 1x, ${b.image.src2x} 2x`}\n alt={b.image.alt}\n width={b.image.width}\n height={b.image.height}\n loading=\"lazy\"\n decoding=\"async\"\n onError={() => setBroken(true)}\n />\n )}\n </div>\n <div className={cls('body')}>\n <h3 className={cls('name')}>{b.name}</h3>\n {meta ? <p className={cls('meta')}>{meta}</p> : null}\n <p className={cls('description')}>{b.description}</p>\n <a {...link.linkProps} className={cls('button')}>\n Visit Website\n <svg\n className={cls('buttonIcon')}\n aria-hidden=\"true\"\n focusable=\"false\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M15 3h6v6\" />\n <path d=\"M10 14 21 3\" />\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\n </svg>\n </a>\n </div>\n </article>\n )\n}\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var crypto=require('crypto'),net=require('net');function me(e){return crypto.createHash("sha256").update(e).digest("hex")}function $(e,t,n,r,o,s,u){return `${e}.${t}.${n}.${r}.${o.toUpperCase()}.${s}.${me(u)}`}function Y(e){if(!e.secret)throw new Error("signRequest: secret is required");let t=e.timestamp??Math.floor(Date.now()/1e3),n=e.nonce??crypto.randomUUID(),o=`v1=${crypto.createHmac("sha256",e.secret).update($(t,n,e.siteKey,e.keyId,e.method,e.path,e.body),"utf8").digest("hex")}`;return {headers:{"Content-Type":"application/json","X-INR-Site":e.siteKey,"X-INR-Key-Id":e.keyId,"X-INR-Timestamp":String(t),"X-INR-Nonce":n,"X-INR-Signature":o},timestamp:t,nonce:n,signature:o}}function Ye(e,t,n){if(!/^v1=[0-9a-f]{64}$/.test(n))return false;let{timestamp:r,nonce:o,siteKey:s,keyId:u,method:c,path:l,body:y}=t,m=crypto.createHmac("sha256",e).update($(r,o,s,u,c,l,y),"utf8").digest("hex");return crypto.timingSafeEqual(Buffer.from(m,"hex"),Buffer.from(n.slice(3),"hex"))}var k="2.2.0-beta.2";var A=/^[A-Za-z0-9_-]{32}$/;var K=e=>typeof e=="string"&&A.test(e)?e:null,ge=e=>e==="session"||e==="persistent"?e:null;function z(e,t){if(typeof e.get=="function")return e.get(t);let n=e.headers;if(!n)return;let r=n[t]??n[t.toLowerCase()];return Array.isArray(r)?r[0]:r}function _e(e){try{let t=e.body,n=t&&typeof t=="object"?t.inrRef:void 0;if(n&&typeof n=="object"){let s=n,u=K(s.clickId),c=ge(s.tokenScope);if(u&&c){let l=s.firstClickId;return {clickId:u,firstClickId:l==null?null:K(l),tokenScope:c}}}let r=K(z(e,"X-INR-Ref")),o=ge(z(e,"X-INR-Ref-Scope"));if(r&&o){let s=z(e,"X-INR-Ref-First");return {clickId:r,firstClickId:s==null?null:K(s),tokenScope:o}}return null}catch{return null}}function ze(){return (e,t,n)=>{e.inrRef=_e(e);try{Reflect.deleteProperty(e.body,"inrRef");}catch{}n();}}var B="inrConversionOutbox",qe=1209600;function xe(){return {eventType:{type:String,required:true},eventId:{type:String,required:true},body:{type:Object,required:true},attempts:{type:Number,default:0},nextAttemptAt:{type:Date,default:Date.now},lastStatus:{type:Number,default:null},lastError:{type:Object,default:null},unauthorizedSince:{type:Date},createdAt:{type:Date,default:Date.now}}}var Se=[[{createdAt:1},{expireAfterSeconds:1209600}],[{nextAttemptAt:1},{}],[{eventType:1,eventId:1},{unique:true}]];function H(e,t=B){let n=`InrOutbox_${t}`,r=e.models[n];if(r)return r;let o=new e.Schema(xe(),{versionKey:false,autoIndex:false});return e.model(n,o,t)}var be=new WeakSet,Re=new WeakSet,q=new WeakMap;function j(e,t){if(be.has(e))return Promise.resolve();let n=q.get(e);return n||(n=(async()=>{let r=false;for(let[o,s]of Se)await Promise.resolve().then(()=>e.collection.createIndex(o,s)).catch(()=>r=true);r?Re.has(e)||(Re.add(e),t("INR_OUTBOX_INDEX_FAILED")):be.add(e);})().finally(()=>q.delete(e)),q.set(e,n)),n}var w=e=>"exec"in e&&typeof e.exec=="function"?e.exec():e,V=e=>({eventType:e.eventType,eventId:e.eventId});function Ve(e){let t=e.lastError;return {...e,lastError:typeof t=="string"?{status:0,code:t}:t??null,unauthorizedSince:e.unauthorizedSince??null}}function G(e){return {async enqueue(t){let{eventType:n,eventId:r,unauthorizedSince:o,...s}=t,u=o?{...s,unauthorizedSince:o}:s,c=await w(e.updateOne({eventType:n,eventId:r},{$setOnInsert:u},{upsert:true}));return !(Number(c?.matchedCount)>0)},async remove(t){await w(e.deleteOne(V(t)));},async reschedule(t,n){let r={$set:{nextAttemptAt:n.nextAttemptAt,lastStatus:n.lastStatus,lastError:n.lastError},...n.attempts>0?{$inc:{attempts:n.attempts}}:{},...n.unauthorizedAt?{$min:{unauthorizedSince:n.unauthorizedAt}}:{$unset:{unauthorizedSince:1}}};await w(e.updateOne(V(t),r));},async renew(t,n){return (await w(e.updateOne(V(t),{$set:{nextAttemptAt:n}})))?.matchedCount!==0},async claim(t,n){let r=await w(e.findOneAndUpdate({nextAttemptAt:{$lte:t}},{$set:{nextAttemptAt:n},$inc:{attempts:1}},{sort:{nextAttemptAt:1},new:true,lean:true}));return r?Ve(r):null},async purge(t){await w(e.deleteMany({$or:[{"body.clickId":t},{"body.firstClickId":t}]}));},pending:()=>w(e.countDocuments({}))}}var W=(e,t)=>e.body.clickId===t||e.body.firstClickId===t,Ee=(e,t)=>e.eventType===t.eventType&&e.eventId===t.eventId;function Z(e,t){e.nextAttemptAt=t.nextAttemptAt,e.lastStatus=t.lastStatus,e.lastError=t.lastError,e.attempts+=t.attempts,e.unauthorizedSince=t.unauthorizedAt?new Date(Math.min(e.unauthorizedSince?.getTime()??1/0,t.unauthorizedAt.getTime())):null;}function J(){let e=[],t=n=>e.find(r=>Ee(r,n));return {entries:e,async enqueue(n){return t(n)?false:(e.push({...n}),true)},async remove(n){let r=e.findIndex(o=>Ee(o,n));r>=0&&e.splice(r,1);},async reschedule(n,r){let o=t(n);o&&Z(o,r);},async renew(n,r){let o=t(n);return o&&(o.nextAttemptAt=r),!!o},async claim(n,r){let o;for(let s of e)s.nextAttemptAt<=n&&(!o||s.nextAttemptAt<o.nextAttemptAt)&&(o=s);return o?(o.nextAttemptAt=r,o.attempts+=1,{...o}):null},async purge(n){for(let r=e.length-1;r>=0;r--)W(e[r],n)&&e.splice(r,1);},pending:async()=>e.length}}function Ie(e=1e3){let t=new Map,n=r=>`${r.eventType}\0${r.eventId}`;return {add(r){if(t.has(n(r))||(t.set(n(r),r),t.size<=e))return null;let[o,s]=t.entries().next().value;return t.delete(o),s},has:r=>t.has(n(r)),get:r=>t.get(n(r)),delete:r=>{t.delete(n(r));},entries:()=>[...t.values()],get size(){return t.size}}}async function Oe(e,t){let n=0;for(let r of e.entries())if(e.get(r)===r){let o=await t.enqueue(r);e.get(r)===r?e.delete(r):o&&await t.remove(r),n++;}return n}var Te=["booking_created","booking_paid","contact_submitted","quote_requested","call_clicked","signup","purchase","booking_cancelled","booking_refunded","booking_no_show","chargeback","fee_charged"],ve={booking_cancelled:["booking_created"],booking_no_show:["booking_created"],booking_refunded:["booking_paid"],chargeback:["booking_paid","purchase"]},F={...ve,fee_charged:["booking_no_show","booking_cancelled"]},He=Object.freeze(Object.keys(ve)),Q={booking_created:{value:"optional",fee:"null"},booking_paid:{value:"required",fee:"null"},contact_submitted:{value:"null",fee:"null"},quote_requested:{value:"optional",fee:"null"},call_clicked:{value:"null",fee:"null"},signup:{value:"optional",fee:"null"},purchase:{value:"optional",fee:"null"},booking_cancelled:{value:"null",fee:"optional"},booking_refunded:{value:"positive",fee:"null"},booking_no_show:{value:"null",fee:"optional"},chargeback:{value:"positive",fee:"null"},fee_charged:{value:"null",fee:"positive"}},je=1e9,ee=/^(?=.{1,64}$)(?!erased:)[a-z][a-z0-9_]{0,31}:[A-Za-z0-9_-]{1,62}$/,he=/^[A-Z]{3}$/,te=/^inrs1_[A-Za-z0-9_-]{43}$/,ne=/^[0-9a-f]{8}$/,re=/^(?=.{1,48}$)[a-z0-9]+(-[a-z0-9]+)*$/;var M={conversion:"/v1/conversions",landing:"/v1/landings",forget:"/v1/referrals/"},Ae=e=>Object.hasOwn(F,e);function oe(e,t){return t===null?e==="null"||e==="optional":Number.isInteger(t)&&t>=(e==="positive"?1:0)&&t<=je?e!=="null":false}var R=1e3,P=[2*R,8*R,30*R],ie=30*R,ue=3600*R,ke=60*R,Ge=600*R,We=24*3600*R,L=150*R,Ze=3e3,Je=500,Qe=3e4,et=8192,ae=2e3,tt=24*3600*R;function le(e){if(!e)return null;let t=e.endsWith("/")?e.slice(0,-1):e;if(!/^[a-z][a-z0-9+.-]*:\/\/[^/?#]+$/i.test(t))return null;let n;try{n=new URL(t);}catch{return null}return n.pathname!=="/"||n.username||n.password?null:n.protocol==="https:"||n.protocol==="http:"&&["localhost","127.0.0.1","[::1]"].includes(n.hostname)?n.origin:null}function Me(e,t){let n=t?.trim(),r=e??(n?Number(n):void 0),o=r===void 0||!Number.isFinite(r)?Ze:r;return Math.min(Qe,Math.max(Je,o))}function Ne(e,t){return e>=200&&e<300?"success":e===409?t==="NONCE_REUSED"?"success":"terminal":e===400?t==="TIMESTAMP_SKEW"?"skew":"terminal":e===401?"unauthorized":e===0||e===408||e===425||e===429||e>=500&&e<600?"retryable":e<405&&e!==402?"misrouted":"terminal"}function nt(e,t){if(!e)return null;let n=e.trim();if(/^\d+$/.test(n))return Number(n)*R;let r=Date.parse(n);return Number.isNaN(r)?null:Math.max(0,r-t)}var se=0;function rt(e,t,n){let r=e?Date.parse(e):NaN;if(Number.isNaN(r))return null;let o=Math.round(r+500-(t+n)/2);return Math.abs(o)<=tt?o:null}async function ot(e,t){let n=e.body?.getReader();if(!n)return "";let r=new TextDecoder,o="";for(let s=0;s<t;){let{done:u,value:c}=await n.read();if(u)break;o+=r.decode(c.subarray(0,t-s),{stream:true}),s+=c.byteLength;}return n.cancel().catch(()=>{}),o}function st(e){try{let t=JSON.parse(e),n=t?.error?.code??t?.code;return typeof n=="string"&&/^[A-Z][A-Z0-9_]{0,63}$/.test(n)?n:null}catch{return null}}async function we(e,t,n){let r=Math.floor((Date.now()+se)/1e3),{headers:o}=Y({...e,...t,timestamp:r}),s=new AbortController,u=setTimeout(()=>s.abort(),n);u.unref?.();let c=Date.now();try{let l=await fetch(e.hubUrl+t.path,{method:t.method,headers:{...o,"User-Agent":`intenque-network-sdk/${k}`},body:t.body,redirect:"error",signal:s.signal}),y=Date.now(),m=await ot(l,et).catch(()=>"");return {status:l.status,code:st(m),retryAfterMs:nt(l.headers.get("retry-after"),y),date:l.headers.get("date"),tSend:c,tRecv:y}}catch{return {status:0,code:s.signal.aborted?"TIMEOUT":"NETWORK",retryAfterMs:null,date:null,tSend:c,tRecv:Date.now()}}finally{clearTimeout(u);}}function ce(e){let t=Math.min(60*R*2**Math.max(0,e-4),1800*R);return Math.round(t*(.8+Math.random()*.4))}var U=e=>new Promise(t=>{setTimeout(t,e).unref?.();});async function N(e){let t;try{return await Promise.race([Promise.resolve().then(e).catch(()=>{}),new Promise(n=>{t=setTimeout(()=>n(void 0),ae);})])}finally{clearTimeout(t);}}function De(e){let{outbox:t,spill:n,logger:r}=e,o=new Set,s=i=>{o.has(i)||(o.add(i),r.warn(i));},u=i=>{let a=Ne(i.status,i.code);return a==="skew"?{kind:a,status:400,code:"TIMESTAMP_SKEW",offsetMs:rt(i.date,i.tSend,i.tRecv)}:{kind:a,status:i.status,code:i.code,retryAfterMs:i.retryAfterMs}};async function c(i){let a=e.config();if(!a)return {kind:"unauthorized",status:0,code:"INR_ENV_MISSING",retryAfterMs:null};if(typeof globalThis.fetch!="function")return s("INR_NO_FETCH"),{kind:"nofetch"};let p=u(await we(a,i,e.timeoutMs));return p.kind==="skew"&&p.offsetMs!==null&&(se=p.offsetMs,p=u(await we(a,i,e.timeoutMs)),p.kind==="skew"&&p.offsetMs!==null&&(se=p.offsetMs)),p}let l=i=>c({method:"POST",path:M.conversion,body:JSON.stringify(i.body)}),y=async i=>{n.delete(i),await N(()=>t.remove(i));},m=async(i,a,p)=>(await y(i),r.warn("inr_outbox_dropped_total",{eventType:i.eventType,eventId:i.eventId,status:a.status,code:a.code,reason:p}),"dropped");async function E(i,a,p,x=ke){if(a.kind==="nofetch")return null;let T=Date.now(),S={status:a.status,code:a.code},v=async(h,f=null)=>{let d={nextAttemptAt:new Date(T+h),lastStatus:a.status,lastError:S,attempts:p,unauthorizedAt:f},b=n.get(i);return b&&Z(b,d),await N(()=>t.reschedule(i,d)),"retried"};switch(a.kind){case "success":return await y(i),"sent";case "terminal":return m(i,S,"terminal");case "unauthorized":case "misrouted":{let h=i.unauthorizedSince?.getTime();return h!==void 0&&T-h>=We?(a.kind==="unauthorized"&&r.warn("INR_UNAUTHORIZED",{eventType:i.eventType,eventId:i.eventId,...S}),m(i,S,`${a.kind}_24h`)):v(Ge,new Date(T))}case "skew":return r.warn("INR_CLOCK_SKEW",{offsetMs:a.offsetMs}),v(ce(i.attempts+p));case "retryable":return v(x)}}async function I(i){for(let a=0;;a++){let p=await l(i);if(p.kind!=="retryable"&&p.kind!=="misrouted")return E(i,p,a+1);let x=p.retryAfterMs===null?null:Math.min(p.retryAfterMs,ue);if(a===P.length)return E(i,p,a+1,Math.max(ke,x??0));let T=Math.max(P[a],x??0);if(T>ie)return E(i,p,a+1,x);await U(T);let S=new Date(Date.now()+L),v=n.get(i);v&&(v.nextAttemptAt=S);let h;if(await N(async()=>h=await t.renew(i,S)),h===false&&!v)return null}}return {request:c,attempt:l,settle:E,drop:m,chain:I}}var D=1e3,it=10*D,ut=60*D,Ce=10*D,at=50,lt=14*86400*D-3600*D,ct=5*D;function Pe(e){let{delivery:t,outbox:n,spill:r}=e,o,s=null,u=false;async function c(){let m={sent:0,retried:0,dropped:0};try{e.onTick?.(),await Oe(r,n);for(let E=0;E<at;E++){let I=Date.now(),i=await n.claim(new Date(I),new Date(I+L));if(!i)break;if(I-new Date(i.createdAt).getTime()>=lt){await t.drop(i,i.lastError??{status:0,code:null},"expired"),m.dropped++;continue}let a=await t.attempt(i),p="retryAfterMs"in a?a.retryAfterMs??0:0,x=await t.settle(i,a,0,Math.max(ce(i.attempts),Math.min(p,ue)));if(x&&m[x]++,!x||"status"in a&&(a.status===429||a.status===503))break}}catch{e.unavailable();}return m}function l(){return s??=c().finally(()=>{s=null;}),s}function y(m){u||(o=setTimeout(()=>{l().then(()=>y(ut+(Math.random()*2-1)*Ce));},m),o.unref?.());}return {start:()=>y(it+Math.random()*Ce),drainNow:l,async close(m){u=true,clearTimeout(o),await Promise.race([Promise.allSettled([s,m()]),U(ct)]);}}}var pt=6e4,X=1024,ft=10,yt=300,mt=30*864e5,gt=512,_t=/^https?:\/\/[^/\s]{1,253}$/;function bt(e){let t=e.body;if(typeof t=="string"||t instanceof Uint8Array){let n=Buffer.from(t);return Promise.resolve(n.length>X?null:n.toString("utf8"))}return !e.readable||typeof e.on!="function"?Promise.resolve(null):new Promise(n=>{let r=[],o=0;e.on("data",s=>{o+=s.length,o<=X&&r.push(s);}),e.on("end",()=>n(o>X?null:Buffer.concat(r).toString("utf8"))),e.on("error",()=>n(null));})}async function Rt(e){let t=e.body;if(t&&typeof t=="object"&&!(t instanceof Uint8Array)&&Object.keys(t).length>0)return JSON.stringify(t).length>X?null:t;let n=await bt(e);try{let r=n===null?null:JSON.parse(n);return r&&typeof r=="object"?r:null}catch{return null}}var Le=(e,t)=>{let n=e.headers?.[t];return typeof n=="string"?n:null};function Et(e,t,n){let{c:r,scope:o,ph:s,d:u}=e;if(typeof r!="string"||!A.test(r)||o!=="session"&&o!=="persistent"||s!==void 0&&!(typeof s=="string"&&/^[0-9a-f]{16}$/.test(s))||u!==void 0&&!(Number.isInteger(u)&&u>=0&&u<=mt))return null;let c=Le(n,"origin");return {v:1,clickId:r,scope:o,pathHash:s,d:u,visitorIp:t,visitorUa:(Le(n,"user-agent")??"").slice(0,gt),visitorOrigin:c!==null&&_t.test(c)?c:null,sdk:`server/${k}`}}var Ue=-1,de=0,pe=new Map;function xt(e){let t=Math.floor(Date.now()/pt);t!==Ue&&(Ue=t,de=0,pe.clear());let n=pe.get(e)??0;return de>=yt||n>=ft?false:(pe.set(e,n+1),de++,true)}function Ke(e){let t=false;return (n={})=>async(r,o)=>{let s=null;try{let u=await Rt(r),c=!!r.app?.get("trust proxy");!c&&!t&&(t=!0,e.warn("INR_RELAY_TRUST_PROXY"));let l=c?n.visitorIp?.(r)??r.ip:void 0;e.enabled&&u&&typeof l=="string"&&net.isIP(l)&&(s=Et(u,l,r),s&&!xt(l)&&(s=null));}catch{s=null;}try{o.status(204).end();}catch{}s&&e.forward({method:"POST",path:M.landing,body:JSON.stringify(s)});}}var St=/^\d{4}-\d\d-\d\dT\d\d:\d\d(:\d\d(\.\d+)?)?(Z|[+-]\d\d:\d\d)$/,It=ae,Ot=6e4;function fe(e){if(!e||typeof e!="object")return {error:"event"};let t=e.eventType;if(typeof t!="string"||!Object.hasOwn(Q,t))return {error:"eventType"};if(typeof e.eventId!="string"||!ee.test(e.eventId))return {error:"eventId"};if(typeof e.clickId!="string"||!A.test(e.clickId))return {error:"clickId"};let n=e.firstClickId??null;if(n!==null&&!(typeof n=="string"&&A.test(n)))return {error:"firstClickId"};if(e.tokenScope!=="session"&&e.tokenScope!=="persistent")return {error:"tokenScope"};let r=e.occurredAt instanceof Date?e.occurredAt:typeof e.occurredAt=="string"&&St.test(e.occurredAt)?new Date(e.occurredAt):new Date(NaN),o=Number.isNaN(r.getTime())?"":r.toISOString();if(!/^\d{4}-/.test(o))return {error:"occurredAt"};let s=e.valueCents??null,u=e.feeCents??null,c=Q[t];if(!oe(c.value,s))return {error:"valueCents"};if(!oe(c.fee,u))return {error:"feeCents"};let l=null;if(e.currency!=null&&(l=typeof e.currency=="string"?e.currency.toUpperCase():"",!he.test(l)))return {error:"currency"};if(l===null&&(s!==null||u!==null))return {error:"currency"};let y=e.reverses??null;if(Ae(t)){let m=F[t];if(y===null||typeof y!="object"||!m.includes(y.eventType)||typeof y.eventId!="string"||!ee.test(y.eventId))return {error:"reverses"}}else if(y!==null)return {error:"reverses"};return {v:1,eventType:t,eventId:e.eventId,clickId:e.clickId,firstClickId:n===e.clickId?null:n,tokenScope:e.tokenScope,occurredAt:o,valueCents:s,feeCents:u,currency:l,reverses:y?{eventType:y.eventType,eventId:y.eventId}:null,sdk:`server/${k}`}}var Tt=["INR_HUB_URL","INR_SITE_KEY","INR_KEY_ID","INR_SITE_SECRET"],Be={INR_HUB_URL:e=>le(e)!==null,INR_SITE_KEY:e=>re.test(e),INR_KEY_ID:e=>ne.test(e),INR_SITE_SECRET:e=>te.test(e)};function vt(e=process.env,t={}){let n=Tt.flatMap(s=>{let u=e[s];return u?Be[s]&&!Be[s](u)?[`${s} (invalid)`]:[]:[s]});if(n.length===0)return [];let r=t.production??e.NODE_ENV==="production",o=`@intenque/network-sdk/server: missing or invalid env ${n.join(", ")}`;if(!r||e.INR_STRICT_ENV==="true")throw new Error(o);return (t.logger??console).warn(o),n}function ht(e={}){let t=e.logger??{warn:(f,d)=>console.warn(f,d??"")},n={warn:(f,d)=>{try{t.warn(f,d);}catch{}}},r=e.enabled!==false,o=()=>typeof process>"u"?{}:process.env,s=e.outbox?.mongoose?H(e.outbox.mongoose,e.outbox.collection??(o().INR_OUTBOX_COLLECTION||B)):null,u=()=>{s&&r&&j(s,n.warn);};u();let c=s?G(s):J(),l=Ie(),y=false,E=De({config:()=>{let f=o(),d=e.hubUrl??f.INR_HUB_URL,b=le(d);d&&!b&&!y&&(y=true,n.warn("INR_HUB_URL_INVALID"));let g=e.siteKey??f.INR_SITE_KEY??"",_=f.INR_KEY_ID||e.keyId||"",O=f.INR_SITE_SECRET||e.secret||"";return !b||!re.test(g)||!ne.test(_)||!te.test(O)?null:{hubUrl:b,siteKey:g,keyId:_,secret:O}},timeoutMs:Me(e.timeoutMs,o().INR_TIMEOUT_MS),outbox:c,spill:l,logger:n}),I=new Set,i=f=>{let d=f.catch(b=>{n.warn("inr.report attempt failed",{error:b instanceof Error?b.message:String(b)});}).finally(()=>I.delete(d));I.add(d);},a=f=>i(E.chain(f)),p=async()=>{for(;I.size>0;)await Promise.allSettled([...I]);},x=-1/0,T=()=>{Date.now()-x<Ot||(x=Date.now(),n.warn("INR_OUTBOX_UNAVAILABLE"));},S=Pe({delivery:E,outbox:c,spill:l,unavailable:T,onTick:u});r&&S.start();async function v(f){if(typeof f!="string"||!A.test(f))return false;let d=(_,O)=>(n.warn("INR_FORGET_FAILED",{status:_,code:O}),false);for(let _ of l.entries())W(_,f)&&l.delete(_);if(!await N(()=>c.purge(f).then(()=>true)))return d(0,"INR_OUTBOX_UNAVAILABLE");let b={method:"DELETE",path:M.forget+f,body:""},g;for(let _=0;;_++){if(g=await E.request(b),"status"in g&&g.status>=200&&g.status<300)return true;if(g.kind!=="retryable"||_===P.length)break;let O=g.retryAfterMs??0;if(O>ie)break;await U(Math.max(P[_],O));}return g.kind==="nofetch"?d(0,"INR_NO_FETCH"):d(g.status,g.code)}let h=async f=>{let d=await N(()=>c.enqueue(f));return d===void 0?"failed":d?"inserted":"exists"};return {outbox:c,spill:l,bodyFor:fe,async report(f){try{let d=fe(f);if("error"in d)return n.warn("inr.report dropped: invalid event",{error:d.error}),{status:"invalid",error:d.error};if(!r)return {status:"disabled",body:d};let b=Date.now(),g={eventType:d.eventType,eventId:d.eventId,body:d,attempts:0,nextAttemptAt:new Date(b+L),lastStatus:null,lastError:null,unauthorizedSince:null,createdAt:new Date(b)},_=await h(g),O=_==="failed"?"spilled":"queued";if(_==="failed"&&T(),_==="exists"||l.has(g))return {status:O,body:d};if(_==="failed"){let C=l.add(g);C&&n.warn("inr_outbox_dropped_total",{eventType:C.eventType,eventId:C.eventId,status:C.lastError?.status??null,code:C.lastError?.code??null,reason:"memory_full"});}return a(g),{status:O,body:d}}catch(d){return n.warn("inr.report failed",{error:d instanceof Error?d.message:String(d)}),{status:"invalid",error:"internal"}}},idle:p,forget:v,drainNow:S.drainNow,close:()=>S.close(p),landingRelay:Ke({enabled:r,forward:f=>i(E.request(f)),warn:n.warn})}}exports.CONVERSION_TYPES=Te;exports.ENQUEUE_TIMEOUT_MS=It;exports.LINK_TARGETS=F;exports.OUTBOX_DEFAULT_COLLECTION=B;exports.OUTBOX_INDEXES=Se;exports.OUTBOX_TTL_SECONDS=qe;exports.REVERSAL_TYPES=He;exports.SDK_VERSION=k;exports.buildConversionBody=fe;exports.classifyResponse=Ne;exports.createConversionReporter=ht;exports.createMemoryOutbox=J;exports.createOutbox=G;exports.ensureOutboxIndexes=j;exports.hmacBase=$;exports.outboxModel=H;exports.outboxSchemaDefinition=xe;exports.referralFromRequest=_e;exports.referralMiddleware=ze;exports.sha256Hex=me;exports.signRequest=Y;exports.verifyEnv=vt;exports.verifySignature=Ye;//# sourceMappingURL=index.cjs.map
|
|
2
|
+
//# sourceMappingURL=index.cjs.map
|