standdown 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/validation.ts","../src/bundle.ts","../src/detect.ts","../src/session.ts","../src/stores.ts","../src/webext.ts"],"names":["domainSuffixMatches","hostFromUrl","messageFromError","cloneAuditEntry","clonePolicy","failClosedDecision","result","isPromiseLike"],"mappings":"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","file":"webext.cjs","sourcesContent":["import type {\n Behavior,\n CookieRule,\n DomainRule,\n InitiatorRule,\n StanddownPolicy,\n} from './types';\n\nconst BEHAVIORS = new Set<Behavior>([\n 'suppress-prompts',\n 'no-cookie-write',\n 'no-redirect',\n 'no-background-tracking',\n]);\n\nconst PARAM_MATCHES = new Set(['exists', 'equals', 'contains']);\nconst COOKIE_MATCHES = new Set(['exact', 'substring']);\nconst DOMAIN_KINDS = new Set(['suffix', 'regex']);\nconst REFERRER_CLASSES = new Set([\n 'own-site',\n 'organic',\n 'direct',\n 'advertiser-internal',\n 'other',\n]);\nconst ACTIVATION_REFERRER_CLASSES = new Set(['own-site', 'organic', 'direct']);\n\nexport function validatePolicy(value: unknown): asserts value is StanddownPolicy {\n const policy = object(value, 'policy');\n\n string(policy.id, 'policy.id');\n literal(policy.schemaVersion, 3, 'policy.schemaVersion');\n string(policy.policyVersion, 'policy.policyVersion');\n\n const network = object(policy.network, 'policy.network');\n string(network.id, 'policy.network.id');\n string(network.name, 'policy.network.name');\n\n if (network.policyUrl !== undefined) {\n urlString(network.policyUrl, 'policy.network.policyUrl');\n }\n\n const detection = object(policy.detection, 'policy.detection');\n optionalArray(detection.advertiserHosts, 'policy.detection.advertiserHosts').forEach(\n validateDomainRule,\n );\n optionalArray(detection.landingParams, 'policy.detection.landingParams').forEach(\n validateParamRule,\n );\n optionalArray(detection.redirectDomains, 'policy.detection.redirectDomains').forEach(\n validateDomainRule,\n );\n optionalArray(detection.cookiePatterns, 'policy.detection.cookiePatterns').forEach(\n validateCookieRule,\n );\n optionalArray(detection.initiatorRules, 'policy.detection.initiatorRules').forEach(\n validateInitiatorRule,\n );\n\n const standdown = object(policy.standdown, 'policy.standdown');\n literal(standdown.scope, 'advertiser', 'policy.standdown.scope');\n\n if (\n standdown.sessionRule !== 'session-or-min' &&\n standdown.sessionRule !== 'inactivity-window'\n ) {\n throw new TypeError('policy.standdown.sessionRule is invalid');\n }\n\n nonNegativeFiniteNumber(\n standdown.minDurationMs,\n 'policy.standdown.minDurationMs',\n );\n\n if (standdown.inactivityMs !== undefined) {\n nonNegativeFiniteNumber(\n standdown.inactivityMs,\n 'policy.standdown.inactivityMs',\n );\n }\n\n const behaviors = array(standdown.behaviors, 'policy.standdown.behaviors');\n for (const behavior of behaviors) {\n if (!BEHAVIORS.has(behavior as Behavior)) {\n throw new TypeError(`policy.standdown.behaviors contains invalid behavior`);\n }\n }\n\n const activation = object(policy.activation, 'policy.activation');\n\n if (activation.mode !== 'user-click' && activation.mode !== 'never') {\n throw new TypeError('policy.activation.mode is invalid');\n }\n\n if (activation.maxPromptsPerJourney !== undefined) {\n nonNegativeFiniteNumber(\n activation.maxPromptsPerJourney,\n 'policy.activation.maxPromptsPerJourney',\n );\n }\n\n for (const referrerClass of optionalArray(\n activation.allowedReferrerClasses,\n 'policy.activation.allowedReferrerClasses',\n )) {\n if (!ACTIVATION_REFERRER_CLASSES.has(referrerClass as string)) {\n throw new TypeError(\n 'policy.activation.allowedReferrerClasses contains invalid class',\n );\n }\n }\n\n const metadata = object(policy.metadata, 'policy.metadata');\n urlString(metadata.sourceUrl, 'policy.metadata.sourceUrl');\n dateString(metadata.lastVerified, 'policy.metadata.lastVerified');\n\n if (metadata.notes !== undefined) {\n string(metadata.notes, 'policy.metadata.notes');\n }\n}\n\nexport function validatePolicies(\n values: readonly unknown[],\n): asserts values is readonly StanddownPolicy[] {\n values.forEach(validatePolicy);\n}\n\nfunction validateParamRule(ruleValue: unknown): void {\n const rule = object(ruleValue, 'ParamRule');\n const anyOf = array(rule.anyOf, 'ParamRule.anyOf');\n\n if (anyOf.length === 0) {\n throw new TypeError('ParamRule.anyOf must not be empty');\n }\n\n for (const groupValue of anyOf) {\n const group = object(groupValue, 'ParamRule.anyOf[]');\n const allOf = array(group.allOf, 'ParamRule.anyOf[].allOf');\n\n if (allOf.length === 0) {\n throw new TypeError('ParamRule.anyOf[].allOf must not be empty');\n }\n\n allOf.forEach(validateParamMatcher);\n }\n\n if (rule.reason !== undefined) {\n string(rule.reason, 'ParamRule.reason');\n }\n}\n\nfunction validateParamMatcher(matcherValue: unknown): void {\n const matcher = object(matcherValue, 'ParamMatcher');\n string(matcher.name, 'ParamMatcher.name');\n\n if (matcher.name.trim() === '') {\n throw new TypeError('ParamMatcher.name must not be empty');\n }\n\n if (matcher.value !== undefined) {\n string(matcher.value, 'ParamMatcher.value');\n }\n\n if (matcher.match !== undefined && !PARAM_MATCHES.has(matcher.match as string)) {\n throw new TypeError('ParamMatcher.match is invalid');\n }\n\n if (\n (matcher.match === 'equals' || matcher.match === 'contains') &&\n matcher.value === undefined\n ) {\n throw new TypeError('ParamMatcher.value is required for equals/contains');\n }\n}\n\nfunction validateDomainRule(ruleValue: unknown): void {\n const rule = object(ruleValue, 'DomainRule') as Record<string, unknown> & DomainRule;\n string(rule.pattern, 'DomainRule.pattern');\n\n if (!DOMAIN_KINDS.has(rule.kind)) {\n throw new TypeError('DomainRule.kind is invalid');\n }\n\n if (rule.kind === 'regex') {\n try {\n new RegExp(rule.pattern);\n } catch {\n throw new TypeError('DomainRule.pattern must be a valid regex');\n }\n }\n\n if (rule.comment !== undefined) {\n string(rule.comment, 'DomainRule.comment');\n }\n}\n\nfunction validateCookieRule(ruleValue: unknown): void {\n const rule = object(ruleValue, 'CookieRule') as Record<string, unknown> & CookieRule;\n string(rule.name, 'CookieRule.name');\n\n if (!COOKIE_MATCHES.has(rule.match)) {\n throw new TypeError('CookieRule.match is invalid');\n }\n\n if (rule.reason !== undefined) {\n string(rule.reason, 'CookieRule.reason');\n }\n}\n\nfunction validateInitiatorRule(ruleValue: unknown): void {\n const rule = object(ruleValue, 'InitiatorRule') as Record<string, unknown> &\n InitiatorRule;\n\n if (!REFERRER_CLASSES.has(rule.referrerClass)) {\n throw new TypeError('InitiatorRule.referrerClass is invalid');\n }\n\n if (rule.reason !== undefined) {\n string(rule.reason, 'InitiatorRule.reason');\n }\n}\n\nfunction object(value: unknown, path: string): Record<string, unknown> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new TypeError(`${path} must be an object`);\n }\n\n return value as Record<string, unknown>;\n}\n\nfunction string(value: unknown, path: string): asserts value is string {\n if (typeof value !== 'string' || value.trim() === '') {\n throw new TypeError(`${path} must be a non-empty string`);\n }\n}\n\nfunction literal<T>(value: unknown, expected: T, path: string): asserts value is T {\n if (value !== expected) {\n throw new TypeError(`${path} must be ${String(expected)}`);\n }\n}\n\nfunction array(value: unknown, path: string): readonly unknown[] {\n if (!Array.isArray(value)) {\n throw new TypeError(`${path} must be an array`);\n }\n\n return value;\n}\n\nfunction optionalArray(value: unknown, path: string): readonly unknown[] {\n if (value === undefined) {\n return [];\n }\n\n return array(value, path);\n}\n\nfunction nonNegativeFiniteNumber(value: unknown, path: string): void {\n if (typeof value !== 'number' || !Number.isFinite(value) || value < 0) {\n throw new TypeError(`${path} must be a non-negative finite number`);\n }\n}\n\nfunction urlString(value: unknown, path: string): void {\n string(value, path);\n\n try {\n new URL(value);\n } catch {\n throw new TypeError(`${path} must be an absolute URL`);\n }\n}\n\nfunction dateString(value: unknown, path: string): void {\n string(value, path);\n\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) {\n throw new TypeError(`${path} must be YYYY-MM-DD`);\n }\n}\n","import type {\n CookieRule,\n DomainRule,\n InitiatorRule,\n ParamRule,\n PolicyBundleVerificationResult,\n SignedBundleSignatureAlgorithm,\n SignedPolicyBundle,\n StanddownPolicy,\n} from './types';\nimport { validatePolicies } from './validation';\n\nconst textEncoder = new TextEncoder();\nconst MAX_SIGNED_BUNDLE_REGEX_LENGTH = 256;\n\nexport async function verifyPolicyBundle(\n current: readonly StanddownPolicy[],\n update: SignedPolicyBundle,\n publicKeyJwk: JsonWebKey,\n): Promise<PolicyBundleVerificationResult> {\n try {\n validatePolicies(current);\n validatePolicies(update.policies);\n } catch (error) {\n return { ok: false, violation: `malformed-policy: ${messageFromError(error)}` };\n }\n\n if (update.schemaVersion !== 1) {\n return { ok: false, violation: 'unsupported-bundle-version' };\n }\n\n const signatureOk = await verifySignature(\n update.signature.algorithm,\n publicKeyJwk,\n update.signature.value,\n canonicalPolicyBundlePayload(update),\n );\n\n if (!signatureOk) {\n return { ok: false, violation: 'bad-signature' };\n }\n\n const regexViolation = regexComplexityViolation(update.policies);\n\n if (regexViolation !== undefined) {\n return { ok: false, violation: regexViolation };\n }\n\n const monotonicityViolation = checkMonotonicity(current, update.policies);\n\n if (monotonicityViolation !== undefined) {\n return { ok: false, violation: monotonicityViolation };\n }\n\n return { ok: true, policies: update.policies.map(clonePolicy) };\n}\n\nexport function canonicalPolicyBundlePayload(\n bundle: Pick<SignedPolicyBundle, 'schemaVersion' | 'policies'>,\n): string {\n return canonicalJson({\n schemaVersion: bundle.schemaVersion,\n policies: bundle.policies,\n });\n}\n\nexport function canonicalJson(value: unknown): string {\n if (value === null || typeof value !== 'object') {\n if (typeof value === 'number' && !Number.isFinite(value)) {\n throw new TypeError('canonical JSON only supports finite numbers');\n }\n\n return JSON.stringify(value);\n }\n\n if (Array.isArray(value)) {\n return `[${value.map((item) => canonicalJson(item)).join(',')}]`;\n }\n\n const record = value as Record<string, unknown>;\n const entries = Object.keys(record)\n .filter((key) => record[key] !== undefined)\n .sort()\n .map((key) => `${JSON.stringify(key)}:${canonicalJson(record[key])}`);\n\n return `{${entries.join(',')}}`;\n}\n\nfunction checkMonotonicity(\n current: readonly StanddownPolicy[],\n update: readonly StanddownPolicy[],\n): string | undefined {\n const updateById = new Map(update.map((policy) => [policy.id, policy]));\n\n for (const currentPolicy of current) {\n const updatedPolicy = updateById.get(currentPolicy.id);\n\n if (updatedPolicy === undefined) {\n return `policy-removed:${currentPolicy.id}`;\n }\n\n const detectionResult = detectionViolation(currentPolicy, updatedPolicy);\n\n if (detectionResult !== undefined) {\n return `${currentPolicy.id}:${detectionResult}`;\n }\n\n const standdownResult = standdownViolation(currentPolicy, updatedPolicy);\n\n if (standdownResult !== undefined) {\n return `${currentPolicy.id}:${standdownResult}`;\n }\n\n if (!sameJson(currentPolicy.activation, updatedPolicy.activation)) {\n return `${currentPolicy.id}:activation-edited`;\n }\n }\n\n return undefined;\n}\n\nfunction detectionViolation(\n currentPolicy: StanddownPolicy,\n updatedPolicy: StanddownPolicy,\n): string | undefined {\n if (\n !domainRulesSurvive(\n currentPolicy.detection.advertiserHosts,\n updatedPolicy.detection.advertiserHosts,\n { advertiserHosts: true },\n )\n ) {\n return 'advertiser-hosts-narrowed';\n }\n\n if (\n !paramRulesSurvive(\n currentPolicy.detection.landingParams,\n updatedPolicy.detection.landingParams,\n )\n ) {\n return 'landing-params-narrowed';\n }\n\n if (\n !domainRulesSurvive(\n currentPolicy.detection.redirectDomains,\n updatedPolicy.detection.redirectDomains,\n )\n ) {\n return 'redirect-domains-narrowed';\n }\n\n if (\n !cookieRulesSurvive(\n currentPolicy.detection.cookiePatterns,\n updatedPolicy.detection.cookiePatterns,\n )\n ) {\n return 'cookie-patterns-narrowed';\n }\n\n if (\n !initiatorRulesSurvive(\n currentPolicy.detection.initiatorRules,\n updatedPolicy.detection.initiatorRules,\n )\n ) {\n return 'initiator-rules-narrowed';\n }\n\n return undefined;\n}\n\nfunction standdownViolation(\n currentPolicy: StanddownPolicy,\n updatedPolicy: StanddownPolicy,\n): string | undefined {\n if (updatedPolicy.standdown.scope !== currentPolicy.standdown.scope) {\n return 'standdown-scope-edited';\n }\n\n if (updatedPolicy.standdown.sessionRule !== currentPolicy.standdown.sessionRule) {\n return 'session-rule-edited';\n }\n\n if (updatedPolicy.standdown.minDurationMs < currentPolicy.standdown.minDurationMs) {\n return 'min-duration-shortened';\n }\n\n if (\n currentPolicy.standdown.inactivityMs !== undefined &&\n (updatedPolicy.standdown.inactivityMs === undefined ||\n updatedPolicy.standdown.inactivityMs < currentPolicy.standdown.inactivityMs)\n ) {\n return 'inactivity-duration-shortened';\n }\n\n for (const behavior of currentPolicy.standdown.behaviors) {\n if (!updatedPolicy.standdown.behaviors.includes(behavior)) {\n return 'standdown-behavior-removed';\n }\n }\n\n return undefined;\n}\n\nfunction domainRulesSurvive(\n current: readonly DomainRule[] | undefined,\n update: readonly DomainRule[] | undefined,\n opts: { advertiserHosts?: boolean } = {},\n): boolean {\n if (opts.advertiserHosts && current === undefined) {\n return update === undefined;\n }\n\n if (current === undefined || current.length === 0) {\n return true;\n }\n\n if (opts.advertiserHosts && update === undefined) {\n return true;\n }\n\n if (update === undefined || update.length === 0) {\n return false;\n }\n\n return current.every((rule) =>\n update.some((candidate) => domainRuleCovers(rule, candidate)),\n );\n}\n\nfunction regexComplexityViolation(\n policies: readonly StanddownPolicy[],\n): string | undefined {\n for (const policy of policies) {\n for (const [field, rules] of domainRuleEntries(policy)) {\n for (const rule of rules ?? []) {\n if (rule.kind === 'regex' && isComplexRegex(rule.pattern)) {\n return `${policy.id}:complex-regex:${field}`;\n }\n }\n }\n }\n\n return undefined;\n}\n\nfunction domainRuleEntries(\n policy: StanddownPolicy,\n): readonly (readonly [string, readonly DomainRule[] | undefined])[] {\n return [\n ['detection.advertiserHosts', policy.detection.advertiserHosts],\n ['detection.redirectDomains', policy.detection.redirectDomains],\n ] as const;\n}\n\nfunction isComplexRegex(pattern: string): boolean {\n return (\n pattern.length > MAX_SIGNED_BUNDLE_REGEX_LENGTH ||\n hasRegexBackreference(pattern) ||\n hasRegexLookaround(pattern) ||\n hasNestedUnboundedQuantifier(pattern)\n );\n}\n\nfunction hasRegexBackreference(pattern: string): boolean {\n return /(^|[^\\\\])\\\\[1-9]/.test(pattern);\n}\n\nfunction hasRegexLookaround(pattern: string): boolean {\n return /\\(\\?(?:[=!]|<[=!])/.test(pattern);\n}\n\nfunction hasNestedUnboundedQuantifier(pattern: string): boolean {\n return /\\((?:[^()\\\\]|\\\\.)*[+*](?:[^()\\\\]|\\\\.)*\\)(?:[+*]|\\{\\d*,?\\})/.test(\n pattern,\n );\n}\n\nfunction domainRuleCovers(current: DomainRule, update: DomainRule): boolean {\n if (current.kind === 'suffix' && update.kind === 'suffix') {\n return domainSuffixMatches(current.pattern, update.pattern);\n }\n\n return sameJson(current, update);\n}\n\nfunction paramRulesSurvive(\n current: readonly ParamRule[] | undefined,\n update: readonly ParamRule[] | undefined,\n): boolean {\n return exactRulesSurvive(current, update);\n}\n\nfunction cookieRulesSurvive(\n current: readonly CookieRule[] | undefined,\n update: readonly CookieRule[] | undefined,\n): boolean {\n return exactRulesSurvive(current, update);\n}\n\nfunction initiatorRulesSurvive(\n current: readonly InitiatorRule[] | undefined,\n update: readonly InitiatorRule[] | undefined,\n): boolean {\n return exactRulesSurvive(current, update);\n}\n\nfunction exactRulesSurvive<T>(\n current: readonly T[] | undefined,\n update: readonly T[] | undefined,\n): boolean {\n if (current === undefined || current.length === 0) {\n return true;\n }\n\n if (update === undefined || update.length === 0) {\n return false;\n }\n\n const updatedRules = new Set(update.map((rule) => canonicalJson(rule)));\n\n return current.every((rule) => updatedRules.has(canonicalJson(rule)));\n}\n\nasync function verifySignature(\n algorithm: SignedBundleSignatureAlgorithm,\n publicKeyJwk: JsonWebKey,\n signatureValue: string,\n payload: string,\n): Promise<boolean> {\n try {\n const publicKey = await importVerificationKey(algorithm, publicKeyJwk);\n const signature = base64UrlToBytes(signatureValue);\n const data = bytesToArrayBuffer(textEncoder.encode(payload));\n\n if (algorithm === 'ECDSA-P256') {\n return crypto.subtle.verify(\n { name: 'ECDSA', hash: 'SHA-256' },\n publicKey,\n bytesToArrayBuffer(signature),\n data,\n );\n }\n\n return crypto.subtle.verify(\n 'Ed25519',\n publicKey,\n bytesToArrayBuffer(signature),\n data,\n );\n } catch {\n return false;\n }\n}\n\nasync function importVerificationKey(\n algorithm: SignedBundleSignatureAlgorithm,\n publicKeyJwk: JsonWebKey,\n): Promise<CryptoKey> {\n if (algorithm === 'ECDSA-P256') {\n return crypto.subtle.importKey(\n 'jwk',\n publicKeyJwk,\n { name: 'ECDSA', namedCurve: 'P-256' },\n false,\n ['verify'],\n );\n }\n\n return crypto.subtle.importKey('jwk', publicKeyJwk, 'Ed25519', false, [\n 'verify',\n ]);\n}\n\nfunction base64UrlToBytes(value: string): Uint8Array {\n const base64 = value.replace(/-/g, '+').replace(/_/g, '/');\n const padded = base64.padEnd(Math.ceil(base64.length / 4) * 4, '=');\n const binary = atob(padded);\n const bytes = new Uint8Array(binary.length);\n\n for (let index = 0; index < binary.length; index += 1) {\n bytes[index] = binary.charCodeAt(index);\n }\n\n return bytes;\n}\n\nfunction bytesToArrayBuffer(bytes: Uint8Array): ArrayBuffer {\n return bytes.buffer.slice(\n bytes.byteOffset,\n bytes.byteOffset + bytes.byteLength,\n ) as ArrayBuffer;\n}\n\nfunction sameJson(left: unknown, right: unknown): boolean {\n return canonicalJson(left) === canonicalJson(right);\n}\n\nfunction domainSuffixMatches(host: string, pattern: string): boolean {\n const normalizedHost = host.toLowerCase().replace(/^\\./, '').replace(/\\.$/, '');\n const normalizedPattern = pattern\n .toLowerCase()\n .replace(/^\\./, '')\n .replace(/\\.$/, '');\n\n return (\n normalizedHost === normalizedPattern ||\n normalizedHost.endsWith(`.${normalizedPattern}`)\n );\n}\n\nfunction clonePolicy(policy: StanddownPolicy): StanddownPolicy {\n return JSON.parse(JSON.stringify(policy)) as StanddownPolicy;\n}\n\nfunction messageFromError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import type {\n CookieRule,\n Detection,\n DomainRule,\n InitiatorRule,\n MatchedRule,\n ParamMatcher,\n ParamRule,\n ReferrerClass,\n SelfExemption,\n Signals,\n StanddownPolicy,\n} from './types';\n\nconst ORGANIC_REFERRER_SUFFIXES = [\n 'google.com',\n 'bing.com',\n 'duckduckgo.com',\n 'yahoo.com',\n 'ecosia.org',\n 'baidu.com',\n 'yandex.com',\n] as const;\n\nexport function detect(\n signals: Signals,\n policies: readonly StanddownPolicy[],\n): Detection {\n const currentUrl = parseUrl(signals.url);\n\n if (!currentUrl) {\n return {\n matched: [],\n selfMatch: false,\n failClosedReason: 'invalid-url',\n };\n }\n\n const advertiserHost = currentUrl.hostname.toLowerCase();\n const matched: MatchedRule[] = [];\n let selfMatch = false;\n\n for (const policy of policies) {\n const scopedSelfMatch = hasScopedSelfExemption(\n currentUrl,\n signals.selfPatterns,\n policy,\n );\n const unscopedSelfMatch = hasUnscopedSelfExemption(\n currentUrl,\n signals.selfPatterns,\n );\n\n if (scopedSelfMatch || unscopedSelfMatch) {\n selfMatch = true;\n }\n\n if (scopedSelfMatch) {\n continue;\n }\n\n matched.push(\n ...collectPolicyMatches(policy, signals, currentUrl, advertiserHost),\n );\n }\n\n matched.sort((left, right) => kindPriority(left.kind) - kindPriority(right.kind));\n\n const strongest = matched[0]\n ? {\n policyId: matched[0].policyId,\n advertiserHost: matched[0].advertiserHost,\n reason: matched[0].reason,\n }\n : undefined;\n\n return strongest ? { matched, selfMatch, strongest } : { matched, selfMatch };\n}\n\nexport function classifyReferrer(\n signals: Pick<Signals, 'referrer' | 'initiator' | 'publisherSites'>,\n advertiserHost: string,\n): ReferrerClass {\n const candidate = signals.initiator ?? signals.referrer;\n\n if (!candidate) {\n return 'direct';\n }\n\n const referrerHost = hostFromUrl(candidate);\n\n if (!referrerHost) {\n return 'other';\n }\n\n if (\n (signals.publisherSites ?? []).some((site) =>\n domainSuffixMatches(referrerHost, site),\n )\n ) {\n return 'own-site';\n }\n\n if (domainSuffixMatches(referrerHost, advertiserHost)) {\n return 'advertiser-internal';\n }\n\n if (\n ORGANIC_REFERRER_SUFFIXES.some((suffix) =>\n domainSuffixMatches(referrerHost, suffix),\n )\n ) {\n return 'organic';\n }\n\n return 'other';\n}\n\nexport function domainRuleMatchesUrl(rule: DomainRule, value: string): boolean {\n const url = parseUrl(value);\n const host = url?.hostname.toLowerCase() ?? value.toLowerCase();\n\n if (rule.kind === 'suffix') {\n return domainSuffixMatches(host, rule.pattern);\n }\n\n try {\n const regex = new RegExp(rule.pattern, 'i');\n return regex.test(host) || (url ? regex.test(url.href) : regex.test(value));\n } catch {\n return false;\n }\n}\n\nfunction collectPolicyMatches(\n policy: StanddownPolicy,\n signals: Signals,\n currentUrl: URL,\n advertiserHost: string,\n): MatchedRule[] {\n const matches: MatchedRule[] = [];\n const advertiserHostMatches =\n policy.detection.advertiserHosts === undefined ||\n policy.detection.advertiserHosts.some((rule) =>\n domainRuleMatchesUrl(rule, advertiserHost),\n );\n\n if (advertiserHostMatches) {\n for (const rule of policy.detection.landingParams ?? []) {\n if (paramRuleMatches(rule, currentUrl.searchParams)) {\n matches.push(\n matchedRule(\n policy,\n 'landing-param',\n describeParamRule(rule),\n advertiserHost,\n rule.reason ?? 'landing parameter matched',\n ),\n );\n }\n }\n }\n\n for (const rule of policy.detection.redirectDomains ?? []) {\n if ((signals.redirectChain ?? []).some((url) => domainRuleMatchesUrl(rule, url))) {\n matches.push(\n matchedRule(\n policy,\n 'redirect-domain',\n `${rule.kind}:${rule.pattern}`,\n advertiserHost,\n rule.comment ?? 'redirect domain matched',\n ),\n );\n }\n }\n\n if (advertiserHostMatches) {\n for (const rule of policy.detection.cookiePatterns ?? []) {\n if (cookieRuleMatches(rule, signals.cookieNames ?? [])) {\n matches.push(\n matchedRule(\n policy,\n 'cookie',\n `${rule.match}:${rule.name}`,\n advertiserHost,\n rule.reason ?? 'first-party cookie name matched',\n ),\n );\n }\n }\n }\n\n if (advertiserHostMatches) {\n for (const rule of policy.detection.initiatorRules ?? []) {\n if (initiatorRuleMatches(rule, signals, advertiserHost)) {\n matches.push(\n matchedRule(\n policy,\n 'initiator',\n `referrer-class:${rule.referrerClass}`,\n advertiserHost,\n rule.reason ?? 'initiator/referrer class matched',\n ),\n );\n }\n }\n }\n\n return matches;\n}\n\nfunction matchedRule(\n policy: StanddownPolicy,\n kind: MatchedRule['kind'],\n rule: string,\n advertiserHost: string,\n reason: string,\n): MatchedRule {\n return {\n policyId: policy.id,\n networkId: policy.network.id,\n networkName: policy.network.name,\n kind,\n rule,\n advertiserHost,\n reason,\n sourceUrl: policy.metadata.sourceUrl,\n };\n}\n\nfunction kindPriority(kind: MatchedRule['kind']): number {\n if (kind === 'redirect-domain') {\n return 0;\n }\n\n if (kind === 'landing-param') {\n return 1;\n }\n\n if (kind === 'cookie') {\n return 2;\n }\n\n return 3;\n}\n\nfunction paramRuleMatches(rule: ParamRule, params: URLSearchParams): boolean {\n return rule.anyOf.some((group) =>\n group.allOf.every((matcher) => paramMatcherMatches(matcher, params)),\n );\n}\n\nfunction paramMatcherMatches(\n matcher: ParamMatcher,\n params: URLSearchParams,\n): boolean {\n const values = params.getAll(matcher.name);\n const mode = matcher.match ?? (matcher.value === undefined ? 'exists' : 'equals');\n\n if (mode === 'exists') {\n return values.length > 0;\n }\n\n const expectedValue = matcher.value;\n\n if (expectedValue === undefined) {\n return false;\n }\n\n if (mode === 'equals') {\n return values.some((value) => value === expectedValue);\n }\n\n return values.some((value) => value.includes(expectedValue));\n}\n\nfunction cookieRuleMatches(\n rule: CookieRule,\n cookieNames: readonly string[],\n): boolean {\n if (rule.match === 'exact') {\n return cookieNames.some((name) => name === rule.name);\n }\n\n return cookieNames.some((name) => name.includes(rule.name));\n}\n\nfunction initiatorRuleMatches(\n rule: InitiatorRule,\n signals: Signals,\n advertiserHost: string,\n): boolean {\n return classifyReferrer(signals, advertiserHost) === rule.referrerClass;\n}\n\nfunction hasScopedSelfExemption(\n currentUrl: URL,\n selfPatterns: readonly SelfExemption[] | undefined,\n policy: StanddownPolicy,\n): boolean {\n return (selfPatterns ?? []).some((pattern) => {\n const scopedToPolicy = pattern.policyId === policy.id;\n const scopedToNetwork = pattern.networkId === policy.network.id;\n\n return (\n (scopedToPolicy || scopedToNetwork) &&\n paramMatcherMatches(pattern, currentUrl.searchParams)\n );\n });\n}\n\nfunction hasUnscopedSelfExemption(\n currentUrl: URL,\n selfPatterns: readonly SelfExemption[] | undefined,\n): boolean {\n return (selfPatterns ?? []).some(\n (pattern) =>\n pattern.policyId === undefined &&\n pattern.networkId === undefined &&\n paramMatcherMatches(pattern, currentUrl.searchParams),\n );\n}\n\nfunction domainSuffixMatches(host: string, pattern: string): boolean {\n const normalizedHost = host.toLowerCase().replace(/\\.$/, '');\n const normalizedPattern = pattern.toLowerCase().replace(/^\\./, '').replace(/\\.$/, '');\n\n return (\n normalizedHost === normalizedPattern ||\n normalizedHost.endsWith(`.${normalizedPattern}`)\n );\n}\n\nfunction describeParamRule(rule: ParamRule): string {\n return rule.anyOf\n .map((group) =>\n group.allOf\n .map((matcher) => {\n const mode = matcher.match ?? (matcher.value === undefined ? 'exists' : 'equals');\n return matcher.value === undefined\n ? `${matcher.name}:${mode}`\n : `${matcher.name}:${mode}:${matcher.value}`;\n })\n .join('&'),\n )\n .join('|');\n}\n\nfunction parseUrl(value: string): URL | undefined {\n try {\n return new URL(value);\n } catch {\n return undefined;\n }\n}\n\nfunction hostFromUrl(value: string): string | undefined {\n return parseUrl(value)?.hostname.toLowerCase();\n}\n","import { classifyReferrer, detect } from './detect';\nimport type {\n AuditEntry,\n Decision,\n Detection,\n SessionRecord,\n Signals,\n StanddownPolicy,\n StanddownState,\n StateStore,\n} from './types';\nimport { validatePolicies } from './validation';\n\nexport class MemoryStateStore implements StateStore {\n #state: StanddownState | undefined;\n\n constructor(initialState?: StanddownState) {\n this.#state = initialState ? cloneState(initialState) : undefined;\n }\n\n async load(): Promise<StanddownState | undefined> {\n return this.#state ? cloneState(this.#state) : undefined;\n }\n\n async save(state: StanddownState): Promise<void> {\n this.#state = cloneState(state);\n }\n}\n\nexport class StanddownSession {\n readonly #store: StateStore;\n readonly #auditLog: boolean;\n readonly #maxAuditEntries: number;\n readonly #readOnlyAuditLog: AuditEntry[] = [];\n\n constructor(\n store: StateStore,\n opts?: { auditLog?: boolean; maxAuditEntries?: number },\n ) {\n this.#store = store;\n this.#auditLog = opts?.auditLog ?? true;\n this.#maxAuditEntries = Math.max(0, opts?.maxAuditEntries ?? 1_000);\n }\n\n async ingest(\n signals: Signals,\n policies: readonly StanddownPolicy[],\n ): Promise<Decision> {\n const advertiserHost = hostFromUrl(signals.url);\n\n try {\n validatePolicies(policies);\n } catch (error) {\n return this.#failClosedWithAudit(\n signals.now,\n 'ingest',\n advertiserHost,\n `malformed-policy: ${messageFromError(error)}`,\n );\n }\n\n const detection = detect(signals, policies);\n\n if (detection.failClosedReason) {\n return this.#failClosedWithAudit(\n signals.now,\n 'ingest',\n advertiserHost,\n detection.failClosedReason,\n detection,\n );\n }\n\n return this.#withState(signals.now, (state) => {\n pruneExpiredSessions(state, signals.now);\n\n if (detection.strongest) {\n const matchedPolicies = policiesForDetection(policies, detection);\n\n if (matchedPolicies.length === 0) {\n return {\n decision: failClosedDecision('matched-policy-missing'),\n detection,\n };\n }\n\n const record = upsertSessionRecord(\n state,\n detection.strongest.advertiserHost,\n detection.strongest.policyId,\n matchedPolicies,\n signals.now,\n );\n\n return {\n decision: decisionFromRecord(record, signals.now, {\n reason: detection.strongest.reason,\n referrerClass: classifyReferrer(signals, record.advertiserHost),\n }),\n detection,\n };\n }\n\n const activeDecision = advertiserHost\n ? activeDecisionForHost(state, advertiserHost, signals.now)\n : undefined;\n\n return {\n decision:\n activeDecision ??\n ({\n standDown: false,\n reason: detection.selfMatch\n ? 'self-exempted-no-active-standdown'\n : 'no-active-standdown',\n behaviors: [],\n referrerClass: advertiserHost\n ? classifyReferrer(signals, advertiserHost)\n : 'other',\n } satisfies Decision),\n detection,\n };\n }, 'ingest');\n }\n\n async shouldStandDown(\n advertiserHost: string,\n now: number,\n ): Promise<Decision> {\n return this.#withState(\n now,\n (state) => {\n pruneExpiredSessions(state, now);\n\n return {\n decision:\n activeDecisionForHost(state, advertiserHost, now) ??\n ({\n standDown: false,\n reason: 'no-active-standdown',\n behaviors: [],\n } satisfies Decision),\n };\n },\n 'shouldStandDown',\n normalizeHost(advertiserHost),\n { persist: false },\n );\n }\n\n async recordActivity(now: number): Promise<void> {\n await this.#withState(\n now,\n (state) => {\n pruneExpiredSessions(state, now);\n\n for (const record of Object.values(state.sessions)) {\n if (record.sessionRule === 'inactivity-window') {\n record.lastActivityAt = now;\n const expiresAt = computeExpiresAt(record);\n\n if (expiresAt !== undefined) {\n record.expiresAt = expiresAt;\n }\n }\n }\n\n return {\n decision: {\n standDown: false,\n reason: 'activity-recorded',\n behaviors: [],\n },\n };\n },\n 'recordActivity',\n );\n }\n\n async exportAuditLog(): Promise<AuditEntry[]> {\n const state = await this.#loadState();\n return trimAuditLog(\n [...state.auditLog, ...this.#readOnlyAuditLog],\n this.#maxAuditEntries,\n ).map(cloneAuditEntry);\n }\n\n async #withState(\n now: number,\n fn: (state: StanddownState) => {\n decision: Decision;\n detection?: Detection;\n },\n action: AuditEntry['action'],\n advertiserHost?: string,\n opts: { persist?: boolean } = {},\n ): Promise<Decision> {\n let state: StanddownState;\n\n try {\n state = await this.#loadState();\n } catch {\n return failClosedDecision('store-error');\n }\n\n const result = fn(state);\n\n if (this.#auditLog) {\n const entry = auditEntry({\n time: now,\n action,\n advertiserHost:\n advertiserHost ?? result.detection?.strongest?.advertiserHost,\n detection: result.detection,\n decision: result.decision,\n });\n\n if (opts.persist === false) {\n appendAuditEntry(this.#readOnlyAuditLog, entry, this.#maxAuditEntries);\n } else {\n appendAuditEntry(state.auditLog, entry, this.#maxAuditEntries);\n }\n }\n\n if (opts.persist === false) {\n return result.decision;\n }\n\n try {\n await this.#store.save(state);\n } catch {\n return failClosedDecision('store-error');\n }\n\n return result.decision;\n }\n\n async #failClosedWithAudit(\n now: number,\n action: AuditEntry['action'],\n advertiserHost: string | undefined,\n reason: string,\n detection?: Detection,\n ): Promise<Decision> {\n const decision = failClosedDecision(reason);\n\n if (!this.#auditLog) {\n return decision;\n }\n\n try {\n const state = await this.#loadState();\n appendAuditEntry(\n state.auditLog,\n auditEntry({\n time: now,\n action,\n advertiserHost,\n detection,\n decision,\n }),\n this.#maxAuditEntries,\n );\n await this.#store.save(state);\n } catch {\n return failClosedDecision('store-error');\n }\n\n return decision;\n }\n\n async #loadState(): Promise<StanddownState> {\n return (await this.#store.load()) ?? { sessions: {}, auditLog: [] };\n }\n}\n\nfunction appendAuditEntry(\n auditLog: AuditEntry[],\n entry: AuditEntry,\n maxEntries: number,\n): void {\n if (maxEntries === 0) {\n auditLog.length = 0;\n return;\n }\n\n auditLog.push(entry);\n\n if (auditLog.length > maxEntries) {\n auditLog.splice(0, auditLog.length - maxEntries);\n }\n}\n\nfunction trimAuditLog(\n auditLog: readonly AuditEntry[],\n maxEntries: number,\n): AuditEntry[] {\n if (maxEntries === 0) {\n return [];\n }\n\n return auditLog.slice(Math.max(0, auditLog.length - maxEntries));\n}\n\nfunction upsertSessionRecord(\n state: StanddownState,\n advertiserHost: string,\n primaryPolicyId: string,\n policies: readonly StanddownPolicy[],\n now: number,\n): SessionRecord {\n const key = normalizeHost(advertiserHost);\n const existing = state.sessions[key];\n const startedAt = existing?.startedAt ?? now;\n const lastActivityAt = now;\n const sessionRule =\n existing?.sessionRule === 'session-or-min' ||\n policies.some((policy) => policy.standdown.sessionRule === 'session-or-min')\n ? 'session-or-min'\n : 'inactivity-window';\n const baseRecord: SessionRecord = {\n advertiserHost: key,\n policyId: primaryPolicyId,\n startedAt,\n lastActivityAt,\n sessionRule,\n minDurationMs: Math.max(\n existing?.minDurationMs ?? 0,\n ...policies.map((policy) => policy.standdown.minDurationMs),\n ),\n behaviors: unionBehaviors([\n ...(existing?.behaviors ?? []),\n ...policies.flatMap((policy) => policy.standdown.behaviors),\n ]),\n };\n\n if (sessionRule === 'inactivity-window') {\n const inactivityMs = Math.max(\n existing?.inactivityMs ?? 0,\n ...policies.flatMap((policy) =>\n policy.standdown.inactivityMs === undefined\n ? []\n : [policy.standdown.inactivityMs],\n ),\n );\n\n if (inactivityMs > 0) {\n baseRecord.inactivityMs = inactivityMs;\n }\n }\n\n const computedExpiresAt = computeExpiresAt(baseRecord);\n\n if (computedExpiresAt !== undefined) {\n baseRecord.expiresAt = Math.max(existing?.expiresAt ?? 0, computedExpiresAt);\n }\n\n state.sessions[key] = baseRecord;\n\n return baseRecord;\n}\n\nfunction policiesForDetection(\n policies: readonly StanddownPolicy[],\n detection: Detection,\n): StanddownPolicy[] {\n if (detection.strongest === undefined) {\n return [];\n }\n\n const matchingPolicyIds = new Set(\n detection.matched\n .filter(\n (match) => match.advertiserHost === detection.strongest?.advertiserHost,\n )\n .map((match) => match.policyId),\n );\n\n return policies.filter((policy) => matchingPolicyIds.has(policy.id));\n}\n\nfunction unionBehaviors(behaviors: readonly SessionRecord['behaviors'][number][]) {\n return [...new Set(behaviors)];\n}\n\nfunction activeDecisionForHost(\n state: StanddownState,\n advertiserHost: string,\n now: number,\n): Decision | undefined {\n const record = state.sessions[normalizeHost(advertiserHost)];\n\n if (!record || !isActive(record, now)) {\n return undefined;\n }\n\n return decisionFromRecord(record, now);\n}\n\nfunction decisionFromRecord(\n record: SessionRecord,\n now: number,\n overrides?: { reason?: string; referrerClass?: Decision['referrerClass'] },\n): Decision {\n const expiresAt = computeExpiresAt(record);\n const decision: Decision = {\n standDown: true,\n policyId: record.policyId,\n reason: overrides?.reason ?? `active-standdown:${record.policyId}`,\n behaviors: [...record.behaviors],\n };\n\n if (expiresAt !== undefined) {\n decision.expiresAt = expiresAt;\n }\n\n if (overrides?.referrerClass !== undefined) {\n decision.referrerClass = overrides.referrerClass;\n }\n\n if (!isActive({ ...record, ...(expiresAt === undefined ? {} : { expiresAt }) }, now)) {\n return {\n standDown: false,\n reason: 'standdown-expired',\n behaviors: [],\n };\n }\n\n return decision;\n}\n\nfunction computeExpiresAt(record: SessionRecord): number | undefined {\n if (\n record.sessionRule === 'inactivity-window' &&\n record.inactivityMs !== undefined\n ) {\n return Math.max(\n record.startedAt + record.minDurationMs,\n record.lastActivityAt + record.inactivityMs,\n );\n }\n\n return record.expiresAt;\n}\n\nfunction isActive(record: SessionRecord, now: number): boolean {\n if (record.sessionRule === 'session-or-min') {\n return true;\n }\n\n const expiresAt = computeExpiresAt(record);\n\n return expiresAt === undefined ? false : now < expiresAt;\n}\n\nfunction pruneExpiredSessions(state: StanddownState, now: number): void {\n for (const [host, record] of Object.entries(state.sessions)) {\n if (!isActive(record, now)) {\n delete state.sessions[host];\n }\n }\n}\n\nfunction failClosedDecision(reason: string): Decision {\n return {\n standDown: true,\n reason,\n behaviors: [\n 'suppress-prompts',\n 'no-cookie-write',\n 'no-redirect',\n 'no-background-tracking',\n ],\n };\n}\n\nfunction auditEntry(value: {\n time: number;\n action: AuditEntry['action'];\n advertiserHost: string | undefined;\n detection: Detection | undefined;\n decision: Decision | undefined;\n}): AuditEntry {\n const entry: AuditEntry = {\n time: value.time,\n action: value.action,\n };\n\n if (value.advertiserHost !== undefined) {\n entry.advertiserHost = value.advertiserHost;\n }\n\n if (value.detection !== undefined) {\n entry.detection = value.detection;\n }\n\n if (value.decision !== undefined) {\n entry.decision = value.decision;\n }\n\n return entry;\n}\n\nfunction cloneState(state: StanddownState): StanddownState {\n return {\n sessions: Object.fromEntries(\n Object.entries(state.sessions).map(([host, record]) => [\n host,\n {\n ...record,\n behaviors: [...record.behaviors],\n },\n ]),\n ),\n auditLog: state.auditLog.map(cloneAuditEntry),\n };\n}\n\nfunction cloneAuditEntry(entry: AuditEntry): AuditEntry {\n const cloned: AuditEntry = {\n time: entry.time,\n action: entry.action,\n };\n\n if (entry.advertiserHost !== undefined) {\n cloned.advertiserHost = entry.advertiserHost;\n }\n\n if (entry.detection !== undefined) {\n const detection: Detection = {\n matched: entry.detection.matched.map((match) => ({ ...match })),\n selfMatch: entry.detection.selfMatch,\n };\n\n if (entry.detection.strongest !== undefined) {\n detection.strongest = { ...entry.detection.strongest };\n }\n\n if (entry.detection.failClosedReason !== undefined) {\n detection.failClosedReason = entry.detection.failClosedReason;\n }\n\n cloned.detection = detection;\n }\n\n if (entry.decision !== undefined) {\n cloned.decision = {\n ...entry.decision,\n behaviors: [...entry.decision.behaviors],\n };\n }\n\n return cloned;\n}\n\nfunction normalizeHost(host: string): string {\n return host.toLowerCase().replace(/\\.$/, '');\n}\n\nfunction hostFromUrl(value: string): string | undefined {\n try {\n return normalizeHost(new URL(value).hostname);\n } catch {\n return undefined;\n }\n}\n\nfunction messageFromError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import type {\n AuditEntry,\n Behavior,\n Decision,\n Detection,\n SessionRecord,\n StanddownState,\n StateStore,\n} from './types';\n\nconst DEFAULT_STATE_KEY = 'standdown:state:v1';\nconst DEFAULT_SESSION_ID_KEY = 'standdown:session-id:v1';\n\nexport interface ChromeRuntimeLike {\n lastError?: { message?: string };\n}\n\nexport interface ChromeStorageAreaLike {\n get(\n keys?: string | string[] | Record<string, unknown> | null,\n callback?: (items: Record<string, unknown>) => void,\n ): undefined | Promise<Record<string, unknown>>;\n set(\n items: Record<string, unknown>,\n callback?: () => void,\n ): undefined | Promise<void>;\n remove?(\n keys: string | string[],\n callback?: () => void,\n ): undefined | Promise<void>;\n}\n\nexport interface WebStorageLike {\n getItem(key: string): string | null;\n setItem(key: string, value: string): void;\n removeItem(key: string): void;\n}\n\nexport interface ChromeLocalStateStoreOptions {\n key?: string;\n identityKey?: string;\n runtime?: ChromeRuntimeLike;\n sessionStorage?: ChromeStorageAreaLike;\n sessionId?: string;\n now?: () => number;\n createSessionId?: () => string;\n}\n\nexport class ChromeLocalStateStore implements StateStore {\n readonly #localStorage: ChromeStorageAreaLike;\n readonly #sessionStorage: ChromeStorageAreaLike | undefined;\n readonly #runtime: ChromeRuntimeLike | undefined;\n readonly #key: string;\n readonly #identityKey: string;\n readonly #fixedSessionId: string | undefined;\n readonly #now: () => number;\n readonly #createSessionId: () => string;\n #cachedSessionId: string | undefined;\n\n constructor(\n localStorage: ChromeStorageAreaLike,\n opts: ChromeLocalStateStoreOptions = {},\n ) {\n this.#localStorage = localStorage;\n this.#sessionStorage = opts.sessionStorage;\n this.#runtime = opts.runtime;\n this.#key = opts.key ?? DEFAULT_STATE_KEY;\n this.#identityKey = opts.identityKey ?? DEFAULT_SESSION_ID_KEY;\n this.#fixedSessionId = opts.sessionId;\n this.#now = opts.now ?? Date.now;\n this.#createSessionId = opts.createSessionId ?? createSessionId;\n }\n\n async load(): Promise<StanddownState | undefined> {\n const sessionId = await this.#currentSessionId();\n const items = await chromeGet(this.#localStorage, this.#key, this.#runtime);\n const envelope = items[this.#key];\n\n if (envelope === undefined) {\n return undefined;\n }\n\n const persisted = parsePersistedState(envelope);\n const state = cloneState(persisted.state);\n\n if (sessionIdentityMismatch(persisted.sessionId, sessionId)) {\n return dropSessionBoundRecords(state, this.#now());\n }\n\n return state;\n }\n\n async save(state: StanddownState): Promise<void> {\n const sessionId = await this.#currentSessionId();\n const envelope: {\n schemaVersion: 1;\n sessionId?: string;\n state: StanddownState;\n } = {\n schemaVersion: 1,\n state: cloneState(state),\n };\n\n if (sessionId !== undefined) {\n envelope.sessionId = sessionId;\n }\n\n await chromeSet(\n this.#localStorage,\n {\n [this.#key]: envelope,\n },\n this.#runtime,\n );\n }\n\n async #currentSessionId(): Promise<string | undefined> {\n if (this.#fixedSessionId !== undefined) {\n return this.#fixedSessionId;\n }\n\n if (this.#cachedSessionId !== undefined) {\n return this.#cachedSessionId;\n }\n\n if (this.#sessionStorage === undefined) {\n return undefined;\n }\n\n const items = await chromeGet(\n this.#sessionStorage,\n this.#identityKey,\n this.#runtime,\n );\n const existing = items[this.#identityKey];\n\n if (typeof existing === 'string' && existing.length > 0) {\n this.#cachedSessionId = existing;\n return existing;\n }\n\n const next = this.#createSessionId();\n await chromeSet(\n this.#sessionStorage,\n { [this.#identityKey]: next },\n this.#runtime,\n );\n this.#cachedSessionId = next;\n return next;\n }\n}\n\nexport interface SessionStorageStateStoreOptions {\n key?: string;\n}\n\nexport class SessionStorageStateStore implements StateStore {\n readonly #storage: WebStorageLike;\n readonly #key: string;\n\n constructor(storage: WebStorageLike, opts: SessionStorageStateStoreOptions = {}) {\n this.#storage = storage;\n this.#key = opts.key ?? DEFAULT_STATE_KEY;\n }\n\n async load(): Promise<StanddownState | undefined> {\n const raw = this.#storage.getItem(this.#key);\n\n if (raw === null) {\n return undefined;\n }\n\n return cloneState(parseState(JSON.parse(raw)));\n }\n\n async save(state: StanddownState): Promise<void> {\n this.#storage.setItem(this.#key, JSON.stringify(cloneState(state)));\n }\n}\n\nexport interface LocalStorageTtlStateStoreOptions {\n key?: string;\n identityKey?: string;\n /**\n * Sliding envelope TTL for persisted session records. Every save refreshes\n * `savedAt`; expiry removes session state only. Audit entries remain\n * available so per-policy decisions can still be inspected. Policy-specific\n * stand-down durations remain enforced by the core state machine.\n */\n ttlMs: number;\n /**\n * Optional shared identity storage. Defaults to `localStorage` so multiple\n * tabs in the same browser session do not invalidate each other's records.\n */\n identityStorage?: WebStorageLike;\n /** @deprecated Local-TTL identity is browser-session scoped, not tab scoped. */\n sessionStorage?: WebStorageLike;\n sessionId?: string;\n now?: () => number;\n createSessionId?: () => string;\n}\n\nexport class LocalStorageTtlStateStore implements StateStore {\n readonly #localStorage: WebStorageLike;\n readonly #identityStorage: WebStorageLike;\n readonly #key: string;\n readonly #identityKey: string;\n readonly #ttlMs: number;\n readonly #fixedSessionId: string | undefined;\n readonly #now: () => number;\n readonly #createSessionId: () => string;\n #cachedSessionId: string | undefined;\n\n constructor(\n localStorage: WebStorageLike,\n opts: LocalStorageTtlStateStoreOptions,\n ) {\n this.#localStorage = localStorage;\n this.#identityStorage = opts.identityStorage ?? localStorage;\n this.#key = opts.key ?? DEFAULT_STATE_KEY;\n this.#identityKey = opts.identityKey ?? DEFAULT_SESSION_ID_KEY;\n this.#ttlMs = opts.ttlMs;\n this.#fixedSessionId = opts.sessionId;\n this.#now = opts.now ?? Date.now;\n this.#createSessionId = opts.createSessionId ?? createSessionId;\n }\n\n async load(): Promise<StanddownState | undefined> {\n const sessionId = this.#currentSessionId();\n const raw = this.#localStorage.getItem(this.#key);\n\n if (raw === null) {\n return undefined;\n }\n\n const persisted = parsePersistedState(JSON.parse(raw));\n const state = cloneState(persisted.state);\n\n if (this.#now() - persisted.savedAt >= this.#ttlMs) {\n return {\n sessions: {},\n auditLog: state.auditLog,\n };\n }\n\n if (sessionIdentityMismatch(persisted.sessionId, sessionId)) {\n return dropSessionBoundRecords(state, this.#now());\n }\n\n return state;\n }\n\n async save(state: StanddownState): Promise<void> {\n const sessionId = this.#currentSessionId();\n this.#localStorage.setItem(\n this.#key,\n JSON.stringify({\n schemaVersion: 1,\n sessionId,\n savedAt: this.#now(),\n state: cloneState(state),\n }),\n );\n }\n\n #currentSessionId(): string {\n if (this.#fixedSessionId !== undefined) {\n return this.#fixedSessionId;\n }\n\n if (this.#cachedSessionId !== undefined) {\n return this.#cachedSessionId;\n }\n\n const existing = this.#identityStorage.getItem(this.#identityKey);\n\n if (existing !== null && existing.length > 0) {\n this.#cachedSessionId = existing;\n return existing;\n }\n\n const next = this.#createSessionId();\n this.#identityStorage.setItem(this.#identityKey, next);\n this.#cachedSessionId = next;\n return next;\n }\n}\n\nexport function dropSessionBoundRecords(\n state: StanddownState,\n now: number,\n): StanddownState {\n const next = cloneState(state);\n\n for (const [host, record] of Object.entries(next.sessions)) {\n if (\n record.sessionRule === 'session-or-min' &&\n now >= record.startedAt + record.minDurationMs\n ) {\n delete next.sessions[host];\n }\n }\n\n return next;\n}\n\nexport function createSessionId(): string {\n const cryptoApi = globalThis.crypto as Crypto | undefined;\n\n if (typeof cryptoApi?.randomUUID === 'function') {\n return cryptoApi.randomUUID();\n }\n\n return `session-${Date.now()}-${Math.random().toString(36).slice(2)}`;\n}\n\nfunction parsePersistedState(value: unknown): {\n sessionId: string | undefined;\n savedAt: number;\n state: StanddownState;\n} {\n if (!isRecord(value)) {\n throw new Error('invalid persisted state');\n }\n\n const sessionId = value.sessionId;\n const savedAt = value.savedAt ?? 0;\n const state = value.state;\n\n if (\n (sessionId !== undefined && typeof sessionId !== 'string') ||\n typeof savedAt !== 'number'\n ) {\n throw new Error('invalid persisted state envelope');\n }\n\n return {\n sessionId,\n savedAt,\n state: parseState(state),\n };\n}\n\nfunction parseState(value: unknown): StanddownState {\n if (!isRecord(value) || !isRecord(value.sessions) || !Array.isArray(value.auditLog)) {\n throw new Error('invalid standdown state');\n }\n\n const sessions: Record<string, SessionRecord> = {};\n\n for (const [host, record] of Object.entries(value.sessions)) {\n sessions[host] = parseSessionRecord(record);\n }\n\n return {\n sessions,\n auditLog: value.auditLog.map(parseAuditEntry),\n };\n}\n\nfunction parseSessionRecord(value: unknown): SessionRecord {\n if (!isRecord(value)) {\n throw new Error('invalid session record');\n }\n\n const {\n advertiserHost,\n policyId,\n startedAt,\n lastActivityAt,\n expiresAt,\n sessionRule,\n minDurationMs,\n inactivityMs,\n behaviors,\n } = value;\n\n if (\n typeof advertiserHost !== 'string' ||\n typeof policyId !== 'string' ||\n typeof startedAt !== 'number' ||\n typeof lastActivityAt !== 'number' ||\n (expiresAt !== undefined && typeof expiresAt !== 'number') ||\n (sessionRule !== 'session-or-min' && sessionRule !== 'inactivity-window') ||\n typeof minDurationMs !== 'number' ||\n (inactivityMs !== undefined && typeof inactivityMs !== 'number') ||\n !Array.isArray(behaviors) ||\n !behaviors.every(isBehavior)\n ) {\n throw new Error('invalid session record');\n }\n\n const record: SessionRecord = {\n advertiserHost,\n policyId,\n startedAt,\n lastActivityAt,\n sessionRule,\n minDurationMs,\n behaviors,\n };\n\n if (expiresAt !== undefined) {\n record.expiresAt = expiresAt;\n }\n\n if (inactivityMs !== undefined) {\n record.inactivityMs = inactivityMs;\n }\n\n return record;\n}\n\nfunction parseAuditEntry(value: unknown): AuditEntry {\n if (!isRecord(value)) {\n throw new Error('invalid audit entry');\n }\n\n const { time, action, advertiserHost, detection, decision } = value;\n\n if (\n typeof time !== 'number' ||\n (action !== 'ingest' &&\n action !== 'shouldStandDown' &&\n action !== 'recordActivity' &&\n action !== 'refresh') ||\n (advertiserHost !== undefined && typeof advertiserHost !== 'string')\n ) {\n throw new Error('invalid audit entry');\n }\n\n const entry: AuditEntry = { time, action };\n\n if (advertiserHost !== undefined) {\n entry.advertiserHost = advertiserHost;\n }\n\n if (detection !== undefined) {\n entry.detection = detection as Detection;\n }\n\n if (decision !== undefined) {\n entry.decision = decision as Decision;\n }\n\n return entry;\n}\n\nfunction cloneState(state: StanddownState): StanddownState {\n return {\n sessions: Object.fromEntries(\n Object.entries(state.sessions).map(([host, record]) => [\n host,\n cloneSessionRecord(record),\n ]),\n ),\n auditLog: state.auditLog.map(cloneAuditEntry),\n };\n}\n\nfunction cloneSessionRecord(record: SessionRecord): SessionRecord {\n const next: SessionRecord = {\n advertiserHost: record.advertiserHost,\n policyId: record.policyId,\n startedAt: record.startedAt,\n lastActivityAt: record.lastActivityAt,\n sessionRule: record.sessionRule,\n minDurationMs: record.minDurationMs,\n behaviors: [...record.behaviors],\n };\n\n if (record.expiresAt !== undefined) {\n next.expiresAt = record.expiresAt;\n }\n\n if (record.inactivityMs !== undefined) {\n next.inactivityMs = record.inactivityMs;\n }\n\n return next;\n}\n\nfunction cloneAuditEntry(entry: AuditEntry): AuditEntry {\n const next: AuditEntry = {\n time: entry.time,\n action: entry.action,\n };\n\n if (entry.advertiserHost !== undefined) {\n next.advertiserHost = entry.advertiserHost;\n }\n\n if (entry.detection !== undefined) {\n next.detection = {\n matched: entry.detection.matched.map((match) => ({ ...match })),\n selfMatch: entry.detection.selfMatch,\n };\n\n if (entry.detection.strongest !== undefined) {\n next.detection.strongest = { ...entry.detection.strongest };\n }\n\n if (entry.detection.failClosedReason !== undefined) {\n next.detection.failClosedReason = entry.detection.failClosedReason;\n }\n }\n\n if (entry.decision !== undefined) {\n next.decision = {\n ...entry.decision,\n behaviors: [...entry.decision.behaviors],\n };\n }\n\n return next;\n}\n\nfunction chromeGet(\n storage: ChromeStorageAreaLike,\n key: string,\n runtime: ChromeRuntimeLike | undefined,\n): Promise<Record<string, unknown>> {\n return new Promise((resolve, reject) => {\n try {\n const result = storage.get(key, (items) => {\n const error = runtime?.lastError;\n\n if (error !== undefined) {\n reject(new Error(error.message ?? 'chrome storage error'));\n return;\n }\n\n resolve(items ?? {});\n });\n\n if (isPromiseLike(result)) {\n result.then(resolve, reject);\n }\n } catch (error) {\n reject(error);\n }\n });\n}\n\nfunction chromeSet(\n storage: ChromeStorageAreaLike,\n items: Record<string, unknown>,\n runtime: ChromeRuntimeLike | undefined,\n): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n const result = storage.set(items, () => {\n const error = runtime?.lastError;\n\n if (error !== undefined) {\n reject(new Error(error.message ?? 'chrome storage error'));\n return;\n }\n\n resolve();\n });\n\n if (isPromiseLike(result)) {\n result.then(resolve, reject);\n }\n } catch (error) {\n reject(error);\n }\n });\n}\n\nfunction isPromiseLike<T>(value: unknown): value is Promise<T> {\n return (\n isRecord(value) &&\n typeof value.then === 'function' &&\n typeof value.catch === 'function'\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction sessionIdentityMismatch(\n persistedSessionId: string | undefined,\n currentSessionId: string | undefined,\n): boolean {\n return (\n persistedSessionId !== undefined &&\n currentSessionId !== undefined &&\n persistedSessionId !== currentSessionId\n );\n}\n\nfunction isBehavior(value: unknown): value is Behavior {\n return (\n value === 'suppress-prompts' ||\n value === 'no-cookie-write' ||\n value === 'no-redirect' ||\n value === 'no-background-tracking'\n );\n}\n","import { verifyPolicyBundle } from './bundle';\nimport { StanddownSession } from './session';\nimport {\n ChromeLocalStateStore,\n type ChromeRuntimeLike,\n type ChromeStorageAreaLike,\n} from './stores';\nimport type {\n AuditEntry,\n Behavior,\n Decision,\n SelfExemption,\n Signals,\n SignedPolicyBundle,\n StanddownPolicy,\n StanddownState,\n StateStore,\n} from './types';\n\nexport {\n ChromeLocalStateStore,\n type ChromeRuntimeLike,\n type ChromeStorageAreaLike,\n} from './stores';\n\nconst QUERY_MESSAGE_TYPE = 'standdown:shouldStandDown';\nconst FAIL_CLOSED_BEHAVIORS = [\n 'suppress-prompts',\n 'no-cookie-write',\n 'no-redirect',\n 'no-background-tracking',\n] as const satisfies readonly Behavior[];\nconst DEFAULT_REFRESH_INTERVAL_MS = 60 * 60 * 1_000;\nconst MAX_ADAPTER_AUDIT_ENTRIES = 1_000;\n\nexport type StanddownWebextMode = 'webRequest' | 'webNavigation';\n\nexport interface StanddownRefreshConfig {\n readonly url: string;\n readonly publicKeyJwk: JsonWebKey;\n /** Set to 0 to disable the periodic timer while keeping refreshNow(). */\n readonly intervalMs?: number;\n}\n\nexport interface CreateStanddownOptions {\n readonly policies: readonly StanddownPolicy[];\n readonly selfPatterns?: readonly SelfExemption[];\n readonly publisherSites?: readonly string[];\n readonly refresh?: StanddownRefreshConfig;\n readonly fetch?: FetchLike;\n readonly chrome?: ChromeLike;\n readonly store?: StateStore;\n readonly sessionId?: string;\n readonly now?: () => number;\n readonly auditLog?: boolean;\n}\n\nexport interface StanddownWebextController {\n readonly mode: StanddownWebextMode;\n readonly session: StanddownSession;\n readonly store: StateStore;\n ingestNavigation(tabId: number, url: string): Promise<Decision>;\n shouldStandDown(tabId: number, now?: number): Promise<Decision>;\n shouldStandDownForUrl(url: string, now?: number): Promise<Decision>;\n refreshNow(): Promise<StanddownRefreshResult>;\n getPolicies(): readonly StanddownPolicy[];\n handleMessage(\n message: unknown,\n sender?: RuntimeMessageSenderLike,\n ): Promise<StanddownMessageResponse | undefined>;\n dispose(): void;\n}\n\nexport interface StanddownShouldStandDownMessage {\n readonly type: typeof QUERY_MESSAGE_TYPE;\n readonly tabId?: number;\n readonly url?: string;\n}\n\nexport interface StanddownMessageResponse {\n readonly ok: boolean;\n readonly decision: Decision;\n}\n\nexport type StanddownRefreshResult =\n | { ok: true; applied: number }\n | { ok: false; violation: string };\n\nexport type FetchLike = (url: string) => Promise<{\n ok: boolean;\n status: number;\n json(): Promise<unknown>;\n}>;\n\nexport interface ChromeLike {\n readonly webRequest?: {\n readonly onBeforeRequest?: ChromeEventLike<WebRequestBeforeListener>;\n };\n readonly webNavigation?: {\n readonly onCommitted?: ChromeEventLike<WebNavigationCommittedListener>;\n };\n readonly runtime?: ChromeRuntimeLike & {\n readonly onMessage?: ChromeEventLike<RuntimeMessageListener>;\n };\n readonly storage?: {\n readonly local?: ChromeStorageAreaLike;\n readonly session?: ChromeStorageAreaLike;\n };\n readonly tabs?: {\n get?(\n tabId: number,\n callback?: (tab: TabLike | undefined) => void,\n ): undefined | Promise<TabLike | undefined>;\n readonly onRemoved?: ChromeEventLike<TabRemovedListener>;\n };\n}\n\nexport interface ChromeEventLike<TListener> {\n addListener(listener: TListener, ...args: unknown[]): void;\n removeListener?(listener: TListener): void;\n}\n\nexport interface WebRequestBeforeDetails {\n readonly tabId: number;\n readonly requestId?: string;\n readonly url: string;\n readonly type?: string;\n readonly frameId?: number;\n readonly initiator?: string;\n readonly originUrl?: string;\n}\n\nexport interface WebNavigationCommittedDetails {\n readonly tabId: number;\n readonly url: string;\n readonly frameId?: number;\n}\n\nexport interface RuntimeMessageSenderLike {\n readonly tab?: TabLike;\n}\n\nexport interface TabLike {\n readonly id?: number;\n readonly url?: string;\n readonly pendingUrl?: string;\n}\n\ntype WebRequestBeforeListener = (details: WebRequestBeforeDetails) => void;\ntype WebNavigationCommittedListener = (\n details: WebNavigationCommittedDetails,\n) => void;\ntype TabRemovedListener = (tabId: number) => void;\ntype RuntimeMessageListener = (\n message: unknown,\n sender: RuntimeMessageSenderLike,\n sendResponse: (response: StanddownMessageResponse | undefined) => void,\n) => boolean | undefined;\n\nexport function createStanddown(\n opts: CreateStanddownOptions,\n): StanddownWebextController {\n const chromeApi = opts.chrome ?? currentChrome();\n const now = opts.now ?? Date.now;\n const fetchImpl = opts.fetch ?? currentFetch();\n let activePolicies = opts.policies.map((policy) => clonePolicy(policy));\n let refreshTimer: ReturnType<typeof setInterval> | undefined;\n\n const store =\n opts.store ??\n createChromeStore(chromeApi, {\n sessionId: opts.sessionId,\n now,\n });\n const session = new StanddownSession(\n store,\n opts.auditLog === undefined ? undefined : { auditLog: opts.auditLog },\n );\n const redirectChains = new Map<number, string[]>();\n const redirectRequestIds = new Map<number, string>();\n const initiators = new Map<number, string>();\n const tabHosts = new Map<number, string>();\n const hasWebRequest =\n typeof chromeApi?.webRequest?.onBeforeRequest?.addListener === 'function';\n const hasWebNavigation =\n typeof chromeApi?.webNavigation?.onCommitted?.addListener === 'function';\n\n if (!hasWebNavigation) {\n throw new TypeError(\n 'standdown/webext requires chrome.webNavigation.onCommitted',\n );\n }\n\n const mode: StanddownWebextMode = hasWebRequest ? 'webRequest' : 'webNavigation';\n\n const onBeforeRequest: WebRequestBeforeListener = (details) => {\n if (!isTopLevelTabRequest(details.tabId, details.type, details.frameId)) {\n return;\n }\n\n const existingRequestId = redirectRequestIds.get(details.tabId);\n const startsNewRequest =\n details.requestId !== undefined &&\n existingRequestId !== undefined &&\n details.requestId !== existingRequestId;\n const chain = startsNewRequest\n ? []\n : redirectChains.get(details.tabId) ?? [];\n\n if (details.requestId !== undefined) {\n redirectRequestIds.set(details.tabId, details.requestId);\n }\n\n chain.push(details.url);\n redirectChains.set(details.tabId, chain.slice(-20));\n\n const initiator = details.initiator ?? details.originUrl;\n\n if (initiator !== undefined && !initiators.has(details.tabId)) {\n initiators.set(details.tabId, initiator);\n }\n };\n\n const onCommitted: WebNavigationCommittedListener = (details) => {\n if (details.tabId < 0 || (details.frameId ?? 0) !== 0) {\n return;\n }\n\n void ingestNavigation(details.tabId, details.url);\n };\n\n const onRemoved: TabRemovedListener = (tabId) => {\n redirectChains.delete(tabId);\n redirectRequestIds.delete(tabId);\n initiators.delete(tabId);\n tabHosts.delete(tabId);\n };\n\n const onMessage: RuntimeMessageListener = (message, sender, sendResponse) => {\n if (!isShouldStandDownMessage(message)) {\n return undefined;\n }\n\n void handleMessage(message, sender).then(sendResponse, () => {\n sendResponse({\n ok: false,\n decision: failClosedDecision('message-handler-error'),\n });\n });\n\n return true;\n };\n\n if (mode === 'webRequest') {\n chromeApi?.webRequest?.onBeforeRequest?.addListener(\n onBeforeRequest,\n { urls: ['<all_urls>'], types: ['main_frame'] },\n );\n }\n\n if (hasWebNavigation) {\n chromeApi?.webNavigation?.onCommitted?.addListener(onCommitted);\n }\n\n chromeApi?.runtime?.onMessage?.addListener(onMessage);\n chromeApi?.tabs?.onRemoved?.addListener(onRemoved);\n\n if (opts.refresh !== undefined) {\n if (opts.refresh.intervalMs !== 0) {\n refreshTimer = setInterval(\n () => {\n void refreshNow();\n },\n opts.refresh.intervalMs ?? DEFAULT_REFRESH_INTERVAL_MS,\n );\n }\n }\n\n async function ingestNavigation(\n tabId: number,\n url: string,\n ): Promise<Decision> {\n const host = hostFromUrl(url);\n\n if (host !== undefined) {\n tabHosts.set(tabId, host);\n }\n\n const redirectChain = mode === 'webRequest' ? redirectChains.get(tabId) : undefined;\n const initiator = initiators.get(tabId);\n\n redirectChains.delete(tabId);\n redirectRequestIds.delete(tabId);\n initiators.delete(tabId);\n\n const signals = navigationSignals({\n url,\n now: now(),\n redirectChain,\n initiator,\n selfPatterns: opts.selfPatterns,\n publisherSites: opts.publisherSites,\n });\n\n return session.ingest(signals, activePolicies);\n }\n\n async function shouldStandDown(\n tabId: number,\n at = now(),\n ): Promise<Decision> {\n const host = tabHosts.get(tabId) ?? (await hostForTab(chromeApi, tabId));\n\n if (host === undefined) {\n return failClosedDecision('missing-tab-url');\n }\n\n return session.shouldStandDown(host, at);\n }\n\n async function shouldStandDownForUrl(\n url: string,\n at = now(),\n ): Promise<Decision> {\n const host = hostFromUrl(url);\n\n if (host === undefined) {\n return failClosedDecision('invalid-tab-url');\n }\n\n return session.shouldStandDown(host, at);\n }\n\n async function handleMessage(\n message: unknown,\n sender?: RuntimeMessageSenderLike,\n ): Promise<StanddownMessageResponse | undefined> {\n if (!isShouldStandDownMessage(message)) {\n return undefined;\n }\n\n const senderUrl = sender?.tab?.url ?? sender?.tab?.pendingUrl;\n const decision =\n message.url !== undefined\n ? await shouldStandDownForUrl(message.url)\n : senderUrl !== undefined\n ? await shouldStandDownForUrl(senderUrl)\n : await shouldStandDown(message.tabId ?? sender?.tab?.id ?? -1);\n\n return { ok: true, decision };\n }\n\n async function refreshNow(): Promise<StanddownRefreshResult> {\n if (opts.refresh === undefined) {\n return { ok: false, violation: 'refresh-not-configured' };\n }\n\n if (fetchImpl === undefined) {\n const result = { ok: false, violation: 'refresh-fetch-unavailable' } as const;\n await auditRefresh(store, now(), result);\n return result;\n }\n\n try {\n const response = await fetchImpl(opts.refresh.url);\n\n if (!response.ok) {\n const result = {\n ok: false,\n violation: `refresh-fetch-failed:${response.status}`,\n } as const;\n await auditRefresh(store, now(), result);\n return result;\n }\n\n const bundle = (await response.json()) as SignedPolicyBundle;\n const verified = await verifyPolicyBundle(\n activePolicies,\n bundle,\n opts.refresh.publicKeyJwk,\n );\n\n if (!verified.ok) {\n const result = { ok: false, violation: verified.violation } as const;\n await auditRefresh(store, now(), result);\n return result;\n }\n\n activePolicies = verified.policies.map((policy) => clonePolicy(policy));\n const result = { ok: true, applied: activePolicies.length } as const;\n await auditRefresh(store, now(), result);\n return result;\n } catch (error) {\n const result = {\n ok: false,\n violation: `refresh-error:${messageFromError(error)}`,\n } as const;\n await auditRefresh(store, now(), result);\n return result;\n }\n }\n\n function getPolicies(): readonly StanddownPolicy[] {\n return activePolicies.map((policy) => clonePolicy(policy));\n }\n\n function dispose(): void {\n if (refreshTimer !== undefined) {\n clearInterval(refreshTimer);\n }\n\n chromeApi?.webRequest?.onBeforeRequest?.removeListener?.(onBeforeRequest);\n chromeApi?.webNavigation?.onCommitted?.removeListener?.(onCommitted);\n chromeApi?.runtime?.onMessage?.removeListener?.(onMessage);\n chromeApi?.tabs?.onRemoved?.removeListener?.(onRemoved);\n redirectChains.clear();\n redirectRequestIds.clear();\n initiators.clear();\n tabHosts.clear();\n }\n\n return {\n mode,\n session,\n store,\n ingestNavigation,\n shouldStandDown,\n shouldStandDownForUrl,\n refreshNow,\n getPolicies,\n handleMessage,\n dispose,\n };\n}\n\nfunction createChromeStore(\n chromeApi: ChromeLike | undefined,\n opts: { sessionId: string | undefined; now: () => number },\n): StateStore {\n if (chromeApi?.storage?.local === undefined) {\n return new UnavailableStateStore();\n }\n\n const storeOptions: {\n runtime?: ChromeRuntimeLike;\n sessionStorage?: ChromeStorageAreaLike;\n sessionId?: string;\n now: () => number;\n } = { now: opts.now };\n\n if (chromeApi.runtime !== undefined) {\n storeOptions.runtime = chromeApi.runtime;\n }\n\n if (chromeApi.storage.session !== undefined) {\n storeOptions.sessionStorage = chromeApi.storage.session;\n }\n\n if (opts.sessionId !== undefined) {\n storeOptions.sessionId = opts.sessionId;\n }\n\n return new ChromeLocalStateStore(chromeApi.storage.local, storeOptions);\n}\n\nfunction navigationSignals(value: {\n url: string;\n now: number;\n redirectChain: readonly string[] | undefined;\n initiator: string | undefined;\n selfPatterns: readonly SelfExemption[] | undefined;\n publisherSites: readonly string[] | undefined;\n}): Signals {\n const signals: Signals = {\n url: value.url,\n now: value.now,\n };\n\n if (value.redirectChain !== undefined && value.redirectChain.length > 0) {\n signals.redirectChain = [...value.redirectChain];\n }\n\n if (value.initiator !== undefined) {\n signals.initiator = value.initiator;\n }\n\n if (value.selfPatterns !== undefined) {\n signals.selfPatterns = value.selfPatterns;\n }\n\n if (value.publisherSites !== undefined) {\n signals.publisherSites = value.publisherSites;\n }\n\n return signals;\n}\n\nasync function hostForTab(\n chromeApi: ChromeLike | undefined,\n tabId: number,\n): Promise<string | undefined> {\n if (tabId < 0 || chromeApi?.tabs?.get === undefined) {\n return undefined;\n }\n\n return new Promise((resolve) => {\n try {\n const result = chromeApi.tabs?.get?.(tabId, (tab) => {\n resolve(hostFromUrl(tab?.url ?? tab?.pendingUrl));\n });\n\n if (isPromiseLike(result)) {\n result.then(\n (tab) => resolve(hostFromUrl(tab?.url ?? tab?.pendingUrl)),\n () => resolve(undefined),\n );\n }\n } catch {\n resolve(undefined);\n }\n });\n}\n\nfunction isTopLevelTabRequest(\n tabId: number,\n type: string | undefined,\n frameId: number | undefined,\n): boolean {\n return tabId >= 0 && (type === undefined || type === 'main_frame') && (frameId ?? 0) === 0;\n}\n\nfunction isShouldStandDownMessage(\n message: unknown,\n): message is StanddownShouldStandDownMessage {\n return (\n typeof message === 'object' &&\n message !== null &&\n (message as { type?: unknown }).type === QUERY_MESSAGE_TYPE\n );\n}\n\nfunction hostFromUrl(value: string | undefined): string | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n try {\n return new URL(value).hostname.toLowerCase().replace(/\\.$/, '');\n } catch {\n return undefined;\n }\n}\n\nfunction failClosedDecision(reason: string): Decision {\n return {\n standDown: true,\n reason,\n behaviors: [...FAIL_CLOSED_BEHAVIORS],\n };\n}\n\nfunction currentChrome(): ChromeLike | undefined {\n return (globalThis as typeof globalThis & { chrome?: ChromeLike }).chrome;\n}\n\nfunction currentFetch(): FetchLike | undefined {\n const fetchValue = (globalThis as typeof globalThis & { fetch?: FetchLike })\n .fetch;\n\n return typeof fetchValue === 'function' ? fetchValue : undefined;\n}\n\nasync function auditRefresh(\n store: StateStore,\n time: number,\n result: StanddownRefreshResult,\n): Promise<void> {\n const state = (await store.load()) ?? emptyState();\n const entry: AuditEntry = {\n time,\n action: 'refresh',\n decision: {\n standDown: false,\n reason: result.ok\n ? `refresh-applied:${result.applied}`\n : `refresh-rejected:${result.violation}`,\n behaviors: [],\n },\n };\n\n state.auditLog.push(entry);\n\n if (state.auditLog.length > MAX_ADAPTER_AUDIT_ENTRIES) {\n state.auditLog.splice(0, state.auditLog.length - MAX_ADAPTER_AUDIT_ENTRIES);\n }\n\n await store.save(state);\n}\n\nfunction emptyState(): StanddownState {\n return {\n sessions: {},\n auditLog: [],\n };\n}\n\nfunction clonePolicy(policy: StanddownPolicy): StanddownPolicy {\n return JSON.parse(JSON.stringify(policy)) as StanddownPolicy;\n}\n\nfunction isPromiseLike<T>(value: unknown): value is Promise<T> {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as { then?: unknown }).then === 'function'\n );\n}\n\nfunction messageFromError(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nclass UnavailableStateStore implements StateStore {\n async load(): Promise<never> {\n throw new Error('chrome.storage.local unavailable');\n }\n\n async save(): Promise<never> {\n throw new Error('chrome.storage.local unavailable');\n }\n}\n"]}
@@ -0,0 +1,110 @@
1
+ import { S as StanddownSession } from './session-n0px3Agb.cjs';
2
+ import { C as ChromeRuntimeLike, a as ChromeStorageAreaLike } from './stores-CKCdKDdX.cjs';
3
+ export { b as ChromeLocalStateStore } from './stores-CKCdKDdX.cjs';
4
+ import { D as Decision, b as StanddownPolicy, S as SelfExemption, a as StateStore } from './types-A9OJ7SWj.cjs';
5
+
6
+ declare const QUERY_MESSAGE_TYPE = "standdown:shouldStandDown";
7
+ type StanddownWebextMode = 'webRequest' | 'webNavigation';
8
+ interface StanddownRefreshConfig {
9
+ readonly url: string;
10
+ readonly publicKeyJwk: JsonWebKey;
11
+ /** Set to 0 to disable the periodic timer while keeping refreshNow(). */
12
+ readonly intervalMs?: number;
13
+ }
14
+ interface CreateStanddownOptions {
15
+ readonly policies: readonly StanddownPolicy[];
16
+ readonly selfPatterns?: readonly SelfExemption[];
17
+ readonly publisherSites?: readonly string[];
18
+ readonly refresh?: StanddownRefreshConfig;
19
+ readonly fetch?: FetchLike;
20
+ readonly chrome?: ChromeLike;
21
+ readonly store?: StateStore;
22
+ readonly sessionId?: string;
23
+ readonly now?: () => number;
24
+ readonly auditLog?: boolean;
25
+ }
26
+ interface StanddownWebextController {
27
+ readonly mode: StanddownWebextMode;
28
+ readonly session: StanddownSession;
29
+ readonly store: StateStore;
30
+ ingestNavigation(tabId: number, url: string): Promise<Decision>;
31
+ shouldStandDown(tabId: number, now?: number): Promise<Decision>;
32
+ shouldStandDownForUrl(url: string, now?: number): Promise<Decision>;
33
+ refreshNow(): Promise<StanddownRefreshResult>;
34
+ getPolicies(): readonly StanddownPolicy[];
35
+ handleMessage(message: unknown, sender?: RuntimeMessageSenderLike): Promise<StanddownMessageResponse | undefined>;
36
+ dispose(): void;
37
+ }
38
+ interface StanddownShouldStandDownMessage {
39
+ readonly type: typeof QUERY_MESSAGE_TYPE;
40
+ readonly tabId?: number;
41
+ readonly url?: string;
42
+ }
43
+ interface StanddownMessageResponse {
44
+ readonly ok: boolean;
45
+ readonly decision: Decision;
46
+ }
47
+ type StanddownRefreshResult = {
48
+ ok: true;
49
+ applied: number;
50
+ } | {
51
+ ok: false;
52
+ violation: string;
53
+ };
54
+ type FetchLike = (url: string) => Promise<{
55
+ ok: boolean;
56
+ status: number;
57
+ json(): Promise<unknown>;
58
+ }>;
59
+ interface ChromeLike {
60
+ readonly webRequest?: {
61
+ readonly onBeforeRequest?: ChromeEventLike<WebRequestBeforeListener>;
62
+ };
63
+ readonly webNavigation?: {
64
+ readonly onCommitted?: ChromeEventLike<WebNavigationCommittedListener>;
65
+ };
66
+ readonly runtime?: ChromeRuntimeLike & {
67
+ readonly onMessage?: ChromeEventLike<RuntimeMessageListener>;
68
+ };
69
+ readonly storage?: {
70
+ readonly local?: ChromeStorageAreaLike;
71
+ readonly session?: ChromeStorageAreaLike;
72
+ };
73
+ readonly tabs?: {
74
+ get?(tabId: number, callback?: (tab: TabLike | undefined) => void): undefined | Promise<TabLike | undefined>;
75
+ readonly onRemoved?: ChromeEventLike<TabRemovedListener>;
76
+ };
77
+ }
78
+ interface ChromeEventLike<TListener> {
79
+ addListener(listener: TListener, ...args: unknown[]): void;
80
+ removeListener?(listener: TListener): void;
81
+ }
82
+ interface WebRequestBeforeDetails {
83
+ readonly tabId: number;
84
+ readonly requestId?: string;
85
+ readonly url: string;
86
+ readonly type?: string;
87
+ readonly frameId?: number;
88
+ readonly initiator?: string;
89
+ readonly originUrl?: string;
90
+ }
91
+ interface WebNavigationCommittedDetails {
92
+ readonly tabId: number;
93
+ readonly url: string;
94
+ readonly frameId?: number;
95
+ }
96
+ interface RuntimeMessageSenderLike {
97
+ readonly tab?: TabLike;
98
+ }
99
+ interface TabLike {
100
+ readonly id?: number;
101
+ readonly url?: string;
102
+ readonly pendingUrl?: string;
103
+ }
104
+ type WebRequestBeforeListener = (details: WebRequestBeforeDetails) => void;
105
+ type WebNavigationCommittedListener = (details: WebNavigationCommittedDetails) => void;
106
+ type TabRemovedListener = (tabId: number) => void;
107
+ type RuntimeMessageListener = (message: unknown, sender: RuntimeMessageSenderLike, sendResponse: (response: StanddownMessageResponse | undefined) => void) => boolean | undefined;
108
+ declare function createStanddown(opts: CreateStanddownOptions): StanddownWebextController;
109
+
110
+ export { type ChromeEventLike, type ChromeLike, ChromeRuntimeLike, ChromeStorageAreaLike, type CreateStanddownOptions, type FetchLike, type RuntimeMessageSenderLike, type StanddownMessageResponse, type StanddownRefreshConfig, type StanddownRefreshResult, type StanddownShouldStandDownMessage, type StanddownWebextController, type StanddownWebextMode, type TabLike, type WebNavigationCommittedDetails, type WebRequestBeforeDetails, createStanddown };
@@ -0,0 +1,110 @@
1
+ import { S as StanddownSession } from './session-C5gH-LaQ.js';
2
+ import { C as ChromeRuntimeLike, a as ChromeStorageAreaLike } from './stores-CELX9aHN.js';
3
+ export { b as ChromeLocalStateStore } from './stores-CELX9aHN.js';
4
+ import { D as Decision, b as StanddownPolicy, S as SelfExemption, a as StateStore } from './types-A9OJ7SWj.js';
5
+
6
+ declare const QUERY_MESSAGE_TYPE = "standdown:shouldStandDown";
7
+ type StanddownWebextMode = 'webRequest' | 'webNavigation';
8
+ interface StanddownRefreshConfig {
9
+ readonly url: string;
10
+ readonly publicKeyJwk: JsonWebKey;
11
+ /** Set to 0 to disable the periodic timer while keeping refreshNow(). */
12
+ readonly intervalMs?: number;
13
+ }
14
+ interface CreateStanddownOptions {
15
+ readonly policies: readonly StanddownPolicy[];
16
+ readonly selfPatterns?: readonly SelfExemption[];
17
+ readonly publisherSites?: readonly string[];
18
+ readonly refresh?: StanddownRefreshConfig;
19
+ readonly fetch?: FetchLike;
20
+ readonly chrome?: ChromeLike;
21
+ readonly store?: StateStore;
22
+ readonly sessionId?: string;
23
+ readonly now?: () => number;
24
+ readonly auditLog?: boolean;
25
+ }
26
+ interface StanddownWebextController {
27
+ readonly mode: StanddownWebextMode;
28
+ readonly session: StanddownSession;
29
+ readonly store: StateStore;
30
+ ingestNavigation(tabId: number, url: string): Promise<Decision>;
31
+ shouldStandDown(tabId: number, now?: number): Promise<Decision>;
32
+ shouldStandDownForUrl(url: string, now?: number): Promise<Decision>;
33
+ refreshNow(): Promise<StanddownRefreshResult>;
34
+ getPolicies(): readonly StanddownPolicy[];
35
+ handleMessage(message: unknown, sender?: RuntimeMessageSenderLike): Promise<StanddownMessageResponse | undefined>;
36
+ dispose(): void;
37
+ }
38
+ interface StanddownShouldStandDownMessage {
39
+ readonly type: typeof QUERY_MESSAGE_TYPE;
40
+ readonly tabId?: number;
41
+ readonly url?: string;
42
+ }
43
+ interface StanddownMessageResponse {
44
+ readonly ok: boolean;
45
+ readonly decision: Decision;
46
+ }
47
+ type StanddownRefreshResult = {
48
+ ok: true;
49
+ applied: number;
50
+ } | {
51
+ ok: false;
52
+ violation: string;
53
+ };
54
+ type FetchLike = (url: string) => Promise<{
55
+ ok: boolean;
56
+ status: number;
57
+ json(): Promise<unknown>;
58
+ }>;
59
+ interface ChromeLike {
60
+ readonly webRequest?: {
61
+ readonly onBeforeRequest?: ChromeEventLike<WebRequestBeforeListener>;
62
+ };
63
+ readonly webNavigation?: {
64
+ readonly onCommitted?: ChromeEventLike<WebNavigationCommittedListener>;
65
+ };
66
+ readonly runtime?: ChromeRuntimeLike & {
67
+ readonly onMessage?: ChromeEventLike<RuntimeMessageListener>;
68
+ };
69
+ readonly storage?: {
70
+ readonly local?: ChromeStorageAreaLike;
71
+ readonly session?: ChromeStorageAreaLike;
72
+ };
73
+ readonly tabs?: {
74
+ get?(tabId: number, callback?: (tab: TabLike | undefined) => void): undefined | Promise<TabLike | undefined>;
75
+ readonly onRemoved?: ChromeEventLike<TabRemovedListener>;
76
+ };
77
+ }
78
+ interface ChromeEventLike<TListener> {
79
+ addListener(listener: TListener, ...args: unknown[]): void;
80
+ removeListener?(listener: TListener): void;
81
+ }
82
+ interface WebRequestBeforeDetails {
83
+ readonly tabId: number;
84
+ readonly requestId?: string;
85
+ readonly url: string;
86
+ readonly type?: string;
87
+ readonly frameId?: number;
88
+ readonly initiator?: string;
89
+ readonly originUrl?: string;
90
+ }
91
+ interface WebNavigationCommittedDetails {
92
+ readonly tabId: number;
93
+ readonly url: string;
94
+ readonly frameId?: number;
95
+ }
96
+ interface RuntimeMessageSenderLike {
97
+ readonly tab?: TabLike;
98
+ }
99
+ interface TabLike {
100
+ readonly id?: number;
101
+ readonly url?: string;
102
+ readonly pendingUrl?: string;
103
+ }
104
+ type WebRequestBeforeListener = (details: WebRequestBeforeDetails) => void;
105
+ type WebNavigationCommittedListener = (details: WebNavigationCommittedDetails) => void;
106
+ type TabRemovedListener = (tabId: number) => void;
107
+ type RuntimeMessageListener = (message: unknown, sender: RuntimeMessageSenderLike, sendResponse: (response: StanddownMessageResponse | undefined) => void) => boolean | undefined;
108
+ declare function createStanddown(opts: CreateStanddownOptions): StanddownWebextController;
109
+
110
+ export { type ChromeEventLike, type ChromeLike, ChromeRuntimeLike, ChromeStorageAreaLike, type CreateStanddownOptions, type FetchLike, type RuntimeMessageSenderLike, type StanddownMessageResponse, type StanddownRefreshConfig, type StanddownRefreshResult, type StanddownShouldStandDownMessage, type StanddownWebextController, type StanddownWebextMode, type TabLike, type WebNavigationCommittedDetails, type WebRequestBeforeDetails, createStanddown };