@crvouga/mockingbird-service-fullscript 3.13.0 → 3.14.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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../core/src/mount.ts", "../../../core/src/timeline.ts", "../../../sqlite/src/default.ts", "../../../sqlite/src/migrate.ts", "../../../sqlite/src/schema.ts", "../../core/src/collection.ts", "../../core/src/ids.ts", "../../../http/codec/src/form.ts", "../../../http/codec/src/content.ts", "../../../openapi/core/src/refs.ts", "../../../openapi/core/src/types.ts", "../../../openapi/core/src/document.ts", "../../../openapi/core/src/schema.ts", "../../../openapi/metadata/src/types.ts", "../../../openapi/metadata/src/read.ts", "../../core/src/service.ts", "../../core/src/journal.ts", "../../core/src/path.ts", "../../core/src/validation.ts", "../../core/src/clock.ts", "../../core/src/controls.ts", "../../core/src/rng.ts", "../../core/src/faults.ts", "../../core/src/latency.ts", "../../core/src/namespace-controls.ts", "../../core/src/signing.ts", "../../core/src/surface.ts", "../../core/src/control.ts", "../../core/src/credentials.ts", "../../core/src/http.ts", "../../core/src/metrics.ts", "../../core/src/outbound.ts", "../../core/src/admin-client.ts", "../../core/src/admin-ui.ts", "../../core/src/snapshot.ts", "../../core/src/state-view.ts", "../../core/src/version.ts", "../../core/src/webhooks.ts", "../../core/src/runtime.ts", "../src/generated/openapi.ts", "../src/pdf.ts", "../src/state.ts", "../src/runtime.ts", "../src/index.ts"],
4
- "sourcesContent": ["import type { FetchAPI, FetchHandler } from \"./index.js\"\n\nconst prefixes = new WeakMap<Request, string>()\n\n/** Trusted mount metadata stays on the Request, never in a spoofable HTTP header. */\nexport const requestBaseUrl = (request: Request): string =>\n new URL(request.url).origin + (prefixes.get(request) ?? \"\")\n\nexport const forwardMountContext = (source: Request, target: Request): Request => {\n const prefix = prefixes.get(source)\n if (prefix !== undefined) prefixes.set(target, prefix)\n return target\n}\n\nexport type MountedAPI = FetchAPI & {\n readonly prefix: string\n GET: FetchHandler\n POST: FetchHandler\n PUT: FetchHandler\n PATCH: FetchHandler\n DELETE: FetchHandler\n HEAD: FetchHandler\n OPTIONS: FetchHandler\n}\n\n/** Embed a native API under an application's origin without owning another listener or state. */\nexport function mount(\n api: FetchAPI,\n path: string,\n relativePath?: (request: Request) => string,\n): MountedAPI {\n const prefix = path.replace(/\\/+$/, \"\")\n if (!/^\\/(?:[A-Za-z0-9_-]+\\/)*[A-Za-z0-9_-]+$/.test(prefix))\n throw new Error(\"mount prefix must be an absolute path of plain segments\")\n const fetch: FetchHandler = async (incoming) => {\n const url = new URL(incoming.url)\n if (url.pathname !== prefix && !url.pathname.startsWith(`${prefix}/`))\n return Response.json({ error: \"not_found\" }, { status: 404 })\n url.pathname = url.pathname.slice(prefix.length) || \"/\"\n const request = new Request(url, incoming)\n const publicPrefix = (prefixes.get(incoming) ?? \"\") + prefix\n prefixes.set(request, publicPrefix)\n const suffix = relativePath?.(request) ?? \"\"\n const response = await api.fetch(request)\n const local = (value: string) =>\n value.startsWith(\"/\") &&\n !value.startsWith(\"//\") &&\n value !== publicPrefix &&\n !value.startsWith(`${publicPrefix}/`)\n ? `${publicPrefix}${suffix && value !== suffix && !value.startsWith(`${suffix}/`) ? suffix : \"\"}${value}`\n : value\n const headers = new Headers(response.headers)\n const location = headers.get(\"location\")\n if (location) headers.set(\"location\", local(location))\n const links = headers.get(\"link\")\n if (links)\n headers.set(\n \"link\",\n links.replace(/<([^>]+)>/g, (_, value: string) => {\n const target = new URL(value, url)\n if (target.origin === url.origin) target.pathname = local(target.pathname)\n return `<${target.href}>`\n }),\n )\n const cookies = headers.getSetCookie()\n if (cookies.length) {\n headers.delete(\"set-cookie\")\n for (const cookie of cookies)\n headers.append(\n \"set-cookie\",\n cookie.replace(\n /(;\\s*Path=)(\\/[^;]*)/gi,\n (_, lead: string, value: string) => lead + local(value),\n ),\n )\n }\n if (\n incoming.method !== \"HEAD\" &&\n response.body &&\n // Media types are case-insensitive (RFC 9110 \u00A78.3.1), and whitespace may precede \";\".\n headers.get(\"content-type\")?.split(\";\")[0]?.trim().toLowerCase() === \"text/html\"\n ) {\n const html = rewriteHtml(await response.text(), local)\n headers.delete(\"content-length\")\n headers.delete(\"content-encoding\")\n headers.delete(\"etag\")\n return new Response(html, {\n status: response.status,\n statusText: response.statusText,\n headers,\n })\n }\n return new Response(incoming.method === \"HEAD\" ? null : response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n })\n }\n return {\n prefix,\n fetch,\n GET: fetch,\n POST: fetch,\n PUT: fetch,\n PATCH: fetch,\n DELETE: fetch,\n HEAD: fetch,\n OPTIONS: fetch,\n }\n}\n\n/** Rewrite root-relative URLs in the markup a mounted API serves so they stay under the mount. */\nconst rewriteHtml = (html: string, local: (value: string) => string): string =>\n html\n .replace(\n /(\\b(?:href|action|formaction|src)\\s*=\\s*[\"'])(\\/[^\"']*)([\"'])/gi,\n (_, lead: string, value: string, quote: string) => lead + local(value) + quote,\n )\n // srcset is a comma-separated list of \"url [descriptor]\" candidates.\n .replace(\n /(\\bsrcset\\s*=\\s*)([\"'])([^\"']*)\\2/gi,\n (_, lead: string, quote: string, list: string) =>\n lead +\n quote +\n list.replace(\n /(^|,)(\\s*)(\\/[^\\s,]*)/g,\n (_, comma: string, space: string, value: string) => comma + space + local(value),\n ) +\n quote,\n )\n // <meta http-equiv=\"refresh\" content=\"5; url=/path\"> navigates like a link.\n .replace(/<meta\\b[^>]*>/gi, (tag) =>\n /\\bhttp-equiv\\s*=\\s*[\"']?refresh\\b/i.test(tag)\n ? tag.replace(\n /(\\bcontent\\s*=\\s*)([\"'])(.*?)\\2/i,\n (_, lead: string, quote: string, content: string) =>\n lead +\n quote +\n content.replace(\n /^(\\s*\\d*(?:\\.\\d*)?\\s*[;,]\\s*(?:url\\s*=\\s*)?[\"']?)(\\/[^\"'\\s]*)/i,\n (_, start: string, value: string) => start + local(value),\n ) +\n quote,\n )\n : tag,\n )\n .replace(\n /(url\\(\\s*[\"']?)(\\/[^\\s)'\";]*)([\"']?\\s*\\))/gi,\n (_, lead: string, value: string, end: string) => lead + local(value) + end,\n )\n", "/** A stable identifier for a point in a {@link Timeline}. */\nexport type CheckpointId = string\n\n/** An immutable node in a timeline's checkpoint DAG. */\nexport type Checkpoint<T> = Readonly<{\n id: CheckpointId\n branch: string\n parent: CheckpointId | null\n /** Logical time supplied by the timeline's injected clock. */\n at: number\n value: T\n}>\n\nexport type TimelineOptions = {\n /** Logical clock used to stamp checkpoints. Defaults to a deterministic counter. */\n now?: () => number\n /** Maximum retained checkpoints. Branch heads are never collected. Default 1,000. */\n maxCheckpoints?: number\n /** Customize deterministic checkpoint IDs. */\n id?: (sequence: number) => CheckpointId\n}\n\nexport type CommitOptions = {\n branch?: string\n /** Parent checkpoint. Defaults to the selected branch's current head. */\n parent?: CheckpointId | null\n}\n\nexport type ForkOptions = {\n /** Checkpoint to fork from. Defaults to the main branch's head. */\n from?: CheckpointId\n}\n\nconst BRANCH_PATTERN = /^[A-Za-z0-9_.-]{1,64}$/\n\n/**\n * Small, storage-agnostic checkpoint DAG shared by service runtimes. Its values may be immutable\n * records, namespace images, or copy-on-write SQL engine snapshots.\n *\n * Values are retained by reference. Engines can therefore use persistent/COW snapshots while\n * simpler services can use immutable values. IDs and GC order are deterministic, and all IO\n * (the logical clock) is injected.\n */\nexport class Timeline<T> {\n readonly maxCheckpoints: number\n private readonly now: () => number\n private readonly makeId: (sequence: number) => CheckpointId\n private readonly nodes = new Map<CheckpointId, Checkpoint<T>>()\n private readonly heads = new Map<string, CheckpointId>()\n /** Unreferenced nodes in the exact order they became collectible. */\n private readonly evictable = new Set<CheckpointId>()\n /** Branch heads plus explicit retainers. Absent means zero. */\n private readonly references = new Map<CheckpointId, number>()\n private readonly explicitPins = new Map<CheckpointId, number>()\n private sequence = 0\n\n constructor(options: TimelineOptions = {}) {\n const max = options.maxCheckpoints ?? 1_000\n if (!Number.isSafeInteger(max) || max < 1)\n throw new RangeError(\"maxCheckpoints must be a positive integer\")\n this.maxCheckpoints = max\n this.now = options.now ?? (() => this.sequence)\n this.makeId = options.id ?? ((sequence) => `cp_${sequence.toString(36).padStart(8, \"0\")}`)\n }\n\n /** Capture a new immutable value and move `branch` to it. */\n commit(value: T, options: CommitOptions = {}): Checkpoint<T> {\n const branch = options.branch ?? \"main\"\n this.assertBranch(branch)\n const parent = options.parent === undefined ? (this.heads.get(branch) ?? null) : options.parent\n if (parent !== null && !this.nodes.has(parent)) throw new RangeError(`no checkpoint ${parent}`)\n const id = this.makeId(++this.sequence)\n if (this.nodes.has(id)) throw new RangeError(`duplicate checkpoint id ${id}`)\n const checkpoint = Object.freeze({ id, branch, parent, at: this.now(), value })\n this.nodes.set(id, checkpoint)\n this.moveHead(branch, id)\n this.collect(this.maxCheckpoints)\n return checkpoint\n }\n\n /** Create a branch pointer without copying its checkpoint value. */\n fork(branch: string, options: ForkOptions = {}): Checkpoint<T> | undefined {\n this.assertBranch(branch)\n if (this.heads.has(branch)) throw new RangeError(`branch already exists: ${branch}`)\n const from = options.from ?? this.heads.get(\"main\")\n if (from === undefined) return undefined\n const checkpoint = this.get(from)\n this.moveHead(branch, checkpoint.id)\n return checkpoint\n }\n\n /** Move a branch pointer to an existing checkpoint. */\n checkout(branch: string, id: CheckpointId): Checkpoint<T> {\n this.assertBranch(branch)\n const checkpoint = this.get(id)\n this.moveHead(branch, checkpoint.id)\n return checkpoint\n }\n\n get(id: CheckpointId): Checkpoint<T> {\n const checkpoint = this.nodes.get(id)\n if (!checkpoint) throw new RangeError(`no checkpoint ${id}`)\n return checkpoint\n }\n\n head(branch = \"main\"): Checkpoint<T> | undefined {\n const id = this.heads.get(branch)\n return id === undefined ? undefined : this.get(id)\n }\n\n hasBranch(branch: string): boolean {\n return this.heads.has(branch)\n }\n\n branches(): Readonly<Record<string, CheckpointId>> {\n return Object.freeze(\n Object.fromEntries([...this.heads].sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))),\n )\n }\n\n checkpoints(): readonly Checkpoint<T>[] {\n return [...this.nodes.values()]\n }\n\n /** Number of retained checkpoints without allocating an array. */\n get size(): number {\n return this.nodes.size\n }\n\n /** Pin a checkpoint independently of branch heads (used by compatibility snapshot handles). */\n retain(id: CheckpointId): Checkpoint<T> {\n const checkpoint = this.get(id)\n this.explicitPins.set(id, (this.explicitPins.get(id) ?? 0) + 1)\n this.addReference(id)\n return checkpoint\n }\n\n /** Release one explicit pin. Branch heads remain pinned until moved or deleted. */\n release(id: CheckpointId): boolean {\n if (!this.nodes.has(id)) return false\n const pins = this.explicitPins.get(id) ?? 0\n if (pins === 0) return false\n if (pins === 1) this.explicitPins.delete(id)\n else this.explicitPins.set(id, pins - 1)\n this.removeReference(id)\n this.collect(this.maxCheckpoints)\n return true\n }\n\n deleteBranch(branch: string): boolean {\n if (branch === \"main\") throw new RangeError(\"cannot delete main branch\")\n const previous = this.heads.get(branch)\n const deleted = this.heads.delete(branch)\n if (previous !== undefined) this.removeReference(previous)\n this.collect(this.maxCheckpoints)\n return deleted\n }\n\n /**\n * Deterministically discard oldest unpinned checkpoints. Collection is O(number removed):\n * commits never scan pinned nodes or the retained history. Parents are metadata rather than a\n * storage dependency, so a retained node remains usable after pruning.\n */\n gc(max = this.maxCheckpoints): CheckpointId[] {\n if (!Number.isSafeInteger(max) || max < 1)\n throw new RangeError(\"max must be a positive integer\")\n const removed: CheckpointId[] = []\n this.collect(max, removed)\n return removed\n }\n\n private collect(max: number, removed?: CheckpointId[]): void {\n while (this.nodes.size > max && this.evictable.size > 0) {\n const id = this.evictable.values().next().value as CheckpointId\n this.evictable.delete(id)\n this.nodes.delete(id)\n removed?.push(id)\n }\n }\n\n private moveHead(branch: string, id: CheckpointId): void {\n const previous = this.heads.get(branch)\n if (previous === id) return\n if (previous !== undefined) this.removeReference(previous)\n this.heads.set(branch, id)\n this.addReference(id)\n }\n\n private addReference(id: CheckpointId): void {\n this.references.set(id, (this.references.get(id) ?? 0) + 1)\n this.evictable.delete(id)\n }\n\n private removeReference(id: CheckpointId): void {\n const next = (this.references.get(id) ?? 0) - 1\n if (next > 0) this.references.set(id, next)\n else {\n this.references.delete(id)\n if (this.nodes.has(id)) this.evictable.add(id)\n }\n }\n\n private assertBranch(branch: string): void {\n if (!BRANCH_PATTERN.test(branch)) throw new RangeError(`branch must match ${BRANCH_PATTERN}`)\n }\n}\n", "import { Database } from \"@crvouga/mockingbird-service-sqlite\"\nimport type { SqliteClient } from \"./client.js\"\n\n/** Construct the default in-memory SQLite client (`@crvouga/mockingbird-service-sqlite`). */\nexport const createDefaultSqlite = (): SqliteClient => new Database()\n\n/** Use the injected client, or fall back to {@link createDefaultSqlite}. */\nexport const resolveSqlite = (sqlite?: SqliteClient): SqliteClient =>\n sqlite ?? createDefaultSqlite()\n", "import type { SqliteClient } from \"./client.js\"\n\n/** One named, ordered schema change applied exactly once per client. */\nexport type Migration = {\n /** Stable id stored in `schema_migrations`. Must be unique across the list. */\n id: string\n sql: string\n}\n\nconst ensureMigrationsTable = (sqlite: SqliteClient) => {\n sqlite.exec(`\n CREATE TABLE IF NOT EXISTS schema_migrations (\n id TEXT PRIMARY KEY NOT NULL,\n applied_at INTEGER NOT NULL\n )\n `)\n}\n\nconst assertUniqueIds = (migrations: readonly Migration[]) => {\n const seen = new Set<string>()\n for (const { id } of migrations) {\n if (seen.has(id)) throw new Error(`migrate: duplicate migration id \"${id}\"; ids must be unique`)\n seen.add(id)\n }\n}\n\n/**\n * Apply pending migrations in order inside a single transaction.\n *\n * Idempotent: already-applied ids are skipped. Re-running with the same list\n * is a no-op after the first successful boot.\n *\n * @throws {Error} If two migrations in the list share an id; nothing is applied.\n */\nexport const migrate = (sqlite: SqliteClient, migrations: readonly Migration[]): void => {\n assertUniqueIds(migrations)\n ensureMigrationsTable(sqlite)\n const applied = new Set(\n sqlite\n .prepare(\"SELECT id FROM schema_migrations\")\n .all<{ id: string }>()\n .map((row) => row.id),\n )\n const pending = migrations.filter((migration) => !applied.has(migration.id))\n if (pending.length === 0) return\n\n const insert = sqlite.prepare(\"INSERT INTO schema_migrations (id, applied_at) VALUES (?, ?)\")\n const now = Math.floor(Date.now() / 1000)\n sqlite.transaction(() => {\n for (const migration of pending) {\n sqlite.exec(migration.sql)\n insert.run(migration.id, now)\n }\n })\n}\n\n/**\n * Applied migration ids in application order: by `applied_at`, then `rowid`.\n * `schema_migrations` is a rowid table, so `rowid` follows insertion order and\n * breaks same-second ties in the order the migrations ran.\n */\nexport const listAppliedMigrations = (sqlite: SqliteClient): string[] => {\n ensureMigrationsTable(sqlite)\n return sqlite\n .prepare(\"SELECT id FROM schema_migrations ORDER BY applied_at ASC, rowid ASC\")\n .all<{ id: string }>()\n .map((row) => row.id)\n}\n", "import type { SqliteClient } from \"./client.js\"\nimport { type Migration, migrate } from \"./migrate.js\"\n\n/**\n * Core Mockingbird service schema: namespaced JSON records and counters.\n *\n * Applied on every service boot via {@link migrateCore}.\n */\nexport const CORE_MIGRATIONS: readonly Migration[] = [\n {\n id: \"20260322_core_records_sequences\",\n sql: `\n CREATE TABLE IF NOT EXISTS mockingbird_records (\n namespace TEXT NOT NULL,\n collection TEXT NOT NULL,\n id TEXT NOT NULL,\n seq INTEGER NOT NULL,\n value TEXT NOT NULL,\n PRIMARY KEY (namespace, collection, id)\n );\n CREATE INDEX IF NOT EXISTS mockingbird_records_seq\n ON mockingbird_records (namespace, collection, seq);\n CREATE TABLE IF NOT EXISTS mockingbird_sequences (\n namespace TEXT NOT NULL,\n name TEXT NOT NULL,\n kind TEXT NOT NULL,\n value INTEGER NOT NULL,\n PRIMARY KEY (namespace, name, kind)\n );\n `,\n },\n]\n\n/**\n * Table and index names from the unfinished product rename.\n * Renamed in place so a database created under those names keeps its rows.\n */\nconst LEGACY_TABLES = [\n [\"emulates_records\", \"mockingbird_records\"],\n [\"emulators_records\", \"mockingbird_records\"],\n [\"emulates_sequences\", \"mockingbird_sequences\"],\n [\"emulators_sequences\", \"mockingbird_sequences\"],\n] as const\nconst LEGACY_INDEXES = [\n [\"emulates_records_seq\", \"mockingbird_records_seq\"],\n [\"emulators_records_seq\", \"mockingbird_records_seq\"],\n] as const\n\nconst namesOf = (sqlite: SqliteClient, type: \"table\" | \"index\"): Set<string> =>\n new Set(\n sqlite\n .prepare(\"SELECT name FROM sqlite_master WHERE type = ?\")\n .all<{ name: string }>(type)\n .map((row) => row.name),\n )\n\n/** Apply {@link CORE_MIGRATIONS}, then rename a database that still uses the former table names. */\nexport const migrateCore = (sqlite: SqliteClient): void => {\n migrate(sqlite, CORE_MIGRATIONS)\n const tables = namesOf(sqlite, \"table\")\n const indexes = namesOf(sqlite, \"index\")\n sqlite.transaction(() => {\n for (const [from, to] of LEGACY_TABLES) {\n if (!tables.has(from) || tables.has(to)) continue\n sqlite.exec(`ALTER TABLE ${from} RENAME TO ${to}`)\n tables.delete(from)\n tables.add(to)\n }\n for (const [from, to] of LEGACY_INDEXES) {\n if (!indexes.has(from) || indexes.has(to)) continue\n // The sqlite port accepts ALTER TABLE, not ALTER INDEX.\n sqlite.exec(`DROP INDEX ${from}`)\n sqlite.exec(`CREATE INDEX ${to} ON mockingbird_records (namespace, collection, seq)`)\n indexes.delete(from)\n indexes.add(to)\n }\n })\n}\n\n/** Delete every record and sequence belonging to `namespace`. */\nexport const clearNamespace = (sqlite: SqliteClient, namespace: string): void => {\n sqlite.transaction(() => {\n sqlite.prepare(\"DELETE FROM mockingbird_records WHERE namespace = ?\").run(namespace)\n sqlite.prepare(\"DELETE FROM mockingbird_sequences WHERE namespace = ?\").run(namespace)\n })\n}\n", "import type { SqliteClient, SqliteStatement } from \"@crvouga/mockingbird-sqlite\"\n\n/** Every stored record carries a monotonically increasing sequence for stable ordering. */\nexport type Stored<T> = { seq: number; value: T }\n\nexport type ListRecordsOptions<T> = {\n /** Keep only records passing the predicate. */\n where?: (value: T, seq: number) => boolean\n /** Sort order; default newest first. */\n order?: \"newest\" | \"oldest\"\n}\n\ntype RecordRow = { id: string; seq: number; value: string }\n\n/**\n * A SQLite-backed table of JSON records addressed by id. Ordering is by insertion\n * sequence, never by id lexicographic order, so list semantics stay stable.\n */\nexport class Collection<T> {\n private readonly statements = new Map<string, SqliteStatement>()\n\n private prepare(sql: string): SqliteStatement {\n let statement = this.statements.get(sql)\n if (!statement) {\n statement = this.sqlite.prepare(sql)\n this.statements.set(sql, statement)\n }\n return statement\n }\n\n constructor(\n private readonly sqlite: SqliteClient,\n /** Storage namespace. Admin introspection uses this to ignore another namespace's tables. */\n readonly namespace: string,\n /** Table name inside the namespace. Stable across resets of the rows themselves. */\n readonly collectionName: string,\n ) {}\n\n private bumpCollectionSeq(): number {\n const row = this.prepare(\n \"SELECT value FROM mockingbird_sequences WHERE namespace = ? AND name = ? AND kind = 'collection'\",\n ).get<{ value: number }>(this.namespace, this.collectionName)\n const next = (row?.value ?? 0) + 1\n this.prepare(\n `INSERT INTO mockingbird_sequences (namespace, name, kind, value) VALUES (?, ?, 'collection', ?)\n ON CONFLICT(namespace, name, kind) DO UPDATE SET value = excluded.value`,\n ).run(this.namespace, this.collectionName, next)\n return next\n }\n\n nextSequence(): number {\n return this.sqlite.transaction(() => this.bumpCollectionSeq())\n }\n\n get(id: string): T | undefined {\n const row = this.prepare(\n \"SELECT value FROM mockingbird_records WHERE namespace = ? AND collection = ? AND id = ?\",\n ).get<{ value: string }>(this.namespace, this.collectionName, id)\n if (!row) return undefined\n return (JSON.parse(row.value) as Stored<T>).value\n }\n\n has(id: string): boolean {\n const row = this.prepare(\n \"SELECT 1 AS ok FROM mockingbird_records WHERE namespace = ? AND collection = ? AND id = ?\",\n ).get<{ ok: number }>(this.namespace, this.collectionName, id)\n return row !== undefined\n }\n\n /** Insert a new record, assigning it the next sequence number. */\n insert(id: string, value: T): Stored<T> {\n return this.sqlite.transaction(() => {\n const seq = this.bumpCollectionSeq()\n const stored = { seq, value }\n this.prepare(\n `INSERT INTO mockingbird_records (namespace, collection, id, seq, value)\n VALUES (?, ?, ?, ?, ?)\n ON CONFLICT(namespace, collection, id) DO UPDATE SET seq = excluded.seq, value = excluded.value`,\n ).run(this.namespace, this.collectionName, id, seq, JSON.stringify(stored))\n return stored\n })\n }\n\n /** Replace an existing record's value, keeping its position. */\n update(id: string, value: T): Stored<T> | undefined {\n return this.sqlite.transaction(() => {\n const row = this.prepare(\n \"SELECT seq, value FROM mockingbird_records WHERE namespace = ? AND collection = ? AND id = ?\",\n ).get<{ seq: number; value: string }>(this.namespace, this.collectionName, id)\n if (!row) return undefined\n const stored = { seq: row.seq, value }\n this.prepare(\n \"UPDATE mockingbird_records SET value = ? WHERE namespace = ? AND collection = ? AND id = ?\",\n ).run(JSON.stringify(stored), this.namespace, this.collectionName, id)\n return stored\n })\n }\n\n delete(id: string): boolean {\n const result = this.prepare(\n \"DELETE FROM mockingbird_records WHERE namespace = ? AND collection = ? AND id = ?\",\n ).run(this.namespace, this.collectionName, id)\n return result.changes > 0\n }\n\n /** How many records the collection holds, without reading them. */\n count(): number {\n const row = this.prepare(\n \"SELECT COUNT(*) AS n FROM mockingbird_records WHERE namespace = ? AND collection = ?\",\n ).get<{ n: number }>(this.namespace, this.collectionName)\n return Number(row?.n ?? 0)\n }\n\n list(options: ListRecordsOptions<T> = {}): Array<Stored<T> & { id: string }> {\n const rows = this.prepare(\n \"SELECT id, seq, value FROM mockingbird_records WHERE namespace = ? AND collection = ?\",\n ).all<RecordRow>(this.namespace, this.collectionName)\n const out: Array<Stored<T> & { id: string }> = []\n for (const row of rows) {\n const stored = JSON.parse(row.value) as Stored<T>\n if (options.where && !options.where(stored.value, stored.seq)) continue\n out.push({ id: row.id, seq: stored.seq, value: stored.value })\n }\n out.sort((a, b) => (options.order === \"oldest\" ? a.seq - b.seq : b.seq - a.seq))\n return out\n }\n}\n", "import type { SqliteClient } from \"@crvouga/mockingbird-sqlite\"\n\nconst ALPHABET = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\"\n\n/** FNV-1a over a string, mixed once more so consecutive counters look unrelated. */\nconst mix = (input: string): number => {\n let hash = 0x811c9dc5\n for (let i = 0; i < input.length; i++) {\n hash ^= input.charCodeAt(i)\n hash = Math.imul(hash, 0x01000193) >>> 0\n }\n hash ^= hash >>> 16\n hash = Math.imul(hash, 0x85ebca6b) >>> 0\n hash ^= hash >>> 13\n return hash >>> 0\n}\n\n/** Deterministic, opaque-looking alphanumeric token of `length` characters derived from `input`. */\nexport const opaqueToken = (input: string, length: number): string => {\n let out = \"\"\n let round = 0\n while (out.length < length) {\n let hash = mix(`${input}:${round++}`)\n for (let i = 0; i < 5 && out.length < length; i++) {\n out += ALPHABET.charAt(hash % ALPHABET.length)\n hash = Math.floor(hash / ALPHABET.length)\n }\n }\n return out\n}\n\n/**\n * What names an id base: a non-negative safe integer (or its decimal string) or `\"boot\"`,\n * which derives the base from the wall clock when the runtime is created.\n */\nexport type IdBase = number | string\n\nconst ID_BASES = new WeakMap<SqliteClient, number>()\n\n/**\n * Resolve an id base. `\"boot\"` is the wall clock in epoch milliseconds, so every boot gets\n * a different base. Anything else must be a non-negative safe integer or a string of digits.\n */\nexport const normalizeIdBase = (\n value: unknown,\n label = \"idBase\",\n wallNow: () => number = Date.now,\n): number => {\n if (value === \"boot\") return wallNow()\n const base =\n typeof value === \"string\" && /^\\d+$/.test(value.trim())\n ? Number(value.trim())\n : typeof value === \"number\"\n ? value\n : Number.NaN\n if (!Number.isSafeInteger(base) || base < 0)\n throw new RangeError(\n `${label} must be a non-negative integer or \"boot\" (got ${JSON.stringify(value)})`,\n )\n return base\n}\n\n/**\n * Give every {@link IdSequence} over `sqlite` this base. `0` is the default and changes\n * nothing; any other base yields a different, unrelated run of ids from the same counters.\n */\nexport const setIdBase = (sqlite: SqliteClient, base: number): void => {\n if (base === 0) ID_BASES.delete(sqlite)\n else ID_BASES.set(sqlite, base)\n}\n\n/** The id base in force over `sqlite` (`0` unless one was set). */\nexport const idBaseOf = (sqlite: SqliteClient): number => ID_BASES.get(sqlite) ?? 0\n\n/**\n * Sequential id source persisted in SQLite. Ids are deterministic for a given\n * sequence history (`cus_` + 14 opaque chars), so reproductions stay stable.\n * A runtime's `idBase` is mixed in, so a different base reissues none of another's ids.\n */\nexport class IdSequence {\n constructor(\n private readonly sqlite: SqliteClient,\n private readonly namespace: string,\n private readonly salt = \"mockingbird\",\n ) {}\n\n next(prefix: string, length = 14): string {\n return this.sqlite.transaction(() => {\n const row = this.sqlite\n .prepare(\n \"SELECT value FROM mockingbird_sequences WHERE namespace = ? AND name = ? AND kind = 'id'\",\n )\n .get<{ value: number }>(this.namespace, prefix)\n const value = (row?.value ?? 0) + 1\n this.sqlite\n .prepare(\n `INSERT INTO mockingbird_sequences (namespace, name, kind, value) VALUES (?, ?, 'id', ?)\n ON CONFLICT(namespace, name, kind) DO UPDATE SET value = excluded.value`,\n )\n .run(this.namespace, prefix, value)\n const base = idBaseOf(this.sqlite)\n const seed = base === 0 ? this.salt : `${this.salt}#${base}`\n return `${prefix}${opaqueToken(`${seed}:${prefix}:${value}`, length)}`\n })\n }\n}\n", "/**\n * Rails/PHP/Stripe-style bracket notation for `application/x-www-form-urlencoded` bodies and\n * query strings:\n *\n * address[city]=Paris -> { address: { city: \"Paris\" } }\n * items[0][name]=a -> { items: [{ name: \"a\" }] }\n * tags[]=x&tags[]=y -> { tags: [\"x\", \"y\"] }\n * metadata[k]=v -> { metadata: { k: \"v\" } }\n *\n * Decoding yields only strings, arrays and plain objects \u2014 coercion is the caller's concern,\n * exactly like a real HTTP server.\n */\n\nexport type FormValue = string | FormValue[] | { [key: string]: FormValue }\n\nexport type FormObject = { [key: string]: FormValue }\n\nconst encodeComponent = (value: string) =>\n encodeURIComponent(value).replace(\n /[!'()*]/g,\n (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`,\n )\n\nconst flatten = (prefix: string, value: unknown, out: Array<[string, string]>) => {\n if (value === undefined) return\n if (value === null) {\n out.push([prefix, \"\"])\n return\n }\n if (Array.isArray(value)) {\n if (value.length === 0) {\n out.push([prefix, \"\"])\n return\n }\n value.forEach((item, index) => {\n flatten(`${prefix}[${index}]`, item, out)\n })\n return\n }\n if (typeof value === \"object\") {\n const entries = Object.entries(value as Record<string, unknown>)\n if (entries.length === 0) {\n out.push([prefix, \"\"])\n return\n }\n for (const [key, item] of entries) flatten(`${prefix}[${key}]`, item, out)\n return\n }\n out.push([prefix, String(value)])\n}\n\n/**\n * Encode a JSON-like value as bracket-notation pairs. Nested arrays use explicit indices\n * (`a[0]`), which every bracket parser (including Stripe's) accepts; empty arrays/objects\n * encode as an empty string, matching how Stripe unsets fields.\n */\nexport const encodeFormPairs = (value: Record<string, unknown>): Array<[string, string]> => {\n const out: Array<[string, string]> = []\n for (const [key, item] of Object.entries(value)) flatten(key, item, out)\n return out\n}\n\n/** Encode to a full `application/x-www-form-urlencoded` string. */\nexport const encodeForm = (value: Record<string, unknown>): string =>\n encodeFormPairs(value)\n .map(([k, v]) => `${encodeComponent(k)}=${encodeComponent(v)}`)\n .join(\"&\")\n\nconst parsePath = (rawKey: string): string[] => {\n const open = rawKey.indexOf(\"[\")\n if (open === -1) return [rawKey]\n const path = [rawKey.slice(0, open)]\n const rest = rawKey.slice(open)\n const pattern = /\\[([^\\]]*)\\]/g\n let match: RegExpExecArray | null = pattern.exec(rest)\n let consumed = 0\n while (match !== null) {\n if (match.index !== consumed) return [rawKey]\n path.push(match[1] ?? \"\")\n consumed = match.index + match[0].length\n match = pattern.exec(rest)\n }\n if (consumed !== rest.length) return [rawKey]\n return path\n}\n\nconst isIndex = (segment: string) => /^(0|[1-9][0-9]*)$/.test(segment)\n\n/** 2^32 - 2: larger integer keys are plain properties of an array, never elements. */\nconst MAX_ARRAY_INDEX = 4_294_967_294\n\n/**\n * Write an own property. `__proto__` is the one key with an inherited setter, so it needs\n * `defineProperty`; every other key shadows its inherited namesake by plain assignment.\n */\nconst put = (target: object, key: string | number, value: FormValue): void => {\n if (key === \"__proto__\") {\n Object.defineProperty(target, key, {\n value,\n enumerable: true,\n writable: true,\n configurable: true,\n })\n return\n }\n ;(target as Record<string | number, FormValue>)[key] = value\n}\n\nconst assign = (target: FormObject, path: string[], value: string) => {\n let cursor: FormValue = target\n for (let i = 0; i < path.length; i++) {\n const segment = path[i] as string\n const last = i === path.length - 1\n if (Array.isArray(cursor)) {\n const index: number | undefined =\n segment === \"\" ? cursor.length : isIndex(segment) ? Number(segment) : undefined\n if (index === undefined) return\n if (last) {\n put(cursor, index, value)\n return\n }\n const next: FormValue | undefined = Object.hasOwn(cursor, index)\n ? (cursor as Record<number, FormValue>)[index]\n : undefined\n if (next === undefined || typeof next === \"string\") {\n const created: FormValue = path[i + 1] === \"\" || isIndex(path[i + 1] as string) ? [] : {}\n put(cursor, index, created)\n cursor = created\n } else {\n cursor = next\n }\n continue\n }\n if (typeof cursor === \"string\") return\n if (last) {\n put(cursor, segment, value)\n return\n }\n const nextSegment = path[i + 1] as string\n const existing: FormValue | undefined = Object.hasOwn(cursor, segment)\n ? (cursor as Record<string, FormValue>)[segment]\n : undefined\n if (existing === undefined || typeof existing === \"string\") {\n const created: FormValue = nextSegment === \"\" || isIndex(nextSegment) ? [] : {}\n put(cursor, segment, created)\n cursor = created\n } else {\n cursor = existing\n }\n }\n}\n\n/** Decode `key=value&...` pairs (already percent-decoded) into a nested object. */\nexport const decodeFormPairs = (pairs: Iterable<[string, string]>): FormObject => {\n const out: FormObject = {}\n for (const [rawKey, value] of pairs) assign(out, parsePath(rawKey), value)\n return densify(out) as FormObject\n}\n\n/** Sparse arrays (`a[2]=x` without `a[0]`) become dense in bracket parsers. */\nconst densify = (value: FormValue): FormValue => {\n if (typeof value === \"string\") return value\n if (Array.isArray(value)) {\n // Walk the indices that were written, not `length`: `a[4294967294]=x` makes a one-entry\n // array whose length is ~4.3 billion. Own index keys enumerate in ascending order.\n const dense: FormValue[] = []\n for (const key of Object.keys(value)) {\n if (!isIndex(key) || Number(key) > MAX_ARRAY_INDEX) continue\n const item = value[Number(key)]\n if (item !== undefined) dense.push(densify(item))\n }\n return dense\n }\n const out: FormObject = {}\n for (const [key, item] of Object.entries(value)) put(out, key, densify(item))\n return out\n}\n\n/** Decode an `application/x-www-form-urlencoded` body or a query string (with or without `?`). */\nexport const decodeForm = (text: string): FormObject => {\n const source = text.startsWith(\"?\") ? text.slice(1) : text\n return decodeFormPairs(new URLSearchParams(source).entries())\n}\n", "import { decodeForm, encodeForm } from \"./form.js\"\n\nexport const JSON_MEDIA_TYPE = \"application/json\"\nexport const FORM_MEDIA_TYPE = \"application/x-www-form-urlencoded\"\n\n/** The essence of a `Content-Type` header: lower-cased media type without parameters. */\nexport const mediaTypeOf = (contentType: string | null | undefined): string | undefined => {\n if (!contentType) return undefined\n const essence = contentType.split(\";\")[0]?.trim().toLowerCase()\n return essence ? essence : undefined\n}\n\nconst isJsonMediaType = (mediaType: string) =>\n mediaType === JSON_MEDIA_TYPE ||\n mediaType.endsWith(\"+json\") ||\n mediaType === \"text/json\" ||\n mediaType === \"application/x-amz-json-1.0\" ||\n mediaType === \"application/x-amz-json-1.1\"\n\nexport type DecodedBody =\n | { kind: \"empty\" }\n | { kind: \"json\"; value: unknown }\n | { kind: \"form\"; value: Record<string, unknown> }\n | { kind: \"text\"; value: string }\n | { kind: \"bytes\"; value: Uint8Array }\n | { kind: \"invalid\"; mediaType: string; text: string; error: string }\n\nconst utf8 = new TextDecoder(\"utf-8\", { fatal: false })\n\n/**\n * Decode raw bytes according to a `Content-Type`. Never throws: malformed payloads come back as\n * `{ kind: \"invalid\" }` so callers (mock servers, the differential runner) can respond like a real\n * server would instead of crashing.\n */\nexport const decodeBody = (\n contentType: string | null | undefined,\n bytes: Uint8Array,\n): DecodedBody => {\n if (bytes.byteLength === 0) return { kind: \"empty\" }\n const mediaType = mediaTypeOf(contentType)\n if (mediaType === undefined) return { kind: \"bytes\", value: bytes }\n if (isJsonMediaType(mediaType)) {\n const text = utf8.decode(bytes)\n try {\n return { kind: \"json\", value: JSON.parse(text) }\n } catch (error) {\n return {\n kind: \"invalid\",\n mediaType,\n text,\n error: error instanceof Error ? error.message : String(error),\n }\n }\n }\n if (mediaType === FORM_MEDIA_TYPE) {\n return { kind: \"form\", value: decodeForm(utf8.decode(bytes)) }\n }\n if (mediaType.startsWith(\"text/\")) return { kind: \"text\", value: utf8.decode(bytes) }\n return { kind: \"bytes\", value: bytes }\n}\n\n/** Read and decode a Request/Response body. */\nexport const readBody = async (message: Request | Response): Promise<DecodedBody> => {\n // Materialize automatic headers before accessing the body stream. Bun can otherwise\n // discard the inferred content type of an in-process URLSearchParams request.\n const contentType = message.headers.get(\"content-type\")\n // An in-process Request's body does not automatically observe its AbortSignal.\n // Cancel the active reader so an incomplete upload cannot strand the caller.\n if (!(message instanceof Request) || !message.body) {\n if (message instanceof Request) message.signal.throwIfAborted()\n return decodeBody(contentType, new Uint8Array(await message.arrayBuffer()))\n }\n message.signal.throwIfAborted()\n const reader = message.body.getReader()\n const cancel = () => {\n void reader.cancel(message.signal.reason).catch(() => {})\n }\n message.signal.addEventListener(\"abort\", cancel, { once: true })\n const chunks: Uint8Array[] = []\n let size = 0\n try {\n for (;;) {\n message.signal.throwIfAborted()\n const { done, value } = await reader.read()\n message.signal.throwIfAborted()\n if (done) break\n chunks.push(value)\n size += value.byteLength\n }\n } finally {\n message.signal.removeEventListener(\"abort\", cancel)\n reader.releaseLock()\n }\n const bytes = new Uint8Array(size)\n let offset = 0\n for (const chunk of chunks) {\n bytes.set(chunk, offset)\n offset += chunk.byteLength\n }\n return decodeBody(contentType, bytes)\n}\n\nexport type EncodedBody = {\n contentType: string\n body: string\n}\n\n/** Encode a JSON-like value for the given media type. Throws for unsupported media types. */\nexport const encodeBody = (mediaType: string, value: unknown): EncodedBody => {\n const essence = mediaTypeOf(mediaType) ?? mediaType\n if (isJsonMediaType(essence)) return { contentType: essence, body: JSON.stringify(value) }\n if (essence === FORM_MEDIA_TYPE) {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new TypeError(`${FORM_MEDIA_TYPE} bodies must be objects`)\n }\n return { contentType: essence, body: encodeForm(value as Record<string, unknown>) }\n }\n if (essence.startsWith(\"text/\")) return { contentType: essence, body: String(value) }\n throw new TypeError(`unsupported request media type: ${mediaType}`)\n}\n", "import type { OpenAPIDocument, ReferenceObject } from \"./types.js\"\n\nexport class OpenAPIReferenceError extends Error {\n constructor(readonly ref: string) {\n super(`unresolvable $ref: ${ref}`)\n this.name = \"OpenAPIReferenceError\"\n }\n}\n\nconst unescapePointer = (segment: string) => segment.replace(/~1/g, \"/\").replace(/~0/g, \"~\")\n\n/** True when `value` is a `{ $ref }` object. */\nexport const isReference = (value: unknown): value is ReferenceObject =>\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { $ref?: unknown }).$ref === \"string\"\n\n/** Resolve a local JSON pointer reference (`#/components/schemas/customer`) inside `document`. */\nexport const resolveRef = (document: OpenAPIDocument, ref: string): unknown => {\n if (!ref.startsWith(\"#/\")) throw new OpenAPIReferenceError(ref)\n let cursor: unknown = document\n for (const raw of ref.slice(2).split(\"/\")) {\n const segment = unescapePointer(raw)\n if (typeof cursor !== \"object\" || cursor === null || !(segment in cursor)) {\n throw new OpenAPIReferenceError(ref)\n }\n cursor = (cursor as Record<string, unknown>)[segment]\n }\n if (cursor === undefined) throw new OpenAPIReferenceError(ref)\n return cursor\n}\n\n/**\n * Follow `$ref` chains until a concrete object is reached. Guards against cycles.\n * Sibling keys next to `$ref` are ignored, as in OpenAPI 3.0/3.1 for non-schema objects.\n */\nexport const deref = <T>(document: OpenAPIDocument, value: T | ReferenceObject): T => {\n let current: unknown = value\n const seen = new Set<string>()\n while (isReference(current)) {\n if (seen.has(current.$ref)) throw new OpenAPIReferenceError(`${current.$ref} (cycle)`)\n seen.add(current.$ref)\n current = resolveRef(document, current.$ref)\n }\n return current as T\n}\n\n/** The component name at the end of a `#/components/<kind>/<name>` reference, if any. */\nexport const componentNameOf = (ref: string): string | undefined => {\n const match = /^#\\/components\\/[^/]+\\/(.+)$/.exec(ref)\n return match?.[1] === undefined ? undefined : unescapePointer(match[1])\n}\n", "/**\n * The slice of OpenAPI 3.1 (and JSON Schema 2020-12) Mockingbird understands.\n * Unknown keys (including `x-*` extensions) are preserved on every object.\n */\n\nexport type JsonPrimitive = string | number | boolean | null\nexport type JsonValue = JsonPrimitive | JsonValue[] | { [key: string]: JsonValue }\n\nexport type ReferenceObject = { $ref: string; description?: string; summary?: string }\n\nexport type SchemaType = \"string\" | \"number\" | \"integer\" | \"boolean\" | \"object\" | \"array\" | \"null\"\n\nexport type SchemaObject = {\n $ref?: string\n type?: SchemaType | SchemaType[]\n title?: string\n description?: string\n format?: string\n enum?: JsonValue[]\n const?: JsonValue\n default?: JsonValue\n example?: JsonValue\n examples?: JsonValue[]\n nullable?: boolean\n deprecated?: boolean\n readOnly?: boolean\n writeOnly?: boolean\n minimum?: number\n maximum?: number\n exclusiveMinimum?: number\n exclusiveMaximum?: number\n multipleOf?: number\n minLength?: number\n maxLength?: number\n pattern?: string\n minItems?: number\n maxItems?: number\n uniqueItems?: boolean\n items?: SchemaObject\n prefixItems?: SchemaObject[]\n minProperties?: number\n maxProperties?: number\n required?: string[]\n properties?: Record<string, SchemaObject>\n additionalProperties?: boolean | SchemaObject\n propertyNames?: SchemaObject\n oneOf?: SchemaObject[]\n anyOf?: SchemaObject[]\n allOf?: SchemaObject[]\n not?: SchemaObject\n discriminator?: { propertyName: string; mapping?: Record<string, string> }\n [extension: `x-${string}`]: unknown\n}\n\nexport type ParameterLocation = \"path\" | \"query\" | \"header\" | \"cookie\"\n\nexport type ParameterObject = {\n name: string\n in: ParameterLocation\n description?: string\n required?: boolean\n deprecated?: boolean\n style?: string\n explode?: boolean\n schema?: SchemaObject\n content?: Record<string, MediaTypeObject>\n example?: JsonValue\n [extension: `x-${string}`]: unknown\n}\n\nexport type MediaTypeObject = {\n schema?: SchemaObject\n example?: JsonValue\n examples?: Record<string, unknown>\n encoding?: Record<string, unknown>\n [extension: `x-${string}`]: unknown\n}\n\nexport type RequestBodyObject = {\n description?: string\n required?: boolean\n content: Record<string, MediaTypeObject>\n [extension: `x-${string}`]: unknown\n}\n\nexport type HeaderObject = {\n description?: string\n required?: boolean\n schema?: SchemaObject\n [extension: `x-${string}`]: unknown\n}\n\nexport type ResponseObject = {\n description: string\n headers?: Record<string, HeaderObject | ReferenceObject>\n content?: Record<string, MediaTypeObject>\n [extension: `x-${string}`]: unknown\n}\n\nexport type ResponsesObject = Record<string, ResponseObject | ReferenceObject>\n\nexport type SecurityRequirementObject = Record<string, string[]>\n\nexport type OperationObject = {\n operationId?: string\n summary?: string\n description?: string\n tags?: string[]\n deprecated?: boolean\n parameters?: Array<ParameterObject | ReferenceObject>\n requestBody?: RequestBodyObject | ReferenceObject\n responses: ResponsesObject\n security?: SecurityRequirementObject[]\n [extension: `x-${string}`]: unknown\n}\n\nexport const HTTP_METHODS = [\n \"get\",\n \"put\",\n \"post\",\n \"delete\",\n \"options\",\n \"head\",\n \"patch\",\n \"trace\",\n] as const\nexport type HttpMethod = (typeof HTTP_METHODS)[number]\n\nexport type PathItemObject = {\n summary?: string\n description?: string\n parameters?: Array<ParameterObject | ReferenceObject>\n [extension: `x-${string}`]: unknown\n} & Partial<Record<HttpMethod, OperationObject>>\n\nexport type SecuritySchemeObject = {\n type: \"apiKey\" | \"http\" | \"oauth2\" | \"openIdConnect\" | \"mutualTLS\"\n description?: string\n name?: string\n in?: ParameterLocation\n scheme?: string\n bearerFormat?: string\n flows?: Record<string, unknown>\n openIdConnectUrl?: string\n [extension: `x-${string}`]: unknown\n}\n\nexport type ComponentsObject = {\n schemas?: Record<string, SchemaObject>\n responses?: Record<string, ResponseObject>\n parameters?: Record<string, ParameterObject>\n requestBodies?: Record<string, RequestBodyObject>\n headers?: Record<string, HeaderObject>\n securitySchemes?: Record<string, SecuritySchemeObject>\n [extension: `x-${string}`]: unknown\n}\n\nexport type ServerObject = {\n url: string\n description?: string\n variables?: Record<string, unknown>\n [extension: `x-${string}`]: unknown\n}\n\nexport type InfoObject = {\n title: string\n version: string\n description?: string\n [extension: `x-${string}`]: unknown\n}\n\nexport type OpenAPIDocument = {\n openapi: string\n info: InfoObject\n servers?: ServerObject[]\n paths: Record<string, PathItemObject>\n components?: ComponentsObject\n security?: SecurityRequirementObject[]\n tags?: Array<{ name: string; description?: string }>\n [extension: `x-${string}`]: unknown\n}\n\n/** One concrete HTTP operation discovered in a document. */\nexport type Operation = {\n operationId: string\n method: HttpMethod\n /** OpenAPI path template, e.g. `/v1/customers/{customer}`. */\n path: string\n operation: OperationObject\n /** Path-level parameters merged with operation-level ones (operation wins), `$ref`s resolved. */\n parameters: ParameterObject[]\n requestBody: RequestBodyObject | undefined\n responses: Record<string, ResponseObject>\n}\n", "import { deref, isReference, resolveRef } from \"./refs.js\"\nimport {\n HTTP_METHODS,\n type HttpMethod,\n type OpenAPIDocument,\n type Operation,\n type ParameterObject,\n type PathItemObject,\n type RequestBodyObject,\n type ResponseObject,\n} from \"./types.js\"\n\nexport class OpenAPIDocumentError extends Error {\n constructor(readonly issues: string[]) {\n super(`invalid OpenAPI document:\\n${issues.map((issue) => ` - ${issue}`).join(\"\\n\")}`)\n this.name = \"OpenAPIDocumentError\"\n }\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n\n/**\n * Accept an already-parsed JSON/YAML value and return it typed as an {@link OpenAPIDocument}.\n * Performs the structural checks Mockingbird relies on (see {@link validateOpenAPIDocument}) and\n * throws {@link OpenAPIDocumentError} listing every problem.\n */\nexport const parseOpenAPIDocument = (value: unknown): OpenAPIDocument => {\n const issues: string[] = []\n if (!isRecord(value)) throw new OpenAPIDocumentError([\"document must be an object\"])\n if (typeof value.openapi !== \"string\" || !/^3\\.[01]\\./.test(value.openapi)) {\n issues.push(\n `openapi must be a 3.0.x or 3.1.x version string, got ${JSON.stringify(value.openapi)}`,\n )\n }\n if (\n !isRecord(value.info) ||\n typeof value.info.title !== \"string\" ||\n typeof value.info.version !== \"string\"\n ) {\n issues.push(\"info.title and info.version are required strings\")\n }\n if (!isRecord(value.paths)) issues.push(\"paths must be an object\")\n if (issues.length > 0) throw new OpenAPIDocumentError(issues)\n const document = value as unknown as OpenAPIDocument\n const problems = validateOpenAPIDocument(document)\n if (problems.length > 0) throw new OpenAPIDocumentError(problems)\n return document\n}\n\nconst walkRefs = (\n document: OpenAPIDocument,\n node: unknown,\n at: string,\n issues: string[],\n seen: Set<unknown>,\n) => {\n if (typeof node !== \"object\" || node === null || seen.has(node)) return\n seen.add(node)\n if (isReference(node)) {\n try {\n resolveRef(document, node.$ref)\n } catch {\n issues.push(`${at}: unresolvable $ref ${node.$ref}`)\n }\n }\n for (const [key, child] of Object.entries(node))\n walkRefs(document, child, `${at}/${key}`, issues, seen)\n}\n\nconst templateParams = (path: string) =>\n [...path.matchAll(/\\{([^}]+)\\}/g)].map((m) => m[1] as string)\n\n/**\n * Mockingbird's document rules:\n * - every operation has a unique `operationId`\n * - every `$ref` resolves\n * - every `{param}` in a path template has a matching required path parameter\n * - every path parameter appears in the template\n */\nexport const validateOpenAPIDocument = (document: OpenAPIDocument): string[] => {\n const issues: string[] = []\n walkRefs(document, document, \"#\", issues, new Set())\n if (issues.length > 0) return issues\n const seenIds = new Map<string, string>()\n for (const [path, item] of Object.entries(document.paths)) {\n if (!isRecord(item)) {\n issues.push(`paths.${path}: must be an object`)\n continue\n }\n const inTemplate = new Set(templateParams(path))\n for (const method of HTTP_METHODS) {\n const operation = item[method]\n if (operation === undefined) continue\n const label = `${method.toUpperCase()} ${path}`\n if (typeof operation.operationId !== \"string\" || operation.operationId.length === 0) {\n issues.push(`${label}: operationId is required`)\n continue\n }\n const previous = seenIds.get(operation.operationId)\n if (previous !== undefined)\n issues.push(`${label}: duplicate operationId ${operation.operationId} (also ${previous})`)\n seenIds.set(operation.operationId, label)\n if (!isRecord(operation.responses) || Object.keys(operation.responses).length === 0) {\n issues.push(`${label}: responses must declare at least one status`)\n }\n const parameters = mergeParameters(document, item, operation.parameters)\n const declared = new Set(parameters.filter((p) => p.in === \"path\").map((p) => p.name))\n for (const name of inTemplate) {\n if (!declared.has(name)) issues.push(`${label}: path parameter {${name}} is not declared`)\n }\n for (const parameter of parameters) {\n if (parameter.in === \"path\") {\n if (!inTemplate.has(parameter.name))\n issues.push(`${label}: path parameter ${parameter.name} is not in the template`)\n if (parameter.required !== true)\n issues.push(`${label}: path parameter ${parameter.name} must be required`)\n }\n }\n }\n }\n return issues\n}\n\nconst mergeParameters = (\n document: OpenAPIDocument,\n item: PathItemObject,\n own: PathItemObject[\"parameters\"],\n): ParameterObject[] => {\n const merged = new Map<string, ParameterObject>()\n for (const raw of item.parameters ?? []) {\n const parameter = deref<ParameterObject>(document, raw)\n merged.set(`${parameter.in}:${parameter.name}`, parameter)\n }\n for (const raw of own ?? []) {\n const parameter = deref<ParameterObject>(document, raw)\n merged.set(`${parameter.in}:${parameter.name}`, parameter)\n }\n return [...merged.values()]\n}\n\n/** Enumerate every operation in the document in path, then method order. */\nexport const listOperations = (document: OpenAPIDocument): Operation[] => {\n const operations: Operation[] = []\n for (const [path, item] of Object.entries(document.paths)) {\n for (const method of HTTP_METHODS) {\n const operation = item[method]\n if (operation?.operationId === undefined) continue\n const responses: Record<string, ResponseObject> = {}\n for (const [status, response] of Object.entries(operation.responses)) {\n responses[status] = deref<ResponseObject>(document, response)\n }\n operations.push({\n operationId: operation.operationId,\n method,\n path,\n operation,\n parameters: mergeParameters(document, item, operation.parameters),\n requestBody:\n operation.requestBody === undefined\n ? undefined\n : deref<RequestBodyObject>(document, operation.requestBody),\n responses,\n })\n }\n }\n return operations\n}\n\n/** Find one operation by id. */\nexport const findOperation = (\n document: OpenAPIDocument,\n operationId: string,\n): Operation | undefined =>\n listOperations(document).find((operation) => operation.operationId === operationId)\n\n/** Parameter names inside a path template, in order. */\nexport const pathTemplateParameters = templateParams\n\n/** Substitute `{name}` placeholders. Values are percent-encoded as path segments. */\nexport const expandPathTemplate = (template: string, values: Record<string, string>): string =>\n template.replace(/\\{([^}]+)\\}/g, (_, name: string) => {\n const value = values[name]\n if (value === undefined) throw new RangeError(`missing path parameter ${name}`)\n return encodeURIComponent(value)\n })\n\n/** The response object matching an HTTP status: exact match, then `2XX`-style range, then `default`. */\nexport const responseForStatus = (\n responses: Record<string, ResponseObject>,\n status: number,\n): ResponseObject | undefined =>\n responses[String(status)] ?? responses[`${Math.floor(status / 100)}XX`] ?? responses.default\n\nexport type { HttpMethod }\n", "import { resolveRef } from \"./refs.js\"\nimport type { JsonValue, OpenAPIDocument, SchemaObject, SchemaType } from \"./types.js\"\n\n/**\n * Resolve a schema's `$ref` (merging sibling keywords, as JSON Schema 2020-12 allows) and\n * normalise OpenAPI 3.0 `nullable` into a 3.1 type array.\n */\nexport const resolveSchema = (document: OpenAPIDocument, schema: SchemaObject): SchemaObject => {\n let current = schema\n const seen = new Set<string>()\n while (typeof current.$ref === \"string\") {\n const ref = current.$ref\n if (seen.has(ref)) break\n seen.add(ref)\n const { $ref: _ignored, ...siblings } = current\n const target = resolveRef(document, ref) as SchemaObject\n current = { ...target, ...siblings }\n }\n if (current.nullable === true) {\n const { nullable: _nullable, ...rest } = current\n const types = schemaTypes(rest)\n if (types.length > 0 && !types.includes(\"null\")) current = { ...rest, type: [...types, \"null\"] }\n else current = rest\n }\n return current\n}\n\n/** Declared JSON types of a schema (empty when unconstrained). */\nexport const schemaTypes = (schema: SchemaObject): SchemaType[] => {\n if (Array.isArray(schema.type)) return schema.type\n if (schema.type !== undefined) return [schema.type]\n const inferred: SchemaType[] = []\n if (schema.properties || schema.required || schema.additionalProperties !== undefined)\n inferred.push(\"object\")\n if (\n schema.items ||\n schema.prefixItems ||\n schema.minItems !== undefined ||\n schema.maxItems !== undefined\n )\n inferred.push(\"array\")\n if (\n schema.minLength !== undefined ||\n schema.maxLength !== undefined ||\n schema.pattern !== undefined\n )\n inferred.push(\"string\")\n if (\n schema.minimum !== undefined ||\n schema.maximum !== undefined ||\n schema.multipleOf !== undefined\n )\n inferred.push(\"number\")\n return inferred\n}\n\n/** The JSON type name of a runtime value. */\nexport const jsonTypeOf = (value: unknown): SchemaType | \"undefined\" => {\n if (value === null) return \"null\"\n if (Array.isArray(value)) return \"array\"\n switch (typeof value) {\n case \"string\":\n return \"string\"\n case \"boolean\":\n return \"boolean\"\n case \"number\":\n return Number.isInteger(value) ? \"integer\" : \"number\"\n case \"object\":\n return \"object\"\n default:\n return \"undefined\"\n }\n}\n\nexport type SchemaVisitor = (schema: SchemaObject, path: string[]) => void\n\n/**\n * Depth-first walk over a schema tree, resolving `$ref`s, that terminates on recursive schemas.\n * Each schema node is visited once per call: the annotation consumers (identities, refs,\n * volatile/scope marks) only care that a node is reachable, and visiting per path is exponential\n * on densely cross-referenced documents.\n */\nexport const walkSchema = (\n document: OpenAPIDocument,\n schema: SchemaObject,\n visit: SchemaVisitor,\n path: string[] = [],\n) => {\n const seen = new Set<SchemaObject>()\n const go = (node: SchemaObject, at: string[]) => {\n // `resolveSchema` returns a fresh object whenever it follows a `$ref`, so identity of the\n // resolved schema alone never repeats on a recursive schema. The raw node does: every child is\n // an object of the document itself, so remembering raw nodes bounds the walk.\n if (seen.has(node)) return\n seen.add(node)\n const resolved = resolveSchema(document, node)\n if (resolved !== node && seen.has(resolved)) return\n seen.add(resolved)\n visit(resolved, at)\n for (const [name, child] of Object.entries(resolved.properties ?? {}))\n go(child, [...at, \"properties\", name])\n if (typeof resolved.additionalProperties === \"object\")\n go(resolved.additionalProperties, [...at, \"additionalProperties\"])\n if (resolved.items) go(resolved.items, [...at, \"items\"])\n resolved.prefixItems?.forEach((child, i) => {\n go(child, [...at, \"prefixItems\", String(i)])\n })\n resolved.propertyNames && go(resolved.propertyNames, [...at, \"propertyNames\"])\n for (const keyword of [\"oneOf\", \"anyOf\", \"allOf\"] as const) {\n resolved[keyword]?.forEach((child, i) => {\n go(child, [...at, keyword, String(i)])\n })\n }\n resolved.not && go(resolved.not, [...at, \"not\"])\n }\n go(schema, path)\n}\nexport type ValidationError = { path: Array<string | number>; message: string }\n\nconst deepEqual = (a: unknown, b: unknown): boolean => {\n if (a === b) return true\n if (typeof a !== typeof b || a === null || b === null) return false\n if (Array.isArray(a)) {\n return Array.isArray(b) && a.length === b.length && a.every((item, i) => deepEqual(item, b[i]))\n }\n if (typeof a === \"object\" && typeof b === \"object\" && !Array.isArray(b)) {\n const ka = Object.keys(a as object)\n const kb = Object.keys(b as object)\n return (\n ka.length === kb.length &&\n ka.every((k) =>\n deepEqual((a as Record<string, unknown>)[k], (b as Record<string, unknown>)[k]),\n )\n )\n }\n return false\n}\n\nconst FORMAT_PATTERNS: Record<string, RegExp> = {\n uuid: /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,\n date: /^\\d{4}-\\d{2}-\\d{2}$/,\n \"date-time\": /^\\d{4}-\\d{2}-\\d{2}[Tt ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?([Zz]|[+-]\\d{2}:\\d{2})$/,\n email: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\n uri: /^[a-zA-Z][a-zA-Z0-9+.-]*:[^\\s]*$/,\n ipv4: /^(25[0-5]|2[0-4]\\d|1?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|1?\\d?\\d)){3}$/,\n}\n\nconst graphemeLength = (value: string) => [...value].length\n\n/**\n * Validate `value` against `schema`. Supports the JSON Schema subset Mockingbird generates from\n * (see `@crvouga/mockingbird-openapi-arbitrary`). Returns an empty array when valid.\n */\nexport const validateValue = (\n document: OpenAPIDocument,\n schema: SchemaObject,\n value: unknown,\n path: Array<string | number> = [],\n): ValidationError[] => {\n const errors: ValidationError[] = []\n const s = resolveSchema(document, schema)\n const fail = (message: string) => errors.push({ path, message })\n const actual = jsonTypeOf(value)\n if (actual === \"undefined\") {\n fail(\"value is undefined\")\n return errors\n }\n const types = schemaTypes(s)\n if (types.length > 0) {\n const ok = types.some((t) => t === actual || (t === \"number\" && actual === \"integer\"))\n if (!ok) {\n fail(`expected type ${types.join(\"|\")}, got ${actual}`)\n return errors\n }\n }\n // OpenAPI commonly pairs `type: [\"string\",\"null\"]` with an enum of the non-null values;\n // null is admitted by the type union and must not fail the enum check.\n if (\n s.enum &&\n !(value === null && types.includes(\"null\")) &&\n !s.enum.some((candidate) => deepEqual(candidate, value))\n ) {\n fail(\"value not in enum\")\n }\n if (s.const !== undefined && !deepEqual(s.const, value)) fail(\"value does not equal const\")\n if (typeof value === \"string\") {\n const length = graphemeLength(value)\n if (s.minLength !== undefined && length < s.minLength)\n fail(`length ${length} < minLength ${s.minLength}`)\n if (s.maxLength !== undefined && length > s.maxLength)\n fail(`length ${length} > maxLength ${s.maxLength}`)\n if (s.pattern !== undefined) {\n try {\n if (!new RegExp(s.pattern, \"u\").test(value)) fail(`does not match pattern ${s.pattern}`)\n } catch {\n // unsupported pattern syntax: skip, matching lenient validators\n }\n }\n if (s.format !== undefined) {\n const pattern = FORMAT_PATTERNS[s.format]\n if (pattern && !pattern.test(value)) fail(`does not match format ${s.format}`)\n }\n }\n if (typeof value === \"number\") {\n if (s.minimum !== undefined && value < s.minimum) fail(`${value} < minimum ${s.minimum}`)\n if (s.maximum !== undefined && value > s.maximum) fail(`${value} > maximum ${s.maximum}`)\n if (s.exclusiveMinimum !== undefined && value <= s.exclusiveMinimum)\n fail(`${value} <= exclusiveMinimum ${s.exclusiveMinimum}`)\n if (s.exclusiveMaximum !== undefined && value >= s.exclusiveMaximum)\n fail(`${value} >= exclusiveMaximum ${s.exclusiveMaximum}`)\n if (\n s.multipleOf !== undefined &&\n Math.abs(value / s.multipleOf - Math.round(value / s.multipleOf)) > 1e-9\n ) {\n fail(`${value} is not a multiple of ${s.multipleOf}`)\n }\n }\n if (Array.isArray(value)) {\n if (s.minItems !== undefined && value.length < s.minItems)\n fail(`${value.length} items < minItems ${s.minItems}`)\n if (s.maxItems !== undefined && value.length > s.maxItems)\n fail(`${value.length} items > maxItems ${s.maxItems}`)\n if (\n s.uniqueItems &&\n value.some((item, i) => value.slice(0, i).some((prev) => deepEqual(prev, item)))\n )\n fail(\"items are not unique\")\n value.forEach((item, i) => {\n const itemSchema = s.prefixItems?.[i] ?? s.items\n if (itemSchema) errors.push(...validateValue(document, itemSchema, item, [...path, i]))\n })\n }\n if (actual === \"object\") {\n const record = value as Record<string, unknown>\n const keys = Object.keys(record)\n for (const name of s.required ?? [])\n if (!(name in record)) fail(`missing required property ${name}`)\n if (s.minProperties !== undefined && keys.length < s.minProperties)\n fail(`${keys.length} properties < minProperties ${s.minProperties}`)\n if (s.maxProperties !== undefined && keys.length > s.maxProperties)\n fail(`${keys.length} properties > maxProperties ${s.maxProperties}`)\n for (const key of keys) {\n const property = s.properties?.[key]\n if (property) {\n errors.push(...validateValue(document, property, record[key], [...path, key]))\n continue\n }\n if (s.additionalProperties === false) fail(`unexpected property ${key}`)\n else if (typeof s.additionalProperties === \"object\") {\n errors.push(...validateValue(document, s.additionalProperties, record[key], [...path, key]))\n }\n if (s.propertyNames) {\n const nameErrors = validateValue(document, s.propertyNames, key, [...path, key])\n if (nameErrors.length > 0)\n fail(`property name ${key} is invalid: ${nameErrors[0]?.message}`)\n }\n }\n }\n if (s.allOf)\n for (const branch of s.allOf) errors.push(...validateValue(document, branch, value, path))\n if (s.anyOf && !s.anyOf.some((branch) => validateValue(document, branch, value).length === 0))\n fail(\"matches no anyOf branch\")\n if (s.oneOf) {\n const matches = s.oneOf.filter(\n (branch) => validateValue(document, branch, value).length === 0,\n ).length\n if (matches !== 1) fail(`matches ${matches} oneOf branches, expected exactly 1`)\n }\n if (s.not && validateValue(document, s.not, value).length === 0)\n fail(\"matches forbidden `not` schema\")\n return errors\n}\n\nexport const isValid = (document: OpenAPIDocument, schema: SchemaObject, value: unknown) =>\n validateValue(document, schema, value).length === 0\n\nexport type { JsonValue }\n", "/**\n * Mockingbird's OpenAPI extensions. They are deliberately generic: nothing here knows about any\n * particular provider. Provider specifics live in each provider's `openapi.yaml`.\n */\n\n/** `x-mockingbird` on an operation. */\nexport type OperationExtension = {\n /** Opt in to a terminal path parameter spanning slash-separated segments. */\n path?: { parameter: string; allowEmpty?: boolean }\n /** `false` marks an operation the mock explicitly does not implement. Default `true`. */\n supported?: boolean\n /** Human explanation, required when `supported: false` or `parity.enabled: false`. */\n reason?: string\n parity?: {\n /** Whether the differential runner generates this operation. Defaults to `supported`. */\n enabled?: boolean\n /** `false` for operations that must never hit a real account (destructive, billing\u2026). Default `true`. */\n safe?: boolean\n reason?: string\n }\n}\n\nexport type OperationMetadata = {\n path?: { parameter: string; allowEmpty?: boolean }\n supported: boolean\n reason: string | undefined\n parity: { enabled: boolean; safe: boolean; reason: string | undefined }\n}\n\n/** `x-mockingbird-resource`: this string value is the identity of a resource. */\nexport type ResourceIdentityExtension = { type: string; identity: true }\n\n/** `x-mockingbird-resource-ref`: this value must reference an existing resource of `type`. */\nexport type ResourceRefExtension = {\n type: string\n /** A well-formed id that does not exist, used to exercise not-found behaviour. */\n missing?: string\n}\n\nexport const VOLATILE_KINDS = [\"id\", \"timestamp\", \"token\", \"url\", \"account\", \"opaque\"] as const\nexport type VolatileKind = (typeof VOLATILE_KINDS)[number]\n\n/** `x-mockingbird-volatile`: nondeterministic on the real side; compared by shape only. */\nexport type VolatileExtension = { kind: VolatileKind }\n\nexport const SCOPE_VALUES = [\"run-id\", \"walk-start-unix\", \"walk-start-iso\"] as const\nexport type ScopeValue = (typeof SCOPE_VALUES)[number]\n\n/** `x-mockingbird-scope`: always generate this run-scoped value instead of a random one. */\nexport type ScopeExtension = { value: ScopeValue }\n\n/** `x-mockingbird-unsupported`: the mock does not implement this parameter/property. */\nexport type UnsupportedExtension = true | { reason?: string }\n\nexport type SchemaMetadata = {\n resource: ResourceIdentityExtension | undefined\n resourceRef: ResourceRefExtension | undefined\n volatile: VolatileExtension | undefined\n scope: ScopeExtension | undefined\n unsupported: { reason: string | undefined } | undefined\n}\n\nexport const EXTENSION_KEYS = {\n operation: \"x-mockingbird\",\n resource: \"x-mockingbird-resource\",\n resourceRef: \"x-mockingbird-resource-ref\",\n volatile: \"x-mockingbird-volatile\",\n scope: \"x-mockingbird-scope\",\n unsupported: \"x-mockingbird-unsupported\",\n parityHeader: \"x-mockingbird-parity-header\",\n} as const\n", "import type {\n HeaderObject,\n OpenAPIDocument,\n OperationObject,\n ParameterObject,\n ResponseObject,\n SchemaObject,\n} from \"@crvouga/mockingbird-openapi\"\nimport { deref, resolveSchema } from \"@crvouga/mockingbird-openapi\"\nimport {\n EXTENSION_KEYS,\n type OperationExtension,\n type OperationMetadata,\n SCOPE_VALUES,\n type SchemaMetadata,\n VOLATILE_KINDS,\n} from \"./types.js\"\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n\nconst extensionOf = (holder: object, key: string): unknown =>\n (holder as Record<string, unknown>)[key]\n\n/** Read `x-mockingbird` from an operation, applying defaults. */\nexport const operationMetadata = (operation: OperationObject): OperationMetadata => {\n const raw = extensionOf(operation, EXTENSION_KEYS.operation)\n const ext: OperationExtension = isRecord(raw) ? (raw as OperationExtension) : {}\n const supported = ext.supported ?? true\n const parity = ext.parity ?? {}\n return {\n ...(ext.path === undefined ? {} : { path: ext.path }),\n supported,\n reason: typeof ext.reason === \"string\" ? ext.reason : undefined,\n parity: {\n enabled: supported && (parity.enabled ?? true),\n safe: parity.safe ?? true,\n reason: typeof parity.reason === \"string\" ? parity.reason : undefined,\n },\n }\n}\n\nconst readResource = (raw: unknown): SchemaMetadata[\"resource\"] => {\n if (!isRecord(raw) || typeof raw.type !== \"string\" || raw.identity !== true) return undefined\n return { type: raw.type, identity: true }\n}\n\nconst readResourceRef = (raw: unknown): SchemaMetadata[\"resourceRef\"] => {\n if (!isRecord(raw) || typeof raw.type !== \"string\") return undefined\n return { type: raw.type, ...(typeof raw.missing === \"string\" ? { missing: raw.missing } : {}) }\n}\n\nconst readVolatile = (raw: unknown): SchemaMetadata[\"volatile\"] => {\n if (!isRecord(raw) || typeof raw.kind !== \"string\") return undefined\n const kind = VOLATILE_KINDS.find((k) => k === raw.kind)\n return kind === undefined ? undefined : { kind }\n}\n\nconst readScope = (raw: unknown): SchemaMetadata[\"scope\"] => {\n if (!isRecord(raw) || typeof raw.value !== \"string\") return undefined\n const value = SCOPE_VALUES.find((v) => v === raw.value)\n return value === undefined ? undefined : { value }\n}\n\nconst readUnsupported = (raw: unknown): SchemaMetadata[\"unsupported\"] => {\n if (raw === true) return { reason: undefined }\n if (isRecord(raw)) return { reason: typeof raw.reason === \"string\" ? raw.reason : undefined }\n return undefined\n}\n\n/**\n * Read Mockingbird's schema-level extensions from a (resolved) schema or parameter.\n * Extensions on a `$ref` wrapper win over the target's, matching {@link resolveSchema}.\n */\nexport const schemaMetadata = (holder: SchemaObject | ParameterObject): SchemaMetadata => ({\n resource: readResource(extensionOf(holder, EXTENSION_KEYS.resource)),\n resourceRef: readResourceRef(extensionOf(holder, EXTENSION_KEYS.resourceRef)),\n volatile: readVolatile(extensionOf(holder, EXTENSION_KEYS.volatile)),\n scope: readScope(extensionOf(holder, EXTENSION_KEYS.scope)),\n unsupported: readUnsupported(extensionOf(holder, EXTENSION_KEYS.unsupported)),\n})\n\n/** Metadata of a parameter: extensions on the parameter itself win over its schema's. */\nexport const parameterMetadata = (\n document: OpenAPIDocument,\n parameter: ParameterObject,\n): SchemaMetadata => {\n const own = schemaMetadata(parameter)\n const fromSchema = parameter.schema\n ? schemaMetadata(resolveSchema(document, parameter.schema))\n : undefined\n return {\n resource: own.resource ?? fromSchema?.resource,\n resourceRef: own.resourceRef ?? fromSchema?.resourceRef,\n volatile: own.volatile ?? fromSchema?.volatile,\n scope: own.scope ?? fromSchema?.scope,\n unsupported: own.unsupported ?? fromSchema?.unsupported,\n }\n}\n\n/** Lower-cased names of response headers flagged with `x-mockingbird-parity-header: true`. */\nexport const parityHeaders = (document: OpenAPIDocument, response: ResponseObject): string[] => {\n const names: string[] = []\n for (const [name, raw] of Object.entries(response.headers ?? {})) {\n const header = deref<HeaderObject>(document, raw)\n if (extensionOf(header, EXTENSION_KEYS.parityHeader) === true) names.push(name.toLowerCase())\n }\n return names.sort()\n}\n", "import type { FetchAPI } from \"@crvouga/mockingbird-core\"\nimport {\n type DecodedBody,\n decodeFormPairs,\n type FormObject,\n readBody,\n} from \"@crvouga/mockingbird-http-codec\"\nimport { listOperations, type OpenAPIDocument, type Operation } from \"@crvouga/mockingbird-openapi\"\nimport { operationMetadata } from \"@crvouga/mockingbird-openapi-metadata\"\nimport {\n clearNamespace,\n migrateCore,\n resolveSqlite,\n type SqliteClient,\n} from \"@crvouga/mockingbird-sqlite\"\nimport { type Context, Hono } from \"hono\"\nimport { annotateResponse } from \"./journal.js\"\nimport { operationPath } from \"./path.js\"\nimport { recordedIssues } from \"./validation.js\"\n\n/** A rejection carries the issues `bodyIssues` found, for the runtime's log entry. */\nconst withIssues = (request: Request, response: Response): Response => {\n const issues = response.status >= 400 ? recordedIssues(request) : undefined\n return issues && issues.length > 0 ? annotateResponse(response, { issues }) : response\n}\n\n/** Options every provider constructor accepts. */\nexport type APIOptions = {\n /** Sync SQLite client. Defaults to `@crvouga/mockingbird-service-sqlite`. */\n sqlite?: SqliteClient\n /** Clock used for `created`-style fields. Default `Date.now`. */\n now?: () => number\n /**\n * Storage namespace for this instance's records. Instances sharing one SQLite\n * client stay isolated when their namespaces differ. Defaults to the service name.\n */\n namespace?: string\n}\n\nexport type OperationContext = {\n request: Request\n url: URL\n /** Path parameters. */\n params: Record<string, string>\n /** Query string decoded with bracket notation (`created[gte]=1` -> `{ created: { gte: \"1\" } }`). */\n query: FormObject\n body: DecodedBody\n /** Shared SQLite client for this service (already migrated). */\n sqlite: SqliteClient\n /** Service namespace used for records / sequences. */\n namespace: string\n operation: Operation\n /** The vendor contract the service was built from. */\n document: OpenAPIDocument\n now: () => number\n}\n\nexport type OperationHandler = (context: OperationContext) => Promise<Response> | Response\n\nexport type OperationHandlers = Record<string, OperationHandler>\n\n/** Identity helper that keeps handler maps type-checked against a fixed set of operation ids. */\nexport const defineOperations = <Id extends string>(\n handlers: Record<Id, OperationHandler>,\n): Record<Id, OperationHandler> => handlers\n\nexport class OperationRegistryError extends Error {\n constructor(readonly problems: string[]) {\n super(`operation registry is inconsistent:\\n${problems.map((p) => ` - ${p}`).join(\"\\n\")}`)\n this.name = \"OperationRegistryError\"\n }\n}\n\n/**\n * Cross-check handlers against the document: every supported operation needs exactly one\n * handler, no handler may target an unknown or unsupported operation, no duplicate ids.\n */\nexport const verifyOperations = (\n document: OpenAPIDocument,\n handlers: OperationHandlers,\n): string[] => {\n const problems: string[] = []\n const operations = listOperations(document)\n const seen = new Set<string>()\n for (const operation of operations) {\n if (seen.has(operation.operationId))\n problems.push(`duplicate operationId ${operation.operationId}`)\n seen.add(operation.operationId)\n const supported = operationMetadata(operation.operation).supported\n const handler = handlers[operation.operationId]\n if (supported && !handler)\n problems.push(`supported operation ${operation.operationId} has no handler`)\n if (!supported && handler)\n problems.push(`operation ${operation.operationId} is marked unsupported but has a handler`)\n }\n for (const id of Object.keys(handlers)) {\n if (!seen.has(id)) problems.push(`handler ${id} has no OpenAPI operation`)\n }\n return problems\n}\n\nexport type ServiceOptions = {\n document: OpenAPIDocument\n handlers: OperationHandlers\n sqlite: SqliteClient\n /** Namespace isolating this service's records and sequences. */\n namespace: string\n now?: (() => number) | undefined\n /** Response for paths/methods outside the contract. */\n notFound: (request: Request) => Response | Promise<Response>\n /** Response for operations declared but marked `supported: false`. Default: `notFound`. */\n unsupported?: (request: Request, operation: Operation) => Response | Promise<Response>\n /** Convert handler exceptions into a provider-shaped response. */\n onError: (error: unknown, request: Request) => Response | Promise<Response>\n /** Runs before every operation; return a Response to short-circuit (e.g. authentication). */\n before?: (context: OperationContext) => Promise<Response | undefined> | Response | undefined\n}\n\nexport type Service = FetchAPI & {\n app: Hono\n sqlite: SqliteClient\n namespace: string\n /** Delete every record and sequence in the service namespace. */\n reset(): Promise<void>\n}\n\nconst escapePattern = (value: string): string => value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n/** Hono treats `:id:action` as one parameter. Match embedded OpenAPI parameters\n * with a segment regex, then extract only the template's parameter values. */\nconst serviceRoute = (template: string) => {\n const names: string[] = []\n let pattern = \"\",\n end = 0\n for (const match of template.matchAll(/\\{([^}]+)\\}/g)) {\n pattern += `${escapePattern(template.slice(end, match.index))}([^/]+?)`\n const name = match[1]\n if (!name) throw new Error(`Invalid OpenAPI route template: ${template}`)\n names.push(name)\n end = match.index + match[0].length\n }\n pattern += escapePattern(template.slice(end))\n const matcher = new RegExp(`^${pattern}$`)\n const path = template\n .split(\"/\")\n .map((segment, index) => {\n if (!segment.includes(\"{\")) return segment\n const literal = /^\\{([^}]+)\\}$/.exec(segment)\n if (literal) return `:${literal[1]}`\n let expression = \"\",\n offset = 0\n for (const match of segment.matchAll(/\\{[^}]+\\}/g)) {\n expression += `${escapePattern(segment.slice(offset, match.index))}[^/]+?`\n offset = match.index + match[0].length\n }\n expression += escapePattern(segment.slice(offset))\n return `:mockingbirdSegment${index}{${expression}}`\n })\n .join(\"/\")\n return {\n path,\n params: (pathname: string): Record<string, string> => {\n const values = matcher.exec(pathname)\n return Object.fromEntries(\n names.map((name, index) => [name, decodeURIComponent(values?.[index + 1] ?? \"\")]),\n )\n },\n }\n}\n\n/** Static segments before parameters so `/v1/customers/search` beats `/v1/customers/:id`. */\nconst routeOrder = (a: Operation, b: Operation) => {\n const sa = a.path.split(\"/\")\n const sb = b.path.split(\"/\")\n for (let i = 0; i < Math.max(sa.length, sb.length); i++) {\n const x = sa[i] ?? \"\"\n const y = sb[i] ?? \"\"\n const px = x.startsWith(\"{\")\n const py = y.startsWith(\"{\")\n if (px !== py) return px ? 1 : -1\n if (x !== y) return x < y ? -1 : 1\n }\n return 0\n}\n\nconst queryOf = (url: URL): FormObject => decodeFormPairs(url.searchParams.entries())\n\n/**\n * Resolve optional `sqlite`, run core migrations, and return the ready client.\n * Call this from every provider constructor before building state.\n */\nexport const bootSqlite = (sqlite?: SqliteClient): SqliteClient => {\n const client = resolveSqlite(sqlite)\n migrateCore(client)\n return client\n}\n\n/** Build a Fetch-native service whose routes are exactly the document's operations. */\nexport const createService = (options: ServiceOptions): Service => {\n const problems = verifyOperations(options.document, options.handlers)\n if (problems.length > 0) throw new OperationRegistryError(problems)\n migrateCore(options.sqlite)\n const now = options.now ?? (() => Date.now())\n const app = new Hono()\n app.notFound((c) => options.notFound(c.req.raw))\n app.onError((error, c) => options.onError(error, c.req.raw))\n\n const operations = [...listOperations(options.document)].sort(routeOrder)\n for (const operation of operations) {\n const path = operationPath(operation)\n const metadata = operationMetadata(operation.operation)\n const handler = options.handlers[operation.operationId]\n const registeredRoute = serviceRoute(operation.path)\n const route = async (c: Context) => {\n const request = c.req.raw\n if (!metadata.supported || !handler) {\n return options.unsupported\n ? options.unsupported(request, operation)\n : options.notFound(request)\n }\n const url = new URL(request.url)\n const context: OperationContext = {\n request,\n url,\n params: metadata.path\n ? { ...(path.emptyParameter ? { [path.emptyParameter]: \"\" } : {}), ...c.req.param() }\n : registeredRoute.params(url.pathname),\n query: queryOf(url),\n body: await readBody(request),\n sqlite: options.sqlite,\n namespace: options.namespace,\n operation,\n document: options.document,\n now,\n }\n const short = await options.before?.(context)\n return withIssues(request, short ?? (await handler(context)))\n }\n app.on(\n operation.method.toUpperCase(),\n metadata.path ? path.routes : [registeredRoute.path],\n route,\n )\n }\n\n return {\n app,\n sqlite: options.sqlite,\n namespace: options.namespace,\n fetch: async (request) => app.fetch(request),\n reset: async () => {\n clearNamespace(options.sqlite, options.namespace)\n },\n }\n}\n", "import type { RequestLog } from \"./metrics.js\"\nimport type { BodyIssue } from \"./validation.js\"\n\n/** One journal entry: a request log stamped with when (on the mock clock) it was handled. */\nexport type JournalEntry = RequestLog & { at: string }\n\nexport type JournalQuery = {\n /** Only this namespace. Omit for every namespace, oldest first across all of them. */\n namespace?: string\n operationId?: string\n /** Only this HTTP method, case-insensitive. */\n method?: string\n /** Only this exact path. */\n path?: string\n /** Only requests this fault rule answered or shaped. */\n faultId?: string\n status?: number\n /** Only entries at or after this instant (epoch ms). */\n since?: number\n /** At most this many, the most recent kept. */\n limit?: number\n}\n\nexport type Journal = {\n readonly size: number\n record(entry: JournalEntry): void\n list(query?: JournalQuery): JournalEntry[]\n /** Forget one namespace's entries, or every namespace's. */\n clear(namespace?: string): void\n}\n\n/** Default number of entries each namespace keeps. */\nexport const DEFAULT_JOURNAL_SIZE = 1000\n\n/**\n * The last `size` requests per namespace, in a ring buffer: what the mock actually saw,\n * so a test can prove a request arrived (or never did) without reading logs.\n */\nexport const createJournal = (size: number = DEFAULT_JOURNAL_SIZE): Journal => {\n const capacity = Math.max(0, Math.floor(size))\n const rings = new Map<string, { entries: JournalEntry[]; next: number }>()\n let sequence = 0\n const order = new WeakMap<JournalEntry, number>()\n const inOrder = (ring: { entries: JournalEntry[]; next: number }): JournalEntry[] =>\n ring.entries.length < capacity\n ? ring.entries\n : [...ring.entries.slice(ring.next), ...ring.entries.slice(0, ring.next)]\n return {\n size: capacity,\n record(entry) {\n if (capacity === 0) return\n order.set(entry, sequence++)\n let ring = rings.get(entry.namespace)\n if (!ring) {\n ring = { entries: [], next: 0 }\n rings.set(entry.namespace, ring)\n }\n if (ring.entries.length < capacity) ring.entries.push(entry)\n else {\n ring.entries[ring.next] = entry\n ring.next = (ring.next + 1) % capacity\n }\n },\n list(query = {}) {\n const source =\n query.namespace !== undefined\n ? inOrder(rings.get(query.namespace) ?? { entries: [], next: 0 })\n : [...rings.values()]\n .flatMap(inOrder)\n .sort((a, b) => (order.get(a) ?? 0) - (order.get(b) ?? 0))\n const matched = source.filter(\n (entry) =>\n (query.operationId === undefined || entry.operationId === query.operationId) &&\n (query.method === undefined ||\n entry.method.toUpperCase() === query.method.toUpperCase()) &&\n (query.path === undefined || entry.path === query.path) &&\n (query.faultId === undefined || entry.faultId === query.faultId) &&\n (query.status === undefined || entry.status === query.status) &&\n (query.since === undefined || Date.parse(entry.at) >= query.since),\n )\n if (query.limit === undefined) return matched\n // `slice(-0)` is the whole list, so no entries has to be said outright.\n return query.limit <= 0 ? [] : matched.slice(-query.limit)\n },\n clear(namespace) {\n if (namespace === undefined) rings.clear()\n else rings.delete(namespace)\n },\n }\n}\n\n/** What a service knows about a request that the runtime cannot see from outside. */\nexport type ResponseNotes = {\n /** Node upgrade admission: actual wire status; the Fetch carrier remains 200. */\n wireStatus?: 101\n /** Resource ids the handler touched, e.g. `{ userId, orderId }`. */\n ids?: Record<string, string>\n /** Set when the handler created a resource the request referred to but did not exist. */\n adopted?: boolean\n /** The body validation issues behind a rejection; the runtime logs them, never the body. */\n issues?: BodyIssue[]\n}\n\nconst notes = new WeakMap<Response, ResponseNotes>()\n\n/**\n * Attach notes to a response for the request journal and structured log. They travel\n * beside the response, never in it, so nothing the vendor would not send reaches a client.\n */\nexport const annotateResponse = (response: Response, extra: ResponseNotes): Response => {\n const existing = notes.get(response)\n notes.set(response, {\n ...existing,\n ...extra,\n ...(existing?.ids || extra.ids ? { ids: { ...existing?.ids, ...extra.ids } } : {}),\n })\n return response\n}\n\nexport const responseNotes = (response: Response): ResponseNotes | undefined => notes.get(response)\n", "import type { Operation } from \"@crvouga/mockingbird-openapi\"\nimport { operationMetadata } from \"@crvouga/mockingbird-openapi-metadata\"\n\n/** Compile the same explicit terminal-tail contract for dispatch and observation. */\nexport const operationPath = (operation: Operation) => {\n const tail = operationMetadata(operation.operation).path\n if (\n tail &&\n (typeof tail.parameter !== \"string\" ||\n !tail.parameter ||\n !operation.path.endsWith(`/{${tail.parameter}}`) ||\n (tail.allowEmpty !== undefined && typeof tail.allowEmpty !== \"boolean\"))\n )\n throw new Error(`Invalid path metadata for ${operation.operationId}`)\n const segments = operation.path.split(\"/\")\n const ordinary = (segment: string) =>\n segment\n .split(/(\\{[^}]+\\})/)\n .map((part) =>\n /^\\{[^}]+\\}$/.test(part) ? \"[^/]+?\" : part.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"),\n )\n .join(\"\")\n const hono = operation.path.replace(/\\{([^}]+)\\}/g, (_, name: string) =>\n name === tail?.parameter ? `:${name}{.+}` : `:${name}`,\n )\n const prefix = tail ? segments.slice(0, -1).map(ordinary).join(\"/\") : undefined\n const pattern = tail\n ? `${prefix}${tail.allowEmpty ? \"(?:/.*)?\" : \"/.+\"}`\n : segments.map(ordinary).join(\"/\")\n const routes = [hono]\n if (tail?.allowEmpty) {\n const base = operation.path\n .slice(0, -`/{${tail.parameter}}`.length)\n .replace(/\\{([^}]+)\\}/g, \":$1\")\n routes.push(base, `${base}/`)\n }\n return {\n routes,\n pattern: new RegExp(`^${pattern}/?$`),\n emptyParameter: tail?.allowEmpty ? tail.parameter : undefined,\n }\n}\n", "import { mediaTypeOf } from \"@crvouga/mockingbird-http-codec\"\nimport {\n deref,\n resolveSchema,\n type SchemaObject,\n validateValue,\n} from \"@crvouga/mockingbird-openapi\"\nimport type { OperationContext } from \"./service.js\"\n\n/**\n * One problem with a request body, at a dotted path (`patient.address.city`, `items.0.sku`).\n * `kind` is `media_type` when the body is present but its media type is not one the operation\n * accepts (a `415` on most vendors), `syntax` when it could not be decoded, `required` when\n * the operation needs a body and none arrived, and `schema` for a contract violation.\n */\nexport type BodyIssue = {\n path: string\n message: string\n kind?: \"media_type\" | \"syntax\" | \"required\" | \"schema\"\n}\n\n/** What the runtime records about a request the mock rejected: never the body itself. */\nexport type UnsupportedMediaType = {\n /** The request's media type (`text/plain`), or `null` when it sent no `content-type`. */\n mediaType: string | null\n /** The media types the operation's contract accepts, as written (`application/*+json`). */\n accepted: string[]\n}\n\ntype ResolvedRequestBody = {\n required?: boolean\n content?: Record<string, { schema?: SchemaObject }>\n}\n\nconst requestBodyOf = (context: OperationContext): ResolvedRequestBody | undefined => {\n const requestBody = context.operation.operation.requestBody\n return requestBody ? (deref(context.document, requestBody) as ResolvedRequestBody) : undefined\n}\n\n/** `application/*+json` accepts `application/vnd.api+json`; a star on both sides accepts anything. */\nconst mediaTypeMatches = (accepted: string, actual: string): boolean => {\n const pattern = mediaTypeOf(accepted) ?? accepted.toLowerCase()\n if (pattern === actual || pattern === \"*/*\") return true\n const [type, subtype] = pattern.split(\"/\")\n const [actualType, actualSubtype] = actual.split(\"/\")\n if (type !== actualType && type !== \"*\") return false\n if (subtype === undefined || subtype === \"*\") return true\n if (subtype.startsWith(\"*+\")) return actualSubtype?.endsWith(subtype.slice(1)) === true\n return false\n}\n\n/**\n * Which key of the operation's `requestBody.content` the request's `content-type` selects,\n * or undefined when none matches (or the operation declares no body).\n */\nconst acceptedKeyFor = (\n content: Record<string, unknown> | undefined,\n mediaType: string | undefined,\n): string | undefined => {\n if (!content || mediaType === undefined) return undefined\n const keys = Object.keys(content)\n return (\n keys.find((key) => mediaTypeOf(key) === mediaType) ??\n keys.find((key) => mediaTypeMatches(key, mediaType))\n )\n}\n\n/**\n * The reason a request body cannot be read by this operation: its `content-type` is missing\n * or names a media type the contract does not list. Undefined when the operation declares no\n * body, the media type is accepted, or the body is empty (unless `includeEmpty`: ASP.NET\n * Core picks the input formatter from the header before looking at the body, so even an\n * empty body with no `content-type` is 415 there). A JSON body sent as `text/plain` or with\n * no header is the common case: ASP.NET Core, Spring and Rails answer it `415`, and it must\n * never read as \"request body is required\".\n */\nexport const unsupportedMediaType = (\n context: OperationContext,\n options: { includeEmpty?: boolean } = {},\n): UnsupportedMediaType | undefined => {\n if (context.body.kind === \"empty\" && options.includeEmpty !== true) return undefined\n const content = requestBodyOf(context)?.content\n if (!content || Object.keys(content).length === 0) return undefined\n const mediaType = mediaTypeOf(context.request.headers.get(\"content-type\"))\n if (acceptedKeyFor(content, mediaType) !== undefined) return undefined\n return { mediaType: mediaType ?? null, accepted: Object.keys(content) }\n}\n\n/** Issues recorded per request, for the runtime's log entry of a rejected request. */\nconst recorded = new WeakMap<Request, BodyIssue[]>()\n\n/** The issues `bodyIssues` last found for a request, if any. */\nexport const recordedIssues = (request: Request): BodyIssue[] | undefined => recorded.get(request)\n\n/**\n * Validate the decoded body against the operation's `requestBody` schema in the vendor\n * contract, for the media type the request sent (or `contentType` when it sent none that the\n * contract lists). Returns `[]` when valid, or when the operation declares no such body.\n * Services turn the issues into the vendor's own validation error shape; a `media_type`\n * issue is a body the operation cannot read at all (see `unsupportedMediaType`).\n */\nexport const bodyIssues = (\n context: OperationContext,\n contentType = \"application/json\",\n): BodyIssue[] => {\n const issues = findBodyIssues(context, contentType)\n if (issues.length > 0) recorded.set(context.request, issues)\n return issues\n}\n\nconst findBodyIssues = (context: OperationContext, contentType: string): BodyIssue[] => {\n const resolved = requestBodyOf(context)\n if (!resolved) return []\n const unsupported = unsupportedMediaType(context)\n if (unsupported) {\n return [\n {\n path: \"\",\n kind: \"media_type\",\n message:\n unsupported.mediaType === null\n ? \"request body has no content-type\"\n : `request body media type ${unsupported.mediaType} is not supported`,\n },\n ]\n }\n const key =\n acceptedKeyFor(resolved.content, mediaTypeOf(context.request.headers.get(\"content-type\"))) ??\n contentType\n const schema = resolved.content?.[key]?.schema\n if (!schema) return []\n if (context.body.kind === \"invalid\") {\n return [\n {\n path: \"\",\n kind: \"syntax\",\n message: `request body is not valid ${context.body.mediaType}`,\n },\n ]\n }\n const value =\n context.body.kind === \"json\" || context.body.kind === \"form\" || context.body.kind === \"text\"\n ? context.body.value\n : undefined\n if (value === undefined) {\n return resolved.required && context.body.kind === \"empty\"\n ? [{ path: \"\", kind: \"required\", message: \"request body is required\" }]\n : []\n }\n return validateValue(context.document, resolveSchema(context.document, schema), value).map(\n (issue) => ({ path: issue.path.join(\".\"), kind: \"schema\", message: issue.message }),\n )\n}\n\n/** Issues grouped Laravel-style: `{ \"patient.email\": [\"\u2026\"] }`. */\nexport const issuesByField = (issues: BodyIssue[]): Record<string, string[]> => {\n const out: Record<string, string[]> = {}\n for (const issue of issues) {\n const missing = /^missing required property (.+)$/.exec(issue.message)\n const field = missing\n ? [issue.path, missing[1]].filter(Boolean).join(\".\")\n : issue.path || \"body\"\n const message = missing\n ? `The ${field} field is required.`\n : `The ${field} field ${issue.message}.`\n out[field] = [...(out[field] ?? []), message]\n }\n return out\n}\n", "/**\n * The single source of time for a service.\n *\n * Every timestamp a mock writes reads from here, so a suite moves time instead of\n * sleeping: appointment windows, result delays and expiries become reachable in\n * milliseconds. A frozen clock also makes timestamps reproducible from a seed.\n */\nexport type ClockState = {\n /** Current epoch milliseconds. */\n now: number\n /** True while time does not advance on its own. */\n frozen: boolean\n /** Milliseconds a running clock adds to its underlying source. `0` while frozen. */\n offsetMs: number\n}\n\nexport type Clock = {\n now(): number\n /** Pin the clock to an exact instant, keeping it frozen if it already was. */\n set(epochMs: number): void\n /** Move the clock forward, or back with a negative delta. */\n advance(deltaMs: number): void\n /** Stop time at the current instant. */\n freeze(): void\n /** Resume from the current instant. */\n unfreeze(): void\n /** Drop back to the underlying source, live. */\n reset(): void\n state(): ClockState\n}\n\n/** A {@link Clock} over `source` (default `Date.now`), live and unfrozen. */\nexport const createClock = (source: () => number = Date.now): Clock => {\n let offsetMs = 0\n let frozenAt: number | undefined\n const now = () => frozenAt ?? source() + offsetMs\n return {\n now,\n set: (epochMs) => {\n if (frozenAt !== undefined) frozenAt = epochMs\n else offsetMs = epochMs - source()\n },\n advance: (deltaMs) => {\n if (frozenAt !== undefined) frozenAt += deltaMs\n else offsetMs += deltaMs\n },\n freeze: () => {\n frozenAt = now()\n },\n unfreeze: () => {\n if (frozenAt === undefined) return\n offsetMs = frozenAt - source()\n frozenAt = undefined\n },\n reset: () => {\n offsetMs = 0\n frozenAt = undefined\n },\n // A frozen clock does not follow its source, so it has no offset to report.\n state: () => ({\n now: now(),\n frozen: frozenAt !== undefined,\n offsetMs: frozenAt !== undefined ? 0 : offsetMs,\n }),\n }\n}\n\n/** A clock over a base clock, which can tell its own freeze from the base's. */\nexport type DerivedClock = Clock & {\n /** True while this clock itself is frozen, and so no longer follows the base. */\n pinned(): boolean\n /** Put the clock at an instant: pinned there, or following the base from there. */\n place(state: { now: number; pinned: boolean }): void\n}\n\n/**\n * A clock that follows `base` \u2014 its time, its freezes, its jumps \u2014 plus an offset and a\n * freeze of its own. Moving it never moves `base`, so a namespace can travel in time alone.\n * It reports `frozen` while either clock is, and no offset while it stands still. `moved` is\n * called after anything moves it, for whatever keeps a schedule by this clock.\n */\nexport const deriveClock = (base: Clock, moved: () => void = () => {}): DerivedClock => {\n const own = createClock(() => base.now())\n /** Tell whoever is driven by this clock that its time is no longer what it was. */\n const moving =\n <A extends unknown[]>(change: (...args: A) => void) =>\n (...args: A): void => {\n change(...args)\n moved()\n }\n return {\n ...own,\n set: moving(own.set),\n advance: moving(own.advance),\n reset: moving(own.reset),\n state: () => {\n const state = own.state()\n const frozen = state.frozen || base.state().frozen\n return { now: state.now, frozen, offsetMs: frozen ? 0 : state.offsetMs }\n },\n pinned: () => own.state().frozen,\n place: moving(({ now, pinned }) => {\n own.reset()\n // Frozen first, so the instant is set exactly instead of read back from the base.\n if (pinned) own.freeze()\n own.set(now)\n }),\n }\n}\n\n/**\n * Put a clock at an instant, frozen or running. Frozen first, so the instant is set exactly:\n * setting a live clock and freezing it afterwards reads the source again and can land a tick late.\n */\nexport const restoreClock = (clock: Clock, state: { now: number; frozen: boolean }): void => {\n clock.freeze()\n clock.set(state.now)\n if (!state.frozen) clock.unfreeze()\n}\n", "import type { FaultRule } from \"./faults.js\"\n\n/**\n * The admin controls every mock shares, as one document.\n *\n * The same shape is accepted in three places, and means the same thing in each:\n *\n * - at boot: `createRuntime({ adminControls })`, `serve --admin-controls`,\n * `MOCKINGBIRD_ADMIN_CONTROLS`\n * - over HTTP: `PUT /__admin/controls`\n * - per request: the `x-mockingbird-*` headers in {@link CONTROL_HEADERS}\n *\n * Every control is deterministic: given the same seed, clock and requests, a mock answers\n * the same bytes. Nothing here reads the wall clock or `Math.random`.\n */\n\n/** Milliseconds, or a string like `\"250ms\"`, `\"2s\"`, `\"15m\"`, `\"1h\"`, `\"3d\"`. */\nexport type Duration = number | string\n/** Epoch milliseconds, or an ISO-8601 string. */\nexport type Instant = number | string\n\n/** A control that cannot be applied: a bad value, an unknown key, a missing snapshot. */\nexport class ControlError extends RangeError {\n constructor(message: string) {\n super(message)\n this.name = \"ControlError\"\n }\n}\n\nconst UNITS: Record<string, number> = {\n ms: 1,\n s: 1000,\n m: 60_000,\n h: 3_600_000,\n d: 86_400_000,\n}\n\n/** Milliseconds from a number, a numeric string, or a duration like `\"90s\"`, `\"15m\"`, `\"2h\"`. */\nexport const parseDuration = (value: unknown): number | undefined => {\n if (typeof value === \"number\") return Number.isFinite(value) ? value : undefined\n if (typeof value !== \"string\") return undefined\n const match = /^(-?\\d+(?:\\.\\d+)?)\\s*(ms|s|m|h|d)?$/.exec(value.trim())\n if (!match) return undefined\n return Number(match[1]) * (UNITS[match[2] ?? \"ms\"] as number)\n}\n\n/** Epoch milliseconds from a number, a string of digits, or an ISO-8601 string. */\nexport const parseInstant = (value: unknown): number | undefined => {\n if (typeof value === \"number\") return Number.isFinite(value) ? value : undefined\n if (typeof value !== \"string\") return undefined\n const text = value.trim()\n if (/^-?\\d+$/.test(text)) return Number(text)\n const parsed = Date.parse(text)\n return Number.isNaN(parsed) ? undefined : parsed\n}\n\n/** {@link parseDuration}, or a {@link ControlError} naming `label`. Negative only when allowed. */\nexport const durationMs = (value: unknown, label: string, negative = false): number => {\n const parsed = parseDuration(value)\n if (parsed === undefined)\n throw new ControlError(`${label}: expected milliseconds or a duration like \"250ms\" or \"15m\"`)\n if (!negative && parsed < 0) throw new ControlError(`${label}: must not be negative`)\n return parsed\n}\n\n/** {@link parseInstant}, or a {@link ControlError} naming `label`. */\nexport const instantMs = (value: unknown, label: string): number => {\n const parsed = parseInstant(value)\n if (parsed === undefined) throw new ControlError(`${label}: expected epoch ms or ISO-8601`)\n return parsed\n}\n\n/** A string of digits is that number, so `--seed 7`, `{\"seed\": 7}` and a header agree. */\nexport const normalizeSeed = (seed: unknown, label = \"seed\"): number | string => {\n if (typeof seed === \"number\" && Number.isFinite(seed)) return seed\n if (typeof seed === \"string\" && seed !== \"\") return /^\\d+$/.test(seed) ? Number(seed) : seed\n throw new ControlError(`${label}: expected a number or a non-empty string`)\n}\n\nexport type ClockControls = {\n /** Move the clock to this instant. */\n now?: Instant\n /** Stop time. A frozen clock moves only when told to, so timestamps replay exactly. */\n frozen?: boolean\n /**\n * Step the clock forward by this much before every vendor request. With a frozen clock\n * each request still gets its own, reproducible timestamp.\n */\n autoAdvance?: Duration\n}\n\n/** How long a response takes: a fixed delay plus seeded jitter in `[0, jitter]`. */\nexport type LatencyRuleInput = { delay?: Duration; jitter?: Duration }\n\nexport type LatencyControls = LatencyRuleInput & {\n /** Per-operation overrides, keyed by operationId. A bare duration is its `delay`. */\n operations?: Record<string, Duration | LatencyRuleInput>\n}\n\n/** A fault to add: a rule (the id is assigned when omitted), or a named preset with overrides. */\nexport type FaultInput =\n | (Omit<FaultRule, \"id\"> & { id?: string })\n | ({ preset: string } & Partial<FaultRule>)\n\n/** Identifies a {@link SnapshotDocument}. */\nexport const SNAPSHOT_FORMAT = \"mockingbird.snapshot/v1\"\n\n/**\n * A namespace, as portable JSON: what `GET /__admin/snapshots/:id` returns and what\n * `PUT /__admin/snapshots/:id` and the boot `snapshot` control accept. Only `format` and\n * `records` are required, so a hand-written seed file is a valid snapshot.\n */\nexport type SnapshotDocument = {\n format: typeof SNAPSHOT_FORMAT\n /** The service that wrote it. A snapshot is rejected by any other service. */\n service?: string\n /**\n * Stored rows. `seq` orders a collection; omitted, rows keep their listed order. `raw` is\n * the stored text of a row that is not a plain record, and replaces `value` when present.\n */\n records: { collection: string; id: string; seq?: number; value?: unknown; raw?: string }[]\n /** Id counters, so the next generated id continues where the snapshot left off. */\n sequences?: { name: string; kind: string; value: number }[]\n clock?: { now: number; frozen: boolean; autoAdvanceMs?: number }\n seed?: number | string\n /** Positions of the seeded random streams. */\n rng?: { state: number; faults?: number; latency?: number }\n faults?: unknown\n latency?: unknown\n virtualTime?: boolean\n /** Quiescent webhook endpoints, delivery history and fault state. Contains private configuration. */\n webhooks?: unknown\n}\n\n/** Controls for one namespace. */\nexport type NamespaceControls = {\n /** Seeds every random choice: fault rates, jitter, and whatever the service invents. */\n seed?: number | string\n clock?: ClockControls\n /**\n * Spend injected waits (latency, fault delays, timeouts) on the mock clock instead of the\n * wall clock: the request returns at once, the clock has moved, and the journal records\n * the wait exactly. Default `false`: waits are real, so a client's own timeout can fire.\n */\n virtualTime?: boolean\n /** Baseline response time for every vendor request. A bare duration is its `delay`. */\n latency?: Duration | LatencyControls\n faults?: readonly FaultInput[]\n /** Start from this state instead of the service's own seed data. */\n snapshot?: SnapshotDocument\n}\n\n/** {@link NamespaceControls} for every namespace, with per-namespace overrides. */\nexport type MockControls = NamespaceControls & {\n /** Vendor credential \u2192 namespace, for SDKs that cannot send a namespace header. */\n credentials?: Record<string, string>\n /** Overrides for named namespaces. A key given here replaces the shared value. */\n namespaces?: Record<string, NamespaceControls>\n}\n\nconst NAMESPACE_KEYS = new Set([\"seed\", \"clock\", \"virtualTime\", \"latency\", \"faults\", \"snapshot\"])\nconst MOCK_KEYS = new Set([...NAMESPACE_KEYS, \"credentials\", \"namespaces\"])\n/**\n * What `GET /__admin/controls` reports beside the controls themselves. Accepted and ignored,\n * so what was read from one namespace can be applied to another as it is.\n */\nconst REPORTED_KEYS = new Set([\"namespace\", \"snapshots\"])\nconst REPORTED_CLOCK_KEYS = new Set([\"iso\", \"offsetMs\"])\n\n/** What a namespace, a branch, a snapshot and a fault's namespace may be called. */\nexport const KEY_PATTERN = /^[A-Za-z0-9_.-]{1,64}$/\n\nexport const isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n\nconst unknownKeys = (\n value: Record<string, unknown>,\n known: Set<string>,\n label: string,\n reported?: Set<string>,\n): void => {\n for (const key of Object.keys(value)) {\n if (!known.has(key) && !reported?.has(key))\n throw new ControlError(\n `${label}: unknown control ${JSON.stringify(key)}; expected ${[...known].join(\", \")}`,\n )\n }\n}\n\n/** A latency rule in milliseconds. */\nexport type LatencyRule = { delayMs: number; jitterMs: number }\n/** Baseline latency for a namespace, normalized. */\nexport type LatencyState = LatencyRule & { operations: Record<string, LatencyRule> }\n\nconst latencyRule = (value: unknown, label: string): LatencyRule => {\n if (!isRecord(value)) return { delayMs: durationMs(value, label), jitterMs: 0 }\n unknownKeys(value, new Set([\"delay\", \"jitter\", \"delayMs\", \"jitterMs\", \"operations\"]), label)\n return {\n delayMs: durationMs(value.delay ?? value.delayMs ?? 0, `${label}.delay`),\n jitterMs: durationMs(value.jitter ?? value.jitterMs ?? 0, `${label}.jitter`),\n }\n}\n\n/** Validate and normalize a `latency` control. */\nexport const normalizeLatency = (value: unknown, label = \"latency\"): LatencyState => {\n const base = latencyRule(value, label)\n const operations: Record<string, LatencyRule> = {}\n if (isRecord(value) && value.operations !== undefined) {\n if (!isRecord(value.operations))\n throw new ControlError(`${label}.operations: expected an object keyed by operationId`)\n for (const [operationId, rule] of Object.entries(value.operations)) {\n if (isRecord(rule) && rule.operations !== undefined)\n throw new ControlError(`${label}.operations.${operationId}: cannot nest operations`)\n operations[operationId] = latencyRule(rule, `${label}.operations.${operationId}`)\n }\n }\n return { ...base, operations }\n}\n\n/** A clock control, normalized. Absent keys leave that part of the clock alone. */\nexport type ClockPlan = { now?: number; frozen?: boolean; autoAdvanceMs?: number }\n\n/** Validate and normalize a `clock` control. Accepts the `POST /clock` spellings too. */\nexport const normalizeClock = (value: unknown, label = \"clock\"): ClockPlan => {\n if (!isRecord(value)) throw new ControlError(`${label}: expected an object`)\n unknownKeys(\n value,\n new Set([\"now\", \"set\", \"frozen\", \"freeze\", \"autoAdvance\", \"autoAdvanceMs\"]),\n label,\n REPORTED_CLOCK_KEYS,\n )\n const plan: ClockPlan = {}\n const now = value.now ?? value.set\n if (now !== undefined) plan.now = instantMs(now, `${label}.now`)\n const frozen = value.frozen ?? value.freeze\n if (frozen !== undefined) {\n if (typeof frozen !== \"boolean\") throw new ControlError(`${label}.frozen: expected a boolean`)\n plan.frozen = frozen\n }\n const auto = value.autoAdvance ?? value.autoAdvanceMs\n if (auto !== undefined) plan.autoAdvanceMs = durationMs(auto, `${label}.autoAdvance`)\n return plan\n}\n\n/** {@link NamespaceControls} with every value checked and every duration in milliseconds. */\nexport type ControlPlan = {\n seed?: number | string\n clock?: ClockPlan\n virtualTime?: boolean\n latency?: LatencyState\n faults?: readonly FaultInput[]\n snapshot?: SnapshotDocument\n}\n\n/** Check a snapshot document's shape. The runtime checks `service` when it restores one. */\nexport const assertSnapshotDocument = (value: unknown, label = \"snapshot\"): SnapshotDocument => {\n if (!isRecord(value)) throw new ControlError(`${label}: expected a snapshot document`)\n if (value.format !== SNAPSHOT_FORMAT)\n throw new ControlError(`${label}.format: expected ${JSON.stringify(SNAPSHOT_FORMAT)}`)\n if (!Array.isArray(value.records)) throw new ControlError(`${label}.records: expected a list`)\n value.records.forEach((row: unknown, index: number) => {\n if (\n !isRecord(row) ||\n typeof row.collection !== \"string\" ||\n typeof row.id !== \"string\" ||\n (row.value === undefined && typeof row.raw !== \"string\") ||\n (row.seq !== undefined && !Number.isSafeInteger(row.seq))\n )\n throw new ControlError(`${label}.records[${index}]: expected {collection, id, value, seq?}`)\n })\n if (value.sequences !== undefined) {\n if (!Array.isArray(value.sequences))\n throw new ControlError(`${label}.sequences: expected a list`)\n value.sequences.forEach((row: unknown, index: number) => {\n if (\n !isRecord(row) ||\n typeof row.name !== \"string\" ||\n typeof row.kind !== \"string\" ||\n !Number.isSafeInteger(row.value)\n )\n throw new ControlError(`${label}.sequences[${index}]: expected {name, kind, value}`)\n })\n }\n if (value.clock !== undefined) {\n if (\n !isRecord(value.clock) ||\n typeof value.clock.now !== \"number\" ||\n !Number.isFinite(value.clock.now) ||\n typeof value.clock.frozen !== \"boolean\"\n )\n throw new ControlError(`${label}.clock: expected {now, frozen}`)\n }\n return value as SnapshotDocument\n}\n\n/** Validate one namespace's controls. Fault rules are checked when they are added. */\nexport const normalizeControls = (value: unknown, label = \"controls\"): ControlPlan => {\n if (!isRecord(value)) throw new ControlError(`${label}: expected an object`)\n unknownKeys(value, NAMESPACE_KEYS, label, REPORTED_KEYS)\n const plan: ControlPlan = {}\n if (value.seed !== undefined) plan.seed = normalizeSeed(value.seed, `${label}.seed`)\n if (value.clock !== undefined) plan.clock = normalizeClock(value.clock, `${label}.clock`)\n if (value.virtualTime !== undefined) {\n if (typeof value.virtualTime !== \"boolean\")\n throw new ControlError(`${label}.virtualTime: expected a boolean`)\n plan.virtualTime = value.virtualTime\n }\n if (value.latency !== undefined)\n plan.latency = normalizeLatency(value.latency, `${label}.latency`)\n if (value.faults !== undefined) {\n if (!Array.isArray(value.faults) || !value.faults.every(isRecord))\n throw new ControlError(`${label}.faults: expected a list of fault rules`)\n plan.faults = value.faults as FaultInput[]\n }\n if (value.snapshot !== undefined)\n plan.snapshot = assertSnapshotDocument(value.snapshot, `${label}.snapshot`)\n return plan\n}\n\n/** Boot controls, checked once when the runtime is created. */\nexport type BootPlan = {\n shared: ControlPlan\n namespaces: Record<string, ControlPlan>\n credentials: Record<string, string>\n}\n\n/** Validate a boot {@link MockControls} document. */\nexport const normalizeBootControls = (value: unknown, label = \"controls\"): BootPlan => {\n if (value === undefined) return { shared: {}, namespaces: {}, credentials: {} }\n if (!isRecord(value)) throw new ControlError(`${label}: expected an object`)\n unknownKeys(value, MOCK_KEYS, label)\n const { credentials, namespaces, ...shared } = value\n const plan: BootPlan = {\n shared: normalizeControls(shared, label),\n namespaces: {},\n credentials: {},\n }\n if (namespaces !== undefined) {\n if (!isRecord(namespaces)) throw new ControlError(`${label}.namespaces: expected an object`)\n for (const [name, each] of Object.entries(namespaces)) {\n if (!KEY_PATTERN.test(name))\n throw new ControlError(`${label}.namespaces: bad namespace ${JSON.stringify(name)}`)\n plan.namespaces[name] = normalizeControls(each, `${label}.namespaces.${name}`)\n }\n }\n if (credentials !== undefined) {\n if (!isRecord(credentials)) throw new ControlError(`${label}.credentials: expected an object`)\n for (const [credential, namespace] of Object.entries(credentials)) {\n if (typeof namespace !== \"string\" || !KEY_PATTERN.test(namespace))\n throw new ControlError(`${label}.credentials: bad namespace for a credential`)\n plan.credentials[credential] = namespace\n }\n }\n return plan\n}\n\n// \u2500\u2500 request headers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Every header a request can carry a control in. Selection headers pick what a request\n * reads; the rest act exactly like the matching admin call made just before the request.\n */\nexport const CONTROL_HEADERS = {\n namespace: \"x-mockingbird-namespace\",\n adminKey: \"x-mockingbird-admin-key\",\n branch: \"x-mockingbird-branch\",\n at: \"x-mockingbird-at\",\n reset: \"x-mockingbird-reset\",\n restore: \"x-mockingbird-restore\",\n seed: \"x-mockingbird-seed\",\n time: \"x-mockingbird-time\",\n advance: \"x-mockingbird-advance\",\n virtualTime: \"x-mockingbird-virtual-time\",\n fault: \"x-mockingbird-fault\",\n delay: \"x-mockingbird-delay\",\n timeout: \"x-mockingbird-timeout\",\n snapshot: \"x-mockingbird-snapshot\",\n} as const\n\nexport type ControlHeaderName = keyof typeof CONTROL_HEADERS\n\n/**\n * What each control header does, in the order the runtime applies them. This list is the\n * source for `GET /__admin` and is checked against the guide in `docs/ADMIN_CONTROLS.md`.\n */\nexport const CONTROL_HEADER_REFERENCE: readonly {\n header: string\n value: string\n /** `select` picks what is read; `namespace` changes it and persists; `request` is one request. */\n scope: \"select\" | \"namespace\" | \"request\"\n /** Needs `x-mockingbird-admin-key` when the mock has an admin key. */\n guarded: boolean\n summary: string\n}[] = [\n {\n header: CONTROL_HEADERS.namespace,\n value: \"<key>\",\n scope: \"select\",\n guarded: false,\n summary:\n \"Isolation key. Each key has its own records, clock, random streams, faults, latency, journal and snapshots.\",\n },\n {\n header: CONTROL_HEADERS.branch,\n value: \"<name>\",\n scope: \"select\",\n guarded: false,\n summary: \"Read and write a named copy-on-write branch of the namespace's history.\",\n },\n {\n header: CONTROL_HEADERS.at,\n value: \"<checkpoint>\",\n scope: \"select\",\n guarded: false,\n summary: \"Read the namespace as it was at a checkpoint. With a branch, start the branch there.\",\n },\n {\n header: CONTROL_HEADERS.reset,\n value: \"true\",\n scope: \"namespace\",\n guarded: true,\n summary: \"Reset the namespace to its boot state before the request is handled.\",\n },\n {\n header: CONTROL_HEADERS.restore,\n value: \"<snapshot>\",\n scope: \"namespace\",\n guarded: true,\n summary: \"Restore a snapshot before the request is handled.\",\n },\n {\n header: CONTROL_HEADERS.seed,\n value: \"<seed>\",\n scope: \"namespace\",\n guarded: true,\n summary: \"Restart the namespace's random streams from this seed.\",\n },\n {\n header: CONTROL_HEADERS.time,\n value: \"<epoch ms | ISO-8601>\",\n scope: \"namespace\",\n guarded: true,\n summary: \"Freeze the namespace clock at this instant.\",\n },\n {\n header: CONTROL_HEADERS.advance,\n value: \"<duration>\",\n scope: \"namespace\",\n guarded: true,\n summary: \"Move the namespace clock by this much, forward or (negative) back.\",\n },\n {\n header: CONTROL_HEADERS.virtualTime,\n value: \"true | false\",\n scope: \"namespace\",\n guarded: true,\n summary: \"Spend injected waits on the mock clock (true) or the wall clock (false).\",\n },\n {\n header: CONTROL_HEADERS.delay,\n value: \"<duration>\",\n scope: \"request\",\n guarded: true,\n summary: \"Hold this response back this long, on top of the namespace's latency.\",\n },\n {\n header: CONTROL_HEADERS.timeout,\n value: \"<duration>\",\n scope: \"request\",\n guarded: true,\n summary: \"Never answer this request: hold it this long, then drop the connection.\",\n },\n {\n header: CONTROL_HEADERS.fault,\n value: '<status> | drop | <preset> | key=value; \u2026 | {\"status\": 503, \u2026}',\n scope: \"request\",\n guarded: true,\n summary: \"Fault this request only. Stored fault rules are not consulted when it answers.\",\n },\n {\n header: CONTROL_HEADERS.snapshot,\n value: \"<name>\",\n scope: \"namespace\",\n guarded: true,\n summary: \"Snapshot the namespace after the request is handled. Echoed on the response.\",\n },\n]\n\n/** The controls one request carries in its headers, parsed and checked. */\nexport type RequestControls = {\n reset?: true\n restore?: string\n seed?: number | string\n time?: number\n advance?: number\n virtualTime?: boolean\n delay?: number\n timeout?: number\n fault?: Record<string, unknown>\n snapshot?: string\n}\n\nconst flag = (value: string, header: string): boolean => {\n const text = value.trim().toLowerCase()\n if (text === \"true\" || text === \"1\") return true\n if (text === \"false\" || text === \"0\") return false\n throw new ControlError(`${header}: expected true or false`)\n}\n\nconst name = (value: string, header: string): string => {\n const text = value.trim()\n if (!KEY_PATTERN.test(text)) throw new ControlError(`${header}: must match ${KEY_PATTERN}`)\n return text\n}\n\nconst FAULT_PAIRS = new Set([\n \"status\",\n \"delay\",\n \"jitter\",\n \"timeout\",\n \"drop\",\n \"truncate\",\n \"effect\",\n \"preset\",\n \"body\",\n])\n\n/**\n * Parse an `x-mockingbird-fault` value into a fault rule (or preset reference):\n *\n * - `503` \u2014 answer with that status\n * - `drop` \u2014 drop the connection\n * - `rate_limited` \u2014 a preset, by name\n * - `status=503; delay=2s; header.retry-after=5` \u2014 `key=value` pairs\n * - `{\"status\": 503, \"body\": {\u2026}}` \u2014 a rule as JSON\n */\nexport const parseFaultHeader = (\n value: string,\n header: string = CONTROL_HEADERS.fault,\n): Record<string, unknown> => {\n const text = value.trim()\n if (text === \"\") throw new ControlError(`${header}: expected a fault`)\n if (text.startsWith(\"{\")) {\n let parsed: unknown\n try {\n parsed = JSON.parse(text)\n } catch {\n throw new ControlError(`${header}: not valid JSON`)\n }\n if (!isRecord(parsed)) throw new ControlError(`${header}: expected a JSON object`)\n return parsed\n }\n const rule: Record<string, unknown> = {}\n const headers: Record<string, string> = {}\n for (const [index, raw] of text.split(\";\").entries()) {\n const part = raw.trim()\n if (part === \"\") continue\n const equals = part.indexOf(\"=\")\n if (equals < 0) {\n if (index > 0 && part !== \"drop\")\n throw new ControlError(`${header}: expected key=value, got ${JSON.stringify(part)}`)\n if (/^\\d{3}$/.test(part)) rule.status = Number(part)\n else if (part === \"drop\") rule.drop = true\n else rule.preset = name(part, header)\n continue\n }\n const key = part.slice(0, equals).trim().toLowerCase()\n const item = part.slice(equals + 1).trim()\n if (key.startsWith(\"header.\")) headers[key.slice(\"header.\".length)] = item\n else if (!FAULT_PAIRS.has(key))\n throw new ControlError(\n `${header}: unknown key ${JSON.stringify(key)}; expected ${[...FAULT_PAIRS].join(\", \")} or header.<name>`,\n )\n else if (key === \"status\" || key === \"truncate\") {\n if (!/^\\d+$/.test(item)) throw new ControlError(`${header}: ${key} must be a number`)\n rule[key] = Number(item)\n } else if (key === \"drop\") rule.drop = flag(item, `${header} drop`)\n else rule[key] = item\n }\n if (Object.keys(headers).length > 0) rule.headers = headers\n if (Object.keys(rule).length === 0) throw new ControlError(`${header}: expected a fault`)\n return rule\n}\n\nconst GUARDED = CONTROL_HEADER_REFERENCE.filter((each) => each.guarded).map((each) => each.header)\n\n/** Whether a request carries a control that changes the mock or injects a failure. */\nexport const hasGuardedControlHeader = (headers: Headers): boolean =>\n GUARDED.some((header) => headers.has(header))\n\n/** Read a request's control headers. `undefined` when it carries none. Throws {@link ControlError}. */\nexport const parseControlHeaders = (headers: Headers): RequestControls | undefined => {\n if (!hasGuardedControlHeader(headers)) return undefined\n const controls: RequestControls = {}\n const read = (key: ControlHeaderName) => headers.get(CONTROL_HEADERS[key])\n const reset = read(\"reset\")\n if (reset !== null && flag(reset, CONTROL_HEADERS.reset)) controls.reset = true\n const restore = read(\"restore\")\n if (restore !== null) controls.restore = name(restore, CONTROL_HEADERS.restore)\n const seed = read(\"seed\")\n if (seed !== null) controls.seed = normalizeSeed(seed.trim(), CONTROL_HEADERS.seed)\n const time = read(\"time\")\n if (time !== null) controls.time = instantMs(time, CONTROL_HEADERS.time)\n const advance = read(\"advance\")\n if (advance !== null) controls.advance = durationMs(advance, CONTROL_HEADERS.advance, true)\n const virtualTime = read(\"virtualTime\")\n if (virtualTime !== null) controls.virtualTime = flag(virtualTime, CONTROL_HEADERS.virtualTime)\n const delay = read(\"delay\")\n if (delay !== null) controls.delay = durationMs(delay, CONTROL_HEADERS.delay)\n const timeout = read(\"timeout\")\n if (timeout !== null) controls.timeout = durationMs(timeout, CONTROL_HEADERS.timeout)\n const fault = read(\"fault\")\n if (fault !== null) controls.fault = parseFaultHeader(fault)\n const snapshot = read(\"snapshot\")\n if (snapshot !== null) controls.snapshot = name(snapshot, CONTROL_HEADERS.snapshot)\n return controls\n}\n\n/** What {@link controlHeaders} turns into request headers. */\nexport type ControlHeaderInput = {\n namespace?: string\n adminKey?: string\n branch?: string\n at?: string\n reset?: boolean\n restore?: string\n seed?: number | string\n time?: Instant | Date\n advance?: Duration\n virtualTime?: boolean\n delay?: Duration\n timeout?: Duration\n /** A status, `\"drop\"`, a preset name, or a fault rule. */\n fault?: number | string | Record<string, unknown>\n snapshot?: string\n}\n\n/**\n * Build the request headers for a set of controls, to spread into a `fetch` or hand to an\n * SDK's default headers. Values are checked, so a typo fails here and not as a `400` later.\n */\nexport const controlHeaders = (input: ControlHeaderInput): Record<string, string> => {\n const headers: Record<string, string> = {}\n const set = (key: ControlHeaderName, value: string) => {\n headers[CONTROL_HEADERS[key]] = value\n }\n if (input.namespace !== undefined) set(\"namespace\", name(input.namespace, \"namespace\"))\n if (input.adminKey !== undefined) set(\"adminKey\", input.adminKey)\n if (input.branch !== undefined) set(\"branch\", name(input.branch, \"branch\"))\n if (input.at !== undefined) set(\"at\", input.at)\n if (input.reset === true) set(\"reset\", \"true\")\n if (input.restore !== undefined) set(\"restore\", name(input.restore, \"restore\"))\n if (input.seed !== undefined) set(\"seed\", String(normalizeSeed(input.seed)))\n if (input.time !== undefined) {\n const time = input.time instanceof Date ? input.time.getTime() : input.time\n set(\"time\", new Date(instantMs(time, \"time\")).toISOString())\n }\n if (input.advance !== undefined)\n set(\"advance\", String(durationMs(input.advance, \"advance\", true)))\n if (input.virtualTime !== undefined) set(\"virtualTime\", String(input.virtualTime))\n if (input.delay !== undefined) set(\"delay\", String(durationMs(input.delay, \"delay\")))\n if (input.timeout !== undefined) set(\"timeout\", String(durationMs(input.timeout, \"timeout\")))\n if (input.fault !== undefined) {\n const fault =\n typeof input.fault === \"object\" ? JSON.stringify(input.fault) : String(input.fault)\n parseFaultHeader(fault, \"fault\")\n set(\"fault\", fault)\n }\n if (input.snapshot !== undefined) set(\"snapshot\", name(input.snapshot, \"snapshot\"))\n return headers\n}\n", "/**\n * Seeded pseudo-random numbers, so anything a mock invents \u2014 ids, jitter, which\n * request a percentage fault hits \u2014 is reproducible from a seed.\n *\n * mulberry32: small, fast, and stable across runtimes, which matters more here\n * than statistical quality.\n */\nexport type Rng = {\n /** Next value in `[0, 1)`. */\n next(): number\n /** Next integer in `[min, max]`. */\n int(min: number, max: number): number\n /** Restart the stream from its seed. */\n reset(): void\n /** Serializable engine state used by deterministic checkpoints. */\n state(): number\n /** Restore a state previously returned by {@link state}. */\n setState(state: number): void\n /** Restart the stream from a new seed. `reset` then returns to this seed. */\n reseed(seed: number | string): void\n /** The seed the stream currently starts from. */\n readonly seed: number\n}\n\n/** Hash an arbitrary string into a 32-bit seed, so callers can seed by name. */\nexport const seedFrom = (value: string): number => {\n let hash = 2166136261\n for (let i = 0; i < value.length; i++) {\n hash ^= value.charCodeAt(i)\n hash = Math.imul(hash, 16777619)\n }\n return hash >>> 0\n}\n\nexport const createRng = (seed: number | string = 0): Rng => {\n const toNumeric = (value: number | string) =>\n typeof value === \"string\" ? seedFrom(value) : value >>> 0\n let numeric = toNumeric(seed)\n let state = numeric\n const next = () => {\n state = (state + 0x6d2b79f5) >>> 0\n let t = state\n t = Math.imul(t ^ (t >>> 15), t | 1)\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61)\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n }\n return {\n next,\n int: (min, max) => min + Math.floor(next() * (max - min + 1)),\n reset: () => {\n state = numeric\n },\n state: () => state,\n setState: (next) => {\n if (!Number.isSafeInteger(next) || next < 0 || next > 0xffffffff) {\n throw new RangeError(\"rng state must be an unsigned 32-bit integer\")\n }\n state = next >>> 0\n },\n reseed: (next) => {\n numeric = toNumeric(next)\n state = numeric\n },\n get seed() {\n return numeric\n },\n }\n}\n", "import {\n ControlError,\n type Duration,\n durationMs,\n type Instant,\n isRecord,\n KEY_PATTERN,\n parseDuration,\n parseInstant,\n} from \"./controls.js\"\nimport { createRng, type Rng } from \"./rng.js\"\n\n/**\n * A deliberate failure injected in front of an operation.\n *\n * This is how a suite reaches the vendor's failure modes without the vendor: the\n * quota error that only appears when a shared sandbox is full, the 429 that only\n * appears under load, the 5xx that proves a retry path works.\n *\n * A rule has three parts. What it **matches** (`operationId`, `method`, `path`, \u2026), **when**\n * it fires among the matching requests (`after`, `every`, `count`, `rate`, `from`, `until`),\n * and what it **does** (`status`, `delay`, `timeout`, `drop`, `truncate`, `effect`).\n */\nexport type FaultRule = {\n /** Stable id, so a suite can retire exactly the rule it added. Unique within a namespace. */\n id: string\n\n /** Fault only this operation. Omit to match every operation. */\n operationId?: string\n /** Fault only this HTTP method, case-insensitive. Omit to match every method. */\n method?: string\n /** Fault only this exact path. */\n path?: string\n /** Fault only paths starting with this prefix. Omit to match every path. */\n pathPrefix?: string\n /** Fault only paths matching this regular expression (JavaScript syntax, unanchored). */\n pathPattern?: string\n /** Fault only requests carrying these headers. `\"*\"` matches any value. */\n requestHeaders?: Record<string, string>\n /** Fault only requests carrying these query parameters. `\"*\"` matches any value. */\n query?: Record<string, string>\n /**\n * Fault only requests whose JSON body carries these fields. Each key is a dotted path into\n * the parsed body (`\"patient_details.email\"`; a number steps into an array, `\"items.0.sku\"`)\n * and each value is what the field must equal: a string, number, boolean or `null`, compared\n * strictly (`3` is not `\"3\"`). `\"*\"` matches any value that is present. A request whose body\n * is missing, is not JSON, or is not a JSON object never matches. Not `body`, which is the\n * response a rule injects.\n */\n requestBody?: Record<string, RequestBodyValue>\n /**\n * Fault only this namespace. Omit (or `\"*\"`) to fault every namespace \u2014 which is what\n * an in-process caller usually wants, and what a parallel worker usually does not:\n * rules added through `POST /__admin/faults` default to the calling namespace.\n */\n namespace?: string\n\n /** Let this many matching requests through first. */\n after?: number\n /** Then fault only every nth matching request: `3` faults the 3rd, 6th, 9th. */\n every?: number\n /** Retire the rule after this many faults. Omit to keep it until removed. */\n count?: number\n /** Fault this fraction of the remaining requests, `0`\u2013`1`, drawn from the seed. Default `1`. */\n rate?: number\n /**\n * Fault only from this instant on the namespace clock. A duration (`\"5m\"`) counts from the\n * clock when the rule was added. Listed as epoch ms.\n */\n from?: Instant | Duration\n /** Stop faulting at this instant on the namespace clock. A duration counts from when added. */\n until?: Instant | Duration\n\n /**\n * Status of the injected response. Omit for a rule that only delays, times out, drops,\n * truncates, or switches on an `effect`: the request then still reaches the service.\n */\n status?: number\n /** Response body, serialized as JSON. A string is sent as-is. */\n body?: unknown\n /** Response headers. */\n headers?: Record<string, string>\n /** Hold the response back this long. Listed as `delayMs`. */\n delay?: Duration\n /** `delay`, in milliseconds. */\n delayMs?: number\n /** Alias of `delayMs`. */\n latencyMs?: number\n /** Extra seeded delay in `[0, jitter]`. Listed as `jitterMs`. */\n jitter?: Duration\n jitterMs?: number\n /**\n * Never answer: hold the request this long, then drop the connection. Listed as\n * `timeoutMs`. With virtual time the wait is spent on the mock clock.\n */\n timeout?: Duration\n timeoutMs?: number\n /**\n * Drop the connection instead of answering: an in-process `fetch` rejects with a\n * `TypeError`, and a served mock destroys the socket. Models \"unknown outcome\" failures.\n */\n drop?: boolean\n /**\n * Cut the response body off after this many bytes: the status and headers arrive, then\n * the connection dies mid-body.\n */\n truncate?: number\n /**\n * A named service behaviour to switch on for the matching request instead of (or\n * before) a canned response, e.g. `created_but_500` or `numeric_tracking_id`. Services\n * read it with `faultEffects(request)`.\n */\n effect?: string\n /** Parameters for `effect`. */\n params?: Record<string, unknown>\n /** The preset this rule was expanded from, if any. */\n fromPreset?: string\n}\n\n/** What a field of the request body must equal in {@link FaultRule.requestBody}. */\nexport type RequestBodyValue = string | number | boolean | null\n\n/** A fault that fired for one request. */\nexport type FaultHit = {\n id: string\n /** The injected response; absent when the rule only delays, drops, or sets an effect. */\n response?: Response\n drop?: boolean\n /** Set with `drop` when the rule held the request for its `timeout` first. */\n timeout?: boolean\n /** Bytes of response body to let through before the connection dies. */\n truncate?: number\n effect?: { name: string; params: Record<string, unknown> }\n}\n\n/**\n * A named, documented fault a suite switches on by name\n * (`POST /__admin/faults {\"preset\": \"rate_limited\"}`): one or more rules, and optionally a\n * webhook delivery fault.\n */\nexport type FaultPreset = {\n description: string\n rules?: Omit<FaultRule, \"id\">[]\n webhook?: { mode: \"duplicate\" | \"reorder\" | \"drop\"; count?: number }\n}\n\n/**\n * Presets every mock answers to, so a suite uses one vocabulary across vendors. A service\n * preset of the same name replaces the standard one with the vendor's own error body.\n */\nexport const STANDARD_FAULT_PRESETS: Record<string, FaultPreset> = {\n server_error: {\n description: \"The vendor answers 500.\",\n rules: [{ status: 500 }],\n },\n bad_gateway: {\n description: \"A proxy in front of the vendor answers 502.\",\n rules: [{ status: 502 }],\n },\n unavailable: {\n description: \"The vendor is down: 503 with retry-after.\",\n rules: [{ status: 503, headers: { \"retry-after\": \"1\" } }],\n },\n gateway_timeout: {\n description: \"A proxy gives up on the vendor: 504.\",\n rules: [{ status: 504 }],\n },\n rate_limited: {\n description: \"Too many requests: 429 with retry-after.\",\n rules: [{ status: 429, headers: { \"retry-after\": \"1\" } }],\n },\n unauthorized: {\n description: \"The credential is rejected: 401.\",\n rules: [{ status: 401 }],\n },\n forbidden: {\n description: \"The credential lacks permission: 403.\",\n rules: [{ status: 403 }],\n },\n slow: {\n description: \"Every response takes two more seconds.\",\n rules: [{ delayMs: 2_000 }],\n },\n timeout: {\n description:\n \"The vendor never answers: the request hangs 30 seconds, then the connection drops.\",\n rules: [{ timeoutMs: 30_000 }],\n },\n connection_reset: {\n description: \"The connection dies before any response.\",\n rules: [{ drop: true }],\n },\n truncated_response: {\n description: \"The response starts, then the connection dies mid-body.\",\n rules: [{ truncate: 0 }],\n },\n flaky: {\n description: \"Half of the requests answer 503, chosen by the seed.\",\n rules: [{ status: 503, rate: 0.5 }],\n },\n}\n\n/**\n * Body of `GET /__admin/faults/presets`.\n * `presets` is a list of named presets. A record keyed by name is not this type:\n * the admin page maps the list.\n */\nexport type FaultPresetList = {\n presets: readonly { name: string }[]\n}\n\ntype _AssertFaultPresetList<T extends FaultPresetList> = T\n// @ts-expect-error presets is a list of { name }, not a record keyed by name\ntype _RecordIsNotAPresetList = _AssertFaultPresetList<{ presets: Record<string, { name: string }> }>\n\n/** What a request looks like to the fault matcher. */\nexport type FaultCandidate = {\n operationId: string | undefined\n method: string\n path: string\n namespace: string\n /** Request headers and query, for rules that match on them. */\n headers?: Headers\n query?: URLSearchParams\n /**\n * The request body parsed as JSON, read only when a rule matches on `requestBody`. Resolve\n * `undefined` for a body that is missing or not JSON. It must leave the request readable.\n */\n readJson?: () => Promise<unknown>\n /** The namespace clock, for `from` / `until`. Rules with a window are skipped without it. */\n now?: number\n /** How to spend a delay for this request. Default: the registry's own sleep. */\n wait?: (ms: number) => Promise<void>\n}\n\n/** A stored rule and how often it was consulted. */\nexport type FaultListing = FaultRule & {\n /** Faults left before the rule retires. `null` when it has no `count`. */\n remaining: number | null\n /** Times the rule faulted a request. */\n hits: number\n /** Requests that matched the rule, faulted or not. */\n seen: number\n}\n\n/** A namespace's own rules, with their counters, in the order they are tried. */\nexport type FaultSnapshot = {\n /**\n * `position` is how many `\"*\"` rules are tried before the rule, which is what its place\n * in the order means to a request and holds in any process.\n */\n rules: (FaultListing & { position?: number })[]\n /** How many `fault_<n>` ids the namespace has handed out. */\n nextId?: number\n}\n\nexport type FaultRegistry = {\n snapshot(namespace: string): FaultSnapshot\n /** Add a rule, or replace the rule with the same id in the same namespace. */\n add(rule: FaultRule): FaultRule\n /** The next unused `fault_<n>` id in `namespace`. */\n nextId(namespace: string): string\n /** Every rule, or the rules a namespace's requests can hit: its own and the global ones. */\n list(namespace?: string): FaultListing[]\n get(id: string, namespace?: string): FaultListing | undefined\n /** Remove a rule by id: from `namespace` (its own, then a global one), or wherever it is. */\n remove(id: string, namespace?: string): boolean\n /** Remove every rule, or one namespace's own rules. */\n clear(namespace?: string): void\n /** Replace a namespace's own rules with a snapshot's, wherever the snapshot was taken. */\n restore(namespace: string, state: FaultSnapshot): void\n /**\n * Every fault this request should get, in rule order, stopping at the first that answers\n * or drops (effect-only and delay-only rules let later rules match too). Consumes one of\n * each matching rule's remaining uses.\n */\n take(candidate: FaultCandidate): Promise<FaultHit[]>\n /**\n * Fire these rules at one request without storing them: no matching, no schedule, in order,\n * stopping at the first that answers or drops. Jitter draws from the namespace's stream.\n */\n fire(rules: readonly FaultRule[], candidate: FaultCandidate): Promise<FaultHit[]>\n}\n\n/** The namespace of a rule that faults every namespace. */\nconst GLOBAL = \"*\"\n\nconst RULE_KEYS = new Set([\n \"id\",\n \"operationId\",\n \"method\",\n \"path\",\n \"pathPrefix\",\n \"pathPattern\",\n \"requestHeaders\",\n \"query\",\n \"requestBody\",\n \"namespace\",\n \"after\",\n \"every\",\n \"count\",\n \"rate\",\n \"from\",\n \"until\",\n \"status\",\n \"body\",\n \"headers\",\n \"delay\",\n \"delayMs\",\n \"latencyMs\",\n \"jitter\",\n \"jitterMs\",\n \"timeout\",\n \"timeoutMs\",\n \"drop\",\n \"truncate\",\n \"effect\",\n \"params\",\n \"fromPreset\",\n])\n/** Counters a listed rule carries. Accepted and ignored, so a listing can be applied again. */\nconst LISTING_KEYS = new Set([\"remaining\", \"hits\", \"seen\"])\n\nconst stringMap = (value: unknown, label: string): Record<string, string> => {\n if (!isRecord(value) || !Object.values(value).every((each) => typeof each === \"string\"))\n throw new ControlError(`${label}: expected an object of strings`)\n return value as Record<string, string>\n}\n\nconst requestBodyMap = (value: unknown): Record<string, RequestBodyValue> => {\n if (!isRecord(value)) throw new ControlError(\"fault.requestBody: expected an object\")\n for (const [path, expected] of Object.entries(value)) {\n if (path === \"\" || path.split(\".\").includes(\"\"))\n throw new ControlError(`fault.requestBody: ${JSON.stringify(path)} is not a dotted path`)\n const scalar =\n expected === null ||\n typeof expected === \"string\" ||\n typeof expected === \"boolean\" ||\n (typeof expected === \"number\" && Number.isFinite(expected))\n if (!scalar)\n throw new ControlError(\n `fault.requestBody.${path}: expected a string, number, boolean or null`,\n )\n }\n return value as Record<string, RequestBodyValue>\n}\n\nconst count = (value: unknown, label: string, min: number): number => {\n if (typeof value !== \"number\" || !Number.isSafeInteger(value) || value < min)\n throw new ControlError(`${label}: expected an integer of at least ${min}`)\n return value\n}\n\n/** An instant, or a duration counted from `now`. A bare number is always an instant. */\nconst windowEdge = (value: unknown, label: string, now: number | undefined): number => {\n if (typeof value === \"string\" && /[a-z]\\s*$/i.test(value) && !/[T:Z]/.test(value)) {\n const relative = parseDuration(value)\n if (relative !== undefined) {\n if (now === undefined) throw new ControlError(`${label}: a duration needs a clock`)\n return now + relative\n }\n }\n const instant = parseInstant(value)\n if (instant === undefined)\n throw new ControlError(`${label}: expected epoch ms, ISO-8601, or a duration like \"5m\"`)\n return instant\n}\n\n/** Whether a rule does anything at all when it fires. */\nexport const faultHasAction = (rule: Partial<FaultRule>): boolean =>\n rule.status !== undefined ||\n (rule.delayMs ?? 0) > 0 ||\n (rule.jitterMs ?? 0) > 0 ||\n rule.timeoutMs !== undefined ||\n rule.drop === true ||\n rule.truncate !== undefined ||\n rule.effect !== undefined\n\n/**\n * Check a fault rule and put it in its stored form: durations in milliseconds\n * (`delayMs`, `jitterMs`, `timeoutMs`), windows as epoch ms. Throws {@link ControlError}.\n *\n * `strict` rejects unknown keys, so a typo in a request body is an error and not a rule\n * that silently never matches.\n */\nexport const normalizeFault = (\n input: unknown,\n context: { id?: string; namespace?: string; now?: number; strict?: boolean } = {},\n): FaultRule => {\n if (!isRecord(input)) throw new ControlError(\"fault: expected an object\")\n if (context.strict) {\n for (const key of Object.keys(input)) {\n if (!RULE_KEYS.has(key) && !LISTING_KEYS.has(key))\n throw new ControlError(`fault: unknown field ${JSON.stringify(key)}`)\n }\n }\n const id = input.id ?? context.id\n if (typeof id !== \"string\" || id === \"\") throw new ControlError(\"fault.id: expected a string\")\n const rule: FaultRule = { id }\n for (const key of [\n \"operationId\",\n \"method\",\n \"path\",\n \"pathPrefix\",\n \"effect\",\n \"fromPreset\",\n ] as const) {\n const value = input[key]\n if (value === undefined) continue\n if (typeof value !== \"string\") throw new ControlError(`fault.${key}: expected a string`)\n rule[key] = value\n }\n if (input.pathPattern !== undefined) {\n if (typeof input.pathPattern !== \"string\")\n throw new ControlError(\"fault.pathPattern: expected a string\")\n try {\n new RegExp(input.pathPattern)\n } catch {\n throw new ControlError(\"fault.pathPattern: not a valid regular expression\")\n }\n rule.pathPattern = input.pathPattern\n }\n if (input.requestHeaders !== undefined)\n rule.requestHeaders = Object.fromEntries(\n Object.entries(stringMap(input.requestHeaders, \"fault.requestHeaders\")).map(([k, v]) => [\n k.toLowerCase(),\n v,\n ]),\n )\n if (input.query !== undefined) rule.query = stringMap(input.query, \"fault.query\")\n if (input.requestBody !== undefined) rule.requestBody = requestBodyMap(input.requestBody)\n const namespace = input.namespace ?? context.namespace\n if (namespace !== undefined) {\n // A rule for a namespace that cannot exist would be stored and never fire.\n if (typeof namespace !== \"string\" || (namespace !== GLOBAL && !KEY_PATTERN.test(namespace)))\n throw new ControlError(`fault.namespace: expected \"*\" or a key matching ${KEY_PATTERN}`)\n rule.namespace = namespace\n }\n if (input.after !== undefined) rule.after = count(input.after, \"fault.after\", 0)\n if (input.every !== undefined) rule.every = count(input.every, \"fault.every\", 1)\n if (input.count !== undefined) rule.count = count(input.count, \"fault.count\", 0)\n if (input.rate !== undefined) {\n if (typeof input.rate !== \"number\" || !(input.rate >= 0 && input.rate <= 1))\n throw new ControlError(\"fault.rate: expected a number from 0 to 1\")\n rule.rate = input.rate\n }\n if (input.from !== undefined) rule.from = windowEdge(input.from, \"fault.from\", context.now)\n if (input.until !== undefined) rule.until = windowEdge(input.until, \"fault.until\", context.now)\n if (input.status !== undefined) {\n if (\n typeof input.status !== \"number\" ||\n !Number.isInteger(input.status) ||\n input.status < 200 ||\n input.status > 599\n )\n throw new ControlError(\"fault.status: expected an HTTP status from 200 to 599\")\n rule.status = input.status\n }\n if (input.body !== undefined) rule.body = input.body\n if (input.headers !== undefined) rule.headers = stringMap(input.headers, \"fault.headers\")\n const delay = input.delay ?? input.delayMs ?? input.latencyMs\n if (delay !== undefined) rule.delayMs = durationMs(delay, \"fault.delay\")\n const jitter = input.jitter ?? input.jitterMs\n if (jitter !== undefined) rule.jitterMs = durationMs(jitter, \"fault.jitter\")\n const timeout = input.timeout ?? input.timeoutMs\n if (timeout !== undefined) rule.timeoutMs = durationMs(timeout, \"fault.timeout\")\n if (input.drop !== undefined) {\n if (typeof input.drop !== \"boolean\") throw new ControlError(\"fault.drop: expected a boolean\")\n if (input.drop) rule.drop = true\n }\n if (input.truncate !== undefined) rule.truncate = count(input.truncate, \"fault.truncate\", 0)\n if (input.params !== undefined) {\n if (!isRecord(input.params)) throw new ControlError(\"fault.params: expected an object\")\n rule.params = input.params\n }\n return rule\n}\n\ntype Entry = {\n rule: FaultRule\n scope: string\n remaining: number | null\n hits: number\n seen: number\n pattern: RegExp | undefined\n}\n\nconst scopeOf = (rule: FaultRule): string =>\n rule.namespace === undefined || rule.namespace === GLOBAL ? GLOBAL : rule.namespace\n\nconst matchesAll = (\n wanted: Record<string, string> | undefined,\n read: (name: string) => string | null | undefined,\n): boolean => {\n if (!wanted) return true\n for (const [key, value] of Object.entries(wanted)) {\n const actual = read(key)\n if (actual === null || actual === undefined) return false\n if (value !== \"*\" && actual !== value) return false\n }\n return true\n}\n\n/** The value at a dotted path of a parsed JSON body; `undefined` when any step is missing. */\nconst field = (body: unknown, path: string): unknown => {\n let at = body\n for (const step of path.split(\".\")) {\n if (Array.isArray(at)) {\n if (!/^(0|[1-9]\\d*)$/.test(step)) return undefined\n at = at[Number(step)]\n } else if (isRecord(at) && Object.hasOwn(at, step)) at = at[step]\n else return undefined\n }\n return at\n}\n\n/** Whether the parsed body has every field `wanted` names. Only a JSON object can. */\nconst bodyMatches = (wanted: Record<string, RequestBodyValue>, body: unknown): boolean => {\n if (!isRecord(body)) return false\n for (const [path, expected] of Object.entries(wanted)) {\n const actual = field(body, path)\n if (actual === undefined) return false\n if (expected !== \"*\" && actual !== expected) return false\n }\n return true\n}\n\nconst matches = (entry: Entry, candidate: FaultCandidate, body: { value: unknown }): boolean => {\n const { rule } = entry\n if (entry.scope !== GLOBAL && entry.scope !== candidate.namespace) return false\n if (rule.operationId !== undefined && rule.operationId !== candidate.operationId) return false\n if (rule.method !== undefined && rule.method.toUpperCase() !== candidate.method.toUpperCase()) {\n return false\n }\n if (rule.path !== undefined && rule.path !== candidate.path) return false\n if (rule.pathPrefix !== undefined && !candidate.path.startsWith(rule.pathPrefix)) return false\n if (entry.pattern && !entry.pattern.test(candidate.path)) return false\n if (!matchesAll(rule.requestHeaders, (name) => candidate.headers?.get(name))) return false\n if (!matchesAll(rule.query, (name) => candidate.query?.get(name))) return false\n if (rule.requestBody && !bodyMatches(rule.requestBody, body.value)) return false\n if (rule.from !== undefined || rule.until !== undefined) {\n if (candidate.now === undefined) return false\n if (rule.from !== undefined && candidate.now < (rule.from as number)) return false\n if (rule.until !== undefined && candidate.now >= (rule.until as number)) return false\n }\n return true\n}\n\n/** The response a rule with a `status` answers with. */\nexport const faultResponse = (rule: FaultRule): Response => {\n const status = rule.status ?? 500\n const headers = { \"content-type\": \"application/json\", ...rule.headers }\n if (typeof rule.body === \"string\") return new Response(rule.body, { status, headers })\n if (rule.body === null) return new Response(null, { status, headers: rule.headers ?? {} })\n const body = rule.body === undefined ? { detail: \"Injected by Mockingbird\" } : rule.body\n return new Response(JSON.stringify(body), { status, headers })\n}\n\nconst listing = (entry: Entry): FaultListing => ({\n ...entry.rule,\n remaining: entry.remaining,\n hits: entry.hits,\n seen: entry.seen,\n})\n\n/**\n * Rules are matched in the order they were added, so a narrow rule added first\n * wins over a later catch-all. `rate` and `jitter` draw from a seeded stream per namespace,\n * so a partial-failure run replays identically whatever other namespaces are doing.\n *\n * `random` is that stream: a function from namespace to stream, owned by the caller, which\n * the registry draws from and never seeds or rewinds. A single stream is accepted too, for a\n * registry used on its own: it serves `default`, and every other namespace gets a stream of\n * its own from the same seed.\n */\nexport const createFaultRegistry = (\n random: Rng | ((namespace: string) => Rng) = createRng(0),\n sleep: (ms: number) => Promise<void> = (ms) => new Promise((resolve) => setTimeout(resolve, ms)),\n): FaultRegistry => {\n const entries: Entry[] = []\n const counters = new Map<string, number>()\n const own = new Map<string, Rng>()\n const stream =\n typeof random === \"function\"\n ? random\n : (namespace: string): Rng => {\n if (namespace === \"default\") return random\n let found = own.get(namespace)\n if (!found) {\n found = createRng(random.seed)\n own.set(namespace, found)\n }\n return found\n }\n const toEntry = (input: FaultRule, previous?: Partial<Entry>): Entry => {\n const rule = normalizeFault(input)\n return {\n rule,\n scope: scopeOf(rule),\n remaining: previous?.remaining !== undefined ? previous.remaining : (rule.count ?? null),\n hits: previous?.hits ?? 0,\n seen: previous?.seen ?? 0,\n pattern: rule.pathPattern !== undefined ? new RegExp(rule.pathPattern) : undefined,\n }\n }\n const find = (id: string, namespace?: string): number => {\n if (namespace === undefined) return entries.findIndex((e) => e.rule.id === id)\n const mine = entries.findIndex((e) => e.rule.id === id && e.scope === namespace)\n return mine >= 0 ? mine : entries.findIndex((e) => e.rule.id === id && e.scope === GLOBAL)\n }\n const drop = (namespace: string): void => {\n for (let i = entries.length - 1; i >= 0; i--)\n if (entries[i]?.scope === namespace) entries.splice(i, 1)\n }\n return {\n snapshot(namespace) {\n const rules: FaultSnapshot[\"rules\"] = []\n let globals = 0\n for (const entry of entries) {\n if (entry.scope === GLOBAL) globals++\n else if (entry.scope === namespace) rules.push({ ...listing(entry), position: globals })\n }\n return { rules: structuredClone(rules), nextId: counters.get(namespace) ?? 0 }\n },\n add(input) {\n const entry = toEntry(input)\n const existing = entries.findIndex(\n (e) => e.rule.id === entry.rule.id && e.scope === entry.scope,\n )\n if (existing >= 0) entries[existing] = entry\n else entries.push(entry)\n return entry.rule\n },\n nextId(namespace) {\n let next = counters.get(namespace) ?? 0\n let id: string\n do {\n next++\n id = `fault_${next}`\n } while (entries.some((e) => e.rule.id === id && e.scope === namespace))\n counters.set(namespace, next)\n return id\n },\n list: (namespace) =>\n entries\n .filter((e) => namespace === undefined || e.scope === namespace || e.scope === GLOBAL)\n .map(listing),\n get(id, namespace) {\n const entry = entries[find(id, namespace)]\n return entry ? listing(entry) : undefined\n },\n remove(id, namespace) {\n const index = find(id, namespace)\n if (index < 0) return false\n entries.splice(index, 1)\n return true\n },\n clear(namespace) {\n if (namespace === undefined) {\n entries.length = 0\n counters.clear()\n // A registry given one stream owns it, and starts it over with the rules.\n if (typeof random !== \"function\") random.reset()\n own.clear()\n return\n }\n drop(namespace)\n counters.delete(namespace)\n },\n restore(namespace, state) {\n drop(namespace)\n for (const { remaining, hits, seen, position, ...rule } of state.rules) {\n const entry = toEntry({ ...rule, namespace }, { remaining, hits, seen })\n // Back where it stood among the global rules: ahead of the one that followed it.\n let globals = 0\n let index = entries.length\n if (position !== undefined) {\n for (const [at, each] of entries.entries()) {\n if (each.scope !== GLOBAL) continue\n if (globals === position) {\n index = at\n break\n }\n globals++\n }\n }\n entries.splice(index, 0, entry)\n }\n counters.set(namespace, state.nextId ?? 0)\n },\n async take(candidate) {\n const hits: FaultHit[] = []\n const wait = candidate.wait ?? sleep\n const draw = stream(candidate.namespace)\n // Parsed once, and only if a rule that reaches the body gets this far.\n const body: { value: unknown } = { value: undefined }\n let read = false\n // A copy: a rule added while this request waits must not join it halfway.\n for (const entry of [...entries]) {\n if (entry.remaining === 0) continue\n if (entry.rule.requestBody && !read) {\n read = true\n body.value = await candidate.readJson?.().catch(() => undefined)\n }\n if (!matches(entry, candidate, body)) continue\n const { rule } = entry\n entry.seen++\n const position = entry.seen - (rule.after ?? 0)\n if (position <= 0) continue\n if (rule.every !== undefined && position % rule.every !== 0) continue\n // Draw even when the rule always fires, so a seeded stream stays aligned.\n if (draw.next() >= (rule.rate ?? 1)) continue\n entry.hits++\n if (entry.remaining !== null) entry.remaining--\n const hit = await act(rule, draw, wait)\n hits.push(hit)\n if (hit.drop || hit.response) break\n }\n return hits\n },\n async fire(rules, candidate) {\n const hits: FaultHit[] = []\n for (const rule of rules) {\n const hit = await act(rule, stream(candidate.namespace), candidate.wait ?? sleep)\n hits.push(hit)\n if (hit.drop || hit.response) break\n }\n return hits\n },\n }\n}\n\n/** Do what a rule that fired says: wait, then answer, drop, or let the request through. */\nconst act = async (\n rule: FaultRule,\n draw: Rng,\n wait: (ms: number) => Promise<void>,\n): Promise<FaultHit> => {\n const jitter = (rule.jitterMs ?? 0) > 0 ? draw.int(0, Math.floor(rule.jitterMs ?? 0)) : 0\n const delay = (rule.delayMs ?? 0) + jitter\n if (delay > 0) await wait(delay)\n const hit: FaultHit = { id: rule.id }\n if (rule.effect !== undefined) hit.effect = { name: rule.effect, params: rule.params ?? {} }\n if (rule.truncate !== undefined) hit.truncate = rule.truncate\n if (rule.timeoutMs !== undefined) {\n if (rule.timeoutMs > 0) await wait(rule.timeoutMs)\n hit.drop = true\n hit.timeout = true\n } else if (rule.drop === true) hit.drop = true\n else if (rule.status !== undefined) hit.response = faultResponse(rule)\n return hit\n}\n", "import type { LatencyRule, LatencyState } from \"./controls.js\"\nimport type { Rng } from \"./rng.js\"\n\n/**\n * Baseline response time, per namespace: how long every vendor request takes before any\n * fault is considered. Jitter draws from a stream the caller owns, one per namespace and\n * separate from the fault stream, so adding latency never shifts which requests a `rate`\n * fault hits.\n */\nexport type LatencyRegistry = {\n get(namespace: string): LatencyState\n set(namespace: string, state: LatencyState): LatencyState\n /** Remove one namespace's latency, or every namespace's. */\n clear(namespace?: string): void\n /** Milliseconds this request waits. Draws jitter, so call it once per request. */\n take(namespace: string, operationId: string | undefined): number\n}\n\nconst NONE: LatencyState = Object.freeze({ delayMs: 0, jitterMs: 0, operations: {} })\n\nconst copy = (state: LatencyState): LatencyState => ({\n delayMs: state.delayMs,\n jitterMs: state.jitterMs,\n operations: Object.fromEntries(\n Object.entries(state.operations).map(([id, rule]) => [id, { ...rule }]),\n ),\n})\n\n/** `random` is the namespace's jitter stream. The registry never seeds or rewinds it. */\nexport const createLatencyRegistry = (random: (namespace: string) => Rng): LatencyRegistry => {\n const states = new Map<string, LatencyState>()\n return {\n get: (namespace) => copy(states.get(namespace) ?? NONE),\n set(namespace, state) {\n states.set(namespace, copy(state))\n return copy(state)\n },\n clear(namespace) {\n if (namespace === undefined) states.clear()\n else states.delete(namespace)\n },\n take(namespace, operationId) {\n const state = states.get(namespace)\n if (!state) return 0\n const rule: LatencyRule =\n (operationId !== undefined ? state.operations[operationId] : undefined) ?? state\n // Whole milliseconds, inclusive of both ends, so a jitter of 1 can still be 0 or 1.\n const jitter = rule.jitterMs > 0 ? random(namespace).int(0, Math.floor(rule.jitterMs)) : 0\n return rule.delayMs + jitter\n },\n }\n}\n", "import type { Clock, ClockState } from \"./clock.js\"\nimport {\n type BootPlan,\n type ClockPlan,\n ControlError,\n type ControlPlan,\n isRecord,\n type LatencyState,\n normalizeSeed,\n type SnapshotDocument,\n} from \"./controls.js\"\nimport {\n createFaultRegistry,\n type FaultListing,\n type FaultPreset,\n type FaultRegistry,\n type FaultRule,\n type FaultSnapshot,\n faultHasAction,\n normalizeFault,\n STANDARD_FAULT_PRESETS,\n} from \"./faults.js\"\nimport { createLatencyRegistry, type LatencyRegistry } from \"./latency.js\"\nimport { createRng, type Rng } from \"./rng.js\"\n\n/** The controls of a namespace that are plain settings, not registries. */\nexport type ControlSettings = {\n seed: number | string\n virtualTime: boolean\n autoAdvanceMs: number\n}\n\n/** Clock state as the admin API reports it. */\nexport type ControlClock = ClockState & {\n /** `now`, as ISO-8601. */\n iso: string\n /** Milliseconds the clock steps before every vendor request. */\n autoAdvanceMs: number\n}\n\n/** One namespace's controls: the body of `GET /__admin/controls`. */\nexport type ControlState = {\n namespace: string\n seed: number | string\n clock: ControlClock\n virtualTime: boolean\n latency: LatencyState\n faults: FaultListing[]\n}\n\n/**\n * A namespace's controls as a snapshot holds them. Every part is optional: restoring puts\n * back what is there and leaves the rest of the namespace as it is.\n */\nexport type ControlsSnapshot = {\n settings?: Partial<ControlSettings>\n /** Where the fault and latency streams stand. */\n streams?: { faults?: number; latency?: number }\n faults?: FaultSnapshot\n latency?: LatencyState\n}\n\n/** A change to a clock: {@link ClockPlan} plus the one-shot moves `POST /clock` accepts. */\nexport type ClockChange = ClockPlan & { advanceMs?: number; reset?: boolean }\n\n/** What a reboot puts back: everything a boot snapshot holds, or only its controls. */\nexport type BootScope = \"all\" | \"controls\"\n\nexport type NamespaceControls = {\n readonly faults: FaultRegistry\n readonly latency: LatencyRegistry\n /** Standard presets, with the service's own taking precedence. */\n readonly presets: Readonly<Record<string, FaultPreset>>\n /** Boot the namespace the first time it is used. Idempotent. */\n ensure(namespace: string): void\n settings(namespace: string): Readonly<ControlSettings>\n clock(namespace: string): ControlClock\n describe(namespace: string): ControlState\n /** Throw {@link ControlError} unless every part of `plan` can be applied. Changes nothing. */\n check(plan: ControlPlan): void\n /**\n * Apply seed, clock, virtual time, latency and faults. A given key replaces that control.\n * The whole plan is checked first, so a plan that is rejected has changed nothing.\n */\n apply(namespace: string, plan: ControlPlan): void\n changeClock(namespace: string, change: ClockChange): ControlClock\n /** Add one fault from an untrusted body: a rule, or `{\"preset\": \"<name>\", \u2026overrides}`. */\n addFault(namespace: string, input: unknown): FaultRule[]\n /** The rules one request scripts for itself in its headers. Nothing is stored. */\n scriptFaults(\n namespace: string,\n request: { fault?: Record<string, unknown>; timeoutMs?: number },\n ): FaultRule[]\n /** Restart every random stream of a namespace from `seed`. */\n reseed(namespace: string, seed: number | string): void\n /** Put a namespace back to what it was at boot: all of it, or only its controls. */\n reboot(namespace: string, scope?: BootScope): void\n /** Forget every namespace; each boots again when next used. */\n rebootAll(): void\n snapshot(namespace: string): Required<ControlsSnapshot>\n restore(namespace: string, snapshot: ControlsSnapshot): void\n /** Drop a namespace's controls entirely. */\n forget(namespace: string): void\n}\n\nexport type NamespaceControlsOptions = {\n /** What every stream starts from, unless a namespace is given a seed of its own. */\n seed: number | string\n clock(namespace: string): Clock\n boot?: BootPlan\n /** The service's presets. The standard ones fill in behind them. */\n presets?: Readonly<Record<string, FaultPreset>>\n /** How a fault waits on the wall clock, when the request does not say. */\n sleep?(ms: number): Promise<void>\n /** Reseed whatever else draws from the namespace's seed (the service's own stream). */\n onReseed?(namespace: string, seed: number | string): void\n /** A preset was switched on: do the part of it that is not a fault rule. */\n onPreset?(preset: FaultPreset, namespace: string, overrides: Partial<FaultRule>): void\n /** Put a snapshot document into a namespace: the boot `snapshot` control. */\n restoreDocument?(namespace: string, document: SnapshotDocument, scope: BootScope): void\n}\n\nconst NO_BOOT: BootPlan = { shared: {}, namespaces: {}, credentials: {} }\n\n/** What a rule does, without what it matches or when: all one request can script for itself. */\nconst ACTION = [\n \"status\",\n \"body\",\n \"headers\",\n \"delayMs\",\n \"jitterMs\",\n \"timeoutMs\",\n \"drop\",\n \"truncate\",\n \"effect\",\n \"params\",\n] as const\n\n/** Keys that choose requests. A fault in a header has already chosen its request. */\nconst CHOOSES_REQUESTS = [\n \"id\",\n \"operationId\",\n \"method\",\n \"path\",\n \"pathPrefix\",\n \"pathPattern\",\n \"requestHeaders\",\n \"query\",\n \"requestBody\",\n \"namespace\",\n \"after\",\n \"every\",\n \"count\",\n \"rate\",\n \"from\",\n \"until\",\n]\n\ntype Resolved = {\n /** `assign`: the rule takes the namespace's next `fault_<n>` id when it is stored. */\n rules: { rule: FaultRule; assign: boolean }[]\n preset?: { preset: FaultPreset; overrides: Partial<FaultRule> }\n}\n\n/**\n * Per-namespace seed, clock settings, latency and faults, and the one place a control\n * document is checked and applied \u2014 at boot, from `PUT /__admin/controls`, and from request\n * headers. It owns the seeded streams too: a namespace's seed lives here and nowhere else.\n */\nexport const createNamespaceControls = (options: NamespaceControlsOptions): NamespaceControls => {\n const boot = options.boot ?? NO_BOOT\n const presets: Record<string, FaultPreset> = { ...options.presets }\n for (const [name, preset] of Object.entries(STANDARD_FAULT_PRESETS)) presets[name] ??= preset\n\n const settings = new Map<string, ControlSettings>()\n const streams = new Map<string, { faults: Rng; latency: Rng }>()\n const ensured = new Set<string>()\n\n const settingsOf = (namespace: string): ControlSettings => {\n let found = settings.get(namespace)\n if (!found) {\n found = { seed: options.seed, virtualTime: false, autoAdvanceMs: 0 }\n settings.set(namespace, found)\n }\n return found\n }\n const streamsOf = (namespace: string) => {\n let found = streams.get(namespace)\n if (!found) {\n const { seed } = settingsOf(namespace)\n found = { faults: createRng(seed), latency: createRng(seed) }\n streams.set(namespace, found)\n }\n return found\n }\n const faults = createFaultRegistry((namespace) => streamsOf(namespace).faults, options.sleep)\n const latency = createLatencyRegistry((namespace) => streamsOf(namespace).latency)\n\n const reseed = (namespace: string, seed: number | string): void => {\n const next = normalizeSeed(seed)\n settingsOf(namespace).seed = next\n const own = streamsOf(namespace)\n own.faults.reseed(next)\n own.latency.reseed(next)\n options.onReseed?.(namespace, next)\n }\n\n const changeClock = (namespace: string, change: ClockChange): void => {\n const clock = options.clock(namespace)\n if (change.reset === true) {\n clock.reset()\n settingsOf(namespace).autoAdvanceMs = 0\n }\n // Freeze before applying mutations so a compound `{ now, frozen: true }` change is\n // atomic. Setting a live clock adjusts its offset; freezing it afterward would read the\n // source again and could pin it a millisecond past the requested instant.\n if (change.frozen === true) clock.freeze()\n if (change.now !== undefined) clock.set(change.now)\n if (change.advanceMs !== undefined) clock.advance(change.advanceMs)\n if (change.frozen === false) clock.unfreeze()\n if (change.autoAdvanceMs !== undefined)\n settingsOf(namespace).autoAdvanceMs = change.autoAdvanceMs\n }\n\n /** A rule or a preset reference, as the rules it stands for. Checks everything; stores nothing. */\n const resolve = (namespace: string, input: unknown, now: number): Resolved => {\n if (!isRecord(input)) throw new ControlError(\"fault: expected an object\")\n if (typeof input.preset !== \"string\") {\n const rule = normalizeFault(input, {\n id: \"unassigned\",\n // Scoped to the caller's namespace unless it asks for every one, so one worker's\n // injected failure never lands on another's request.\n namespace,\n now,\n strict: true,\n })\n if (!faultHasAction(rule))\n throw new ControlError(\n \"a fault needs a status, a delay, a timeout, drop: true, truncate, an effect, or a preset\",\n )\n return { rules: [{ rule, assign: typeof input.id !== \"string\" }] }\n }\n const { preset: name, ...given } = input\n const preset = presets[name]\n if (!preset)\n throw new ControlError(\n `no fault preset ${JSON.stringify(name)}; known: ${Object.keys(presets).join(\", \")}`,\n )\n // Both sides in stored form first, so an override wins whichever spelling it uses.\n const { id, ...overrides } = normalizeFault(\n { ...given, id: given.id ?? name },\n { now, strict: true },\n )\n const rules = preset.rules ?? []\n return {\n preset: { preset, overrides },\n rules: rules.map((each, index) => {\n const { id: _id, ...base } = normalizeFault({ ...each, id: name }, { now })\n return {\n assign: false,\n rule: {\n namespace,\n ...base,\n ...overrides,\n fromPreset: name,\n id: `${id}${rules.length > 1 ? `_${index + 1}` : \"\"}`,\n },\n }\n }),\n }\n }\n\n const store = (namespace: string, resolved: Resolved): FaultRule[] => {\n const added = resolved.rules.map(({ rule, assign }) =>\n // Only a rule that is accepted takes the next id, so a rejected request leaves no gap.\n faults.add(assign ? { ...rule, id: faults.nextId(rule.namespace ?? namespace) } : rule),\n )\n if (resolved.preset)\n options.onPreset?.(resolved.preset.preset, namespace, resolved.preset.overrides)\n return added\n }\n\n const check = (plan: ControlPlan): void => {\n for (const each of (plan.faults ?? []) as readonly unknown[]) {\n // A document is one namespace's controls. A rule for every namespace would be added\n // again each time another namespace booted or reset.\n if (isRecord(each) && each.namespace === \"*\")\n throw new ControlError(\n 'faults: a control document cannot hold a \"*\" rule; add it with POST /faults',\n )\n resolve(\"default\", each, 0)\n }\n }\n\n /** Apply a plan that has been checked. `replace` clears the namespace's rules first. */\n const commit = (namespace: string, plan: ControlPlan, replace: boolean): void => {\n if (plan.seed !== undefined) reseed(namespace, plan.seed)\n if (plan.clock !== undefined) changeClock(namespace, plan.clock)\n if (plan.virtualTime !== undefined) settingsOf(namespace).virtualTime = plan.virtualTime\n if (plan.latency !== undefined) latency.set(namespace, plan.latency)\n if (plan.faults !== undefined) {\n if (replace) faults.clear(namespace)\n // Resolved now, not when checked: a window given as a duration counts from the clock\n // this same plan may just have moved.\n const now = options.clock(namespace).now()\n for (const each of plan.faults as readonly Record<string, unknown>[])\n store(namespace, resolve(namespace, { ...each, namespace }, now))\n }\n }\n\n /** The namespace's boot plan: the shared controls with its own overrides on top. */\n const bootPlan = (namespace: string): ControlPlan => ({\n ...boot.shared,\n ...boot.namespaces[namespace],\n })\n\n const start = (namespace: string, scope: BootScope): void => {\n ensured.add(namespace)\n const { snapshot, ...plan } = bootPlan(namespace)\n // Rules a caller added in process before the namespace's first use are kept, after the\n // rules it boots with.\n const early = faults.snapshot(namespace).rules\n if (early.length > 0) faults.clear(namespace)\n // The snapshot first, so a control named beside it wins over the one it carries.\n if (snapshot) options.restoreDocument?.(namespace, snapshot, scope)\n commit(namespace, plan, true)\n for (const { remaining: _r, hits: _h, seen: _s, position: _p, ...rule } of early)\n faults.add(rule)\n }\n\n const ensure = (namespace: string): void => {\n if (!ensured.has(namespace)) start(namespace, \"all\")\n }\n\n const clockOf = (namespace: string): ControlClock => {\n ensure(namespace)\n const state = options.clock(namespace).state()\n return {\n ...state,\n iso: new Date(state.now).toISOString(),\n autoAdvanceMs: settingsOf(namespace).autoAdvanceMs,\n }\n }\n\n const wipe = (namespace: string): void => {\n faults.clear(namespace)\n latency.clear(namespace)\n settings.delete(namespace)\n streams.delete(namespace)\n ensured.delete(namespace)\n }\n\n // Fail when the runtime is created, not on the first request to hit a bad boot rule.\n check(boot.shared)\n for (const plan of Object.values(boot.namespaces)) check(plan)\n\n return {\n faults,\n latency,\n presets,\n ensure,\n settings(namespace) {\n ensure(namespace)\n return settingsOf(namespace)\n },\n clock: clockOf,\n describe(namespace) {\n ensure(namespace)\n const current = settingsOf(namespace)\n return {\n namespace,\n seed: current.seed,\n clock: clockOf(namespace),\n virtualTime: current.virtualTime,\n latency: latency.get(namespace),\n faults: faults.list(namespace),\n }\n },\n check,\n apply(namespace, plan) {\n check(plan)\n ensure(namespace)\n commit(namespace, plan, true)\n },\n changeClock(namespace, change) {\n ensure(namespace)\n changeClock(namespace, change)\n return clockOf(namespace)\n },\n addFault(namespace, input) {\n ensure(namespace)\n return store(namespace, resolve(namespace, input, options.clock(namespace).now()))\n },\n scriptFaults(namespace, request) {\n const rules: FaultRule[] = []\n if (request.fault) {\n if (typeof request.fault.preset !== \"string\") {\n const chooses = CHOOSES_REQUESTS.find((key) => key in (request.fault ?? {}))\n if (chooses)\n throw new ControlError(\n `fault: ${chooses} has no meaning here; a fault in a header is for its own request`,\n )\n }\n // A preset's rules say which requests to fault. This request has already been chosen.\n for (const { rule } of resolve(namespace, request.fault, 0).rules) {\n const action: FaultRule = { id: \"request\" }\n for (const key of ACTION)\n if (rule[key] !== undefined) Object.assign(action, { [key]: rule[key] })\n rules.push(action)\n }\n }\n if (request.timeoutMs !== undefined)\n rules.push({ id: \"request\", timeoutMs: request.timeoutMs })\n return rules\n },\n reseed(namespace, seed) {\n ensure(namespace)\n reseed(namespace, seed)\n },\n reboot(namespace, scope = \"all\") {\n wipe(namespace)\n options.clock(namespace).reset()\n options.onReseed?.(namespace, options.seed)\n start(namespace, scope)\n },\n rebootAll() {\n const known = new Set([...ensured, ...settings.keys()])\n faults.clear()\n latency.clear()\n settings.clear()\n streams.clear()\n ensured.clear()\n for (const namespace of known) {\n options.clock(namespace).reset()\n options.onReseed?.(namespace, options.seed)\n }\n },\n snapshot(namespace) {\n ensure(namespace)\n const own = streamsOf(namespace)\n return {\n settings: { ...settingsOf(namespace) },\n streams: { faults: own.faults.state(), latency: own.latency.state() },\n faults: faults.snapshot(namespace),\n latency: latency.get(namespace),\n }\n },\n restore(namespace, snapshot) {\n ensure(namespace)\n const { seed, ...rest } = snapshot.settings ?? {}\n Object.assign(settingsOf(namespace), rest)\n // The seed first: it restarts the streams, and their positions are set after it.\n if (seed !== undefined) reseed(namespace, seed)\n const own = streamsOf(namespace)\n if (snapshot.streams?.faults !== undefined) own.faults.setState(snapshot.streams.faults)\n if (snapshot.streams?.latency !== undefined) own.latency.setState(snapshot.streams.latency)\n if (snapshot.faults) faults.restore(namespace, snapshot.faults)\n if (snapshot.latency) latency.set(namespace, snapshot.latency)\n },\n forget: wipe,\n }\n}\n", "/**\n * HMAC and encoding primitives for vendor webhook signatures, over WebCrypto so they run\n * wherever the mocks do (Node, Bun, workers).\n */\n\nexport type HmacAlgorithm = \"SHA-1\" | \"SHA-256\" | \"SHA-512\"\nexport type ByteEncoding = \"hex\" | \"base64\"\n\nconst encoder = new TextEncoder()\n\nexport const toBase64 = (bytes: ArrayBuffer | Uint8Array): string => {\n let binary = \"\"\n for (const byte of bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes)) {\n binary += String.fromCharCode(byte)\n }\n return btoa(binary)\n}\n\nexport const fromBase64 = (value: string): Uint8Array =>\n Uint8Array.from(atob(value), (char) => char.charCodeAt(0))\n\nexport const toHex = (bytes: ArrayBuffer | Uint8Array): string =>\n [...(bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes))]\n .map((byte) => byte.toString(16).padStart(2, \"0\"))\n .join(\"\")\n\nconst keyBytes = (key: string | Uint8Array): Uint8Array =>\n typeof key === \"string\" ? encoder.encode(key) : key\n\n/** HMAC of `message` under `key` (a UTF-8 string or raw bytes), encoded as hex or base64. */\nexport const hmac = async (\n algorithm: HmacAlgorithm,\n key: string | Uint8Array,\n message: string | Uint8Array,\n encoding: ByteEncoding = \"hex\",\n): Promise<string> => {\n const imported = await crypto.subtle.importKey(\n \"raw\",\n keyBytes(key) as BufferSource,\n { name: \"HMAC\", hash: algorithm },\n false,\n [\"sign\"],\n )\n const signed = await crypto.subtle.sign(\n \"HMAC\",\n imported,\n (typeof message === \"string\" ? encoder.encode(message) : message) as BufferSource,\n )\n return encoding === \"hex\" ? toHex(signed) : toBase64(signed)\n}\n\n/** SHA digest of `input`, hex-encoded. */\nexport const sha = async (\n algorithm: \"SHA-1\" | \"SHA-256\" | \"SHA-512\",\n input: string | Uint8Array,\n): Promise<string> =>\n toHex(\n await crypto.subtle.digest(\n algorithm,\n (typeof input === \"string\" ? encoder.encode(input) : input) as BufferSource,\n ),\n )\n\n/**\n * The raw key of a Svix-style secret: `whsec_<base64>` (Svix, Resend, Junction) or\n * `fwhsec_<base64>` (Flex). A bare base64 secret is accepted too.\n */\nexport const svixSecretBytes = (secret: string): Uint8Array => {\n const raw = secret.replace(/^f?whsec_/, \"\")\n try {\n return fromBase64(raw)\n } catch {\n throw new TypeError(\"webhook secret must be whsec_<base64> (as Svix issues it)\")\n }\n}\n\n/** `v1,<base64 HMAC-SHA256>` over `\"<id>.<timestamp>.<body>\"`, as Svix signs. */\nexport const signSvix = async (\n secret: string,\n messageId: string,\n timestampSeconds: number,\n body: string,\n): Promise<string> =>\n `v1,${await hmac(\"SHA-256\", svixSecretBytes(secret), `${messageId}.${timestampSeconds}.${body}`, \"base64\")}`\n\n/** `t=<unix>,v1=<hex HMAC-SHA256(secret, \"<t>.<body>\")>`, as Stripe (and Persona) sign. */\nexport const signTimestamped = async (\n secret: string,\n timestampSeconds: number,\n body: string,\n): Promise<string> =>\n `t=${timestampSeconds},v1=${await hmac(\"SHA-256\", secret, `${timestampSeconds}.${body}`, \"hex\")}`\n\n/**\n * Twilio's `X-Twilio-Signature`: base64 HMAC-SHA1 of the full URL followed by every form\n * parameter as `key + value`, keys sorted. Sign against the public URL the app is\n * configured with, not the address the request is actually posted to.\n */\nexport const signTwilio = async (\n authToken: string,\n url: string,\n params: Record<string, string>,\n): Promise<string> => {\n const payload =\n url +\n Object.keys(params)\n .sort()\n .map((key) => `${key}${params[key]}`)\n .join(\"\")\n return hmac(\"SHA-1\", authToken, payload, \"base64\")\n}\n\n/** Constant-time string comparison, so a verifier in a test double does not leak timing. */\nexport const timingSafeEqual = (a: string, b: string): boolean => {\n if (a.length !== b.length) return false\n let diff = 0\n for (let i = 0; i < a.length; i++) diff |= a.charCodeAt(i) ^ b.charCodeAt(i)\n return diff === 0\n}\n", "import type { SqliteClient } from \"@crvouga/mockingbird-sqlite\"\nimport type { Clock, ClockState } from \"./clock.js\"\nimport type { ControlHeaderInput, MockControls, NamespaceControls } from \"./controls.js\"\nimport type { CredentialRegistry } from \"./credentials.js\"\nimport type { FaultRegistry, FaultRule } from \"./faults.js\"\nimport type { Journal } from \"./journal.js\"\nimport type { LatencyRegistry } from \"./latency.js\"\nimport type { Metrics } from \"./metrics.js\"\nimport type { Rng } from \"./rng.js\"\nimport type { NamespaceSnapshot } from \"./snapshot.js\"\nimport type { StateView } from \"./state-view.js\"\n\n/**\n * What every mock can be called with. A service may accept more fields \u2014 accounts,\n * catalogs, webhook endpoints \u2014 and those stay optional so `createRuntime()` and\n * `createRuntime({ seed, adminKey })` work everywhere.\n */\nexport type MockCreateOptions = {\n sqlite?: SqliteClient\n clock?: Clock\n seed?: number | string\n /** All internal HTTP paths live below this prefix. Default /__admin. */\n adminPrefix?: string\n adminKey?: string\n /**\n * Admin controls to boot with: clock, latency, faults, seed, a starting snapshot, and\n * per-namespace overrides. `POST /__admin/reset` returns to exactly this.\n */\n adminControls?: MockControls\n}\n\n/** A named snapshot, as the admin API and `runtime.snapshots` list it. */\nexport type MockSnapshotInfo = {\n readonly id: string\n readonly namespace: string\n readonly records: number\n readonly at: number\n readonly portable: boolean\n}\n\n/** One namespace's controls, as `GET /__admin/controls` and `runtime.controls()` report them. */\nexport type MockControlState = {\n readonly namespace: string\n readonly seed: number | string\n readonly clock: ClockState & { iso: string; autoAdvanceMs: number }\n readonly virtualTime: boolean\n readonly latency: unknown\n readonly faults: readonly unknown[]\n readonly snapshots: readonly MockSnapshotInfo[]\n}\n\n/** A checkpoint head the admin client can show. Services may return a richer object. */\nexport type MockCheckpoint = {\n readonly id: string\n readonly branch: string\n readonly parent: string | null\n readonly at: number\n}\n\n/** The instance behind one namespace. Vendor methods sit beside these, not instead of them. */\nexport type MockInstanceSurface = {\n fetch(request: Request): Promise<Response>\n reset(): Promise<void>\n}\n\n/**\n * The interface every mock runtime implements.\n *\n * Assignability is one way: a service may add methods (`tick`, a typed webhook hub,\n * account directories) and narrower property types. Removing or renaming a member\n * fails the typecheck. The HTTP control plane (`/__admin/health`, `/__admin/*`) is the same\n * contract on the wire; {@link STANDARD_ADMIN_ROUTES} is that list.\n */\nexport type MockSurface = {\n readonly name: string\n fetch(request: Request): Promise<Response>\n readonly clock: Clock\n readonly faults: FaultRegistry\n /** Baseline response time per namespace. */\n readonly latency: LatencyRegistry\n readonly metrics: Metrics\n readonly journal: Journal\n readonly rng: Rng\n readonly credentials: CredentialRegistry\n /** Present on every runtime. `undefined` when the service has no outbound webhooks. */\n readonly webhooks: unknown\n applyPreset(name: string, namespace?: string, overrides?: Partial<FaultRule>): FaultRule[]\n instance(namespace?: string): MockInstanceSurface\n namespaces(): string[]\n reset(namespace?: string): Promise<void>\n /** A namespace's clock: the base clock for `default`, its own for any other. */\n namespaceClock(namespace?: string): Clock\n /** A namespace's controls: seed, clock, virtual time, latency, faults and snapshots. */\n controls(namespace?: string): MockControlState\n /** Apply a control document to a namespace. A given key replaces that control. */\n configure(controls: NamespaceControls, namespace?: string): MockControlState\n /** Named snapshots of a namespace: records, clock, random streams, faults and latency. */\n readonly snapshots: {\n create(options?: { name?: string; namespace?: string }): MockSnapshotInfo\n list(namespace?: string): MockSnapshotInfo[]\n restore(id: string, namespace?: string): void\n delete(id: string, namespace?: string): boolean\n }\n /** Request headers that carry controls, checked: spread them into a `fetch` or an SDK's defaults. */\n headers(input: ControlHeaderInput): Record<string, string>\n snapshot(namespace?: string): NamespaceSnapshot\n restore(snapshot: NamespaceSnapshot, namespace?: string): void\n checkpoint(namespace?: string, branch?: string): MockCheckpoint\n branch(name: string, options?: { namespace?: string; at?: string }): MockCheckpoint\n checkout(checkpoint: string, options?: { namespace?: string; branch?: string }): void\n timeline(namespace?: string): {\n head(branch?: string): { readonly id: string } | undefined\n branches(): Readonly<Record<string, string>>\n }\n /** Collections in `namespace`, declared by the service and inferred from stored rows. */\n state(namespace?: string): StateView\n readonly sqlite: SqliteClient\n}\n\n/**\n * Keep a service's own runtime type while proving it is a {@link MockSurface}.\n * Extra members stay. A missing member is a type error at the definition.\n */\nexport const defineMock = <T extends MockSurface>(runtime: T): T => runtime\n\n/** Clock state is part of the surface so admin clients can render it without a cast. */\nexport type MockClockState = ClockState\n\n/**\n * What each shared admin route does. `GET /__admin` serves this list, and the guide in\n * `docs/ADMIN_CONTROLS.md` is checked against it.\n */\nexport const ADMIN_ROUTE_REFERENCE = {\n \"GET /\": \"This index: every route and control header, with a one-line summary each.\",\n \"GET /health\": \"Readiness. Never needs the admin key or a vendor credential.\",\n \"GET /controls\":\n \"The namespace's controls in one document: seed, clock, virtual time, latency, faults, snapshots.\",\n \"PUT /controls\":\n \"Apply a control document. Each key given replaces that control; `snapshot` replaces the records.\",\n \"DELETE /controls\": \"Put the namespace's controls back to boot. Records are untouched.\",\n \"POST /reset\":\n \"Return the namespace to its boot state: records, controls, snapshots, journal, metrics. `?all=1` resets every namespace.\",\n \"GET /namespaces\": \"The isolation keys in use.\",\n \"DELETE /namespaces/:name\": \"Reset a namespace and forget it.\",\n \"GET /clock\": \"The namespace clock: `now`, `iso`, `frozen`, `offsetMs`, `autoAdvanceMs`.\",\n \"POST /clock\":\n \"Move time: `now` (or `set`), `advance`, `frozen` (or `freeze`), `autoAdvance`, `reset`.\",\n \"GET /latency\": \"The namespace's baseline response time.\",\n \"PUT /latency\": \"Set it: `delay`, seeded `jitter`, and per-operation `operations`.\",\n \"DELETE /latency\": \"Remove it.\",\n \"GET /faults\": \"Fault rules that can hit this namespace. `?all=1` lists every namespace's.\",\n \"POST /faults\": 'Add a fault rule, or a preset with `{\"preset\": \"<name>\"}`.',\n \"PUT /faults\": 'Replace the namespace\\'s fault rules with `{\"faults\": [...]}`.',\n \"DELETE /faults\":\n \"Remove the namespace's fault rules. `?id=` removes one; `?all=1` every namespace's.\",\n \"GET /faults/presets\": \"Named faults this emulator answers to.\",\n \"POST /faults/presets/:name\": \"Switch a preset on. The body overrides its fields.\",\n \"GET /faults/:id\": \"One fault rule, with its `hits`, `seen` and `remaining` counters.\",\n \"DELETE /faults/:id\": \"Remove one fault rule.\",\n \"GET /snapshots\": \"The namespace's snapshots.\",\n \"POST /snapshots\":\n 'Snapshot the namespace: records, clock, random streams, faults, latency. `{\"name\"}` names it.',\n \"GET /snapshots/:id\": \"A snapshot as portable JSON.\",\n \"PUT /snapshots/:id\": \"Store a snapshot document under this id, without restoring it.\",\n \"POST /snapshots/:id/restore\": \"Replace the namespace with a snapshot.\",\n \"DELETE /snapshots/:id\": \"Delete a snapshot.\",\n \"GET /timeline\": \"The namespace's checkpoint history and branches.\",\n \"POST /checkpoints\": \"Checkpoint a branch now. Successful mutations do this automatically.\",\n \"POST /branches/:name\": \"Create a copy-on-write branch, optionally from a checkpoint (`at`).\",\n \"POST /branches/:name/checkout\": \"Move a branch to a checkpoint.\",\n \"GET /requests\":\n \"The request journal. Filter with `operationId`, `method`, `path`, `status`, `faultId`, `since`, `limit`; `?all=1` for every namespace.\",\n \"DELETE /requests\": \"Clear the journal.\",\n \"GET /metrics\": \"Request counts and unmatched paths, for every namespace or the one named.\",\n \"DELETE /metrics\": \"Clear them.\",\n \"GET /credentials\": \"Vendor credential \u2192 namespace mappings, masked.\",\n \"PUT /credentials\": \"Map vendor credentials to namespaces, for SDKs that cannot send a header.\",\n \"DELETE /credentials\": \"Remove one mapping (`?credential=`) or all.\",\n \"GET /state\": \"The namespace's collections: declared shape and stored rows.\",\n \"GET /state/:collection\": \"A page of rows.\",\n \"GET /state/:collection/:id\": \"One row.\",\n \"POST /state/:collection\": \"Create a row from `{id?, value}`.\",\n \"PUT /state/:collection/:id\": \"Replace a row.\",\n \"PATCH /state/:collection/:id\": \"Shallow-merge into a row.\",\n \"DELETE /state/:collection/:id\": \"Delete a row.\",\n \"GET /ui\": \"The admin UI.\",\n \"GET /ui/\": \"The admin UI.\",\n \"GET /ui/manifest\": \"The admin UI's panels and extensions.\",\n} as const\n\n/**\n * Admin routes every mock answers. A service adds its own keys beside these.\n * A key in this list keeps the shared handler, so the state API and the admin UI\n * stay the same when a service also ships vendor-specific controls.\n */\nexport const STANDARD_ADMIN_ROUTES = Object.keys(\n ADMIN_ROUTE_REFERENCE,\n) as readonly (keyof typeof ADMIN_ROUTE_REFERENCE)[]\n\nexport type StandardAdminRoute = (typeof STANDARD_ADMIN_ROUTES)[number]\n\n/**\n * A contribution the admin shell mounts beside the shared views.\n * `panel` is author-owned markup. `sql` turns on the built-in table explorer\n * and query runner, which call `GET /sql/tables` and `POST /sql/query`.\n * `route` presents an admin action with the shell's prebuilt form and response view.\n */\nexport type AdminExtension =\n | {\n kind: \"route\"\n id: string\n title: string\n description?: string\n /** An existing admin route, including its method and any path parameters. */\n route: string\n /** Initial JSON body shown in the request form. */\n body?: unknown\n }\n | {\n kind: \"panel\"\n id: string\n title: string\n description?: string\n html: string\n script?: string\n }\n | {\n kind: \"sql\"\n /** DOM id suffix. Default `sql`. */\n id?: string\n title?: string\n description?: string\n }\n\n/** A panel the default admin shell mounts after the shared views. */\nexport type AdminPanel = {\n /** DOM id suffix. Lowercase letters, digits, and hyphens. */\n id: string\n title: string\n description?: string\n /** Markup placed inside the panel body. The service author owns it. */\n html: string\n /**\n * Function body called as `(root, api) => void` once the shell has loaded.\n * `root` is the panel body. `api` is `{ get, send, namespace }` against `/__admin`.\n */\n script?: string\n}\n\n/**\n * How a service customizes the admin UI without leaving the shared shell.\n * `panels` add views. `render` replaces the document and can call `defaultHtml()`\n * to wrap the shared shell instead of discarding it.\n */\nexport type AdminUi = {\n panels?: readonly AdminPanel[]\n /** First-class shell contributions. `sql` mounts the shared database explorer. */\n extensions?: readonly AdminExtension[]\n render?: (input: { service: string; defaultHtml: () => string }) => string\n}\n\nconst PANEL_ID = /^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$/\nconst RESERVED_VIEWS = new Set([\n \"overview\",\n \"manual\",\n \"state\",\n \"clock\",\n \"latency\",\n \"faults\",\n \"snapshots\",\n \"journal\",\n \"routes\",\n \"checkpoints\",\n])\n\nconst checkPanel = (\n panel: { id: string; title: string },\n seen: Set<string>,\n label: string,\n): void => {\n if (!PANEL_ID.test(panel.id)) {\n throw new RangeError(`${label} id must match ${PANEL_ID}: ${JSON.stringify(panel.id)}`)\n }\n if (RESERVED_VIEWS.has(panel.id)) {\n throw new RangeError(`${label} id ${panel.id} is reserved by the admin shell`)\n }\n if (seen.has(panel.id)) throw new RangeError(`duplicate admin view id ${panel.id}`)\n seen.add(panel.id)\n if (panel.title.trim() === \"\") throw new RangeError(`${label} ${panel.id} needs a title`)\n}\n\n/** Reject a panel or extension the shell cannot mount. Called when the runtime is created. */\nexport const assertAdminUi = (ui: AdminUi | undefined): void => {\n if (!ui) return\n const seen = new Set<string>()\n for (const panel of ui.panels ?? []) checkPanel(panel, seen, \"admin panel\")\n for (const extension of ui.extensions ?? []) {\n if (extension.kind === \"panel\" || extension.kind === \"route\") {\n checkPanel(extension, seen, \"admin extension\")\n if (\n extension.kind === \"route\" &&\n !/^(GET|POST|PUT|PATCH|DELETE) \\/\\S*$/.test(extension.route)\n )\n throw new RangeError(`admin extension ${extension.id} needs a method and route path`)\n continue\n }\n const id = extension.id ?? \"sql\"\n checkPanel({ id, title: extension.title ?? \"SQL\" }, seen, \"admin extension\")\n }\n}\n", "import type { Clock } from \"./clock.js\"\nimport {\n assertSnapshotDocument,\n CONTROL_HEADER_REFERENCE,\n CONTROL_HEADERS,\n ControlError,\n type ControlPlan,\n durationMs,\n isRecord,\n KEY_PATTERN,\n normalizeClock,\n normalizeControls,\n normalizeLatency,\n parseInstant,\n type SnapshotDocument,\n} from \"./controls.js\"\nimport type { FaultPresetList } from \"./faults.js\"\nimport type { Journal } from \"./journal.js\"\nimport type { Metrics } from \"./metrics.js\"\nimport { createNamespaceControls, type NamespaceControls } from \"./namespace-controls.js\"\nimport { timingSafeEqual } from \"./signing.js\"\nimport { ADMIN_ROUTE_REFERENCE } from \"./surface.js\"\n\nexport { parseDuration } from \"./controls.js\"\n\n/** Unauthenticated readiness probe, served ahead of every vendor auth gate. */\nexport const HEALTH_PATH = \"/__admin/health\"\n/** Prefix of every control-plane route; never part of a vendor contract. */\nexport const ADMIN_PREFIX = \"/__admin\"\n/** Resolve once at construction; ambiguous URL forms are never accepted. */\nexport const resolveAdminPrefix = (prefix: string = ADMIN_PREFIX): string => {\n if (!/^\\/[A-Za-z0-9_-]+(?:\\/[A-Za-z0-9_-]+)*$/.test(prefix)) {\n throw new Error(\n \"adminPrefix must be an absolute non-root path of literal segments, without a trailing slash\",\n )\n }\n return prefix\n}\n\n/** Segment-boundary matching prevents /__administer from entering the control plane. */\nexport const isAdminPath = (path: string, prefix: string): boolean =>\n path === prefix || path.startsWith(`${prefix}/`)\n\n/** SDK base URL namespace carrier, entirely inside the configured internal route tree. */\nexport const matchNamespacePath = (path: string, prefix: string): RegExpExecArray | null =>\n /^\\/ns\\/([^/]+)(\\/.*)?$/.exec(isAdminPath(path, prefix) ? path.slice(prefix.length) : \"\")\n\n/** Fail before serving when the declared vendor contract overlaps the reserved tree. */\nexport const assertAdminPrefixAvailable = (prefix: string, paths: readonly string[]): void => {\n const reserved = prefix.split(\"/\").slice(1)\n for (const path of paths) {\n const segments = path.split(\"/\").slice(1)\n // Catch-all vendor roots (e.g. S3 /{bucket}/{key}) share the listener.\n // The internal tree is reserved before vendor dispatch, regardless of the wildcard.\n if (segments.length < reserved.length || /^\\{[^}]+\\}$/.test(segments[0] ?? \"\")) continue\n if (\n reserved.every((part, i) => segments[i] === part || /^\\{[^}]+\\}$/.test(segments[i] ?? \"\"))\n ) {\n throw new Error(\n `vendor route ${path} collides with adminPrefix ${prefix}; choose a different adminPrefix`,\n )\n }\n }\n}\n\n/** Carries the admin key, which is separate from any vendor credential. */\nexport const ADMIN_KEY_HEADER = CONTROL_HEADERS.adminKey\n/** The admin shell's brand catalog, under the admin prefix. Public, like the shell. */\nexport const ADMIN_BRANDS_PATH = \"/ui/brands.json\"\n\n/**\n * Whether `headers` carry `adminKey`. Constant-time, so response timing does not tell a caller\n * how many leading characters of a guess were right.\n */\nexport const hasAdminKey = (headers: Headers, adminKey: string): boolean => {\n const sent = headers.get(ADMIN_KEY_HEADER)\n return sent !== null && timingSafeEqual(sent, adminKey)\n}\n/** Selects the isolated namespace a request reads and writes. */\nexport const NAMESPACE_HEADER = CONTROL_HEADERS.namespace\n/** Where the admin controls are documented, for people and agents. */\nexport const ADMIN_DOCS_URL = \"https://mockingbird.chrisvouga.dev/docs/admin-controls\"\n\n/**\n * The guide's page for each control, with the shared routes (by first path segment) and the\n * request headers that page defines. `GET /__admin` links every route and header to its page,\n * and the guide in `docs/admin-controls/` is checked against this list.\n */\nexport const ADMIN_CONTROL_PAGES: readonly {\n page: string\n title: string\n routes: readonly string[]\n headers: readonly string[]\n}[] = [\n {\n page: \"namespaces\",\n title: \"Namespaces\",\n routes: [\"/namespaces\", \"/credentials\"],\n headers: [CONTROL_HEADERS.namespace],\n },\n { page: \"reset\", title: \"Reset\", routes: [\"/reset\"], headers: [CONTROL_HEADERS.reset] },\n {\n page: \"snapshot-and-restore\",\n title: \"Snapshot and restore\",\n routes: [\"/snapshots\"],\n headers: [CONTROL_HEADERS.restore, CONTROL_HEADERS.snapshot],\n },\n {\n page: \"clock\",\n title: \"Clock\",\n routes: [\"/clock\"],\n headers: [CONTROL_HEADERS.time, CONTROL_HEADERS.advance],\n },\n {\n page: \"checkpoints-and-branches\",\n title: \"Checkpoints and branches\",\n routes: [\"/timeline\", \"/checkpoints\", \"/branches\"],\n headers: [CONTROL_HEADERS.branch, CONTROL_HEADERS.at],\n },\n { page: \"faults\", title: \"Faults\", routes: [\"/faults\"], headers: [CONTROL_HEADERS.fault] },\n {\n page: \"latency-and-timeouts\",\n title: \"Latency and timeouts\",\n routes: [\"/latency\"],\n headers: [CONTROL_HEADERS.delay, CONTROL_HEADERS.timeout, CONTROL_HEADERS.virtualTime],\n },\n {\n page: \"seed-and-determinism\",\n title: \"Seed and determinism\",\n routes: [],\n headers: [CONTROL_HEADERS.seed],\n },\n { page: \"control-document\", title: \"The control document\", routes: [\"/controls\"], headers: [] },\n { page: \"boot\", title: \"Boot\", routes: [], headers: [] },\n { page: \"request-headers\", title: \"Request headers\", routes: [], headers: [] },\n {\n page: \"journal-and-state\",\n title: \"Journal, metrics and state\",\n routes: [\"/requests\", \"/metrics\", \"/state\", \"/ui\"],\n headers: [],\n },\n {\n page: \"reference\",\n title: \"Reference\",\n routes: [\"/\", \"/health\"],\n headers: [CONTROL_HEADERS.adminKey],\n },\n]\n\nconst pageUrl = (page: string): string => `${ADMIN_DOCS_URL}/${page}`\n\n/** The guide page that defines a shared route (`\"GET /snapshots/:id\"`), if it is one. */\nconst routeDocs = (route: string): string | undefined => {\n if (!Object.hasOwn(ADMIN_ROUTE_REFERENCE, route)) return undefined\n const path = route.slice(route.indexOf(\" \") + 1)\n const segment = `/${path.split(\"/\")[1] ?? \"\"}`\n const found = ADMIN_CONTROL_PAGES.find((each) => each.routes.includes(segment))\n return found && pageUrl(found.page)\n}\n\nconst headerDocs = (header: string): string | undefined => {\n const found = ADMIN_CONTROL_PAGES.find((each) => each.headers.includes(header))\n return found && pageUrl(found.page)\n}\n\nexport type AdminRequest = {\n request: Request\n url: URL\n /** `:param` segments of the matched route. */\n params: Record<string, string>\n /** Namespace the request targets: `?namespace=`, then the header, then the default. */\n namespace: string\n /** Parsed JSON body, or `undefined` when there is none. */\n body: unknown\n}\n\nexport type AdminRoute = (request: AdminRequest) => Response | Promise<Response>\n\n/**\n * Service-specific admin routes, keyed `METHOD /path` relative to `/__admin`, with\n * `:param` segments \u2014 e.g. `\"POST /orders/:id/transition\"`.\n */\nexport type AdminRoutes = Record<string, AdminRoute>\n\n/** What `GET /__admin/snapshots` lists for each snapshot. */\nexport type SnapshotInfo = {\n id: string\n namespace: string\n /** Stored rows in the snapshot. */\n records: number\n /** The namespace clock when it was taken, epoch ms. */\n at: number\n /** Whether `GET /snapshots/:id` can return it as a {@link SnapshotDocument}. */\n portable: boolean\n}\n\n/** Named snapshots of a namespace. Ids are unique within a namespace, never across them. */\nexport type SnapshotStore = {\n /** Capture the namespace now. Reusing an id replaces that snapshot. */\n create(namespace: string, id?: string): SnapshotInfo\n list(namespace: string): SnapshotInfo[]\n get(namespace: string, id: string): SnapshotInfo | undefined\n /** The snapshot as portable JSON; `undefined` when there is none or it cannot leave the process. */\n export(namespace: string, id: string): SnapshotDocument | undefined\n /** Store a document as a snapshot without restoring it. Throws {@link ControlError}. */\n import(namespace: string, id: string | undefined, document: SnapshotDocument): SnapshotInfo\n /** Replace the namespace with the snapshot. `false` when there is none. */\n restore(namespace: string, id: string): boolean\n remove(namespace: string, id: string): boolean\n /** Forget one namespace's snapshots, or every namespace's. */\n clear(namespace?: string): void\n}\n\nexport type ControlContext = {\n name: string\n startedAt: number\n wallNow: () => number\n clock: Clock\n namespaceClock?(namespace: string): Clock\n metrics: Metrics\n journal: Journal\n defaultNamespace: string\n namespaces(): string[]\n reset(namespace: string | \"*\"): Promise<void>\n timeTravel: {\n checkpoint(\n namespace: string,\n branch: string,\n ): { id: string; branch: string; parent: string | null; at: number; records?: number }\n branch(\n name: string,\n options: { namespace: string; at?: string },\n ): { id: string; branch: string; parent: string | null; at: number }\n checkout(checkpoint: string, options: { namespace: string; branch: string }): void\n retain(namespace: string, checkpoint: string): void\n release(namespace: string, checkpoint: string): boolean\n inspect(namespace: string): {\n branches: Readonly<Record<string, string>>\n checkpoints: readonly { id: string; branch: string; parent: string | null; at: number }[]\n }\n }\n /** Extra fields for `GET /__admin/health`, such as the loaded corpus version. */\n describe(): Record<string, unknown>\n routes: AdminRoutes\n adminPrefix?: string\n adminKey: string | undefined\n /** Reported by `GET /__admin`. */\n version?: string\n /**\n * Per-namespace seed, clock settings, latency and faults. Default: controls over this\n * context's clock, with the standard presets and no boot controls.\n */\n controls?: NamespaceControls\n /** Named snapshots. Default: pinned `timeTravel` checkpoints, which are not portable. */\n snapshots?: SnapshotStore\n /** Apply a control document, including its `snapshot`. Default: `controls.apply`. */\n applyControls?(namespace: string, plan: ControlPlan): void\n /** Reset a namespace and forget it. Default: reset. */\n dropNamespace?(namespace: string): Promise<void>\n}\n\nexport type ControlPlane = {\n /** The control-plane response for `request`, or `undefined` for a vendor request. */\n handle(request: Request): Promise<Response | undefined>\n /**\n * Namespace a vendor request targets, from {@link NAMESPACE_HEADER}. Only admin routes\n * also accept `?namespace=`, so a vendor query parameter of that name can never\n * silently reroute a request.\n */\n namespaceOf(request: Request): string\n /** The per-namespace controls behind the routes. */\n readonly controls: NamespaceControls\n readonly snapshots: SnapshotStore\n}\n\nconst json = (status: number, body: unknown): Response =>\n new Response(JSON.stringify(body), {\n status,\n headers: { \"content-type\": \"application/json; charset=utf-8\" },\n })\n\n/** Admin errors use one documented shape, distinct from any vendor's error body. */\nexport const adminError = (status: number, message: string): Response =>\n json(status, { error: { type: \"mockingbird_admin\", message } })\n\n/** Parameters before literals lose, so `/faults/presets` is never read as `/faults/:id`. */\nconst paramCount = (pattern: string): number => (pattern.match(/\\/:/g) ?? []).length\n\nconst matchRoute = (pattern: string, path: string): Record<string, string> | undefined => {\n const want = pattern.split(\"/\").filter(Boolean)\n const have = path.split(\"/\").filter(Boolean)\n if (want.length !== have.length) return undefined\n const params: Record<string, string> = {}\n for (let i = 0; i < want.length; i++) {\n const segment = want[i] as string\n const actual = have[i] as string\n if (segment.startsWith(\":\")) params[segment.slice(1)] = decodeURIComponent(actual)\n else if (segment !== actual) return undefined\n }\n return params\n}\n\nconst readJson = async (request: Request): Promise<unknown> => {\n const text = await request.text()\n if (text.trim() === \"\") return undefined\n return JSON.parse(text) as unknown\n}\n\n/** Snapshots as pinned Timeline checkpoints, for engines whose state is not rows of JSON. */\nconst timelineSnapshots = (timeTravel: ControlContext[\"timeTravel\"]): SnapshotStore => {\n const stored = new Map<string, Map<string, { checkpoint: string; info: SnapshotInfo }>>()\n const counters = new Map<string, number>()\n const of = (namespace: string) => {\n let found = stored.get(namespace)\n if (!found) {\n found = new Map()\n stored.set(namespace, found)\n }\n return found\n }\n const remove = (namespace: string, id: string): boolean => {\n const found = stored.get(namespace)?.get(id)\n if (!found) return false\n stored.get(namespace)?.delete(id)\n timeTravel.release(namespace, found.checkpoint)\n return true\n }\n return {\n create(namespace, given) {\n const point = timeTravel.checkpoint(namespace, \"main\")\n timeTravel.retain(namespace, point.id)\n let id = given\n if (id === undefined) {\n let next = counters.get(namespace) ?? 0\n do id = `snap_${++next}`\n while (of(namespace).has(id))\n counters.set(namespace, next)\n } else remove(namespace, id)\n const info = { id, namespace, records: point.records ?? 0, at: point.at, portable: false }\n of(namespace).set(id, { checkpoint: point.id, info })\n return info\n },\n list: (namespace) => [...(stored.get(namespace)?.values() ?? [])].map((each) => each.info),\n get: (namespace, id) => stored.get(namespace)?.get(id)?.info,\n export: () => undefined,\n import() {\n throw new ControlError(\"this emulator's snapshots cannot be imported or exported\")\n },\n restore(namespace, id) {\n const found = stored.get(namespace)?.get(id)\n if (!found) return false\n timeTravel.checkout(found.checkpoint, { namespace, branch: \"main\" })\n return true\n },\n remove,\n clear(namespace) {\n for (const [name, snapshots] of stored) {\n if (namespace !== undefined && name !== namespace) continue\n for (const id of [...snapshots.keys()]) {\n try {\n remove(name, id)\n } catch {\n // The checkpoint went with the history a reset discarded.\n snapshots.delete(id)\n }\n }\n stored.delete(name)\n counters.delete(name)\n }\n },\n }\n}\n\nexport const createControlPlane = (context: ControlContext): ControlPlane => {\n const adminPrefix = resolveAdminPrefix(context.adminPrefix)\n const controls =\n context.controls ??\n createNamespaceControls({\n seed: 0,\n clock: (namespace) => context.namespaceClock?.(namespace) ?? context.clock,\n })\n const { faults } = controls\n const snapshots = context.snapshots ?? timelineSnapshots(context.timeTravel)\n /** A store the runtime owns is cleared by the runtime's own reset. */\n const forgetSnapshots = (namespace?: string) => {\n if (!context.snapshots) snapshots.clear(namespace)\n }\n const applyControls =\n context.applyControls ??\n ((namespace: string, plan: ControlPlan) => {\n if (plan.snapshot !== undefined)\n throw new ControlError(\"this emulator cannot start from a snapshot document\")\n controls.apply(namespace, plan)\n })\n\n const headerNamespace = (request: Request): string =>\n request.headers.get(NAMESPACE_HEADER) ?? context.defaultNamespace\n const adminNamespace = (request: Request, url: URL): string =>\n url.searchParams.get(\"namespace\") ?? headerNamespace(request)\n /** Whether the caller named a namespace, as opposed to landing on the default one. */\n const explicitNamespace = (request: Request, url: URL): boolean =>\n url.searchParams.has(\"namespace\") || request.headers.has(NAMESPACE_HEADER)\n\n const health = (): Response => {\n return json(200, {\n ...context.describe(),\n status: \"ok\",\n service: context.name,\n uptimeMs: context.wallNow() - context.startedAt,\n clock: context.clock.state(),\n namespaces: context.namespaces().length,\n adminPrefix,\n adminUi: `${adminPrefix}/ui`,\n })\n }\n\n const describe = (namespace: string) => ({\n ...controls.describe(namespace),\n snapshots: snapshots.list(namespace),\n })\n\n /** Run a control change, answering `400` for a {@link ControlError}. */\n const guard = (run: () => Response): Response => {\n try {\n return run()\n } catch (error) {\n if (error instanceof ControlError) return adminError(400, error.message)\n throw error\n }\n }\n\n const presetList = (): FaultPresetList => ({\n presets: Object.entries(controls.presets).map(([name, preset]) => ({ name, ...preset })),\n })\n\n const removeFault = (id: string, namespace: string, everyNamespace: boolean): Response =>\n faults.remove(id, everyNamespace ? undefined : namespace)\n ? json(200, { status: \"ok\" })\n : adminError(404, `no fault ${id}`)\n\n const builtin: AdminRoutes = {\n \"GET /health\": health,\n \"GET /\": ({ namespace }) => {\n const routes = [...Object.keys(builtin), ...Object.keys(context.routes)].sort()\n const reference: Record<string, string> = ADMIN_ROUTE_REFERENCE\n return json(200, {\n service: context.name,\n ...(context.version !== undefined ? { version: context.version } : {}),\n namespace,\n adminPrefix,\n docs: ADMIN_DOCS_URL,\n guide: ADMIN_CONTROL_PAGES.map((each) => ({ title: each.title, docs: pageUrl(each.page) })),\n routes,\n reference: routes.map((route) => {\n const docs = routeDocs(route)\n return {\n route,\n summary: reference[route] ?? `Specific to ${context.name}.`,\n ...(docs !== undefined ? { docs } : {}),\n }\n }),\n headers: CONTROL_HEADER_REFERENCE.map((each) => ({\n ...each,\n docs: headerDocs(each.header) ?? ADMIN_DOCS_URL,\n })),\n })\n },\n\n \"GET /controls\": ({ namespace }) => json(200, describe(namespace)),\n \"PUT /controls\": ({ body, namespace }) =>\n guard(() => {\n applyControls(namespace, normalizeControls(body ?? {}, \"controls\"))\n return json(200, describe(namespace))\n }),\n \"DELETE /controls\": ({ namespace }) => {\n controls.reboot(namespace, \"controls\")\n return json(200, describe(namespace))\n },\n\n \"POST /reset\": async ({ url, namespace }) => {\n const target = url.searchParams.get(\"all\") === \"1\" ? \"*\" : namespace\n await context.reset(target)\n forgetSnapshots(target === \"*\" ? undefined : target)\n return json(200, { status: \"ok\", reset: target === \"*\" ? context.namespaces() : [target] })\n },\n\n \"GET /namespaces\": () =>\n json(200, { default: context.defaultNamespace, namespaces: context.namespaces() }),\n \"DELETE /namespaces/:name\": async ({ params }) => {\n const name = params.name as string\n if (!KEY_PATTERN.test(name)) return adminError(400, \"invalid namespace\")\n if (context.dropNamespace) await context.dropNamespace(name)\n else await context.reset(name)\n forgetSnapshots(name)\n return json(200, { status: \"ok\", namespaces: context.namespaces() })\n },\n\n \"GET /clock\": ({ namespace }) => json(200, controls.clock(namespace)),\n \"POST /clock\": ({ body, namespace }) =>\n guard(() => {\n if (!isRecord(body)) return adminError(400, \"expected a JSON object\")\n const { advance, reset, ...rest } = body\n if (reset !== undefined && typeof reset !== \"boolean\")\n return adminError(400, \"reset: expected a boolean\")\n return json(\n 200,\n controls.changeClock(namespace, {\n ...normalizeClock(rest),\n ...(advance !== undefined ? { advanceMs: durationMs(advance, \"advance\", true) } : {}),\n ...(reset === true ? { reset: true } : {}),\n }),\n )\n }),\n\n \"GET /latency\": ({ namespace }) => {\n controls.ensure(namespace)\n return json(200, controls.latency.get(namespace))\n },\n \"PUT /latency\": ({ body, namespace }) =>\n guard(() => {\n controls.ensure(namespace)\n return json(200, controls.latency.set(namespace, normalizeLatency(body ?? {})))\n }),\n \"DELETE /latency\": ({ namespace }) => {\n controls.ensure(namespace)\n controls.latency.clear(namespace)\n return json(200, controls.latency.get(namespace))\n },\n\n \"GET /faults\": ({ url, namespace }) => {\n controls.ensure(namespace)\n return json(200, {\n faults: faults.list(url.searchParams.get(\"all\") === \"1\" ? undefined : namespace),\n })\n },\n \"POST /faults\": ({ body, namespace }) =>\n guard(() => {\n const preset = isRecord(body) && typeof body.preset === \"string\" ? body.preset : undefined\n if (preset !== undefined && !controls.presets[preset])\n return adminError(\n 404,\n `no fault preset ${JSON.stringify(preset)}; GET ${adminPrefix}/faults/presets`,\n )\n const added = controls.addFault(namespace, body)\n return preset !== undefined ? json(201, { preset, rules: added }) : json(201, added[0])\n }),\n \"PUT /faults\": ({ body, namespace }) =>\n guard(() => {\n const list = isRecord(body) ? body.faults : undefined\n if (!Array.isArray(list)) return adminError(400, 'expected {\"faults\": [...]}')\n controls.apply(namespace, normalizeControls({ faults: list }))\n return json(200, { faults: faults.list(namespace) })\n }),\n \"DELETE /faults\": ({ url, namespace }) => {\n controls.ensure(namespace)\n const everyNamespace = url.searchParams.get(\"all\") === \"1\"\n const id = url.searchParams.get(\"id\")\n if (id !== null) return removeFault(id, namespace, everyNamespace)\n faults.clear(everyNamespace ? undefined : namespace)\n return json(200, { status: \"ok\" })\n },\n \"GET /faults/presets\": () => json(200, presetList()),\n \"POST /faults/presets/:name\": ({ params, body, namespace }) =>\n guard(() => {\n const name = params.name as string\n if (!controls.presets[name])\n return adminError(404, `no fault preset ${name}; GET ${adminPrefix}/faults/presets`)\n return json(201, {\n preset: name,\n rules: controls.addFault(namespace, { ...(isRecord(body) ? body : {}), preset: name }),\n })\n }),\n \"GET /faults/:id\": ({ params, namespace }) => {\n controls.ensure(namespace)\n const found = faults.get(params.id as string, namespace)\n return found ? json(200, found) : adminError(404, `no fault ${params.id}`)\n },\n \"DELETE /faults/:id\": ({ params, url, namespace }) => {\n controls.ensure(namespace)\n return removeFault(params.id as string, namespace, url.searchParams.get(\"all\") === \"1\")\n },\n\n \"GET /snapshots\": ({ namespace }) => json(200, { snapshots: snapshots.list(namespace) }),\n \"POST /snapshots\": ({ body, namespace }) =>\n guard(() => {\n const id = isRecord(body) ? body.name : undefined\n if (id !== undefined && (typeof id !== \"string\" || !KEY_PATTERN.test(id)))\n return adminError(400, `name: must match ${KEY_PATTERN}`)\n return json(201, snapshots.create(namespace, id))\n }),\n \"GET /snapshots/:id\": ({ params, namespace }) => {\n const id = params.id as string\n const info = snapshots.get(namespace, id)\n if (!info) return adminError(404, `no snapshot ${id} in namespace ${namespace}`)\n return json(200, snapshots.export(namespace, id) ?? info)\n },\n \"PUT /snapshots/:id\": ({ params, body, namespace }) =>\n guard(() => {\n const id = params.id as string\n if (!KEY_PATTERN.test(id)) return adminError(400, `id: must match ${KEY_PATTERN}`)\n return json(200, snapshots.import(namespace, id, assertSnapshotDocument(body)))\n }),\n \"POST /snapshots/:id/restore\": ({ params, namespace }) =>\n guard(() => {\n const id = params.id as string\n if (!snapshots.restore(namespace, id))\n return adminError(404, `no snapshot ${id} in namespace ${namespace}`)\n return json(200, { status: \"ok\", id, namespace })\n }),\n \"DELETE /snapshots/:id\": ({ params, namespace }) => {\n const id = params.id as string\n return snapshots.remove(namespace, id)\n ? json(200, { status: \"ok\" })\n : adminError(404, `no snapshot ${id} in namespace ${namespace}`)\n },\n\n \"GET /timeline\": ({ namespace }) => json(200, context.timeTravel.inspect(namespace)),\n \"POST /checkpoints\": ({ body, namespace }) => {\n const branch = isRecord(body) && typeof body.branch === \"string\" ? body.branch : \"main\"\n try {\n return json(201, context.timeTravel.checkpoint(namespace, branch))\n } catch (error) {\n return adminError(409, error instanceof Error ? error.message : String(error))\n }\n },\n \"POST /branches/:name\": ({ params, body, namespace }) => {\n const at = isRecord(body) && typeof body.at === \"string\" ? body.at : undefined\n try {\n return json(\n 201,\n context.timeTravel.branch(params.name as string, {\n namespace,\n ...(at !== undefined ? { at } : {}),\n }),\n )\n } catch (error) {\n return adminError(409, error instanceof Error ? error.message : String(error))\n }\n },\n \"POST /branches/:name/checkout\": ({ params, body, namespace }) => {\n if (!isRecord(body) || typeof body.checkpoint !== \"string\") {\n return adminError(400, 'expected {\"checkpoint\":\"cp_...\"}')\n }\n try {\n context.timeTravel.checkout(body.checkpoint, {\n namespace,\n branch: params.name as string,\n })\n return json(200, { status: \"ok\", branch: params.name, checkpoint: body.checkpoint })\n } catch (error) {\n return adminError(409, error instanceof Error ? error.message : String(error))\n }\n },\n\n \"GET /requests\": ({ url, namespace }) => {\n const status = url.searchParams.get(\"status\")\n const since = url.searchParams.get(\"since\")\n const limit = url.searchParams.get(\"limit\")\n const sinceMs = since === null ? undefined : parseInstant(since)\n if (since !== null && sinceMs === undefined) {\n return adminError(400, \"since: expected epoch ms or ISO-8601\")\n }\n // `0` is a status here: it is how the journal records a dropped connection.\n if (status !== null && !/^(0|\\d{3})$/.test(status))\n return adminError(400, \"status: expected an HTTP status, or 0 for a dropped connection\")\n if (limit !== null && !/^\\d+$/.test(limit)) return adminError(400, \"limit: expected a count\")\n const operationId = url.searchParams.get(\"operationId\")\n const method = url.searchParams.get(\"method\")\n const path = url.searchParams.get(\"path\")\n const faultId = url.searchParams.get(\"faultId\")\n const everyNamespace = url.searchParams.get(\"all\") === \"1\"\n return json(200, {\n size: context.journal.size,\n requests: context.journal.list({\n ...(everyNamespace ? {} : { namespace }),\n ...(operationId !== null ? { operationId } : {}),\n ...(method !== null ? { method } : {}),\n ...(path !== null ? { path } : {}),\n ...(faultId !== null ? { faultId } : {}),\n ...(status !== null ? { status: Number(status) } : {}),\n ...(sinceMs !== undefined ? { since: sinceMs } : {}),\n ...(limit !== null ? { limit: Number(limit) } : {}),\n }),\n })\n },\n \"DELETE /requests\": ({ url, namespace }) => {\n context.journal.clear(url.searchParams.get(\"all\") === \"1\" ? undefined : namespace)\n return json(200, { status: \"ok\" })\n },\n\n // Totals across every namespace, unless the caller names one.\n \"GET /metrics\": ({ request, url, namespace }) =>\n json(200, context.metrics.report(explicitNamespace(request, url) ? namespace : undefined)),\n \"DELETE /metrics\": ({ request, url, namespace }) => {\n context.metrics.reset(explicitNamespace(request, url) ? namespace : undefined)\n return json(200, { status: \"ok\" })\n },\n }\n\n for (const key of Object.keys(context.routes)) {\n if (Object.hasOwn(builtin, key)) throw new Error(`admin route ${key} overrides a shared route`)\n const path = key.slice(key.indexOf(\" \") + 1)\n if (isAdminPath(path, \"/ns\") || isAdminPath(path, \"/blobs\"))\n throw new Error(`admin route ${key} overlaps an internal transport`)\n }\n const routes = [...Object.entries(builtin), ...Object.entries(context.routes)]\n .map(([key, handler]) => {\n const space = key.indexOf(\" \")\n return { method: key.slice(0, space), pattern: key.slice(space + 1), handler }\n })\n // Stable: among equally specific routes the shared ones still come first.\n .sort((a, b) => paramCount(a.pattern) - paramCount(b.pattern))\n\n return {\n namespaceOf: headerNamespace,\n controls,\n snapshots,\n async handle(request) {\n const url = new URL(request.url)\n if (url.pathname === `${adminPrefix}/health` && request.method === \"GET\") {\n return health()\n }\n if (!isAdminPath(url.pathname, adminPrefix)) {\n return undefined\n }\n const path = url.pathname.slice(adminPrefix.length) || \"/\"\n // The shell and its vendor chip have no data. Panel markup stays on GET /ui/manifest,\n // which is locked.\n const shell =\n request.method === \"GET\" &&\n (path === \"/ui\" || path === \"/ui/\" || path === ADMIN_BRANDS_PATH)\n if (\n !shell &&\n context.adminKey !== undefined &&\n !hasAdminKey(request.headers, context.adminKey)\n ) {\n return adminError(401, `missing or wrong ${ADMIN_KEY_HEADER}`)\n }\n for (const route of routes) {\n if (route.method !== request.method) continue\n let params: Record<string, string> | undefined\n try {\n params = matchRoute(route.pattern, path)\n } catch {\n return adminError(400, \"invalid path encoding\")\n }\n if (!params) continue\n let body: unknown\n try {\n body = await readJson(request)\n } catch {\n return adminError(400, \"request body is not valid JSON\")\n }\n const namespace = adminNamespace(request, url)\n if (!KEY_PATTERN.test(namespace)) return adminError(400, \"invalid namespace\")\n return route.handler({\n request,\n url,\n params,\n namespace,\n body,\n })\n }\n return adminError(\n 404,\n `no admin route ${request.method} ${path}; GET ${adminPrefix} lists them`,\n )\n },\n }\n}\n", "/**\n * Reading the vendor credential a request carries.\n *\n * Several vendor SDKs (Stripe, AWS, PostHog, Twilio) cannot add a namespace header, so a\n * runtime can also pick a request's namespace from its credential: a suite maps each\n * worker's API key, token or account SID to a namespace through `PUT /__admin/credentials`.\n * These helpers pull the credential out of the usual carriers.\n */\n\n/** The token after `Bearer `, or `undefined`. */\nexport const bearerToken = (request: Request): string | undefined => {\n const header = request.headers.get(\"authorization\")\n if (!header) return undefined\n const match = /^Bearer\\s+(.+)$/i.exec(header.trim())\n return match?.[1]?.trim() || undefined\n}\n\nexport type BasicCredentials = { username: string; password: string }\n\n/** `{ username, password }` from `Authorization: Basic \u2026`, or `undefined`. */\nexport const basicAuth = (request: Request): BasicCredentials | undefined => {\n const header = request.headers.get(\"authorization\")\n if (!header) return undefined\n const match = /^Basic\\s+(.+)$/i.exec(header.trim())\n if (!match?.[1]) return undefined\n let decoded: string\n try {\n decoded = atob(match[1].trim())\n } catch {\n return undefined\n }\n const colon = decoded.indexOf(\":\")\n if (colon < 0) return { username: decoded, password: \"\" }\n return { username: decoded.slice(0, colon), password: decoded.slice(colon + 1) }\n}\n\n/**\n * The access key id of an AWS SigV4-signed request (`Credential=AKID/date/region/service/\u2026`),\n * from the `Authorization` header or a presigned `X-Amz-Credential` query parameter.\n */\nexport const sigV4AccessKeyId = (request: Request): string | undefined => {\n const header = request.headers.get(\"authorization\")\n const fromHeader = header ? /Credential=([^/,\\s]+)\\//.exec(header)?.[1] : undefined\n if (fromHeader) return fromHeader\n const query = new URL(request.url).searchParams.get(\"X-Amz-Credential\")\n return query ? (query.split(\"/\")[0] ?? undefined) : undefined\n}\n\n/** The credential in any of the common carriers: Bearer, Basic username, SigV4, or `x-api-key`. */\nexport const anyCredential = (request: Request): string | undefined =>\n bearerToken(request) ??\n basicAuth(request)?.username ??\n sigV4AccessKeyId(request) ??\n request.headers.get(\"x-api-key\") ??\n undefined\n\n/** Credential \u2192 namespace mapping behind `PUT /__admin/credentials`. */\nexport type CredentialRegistry = {\n set(credential: string, namespace: string): void\n get(credential: string): string | undefined\n remove(credential: string): boolean\n clear(): void\n entries(): { credential: string; namespace: string }[]\n}\n\nexport const createCredentialRegistry = (): CredentialRegistry => {\n const map = new Map<string, string>()\n return {\n set: (credential, namespace) => {\n map.set(credential, namespace)\n },\n get: (credential) => map.get(credential),\n remove: (credential) => map.delete(credential),\n clear: () => map.clear(),\n entries: () =>\n [...map]\n .map(([credential, namespace]) => ({ credential, namespace }))\n .sort((a, b) => a.credential.localeCompare(b.credential)),\n }\n}\n\n/** A credential shown in admin output: enough to recognise it, never the whole secret. */\nexport const maskCredential = (credential: string): string =>\n credential.length <= 8\n ? `${credential.slice(0, 2)}\u2026`\n : `${credential.slice(0, 6)}\u2026${credential.slice(-2)}`\n", "import { JSON_MEDIA_TYPE } from \"@crvouga/mockingbird-http-codec\"\n\n/** JSON response with a normalised content type. */\nexport const jsonRes = (\n status: number,\n body: unknown,\n headers: Record<string, string> = {},\n): Response =>\n new Response(JSON.stringify(body), {\n status,\n headers: { \"content-type\": JSON_MEDIA_TYPE, ...headers },\n })\n\n/** Thrown by handlers to produce a provider-shaped error response via `onError`. */\nexport class HttpError extends Error {\n constructor(\n readonly status: number,\n readonly body: unknown,\n readonly headers: Record<string, string> = {},\n ) {\n super(`HTTP ${status}`)\n this.name = \"HttpError\"\n }\n\n toResponse(): Response {\n const contentType = this.headers[\"content-type\"]?.split(\";\", 1)[0]?.trim().toLowerCase()\n if (contentType === \"text/plain\") {\n return new Response(String(this.body), {\n status: this.status,\n headers: this.headers,\n })\n }\n return jsonRes(this.status, this.body, this.headers)\n }\n}\n\nexport type FieldResult<T> = { ok: true; value: T } | { ok: false; reason: string }\n\nconst ok = <T>(value: T): FieldResult<T> => ({ ok: true, value })\nconst fail = <T>(reason: string): FieldResult<T> => ({ ok: false, reason })\n\n/** Form bodies decode to strings; these coerce the way HTTP servers do, reporting why not. */\nexport const coerce = {\n string(value: unknown): FieldResult<string> {\n return typeof value === \"string\" ? ok(value) : fail(\"expected a string\")\n },\n integer(value: unknown): FieldResult<number> {\n if (typeof value === \"number\" && Number.isInteger(value)) return ok(value)\n if (typeof value === \"string\" && /^-?\\d+$/.test(value.trim())) {\n const parsed = Number(value)\n return Number.isSafeInteger(parsed) ? ok(parsed) : fail(\"integer out of range\")\n }\n return fail(\"expected an integer\")\n },\n boolean(value: unknown): FieldResult<boolean> {\n if (typeof value === \"boolean\") return ok(value)\n if (value === \"true\" || value === \"1\") return ok(true)\n if (value === \"false\" || value === \"0\") return ok(false)\n return fail(\"expected a boolean\")\n },\n enumeration<T extends string>(value: unknown, allowed: readonly T[]): FieldResult<T> {\n const match = allowed.find((candidate) => candidate === value)\n return match === undefined ? fail(`expected one of ${allowed.join(\", \")}`) : ok(match)\n },\n /** Flat string-to-string map, the shape of Stripe-style `metadata`. */\n stringMap(value: unknown): FieldResult<Record<string, string>> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value))\n return fail(\"expected an object\")\n const out: Record<string, string> = {}\n for (const [key, item] of Object.entries(value)) {\n if (typeof item !== \"string\") return fail(`expected a string at ${key}`)\n out[key] = item\n }\n return ok(out)\n },\n}\n\n/** Count Unicode code points, the way JSON Schema and most APIs measure string length. */\nexport const codePointLength = (value: string) => [...value].length\n", "import type { BodyIssue } from \"./validation.js\"\n\n/**\n * What the mock received from a request it rejected, so a 4xx can be attributed after the\n * fact (an empty body, a missing `content-type`, a schema violation) without logging the body.\n */\nexport type RejectedRequest = {\n /** The raw `content-type` header, or `null` when the request sent none. */\n contentType: string | null\n /** Bytes of body received from `content-length` (`0` for none), or `null` when the client sent no length (a streamed / chunked body). */\n bodyBytes: number | null\n /** The raw `transfer-encoding` header (`chunked`), or `null`. */\n transferEncoding: string | null\n}\n\n/** One handled request, as the structured log sees it. */\nexport type RequestLog = {\n service: string\n namespace: string\n operationId: string | undefined\n method: string\n path: string\n status: number\n durationMs: number\n /** True when the path matched no operation in the contract. */\n unmatched: boolean\n /** Set when a fault rule produced the response. */\n faultId?: string\n /** Milliseconds of injected wait: latency, fault delays and timeouts. Absent when none. */\n delayMs?: number\n /** Resource ids the handler touched (`userId`, `orderId`, \u2026), when the service reports them. */\n ids?: Record<string, string>\n /** Set when the service created a resource the request referred to but that did not exist. */\n adopted?: boolean\n /** Explicit durable acceptance, independent of response delivery. */\n accepted?: boolean\n /** Checkpoint captured at explicit acceptance. */\n checkpoint?: string\n /** Set on a rejection (status \u2265 400) the mock produced itself, never on a scripted fault. */\n request?: RejectedRequest\n /** The validation issues behind a rejection, when the service found any. */\n issues?: BodyIssue[]\n}\n\nexport type MetricsReport = {\n requests: number\n /** Counts keyed `<operationId> <status>`. */\n byOperation: Record<string, number>\n /**\n * Paths that matched no operation, most frequent first.\n *\n * This is the early-warning signal: a consumer calling something the mock does\n * not implement shows up here as a count, before it fails a suite as a 404.\n */\n unmatched: { method: string; path: string; count: number }[]\n faults: number\n totalDurationMs: number\n}\n\nexport type Metrics = {\n record(entry: RequestLog): void\n report(namespace?: string): MetricsReport\n reset(namespace?: string): void\n}\n\nexport const createMetrics = (partition = true): Metrics => {\n const namespaces = new Map<string, Metrics>()\n let requests = 0\n let faults = 0\n let totalDurationMs = 0\n const byOperation = new Map<string, number>()\n const unmatched = new Map<string, number>()\n return {\n record(entry) {\n if (partition) {\n let scoped = namespaces.get(entry.namespace)\n if (!scoped) {\n scoped = createMetrics(false)\n namespaces.set(entry.namespace, scoped)\n }\n scoped.record(entry)\n }\n requests++\n totalDurationMs += entry.durationMs\n if (entry.faultId !== undefined) faults++\n const key = `${entry.operationId ?? \"(unmatched)\"} ${entry.status}`\n byOperation.set(key, (byOperation.get(key) ?? 0) + 1)\n if (entry.unmatched) {\n const route = `${entry.method} ${entry.path}`\n unmatched.set(route, (unmatched.get(route) ?? 0) + 1)\n }\n },\n report: (namespace) =>\n namespace !== undefined\n ? (namespaces.get(namespace) ?? createMetrics(false)).report()\n : {\n requests,\n byOperation: Object.fromEntries(\n [...byOperation].sort(([a], [b]) => a.localeCompare(b)),\n ),\n unmatched: [...unmatched]\n .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n .map(([route, count]) => {\n const space = route.indexOf(\" \")\n return { method: route.slice(0, space), path: route.slice(space + 1), count }\n }),\n faults,\n totalDurationMs,\n },\n reset(namespace) {\n if (namespace !== undefined) {\n namespaces.delete(namespace)\n return\n }\n namespaces.clear()\n requests = 0\n faults = 0\n totalDurationMs = 0\n byOperation.clear()\n unmatched.clear()\n },\n }\n}\n", "/** Policy only for runtime-owned HTTP sends; it does not sandbox DNS or arbitrary sockets. */\nexport type OutboundPolicy = {\n mode: \"offline\" | \"allowlist\"\n origins?: string[]\n maxRedirects?: number\n maxBodyBytes?: number\n onReject?(event: { namespace: string; policy: string; reason: string }): void\n}\nexport type OwnedTransport = (\n request: Request,\n namespace: string,\n send: typeof fetch,\n) => Promise<Response>\nexport function ownedTransport(policy: OutboundPolicy): OwnedTransport {\n if (\n ![\"offline\", \"allowlist\"].includes(policy.mode) ||\n policy.origins?.some((origin) => {\n try {\n return new URL(origin).origin !== origin\n } catch {\n return true\n }\n })\n )\n throw new Error(\"invalid outbound transport policy\")\n const reject = (namespace: string, reason: string): never => {\n try {\n policy.onReject?.({ namespace, policy: policy.mode, reason })\n } catch {}\n throw new Error(`outbound policy ${policy.mode}: ${reason}`)\n }\n return async (request, namespace, send) => {\n if (policy.mode === \"offline\") return reject(namespace, \"delivery disabled\")\n const allowed = (url: URL) =>\n [\"http:\", \"https:\"].includes(url.protocol) &&\n !url.username &&\n !url.password &&\n (policy.origins ?? []).includes(url.origin)\n let url = new URL(request.url)\n if (!allowed(url)) return reject(namespace, \"destination not allowed\")\n const max = policy.maxBodyBytes ?? 1024 * 1024\n const chunks: Uint8Array[] = []\n let size = 0\n const reader = request.body?.getReader()\n if (reader)\n try {\n for (;;) {\n const item = await reader.read()\n if (item.done) break\n size += item.value.length\n if (size > max) return reject(namespace, \"body limit exceeded\")\n chunks.push(item.value)\n }\n } finally {\n void reader.cancel().catch(() => {})\n reader.releaseLock()\n }\n const body = new Uint8Array(size)\n let offset = 0\n for (const chunk of chunks) {\n body.set(chunk, offset)\n offset += chunk.length\n }\n let method = request.method,\n headers = new Headers(request.headers)\n for (let redirects = 0; ; redirects++) {\n if (!allowed(url)) return reject(namespace, \"redirect destination not allowed\")\n const response = await send(\n new Request(url, {\n method,\n headers,\n ...(method !== \"GET\" && method !== \"HEAD\" ? { body } : {}),\n redirect: \"manual\",\n signal: request.signal,\n }),\n )\n if (![301, 302, 303, 307, 308].includes(response.status)) return response\n const location = response.headers.get(\"location\")\n if (!location) return response\n await response.body?.cancel()\n if (redirects >= (policy.maxRedirects ?? 5))\n return reject(namespace, \"redirect limit exceeded\")\n const next = new URL(location, url)\n if (next.origin !== url.origin) {\n headers = new Headers(headers)\n for (const key of [\"authorization\", \"cookie\", \"proxy-authorization\"]) headers.delete(key)\n }\n if (\n response.status === 303 ||\n ((response.status === 301 || response.status === 302) && method === \"POST\")\n ) {\n method = \"GET\"\n headers.delete(\"content-length\")\n headers.delete(\"content-type\")\n }\n url = next\n }\n }\n}\n", "/**\n * The shared admin is a prebuilt React + Ant Design bundle (about 1.3 MB as a string). The\n * runtime loads it lazily, on the first request for an admin page, through a dynamic `import()`\n * with a literal specifier: Node, Bun and every bundler resolve it, a bundler that splits code\n * keeps it in a chunk of its own, and an app that never serves `/__admin/ui` never parses it.\n * `scripts/bundle-service.ts` emits it as `dist/admin-ui.js` beside each service's entries.\n * Service imports stay DOM-free and nothing here imports the bundle statically.\n */\nexport type { AdminConfig as AdminBootConfig } from \"@crvouga/mockingbird-admin-ui\"\n\nexport type AdminClient = typeof import(\"@crvouga/mockingbird-admin-ui/document\")\n\nlet loading: Promise<AdminClient> | undefined\n\n/** The browser client, imported once per process on first use. A failed import is retried. */\nexport const loadAdminClient = (): Promise<AdminClient> => {\n loading ??= import(\"@crvouga/mockingbird-admin-ui/document\").catch((error: unknown) => {\n loading = undefined\n throw error\n })\n return loading\n}\n", "import { requestBaseUrl } from \"@crvouga/mockingbird-core\"\nimport { type AdminClient, loadAdminClient } from \"./admin-client.js\"\nimport type { AdminRoutes } from \"./control.js\"\nimport { ADMIN_BRANDS_PATH, ADMIN_KEY_HEADER, ADMIN_PREFIX } from \"./control.js\"\nimport type { AdminExtension, AdminUi } from \"./surface.js\"\nimport { STANDARD_ADMIN_ROUTES } from \"./surface.js\"\n\nconst escapeHtml = (value: string): string =>\n value.replace(/[&<>\"']/g, (char) => {\n switch (char) {\n case \"&\":\n return \"&amp;\"\n case \"<\":\n return \"&lt;\"\n case \">\":\n return \"&gt;\"\n case '\"':\n return \"&quot;\"\n default:\n return \"&#39;\"\n }\n })\n\n/** One service's vendor chip: what `GET <adminPrefix>/ui/brands.json` returns under its name. */\nexport type AdminBrand = {\n vendor: string\n website: string\n /** Vendor API reference, when there is one. */\n docs: string | null\n /** The service's page on the docs site. A link only; the admin never fetches it. */\n guide: string\n /** A `data:image/\u2026;base64,` URI, so the chip loads nothing from the network; \"\" for none. */\n logo: string\n color: string | null\n description: string | null\n}\n\n/**\n * The brand record of the package this runtime was bundled into. `scripts/bundle-service.ts`\n * defines it from `sites/docs/src/data/brands.json` and the logo file; unbundled (tests,\n * source checkouts) it is absent and the admin shows no chip.\n */\ndeclare const __MOCKINGBIRD_ADMIN_BRAND__: AdminBrand | undefined\nconst EMBEDDED_BRAND: AdminBrand | undefined =\n typeof __MOCKINGBIRD_ADMIN_BRAND__ === \"object\" ? __MOCKINGBIRD_ADMIN_BRAND__ : undefined\n\n/**\n * The catalog the shared client reads: `{ [service]: brand }`, or `{}` without one. It ships\n * inside the package and is served by the emulator, so opening the admin makes no request to\n * any other host (no CORS failure, works offline).\n */\nexport const adminBrandCatalog = (\n service: string,\n brand: AdminBrand | undefined = EMBEDDED_BRAND,\n): Record<string, AdminBrand> => (brand ? { [service]: brand } : {})\n\n/**\n * The default admin document. It talks only to `/__admin/*`, so every mock can serve it.\n * Bespoke panels arrive later from `GET /ui/manifest`, which stays behind the admin key.\n * The header chip is filled from `GET <adminPrefix>/ui/brands.json` on the same emulator.\n */\nexport const renderAdminDocument = async (\n service: string,\n adminPrefix = ADMIN_PREFIX,\n): Promise<string> => adminDocument(await loadAdminClient(), service, adminPrefix)\n\nconst adminDocument = (client: AdminClient, service: string, adminPrefix: string): string => {\n const name = escapeHtml(service)\n const script = client.adminClientSource({\n standardRoutes: STANDARD_ADMIN_ROUTES,\n adminPrefix,\n adminKeyHeader: ADMIN_KEY_HEADER,\n brandsUrl: `${adminPrefix}${ADMIN_BRANDS_PATH}`,\n service,\n })\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<meta name=\"color-scheme\" content=\"light dark\">\n<title>${name} admin</title>\n<style>html,body{margin:0;min-height:100%}#admin-root{min-height:100%}</style>\n</head>\n<body>\n<main id=\"admin-root\" data-mockingbird-admin data-admin-ui-library=\"antd\" data-service=\"${name}\">\n<noscript>Enable JavaScript to use administration.</noscript>\n</main>\n${script}\n</body>\n</html>`\n}\n\nconst htmlResponse = (body: string): Response =>\n new Response(body, {\n status: 200,\n headers: {\n \"content-type\": \"text/html; charset=utf-8\",\n \"cache-control\": \"no-store\",\n },\n })\n\nconst json = (body: unknown): Response =>\n new Response(JSON.stringify(body), {\n status: 200,\n headers: { \"content-type\": \"application/json; charset=utf-8\" },\n })\n\nconst describeExtension = (extension: AdminExtension): Record<string, unknown> => {\n if (extension.kind === \"route\") return { ...extension }\n if (extension.kind === \"sql\") {\n return {\n kind: \"sql\",\n id: extension.id ?? \"sql\",\n title: extension.title ?? \"SQL\",\n ...(extension.description !== undefined ? { description: extension.description } : {}),\n }\n }\n return {\n kind: \"panel\",\n id: extension.id,\n title: extension.title,\n ...(extension.description !== undefined ? { description: extension.description } : {}),\n html: extension.html,\n ...(extension.script !== undefined ? { script: extension.script } : {}),\n }\n}\n\n/** `GET /__admin/ui` plus the manifest a bespoke panel list is read from. */\nexport const adminUiRoutes = (\n service: string,\n ui: AdminUi | undefined,\n adminPrefix = ADMIN_PREFIX,\n): AdminRoutes => {\n // The client bundle is loaded here, on the first page request, not when the runtime is built;\n // `render` and `defaultHtml()` stay synchronous for bespoke documents.\n const page = async ({ request }: { request: Request }): Promise<Response> => {\n let client: AdminClient\n try {\n client = await loadAdminClient()\n } catch (error) {\n // An app bundle may leave the client out (`--external:./admin-ui.js`) and never serve it.\n return new Response(\n `The admin page is not available: its browser client (admin-ui.js) could not be loaded. ${error instanceof Error ? error.message : String(error)}`,\n { status: 503, headers: { \"content-type\": \"text/plain; charset=utf-8\" } },\n )\n }\n const mountPrefix = new URL(requestBaseUrl(request)).pathname.replace(/\\/$/, \"\")\n const shell = () => adminDocument(client, service, `${mountPrefix}${adminPrefix}`)\n return htmlResponse(ui?.render ? ui.render({ service, defaultHtml: shell }) : shell())\n }\n return {\n \"GET /ui\": page,\n \"GET /ui/\": page,\n [`GET ${ADMIN_BRANDS_PATH}`]: () => json(adminBrandCatalog(service)),\n \"GET /ui/manifest\": () =>\n json({\n service,\n standardRoutes: STANDARD_ADMIN_ROUTES,\n panels: (ui?.panels ?? []).map((panel) => ({\n id: panel.id,\n title: panel.title,\n ...(panel.description !== undefined ? { description: panel.description } : {}),\n html: panel.html,\n ...(panel.script !== undefined ? { script: panel.script } : {}),\n })),\n extensions: (ui?.extensions ?? []).map(describeExtension),\n }),\n }\n}\n", "import { Timeline } from \"@crvouga/mockingbird-core\"\nimport type { SqliteClient } from \"@crvouga/mockingbird-sqlite\"\n\n/**\n * A point-in-time copy of everything a service namespace holds.\n *\n * All service state lives in the two core tables keyed by namespace, so a snapshot\n * is generic: any service gets per-test rollback without knowing its own schema.\n * Restoring is much cheaper than rebuilding a namespace from a corpus.\n */\nexport type NamespaceSnapshot = {\n namespace: string\n records: { collection: string; id: string; seq: number; value: string }[]\n sequences: { name: string; kind: string; value: number }[]\n}\n\n/**\n * @deprecated Low-level Timeline payload capture retained for API compatibility. Provider code\n * must use the runtime Timeline or `withNamespaceRollback`.\n */\nexport const snapshotNamespace = (sqlite: SqliteClient, namespace: string): NamespaceSnapshot => ({\n namespace,\n records: sqlite\n .prepare(\n \"SELECT collection, id, seq, value FROM mockingbird_records WHERE namespace = ? ORDER BY collection, seq\",\n )\n .all<{ collection: string; id: string; seq: number; value: string }>(namespace),\n sequences: sqlite\n .prepare(\n \"SELECT name, kind, value FROM mockingbird_sequences WHERE namespace = ? ORDER BY name, kind\",\n )\n .all<{ name: string; kind: string; value: number }>(namespace),\n})\n\n/**\n * Replace a namespace's contents with `snapshot`. The namespace is emptied first,\n * so restoring is an assignment, not a merge \u2014 records created since the snapshot\n * are gone afterwards.\n *\n * @deprecated Low-level Timeline payload restore retained for API compatibility. Provider code\n * must use the runtime Timeline or `withNamespaceRollback`.\n */\nexport const restoreNamespace = (\n sqlite: SqliteClient,\n namespace: string,\n snapshot: NamespaceSnapshot,\n): void => {\n sqlite.transaction(() => {\n sqlite.prepare(\"DELETE FROM mockingbird_records WHERE namespace = ?\").run(namespace)\n sqlite.prepare(\"DELETE FROM mockingbird_sequences WHERE namespace = ?\").run(namespace)\n const record = sqlite.prepare(\n \"INSERT INTO mockingbird_records (namespace, collection, id, seq, value) VALUES (?, ?, ?, ?, ?)\",\n )\n for (const row of snapshot.records) {\n record.run(namespace, row.collection, row.id, row.seq, row.value)\n }\n const sequence = sqlite.prepare(\n \"INSERT INTO mockingbird_sequences (namespace, name, kind, value) VALUES (?, ?, ?, ?)\",\n )\n for (const row of snapshot.sequences) {\n sequence.run(namespace, row.name, row.kind, row.value)\n }\n })\n}\n\n/**\n * Execute asynchronous service work atomically using the canonical Timeline rollback primitive.\n * This is the prescribed escape hatch when the SQLite adapter cannot hold a transaction across\n * `await`; service code should not coordinate raw namespace snapshots itself.\n */\nexport const withNamespaceRollback = async <T>(\n sqlite: SqliteClient,\n namespace: string,\n run: () => Promise<T>,\n): Promise<T> => {\n const rollback = new Timeline<NamespaceSnapshot>({ maxCheckpoints: 1 })\n const before = rollback.commit(snapshotNamespace(sqlite, namespace))\n try {\n return await run()\n } catch (error) {\n restoreNamespace(sqlite, namespace, before.value)\n throw error\n }\n}\n", "import type { SqliteClient } from \"@crvouga/mockingbird-sqlite\"\nimport { Collection } from \"./collection.js\"\nimport type { AdminRoutes } from \"./control.js\"\n\nexport const STATE_FIELD_KINDS = [\n \"string\",\n \"number\",\n \"boolean\",\n \"null\",\n \"object\",\n \"array\",\n \"unknown\",\n] as const\n\nexport type StateFieldKind = (typeof STATE_FIELD_KINDS)[number]\n\n/** JSON-safe annotations a bespoke admin UI may read. The default UI shows them as text. */\nexport type StateMeta = Readonly<Record<string, string | number | boolean | null>>\n\nexport type StateField = {\n name: string\n kind: StateFieldKind\n optional: boolean\n description?: string\n /** One level of nested object fields. */\n fields?: StateField[]\n meta?: StateMeta\n}\n\n/**\n * What a service knows about a collection before any row exists.\n * Stored rows still appear, including fields this declaration does not mention.\n */\nexport type StateDeclaration = {\n name: string\n label?: string\n description?: string\n fields?: readonly StateField[]\n meta?: StateMeta\n}\n\nexport type StateCollectionView = {\n name: string\n label: string\n description?: string\n count: number\n /** `mixed` when a declaration and stored rows both contribute fields. */\n source: \"declared\" | \"inferred\" | \"mixed\"\n fields: StateField[]\n meta?: StateMeta\n}\n\n/** The shape of one namespace, for an admin UI that has never seen the service before. */\nexport type StateView = {\n namespace: string\n storageNamespace: string\n collections: StateCollectionView[]\n}\n\nexport type StateRecord = {\n id: string\n seq: number\n value: unknown\n}\n\nexport type StatePage = {\n collection: string\n count: number\n records: StateRecord[]\n next: number | null\n}\n\nexport type StateFailure = { ok: false; status: number; message: string }\nexport type StateResult<T> = { ok: true; value: T } | StateFailure\n\nconst COLLECTION_NAME = /^[A-Za-z0-9_.@:-]{1,200}$/\nconst RECORD_ID = /^[^\\s/]{1,256}$/\nconst SAMPLE = 25\nconst WALK_LIMIT = 10_000\nconst SKIP_CTORS = new Set([\"Hono\", \"HonoRequest\", \"Router\"])\n\nconst fail = (status: number, message: string): StateFailure => ({ ok: false, status, message })\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n\nconst kindOf = (value: unknown): StateFieldKind => {\n if (value === null) return \"null\"\n if (Array.isArray(value)) return \"array\"\n switch (typeof value) {\n case \"string\":\n return \"string\"\n case \"number\":\n return Number.isFinite(value) ? \"number\" : \"unknown\"\n case \"boolean\":\n return \"boolean\"\n case \"object\":\n return \"object\"\n default:\n return \"unknown\"\n }\n}\n\nconst humanize = (name: string): string => {\n const words = name.replace(/[@:_-]+/g, \" \").trim()\n if (words === \"\") return name\n return words.charAt(0).toUpperCase() + words.slice(1)\n}\n\n/** Drop values that cannot ride in a JSON admin response. */\nexport const jsonValue = (value: unknown): StateResult<unknown> => {\n if (value === undefined) return fail(400, \"value is required\")\n try {\n return { ok: true, value: JSON.parse(JSON.stringify(value)) as unknown }\n } catch {\n return fail(400, \"value must be JSON\")\n }\n}\n\nconst ctorName = (value: object): string => {\n const ctor = (value as { constructor?: { name?: string } }).constructor\n return typeof ctor?.name === \"string\" ? ctor.name : \"\"\n}\n\nconst isSqlite = (value: object): boolean =>\n \"prepare\" in value &&\n typeof (value as { prepare?: unknown }).prepare === \"function\" &&\n \"transaction\" in value\n\n/** Every Collection hanging off `root`, including ones stored in maps. */\nexport const discoverCollections = (root: unknown): Collection<unknown>[] => {\n const found: Collection<unknown>[] = []\n const seen = new Set<object>()\n const visit = (value: unknown, depth: number): void => {\n if (found.length + seen.size > WALK_LIMIT) return\n if (value === null || typeof value !== \"object\") return\n if (seen.has(value)) return\n seen.add(value)\n if (value instanceof Collection) {\n found.push(value as Collection<unknown>)\n return\n }\n if (value instanceof Map) {\n for (const child of value.values()) visit(child, depth + 1)\n return\n }\n if (value instanceof Set) {\n for (const child of value.values()) visit(child, depth + 1)\n return\n }\n if (depth > 6 || isSqlite(value) || SKIP_CTORS.has(ctorName(value))) return\n if (Array.isArray(value)) {\n const cap = Math.min(value.length, 32)\n for (let i = 0; i < cap; i++) visit(value[i], depth + 1)\n return\n }\n let children: unknown[]\n try {\n children = Object.values(value)\n } catch {\n return\n }\n for (const child of children) visit(child, depth + 1)\n }\n visit(root, 0)\n return found\n}\n\nconst storedNames = (sqlite: SqliteClient, namespace: string): string[] => {\n const records = sqlite\n .prepare(\"SELECT DISTINCT collection AS name FROM mockingbird_records WHERE namespace = ?\")\n .all<{ name: string }>(namespace)\n const sequences = sqlite\n .prepare(\n \"SELECT DISTINCT name FROM mockingbird_sequences WHERE namespace = ? AND kind = 'collection'\",\n )\n .all<{ name: string }>(namespace)\n return [...records, ...sequences].map((row) => row.name)\n}\n\ntype FieldAccum = {\n name: string\n kinds: Set<StateFieldKind>\n present: number\n nested: Map<string, FieldAccum>\n}\n\nconst blankAccum = (name: string): FieldAccum => ({\n name,\n kinds: new Set(),\n present: 0,\n nested: new Map(),\n})\n\nconst absorb = (accum: FieldAccum, value: unknown): void => {\n const kind = kindOf(value)\n accum.kinds.add(kind)\n accum.present++\n if (!isRecord(value)) return\n for (const [key, child] of Object.entries(value)) {\n const nested = accum.nested.get(key) ?? blankAccum(key)\n absorb(nested, child)\n accum.nested.set(key, nested)\n }\n}\n\nconst finishField = (accum: FieldAccum, samples: number): StateField => {\n const kinds = [...accum.kinds]\n const kind = kinds.length === 1 ? (kinds[0] as StateFieldKind) : \"unknown\"\n const field: StateField = {\n name: accum.name,\n kind,\n optional: accum.present < samples || kinds.includes(\"null\"),\n }\n if (accum.nested.size > 0) {\n field.fields = [...accum.nested.values()]\n .sort((a, b) => a.name.localeCompare(b.name))\n .map((child) => finishField(child, accum.present))\n }\n return field\n}\n\nconst inferFields = (records: StateRecord[]): StateField[] => {\n if (records.length === 0) return []\n const sample = records.slice(0, SAMPLE)\n const objects = sample.filter((record) => isRecord(record.value))\n if (objects.length === 0) {\n const kinds = new Set(sample.map((record) => kindOf(record.value)))\n const list = [...kinds]\n return [\n {\n name: \"(value)\",\n kind: list.length === 1 ? (list[0] as StateFieldKind) : \"unknown\",\n optional: false,\n },\n ]\n }\n const root = new Map<string, FieldAccum>()\n for (const record of objects) {\n for (const [key, value] of Object.entries(record.value as Record<string, unknown>)) {\n const accum = root.get(key) ?? blankAccum(key)\n absorb(accum, value)\n root.set(key, accum)\n }\n }\n return [...root.values()]\n .sort((a, b) => a.name.localeCompare(b.name))\n .map((accum) => finishField(accum, objects.length))\n}\n\nconst mergeFields = (\n declared: readonly StateField[] | undefined,\n inferred: StateField[],\n): StateField[] => {\n const byName = new Map<string, StateField>()\n for (const field of inferred) byName.set(field.name, field)\n const ordered: StateField[] = []\n const seen = new Set<string>()\n for (const field of declared ?? []) {\n const found = byName.get(field.name)\n seen.add(field.name)\n if (!found) {\n ordered.push({ ...field, optional: field.optional })\n continue\n }\n ordered.push({\n ...found,\n kind: field.kind === \"unknown\" ? found.kind : field.kind,\n optional: field.optional || found.optional,\n ...(field.description !== undefined ? { description: field.description } : {}),\n ...(field.meta !== undefined ? { meta: field.meta } : {}),\n ...(field.fields !== undefined\n ? { fields: mergeFields(field.fields, found.fields ?? []) }\n : {}),\n })\n }\n for (const field of inferred) {\n if (!seen.has(field.name)) ordered.push(field)\n }\n return ordered\n}\n\nconst collectionOf = (sqlite: SqliteClient, namespace: string, name: string) =>\n new Collection<unknown>(sqlite, namespace, name)\n\nconst readRecord = (collection: Collection<unknown>, id: string): StateRecord | undefined => {\n const rows = collection.list({ where: (_value, _seq) => true, order: \"oldest\" })\n const row = rows.find((entry) => entry.id === id)\n return row ? { id: row.id, seq: row.seq, value: row.value } : undefined\n}\n\nexport type StateScope = {\n sqlite: SqliteClient\n /** Public namespace name a request selects. */\n namespace: string\n /** Namespace key used in `mockingbird_records`. */\n storageNamespace: string\n /** Service instance, walked for Collection fields. */\n root: unknown\n declarations?: readonly StateDeclaration[]\n}\n\n/** Describe every collection in a namespace. Empty declared collections are included. */\nexport const inspectState = (scope: StateScope): StateView => {\n const declared = new Map<string, StateDeclaration>()\n for (const declaration of scope.declarations ?? []) {\n if (COLLECTION_NAME.test(declaration.name)) declared.set(declaration.name, declaration)\n }\n const names = new Set<string>(declared.keys())\n for (const name of storedNames(scope.sqlite, scope.storageNamespace)) names.add(name)\n for (const collection of discoverCollections(scope.root)) {\n if (collection.namespace === scope.storageNamespace) names.add(collection.collectionName)\n }\n const collections: StateCollectionView[] = []\n for (const name of names) {\n if (!COLLECTION_NAME.test(name)) continue\n const declaration = declared.get(name)\n const collection = collectionOf(scope.sqlite, scope.storageNamespace, name)\n const records = collection\n .list({ order: \"newest\" })\n .slice(0, SAMPLE)\n .map((row) => ({ id: row.id, seq: row.seq, value: row.value }))\n const inferred = inferFields(records)\n const fields = mergeFields(declaration?.fields, inferred)\n const source =\n declaration && records.length > 0 ? \"mixed\" : declaration ? \"declared\" : \"inferred\"\n collections.push({\n name,\n label: declaration?.label ?? humanize(name),\n ...(declaration?.description !== undefined ? { description: declaration.description } : {}),\n count: collection.count(),\n source,\n fields,\n ...(declaration?.meta !== undefined ? { meta: declaration.meta } : {}),\n })\n }\n const order = new Map<string, number>()\n for (const [index, item] of (scope.declarations ?? []).entries()) order.set(item.name, index)\n collections.sort((a, b) => {\n const left = order.get(a.name)\n const right = order.get(b.name)\n if (left !== undefined && right !== undefined) return left - right\n if (left !== undefined) return -1\n if (right !== undefined) return 1\n return a.name.localeCompare(b.name)\n })\n return {\n namespace: scope.namespace,\n storageNamespace: scope.storageNamespace,\n collections,\n }\n}\n\nexport type StateQuery = {\n limit?: number\n after?: number\n order?: \"newest\" | \"oldest\"\n}\n\nconst pageOf = (\n sqlite: SqliteClient,\n storageNamespace: string,\n name: string,\n query: StateQuery,\n): StateResult<StatePage> => {\n if (!COLLECTION_NAME.test(name)) return fail(400, \"collection name is not allowed\")\n const limit = query.limit ?? 50\n if (!Number.isInteger(limit) || limit < 1 || limit > 200) {\n return fail(400, \"limit must be an integer from 1 to 200\")\n }\n const order = query.order ?? \"newest\"\n if (order !== \"newest\" && order !== \"oldest\")\n return fail(400, 'order must be \"newest\" or \"oldest\"')\n const collection = collectionOf(sqlite, storageNamespace, name)\n const rows = collection.list({ order }).filter((row) => {\n if (query.after === undefined) return true\n return order === \"newest\" ? row.seq < query.after : row.seq > query.after\n })\n const slice = rows.slice(0, limit)\n const last = slice.at(-1)\n return {\n ok: true,\n value: {\n collection: name,\n count: collection.count(),\n records: slice.map((row) => ({ id: row.id, seq: row.seq, value: row.value })),\n next: rows.length > limit && last ? last.seq : null,\n },\n }\n}\n\nexport const readStatePage = (\n scope: Pick<StateScope, \"sqlite\" | \"storageNamespace\">,\n name: string,\n query: StateQuery = {},\n): StateResult<StatePage> => pageOf(scope.sqlite, scope.storageNamespace, name, query)\n\nexport const readStateRecord = (\n scope: Pick<StateScope, \"sqlite\" | \"storageNamespace\">,\n name: string,\n id: string,\n): StateResult<StateRecord> => {\n if (!COLLECTION_NAME.test(name)) return fail(400, \"collection name is not allowed\")\n if (!RECORD_ID.test(id)) return fail(400, \"record id is not allowed\")\n const record = readRecord(collectionOf(scope.sqlite, scope.storageNamespace, name), id)\n return record ? { ok: true, value: record } : fail(404, `no record ${id} in ${name}`)\n}\n\nconst requireId = (id: string): StateResult<string> =>\n RECORD_ID.test(id) ? { ok: true, value: id } : fail(400, \"id must be a single path segment\")\n\nexport const createStateRecord = (\n scope: Pick<StateScope, \"sqlite\" | \"storageNamespace\">,\n name: string,\n input: { id?: string; value: unknown },\n): StateResult<StateRecord> => {\n if (!COLLECTION_NAME.test(name)) return fail(400, \"collection name is not allowed\")\n const parsed = jsonValue(input.value)\n if (!parsed.ok) return parsed\n const collection = collectionOf(scope.sqlite, scope.storageNamespace, name)\n const id = input.id ?? `${name}_${collection.nextSequence()}`\n const checked = requireId(id)\n if (!checked.ok) return checked\n if (collection.has(checked.value)) return fail(409, `record ${checked.value} already exists`)\n const stored = collection.insert(checked.value, parsed.value)\n return { ok: true, value: { id: checked.value, seq: stored.seq, value: stored.value } }\n}\n\nexport const replaceStateRecord = (\n scope: Pick<StateScope, \"sqlite\" | \"storageNamespace\">,\n name: string,\n id: string,\n value: unknown,\n): StateResult<StateRecord> => {\n if (!COLLECTION_NAME.test(name)) return fail(400, \"collection name is not allowed\")\n const checked = requireId(id)\n if (!checked.ok) return checked\n const parsed = jsonValue(value)\n if (!parsed.ok) return parsed\n const collection = collectionOf(scope.sqlite, scope.storageNamespace, name)\n if (!collection.has(checked.value)) return fail(404, `no record ${checked.value} in ${name}`)\n const stored = collection.update(checked.value, parsed.value)\n if (!stored) return fail(404, `no record ${checked.value} in ${name}`)\n return { ok: true, value: { id: checked.value, seq: stored.seq, value: stored.value } }\n}\n\nexport const patchStateRecord = (\n scope: Pick<StateScope, \"sqlite\" | \"storageNamespace\">,\n name: string,\n id: string,\n value: unknown,\n): StateResult<StateRecord> => {\n const current = readStateRecord(scope, name, id)\n if (!current.ok) return current\n const parsed = jsonValue(value)\n if (!parsed.ok) return parsed\n const next =\n isRecord(current.value.value) && isRecord(parsed.value)\n ? { ...current.value.value, ...parsed.value }\n : parsed.value\n return replaceStateRecord(scope, name, id, next)\n}\n\nexport const deleteStateRecord = (\n scope: Pick<StateScope, \"sqlite\" | \"storageNamespace\">,\n name: string,\n id: string,\n): StateResult<{ id: string }> => {\n if (!COLLECTION_NAME.test(name)) return fail(400, \"collection name is not allowed\")\n const checked = requireId(id)\n if (!checked.ok) return checked\n const collection = collectionOf(scope.sqlite, scope.storageNamespace, name)\n return collection.delete(checked.value)\n ? { ok: true, value: { id: checked.value } }\n : fail(404, `no record ${checked.value} in ${name}`)\n}\n\nconst json = (status: number, body: unknown): Response =>\n new Response(JSON.stringify(body), {\n status,\n headers: { \"content-type\": \"application/json; charset=utf-8\" },\n })\n\nconst adminError = (status: number, message: string): Response =>\n json(status, { error: { type: \"mockingbird_admin\", message } })\n\nconst fromResult = <T>(result: StateResult<T>, status: number): Response =>\n result.ok ? json(status, result.value) : adminError(result.status, result.message)\n\nconst integerParam = (value: string | null): number | undefined | \"bad\" => {\n if (value === null) return undefined\n if (!/^-?\\d+$/.test(value)) return \"bad\"\n return Number(value)\n}\n\nexport type StateRoutes = {\n /** Open the public namespace and return the scope the state routes read. */\n open(namespace: string): StateScope\n /** Called after a successful write so Timeline records the new rows. */\n afterWrite?(namespace: string): void\n}\n\n/** The shared `/__admin/state*` routes. Registered after service routes so this key always wins. */\nexport const stateAdminRoutes = (routes: StateRoutes): AdminRoutes => {\n const open = (namespace: string): StateResult<StateScope> => {\n try {\n return { ok: true, value: routes.open(namespace) }\n } catch (error) {\n return fail(400, error instanceof Error ? error.message : String(error))\n }\n }\n const wrote = (namespace: string) => {\n routes.afterWrite?.(namespace)\n }\n return {\n \"GET /state\": ({ namespace }) => {\n const scope = open(namespace)\n return fromResult(scope.ok ? { ok: true, value: inspectState(scope.value) } : scope, 200)\n },\n \"GET /state/:collection\": ({ namespace, params, url }) => {\n const scope = open(namespace)\n if (!scope.ok) return fromResult(scope, 200)\n const limit = integerParam(url.searchParams.get(\"limit\"))\n const after = integerParam(url.searchParams.get(\"after\"))\n if (limit === \"bad\") return adminError(400, \"limit: expected an integer\")\n if (after === \"bad\") return adminError(400, \"after: expected a sequence number\")\n const order = url.searchParams.get(\"order\")\n return fromResult(\n readStatePage(scope.value, params.collection ?? \"\", {\n ...(limit !== undefined ? { limit } : {}),\n ...(after !== undefined ? { after } : {}),\n ...(order === \"newest\" || order === \"oldest\" ? { order } : {}),\n }),\n 200,\n )\n },\n \"GET /state/:collection/:id\": ({ namespace, params }) => {\n const scope = open(namespace)\n if (!scope.ok) return fromResult(scope, 200)\n return fromResult(readStateRecord(scope.value, params.collection ?? \"\", params.id ?? \"\"), 200)\n },\n \"POST /state/:collection\": ({ namespace, params, body }) => {\n const scope = open(namespace)\n if (!scope.ok) return fromResult(scope, 201)\n if (!isRecord(body) || !(\"value\" in body)) {\n return adminError(400, 'expected {\"id?\": \"<id>\", \"value\": <json>}')\n }\n const id = body.id\n if (id !== undefined && typeof id !== \"string\") return adminError(400, \"id must be a string\")\n const created = createStateRecord(scope.value, params.collection ?? \"\", {\n ...(typeof id === \"string\" ? { id } : {}),\n value: body.value,\n })\n if (created.ok) wrote(namespace)\n return fromResult(created, 201)\n },\n \"PUT /state/:collection/:id\": ({ namespace, params, body }) => {\n const scope = open(namespace)\n if (!scope.ok) return fromResult(scope, 200)\n if (!isRecord(body) || !(\"value\" in body))\n return adminError(400, 'expected {\"value\": <json>}')\n const replaced = replaceStateRecord(\n scope.value,\n params.collection ?? \"\",\n params.id ?? \"\",\n body.value,\n )\n if (replaced.ok) wrote(namespace)\n return fromResult(replaced, 200)\n },\n \"PATCH /state/:collection/:id\": ({ namespace, params, body }) => {\n const scope = open(namespace)\n if (!scope.ok) return fromResult(scope, 200)\n if (!isRecord(body) || !(\"value\" in body))\n return adminError(400, 'expected {\"value\": <json>}')\n const patched = patchStateRecord(\n scope.value,\n params.collection ?? \"\",\n params.id ?? \"\",\n body.value,\n )\n if (patched.ok) wrote(namespace)\n return fromResult(patched, 200)\n },\n \"DELETE /state/:collection/:id\": ({ namespace, params }) => {\n const scope = open(namespace)\n if (!scope.ok) return fromResult(scope, 200)\n const removed = deleteStateRecord(scope.value, params.collection ?? \"\", params.id ?? \"\")\n if (removed.ok) wrote(namespace)\n return fromResult(removed, 200)\n },\n }\n}\n", "/**\n * Set by `scripts/bundle-service.ts` when a service is bundled, and rewritten to the\n * released version when it is published. Undefined when running from source.\n */\ndeclare const __MOCKINGBIRD_PACKAGE_VERSION__: string | undefined\n\n/** Placeholder a bundle carries until `release:publish` writes the real version over it. */\nexport const UNRELEASED_VERSION = \"0.0.0-development\"\n\n/** The published version of the service package this code is bundled into. */\nexport const PACKAGE_VERSION: string =\n typeof __MOCKINGBIRD_PACKAGE_VERSION__ === \"string\"\n ? __MOCKINGBIRD_PACKAGE_VERSION__\n : UNRELEASED_VERSION\n", "import type { AdminRoutes } from \"./control.js\"\nimport type { OwnedTransport } from \"./outbound.js\"\nimport { signSvix, signTimestamped, signTwilio } from \"./signing.js\"\n\n/**\n * Outbound webhooks, shared by every service that has them.\n *\n * A service publishes a message (the exact bytes the vendor would send); the hub fans it out\n * to every matching endpoint, signs each delivery with the vendor's scheme, retries on the\n * vendor's schedule, and keeps a record a suite can read, replay or flush through\n * `/__admin/webhooks*`. Signature timestamps use the wall clock unless a service injects\n * `now`: receivers check them against their own time, and an advanced mock clock would\n * otherwise fail every delivery. A service whose caller injected the clock (Stripe) passes it,\n * so a virtual-time receiver verifies at the mock's time.\n */\n\n/** What a signer sees for one delivery attempt. */\nexport type SignInput = {\n messageId: string\n /** Exact bytes about to be sent. */\n body: string\n /** Unix seconds of this attempt: wall clock, or the hub's injected `now`. */\n timestampSeconds: number\n /** Where the delivery is posted. */\n url: string\n /** The endpoint's secret, if it has one. */\n secret: string | undefined\n /** The endpoint's `signUrl` (the public URL the receiver verifies against), else `url`. */\n signUrl: string\n /** Form parameters, when the body is form-encoded (Twilio signs these, not the body). */\n form: Record<string, string> | undefined\n /** Stable event type and metadata captured with the message; avoids signer side-channel state. */\n type: string\n tags: Readonly<Record<string, string>>\n}\n\n/** Headers to add to one delivery. */\nexport type WebhookSigner = (\n input: SignInput,\n) => Record<string, string> | Promise<Record<string, string>>\n\n/** Named signers for the vendor schemes the catalog needs. */\nexport const signers = {\n /** No signature. */\n none: (): WebhookSigner => () => ({}),\n /** Svix (`svix-id`, `svix-timestamp`, `svix-signature: v1,<b64>`): Junction, Flex, Resend. */\n svix:\n (options: { prefix?: \"svix\" | \"webhook\" } = {}): WebhookSigner =>\n async ({ messageId, body, timestampSeconds, secret }) => {\n if (!secret) return {}\n const prefix = options.prefix ?? \"svix\"\n return {\n [`${prefix}-id`]: messageId,\n [`${prefix}-timestamp`]: String(timestampSeconds),\n [`${prefix}-signature`]: await signSvix(secret, messageId, timestampSeconds, body),\n }\n },\n /** `<header>: t=<unix>,v1=<hex HMAC-SHA256(secret, \"t.body\")>`: Stripe, Persona, Fullscript. */\n timestamped:\n (header = \"Stripe-Signature\"): WebhookSigner =>\n async ({ body, timestampSeconds, secret }) =>\n secret ? { [header]: await signTimestamped(secret, timestampSeconds, body) } : {},\n /** `X-Twilio-Signature` over the public URL plus the sorted form parameters. */\n twilio:\n (): WebhookSigner =>\n async ({ signUrl, form, secret }) =>\n secret ? { \"X-Twilio-Signature\": await signTwilio(secret, signUrl, form ?? {}) } : {},\n /** The secret itself in a header (optionally templated): RxVortex, Pharmetika, AHA `Token <s>`. */\n header:\n (header: string, format: (secret: string) => string = (s) => s): WebhookSigner =>\n ({ secret }) =>\n secret ? { [header]: format(secret) } : {},\n /** Anything else: the service computes the headers itself. */\n custom: (sign: WebhookSigner): WebhookSigner => sign,\n}\n\nexport type WebhookEndpoint = {\n /** Stable id; generated when omitted. */\n id?: string\n url: string\n secret?: string\n /** Event types to deliver; omit or include `\"*\"` for every type. */\n events?: string[]\n /** Deliver only messages whose tags include all of these (e.g. `{ account: \"mso\" }`). */\n tags?: Record<string, string>\n /** The public URL the receiver verifies signatures against (Twilio), when it differs. */\n signUrl?: string\n headers?: Record<string, string>\n}\n\nexport type WebhookMessage = {\n id: string\n namespace: string\n type: string\n body: string\n contentType: string\n tags: Record<string, string>\n headers?: Record<string, string>\n /** Wall-clock ISO-8601 time of publication. */\n publishedAt: string\n}\n\nexport type WebhookAttempt = {\n attempt: number\n at: string\n status: number | null\n error: string | null\n durationMs: number\n /** Exact receiver response body, when one was returned. */\n responseBody?: string | null\n}\n\nexport type WebhookDelivery = {\n id: string\n messageId: string\n namespace: string\n type: string\n endpointId: string\n url: string\n state: \"pending\" | \"delivered\" | \"failed\" | \"dropped\"\n attempts: WebhookAttempt[]\n}\n\n/** A delivery-level fault: what happens to the next `count` messages in a namespace. */\nexport type WebhookFault = {\n mode: \"duplicate\" | \"reorder\" | \"drop\"\n /** Messages affected; default 1. */\n count?: number\n}\n\nexport type PublishInput = {\n namespace: string\n type: string\n /** Exact body; objects are JSON-encoded. */\n body: string | Record<string, unknown> | unknown[]\n /** Default `application/json`, or form-encoded when `form` is given. */\n contentType?: string\n /** Form parameters, when the vendor posts `application/x-www-form-urlencoded`. */\n form?: Record<string, string>\n tags?: Record<string, string>\n /** Message-specific delivery headers, captured as part of durable message state. */\n headers?: Record<string, string>\n /** Message id; generated when omitted. */\n id?: string\n}\n\nexport type WebhookHubOptions = {\n signer: WebhookSigner\n /**\n * Delay before each attempt, in ms; the first entry delays the first attempt. Default:\n * immediately, then 5 s, 5 min, 30 min, 2 h.\n */\n retryDelaysMs?: readonly number[]\n /** Abort an attempt after this long. Default 15 s. */\n timeoutMs?: number\n /** Which receiver statuses count as delivered. Default 2xx. */\n delivered?: (status: number) => boolean\n /** Endpoints every namespace delivers to (from `--webhook-url`). */\n endpoints?: WebhookEndpoint[]\n fetch?: (request: Request) => Promise<Response>\n /** Called in-process for every published message, delivered or not. */\n onMessage?: (message: WebhookMessage) => void\n /** Messages kept per namespace for `GET /__admin/webhooks/events`. Default 500. */\n keep?: number\n /** Injectable clock (default wall clock) for signatures and attempt records. */\n now?: () => number\n /** Injectable deterministic identifier source. Receives `\"msg_\"` or `\"dlv_\"`. */\n id?: (prefix: string) => string\n /** Injectable scheduler used by timeouts and retries. */\n schedule?: (callback: () => void, delayMs: number) => unknown\n cancel?: (handle: unknown) => void\n}\n\nexport type WebhookHub = {\n observeDeliveries(\n listener: (event: { namespace: string; state: string; deliveryId: string }) => void,\n ): () => void\n setTransportPolicy(policy: OwnedTransport): void\n pending(namespace: string): number\n snapshot(namespace: string): unknown\n exportSnapshot(handle: unknown): unknown\n importSnapshot(namespace: string, document: unknown): unknown\n restore(namespace: string, snapshot: unknown): void\n publish(input: PublishInput): WebhookMessage\n /** Replace a namespace's own endpoints (`PUT /__admin/webhook-endpoints`). */\n setEndpoints(namespace: string, endpoints: WebhookEndpoint[]): WebhookEndpoint[]\n /** The endpoints a namespace delivers to: its own, plus the global ones. */\n endpoints(namespace: string): WebhookEndpoint[]\n messages(namespace?: string): WebhookMessage[]\n deliveries(namespace?: string): WebhookDelivery[]\n replay(deliveryId: string): Promise<WebhookDelivery | undefined>\n /** Run every pending retry (and release held reordered messages) now, and every retry those attempts schedule, until nothing is pending. */\n flush(): Promise<void>\n /** Resolve once nothing is in flight. */\n idle(namespace?: string): Promise<void>\n fault(namespace: string, fault: WebhookFault): void\n clear(namespace?: string): void\n}\n\nconst DEFAULT_DELAYS = [0, 5_000, 300_000, 1_800_000, 7_200_000] as const\n\nconst unref = (timer: unknown) => {\n ;(timer as { unref?: () => void }).unref?.()\n}\n\nconst randomId = (prefix: string) =>\n `${prefix}${crypto.randomUUID().replace(/-/g, \"\").slice(0, 24)}`\n\nconst matchesEndpoint = (endpoint: WebhookEndpoint, message: WebhookMessage): boolean => {\n const events = endpoint.events ?? [\"*\"]\n if (!events.includes(\"*\") && !events.includes(message.type)) return false\n for (const [key, value] of Object.entries(endpoint.tags ?? {})) {\n if (message.tags[key] !== value) return false\n }\n return true\n}\n\nexport const createWebhookHub = (options: WebhookHubOptions): WebhookHub => {\n const delays = options.retryDelaysMs ?? DEFAULT_DELAYS\n const timeoutMs = options.timeoutMs ?? 15_000\n const delivered = options.delivered ?? ((status: number) => status >= 200 && status < 300)\n const send = options.fetch ?? ((request: Request) => fetch(request))\n const keep = options.keep ?? 500\n const now = options.now ?? Date.now\n const id = options.id ?? randomId\n const scheduleTimer =\n options.schedule ?? ((callback: () => void, delayMs: number) => setTimeout(callback, delayMs))\n const cancel =\n options.cancel ?? ((handle: unknown) => clearTimeout(handle as ReturnType<typeof setTimeout>))\n const global = (options.endpoints ?? []).map((e, i) => ({ ...e, id: e.id ?? `we_global_${i}` }))\n const own = new Map<string, WebhookEndpoint[]>()\n const messages: WebhookMessage[] = []\n const deliveries = new Map<string, WebhookDelivery>()\n const pending = new Map<string, unknown | undefined>()\n const payloads = new Map<string, { message: WebhookMessage; endpoint: WebhookEndpoint }>()\n const faults = new Map<string, { mode: WebhookFault[\"mode\"]; remaining: number }[]>()\n const held = new Map<string, WebhookMessage[]>()\n const deliveryObservers = new Set<\n (event: { namespace: string; state: string; deliveryId: string }) => void\n >()\n const notify = (delivery: WebhookDelivery) => {\n for (const listener of deliveryObservers)\n try {\n listener({ namespace: delivery.namespace, state: delivery.state, deliveryId: delivery.id })\n } catch {}\n }\n let transport: OwnedTransport | undefined\n const inFlight = new Set<Promise<void>>()\n const workNamespace = new Map<Promise<void>, string>()\n const activeDeliveries = new Map<string, { namespace: string; count: number }>()\n const controllers = new Map<string, AbortController>()\n // Immediate (delay 0) attempts chain onto this so two deliveries scheduled in the same tick\n // (e.g. a reorder fault's swap) hit the receiver in schedule order, not fetch-race order.\n let immediate: Promise<unknown> = Promise.resolve()\n const snapshots = new WeakMap<\n object,\n {\n namespace: string\n endpoints: WebhookEndpoint[]\n messages: WebhookMessage[]\n deliveries: [string, WebhookDelivery][]\n payloads: [string, { message: WebhookMessage; endpoint: WebhookEndpoint }][]\n faults: { mode: WebhookFault[\"mode\"]; remaining: number }[]\n }\n >()\n\n const track = (work: Promise<void>, delivery: WebhookDelivery) => {\n inFlight.add(work)\n workNamespace.set(work, delivery.namespace)\n const active = activeDeliveries.get(delivery.id) ?? { namespace: delivery.namespace, count: 0 }\n active.count++\n activeDeliveries.set(delivery.id, active)\n const finish = () => {\n inFlight.delete(work)\n workNamespace.delete(work)\n active.count--\n if (active.count === 0) activeDeliveries.delete(delivery.id)\n }\n void work.then(finish, finish)\n }\n\n const attempt = async (delivery: WebhookDelivery): Promise<boolean> => {\n const entry = payloads.get(delivery.id)\n if (!entry) return false\n const { message, endpoint } = entry\n const timestampSeconds = Math.floor(now() / 1000)\n const started = now()\n const record: WebhookAttempt = {\n attempt: delivery.attempts.length + 1,\n at: new Date(started).toISOString(),\n status: null,\n error: null,\n durationMs: 0,\n responseBody: null,\n }\n const controller = new AbortController()\n controllers.set(delivery.id, controller)\n const timer = scheduleTimer(() => controller.abort(), timeoutMs)\n try {\n const signed = await options.signer({\n messageId: message.id,\n body: message.body,\n timestampSeconds,\n url: endpoint.url,\n secret: endpoint.secret,\n signUrl: endpoint.signUrl ?? endpoint.url,\n form: message.contentType.startsWith(\"application/x-www-form-urlencoded\")\n ? Object.fromEntries(new URLSearchParams(message.body))\n : undefined,\n type: message.type,\n tags: message.tags,\n })\n const ownedSend = (request: Request) =>\n transport ? transport(request, message.namespace, send as typeof fetch) : send(request)\n const response = await ownedSend(\n new Request(endpoint.url, {\n method: \"POST\",\n headers: {\n \"content-type\": message.contentType,\n ...endpoint.headers,\n ...message.headers,\n ...signed,\n },\n body: message.body,\n signal: controller.signal,\n }),\n )\n record.status = response.status\n record.responseBody = await response.text()\n } catch (error) {\n record.error = controller.signal.aborted\n ? `timed out after ${timeoutMs}ms`\n : error instanceof Error\n ? error.message\n : String(error)\n } finally {\n controllers.delete(delivery.id)\n cancel(timer)\n record.durationMs = now() - started\n delivery.attempts.push(record)\n }\n return record.status !== null && delivered(record.status)\n }\n\n const schedule = (delivery: WebhookDelivery) => {\n const index = delivery.attempts.length\n if (index >= delays.length) {\n delivery.state = \"failed\"\n notify(delivery)\n pending.delete(delivery.id)\n return\n }\n const settle = async () => {\n // `clear` can drop a delivery queued behind an earlier immediate attempt. Its attempt would\n // record nothing and reschedule at the same index forever, starving the event loop.\n if (!payloads.has(delivery.id)) return\n await attempt(delivery).then((ok) => {\n if (!payloads.has(delivery.id)) return\n if (ok) {\n delivery.state = \"delivered\"\n notify(delivery)\n } else schedule(delivery)\n })\n }\n const delay = delays[index] ?? 0\n if (delay <= 0) {\n const task = immediate.then(settle)\n immediate = task.catch(() => {})\n track(task, delivery)\n return\n }\n const timer = scheduleTimer(() => {\n pending.delete(delivery.id)\n track(settle(), delivery)\n }, delay)\n unref(timer)\n pending.set(delivery.id, timer)\n }\n\n const endpointsFor = (namespace: string) => [...(own.get(namespace) ?? []), ...global]\n\n const fanOut = (message: WebhookMessage, state: WebhookDelivery[\"state\"] = \"pending\") => {\n for (const endpoint of endpointsFor(message.namespace)) {\n if (!matchesEndpoint(endpoint, message)) continue\n const delivery: WebhookDelivery = {\n id: id(\"dlv_\"),\n messageId: message.id,\n namespace: message.namespace,\n type: message.type,\n endpointId: endpoint.id ?? \"we_unknown\",\n url: endpoint.url,\n state,\n attempts: [],\n }\n deliveries.set(delivery.id, delivery)\n payloads.set(delivery.id, { message, endpoint })\n if (state === \"pending\") schedule(delivery)\n else notify(delivery)\n }\n }\n\n const takeFault = (namespace: string): WebhookFault[\"mode\"] | undefined => {\n const queue = faults.get(namespace)\n const head = queue?.[0]\n if (!queue || !head) return undefined\n head.remaining--\n if (head.remaining <= 0) queue.shift()\n return head.mode\n }\n\n const releaseHeld = (namespace: string) => {\n const waiting = held.get(namespace)\n if (!waiting) return\n held.delete(namespace)\n for (const message of waiting) fanOut(message)\n }\n\n const hub: WebhookHub = {\n observeDeliveries(listener) {\n deliveryObservers.add(listener)\n return () => deliveryObservers.delete(listener)\n },\n setTransportPolicy(policy) {\n transport = policy\n },\n pending(namespace) {\n const ids = new Set(\n [...deliveries.values()]\n .filter((d) => d.namespace === namespace && d.state === \"pending\")\n .map((d) => d.id),\n )\n for (const [id, active] of activeDeliveries) if (active.namespace === namespace) ids.add(id)\n return ids.size + (held.get(namespace)?.length ?? 0)\n },\n snapshot(namespace) {\n if (hub.pending(namespace) > 0) throw new Error(\"webhooks are not quiescent\")\n const handle = {}\n snapshots.set(\n handle,\n structuredClone({\n namespace,\n endpoints: own.get(namespace) ?? [],\n messages: messages.filter((m) => m.namespace === namespace),\n deliveries: [...deliveries].filter(([, d]) => d.namespace === namespace),\n payloads: [...payloads].filter(([, p]) => p.message.namespace === namespace),\n faults: faults.get(namespace) ?? [],\n }),\n )\n return handle\n },\n exportSnapshot(handle) {\n const point =\n typeof handle === \"object\" && handle !== null ? snapshots.get(handle) : undefined\n if (!point) throw new Error(\"invalid webhook snapshot\")\n const { namespace: _namespace, ...document } = point\n return structuredClone(document)\n },\n importSnapshot(namespace, document) {\n if (\n !isRecord(document) ||\n !Array.isArray(document.endpoints) ||\n !Array.isArray(document.messages) ||\n !Array.isArray(document.deliveries) ||\n !Array.isArray(document.payloads) ||\n !Array.isArray(document.faults)\n )\n throw new Error(\"invalid portable webhook snapshot\")\n for (const endpoint of document.endpoints)\n if (typeof parseEndpoint(endpoint) === \"string\")\n throw new Error(\"invalid portable webhook endpoint\")\n for (const message of document.messages)\n if (\n !isRecord(message) ||\n typeof message.id !== \"string\" ||\n typeof message.body !== \"string\"\n )\n throw new Error(\"invalid portable webhook message\")\n for (const pair of [...document.deliveries, ...document.payloads])\n if (\n !Array.isArray(pair) ||\n pair.length !== 2 ||\n typeof pair[0] !== \"string\" ||\n !isRecord(pair[1])\n )\n throw new Error(\"invalid portable webhook entry\")\n const handle = {}\n const point = structuredClone(document) as Omit<\n NonNullable<ReturnType<typeof snapshots.get>>,\n \"namespace\"\n >\n for (const message of point.messages) message.namespace = namespace\n for (const [, delivery] of point.deliveries) delivery.namespace = namespace\n for (const [, payload] of point.payloads) payload.message.namespace = namespace\n snapshots.set(handle, { ...point, namespace })\n return handle\n },\n restore(namespace, handle) {\n const point =\n typeof handle === \"object\" && handle !== null ? snapshots.get(handle) : undefined\n if (!point || point.namespace !== namespace || hub.pending(namespace) > 0)\n throw new Error(\"invalid webhook restore\")\n hub.clear(namespace)\n const copied = structuredClone(point)\n own.set(namespace, copied.endpoints)\n messages.push(...copied.messages)\n for (const [id, delivery] of copied.deliveries) deliveries.set(id, delivery)\n for (const [id, payload] of copied.payloads) payloads.set(id, payload)\n faults.set(namespace, copied.faults)\n },\n publish(input) {\n const contentType =\n input.contentType ?? (input.form ? \"application/x-www-form-urlencoded\" : \"application/json\")\n const body =\n typeof input.body === \"string\"\n ? input.body\n : input.form\n ? new URLSearchParams(input.form).toString()\n : JSON.stringify(input.body)\n const message: WebhookMessage = {\n id: input.id ?? id(\"msg_\"),\n namespace: input.namespace,\n type: input.type,\n body,\n contentType,\n tags: input.tags ?? {},\n headers: input.headers ?? {},\n publishedAt: new Date(now()).toISOString(),\n }\n messages.push(message)\n const ofNamespace = messages.filter((m) => m.namespace === message.namespace)\n const oldest = ofNamespace[0]\n if (ofNamespace.length > keep && oldest) messages.splice(messages.indexOf(oldest), 1)\n options.onMessage?.(message)\n const fault = takeFault(message.namespace)\n if (fault === \"drop\") {\n fanOut(message, \"dropped\")\n return message\n }\n if (fault === \"reorder\") {\n // Held until the next message goes out, so the receiver sees them swapped.\n held.set(message.namespace, [...(held.get(message.namespace) ?? []), message])\n return message\n }\n fanOut(message)\n if (fault === \"duplicate\") fanOut(message)\n releaseHeld(message.namespace)\n return message\n },\n setEndpoints(namespace, endpoints) {\n const withIds = endpoints.map((e, i) => ({ ...e, id: e.id ?? `we_${namespace}_${i}` }))\n own.set(namespace, withIds)\n return withIds\n },\n endpoints: endpointsFor,\n messages: (namespace) =>\n namespace === undefined ? [...messages] : messages.filter((m) => m.namespace === namespace),\n deliveries: (namespace) =>\n [...deliveries.values()].filter((d) => namespace === undefined || d.namespace === namespace),\n async replay(id) {\n const delivery = deliveries.get(id)\n if (!delivery) return undefined\n const work = (async () => {\n const ok = await attempt(delivery)\n if (ok) delivery.state = \"delivered\"\n notify({ ...delivery, state: ok ? \"delivered\" : \"failed\" })\n })()\n track(work, delivery)\n await work\n return delivery\n },\n async flush() {\n // Drains until nothing is held or scheduled: a retry that an attempt failing during this\n // flush schedules runs too, so a caller asserting after `flush` never catches a delivery\n // between attempts. Bounded, as every pass moves each delivery an attempt closer to\n // `delivered` or `failed`.\n for (;;) {\n for (const namespace of [...held.keys()]) releaseHeld(namespace)\n const waiting = [...pending.entries()]\n for (const [id, timer] of waiting) {\n if (timer === undefined) continue\n cancel(timer)\n pending.delete(id)\n const delivery = deliveries.get(id)\n if (!delivery) continue\n track(\n attempt(delivery).then((ok) => {\n if (ok) {\n delivery.state = \"delivered\"\n notify(delivery)\n } else schedule(delivery)\n }),\n delivery,\n )\n }\n await hub.idle()\n const scheduled = [...pending.values()].some((timer) => timer !== undefined)\n if (held.size === 0 && !scheduled) return\n }\n },\n async idle(namespace) {\n for (;;) {\n const selected = [...inFlight].filter(\n (work) => namespace === undefined || workNamespace.get(work) === namespace,\n )\n if (!selected.length) return\n await Promise.allSettled(selected)\n }\n },\n fault(namespace, fault) {\n const queue = faults.get(namespace) ?? []\n queue.push({ mode: fault.mode, remaining: Math.max(1, fault.count ?? 1) })\n faults.set(namespace, queue)\n },\n clear(namespace) {\n for (const [id, delivery] of deliveries) {\n if (namespace !== undefined && delivery.namespace !== namespace) continue\n controllers.get(id)?.abort()\n const timer = pending.get(id)\n if (timer !== undefined) cancel(timer)\n pending.delete(id)\n deliveries.delete(id)\n payloads.delete(id)\n }\n for (let i = messages.length - 1; i >= 0; i--) {\n if (namespace === undefined || messages[i]?.namespace === namespace) messages.splice(i, 1)\n }\n if (namespace === undefined) {\n held.clear()\n faults.clear()\n own.clear()\n } else {\n held.delete(namespace)\n faults.delete(namespace)\n own.delete(namespace)\n }\n },\n }\n return hub\n}\n\nconst json = (status: number, body: unknown): Response =>\n new Response(JSON.stringify(body), {\n status,\n headers: { \"content-type\": \"application/json; charset=utf-8\" },\n })\n\nconst adminError = (status: number, message: string): Response =>\n json(status, { error: { type: \"mockingbird_admin\", message } })\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n\nconst parseEndpoint = (value: unknown): WebhookEndpoint | string => {\n if (!isRecord(value) || typeof value.url !== \"string\") return \"each endpoint needs a url\"\n try {\n new URL(value.url)\n } catch {\n return `not a URL: ${value.url}`\n }\n const endpoint: WebhookEndpoint = { url: value.url }\n if (typeof value.id === \"string\") endpoint.id = value.id\n if (typeof value.secret === \"string\") endpoint.secret = value.secret\n if (typeof value.signUrl === \"string\") endpoint.signUrl = value.signUrl\n const events = value.events ?? value.enabledEvents\n if (Array.isArray(events)) endpoint.events = events.map(String)\n if (isRecord(value.tags)) {\n endpoint.tags = Object.fromEntries(Object.entries(value.tags).map(([k, v]) => [k, String(v)]))\n }\n if (typeof value.account === \"string\")\n endpoint.tags = { ...endpoint.tags, account: value.account }\n if (isRecord(value.headers)) {\n endpoint.headers = Object.fromEntries(\n Object.entries(value.headers).map(([k, v]) => [k, String(v)]),\n )\n }\n return endpoint\n}\n\n/**\n * The standard webhook admin routes, for a runtime that owns `hub`:\n *\n * - `GET /webhooks` deliveries, `GET /webhooks/events` published messages (with bodies:\n * they are the mock's own output), `POST /webhooks/:id/replay`, `POST /webhooks/flush`\n * - `GET|PUT|DELETE /webhook-endpoints` per namespace\n * - `POST /webhooks/faults {mode: duplicate|reorder|drop, count?}`\n */\nexport const webhookAdminRoutes = (hub: WebhookHub): AdminRoutes => ({\n \"GET /webhooks\": ({ url, namespace }) =>\n json(200, {\n deliveries: hub\n .deliveries(url.searchParams.get(\"all\") === \"1\" ? undefined : namespace)\n .filter((d) => {\n const type = url.searchParams.get(\"type\")\n return type === null || d.type === type\n }),\n }),\n \"GET /webhooks/events\": ({ url, namespace }) => {\n const type = url.searchParams.get(\"type\")\n return json(200, {\n events: hub\n .messages(url.searchParams.get(\"all\") === \"1\" ? undefined : namespace)\n .filter((m) => type === null || m.type === type)\n .map((m) => ({ ...m, payload: parsePayload(m) })),\n })\n },\n \"POST /webhooks/:id/replay\": async ({ params }) => {\n const replayed = await hub.replay(params.id as string)\n return replayed ? json(200, replayed) : adminError(404, `no delivery ${params.id}`)\n },\n \"POST /webhooks/flush\": async () => {\n await hub.flush()\n return json(200, { status: \"ok\" })\n },\n \"POST /webhooks/faults\": ({ body, namespace }) => {\n if (!isRecord(body) || ![\"duplicate\", \"reorder\", \"drop\"].includes(String(body.mode))) {\n return adminError(400, \"mode must be duplicate, reorder or drop\")\n }\n const fault: WebhookFault = { mode: body.mode as WebhookFault[\"mode\"] }\n if (typeof body.count === \"number\") fault.count = body.count\n hub.fault(namespace, fault)\n return json(201, { namespace, ...fault })\n },\n \"GET /webhook-endpoints\": ({ namespace }) =>\n json(200, {\n endpoints: hub.endpoints(namespace).map(({ secret, ...rest }) => ({\n ...rest,\n secret: secret ? \"(set)\" : null,\n })),\n }),\n \"PUT /webhook-endpoints\": ({ body, namespace }) => {\n const list = Array.isArray(body) ? body : isRecord(body) ? body.endpoints : undefined\n if (!Array.isArray(list)) return adminError(400, \"expected [{url, secret?, events?}]\")\n const parsed: WebhookEndpoint[] = []\n for (const each of list) {\n const endpoint = parseEndpoint(each)\n if (typeof endpoint === \"string\") return adminError(400, endpoint)\n parsed.push(endpoint)\n }\n const set = hub.setEndpoints(namespace, parsed)\n return json(200, { endpoints: set.map((e) => ({ ...e, secret: e.secret ? \"(set)\" : null })) })\n },\n \"DELETE /webhook-endpoints\": ({ namespace }) => {\n hub.setEndpoints(namespace, [])\n return json(200, { status: \"ok\" })\n },\n})\n\nconst parsePayload = (message: WebhookMessage): unknown => {\n if (message.contentType.startsWith(\"application/json\")) {\n try {\n return JSON.parse(message.body)\n } catch {\n return message.body\n }\n }\n if (message.contentType.startsWith(\"application/x-www-form-urlencoded\")) {\n return Object.fromEntries(new URLSearchParams(message.body))\n }\n return message.body\n}\n", "import {\n type Checkpoint,\n type FetchAPI,\n forwardMountContext,\n type MountedAPI,\n mount,\n Timeline,\n} from \"@crvouga/mockingbird-core\"\nimport { listOperations, type OpenAPIDocument } from \"@crvouga/mockingbird-openapi\"\nimport { clearNamespace, type SqliteClient } from \"@crvouga/mockingbird-sqlite\"\nimport { adminUiRoutes } from \"./admin-ui.js\"\nimport {\n type Clock,\n type ClockState,\n createClock,\n type DerivedClock,\n deriveClock,\n restoreClock,\n} from \"./clock.js\"\nimport {\n ADMIN_KEY_HEADER,\n ADMIN_PREFIX,\n type AdminRoutes,\n assertAdminPrefixAvailable,\n createControlPlane,\n hasAdminKey,\n isAdminPath,\n matchNamespacePath,\n NAMESPACE_HEADER,\n resolveAdminPrefix,\n type SnapshotInfo,\n type SnapshotStore,\n} from \"./control.js\"\nimport {\n assertSnapshotDocument,\n CONTROL_HEADERS,\n ControlError,\n type ControlHeaderInput,\n type ControlPlan,\n controlHeaders,\n isRecord,\n KEY_PATTERN,\n type MockControls,\n type NamespaceControls as NamespaceControlsInput,\n normalizeBootControls,\n normalizeClock,\n normalizeControls,\n normalizeLatency,\n normalizeSeed,\n parseControlHeaders,\n type RequestControls,\n SNAPSHOT_FORMAT,\n type SnapshotDocument,\n} from \"./controls.js\"\nimport { type CredentialRegistry, createCredentialRegistry, maskCredential } from \"./credentials.js\"\nimport {\n type FaultHit,\n type FaultPreset,\n type FaultRegistry,\n type FaultRule,\n normalizeFault,\n} from \"./faults.js\"\nimport { type IdBase, normalizeIdBase, setIdBase } from \"./ids.js\"\nimport {\n createJournal,\n DEFAULT_JOURNAL_SIZE,\n type Journal,\n type ResponseNotes,\n responseNotes,\n} from \"./journal.js\"\nimport type { LatencyRegistry } from \"./latency.js\"\nimport { createMetrics, type Metrics, type RejectedRequest, type RequestLog } from \"./metrics.js\"\nimport {\n type BootScope,\n type ControlSettings,\n type ControlState,\n type ControlsSnapshot,\n createNamespaceControls,\n} from \"./namespace-controls.js\"\nimport { operationPath } from \"./path.js\"\nimport { createRng, type Rng, seedFrom } from \"./rng.js\"\nimport { bootSqlite } from \"./service.js\"\nimport { type NamespaceSnapshot, restoreNamespace, snapshotNamespace } from \"./snapshot.js\"\nimport {\n inspectState,\n type StateDeclaration,\n type StateView,\n stateAdminRoutes,\n} from \"./state-view.js\"\nimport { type AdminUi, assertAdminUi, defineMock, type MockSurface } from \"./surface.js\"\nimport { PACKAGE_VERSION } from \"./version.js\"\nimport { type WebhookHub, webhookAdminRoutes } from \"./webhooks.js\"\n\n/**\n * Stamped on every response the runtime returns \u2014 vendor, fault, admin and health alike \u2014\n * as `<service>@<version>; ns=<namespace>`, so a consumer can tell the mock from the vendor.\n */\nexport const MOCKINGBIRD_HEADER = \"x-mockingbird\"\n/** Selects a named copy-on-write history branch. `main` is the compatibility default. */\nexport const BRANCH_HEADER = CONTROL_HEADERS.branch\n/** Reads a historical checkpoint. With a branch header, initializes that branch from it. */\nexport const AT_HEADER = CONTROL_HEADERS.at\n/** Identifies the resulting checkpoint on successful mutations. */\nexport const CHECKPOINT_HEADER = \"x-mockingbird-checkpoint\"\n/** On a response a fault rule answered or shaped: that rule's id. */\nexport const FAULT_HEADER = CONTROL_HEADERS.fault\n/** On a response to a request that asked for a snapshot: the snapshot's id. */\nexport const SNAPSHOT_HEADER = CONTROL_HEADERS.snapshot\n\n/** What the runtime needs from a service: a Fetch handler it can reset. */\nexport type ServiceInstance = FetchAPI & { reset(): Promise<void> }\n\n/** Everything an instance shares with the runtime that owns it. */\nexport type InstanceContext = {\n /** Storage namespace for this instance's records. */\n namespace: string\n /** The public namespace name a request selects it by. */\n adminPrefix: string\n publicNamespace: string\n sqlite: SqliteClient\n clock: Clock\n rng: Rng\n}\n\nexport type RuntimeOptions<T extends ServiceInstance> = {\n /** Service name, e.g. `\"junction\"`. Also the default namespace's storage key. */\n name: string\n /** Build the instance backing one namespace. Called once per namespace, on first use. */\n create: (context: InstanceContext) => T\n /** The vendor contract, used to name each request's operation in logs, metrics and faults. */\n document?: OpenAPIDocument\n /** Shared by every namespace. Defaults to a fresh `@crvouga/mockingbird-service-sqlite`. */\n sqlite?: SqliteClient\n /** Defaults to a live clock over `Date.now`. */\n clock?: Clock\n /**\n * Where this boot's generated ids start. Counters restart at 0 on every boot, so by default\n * every boot reissues the previous boot's ids; a different base gives an unrelated run of ids\n * (a reset returns to the same run). A non-negative integer, or `\"boot\"` for one derived from\n * the wall clock when the runtime is created. Default `0`: the same ids on every boot.\n */\n idBase?: IdBase\n /** Seeds every random choice the runtime makes (fault rates, jitter). Default `0`. */\n seed?: number | string\n /**\n * Admin controls to boot with: clock, latency, faults, a starting snapshot, credential\n * mappings and per-namespace overrides. `reset` returns a namespace to exactly this.\n */\n adminControls?: MockControls\n /** Extra `GET /__admin/health` fields, such as the loaded corpus version. */\n describe?: () => Record<string, unknown>\n /** Service-specific admin routes, given the runtime so they can reach any namespace. */\n admin?: (runtime: ServiceRuntime<T>) => AdminRoutes\n /** Reserved tree for every internal HTTP endpoint, UI and namespace carrier. Default /__admin. */\n adminPrefix?: string\n /**\n * A namespace's clock was moved \u2014 by `/__admin/clock`, a header, a restore, a reset, or a\n * wait spent in virtual time. Run whatever the service schedules by that clock, so what\n * came due is seen at once and not on the next request. Moving the base clock in process\n * (`runtime.clock`) is the caller's own doing and is not reported here.\n */\n onClockChange?: (namespace: string) => void\n /** Invalidate transient handles before replacing an existing instance's stored state. */\n beforeRestore?: (instance: T) => void\n /** Require this value in `x-mockingbird-admin-key` on admin data routes. */\n adminKey?: string\n /** Structured request log sink, called once per request. */\n onLog?: (entry: RequestLog) => void\n /** Requests each namespace's journal keeps (`GET /__admin/requests`). Default 1000; 0 turns it off. */\n journalSize?: number\n /** Reported in the `x-mockingbird` header. Default: the bundled package's version. */\n version?: string\n /**\n * The vendor credential a request carries (API key, token, account SID, AWS access key\n * id), for SDKs that cannot send `x-mockingbird-namespace`: a suite maps credentials to\n * namespaces with `PUT /__admin/credentials`. See `bearerToken`, `basicAuth`,\n * `sigV4AccessKeyId`.\n */\n credential?: (request: Request) => string | undefined\n /**\n * Named faults, switched on with `POST /__admin/faults {\"preset\": \"<name>\"}`. They join the\n * standard presets every mock has; one with a standard name replaces it.\n */\n presets?: Record<string, FaultPreset>\n /** Outbound webhooks; adds the `/__admin/webhooks*` routes and clears on reset. */\n webhooks?: WebhookHub\n /** Retained time-travel checkpoints per namespace. Default 1,000. */\n maxCheckpoints?: number\n /** Injectable process IO used for observability and delays; logical service time uses `clock`. */\n io?: Partial<RuntimeIO>\n /**\n * Collections the admin UI should show even before any row exists.\n * Stored collections are always included, whether or not they are declared.\n * A function may describe collections that depend on the live instance.\n */\n state?: readonly StateDeclaration[] | ((api: T, namespace: string) => readonly StateDeclaration[])\n /**\n * Panels added to the default admin UI, or a function that replaces the document.\n * `render` receives `defaultHtml()` so a bespoke UI can wrap the shared shell.\n */\n adminUi?: AdminUi\n}\n\nexport type RuntimeIO = {\n wallNow(): number\n monotonicNow(): number\n /** Wait on the wall clock. Rejects with the signal's reason when it aborts first. */\n sleep(ms: number, signal?: AbortSignal): Promise<void>\n}\n\nexport type ServiceTimelineState = Readonly<{\n snapshot: NamespaceSnapshot\n /** `pinned`: the namespace's clock was frozen itself, not just following a frozen base. */\n clock: Readonly<ClockState & { pinned?: boolean }>\n rngState: number\n}>\n\nexport type ServiceCheckpoint = Checkpoint<ServiceTimelineState>\n\nexport type ServiceRuntime<T extends ServiceInstance> = FetchAPI & {\n /** Stop package-owned lifecycle timers when a supervisor closes the runtime. */\n stop?(): void\n readonly name: string\n /** Same-origin Fetch handler and App Router method exports, sharing this runtime. */\n mount(prefix: string): MountedAPI\n readonly sqlite: SqliteClient\n readonly clock: Clock\n /**\n * Change the id base ({@link RuntimeOptions.idBase}) for ids generated from now on, and\n * return the number it resolved to. Set it before the first request so a boot's ids stay\n * one run.\n */\n setIdBase(base: IdBase): number\n readonly faults: FaultRegistry\n /** Baseline response time per namespace. */\n readonly latency: LatencyRegistry\n readonly metrics: Metrics\n readonly journal: Journal\n readonly rng: Rng\n readonly credentials: CredentialRegistry\n /** The webhook hub, when the service has outbound webhooks. */\n readonly webhooks: WebhookHub | undefined\n /**\n * A namespace's clock. Each follows the base clock, {@link ServiceRuntime.clock}, with an\n * offset and a freeze of its own, so moving one never moves another.\n */\n namespaceClock(namespace?: string): Clock\n namespaceOf(request: Request): string\n /** Opaque in-process checkpoint including records, controls and webhook history. */\n fleetSnapshot(namespace: string): object\n fleetRestore(snapshot: unknown, namespace: string): void\n fleetExport(snapshot: unknown): SnapshotDocument\n fleetImport(namespace: string, document: unknown): object\n /** Expand a named preset into fault rules (and webhook faults) for `namespace`. */\n applyPreset(name: string, namespace?: string, overrides?: Partial<FaultRule>): FaultRule[]\n /** The instance behind `namespace` (the default one when omitted), created on first use. */\n instance(namespace?: string): T\n /** Public names of every namespace created so far. */\n namespaces(): string[]\n /** Return one namespace to its boot state, or every namespace with `\"*\"`. */\n reset(namespace?: string): Promise<void>\n /** Reset a namespace and forget it, releasing everything it held. */\n dropNamespace(namespace: string): Promise<void>\n /** A namespace's controls: seed, clock, virtual time, latency, faults and snapshots. */\n controls(namespace?: string): ControlState & { snapshots: SnapshotInfo[] }\n /** Apply a control document to a namespace. A given key replaces that control. */\n configure(\n controls: NamespaceControlsInput,\n namespace?: string,\n ): ControlState & { snapshots: SnapshotInfo[] }\n /** Named snapshots of a namespace: records, clock, random streams, faults and latency. */\n readonly snapshots: {\n /** Capture the namespace now. Reusing a name replaces that snapshot. */\n create(options?: { name?: string; namespace?: string }): SnapshotInfo\n list(namespace?: string): SnapshotInfo[]\n /** The snapshot as portable JSON, to commit beside a suite or boot another mock from. */\n export(id: string, namespace?: string): SnapshotDocument\n /** Store a document as a snapshot without restoring it. */\n import(\n document: SnapshotDocument,\n options?: { name?: string; namespace?: string },\n ): SnapshotInfo\n restore(id: string, namespace?: string): void\n delete(id: string, namespace?: string): boolean\n }\n /** Request headers that carry controls, checked: spread them into a `fetch` or an SDK's defaults. */\n headers(input: ControlHeaderInput): Record<string, string>\n snapshot(namespace?: string): NamespaceSnapshot\n restore(snapshot: NamespaceSnapshot, namespace?: string): void\n /** Capture the current branch. Mutating HTTP calls do this automatically. */\n checkpoint(namespace?: string, branch?: string): ServiceCheckpoint\n /** Create an isolated branch, optionally from a historical checkpoint. */\n branch(name: string, options?: { namespace?: string; at?: string }): ServiceCheckpoint\n /** Restore a branch, clock, and PRNG to a checkpoint. */\n checkout(checkpoint: string, options?: { namespace?: string; branch?: string }): void\n /** Inspect the retained history for a namespace. */\n timeline(namespace?: string): Timeline<ServiceTimelineState>\n /** Collections in one namespace: declared shape plus what the rows actually hold. */\n state(namespace?: string): StateView\n}\n\ntype _MockSurfaceProof = ServiceRuntime<ServiceInstance> extends MockSurface ? true : never\nconst mockSurfaceProof: _MockSurfaceProof = true\nvoid mockSurfaceProof\n\n/** The namespace used when a request names none. */\nexport const DEFAULT_NAMESPACE = \"default\"\n\nconst MUTATING_METHODS = new Set([\"POST\", \"PUT\", \"PATCH\", \"DELETE\"])\n\nconst effects = new WeakMap<Request, FaultHit[\"effect\"][]>()\n\nconst acceptance = new WeakMap<Request, (notes: ResponseNotes) => void>()\n\n/** Notify only after a durable mutation commits. No-op outside an active runtime request. */\nexport const markMutationAccepted = (request: Request, notes: ResponseNotes = {}): void => {\n acceptance.get(request)?.(notes)\n}\n\n/** Preserve request-bound effects and acceptance when a provider must rebuild a Request. */\nexport const forwardRequestContext = (source: Request, target: Request): Request => {\n const fired = effects.get(source)\n const accepted = acceptance.get(source)\n if (fired) effects.set(target, fired)\n if (accepted) acceptance.set(target, accepted)\n return forwardMountContext(source, target)\n}\n\n/**\n * Merge two sorted snapshot row arrays, retaining byte-identical old objects. Unlike the previous\n * Map/string-key implementation this is allocation-free apart from the result array and O(n).\n */\nconst reuseSorted = <T>(\n fresh: T[],\n previous: T[] | undefined,\n compare: (left: T, right: T) => number,\n equal: (left: T, right: T) => boolean,\n): T[] => {\n if (!previous || previous.length === 0) return fresh.map((row) => Object.freeze(row))\n const result = new Array<T>(fresh.length)\n let unchanged = fresh.length === previous.length\n let oldIndex = 0\n for (let index = 0; index < fresh.length; index++) {\n const row = fresh[index] as T\n while (oldIndex < previous.length && compare(previous[oldIndex] as T, row) < 0) {\n oldIndex++\n }\n const old = previous[oldIndex]\n result[index] =\n old !== undefined && compare(old, row) === 0 && equal(old, row) ? old : Object.freeze(row)\n if (result[index] !== previous[index]) unchanged = false\n }\n return unchanged ? previous : result\n}\n\n/**\n * The fault effects (`{\"effect\": \"created_but_500\"}` rules) that fired for this request, in\n * rule order. Handlers read this to switch on a named vendor misbehaviour.\n */\nexport const faultEffects = (\n request: Request,\n): { name: string; params: Record<string, unknown> }[] =>\n (effects.get(request) ?? []).filter((e): e is NonNullable<typeof e> => e !== undefined)\n\n/** Whether the named effect fired for this request; its params when it did. */\nexport const faultEffect = (request: Request, name: string): Record<string, unknown> | undefined =>\n faultEffects(request).find((e) => e.name === name)?.params\n\n/**\n * Thrown by an in-process `runtime.fetch` when a `drop` fault fires: the same thing a real\n * `fetch` does when the connection dies mid-request. A served mock destroys the socket.\n */\nexport class DroppedConnectionError extends TypeError {\n readonly code = \"MOCKINGBIRD_DROP\"\n /** Why the connection died: a `drop`, a `timeout` that ran out, or a `truncate`d body. */\n readonly reason: \"drop\" | \"timeout\" | \"truncate\"\n constructor(reason: \"drop\" | \"timeout\" | \"truncate\" = \"drop\") {\n super(\n reason === \"timeout\"\n ? \"fetch failed: request timed out by Mockingbird fault\"\n : reason === \"truncate\"\n ? \"fetch failed: response truncated by Mockingbird fault\"\n : \"fetch failed: connection dropped by Mockingbird fault\",\n )\n this.name = \"TypeError\"\n this.reason = reason\n }\n}\n\nconst realSleep = (ms: number, signal?: AbortSignal): Promise<void> =>\n new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(signal.reason)\n return\n }\n const abort = () => {\n clearTimeout(timer)\n reject(signal?.reason)\n }\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", abort)\n resolve()\n }, ms)\n signal?.addEventListener(\"abort\", abort, { once: true })\n })\n\nconst NULL_BODY_STATUS = new Set([101, 204, 205, 304])\n\n/** Let `bytes` of the body through, then fail the stream the way a dying connection does. */\nconst truncateResponse = (response: Response, bytes: number): Response => {\n if (NULL_BODY_STATUS.has(response.status)) return response\n const reader = response.body?.getReader()\n let sent = 0\n const body = new ReadableStream<Uint8Array>({\n async pull(controller) {\n const chunk = sent < bytes && reader ? await reader.read() : undefined\n if (!chunk || chunk.done) {\n await reader?.cancel().catch(() => {})\n controller.error(new DroppedConnectionError(\"truncate\"))\n return\n }\n const part = chunk.value.subarray(0, bytes - sent)\n sent += part.length\n controller.enqueue(part)\n },\n cancel: (reason) => reader?.cancel(reason),\n })\n const headers = new Headers(response.headers)\n headers.delete(\"content-length\")\n return new Response(body, { status: response.status, statusText: response.statusText, headers })\n}\n\n/** What a snapshot holds for one namespace. Only `records` is always there. */\ntype Kept = {\n records: NamespaceSnapshot\n clock?: { now: number; frozen: boolean; pinned?: boolean }\n /** Where the service's own random stream stands. */\n rngState?: number\n controls: ControlsSnapshot\n webhooks?: unknown\n}\ntype Stored = Kept & { info: SnapshotInfo }\n\ntype Matcher = { operationId: string; method: string; pattern: RegExp; params: number }\n\n/** Resolve a request to its operationId: static segments beat parameters, as in routing. */\nconst operationMatcher = (document: OpenAPIDocument) => {\n const matchers: Matcher[] = listOperations(document)\n .map((operation) => ({\n operationId: operation.operationId,\n method: operation.method.toUpperCase(),\n pattern: operationPath(operation).pattern,\n params: (operation.path.match(/\\{/g) ?? []).length,\n }))\n .sort((a, b) => a.params - b.params)\n return (request: Request, path: string): string | undefined =>\n matchers.find((m) => m.method === request.method && m.pattern.test(path))?.operationId\n}\n\n/**\n * Wrap a service in the shared Mockingbird contract: an unauthenticated `/__admin/health`,\n * the `/__admin/*` control plane, per-request namespaces, a controllable clock,\n * fault injection, and request metrics.\n *\n * Namespaces isolate parallel workers inside one process: each gets its own\n * instance over the same SQLite database, so rows are partitioned by namespace\n * and a worker's reset or restore never touches another worker's data.\n */\nexport const createRuntime = <T extends ServiceInstance>(\n options: RuntimeOptions<T>,\n): ServiceRuntime<T> => {\n const adminPrefix = resolveAdminPrefix(options.adminPrefix)\n const internalPaths = Object.entries(options.document?.paths ?? {})\n .filter(([, item]) => item[\"x-mockingbird-internal\"] === true)\n .map(([path]) => path)\n for (const path of internalPaths) {\n if (!path.startsWith(`${ADMIN_PREFIX}/blobs/`))\n throw new Error(`internal transport ${path} must live under ${ADMIN_PREFIX}/blobs/`)\n }\n assertAdminPrefixAvailable(\n adminPrefix,\n Object.keys(options.document?.paths ?? {}).filter((path) => !internalPaths.includes(path)),\n )\n const internalMatch = (path: string): string | undefined => {\n for (const pattern of internalPaths) {\n const actual = path.split(\"/\")\n const expected = pattern.split(\"/\")\n if (\n actual.length === expected.length &&\n expected.every((part, i) => part.startsWith(\"{\") || part === actual[i])\n )\n return pattern\n }\n return undefined\n }\n assertAdminUi(options.adminUi)\n const boot = normalizeBootControls(options.adminControls, \"adminControls\")\n const seed = normalizeSeed(options.seed ?? boot.shared.seed ?? 0)\n // Named outright, the seed is a boot control like any other: it wins over a boot snapshot's.\n if (options.seed !== undefined) boot.shared.seed = seed\n const sqlite = bootSqlite(options.sqlite)\n if (options.idBase !== undefined)\n setIdBase(sqlite, normalizeIdBase(options.idBase, \"idBase\", options.io?.wallNow))\n const clock = options.clock ?? createClock()\n // The shared boot clock is the base clock, which every namespace follows. What a namespace\n // keeps of it for itself is how far its own clock steps before each request.\n const { now: bootNow, frozen: bootFrozen, ...stepping } = boot.shared.clock ?? {}\n if (bootFrozen === true) clock.freeze()\n if (bootNow !== undefined) clock.set(bootNow)\n if (bootFrozen === false) clock.unfreeze()\n const bootClockGiven = bootNow !== undefined || bootFrozen !== undefined\n if (stepping.autoAdvanceMs !== undefined) boot.shared.clock = stepping\n else delete boot.shared.clock\n /** Where the base clock stood when the runtime was created: what a full reset returns it to. */\n const bootClock = clock.state()\n const rng = createRng(seed)\n const wallNow = options.io?.wallNow ?? Date.now\n const monotonicNow = options.io?.monotonicNow ?? (() => performance.now())\n const sleep = options.io?.sleep ?? realSleep\n const metrics = createMetrics()\n const journal = createJournal(options.journalSize ?? DEFAULT_JOURNAL_SIZE)\n const version = options.version ?? PACKAGE_VERSION\n const instances = new Map<string, T>()\n const publicNamespaces = new Set<string>()\n /** The service's own random stream, by storage key. `default` uses {@link rng}. */\n const rngs = new Map<string, Rng>()\n const namespaceClocks = new Map<string, DerivedClock>()\n const namespaceForStorage = new Map<string, string>()\n /**\n * Every namespace has a clock of its own that follows the base clock. Moving one never\n * moves another; moving the base (`runtime.clock`) moves every namespace that is not frozen.\n */\n const namespaceClock = (name = DEFAULT_NAMESPACE): DerivedClock => {\n let found = namespaceClocks.get(name)\n if (!found) {\n found = deriveClock(clock, () => options.onClockChange?.(name))\n namespaceClocks.set(name, found)\n }\n return found\n }\n const fleetPoints = new WeakMap<object, { namespace: string } & Kept>()\n const timelines = new Map<string, Timeline<ServiceTimelineState>>()\n const branchStorage = new Map<string, string>()\n const captured = new Map<string, NamespaceSnapshot>()\n const credentials = createCredentialRegistry()\n for (const [credential, target] of Object.entries(boot.credentials))\n credentials.set(credential, target)\n const operationIdFor = options.document ? operationMatcher(options.document) : () => undefined\n\n const controls = createNamespaceControls({\n seed,\n clock: namespaceClock,\n boot,\n ...(options.presets ? { presets: options.presets } : {}),\n sleep: (ms) => sleep(ms),\n onReseed: (namespace, next) => {\n rngFor(namespace).reseed(next)\n for (const [mapping, storage] of branchStorage)\n if (mapping.startsWith(`${namespace}\\0`)) rngs.get(storage)?.reseed(next)\n },\n onPreset: (preset, namespace, overrides) => {\n if (preset.webhook)\n options.webhooks?.fault(namespace, {\n ...preset.webhook,\n ...(overrides.count !== undefined ? { count: overrides.count } : {}),\n })\n },\n restoreDocument: (namespace, document, scope) => {\n const { clock: carried, ...point } = fromDocument(namespace, document)\n // A boot clock named outright is the base clock's; the snapshot's does not override it.\n restoreAll(\n namespace,\n bootClockGiven || !carried ? point : { ...point, clock: carried },\n scope,\n )\n },\n })\n const { faults, latency } = controls\n\n /** The random stream behind a storage key, created at its namespace's seed. */\n const rngFor = (storage: string): Rng => {\n if (storage === DEFAULT_NAMESPACE) return rng\n let found = rngs.get(storage)\n if (!found) {\n found = createRng(seed)\n rngs.set(storage, found)\n }\n return found\n }\n const seedOf = (namespace: string): number | string => controls.settings(namespace).seed\n\n const storageNamespace = (name: string) =>\n name === DEFAULT_NAMESPACE ? options.name : `${options.name}:${name}`\n\n const instanceFor = (key: string, publicNamespace = key, isolatedRng?: Rng): T => {\n const existing = instances.get(key)\n if (existing) return existing\n if (!KEY_PATTERN.test(key) || !KEY_PATTERN.test(publicNamespace)) {\n throw new RangeError(\n `namespace must match ${KEY_PATTERN}: ${JSON.stringify(publicNamespace)}`,\n )\n }\n if (isolatedRng) rngs.set(key, isolatedRng)\n const created = options.create({\n namespace: storageNamespace(key),\n publicNamespace,\n adminPrefix,\n sqlite,\n clock: namespaceClock(publicNamespace),\n rng: rngFor(key),\n })\n instances.set(key, created)\n namespaceForStorage.set(key, publicNamespace)\n publicNamespaces.add(publicNamespace)\n // A namespace starts from its boot controls and, when one is given, its boot snapshot.\n if (key === publicNamespace) controls.ensure(key)\n return created\n }\n\n const instance = (name: string = DEFAULT_NAMESPACE): T => instanceFor(name)\n\n /** A namespace's clock as a checkpoint keeps it, and how one is put back. */\n const clockOf = (namespace: string): ServiceTimelineState[\"clock\"] => {\n const own = namespaceClock(namespace)\n return Object.freeze({ ...own.state(), pinned: own.pinned() })\n }\n const placeClock = (\n namespace: string,\n state: { now: number; frozen: boolean; pinned?: boolean },\n ): void =>\n // A document only says frozen or not; frozen there means frozen at that instant.\n namespaceClock(namespace).place({ now: state.now, pinned: state.pinned ?? state.frozen })\n\n const capture = (storage: string): ServiceTimelineState => {\n const fresh = snapshotNamespace(sqlite, storageNamespace(storage))\n const previous = captured.get(storage)\n const snapshot: NamespaceSnapshot = {\n namespace: fresh.namespace,\n records: reuseSorted(\n fresh.records,\n previous?.records,\n (left, right) =>\n left.collection < right.collection\n ? -1\n : left.collection > right.collection\n ? 1\n : left.seq - right.seq,\n (left, right) => left.id === right.id && left.value === right.value,\n ),\n sequences: reuseSorted(\n fresh.sequences,\n previous?.sequences,\n (left, right) =>\n left.name < right.name\n ? -1\n : left.name > right.name\n ? 1\n : left.kind < right.kind\n ? -1\n : left.kind > right.kind\n ? 1\n : 0,\n (left, right) => left.value === right.value,\n ),\n }\n Object.freeze(snapshot.records)\n Object.freeze(snapshot.sequences)\n Object.freeze(snapshot)\n captured.set(storage, snapshot)\n return Object.freeze({\n snapshot,\n clock: clockOf(namespaceForStorage.get(storage) ?? storage),\n rngState: rngFor(storage).state(),\n })\n }\n\n const timeline = (name: string = DEFAULT_NAMESPACE): Timeline<ServiceTimelineState> => {\n let found = timelines.get(name)\n if (found) return found\n instance(name)\n found = new Timeline<ServiceTimelineState>({\n now: namespaceClock(name).now,\n ...(options.maxCheckpoints !== undefined ? { maxCheckpoints: options.maxCheckpoints } : {}),\n })\n found.commit(capture(name))\n timelines.set(name, found)\n return found\n }\n\n const restoreStorage = (storage: string, snapshot: NamespaceSnapshot): void => {\n const current = instances.get(storage)\n if (current) options.beforeRestore?.(current)\n restoreNamespace(sqlite, storageNamespace(storage), snapshot)\n }\n\n const physicalBranch = (namespace: string, branch: string): string => {\n if (branch === \"main\") return namespace\n const mapKey = `${namespace}\\0${branch}`\n const existing = branchStorage.get(mapKey)\n if (existing) return existing\n // The hash keeps the internal instance key inside the 64-character namespace contract.\n const key = `branch_${seedFrom(`${options.name}\\0${namespace}\\0${branch}`).toString(36)}`\n branchStorage.set(mapKey, key)\n return key\n }\n\n const ensureBranch = (namespace: string, branch: string, at?: string): string => {\n if (!KEY_PATTERN.test(branch)) throw new RangeError(`branch must match ${KEY_PATTERN}`)\n const history = timeline(namespace)\n if (branch === \"main\") {\n if (at !== undefined) {\n const point = history.checkout(\"main\", at)\n restoreStorage(namespace, point.value.snapshot)\n captured.set(namespace, point.value.snapshot)\n rngFor(namespace).setState(point.value.rngState)\n placeClock(namespace, point.value.clock)\n }\n return namespace\n }\n const storage = physicalBranch(namespace, branch)\n if (!history.hasBranch(branch)) {\n // Capture unobserved background work before branching from the current main head.\n if (at === undefined) history.commit(capture(namespace))\n const point = history.fork(branch, at === undefined ? {} : { from: at })\n const branchRng = createRng(seedOf(namespace))\n if (point) branchRng.setState(point.value.rngState)\n instanceFor(storage, namespace, branchRng)\n if (point) restoreStorage(storage, point.value.snapshot)\n if (point) captured.set(storage, point.value.snapshot)\n } else if (at !== undefined && history.head(branch)?.id !== at) {\n const point = history.checkout(branch, at)\n if (!instances.has(storage)) {\n const branchRng = createRng(seedOf(namespace))\n branchRng.setState(point.value.rngState)\n instanceFor(storage, namespace, branchRng)\n }\n rngFor(storage).setState(point.value.rngState)\n restoreStorage(storage, point.value.snapshot)\n captured.set(storage, point.value.snapshot)\n } else {\n if (!instances.has(storage)) {\n const point = history.head(branch)\n const branchRng = createRng(seedOf(namespace))\n if (point) branchRng.setState(point.value.rngState)\n instanceFor(storage, namespace, branchRng)\n }\n }\n return storage\n }\n\n const checkpoint = (namespace = DEFAULT_NAMESPACE, branch = \"main\"): ServiceCheckpoint => {\n const storage = ensureBranch(namespace, branch)\n return timeline(namespace).commit(capture(storage), { branch })\n }\n\n const branch = (\n name: string,\n branchOptions: { namespace?: string; at?: string } = {},\n ): ServiceCheckpoint => {\n const namespace = branchOptions.namespace ?? DEFAULT_NAMESPACE\n ensureBranch(namespace, name, branchOptions.at)\n const head = timeline(namespace).head(name)\n if (!head) throw new RangeError(`branch ${name} has no checkpoint`)\n return head\n }\n\n const checkout = (\n checkpointId: string,\n checkoutOptions: { namespace?: string; branch?: string } = {},\n ): void => {\n const namespace = checkoutOptions.namespace ?? DEFAULT_NAMESPACE\n const branchName = checkoutOptions.branch ?? \"main\"\n const history = timeline(namespace)\n const point = history.checkout(branchName, checkpointId)\n const storage = ensureBranch(namespace, branchName)\n restoreStorage(storage, point.value.snapshot)\n captured.set(storage, point.value.snapshot)\n placeClock(namespace, point.value.clock)\n rngFor(storage).setState(point.value.rngState)\n }\n\n const reset = async (name: string = DEFAULT_NAMESPACE): Promise<void> => {\n if (name === \"*\") {\n options.webhooks?.clear()\n for (const each of instances.values()) await each.reset()\n timelines.clear()\n for (const storage of branchStorage.values()) {\n instances.delete(storage)\n rngs.delete(storage)\n namespaceForStorage.delete(storage)\n }\n branchStorage.clear()\n captured.clear()\n snapshotStore.clear()\n journal.clear()\n metrics.reset()\n // The base clock goes back to where the runtime found it; a live one keeps running.\n if (bootClock.frozen) restoreClock(clock, bootClock)\n else {\n clock.reset()\n clock.advance(bootClock.offsetMs)\n }\n controls.rebootAll()\n for (const each of new Set([DEFAULT_NAMESPACE, ...publicNamespaces])) controls.ensure(each)\n return\n }\n options.webhooks?.clear(name)\n const target = instances.get(name)\n if (target) await target.reset()\n else clearNamespace(sqlite, storageNamespace(name))\n for (const [mapping, storage] of branchStorage) {\n if (!mapping.startsWith(`${name}\\0`)) continue\n const branchInstance = instances.get(storage)\n if (branchInstance) await branchInstance.reset()\n else clearNamespace(sqlite, storageNamespace(storage))\n branchStorage.delete(mapping)\n instances.delete(storage)\n namespaceForStorage.delete(storage)\n rngs.delete(storage)\n captured.delete(storage)\n }\n timelines.delete(name)\n captured.delete(name)\n snapshotStore.clear(name)\n journal.clear(name)\n metrics.reset(name)\n // Seed, clock, faults, latency and every stream, then the boot snapshot and controls again.\n controls.reboot(name)\n }\n\n const dropNamespace = async (name: string): Promise<void> => {\n await reset(name)\n if (name === DEFAULT_NAMESPACE) return\n instances.delete(name)\n namespaceForStorage.delete(name)\n publicNamespaces.delete(name)\n rngs.delete(name)\n namespaceClocks.delete(name)\n controls.forget(name)\n }\n\n /** Everything a namespace is: records, clock, random streams, faults, latency, webhooks. */\n const captureAll = (namespace: string): Kept => {\n instance(namespace)\n const state = capture(namespace)\n return {\n records: state.snapshot,\n clock: state.clock,\n rngState: state.rngState,\n controls: controls.snapshot(namespace),\n webhooks: options.webhooks?.snapshot(namespace),\n }\n }\n\n /** Put back what `point` holds. What it does not hold stays as it is. */\n const restoreAll = (namespace: string, point: Kept, scope: BootScope = \"all\"): void => {\n instance(namespace)\n if (scope === \"all\") {\n restoreStorage(namespace, point.records)\n captured.set(namespace, point.records)\n }\n if (point.clock) placeClock(namespace, point.clock)\n // Controls before the service's stream: a restored seed restarts it, then it is placed.\n controls.restore(namespace, point.controls)\n if (point.rngState !== undefined) rngFor(namespace).setState(point.rngState)\n if (scope !== \"all\") return\n if (point.webhooks !== undefined) options.webhooks?.restore(namespace, point.webhooks)\n // History continues from the restored state instead of being rewritten.\n timelines.get(namespace)?.commit(capture(namespace), { branch: \"main\" })\n }\n\n const toDocument = (point: Kept): SnapshotDocument => {\n const { settings, streams, faults: rules, latency: waits } = point.controls\n return {\n format: SNAPSHOT_FORMAT,\n service: options.name,\n records: point.records.records.map((row) => {\n // A Collection row is stored as `{seq, value}`; anything else travels as its raw text.\n let parsed: unknown\n try {\n parsed = JSON.parse(row.value)\n } catch {\n parsed = undefined\n }\n const base = { collection: row.collection, id: row.id, seq: row.seq }\n return isRecord(parsed) &&\n \"value\" in parsed &&\n JSON.stringify({ seq: row.seq, value: parsed.value }) === row.value\n ? { ...base, value: parsed.value }\n : { ...base, raw: row.value }\n }),\n sequences: point.records.sequences.map((row) => ({ ...row })),\n ...(point.clock\n ? {\n clock: {\n now: point.clock.now,\n frozen: point.clock.frozen,\n ...(settings?.autoAdvanceMs !== undefined\n ? { autoAdvanceMs: settings.autoAdvanceMs }\n : {}),\n },\n }\n : {}),\n ...(settings?.seed !== undefined ? { seed: settings.seed } : {}),\n ...(point.rngState !== undefined ? { rng: { state: point.rngState, ...streams } } : {}),\n ...(rules ? { faults: rules } : {}),\n ...(waits ? { latency: waits } : {}),\n ...(settings?.virtualTime !== undefined ? { virtualTime: settings.virtualTime } : {}),\n ...(point.webhooks !== undefined\n ? { webhooks: options.webhooks?.exportSnapshot(point.webhooks) }\n : {}),\n }\n }\n\n const position = (value: unknown, label: string): number => {\n if (\n typeof value !== \"number\" ||\n !Number.isSafeInteger(value) ||\n value < 0 ||\n value > 0xffffffff\n )\n throw new ControlError(`${label}: expected an unsigned 32-bit integer`)\n return value\n }\n\n /** A document as restorable state. Checks all of it; touches nothing. */\n const fromDocument = (namespace: string, document: SnapshotDocument): Kept => {\n if (document.service !== undefined && document.service !== options.name)\n throw new ControlError(`snapshot was taken from ${document.service}, not ${options.name}`)\n const highest = new Map<string, number>()\n const seen = new Set<string>()\n const records = document.records.map((row) => {\n const key = `${row.collection}\\0${row.id}`\n if (seen.has(key))\n throw new ControlError(`snapshot.records: duplicate ${row.collection}/${row.id}`)\n seen.add(key)\n const seq = row.seq ?? (highest.get(row.collection) ?? 0) + 1\n highest.set(row.collection, Math.max(highest.get(row.collection) ?? 0, seq))\n return Object.freeze({\n collection: row.collection,\n id: row.id,\n seq,\n value: typeof row.raw === \"string\" ? row.raw : JSON.stringify({ seq, value: row.value }),\n })\n })\n records.sort((left, right) =>\n left.collection < right.collection\n ? -1\n : left.collection > right.collection\n ? 1\n : left.seq - right.seq,\n )\n const sequences = new Map<string, { name: string; kind: string; value: number }>()\n for (const row of document.sequences ?? [])\n sequences.set(`${row.name}\\0${row.kind}`, { ...row })\n // A collection's counter never trails its rows, so the next insert cannot reuse a seq.\n for (const [collection, seq] of highest) {\n const key = `${collection}\\0collection`\n if ((sequences.get(key)?.value ?? 0) < seq)\n sequences.set(key, { name: collection, kind: \"collection\", value: seq })\n }\n const stored: NamespaceSnapshot = Object.freeze({\n namespace: storageNamespace(namespace),\n records: Object.freeze(records) as NamespaceSnapshot[\"records\"],\n sequences: Object.freeze(\n [...sequences.values()]\n .sort((left, right) =>\n left.name < right.name\n ? -1\n : left.name > right.name\n ? 1\n : left.kind < right.kind\n ? -1\n : left.kind > right.kind\n ? 1\n : 0,\n )\n .map((row) => Object.freeze(row)),\n ) as NamespaceSnapshot[\"sequences\"],\n })\n\n const settings: Partial<ControlSettings> = {}\n if (document.seed !== undefined) settings.seed = normalizeSeed(document.seed, \"snapshot.seed\")\n if (document.virtualTime !== undefined) {\n if (typeof document.virtualTime !== \"boolean\")\n throw new ControlError(\"snapshot.virtualTime: expected a boolean\")\n settings.virtualTime = document.virtualTime\n }\n const stepping =\n document.clock?.autoAdvanceMs !== undefined\n ? normalizeClock({ autoAdvance: document.clock.autoAdvanceMs }, \"snapshot.clock\")\n .autoAdvanceMs\n : undefined\n if (stepping !== undefined) settings.autoAdvanceMs = stepping\n const held: ControlsSnapshot = {}\n if (Object.keys(settings).length > 0) held.settings = settings\n if (document.rng?.faults !== undefined || document.rng?.latency !== undefined)\n held.streams = {\n ...(document.rng.faults !== undefined\n ? { faults: position(document.rng.faults, \"snapshot.rng.faults\") }\n : {}),\n ...(document.rng.latency !== undefined\n ? { latency: position(document.rng.latency, \"snapshot.rng.latency\") }\n : {}),\n }\n if (document.faults !== undefined) {\n const given = document.faults\n if (!isRecord(given) || !Array.isArray(given.rules))\n throw new ControlError(\"snapshot.faults: expected {rules: [...]}\")\n held.faults = {\n rules: given.rules.map((each: unknown) => {\n const rule = normalizeFault(each)\n const kept = each as Record<string, unknown>\n return {\n ...rule,\n remaining: typeof kept.remaining === \"number\" ? kept.remaining : (rule.count ?? null),\n hits: typeof kept.hits === \"number\" ? kept.hits : 0,\n seen: typeof kept.seen === \"number\" ? kept.seen : 0,\n ...(typeof kept.position === \"number\" ? { position: kept.position } : {}),\n }\n }),\n nextId: typeof given.nextId === \"number\" ? given.nextId : 0,\n }\n }\n if (document.latency !== undefined)\n held.latency = normalizeLatency(document.latency, \"snapshot.latency\")\n return {\n records: stored,\n ...(document.clock\n ? { clock: { now: document.clock.now, frozen: document.clock.frozen } }\n : {}),\n ...(document.rng?.state !== undefined\n ? { rngState: position(document.rng.state, \"snapshot.rng.state\") }\n : {}),\n controls: held,\n ...(document.webhooks !== undefined\n ? { webhooks: options.webhooks?.importSnapshot(namespace, document.webhooks) }\n : {}),\n }\n }\n\n const kept = new Map<string, Map<string, Stored>>()\n const snapshotCounters = new Map<string, number>()\n const keep = (namespace: string, given: string | undefined, point: Kept): SnapshotInfo => {\n let store = kept.get(namespace)\n if (!store) {\n store = new Map()\n kept.set(namespace, store)\n }\n let id = given\n if (id === undefined) {\n let next = snapshotCounters.get(namespace) ?? 0\n do id = `snap_${++next}`\n while (store.has(id))\n snapshotCounters.set(namespace, next)\n }\n const info: SnapshotInfo = {\n id,\n namespace,\n records: point.records.records.length,\n at: point.clock?.now ?? namespaceClock(namespace).now(),\n portable: true,\n }\n store.set(id, { ...point, info })\n return info\n }\n /** Named snapshots, kept per namespace so two workers never see each other's ids. */\n const snapshotStore: SnapshotStore = {\n create: (namespace, id) => keep(namespace, id, captureAll(namespace)),\n list: (namespace) => [...(kept.get(namespace)?.values() ?? [])].map((each) => each.info),\n get: (namespace, id) => kept.get(namespace)?.get(id)?.info,\n export(namespace, id) {\n const found = kept.get(namespace)?.get(id)\n return found ? toDocument(found) : undefined\n },\n import: (namespace, id, document) => keep(namespace, id, fromDocument(namespace, document)),\n restore(namespace, id) {\n const found = kept.get(namespace)?.get(id)\n if (!found) return false\n restoreAll(namespace, found)\n return true\n },\n remove: (namespace, id) => kept.get(namespace)?.delete(id) ?? false,\n clear(namespace) {\n if (namespace === undefined) {\n kept.clear()\n snapshotCounters.clear()\n return\n }\n kept.delete(namespace)\n snapshotCounters.delete(namespace)\n },\n }\n\n const applyControls = (namespace: string, plan: ControlPlan): void => {\n const { snapshot: document, ...rest } = plan\n // Everything is checked before anything is touched: a rejected document changes nothing.\n controls.check(rest)\n const point = document ? fromDocument(namespace, document) : undefined\n // The snapshot first, so a control given beside it wins over the one it carries.\n if (point) restoreAll(namespace, point)\n controls.apply(namespace, rest)\n }\n\n const describeControls = (namespace: string) => ({\n ...controls.describe(namespace),\n snapshots: snapshotStore.list(namespace),\n })\n\n const snapshot = (name: string = DEFAULT_NAMESPACE): NamespaceSnapshot => {\n return checkpoint(name, \"main\").value.snapshot\n }\n\n const restore = (from: NamespaceSnapshot, name: string = DEFAULT_NAMESPACE): void => {\n instance(name)\n restoreStorage(name, from)\n captured.set(name, from)\n // Import legacy snapshots into the canonical history instead of creating a second rollback\n // mechanism. The compatibility method stays synchronous and keeps its original return type.\n const history = timelines.get(name)\n if (history) history.commit(capture(name), { branch: \"main\" })\n else timeline(name)\n }\n\n const declarationsFor = (namespace: string): readonly StateDeclaration[] => {\n const declared = options.state\n if (!declared) return []\n return typeof declared === \"function\" ? declared(instance(namespace), namespace) : declared\n }\n\n const stateScope = (namespace: string) => ({\n sqlite,\n namespace,\n storageNamespace: storageNamespace(namespace),\n root: instance(namespace),\n declarations: declarationsFor(namespace),\n })\n\n const runtime: ServiceRuntime<T> = {\n name: options.name,\n mount: (prefix) =>\n mount(runtime, prefix, (request) => {\n const namespace = runtime.namespaceOf(request)\n return namespace === DEFAULT_NAMESPACE\n ? \"\"\n : `${adminPrefix}/ns/${encodeURIComponent(namespace)}`\n }),\n sqlite,\n clock,\n setIdBase(base) {\n const resolved = normalizeIdBase(base, \"idBase\", options.io?.wallNow)\n setIdBase(sqlite, resolved)\n return resolved\n },\n faults,\n latency,\n metrics,\n journal,\n rng,\n credentials,\n webhooks: options.webhooks,\n namespaceClock,\n namespaceOf(request) {\n const url = new URL(request.url)\n const prefixed = matchNamespacePath(url.pathname, adminPrefix)\n const selected =\n request.headers.get(NAMESPACE_HEADER) ??\n (prefixed ? decodeURIComponent(prefixed[1] as string) : undefined)\n const path = prefixed ? (prefixed[2] ?? \"/\") : url.pathname\n if (isAdminPath(path, adminPrefix))\n return url.searchParams.get(\"namespace\") ?? selected ?? DEFAULT_NAMESPACE\n if (selected !== undefined) return selected\n const credential = options.credential?.(request)\n return (\n (credential !== undefined ? credentials.get(credential) : undefined) ?? DEFAULT_NAMESPACE\n )\n },\n fleetSnapshot(namespace) {\n const handle = {}\n fleetPoints.set(handle, { namespace, ...captureAll(namespace) })\n return handle\n },\n fleetRestore(handle, namespace) {\n const point =\n typeof handle === \"object\" && handle !== null ? fleetPoints.get(handle) : undefined\n if (!point || point.namespace !== namespace) throw new Error(\"invalid fleet checkpoint\")\n restoreAll(namespace, point)\n timelines.delete(namespace)\n },\n fleetExport(handle) {\n const point =\n typeof handle === \"object\" && handle !== null ? fleetPoints.get(handle) : undefined\n if (!point) throw new Error(\"invalid fleet checkpoint\")\n return toDocument(point)\n },\n fleetImport(namespace, document) {\n const handle = {}\n fleetPoints.set(handle, {\n namespace,\n ...fromDocument(namespace, assertSnapshotDocument(document)),\n })\n return handle\n },\n applyPreset: (name, namespace = DEFAULT_NAMESPACE, overrides = {}) =>\n controls.addFault(namespace, { ...overrides, preset: name }),\n instance,\n namespaces: () => [...publicNamespaces].sort(),\n reset,\n dropNamespace,\n controls: (namespace = DEFAULT_NAMESPACE) => describeControls(namespace),\n configure(document, namespace = DEFAULT_NAMESPACE) {\n applyControls(namespace, normalizeControls(document))\n return describeControls(namespace)\n },\n snapshots: {\n create: (given = {}) =>\n snapshotStore.create(given.namespace ?? DEFAULT_NAMESPACE, given.name),\n list: (namespace = DEFAULT_NAMESPACE) => snapshotStore.list(namespace),\n export(id, namespace = DEFAULT_NAMESPACE) {\n const document = snapshotStore.export(namespace, id)\n if (!document) throw new RangeError(`no snapshot ${id} in namespace ${namespace}`)\n return document\n },\n import: (document, given = {}) =>\n snapshotStore.import(given.namespace ?? DEFAULT_NAMESPACE, given.name, document),\n restore(id, namespace = DEFAULT_NAMESPACE) {\n if (!snapshotStore.restore(namespace, id))\n throw new RangeError(`no snapshot ${id} in namespace ${namespace}`)\n },\n delete: (id, namespace = DEFAULT_NAMESPACE) => snapshotStore.remove(namespace, id),\n },\n headers: controlHeaders,\n snapshot,\n restore,\n checkpoint,\n branch,\n checkout,\n timeline,\n state: (namespace = DEFAULT_NAMESPACE) => inspectState(stateScope(namespace)),\n fetch: async (incoming) => {\n let request = incoming\n // `/__admin/ns/<name>/\u2026` selects a namespace (and is stripped) for SDKs that cannot add headers.\n const prefixed = matchNamespacePath(new URL(request.url).pathname, adminPrefix)\n if (prefixed) {\n const url = new URL(request.url)\n url.pathname = prefixed[2] ?? \"/\"\n const headers = new Headers(request.headers)\n if (!headers.has(NAMESPACE_HEADER)) {\n headers.set(NAMESPACE_HEADER, decodeURIComponent(prefixed[1] as string))\n }\n const hasBody = request.method !== \"GET\" && request.method !== \"HEAD\"\n request = forwardRequestContext(\n request,\n new Request(url, {\n method: request.method,\n headers,\n ...(hasBody ? { body: await request.arrayBuffer() } : {}),\n signal: request.signal,\n }),\n )\n }\n const internalUrl = new URL(request.url)\n const internalPath = isAdminPath(internalUrl.pathname, adminPrefix)\n ? `${ADMIN_PREFIX}${internalUrl.pathname.slice(adminPrefix.length)}`\n : \"\"\n const internal = internalMatch(internalPath)\n const obsoleteInternalPath =\n adminPrefix !== ADMIN_PREFIX && internalMatch(internalUrl.pathname) && !internal\n if (internal) {\n internalUrl.pathname = internalPath\n request = forwardRequestContext(request, new Request(internalUrl, request))\n }\n let namespace = internal\n ? (internalUrl.searchParams.get(\"namespace\") ?? control.namespaceOf(request))\n : control.namespaceOf(request)\n if (!request.headers.has(NAMESPACE_HEADER) && options.credential) {\n const credential = options.credential(request)\n const mapped = credential !== undefined ? credentials.get(credential) : undefined\n if (mapped !== undefined) namespace = mapped\n }\n const selectedBranch = request.headers.get(BRANCH_HEADER) ?? \"main\"\n const at = request.headers.get(AT_HEADER) ?? undefined\n const stamp = (response: Response): Response => {\n // An invalid namespace is not echoed back.\n const value = KEY_PATTERN.test(namespace)\n ? `${options.name}@${version}; ns=${namespace}`\n : `${options.name}@${version}`\n try {\n response.headers.set(MOCKINGBIRD_HEADER, value)\n return response\n } catch {\n // Immutable headers (a response passed through from `fetch`): copy it.\n const copy = new Response(response.body, response)\n copy.headers.set(MOCKINGBIRD_HEADER, value)\n return copy\n }\n }\n if (obsoleteInternalPath)\n return stamp(adminFail(404, \"internal transport is only available under adminPrefix\"))\n const handled = internal ? undefined : await control.handle(request)\n if (handled) return stamp(handled)\n const started = monotonicNow()\n const url = new URL(request.url)\n const operationId = operationIdFor(request, url.pathname)\n let accepted: ServiceCheckpoint | undefined\n let acceptedNotes: ResponseNotes | undefined\n // Injected wait this request spent: latency, fault delays, a timeout.\n let waitedMs = 0\n // With virtual time the wait is the whole duration, so a journal replays byte for byte.\n let virtualTime = false\n let requestClock = clock\n // What a rejection records about the body. The runtime never reads the request stream \u2014\n // consuming it would break a streaming request (e.g. a bidirectional model stream) \u2014 so the\n // byte count comes from `content-length` when the client sent it, and is null otherwise.\n const contentLength = request.headers.get(\"content-length\")\n const received: RejectedRequest = {\n contentType: request.headers.get(\"content-type\"),\n bodyBytes:\n contentLength !== null && /^\\d+$/.test(contentLength) ? Number(contentLength) : null,\n transferEncoding: request.headers.get(\"transfer-encoding\"),\n }\n const log = (status: number, faultId?: string, response?: Response) => {\n const noted = { ...acceptedNotes, ...(response ? responseNotes(response) : {}) }\n const rejected = status >= 400 && faultId === undefined\n const entry: RequestLog = {\n service: options.name,\n namespace,\n operationId,\n method: request.method,\n path: url.pathname,\n status,\n durationMs: virtualTime ? waitedMs : Math.round((monotonicNow() - started) * 100) / 100,\n unmatched: options.document !== undefined && operationId === undefined,\n ...(faultId !== undefined ? { faultId } : {}),\n ...(waitedMs > 0 ? { delayMs: waitedMs } : {}),\n ...(noted?.ids && Object.keys(noted.ids).length > 0 ? { ids: noted.ids } : {}),\n ...(noted?.adopted ? { adopted: true } : {}),\n ...(accepted ? { accepted: true, checkpoint: accepted.id } : {}),\n ...(rejected ? { request: { ...received } } : {}),\n ...(rejected && noted?.issues && noted.issues.length > 0\n ? { issues: noted.issues.map((issue) => ({ ...issue })) }\n : {}),\n }\n metrics.record(entry)\n journal.record({ ...entry, at: new Date(requestClock.now()).toISOString() })\n options.onLog?.(entry)\n }\n if (!KEY_PATTERN.test(namespace)) {\n log(400)\n return stamp(\n new Response(\n JSON.stringify({\n error: {\n type: \"mockingbird_admin\",\n message: `${NAMESPACE_HEADER} must match ${KEY_PATTERN}`,\n },\n }),\n { status: 400, headers: { \"content-type\": \"application/json; charset=utf-8\" } },\n ),\n )\n }\n if (!KEY_PATTERN.test(selectedBranch)) {\n log(400)\n return stamp(adminFail(400, `${BRANCH_HEADER} must match ${KEY_PATTERN}`))\n }\n requestClock = namespaceClock(namespace)\n const refuse = (status: number, message: string): Response => {\n log(status)\n return stamp(adminFail(status, message))\n }\n // Controls carried by this request. Whatever could refuse the request is checked before\n // anything is applied, so a request that is refused has changed nothing.\n let requested: RequestControls | undefined\n let scripted: FaultRule[] = []\n try {\n requested = parseControlHeaders(request.headers)\n if (requested)\n scripted = controls.scriptFaults(namespace, {\n ...(requested.fault ? { fault: requested.fault } : {}),\n ...(requested.timeout !== undefined ? { timeoutMs: requested.timeout } : {}),\n })\n const lost = requested?.restore !== undefined ? CONTROL_HEADERS.restore : at && AT_HEADER\n if (requested?.reset && lost)\n throw new ControlError(\n `${CONTROL_HEADERS.reset}: a reset discards snapshots and history, so ${lost} cannot follow it`,\n )\n } catch (error) {\n if (error instanceof ControlError) return refuse(400, error.message)\n throw error\n }\n // A write that names a checkpoint on `main` first moves `main` back to it. That changes\n // the namespace, so it is guarded like the headers that say so outright.\n const rewinds =\n at !== undefined && selectedBranch === \"main\" && MUTATING_METHODS.has(request.method)\n if (\n (requested || rewinds) &&\n options.adminKey !== undefined &&\n !hasAdminKey(request.headers, options.adminKey)\n )\n return refuse(401, `control headers need ${ADMIN_KEY_HEADER}`)\n controls.ensure(namespace)\n if (requested?.restore !== undefined && !snapshotStore.get(namespace, requested.restore))\n return refuse(404, `no snapshot ${requested.restore} in namespace ${namespace}`)\n if (at !== undefined) {\n try {\n timeline(namespace).get(at)\n } catch (error) {\n return refuse(409, error instanceof Error ? error.message : String(error))\n }\n }\n if (requested) {\n // The order the guide lists them in: reset, restore, seed, time, advance, virtual time.\n if (requested.reset) await reset(namespace)\n if (requested.restore !== undefined) snapshotStore.restore(namespace, requested.restore)\n if (requested.seed !== undefined) controls.reseed(namespace, requested.seed)\n if (requested.time !== undefined)\n controls.changeClock(namespace, { frozen: true, now: requested.time })\n if (requested.advance !== undefined)\n controls.changeClock(namespace, { advanceMs: requested.advance })\n if (requested.virtualTime !== undefined)\n controls.apply(namespace, { virtualTime: requested.virtualTime })\n }\n let storage: string\n try {\n if (\n at !== undefined &&\n selectedBranch === \"main\" &&\n !MUTATING_METHODS.has(request.method)\n ) {\n const point = timeline(namespace).get(at)\n storage = physicalBranch(namespace, `at_${at}`)\n let viewRng = rngs.get(storage)\n if (!viewRng) {\n viewRng = createRng(seedOf(namespace))\n instanceFor(storage, namespace, viewRng)\n }\n viewRng.setState(point.value.rngState)\n restoreStorage(storage, point.value.snapshot)\n captured.set(storage, point.value.snapshot)\n } else {\n storage = ensureBranch(namespace, selectedBranch, at)\n }\n } catch (error) {\n log(409)\n return stamp(adminFail(409, error instanceof Error ? error.message : String(error)))\n }\n const settings = controls.settings(namespace)\n virtualTime = settings.virtualTime\n if (settings.autoAdvanceMs > 0) requestClock.advance(settings.autoAdvanceMs)\n const wait = async (ms: number): Promise<void> => {\n if (!(ms > 0)) return\n waitedMs += ms\n // Virtual: the mock clock pays for the wait and the request carries on at once.\n if (virtualTime) requestClock.advance(ms)\n else await sleepUnlessAborted(ms, request.signal)\n }\n const candidate = {\n operationId,\n method: request.method,\n path: url.pathname,\n namespace,\n headers: request.headers,\n query: url.searchParams,\n // Read from a copy, so the service still gets the body. Not JSON: nothing to match.\n readJson: async (): Promise<unknown> => {\n try {\n return JSON.parse(await request.clone().text())\n } catch {\n return undefined\n }\n },\n wait,\n }\n let hits: FaultHit[]\n try {\n await wait(latency.take(namespace, operationId) + (requested?.delay ?? 0))\n hits = scripted.length > 0 ? await faults.fire(scripted, candidate) : []\n if (!hits.some((hit) => hit.drop || hit.response))\n hits.push(...(await faults.take({ ...candidate, now: requestClock.now() })))\n } catch (error) {\n // The client gave up while the request was being held.\n log(0)\n throw error\n }\n const final = hits.find((hit) => hit.drop || hit.response)\n /** A response is done: cut it short if asked to, name the fault, take the snapshot. */\n const finish = (response: Response): Response => {\n let out = response\n const truncate = hits.find((hit) => hit.truncate !== undefined)?.truncate\n if (truncate !== undefined) out = truncateResponse(out, truncate)\n // The rule the journal names: the one that answered, or the first that shaped it.\n const shaped = final ?? hits[0]\n if (shaped) {\n out = mutableResponse(out)\n out.headers.set(FAULT_HEADER, shaped.id)\n }\n if (requested?.snapshot !== undefined) {\n out = mutableResponse(out)\n out.headers.set(SNAPSHOT_HEADER, snapshotStore.create(namespace, requested.snapshot).id)\n }\n return stamp(out)\n }\n if (final?.drop) {\n log(0, final.id)\n throw new DroppedConnectionError(final.timeout ? \"timeout\" : \"drop\")\n }\n if (final?.response) {\n log(final.response.status, final.id)\n return finish(final.response)\n }\n const fired = hits.filter((hit) => hit.effect !== undefined)\n if (fired.length > 0)\n effects.set(\n request,\n fired.map((hit) => hit.effect),\n )\n let active = true\n acceptance.set(request, (notes) => {\n if (!active || accepted || !MUTATING_METHODS.has(request.method)) return\n accepted = timeline(namespace).commit(capture(storage), { branch: selectedBranch })\n acceptedNotes = notes\n })\n let response: Response\n try {\n response = await instanceFor(storage, namespace).fetch(request)\n } catch (error) {\n log(error instanceof DroppedConnectionError ? 0 : 500, hits[0]?.id)\n throw error\n } finally {\n active = false\n acceptance.delete(request)\n }\n const wireStatus = responseNotes(response)?.wireStatus ?? response.status\n if (MUTATING_METHODS.has(request.method) && wireStatus >= 200 && wireStatus < 400) {\n const current = capture(storage)\n const unchanged =\n accepted &&\n timeline(namespace).head(selectedBranch)?.id === accepted.id &&\n current.snapshot.records === accepted.value.snapshot.records &&\n current.snapshot.sequences === accepted.value.snapshot.sequences &&\n current.rngState === accepted.value.rngState\n const point =\n unchanged && accepted\n ? accepted\n : timeline(namespace).commit(current, { branch: selectedBranch })\n response = mutableResponse(response)\n response.headers.set(CHECKPOINT_HEADER, point.id)\n }\n if (selectedBranch !== \"main\") {\n response = mutableResponse(response)\n response.headers.set(BRANCH_HEADER, selectedBranch)\n }\n if (at !== undefined) {\n response = mutableResponse(response)\n response.headers.set(AT_HEADER, at)\n }\n log(wireStatus, hits[0]?.id, response)\n return finish(response)\n },\n }\n\n /** Wait on the wall clock, giving up the moment the caller does. */\n const sleepUnlessAborted = async (ms: number, signal: AbortSignal | undefined): Promise<void> => {\n if (!signal) return sleep(ms)\n if (signal.aborted) throw signal.reason\n let stop = () => {}\n const aborted = new Promise<never>((_, reject) => {\n const abort = () => reject(signal.reason)\n signal.addEventListener(\"abort\", abort, { once: true })\n stop = () => signal.removeEventListener(\"abort\", abort)\n })\n try {\n await Promise.race([sleep(ms, signal), aborted])\n } finally {\n stop()\n }\n }\n\n const control = createControlPlane({\n name: options.name,\n version,\n startedAt: wallNow(),\n wallNow,\n clock,\n namespaceClock,\n metrics,\n journal,\n defaultNamespace: DEFAULT_NAMESPACE,\n namespaces: runtime.namespaces,\n reset,\n dropNamespace,\n controls,\n snapshots: snapshotStore,\n applyControls,\n timeTravel: {\n checkpoint: (name, branchName) => {\n const point = checkpoint(name, branchName)\n return {\n id: point.id,\n branch: point.branch,\n parent: point.parent,\n at: point.at,\n records: point.value.snapshot.records.length,\n }\n },\n branch: (branchName, branchOptions) => {\n const point = branch(branchName, branchOptions)\n return { id: point.id, branch: point.branch, parent: point.parent, at: point.at }\n },\n checkout: (checkpointId, checkoutOptions) => checkout(checkpointId, checkoutOptions),\n retain: (name, checkpointId) => {\n timeline(name).retain(checkpointId)\n },\n release: (name, checkpointId) => timeline(name).release(checkpointId),\n inspect: (name) => {\n const history = timeline(name)\n return {\n branches: history.branches(),\n checkpoints: history.checkpoints().map(({ id, branch: branchName, parent, at }) => ({\n id,\n branch: branchName,\n parent,\n at,\n })),\n }\n },\n },\n describe: options.describe ?? (() => ({})),\n routes: {\n ...credentialRoutes(credentials),\n ...(options.webhooks ? webhookAdminRoutes(options.webhooks) : {}),\n ...(options.admin?.(runtime) ?? {}),\n ...stateAdminRoutes({\n open: stateScope,\n afterWrite: (namespace) => {\n checkpoint(namespace, \"main\")\n },\n }),\n ...adminUiRoutes(options.name, options.adminUi, adminPrefix),\n },\n adminPrefix,\n adminKey: options.adminKey,\n })\n\n // The default namespace boots now, so its rules precede anything a caller adds later.\n controls.ensure(DEFAULT_NAMESPACE)\n return defineMock(runtime)\n}\n\nconst mutableResponse = (response: Response): Response => {\n try {\n response.headers.set(\"x-mockingbird-mutable-probe\", \"1\")\n response.headers.delete(\"x-mockingbird-mutable-probe\")\n return response\n } catch {\n return new Response(response.body, response)\n }\n}\n\nconst adminJson = (status: number, body: unknown): Response =>\n new Response(JSON.stringify(body), {\n status,\n headers: { \"content-type\": \"application/json; charset=utf-8\" },\n })\n\nconst adminFail = (status: number, message: string): Response =>\n adminJson(status, { error: { type: \"mockingbird_admin\", message } })\n\n/**\n * `PUT /__admin/credentials` accepts `{ credentials: { \"<credential>\": \"<namespace>\" } }`,\n * `[{ credential, namespace }]`, or `{ credentials: [\"<credential>\"] }` with `?namespace=`\n * (maps each to the calling namespace). `GET` lists them masked; `DELETE` removes one\n * (`?credential=`) or all.\n */\nconst credentialRoutes = (registry: CredentialRegistry): AdminRoutes => ({\n \"GET /credentials\": () =>\n adminJson(200, {\n credentials: registry.entries().map(({ credential, namespace }) => ({\n credential: maskCredential(credential),\n namespace,\n })),\n }),\n \"PUT /credentials\": ({ body, namespace }) => {\n const pairs: [string, string][] = []\n const list = Array.isArray(body) ? body : isRecord(body) ? body.credentials : undefined\n if (Array.isArray(list)) {\n for (const each of list) {\n if (typeof each === \"string\") pairs.push([each, namespace])\n else if (isRecord(each) && typeof each.credential === \"string\") {\n pairs.push([\n each.credential,\n typeof each.namespace === \"string\" ? each.namespace : namespace,\n ])\n } else return adminFail(400, \"each entry is a credential string or {credential, namespace}\")\n }\n } else if (isRecord(list)) {\n for (const [credential, target] of Object.entries(list)) {\n if (typeof target !== \"string\")\n return adminFail(400, `namespace for ${credential} must be a string`)\n pairs.push([credential, target])\n }\n } else if (isRecord(body) && typeof body.credential === \"string\") {\n pairs.push([body.credential, typeof body.namespace === \"string\" ? body.namespace : namespace])\n } else {\n return adminFail(400, 'expected {\"credentials\": {\"<credential>\": \"<namespace>\"}}')\n }\n for (const [credential, target] of pairs) {\n if (!KEY_PATTERN.test(target))\n return adminFail(400, `bad namespace ${JSON.stringify(target)}`)\n registry.set(credential, target)\n }\n return adminJson(200, { mapped: pairs.length })\n },\n \"DELETE /credentials\": ({ url }) => {\n const credential = url.searchParams.get(\"credential\")\n if (credential === null) registry.clear()\n else registry.remove(credential)\n return adminJson(200, { status: \"ok\" })\n },\n})\n", "// Generated by @crvouga/mockingbird-openapi-codegen from openapi.yaml. Do not edit.\n\nimport type { OpenAPIDocument } from \"@crvouga/mockingbird-openapi\"\n\nexport const document: OpenAPIDocument = JSON.parse(`{\"openapi\":\"3.1.0\",\"info\":{\"title\":\"Fullscript API (Mockingbird subset)\",\"description\":\"Stateful emulator subset of the Fullscript API for lab ordering: per-practitioner OAuth (authorize, token with authorization_code and refresh_token grants, revoke), clinic, embeddable session grants, lab orders, lab-order events, expiring result PDFs, and signed webhooks. Hand-authored from the EMR consumer (fullscript-api-client.ts, fullscript-event-model.ts, fullscript-webhook-signature.ts).\\\\n\",\"version\":\"1\",\"x-mockingbird-upstream\":{\"note\":\"Wire shapes from the consumer app's EMR backend (its Fullscript services and routers); the vendor's API reference is behind a partner login.\"}},\"servers\":[{\"url\":\"https://api-us-snd.fullscript.io\"}],\"security\":[{\"bearerAuth\":[]}],\"paths\":{\"/api/oauth/token\":{\"post\":{\"operationId\":\"OAuthToken\",\"description\":\"Exchange an authorization code, or rotate a refresh token (the old refresh token stops working).\",\"x-mockingbird\":{\"supported\":true,\"parity\":{\"enabled\":true,\"safe\":true}},\"responses\":{\"200\":{\"description\":\"Token\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/OAuthTokenResponse\"}}}},\"400\":{\"description\":\"invalid_grant / unsupported_grant_type / invalid_request\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/OAuthError\"}}}},\"401\":{\"description\":\"invalid_client\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/OAuthError\"}}}},\"429\":{\"description\":\"Rate limited\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ApiErrors\"}}}}},\"security\":[],\"requestBody\":{\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/TokenRequest\"}}}}}},\"/api/oauth/revoke\":{\"post\":{\"operationId\":\"OAuthRevoke\",\"description\":\"Revoke an access or refresh token (RFC 7009: always 200).\",\"x-mockingbird\":{\"supported\":true,\"parity\":{\"enabled\":true,\"safe\":false}},\"responses\":{\"200\":{\"description\":\"Revoked\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\"}}}},\"400\":{\"description\":\"invalid_request\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/OAuthError\"}}}},\"401\":{\"description\":\"invalid_client\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/OAuthError\"}}}},\"429\":{\"description\":\"Rate limited\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ApiErrors\"}}}}},\"security\":[],\"requestBody\":{\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/RevokeRequest\"}}}}}},\"/api/clinic\":{\"get\":{\"operationId\":\"GetClinic\",\"description\":\"The token's clinic.\",\"x-mockingbird\":{\"supported\":true,\"parity\":{\"enabled\":true,\"safe\":true}},\"responses\":{\"200\":{\"description\":\"Clinic\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ClinicResponse\"}}}},\"401\":{\"description\":\"Missing, invalid, expired or revoked access token\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ApiErrors\"}}}},\"429\":{\"description\":\"Rate limited\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ApiErrors\"}}}}}}},\"/api/clinic/embeddable/session_grants\":{\"post\":{\"operationId\":\"CreateSessionGrant\",\"description\":\"A short-lived secret for the embedded Fullscript widget.\",\"x-mockingbird\":{\"supported\":true,\"parity\":{\"enabled\":true,\"safe\":true}},\"responses\":{\"201\":{\"description\":\"Grant\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/SessionGrant\"}}}},\"401\":{\"description\":\"Missing, invalid, expired or revoked access token\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ApiErrors\"}}}},\"429\":{\"description\":\"Rate limited\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ApiErrors\"}}}}}}},\"/api/clinic/labs/orders\":{\"get\":{\"operationId\":\"ListLabOrders\",\"description\":\"The clinic's lab orders (optionally one patient's), paged.\",\"x-mockingbird\":{\"supported\":true,\"parity\":{\"enabled\":true,\"safe\":true}},\"responses\":{\"200\":{\"description\":\"Page\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/LabOrdersPage\"}}}},\"401\":{\"description\":\"Missing, invalid, expired or revoked access token\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ApiErrors\"}}}},\"429\":{\"description\":\"Rate limited\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ApiErrors\"}}}}},\"parameters\":[{\"name\":\"patient_id\",\"in\":\"query\",\"required\":false,\"schema\":{\"type\":\"string\",\"enum\":[\"pat_seed_1\",\"pat_seed_2\",\"pat_missing\"]}},{\"name\":\"page[number]\",\"in\":\"query\",\"required\":false,\"schema\":{\"type\":\"integer\",\"minimum\":1,\"maximum\":3}},{\"name\":\"page[size]\",\"in\":\"query\",\"required\":false,\"schema\":{\"type\":\"integer\",\"minimum\":1,\"maximum\":100}}]}},\"/api/clinic/labs/orders/{orderId}\":{\"get\":{\"operationId\":\"GetLabOrder\",\"description\":\"One lab order with tests, per-test results and the aggregated result.\",\"x-mockingbird\":{\"supported\":true,\"parity\":{\"enabled\":true,\"safe\":true}},\"responses\":{\"200\":{\"description\":\"Order\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/LabOrderResponse\"}}}},\"401\":{\"description\":\"Missing, invalid, expired or revoked access token\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ApiErrors\"}}}},\"404\":{\"description\":\"Unknown order\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ApiErrors\"}}}},\"429\":{\"description\":\"Rate limited\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ApiErrors\"}}}}},\"parameters\":[{\"name\":\"orderId\",\"in\":\"path\",\"required\":true,\"schema\":{\"type\":\"string\",\"enum\":[\"lo_seed_1\",\"lo_seed_2\",\"lo_seed_3\",\"lo_missing\"]}}]}},\"/api/events/lab_orders\":{\"get\":{\"operationId\":\"ListLabOrderEvents\",\"description\":\"The clinic's lab_order.updated events, newest first by default.\",\"x-mockingbird\":{\"supported\":true,\"parity\":{\"enabled\":true,\"safe\":true}},\"responses\":{\"200\":{\"description\":\"Page\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/EventsPage\"}}}},\"401\":{\"description\":\"Missing, invalid, expired or revoked access token\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ApiErrors\"}}}},\"429\":{\"description\":\"Rate limited\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ApiErrors\"}}}}},\"parameters\":[{\"name\":\"order_by\",\"in\":\"query\",\"required\":false,\"schema\":{\"type\":\"string\",\"enum\":[\"DESC\",\"ASC\"]}},{\"name\":\"page[number]\",\"in\":\"query\",\"required\":false,\"schema\":{\"type\":\"integer\",\"minimum\":1,\"maximum\":3}},{\"name\":\"page[size]\",\"in\":\"query\",\"required\":false,\"schema\":{\"type\":\"integer\",\"minimum\":1,\"maximum\":100}}]}},\"/api/events/{eventId}\":{\"get\":{\"operationId\":\"GetEvent\",\"description\":\"One event with its data.\",\"x-mockingbird\":{\"supported\":true,\"parity\":{\"enabled\":true,\"safe\":true}},\"responses\":{\"200\":{\"description\":\"Event\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/EventResponse\"}}}},\"401\":{\"description\":\"Missing, invalid, expired or revoked access token\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ApiErrors\"}}}},\"404\":{\"description\":\"Unknown event\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ApiErrors\"}}}},\"429\":{\"description\":\"Rate limited\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ApiErrors\"}}}}},\"parameters\":[{\"name\":\"eventId\",\"in\":\"path\",\"required\":true,\"schema\":{\"type\":\"string\",\"enum\":[\"evt_1\",\"evt_2\",\"evt_3\",\"evt_missing\"]}}]}},\"/oauth/authorize\":{\"get\":{\"operationId\":\"Authorize\",\"description\":\"The consent page: auto-approves as the requested (or default) practitioner and redirects to redirect_uri with code and state.\",\"security\":[],\"x-mockingbird\":{\"supported\":true,\"parity\":{\"enabled\":false,\"reason\":\"Browser redirect flow; covered by acceptance tests.\"}},\"parameters\":[{\"name\":\"client_id\",\"in\":\"query\",\"required\":true,\"schema\":{\"type\":\"string\"}},{\"name\":\"redirect_uri\",\"in\":\"query\",\"required\":true,\"schema\":{\"type\":\"string\"}},{\"name\":\"response_type\",\"in\":\"query\",\"required\":true,\"schema\":{\"type\":\"string\",\"enum\":[\"code\"]}},{\"name\":\"state\",\"in\":\"query\",\"required\":false,\"schema\":{\"type\":\"string\"}},{\"name\":\"scope\",\"in\":\"query\",\"required\":false,\"schema\":{\"type\":\"string\"}},{\"name\":\"practitioner_id\",\"in\":\"query\",\"required\":false,\"schema\":{\"type\":\"string\"}}],\"responses\":{\"302\":{\"description\":\"Redirect back with ?code=&state=\"},\"400\":{\"description\":\"Bad request\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/OAuthError\"}}}}}}},\"/results/{artifactId}\":{\"get\":{\"operationId\":\"GetResultPdf\",\"description\":\"An expiring result PDF URL (what pdf_url points at).\",\"security\":[],\"x-mockingbird\":{\"supported\":true,\"parity\":{\"enabled\":false,\"reason\":\"Binary PDF behind an expiring signed URL; covered by acceptance tests.\"}},\"parameters\":[{\"name\":\"artifactId\",\"in\":\"path\",\"required\":true,\"schema\":{\"type\":\"string\"}},{\"name\":\"expires\",\"in\":\"query\",\"required\":true,\"schema\":{\"type\":\"string\"}},{\"name\":\"signature\",\"in\":\"query\",\"required\":true,\"schema\":{\"type\":\"string\"}}],\"responses\":{\"200\":{\"description\":\"The PDF\",\"content\":{\"application/pdf\":{\"schema\":{\"type\":\"string\",\"format\":\"binary\"}}}},\"403\":{\"description\":\"Expired or bad signature\"},\"404\":{\"description\":\"Unknown artifact\"}}}}},\"components\":{\"securitySchemes\":{\"bearerAuth\":{\"type\":\"http\",\"scheme\":\"bearer\"}},\"schemas\":{\"TokenRequest\":{\"type\":\"object\",\"required\":[\"grant_type\",\"client_id\",\"client_secret\"],\"properties\":{\"grant_type\":{\"type\":\"string\",\"enum\":[\"authorization_code\",\"refresh_token\"]},\"client_id\":{\"type\":\"string\",\"minLength\":1,\"maxLength\":64,\"examples\":[\"parity-client\"]},\"client_secret\":{\"type\":\"string\",\"minLength\":1,\"maxLength\":64,\"examples\":[\"parity-secret\"]},\"code\":{\"type\":\"string\",\"maxLength\":64},\"refresh_token\":{\"type\":\"string\",\"maxLength\":200},\"redirect_uri\":{\"type\":\"string\",\"maxLength\":200,\"examples\":[\"https://emr.example.com/v1/fullscript/oauth/callback\"]}}},\"RevokeRequest\":{\"type\":\"object\",\"required\":[\"client_id\",\"client_secret\",\"token\"],\"properties\":{\"client_id\":{\"type\":\"string\",\"minLength\":1,\"maxLength\":64},\"client_secret\":{\"type\":\"string\",\"minLength\":1,\"maxLength\":64},\"token\":{\"type\":\"string\",\"minLength\":1,\"maxLength\":200}}},\"OAuthTokenResponse\":{\"type\":\"object\",\"required\":[\"oauth\"],\"properties\":{\"oauth\":{\"type\":\"object\",\"required\":[\"access_token\",\"token_type\",\"expires_in\",\"refresh_token\",\"scope\",\"created_at\",\"resource_owner\"],\"properties\":{\"access_token\":{\"type\":\"string\",\"x-mockingbird-volatile\":{\"kind\":\"token\"}},\"token_type\":{\"type\":\"string\",\"enum\":[\"Bearer\"]},\"expires_in\":{\"type\":\"integer\"},\"refresh_token\":{\"type\":\"string\",\"x-mockingbird-volatile\":{\"kind\":\"token\"}},\"scope\":{\"type\":\"string\"},\"created_at\":{\"type\":\"string\",\"x-mockingbird-volatile\":{\"kind\":\"timestamp\"}},\"resource_owner\":{\"type\":\"object\",\"required\":[\"id\",\"type\"],\"properties\":{\"id\":{\"type\":\"string\"},\"type\":{\"type\":\"string\",\"enum\":[\"Practitioner\",\"Staff\"]},\"clinic_id\":{\"type\":\"string\"}}}}}}},\"OAuthError\":{\"type\":\"object\",\"required\":[\"error\"],\"properties\":{\"error\":{\"type\":\"string\"},\"error_description\":{\"type\":\"string\"}}},\"ApiErrors\":{\"type\":\"object\",\"required\":[\"errors\"],\"properties\":{\"errors\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"required\":[\"code\",\"message\"],\"properties\":{\"code\":{\"type\":\"string\"},\"message\":{\"type\":\"string\"}}}}}},\"ClinicResponse\":{\"type\":\"object\",\"required\":[\"clinic\"],\"properties\":{\"clinic\":{\"type\":\"object\",\"required\":[\"id\",\"name\"],\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"created_at\":{\"type\":\"string\",\"x-mockingbird-volatile\":{\"kind\":\"timestamp\"}}}}}},\"SessionGrant\":{\"type\":\"object\",\"required\":[\"secret_token\",\"expires_at\"],\"properties\":{\"secret_token\":{\"type\":\"string\",\"x-mockingbird-volatile\":{\"kind\":\"token\"}},\"expires_at\":{\"type\":\"string\",\"x-mockingbird-volatile\":{\"kind\":\"timestamp\"}}}},\"LabOrderSummary\":{\"type\":\"object\",\"required\":[\"id\",\"state\",\"treatment_plan_id\",\"patient_id\",\"created_at\",\"updated_at\"],\"properties\":{\"id\":{\"type\":\"string\"},\"state\":{\"type\":\"string\",\"enum\":[\"not_purchased\",\"purchased\",\"schedule_appointment\",\"upcoming_appointment\",\"processing\",\"partial_results\",\"results_ready\",\"interpretation_shared\",\"results_amended\"]},\"treatment_plan_id\":{\"type\":[\"string\",\"null\"]},\"patient_id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"created_at\":{\"type\":\"string\",\"x-mockingbird-volatile\":{\"kind\":\"timestamp\"}},\"updated_at\":{\"type\":\"string\",\"x-mockingbird-volatile\":{\"kind\":\"timestamp\"}}}},\"LabOrdersPage\":{\"type\":\"object\",\"required\":[\"orders\",\"meta\"],\"properties\":{\"orders\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/LabOrderSummary\"}},\"meta\":{\"type\":\"object\",\"required\":[\"current_page\",\"next_page\",\"prev_page\",\"total_pages\",\"total_count\"],\"properties\":{\"current_page\":{\"type\":\"integer\"},\"next_page\":{\"type\":[\"integer\",\"null\"]},\"prev_page\":{\"type\":[\"integer\",\"null\"]},\"total_pages\":{\"type\":\"integer\"},\"total_count\":{\"type\":\"integer\"}}}}},\"LabOrderResponse\":{\"type\":\"object\",\"required\":[\"order\"],\"properties\":{\"order\":{\"type\":\"object\",\"required\":[\"id\",\"state\",\"treatment_plan_id\",\"tests\",\"results\",\"latest_aggregated_result\"],\"properties\":{\"id\":{\"type\":\"string\"},\"state\":{\"type\":\"string\",\"enum\":[\"not_purchased\",\"purchased\",\"schedule_appointment\",\"upcoming_appointment\",\"processing\",\"partial_results\",\"results_ready\",\"interpretation_shared\",\"results_amended\"]},\"treatment_plan_id\":{\"type\":[\"string\",\"null\"]},\"patient_id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"collection_method\":{\"type\":\"string\"},\"created_at\":{\"type\":\"string\",\"x-mockingbird-volatile\":{\"kind\":\"timestamp\"}},\"updated_at\":{\"type\":\"string\",\"x-mockingbird-volatile\":{\"kind\":\"timestamp\"}},\"tests\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"required\":[\"id\",\"name\"],\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"lab_type\":{\"type\":\"string\"}}}},\"results\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"required\":[\"id\",\"name\",\"state\",\"pdf_url\"],\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"state\":{\"type\":\"string\"},\"pdf_url\":{\"type\":\"string\",\"x-mockingbird-volatile\":{\"kind\":\"url\"}}}}},\"latest_aggregated_result\":{\"type\":[\"object\",\"null\"],\"properties\":{\"id\":{\"type\":\"string\"},\"artifact_id\":{\"type\":\"string\"},\"pdf_url\":{\"type\":\"string\",\"x-mockingbird-volatile\":{\"kind\":\"url\"}},\"status\":{\"type\":\"string\"}}}}}}},\"EventSummary\":{\"type\":\"object\",\"required\":[\"id\",\"type\",\"clinic_id\",\"created_at\"],\"properties\":{\"id\":{\"type\":\"string\"},\"type\":{\"type\":\"string\",\"enum\":[\"lab_order.updated\"]},\"clinic_id\":{\"type\":\"string\"},\"created_at\":{\"type\":\"string\",\"x-mockingbird-volatile\":{\"kind\":\"timestamp\"}}}},\"EventsPage\":{\"type\":\"object\",\"required\":[\"events\",\"meta\"],\"properties\":{\"events\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/EventSummary\"}},\"meta\":{\"type\":\"object\",\"required\":[\"current_page\",\"next_page\",\"prev_page\",\"total_pages\",\"total_count\"],\"properties\":{\"current_page\":{\"type\":\"integer\"},\"next_page\":{\"type\":[\"integer\",\"null\"]},\"prev_page\":{\"type\":[\"integer\",\"null\"]},\"total_pages\":{\"type\":\"integer\"},\"total_count\":{\"type\":\"integer\"}}}}},\"EventResponse\":{\"type\":\"object\",\"required\":[\"event\"],\"properties\":{\"event\":{\"type\":\"object\",\"required\":[\"id\",\"type\",\"clinic_id\",\"created_at\",\"data\"],\"properties\":{\"id\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"},\"clinic_id\":{\"type\":\"string\"},\"created_at\":{\"type\":\"string\",\"x-mockingbird-volatile\":{\"kind\":\"timestamp\"}},\"data\":{\"type\":\"object\"}}}}}}}}`) as OpenAPIDocument\n\nexport type OperationId = \"OAuthToken\" | \"OAuthRevoke\" | \"GetClinic\" | \"CreateSessionGrant\" | \"ListLabOrders\" | \"GetLabOrder\" | \"ListLabOrderEvents\" | \"GetEvent\" | \"Authorize\" | \"GetResultPdf\"\nexport type SupportedOperationId = \"OAuthToken\" | \"OAuthRevoke\" | \"GetClinic\" | \"CreateSessionGrant\" | \"ListLabOrders\" | \"GetLabOrder\" | \"ListLabOrderEvents\" | \"GetEvent\" | \"Authorize\" | \"GetResultPdf\"\nexport const operationIds = [\"OAuthToken\",\"OAuthRevoke\",\"GetClinic\",\"CreateSessionGrant\",\"ListLabOrders\",\"GetLabOrder\",\"ListLabOrderEvents\",\"GetEvent\",\"Authorize\",\"GetResultPdf\"] as const\nexport const supportedOperationIds = [\"OAuthToken\",\"OAuthRevoke\",\"GetClinic\",\"CreateSessionGrant\",\"ListLabOrders\",\"GetLabOrder\",\"ListLabOrderEvents\",\"GetEvent\",\"Authorize\",\"GetResultPdf\"] as const\n", "/** A minimal, valid one-page PDF: what every result URL serves (starts with `%PDF-`). */\nexport const RESULT_PDF: Uint8Array = new TextEncoder().encode(\n \"%PDF-1.4\\n1 0 obj\\n<< /Type /Catalog /Pages 2 0 R >>\\nendobj\\n2 0 obj\\n<< /Type /Pages /Kids [3 0 R] /Count 1 >>\\nendobj\\n3 0 obj\\n<< /Type /Page /Parent 2 0 R /MediaBox [0 0 612 792] /Contents 4 0 R /Resources << /Font << /F1 5 0 R >> >> >>\\nendobj\\n4 0 obj\\n<< /Length 64 >>\\nstream\\nBT /F1 18 Tf 72 720 Td (Mockingbird Fullscript lab result) Tj ET\\nendstream\\nendobj\\n5 0 obj\\n<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>\\nendobj\\nxref\\n0 6\\n0000000000 65535 f \\n0000000009 00000 n \\n0000000058 00000 n \\n0000000115 00000 n \\n0000000241 00000 n \\n0000000355 00000 n \\ntrailer\\n<< /Size 6 /Root 1 0 R >>\\nstartxref\\n425\\n%%EOF\\n\",\n)\n", "import { Collection } from \"@crvouga/mockingbird-service\"\nimport type { SqliteClient } from \"@crvouga/mockingbird-sqlite\"\n\n/** Lab order states, in the only order they may move (forward). */\nexport const LAB_ORDER_STATES = [\n \"not_purchased\",\n \"purchased\",\n \"schedule_appointment\",\n \"upcoming_appointment\",\n \"processing\",\n \"partial_results\",\n \"results_ready\",\n \"interpretation_shared\",\n \"results_amended\",\n] as const\n\nexport type LabOrderState = (typeof LAB_ORDER_STATES)[number]\n\nexport const isLabOrderState = (value: unknown): value is LabOrderState =>\n typeof value === \"string\" && (LAB_ORDER_STATES as readonly string[]).includes(value)\n\nexport const stateRank = (state: LabOrderState) => LAB_ORDER_STATES.indexOf(state)\n\nexport type Practitioner = { id: string; type: \"Practitioner\" | \"Staff\"; clinicId: string }\nexport type Clinic = { id: string; name: string; created_at: string }\n\nexport type LabResult = { id: string; name: string; state: string; artifactId: string }\n\nexport type LabOrderRecord = {\n id: string\n clinicId: string\n patientId: string\n treatmentPlanId: string | null\n name: string\n collectionMethod: string\n state: LabOrderState\n tests: { id: string; name: string; lab_type: string }[]\n results: LabResult[]\n aggregated: { id: string; artifactId: string; status: string } | null\n created_at: string\n updated_at: string\n}\n\nexport type EventRecord = {\n id: string\n type: \"lab_order.updated\" | \"order.placed\"\n clinic_id: string\n created_at: string\n data: Record<string, unknown>\n /** Insertion order, for ASC / DESC paging. */\n seq: number\n}\n\nexport type CodeRecord = {\n code: string\n practitionerId: string\n clientId: string\n redirectUri: string | null\n expiresAtMs: number\n used: boolean\n}\n\nexport type RefreshRecord = {\n token: string\n practitionerId: string\n clientId: string\n revoked: boolean\n}\n\n/** Per-namespace knobs, set through `PUT /__admin/settings`; cleared on reset. */\nexport type Settings = {\n /** Only these OAuth clients authenticate; empty means any id/secret pair does. */\n clients: { clientId: string; clientSecret: string }[]\n /** Access-token lifetime on the mock clock. Default 7200 s (2 h). */\n accessTokenTtlSeconds: number\n /** Authorization-code lifetime. Default 600 s. */\n codeTtlSeconds: number\n /** Lifetime of a result PDF URL. Default 900 s. */\n pdfUrlTtlSeconds: number\n /** Origin (plus optional path) result PDF URLs point at; default: the request's own origin. */\n resultsBaseUrl: string | null\n}\n\nexport const DEFAULT_SETTINGS: Settings = {\n clients: [],\n accessTokenTtlSeconds: 7_200,\n codeTtlSeconds: 600,\n pdfUrlTtlSeconds: 900,\n resultsBaseUrl: null,\n}\n\nexport const DEFAULT_CLINIC: Clinic = {\n id: \"clinic_mock_1\",\n name: \"Acme Mock Clinic\",\n created_at: \"2025-01-01T00:00:00.000Z\",\n}\nexport const DEFAULT_PRACTITIONER: Practitioner = {\n id: \"prac_mock_1\",\n type: \"Practitioner\",\n clinicId: DEFAULT_CLINIC.id,\n}\n\ntype Counters = { code: number; refresh: number; order: number; event: number; artifact: number }\n\nexport class FullscriptState {\n readonly practitioners: Collection<Practitioner>\n readonly clinics: Collection<Clinic>\n readonly codes: Collection<CodeRecord>\n readonly refresh: Collection<RefreshRecord>\n readonly revoked: Collection<{ token: string }>\n readonly orders: Collection<LabOrderRecord>\n readonly events: Collection<EventRecord>\n readonly settings: Collection<Settings>\n private readonly counters: Collection<Counters>\n\n constructor(\n sqlite: SqliteClient,\n namespace: string,\n private readonly seed: Partial<Settings>,\n ) {\n this.practitioners = new Collection(sqlite, namespace, \"practitioners\")\n this.clinics = new Collection(sqlite, namespace, \"clinics\")\n this.codes = new Collection(sqlite, namespace, \"codes\")\n this.refresh = new Collection(sqlite, namespace, \"refresh_tokens\")\n this.revoked = new Collection(sqlite, namespace, \"revoked_tokens\")\n this.orders = new Collection(sqlite, namespace, \"lab_orders\")\n this.events = new Collection(sqlite, namespace, \"events\")\n this.settings = new Collection(sqlite, namespace, \"settings\")\n this.counters = new Collection(sqlite, namespace, \"counters\")\n this.ensureSeeded()\n }\n\n ensureSeeded(): void {\n if (this.clinics.count() === 0) this.clinics.insert(DEFAULT_CLINIC.id, DEFAULT_CLINIC)\n if (this.practitioners.count() === 0) {\n this.practitioners.insert(DEFAULT_PRACTITIONER.id, DEFAULT_PRACTITIONER)\n }\n if (!this.settings.has(\"settings\")) {\n this.settings.insert(\"settings\", { ...DEFAULT_SETTINGS, ...this.seed })\n }\n }\n\n current(): Settings {\n return this.settings.get(\"settings\") ?? DEFAULT_SETTINGS\n }\n\n update(patch: Partial<Settings>): Settings {\n const next = { ...this.current(), ...patch }\n this.settings.insert(\"settings\", next)\n return next\n }\n\n next(kind: keyof Counters): number {\n const current = this.counters.get(\"counters\") ?? {\n code: 0,\n refresh: 0,\n order: 0,\n event: 0,\n artifact: 0,\n }\n const next = { ...current, [kind]: current[kind] + 1 }\n this.counters.insert(\"counters\", next)\n return next[kind]\n }\n}\n", "import {\n type AdminRoutes,\n type Clock,\n createRuntime as createServiceRuntime,\n createWebhookHub,\n type FaultPreset,\n HttpError,\n type MockControls,\n type RequestLog,\n type ServiceRuntime,\n signers,\n type WebhookEndpoint,\n type WebhookHub,\n} from \"@crvouga/mockingbird-service\"\nimport type { SqliteClient } from \"@crvouga/mockingbird-sqlite\"\nimport { document } from \"./generated/openapi.js\"\nimport {\n envelope,\n FULLSCRIPT_NAMESPACE,\n FullscriptAPI,\n type SeedOrder,\n tokenCredential,\n} from \"./index.js\"\nimport { isLabOrderState, type Settings } from \"./state.js\"\n\n/** The header our receiver verifies: `t=<unix>,v1=<hex HMAC-SHA256(secret, \"<t>.\" + body)>`. */\nexport const SIGNATURE_HEADER = \"Fullscript-Signature\"\n\nconst API = \"/api/\"\n\n/**\n * Every named Fullscript misbehaviour our EMR integration branches on, switched on with\n * `POST /__admin/faults {\"preset\": \"<name>\"}` (add `count` to limit it).\n */\nexport const FULLSCRIPT_PRESETS: Record<string, FaultPreset> = {\n token_expired: {\n description:\n \"API calls answer 401 token_expired before the token's 2 h (our token service refreshes)\",\n rules: [\n { pathPrefix: \"/api/clinic\", effect: \"token_expired\" },\n { pathPrefix: \"/api/events\", effect: \"token_expired\" },\n ],\n },\n invalid_grant: {\n description:\n \"The refresh_token grant answers 400 invalid_grant (the practitioner must reconnect)\",\n rules: [{ operationId: \"OAuthToken\", effect: \"invalid_grant\" }],\n },\n rate_limited: {\n description: \"API calls answer 429 rate_limited\",\n rules: [\n {\n pathPrefix: API,\n status: 429,\n body: { errors: [{ code: \"rate_limited\", message: \"Too many requests\" }] },\n },\n ],\n },\n server_error: {\n description: \"API calls answer 500\",\n rules: [\n {\n pathPrefix: API,\n status: 500,\n body: { errors: [{ code: \"internal_server_error\", message: \"Something went wrong\" }] },\n },\n ],\n },\n events_schema_drift: {\n description:\n \"The lab-order events list answers an unexpected event type (our zod literal rejects it)\",\n rules: [{ operationId: \"ListLabOrderEvents\", effect: \"events_schema_drift\" }],\n },\n pdf_not_pdf: {\n description: \"Result PDF URLs answer 200 text/html (our downloader rejects the content type)\",\n rules: [\n {\n operationId: \"GetResultPdf\",\n status: 200,\n body: \"<html>Sign in</html>\",\n headers: { \"content-type\": \"text/html\" },\n },\n ],\n },\n pdf_redirect: {\n description: \"Result PDF URLs answer a 302 (our downloader refuses redirects)\",\n rules: [\n {\n operationId: \"GetResultPdf\",\n status: 302,\n body: \"\",\n headers: { location: \"https://login.fullscript.com/\" },\n },\n ],\n },\n pdf_expired: {\n description: \"Result PDF URLs answer 403 as if expired\",\n rules: [\n {\n operationId: \"GetResultPdf\",\n status: 403,\n body: \"Request has expired\",\n headers: { \"content-type\": \"text/plain\" },\n },\n ],\n },\n connection_drop: {\n description: \"The connection drops before any answer (fetch rejects)\",\n rules: [{ pathPrefix: API, drop: true }],\n },\n slow: {\n description: \"API calls answer after 12 s (past our client's 10 s timeout)\",\n rules: [{ pathPrefix: API, latencyMs: 12_000 }],\n },\n webhook_duplicate: {\n description: \"The next webhook is delivered twice\",\n webhook: { mode: \"duplicate\" },\n },\n webhook_reorder: {\n description: \"The next two webhooks arrive swapped\",\n webhook: { mode: \"reorder\" },\n },\n webhook_drop: { description: \"The next webhook is never delivered\", webhook: { mode: \"drop\" } },\n}\n\nexport type FullscriptRuntimeOptions = {\n sqlite?: SqliteClient\n clock?: Clock\n seed?: number | string\n adminPrefix?: string\n adminKey?: string\n /** Admin controls to boot with: clock, latency, faults, seed, a starting snapshot. */\n adminControls?: MockControls\n onLog?: (entry: RequestLog) => void\n settings?: Partial<Settings>\n orders?: readonly SeedOrder[]\n /**\n * Where webhooks go (`POST /v1/fullscript/webhooks`), signed with `secret` (the app's\n * FULLSCRIPT_WEBHOOK_SECRET). With `challenge` (FULLSCRIPT_WEBHOOK_CHALLENGE_KEY), a delivery\n * counts only when the receiver echoes `{challenge}`, as Fullscript requires.\n */\n webhooks?: Omit<WebhookEndpoint, \"id\"> & {\n challenge?: string\n retryDelaysMs?: readonly number[]\n fetch?: (request: Request) => Promise<Response>\n }\n}\n\nexport type FullscriptRuntime = ServiceRuntime<FullscriptAPI> & { readonly webhooks: WebhookHub }\n\nconst json = (status: number, body: unknown) =>\n new Response(JSON.stringify(body), { status, headers: { \"content-type\": \"application/json\" } })\nconst adminError = (status: number, message: string) =>\n json(status, { error: { type: \"mockingbird_admin\", message } })\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n\n/** Whether a receiver's answer echoes the challenge key (`{\"challenge\": \"<key>\"}`). */\nconst echoes = async (response: Response, challenge: string) => {\n try {\n const body = (await response.clone().json()) as { challenge?: unknown }\n return body.challenge === challenge\n } catch {\n return false\n }\n}\n\nconst adminRoutes =\n (send: (request: Request) => Promise<Response>, challenge: string | undefined) =>\n (runtime: ServiceRuntime<FullscriptAPI>): AdminRoutes => ({\n \"POST /oauth/codes\": ({ body, namespace }) => {\n const input = isRecord(body) ? body : {}\n const api = runtime.instance(namespace)\n const practitionerId =\n typeof input.practitionerId === \"string\" ? input.practitionerId : \"prac_mock_1\"\n if (!api.state.practitioners.get(practitionerId))\n return adminError(404, `no practitioner ${practitionerId}`)\n const code = api.issueCode(\n practitionerId,\n typeof input.clientId === \"string\" ? input.clientId : \"any\",\n typeof input.redirectUri === \"string\" ? input.redirectUri : null,\n )\n return json(201, { code })\n },\n \"POST /practitioners\": ({ body, namespace }) => {\n if (!isRecord(body) || typeof body.id !== \"string\" || typeof body.clinicId !== \"string\") {\n return adminError(\n 400,\n 'expected {\"id\", \"clinicId\", \"type\"?: \"Practitioner\"|\"Staff\", \"clinicName\"?}',\n )\n }\n const api = runtime.instance(namespace)\n if (!api.state.clinics.get(body.clinicId)) {\n api.state.clinics.insert(body.clinicId, {\n id: body.clinicId,\n name: typeof body.clinicName === \"string\" ? body.clinicName : body.clinicId,\n created_at: new Date(runtime.namespaceClock(namespace).now()).toISOString(),\n })\n }\n const practitioner = {\n id: body.id,\n clinicId: body.clinicId,\n type: body.type === \"Staff\" ? (\"Staff\" as const) : (\"Practitioner\" as const),\n }\n api.state.practitioners.insert(practitioner.id, practitioner)\n return json(201, practitioner)\n },\n \"GET /lab-orders\": ({ namespace }) =>\n json(200, { orders: runtime.instance(namespace).labOrders() }),\n \"POST /lab-orders\": ({ body, namespace }) => {\n if (!isRecord(body) || typeof body.patientId !== \"string\") {\n return adminError(\n 400,\n 'expected {\"patientId\", \"id\"?, \"clinicId\"?, \"treatmentPlanId\"?, \"name\"?, \"collectionMethod\"?, \"tests\"?: [names]}',\n )\n }\n const text = (key: string) =>\n typeof body[key] === \"string\" ? { [key]: body[key] as string } : {}\n const order = runtime.instance(namespace).createOrder({\n patientId: body.patientId,\n ...text(\"id\"),\n ...text(\"clinicId\"),\n ...text(\"treatmentPlanId\"),\n ...text(\"name\"),\n ...text(\"collectionMethod\"),\n ...(Array.isArray(body.tests) ? { tests: body.tests.map(String) } : {}),\n })\n return json(201, order)\n },\n \"POST /lab-orders/:id/transition\": ({ params, body, namespace }) => {\n if (!isRecord(body) || !isLabOrderState(body.to)) {\n return adminError(\n 400,\n 'expected {\"to\": \"<purchased|schedule_appointment|upcoming_appointment|processing|partial_results|results_ready|interpretation_shared|results_amended>\"}',\n )\n }\n try {\n return json(200, runtime.instance(namespace).transition(params.id as string, body.to))\n } catch (error) {\n if (error instanceof HttpError) return error.toResponse()\n throw error\n }\n },\n \"GET /events\": ({ namespace }) =>\n json(200, { events: runtime.instance(namespace).eventsList() }),\n \"POST /webhooks/verify\": async ({ namespace }) => {\n const endpoints = runtime.webhooks?.endpoints(namespace) ?? []\n const results = await Promise.all(\n endpoints.map(async (endpoint) => {\n try {\n const response = await send(\n new Request(endpoint.url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n }),\n )\n return {\n url: endpoint.url,\n status: response.status,\n challengeEchoed: challenge ? await echoes(response, challenge) : null,\n }\n } catch (error) {\n return {\n url: endpoint.url,\n status: null,\n error: error instanceof Error ? error.message : String(error),\n }\n }\n }),\n )\n return json(200, { endpoints: results })\n },\n \"GET /settings\": ({ namespace }) => json(200, runtime.instance(namespace).state.current()),\n \"PUT /settings\": ({ body, namespace }) => {\n if (!isRecord(body)) return adminError(400, \"expected a JSON object\")\n const patch: Partial<Settings> = {}\n for (const key of [\"accessTokenTtlSeconds\", \"codeTtlSeconds\", \"pdfUrlTtlSeconds\"] as const) {\n if (body[key] !== undefined) {\n if (typeof body[key] !== \"number\") return adminError(400, `${key}: number`)\n patch[key] = body[key] as number\n }\n }\n if (body.resultsBaseUrl !== undefined) {\n if (body.resultsBaseUrl !== null && typeof body.resultsBaseUrl !== \"string\")\n return adminError(400, \"resultsBaseUrl: string | null\")\n patch.resultsBaseUrl = body.resultsBaseUrl as string | null\n }\n if (body.clients !== undefined) {\n if (!Array.isArray(body.clients))\n return adminError(400, \"clients: [{clientId, clientSecret}]\")\n patch.clients = body.clients\n .filter(isRecord)\n .map((c) => ({ clientId: String(c.clientId), clientSecret: String(c.clientSecret) }))\n }\n return json(200, runtime.instance(namespace).state.update(patch))\n },\n })\n\n/**\n * The Fullscript mock with Mockingbird's full service contract: `/__admin/health`, `/__admin/*`,\n * namespaces by header, by `/__admin/ns/<name>` path prefix on FULLSCRIPT_API_URL, or by OAuth client\n * (for API calls), clock control, fault presets, signed webhooks and a request journal.\n */\nexport const createRuntime = (options: FullscriptRuntimeOptions = {}): FullscriptRuntime => {\n const { retryDelaysMs, fetch: rawSend, challenge, ...endpoint } = options.webhooks ?? { url: \"\" }\n const send = rawSend ?? ((request: Request) => fetch(request))\n const hub = createWebhookHub({\n signer: signers.timestamped(SIGNATURE_HEADER),\n ...(retryDelaysMs ? { retryDelaysMs } : {}),\n // Fullscript counts a delivery as acknowledged only when the receiver echoes the\n // challenge key; anything else is retried (recorded as a 502).\n fetch: async (request) => {\n const response = await send(request)\n if (!challenge || !response.ok || (await echoes(response, challenge))) return response\n return new Response(null, { status: 502, statusText: \"challenge not echoed\" })\n },\n endpoints: options.webhooks ? [endpoint as WebhookEndpoint] : [],\n })\n const runtime = createServiceRuntime<FullscriptAPI>({\n name: FULLSCRIPT_NAMESPACE,\n document,\n ...(options.sqlite ? { sqlite: options.sqlite } : {}),\n ...(options.clock ? { clock: options.clock } : {}),\n ...(options.seed !== undefined ? { seed: options.seed } : {}),\n ...(options.adminPrefix !== undefined ? { adminPrefix: options.adminPrefix } : {}),\n ...(options.adminKey !== undefined ? { adminKey: options.adminKey } : {}),\n ...(options.adminControls !== undefined ? { adminControls: options.adminControls } : {}),\n ...(options.onLog ? { onLog: options.onLog } : {}),\n credential: tokenCredential,\n presets: FULLSCRIPT_PRESETS,\n webhooks: hub,\n create: ({ sqlite, namespace, publicNamespace, adminPrefix, clock }) =>\n new FullscriptAPI({\n sqlite,\n namespace,\n publicNamespace,\n adminPrefix,\n now: clock.now,\n ...(options.settings ? { settings: options.settings } : {}),\n ...(options.orders ? { orders: options.orders } : {}),\n onEvent: (event) =>\n hub.publish({\n namespace: publicNamespace,\n type: event.type,\n id: event.id,\n body: envelope(event),\n }),\n }),\n describe: () => ({ webhooks: hub.endpoints(\"default\").length > 0 ? \"on\" : \"off\" }),\n admin: adminRoutes(send, challenge),\n })\n return Object.assign(runtime, { webhooks: hub })\n}\n", "import type { FetchAPI } from \"@crvouga/mockingbird-core\"\nimport {\n type APIOptions,\n annotateResponse,\n bearerToken,\n bodyIssues,\n bootSqlite,\n coerce,\n createService,\n defineOperations,\n faultEffect,\n fromBase64,\n HttpError,\n jsonRes,\n type OperationContext,\n opaqueToken,\n type Service,\n toBase64,\n} from \"@crvouga/mockingbird-service\"\nimport type { SqliteClient } from \"@crvouga/mockingbird-sqlite\"\nimport type { Hono } from \"hono\"\nimport { document, type SupportedOperationId } from \"./generated/openapi.js\"\nimport { RESULT_PDF } from \"./pdf.js\"\nimport {\n DEFAULT_PRACTITIONER,\n type EventRecord,\n FullscriptState,\n type LabOrderRecord,\n type LabOrderState,\n type Practitioner,\n type Settings,\n stateRank,\n} from \"./state.js\"\n\nexport type { FetchAPI } from \"@crvouga/mockingbird-core\"\nexport type { SqliteClient } from \"@crvouga/mockingbird-sqlite\"\nexport type { OperationId, SupportedOperationId } from \"./generated/openapi.js\"\nexport { document, operationIds, supportedOperationIds } from \"./generated/openapi.js\"\nexport { RESULT_PDF } from \"./pdf.js\"\nexport type {\n Clinic,\n EventRecord,\n LabOrderRecord,\n LabOrderState,\n Practitioner,\n Settings,\n} from \"./state.js\"\nexport {\n DEFAULT_CLINIC,\n DEFAULT_PRACTITIONER,\n isLabOrderState,\n LAB_ORDER_STATES,\n} from \"./state.js\"\n\nexport const FULLSCRIPT_NAMESPACE = \"fullscript\"\nconst SCOPE = \"clinic:read labs:read labs:write patients:read\"\nconst TOKEN_PREFIX = \"fsat_\"\n\n/** Fullscript API errors: `{errors: [{code, message}]}`. */\nexport const apiErrors = (status: number, code: string, message: string) =>\n jsonRes(status, { errors: [{ code, message }] })\n\n/** Doorkeeper OAuth errors: `{error, error_description}`. */\nexport const oauthError = (status: number, error: string, description: string) =>\n jsonRes(status, { error, error_description: description })\n\nconst INVALID_GRANT =\n \"The provided authorization grant is invalid, expired, revoked, does not match the redirection URI used in the authorization request, or was issued to another client.\"\nconst INVALID_CLIENT =\n \"Client authentication failed due to unknown client, no client authentication included, or unsupported authentication method.\"\n\nconst base64url = (value: string) =>\n toBase64(new TextEncoder().encode(value))\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=+$/, \"\")\nconst fromBase64url = (value: string) => {\n try {\n return new TextDecoder(\"utf-8\", { fatal: true }).decode(\n fromBase64(value.replace(/-/g, \"+\").replace(/_/g, \"/\")),\n )\n } catch {\n return undefined\n }\n}\n\ntype TokenClaims = {\n clientId: string\n practitionerId: string\n clinicId: string\n type: Practitioner[\"type\"]\n}\n\nconst sign = (payload: string, issuedAt: number) =>\n opaqueToken(`fullscript:${payload}:${issuedAt}`, 32)\n\n/** Access tokens are self-describing and signed, so any instance can verify them. */\nexport const issueAccessToken = (claims: TokenClaims, issuedAtSeconds: number) => {\n const payload = base64url(\n JSON.stringify([claims.clientId, claims.practitionerId, claims.clinicId, claims.type]),\n )\n return `${TOKEN_PREFIX}${payload}.${issuedAtSeconds}.${sign(payload, issuedAtSeconds)}`\n}\n\nconst readAccessToken = (token: string): (TokenClaims & { issuedAt: number }) | undefined => {\n if (!token.startsWith(TOKEN_PREFIX)) return undefined\n const [payload, issued, signature] = token.slice(TOKEN_PREFIX.length).split(\".\")\n const issuedAt = Number(issued)\n if (!payload || !Number.isInteger(issuedAt) || signature !== sign(payload, issuedAt))\n return undefined\n const decoded = fromBase64url(payload)\n try {\n const [clientId, practitionerId, clinicId, type] = JSON.parse(decoded ?? \"\") as string[]\n if (!clientId || !practitionerId || !clinicId) return undefined\n return {\n clientId,\n practitionerId,\n clinicId,\n type: type === \"Staff\" ? \"Staff\" : \"Practitioner\",\n issuedAt,\n }\n } catch {\n return undefined\n }\n}\n\n/** The OAuth client an access token was issued to (how credentials map to namespaces). */\nexport const tokenCredential = (request: Request): string | undefined => {\n const token = bearerToken(request)\n return token ? (readAccessToken(token)?.clientId ?? token) : undefined\n}\n\n/** A lab order to start a namespace with, walked forward to `state` (events included). */\nexport type SeedOrder = {\n id: string\n patientId: string\n state: LabOrderState\n clinicId?: string\n treatmentPlanId?: string | null\n name?: string\n collectionMethod?: string\n tests?: string[]\n}\n\nexport type FullscriptAPIOptions = APIOptions & {\n settings?: Partial<Settings>\n orders?: readonly SeedOrder[]\n /** The public namespace, so result PDF URLs carry a `/__admin/ns/<name>` prefix. */\n adminPrefix?: string\n publicNamespace?: string\n /** Called for every event; the runtime signs and delivers it. */\n onEvent?: (event: EventRecord) => void\n}\n\n/** An event as the events API returns it. */\nexport const publicEvent = (event: EventRecord) => ({\n id: event.id,\n type: event.type,\n clinic_id: event.clinic_id,\n created_at: event.created_at,\n data: event.data,\n})\n\n/** The webhook body Fullscript posts for an event: `{event_payload: {event}}`. */\nexport const envelope = (event: EventRecord) => ({ event_payload: { event: publicEvent(event) } })\n\nconst page = (context: OperationContext) => {\n const q = context.query as Record<string, unknown>\n const block = (q.page ?? {}) as Record<string, unknown>\n const number = coerce.integer(block.number ?? \"1\")\n const size = coerce.integer(block.size ?? \"20\")\n return {\n number: number.ok && number.value > 0 ? number.value : 1,\n size: size.ok && size.value > 0 ? Math.min(size.value, 100) : 20,\n }\n}\n\nconst meta = (current: number, size: number, total: number) => {\n const totalPages = Math.max(1, Math.ceil(total / size))\n return {\n current_page: current,\n next_page: current < totalPages ? current + 1 : null,\n prev_page: current > 1 ? current - 1 : null,\n total_pages: totalPages,\n total_count: total,\n }\n}\n\n/**\n * Stateful mock of the Fullscript lab-ordering API. Practitioners connect through OAuth;\n * lab orders move forward only through admin transitions, each emitting a `lab_order.updated`\n * event (and `order.placed` on purchase) readable through the events API and delivered as a\n * signed webhook. Results appear with the results-bearing states, as expiring PDF URLs.\n */\nexport class FullscriptAPI implements FetchAPI {\n readonly app: Hono\n readonly sqlite: SqliteClient\n readonly state: FullscriptState\n private readonly service: Service\n private readonly now: () => number\n private readonly prefix: string\n private readonly onEvent: ((event: EventRecord) => void) | undefined\n\n constructor(options: FullscriptAPIOptions = {}) {\n const sqlite = bootSqlite(options.sqlite)\n const namespace = options.namespace ?? FULLSCRIPT_NAMESPACE\n this.now = options.now ?? (() => Date.now())\n this.onEvent = options.onEvent\n this.prefix =\n options.publicNamespace && options.publicNamespace !== \"default\"\n ? `${options.adminPrefix ?? \"/__admin\"}/ns/${encodeURIComponent(options.publicNamespace)}`\n : \"\"\n this.state = new FullscriptState(sqlite, namespace, options.settings ?? {})\n const handlers = defineOperations<SupportedOperationId>({\n OAuthToken: (context) => this.token(context),\n OAuthRevoke: (context) => this.revoke(context),\n GetClinic: (context) => {\n const claims = this.claims(context)\n const clinic = this.state.clinics.get(claims.clinicId)\n if (!clinic) return apiErrors(404, \"not_found\", \"Clinic not found\")\n return jsonRes(200, { clinic })\n },\n CreateSessionGrant: (context) => {\n const claims = this.claims(context)\n const expires = this.now() + 5 * 60_000\n return jsonRes(201, {\n secret_token: `sg_${opaqueToken(`${claims.practitionerId}:${this.now()}`, 40)}`,\n expires_at: new Date(expires).toISOString(),\n })\n },\n ListLabOrders: (context) => {\n const claims = this.claims(context)\n const patient =\n typeof context.query.patient_id === \"string\" ? context.query.patient_id : undefined\n const rows = this.state.orders\n .list({\n order: \"oldest\",\n where: (o) => o.clinicId === claims.clinicId && (!patient || o.patientId === patient),\n })\n .map((r) => r.value)\n const p = page(context)\n return jsonRes(200, {\n orders: rows\n .slice((p.number - 1) * p.size, p.number * p.size)\n .map((o) => this.summary(o)),\n meta: meta(p.number, p.size, rows.length),\n })\n },\n GetLabOrder: (context) => {\n const claims = this.claims(context)\n const order = this.state.orders.get(context.params.orderId ?? \"\")\n if (!order || order.clinicId !== claims.clinicId)\n return apiErrors(404, \"not_found\", \"Lab order not found\")\n return annotateResponse(jsonRes(200, { order: this.detail(order, context) }), {\n ids: { orderId: order.id },\n })\n },\n ListLabOrderEvents: (context) => {\n const claims = this.claims(context)\n const ascending = context.query.order_by === \"ASC\"\n const rows = this.state.events\n .list({\n order: ascending ? \"oldest\" : \"newest\",\n where: (e) => e.clinic_id === claims.clinicId && e.type === \"lab_order.updated\",\n })\n .map((r) => r.value)\n const p = page(context)\n const drift = faultEffect(context.request, \"events_schema_drift\") !== undefined\n return jsonRes(200, {\n events: rows.slice((p.number - 1) * p.size, p.number * p.size).map((e) => ({\n id: e.id,\n type: drift ? \"lab_order.changed\" : e.type,\n clinic_id: e.clinic_id,\n created_at: e.created_at,\n })),\n meta: meta(p.number, p.size, rows.length),\n })\n },\n GetEvent: (context) => {\n const claims = this.claims(context)\n const event = this.state.events.get(context.params.eventId ?? \"\")\n if (!event || event.clinic_id !== claims.clinicId)\n return apiErrors(404, \"not_found\", \"Event not found\")\n return jsonRes(200, { event: this.publicEvent(event) })\n },\n Authorize: (context) => this.authorize(context),\n GetResultPdf: (context) => this.pdf(context),\n })\n this.service = createService({\n document,\n handlers,\n sqlite,\n namespace,\n now: this.now,\n notFound: () => apiErrors(404, \"not_found\", \"Not Found\"),\n onError: (error) => {\n if (error instanceof HttpError) return error.toResponse()\n throw error\n },\n before: (context) => {\n const id = context.operation.operationId\n if (\n id === \"OAuthToken\" ||\n id === \"OAuthRevoke\" ||\n id === \"Authorize\" ||\n id === \"GetResultPdf\"\n ) {\n return undefined\n }\n const token = bearerToken(context.request)\n if (!token)\n return apiErrors(401, \"unauthorized\", \"You need to sign in or authenticate first\")\n if (faultEffect(context.request, \"token_expired\") !== undefined) {\n return apiErrors(401, \"token_expired\", \"The access token expired\")\n }\n const claims = readAccessToken(token)\n if (!claims || this.state.revoked.has(token)) {\n return apiErrors(401, \"invalid_token\", \"The access token is invalid\")\n }\n if (this.now() / 1000 >= claims.issuedAt + this.state.current().accessTokenTtlSeconds) {\n return apiErrors(401, \"token_expired\", \"The access token expired\")\n }\n return undefined\n },\n })\n this.app = this.service.app\n this.sqlite = this.service.sqlite\n for (const seed of options.orders ?? []) this.seedOrder(seed)\n }\n\n fetch(request: Request): Promise<Response> {\n return this.service.fetch(request)\n }\n\n async reset(): Promise<void> {\n await this.service.reset()\n this.state.ensureSeeded()\n }\n\n private iso(): string {\n return new Date(this.now()).toISOString()\n }\n\n private claims(context: OperationContext): TokenClaims {\n return readAccessToken(bearerToken(context.request) ?? \"\") as TokenClaims\n }\n\n private clientOk(clientId: unknown, secret: unknown): boolean {\n const clients = this.state.current().clients\n if (typeof clientId !== \"string\" || typeof secret !== \"string\" || !clientId || !secret)\n return false\n return (\n clients.length === 0 ||\n clients.some((c) => c.clientId === clientId && c.clientSecret === secret)\n )\n }\n\n private body(context: OperationContext): Record<string, unknown> {\n const issues = bodyIssues(context)\n if (issues.length > 0) {\n throw new HttpError(400, {\n error: \"invalid_request\",\n error_description: `The request is missing a required parameter or is otherwise malformed: ${issues.map((i) => `${i.path || \"body\"} ${i.message}`).join(\"; \")}`,\n })\n }\n return context.body.kind === \"json\" ? (context.body.value as Record<string, unknown>) : {}\n }\n\n /** Mint an authorization code for a practitioner (what the consent page does). */\n issueCode(practitionerId: string, clientId: string, redirectUri: string | null): string {\n const code = `code_${opaqueToken(`${practitionerId}:${this.state.next(\"code\")}`, 32)}`\n this.state.codes.insert(code, {\n code,\n practitionerId,\n clientId,\n redirectUri,\n expiresAtMs: this.now() + this.state.current().codeTtlSeconds * 1000,\n used: false,\n })\n return code\n }\n\n private tokenPair(practitioner: Practitioner, clientId: string) {\n const refresh = `fsrt_${opaqueToken(`${practitioner.id}:${this.state.next(\"refresh\")}`, 40)}`\n this.state.refresh.insert(refresh, {\n token: refresh,\n practitionerId: practitioner.id,\n clientId,\n revoked: false,\n })\n const issuedAt = Math.floor(this.now() / 1000)\n return jsonRes(200, {\n oauth: {\n access_token: issueAccessToken(\n {\n clientId,\n practitionerId: practitioner.id,\n clinicId: practitioner.clinicId,\n type: practitioner.type,\n },\n issuedAt,\n ),\n token_type: \"Bearer\",\n expires_in: this.state.current().accessTokenTtlSeconds,\n refresh_token: refresh,\n scope: SCOPE,\n created_at: new Date(issuedAt * 1000).toISOString(),\n resource_owner: {\n id: practitioner.id,\n type: practitioner.type,\n clinic_id: practitioner.clinicId,\n },\n },\n })\n }\n\n private token(context: OperationContext): Response {\n const body = this.body(context)\n const clientId = String(body.client_id)\n if (!this.clientOk(body.client_id, body.client_secret))\n return oauthError(401, \"invalid_client\", INVALID_CLIENT)\n if (body.grant_type === \"authorization_code\") {\n if (typeof body.code !== \"string\" || !body.code) {\n return oauthError(400, \"invalid_request\", \"Missing required parameter: code.\")\n }\n const code = this.state.codes.get(body.code)\n if (\n !code ||\n code.used ||\n code.clientId !== clientId ||\n this.now() > code.expiresAtMs ||\n (code.redirectUri !== null && body.redirect_uri !== code.redirectUri)\n ) {\n return oauthError(400, \"invalid_grant\", INVALID_GRANT)\n }\n this.state.codes.update(code.code, { ...code, used: true })\n const practitioner = this.state.practitioners.get(code.practitionerId) ?? DEFAULT_PRACTITIONER\n return this.tokenPair(practitioner, clientId)\n }\n if (typeof body.refresh_token !== \"string\" || !body.refresh_token) {\n return oauthError(400, \"invalid_request\", \"Missing required parameter: refresh_token.\")\n }\n if (faultEffect(context.request, \"invalid_grant\") !== undefined) {\n return oauthError(400, \"invalid_grant\", INVALID_GRANT)\n }\n const refresh = this.state.refresh.get(body.refresh_token)\n if (!refresh || refresh.revoked || refresh.clientId !== clientId) {\n return oauthError(400, \"invalid_grant\", INVALID_GRANT)\n }\n // Refresh tokens rotate: the presented one is spent.\n this.state.refresh.update(refresh.token, { ...refresh, revoked: true })\n const practitioner =\n this.state.practitioners.get(refresh.practitionerId) ?? DEFAULT_PRACTITIONER\n return this.tokenPair(practitioner, clientId)\n }\n\n private revoke(context: OperationContext): Response {\n const body = this.body(context)\n if (!this.clientOk(body.client_id, body.client_secret))\n return oauthError(401, \"invalid_client\", INVALID_CLIENT)\n const token = String(body.token)\n const refresh = this.state.refresh.get(token)\n if (refresh) this.state.refresh.update(token, { ...refresh, revoked: true })\n else if (readAccessToken(token)) this.state.revoked.insert(token, { token })\n return jsonRes(200, {})\n }\n\n private authorize(context: OperationContext): Response {\n const url = context.url\n const redirect = url.searchParams.get(\"redirect_uri\")\n const clientId = url.searchParams.get(\"client_id\")\n if (!redirect || !clientId || url.searchParams.get(\"response_type\") !== \"code\") {\n return oauthError(\n 400,\n \"invalid_request\",\n \"client_id, redirect_uri and response_type=code are required.\",\n )\n }\n const practitionerId = url.searchParams.get(\"practitioner_id\") ?? DEFAULT_PRACTITIONER.id\n if (!this.state.practitioners.get(practitionerId)) {\n return oauthError(400, \"invalid_request\", `Unknown practitioner ${practitionerId}.`)\n }\n const code = this.issueCode(practitionerId, clientId, redirect)\n const location = new URL(redirect)\n location.searchParams.set(\"code\", code)\n const state = url.searchParams.get(\"state\")\n if (state !== null) location.searchParams.set(\"state\", state)\n return new Response(null, { status: 302, headers: { location: location.toString() } })\n }\n\n private summary(order: LabOrderRecord) {\n return {\n id: order.id,\n state: order.state,\n treatment_plan_id: order.treatmentPlanId,\n patient_id: order.patientId,\n name: order.name,\n created_at: order.created_at,\n updated_at: order.updated_at,\n }\n }\n\n /** A signed, expiring URL for a result artifact, on the mock itself (or `resultsBaseUrl`). */\n private pdfUrl(artifactId: string, context: OperationContext): string {\n const base = this.state.current().resultsBaseUrl ?? `${context.url.origin}${this.prefix}`\n const expires = this.now() + this.state.current().pdfUrlTtlSeconds * 1000\n return `${base.replace(/\\/$/, \"\")}/results/${artifactId}?expires=${expires}&signature=${opaqueToken(`${artifactId}:${expires}`, 24)}`\n }\n\n private detail(order: LabOrderRecord, context: OperationContext) {\n return {\n ...this.summary(order),\n collection_method: order.collectionMethod,\n tests: order.tests,\n results: order.results.map((r) => ({\n id: r.id,\n name: r.name,\n state: r.state,\n pdf_url: this.pdfUrl(r.artifactId, context),\n })),\n latest_aggregated_result: order.aggregated\n ? {\n id: order.aggregated.id,\n artifact_id: order.aggregated.artifactId,\n pdf_url: this.pdfUrl(order.aggregated.artifactId, context),\n status: order.aggregated.status,\n }\n : null,\n }\n }\n\n private pdf(context: OperationContext): Response {\n const artifactId = context.params.artifactId ?? \"\"\n const expires = Number(context.url.searchParams.get(\"expires\"))\n const signature = context.url.searchParams.get(\"signature\")\n if (signature !== opaqueToken(`${artifactId}:${expires}`, 24)) {\n return new Response(\"Forbidden\", { status: 403, headers: { \"content-type\": \"text/plain\" } })\n }\n if (this.now() > expires)\n return new Response(\"Expired\", { status: 403, headers: { \"content-type\": \"text/plain\" } })\n const known = this.state.orders\n .list()\n .some(\n ({ value: o }) =>\n o.aggregated?.artifactId === artifactId ||\n o.results.some((r) => r.artifactId === artifactId),\n )\n if (!known) return new Response(null, { status: 404 })\n return new Response(new Blob([RESULT_PDF as BlobPart]), {\n status: 200,\n headers: {\n \"content-type\": \"application/pdf\",\n \"content-length\": String(RESULT_PDF.byteLength),\n },\n })\n }\n\n private publicEvent(event: EventRecord) {\n return {\n id: event.id,\n type: event.type,\n clinic_id: event.clinic_id,\n created_at: event.created_at,\n data: event.data,\n }\n }\n\n private emit(\n type: EventRecord[\"type\"],\n order: LabOrderRecord,\n data: Record<string, unknown>,\n ): EventRecord {\n const seq = this.state.next(\"event\")\n const event: EventRecord = {\n id: `evt_${seq}`,\n type,\n clinic_id: order.clinicId,\n created_at: this.iso(),\n data,\n seq,\n }\n this.state.events.insert(event.id, event)\n this.onEvent?.(event)\n return event\n }\n\n /** Create a lab order in `not_purchased` (a practitioner recommended labs in a treatment plan). */\n createOrder(input: Omit<SeedOrder, \"state\" | \"id\"> & { id?: string }): LabOrderRecord {\n const id = input.id ?? `lo_${this.state.next(\"order\")}`\n const now = this.iso()\n const order: LabOrderRecord = {\n id,\n clinicId: input.clinicId ?? DEFAULT_PRACTITIONER.clinicId,\n patientId: input.patientId,\n treatmentPlanId: input.treatmentPlanId === undefined ? `tp_${id}` : input.treatmentPlanId,\n name: input.name ?? \"Comprehensive Wellness Panel\",\n collectionMethod: input.collectionMethod ?? \"at_home_phlebotomy\",\n state: \"not_purchased\",\n tests: (input.tests ?? [\"Lipid Panel\", \"Comprehensive Metabolic Panel\"]).map((name, i) => ({\n id: `lt_${id}_${i + 1}`,\n name,\n lab_type: \"labs\",\n })),\n results: [],\n aggregated: null,\n created_at: now,\n updated_at: now,\n }\n this.state.orders.insert(id, order)\n return order\n }\n\n /**\n * Move an order forward (never back) and emit its events: `order.placed` on purchase and\n * `lab_order.updated` for every move. Results-bearing states attach result artifacts.\n */\n transition(orderId: string, to: LabOrderState): LabOrderRecord {\n const order = this.state.orders.get(orderId)\n if (!order)\n throw new HttpError(404, {\n error: { type: \"mockingbird_admin\", message: `no lab order ${orderId}` },\n })\n if (stateRank(to) <= stateRank(order.state)) {\n throw new HttpError(409, {\n error: {\n type: \"mockingbird_admin\",\n message: `lab orders only move forward: ${order.state} \u2192 ${to} is not allowed`,\n },\n })\n }\n const artifact = () => `art_${opaqueToken(`${order.id}:${this.state.next(\"artifact\")}`, 16)}`\n const next: LabOrderRecord = { ...order, state: to, updated_at: this.iso() }\n const rank = stateRank(to)\n if (rank >= stateRank(\"partial_results\")) {\n const wanted = rank >= stateRank(\"results_ready\") ? next.tests.length : 1\n const results = [...next.results]\n for (const test of next.tests.slice(results.length, wanted)) {\n results.push({\n id: `res_${test.id}`,\n name: test.name,\n state: \"final\",\n artifactId: artifact(),\n })\n }\n next.results = results\n }\n if (rank >= stateRank(\"results_ready\") && (!next.aggregated || to === \"results_amended\")) {\n next.aggregated = {\n id: `agg_${order.id}${to === \"results_amended\" ? \"_amended\" : \"\"}`,\n artifactId: artifact(),\n status: to === \"results_amended\" ? \"amended\" : \"final\",\n }\n }\n this.state.orders.update(order.id, next)\n if (to === \"purchased\" || (order.state === \"not_purchased\" && rank > stateRank(\"purchased\"))) {\n this.emit(\"order.placed\", next, {\n id: next.id,\n treatment_plan_ids: next.treatmentPlanId ? [next.treatmentPlanId] : [],\n patient_id: next.patientId,\n line_items: [{ type: \"labs\", lab_type: \"labs\", name: next.name }],\n })\n }\n this.emit(\"lab_order.updated\", next, {\n lab_order: {\n id: next.id,\n state: next.state,\n treatment_plan_id: next.treatmentPlanId,\n patient_id: next.patientId,\n },\n })\n return next\n }\n\n seedOrder(seed: SeedOrder): LabOrderRecord {\n const order = this.state.orders.get(seed.id) ?? this.createOrder(seed)\n return seed.state === order.state ? order : this.transition(order.id, seed.state)\n }\n\n labOrders(): LabOrderRecord[] {\n return this.state.orders.list({ order: \"oldest\" }).map((r) => r.value)\n }\n\n eventsList(): EventRecord[] {\n return this.state.events.list({ order: \"oldest\" }).map((r) => r.value)\n }\n}\n\nexport type { FullscriptRuntime, FullscriptRuntimeOptions } from \"./runtime.js\"\nexport { createRuntime, FULLSCRIPT_PRESETS, SIGNATURE_HEADER } from \"./runtime.js\"\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { FetchAPI, FetchHandler } from \"./index.js\"\n\nconst prefixes = new WeakMap<Request, string>()\n\n/** Trusted mount metadata stays on the Request, never in a spoofable HTTP header. */\nexport const requestBaseUrl = (request: Request): string =>\n new URL(request.url).origin + (prefixes.get(request) ?? \"\")\n\nexport const forwardMountContext = (source: Request, target: Request): Request => {\n const prefix = prefixes.get(source)\n if (prefix !== undefined) prefixes.set(target, prefix)\n return target\n}\n\nexport type MountedAPI = FetchAPI & {\n readonly prefix: string\n GET: FetchHandler\n POST: FetchHandler\n PUT: FetchHandler\n PATCH: FetchHandler\n DELETE: FetchHandler\n HEAD: FetchHandler\n OPTIONS: FetchHandler\n}\n\n/** Embed a native API under an application's origin without owning another listener or state. */\nexport function mount(\n api: FetchAPI,\n path: string,\n relativePath?: (request: Request) => string,\n): MountedAPI {\n const prefix = path.replace(/\\/+$/, \"\")\n if (!/^\\/(?:[A-Za-z0-9_-]+\\/)*[A-Za-z0-9_-]+$/.test(prefix))\n throw new Error(\"mount prefix must be an absolute path of plain segments\")\n const fetch: FetchHandler = async (incoming) => {\n const url = new URL(incoming.url)\n if (url.pathname !== prefix && !url.pathname.startsWith(`${prefix}/`))\n return Response.json({ error: \"not_found\" }, { status: 404 })\n url.pathname = url.pathname.slice(prefix.length) || \"/\"\n const request = new Request(url, incoming)\n const publicPrefix = (prefixes.get(incoming) ?? \"\") + prefix\n prefixes.set(request, publicPrefix)\n const suffix = relativePath?.(request) ?? \"\"\n const response = await api.fetch(request)\n const local = (value: string) =>\n value.startsWith(\"/\") &&\n !value.startsWith(\"//\") &&\n value !== publicPrefix &&\n !value.startsWith(`${publicPrefix}/`)\n ? `${publicPrefix}${suffix && value !== suffix && !value.startsWith(`${suffix}/`) ? suffix : \"\"}${value}`\n : value\n const headers = new Headers(response.headers)\n const location = headers.get(\"location\")\n if (location) headers.set(\"location\", local(location))\n const links = headers.get(\"link\")\n if (links)\n headers.set(\n \"link\",\n links.replace(/<([^>]+)>/g, (_, value: string) => {\n const target = new URL(value, url)\n if (target.origin === url.origin) target.pathname = local(target.pathname)\n return `<${target.href}>`\n }),\n )\n const cookies = headers.getSetCookie()\n if (cookies.length) {\n headers.delete(\"set-cookie\")\n for (const cookie of cookies)\n headers.append(\n \"set-cookie\",\n cookie.replace(\n /(;\\s*Path=)(\\/[^;]*)/gi,\n (_, lead: string, value: string) => lead + local(value),\n ),\n )\n }\n if (\n incoming.method !== \"HEAD\" &&\n response.body &&\n // Media types are case-insensitive (RFC 9110 \u00A78.3.1), and whitespace may precede \";\".\n headers.get(\"content-type\")?.split(\";\")[0]?.trim().toLowerCase() === \"text/html\"\n ) {\n const html = rewriteHtml(await response.text(), local)\n headers.delete(\"content-length\")\n headers.delete(\"content-encoding\")\n headers.delete(\"etag\")\n return new Response(html, {\n status: response.status,\n statusText: response.statusText,\n headers,\n })\n }\n return new Response(incoming.method === \"HEAD\" ? null : response.body, {\n status: response.status,\n statusText: response.statusText,\n headers,\n })\n }\n return {\n prefix,\n fetch,\n GET: fetch,\n POST: fetch,\n PUT: fetch,\n PATCH: fetch,\n DELETE: fetch,\n HEAD: fetch,\n OPTIONS: fetch,\n }\n}\n\n/** Rewrite root-relative URLs in the markup a mounted API serves so they stay under the mount. */\nconst rewriteHtml = (html: string, local: (value: string) => string): string =>\n html\n .replace(\n /(\\b(?:href|action|formaction|src)\\s*=\\s*[\"'])(\\/[^\"']*)([\"'])/gi,\n (_, lead: string, value: string, quote: string) => lead + local(value) + quote,\n )\n // srcset is a comma-separated list of \"url [descriptor]\" candidates.\n .replace(\n /(\\bsrcset\\s*=\\s*)([\"'])([^\"']*)\\2/gi,\n (_, lead: string, quote: string, list: string) =>\n lead +\n quote +\n list.replace(\n /(^|,)(\\s*)(\\/[^\\s,]*)/g,\n (_, comma: string, space: string, value: string) => comma + space + local(value),\n ) +\n quote,\n )\n // <meta http-equiv=\"refresh\" content=\"5; url=/path\"> navigates like a link.\n .replace(/<meta\\b[^>]*>/gi, (tag) =>\n /\\bhttp-equiv\\s*=\\s*[\"']?refresh\\b/i.test(tag)\n ? tag.replace(\n /(\\bcontent\\s*=\\s*)([\"'])(.*?)\\2/i,\n (_, lead: string, quote: string, content: string) =>\n lead +\n quote +\n content.replace(\n /^(\\s*\\d*(?:\\.\\d*)?\\s*[;,]\\s*(?:url\\s*=\\s*)?[\"']?)(\\/[^\"'\\s]*)/i,\n (_, start: string, value: string) => start + local(value),\n ) +\n quote,\n )\n : tag,\n )\n .replace(\n /(url\\(\\s*[\"']?)(\\/[^\\s)'\";]*)([\"']?\\s*\\))/gi,\n (_, lead: string, value: string, end: string) => lead + local(value) + end,\n )\n", "/** A stable identifier for a point in a {@link Timeline}. */\nexport type CheckpointId = string\n\n/** An immutable node in a timeline's checkpoint DAG. */\nexport type Checkpoint<T> = Readonly<{\n id: CheckpointId\n branch: string\n parent: CheckpointId | null\n /** Logical time supplied by the timeline's injected clock. */\n at: number\n value: T\n}>\n\nexport type TimelineOptions = {\n /** Logical clock used to stamp checkpoints. Defaults to a deterministic counter. */\n now?: () => number\n /** Maximum retained checkpoints. Branch heads are never collected. Default 1,000. */\n maxCheckpoints?: number\n /** Customize deterministic checkpoint IDs. */\n id?: (sequence: number) => CheckpointId\n}\n\nexport type CommitOptions = {\n branch?: string\n /** Parent checkpoint. Defaults to the selected branch's current head. */\n parent?: CheckpointId | null\n}\n\nexport type ForkOptions = {\n /** Checkpoint to fork from. Defaults to the main branch's head. */\n from?: CheckpointId\n}\n\nconst BRANCH_PATTERN = /^[A-Za-z0-9_.-]{1,64}$/\n\n/**\n * Small, storage-agnostic checkpoint DAG shared by service runtimes. Its values may be immutable\n * records, namespace images, or copy-on-write SQL engine snapshots.\n *\n * Values are retained by reference. Engines can therefore use persistent/COW snapshots while\n * simpler services can use immutable values. IDs and GC order are deterministic, and all IO\n * (the logical clock) is injected.\n */\nexport class Timeline<T> {\n readonly maxCheckpoints: number\n private readonly now: () => number\n private readonly makeId: (sequence: number) => CheckpointId\n private readonly nodes = new Map<CheckpointId, Checkpoint<T>>()\n private readonly heads = new Map<string, CheckpointId>()\n /** Unreferenced nodes in the exact order they became collectible. */\n private readonly evictable = new Set<CheckpointId>()\n /** Branch heads plus explicit retainers. Absent means zero. */\n private readonly references = new Map<CheckpointId, number>()\n private readonly explicitPins = new Map<CheckpointId, number>()\n private sequence = 0\n\n constructor(options: TimelineOptions = {}) {\n const max = options.maxCheckpoints ?? 1_000\n if (!Number.isSafeInteger(max) || max < 1)\n throw new RangeError(\"maxCheckpoints must be a positive integer\")\n this.maxCheckpoints = max\n this.now = options.now ?? (() => this.sequence)\n this.makeId = options.id ?? ((sequence) => `cp_${sequence.toString(36).padStart(8, \"0\")}`)\n }\n\n /** Capture a new immutable value and move `branch` to it. */\n commit(value: T, options: CommitOptions = {}): Checkpoint<T> {\n const branch = options.branch ?? \"main\"\n this.assertBranch(branch)\n const parent = options.parent === undefined ? (this.heads.get(branch) ?? null) : options.parent\n if (parent !== null && !this.nodes.has(parent)) throw new RangeError(`no checkpoint ${parent}`)\n const id = this.makeId(++this.sequence)\n if (this.nodes.has(id)) throw new RangeError(`duplicate checkpoint id ${id}`)\n const checkpoint = Object.freeze({ id, branch, parent, at: this.now(), value })\n this.nodes.set(id, checkpoint)\n this.moveHead(branch, id)\n this.collect(this.maxCheckpoints)\n return checkpoint\n }\n\n /** Create a branch pointer without copying its checkpoint value. */\n fork(branch: string, options: ForkOptions = {}): Checkpoint<T> | undefined {\n this.assertBranch(branch)\n if (this.heads.has(branch)) throw new RangeError(`branch already exists: ${branch}`)\n const from = options.from ?? this.heads.get(\"main\")\n if (from === undefined) return undefined\n const checkpoint = this.get(from)\n this.moveHead(branch, checkpoint.id)\n return checkpoint\n }\n\n /** Move a branch pointer to an existing checkpoint. */\n checkout(branch: string, id: CheckpointId): Checkpoint<T> {\n this.assertBranch(branch)\n const checkpoint = this.get(id)\n this.moveHead(branch, checkpoint.id)\n return checkpoint\n }\n\n get(id: CheckpointId): Checkpoint<T> {\n const checkpoint = this.nodes.get(id)\n if (!checkpoint) throw new RangeError(`no checkpoint ${id}`)\n return checkpoint\n }\n\n head(branch = \"main\"): Checkpoint<T> | undefined {\n const id = this.heads.get(branch)\n return id === undefined ? undefined : this.get(id)\n }\n\n hasBranch(branch: string): boolean {\n return this.heads.has(branch)\n }\n\n branches(): Readonly<Record<string, CheckpointId>> {\n return Object.freeze(\n Object.fromEntries([...this.heads].sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))),\n )\n }\n\n checkpoints(): readonly Checkpoint<T>[] {\n return [...this.nodes.values()]\n }\n\n /** Number of retained checkpoints without allocating an array. */\n get size(): number {\n return this.nodes.size\n }\n\n /** Pin a checkpoint independently of branch heads (used by compatibility snapshot handles). */\n retain(id: CheckpointId): Checkpoint<T> {\n const checkpoint = this.get(id)\n this.explicitPins.set(id, (this.explicitPins.get(id) ?? 0) + 1)\n this.addReference(id)\n return checkpoint\n }\n\n /** Release one explicit pin. Branch heads remain pinned until moved or deleted. */\n release(id: CheckpointId): boolean {\n if (!this.nodes.has(id)) return false\n const pins = this.explicitPins.get(id) ?? 0\n if (pins === 0) return false\n if (pins === 1) this.explicitPins.delete(id)\n else this.explicitPins.set(id, pins - 1)\n this.removeReference(id)\n this.collect(this.maxCheckpoints)\n return true\n }\n\n deleteBranch(branch: string): boolean {\n if (branch === \"main\") throw new RangeError(\"cannot delete main branch\")\n const previous = this.heads.get(branch)\n const deleted = this.heads.delete(branch)\n if (previous !== undefined) this.removeReference(previous)\n this.collect(this.maxCheckpoints)\n return deleted\n }\n\n /**\n * Deterministically discard oldest unpinned checkpoints. Collection is O(number removed):\n * commits never scan pinned nodes or the retained history. Parents are metadata rather than a\n * storage dependency, so a retained node remains usable after pruning.\n */\n gc(max = this.maxCheckpoints): CheckpointId[] {\n if (!Number.isSafeInteger(max) || max < 1)\n throw new RangeError(\"max must be a positive integer\")\n const removed: CheckpointId[] = []\n this.collect(max, removed)\n return removed\n }\n\n private collect(max: number, removed?: CheckpointId[]): void {\n while (this.nodes.size > max && this.evictable.size > 0) {\n const id = this.evictable.values().next().value as CheckpointId\n this.evictable.delete(id)\n this.nodes.delete(id)\n removed?.push(id)\n }\n }\n\n private moveHead(branch: string, id: CheckpointId): void {\n const previous = this.heads.get(branch)\n if (previous === id) return\n if (previous !== undefined) this.removeReference(previous)\n this.heads.set(branch, id)\n this.addReference(id)\n }\n\n private addReference(id: CheckpointId): void {\n this.references.set(id, (this.references.get(id) ?? 0) + 1)\n this.evictable.delete(id)\n }\n\n private removeReference(id: CheckpointId): void {\n const next = (this.references.get(id) ?? 0) - 1\n if (next > 0) this.references.set(id, next)\n else {\n this.references.delete(id)\n if (this.nodes.has(id)) this.evictable.add(id)\n }\n }\n\n private assertBranch(branch: string): void {\n if (!BRANCH_PATTERN.test(branch)) throw new RangeError(`branch must match ${BRANCH_PATTERN}`)\n }\n}\n", "import { Database } from \"@crvouga/mockingbird-service-sqlite\"\nimport type { SqliteClient } from \"./client.js\"\n\n/** Construct the default in-memory SQLite client (`@crvouga/mockingbird-service-sqlite`). */\nexport const createDefaultSqlite = (): SqliteClient => new Database()\n\n/** Use the injected client, or fall back to {@link createDefaultSqlite}. */\nexport const resolveSqlite = (sqlite?: SqliteClient): SqliteClient =>\n sqlite ?? createDefaultSqlite()\n", "import type { SqliteClient } from \"./client.js\"\n\n/** One named, ordered schema change applied exactly once per client. */\nexport type Migration = {\n /** Stable id stored in `schema_migrations`. Must be unique across the list. */\n id: string\n sql: string\n}\n\nconst ensureMigrationsTable = (sqlite: SqliteClient) => {\n sqlite.exec(`\n CREATE TABLE IF NOT EXISTS schema_migrations (\n id TEXT PRIMARY KEY NOT NULL,\n applied_at INTEGER NOT NULL\n )\n `)\n}\n\nconst assertUniqueIds = (migrations: readonly Migration[]) => {\n const seen = new Set<string>()\n for (const { id } of migrations) {\n if (seen.has(id)) throw new Error(`migrate: duplicate migration id \"${id}\"; ids must be unique`)\n seen.add(id)\n }\n}\n\n/**\n * Apply pending migrations in order inside a single transaction.\n *\n * Idempotent: already-applied ids are skipped. Re-running with the same list\n * is a no-op after the first successful boot.\n *\n * @throws {Error} If two migrations in the list share an id; nothing is applied.\n */\nexport const migrate = (sqlite: SqliteClient, migrations: readonly Migration[]): void => {\n assertUniqueIds(migrations)\n ensureMigrationsTable(sqlite)\n const applied = new Set(\n sqlite\n .prepare(\"SELECT id FROM schema_migrations\")\n .all<{ id: string }>()\n .map((row) => row.id),\n )\n const pending = migrations.filter((migration) => !applied.has(migration.id))\n if (pending.length === 0) return\n\n const insert = sqlite.prepare(\"INSERT INTO schema_migrations (id, applied_at) VALUES (?, ?)\")\n const now = Math.floor(Date.now() / 1000)\n sqlite.transaction(() => {\n for (const migration of pending) {\n sqlite.exec(migration.sql)\n insert.run(migration.id, now)\n }\n })\n}\n\n/**\n * Applied migration ids in application order: by `applied_at`, then `rowid`.\n * `schema_migrations` is a rowid table, so `rowid` follows insertion order and\n * breaks same-second ties in the order the migrations ran.\n */\nexport const listAppliedMigrations = (sqlite: SqliteClient): string[] => {\n ensureMigrationsTable(sqlite)\n return sqlite\n .prepare(\"SELECT id FROM schema_migrations ORDER BY applied_at ASC, rowid ASC\")\n .all<{ id: string }>()\n .map((row) => row.id)\n}\n", "import type { SqliteClient } from \"./client.js\"\nimport { type Migration, migrate } from \"./migrate.js\"\n\n/**\n * Core Mockingbird service schema: namespaced JSON records and counters.\n *\n * Applied on every service boot via {@link migrateCore}.\n */\nexport const CORE_MIGRATIONS: readonly Migration[] = [\n {\n id: \"20260322_core_records_sequences\",\n sql: `\n CREATE TABLE IF NOT EXISTS mockingbird_records (\n namespace TEXT NOT NULL,\n collection TEXT NOT NULL,\n id TEXT NOT NULL,\n seq INTEGER NOT NULL,\n value TEXT NOT NULL,\n PRIMARY KEY (namespace, collection, id)\n );\n CREATE INDEX IF NOT EXISTS mockingbird_records_seq\n ON mockingbird_records (namespace, collection, seq);\n CREATE TABLE IF NOT EXISTS mockingbird_sequences (\n namespace TEXT NOT NULL,\n name TEXT NOT NULL,\n kind TEXT NOT NULL,\n value INTEGER NOT NULL,\n PRIMARY KEY (namespace, name, kind)\n );\n `,\n },\n]\n\n/**\n * Table and index names from the unfinished product rename.\n * Renamed in place so a database created under those names keeps its rows.\n */\nconst LEGACY_TABLES = [\n [\"emulates_records\", \"mockingbird_records\"],\n [\"emulators_records\", \"mockingbird_records\"],\n [\"emulates_sequences\", \"mockingbird_sequences\"],\n [\"emulators_sequences\", \"mockingbird_sequences\"],\n] as const\nconst LEGACY_INDEXES = [\n [\"emulates_records_seq\", \"mockingbird_records_seq\"],\n [\"emulators_records_seq\", \"mockingbird_records_seq\"],\n] as const\n\nconst namesOf = (sqlite: SqliteClient, type: \"table\" | \"index\"): Set<string> =>\n new Set(\n sqlite\n .prepare(\"SELECT name FROM sqlite_master WHERE type = ?\")\n .all<{ name: string }>(type)\n .map((row) => row.name),\n )\n\n/** Apply {@link CORE_MIGRATIONS}, then rename a database that still uses the former table names. */\nexport const migrateCore = (sqlite: SqliteClient): void => {\n migrate(sqlite, CORE_MIGRATIONS)\n const tables = namesOf(sqlite, \"table\")\n const indexes = namesOf(sqlite, \"index\")\n sqlite.transaction(() => {\n for (const [from, to] of LEGACY_TABLES) {\n if (!tables.has(from) || tables.has(to)) continue\n sqlite.exec(`ALTER TABLE ${from} RENAME TO ${to}`)\n tables.delete(from)\n tables.add(to)\n }\n for (const [from, to] of LEGACY_INDEXES) {\n if (!indexes.has(from) || indexes.has(to)) continue\n // The sqlite port accepts ALTER TABLE, not ALTER INDEX.\n sqlite.exec(`DROP INDEX ${from}`)\n sqlite.exec(`CREATE INDEX ${to} ON mockingbird_records (namespace, collection, seq)`)\n indexes.delete(from)\n indexes.add(to)\n }\n })\n}\n\n/** Delete every record and sequence belonging to `namespace`. */\nexport const clearNamespace = (sqlite: SqliteClient, namespace: string): void => {\n sqlite.transaction(() => {\n sqlite.prepare(\"DELETE FROM mockingbird_records WHERE namespace = ?\").run(namespace)\n sqlite.prepare(\"DELETE FROM mockingbird_sequences WHERE namespace = ?\").run(namespace)\n })\n}\n", "import type { SqliteClient, SqliteStatement } from \"@crvouga/mockingbird-sqlite\"\n\n/** Every stored record carries a monotonically increasing sequence for stable ordering. */\nexport type Stored<T> = { seq: number; value: T }\n\nexport type ListRecordsOptions<T> = {\n /** Keep only records passing the predicate. */\n where?: (value: T, seq: number) => boolean\n /** Sort order; default newest first. */\n order?: \"newest\" | \"oldest\"\n}\n\ntype RecordRow = { id: string; seq: number; value: string }\n\n/**\n * A SQLite-backed table of JSON records addressed by id. Ordering is by insertion\n * sequence, never by id lexicographic order, so list semantics stay stable.\n */\nexport class Collection<T> {\n private readonly statements = new Map<string, SqliteStatement>()\n\n private prepare(sql: string): SqliteStatement {\n let statement = this.statements.get(sql)\n if (!statement) {\n statement = this.sqlite.prepare(sql)\n this.statements.set(sql, statement)\n }\n return statement\n }\n\n constructor(\n private readonly sqlite: SqliteClient,\n /** Storage namespace. Admin introspection uses this to ignore another namespace's tables. */\n readonly namespace: string,\n /** Table name inside the namespace. Stable across resets of the rows themselves. */\n readonly collectionName: string,\n ) {}\n\n private bumpCollectionSeq(): number {\n const row = this.prepare(\n \"SELECT value FROM mockingbird_sequences WHERE namespace = ? AND name = ? AND kind = 'collection'\",\n ).get<{ value: number }>(this.namespace, this.collectionName)\n const next = (row?.value ?? 0) + 1\n this.prepare(\n `INSERT INTO mockingbird_sequences (namespace, name, kind, value) VALUES (?, ?, 'collection', ?)\n ON CONFLICT(namespace, name, kind) DO UPDATE SET value = excluded.value`,\n ).run(this.namespace, this.collectionName, next)\n return next\n }\n\n nextSequence(): number {\n return this.sqlite.transaction(() => this.bumpCollectionSeq())\n }\n\n get(id: string): T | undefined {\n const row = this.prepare(\n \"SELECT value FROM mockingbird_records WHERE namespace = ? AND collection = ? AND id = ?\",\n ).get<{ value: string }>(this.namespace, this.collectionName, id)\n if (!row) return undefined\n return (JSON.parse(row.value) as Stored<T>).value\n }\n\n has(id: string): boolean {\n const row = this.prepare(\n \"SELECT 1 AS ok FROM mockingbird_records WHERE namespace = ? AND collection = ? AND id = ?\",\n ).get<{ ok: number }>(this.namespace, this.collectionName, id)\n return row !== undefined\n }\n\n /** Insert a new record, assigning it the next sequence number. */\n insert(id: string, value: T): Stored<T> {\n return this.sqlite.transaction(() => {\n const seq = this.bumpCollectionSeq()\n const stored = { seq, value }\n this.prepare(\n `INSERT INTO mockingbird_records (namespace, collection, id, seq, value)\n VALUES (?, ?, ?, ?, ?)\n ON CONFLICT(namespace, collection, id) DO UPDATE SET seq = excluded.seq, value = excluded.value`,\n ).run(this.namespace, this.collectionName, id, seq, JSON.stringify(stored))\n return stored\n })\n }\n\n /** Replace an existing record's value, keeping its position. */\n update(id: string, value: T): Stored<T> | undefined {\n return this.sqlite.transaction(() => {\n const row = this.prepare(\n \"SELECT seq, value FROM mockingbird_records WHERE namespace = ? AND collection = ? AND id = ?\",\n ).get<{ seq: number; value: string }>(this.namespace, this.collectionName, id)\n if (!row) return undefined\n const stored = { seq: row.seq, value }\n this.prepare(\n \"UPDATE mockingbird_records SET value = ? WHERE namespace = ? AND collection = ? AND id = ?\",\n ).run(JSON.stringify(stored), this.namespace, this.collectionName, id)\n return stored\n })\n }\n\n delete(id: string): boolean {\n const result = this.prepare(\n \"DELETE FROM mockingbird_records WHERE namespace = ? AND collection = ? AND id = ?\",\n ).run(this.namespace, this.collectionName, id)\n return result.changes > 0\n }\n\n /** How many records the collection holds, without reading them. */\n count(): number {\n const row = this.prepare(\n \"SELECT COUNT(*) AS n FROM mockingbird_records WHERE namespace = ? AND collection = ?\",\n ).get<{ n: number }>(this.namespace, this.collectionName)\n return Number(row?.n ?? 0)\n }\n\n list(options: ListRecordsOptions<T> = {}): Array<Stored<T> & { id: string }> {\n const rows = this.prepare(\n \"SELECT id, seq, value FROM mockingbird_records WHERE namespace = ? AND collection = ?\",\n ).all<RecordRow>(this.namespace, this.collectionName)\n const out: Array<Stored<T> & { id: string }> = []\n for (const row of rows) {\n const stored = JSON.parse(row.value) as Stored<T>\n if (options.where && !options.where(stored.value, stored.seq)) continue\n out.push({ id: row.id, seq: stored.seq, value: stored.value })\n }\n out.sort((a, b) => (options.order === \"oldest\" ? a.seq - b.seq : b.seq - a.seq))\n return out\n }\n}\n", "import type { SqliteClient } from \"@crvouga/mockingbird-sqlite\"\n\nconst ALPHABET = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\"\n\n/** FNV-1a over a string, mixed once more so consecutive counters look unrelated. */\nconst mix = (input: string): number => {\n let hash = 0x811c9dc5\n for (let i = 0; i < input.length; i++) {\n hash ^= input.charCodeAt(i)\n hash = Math.imul(hash, 0x01000193) >>> 0\n }\n hash ^= hash >>> 16\n hash = Math.imul(hash, 0x85ebca6b) >>> 0\n hash ^= hash >>> 13\n return hash >>> 0\n}\n\n/** Deterministic, opaque-looking alphanumeric token of `length` characters derived from `input`. */\nexport const opaqueToken = (input: string, length: number): string => {\n let out = \"\"\n let round = 0\n while (out.length < length) {\n let hash = mix(`${input}:${round++}`)\n for (let i = 0; i < 5 && out.length < length; i++) {\n out += ALPHABET.charAt(hash % ALPHABET.length)\n hash = Math.floor(hash / ALPHABET.length)\n }\n }\n return out\n}\n\n/**\n * What names an id base: a non-negative safe integer (or its decimal string) or `\"boot\"`,\n * which derives the base from the wall clock when the runtime is created.\n */\nexport type IdBase = number | string\n\nconst ID_BASES = new WeakMap<SqliteClient, number>()\n\n/**\n * Resolve an id base. `\"boot\"` is the wall clock in epoch milliseconds, so every boot gets\n * a different base. Anything else must be a non-negative safe integer or a string of digits.\n */\nexport const normalizeIdBase = (\n value: unknown,\n label = \"idBase\",\n wallNow: () => number = Date.now,\n): number => {\n if (value === \"boot\") return wallNow()\n const base =\n typeof value === \"string\" && /^\\d+$/.test(value.trim())\n ? Number(value.trim())\n : typeof value === \"number\"\n ? value\n : Number.NaN\n if (!Number.isSafeInteger(base) || base < 0)\n throw new RangeError(\n `${label} must be a non-negative integer or \"boot\" (got ${JSON.stringify(value)})`,\n )\n return base\n}\n\n/**\n * Give every {@link IdSequence} over `sqlite` this base. `0` is the default and changes\n * nothing; any other base yields a different, unrelated run of ids from the same counters.\n */\nexport const setIdBase = (sqlite: SqliteClient, base: number): void => {\n if (base === 0) ID_BASES.delete(sqlite)\n else ID_BASES.set(sqlite, base)\n}\n\n/** The id base in force over `sqlite` (`0` unless one was set). */\nexport const idBaseOf = (sqlite: SqliteClient): number => ID_BASES.get(sqlite) ?? 0\n\n/**\n * Sequential id source persisted in SQLite. Ids are deterministic for a given\n * sequence history (`cus_` + 14 opaque chars), so reproductions stay stable.\n * A runtime's `idBase` is mixed in, so a different base reissues none of another's ids.\n */\nexport class IdSequence {\n constructor(\n private readonly sqlite: SqliteClient,\n private readonly namespace: string,\n private readonly salt = \"mockingbird\",\n ) {}\n\n next(prefix: string, length = 14): string {\n return this.sqlite.transaction(() => {\n const row = this.sqlite\n .prepare(\n \"SELECT value FROM mockingbird_sequences WHERE namespace = ? AND name = ? AND kind = 'id'\",\n )\n .get<{ value: number }>(this.namespace, prefix)\n const value = (row?.value ?? 0) + 1\n this.sqlite\n .prepare(\n `INSERT INTO mockingbird_sequences (namespace, name, kind, value) VALUES (?, ?, 'id', ?)\n ON CONFLICT(namespace, name, kind) DO UPDATE SET value = excluded.value`,\n )\n .run(this.namespace, prefix, value)\n const base = idBaseOf(this.sqlite)\n const seed = base === 0 ? this.salt : `${this.salt}#${base}`\n return `${prefix}${opaqueToken(`${seed}:${prefix}:${value}`, length)}`\n })\n }\n}\n", "/**\n * Rails/PHP/Stripe-style bracket notation for `application/x-www-form-urlencoded` bodies and\n * query strings:\n *\n * address[city]=Paris -> { address: { city: \"Paris\" } }\n * items[0][name]=a -> { items: [{ name: \"a\" }] }\n * tags[]=x&tags[]=y -> { tags: [\"x\", \"y\"] }\n * metadata[k]=v -> { metadata: { k: \"v\" } }\n *\n * Decoding yields only strings, arrays and plain objects \u2014 coercion is the caller's concern,\n * exactly like a real HTTP server.\n */\n\nexport type FormValue = string | FormValue[] | { [key: string]: FormValue }\n\nexport type FormObject = { [key: string]: FormValue }\n\nconst encodeComponent = (value: string) =>\n encodeURIComponent(value).replace(\n /[!'()*]/g,\n (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`,\n )\n\nconst flatten = (prefix: string, value: unknown, out: Array<[string, string]>) => {\n if (value === undefined) return\n if (value === null) {\n out.push([prefix, \"\"])\n return\n }\n if (Array.isArray(value)) {\n if (value.length === 0) {\n out.push([prefix, \"\"])\n return\n }\n value.forEach((item, index) => {\n flatten(`${prefix}[${index}]`, item, out)\n })\n return\n }\n if (typeof value === \"object\") {\n const entries = Object.entries(value as Record<string, unknown>)\n if (entries.length === 0) {\n out.push([prefix, \"\"])\n return\n }\n for (const [key, item] of entries) flatten(`${prefix}[${key}]`, item, out)\n return\n }\n out.push([prefix, String(value)])\n}\n\n/**\n * Encode a JSON-like value as bracket-notation pairs. Nested arrays use explicit indices\n * (`a[0]`), which every bracket parser (including Stripe's) accepts; empty arrays/objects\n * encode as an empty string, matching how Stripe unsets fields.\n */\nexport const encodeFormPairs = (value: Record<string, unknown>): Array<[string, string]> => {\n const out: Array<[string, string]> = []\n for (const [key, item] of Object.entries(value)) flatten(key, item, out)\n return out\n}\n\n/** Encode to a full `application/x-www-form-urlencoded` string. */\nexport const encodeForm = (value: Record<string, unknown>): string =>\n encodeFormPairs(value)\n .map(([k, v]) => `${encodeComponent(k)}=${encodeComponent(v)}`)\n .join(\"&\")\n\nconst parsePath = (rawKey: string): string[] => {\n const open = rawKey.indexOf(\"[\")\n if (open === -1) return [rawKey]\n const path = [rawKey.slice(0, open)]\n const rest = rawKey.slice(open)\n const pattern = /\\[([^\\]]*)\\]/g\n let match: RegExpExecArray | null = pattern.exec(rest)\n let consumed = 0\n while (match !== null) {\n if (match.index !== consumed) return [rawKey]\n path.push(match[1] ?? \"\")\n consumed = match.index + match[0].length\n match = pattern.exec(rest)\n }\n if (consumed !== rest.length) return [rawKey]\n return path\n}\n\nconst isIndex = (segment: string) => /^(0|[1-9][0-9]*)$/.test(segment)\n\n/** 2^32 - 2: larger integer keys are plain properties of an array, never elements. */\nconst MAX_ARRAY_INDEX = 4_294_967_294\n\n/**\n * Write an own property. `__proto__` is the one key with an inherited setter, so it needs\n * `defineProperty`; every other key shadows its inherited namesake by plain assignment.\n */\nconst put = (target: object, key: string | number, value: FormValue): void => {\n if (key === \"__proto__\") {\n Object.defineProperty(target, key, {\n value,\n enumerable: true,\n writable: true,\n configurable: true,\n })\n return\n }\n ;(target as Record<string | number, FormValue>)[key] = value\n}\n\nconst assign = (target: FormObject, path: string[], value: string) => {\n let cursor: FormValue = target\n for (let i = 0; i < path.length; i++) {\n const segment = path[i] as string\n const last = i === path.length - 1\n if (Array.isArray(cursor)) {\n const index: number | undefined =\n segment === \"\" ? cursor.length : isIndex(segment) ? Number(segment) : undefined\n if (index === undefined) return\n if (last) {\n put(cursor, index, value)\n return\n }\n const next: FormValue | undefined = Object.hasOwn(cursor, index)\n ? (cursor as Record<number, FormValue>)[index]\n : undefined\n if (next === undefined || typeof next === \"string\") {\n const created: FormValue = path[i + 1] === \"\" || isIndex(path[i + 1] as string) ? [] : {}\n put(cursor, index, created)\n cursor = created\n } else {\n cursor = next\n }\n continue\n }\n if (typeof cursor === \"string\") return\n if (last) {\n put(cursor, segment, value)\n return\n }\n const nextSegment = path[i + 1] as string\n const existing: FormValue | undefined = Object.hasOwn(cursor, segment)\n ? (cursor as Record<string, FormValue>)[segment]\n : undefined\n if (existing === undefined || typeof existing === \"string\") {\n const created: FormValue = nextSegment === \"\" || isIndex(nextSegment) ? [] : {}\n put(cursor, segment, created)\n cursor = created\n } else {\n cursor = existing\n }\n }\n}\n\n/** Decode `key=value&...` pairs (already percent-decoded) into a nested object. */\nexport const decodeFormPairs = (pairs: Iterable<[string, string]>): FormObject => {\n const out: FormObject = {}\n for (const [rawKey, value] of pairs) assign(out, parsePath(rawKey), value)\n return densify(out) as FormObject\n}\n\n/** Sparse arrays (`a[2]=x` without `a[0]`) become dense in bracket parsers. */\nconst densify = (value: FormValue): FormValue => {\n if (typeof value === \"string\") return value\n if (Array.isArray(value)) {\n // Walk the indices that were written, not `length`: `a[4294967294]=x` makes a one-entry\n // array whose length is ~4.3 billion. Own index keys enumerate in ascending order.\n const dense: FormValue[] = []\n for (const key of Object.keys(value)) {\n if (!isIndex(key) || Number(key) > MAX_ARRAY_INDEX) continue\n const item = value[Number(key)]\n if (item !== undefined) dense.push(densify(item))\n }\n return dense\n }\n const out: FormObject = {}\n for (const [key, item] of Object.entries(value)) put(out, key, densify(item))\n return out\n}\n\n/** Decode an `application/x-www-form-urlencoded` body or a query string (with or without `?`). */\nexport const decodeForm = (text: string): FormObject => {\n const source = text.startsWith(\"?\") ? text.slice(1) : text\n return decodeFormPairs(new URLSearchParams(source).entries())\n}\n", "import { decodeForm, encodeForm } from \"./form.js\"\n\nexport const JSON_MEDIA_TYPE = \"application/json\"\nexport const FORM_MEDIA_TYPE = \"application/x-www-form-urlencoded\"\n\n/** The essence of a `Content-Type` header: lower-cased media type without parameters. */\nexport const mediaTypeOf = (contentType: string | null | undefined): string | undefined => {\n if (!contentType) return undefined\n const essence = contentType.split(\";\")[0]?.trim().toLowerCase()\n return essence ? essence : undefined\n}\n\nconst isJsonMediaType = (mediaType: string) =>\n mediaType === JSON_MEDIA_TYPE ||\n mediaType.endsWith(\"+json\") ||\n mediaType === \"text/json\" ||\n mediaType === \"application/x-amz-json-1.0\" ||\n mediaType === \"application/x-amz-json-1.1\"\n\nexport type DecodedBody =\n | { kind: \"empty\" }\n | { kind: \"json\"; value: unknown }\n | { kind: \"form\"; value: Record<string, unknown> }\n | { kind: \"text\"; value: string }\n | { kind: \"bytes\"; value: Uint8Array }\n | { kind: \"invalid\"; mediaType: string; text: string; error: string }\n\nconst utf8 = new TextDecoder(\"utf-8\", { fatal: false })\n\n/**\n * Decode raw bytes according to a `Content-Type`. Never throws: malformed payloads come back as\n * `{ kind: \"invalid\" }` so callers (mock servers, the differential runner) can respond like a real\n * server would instead of crashing.\n */\nexport const decodeBody = (\n contentType: string | null | undefined,\n bytes: Uint8Array,\n): DecodedBody => {\n if (bytes.byteLength === 0) return { kind: \"empty\" }\n const mediaType = mediaTypeOf(contentType)\n if (mediaType === undefined) return { kind: \"bytes\", value: bytes }\n if (isJsonMediaType(mediaType)) {\n const text = utf8.decode(bytes)\n try {\n return { kind: \"json\", value: JSON.parse(text) }\n } catch (error) {\n return {\n kind: \"invalid\",\n mediaType,\n text,\n error: error instanceof Error ? error.message : String(error),\n }\n }\n }\n if (mediaType === FORM_MEDIA_TYPE) {\n return { kind: \"form\", value: decodeForm(utf8.decode(bytes)) }\n }\n if (mediaType.startsWith(\"text/\")) return { kind: \"text\", value: utf8.decode(bytes) }\n return { kind: \"bytes\", value: bytes }\n}\n\n/** Read and decode a Request/Response body. */\nexport const readBody = async (message: Request | Response): Promise<DecodedBody> => {\n // Materialize automatic headers before accessing the body stream. Bun can otherwise\n // discard the inferred content type of an in-process URLSearchParams request.\n const contentType = message.headers.get(\"content-type\")\n // An in-process Request's body does not automatically observe its AbortSignal.\n // Cancel the active reader so an incomplete upload cannot strand the caller.\n if (!(message instanceof Request) || !message.body) {\n if (message instanceof Request) message.signal.throwIfAborted()\n return decodeBody(contentType, new Uint8Array(await message.arrayBuffer()))\n }\n message.signal.throwIfAborted()\n const reader = message.body.getReader()\n const cancel = () => {\n void reader.cancel(message.signal.reason).catch(() => {})\n }\n message.signal.addEventListener(\"abort\", cancel, { once: true })\n const chunks: Uint8Array[] = []\n let size = 0\n try {\n for (;;) {\n message.signal.throwIfAborted()\n const { done, value } = await reader.read()\n message.signal.throwIfAborted()\n if (done) break\n chunks.push(value)\n size += value.byteLength\n }\n } finally {\n message.signal.removeEventListener(\"abort\", cancel)\n reader.releaseLock()\n }\n const bytes = new Uint8Array(size)\n let offset = 0\n for (const chunk of chunks) {\n bytes.set(chunk, offset)\n offset += chunk.byteLength\n }\n return decodeBody(contentType, bytes)\n}\n\nexport type EncodedBody = {\n contentType: string\n body: string\n}\n\n/** Encode a JSON-like value for the given media type. Throws for unsupported media types. */\nexport const encodeBody = (mediaType: string, value: unknown): EncodedBody => {\n const essence = mediaTypeOf(mediaType) ?? mediaType\n if (isJsonMediaType(essence)) return { contentType: essence, body: JSON.stringify(value) }\n if (essence === FORM_MEDIA_TYPE) {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new TypeError(`${FORM_MEDIA_TYPE} bodies must be objects`)\n }\n return { contentType: essence, body: encodeForm(value as Record<string, unknown>) }\n }\n if (essence.startsWith(\"text/\")) return { contentType: essence, body: String(value) }\n throw new TypeError(`unsupported request media type: ${mediaType}`)\n}\n", "import type { OpenAPIDocument, ReferenceObject } from \"./types.js\"\n\nexport class OpenAPIReferenceError extends Error {\n constructor(readonly ref: string) {\n super(`unresolvable $ref: ${ref}`)\n this.name = \"OpenAPIReferenceError\"\n }\n}\n\nconst unescapePointer = (segment: string) => segment.replace(/~1/g, \"/\").replace(/~0/g, \"~\")\n\n/** True when `value` is a `{ $ref }` object. */\nexport const isReference = (value: unknown): value is ReferenceObject =>\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { $ref?: unknown }).$ref === \"string\"\n\n/** Resolve a local JSON pointer reference (`#/components/schemas/customer`) inside `document`. */\nexport const resolveRef = (document: OpenAPIDocument, ref: string): unknown => {\n if (!ref.startsWith(\"#/\")) throw new OpenAPIReferenceError(ref)\n let cursor: unknown = document\n for (const raw of ref.slice(2).split(\"/\")) {\n const segment = unescapePointer(raw)\n if (typeof cursor !== \"object\" || cursor === null || !(segment in cursor)) {\n throw new OpenAPIReferenceError(ref)\n }\n cursor = (cursor as Record<string, unknown>)[segment]\n }\n if (cursor === undefined) throw new OpenAPIReferenceError(ref)\n return cursor\n}\n\n/**\n * Follow `$ref` chains until a concrete object is reached. Guards against cycles.\n * Sibling keys next to `$ref` are ignored, as in OpenAPI 3.0/3.1 for non-schema objects.\n */\nexport const deref = <T>(document: OpenAPIDocument, value: T | ReferenceObject): T => {\n let current: unknown = value\n const seen = new Set<string>()\n while (isReference(current)) {\n if (seen.has(current.$ref)) throw new OpenAPIReferenceError(`${current.$ref} (cycle)`)\n seen.add(current.$ref)\n current = resolveRef(document, current.$ref)\n }\n return current as T\n}\n\n/** The component name at the end of a `#/components/<kind>/<name>` reference, if any. */\nexport const componentNameOf = (ref: string): string | undefined => {\n const match = /^#\\/components\\/[^/]+\\/(.+)$/.exec(ref)\n return match?.[1] === undefined ? undefined : unescapePointer(match[1])\n}\n", "/**\n * The slice of OpenAPI 3.1 (and JSON Schema 2020-12) Mockingbird understands.\n * Unknown keys (including `x-*` extensions) are preserved on every object.\n */\n\nexport type JsonPrimitive = string | number | boolean | null\nexport type JsonValue = JsonPrimitive | JsonValue[] | { [key: string]: JsonValue }\n\nexport type ReferenceObject = { $ref: string; description?: string; summary?: string }\n\nexport type SchemaType = \"string\" | \"number\" | \"integer\" | \"boolean\" | \"object\" | \"array\" | \"null\"\n\nexport type SchemaObject = {\n $ref?: string\n type?: SchemaType | SchemaType[]\n title?: string\n description?: string\n format?: string\n enum?: JsonValue[]\n const?: JsonValue\n default?: JsonValue\n example?: JsonValue\n examples?: JsonValue[]\n nullable?: boolean\n deprecated?: boolean\n readOnly?: boolean\n writeOnly?: boolean\n minimum?: number\n maximum?: number\n exclusiveMinimum?: number\n exclusiveMaximum?: number\n multipleOf?: number\n minLength?: number\n maxLength?: number\n pattern?: string\n minItems?: number\n maxItems?: number\n uniqueItems?: boolean\n items?: SchemaObject\n prefixItems?: SchemaObject[]\n minProperties?: number\n maxProperties?: number\n required?: string[]\n properties?: Record<string, SchemaObject>\n additionalProperties?: boolean | SchemaObject\n propertyNames?: SchemaObject\n oneOf?: SchemaObject[]\n anyOf?: SchemaObject[]\n allOf?: SchemaObject[]\n not?: SchemaObject\n discriminator?: { propertyName: string; mapping?: Record<string, string> }\n [extension: `x-${string}`]: unknown\n}\n\nexport type ParameterLocation = \"path\" | \"query\" | \"header\" | \"cookie\"\n\nexport type ParameterObject = {\n name: string\n in: ParameterLocation\n description?: string\n required?: boolean\n deprecated?: boolean\n style?: string\n explode?: boolean\n schema?: SchemaObject\n content?: Record<string, MediaTypeObject>\n example?: JsonValue\n [extension: `x-${string}`]: unknown\n}\n\nexport type MediaTypeObject = {\n schema?: SchemaObject\n example?: JsonValue\n examples?: Record<string, unknown>\n encoding?: Record<string, unknown>\n [extension: `x-${string}`]: unknown\n}\n\nexport type RequestBodyObject = {\n description?: string\n required?: boolean\n content: Record<string, MediaTypeObject>\n [extension: `x-${string}`]: unknown\n}\n\nexport type HeaderObject = {\n description?: string\n required?: boolean\n schema?: SchemaObject\n [extension: `x-${string}`]: unknown\n}\n\nexport type ResponseObject = {\n description: string\n headers?: Record<string, HeaderObject | ReferenceObject>\n content?: Record<string, MediaTypeObject>\n [extension: `x-${string}`]: unknown\n}\n\nexport type ResponsesObject = Record<string, ResponseObject | ReferenceObject>\n\nexport type SecurityRequirementObject = Record<string, string[]>\n\nexport type OperationObject = {\n operationId?: string\n summary?: string\n description?: string\n tags?: string[]\n deprecated?: boolean\n parameters?: Array<ParameterObject | ReferenceObject>\n requestBody?: RequestBodyObject | ReferenceObject\n responses: ResponsesObject\n security?: SecurityRequirementObject[]\n [extension: `x-${string}`]: unknown\n}\n\nexport const HTTP_METHODS = [\n \"get\",\n \"put\",\n \"post\",\n \"delete\",\n \"options\",\n \"head\",\n \"patch\",\n \"trace\",\n] as const\nexport type HttpMethod = (typeof HTTP_METHODS)[number]\n\nexport type PathItemObject = {\n summary?: string\n description?: string\n parameters?: Array<ParameterObject | ReferenceObject>\n [extension: `x-${string}`]: unknown\n} & Partial<Record<HttpMethod, OperationObject>>\n\nexport type SecuritySchemeObject = {\n type: \"apiKey\" | \"http\" | \"oauth2\" | \"openIdConnect\" | \"mutualTLS\"\n description?: string\n name?: string\n in?: ParameterLocation\n scheme?: string\n bearerFormat?: string\n flows?: Record<string, unknown>\n openIdConnectUrl?: string\n [extension: `x-${string}`]: unknown\n}\n\nexport type ComponentsObject = {\n schemas?: Record<string, SchemaObject>\n responses?: Record<string, ResponseObject>\n parameters?: Record<string, ParameterObject>\n requestBodies?: Record<string, RequestBodyObject>\n headers?: Record<string, HeaderObject>\n securitySchemes?: Record<string, SecuritySchemeObject>\n [extension: `x-${string}`]: unknown\n}\n\nexport type ServerObject = {\n url: string\n description?: string\n variables?: Record<string, unknown>\n [extension: `x-${string}`]: unknown\n}\n\nexport type InfoObject = {\n title: string\n version: string\n description?: string\n [extension: `x-${string}`]: unknown\n}\n\nexport type OpenAPIDocument = {\n openapi: string\n info: InfoObject\n servers?: ServerObject[]\n paths: Record<string, PathItemObject>\n components?: ComponentsObject\n security?: SecurityRequirementObject[]\n tags?: Array<{ name: string; description?: string }>\n [extension: `x-${string}`]: unknown\n}\n\n/** One concrete HTTP operation discovered in a document. */\nexport type Operation = {\n operationId: string\n method: HttpMethod\n /** OpenAPI path template, e.g. `/v1/customers/{customer}`. */\n path: string\n operation: OperationObject\n /** Path-level parameters merged with operation-level ones (operation wins), `$ref`s resolved. */\n parameters: ParameterObject[]\n requestBody: RequestBodyObject | undefined\n responses: Record<string, ResponseObject>\n}\n", "import { deref, isReference, resolveRef } from \"./refs.js\"\nimport {\n HTTP_METHODS,\n type HttpMethod,\n type OpenAPIDocument,\n type Operation,\n type ParameterObject,\n type PathItemObject,\n type RequestBodyObject,\n type ResponseObject,\n} from \"./types.js\"\n\nexport class OpenAPIDocumentError extends Error {\n constructor(readonly issues: string[]) {\n super(`invalid OpenAPI document:\\n${issues.map((issue) => ` - ${issue}`).join(\"\\n\")}`)\n this.name = \"OpenAPIDocumentError\"\n }\n}\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n\n/**\n * Accept an already-parsed JSON/YAML value and return it typed as an {@link OpenAPIDocument}.\n * Performs the structural checks Mockingbird relies on (see {@link validateOpenAPIDocument}) and\n * throws {@link OpenAPIDocumentError} listing every problem.\n */\nexport const parseOpenAPIDocument = (value: unknown): OpenAPIDocument => {\n const issues: string[] = []\n if (!isRecord(value)) throw new OpenAPIDocumentError([\"document must be an object\"])\n if (typeof value.openapi !== \"string\" || !/^3\\.[01]\\./.test(value.openapi)) {\n issues.push(\n `openapi must be a 3.0.x or 3.1.x version string, got ${JSON.stringify(value.openapi)}`,\n )\n }\n if (\n !isRecord(value.info) ||\n typeof value.info.title !== \"string\" ||\n typeof value.info.version !== \"string\"\n ) {\n issues.push(\"info.title and info.version are required strings\")\n }\n if (!isRecord(value.paths)) issues.push(\"paths must be an object\")\n if (issues.length > 0) throw new OpenAPIDocumentError(issues)\n const document = value as unknown as OpenAPIDocument\n const problems = validateOpenAPIDocument(document)\n if (problems.length > 0) throw new OpenAPIDocumentError(problems)\n return document\n}\n\nconst walkRefs = (\n document: OpenAPIDocument,\n node: unknown,\n at: string,\n issues: string[],\n seen: Set<unknown>,\n) => {\n if (typeof node !== \"object\" || node === null || seen.has(node)) return\n seen.add(node)\n if (isReference(node)) {\n try {\n resolveRef(document, node.$ref)\n } catch {\n issues.push(`${at}: unresolvable $ref ${node.$ref}`)\n }\n }\n for (const [key, child] of Object.entries(node))\n walkRefs(document, child, `${at}/${key}`, issues, seen)\n}\n\nconst templateParams = (path: string) =>\n [...path.matchAll(/\\{([^}]+)\\}/g)].map((m) => m[1] as string)\n\n/**\n * Mockingbird's document rules:\n * - every operation has a unique `operationId`\n * - every `$ref` resolves\n * - every `{param}` in a path template has a matching required path parameter\n * - every path parameter appears in the template\n */\nexport const validateOpenAPIDocument = (document: OpenAPIDocument): string[] => {\n const issues: string[] = []\n walkRefs(document, document, \"#\", issues, new Set())\n if (issues.length > 0) return issues\n const seenIds = new Map<string, string>()\n for (const [path, item] of Object.entries(document.paths)) {\n if (!isRecord(item)) {\n issues.push(`paths.${path}: must be an object`)\n continue\n }\n const inTemplate = new Set(templateParams(path))\n for (const method of HTTP_METHODS) {\n const operation = item[method]\n if (operation === undefined) continue\n const label = `${method.toUpperCase()} ${path}`\n if (typeof operation.operationId !== \"string\" || operation.operationId.length === 0) {\n issues.push(`${label}: operationId is required`)\n continue\n }\n const previous = seenIds.get(operation.operationId)\n if (previous !== undefined)\n issues.push(`${label}: duplicate operationId ${operation.operationId} (also ${previous})`)\n seenIds.set(operation.operationId, label)\n if (!isRecord(operation.responses) || Object.keys(operation.responses).length === 0) {\n issues.push(`${label}: responses must declare at least one status`)\n }\n const parameters = mergeParameters(document, item, operation.parameters)\n const declared = new Set(parameters.filter((p) => p.in === \"path\").map((p) => p.name))\n for (const name of inTemplate) {\n if (!declared.has(name)) issues.push(`${label}: path parameter {${name}} is not declared`)\n }\n for (const parameter of parameters) {\n if (parameter.in === \"path\") {\n if (!inTemplate.has(parameter.name))\n issues.push(`${label}: path parameter ${parameter.name} is not in the template`)\n if (parameter.required !== true)\n issues.push(`${label}: path parameter ${parameter.name} must be required`)\n }\n }\n }\n }\n return issues\n}\n\nconst mergeParameters = (\n document: OpenAPIDocument,\n item: PathItemObject,\n own: PathItemObject[\"parameters\"],\n): ParameterObject[] => {\n const merged = new Map<string, ParameterObject>()\n for (const raw of item.parameters ?? []) {\n const parameter = deref<ParameterObject>(document, raw)\n merged.set(`${parameter.in}:${parameter.name}`, parameter)\n }\n for (const raw of own ?? []) {\n const parameter = deref<ParameterObject>(document, raw)\n merged.set(`${parameter.in}:${parameter.name}`, parameter)\n }\n return [...merged.values()]\n}\n\n/** Enumerate every operation in the document in path, then method order. */\nexport const listOperations = (document: OpenAPIDocument): Operation[] => {\n const operations: Operation[] = []\n for (const [path, item] of Object.entries(document.paths)) {\n for (const method of HTTP_METHODS) {\n const operation = item[method]\n if (operation?.operationId === undefined) continue\n const responses: Record<string, ResponseObject> = {}\n for (const [status, response] of Object.entries(operation.responses)) {\n responses[status] = deref<ResponseObject>(document, response)\n }\n operations.push({\n operationId: operation.operationId,\n method,\n path,\n operation,\n parameters: mergeParameters(document, item, operation.parameters),\n requestBody:\n operation.requestBody === undefined\n ? undefined\n : deref<RequestBodyObject>(document, operation.requestBody),\n responses,\n })\n }\n }\n return operations\n}\n\n/** Find one operation by id. */\nexport const findOperation = (\n document: OpenAPIDocument,\n operationId: string,\n): Operation | undefined =>\n listOperations(document).find((operation) => operation.operationId === operationId)\n\n/** Parameter names inside a path template, in order. */\nexport const pathTemplateParameters = templateParams\n\n/** Substitute `{name}` placeholders. Values are percent-encoded as path segments. */\nexport const expandPathTemplate = (template: string, values: Record<string, string>): string =>\n template.replace(/\\{([^}]+)\\}/g, (_, name: string) => {\n const value = values[name]\n if (value === undefined) throw new RangeError(`missing path parameter ${name}`)\n return encodeURIComponent(value)\n })\n\n/** The response object matching an HTTP status: exact match, then `2XX`-style range, then `default`. */\nexport const responseForStatus = (\n responses: Record<string, ResponseObject>,\n status: number,\n): ResponseObject | undefined =>\n responses[String(status)] ?? responses[`${Math.floor(status / 100)}XX`] ?? responses.default\n\nexport type { HttpMethod }\n", "import { resolveRef } from \"./refs.js\"\nimport type { JsonValue, OpenAPIDocument, SchemaObject, SchemaType } from \"./types.js\"\n\n/**\n * Resolve a schema's `$ref` (merging sibling keywords, as JSON Schema 2020-12 allows) and\n * normalise OpenAPI 3.0 `nullable` into a 3.1 type array.\n */\nexport const resolveSchema = (document: OpenAPIDocument, schema: SchemaObject): SchemaObject => {\n let current = schema\n const seen = new Set<string>()\n while (typeof current.$ref === \"string\") {\n const ref = current.$ref\n if (seen.has(ref)) break\n seen.add(ref)\n const { $ref: _ignored, ...siblings } = current\n const target = resolveRef(document, ref) as SchemaObject\n current = { ...target, ...siblings }\n }\n if (current.nullable === true) {\n const { nullable: _nullable, ...rest } = current\n const types = schemaTypes(rest)\n if (types.length > 0 && !types.includes(\"null\")) current = { ...rest, type: [...types, \"null\"] }\n else current = rest\n }\n return current\n}\n\n/** Declared JSON types of a schema (empty when unconstrained). */\nexport const schemaTypes = (schema: SchemaObject): SchemaType[] => {\n if (Array.isArray(schema.type)) return schema.type\n if (schema.type !== undefined) return [schema.type]\n const inferred: SchemaType[] = []\n if (schema.properties || schema.required || schema.additionalProperties !== undefined)\n inferred.push(\"object\")\n if (\n schema.items ||\n schema.prefixItems ||\n schema.minItems !== undefined ||\n schema.maxItems !== undefined\n )\n inferred.push(\"array\")\n if (\n schema.minLength !== undefined ||\n schema.maxLength !== undefined ||\n schema.pattern !== undefined\n )\n inferred.push(\"string\")\n if (\n schema.minimum !== undefined ||\n schema.maximum !== undefined ||\n schema.multipleOf !== undefined\n )\n inferred.push(\"number\")\n return inferred\n}\n\n/** The JSON type name of a runtime value. */\nexport const jsonTypeOf = (value: unknown): SchemaType | \"undefined\" => {\n if (value === null) return \"null\"\n if (Array.isArray(value)) return \"array\"\n switch (typeof value) {\n case \"string\":\n return \"string\"\n case \"boolean\":\n return \"boolean\"\n case \"number\":\n return Number.isInteger(value) ? \"integer\" : \"number\"\n case \"object\":\n return \"object\"\n default:\n return \"undefined\"\n }\n}\n\nexport type SchemaVisitor = (schema: SchemaObject, path: string[]) => void\n\n/**\n * Depth-first walk over a schema tree, resolving `$ref`s, that terminates on recursive schemas.\n * Each schema node is visited once per call: the annotation consumers (identities, refs,\n * volatile/scope marks) only care that a node is reachable, and visiting per path is exponential\n * on densely cross-referenced documents.\n */\nexport const walkSchema = (\n document: OpenAPIDocument,\n schema: SchemaObject,\n visit: SchemaVisitor,\n path: string[] = [],\n) => {\n const seen = new Set<SchemaObject>()\n const go = (node: SchemaObject, at: string[]) => {\n // `resolveSchema` returns a fresh object whenever it follows a `$ref`, so identity of the\n // resolved schema alone never repeats on a recursive schema. The raw node does: every child is\n // an object of the document itself, so remembering raw nodes bounds the walk.\n if (seen.has(node)) return\n seen.add(node)\n const resolved = resolveSchema(document, node)\n if (resolved !== node && seen.has(resolved)) return\n seen.add(resolved)\n visit(resolved, at)\n for (const [name, child] of Object.entries(resolved.properties ?? {}))\n go(child, [...at, \"properties\", name])\n if (typeof resolved.additionalProperties === \"object\")\n go(resolved.additionalProperties, [...at, \"additionalProperties\"])\n if (resolved.items) go(resolved.items, [...at, \"items\"])\n resolved.prefixItems?.forEach((child, i) => {\n go(child, [...at, \"prefixItems\", String(i)])\n })\n resolved.propertyNames && go(resolved.propertyNames, [...at, \"propertyNames\"])\n for (const keyword of [\"oneOf\", \"anyOf\", \"allOf\"] as const) {\n resolved[keyword]?.forEach((child, i) => {\n go(child, [...at, keyword, String(i)])\n })\n }\n resolved.not && go(resolved.not, [...at, \"not\"])\n }\n go(schema, path)\n}\nexport type ValidationError = { path: Array<string | number>; message: string }\n\nconst deepEqual = (a: unknown, b: unknown): boolean => {\n if (a === b) return true\n if (typeof a !== typeof b || a === null || b === null) return false\n if (Array.isArray(a)) {\n return Array.isArray(b) && a.length === b.length && a.every((item, i) => deepEqual(item, b[i]))\n }\n if (typeof a === \"object\" && typeof b === \"object\" && !Array.isArray(b)) {\n const ka = Object.keys(a as object)\n const kb = Object.keys(b as object)\n return (\n ka.length === kb.length &&\n ka.every((k) =>\n deepEqual((a as Record<string, unknown>)[k], (b as Record<string, unknown>)[k]),\n )\n )\n }\n return false\n}\n\nconst FORMAT_PATTERNS: Record<string, RegExp> = {\n uuid: /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,\n date: /^\\d{4}-\\d{2}-\\d{2}$/,\n \"date-time\": /^\\d{4}-\\d{2}-\\d{2}[Tt ]\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?([Zz]|[+-]\\d{2}:\\d{2})$/,\n email: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/,\n uri: /^[a-zA-Z][a-zA-Z0-9+.-]*:[^\\s]*$/,\n ipv4: /^(25[0-5]|2[0-4]\\d|1?\\d?\\d)(\\.(25[0-5]|2[0-4]\\d|1?\\d?\\d)){3}$/,\n}\n\nconst graphemeLength = (value: string) => [...value].length\n\n/**\n * Validate `value` against `schema`. Supports the JSON Schema subset Mockingbird generates from\n * (see `@crvouga/mockingbird-openapi-arbitrary`). Returns an empty array when valid.\n */\nexport const validateValue = (\n document: OpenAPIDocument,\n schema: SchemaObject,\n value: unknown,\n path: Array<string | number> = [],\n): ValidationError[] => {\n const errors: ValidationError[] = []\n const s = resolveSchema(document, schema)\n const fail = (message: string) => errors.push({ path, message })\n const actual = jsonTypeOf(value)\n if (actual === \"undefined\") {\n fail(\"value is undefined\")\n return errors\n }\n const types = schemaTypes(s)\n if (types.length > 0) {\n const ok = types.some((t) => t === actual || (t === \"number\" && actual === \"integer\"))\n if (!ok) {\n fail(`expected type ${types.join(\"|\")}, got ${actual}`)\n return errors\n }\n }\n // OpenAPI commonly pairs `type: [\"string\",\"null\"]` with an enum of the non-null values;\n // null is admitted by the type union and must not fail the enum check.\n if (\n s.enum &&\n !(value === null && types.includes(\"null\")) &&\n !s.enum.some((candidate) => deepEqual(candidate, value))\n ) {\n fail(\"value not in enum\")\n }\n if (s.const !== undefined && !deepEqual(s.const, value)) fail(\"value does not equal const\")\n if (typeof value === \"string\") {\n const length = graphemeLength(value)\n if (s.minLength !== undefined && length < s.minLength)\n fail(`length ${length} < minLength ${s.minLength}`)\n if (s.maxLength !== undefined && length > s.maxLength)\n fail(`length ${length} > maxLength ${s.maxLength}`)\n if (s.pattern !== undefined) {\n try {\n if (!new RegExp(s.pattern, \"u\").test(value)) fail(`does not match pattern ${s.pattern}`)\n } catch {\n // unsupported pattern syntax: skip, matching lenient validators\n }\n }\n if (s.format !== undefined) {\n const pattern = FORMAT_PATTERNS[s.format]\n if (pattern && !pattern.test(value)) fail(`does not match format ${s.format}`)\n }\n }\n if (typeof value === \"number\") {\n if (s.minimum !== undefined && value < s.minimum) fail(`${value} < minimum ${s.minimum}`)\n if (s.maximum !== undefined && value > s.maximum) fail(`${value} > maximum ${s.maximum}`)\n if (s.exclusiveMinimum !== undefined && value <= s.exclusiveMinimum)\n fail(`${value} <= exclusiveMinimum ${s.exclusiveMinimum}`)\n if (s.exclusiveMaximum !== undefined && value >= s.exclusiveMaximum)\n fail(`${value} >= exclusiveMaximum ${s.exclusiveMaximum}`)\n if (\n s.multipleOf !== undefined &&\n Math.abs(value / s.multipleOf - Math.round(value / s.multipleOf)) > 1e-9\n ) {\n fail(`${value} is not a multiple of ${s.multipleOf}`)\n }\n }\n if (Array.isArray(value)) {\n if (s.minItems !== undefined && value.length < s.minItems)\n fail(`${value.length} items < minItems ${s.minItems}`)\n if (s.maxItems !== undefined && value.length > s.maxItems)\n fail(`${value.length} items > maxItems ${s.maxItems}`)\n if (\n s.uniqueItems &&\n value.some((item, i) => value.slice(0, i).some((prev) => deepEqual(prev, item)))\n )\n fail(\"items are not unique\")\n value.forEach((item, i) => {\n const itemSchema = s.prefixItems?.[i] ?? s.items\n if (itemSchema) errors.push(...validateValue(document, itemSchema, item, [...path, i]))\n })\n }\n if (actual === \"object\") {\n const record = value as Record<string, unknown>\n const keys = Object.keys(record)\n for (const name of s.required ?? [])\n if (!(name in record)) fail(`missing required property ${name}`)\n if (s.minProperties !== undefined && keys.length < s.minProperties)\n fail(`${keys.length} properties < minProperties ${s.minProperties}`)\n if (s.maxProperties !== undefined && keys.length > s.maxProperties)\n fail(`${keys.length} properties > maxProperties ${s.maxProperties}`)\n for (const key of keys) {\n const property = s.properties?.[key]\n if (property) {\n errors.push(...validateValue(document, property, record[key], [...path, key]))\n continue\n }\n if (s.additionalProperties === false) fail(`unexpected property ${key}`)\n else if (typeof s.additionalProperties === \"object\") {\n errors.push(...validateValue(document, s.additionalProperties, record[key], [...path, key]))\n }\n if (s.propertyNames) {\n const nameErrors = validateValue(document, s.propertyNames, key, [...path, key])\n if (nameErrors.length > 0)\n fail(`property name ${key} is invalid: ${nameErrors[0]?.message}`)\n }\n }\n }\n if (s.allOf)\n for (const branch of s.allOf) errors.push(...validateValue(document, branch, value, path))\n if (s.anyOf && !s.anyOf.some((branch) => validateValue(document, branch, value).length === 0))\n fail(\"matches no anyOf branch\")\n if (s.oneOf) {\n const matches = s.oneOf.filter(\n (branch) => validateValue(document, branch, value).length === 0,\n ).length\n if (matches !== 1) fail(`matches ${matches} oneOf branches, expected exactly 1`)\n }\n if (s.not && validateValue(document, s.not, value).length === 0)\n fail(\"matches forbidden `not` schema\")\n return errors\n}\n\nexport const isValid = (document: OpenAPIDocument, schema: SchemaObject, value: unknown) =>\n validateValue(document, schema, value).length === 0\n\nexport type { JsonValue }\n", "/**\n * Mockingbird's OpenAPI extensions. They are deliberately generic: nothing here knows about any\n * particular provider. Provider specifics live in each provider's `openapi.yaml`.\n */\n\n/** `x-mockingbird` on an operation. */\nexport type OperationExtension = {\n /** Opt in to a terminal path parameter spanning slash-separated segments. */\n path?: { parameter: string; allowEmpty?: boolean }\n /** `false` marks an operation the mock explicitly does not implement. Default `true`. */\n supported?: boolean\n /** Human explanation, required when `supported: false` or `parity.enabled: false`. */\n reason?: string\n parity?: {\n /** Whether the differential runner generates this operation. Defaults to `supported`. */\n enabled?: boolean\n /** `false` for operations that must never hit a real account (destructive, billing\u2026). Default `true`. */\n safe?: boolean\n reason?: string\n }\n}\n\nexport type OperationMetadata = {\n path?: { parameter: string; allowEmpty?: boolean }\n supported: boolean\n reason: string | undefined\n parity: { enabled: boolean; safe: boolean; reason: string | undefined }\n}\n\n/** `x-mockingbird-resource`: this string value is the identity of a resource. */\nexport type ResourceIdentityExtension = { type: string; identity: true }\n\n/** `x-mockingbird-resource-ref`: this value must reference an existing resource of `type`. */\nexport type ResourceRefExtension = {\n type: string\n /** A well-formed id that does not exist, used to exercise not-found behaviour. */\n missing?: string\n}\n\nexport const VOLATILE_KINDS = [\"id\", \"timestamp\", \"token\", \"url\", \"account\", \"opaque\"] as const\nexport type VolatileKind = (typeof VOLATILE_KINDS)[number]\n\n/** `x-mockingbird-volatile`: nondeterministic on the real side; compared by shape only. */\nexport type VolatileExtension = { kind: VolatileKind }\n\nexport const SCOPE_VALUES = [\"run-id\", \"walk-start-unix\", \"walk-start-iso\"] as const\nexport type ScopeValue = (typeof SCOPE_VALUES)[number]\n\n/** `x-mockingbird-scope`: always generate this run-scoped value instead of a random one. */\nexport type ScopeExtension = { value: ScopeValue }\n\n/** `x-mockingbird-unsupported`: the mock does not implement this parameter/property. */\nexport type UnsupportedExtension = true | { reason?: string }\n\nexport type SchemaMetadata = {\n resource: ResourceIdentityExtension | undefined\n resourceRef: ResourceRefExtension | undefined\n volatile: VolatileExtension | undefined\n scope: ScopeExtension | undefined\n unsupported: { reason: string | undefined } | undefined\n}\n\nexport const EXTENSION_KEYS = {\n operation: \"x-mockingbird\",\n resource: \"x-mockingbird-resource\",\n resourceRef: \"x-mockingbird-resource-ref\",\n volatile: \"x-mockingbird-volatile\",\n scope: \"x-mockingbird-scope\",\n unsupported: \"x-mockingbird-unsupported\",\n parityHeader: \"x-mockingbird-parity-header\",\n} as const\n", "import type {\n HeaderObject,\n OpenAPIDocument,\n OperationObject,\n ParameterObject,\n ResponseObject,\n SchemaObject,\n} from \"@crvouga/mockingbird-openapi\"\nimport { deref, resolveSchema } from \"@crvouga/mockingbird-openapi\"\nimport {\n EXTENSION_KEYS,\n type OperationExtension,\n type OperationMetadata,\n SCOPE_VALUES,\n type SchemaMetadata,\n VOLATILE_KINDS,\n} from \"./types.js\"\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n\nconst extensionOf = (holder: object, key: string): unknown =>\n (holder as Record<string, unknown>)[key]\n\n/** Read `x-mockingbird` from an operation, applying defaults. */\nexport const operationMetadata = (operation: OperationObject): OperationMetadata => {\n const raw = extensionOf(operation, EXTENSION_KEYS.operation)\n const ext: OperationExtension = isRecord(raw) ? (raw as OperationExtension) : {}\n const supported = ext.supported ?? true\n const parity = ext.parity ?? {}\n return {\n ...(ext.path === undefined ? {} : { path: ext.path }),\n supported,\n reason: typeof ext.reason === \"string\" ? ext.reason : undefined,\n parity: {\n enabled: supported && (parity.enabled ?? true),\n safe: parity.safe ?? true,\n reason: typeof parity.reason === \"string\" ? parity.reason : undefined,\n },\n }\n}\n\nconst readResource = (raw: unknown): SchemaMetadata[\"resource\"] => {\n if (!isRecord(raw) || typeof raw.type !== \"string\" || raw.identity !== true) return undefined\n return { type: raw.type, identity: true }\n}\n\nconst readResourceRef = (raw: unknown): SchemaMetadata[\"resourceRef\"] => {\n if (!isRecord(raw) || typeof raw.type !== \"string\") return undefined\n return { type: raw.type, ...(typeof raw.missing === \"string\" ? { missing: raw.missing } : {}) }\n}\n\nconst readVolatile = (raw: unknown): SchemaMetadata[\"volatile\"] => {\n if (!isRecord(raw) || typeof raw.kind !== \"string\") return undefined\n const kind = VOLATILE_KINDS.find((k) => k === raw.kind)\n return kind === undefined ? undefined : { kind }\n}\n\nconst readScope = (raw: unknown): SchemaMetadata[\"scope\"] => {\n if (!isRecord(raw) || typeof raw.value !== \"string\") return undefined\n const value = SCOPE_VALUES.find((v) => v === raw.value)\n return value === undefined ? undefined : { value }\n}\n\nconst readUnsupported = (raw: unknown): SchemaMetadata[\"unsupported\"] => {\n if (raw === true) return { reason: undefined }\n if (isRecord(raw)) return { reason: typeof raw.reason === \"string\" ? raw.reason : undefined }\n return undefined\n}\n\n/**\n * Read Mockingbird's schema-level extensions from a (resolved) schema or parameter.\n * Extensions on a `$ref` wrapper win over the target's, matching {@link resolveSchema}.\n */\nexport const schemaMetadata = (holder: SchemaObject | ParameterObject): SchemaMetadata => ({\n resource: readResource(extensionOf(holder, EXTENSION_KEYS.resource)),\n resourceRef: readResourceRef(extensionOf(holder, EXTENSION_KEYS.resourceRef)),\n volatile: readVolatile(extensionOf(holder, EXTENSION_KEYS.volatile)),\n scope: readScope(extensionOf(holder, EXTENSION_KEYS.scope)),\n unsupported: readUnsupported(extensionOf(holder, EXTENSION_KEYS.unsupported)),\n})\n\n/** Metadata of a parameter: extensions on the parameter itself win over its schema's. */\nexport const parameterMetadata = (\n document: OpenAPIDocument,\n parameter: ParameterObject,\n): SchemaMetadata => {\n const own = schemaMetadata(parameter)\n const fromSchema = parameter.schema\n ? schemaMetadata(resolveSchema(document, parameter.schema))\n : undefined\n return {\n resource: own.resource ?? fromSchema?.resource,\n resourceRef: own.resourceRef ?? fromSchema?.resourceRef,\n volatile: own.volatile ?? fromSchema?.volatile,\n scope: own.scope ?? fromSchema?.scope,\n unsupported: own.unsupported ?? fromSchema?.unsupported,\n }\n}\n\n/** Lower-cased names of response headers flagged with `x-mockingbird-parity-header: true`. */\nexport const parityHeaders = (document: OpenAPIDocument, response: ResponseObject): string[] => {\n const names: string[] = []\n for (const [name, raw] of Object.entries(response.headers ?? {})) {\n const header = deref<HeaderObject>(document, raw)\n if (extensionOf(header, EXTENSION_KEYS.parityHeader) === true) names.push(name.toLowerCase())\n }\n return names.sort()\n}\n", "import type { FetchAPI } from \"@crvouga/mockingbird-core\"\nimport {\n type DecodedBody,\n decodeFormPairs,\n type FormObject,\n readBody,\n} from \"@crvouga/mockingbird-http-codec\"\nimport { listOperations, type OpenAPIDocument, type Operation } from \"@crvouga/mockingbird-openapi\"\nimport { operationMetadata } from \"@crvouga/mockingbird-openapi-metadata\"\nimport {\n clearNamespace,\n migrateCore,\n resolveSqlite,\n type SqliteClient,\n} from \"@crvouga/mockingbird-sqlite\"\nimport { type Context, Hono } from \"hono\"\nimport { annotateResponse } from \"./journal.js\"\nimport { operationPath } from \"./path.js\"\nimport { recordedIssues } from \"./validation.js\"\n\n/** A rejection carries the issues `bodyIssues` found, for the runtime's log entry. */\nconst withIssues = (request: Request, response: Response): Response => {\n const issues = response.status >= 400 ? recordedIssues(request) : undefined\n return issues && issues.length > 0 ? annotateResponse(response, { issues }) : response\n}\n\n/** Options every provider constructor accepts. */\nexport type APIOptions = {\n /** Sync SQLite client. Defaults to `@crvouga/mockingbird-service-sqlite`. */\n sqlite?: SqliteClient\n /** Clock used for `created`-style fields. Default `Date.now`. */\n now?: () => number\n /**\n * Storage namespace for this instance's records. Instances sharing one SQLite\n * client stay isolated when their namespaces differ. Defaults to the service name.\n */\n namespace?: string\n}\n\nexport type OperationContext = {\n request: Request\n url: URL\n /** Path parameters. */\n params: Record<string, string>\n /** Query string decoded with bracket notation (`created[gte]=1` -> `{ created: { gte: \"1\" } }`). */\n query: FormObject\n body: DecodedBody\n /** Shared SQLite client for this service (already migrated). */\n sqlite: SqliteClient\n /** Service namespace used for records / sequences. */\n namespace: string\n operation: Operation\n /** The vendor contract the service was built from. */\n document: OpenAPIDocument\n now: () => number\n}\n\nexport type OperationHandler = (context: OperationContext) => Promise<Response> | Response\n\nexport type OperationHandlers = Record<string, OperationHandler>\n\n/** Identity helper that keeps handler maps type-checked against a fixed set of operation ids. */\nexport const defineOperations = <Id extends string>(\n handlers: Record<Id, OperationHandler>,\n): Record<Id, OperationHandler> => handlers\n\nexport class OperationRegistryError extends Error {\n constructor(readonly problems: string[]) {\n super(`operation registry is inconsistent:\\n${problems.map((p) => ` - ${p}`).join(\"\\n\")}`)\n this.name = \"OperationRegistryError\"\n }\n}\n\n/**\n * Cross-check handlers against the document: every supported operation needs exactly one\n * handler, no handler may target an unknown or unsupported operation, no duplicate ids.\n */\nexport const verifyOperations = (\n document: OpenAPIDocument,\n handlers: OperationHandlers,\n): string[] => {\n const problems: string[] = []\n const operations = listOperations(document)\n const seen = new Set<string>()\n for (const operation of operations) {\n if (seen.has(operation.operationId))\n problems.push(`duplicate operationId ${operation.operationId}`)\n seen.add(operation.operationId)\n const supported = operationMetadata(operation.operation).supported\n const handler = handlers[operation.operationId]\n if (supported && !handler)\n problems.push(`supported operation ${operation.operationId} has no handler`)\n if (!supported && handler)\n problems.push(`operation ${operation.operationId} is marked unsupported but has a handler`)\n }\n for (const id of Object.keys(handlers)) {\n if (!seen.has(id)) problems.push(`handler ${id} has no OpenAPI operation`)\n }\n return problems\n}\n\nexport type ServiceOptions = {\n document: OpenAPIDocument\n handlers: OperationHandlers\n sqlite: SqliteClient\n /** Namespace isolating this service's records and sequences. */\n namespace: string\n now?: (() => number) | undefined\n /** Response for paths/methods outside the contract. */\n notFound: (request: Request) => Response | Promise<Response>\n /** Response for operations declared but marked `supported: false`. Default: `notFound`. */\n unsupported?: (request: Request, operation: Operation) => Response | Promise<Response>\n /** Convert handler exceptions into a provider-shaped response. */\n onError: (error: unknown, request: Request) => Response | Promise<Response>\n /** Runs before every operation; return a Response to short-circuit (e.g. authentication). */\n before?: (context: OperationContext) => Promise<Response | undefined> | Response | undefined\n}\n\nexport type Service = FetchAPI & {\n app: Hono\n sqlite: SqliteClient\n namespace: string\n /** Delete every record and sequence in the service namespace. */\n reset(): Promise<void>\n}\n\nconst escapePattern = (value: string): string => value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n/** Hono treats `:id:action` as one parameter. Match embedded OpenAPI parameters\n * with a segment regex, then extract only the template's parameter values. */\nconst serviceRoute = (template: string) => {\n const names: string[] = []\n let pattern = \"\",\n end = 0\n for (const match of template.matchAll(/\\{([^}]+)\\}/g)) {\n pattern += `${escapePattern(template.slice(end, match.index))}([^/]+?)`\n const name = match[1]\n if (!name) throw new Error(`Invalid OpenAPI route template: ${template}`)\n names.push(name)\n end = match.index + match[0].length\n }\n pattern += escapePattern(template.slice(end))\n const matcher = new RegExp(`^${pattern}$`)\n const path = template\n .split(\"/\")\n .map((segment, index) => {\n if (!segment.includes(\"{\")) return segment\n const literal = /^\\{([^}]+)\\}$/.exec(segment)\n if (literal) return `:${literal[1]}`\n let expression = \"\",\n offset = 0\n for (const match of segment.matchAll(/\\{[^}]+\\}/g)) {\n expression += `${escapePattern(segment.slice(offset, match.index))}[^/]+?`\n offset = match.index + match[0].length\n }\n expression += escapePattern(segment.slice(offset))\n return `:mockingbirdSegment${index}{${expression}}`\n })\n .join(\"/\")\n return {\n path,\n params: (pathname: string): Record<string, string> => {\n const values = matcher.exec(pathname)\n return Object.fromEntries(\n names.map((name, index) => [name, decodeURIComponent(values?.[index + 1] ?? \"\")]),\n )\n },\n }\n}\n\n/** Static segments before parameters so `/v1/customers/search` beats `/v1/customers/:id`. */\nconst routeOrder = (a: Operation, b: Operation) => {\n const sa = a.path.split(\"/\")\n const sb = b.path.split(\"/\")\n for (let i = 0; i < Math.max(sa.length, sb.length); i++) {\n const x = sa[i] ?? \"\"\n const y = sb[i] ?? \"\"\n const px = x.startsWith(\"{\")\n const py = y.startsWith(\"{\")\n if (px !== py) return px ? 1 : -1\n if (x !== y) return x < y ? -1 : 1\n }\n return 0\n}\n\nconst queryOf = (url: URL): FormObject => decodeFormPairs(url.searchParams.entries())\n\n/**\n * Resolve optional `sqlite`, run core migrations, and return the ready client.\n * Call this from every provider constructor before building state.\n */\nexport const bootSqlite = (sqlite?: SqliteClient): SqliteClient => {\n const client = resolveSqlite(sqlite)\n migrateCore(client)\n return client\n}\n\n/** Build a Fetch-native service whose routes are exactly the document's operations. */\nexport const createService = (options: ServiceOptions): Service => {\n const problems = verifyOperations(options.document, options.handlers)\n if (problems.length > 0) throw new OperationRegistryError(problems)\n migrateCore(options.sqlite)\n const now = options.now ?? (() => Date.now())\n const app = new Hono()\n app.notFound((c) => options.notFound(c.req.raw))\n app.onError((error, c) => options.onError(error, c.req.raw))\n\n const operations = [...listOperations(options.document)].sort(routeOrder)\n for (const operation of operations) {\n const path = operationPath(operation)\n const metadata = operationMetadata(operation.operation)\n const handler = options.handlers[operation.operationId]\n const registeredRoute = serviceRoute(operation.path)\n const route = async (c: Context) => {\n const request = c.req.raw\n if (!metadata.supported || !handler) {\n return options.unsupported\n ? options.unsupported(request, operation)\n : options.notFound(request)\n }\n const url = new URL(request.url)\n const context: OperationContext = {\n request,\n url,\n params: metadata.path\n ? { ...(path.emptyParameter ? { [path.emptyParameter]: \"\" } : {}), ...c.req.param() }\n : registeredRoute.params(url.pathname),\n query: queryOf(url),\n body: await readBody(request),\n sqlite: options.sqlite,\n namespace: options.namespace,\n operation,\n document: options.document,\n now,\n }\n const short = await options.before?.(context)\n return withIssues(request, short ?? (await handler(context)))\n }\n app.on(\n operation.method.toUpperCase(),\n metadata.path ? path.routes : [registeredRoute.path],\n route,\n )\n }\n\n return {\n app,\n sqlite: options.sqlite,\n namespace: options.namespace,\n fetch: async (request) => app.fetch(request),\n reset: async () => {\n clearNamespace(options.sqlite, options.namespace)\n },\n }\n}\n", "import type { RequestLog } from \"./metrics.js\"\nimport type { BodyIssue } from \"./validation.js\"\n\n/** One journal entry: a request log stamped with when (on the mock clock) it was handled. */\nexport type JournalEntry = RequestLog & { at: string }\n\nexport type JournalQuery = {\n /** Only this namespace. Omit for every namespace, oldest first across all of them. */\n namespace?: string\n operationId?: string\n /** Only this HTTP method, case-insensitive. */\n method?: string\n /** Only this exact path. */\n path?: string\n /** Only requests this fault rule answered or shaped. */\n faultId?: string\n status?: number\n /** Only entries at or after this instant (epoch ms). */\n since?: number\n /** At most this many, the most recent kept. */\n limit?: number\n}\n\nexport type Journal = {\n readonly size: number\n record(entry: JournalEntry): void\n list(query?: JournalQuery): JournalEntry[]\n /** Forget one namespace's entries, or every namespace's. */\n clear(namespace?: string): void\n}\n\n/** Default number of entries each namespace keeps. */\nexport const DEFAULT_JOURNAL_SIZE = 1000\n\n/**\n * The last `size` requests per namespace, in a ring buffer: what the mock actually saw,\n * so a test can prove a request arrived (or never did) without reading logs.\n */\nexport const createJournal = (size: number = DEFAULT_JOURNAL_SIZE): Journal => {\n const capacity = Math.max(0, Math.floor(size))\n const rings = new Map<string, { entries: JournalEntry[]; next: number }>()\n let sequence = 0\n const order = new WeakMap<JournalEntry, number>()\n const inOrder = (ring: { entries: JournalEntry[]; next: number }): JournalEntry[] =>\n ring.entries.length < capacity\n ? ring.entries\n : [...ring.entries.slice(ring.next), ...ring.entries.slice(0, ring.next)]\n return {\n size: capacity,\n record(entry) {\n if (capacity === 0) return\n order.set(entry, sequence++)\n let ring = rings.get(entry.namespace)\n if (!ring) {\n ring = { entries: [], next: 0 }\n rings.set(entry.namespace, ring)\n }\n if (ring.entries.length < capacity) ring.entries.push(entry)\n else {\n ring.entries[ring.next] = entry\n ring.next = (ring.next + 1) % capacity\n }\n },\n list(query = {}) {\n const source =\n query.namespace !== undefined\n ? inOrder(rings.get(query.namespace) ?? { entries: [], next: 0 })\n : [...rings.values()]\n .flatMap(inOrder)\n .sort((a, b) => (order.get(a) ?? 0) - (order.get(b) ?? 0))\n const matched = source.filter(\n (entry) =>\n (query.operationId === undefined || entry.operationId === query.operationId) &&\n (query.method === undefined ||\n entry.method.toUpperCase() === query.method.toUpperCase()) &&\n (query.path === undefined || entry.path === query.path) &&\n (query.faultId === undefined || entry.faultId === query.faultId) &&\n (query.status === undefined || entry.status === query.status) &&\n (query.since === undefined || Date.parse(entry.at) >= query.since),\n )\n if (query.limit === undefined) return matched\n // `slice(-0)` is the whole list, so no entries has to be said outright.\n return query.limit <= 0 ? [] : matched.slice(-query.limit)\n },\n clear(namespace) {\n if (namespace === undefined) rings.clear()\n else rings.delete(namespace)\n },\n }\n}\n\n/** What a service knows about a request that the runtime cannot see from outside. */\nexport type ResponseNotes = {\n /** Node upgrade admission: actual wire status; the Fetch carrier remains 200. */\n wireStatus?: 101\n /** Resource ids the handler touched, e.g. `{ userId, orderId }`. */\n ids?: Record<string, string>\n /** Set when the handler created a resource the request referred to but did not exist. */\n adopted?: boolean\n /** The body validation issues behind a rejection; the runtime logs them, never the body. */\n issues?: BodyIssue[]\n}\n\nconst notes = new WeakMap<Response, ResponseNotes>()\n\n/**\n * Attach notes to a response for the request journal and structured log. They travel\n * beside the response, never in it, so nothing the vendor would not send reaches a client.\n */\nexport const annotateResponse = (response: Response, extra: ResponseNotes): Response => {\n const existing = notes.get(response)\n notes.set(response, {\n ...existing,\n ...extra,\n ...(existing?.ids || extra.ids ? { ids: { ...existing?.ids, ...extra.ids } } : {}),\n })\n return response\n}\n\nexport const responseNotes = (response: Response): ResponseNotes | undefined => notes.get(response)\n", "import type { Operation } from \"@crvouga/mockingbird-openapi\"\nimport { operationMetadata } from \"@crvouga/mockingbird-openapi-metadata\"\n\n/** Compile the same explicit terminal-tail contract for dispatch and observation. */\nexport const operationPath = (operation: Operation) => {\n const tail = operationMetadata(operation.operation).path\n if (\n tail &&\n (typeof tail.parameter !== \"string\" ||\n !tail.parameter ||\n !operation.path.endsWith(`/{${tail.parameter}}`) ||\n (tail.allowEmpty !== undefined && typeof tail.allowEmpty !== \"boolean\"))\n )\n throw new Error(`Invalid path metadata for ${operation.operationId}`)\n const segments = operation.path.split(\"/\")\n const ordinary = (segment: string) =>\n segment\n .split(/(\\{[^}]+\\})/)\n .map((part) =>\n /^\\{[^}]+\\}$/.test(part) ? \"[^/]+?\" : part.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"),\n )\n .join(\"\")\n const hono = operation.path.replace(/\\{([^}]+)\\}/g, (_, name: string) =>\n name === tail?.parameter ? `:${name}{.+}` : `:${name}`,\n )\n const prefix = tail ? segments.slice(0, -1).map(ordinary).join(\"/\") : undefined\n const pattern = tail\n ? `${prefix}${tail.allowEmpty ? \"(?:/.*)?\" : \"/.+\"}`\n : segments.map(ordinary).join(\"/\")\n const routes = [hono]\n if (tail?.allowEmpty) {\n const base = operation.path\n .slice(0, -`/{${tail.parameter}}`.length)\n .replace(/\\{([^}]+)\\}/g, \":$1\")\n routes.push(base, `${base}/`)\n }\n return {\n routes,\n pattern: new RegExp(`^${pattern}/?$`),\n emptyParameter: tail?.allowEmpty ? tail.parameter : undefined,\n }\n}\n", "import { mediaTypeOf } from \"@crvouga/mockingbird-http-codec\"\nimport {\n deref,\n resolveSchema,\n type SchemaObject,\n validateValue,\n} from \"@crvouga/mockingbird-openapi\"\nimport type { OperationContext } from \"./service.js\"\n\n/**\n * One problem with a request body, at a dotted path (`patient.address.city`, `items.0.sku`).\n * `kind` is `media_type` when the body is present but its media type is not one the operation\n * accepts (a `415` on most vendors), `syntax` when it could not be decoded, `required` when\n * the operation needs a body and none arrived, and `schema` for a contract violation.\n */\nexport type BodyIssue = {\n path: string\n message: string\n kind?: \"media_type\" | \"syntax\" | \"required\" | \"schema\"\n}\n\n/** What the runtime records about a request the mock rejected: never the body itself. */\nexport type UnsupportedMediaType = {\n /** The request's media type (`text/plain`), or `null` when it sent no `content-type`. */\n mediaType: string | null\n /** The media types the operation's contract accepts, as written (`application/*+json`). */\n accepted: string[]\n}\n\ntype ResolvedRequestBody = {\n required?: boolean\n content?: Record<string, { schema?: SchemaObject }>\n}\n\nconst requestBodyOf = (context: OperationContext): ResolvedRequestBody | undefined => {\n const requestBody = context.operation.operation.requestBody\n return requestBody ? (deref(context.document, requestBody) as ResolvedRequestBody) : undefined\n}\n\n/** `application/*+json` accepts `application/vnd.api+json`; a star on both sides accepts anything. */\nconst mediaTypeMatches = (accepted: string, actual: string): boolean => {\n const pattern = mediaTypeOf(accepted) ?? accepted.toLowerCase()\n if (pattern === actual || pattern === \"*/*\") return true\n const [type, subtype] = pattern.split(\"/\")\n const [actualType, actualSubtype] = actual.split(\"/\")\n if (type !== actualType && type !== \"*\") return false\n if (subtype === undefined || subtype === \"*\") return true\n if (subtype.startsWith(\"*+\")) return actualSubtype?.endsWith(subtype.slice(1)) === true\n return false\n}\n\n/**\n * Which key of the operation's `requestBody.content` the request's `content-type` selects,\n * or undefined when none matches (or the operation declares no body).\n */\nconst acceptedKeyFor = (\n content: Record<string, unknown> | undefined,\n mediaType: string | undefined,\n): string | undefined => {\n if (!content || mediaType === undefined) return undefined\n const keys = Object.keys(content)\n return (\n keys.find((key) => mediaTypeOf(key) === mediaType) ??\n keys.find((key) => mediaTypeMatches(key, mediaType))\n )\n}\n\n/**\n * The reason a request body cannot be read by this operation: its `content-type` is missing\n * or names a media type the contract does not list. Undefined when the operation declares no\n * body, the media type is accepted, or the body is empty (unless `includeEmpty`: ASP.NET\n * Core picks the input formatter from the header before looking at the body, so even an\n * empty body with no `content-type` is 415 there). A JSON body sent as `text/plain` or with\n * no header is the common case: ASP.NET Core, Spring and Rails answer it `415`, and it must\n * never read as \"request body is required\".\n */\nexport const unsupportedMediaType = (\n context: OperationContext,\n options: { includeEmpty?: boolean } = {},\n): UnsupportedMediaType | undefined => {\n if (context.body.kind === \"empty\" && options.includeEmpty !== true) return undefined\n const content = requestBodyOf(context)?.content\n if (!content || Object.keys(content).length === 0) return undefined\n const mediaType = mediaTypeOf(context.request.headers.get(\"content-type\"))\n if (acceptedKeyFor(content, mediaType) !== undefined) return undefined\n return { mediaType: mediaType ?? null, accepted: Object.keys(content) }\n}\n\n/** Issues recorded per request, for the runtime's log entry of a rejected request. */\nconst recorded = new WeakMap<Request, BodyIssue[]>()\n\n/** The issues `bodyIssues` last found for a request, if any. */\nexport const recordedIssues = (request: Request): BodyIssue[] | undefined => recorded.get(request)\n\n/**\n * Validate the decoded body against the operation's `requestBody` schema in the vendor\n * contract, for the media type the request sent (or `contentType` when it sent none that the\n * contract lists). Returns `[]` when valid, or when the operation declares no such body.\n * Services turn the issues into the vendor's own validation error shape; a `media_type`\n * issue is a body the operation cannot read at all (see `unsupportedMediaType`).\n */\nexport const bodyIssues = (\n context: OperationContext,\n contentType = \"application/json\",\n): BodyIssue[] => {\n const issues = findBodyIssues(context, contentType)\n if (issues.length > 0) recorded.set(context.request, issues)\n return issues\n}\n\nconst findBodyIssues = (context: OperationContext, contentType: string): BodyIssue[] => {\n const resolved = requestBodyOf(context)\n if (!resolved) return []\n const unsupported = unsupportedMediaType(context)\n if (unsupported) {\n return [\n {\n path: \"\",\n kind: \"media_type\",\n message:\n unsupported.mediaType === null\n ? \"request body has no content-type\"\n : `request body media type ${unsupported.mediaType} is not supported`,\n },\n ]\n }\n const key =\n acceptedKeyFor(resolved.content, mediaTypeOf(context.request.headers.get(\"content-type\"))) ??\n contentType\n const schema = resolved.content?.[key]?.schema\n if (!schema) return []\n if (context.body.kind === \"invalid\") {\n return [\n {\n path: \"\",\n kind: \"syntax\",\n message: `request body is not valid ${context.body.mediaType}`,\n },\n ]\n }\n const value =\n context.body.kind === \"json\" || context.body.kind === \"form\" || context.body.kind === \"text\"\n ? context.body.value\n : undefined\n if (value === undefined) {\n return resolved.required && context.body.kind === \"empty\"\n ? [{ path: \"\", kind: \"required\", message: \"request body is required\" }]\n : []\n }\n return validateValue(context.document, resolveSchema(context.document, schema), value).map(\n (issue) => ({ path: issue.path.join(\".\"), kind: \"schema\", message: issue.message }),\n )\n}\n\n/** Issues grouped Laravel-style: `{ \"patient.email\": [\"\u2026\"] }`. */\nexport const issuesByField = (issues: BodyIssue[]): Record<string, string[]> => {\n const out: Record<string, string[]> = {}\n for (const issue of issues) {\n const missing = /^missing required property (.+)$/.exec(issue.message)\n const field = missing\n ? [issue.path, missing[1]].filter(Boolean).join(\".\")\n : issue.path || \"body\"\n const message = missing\n ? `The ${field} field is required.`\n : `The ${field} field ${issue.message}.`\n out[field] = [...(out[field] ?? []), message]\n }\n return out\n}\n", "/**\n * The single source of time for a service.\n *\n * Every timestamp a mock writes reads from here, so a suite moves time instead of\n * sleeping: appointment windows, result delays and expiries become reachable in\n * milliseconds. A frozen clock also makes timestamps reproducible from a seed.\n */\nexport type ClockState = {\n /** Current epoch milliseconds. */\n now: number\n /** True while time does not advance on its own. */\n frozen: boolean\n /** Milliseconds a running clock adds to its underlying source. `0` while frozen. */\n offsetMs: number\n}\n\nexport type Clock = {\n now(): number\n /** Pin the clock to an exact instant, keeping it frozen if it already was. */\n set(epochMs: number): void\n /** Move the clock forward, or back with a negative delta. */\n advance(deltaMs: number): void\n /** Stop time at the current instant. */\n freeze(): void\n /** Resume from the current instant. */\n unfreeze(): void\n /** Drop back to the underlying source, live. */\n reset(): void\n state(): ClockState\n}\n\n/** A {@link Clock} over `source` (default `Date.now`), live and unfrozen. */\nexport const createClock = (source: () => number = Date.now): Clock => {\n let offsetMs = 0\n let frozenAt: number | undefined\n const now = () => frozenAt ?? source() + offsetMs\n return {\n now,\n set: (epochMs) => {\n if (frozenAt !== undefined) frozenAt = epochMs\n else offsetMs = epochMs - source()\n },\n advance: (deltaMs) => {\n if (frozenAt !== undefined) frozenAt += deltaMs\n else offsetMs += deltaMs\n },\n freeze: () => {\n frozenAt = now()\n },\n unfreeze: () => {\n if (frozenAt === undefined) return\n offsetMs = frozenAt - source()\n frozenAt = undefined\n },\n reset: () => {\n offsetMs = 0\n frozenAt = undefined\n },\n // A frozen clock does not follow its source, so it has no offset to report.\n state: () => ({\n now: now(),\n frozen: frozenAt !== undefined,\n offsetMs: frozenAt !== undefined ? 0 : offsetMs,\n }),\n }\n}\n\n/** A clock over a base clock, which can tell its own freeze from the base's. */\nexport type DerivedClock = Clock & {\n /** True while this clock itself is frozen, and so no longer follows the base. */\n pinned(): boolean\n /** Put the clock at an instant: pinned there, or following the base from there. */\n place(state: { now: number; pinned: boolean }): void\n}\n\n/**\n * A clock that follows `base` \u2014 its time, its freezes, its jumps \u2014 plus an offset and a\n * freeze of its own. Moving it never moves `base`, so a namespace can travel in time alone.\n * It reports `frozen` while either clock is, and no offset while it stands still. `moved` is\n * called after anything moves it, for whatever keeps a schedule by this clock.\n */\nexport const deriveClock = (base: Clock, moved: () => void = () => {}): DerivedClock => {\n const own = createClock(() => base.now())\n /** Tell whoever is driven by this clock that its time is no longer what it was. */\n const moving =\n <A extends unknown[]>(change: (...args: A) => void) =>\n (...args: A): void => {\n change(...args)\n moved()\n }\n return {\n ...own,\n set: moving(own.set),\n advance: moving(own.advance),\n reset: moving(own.reset),\n state: () => {\n const state = own.state()\n const frozen = state.frozen || base.state().frozen\n return { now: state.now, frozen, offsetMs: frozen ? 0 : state.offsetMs }\n },\n pinned: () => own.state().frozen,\n place: moving(({ now, pinned }) => {\n own.reset()\n // Frozen first, so the instant is set exactly instead of read back from the base.\n if (pinned) own.freeze()\n own.set(now)\n }),\n }\n}\n\n/**\n * Put a clock at an instant, frozen or running. Frozen first, so the instant is set exactly:\n * setting a live clock and freezing it afterwards reads the source again and can land a tick late.\n */\nexport const restoreClock = (clock: Clock, state: { now: number; frozen: boolean }): void => {\n clock.freeze()\n clock.set(state.now)\n if (!state.frozen) clock.unfreeze()\n}\n", "import type { FaultRule } from \"./faults.js\"\n\n/**\n * The admin controls every mock shares, as one document.\n *\n * The same shape is accepted in three places, and means the same thing in each:\n *\n * - at boot: `createRuntime({ adminControls })`, `serve --admin-controls`,\n * `MOCKINGBIRD_ADMIN_CONTROLS`\n * - over HTTP: `PUT /__admin/controls`\n * - per request: the `x-mockingbird-*` headers in {@link CONTROL_HEADERS}\n *\n * Every control is deterministic: given the same seed, clock and requests, a mock answers\n * the same bytes. Nothing here reads the wall clock or `Math.random`.\n */\n\n/** Milliseconds, or a string like `\"250ms\"`, `\"2s\"`, `\"15m\"`, `\"1h\"`, `\"3d\"`. */\nexport type Duration = number | string\n/** Epoch milliseconds, or an ISO-8601 string. */\nexport type Instant = number | string\n\n/** A control that cannot be applied: a bad value, an unknown key, a missing snapshot. */\nexport class ControlError extends RangeError {\n constructor(message: string) {\n super(message)\n this.name = \"ControlError\"\n }\n}\n\nconst UNITS: Record<string, number> = {\n ms: 1,\n s: 1000,\n m: 60_000,\n h: 3_600_000,\n d: 86_400_000,\n}\n\n/** Milliseconds from a number, a numeric string, or a duration like `\"90s\"`, `\"15m\"`, `\"2h\"`. */\nexport const parseDuration = (value: unknown): number | undefined => {\n if (typeof value === \"number\") return Number.isFinite(value) ? value : undefined\n if (typeof value !== \"string\") return undefined\n const match = /^(-?\\d+(?:\\.\\d+)?)\\s*(ms|s|m|h|d)?$/.exec(value.trim())\n if (!match) return undefined\n return Number(match[1]) * (UNITS[match[2] ?? \"ms\"] as number)\n}\n\n/** Epoch milliseconds from a number, a string of digits, or an ISO-8601 string. */\nexport const parseInstant = (value: unknown): number | undefined => {\n if (typeof value === \"number\") return Number.isFinite(value) ? value : undefined\n if (typeof value !== \"string\") return undefined\n const text = value.trim()\n if (/^-?\\d+$/.test(text)) return Number(text)\n const parsed = Date.parse(text)\n return Number.isNaN(parsed) ? undefined : parsed\n}\n\n/** {@link parseDuration}, or a {@link ControlError} naming `label`. Negative only when allowed. */\nexport const durationMs = (value: unknown, label: string, negative = false): number => {\n const parsed = parseDuration(value)\n if (parsed === undefined)\n throw new ControlError(`${label}: expected milliseconds or a duration like \"250ms\" or \"15m\"`)\n if (!negative && parsed < 0) throw new ControlError(`${label}: must not be negative`)\n return parsed\n}\n\n/** {@link parseInstant}, or a {@link ControlError} naming `label`. */\nexport const instantMs = (value: unknown, label: string): number => {\n const parsed = parseInstant(value)\n if (parsed === undefined) throw new ControlError(`${label}: expected epoch ms or ISO-8601`)\n return parsed\n}\n\n/** A string of digits is that number, so `--seed 7`, `{\"seed\": 7}` and a header agree. */\nexport const normalizeSeed = (seed: unknown, label = \"seed\"): number | string => {\n if (typeof seed === \"number\" && Number.isFinite(seed)) return seed\n if (typeof seed === \"string\" && seed !== \"\") return /^\\d+$/.test(seed) ? Number(seed) : seed\n throw new ControlError(`${label}: expected a number or a non-empty string`)\n}\n\nexport type ClockControls = {\n /** Move the clock to this instant. */\n now?: Instant\n /** Stop time. A frozen clock moves only when told to, so timestamps replay exactly. */\n frozen?: boolean\n /**\n * Step the clock forward by this much before every vendor request. With a frozen clock\n * each request still gets its own, reproducible timestamp.\n */\n autoAdvance?: Duration\n}\n\n/** How long a response takes: a fixed delay plus seeded jitter in `[0, jitter]`. */\nexport type LatencyRuleInput = { delay?: Duration; jitter?: Duration }\n\nexport type LatencyControls = LatencyRuleInput & {\n /** Per-operation overrides, keyed by operationId. A bare duration is its `delay`. */\n operations?: Record<string, Duration | LatencyRuleInput>\n}\n\n/** A fault to add: a rule (the id is assigned when omitted), or a named preset with overrides. */\nexport type FaultInput =\n | (Omit<FaultRule, \"id\"> & { id?: string })\n | ({ preset: string } & Partial<FaultRule>)\n\n/** Identifies a {@link SnapshotDocument}. */\nexport const SNAPSHOT_FORMAT = \"mockingbird.snapshot/v1\"\n\n/**\n * A namespace, as portable JSON: what `GET /__admin/snapshots/:id` returns and what\n * `PUT /__admin/snapshots/:id` and the boot `snapshot` control accept. Only `format` and\n * `records` are required, so a hand-written seed file is a valid snapshot.\n */\nexport type SnapshotDocument = {\n format: typeof SNAPSHOT_FORMAT\n /** The service that wrote it. A snapshot is rejected by any other service. */\n service?: string\n /**\n * Stored rows. `seq` orders a collection; omitted, rows keep their listed order. `raw` is\n * the stored text of a row that is not a plain record, and replaces `value` when present.\n */\n records: { collection: string; id: string; seq?: number; value?: unknown; raw?: string }[]\n /** Id counters, so the next generated id continues where the snapshot left off. */\n sequences?: { name: string; kind: string; value: number }[]\n clock?: { now: number; frozen: boolean; autoAdvanceMs?: number }\n seed?: number | string\n /** Positions of the seeded random streams. */\n rng?: { state: number; faults?: number; latency?: number }\n faults?: unknown\n latency?: unknown\n virtualTime?: boolean\n /** Quiescent webhook endpoints, delivery history and fault state. Contains private configuration. */\n webhooks?: unknown\n}\n\n/** Controls for one namespace. */\nexport type NamespaceControls = {\n /** Seeds every random choice: fault rates, jitter, and whatever the service invents. */\n seed?: number | string\n clock?: ClockControls\n /**\n * Spend injected waits (latency, fault delays, timeouts) on the mock clock instead of the\n * wall clock: the request returns at once, the clock has moved, and the journal records\n * the wait exactly. Default `false`: waits are real, so a client's own timeout can fire.\n */\n virtualTime?: boolean\n /** Baseline response time for every vendor request. A bare duration is its `delay`. */\n latency?: Duration | LatencyControls\n faults?: readonly FaultInput[]\n /** Start from this state instead of the service's own seed data. */\n snapshot?: SnapshotDocument\n}\n\n/** {@link NamespaceControls} for every namespace, with per-namespace overrides. */\nexport type MockControls = NamespaceControls & {\n /** Vendor credential \u2192 namespace, for SDKs that cannot send a namespace header. */\n credentials?: Record<string, string>\n /** Overrides for named namespaces. A key given here replaces the shared value. */\n namespaces?: Record<string, NamespaceControls>\n}\n\nconst NAMESPACE_KEYS = new Set([\"seed\", \"clock\", \"virtualTime\", \"latency\", \"faults\", \"snapshot\"])\nconst MOCK_KEYS = new Set([...NAMESPACE_KEYS, \"credentials\", \"namespaces\"])\n/**\n * What `GET /__admin/controls` reports beside the controls themselves. Accepted and ignored,\n * so what was read from one namespace can be applied to another as it is.\n */\nconst REPORTED_KEYS = new Set([\"namespace\", \"snapshots\"])\nconst REPORTED_CLOCK_KEYS = new Set([\"iso\", \"offsetMs\"])\n\n/** What a namespace, a branch, a snapshot and a fault's namespace may be called. */\nexport const KEY_PATTERN = /^[A-Za-z0-9_.-]{1,64}$/\n\nexport const isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n\nconst unknownKeys = (\n value: Record<string, unknown>,\n known: Set<string>,\n label: string,\n reported?: Set<string>,\n): void => {\n for (const key of Object.keys(value)) {\n if (!known.has(key) && !reported?.has(key))\n throw new ControlError(\n `${label}: unknown control ${JSON.stringify(key)}; expected ${[...known].join(\", \")}`,\n )\n }\n}\n\n/** A latency rule in milliseconds. */\nexport type LatencyRule = { delayMs: number; jitterMs: number }\n/** Baseline latency for a namespace, normalized. */\nexport type LatencyState = LatencyRule & { operations: Record<string, LatencyRule> }\n\nconst latencyRule = (value: unknown, label: string): LatencyRule => {\n if (!isRecord(value)) return { delayMs: durationMs(value, label), jitterMs: 0 }\n unknownKeys(value, new Set([\"delay\", \"jitter\", \"delayMs\", \"jitterMs\", \"operations\"]), label)\n return {\n delayMs: durationMs(value.delay ?? value.delayMs ?? 0, `${label}.delay`),\n jitterMs: durationMs(value.jitter ?? value.jitterMs ?? 0, `${label}.jitter`),\n }\n}\n\n/** Validate and normalize a `latency` control. */\nexport const normalizeLatency = (value: unknown, label = \"latency\"): LatencyState => {\n const base = latencyRule(value, label)\n const operations: Record<string, LatencyRule> = {}\n if (isRecord(value) && value.operations !== undefined) {\n if (!isRecord(value.operations))\n throw new ControlError(`${label}.operations: expected an object keyed by operationId`)\n for (const [operationId, rule] of Object.entries(value.operations)) {\n if (isRecord(rule) && rule.operations !== undefined)\n throw new ControlError(`${label}.operations.${operationId}: cannot nest operations`)\n operations[operationId] = latencyRule(rule, `${label}.operations.${operationId}`)\n }\n }\n return { ...base, operations }\n}\n\n/** A clock control, normalized. Absent keys leave that part of the clock alone. */\nexport type ClockPlan = { now?: number; frozen?: boolean; autoAdvanceMs?: number }\n\n/** Validate and normalize a `clock` control. Accepts the `POST /clock` spellings too. */\nexport const normalizeClock = (value: unknown, label = \"clock\"): ClockPlan => {\n if (!isRecord(value)) throw new ControlError(`${label}: expected an object`)\n unknownKeys(\n value,\n new Set([\"now\", \"set\", \"frozen\", \"freeze\", \"autoAdvance\", \"autoAdvanceMs\"]),\n label,\n REPORTED_CLOCK_KEYS,\n )\n const plan: ClockPlan = {}\n const now = value.now ?? value.set\n if (now !== undefined) plan.now = instantMs(now, `${label}.now`)\n const frozen = value.frozen ?? value.freeze\n if (frozen !== undefined) {\n if (typeof frozen !== \"boolean\") throw new ControlError(`${label}.frozen: expected a boolean`)\n plan.frozen = frozen\n }\n const auto = value.autoAdvance ?? value.autoAdvanceMs\n if (auto !== undefined) plan.autoAdvanceMs = durationMs(auto, `${label}.autoAdvance`)\n return plan\n}\n\n/** {@link NamespaceControls} with every value checked and every duration in milliseconds. */\nexport type ControlPlan = {\n seed?: number | string\n clock?: ClockPlan\n virtualTime?: boolean\n latency?: LatencyState\n faults?: readonly FaultInput[]\n snapshot?: SnapshotDocument\n}\n\n/** Check a snapshot document's shape. The runtime checks `service` when it restores one. */\nexport const assertSnapshotDocument = (value: unknown, label = \"snapshot\"): SnapshotDocument => {\n if (!isRecord(value)) throw new ControlError(`${label}: expected a snapshot document`)\n if (value.format !== SNAPSHOT_FORMAT)\n throw new ControlError(`${label}.format: expected ${JSON.stringify(SNAPSHOT_FORMAT)}`)\n if (!Array.isArray(value.records)) throw new ControlError(`${label}.records: expected a list`)\n value.records.forEach((row: unknown, index: number) => {\n if (\n !isRecord(row) ||\n typeof row.collection !== \"string\" ||\n typeof row.id !== \"string\" ||\n (row.value === undefined && typeof row.raw !== \"string\") ||\n (row.seq !== undefined && !Number.isSafeInteger(row.seq))\n )\n throw new ControlError(`${label}.records[${index}]: expected {collection, id, value, seq?}`)\n })\n if (value.sequences !== undefined) {\n if (!Array.isArray(value.sequences))\n throw new ControlError(`${label}.sequences: expected a list`)\n value.sequences.forEach((row: unknown, index: number) => {\n if (\n !isRecord(row) ||\n typeof row.name !== \"string\" ||\n typeof row.kind !== \"string\" ||\n !Number.isSafeInteger(row.value)\n )\n throw new ControlError(`${label}.sequences[${index}]: expected {name, kind, value}`)\n })\n }\n if (value.clock !== undefined) {\n if (\n !isRecord(value.clock) ||\n typeof value.clock.now !== \"number\" ||\n !Number.isFinite(value.clock.now) ||\n typeof value.clock.frozen !== \"boolean\"\n )\n throw new ControlError(`${label}.clock: expected {now, frozen}`)\n }\n return value as SnapshotDocument\n}\n\n/** Validate one namespace's controls. Fault rules are checked when they are added. */\nexport const normalizeControls = (value: unknown, label = \"controls\"): ControlPlan => {\n if (!isRecord(value)) throw new ControlError(`${label}: expected an object`)\n unknownKeys(value, NAMESPACE_KEYS, label, REPORTED_KEYS)\n const plan: ControlPlan = {}\n if (value.seed !== undefined) plan.seed = normalizeSeed(value.seed, `${label}.seed`)\n if (value.clock !== undefined) plan.clock = normalizeClock(value.clock, `${label}.clock`)\n if (value.virtualTime !== undefined) {\n if (typeof value.virtualTime !== \"boolean\")\n throw new ControlError(`${label}.virtualTime: expected a boolean`)\n plan.virtualTime = value.virtualTime\n }\n if (value.latency !== undefined)\n plan.latency = normalizeLatency(value.latency, `${label}.latency`)\n if (value.faults !== undefined) {\n if (!Array.isArray(value.faults) || !value.faults.every(isRecord))\n throw new ControlError(`${label}.faults: expected a list of fault rules`)\n plan.faults = value.faults as FaultInput[]\n }\n if (value.snapshot !== undefined)\n plan.snapshot = assertSnapshotDocument(value.snapshot, `${label}.snapshot`)\n return plan\n}\n\n/** Boot controls, checked once when the runtime is created. */\nexport type BootPlan = {\n shared: ControlPlan\n namespaces: Record<string, ControlPlan>\n credentials: Record<string, string>\n}\n\n/** Validate a boot {@link MockControls} document. */\nexport const normalizeBootControls = (value: unknown, label = \"controls\"): BootPlan => {\n if (value === undefined) return { shared: {}, namespaces: {}, credentials: {} }\n if (!isRecord(value)) throw new ControlError(`${label}: expected an object`)\n unknownKeys(value, MOCK_KEYS, label)\n const { credentials, namespaces, ...shared } = value\n const plan: BootPlan = {\n shared: normalizeControls(shared, label),\n namespaces: {},\n credentials: {},\n }\n if (namespaces !== undefined) {\n if (!isRecord(namespaces)) throw new ControlError(`${label}.namespaces: expected an object`)\n for (const [name, each] of Object.entries(namespaces)) {\n if (!KEY_PATTERN.test(name))\n throw new ControlError(`${label}.namespaces: bad namespace ${JSON.stringify(name)}`)\n plan.namespaces[name] = normalizeControls(each, `${label}.namespaces.${name}`)\n }\n }\n if (credentials !== undefined) {\n if (!isRecord(credentials)) throw new ControlError(`${label}.credentials: expected an object`)\n for (const [credential, namespace] of Object.entries(credentials)) {\n if (typeof namespace !== \"string\" || !KEY_PATTERN.test(namespace))\n throw new ControlError(`${label}.credentials: bad namespace for a credential`)\n plan.credentials[credential] = namespace\n }\n }\n return plan\n}\n\n// \u2500\u2500 request headers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n/**\n * Every header a request can carry a control in. Selection headers pick what a request\n * reads; the rest act exactly like the matching admin call made just before the request.\n */\nexport const CONTROL_HEADERS = {\n namespace: \"x-mockingbird-namespace\",\n adminKey: \"x-mockingbird-admin-key\",\n branch: \"x-mockingbird-branch\",\n at: \"x-mockingbird-at\",\n reset: \"x-mockingbird-reset\",\n restore: \"x-mockingbird-restore\",\n seed: \"x-mockingbird-seed\",\n time: \"x-mockingbird-time\",\n advance: \"x-mockingbird-advance\",\n virtualTime: \"x-mockingbird-virtual-time\",\n fault: \"x-mockingbird-fault\",\n delay: \"x-mockingbird-delay\",\n timeout: \"x-mockingbird-timeout\",\n snapshot: \"x-mockingbird-snapshot\",\n} as const\n\nexport type ControlHeaderName = keyof typeof CONTROL_HEADERS\n\n/**\n * What each control header does, in the order the runtime applies them. This list is the\n * source for `GET /__admin` and is checked against the guide in `docs/ADMIN_CONTROLS.md`.\n */\nexport const CONTROL_HEADER_REFERENCE: readonly {\n header: string\n value: string\n /** `select` picks what is read; `namespace` changes it and persists; `request` is one request. */\n scope: \"select\" | \"namespace\" | \"request\"\n /** Needs `x-mockingbird-admin-key` when the mock has an admin key. */\n guarded: boolean\n summary: string\n}[] = [\n {\n header: CONTROL_HEADERS.namespace,\n value: \"<key>\",\n scope: \"select\",\n guarded: false,\n summary:\n \"Isolation key. Each key has its own records, clock, random streams, faults, latency, journal and snapshots.\",\n },\n {\n header: CONTROL_HEADERS.branch,\n value: \"<name>\",\n scope: \"select\",\n guarded: false,\n summary: \"Read and write a named copy-on-write branch of the namespace's history.\",\n },\n {\n header: CONTROL_HEADERS.at,\n value: \"<checkpoint>\",\n scope: \"select\",\n guarded: false,\n summary: \"Read the namespace as it was at a checkpoint. With a branch, start the branch there.\",\n },\n {\n header: CONTROL_HEADERS.reset,\n value: \"true\",\n scope: \"namespace\",\n guarded: true,\n summary: \"Reset the namespace to its boot state before the request is handled.\",\n },\n {\n header: CONTROL_HEADERS.restore,\n value: \"<snapshot>\",\n scope: \"namespace\",\n guarded: true,\n summary: \"Restore a snapshot before the request is handled.\",\n },\n {\n header: CONTROL_HEADERS.seed,\n value: \"<seed>\",\n scope: \"namespace\",\n guarded: true,\n summary: \"Restart the namespace's random streams from this seed.\",\n },\n {\n header: CONTROL_HEADERS.time,\n value: \"<epoch ms | ISO-8601>\",\n scope: \"namespace\",\n guarded: true,\n summary: \"Freeze the namespace clock at this instant.\",\n },\n {\n header: CONTROL_HEADERS.advance,\n value: \"<duration>\",\n scope: \"namespace\",\n guarded: true,\n summary: \"Move the namespace clock by this much, forward or (negative) back.\",\n },\n {\n header: CONTROL_HEADERS.virtualTime,\n value: \"true | false\",\n scope: \"namespace\",\n guarded: true,\n summary: \"Spend injected waits on the mock clock (true) or the wall clock (false).\",\n },\n {\n header: CONTROL_HEADERS.delay,\n value: \"<duration>\",\n scope: \"request\",\n guarded: true,\n summary: \"Hold this response back this long, on top of the namespace's latency.\",\n },\n {\n header: CONTROL_HEADERS.timeout,\n value: \"<duration>\",\n scope: \"request\",\n guarded: true,\n summary: \"Never answer this request: hold it this long, then drop the connection.\",\n },\n {\n header: CONTROL_HEADERS.fault,\n value: '<status> | drop | <preset> | key=value; \u2026 | {\"status\": 503, \u2026}',\n scope: \"request\",\n guarded: true,\n summary: \"Fault this request only. Stored fault rules are not consulted when it answers.\",\n },\n {\n header: CONTROL_HEADERS.snapshot,\n value: \"<name>\",\n scope: \"namespace\",\n guarded: true,\n summary: \"Snapshot the namespace after the request is handled. Echoed on the response.\",\n },\n]\n\n/** The controls one request carries in its headers, parsed and checked. */\nexport type RequestControls = {\n reset?: true\n restore?: string\n seed?: number | string\n time?: number\n advance?: number\n virtualTime?: boolean\n delay?: number\n timeout?: number\n fault?: Record<string, unknown>\n snapshot?: string\n}\n\nconst flag = (value: string, header: string): boolean => {\n const text = value.trim().toLowerCase()\n if (text === \"true\" || text === \"1\") return true\n if (text === \"false\" || text === \"0\") return false\n throw new ControlError(`${header}: expected true or false`)\n}\n\nconst name = (value: string, header: string): string => {\n const text = value.trim()\n if (!KEY_PATTERN.test(text)) throw new ControlError(`${header}: must match ${KEY_PATTERN}`)\n return text\n}\n\nconst FAULT_PAIRS = new Set([\n \"status\",\n \"delay\",\n \"jitter\",\n \"timeout\",\n \"drop\",\n \"truncate\",\n \"effect\",\n \"preset\",\n \"body\",\n])\n\n/**\n * Parse an `x-mockingbird-fault` value into a fault rule (or preset reference):\n *\n * - `503` \u2014 answer with that status\n * - `drop` \u2014 drop the connection\n * - `rate_limited` \u2014 a preset, by name\n * - `status=503; delay=2s; header.retry-after=5` \u2014 `key=value` pairs\n * - `{\"status\": 503, \"body\": {\u2026}}` \u2014 a rule as JSON\n */\nexport const parseFaultHeader = (\n value: string,\n header: string = CONTROL_HEADERS.fault,\n): Record<string, unknown> => {\n const text = value.trim()\n if (text === \"\") throw new ControlError(`${header}: expected a fault`)\n if (text.startsWith(\"{\")) {\n let parsed: unknown\n try {\n parsed = JSON.parse(text)\n } catch {\n throw new ControlError(`${header}: not valid JSON`)\n }\n if (!isRecord(parsed)) throw new ControlError(`${header}: expected a JSON object`)\n return parsed\n }\n const rule: Record<string, unknown> = {}\n const headers: Record<string, string> = {}\n for (const [index, raw] of text.split(\";\").entries()) {\n const part = raw.trim()\n if (part === \"\") continue\n const equals = part.indexOf(\"=\")\n if (equals < 0) {\n if (index > 0 && part !== \"drop\")\n throw new ControlError(`${header}: expected key=value, got ${JSON.stringify(part)}`)\n if (/^\\d{3}$/.test(part)) rule.status = Number(part)\n else if (part === \"drop\") rule.drop = true\n else rule.preset = name(part, header)\n continue\n }\n const key = part.slice(0, equals).trim().toLowerCase()\n const item = part.slice(equals + 1).trim()\n if (key.startsWith(\"header.\")) headers[key.slice(\"header.\".length)] = item\n else if (!FAULT_PAIRS.has(key))\n throw new ControlError(\n `${header}: unknown key ${JSON.stringify(key)}; expected ${[...FAULT_PAIRS].join(\", \")} or header.<name>`,\n )\n else if (key === \"status\" || key === \"truncate\") {\n if (!/^\\d+$/.test(item)) throw new ControlError(`${header}: ${key} must be a number`)\n rule[key] = Number(item)\n } else if (key === \"drop\") rule.drop = flag(item, `${header} drop`)\n else rule[key] = item\n }\n if (Object.keys(headers).length > 0) rule.headers = headers\n if (Object.keys(rule).length === 0) throw new ControlError(`${header}: expected a fault`)\n return rule\n}\n\nconst GUARDED = CONTROL_HEADER_REFERENCE.filter((each) => each.guarded).map((each) => each.header)\n\n/** Whether a request carries a control that changes the mock or injects a failure. */\nexport const hasGuardedControlHeader = (headers: Headers): boolean =>\n GUARDED.some((header) => headers.has(header))\n\n/** Read a request's control headers. `undefined` when it carries none. Throws {@link ControlError}. */\nexport const parseControlHeaders = (headers: Headers): RequestControls | undefined => {\n if (!hasGuardedControlHeader(headers)) return undefined\n const controls: RequestControls = {}\n const read = (key: ControlHeaderName) => headers.get(CONTROL_HEADERS[key])\n const reset = read(\"reset\")\n if (reset !== null && flag(reset, CONTROL_HEADERS.reset)) controls.reset = true\n const restore = read(\"restore\")\n if (restore !== null) controls.restore = name(restore, CONTROL_HEADERS.restore)\n const seed = read(\"seed\")\n if (seed !== null) controls.seed = normalizeSeed(seed.trim(), CONTROL_HEADERS.seed)\n const time = read(\"time\")\n if (time !== null) controls.time = instantMs(time, CONTROL_HEADERS.time)\n const advance = read(\"advance\")\n if (advance !== null) controls.advance = durationMs(advance, CONTROL_HEADERS.advance, true)\n const virtualTime = read(\"virtualTime\")\n if (virtualTime !== null) controls.virtualTime = flag(virtualTime, CONTROL_HEADERS.virtualTime)\n const delay = read(\"delay\")\n if (delay !== null) controls.delay = durationMs(delay, CONTROL_HEADERS.delay)\n const timeout = read(\"timeout\")\n if (timeout !== null) controls.timeout = durationMs(timeout, CONTROL_HEADERS.timeout)\n const fault = read(\"fault\")\n if (fault !== null) controls.fault = parseFaultHeader(fault)\n const snapshot = read(\"snapshot\")\n if (snapshot !== null) controls.snapshot = name(snapshot, CONTROL_HEADERS.snapshot)\n return controls\n}\n\n/** What {@link controlHeaders} turns into request headers. */\nexport type ControlHeaderInput = {\n namespace?: string\n adminKey?: string\n branch?: string\n at?: string\n reset?: boolean\n restore?: string\n seed?: number | string\n time?: Instant | Date\n advance?: Duration\n virtualTime?: boolean\n delay?: Duration\n timeout?: Duration\n /** A status, `\"drop\"`, a preset name, or a fault rule. */\n fault?: number | string | Record<string, unknown>\n snapshot?: string\n}\n\n/**\n * Build the request headers for a set of controls, to spread into a `fetch` or hand to an\n * SDK's default headers. Values are checked, so a typo fails here and not as a `400` later.\n */\nexport const controlHeaders = (input: ControlHeaderInput): Record<string, string> => {\n const headers: Record<string, string> = {}\n const set = (key: ControlHeaderName, value: string) => {\n headers[CONTROL_HEADERS[key]] = value\n }\n if (input.namespace !== undefined) set(\"namespace\", name(input.namespace, \"namespace\"))\n if (input.adminKey !== undefined) set(\"adminKey\", input.adminKey)\n if (input.branch !== undefined) set(\"branch\", name(input.branch, \"branch\"))\n if (input.at !== undefined) set(\"at\", input.at)\n if (input.reset === true) set(\"reset\", \"true\")\n if (input.restore !== undefined) set(\"restore\", name(input.restore, \"restore\"))\n if (input.seed !== undefined) set(\"seed\", String(normalizeSeed(input.seed)))\n if (input.time !== undefined) {\n const time = input.time instanceof Date ? input.time.getTime() : input.time\n set(\"time\", new Date(instantMs(time, \"time\")).toISOString())\n }\n if (input.advance !== undefined)\n set(\"advance\", String(durationMs(input.advance, \"advance\", true)))\n if (input.virtualTime !== undefined) set(\"virtualTime\", String(input.virtualTime))\n if (input.delay !== undefined) set(\"delay\", String(durationMs(input.delay, \"delay\")))\n if (input.timeout !== undefined) set(\"timeout\", String(durationMs(input.timeout, \"timeout\")))\n if (input.fault !== undefined) {\n const fault =\n typeof input.fault === \"object\" ? JSON.stringify(input.fault) : String(input.fault)\n parseFaultHeader(fault, \"fault\")\n set(\"fault\", fault)\n }\n if (input.snapshot !== undefined) set(\"snapshot\", name(input.snapshot, \"snapshot\"))\n return headers\n}\n", "/**\n * Seeded pseudo-random numbers, so anything a mock invents \u2014 ids, jitter, which\n * request a percentage fault hits \u2014 is reproducible from a seed.\n *\n * mulberry32: small, fast, and stable across runtimes, which matters more here\n * than statistical quality.\n */\nexport type Rng = {\n /** Next value in `[0, 1)`. */\n next(): number\n /** Next integer in `[min, max]`. */\n int(min: number, max: number): number\n /** Restart the stream from its seed. */\n reset(): void\n /** Serializable engine state used by deterministic checkpoints. */\n state(): number\n /** Restore a state previously returned by {@link state}. */\n setState(state: number): void\n /** Restart the stream from a new seed. `reset` then returns to this seed. */\n reseed(seed: number | string): void\n /** The seed the stream currently starts from. */\n readonly seed: number\n}\n\n/** Hash an arbitrary string into a 32-bit seed, so callers can seed by name. */\nexport const seedFrom = (value: string): number => {\n let hash = 2166136261\n for (let i = 0; i < value.length; i++) {\n hash ^= value.charCodeAt(i)\n hash = Math.imul(hash, 16777619)\n }\n return hash >>> 0\n}\n\nexport const createRng = (seed: number | string = 0): Rng => {\n const toNumeric = (value: number | string) =>\n typeof value === \"string\" ? seedFrom(value) : value >>> 0\n let numeric = toNumeric(seed)\n let state = numeric\n const next = () => {\n state = (state + 0x6d2b79f5) >>> 0\n let t = state\n t = Math.imul(t ^ (t >>> 15), t | 1)\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61)\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296\n }\n return {\n next,\n int: (min, max) => min + Math.floor(next() * (max - min + 1)),\n reset: () => {\n state = numeric\n },\n state: () => state,\n setState: (next) => {\n if (!Number.isSafeInteger(next) || next < 0 || next > 0xffffffff) {\n throw new RangeError(\"rng state must be an unsigned 32-bit integer\")\n }\n state = next >>> 0\n },\n reseed: (next) => {\n numeric = toNumeric(next)\n state = numeric\n },\n get seed() {\n return numeric\n },\n }\n}\n", "import {\n ControlError,\n type Duration,\n durationMs,\n type Instant,\n isRecord,\n KEY_PATTERN,\n parseDuration,\n parseInstant,\n} from \"./controls.js\"\nimport { createRng, type Rng } from \"./rng.js\"\n\n/**\n * A deliberate failure injected in front of an operation.\n *\n * This is how a suite reaches the vendor's failure modes without the vendor: the\n * quota error that only appears when a shared sandbox is full, the 429 that only\n * appears under load, the 5xx that proves a retry path works.\n *\n * A rule has three parts. What it **matches** (`operationId`, `method`, `path`, \u2026), **when**\n * it fires among the matching requests (`after`, `every`, `count`, `rate`, `from`, `until`),\n * and what it **does** (`status`, `delay`, `timeout`, `drop`, `truncate`, `effect`).\n */\nexport type FaultRule = {\n /** Stable id, so a suite can retire exactly the rule it added. Unique within a namespace. */\n id: string\n\n /** Fault only this operation. Omit to match every operation. */\n operationId?: string\n /** Fault only this HTTP method, case-insensitive. Omit to match every method. */\n method?: string\n /** Fault only this exact path. */\n path?: string\n /** Fault only paths starting with this prefix. Omit to match every path. */\n pathPrefix?: string\n /** Fault only paths matching this regular expression (JavaScript syntax, unanchored). */\n pathPattern?: string\n /** Fault only requests carrying these headers. `\"*\"` matches any value. */\n requestHeaders?: Record<string, string>\n /** Fault only requests carrying these query parameters. `\"*\"` matches any value. */\n query?: Record<string, string>\n /**\n * Fault only requests whose JSON body carries these fields. Each key is a dotted path into\n * the parsed body (`\"patient_details.email\"`; a number steps into an array, `\"items.0.sku\"`)\n * and each value is what the field must equal: a string, number, boolean or `null`, compared\n * strictly (`3` is not `\"3\"`). `\"*\"` matches any value that is present. A request whose body\n * is missing, is not JSON, or is not a JSON object never matches. Not `body`, which is the\n * response a rule injects.\n */\n requestBody?: Record<string, RequestBodyValue>\n /**\n * Fault only this namespace. Omit (or `\"*\"`) to fault every namespace \u2014 which is what\n * an in-process caller usually wants, and what a parallel worker usually does not:\n * rules added through `POST /__admin/faults` default to the calling namespace.\n */\n namespace?: string\n\n /** Let this many matching requests through first. */\n after?: number\n /** Then fault only every nth matching request: `3` faults the 3rd, 6th, 9th. */\n every?: number\n /** Retire the rule after this many faults. Omit to keep it until removed. */\n count?: number\n /** Fault this fraction of the remaining requests, `0`\u2013`1`, drawn from the seed. Default `1`. */\n rate?: number\n /**\n * Fault only from this instant on the namespace clock. A duration (`\"5m\"`) counts from the\n * clock when the rule was added. Listed as epoch ms.\n */\n from?: Instant | Duration\n /** Stop faulting at this instant on the namespace clock. A duration counts from when added. */\n until?: Instant | Duration\n\n /**\n * Status of the injected response. Omit for a rule that only delays, times out, drops,\n * truncates, or switches on an `effect`: the request then still reaches the service.\n */\n status?: number\n /** Response body, serialized as JSON. A string is sent as-is. */\n body?: unknown\n /** Response headers. */\n headers?: Record<string, string>\n /** Hold the response back this long. Listed as `delayMs`. */\n delay?: Duration\n /** `delay`, in milliseconds. */\n delayMs?: number\n /** Alias of `delayMs`. */\n latencyMs?: number\n /** Extra seeded delay in `[0, jitter]`. Listed as `jitterMs`. */\n jitter?: Duration\n jitterMs?: number\n /**\n * Never answer: hold the request this long, then drop the connection. Listed as\n * `timeoutMs`. With virtual time the wait is spent on the mock clock.\n */\n timeout?: Duration\n timeoutMs?: number\n /**\n * Drop the connection instead of answering: an in-process `fetch` rejects with a\n * `TypeError`, and a served mock destroys the socket. Models \"unknown outcome\" failures.\n */\n drop?: boolean\n /**\n * Cut the response body off after this many bytes: the status and headers arrive, then\n * the connection dies mid-body.\n */\n truncate?: number\n /**\n * A named service behaviour to switch on for the matching request instead of (or\n * before) a canned response, e.g. `created_but_500` or `numeric_tracking_id`. Services\n * read it with `faultEffects(request)`.\n */\n effect?: string\n /** Parameters for `effect`. */\n params?: Record<string, unknown>\n /** The preset this rule was expanded from, if any. */\n fromPreset?: string\n}\n\n/** What a field of the request body must equal in {@link FaultRule.requestBody}. */\nexport type RequestBodyValue = string | number | boolean | null\n\n/** A fault that fired for one request. */\nexport type FaultHit = {\n id: string\n /** The injected response; absent when the rule only delays, drops, or sets an effect. */\n response?: Response\n drop?: boolean\n /** Set with `drop` when the rule held the request for its `timeout` first. */\n timeout?: boolean\n /** Bytes of response body to let through before the connection dies. */\n truncate?: number\n effect?: { name: string; params: Record<string, unknown> }\n}\n\n/**\n * A named, documented fault a suite switches on by name\n * (`POST /__admin/faults {\"preset\": \"rate_limited\"}`): one or more rules, and optionally a\n * webhook delivery fault.\n */\nexport type FaultPreset = {\n description: string\n rules?: Omit<FaultRule, \"id\">[]\n webhook?: { mode: \"duplicate\" | \"reorder\" | \"drop\"; count?: number }\n}\n\n/**\n * Presets every mock answers to, so a suite uses one vocabulary across vendors. A service\n * preset of the same name replaces the standard one with the vendor's own error body.\n */\nexport const STANDARD_FAULT_PRESETS: Record<string, FaultPreset> = {\n server_error: {\n description: \"The vendor answers 500.\",\n rules: [{ status: 500 }],\n },\n bad_gateway: {\n description: \"A proxy in front of the vendor answers 502.\",\n rules: [{ status: 502 }],\n },\n unavailable: {\n description: \"The vendor is down: 503 with retry-after.\",\n rules: [{ status: 503, headers: { \"retry-after\": \"1\" } }],\n },\n gateway_timeout: {\n description: \"A proxy gives up on the vendor: 504.\",\n rules: [{ status: 504 }],\n },\n rate_limited: {\n description: \"Too many requests: 429 with retry-after.\",\n rules: [{ status: 429, headers: { \"retry-after\": \"1\" } }],\n },\n unauthorized: {\n description: \"The credential is rejected: 401.\",\n rules: [{ status: 401 }],\n },\n forbidden: {\n description: \"The credential lacks permission: 403.\",\n rules: [{ status: 403 }],\n },\n slow: {\n description: \"Every response takes two more seconds.\",\n rules: [{ delayMs: 2_000 }],\n },\n timeout: {\n description:\n \"The vendor never answers: the request hangs 30 seconds, then the connection drops.\",\n rules: [{ timeoutMs: 30_000 }],\n },\n connection_reset: {\n description: \"The connection dies before any response.\",\n rules: [{ drop: true }],\n },\n truncated_response: {\n description: \"The response starts, then the connection dies mid-body.\",\n rules: [{ truncate: 0 }],\n },\n flaky: {\n description: \"Half of the requests answer 503, chosen by the seed.\",\n rules: [{ status: 503, rate: 0.5 }],\n },\n}\n\n/**\n * Body of `GET /__admin/faults/presets`.\n * `presets` is a list of named presets. A record keyed by name is not this type:\n * the admin page maps the list.\n */\nexport type FaultPresetList = {\n presets: readonly { name: string }[]\n}\n\ntype _AssertFaultPresetList<T extends FaultPresetList> = T\n// @ts-expect-error presets is a list of { name }, not a record keyed by name\ntype _RecordIsNotAPresetList = _AssertFaultPresetList<{ presets: Record<string, { name: string }> }>\n\n/** What a request looks like to the fault matcher. */\nexport type FaultCandidate = {\n operationId: string | undefined\n method: string\n path: string\n namespace: string\n /** Request headers and query, for rules that match on them. */\n headers?: Headers\n query?: URLSearchParams\n /**\n * The request body parsed as JSON, read only when a rule matches on `requestBody`. Resolve\n * `undefined` for a body that is missing or not JSON. It must leave the request readable.\n */\n readJson?: () => Promise<unknown>\n /** The namespace clock, for `from` / `until`. Rules with a window are skipped without it. */\n now?: number\n /** How to spend a delay for this request. Default: the registry's own sleep. */\n wait?: (ms: number) => Promise<void>\n}\n\n/** A stored rule and how often it was consulted. */\nexport type FaultListing = FaultRule & {\n /** Faults left before the rule retires. `null` when it has no `count`. */\n remaining: number | null\n /** Times the rule faulted a request. */\n hits: number\n /** Requests that matched the rule, faulted or not. */\n seen: number\n}\n\n/** A namespace's own rules, with their counters, in the order they are tried. */\nexport type FaultSnapshot = {\n /**\n * `position` is how many `\"*\"` rules are tried before the rule, which is what its place\n * in the order means to a request and holds in any process.\n */\n rules: (FaultListing & { position?: number })[]\n /** How many `fault_<n>` ids the namespace has handed out. */\n nextId?: number\n}\n\nexport type FaultRegistry = {\n snapshot(namespace: string): FaultSnapshot\n /** Add a rule, or replace the rule with the same id in the same namespace. */\n add(rule: FaultRule): FaultRule\n /** The next unused `fault_<n>` id in `namespace`. */\n nextId(namespace: string): string\n /** Every rule, or the rules a namespace's requests can hit: its own and the global ones. */\n list(namespace?: string): FaultListing[]\n get(id: string, namespace?: string): FaultListing | undefined\n /** Remove a rule by id: from `namespace` (its own, then a global one), or wherever it is. */\n remove(id: string, namespace?: string): boolean\n /** Remove every rule, or one namespace's own rules. */\n clear(namespace?: string): void\n /** Replace a namespace's own rules with a snapshot's, wherever the snapshot was taken. */\n restore(namespace: string, state: FaultSnapshot): void\n /**\n * Every fault this request should get, in rule order, stopping at the first that answers\n * or drops (effect-only and delay-only rules let later rules match too). Consumes one of\n * each matching rule's remaining uses.\n */\n take(candidate: FaultCandidate): Promise<FaultHit[]>\n /**\n * Fire these rules at one request without storing them: no matching, no schedule, in order,\n * stopping at the first that answers or drops. Jitter draws from the namespace's stream.\n */\n fire(rules: readonly FaultRule[], candidate: FaultCandidate): Promise<FaultHit[]>\n}\n\n/** The namespace of a rule that faults every namespace. */\nconst GLOBAL = \"*\"\n\nconst RULE_KEYS = new Set([\n \"id\",\n \"operationId\",\n \"method\",\n \"path\",\n \"pathPrefix\",\n \"pathPattern\",\n \"requestHeaders\",\n \"query\",\n \"requestBody\",\n \"namespace\",\n \"after\",\n \"every\",\n \"count\",\n \"rate\",\n \"from\",\n \"until\",\n \"status\",\n \"body\",\n \"headers\",\n \"delay\",\n \"delayMs\",\n \"latencyMs\",\n \"jitter\",\n \"jitterMs\",\n \"timeout\",\n \"timeoutMs\",\n \"drop\",\n \"truncate\",\n \"effect\",\n \"params\",\n \"fromPreset\",\n])\n/** Counters a listed rule carries. Accepted and ignored, so a listing can be applied again. */\nconst LISTING_KEYS = new Set([\"remaining\", \"hits\", \"seen\"])\n\nconst stringMap = (value: unknown, label: string): Record<string, string> => {\n if (!isRecord(value) || !Object.values(value).every((each) => typeof each === \"string\"))\n throw new ControlError(`${label}: expected an object of strings`)\n return value as Record<string, string>\n}\n\nconst requestBodyMap = (value: unknown): Record<string, RequestBodyValue> => {\n if (!isRecord(value)) throw new ControlError(\"fault.requestBody: expected an object\")\n for (const [path, expected] of Object.entries(value)) {\n if (path === \"\" || path.split(\".\").includes(\"\"))\n throw new ControlError(`fault.requestBody: ${JSON.stringify(path)} is not a dotted path`)\n const scalar =\n expected === null ||\n typeof expected === \"string\" ||\n typeof expected === \"boolean\" ||\n (typeof expected === \"number\" && Number.isFinite(expected))\n if (!scalar)\n throw new ControlError(\n `fault.requestBody.${path}: expected a string, number, boolean or null`,\n )\n }\n return value as Record<string, RequestBodyValue>\n}\n\nconst count = (value: unknown, label: string, min: number): number => {\n if (typeof value !== \"number\" || !Number.isSafeInteger(value) || value < min)\n throw new ControlError(`${label}: expected an integer of at least ${min}`)\n return value\n}\n\n/** An instant, or a duration counted from `now`. A bare number is always an instant. */\nconst windowEdge = (value: unknown, label: string, now: number | undefined): number => {\n if (typeof value === \"string\" && /[a-z]\\s*$/i.test(value) && !/[T:Z]/.test(value)) {\n const relative = parseDuration(value)\n if (relative !== undefined) {\n if (now === undefined) throw new ControlError(`${label}: a duration needs a clock`)\n return now + relative\n }\n }\n const instant = parseInstant(value)\n if (instant === undefined)\n throw new ControlError(`${label}: expected epoch ms, ISO-8601, or a duration like \"5m\"`)\n return instant\n}\n\n/** Whether a rule does anything at all when it fires. */\nexport const faultHasAction = (rule: Partial<FaultRule>): boolean =>\n rule.status !== undefined ||\n (rule.delayMs ?? 0) > 0 ||\n (rule.jitterMs ?? 0) > 0 ||\n rule.timeoutMs !== undefined ||\n rule.drop === true ||\n rule.truncate !== undefined ||\n rule.effect !== undefined\n\n/**\n * Check a fault rule and put it in its stored form: durations in milliseconds\n * (`delayMs`, `jitterMs`, `timeoutMs`), windows as epoch ms. Throws {@link ControlError}.\n *\n * `strict` rejects unknown keys, so a typo in a request body is an error and not a rule\n * that silently never matches.\n */\nexport const normalizeFault = (\n input: unknown,\n context: { id?: string; namespace?: string; now?: number; strict?: boolean } = {},\n): FaultRule => {\n if (!isRecord(input)) throw new ControlError(\"fault: expected an object\")\n if (context.strict) {\n for (const key of Object.keys(input)) {\n if (!RULE_KEYS.has(key) && !LISTING_KEYS.has(key))\n throw new ControlError(`fault: unknown field ${JSON.stringify(key)}`)\n }\n }\n const id = input.id ?? context.id\n if (typeof id !== \"string\" || id === \"\") throw new ControlError(\"fault.id: expected a string\")\n const rule: FaultRule = { id }\n for (const key of [\n \"operationId\",\n \"method\",\n \"path\",\n \"pathPrefix\",\n \"effect\",\n \"fromPreset\",\n ] as const) {\n const value = input[key]\n if (value === undefined) continue\n if (typeof value !== \"string\") throw new ControlError(`fault.${key}: expected a string`)\n rule[key] = value\n }\n if (input.pathPattern !== undefined) {\n if (typeof input.pathPattern !== \"string\")\n throw new ControlError(\"fault.pathPattern: expected a string\")\n try {\n new RegExp(input.pathPattern)\n } catch {\n throw new ControlError(\"fault.pathPattern: not a valid regular expression\")\n }\n rule.pathPattern = input.pathPattern\n }\n if (input.requestHeaders !== undefined)\n rule.requestHeaders = Object.fromEntries(\n Object.entries(stringMap(input.requestHeaders, \"fault.requestHeaders\")).map(([k, v]) => [\n k.toLowerCase(),\n v,\n ]),\n )\n if (input.query !== undefined) rule.query = stringMap(input.query, \"fault.query\")\n if (input.requestBody !== undefined) rule.requestBody = requestBodyMap(input.requestBody)\n const namespace = input.namespace ?? context.namespace\n if (namespace !== undefined) {\n // A rule for a namespace that cannot exist would be stored and never fire.\n if (typeof namespace !== \"string\" || (namespace !== GLOBAL && !KEY_PATTERN.test(namespace)))\n throw new ControlError(`fault.namespace: expected \"*\" or a key matching ${KEY_PATTERN}`)\n rule.namespace = namespace\n }\n if (input.after !== undefined) rule.after = count(input.after, \"fault.after\", 0)\n if (input.every !== undefined) rule.every = count(input.every, \"fault.every\", 1)\n if (input.count !== undefined) rule.count = count(input.count, \"fault.count\", 0)\n if (input.rate !== undefined) {\n if (typeof input.rate !== \"number\" || !(input.rate >= 0 && input.rate <= 1))\n throw new ControlError(\"fault.rate: expected a number from 0 to 1\")\n rule.rate = input.rate\n }\n if (input.from !== undefined) rule.from = windowEdge(input.from, \"fault.from\", context.now)\n if (input.until !== undefined) rule.until = windowEdge(input.until, \"fault.until\", context.now)\n if (input.status !== undefined) {\n if (\n typeof input.status !== \"number\" ||\n !Number.isInteger(input.status) ||\n input.status < 200 ||\n input.status > 599\n )\n throw new ControlError(\"fault.status: expected an HTTP status from 200 to 599\")\n rule.status = input.status\n }\n if (input.body !== undefined) rule.body = input.body\n if (input.headers !== undefined) rule.headers = stringMap(input.headers, \"fault.headers\")\n const delay = input.delay ?? input.delayMs ?? input.latencyMs\n if (delay !== undefined) rule.delayMs = durationMs(delay, \"fault.delay\")\n const jitter = input.jitter ?? input.jitterMs\n if (jitter !== undefined) rule.jitterMs = durationMs(jitter, \"fault.jitter\")\n const timeout = input.timeout ?? input.timeoutMs\n if (timeout !== undefined) rule.timeoutMs = durationMs(timeout, \"fault.timeout\")\n if (input.drop !== undefined) {\n if (typeof input.drop !== \"boolean\") throw new ControlError(\"fault.drop: expected a boolean\")\n if (input.drop) rule.drop = true\n }\n if (input.truncate !== undefined) rule.truncate = count(input.truncate, \"fault.truncate\", 0)\n if (input.params !== undefined) {\n if (!isRecord(input.params)) throw new ControlError(\"fault.params: expected an object\")\n rule.params = input.params\n }\n return rule\n}\n\ntype Entry = {\n rule: FaultRule\n scope: string\n remaining: number | null\n hits: number\n seen: number\n pattern: RegExp | undefined\n}\n\nconst scopeOf = (rule: FaultRule): string =>\n rule.namespace === undefined || rule.namespace === GLOBAL ? GLOBAL : rule.namespace\n\nconst matchesAll = (\n wanted: Record<string, string> | undefined,\n read: (name: string) => string | null | undefined,\n): boolean => {\n if (!wanted) return true\n for (const [key, value] of Object.entries(wanted)) {\n const actual = read(key)\n if (actual === null || actual === undefined) return false\n if (value !== \"*\" && actual !== value) return false\n }\n return true\n}\n\n/** The value at a dotted path of a parsed JSON body; `undefined` when any step is missing. */\nconst field = (body: unknown, path: string): unknown => {\n let at = body\n for (const step of path.split(\".\")) {\n if (Array.isArray(at)) {\n if (!/^(0|[1-9]\\d*)$/.test(step)) return undefined\n at = at[Number(step)]\n } else if (isRecord(at) && Object.hasOwn(at, step)) at = at[step]\n else return undefined\n }\n return at\n}\n\n/** Whether the parsed body has every field `wanted` names. Only a JSON object can. */\nconst bodyMatches = (wanted: Record<string, RequestBodyValue>, body: unknown): boolean => {\n if (!isRecord(body)) return false\n for (const [path, expected] of Object.entries(wanted)) {\n const actual = field(body, path)\n if (actual === undefined) return false\n if (expected !== \"*\" && actual !== expected) return false\n }\n return true\n}\n\nconst matches = (entry: Entry, candidate: FaultCandidate, body: { value: unknown }): boolean => {\n const { rule } = entry\n if (entry.scope !== GLOBAL && entry.scope !== candidate.namespace) return false\n if (rule.operationId !== undefined && rule.operationId !== candidate.operationId) return false\n if (rule.method !== undefined && rule.method.toUpperCase() !== candidate.method.toUpperCase()) {\n return false\n }\n if (rule.path !== undefined && rule.path !== candidate.path) return false\n if (rule.pathPrefix !== undefined && !candidate.path.startsWith(rule.pathPrefix)) return false\n if (entry.pattern && !entry.pattern.test(candidate.path)) return false\n if (!matchesAll(rule.requestHeaders, (name) => candidate.headers?.get(name))) return false\n if (!matchesAll(rule.query, (name) => candidate.query?.get(name))) return false\n if (rule.requestBody && !bodyMatches(rule.requestBody, body.value)) return false\n if (rule.from !== undefined || rule.until !== undefined) {\n if (candidate.now === undefined) return false\n if (rule.from !== undefined && candidate.now < (rule.from as number)) return false\n if (rule.until !== undefined && candidate.now >= (rule.until as number)) return false\n }\n return true\n}\n\n/** The response a rule with a `status` answers with. */\nexport const faultResponse = (rule: FaultRule): Response => {\n const status = rule.status ?? 500\n const headers = { \"content-type\": \"application/json\", ...rule.headers }\n if (typeof rule.body === \"string\") return new Response(rule.body, { status, headers })\n if (rule.body === null) return new Response(null, { status, headers: rule.headers ?? {} })\n const body = rule.body === undefined ? { detail: \"Injected by Mockingbird\" } : rule.body\n return new Response(JSON.stringify(body), { status, headers })\n}\n\nconst listing = (entry: Entry): FaultListing => ({\n ...entry.rule,\n remaining: entry.remaining,\n hits: entry.hits,\n seen: entry.seen,\n})\n\n/**\n * Rules are matched in the order they were added, so a narrow rule added first\n * wins over a later catch-all. `rate` and `jitter` draw from a seeded stream per namespace,\n * so a partial-failure run replays identically whatever other namespaces are doing.\n *\n * `random` is that stream: a function from namespace to stream, owned by the caller, which\n * the registry draws from and never seeds or rewinds. A single stream is accepted too, for a\n * registry used on its own: it serves `default`, and every other namespace gets a stream of\n * its own from the same seed.\n */\nexport const createFaultRegistry = (\n random: Rng | ((namespace: string) => Rng) = createRng(0),\n sleep: (ms: number) => Promise<void> = (ms) => new Promise((resolve) => setTimeout(resolve, ms)),\n): FaultRegistry => {\n const entries: Entry[] = []\n const counters = new Map<string, number>()\n const own = new Map<string, Rng>()\n const stream =\n typeof random === \"function\"\n ? random\n : (namespace: string): Rng => {\n if (namespace === \"default\") return random\n let found = own.get(namespace)\n if (!found) {\n found = createRng(random.seed)\n own.set(namespace, found)\n }\n return found\n }\n const toEntry = (input: FaultRule, previous?: Partial<Entry>): Entry => {\n const rule = normalizeFault(input)\n return {\n rule,\n scope: scopeOf(rule),\n remaining: previous?.remaining !== undefined ? previous.remaining : (rule.count ?? null),\n hits: previous?.hits ?? 0,\n seen: previous?.seen ?? 0,\n pattern: rule.pathPattern !== undefined ? new RegExp(rule.pathPattern) : undefined,\n }\n }\n const find = (id: string, namespace?: string): number => {\n if (namespace === undefined) return entries.findIndex((e) => e.rule.id === id)\n const mine = entries.findIndex((e) => e.rule.id === id && e.scope === namespace)\n return mine >= 0 ? mine : entries.findIndex((e) => e.rule.id === id && e.scope === GLOBAL)\n }\n const drop = (namespace: string): void => {\n for (let i = entries.length - 1; i >= 0; i--)\n if (entries[i]?.scope === namespace) entries.splice(i, 1)\n }\n return {\n snapshot(namespace) {\n const rules: FaultSnapshot[\"rules\"] = []\n let globals = 0\n for (const entry of entries) {\n if (entry.scope === GLOBAL) globals++\n else if (entry.scope === namespace) rules.push({ ...listing(entry), position: globals })\n }\n return { rules: structuredClone(rules), nextId: counters.get(namespace) ?? 0 }\n },\n add(input) {\n const entry = toEntry(input)\n const existing = entries.findIndex(\n (e) => e.rule.id === entry.rule.id && e.scope === entry.scope,\n )\n if (existing >= 0) entries[existing] = entry\n else entries.push(entry)\n return entry.rule\n },\n nextId(namespace) {\n let next = counters.get(namespace) ?? 0\n let id: string\n do {\n next++\n id = `fault_${next}`\n } while (entries.some((e) => e.rule.id === id && e.scope === namespace))\n counters.set(namespace, next)\n return id\n },\n list: (namespace) =>\n entries\n .filter((e) => namespace === undefined || e.scope === namespace || e.scope === GLOBAL)\n .map(listing),\n get(id, namespace) {\n const entry = entries[find(id, namespace)]\n return entry ? listing(entry) : undefined\n },\n remove(id, namespace) {\n const index = find(id, namespace)\n if (index < 0) return false\n entries.splice(index, 1)\n return true\n },\n clear(namespace) {\n if (namespace === undefined) {\n entries.length = 0\n counters.clear()\n // A registry given one stream owns it, and starts it over with the rules.\n if (typeof random !== \"function\") random.reset()\n own.clear()\n return\n }\n drop(namespace)\n counters.delete(namespace)\n },\n restore(namespace, state) {\n drop(namespace)\n for (const { remaining, hits, seen, position, ...rule } of state.rules) {\n const entry = toEntry({ ...rule, namespace }, { remaining, hits, seen })\n // Back where it stood among the global rules: ahead of the one that followed it.\n let globals = 0\n let index = entries.length\n if (position !== undefined) {\n for (const [at, each] of entries.entries()) {\n if (each.scope !== GLOBAL) continue\n if (globals === position) {\n index = at\n break\n }\n globals++\n }\n }\n entries.splice(index, 0, entry)\n }\n counters.set(namespace, state.nextId ?? 0)\n },\n async take(candidate) {\n const hits: FaultHit[] = []\n const wait = candidate.wait ?? sleep\n const draw = stream(candidate.namespace)\n // Parsed once, and only if a rule that reaches the body gets this far.\n const body: { value: unknown } = { value: undefined }\n let read = false\n // A copy: a rule added while this request waits must not join it halfway.\n for (const entry of [...entries]) {\n if (entry.remaining === 0) continue\n if (entry.rule.requestBody && !read) {\n read = true\n body.value = await candidate.readJson?.().catch(() => undefined)\n }\n if (!matches(entry, candidate, body)) continue\n const { rule } = entry\n entry.seen++\n const position = entry.seen - (rule.after ?? 0)\n if (position <= 0) continue\n if (rule.every !== undefined && position % rule.every !== 0) continue\n // Draw even when the rule always fires, so a seeded stream stays aligned.\n if (draw.next() >= (rule.rate ?? 1)) continue\n entry.hits++\n if (entry.remaining !== null) entry.remaining--\n const hit = await act(rule, draw, wait)\n hits.push(hit)\n if (hit.drop || hit.response) break\n }\n return hits\n },\n async fire(rules, candidate) {\n const hits: FaultHit[] = []\n for (const rule of rules) {\n const hit = await act(rule, stream(candidate.namespace), candidate.wait ?? sleep)\n hits.push(hit)\n if (hit.drop || hit.response) break\n }\n return hits\n },\n }\n}\n\n/** Do what a rule that fired says: wait, then answer, drop, or let the request through. */\nconst act = async (\n rule: FaultRule,\n draw: Rng,\n wait: (ms: number) => Promise<void>,\n): Promise<FaultHit> => {\n const jitter = (rule.jitterMs ?? 0) > 0 ? draw.int(0, Math.floor(rule.jitterMs ?? 0)) : 0\n const delay = (rule.delayMs ?? 0) + jitter\n if (delay > 0) await wait(delay)\n const hit: FaultHit = { id: rule.id }\n if (rule.effect !== undefined) hit.effect = { name: rule.effect, params: rule.params ?? {} }\n if (rule.truncate !== undefined) hit.truncate = rule.truncate\n if (rule.timeoutMs !== undefined) {\n if (rule.timeoutMs > 0) await wait(rule.timeoutMs)\n hit.drop = true\n hit.timeout = true\n } else if (rule.drop === true) hit.drop = true\n else if (rule.status !== undefined) hit.response = faultResponse(rule)\n return hit\n}\n", "import type { LatencyRule, LatencyState } from \"./controls.js\"\nimport type { Rng } from \"./rng.js\"\n\n/**\n * Baseline response time, per namespace: how long every vendor request takes before any\n * fault is considered. Jitter draws from a stream the caller owns, one per namespace and\n * separate from the fault stream, so adding latency never shifts which requests a `rate`\n * fault hits.\n */\nexport type LatencyRegistry = {\n get(namespace: string): LatencyState\n set(namespace: string, state: LatencyState): LatencyState\n /** Remove one namespace's latency, or every namespace's. */\n clear(namespace?: string): void\n /** Milliseconds this request waits. Draws jitter, so call it once per request. */\n take(namespace: string, operationId: string | undefined): number\n}\n\nconst NONE: LatencyState = Object.freeze({ delayMs: 0, jitterMs: 0, operations: {} })\n\nconst copy = (state: LatencyState): LatencyState => ({\n delayMs: state.delayMs,\n jitterMs: state.jitterMs,\n operations: Object.fromEntries(\n Object.entries(state.operations).map(([id, rule]) => [id, { ...rule }]),\n ),\n})\n\n/** `random` is the namespace's jitter stream. The registry never seeds or rewinds it. */\nexport const createLatencyRegistry = (random: (namespace: string) => Rng): LatencyRegistry => {\n const states = new Map<string, LatencyState>()\n return {\n get: (namespace) => copy(states.get(namespace) ?? NONE),\n set(namespace, state) {\n states.set(namespace, copy(state))\n return copy(state)\n },\n clear(namespace) {\n if (namespace === undefined) states.clear()\n else states.delete(namespace)\n },\n take(namespace, operationId) {\n const state = states.get(namespace)\n if (!state) return 0\n const rule: LatencyRule =\n (operationId !== undefined ? state.operations[operationId] : undefined) ?? state\n // Whole milliseconds, inclusive of both ends, so a jitter of 1 can still be 0 or 1.\n const jitter = rule.jitterMs > 0 ? random(namespace).int(0, Math.floor(rule.jitterMs)) : 0\n return rule.delayMs + jitter\n },\n }\n}\n", "import type { Clock, ClockState } from \"./clock.js\"\nimport {\n type BootPlan,\n type ClockPlan,\n ControlError,\n type ControlPlan,\n isRecord,\n type LatencyState,\n normalizeSeed,\n type SnapshotDocument,\n} from \"./controls.js\"\nimport {\n createFaultRegistry,\n type FaultListing,\n type FaultPreset,\n type FaultRegistry,\n type FaultRule,\n type FaultSnapshot,\n faultHasAction,\n normalizeFault,\n STANDARD_FAULT_PRESETS,\n} from \"./faults.js\"\nimport { createLatencyRegistry, type LatencyRegistry } from \"./latency.js\"\nimport { createRng, type Rng } from \"./rng.js\"\n\n/** The controls of a namespace that are plain settings, not registries. */\nexport type ControlSettings = {\n seed: number | string\n virtualTime: boolean\n autoAdvanceMs: number\n}\n\n/** Clock state as the admin API reports it. */\nexport type ControlClock = ClockState & {\n /** `now`, as ISO-8601. */\n iso: string\n /** Milliseconds the clock steps before every vendor request. */\n autoAdvanceMs: number\n}\n\n/** One namespace's controls: the body of `GET /__admin/controls`. */\nexport type ControlState = {\n namespace: string\n seed: number | string\n clock: ControlClock\n virtualTime: boolean\n latency: LatencyState\n faults: FaultListing[]\n}\n\n/**\n * A namespace's controls as a snapshot holds them. Every part is optional: restoring puts\n * back what is there and leaves the rest of the namespace as it is.\n */\nexport type ControlsSnapshot = {\n settings?: Partial<ControlSettings>\n /** Where the fault and latency streams stand. */\n streams?: { faults?: number; latency?: number }\n faults?: FaultSnapshot\n latency?: LatencyState\n}\n\n/** A change to a clock: {@link ClockPlan} plus the one-shot moves `POST /clock` accepts. */\nexport type ClockChange = ClockPlan & { advanceMs?: number; reset?: boolean }\n\n/** What a reboot puts back: everything a boot snapshot holds, or only its controls. */\nexport type BootScope = \"all\" | \"controls\"\n\nexport type NamespaceControls = {\n readonly faults: FaultRegistry\n readonly latency: LatencyRegistry\n /** Standard presets, with the service's own taking precedence. */\n readonly presets: Readonly<Record<string, FaultPreset>>\n /** Boot the namespace the first time it is used. Idempotent. */\n ensure(namespace: string): void\n settings(namespace: string): Readonly<ControlSettings>\n clock(namespace: string): ControlClock\n describe(namespace: string): ControlState\n /** Throw {@link ControlError} unless every part of `plan` can be applied. Changes nothing. */\n check(plan: ControlPlan): void\n /**\n * Apply seed, clock, virtual time, latency and faults. A given key replaces that control.\n * The whole plan is checked first, so a plan that is rejected has changed nothing.\n */\n apply(namespace: string, plan: ControlPlan): void\n changeClock(namespace: string, change: ClockChange): ControlClock\n /** Add one fault from an untrusted body: a rule, or `{\"preset\": \"<name>\", \u2026overrides}`. */\n addFault(namespace: string, input: unknown): FaultRule[]\n /** The rules one request scripts for itself in its headers. Nothing is stored. */\n scriptFaults(\n namespace: string,\n request: { fault?: Record<string, unknown>; timeoutMs?: number },\n ): FaultRule[]\n /** Restart every random stream of a namespace from `seed`. */\n reseed(namespace: string, seed: number | string): void\n /** Put a namespace back to what it was at boot: all of it, or only its controls. */\n reboot(namespace: string, scope?: BootScope): void\n /** Forget every namespace; each boots again when next used. */\n rebootAll(): void\n snapshot(namespace: string): Required<ControlsSnapshot>\n restore(namespace: string, snapshot: ControlsSnapshot): void\n /** Drop a namespace's controls entirely. */\n forget(namespace: string): void\n}\n\nexport type NamespaceControlsOptions = {\n /** What every stream starts from, unless a namespace is given a seed of its own. */\n seed: number | string\n clock(namespace: string): Clock\n boot?: BootPlan\n /** The service's presets. The standard ones fill in behind them. */\n presets?: Readonly<Record<string, FaultPreset>>\n /** How a fault waits on the wall clock, when the request does not say. */\n sleep?(ms: number): Promise<void>\n /** Reseed whatever else draws from the namespace's seed (the service's own stream). */\n onReseed?(namespace: string, seed: number | string): void\n /** A preset was switched on: do the part of it that is not a fault rule. */\n onPreset?(preset: FaultPreset, namespace: string, overrides: Partial<FaultRule>): void\n /** Put a snapshot document into a namespace: the boot `snapshot` control. */\n restoreDocument?(namespace: string, document: SnapshotDocument, scope: BootScope): void\n}\n\nconst NO_BOOT: BootPlan = { shared: {}, namespaces: {}, credentials: {} }\n\n/** What a rule does, without what it matches or when: all one request can script for itself. */\nconst ACTION = [\n \"status\",\n \"body\",\n \"headers\",\n \"delayMs\",\n \"jitterMs\",\n \"timeoutMs\",\n \"drop\",\n \"truncate\",\n \"effect\",\n \"params\",\n] as const\n\n/** Keys that choose requests. A fault in a header has already chosen its request. */\nconst CHOOSES_REQUESTS = [\n \"id\",\n \"operationId\",\n \"method\",\n \"path\",\n \"pathPrefix\",\n \"pathPattern\",\n \"requestHeaders\",\n \"query\",\n \"requestBody\",\n \"namespace\",\n \"after\",\n \"every\",\n \"count\",\n \"rate\",\n \"from\",\n \"until\",\n]\n\ntype Resolved = {\n /** `assign`: the rule takes the namespace's next `fault_<n>` id when it is stored. */\n rules: { rule: FaultRule; assign: boolean }[]\n preset?: { preset: FaultPreset; overrides: Partial<FaultRule> }\n}\n\n/**\n * Per-namespace seed, clock settings, latency and faults, and the one place a control\n * document is checked and applied \u2014 at boot, from `PUT /__admin/controls`, and from request\n * headers. It owns the seeded streams too: a namespace's seed lives here and nowhere else.\n */\nexport const createNamespaceControls = (options: NamespaceControlsOptions): NamespaceControls => {\n const boot = options.boot ?? NO_BOOT\n const presets: Record<string, FaultPreset> = { ...options.presets }\n for (const [name, preset] of Object.entries(STANDARD_FAULT_PRESETS)) presets[name] ??= preset\n\n const settings = new Map<string, ControlSettings>()\n const streams = new Map<string, { faults: Rng; latency: Rng }>()\n const ensured = new Set<string>()\n\n const settingsOf = (namespace: string): ControlSettings => {\n let found = settings.get(namespace)\n if (!found) {\n found = { seed: options.seed, virtualTime: false, autoAdvanceMs: 0 }\n settings.set(namespace, found)\n }\n return found\n }\n const streamsOf = (namespace: string) => {\n let found = streams.get(namespace)\n if (!found) {\n const { seed } = settingsOf(namespace)\n found = { faults: createRng(seed), latency: createRng(seed) }\n streams.set(namespace, found)\n }\n return found\n }\n const faults = createFaultRegistry((namespace) => streamsOf(namespace).faults, options.sleep)\n const latency = createLatencyRegistry((namespace) => streamsOf(namespace).latency)\n\n const reseed = (namespace: string, seed: number | string): void => {\n const next = normalizeSeed(seed)\n settingsOf(namespace).seed = next\n const own = streamsOf(namespace)\n own.faults.reseed(next)\n own.latency.reseed(next)\n options.onReseed?.(namespace, next)\n }\n\n const changeClock = (namespace: string, change: ClockChange): void => {\n const clock = options.clock(namespace)\n if (change.reset === true) {\n clock.reset()\n settingsOf(namespace).autoAdvanceMs = 0\n }\n // Freeze before applying mutations so a compound `{ now, frozen: true }` change is\n // atomic. Setting a live clock adjusts its offset; freezing it afterward would read the\n // source again and could pin it a millisecond past the requested instant.\n if (change.frozen === true) clock.freeze()\n if (change.now !== undefined) clock.set(change.now)\n if (change.advanceMs !== undefined) clock.advance(change.advanceMs)\n if (change.frozen === false) clock.unfreeze()\n if (change.autoAdvanceMs !== undefined)\n settingsOf(namespace).autoAdvanceMs = change.autoAdvanceMs\n }\n\n /** A rule or a preset reference, as the rules it stands for. Checks everything; stores nothing. */\n const resolve = (namespace: string, input: unknown, now: number): Resolved => {\n if (!isRecord(input)) throw new ControlError(\"fault: expected an object\")\n if (typeof input.preset !== \"string\") {\n const rule = normalizeFault(input, {\n id: \"unassigned\",\n // Scoped to the caller's namespace unless it asks for every one, so one worker's\n // injected failure never lands on another's request.\n namespace,\n now,\n strict: true,\n })\n if (!faultHasAction(rule))\n throw new ControlError(\n \"a fault needs a status, a delay, a timeout, drop: true, truncate, an effect, or a preset\",\n )\n return { rules: [{ rule, assign: typeof input.id !== \"string\" }] }\n }\n const { preset: name, ...given } = input\n const preset = presets[name]\n if (!preset)\n throw new ControlError(\n `no fault preset ${JSON.stringify(name)}; known: ${Object.keys(presets).join(\", \")}`,\n )\n // Both sides in stored form first, so an override wins whichever spelling it uses.\n const { id, ...overrides } = normalizeFault(\n { ...given, id: given.id ?? name },\n { now, strict: true },\n )\n const rules = preset.rules ?? []\n return {\n preset: { preset, overrides },\n rules: rules.map((each, index) => {\n const { id: _id, ...base } = normalizeFault({ ...each, id: name }, { now })\n return {\n assign: false,\n rule: {\n namespace,\n ...base,\n ...overrides,\n fromPreset: name,\n id: `${id}${rules.length > 1 ? `_${index + 1}` : \"\"}`,\n },\n }\n }),\n }\n }\n\n const store = (namespace: string, resolved: Resolved): FaultRule[] => {\n const added = resolved.rules.map(({ rule, assign }) =>\n // Only a rule that is accepted takes the next id, so a rejected request leaves no gap.\n faults.add(assign ? { ...rule, id: faults.nextId(rule.namespace ?? namespace) } : rule),\n )\n if (resolved.preset)\n options.onPreset?.(resolved.preset.preset, namespace, resolved.preset.overrides)\n return added\n }\n\n const check = (plan: ControlPlan): void => {\n for (const each of (plan.faults ?? []) as readonly unknown[]) {\n // A document is one namespace's controls. A rule for every namespace would be added\n // again each time another namespace booted or reset.\n if (isRecord(each) && each.namespace === \"*\")\n throw new ControlError(\n 'faults: a control document cannot hold a \"*\" rule; add it with POST /faults',\n )\n resolve(\"default\", each, 0)\n }\n }\n\n /** Apply a plan that has been checked. `replace` clears the namespace's rules first. */\n const commit = (namespace: string, plan: ControlPlan, replace: boolean): void => {\n if (plan.seed !== undefined) reseed(namespace, plan.seed)\n if (plan.clock !== undefined) changeClock(namespace, plan.clock)\n if (plan.virtualTime !== undefined) settingsOf(namespace).virtualTime = plan.virtualTime\n if (plan.latency !== undefined) latency.set(namespace, plan.latency)\n if (plan.faults !== undefined) {\n if (replace) faults.clear(namespace)\n // Resolved now, not when checked: a window given as a duration counts from the clock\n // this same plan may just have moved.\n const now = options.clock(namespace).now()\n for (const each of plan.faults as readonly Record<string, unknown>[])\n store(namespace, resolve(namespace, { ...each, namespace }, now))\n }\n }\n\n /** The namespace's boot plan: the shared controls with its own overrides on top. */\n const bootPlan = (namespace: string): ControlPlan => ({\n ...boot.shared,\n ...boot.namespaces[namespace],\n })\n\n const start = (namespace: string, scope: BootScope): void => {\n ensured.add(namespace)\n const { snapshot, ...plan } = bootPlan(namespace)\n // Rules a caller added in process before the namespace's first use are kept, after the\n // rules it boots with.\n const early = faults.snapshot(namespace).rules\n if (early.length > 0) faults.clear(namespace)\n // The snapshot first, so a control named beside it wins over the one it carries.\n if (snapshot) options.restoreDocument?.(namespace, snapshot, scope)\n commit(namespace, plan, true)\n for (const { remaining: _r, hits: _h, seen: _s, position: _p, ...rule } of early)\n faults.add(rule)\n }\n\n const ensure = (namespace: string): void => {\n if (!ensured.has(namespace)) start(namespace, \"all\")\n }\n\n const clockOf = (namespace: string): ControlClock => {\n ensure(namespace)\n const state = options.clock(namespace).state()\n return {\n ...state,\n iso: new Date(state.now).toISOString(),\n autoAdvanceMs: settingsOf(namespace).autoAdvanceMs,\n }\n }\n\n const wipe = (namespace: string): void => {\n faults.clear(namespace)\n latency.clear(namespace)\n settings.delete(namespace)\n streams.delete(namespace)\n ensured.delete(namespace)\n }\n\n // Fail when the runtime is created, not on the first request to hit a bad boot rule.\n check(boot.shared)\n for (const plan of Object.values(boot.namespaces)) check(plan)\n\n return {\n faults,\n latency,\n presets,\n ensure,\n settings(namespace) {\n ensure(namespace)\n return settingsOf(namespace)\n },\n clock: clockOf,\n describe(namespace) {\n ensure(namespace)\n const current = settingsOf(namespace)\n return {\n namespace,\n seed: current.seed,\n clock: clockOf(namespace),\n virtualTime: current.virtualTime,\n latency: latency.get(namespace),\n faults: faults.list(namespace),\n }\n },\n check,\n apply(namespace, plan) {\n check(plan)\n ensure(namespace)\n commit(namespace, plan, true)\n },\n changeClock(namespace, change) {\n ensure(namespace)\n changeClock(namespace, change)\n return clockOf(namespace)\n },\n addFault(namespace, input) {\n ensure(namespace)\n return store(namespace, resolve(namespace, input, options.clock(namespace).now()))\n },\n scriptFaults(namespace, request) {\n const rules: FaultRule[] = []\n if (request.fault) {\n if (typeof request.fault.preset !== \"string\") {\n const chooses = CHOOSES_REQUESTS.find((key) => key in (request.fault ?? {}))\n if (chooses)\n throw new ControlError(\n `fault: ${chooses} has no meaning here; a fault in a header is for its own request`,\n )\n }\n // A preset's rules say which requests to fault. This request has already been chosen.\n for (const { rule } of resolve(namespace, request.fault, 0).rules) {\n const action: FaultRule = { id: \"request\" }\n for (const key of ACTION)\n if (rule[key] !== undefined) Object.assign(action, { [key]: rule[key] })\n rules.push(action)\n }\n }\n if (request.timeoutMs !== undefined)\n rules.push({ id: \"request\", timeoutMs: request.timeoutMs })\n return rules\n },\n reseed(namespace, seed) {\n ensure(namespace)\n reseed(namespace, seed)\n },\n reboot(namespace, scope = \"all\") {\n wipe(namespace)\n options.clock(namespace).reset()\n options.onReseed?.(namespace, options.seed)\n start(namespace, scope)\n },\n rebootAll() {\n const known = new Set([...ensured, ...settings.keys()])\n faults.clear()\n latency.clear()\n settings.clear()\n streams.clear()\n ensured.clear()\n for (const namespace of known) {\n options.clock(namespace).reset()\n options.onReseed?.(namespace, options.seed)\n }\n },\n snapshot(namespace) {\n ensure(namespace)\n const own = streamsOf(namespace)\n return {\n settings: { ...settingsOf(namespace) },\n streams: { faults: own.faults.state(), latency: own.latency.state() },\n faults: faults.snapshot(namespace),\n latency: latency.get(namespace),\n }\n },\n restore(namespace, snapshot) {\n ensure(namespace)\n const { seed, ...rest } = snapshot.settings ?? {}\n Object.assign(settingsOf(namespace), rest)\n // The seed first: it restarts the streams, and their positions are set after it.\n if (seed !== undefined) reseed(namespace, seed)\n const own = streamsOf(namespace)\n if (snapshot.streams?.faults !== undefined) own.faults.setState(snapshot.streams.faults)\n if (snapshot.streams?.latency !== undefined) own.latency.setState(snapshot.streams.latency)\n if (snapshot.faults) faults.restore(namespace, snapshot.faults)\n if (snapshot.latency) latency.set(namespace, snapshot.latency)\n },\n forget: wipe,\n }\n}\n", "/**\n * HMAC and encoding primitives for vendor webhook signatures, over WebCrypto so they run\n * wherever the mocks do (Node, Bun, workers).\n */\n\nexport type HmacAlgorithm = \"SHA-1\" | \"SHA-256\" | \"SHA-512\"\nexport type ByteEncoding = \"hex\" | \"base64\"\n\nconst encoder = new TextEncoder()\n\nexport const toBase64 = (bytes: ArrayBuffer | Uint8Array): string => {\n let binary = \"\"\n for (const byte of bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes)) {\n binary += String.fromCharCode(byte)\n }\n return btoa(binary)\n}\n\nexport const fromBase64 = (value: string): Uint8Array =>\n Uint8Array.from(atob(value), (char) => char.charCodeAt(0))\n\nexport const toHex = (bytes: ArrayBuffer | Uint8Array): string =>\n [...(bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes))]\n .map((byte) => byte.toString(16).padStart(2, \"0\"))\n .join(\"\")\n\nconst keyBytes = (key: string | Uint8Array): Uint8Array =>\n typeof key === \"string\" ? encoder.encode(key) : key\n\n/** HMAC of `message` under `key` (a UTF-8 string or raw bytes), encoded as hex or base64. */\nexport const hmac = async (\n algorithm: HmacAlgorithm,\n key: string | Uint8Array,\n message: string | Uint8Array,\n encoding: ByteEncoding = \"hex\",\n): Promise<string> => {\n const imported = await crypto.subtle.importKey(\n \"raw\",\n keyBytes(key) as BufferSource,\n { name: \"HMAC\", hash: algorithm },\n false,\n [\"sign\"],\n )\n const signed = await crypto.subtle.sign(\n \"HMAC\",\n imported,\n (typeof message === \"string\" ? encoder.encode(message) : message) as BufferSource,\n )\n return encoding === \"hex\" ? toHex(signed) : toBase64(signed)\n}\n\n/** SHA digest of `input`, hex-encoded. */\nexport const sha = async (\n algorithm: \"SHA-1\" | \"SHA-256\" | \"SHA-512\",\n input: string | Uint8Array,\n): Promise<string> =>\n toHex(\n await crypto.subtle.digest(\n algorithm,\n (typeof input === \"string\" ? encoder.encode(input) : input) as BufferSource,\n ),\n )\n\n/**\n * The raw key of a Svix-style secret: `whsec_<base64>` (Svix, Resend, Junction) or\n * `fwhsec_<base64>` (Flex). A bare base64 secret is accepted too.\n */\nexport const svixSecretBytes = (secret: string): Uint8Array => {\n const raw = secret.replace(/^f?whsec_/, \"\")\n try {\n return fromBase64(raw)\n } catch {\n throw new TypeError(\"webhook secret must be whsec_<base64> (as Svix issues it)\")\n }\n}\n\n/** `v1,<base64 HMAC-SHA256>` over `\"<id>.<timestamp>.<body>\"`, as Svix signs. */\nexport const signSvix = async (\n secret: string,\n messageId: string,\n timestampSeconds: number,\n body: string,\n): Promise<string> =>\n `v1,${await hmac(\"SHA-256\", svixSecretBytes(secret), `${messageId}.${timestampSeconds}.${body}`, \"base64\")}`\n\n/** `t=<unix>,v1=<hex HMAC-SHA256(secret, \"<t>.<body>\")>`, as Stripe (and Persona) sign. */\nexport const signTimestamped = async (\n secret: string,\n timestampSeconds: number,\n body: string,\n): Promise<string> =>\n `t=${timestampSeconds},v1=${await hmac(\"SHA-256\", secret, `${timestampSeconds}.${body}`, \"hex\")}`\n\n/**\n * Twilio's `X-Twilio-Signature`: base64 HMAC-SHA1 of the full URL followed by every form\n * parameter as `key + value`, keys sorted. Sign against the public URL the app is\n * configured with, not the address the request is actually posted to.\n */\nexport const signTwilio = async (\n authToken: string,\n url: string,\n params: Record<string, string>,\n): Promise<string> => {\n const payload =\n url +\n Object.keys(params)\n .sort()\n .map((key) => `${key}${params[key]}`)\n .join(\"\")\n return hmac(\"SHA-1\", authToken, payload, \"base64\")\n}\n\n/** Constant-time string comparison, so a verifier in a test double does not leak timing. */\nexport const timingSafeEqual = (a: string, b: string): boolean => {\n if (a.length !== b.length) return false\n let diff = 0\n for (let i = 0; i < a.length; i++) diff |= a.charCodeAt(i) ^ b.charCodeAt(i)\n return diff === 0\n}\n", "import type { SqliteClient } from \"@crvouga/mockingbird-sqlite\"\nimport type { Clock, ClockState } from \"./clock.js\"\nimport type { ControlHeaderInput, MockControls, NamespaceControls } from \"./controls.js\"\nimport type { CredentialRegistry } from \"./credentials.js\"\nimport type { FaultRegistry, FaultRule } from \"./faults.js\"\nimport type { Journal } from \"./journal.js\"\nimport type { LatencyRegistry } from \"./latency.js\"\nimport type { Metrics } from \"./metrics.js\"\nimport type { Rng } from \"./rng.js\"\nimport type { NamespaceSnapshot } from \"./snapshot.js\"\nimport type { StateView } from \"./state-view.js\"\n\n/**\n * What every mock can be called with. A service may accept more fields \u2014 accounts,\n * catalogs, webhook endpoints \u2014 and those stay optional so `createRuntime()` and\n * `createRuntime({ seed, adminKey })` work everywhere.\n */\nexport type MockCreateOptions = {\n sqlite?: SqliteClient\n clock?: Clock\n seed?: number | string\n /** All internal HTTP paths live below this prefix. Default /__admin. */\n adminPrefix?: string\n adminKey?: string\n /**\n * Admin controls to boot with: clock, latency, faults, seed, a starting snapshot, and\n * per-namespace overrides. `POST /__admin/reset` returns to exactly this.\n */\n adminControls?: MockControls\n}\n\n/** A named snapshot, as the admin API and `runtime.snapshots` list it. */\nexport type MockSnapshotInfo = {\n readonly id: string\n readonly namespace: string\n readonly records: number\n readonly at: number\n readonly portable: boolean\n}\n\n/** One namespace's controls, as `GET /__admin/controls` and `runtime.controls()` report them. */\nexport type MockControlState = {\n readonly namespace: string\n readonly seed: number | string\n readonly clock: ClockState & { iso: string; autoAdvanceMs: number }\n readonly virtualTime: boolean\n readonly latency: unknown\n readonly faults: readonly unknown[]\n readonly snapshots: readonly MockSnapshotInfo[]\n}\n\n/** A checkpoint head the admin client can show. Services may return a richer object. */\nexport type MockCheckpoint = {\n readonly id: string\n readonly branch: string\n readonly parent: string | null\n readonly at: number\n}\n\n/** The instance behind one namespace. Vendor methods sit beside these, not instead of them. */\nexport type MockInstanceSurface = {\n fetch(request: Request): Promise<Response>\n reset(): Promise<void>\n}\n\n/**\n * The interface every mock runtime implements.\n *\n * Assignability is one way: a service may add methods (`tick`, a typed webhook hub,\n * account directories) and narrower property types. Removing or renaming a member\n * fails the typecheck. The HTTP control plane (`/__admin/health`, `/__admin/*`) is the same\n * contract on the wire; {@link STANDARD_ADMIN_ROUTES} is that list.\n */\nexport type MockSurface = {\n readonly name: string\n fetch(request: Request): Promise<Response>\n readonly clock: Clock\n readonly faults: FaultRegistry\n /** Baseline response time per namespace. */\n readonly latency: LatencyRegistry\n readonly metrics: Metrics\n readonly journal: Journal\n readonly rng: Rng\n readonly credentials: CredentialRegistry\n /** Present on every runtime. `undefined` when the service has no outbound webhooks. */\n readonly webhooks: unknown\n applyPreset(name: string, namespace?: string, overrides?: Partial<FaultRule>): FaultRule[]\n instance(namespace?: string): MockInstanceSurface\n namespaces(): string[]\n reset(namespace?: string): Promise<void>\n /** A namespace's clock: the base clock for `default`, its own for any other. */\n namespaceClock(namespace?: string): Clock\n /** A namespace's controls: seed, clock, virtual time, latency, faults and snapshots. */\n controls(namespace?: string): MockControlState\n /** Apply a control document to a namespace. A given key replaces that control. */\n configure(controls: NamespaceControls, namespace?: string): MockControlState\n /** Named snapshots of a namespace: records, clock, random streams, faults and latency. */\n readonly snapshots: {\n create(options?: { name?: string; namespace?: string }): MockSnapshotInfo\n list(namespace?: string): MockSnapshotInfo[]\n restore(id: string, namespace?: string): void\n delete(id: string, namespace?: string): boolean\n }\n /** Request headers that carry controls, checked: spread them into a `fetch` or an SDK's defaults. */\n headers(input: ControlHeaderInput): Record<string, string>\n snapshot(namespace?: string): NamespaceSnapshot\n restore(snapshot: NamespaceSnapshot, namespace?: string): void\n checkpoint(namespace?: string, branch?: string): MockCheckpoint\n branch(name: string, options?: { namespace?: string; at?: string }): MockCheckpoint\n checkout(checkpoint: string, options?: { namespace?: string; branch?: string }): void\n timeline(namespace?: string): {\n head(branch?: string): { readonly id: string } | undefined\n branches(): Readonly<Record<string, string>>\n }\n /** Collections in `namespace`, declared by the service and inferred from stored rows. */\n state(namespace?: string): StateView\n readonly sqlite: SqliteClient\n}\n\n/**\n * Keep a service's own runtime type while proving it is a {@link MockSurface}.\n * Extra members stay. A missing member is a type error at the definition.\n */\nexport const defineMock = <T extends MockSurface>(runtime: T): T => runtime\n\n/** Clock state is part of the surface so admin clients can render it without a cast. */\nexport type MockClockState = ClockState\n\n/**\n * What each shared admin route does. `GET /__admin` serves this list, and the guide in\n * `docs/ADMIN_CONTROLS.md` is checked against it.\n */\nexport const ADMIN_ROUTE_REFERENCE = {\n \"GET /\": \"This index: every route and control header, with a one-line summary each.\",\n \"GET /health\": \"Readiness. Never needs the admin key or a vendor credential.\",\n \"GET /controls\":\n \"The namespace's controls in one document: seed, clock, virtual time, latency, faults, snapshots.\",\n \"PUT /controls\":\n \"Apply a control document. Each key given replaces that control; `snapshot` replaces the records.\",\n \"DELETE /controls\": \"Put the namespace's controls back to boot. Records are untouched.\",\n \"POST /reset\":\n \"Return the namespace to its boot state: records, controls, snapshots, journal, metrics. `?all=1` resets every namespace.\",\n \"GET /namespaces\": \"The isolation keys in use.\",\n \"DELETE /namespaces/:name\": \"Reset a namespace and forget it.\",\n \"GET /clock\": \"The namespace clock: `now`, `iso`, `frozen`, `offsetMs`, `autoAdvanceMs`.\",\n \"POST /clock\":\n \"Move time: `now` (or `set`), `advance`, `frozen` (or `freeze`), `autoAdvance`, `reset`.\",\n \"GET /latency\": \"The namespace's baseline response time.\",\n \"PUT /latency\": \"Set it: `delay`, seeded `jitter`, and per-operation `operations`.\",\n \"DELETE /latency\": \"Remove it.\",\n \"GET /faults\": \"Fault rules that can hit this namespace. `?all=1` lists every namespace's.\",\n \"POST /faults\": 'Add a fault rule, or a preset with `{\"preset\": \"<name>\"}`.',\n \"PUT /faults\": 'Replace the namespace\\'s fault rules with `{\"faults\": [...]}`.',\n \"DELETE /faults\":\n \"Remove the namespace's fault rules. `?id=` removes one; `?all=1` every namespace's.\",\n \"GET /faults/presets\": \"Named faults this emulator answers to.\",\n \"POST /faults/presets/:name\": \"Switch a preset on. The body overrides its fields.\",\n \"GET /faults/:id\": \"One fault rule, with its `hits`, `seen` and `remaining` counters.\",\n \"DELETE /faults/:id\": \"Remove one fault rule.\",\n \"GET /snapshots\": \"The namespace's snapshots.\",\n \"POST /snapshots\":\n 'Snapshot the namespace: records, clock, random streams, faults, latency. `{\"name\"}` names it.',\n \"GET /snapshots/:id\": \"A snapshot as portable JSON.\",\n \"PUT /snapshots/:id\": \"Store a snapshot document under this id, without restoring it.\",\n \"POST /snapshots/:id/restore\": \"Replace the namespace with a snapshot.\",\n \"DELETE /snapshots/:id\": \"Delete a snapshot.\",\n \"GET /timeline\": \"The namespace's checkpoint history and branches.\",\n \"POST /checkpoints\": \"Checkpoint a branch now. Successful mutations do this automatically.\",\n \"POST /branches/:name\": \"Create a copy-on-write branch, optionally from a checkpoint (`at`).\",\n \"POST /branches/:name/checkout\": \"Move a branch to a checkpoint.\",\n \"GET /requests\":\n \"The request journal. Filter with `operationId`, `method`, `path`, `status`, `faultId`, `since`, `limit`; `?all=1` for every namespace.\",\n \"DELETE /requests\": \"Clear the journal.\",\n \"GET /metrics\": \"Request counts and unmatched paths, for every namespace or the one named.\",\n \"DELETE /metrics\": \"Clear them.\",\n \"GET /credentials\": \"Vendor credential \u2192 namespace mappings, masked.\",\n \"PUT /credentials\": \"Map vendor credentials to namespaces, for SDKs that cannot send a header.\",\n \"DELETE /credentials\": \"Remove one mapping (`?credential=`) or all.\",\n \"GET /state\": \"The namespace's collections: declared shape and stored rows.\",\n \"GET /state/:collection\": \"A page of rows.\",\n \"GET /state/:collection/:id\": \"One row.\",\n \"POST /state/:collection\": \"Create a row from `{id?, value}`.\",\n \"PUT /state/:collection/:id\": \"Replace a row.\",\n \"PATCH /state/:collection/:id\": \"Shallow-merge into a row.\",\n \"DELETE /state/:collection/:id\": \"Delete a row.\",\n \"GET /ui\": \"The admin UI.\",\n \"GET /ui/\": \"The admin UI.\",\n \"GET /ui/manifest\": \"The admin UI's panels and extensions.\",\n} as const\n\n/**\n * Admin routes every mock answers. A service adds its own keys beside these.\n * A key in this list keeps the shared handler, so the state API and the admin UI\n * stay the same when a service also ships vendor-specific controls.\n */\nexport const STANDARD_ADMIN_ROUTES = Object.keys(\n ADMIN_ROUTE_REFERENCE,\n) as readonly (keyof typeof ADMIN_ROUTE_REFERENCE)[]\n\nexport type StandardAdminRoute = (typeof STANDARD_ADMIN_ROUTES)[number]\n\n/**\n * A contribution the admin shell mounts beside the shared views.\n * `panel` is author-owned markup. `sql` turns on the built-in table explorer\n * and query runner, which call `GET /sql/tables` and `POST /sql/query`.\n * `route` presents an admin action with the shell's prebuilt form and response view.\n */\nexport type AdminExtension =\n | {\n kind: \"route\"\n id: string\n title: string\n description?: string\n /** An existing admin route, including its method and any path parameters. */\n route: string\n /** Initial JSON body shown in the request form. */\n body?: unknown\n }\n | {\n kind: \"panel\"\n id: string\n title: string\n description?: string\n html: string\n script?: string\n }\n | {\n kind: \"sql\"\n /** DOM id suffix. Default `sql`. */\n id?: string\n title?: string\n description?: string\n }\n\n/** A panel the default admin shell mounts after the shared views. */\nexport type AdminPanel = {\n /** DOM id suffix. Lowercase letters, digits, and hyphens. */\n id: string\n title: string\n description?: string\n /** Markup placed inside the panel body. The service author owns it. */\n html: string\n /**\n * Function body called as `(root, api) => void` once the shell has loaded.\n * `root` is the panel body. `api` is `{ get, send, namespace }` against `/__admin`.\n */\n script?: string\n}\n\n/**\n * How a service customizes the admin UI without leaving the shared shell.\n * `panels` add views. `render` replaces the document and can call `defaultHtml()`\n * to wrap the shared shell instead of discarding it.\n */\nexport type AdminUi = {\n panels?: readonly AdminPanel[]\n /** First-class shell contributions. `sql` mounts the shared database explorer. */\n extensions?: readonly AdminExtension[]\n render?: (input: { service: string; defaultHtml: () => string }) => string\n}\n\nconst PANEL_ID = /^[a-z0-9](?:[a-z0-9-]{0,62}[a-z0-9])?$/\nconst RESERVED_VIEWS = new Set([\n \"overview\",\n \"manual\",\n \"state\",\n \"clock\",\n \"latency\",\n \"faults\",\n \"snapshots\",\n \"journal\",\n \"routes\",\n \"checkpoints\",\n])\n\nconst checkPanel = (\n panel: { id: string; title: string },\n seen: Set<string>,\n label: string,\n): void => {\n if (!PANEL_ID.test(panel.id)) {\n throw new RangeError(`${label} id must match ${PANEL_ID}: ${JSON.stringify(panel.id)}`)\n }\n if (RESERVED_VIEWS.has(panel.id)) {\n throw new RangeError(`${label} id ${panel.id} is reserved by the admin shell`)\n }\n if (seen.has(panel.id)) throw new RangeError(`duplicate admin view id ${panel.id}`)\n seen.add(panel.id)\n if (panel.title.trim() === \"\") throw new RangeError(`${label} ${panel.id} needs a title`)\n}\n\n/** Reject a panel or extension the shell cannot mount. Called when the runtime is created. */\nexport const assertAdminUi = (ui: AdminUi | undefined): void => {\n if (!ui) return\n const seen = new Set<string>()\n for (const panel of ui.panels ?? []) checkPanel(panel, seen, \"admin panel\")\n for (const extension of ui.extensions ?? []) {\n if (extension.kind === \"panel\" || extension.kind === \"route\") {\n checkPanel(extension, seen, \"admin extension\")\n if (\n extension.kind === \"route\" &&\n !/^(GET|POST|PUT|PATCH|DELETE) \\/\\S*$/.test(extension.route)\n )\n throw new RangeError(`admin extension ${extension.id} needs a method and route path`)\n continue\n }\n const id = extension.id ?? \"sql\"\n checkPanel({ id, title: extension.title ?? \"SQL\" }, seen, \"admin extension\")\n }\n}\n", "import type { Clock } from \"./clock.js\"\nimport {\n assertSnapshotDocument,\n CONTROL_HEADER_REFERENCE,\n CONTROL_HEADERS,\n ControlError,\n type ControlPlan,\n durationMs,\n isRecord,\n KEY_PATTERN,\n normalizeClock,\n normalizeControls,\n normalizeLatency,\n parseInstant,\n type SnapshotDocument,\n} from \"./controls.js\"\nimport type { FaultPresetList } from \"./faults.js\"\nimport type { Journal } from \"./journal.js\"\nimport type { Metrics } from \"./metrics.js\"\nimport { createNamespaceControls, type NamespaceControls } from \"./namespace-controls.js\"\nimport { timingSafeEqual } from \"./signing.js\"\nimport { ADMIN_ROUTE_REFERENCE } from \"./surface.js\"\n\nexport { parseDuration } from \"./controls.js\"\n\n/** Unauthenticated readiness probe, served ahead of every vendor auth gate. */\nexport const HEALTH_PATH = \"/__admin/health\"\n/** Prefix of every control-plane route; never part of a vendor contract. */\nexport const ADMIN_PREFIX = \"/__admin\"\n/** Resolve once at construction; ambiguous URL forms are never accepted. */\nexport const resolveAdminPrefix = (prefix: string = ADMIN_PREFIX): string => {\n if (!/^\\/[A-Za-z0-9_-]+(?:\\/[A-Za-z0-9_-]+)*$/.test(prefix)) {\n throw new Error(\n \"adminPrefix must be an absolute non-root path of literal segments, without a trailing slash\",\n )\n }\n return prefix\n}\n\n/** Segment-boundary matching prevents /__administer from entering the control plane. */\nexport const isAdminPath = (path: string, prefix: string): boolean =>\n path === prefix || path.startsWith(`${prefix}/`)\n\n/** SDK base URL namespace carrier, entirely inside the configured internal route tree. */\nexport const matchNamespacePath = (path: string, prefix: string): RegExpExecArray | null =>\n /^\\/ns\\/([^/]+)(\\/.*)?$/.exec(isAdminPath(path, prefix) ? path.slice(prefix.length) : \"\")\n\n/** Fail before serving when the declared vendor contract overlaps the reserved tree. */\nexport const assertAdminPrefixAvailable = (prefix: string, paths: readonly string[]): void => {\n const reserved = prefix.split(\"/\").slice(1)\n for (const path of paths) {\n const segments = path.split(\"/\").slice(1)\n // Catch-all vendor roots (e.g. S3 /{bucket}/{key}) share the listener.\n // The internal tree is reserved before vendor dispatch, regardless of the wildcard.\n if (segments.length < reserved.length || /^\\{[^}]+\\}$/.test(segments[0] ?? \"\")) continue\n if (\n reserved.every((part, i) => segments[i] === part || /^\\{[^}]+\\}$/.test(segments[i] ?? \"\"))\n ) {\n throw new Error(\n `vendor route ${path} collides with adminPrefix ${prefix}; choose a different adminPrefix`,\n )\n }\n }\n}\n\n/** Carries the admin key, which is separate from any vendor credential. */\nexport const ADMIN_KEY_HEADER = CONTROL_HEADERS.adminKey\n/** The admin shell's brand catalog, under the admin prefix. Public, like the shell. */\nexport const ADMIN_BRANDS_PATH = \"/ui/brands.json\"\n\n/**\n * Whether `headers` carry `adminKey`. Constant-time, so response timing does not tell a caller\n * how many leading characters of a guess were right.\n */\nexport const hasAdminKey = (headers: Headers, adminKey: string): boolean => {\n const sent = headers.get(ADMIN_KEY_HEADER)\n return sent !== null && timingSafeEqual(sent, adminKey)\n}\n/** Selects the isolated namespace a request reads and writes. */\nexport const NAMESPACE_HEADER = CONTROL_HEADERS.namespace\n/** Where the admin controls are documented, for people and agents. */\nexport const ADMIN_DOCS_URL = \"https://mockingbird.chrisvouga.dev/docs/admin-controls\"\n\n/**\n * The guide's page for each control, with the shared routes (by first path segment) and the\n * request headers that page defines. `GET /__admin` links every route and header to its page,\n * and the guide in `docs/admin-controls/` is checked against this list.\n */\nexport const ADMIN_CONTROL_PAGES: readonly {\n page: string\n title: string\n routes: readonly string[]\n headers: readonly string[]\n}[] = [\n {\n page: \"namespaces\",\n title: \"Namespaces\",\n routes: [\"/namespaces\", \"/credentials\"],\n headers: [CONTROL_HEADERS.namespace],\n },\n { page: \"reset\", title: \"Reset\", routes: [\"/reset\"], headers: [CONTROL_HEADERS.reset] },\n {\n page: \"snapshot-and-restore\",\n title: \"Snapshot and restore\",\n routes: [\"/snapshots\"],\n headers: [CONTROL_HEADERS.restore, CONTROL_HEADERS.snapshot],\n },\n {\n page: \"clock\",\n title: \"Clock\",\n routes: [\"/clock\"],\n headers: [CONTROL_HEADERS.time, CONTROL_HEADERS.advance],\n },\n {\n page: \"checkpoints-and-branches\",\n title: \"Checkpoints and branches\",\n routes: [\"/timeline\", \"/checkpoints\", \"/branches\"],\n headers: [CONTROL_HEADERS.branch, CONTROL_HEADERS.at],\n },\n { page: \"faults\", title: \"Faults\", routes: [\"/faults\"], headers: [CONTROL_HEADERS.fault] },\n {\n page: \"latency-and-timeouts\",\n title: \"Latency and timeouts\",\n routes: [\"/latency\"],\n headers: [CONTROL_HEADERS.delay, CONTROL_HEADERS.timeout, CONTROL_HEADERS.virtualTime],\n },\n {\n page: \"seed-and-determinism\",\n title: \"Seed and determinism\",\n routes: [],\n headers: [CONTROL_HEADERS.seed],\n },\n { page: \"control-document\", title: \"The control document\", routes: [\"/controls\"], headers: [] },\n { page: \"boot\", title: \"Boot\", routes: [], headers: [] },\n { page: \"request-headers\", title: \"Request headers\", routes: [], headers: [] },\n {\n page: \"journal-and-state\",\n title: \"Journal, metrics and state\",\n routes: [\"/requests\", \"/metrics\", \"/state\", \"/ui\"],\n headers: [],\n },\n {\n page: \"reference\",\n title: \"Reference\",\n routes: [\"/\", \"/health\"],\n headers: [CONTROL_HEADERS.adminKey],\n },\n]\n\nconst pageUrl = (page: string): string => `${ADMIN_DOCS_URL}/${page}`\n\n/** The guide page that defines a shared route (`\"GET /snapshots/:id\"`), if it is one. */\nconst routeDocs = (route: string): string | undefined => {\n if (!Object.hasOwn(ADMIN_ROUTE_REFERENCE, route)) return undefined\n const path = route.slice(route.indexOf(\" \") + 1)\n const segment = `/${path.split(\"/\")[1] ?? \"\"}`\n const found = ADMIN_CONTROL_PAGES.find((each) => each.routes.includes(segment))\n return found && pageUrl(found.page)\n}\n\nconst headerDocs = (header: string): string | undefined => {\n const found = ADMIN_CONTROL_PAGES.find((each) => each.headers.includes(header))\n return found && pageUrl(found.page)\n}\n\nexport type AdminRequest = {\n request: Request\n url: URL\n /** `:param` segments of the matched route. */\n params: Record<string, string>\n /** Namespace the request targets: `?namespace=`, then the header, then the default. */\n namespace: string\n /** Parsed JSON body, or `undefined` when there is none. */\n body: unknown\n}\n\nexport type AdminRoute = (request: AdminRequest) => Response | Promise<Response>\n\n/**\n * Service-specific admin routes, keyed `METHOD /path` relative to `/__admin`, with\n * `:param` segments \u2014 e.g. `\"POST /orders/:id/transition\"`.\n */\nexport type AdminRoutes = Record<string, AdminRoute>\n\n/** What `GET /__admin/snapshots` lists for each snapshot. */\nexport type SnapshotInfo = {\n id: string\n namespace: string\n /** Stored rows in the snapshot. */\n records: number\n /** The namespace clock when it was taken, epoch ms. */\n at: number\n /** Whether `GET /snapshots/:id` can return it as a {@link SnapshotDocument}. */\n portable: boolean\n}\n\n/** Named snapshots of a namespace. Ids are unique within a namespace, never across them. */\nexport type SnapshotStore = {\n /** Capture the namespace now. Reusing an id replaces that snapshot. */\n create(namespace: string, id?: string): SnapshotInfo\n list(namespace: string): SnapshotInfo[]\n get(namespace: string, id: string): SnapshotInfo | undefined\n /** The snapshot as portable JSON; `undefined` when there is none or it cannot leave the process. */\n export(namespace: string, id: string): SnapshotDocument | undefined\n /** Store a document as a snapshot without restoring it. Throws {@link ControlError}. */\n import(namespace: string, id: string | undefined, document: SnapshotDocument): SnapshotInfo\n /** Replace the namespace with the snapshot. `false` when there is none. */\n restore(namespace: string, id: string): boolean\n remove(namespace: string, id: string): boolean\n /** Forget one namespace's snapshots, or every namespace's. */\n clear(namespace?: string): void\n}\n\nexport type ControlContext = {\n name: string\n startedAt: number\n wallNow: () => number\n clock: Clock\n namespaceClock?(namespace: string): Clock\n metrics: Metrics\n journal: Journal\n defaultNamespace: string\n namespaces(): string[]\n reset(namespace: string | \"*\"): Promise<void>\n timeTravel: {\n checkpoint(\n namespace: string,\n branch: string,\n ): { id: string; branch: string; parent: string | null; at: number; records?: number }\n branch(\n name: string,\n options: { namespace: string; at?: string },\n ): { id: string; branch: string; parent: string | null; at: number }\n checkout(checkpoint: string, options: { namespace: string; branch: string }): void\n retain(namespace: string, checkpoint: string): void\n release(namespace: string, checkpoint: string): boolean\n inspect(namespace: string): {\n branches: Readonly<Record<string, string>>\n checkpoints: readonly { id: string; branch: string; parent: string | null; at: number }[]\n }\n }\n /** Extra fields for `GET /__admin/health`, such as the loaded corpus version. */\n describe(): Record<string, unknown>\n routes: AdminRoutes\n adminPrefix?: string\n adminKey: string | undefined\n /** Reported by `GET /__admin`. */\n version?: string\n /**\n * Per-namespace seed, clock settings, latency and faults. Default: controls over this\n * context's clock, with the standard presets and no boot controls.\n */\n controls?: NamespaceControls\n /** Named snapshots. Default: pinned `timeTravel` checkpoints, which are not portable. */\n snapshots?: SnapshotStore\n /** Apply a control document, including its `snapshot`. Default: `controls.apply`. */\n applyControls?(namespace: string, plan: ControlPlan): void\n /** Reset a namespace and forget it. Default: reset. */\n dropNamespace?(namespace: string): Promise<void>\n}\n\nexport type ControlPlane = {\n /** The control-plane response for `request`, or `undefined` for a vendor request. */\n handle(request: Request): Promise<Response | undefined>\n /**\n * Namespace a vendor request targets, from {@link NAMESPACE_HEADER}. Only admin routes\n * also accept `?namespace=`, so a vendor query parameter of that name can never\n * silently reroute a request.\n */\n namespaceOf(request: Request): string\n /** The per-namespace controls behind the routes. */\n readonly controls: NamespaceControls\n readonly snapshots: SnapshotStore\n}\n\nconst json = (status: number, body: unknown): Response =>\n new Response(JSON.stringify(body), {\n status,\n headers: { \"content-type\": \"application/json; charset=utf-8\" },\n })\n\n/** Admin errors use one documented shape, distinct from any vendor's error body. */\nexport const adminError = (status: number, message: string): Response =>\n json(status, { error: { type: \"mockingbird_admin\", message } })\n\n/** Parameters before literals lose, so `/faults/presets` is never read as `/faults/:id`. */\nconst paramCount = (pattern: string): number => (pattern.match(/\\/:/g) ?? []).length\n\nconst matchRoute = (pattern: string, path: string): Record<string, string> | undefined => {\n const want = pattern.split(\"/\").filter(Boolean)\n const have = path.split(\"/\").filter(Boolean)\n if (want.length !== have.length) return undefined\n const params: Record<string, string> = {}\n for (let i = 0; i < want.length; i++) {\n const segment = want[i] as string\n const actual = have[i] as string\n if (segment.startsWith(\":\")) params[segment.slice(1)] = decodeURIComponent(actual)\n else if (segment !== actual) return undefined\n }\n return params\n}\n\nconst readJson = async (request: Request): Promise<unknown> => {\n const text = await request.text()\n if (text.trim() === \"\") return undefined\n return JSON.parse(text) as unknown\n}\n\n/** Snapshots as pinned Timeline checkpoints, for engines whose state is not rows of JSON. */\nconst timelineSnapshots = (timeTravel: ControlContext[\"timeTravel\"]): SnapshotStore => {\n const stored = new Map<string, Map<string, { checkpoint: string; info: SnapshotInfo }>>()\n const counters = new Map<string, number>()\n const of = (namespace: string) => {\n let found = stored.get(namespace)\n if (!found) {\n found = new Map()\n stored.set(namespace, found)\n }\n return found\n }\n const remove = (namespace: string, id: string): boolean => {\n const found = stored.get(namespace)?.get(id)\n if (!found) return false\n stored.get(namespace)?.delete(id)\n timeTravel.release(namespace, found.checkpoint)\n return true\n }\n return {\n create(namespace, given) {\n const point = timeTravel.checkpoint(namespace, \"main\")\n timeTravel.retain(namespace, point.id)\n let id = given\n if (id === undefined) {\n let next = counters.get(namespace) ?? 0\n do id = `snap_${++next}`\n while (of(namespace).has(id))\n counters.set(namespace, next)\n } else remove(namespace, id)\n const info = { id, namespace, records: point.records ?? 0, at: point.at, portable: false }\n of(namespace).set(id, { checkpoint: point.id, info })\n return info\n },\n list: (namespace) => [...(stored.get(namespace)?.values() ?? [])].map((each) => each.info),\n get: (namespace, id) => stored.get(namespace)?.get(id)?.info,\n export: () => undefined,\n import() {\n throw new ControlError(\"this emulator's snapshots cannot be imported or exported\")\n },\n restore(namespace, id) {\n const found = stored.get(namespace)?.get(id)\n if (!found) return false\n timeTravel.checkout(found.checkpoint, { namespace, branch: \"main\" })\n return true\n },\n remove,\n clear(namespace) {\n for (const [name, snapshots] of stored) {\n if (namespace !== undefined && name !== namespace) continue\n for (const id of [...snapshots.keys()]) {\n try {\n remove(name, id)\n } catch {\n // The checkpoint went with the history a reset discarded.\n snapshots.delete(id)\n }\n }\n stored.delete(name)\n counters.delete(name)\n }\n },\n }\n}\n\nexport const createControlPlane = (context: ControlContext): ControlPlane => {\n const adminPrefix = resolveAdminPrefix(context.adminPrefix)\n const controls =\n context.controls ??\n createNamespaceControls({\n seed: 0,\n clock: (namespace) => context.namespaceClock?.(namespace) ?? context.clock,\n })\n const { faults } = controls\n const snapshots = context.snapshots ?? timelineSnapshots(context.timeTravel)\n /** A store the runtime owns is cleared by the runtime's own reset. */\n const forgetSnapshots = (namespace?: string) => {\n if (!context.snapshots) snapshots.clear(namespace)\n }\n const applyControls =\n context.applyControls ??\n ((namespace: string, plan: ControlPlan) => {\n if (plan.snapshot !== undefined)\n throw new ControlError(\"this emulator cannot start from a snapshot document\")\n controls.apply(namespace, plan)\n })\n\n const headerNamespace = (request: Request): string =>\n request.headers.get(NAMESPACE_HEADER) ?? context.defaultNamespace\n const adminNamespace = (request: Request, url: URL): string =>\n url.searchParams.get(\"namespace\") ?? headerNamespace(request)\n /** Whether the caller named a namespace, as opposed to landing on the default one. */\n const explicitNamespace = (request: Request, url: URL): boolean =>\n url.searchParams.has(\"namespace\") || request.headers.has(NAMESPACE_HEADER)\n\n const health = (): Response => {\n return json(200, {\n ...context.describe(),\n status: \"ok\",\n service: context.name,\n uptimeMs: context.wallNow() - context.startedAt,\n clock: context.clock.state(),\n namespaces: context.namespaces().length,\n adminPrefix,\n adminUi: `${adminPrefix}/ui`,\n })\n }\n\n const describe = (namespace: string) => ({\n ...controls.describe(namespace),\n snapshots: snapshots.list(namespace),\n })\n\n /** Run a control change, answering `400` for a {@link ControlError}. */\n const guard = (run: () => Response): Response => {\n try {\n return run()\n } catch (error) {\n if (error instanceof ControlError) return adminError(400, error.message)\n throw error\n }\n }\n\n const presetList = (): FaultPresetList => ({\n presets: Object.entries(controls.presets).map(([name, preset]) => ({ name, ...preset })),\n })\n\n const removeFault = (id: string, namespace: string, everyNamespace: boolean): Response =>\n faults.remove(id, everyNamespace ? undefined : namespace)\n ? json(200, { status: \"ok\" })\n : adminError(404, `no fault ${id}`)\n\n const builtin: AdminRoutes = {\n \"GET /health\": health,\n \"GET /\": ({ namespace }) => {\n const routes = [...Object.keys(builtin), ...Object.keys(context.routes)].sort()\n const reference: Record<string, string> = ADMIN_ROUTE_REFERENCE\n return json(200, {\n service: context.name,\n ...(context.version !== undefined ? { version: context.version } : {}),\n namespace,\n adminPrefix,\n docs: ADMIN_DOCS_URL,\n guide: ADMIN_CONTROL_PAGES.map((each) => ({ title: each.title, docs: pageUrl(each.page) })),\n routes,\n reference: routes.map((route) => {\n const docs = routeDocs(route)\n return {\n route,\n summary: reference[route] ?? `Specific to ${context.name}.`,\n ...(docs !== undefined ? { docs } : {}),\n }\n }),\n headers: CONTROL_HEADER_REFERENCE.map((each) => ({\n ...each,\n docs: headerDocs(each.header) ?? ADMIN_DOCS_URL,\n })),\n })\n },\n\n \"GET /controls\": ({ namespace }) => json(200, describe(namespace)),\n \"PUT /controls\": ({ body, namespace }) =>\n guard(() => {\n applyControls(namespace, normalizeControls(body ?? {}, \"controls\"))\n return json(200, describe(namespace))\n }),\n \"DELETE /controls\": ({ namespace }) => {\n controls.reboot(namespace, \"controls\")\n return json(200, describe(namespace))\n },\n\n \"POST /reset\": async ({ url, namespace }) => {\n const target = url.searchParams.get(\"all\") === \"1\" ? \"*\" : namespace\n await context.reset(target)\n forgetSnapshots(target === \"*\" ? undefined : target)\n return json(200, { status: \"ok\", reset: target === \"*\" ? context.namespaces() : [target] })\n },\n\n \"GET /namespaces\": () =>\n json(200, { default: context.defaultNamespace, namespaces: context.namespaces() }),\n \"DELETE /namespaces/:name\": async ({ params }) => {\n const name = params.name as string\n if (!KEY_PATTERN.test(name)) return adminError(400, \"invalid namespace\")\n if (context.dropNamespace) await context.dropNamespace(name)\n else await context.reset(name)\n forgetSnapshots(name)\n return json(200, { status: \"ok\", namespaces: context.namespaces() })\n },\n\n \"GET /clock\": ({ namespace }) => json(200, controls.clock(namespace)),\n \"POST /clock\": ({ body, namespace }) =>\n guard(() => {\n if (!isRecord(body)) return adminError(400, \"expected a JSON object\")\n const { advance, reset, ...rest } = body\n if (reset !== undefined && typeof reset !== \"boolean\")\n return adminError(400, \"reset: expected a boolean\")\n return json(\n 200,\n controls.changeClock(namespace, {\n ...normalizeClock(rest),\n ...(advance !== undefined ? { advanceMs: durationMs(advance, \"advance\", true) } : {}),\n ...(reset === true ? { reset: true } : {}),\n }),\n )\n }),\n\n \"GET /latency\": ({ namespace }) => {\n controls.ensure(namespace)\n return json(200, controls.latency.get(namespace))\n },\n \"PUT /latency\": ({ body, namespace }) =>\n guard(() => {\n controls.ensure(namespace)\n return json(200, controls.latency.set(namespace, normalizeLatency(body ?? {})))\n }),\n \"DELETE /latency\": ({ namespace }) => {\n controls.ensure(namespace)\n controls.latency.clear(namespace)\n return json(200, controls.latency.get(namespace))\n },\n\n \"GET /faults\": ({ url, namespace }) => {\n controls.ensure(namespace)\n return json(200, {\n faults: faults.list(url.searchParams.get(\"all\") === \"1\" ? undefined : namespace),\n })\n },\n \"POST /faults\": ({ body, namespace }) =>\n guard(() => {\n const preset = isRecord(body) && typeof body.preset === \"string\" ? body.preset : undefined\n if (preset !== undefined && !controls.presets[preset])\n return adminError(\n 404,\n `no fault preset ${JSON.stringify(preset)}; GET ${adminPrefix}/faults/presets`,\n )\n const added = controls.addFault(namespace, body)\n return preset !== undefined ? json(201, { preset, rules: added }) : json(201, added[0])\n }),\n \"PUT /faults\": ({ body, namespace }) =>\n guard(() => {\n const list = isRecord(body) ? body.faults : undefined\n if (!Array.isArray(list)) return adminError(400, 'expected {\"faults\": [...]}')\n controls.apply(namespace, normalizeControls({ faults: list }))\n return json(200, { faults: faults.list(namespace) })\n }),\n \"DELETE /faults\": ({ url, namespace }) => {\n controls.ensure(namespace)\n const everyNamespace = url.searchParams.get(\"all\") === \"1\"\n const id = url.searchParams.get(\"id\")\n if (id !== null) return removeFault(id, namespace, everyNamespace)\n faults.clear(everyNamespace ? undefined : namespace)\n return json(200, { status: \"ok\" })\n },\n \"GET /faults/presets\": () => json(200, presetList()),\n \"POST /faults/presets/:name\": ({ params, body, namespace }) =>\n guard(() => {\n const name = params.name as string\n if (!controls.presets[name])\n return adminError(404, `no fault preset ${name}; GET ${adminPrefix}/faults/presets`)\n return json(201, {\n preset: name,\n rules: controls.addFault(namespace, { ...(isRecord(body) ? body : {}), preset: name }),\n })\n }),\n \"GET /faults/:id\": ({ params, namespace }) => {\n controls.ensure(namespace)\n const found = faults.get(params.id as string, namespace)\n return found ? json(200, found) : adminError(404, `no fault ${params.id}`)\n },\n \"DELETE /faults/:id\": ({ params, url, namespace }) => {\n controls.ensure(namespace)\n return removeFault(params.id as string, namespace, url.searchParams.get(\"all\") === \"1\")\n },\n\n \"GET /snapshots\": ({ namespace }) => json(200, { snapshots: snapshots.list(namespace) }),\n \"POST /snapshots\": ({ body, namespace }) =>\n guard(() => {\n const id = isRecord(body) ? body.name : undefined\n if (id !== undefined && (typeof id !== \"string\" || !KEY_PATTERN.test(id)))\n return adminError(400, `name: must match ${KEY_PATTERN}`)\n return json(201, snapshots.create(namespace, id))\n }),\n \"GET /snapshots/:id\": ({ params, namespace }) => {\n const id = params.id as string\n const info = snapshots.get(namespace, id)\n if (!info) return adminError(404, `no snapshot ${id} in namespace ${namespace}`)\n return json(200, snapshots.export(namespace, id) ?? info)\n },\n \"PUT /snapshots/:id\": ({ params, body, namespace }) =>\n guard(() => {\n const id = params.id as string\n if (!KEY_PATTERN.test(id)) return adminError(400, `id: must match ${KEY_PATTERN}`)\n return json(200, snapshots.import(namespace, id, assertSnapshotDocument(body)))\n }),\n \"POST /snapshots/:id/restore\": ({ params, namespace }) =>\n guard(() => {\n const id = params.id as string\n if (!snapshots.restore(namespace, id))\n return adminError(404, `no snapshot ${id} in namespace ${namespace}`)\n return json(200, { status: \"ok\", id, namespace })\n }),\n \"DELETE /snapshots/:id\": ({ params, namespace }) => {\n const id = params.id as string\n return snapshots.remove(namespace, id)\n ? json(200, { status: \"ok\" })\n : adminError(404, `no snapshot ${id} in namespace ${namespace}`)\n },\n\n \"GET /timeline\": ({ namespace }) => json(200, context.timeTravel.inspect(namespace)),\n \"POST /checkpoints\": ({ body, namespace }) => {\n const branch = isRecord(body) && typeof body.branch === \"string\" ? body.branch : \"main\"\n try {\n return json(201, context.timeTravel.checkpoint(namespace, branch))\n } catch (error) {\n return adminError(409, error instanceof Error ? error.message : String(error))\n }\n },\n \"POST /branches/:name\": ({ params, body, namespace }) => {\n const at = isRecord(body) && typeof body.at === \"string\" ? body.at : undefined\n try {\n return json(\n 201,\n context.timeTravel.branch(params.name as string, {\n namespace,\n ...(at !== undefined ? { at } : {}),\n }),\n )\n } catch (error) {\n return adminError(409, error instanceof Error ? error.message : String(error))\n }\n },\n \"POST /branches/:name/checkout\": ({ params, body, namespace }) => {\n if (!isRecord(body) || typeof body.checkpoint !== \"string\") {\n return adminError(400, 'expected {\"checkpoint\":\"cp_...\"}')\n }\n try {\n context.timeTravel.checkout(body.checkpoint, {\n namespace,\n branch: params.name as string,\n })\n return json(200, { status: \"ok\", branch: params.name, checkpoint: body.checkpoint })\n } catch (error) {\n return adminError(409, error instanceof Error ? error.message : String(error))\n }\n },\n\n \"GET /requests\": ({ url, namespace }) => {\n const status = url.searchParams.get(\"status\")\n const since = url.searchParams.get(\"since\")\n const limit = url.searchParams.get(\"limit\")\n const sinceMs = since === null ? undefined : parseInstant(since)\n if (since !== null && sinceMs === undefined) {\n return adminError(400, \"since: expected epoch ms or ISO-8601\")\n }\n // `0` is a status here: it is how the journal records a dropped connection.\n if (status !== null && !/^(0|\\d{3})$/.test(status))\n return adminError(400, \"status: expected an HTTP status, or 0 for a dropped connection\")\n if (limit !== null && !/^\\d+$/.test(limit)) return adminError(400, \"limit: expected a count\")\n const operationId = url.searchParams.get(\"operationId\")\n const method = url.searchParams.get(\"method\")\n const path = url.searchParams.get(\"path\")\n const faultId = url.searchParams.get(\"faultId\")\n const everyNamespace = url.searchParams.get(\"all\") === \"1\"\n return json(200, {\n size: context.journal.size,\n requests: context.journal.list({\n ...(everyNamespace ? {} : { namespace }),\n ...(operationId !== null ? { operationId } : {}),\n ...(method !== null ? { method } : {}),\n ...(path !== null ? { path } : {}),\n ...(faultId !== null ? { faultId } : {}),\n ...(status !== null ? { status: Number(status) } : {}),\n ...(sinceMs !== undefined ? { since: sinceMs } : {}),\n ...(limit !== null ? { limit: Number(limit) } : {}),\n }),\n })\n },\n \"DELETE /requests\": ({ url, namespace }) => {\n context.journal.clear(url.searchParams.get(\"all\") === \"1\" ? undefined : namespace)\n return json(200, { status: \"ok\" })\n },\n\n // Totals across every namespace, unless the caller names one.\n \"GET /metrics\": ({ request, url, namespace }) =>\n json(200, context.metrics.report(explicitNamespace(request, url) ? namespace : undefined)),\n \"DELETE /metrics\": ({ request, url, namespace }) => {\n context.metrics.reset(explicitNamespace(request, url) ? namespace : undefined)\n return json(200, { status: \"ok\" })\n },\n }\n\n for (const key of Object.keys(context.routes)) {\n if (Object.hasOwn(builtin, key)) throw new Error(`admin route ${key} overrides a shared route`)\n const path = key.slice(key.indexOf(\" \") + 1)\n if (isAdminPath(path, \"/ns\") || isAdminPath(path, \"/blobs\"))\n throw new Error(`admin route ${key} overlaps an internal transport`)\n }\n const routes = [...Object.entries(builtin), ...Object.entries(context.routes)]\n .map(([key, handler]) => {\n const space = key.indexOf(\" \")\n return { method: key.slice(0, space), pattern: key.slice(space + 1), handler }\n })\n // Stable: among equally specific routes the shared ones still come first.\n .sort((a, b) => paramCount(a.pattern) - paramCount(b.pattern))\n\n return {\n namespaceOf: headerNamespace,\n controls,\n snapshots,\n async handle(request) {\n const url = new URL(request.url)\n if (url.pathname === `${adminPrefix}/health` && request.method === \"GET\") {\n return health()\n }\n if (!isAdminPath(url.pathname, adminPrefix)) {\n return undefined\n }\n const path = url.pathname.slice(adminPrefix.length) || \"/\"\n // The shell and its vendor chip have no data. Panel markup stays on GET /ui/manifest,\n // which is locked.\n const shell =\n request.method === \"GET\" &&\n (path === \"/ui\" || path === \"/ui/\" || path === ADMIN_BRANDS_PATH)\n if (\n !shell &&\n context.adminKey !== undefined &&\n !hasAdminKey(request.headers, context.adminKey)\n ) {\n return adminError(401, `missing or wrong ${ADMIN_KEY_HEADER}`)\n }\n for (const route of routes) {\n if (route.method !== request.method) continue\n let params: Record<string, string> | undefined\n try {\n params = matchRoute(route.pattern, path)\n } catch {\n return adminError(400, \"invalid path encoding\")\n }\n if (!params) continue\n let body: unknown\n try {\n body = await readJson(request)\n } catch {\n return adminError(400, \"request body is not valid JSON\")\n }\n const namespace = adminNamespace(request, url)\n if (!KEY_PATTERN.test(namespace)) return adminError(400, \"invalid namespace\")\n return route.handler({\n request,\n url,\n params,\n namespace,\n body,\n })\n }\n return adminError(\n 404,\n `no admin route ${request.method} ${path}; GET ${adminPrefix} lists them`,\n )\n },\n }\n}\n", "/**\n * Reading the vendor credential a request carries.\n *\n * Several vendor SDKs (Stripe, AWS, PostHog, Twilio) cannot add a namespace header, so a\n * runtime can also pick a request's namespace from its credential: a suite maps each\n * worker's API key, token or account SID to a namespace through `PUT /__admin/credentials`.\n * These helpers pull the credential out of the usual carriers.\n */\n\n/** The token after `Bearer `, or `undefined`. */\nexport const bearerToken = (request: Request): string | undefined => {\n const header = request.headers.get(\"authorization\")\n if (!header) return undefined\n const match = /^Bearer\\s+(.+)$/i.exec(header.trim())\n return match?.[1]?.trim() || undefined\n}\n\nexport type BasicCredentials = { username: string; password: string }\n\n/** `{ username, password }` from `Authorization: Basic \u2026`, or `undefined`. */\nexport const basicAuth = (request: Request): BasicCredentials | undefined => {\n const header = request.headers.get(\"authorization\")\n if (!header) return undefined\n const match = /^Basic\\s+(.+)$/i.exec(header.trim())\n if (!match?.[1]) return undefined\n let decoded: string\n try {\n decoded = atob(match[1].trim())\n } catch {\n return undefined\n }\n const colon = decoded.indexOf(\":\")\n if (colon < 0) return { username: decoded, password: \"\" }\n return { username: decoded.slice(0, colon), password: decoded.slice(colon + 1) }\n}\n\n/**\n * The access key id of an AWS SigV4-signed request (`Credential=AKID/date/region/service/\u2026`),\n * from the `Authorization` header or a presigned `X-Amz-Credential` query parameter.\n */\nexport const sigV4AccessKeyId = (request: Request): string | undefined => {\n const header = request.headers.get(\"authorization\")\n const fromHeader = header ? /Credential=([^/,\\s]+)\\//.exec(header)?.[1] : undefined\n if (fromHeader) return fromHeader\n const query = new URL(request.url).searchParams.get(\"X-Amz-Credential\")\n return query ? (query.split(\"/\")[0] ?? undefined) : undefined\n}\n\n/** The credential in any of the common carriers: Bearer, Basic username, SigV4, or `x-api-key`. */\nexport const anyCredential = (request: Request): string | undefined =>\n bearerToken(request) ??\n basicAuth(request)?.username ??\n sigV4AccessKeyId(request) ??\n request.headers.get(\"x-api-key\") ??\n undefined\n\n/** Credential \u2192 namespace mapping behind `PUT /__admin/credentials`. */\nexport type CredentialRegistry = {\n set(credential: string, namespace: string): void\n get(credential: string): string | undefined\n remove(credential: string): boolean\n clear(): void\n entries(): { credential: string; namespace: string }[]\n}\n\nexport const createCredentialRegistry = (): CredentialRegistry => {\n const map = new Map<string, string>()\n return {\n set: (credential, namespace) => {\n map.set(credential, namespace)\n },\n get: (credential) => map.get(credential),\n remove: (credential) => map.delete(credential),\n clear: () => map.clear(),\n entries: () =>\n [...map]\n .map(([credential, namespace]) => ({ credential, namespace }))\n .sort((a, b) => a.credential.localeCompare(b.credential)),\n }\n}\n\n/** A credential shown in admin output: enough to recognise it, never the whole secret. */\nexport const maskCredential = (credential: string): string =>\n credential.length <= 8\n ? `${credential.slice(0, 2)}\u2026`\n : `${credential.slice(0, 6)}\u2026${credential.slice(-2)}`\n", "import { JSON_MEDIA_TYPE } from \"@crvouga/mockingbird-http-codec\"\n\n/** JSON response with a normalised content type. */\nexport const jsonRes = (\n status: number,\n body: unknown,\n headers: Record<string, string> = {},\n): Response =>\n new Response(JSON.stringify(body), {\n status,\n headers: { \"content-type\": JSON_MEDIA_TYPE, ...headers },\n })\n\n/** Thrown by handlers to produce a provider-shaped error response via `onError`. */\nexport class HttpError extends Error {\n constructor(\n readonly status: number,\n readonly body: unknown,\n readonly headers: Record<string, string> = {},\n ) {\n super(`HTTP ${status}`)\n this.name = \"HttpError\"\n }\n\n toResponse(): Response {\n const contentType = this.headers[\"content-type\"]?.split(\";\", 1)[0]?.trim().toLowerCase()\n if (contentType === \"text/plain\") {\n return new Response(String(this.body), {\n status: this.status,\n headers: this.headers,\n })\n }\n return jsonRes(this.status, this.body, this.headers)\n }\n}\n\nexport type FieldResult<T> = { ok: true; value: T } | { ok: false; reason: string }\n\nconst ok = <T>(value: T): FieldResult<T> => ({ ok: true, value })\nconst fail = <T>(reason: string): FieldResult<T> => ({ ok: false, reason })\n\n/** Form bodies decode to strings; these coerce the way HTTP servers do, reporting why not. */\nexport const coerce = {\n string(value: unknown): FieldResult<string> {\n return typeof value === \"string\" ? ok(value) : fail(\"expected a string\")\n },\n integer(value: unknown): FieldResult<number> {\n if (typeof value === \"number\" && Number.isInteger(value)) return ok(value)\n if (typeof value === \"string\" && /^-?\\d+$/.test(value.trim())) {\n const parsed = Number(value)\n return Number.isSafeInteger(parsed) ? ok(parsed) : fail(\"integer out of range\")\n }\n return fail(\"expected an integer\")\n },\n boolean(value: unknown): FieldResult<boolean> {\n if (typeof value === \"boolean\") return ok(value)\n if (value === \"true\" || value === \"1\") return ok(true)\n if (value === \"false\" || value === \"0\") return ok(false)\n return fail(\"expected a boolean\")\n },\n enumeration<T extends string>(value: unknown, allowed: readonly T[]): FieldResult<T> {\n const match = allowed.find((candidate) => candidate === value)\n return match === undefined ? fail(`expected one of ${allowed.join(\", \")}`) : ok(match)\n },\n /** Flat string-to-string map, the shape of Stripe-style `metadata`. */\n stringMap(value: unknown): FieldResult<Record<string, string>> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value))\n return fail(\"expected an object\")\n const out: Record<string, string> = {}\n for (const [key, item] of Object.entries(value)) {\n if (typeof item !== \"string\") return fail(`expected a string at ${key}`)\n out[key] = item\n }\n return ok(out)\n },\n}\n\n/** Count Unicode code points, the way JSON Schema and most APIs measure string length. */\nexport const codePointLength = (value: string) => [...value].length\n", "import type { BodyIssue } from \"./validation.js\"\n\n/**\n * What the mock received from a request it rejected, so a 4xx can be attributed after the\n * fact (an empty body, a missing `content-type`, a schema violation) without logging the body.\n */\nexport type RejectedRequest = {\n /** The raw `content-type` header, or `null` when the request sent none. */\n contentType: string | null\n /** Bytes of body received from `content-length` (`0` for none), or `null` when the client sent no length (a streamed / chunked body). */\n bodyBytes: number | null\n /** The raw `transfer-encoding` header (`chunked`), or `null`. */\n transferEncoding: string | null\n}\n\n/** One handled request, as the structured log sees it. */\nexport type RequestLog = {\n service: string\n namespace: string\n operationId: string | undefined\n method: string\n path: string\n status: number\n durationMs: number\n /** True when the path matched no operation in the contract. */\n unmatched: boolean\n /** Set when a fault rule produced the response. */\n faultId?: string\n /** Milliseconds of injected wait: latency, fault delays and timeouts. Absent when none. */\n delayMs?: number\n /** Resource ids the handler touched (`userId`, `orderId`, \u2026), when the service reports them. */\n ids?: Record<string, string>\n /** Set when the service created a resource the request referred to but that did not exist. */\n adopted?: boolean\n /** Explicit durable acceptance, independent of response delivery. */\n accepted?: boolean\n /** Checkpoint captured at explicit acceptance. */\n checkpoint?: string\n /** Set on a rejection (status \u2265 400) the mock produced itself, never on a scripted fault. */\n request?: RejectedRequest\n /** The validation issues behind a rejection, when the service found any. */\n issues?: BodyIssue[]\n}\n\nexport type MetricsReport = {\n requests: number\n /** Counts keyed `<operationId> <status>`. */\n byOperation: Record<string, number>\n /**\n * Paths that matched no operation, most frequent first.\n *\n * This is the early-warning signal: a consumer calling something the mock does\n * not implement shows up here as a count, before it fails a suite as a 404.\n */\n unmatched: { method: string; path: string; count: number }[]\n faults: number\n totalDurationMs: number\n}\n\nexport type Metrics = {\n record(entry: RequestLog): void\n report(namespace?: string): MetricsReport\n reset(namespace?: string): void\n}\n\nexport const createMetrics = (partition = true): Metrics => {\n const namespaces = new Map<string, Metrics>()\n let requests = 0\n let faults = 0\n let totalDurationMs = 0\n const byOperation = new Map<string, number>()\n const unmatched = new Map<string, number>()\n return {\n record(entry) {\n if (partition) {\n let scoped = namespaces.get(entry.namespace)\n if (!scoped) {\n scoped = createMetrics(false)\n namespaces.set(entry.namespace, scoped)\n }\n scoped.record(entry)\n }\n requests++\n totalDurationMs += entry.durationMs\n if (entry.faultId !== undefined) faults++\n const key = `${entry.operationId ?? \"(unmatched)\"} ${entry.status}`\n byOperation.set(key, (byOperation.get(key) ?? 0) + 1)\n if (entry.unmatched) {\n const route = `${entry.method} ${entry.path}`\n unmatched.set(route, (unmatched.get(route) ?? 0) + 1)\n }\n },\n report: (namespace) =>\n namespace !== undefined\n ? (namespaces.get(namespace) ?? createMetrics(false)).report()\n : {\n requests,\n byOperation: Object.fromEntries(\n [...byOperation].sort(([a], [b]) => a.localeCompare(b)),\n ),\n unmatched: [...unmatched]\n .sort((a, b) => b[1] - a[1] || a[0].localeCompare(b[0]))\n .map(([route, count]) => {\n const space = route.indexOf(\" \")\n return { method: route.slice(0, space), path: route.slice(space + 1), count }\n }),\n faults,\n totalDurationMs,\n },\n reset(namespace) {\n if (namespace !== undefined) {\n namespaces.delete(namespace)\n return\n }\n namespaces.clear()\n requests = 0\n faults = 0\n totalDurationMs = 0\n byOperation.clear()\n unmatched.clear()\n },\n }\n}\n", "/** Policy only for runtime-owned HTTP sends; it does not sandbox DNS or arbitrary sockets. */\nexport type OutboundPolicy = {\n mode: \"offline\" | \"allowlist\"\n origins?: string[]\n maxRedirects?: number\n maxBodyBytes?: number\n onReject?(event: { namespace: string; policy: string; reason: string }): void\n}\nexport type OwnedTransport = (\n request: Request,\n namespace: string,\n send: typeof fetch,\n) => Promise<Response>\nexport function ownedTransport(policy: OutboundPolicy): OwnedTransport {\n if (\n ![\"offline\", \"allowlist\"].includes(policy.mode) ||\n policy.origins?.some((origin) => {\n try {\n return new URL(origin).origin !== origin\n } catch {\n return true\n }\n })\n )\n throw new Error(\"invalid outbound transport policy\")\n const reject = (namespace: string, reason: string): never => {\n try {\n policy.onReject?.({ namespace, policy: policy.mode, reason })\n } catch {}\n throw new Error(`outbound policy ${policy.mode}: ${reason}`)\n }\n return async (request, namespace, send) => {\n if (policy.mode === \"offline\") return reject(namespace, \"delivery disabled\")\n const allowed = (url: URL) =>\n [\"http:\", \"https:\"].includes(url.protocol) &&\n !url.username &&\n !url.password &&\n (policy.origins ?? []).includes(url.origin)\n let url = new URL(request.url)\n if (!allowed(url)) return reject(namespace, \"destination not allowed\")\n const max = policy.maxBodyBytes ?? 1024 * 1024\n const chunks: Uint8Array[] = []\n let size = 0\n const reader = request.body?.getReader()\n if (reader)\n try {\n for (;;) {\n const item = await reader.read()\n if (item.done) break\n size += item.value.length\n if (size > max) return reject(namespace, \"body limit exceeded\")\n chunks.push(item.value)\n }\n } finally {\n void reader.cancel().catch(() => {})\n reader.releaseLock()\n }\n const body = new Uint8Array(size)\n let offset = 0\n for (const chunk of chunks) {\n body.set(chunk, offset)\n offset += chunk.length\n }\n let method = request.method,\n headers = new Headers(request.headers)\n for (let redirects = 0; ; redirects++) {\n if (!allowed(url)) return reject(namespace, \"redirect destination not allowed\")\n const response = await send(\n new Request(url, {\n method,\n headers,\n ...(method !== \"GET\" && method !== \"HEAD\" ? { body } : {}),\n redirect: \"manual\",\n signal: request.signal,\n }),\n )\n if (![301, 302, 303, 307, 308].includes(response.status)) return response\n const location = response.headers.get(\"location\")\n if (!location) return response\n await response.body?.cancel()\n if (redirects >= (policy.maxRedirects ?? 5))\n return reject(namespace, \"redirect limit exceeded\")\n const next = new URL(location, url)\n if (next.origin !== url.origin) {\n headers = new Headers(headers)\n for (const key of [\"authorization\", \"cookie\", \"proxy-authorization\"]) headers.delete(key)\n }\n if (\n response.status === 303 ||\n ((response.status === 301 || response.status === 302) && method === \"POST\")\n ) {\n method = \"GET\"\n headers.delete(\"content-length\")\n headers.delete(\"content-type\")\n }\n url = next\n }\n }\n}\n", "/**\n * The shared admin is a prebuilt React + Ant Design bundle (about 1.3 MB as a string). The\n * runtime loads it lazily, on the first request for an admin page, through a dynamic `import()`\n * with a literal specifier: Node, Bun and every bundler resolve it, a bundler that splits code\n * keeps it in a chunk of its own, and an app that never serves `/__admin/ui` never parses it.\n * `scripts/bundle-service.ts` emits it as `dist/admin-ui.js` beside each service's entries.\n * Service imports stay DOM-free and nothing here imports the bundle statically.\n */\nexport type { AdminConfig as AdminBootConfig } from \"@crvouga/mockingbird-admin-ui\"\n\nexport type AdminClient = typeof import(\"@crvouga/mockingbird-admin-ui/document\")\n\nlet loading: Promise<AdminClient> | undefined\n\n/** The browser client, imported once per process on first use. A failed import is retried. */\nexport const loadAdminClient = (): Promise<AdminClient> => {\n loading ??= import(\"@crvouga/mockingbird-admin-ui/document\").catch((error: unknown) => {\n loading = undefined\n throw error\n })\n return loading\n}\n", "import { requestBaseUrl } from \"@crvouga/mockingbird-core\"\nimport { type AdminClient, loadAdminClient } from \"./admin-client.js\"\nimport type { AdminRoutes } from \"./control.js\"\nimport { ADMIN_BRANDS_PATH, ADMIN_KEY_HEADER, ADMIN_PREFIX } from \"./control.js\"\nimport type { AdminExtension, AdminUi } from \"./surface.js\"\nimport { STANDARD_ADMIN_ROUTES } from \"./surface.js\"\n\nconst escapeHtml = (value: string): string =>\n value.replace(/[&<>\"']/g, (char) => {\n switch (char) {\n case \"&\":\n return \"&amp;\"\n case \"<\":\n return \"&lt;\"\n case \">\":\n return \"&gt;\"\n case '\"':\n return \"&quot;\"\n default:\n return \"&#39;\"\n }\n })\n\n/** One service's vendor chip: what `GET <adminPrefix>/ui/brands.json` returns under its name. */\nexport type AdminBrand = {\n vendor: string\n website: string\n /** Vendor API reference, when there is one. */\n docs: string | null\n /** The service's page on the docs site. A link only; the admin never fetches it. */\n guide: string\n /** A `data:image/\u2026;base64,` URI, so the chip loads nothing from the network; \"\" for none. */\n logo: string\n color: string | null\n description: string | null\n}\n\n/**\n * The brand record of the package this runtime was bundled into. `scripts/bundle-service.ts`\n * defines it from `sites/docs/src/data/brands.json` and the logo file; unbundled (tests,\n * source checkouts) it is absent and the admin shows no chip.\n */\ndeclare const __MOCKINGBIRD_ADMIN_BRAND__: AdminBrand | undefined\nconst EMBEDDED_BRAND: AdminBrand | undefined =\n typeof __MOCKINGBIRD_ADMIN_BRAND__ === \"object\" ? __MOCKINGBIRD_ADMIN_BRAND__ : undefined\n\n/**\n * The catalog the shared client reads: `{ [service]: brand }`, or `{}` without one. It ships\n * inside the package and is served by the emulator, so opening the admin makes no request to\n * any other host (no CORS failure, works offline).\n */\nexport const adminBrandCatalog = (\n service: string,\n brand: AdminBrand | undefined = EMBEDDED_BRAND,\n): Record<string, AdminBrand> => (brand ? { [service]: brand } : {})\n\n/**\n * The default admin document. It talks only to `/__admin/*`, so every mock can serve it.\n * Bespoke panels arrive later from `GET /ui/manifest`, which stays behind the admin key.\n * The header chip is filled from `GET <adminPrefix>/ui/brands.json` on the same emulator.\n */\nexport const renderAdminDocument = async (\n service: string,\n adminPrefix = ADMIN_PREFIX,\n): Promise<string> => adminDocument(await loadAdminClient(), service, adminPrefix)\n\nconst adminDocument = (client: AdminClient, service: string, adminPrefix: string): string => {\n const name = escapeHtml(service)\n const script = client.adminClientSource({\n standardRoutes: STANDARD_ADMIN_ROUTES,\n adminPrefix,\n adminKeyHeader: ADMIN_KEY_HEADER,\n brandsUrl: `${adminPrefix}${ADMIN_BRANDS_PATH}`,\n service,\n })\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<meta name=\"color-scheme\" content=\"light dark\">\n<title>${name} admin</title>\n<style>html,body{margin:0;min-height:100%}#admin-root{min-height:100%}</style>\n</head>\n<body>\n<main id=\"admin-root\" data-mockingbird-admin data-admin-ui-library=\"antd\" data-service=\"${name}\">\n<noscript>Enable JavaScript to use administration.</noscript>\n</main>\n${script}\n</body>\n</html>`\n}\n\nconst htmlResponse = (body: string): Response =>\n new Response(body, {\n status: 200,\n headers: {\n \"content-type\": \"text/html; charset=utf-8\",\n \"cache-control\": \"no-store\",\n },\n })\n\nconst json = (body: unknown): Response =>\n new Response(JSON.stringify(body), {\n status: 200,\n headers: { \"content-type\": \"application/json; charset=utf-8\" },\n })\n\nconst describeExtension = (extension: AdminExtension): Record<string, unknown> => {\n if (extension.kind === \"route\") return { ...extension }\n if (extension.kind === \"sql\") {\n return {\n kind: \"sql\",\n id: extension.id ?? \"sql\",\n title: extension.title ?? \"SQL\",\n ...(extension.description !== undefined ? { description: extension.description } : {}),\n }\n }\n return {\n kind: \"panel\",\n id: extension.id,\n title: extension.title,\n ...(extension.description !== undefined ? { description: extension.description } : {}),\n html: extension.html,\n ...(extension.script !== undefined ? { script: extension.script } : {}),\n }\n}\n\n/** `GET /__admin/ui` plus the manifest a bespoke panel list is read from. */\nexport const adminUiRoutes = (\n service: string,\n ui: AdminUi | undefined,\n adminPrefix = ADMIN_PREFIX,\n): AdminRoutes => {\n // The client bundle is loaded here, on the first page request, not when the runtime is built;\n // `render` and `defaultHtml()` stay synchronous for bespoke documents.\n const page = async ({ request }: { request: Request }): Promise<Response> => {\n let client: AdminClient\n try {\n client = await loadAdminClient()\n } catch (error) {\n // An app bundle may leave the client out (`--external:./admin-ui.js`) and never serve it.\n return new Response(\n `The admin page is not available: its browser client (admin-ui.js) could not be loaded. ${error instanceof Error ? error.message : String(error)}`,\n { status: 503, headers: { \"content-type\": \"text/plain; charset=utf-8\" } },\n )\n }\n const mountPrefix = new URL(requestBaseUrl(request)).pathname.replace(/\\/$/, \"\")\n const shell = () => adminDocument(client, service, `${mountPrefix}${adminPrefix}`)\n return htmlResponse(ui?.render ? ui.render({ service, defaultHtml: shell }) : shell())\n }\n return {\n \"GET /ui\": page,\n \"GET /ui/\": page,\n [`GET ${ADMIN_BRANDS_PATH}`]: () => json(adminBrandCatalog(service)),\n \"GET /ui/manifest\": () =>\n json({\n service,\n standardRoutes: STANDARD_ADMIN_ROUTES,\n panels: (ui?.panels ?? []).map((panel) => ({\n id: panel.id,\n title: panel.title,\n ...(panel.description !== undefined ? { description: panel.description } : {}),\n html: panel.html,\n ...(panel.script !== undefined ? { script: panel.script } : {}),\n })),\n extensions: (ui?.extensions ?? []).map(describeExtension),\n }),\n }\n}\n", "import { Timeline } from \"@crvouga/mockingbird-core\"\nimport type { SqliteClient } from \"@crvouga/mockingbird-sqlite\"\n\n/**\n * A point-in-time copy of everything a service namespace holds.\n *\n * All service state lives in the two core tables keyed by namespace, so a snapshot\n * is generic: any service gets per-test rollback without knowing its own schema.\n * Restoring is much cheaper than rebuilding a namespace from a corpus.\n */\nexport type NamespaceSnapshot = {\n namespace: string\n records: { collection: string; id: string; seq: number; value: string }[]\n sequences: { name: string; kind: string; value: number }[]\n}\n\n/**\n * @deprecated Low-level Timeline payload capture retained for API compatibility. Provider code\n * must use the runtime Timeline or `withNamespaceRollback`.\n */\nexport const snapshotNamespace = (sqlite: SqliteClient, namespace: string): NamespaceSnapshot => ({\n namespace,\n records: sqlite\n .prepare(\n \"SELECT collection, id, seq, value FROM mockingbird_records WHERE namespace = ? ORDER BY collection, seq\",\n )\n .all<{ collection: string; id: string; seq: number; value: string }>(namespace),\n sequences: sqlite\n .prepare(\n \"SELECT name, kind, value FROM mockingbird_sequences WHERE namespace = ? ORDER BY name, kind\",\n )\n .all<{ name: string; kind: string; value: number }>(namespace),\n})\n\n/**\n * Replace a namespace's contents with `snapshot`. The namespace is emptied first,\n * so restoring is an assignment, not a merge \u2014 records created since the snapshot\n * are gone afterwards.\n *\n * @deprecated Low-level Timeline payload restore retained for API compatibility. Provider code\n * must use the runtime Timeline or `withNamespaceRollback`.\n */\nexport const restoreNamespace = (\n sqlite: SqliteClient,\n namespace: string,\n snapshot: NamespaceSnapshot,\n): void => {\n sqlite.transaction(() => {\n sqlite.prepare(\"DELETE FROM mockingbird_records WHERE namespace = ?\").run(namespace)\n sqlite.prepare(\"DELETE FROM mockingbird_sequences WHERE namespace = ?\").run(namespace)\n const record = sqlite.prepare(\n \"INSERT INTO mockingbird_records (namespace, collection, id, seq, value) VALUES (?, ?, ?, ?, ?)\",\n )\n for (const row of snapshot.records) {\n record.run(namespace, row.collection, row.id, row.seq, row.value)\n }\n const sequence = sqlite.prepare(\n \"INSERT INTO mockingbird_sequences (namespace, name, kind, value) VALUES (?, ?, ?, ?)\",\n )\n for (const row of snapshot.sequences) {\n sequence.run(namespace, row.name, row.kind, row.value)\n }\n })\n}\n\n/**\n * Execute asynchronous service work atomically using the canonical Timeline rollback primitive.\n * This is the prescribed escape hatch when the SQLite adapter cannot hold a transaction across\n * `await`; service code should not coordinate raw namespace snapshots itself.\n */\nexport const withNamespaceRollback = async <T>(\n sqlite: SqliteClient,\n namespace: string,\n run: () => Promise<T>,\n): Promise<T> => {\n const rollback = new Timeline<NamespaceSnapshot>({ maxCheckpoints: 1 })\n const before = rollback.commit(snapshotNamespace(sqlite, namespace))\n try {\n return await run()\n } catch (error) {\n restoreNamespace(sqlite, namespace, before.value)\n throw error\n }\n}\n", "import type { SqliteClient } from \"@crvouga/mockingbird-sqlite\"\nimport { Collection } from \"./collection.js\"\nimport type { AdminRoutes } from \"./control.js\"\n\nexport const STATE_FIELD_KINDS = [\n \"string\",\n \"number\",\n \"boolean\",\n \"null\",\n \"object\",\n \"array\",\n \"unknown\",\n] as const\n\nexport type StateFieldKind = (typeof STATE_FIELD_KINDS)[number]\n\n/** JSON-safe annotations a bespoke admin UI may read. The default UI shows them as text. */\nexport type StateMeta = Readonly<Record<string, string | number | boolean | null>>\n\nexport type StateField = {\n name: string\n kind: StateFieldKind\n optional: boolean\n description?: string\n /** One level of nested object fields. */\n fields?: StateField[]\n meta?: StateMeta\n}\n\n/**\n * What a service knows about a collection before any row exists.\n * Stored rows still appear, including fields this declaration does not mention.\n */\nexport type StateDeclaration = {\n name: string\n label?: string\n description?: string\n fields?: readonly StateField[]\n meta?: StateMeta\n}\n\nexport type StateCollectionView = {\n name: string\n label: string\n description?: string\n count: number\n /** `mixed` when a declaration and stored rows both contribute fields. */\n source: \"declared\" | \"inferred\" | \"mixed\"\n fields: StateField[]\n meta?: StateMeta\n}\n\n/** The shape of one namespace, for an admin UI that has never seen the service before. */\nexport type StateView = {\n namespace: string\n storageNamespace: string\n collections: StateCollectionView[]\n}\n\nexport type StateRecord = {\n id: string\n seq: number\n value: unknown\n}\n\nexport type StatePage = {\n collection: string\n count: number\n records: StateRecord[]\n next: number | null\n}\n\nexport type StateFailure = { ok: false; status: number; message: string }\nexport type StateResult<T> = { ok: true; value: T } | StateFailure\n\nconst COLLECTION_NAME = /^[A-Za-z0-9_.@:-]{1,200}$/\nconst RECORD_ID = /^[^\\s/]{1,256}$/\nconst SAMPLE = 25\nconst WALK_LIMIT = 10_000\nconst SKIP_CTORS = new Set([\"Hono\", \"HonoRequest\", \"Router\"])\n\nconst fail = (status: number, message: string): StateFailure => ({ ok: false, status, message })\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n\nconst kindOf = (value: unknown): StateFieldKind => {\n if (value === null) return \"null\"\n if (Array.isArray(value)) return \"array\"\n switch (typeof value) {\n case \"string\":\n return \"string\"\n case \"number\":\n return Number.isFinite(value) ? \"number\" : \"unknown\"\n case \"boolean\":\n return \"boolean\"\n case \"object\":\n return \"object\"\n default:\n return \"unknown\"\n }\n}\n\nconst humanize = (name: string): string => {\n const words = name.replace(/[@:_-]+/g, \" \").trim()\n if (words === \"\") return name\n return words.charAt(0).toUpperCase() + words.slice(1)\n}\n\n/** Drop values that cannot ride in a JSON admin response. */\nexport const jsonValue = (value: unknown): StateResult<unknown> => {\n if (value === undefined) return fail(400, \"value is required\")\n try {\n return { ok: true, value: JSON.parse(JSON.stringify(value)) as unknown }\n } catch {\n return fail(400, \"value must be JSON\")\n }\n}\n\nconst ctorName = (value: object): string => {\n const ctor = (value as { constructor?: { name?: string } }).constructor\n return typeof ctor?.name === \"string\" ? ctor.name : \"\"\n}\n\nconst isSqlite = (value: object): boolean =>\n \"prepare\" in value &&\n typeof (value as { prepare?: unknown }).prepare === \"function\" &&\n \"transaction\" in value\n\n/** Every Collection hanging off `root`, including ones stored in maps. */\nexport const discoverCollections = (root: unknown): Collection<unknown>[] => {\n const found: Collection<unknown>[] = []\n const seen = new Set<object>()\n const visit = (value: unknown, depth: number): void => {\n if (found.length + seen.size > WALK_LIMIT) return\n if (value === null || typeof value !== \"object\") return\n if (seen.has(value)) return\n seen.add(value)\n if (value instanceof Collection) {\n found.push(value as Collection<unknown>)\n return\n }\n if (value instanceof Map) {\n for (const child of value.values()) visit(child, depth + 1)\n return\n }\n if (value instanceof Set) {\n for (const child of value.values()) visit(child, depth + 1)\n return\n }\n if (depth > 6 || isSqlite(value) || SKIP_CTORS.has(ctorName(value))) return\n if (Array.isArray(value)) {\n const cap = Math.min(value.length, 32)\n for (let i = 0; i < cap; i++) visit(value[i], depth + 1)\n return\n }\n let children: unknown[]\n try {\n children = Object.values(value)\n } catch {\n return\n }\n for (const child of children) visit(child, depth + 1)\n }\n visit(root, 0)\n return found\n}\n\nconst storedNames = (sqlite: SqliteClient, namespace: string): string[] => {\n const records = sqlite\n .prepare(\"SELECT DISTINCT collection AS name FROM mockingbird_records WHERE namespace = ?\")\n .all<{ name: string }>(namespace)\n const sequences = sqlite\n .prepare(\n \"SELECT DISTINCT name FROM mockingbird_sequences WHERE namespace = ? AND kind = 'collection'\",\n )\n .all<{ name: string }>(namespace)\n return [...records, ...sequences].map((row) => row.name)\n}\n\ntype FieldAccum = {\n name: string\n kinds: Set<StateFieldKind>\n present: number\n nested: Map<string, FieldAccum>\n}\n\nconst blankAccum = (name: string): FieldAccum => ({\n name,\n kinds: new Set(),\n present: 0,\n nested: new Map(),\n})\n\nconst absorb = (accum: FieldAccum, value: unknown): void => {\n const kind = kindOf(value)\n accum.kinds.add(kind)\n accum.present++\n if (!isRecord(value)) return\n for (const [key, child] of Object.entries(value)) {\n const nested = accum.nested.get(key) ?? blankAccum(key)\n absorb(nested, child)\n accum.nested.set(key, nested)\n }\n}\n\nconst finishField = (accum: FieldAccum, samples: number): StateField => {\n const kinds = [...accum.kinds]\n const kind = kinds.length === 1 ? (kinds[0] as StateFieldKind) : \"unknown\"\n const field: StateField = {\n name: accum.name,\n kind,\n optional: accum.present < samples || kinds.includes(\"null\"),\n }\n if (accum.nested.size > 0) {\n field.fields = [...accum.nested.values()]\n .sort((a, b) => a.name.localeCompare(b.name))\n .map((child) => finishField(child, accum.present))\n }\n return field\n}\n\nconst inferFields = (records: StateRecord[]): StateField[] => {\n if (records.length === 0) return []\n const sample = records.slice(0, SAMPLE)\n const objects = sample.filter((record) => isRecord(record.value))\n if (objects.length === 0) {\n const kinds = new Set(sample.map((record) => kindOf(record.value)))\n const list = [...kinds]\n return [\n {\n name: \"(value)\",\n kind: list.length === 1 ? (list[0] as StateFieldKind) : \"unknown\",\n optional: false,\n },\n ]\n }\n const root = new Map<string, FieldAccum>()\n for (const record of objects) {\n for (const [key, value] of Object.entries(record.value as Record<string, unknown>)) {\n const accum = root.get(key) ?? blankAccum(key)\n absorb(accum, value)\n root.set(key, accum)\n }\n }\n return [...root.values()]\n .sort((a, b) => a.name.localeCompare(b.name))\n .map((accum) => finishField(accum, objects.length))\n}\n\nconst mergeFields = (\n declared: readonly StateField[] | undefined,\n inferred: StateField[],\n): StateField[] => {\n const byName = new Map<string, StateField>()\n for (const field of inferred) byName.set(field.name, field)\n const ordered: StateField[] = []\n const seen = new Set<string>()\n for (const field of declared ?? []) {\n const found = byName.get(field.name)\n seen.add(field.name)\n if (!found) {\n ordered.push({ ...field, optional: field.optional })\n continue\n }\n ordered.push({\n ...found,\n kind: field.kind === \"unknown\" ? found.kind : field.kind,\n optional: field.optional || found.optional,\n ...(field.description !== undefined ? { description: field.description } : {}),\n ...(field.meta !== undefined ? { meta: field.meta } : {}),\n ...(field.fields !== undefined\n ? { fields: mergeFields(field.fields, found.fields ?? []) }\n : {}),\n })\n }\n for (const field of inferred) {\n if (!seen.has(field.name)) ordered.push(field)\n }\n return ordered\n}\n\nconst collectionOf = (sqlite: SqliteClient, namespace: string, name: string) =>\n new Collection<unknown>(sqlite, namespace, name)\n\nconst readRecord = (collection: Collection<unknown>, id: string): StateRecord | undefined => {\n const rows = collection.list({ where: (_value, _seq) => true, order: \"oldest\" })\n const row = rows.find((entry) => entry.id === id)\n return row ? { id: row.id, seq: row.seq, value: row.value } : undefined\n}\n\nexport type StateScope = {\n sqlite: SqliteClient\n /** Public namespace name a request selects. */\n namespace: string\n /** Namespace key used in `mockingbird_records`. */\n storageNamespace: string\n /** Service instance, walked for Collection fields. */\n root: unknown\n declarations?: readonly StateDeclaration[]\n}\n\n/** Describe every collection in a namespace. Empty declared collections are included. */\nexport const inspectState = (scope: StateScope): StateView => {\n const declared = new Map<string, StateDeclaration>()\n for (const declaration of scope.declarations ?? []) {\n if (COLLECTION_NAME.test(declaration.name)) declared.set(declaration.name, declaration)\n }\n const names = new Set<string>(declared.keys())\n for (const name of storedNames(scope.sqlite, scope.storageNamespace)) names.add(name)\n for (const collection of discoverCollections(scope.root)) {\n if (collection.namespace === scope.storageNamespace) names.add(collection.collectionName)\n }\n const collections: StateCollectionView[] = []\n for (const name of names) {\n if (!COLLECTION_NAME.test(name)) continue\n const declaration = declared.get(name)\n const collection = collectionOf(scope.sqlite, scope.storageNamespace, name)\n const records = collection\n .list({ order: \"newest\" })\n .slice(0, SAMPLE)\n .map((row) => ({ id: row.id, seq: row.seq, value: row.value }))\n const inferred = inferFields(records)\n const fields = mergeFields(declaration?.fields, inferred)\n const source =\n declaration && records.length > 0 ? \"mixed\" : declaration ? \"declared\" : \"inferred\"\n collections.push({\n name,\n label: declaration?.label ?? humanize(name),\n ...(declaration?.description !== undefined ? { description: declaration.description } : {}),\n count: collection.count(),\n source,\n fields,\n ...(declaration?.meta !== undefined ? { meta: declaration.meta } : {}),\n })\n }\n const order = new Map<string, number>()\n for (const [index, item] of (scope.declarations ?? []).entries()) order.set(item.name, index)\n collections.sort((a, b) => {\n const left = order.get(a.name)\n const right = order.get(b.name)\n if (left !== undefined && right !== undefined) return left - right\n if (left !== undefined) return -1\n if (right !== undefined) return 1\n return a.name.localeCompare(b.name)\n })\n return {\n namespace: scope.namespace,\n storageNamespace: scope.storageNamespace,\n collections,\n }\n}\n\nexport type StateQuery = {\n limit?: number\n after?: number\n order?: \"newest\" | \"oldest\"\n}\n\nconst pageOf = (\n sqlite: SqliteClient,\n storageNamespace: string,\n name: string,\n query: StateQuery,\n): StateResult<StatePage> => {\n if (!COLLECTION_NAME.test(name)) return fail(400, \"collection name is not allowed\")\n const limit = query.limit ?? 50\n if (!Number.isInteger(limit) || limit < 1 || limit > 200) {\n return fail(400, \"limit must be an integer from 1 to 200\")\n }\n const order = query.order ?? \"newest\"\n if (order !== \"newest\" && order !== \"oldest\")\n return fail(400, 'order must be \"newest\" or \"oldest\"')\n const collection = collectionOf(sqlite, storageNamespace, name)\n const rows = collection.list({ order }).filter((row) => {\n if (query.after === undefined) return true\n return order === \"newest\" ? row.seq < query.after : row.seq > query.after\n })\n const slice = rows.slice(0, limit)\n const last = slice.at(-1)\n return {\n ok: true,\n value: {\n collection: name,\n count: collection.count(),\n records: slice.map((row) => ({ id: row.id, seq: row.seq, value: row.value })),\n next: rows.length > limit && last ? last.seq : null,\n },\n }\n}\n\nexport const readStatePage = (\n scope: Pick<StateScope, \"sqlite\" | \"storageNamespace\">,\n name: string,\n query: StateQuery = {},\n): StateResult<StatePage> => pageOf(scope.sqlite, scope.storageNamespace, name, query)\n\nexport const readStateRecord = (\n scope: Pick<StateScope, \"sqlite\" | \"storageNamespace\">,\n name: string,\n id: string,\n): StateResult<StateRecord> => {\n if (!COLLECTION_NAME.test(name)) return fail(400, \"collection name is not allowed\")\n if (!RECORD_ID.test(id)) return fail(400, \"record id is not allowed\")\n const record = readRecord(collectionOf(scope.sqlite, scope.storageNamespace, name), id)\n return record ? { ok: true, value: record } : fail(404, `no record ${id} in ${name}`)\n}\n\nconst requireId = (id: string): StateResult<string> =>\n RECORD_ID.test(id) ? { ok: true, value: id } : fail(400, \"id must be a single path segment\")\n\nexport const createStateRecord = (\n scope: Pick<StateScope, \"sqlite\" | \"storageNamespace\">,\n name: string,\n input: { id?: string; value: unknown },\n): StateResult<StateRecord> => {\n if (!COLLECTION_NAME.test(name)) return fail(400, \"collection name is not allowed\")\n const parsed = jsonValue(input.value)\n if (!parsed.ok) return parsed\n const collection = collectionOf(scope.sqlite, scope.storageNamespace, name)\n const id = input.id ?? `${name}_${collection.nextSequence()}`\n const checked = requireId(id)\n if (!checked.ok) return checked\n if (collection.has(checked.value)) return fail(409, `record ${checked.value} already exists`)\n const stored = collection.insert(checked.value, parsed.value)\n return { ok: true, value: { id: checked.value, seq: stored.seq, value: stored.value } }\n}\n\nexport const replaceStateRecord = (\n scope: Pick<StateScope, \"sqlite\" | \"storageNamespace\">,\n name: string,\n id: string,\n value: unknown,\n): StateResult<StateRecord> => {\n if (!COLLECTION_NAME.test(name)) return fail(400, \"collection name is not allowed\")\n const checked = requireId(id)\n if (!checked.ok) return checked\n const parsed = jsonValue(value)\n if (!parsed.ok) return parsed\n const collection = collectionOf(scope.sqlite, scope.storageNamespace, name)\n if (!collection.has(checked.value)) return fail(404, `no record ${checked.value} in ${name}`)\n const stored = collection.update(checked.value, parsed.value)\n if (!stored) return fail(404, `no record ${checked.value} in ${name}`)\n return { ok: true, value: { id: checked.value, seq: stored.seq, value: stored.value } }\n}\n\nexport const patchStateRecord = (\n scope: Pick<StateScope, \"sqlite\" | \"storageNamespace\">,\n name: string,\n id: string,\n value: unknown,\n): StateResult<StateRecord> => {\n const current = readStateRecord(scope, name, id)\n if (!current.ok) return current\n const parsed = jsonValue(value)\n if (!parsed.ok) return parsed\n const next =\n isRecord(current.value.value) && isRecord(parsed.value)\n ? { ...current.value.value, ...parsed.value }\n : parsed.value\n return replaceStateRecord(scope, name, id, next)\n}\n\nexport const deleteStateRecord = (\n scope: Pick<StateScope, \"sqlite\" | \"storageNamespace\">,\n name: string,\n id: string,\n): StateResult<{ id: string }> => {\n if (!COLLECTION_NAME.test(name)) return fail(400, \"collection name is not allowed\")\n const checked = requireId(id)\n if (!checked.ok) return checked\n const collection = collectionOf(scope.sqlite, scope.storageNamespace, name)\n return collection.delete(checked.value)\n ? { ok: true, value: { id: checked.value } }\n : fail(404, `no record ${checked.value} in ${name}`)\n}\n\nconst json = (status: number, body: unknown): Response =>\n new Response(JSON.stringify(body), {\n status,\n headers: { \"content-type\": \"application/json; charset=utf-8\" },\n })\n\nconst adminError = (status: number, message: string): Response =>\n json(status, { error: { type: \"mockingbird_admin\", message } })\n\nconst fromResult = <T>(result: StateResult<T>, status: number): Response =>\n result.ok ? json(status, result.value) : adminError(result.status, result.message)\n\nconst integerParam = (value: string | null): number | undefined | \"bad\" => {\n if (value === null) return undefined\n if (!/^-?\\d+$/.test(value)) return \"bad\"\n return Number(value)\n}\n\nexport type StateRoutes = {\n /** Open the public namespace and return the scope the state routes read. */\n open(namespace: string): StateScope\n /** Called after a successful write so Timeline records the new rows. */\n afterWrite?(namespace: string): void\n}\n\n/** The shared `/__admin/state*` routes. Registered after service routes so this key always wins. */\nexport const stateAdminRoutes = (routes: StateRoutes): AdminRoutes => {\n const open = (namespace: string): StateResult<StateScope> => {\n try {\n return { ok: true, value: routes.open(namespace) }\n } catch (error) {\n return fail(400, error instanceof Error ? error.message : String(error))\n }\n }\n const wrote = (namespace: string) => {\n routes.afterWrite?.(namespace)\n }\n return {\n \"GET /state\": ({ namespace }) => {\n const scope = open(namespace)\n return fromResult(scope.ok ? { ok: true, value: inspectState(scope.value) } : scope, 200)\n },\n \"GET /state/:collection\": ({ namespace, params, url }) => {\n const scope = open(namespace)\n if (!scope.ok) return fromResult(scope, 200)\n const limit = integerParam(url.searchParams.get(\"limit\"))\n const after = integerParam(url.searchParams.get(\"after\"))\n if (limit === \"bad\") return adminError(400, \"limit: expected an integer\")\n if (after === \"bad\") return adminError(400, \"after: expected a sequence number\")\n const order = url.searchParams.get(\"order\")\n return fromResult(\n readStatePage(scope.value, params.collection ?? \"\", {\n ...(limit !== undefined ? { limit } : {}),\n ...(after !== undefined ? { after } : {}),\n ...(order === \"newest\" || order === \"oldest\" ? { order } : {}),\n }),\n 200,\n )\n },\n \"GET /state/:collection/:id\": ({ namespace, params }) => {\n const scope = open(namespace)\n if (!scope.ok) return fromResult(scope, 200)\n return fromResult(readStateRecord(scope.value, params.collection ?? \"\", params.id ?? \"\"), 200)\n },\n \"POST /state/:collection\": ({ namespace, params, body }) => {\n const scope = open(namespace)\n if (!scope.ok) return fromResult(scope, 201)\n if (!isRecord(body) || !(\"value\" in body)) {\n return adminError(400, 'expected {\"id?\": \"<id>\", \"value\": <json>}')\n }\n const id = body.id\n if (id !== undefined && typeof id !== \"string\") return adminError(400, \"id must be a string\")\n const created = createStateRecord(scope.value, params.collection ?? \"\", {\n ...(typeof id === \"string\" ? { id } : {}),\n value: body.value,\n })\n if (created.ok) wrote(namespace)\n return fromResult(created, 201)\n },\n \"PUT /state/:collection/:id\": ({ namespace, params, body }) => {\n const scope = open(namespace)\n if (!scope.ok) return fromResult(scope, 200)\n if (!isRecord(body) || !(\"value\" in body))\n return adminError(400, 'expected {\"value\": <json>}')\n const replaced = replaceStateRecord(\n scope.value,\n params.collection ?? \"\",\n params.id ?? \"\",\n body.value,\n )\n if (replaced.ok) wrote(namespace)\n return fromResult(replaced, 200)\n },\n \"PATCH /state/:collection/:id\": ({ namespace, params, body }) => {\n const scope = open(namespace)\n if (!scope.ok) return fromResult(scope, 200)\n if (!isRecord(body) || !(\"value\" in body))\n return adminError(400, 'expected {\"value\": <json>}')\n const patched = patchStateRecord(\n scope.value,\n params.collection ?? \"\",\n params.id ?? \"\",\n body.value,\n )\n if (patched.ok) wrote(namespace)\n return fromResult(patched, 200)\n },\n \"DELETE /state/:collection/:id\": ({ namespace, params }) => {\n const scope = open(namespace)\n if (!scope.ok) return fromResult(scope, 200)\n const removed = deleteStateRecord(scope.value, params.collection ?? \"\", params.id ?? \"\")\n if (removed.ok) wrote(namespace)\n return fromResult(removed, 200)\n },\n }\n}\n", "/**\n * Set by `scripts/bundle-service.ts` when a service is bundled, and rewritten to the\n * released version when it is published. Undefined when running from source.\n */\ndeclare const __MOCKINGBIRD_PACKAGE_VERSION__: string | undefined\n\n/** Placeholder a bundle carries until `release:publish` writes the real version over it. */\nexport const UNRELEASED_VERSION = \"0.0.0-development\"\n\n/** The published version of the service package this code is bundled into. */\nexport const PACKAGE_VERSION: string =\n typeof __MOCKINGBIRD_PACKAGE_VERSION__ === \"string\"\n ? __MOCKINGBIRD_PACKAGE_VERSION__\n : UNRELEASED_VERSION\n", "import type { AdminRoutes } from \"./control.js\"\nimport type { OwnedTransport } from \"./outbound.js\"\nimport { signSvix, signTimestamped, signTwilio } from \"./signing.js\"\n\n/**\n * Outbound webhooks, shared by every service that has them.\n *\n * A service publishes a message (the exact bytes the vendor would send); the hub fans it out\n * to every matching endpoint, signs each delivery with the vendor's scheme, retries on the\n * vendor's schedule, and keeps a record a suite can read, replay or flush through\n * `/__admin/webhooks*`. Signature timestamps use the wall clock unless a service injects\n * `now`: receivers check them against their own time, and an advanced mock clock would\n * otherwise fail every delivery. A service whose caller injected the clock (Stripe) passes it,\n * so a virtual-time receiver verifies at the mock's time.\n */\n\n/** What a signer sees for one delivery attempt. */\nexport type SignInput = {\n messageId: string\n /** Exact bytes about to be sent. */\n body: string\n /** Unix seconds of this attempt: wall clock, or the hub's injected `now`. */\n timestampSeconds: number\n /** Where the delivery is posted. */\n url: string\n /** The endpoint's secret, if it has one. */\n secret: string | undefined\n /** The endpoint's `signUrl` (the public URL the receiver verifies against), else `url`. */\n signUrl: string\n /** Form parameters, when the body is form-encoded (Twilio signs these, not the body). */\n form: Record<string, string> | undefined\n /** Stable event type and metadata captured with the message; avoids signer side-channel state. */\n type: string\n tags: Readonly<Record<string, string>>\n}\n\n/** Headers to add to one delivery. */\nexport type WebhookSigner = (\n input: SignInput,\n) => Record<string, string> | Promise<Record<string, string>>\n\n/** Named signers for the vendor schemes the catalog needs. */\nexport const signers = {\n /** No signature. */\n none: (): WebhookSigner => () => ({}),\n /** Svix (`svix-id`, `svix-timestamp`, `svix-signature: v1,<b64>`): Junction, Flex, Resend. */\n svix:\n (options: { prefix?: \"svix\" | \"webhook\" } = {}): WebhookSigner =>\n async ({ messageId, body, timestampSeconds, secret }) => {\n if (!secret) return {}\n const prefix = options.prefix ?? \"svix\"\n return {\n [`${prefix}-id`]: messageId,\n [`${prefix}-timestamp`]: String(timestampSeconds),\n [`${prefix}-signature`]: await signSvix(secret, messageId, timestampSeconds, body),\n }\n },\n /** `<header>: t=<unix>,v1=<hex HMAC-SHA256(secret, \"t.body\")>`: Stripe, Persona, Fullscript. */\n timestamped:\n (header = \"Stripe-Signature\"): WebhookSigner =>\n async ({ body, timestampSeconds, secret }) =>\n secret ? { [header]: await signTimestamped(secret, timestampSeconds, body) } : {},\n /** `X-Twilio-Signature` over the public URL plus the sorted form parameters. */\n twilio:\n (): WebhookSigner =>\n async ({ signUrl, form, secret }) =>\n secret ? { \"X-Twilio-Signature\": await signTwilio(secret, signUrl, form ?? {}) } : {},\n /** The secret itself in a header (optionally templated): RxVortex, Pharmetika, AHA `Token <s>`. */\n header:\n (header: string, format: (secret: string) => string = (s) => s): WebhookSigner =>\n ({ secret }) =>\n secret ? { [header]: format(secret) } : {},\n /** Anything else: the service computes the headers itself. */\n custom: (sign: WebhookSigner): WebhookSigner => sign,\n}\n\nexport type WebhookEndpoint = {\n /** Stable id; generated when omitted. */\n id?: string\n url: string\n secret?: string\n /** Event types to deliver; omit or include `\"*\"` for every type. */\n events?: string[]\n /** Deliver only messages whose tags include all of these (e.g. `{ account: \"mso\" }`). */\n tags?: Record<string, string>\n /** The public URL the receiver verifies signatures against (Twilio), when it differs. */\n signUrl?: string\n headers?: Record<string, string>\n}\n\nexport type WebhookMessage = {\n id: string\n namespace: string\n type: string\n body: string\n contentType: string\n tags: Record<string, string>\n headers?: Record<string, string>\n /** Wall-clock ISO-8601 time of publication. */\n publishedAt: string\n}\n\nexport type WebhookAttempt = {\n attempt: number\n at: string\n status: number | null\n error: string | null\n durationMs: number\n /** Exact receiver response body, when one was returned. */\n responseBody?: string | null\n}\n\nexport type WebhookDelivery = {\n id: string\n messageId: string\n namespace: string\n type: string\n endpointId: string\n url: string\n state: \"pending\" | \"delivered\" | \"failed\" | \"dropped\"\n attempts: WebhookAttempt[]\n}\n\n/** A delivery-level fault: what happens to the next `count` messages in a namespace. */\nexport type WebhookFault = {\n mode: \"duplicate\" | \"reorder\" | \"drop\"\n /** Messages affected; default 1. */\n count?: number\n}\n\nexport type PublishInput = {\n namespace: string\n type: string\n /** Exact body; objects are JSON-encoded. */\n body: string | Record<string, unknown> | unknown[]\n /** Default `application/json`, or form-encoded when `form` is given. */\n contentType?: string\n /** Form parameters, when the vendor posts `application/x-www-form-urlencoded`. */\n form?: Record<string, string>\n tags?: Record<string, string>\n /** Message-specific delivery headers, captured as part of durable message state. */\n headers?: Record<string, string>\n /** Message id; generated when omitted. */\n id?: string\n}\n\nexport type WebhookHubOptions = {\n signer: WebhookSigner\n /**\n * Delay before each attempt, in ms; the first entry delays the first attempt. Default:\n * immediately, then 5 s, 5 min, 30 min, 2 h. An empty list means one immediate attempt and no\n * retries (never zero attempts).\n */\n retryDelaysMs?: readonly number[]\n /** Abort an attempt after this long. Default 15 s. */\n timeoutMs?: number\n /** Which receiver statuses count as delivered. Default 2xx. */\n delivered?: (status: number) => boolean\n /** Endpoints every namespace delivers to (from `--webhook-url`). */\n endpoints?: WebhookEndpoint[]\n fetch?: (request: Request) => Promise<Response>\n /** Called in-process for every published message, delivered or not. */\n onMessage?: (message: WebhookMessage) => void\n /** Messages kept per namespace for `GET /__admin/webhooks/events`. Default 500. */\n keep?: number\n /** Injectable clock (default wall clock) for signatures and attempt records. */\n now?: () => number\n /** Injectable deterministic identifier source. Receives `\"msg_\"` or `\"dlv_\"`. */\n id?: (prefix: string) => string\n /** Injectable scheduler used by timeouts and retries. */\n schedule?: (callback: () => void, delayMs: number) => unknown\n cancel?: (handle: unknown) => void\n}\n\nexport type WebhookHub = {\n observeDeliveries(\n listener: (event: { namespace: string; state: string; deliveryId: string }) => void,\n ): () => void\n setTransportPolicy(policy: OwnedTransport): void\n pending(namespace: string): number\n snapshot(namespace: string): unknown\n exportSnapshot(handle: unknown): unknown\n importSnapshot(namespace: string, document: unknown): unknown\n restore(namespace: string, snapshot: unknown): void\n publish(input: PublishInput): WebhookMessage\n /** Replace a namespace's own endpoints (`PUT /__admin/webhook-endpoints`). */\n setEndpoints(namespace: string, endpoints: WebhookEndpoint[]): WebhookEndpoint[]\n /** The endpoints a namespace delivers to: its own, plus the global ones. */\n endpoints(namespace: string): WebhookEndpoint[]\n messages(namespace?: string): WebhookMessage[]\n deliveries(namespace?: string): WebhookDelivery[]\n replay(deliveryId: string): Promise<WebhookDelivery | undefined>\n /** Run every pending retry (and release held reordered messages) now, and every retry those attempts schedule, until nothing is pending. */\n flush(): Promise<void>\n /** Resolve once nothing is in flight. */\n idle(namespace?: string): Promise<void>\n fault(namespace: string, fault: WebhookFault): void\n clear(namespace?: string): void\n}\n\nconst DEFAULT_DELAYS = [0, 5_000, 300_000, 1_800_000, 7_200_000] as const\n\nconst unref = (timer: unknown) => {\n ;(timer as { unref?: () => void }).unref?.()\n}\n\nconst randomId = (prefix: string) =>\n `${prefix}${crypto.randomUUID().replace(/-/g, \"\").slice(0, 24)}`\n\nconst matchesEndpoint = (endpoint: WebhookEndpoint, message: WebhookMessage): boolean => {\n const events = endpoint.events ?? [\"*\"]\n if (!events.includes(\"*\") && !events.includes(message.type)) return false\n for (const [key, value] of Object.entries(endpoint.tags ?? {})) {\n if (message.tags[key] !== value) return false\n }\n return true\n}\n\nexport const createWebhookHub = (options: WebhookHubOptions): WebhookHub => {\n const delays =\n options.retryDelaysMs === undefined\n ? DEFAULT_DELAYS\n : options.retryDelaysMs.length > 0\n ? options.retryDelaysMs\n : [0]\n const timeoutMs = options.timeoutMs ?? 15_000\n const delivered = options.delivered ?? ((status: number) => status >= 200 && status < 300)\n const send = options.fetch ?? ((request: Request) => fetch(request))\n const keep = options.keep ?? 500\n const now = options.now ?? Date.now\n const id = options.id ?? randomId\n const scheduleTimer =\n options.schedule ?? ((callback: () => void, delayMs: number) => setTimeout(callback, delayMs))\n const cancel =\n options.cancel ?? ((handle: unknown) => clearTimeout(handle as ReturnType<typeof setTimeout>))\n const global = (options.endpoints ?? []).map((e, i) => ({ ...e, id: e.id ?? `we_global_${i}` }))\n const own = new Map<string, WebhookEndpoint[]>()\n const messages: WebhookMessage[] = []\n const deliveries = new Map<string, WebhookDelivery>()\n const pending = new Map<string, unknown | undefined>()\n const payloads = new Map<string, { message: WebhookMessage; endpoint: WebhookEndpoint }>()\n const faults = new Map<string, { mode: WebhookFault[\"mode\"]; remaining: number }[]>()\n const held = new Map<string, WebhookMessage[]>()\n const deliveryObservers = new Set<\n (event: { namespace: string; state: string; deliveryId: string }) => void\n >()\n const notify = (delivery: WebhookDelivery) => {\n for (const listener of deliveryObservers)\n try {\n listener({ namespace: delivery.namespace, state: delivery.state, deliveryId: delivery.id })\n } catch {}\n }\n let transport: OwnedTransport | undefined\n const inFlight = new Set<Promise<void>>()\n const workNamespace = new Map<Promise<void>, string>()\n const activeDeliveries = new Map<string, { namespace: string; count: number }>()\n const controllers = new Map<string, AbortController>()\n // Immediate (delay 0) attempts chain onto this so two deliveries scheduled in the same tick\n // (e.g. a reorder fault's swap) hit the receiver in schedule order, not fetch-race order.\n let immediate: Promise<unknown> = Promise.resolve()\n const snapshots = new WeakMap<\n object,\n {\n namespace: string\n endpoints: WebhookEndpoint[]\n messages: WebhookMessage[]\n deliveries: [string, WebhookDelivery][]\n payloads: [string, { message: WebhookMessage; endpoint: WebhookEndpoint }][]\n faults: { mode: WebhookFault[\"mode\"]; remaining: number }[]\n }\n >()\n\n const track = (work: Promise<void>, delivery: WebhookDelivery) => {\n inFlight.add(work)\n workNamespace.set(work, delivery.namespace)\n const active = activeDeliveries.get(delivery.id) ?? { namespace: delivery.namespace, count: 0 }\n active.count++\n activeDeliveries.set(delivery.id, active)\n const finish = () => {\n inFlight.delete(work)\n workNamespace.delete(work)\n active.count--\n if (active.count === 0) activeDeliveries.delete(delivery.id)\n }\n void work.then(finish, finish)\n }\n\n const attempt = async (delivery: WebhookDelivery): Promise<boolean> => {\n const entry = payloads.get(delivery.id)\n if (!entry) return false\n const { message, endpoint } = entry\n const timestampSeconds = Math.floor(now() / 1000)\n const started = now()\n const record: WebhookAttempt = {\n attempt: delivery.attempts.length + 1,\n at: new Date(started).toISOString(),\n status: null,\n error: null,\n durationMs: 0,\n responseBody: null,\n }\n const controller = new AbortController()\n controllers.set(delivery.id, controller)\n const timer = scheduleTimer(() => controller.abort(), timeoutMs)\n try {\n const signed = await options.signer({\n messageId: message.id,\n body: message.body,\n timestampSeconds,\n url: endpoint.url,\n secret: endpoint.secret,\n signUrl: endpoint.signUrl ?? endpoint.url,\n form: message.contentType.startsWith(\"application/x-www-form-urlencoded\")\n ? Object.fromEntries(new URLSearchParams(message.body))\n : undefined,\n type: message.type,\n tags: message.tags,\n })\n const ownedSend = (request: Request) =>\n transport ? transport(request, message.namespace, send as typeof fetch) : send(request)\n const response = await ownedSend(\n new Request(endpoint.url, {\n method: \"POST\",\n headers: {\n \"content-type\": message.contentType,\n ...endpoint.headers,\n ...message.headers,\n ...signed,\n },\n body: message.body,\n signal: controller.signal,\n }),\n )\n record.status = response.status\n record.responseBody = await response.text()\n } catch (error) {\n record.error = controller.signal.aborted\n ? `timed out after ${timeoutMs}ms`\n : error instanceof Error\n ? error.message\n : String(error)\n } finally {\n controllers.delete(delivery.id)\n cancel(timer)\n record.durationMs = now() - started\n delivery.attempts.push(record)\n }\n return record.status !== null && delivered(record.status)\n }\n\n const schedule = (delivery: WebhookDelivery) => {\n const index = delivery.attempts.length\n if (index >= delays.length) {\n delivery.state = \"failed\"\n notify(delivery)\n pending.delete(delivery.id)\n return\n }\n const settle = async () => {\n // `clear` can drop a delivery queued behind an earlier immediate attempt. Its attempt would\n // record nothing and reschedule at the same index forever, starving the event loop.\n if (!payloads.has(delivery.id)) return\n await attempt(delivery).then((ok) => {\n if (!payloads.has(delivery.id)) return\n if (ok) {\n delivery.state = \"delivered\"\n notify(delivery)\n } else schedule(delivery)\n })\n }\n const delay = delays[index] ?? 0\n if (delay <= 0) {\n const task = immediate.then(settle)\n immediate = task.catch(() => {})\n track(task, delivery)\n return\n }\n const timer = scheduleTimer(() => {\n pending.delete(delivery.id)\n track(settle(), delivery)\n }, delay)\n unref(timer)\n pending.set(delivery.id, timer)\n }\n\n const endpointsFor = (namespace: string) => [...(own.get(namespace) ?? []), ...global]\n\n const fanOut = (message: WebhookMessage, state: WebhookDelivery[\"state\"] = \"pending\") => {\n for (const endpoint of endpointsFor(message.namespace)) {\n if (!matchesEndpoint(endpoint, message)) continue\n const delivery: WebhookDelivery = {\n id: id(\"dlv_\"),\n messageId: message.id,\n namespace: message.namespace,\n type: message.type,\n endpointId: endpoint.id ?? \"we_unknown\",\n url: endpoint.url,\n state,\n attempts: [],\n }\n deliveries.set(delivery.id, delivery)\n payloads.set(delivery.id, { message, endpoint })\n if (state === \"pending\") schedule(delivery)\n else notify(delivery)\n }\n }\n\n const takeFault = (namespace: string): WebhookFault[\"mode\"] | undefined => {\n const queue = faults.get(namespace)\n const head = queue?.[0]\n if (!queue || !head) return undefined\n head.remaining--\n if (head.remaining <= 0) queue.shift()\n return head.mode\n }\n\n const releaseHeld = (namespace: string) => {\n const waiting = held.get(namespace)\n if (!waiting) return\n held.delete(namespace)\n for (const message of waiting) fanOut(message)\n }\n\n const hub: WebhookHub = {\n observeDeliveries(listener) {\n deliveryObservers.add(listener)\n return () => deliveryObservers.delete(listener)\n },\n setTransportPolicy(policy) {\n transport = policy\n },\n pending(namespace) {\n const ids = new Set(\n [...deliveries.values()]\n .filter((d) => d.namespace === namespace && d.state === \"pending\")\n .map((d) => d.id),\n )\n for (const [id, active] of activeDeliveries) if (active.namespace === namespace) ids.add(id)\n return ids.size + (held.get(namespace)?.length ?? 0)\n },\n snapshot(namespace) {\n if (hub.pending(namespace) > 0) throw new Error(\"webhooks are not quiescent\")\n const handle = {}\n snapshots.set(\n handle,\n structuredClone({\n namespace,\n endpoints: own.get(namespace) ?? [],\n messages: messages.filter((m) => m.namespace === namespace),\n deliveries: [...deliveries].filter(([, d]) => d.namespace === namespace),\n payloads: [...payloads].filter(([, p]) => p.message.namespace === namespace),\n faults: faults.get(namespace) ?? [],\n }),\n )\n return handle\n },\n exportSnapshot(handle) {\n const point =\n typeof handle === \"object\" && handle !== null ? snapshots.get(handle) : undefined\n if (!point) throw new Error(\"invalid webhook snapshot\")\n const { namespace: _namespace, ...document } = point\n return structuredClone(document)\n },\n importSnapshot(namespace, document) {\n if (\n !isRecord(document) ||\n !Array.isArray(document.endpoints) ||\n !Array.isArray(document.messages) ||\n !Array.isArray(document.deliveries) ||\n !Array.isArray(document.payloads) ||\n !Array.isArray(document.faults)\n )\n throw new Error(\"invalid portable webhook snapshot\")\n for (const endpoint of document.endpoints)\n if (typeof parseEndpoint(endpoint) === \"string\")\n throw new Error(\"invalid portable webhook endpoint\")\n for (const message of document.messages)\n if (\n !isRecord(message) ||\n typeof message.id !== \"string\" ||\n typeof message.body !== \"string\"\n )\n throw new Error(\"invalid portable webhook message\")\n for (const pair of [...document.deliveries, ...document.payloads])\n if (\n !Array.isArray(pair) ||\n pair.length !== 2 ||\n typeof pair[0] !== \"string\" ||\n !isRecord(pair[1])\n )\n throw new Error(\"invalid portable webhook entry\")\n const handle = {}\n const point = structuredClone(document) as Omit<\n NonNullable<ReturnType<typeof snapshots.get>>,\n \"namespace\"\n >\n for (const message of point.messages) message.namespace = namespace\n for (const [, delivery] of point.deliveries) delivery.namespace = namespace\n for (const [, payload] of point.payloads) payload.message.namespace = namespace\n snapshots.set(handle, { ...point, namespace })\n return handle\n },\n restore(namespace, handle) {\n const point =\n typeof handle === \"object\" && handle !== null ? snapshots.get(handle) : undefined\n if (!point || point.namespace !== namespace || hub.pending(namespace) > 0)\n throw new Error(\"invalid webhook restore\")\n hub.clear(namespace)\n const copied = structuredClone(point)\n own.set(namespace, copied.endpoints)\n messages.push(...copied.messages)\n for (const [id, delivery] of copied.deliveries) deliveries.set(id, delivery)\n for (const [id, payload] of copied.payloads) payloads.set(id, payload)\n faults.set(namespace, copied.faults)\n },\n publish(input) {\n const contentType =\n input.contentType ?? (input.form ? \"application/x-www-form-urlencoded\" : \"application/json\")\n const body =\n typeof input.body === \"string\"\n ? input.body\n : input.form\n ? new URLSearchParams(input.form).toString()\n : JSON.stringify(input.body)\n const message: WebhookMessage = {\n id: input.id ?? id(\"msg_\"),\n namespace: input.namespace,\n type: input.type,\n body,\n contentType,\n tags: input.tags ?? {},\n headers: input.headers ?? {},\n publishedAt: new Date(now()).toISOString(),\n }\n messages.push(message)\n const ofNamespace = messages.filter((m) => m.namespace === message.namespace)\n const oldest = ofNamespace[0]\n if (ofNamespace.length > keep && oldest) messages.splice(messages.indexOf(oldest), 1)\n options.onMessage?.(message)\n const fault = takeFault(message.namespace)\n if (fault === \"drop\") {\n fanOut(message, \"dropped\")\n return message\n }\n if (fault === \"reorder\") {\n // Held until the next message goes out, so the receiver sees them swapped.\n held.set(message.namespace, [...(held.get(message.namespace) ?? []), message])\n return message\n }\n fanOut(message)\n if (fault === \"duplicate\") fanOut(message)\n releaseHeld(message.namespace)\n return message\n },\n setEndpoints(namespace, endpoints) {\n const withIds = endpoints.map((e, i) => ({ ...e, id: e.id ?? `we_${namespace}_${i}` }))\n own.set(namespace, withIds)\n return withIds\n },\n endpoints: endpointsFor,\n messages: (namespace) =>\n namespace === undefined ? [...messages] : messages.filter((m) => m.namespace === namespace),\n deliveries: (namespace) =>\n [...deliveries.values()].filter((d) => namespace === undefined || d.namespace === namespace),\n async replay(id) {\n const delivery = deliveries.get(id)\n if (!delivery) return undefined\n const work = (async () => {\n const ok = await attempt(delivery)\n if (ok) delivery.state = \"delivered\"\n notify({ ...delivery, state: ok ? \"delivered\" : \"failed\" })\n })()\n track(work, delivery)\n await work\n return delivery\n },\n async flush() {\n // Drains until nothing is held or scheduled: a retry that an attempt failing during this\n // flush schedules runs too, so a caller asserting after `flush` never catches a delivery\n // between attempts. Bounded, as every pass moves each delivery an attempt closer to\n // `delivered` or `failed`.\n for (;;) {\n for (const namespace of [...held.keys()]) releaseHeld(namespace)\n const waiting = [...pending.entries()]\n for (const [id, timer] of waiting) {\n if (timer === undefined) continue\n cancel(timer)\n pending.delete(id)\n const delivery = deliveries.get(id)\n if (!delivery) continue\n track(\n attempt(delivery).then((ok) => {\n if (ok) {\n delivery.state = \"delivered\"\n notify(delivery)\n } else schedule(delivery)\n }),\n delivery,\n )\n }\n await hub.idle()\n const scheduled = [...pending.values()].some((timer) => timer !== undefined)\n if (held.size === 0 && !scheduled) return\n }\n },\n async idle(namespace) {\n for (;;) {\n const selected = [...inFlight].filter(\n (work) => namespace === undefined || workNamespace.get(work) === namespace,\n )\n if (!selected.length) return\n await Promise.allSettled(selected)\n }\n },\n fault(namespace, fault) {\n const queue = faults.get(namespace) ?? []\n queue.push({ mode: fault.mode, remaining: Math.max(1, fault.count ?? 1) })\n faults.set(namespace, queue)\n },\n clear(namespace) {\n for (const [id, delivery] of deliveries) {\n if (namespace !== undefined && delivery.namespace !== namespace) continue\n controllers.get(id)?.abort()\n const timer = pending.get(id)\n if (timer !== undefined) cancel(timer)\n pending.delete(id)\n deliveries.delete(id)\n payloads.delete(id)\n }\n for (let i = messages.length - 1; i >= 0; i--) {\n if (namespace === undefined || messages[i]?.namespace === namespace) messages.splice(i, 1)\n }\n if (namespace === undefined) {\n held.clear()\n faults.clear()\n own.clear()\n } else {\n held.delete(namespace)\n faults.delete(namespace)\n own.delete(namespace)\n }\n },\n }\n return hub\n}\n\nconst json = (status: number, body: unknown): Response =>\n new Response(JSON.stringify(body), {\n status,\n headers: { \"content-type\": \"application/json; charset=utf-8\" },\n })\n\nconst adminError = (status: number, message: string): Response =>\n json(status, { error: { type: \"mockingbird_admin\", message } })\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n\nconst parseEndpoint = (value: unknown): WebhookEndpoint | string => {\n if (!isRecord(value) || typeof value.url !== \"string\") return \"each endpoint needs a url\"\n try {\n new URL(value.url)\n } catch {\n return `not a URL: ${value.url}`\n }\n const endpoint: WebhookEndpoint = { url: value.url }\n if (typeof value.id === \"string\") endpoint.id = value.id\n if (typeof value.secret === \"string\") endpoint.secret = value.secret\n if (typeof value.signUrl === \"string\") endpoint.signUrl = value.signUrl\n const events = value.events ?? value.enabledEvents\n if (Array.isArray(events)) endpoint.events = events.map(String)\n if (isRecord(value.tags)) {\n endpoint.tags = Object.fromEntries(Object.entries(value.tags).map(([k, v]) => [k, String(v)]))\n }\n if (typeof value.account === \"string\")\n endpoint.tags = { ...endpoint.tags, account: value.account }\n if (isRecord(value.headers)) {\n endpoint.headers = Object.fromEntries(\n Object.entries(value.headers).map(([k, v]) => [k, String(v)]),\n )\n }\n return endpoint\n}\n\n/**\n * The standard webhook admin routes, for a runtime that owns `hub`:\n *\n * - `GET /webhooks` deliveries, `GET /webhooks/events` published messages (with bodies:\n * they are the mock's own output), `POST /webhooks/:id/replay`, `POST /webhooks/flush`\n * - `GET|PUT|DELETE /webhook-endpoints` per namespace\n * - `POST /webhooks/faults {mode: duplicate|reorder|drop, count?}`\n */\nexport const webhookAdminRoutes = (hub: WebhookHub): AdminRoutes => ({\n \"GET /webhooks\": ({ url, namespace }) =>\n json(200, {\n deliveries: hub\n .deliveries(url.searchParams.get(\"all\") === \"1\" ? undefined : namespace)\n .filter((d) => {\n const type = url.searchParams.get(\"type\")\n return type === null || d.type === type\n }),\n }),\n \"GET /webhooks/events\": ({ url, namespace }) => {\n const type = url.searchParams.get(\"type\")\n return json(200, {\n events: hub\n .messages(url.searchParams.get(\"all\") === \"1\" ? undefined : namespace)\n .filter((m) => type === null || m.type === type)\n .map((m) => ({ ...m, payload: parsePayload(m) })),\n })\n },\n \"POST /webhooks/:id/replay\": async ({ params }) => {\n const replayed = await hub.replay(params.id as string)\n return replayed ? json(200, replayed) : adminError(404, `no delivery ${params.id}`)\n },\n \"POST /webhooks/flush\": async () => {\n await hub.flush()\n return json(200, { status: \"ok\" })\n },\n \"POST /webhooks/faults\": ({ body, namespace }) => {\n if (!isRecord(body) || ![\"duplicate\", \"reorder\", \"drop\"].includes(String(body.mode))) {\n return adminError(400, \"mode must be duplicate, reorder or drop\")\n }\n const fault: WebhookFault = { mode: body.mode as WebhookFault[\"mode\"] }\n if (typeof body.count === \"number\") fault.count = body.count\n hub.fault(namespace, fault)\n return json(201, { namespace, ...fault })\n },\n \"GET /webhook-endpoints\": ({ namespace }) =>\n json(200, {\n endpoints: hub.endpoints(namespace).map(({ secret, ...rest }) => ({\n ...rest,\n secret: secret ? \"(set)\" : null,\n })),\n }),\n \"PUT /webhook-endpoints\": ({ body, namespace }) => {\n const list = Array.isArray(body) ? body : isRecord(body) ? body.endpoints : undefined\n if (!Array.isArray(list)) return adminError(400, \"expected [{url, secret?, events?}]\")\n const parsed: WebhookEndpoint[] = []\n for (const each of list) {\n const endpoint = parseEndpoint(each)\n if (typeof endpoint === \"string\") return adminError(400, endpoint)\n parsed.push(endpoint)\n }\n const set = hub.setEndpoints(namespace, parsed)\n return json(200, { endpoints: set.map((e) => ({ ...e, secret: e.secret ? \"(set)\" : null })) })\n },\n \"DELETE /webhook-endpoints\": ({ namespace }) => {\n hub.setEndpoints(namespace, [])\n return json(200, { status: \"ok\" })\n },\n})\n\nconst parsePayload = (message: WebhookMessage): unknown => {\n if (message.contentType.startsWith(\"application/json\")) {\n try {\n return JSON.parse(message.body)\n } catch {\n return message.body\n }\n }\n if (message.contentType.startsWith(\"application/x-www-form-urlencoded\")) {\n return Object.fromEntries(new URLSearchParams(message.body))\n }\n return message.body\n}\n", "import {\n type Checkpoint,\n type FetchAPI,\n forwardMountContext,\n type MountedAPI,\n mount,\n Timeline,\n} from \"@crvouga/mockingbird-core\"\nimport { listOperations, type OpenAPIDocument } from \"@crvouga/mockingbird-openapi\"\nimport { clearNamespace, type SqliteClient } from \"@crvouga/mockingbird-sqlite\"\nimport { adminUiRoutes } from \"./admin-ui.js\"\nimport {\n type Clock,\n type ClockState,\n createClock,\n type DerivedClock,\n deriveClock,\n restoreClock,\n} from \"./clock.js\"\nimport {\n ADMIN_KEY_HEADER,\n ADMIN_PREFIX,\n type AdminRoutes,\n assertAdminPrefixAvailable,\n createControlPlane,\n hasAdminKey,\n isAdminPath,\n matchNamespacePath,\n NAMESPACE_HEADER,\n resolveAdminPrefix,\n type SnapshotInfo,\n type SnapshotStore,\n} from \"./control.js\"\nimport {\n assertSnapshotDocument,\n CONTROL_HEADERS,\n ControlError,\n type ControlHeaderInput,\n type ControlPlan,\n controlHeaders,\n isRecord,\n KEY_PATTERN,\n type MockControls,\n type NamespaceControls as NamespaceControlsInput,\n normalizeBootControls,\n normalizeClock,\n normalizeControls,\n normalizeLatency,\n normalizeSeed,\n parseControlHeaders,\n type RequestControls,\n SNAPSHOT_FORMAT,\n type SnapshotDocument,\n} from \"./controls.js\"\nimport { type CredentialRegistry, createCredentialRegistry, maskCredential } from \"./credentials.js\"\nimport {\n type FaultHit,\n type FaultPreset,\n type FaultRegistry,\n type FaultRule,\n normalizeFault,\n} from \"./faults.js\"\nimport { type IdBase, normalizeIdBase, setIdBase } from \"./ids.js\"\nimport {\n createJournal,\n DEFAULT_JOURNAL_SIZE,\n type Journal,\n type ResponseNotes,\n responseNotes,\n} from \"./journal.js\"\nimport type { LatencyRegistry } from \"./latency.js\"\nimport { createMetrics, type Metrics, type RejectedRequest, type RequestLog } from \"./metrics.js\"\nimport {\n type BootScope,\n type ControlSettings,\n type ControlState,\n type ControlsSnapshot,\n createNamespaceControls,\n} from \"./namespace-controls.js\"\nimport { operationPath } from \"./path.js\"\nimport { createRng, type Rng, seedFrom } from \"./rng.js\"\nimport { bootSqlite } from \"./service.js\"\nimport { type NamespaceSnapshot, restoreNamespace, snapshotNamespace } from \"./snapshot.js\"\nimport {\n inspectState,\n type StateDeclaration,\n type StateView,\n stateAdminRoutes,\n} from \"./state-view.js\"\nimport { type AdminUi, assertAdminUi, defineMock, type MockSurface } from \"./surface.js\"\nimport { PACKAGE_VERSION } from \"./version.js\"\nimport { type WebhookHub, webhookAdminRoutes } from \"./webhooks.js\"\n\n/**\n * Stamped on every response the runtime returns \u2014 vendor, fault, admin and health alike \u2014\n * as `<service>@<version>; ns=<namespace>`, so a consumer can tell the mock from the vendor.\n */\nexport const MOCKINGBIRD_HEADER = \"x-mockingbird\"\n/** Selects a named copy-on-write history branch. `main` is the compatibility default. */\nexport const BRANCH_HEADER = CONTROL_HEADERS.branch\n/** Reads a historical checkpoint. With a branch header, initializes that branch from it. */\nexport const AT_HEADER = CONTROL_HEADERS.at\n/** Identifies the resulting checkpoint on successful mutations. */\nexport const CHECKPOINT_HEADER = \"x-mockingbird-checkpoint\"\n/** On a response a fault rule answered or shaped: that rule's id. */\nexport const FAULT_HEADER = CONTROL_HEADERS.fault\n/** On a response to a request that asked for a snapshot: the snapshot's id. */\nexport const SNAPSHOT_HEADER = CONTROL_HEADERS.snapshot\n\n/** What the runtime needs from a service: a Fetch handler it can reset. */\nexport type ServiceInstance = FetchAPI & { reset(): Promise<void> }\n\n/** Everything an instance shares with the runtime that owns it. */\nexport type InstanceContext = {\n /** Storage namespace for this instance's records. */\n namespace: string\n /** The public namespace name a request selects it by. */\n adminPrefix: string\n publicNamespace: string\n sqlite: SqliteClient\n clock: Clock\n rng: Rng\n}\n\nexport type RuntimeOptions<T extends ServiceInstance> = {\n /** Service name, e.g. `\"junction\"`. Also the default namespace's storage key. */\n name: string\n /** Build the instance backing one namespace. Called once per namespace, on first use. */\n create: (context: InstanceContext) => T\n /** The vendor contract, used to name each request's operation in logs, metrics and faults. */\n document?: OpenAPIDocument\n /** Shared by every namespace. Defaults to a fresh `@crvouga/mockingbird-service-sqlite`. */\n sqlite?: SqliteClient\n /** Defaults to a live clock over `Date.now`. */\n clock?: Clock\n /**\n * Where this boot's generated ids start. Counters restart at 0 on every boot, so by default\n * every boot reissues the previous boot's ids; a different base gives an unrelated run of ids\n * (a reset returns to the same run). A non-negative integer, or `\"boot\"` for one derived from\n * the wall clock when the runtime is created. Default `0`: the same ids on every boot.\n */\n idBase?: IdBase\n /** Seeds every random choice the runtime makes (fault rates, jitter). Default `0`. */\n seed?: number | string\n /**\n * Admin controls to boot with: clock, latency, faults, a starting snapshot, credential\n * mappings and per-namespace overrides. `reset` returns a namespace to exactly this.\n */\n adminControls?: MockControls\n /** Extra `GET /__admin/health` fields, such as the loaded corpus version. */\n describe?: () => Record<string, unknown>\n /** Service-specific admin routes, given the runtime so they can reach any namespace. */\n admin?: (runtime: ServiceRuntime<T>) => AdminRoutes\n /** Reserved tree for every internal HTTP endpoint, UI and namespace carrier. Default /__admin. */\n adminPrefix?: string\n /**\n * A namespace's clock was moved \u2014 by `/__admin/clock`, a header, a restore, a reset, or a\n * wait spent in virtual time. Run whatever the service schedules by that clock, so what\n * came due is seen at once and not on the next request. Moving the base clock in process\n * (`runtime.clock`) is the caller's own doing and is not reported here.\n */\n onClockChange?: (namespace: string) => void\n /** Invalidate transient handles before replacing an existing instance's stored state. */\n beforeRestore?: (instance: T) => void\n /** Require this value in `x-mockingbird-admin-key` on admin data routes. */\n adminKey?: string\n /** Structured request log sink, called once per request. */\n onLog?: (entry: RequestLog) => void\n /** Requests each namespace's journal keeps (`GET /__admin/requests`). Default 1000; 0 turns it off. */\n journalSize?: number\n /** Reported in the `x-mockingbird` header. Default: the bundled package's version. */\n version?: string\n /**\n * The vendor credential a request carries (API key, token, account SID, AWS access key\n * id), for SDKs that cannot send `x-mockingbird-namespace`: a suite maps credentials to\n * namespaces with `PUT /__admin/credentials`. See `bearerToken`, `basicAuth`,\n * `sigV4AccessKeyId`.\n */\n credential?: (request: Request) => string | undefined\n /**\n * Named faults, switched on with `POST /__admin/faults {\"preset\": \"<name>\"}`. They join the\n * standard presets every mock has; one with a standard name replaces it.\n */\n presets?: Record<string, FaultPreset>\n /** Outbound webhooks; adds the `/__admin/webhooks*` routes and clears on reset. */\n webhooks?: WebhookHub\n /** Retained time-travel checkpoints per namespace. Default 1,000. */\n maxCheckpoints?: number\n /** Injectable process IO used for observability and delays; logical service time uses `clock`. */\n io?: Partial<RuntimeIO>\n /**\n * Collections the admin UI should show even before any row exists.\n * Stored collections are always included, whether or not they are declared.\n * A function may describe collections that depend on the live instance.\n */\n state?: readonly StateDeclaration[] | ((api: T, namespace: string) => readonly StateDeclaration[])\n /**\n * Panels added to the default admin UI, or a function that replaces the document.\n * `render` receives `defaultHtml()` so a bespoke UI can wrap the shared shell.\n */\n adminUi?: AdminUi\n}\n\nexport type RuntimeIO = {\n wallNow(): number\n monotonicNow(): number\n /** Wait on the wall clock. Rejects with the signal's reason when it aborts first. */\n sleep(ms: number, signal?: AbortSignal): Promise<void>\n}\n\nexport type ServiceTimelineState = Readonly<{\n snapshot: NamespaceSnapshot\n /** `pinned`: the namespace's clock was frozen itself, not just following a frozen base. */\n clock: Readonly<ClockState & { pinned?: boolean }>\n rngState: number\n}>\n\nexport type ServiceCheckpoint = Checkpoint<ServiceTimelineState>\n\nexport type ServiceRuntime<T extends ServiceInstance> = FetchAPI & {\n /** Stop package-owned lifecycle timers when a supervisor closes the runtime. */\n stop?(): void\n readonly name: string\n /** Same-origin Fetch handler and App Router method exports, sharing this runtime. */\n mount(prefix: string): MountedAPI\n readonly sqlite: SqliteClient\n readonly clock: Clock\n /**\n * Change the id base ({@link RuntimeOptions.idBase}) for ids generated from now on, and\n * return the number it resolved to. Set it before the first request so a boot's ids stay\n * one run.\n */\n setIdBase(base: IdBase): number\n readonly faults: FaultRegistry\n /** Baseline response time per namespace. */\n readonly latency: LatencyRegistry\n readonly metrics: Metrics\n readonly journal: Journal\n readonly rng: Rng\n readonly credentials: CredentialRegistry\n /** The webhook hub, when the service has outbound webhooks. */\n readonly webhooks: WebhookHub | undefined\n /**\n * A namespace's clock. Each follows the base clock, {@link ServiceRuntime.clock}, with an\n * offset and a freeze of its own, so moving one never moves another.\n */\n namespaceClock(namespace?: string): Clock\n namespaceOf(request: Request): string\n /** Opaque in-process checkpoint including records, controls and webhook history. */\n fleetSnapshot(namespace: string): object\n fleetRestore(snapshot: unknown, namespace: string): void\n fleetExport(snapshot: unknown): SnapshotDocument\n fleetImport(namespace: string, document: unknown): object\n /** Expand a named preset into fault rules (and webhook faults) for `namespace`. */\n applyPreset(name: string, namespace?: string, overrides?: Partial<FaultRule>): FaultRule[]\n /** The instance behind `namespace` (the default one when omitted), created on first use. */\n instance(namespace?: string): T\n /** Public names of every namespace created so far. */\n namespaces(): string[]\n /** Return one namespace to its boot state, or every namespace with `\"*\"`. */\n reset(namespace?: string): Promise<void>\n /** Reset a namespace and forget it, releasing everything it held. */\n dropNamespace(namespace: string): Promise<void>\n /** A namespace's controls: seed, clock, virtual time, latency, faults and snapshots. */\n controls(namespace?: string): ControlState & { snapshots: SnapshotInfo[] }\n /** Apply a control document to a namespace. A given key replaces that control. */\n configure(\n controls: NamespaceControlsInput,\n namespace?: string,\n ): ControlState & { snapshots: SnapshotInfo[] }\n /** Named snapshots of a namespace: records, clock, random streams, faults and latency. */\n readonly snapshots: {\n /** Capture the namespace now. Reusing a name replaces that snapshot. */\n create(options?: { name?: string; namespace?: string }): SnapshotInfo\n list(namespace?: string): SnapshotInfo[]\n /** The snapshot as portable JSON, to commit beside a suite or boot another mock from. */\n export(id: string, namespace?: string): SnapshotDocument\n /** Store a document as a snapshot without restoring it. */\n import(\n document: SnapshotDocument,\n options?: { name?: string; namespace?: string },\n ): SnapshotInfo\n restore(id: string, namespace?: string): void\n delete(id: string, namespace?: string): boolean\n }\n /** Request headers that carry controls, checked: spread them into a `fetch` or an SDK's defaults. */\n headers(input: ControlHeaderInput): Record<string, string>\n snapshot(namespace?: string): NamespaceSnapshot\n restore(snapshot: NamespaceSnapshot, namespace?: string): void\n /** Capture the current branch. Mutating HTTP calls do this automatically. */\n checkpoint(namespace?: string, branch?: string): ServiceCheckpoint\n /** Create an isolated branch, optionally from a historical checkpoint. */\n branch(name: string, options?: { namespace?: string; at?: string }): ServiceCheckpoint\n /** Restore a branch, clock, and PRNG to a checkpoint. */\n checkout(checkpoint: string, options?: { namespace?: string; branch?: string }): void\n /** Inspect the retained history for a namespace. */\n timeline(namespace?: string): Timeline<ServiceTimelineState>\n /** Collections in one namespace: declared shape plus what the rows actually hold. */\n state(namespace?: string): StateView\n}\n\ntype _MockSurfaceProof = ServiceRuntime<ServiceInstance> extends MockSurface ? true : never\nconst mockSurfaceProof: _MockSurfaceProof = true\nvoid mockSurfaceProof\n\n/** The namespace used when a request names none. */\nexport const DEFAULT_NAMESPACE = \"default\"\n\nconst MUTATING_METHODS = new Set([\"POST\", \"PUT\", \"PATCH\", \"DELETE\"])\n\nconst effects = new WeakMap<Request, FaultHit[\"effect\"][]>()\n\nconst acceptance = new WeakMap<Request, (notes: ResponseNotes) => void>()\n\n/** Notify only after a durable mutation commits. No-op outside an active runtime request. */\nexport const markMutationAccepted = (request: Request, notes: ResponseNotes = {}): void => {\n acceptance.get(request)?.(notes)\n}\n\n/** Preserve request-bound effects and acceptance when a provider must rebuild a Request. */\nexport const forwardRequestContext = (source: Request, target: Request): Request => {\n const fired = effects.get(source)\n const accepted = acceptance.get(source)\n if (fired) effects.set(target, fired)\n if (accepted) acceptance.set(target, accepted)\n return forwardMountContext(source, target)\n}\n\n/**\n * Merge two sorted snapshot row arrays, retaining byte-identical old objects. Unlike the previous\n * Map/string-key implementation this is allocation-free apart from the result array and O(n).\n */\nconst reuseSorted = <T>(\n fresh: T[],\n previous: T[] | undefined,\n compare: (left: T, right: T) => number,\n equal: (left: T, right: T) => boolean,\n): T[] => {\n if (!previous || previous.length === 0) return fresh.map((row) => Object.freeze(row))\n const result = new Array<T>(fresh.length)\n let unchanged = fresh.length === previous.length\n let oldIndex = 0\n for (let index = 0; index < fresh.length; index++) {\n const row = fresh[index] as T\n while (oldIndex < previous.length && compare(previous[oldIndex] as T, row) < 0) {\n oldIndex++\n }\n const old = previous[oldIndex]\n result[index] =\n old !== undefined && compare(old, row) === 0 && equal(old, row) ? old : Object.freeze(row)\n if (result[index] !== previous[index]) unchanged = false\n }\n return unchanged ? previous : result\n}\n\n/**\n * The fault effects (`{\"effect\": \"created_but_500\"}` rules) that fired for this request, in\n * rule order. Handlers read this to switch on a named vendor misbehaviour.\n */\nexport const faultEffects = (\n request: Request,\n): { name: string; params: Record<string, unknown> }[] =>\n (effects.get(request) ?? []).filter((e): e is NonNullable<typeof e> => e !== undefined)\n\n/** Whether the named effect fired for this request; its params when it did. */\nexport const faultEffect = (request: Request, name: string): Record<string, unknown> | undefined =>\n faultEffects(request).find((e) => e.name === name)?.params\n\n/**\n * Thrown by an in-process `runtime.fetch` when a `drop` fault fires: the same thing a real\n * `fetch` does when the connection dies mid-request. A served mock destroys the socket.\n */\nexport class DroppedConnectionError extends TypeError {\n readonly code = \"MOCKINGBIRD_DROP\"\n /** Why the connection died: a `drop`, a `timeout` that ran out, or a `truncate`d body. */\n readonly reason: \"drop\" | \"timeout\" | \"truncate\"\n constructor(reason: \"drop\" | \"timeout\" | \"truncate\" = \"drop\") {\n super(\n reason === \"timeout\"\n ? \"fetch failed: request timed out by Mockingbird fault\"\n : reason === \"truncate\"\n ? \"fetch failed: response truncated by Mockingbird fault\"\n : \"fetch failed: connection dropped by Mockingbird fault\",\n )\n this.name = \"TypeError\"\n this.reason = reason\n }\n}\n\nconst realSleep = (ms: number, signal?: AbortSignal): Promise<void> =>\n new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(signal.reason)\n return\n }\n const abort = () => {\n clearTimeout(timer)\n reject(signal?.reason)\n }\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", abort)\n resolve()\n }, ms)\n signal?.addEventListener(\"abort\", abort, { once: true })\n })\n\nconst NULL_BODY_STATUS = new Set([101, 204, 205, 304])\n\n/** Let `bytes` of the body through, then fail the stream the way a dying connection does. */\nconst truncateResponse = (response: Response, bytes: number): Response => {\n if (NULL_BODY_STATUS.has(response.status)) return response\n const reader = response.body?.getReader()\n let sent = 0\n const body = new ReadableStream<Uint8Array>({\n async pull(controller) {\n const chunk = sent < bytes && reader ? await reader.read() : undefined\n if (!chunk || chunk.done) {\n await reader?.cancel().catch(() => {})\n controller.error(new DroppedConnectionError(\"truncate\"))\n return\n }\n const part = chunk.value.subarray(0, bytes - sent)\n sent += part.length\n controller.enqueue(part)\n },\n cancel: (reason) => reader?.cancel(reason),\n })\n const headers = new Headers(response.headers)\n headers.delete(\"content-length\")\n return new Response(body, { status: response.status, statusText: response.statusText, headers })\n}\n\n/** What a snapshot holds for one namespace. Only `records` is always there. */\ntype Kept = {\n records: NamespaceSnapshot\n clock?: { now: number; frozen: boolean; pinned?: boolean }\n /** Where the service's own random stream stands. */\n rngState?: number\n controls: ControlsSnapshot\n webhooks?: unknown\n}\ntype Stored = Kept & { info: SnapshotInfo }\n\ntype Matcher = { operationId: string; method: string; pattern: RegExp; params: number }\n\n/** Resolve a request to its operationId: static segments beat parameters, as in routing. */\nconst operationMatcher = (document: OpenAPIDocument) => {\n const matchers: Matcher[] = listOperations(document)\n .map((operation) => ({\n operationId: operation.operationId,\n method: operation.method.toUpperCase(),\n pattern: operationPath(operation).pattern,\n params: (operation.path.match(/\\{/g) ?? []).length,\n }))\n .sort((a, b) => a.params - b.params)\n return (request: Request, path: string): string | undefined =>\n matchers.find((m) => m.method === request.method && m.pattern.test(path))?.operationId\n}\n\n/**\n * Wrap a service in the shared Mockingbird contract: an unauthenticated `/__admin/health`,\n * the `/__admin/*` control plane, per-request namespaces, a controllable clock,\n * fault injection, and request metrics.\n *\n * Namespaces isolate parallel workers inside one process: each gets its own\n * instance over the same SQLite database, so rows are partitioned by namespace\n * and a worker's reset or restore never touches another worker's data.\n */\nexport const createRuntime = <T extends ServiceInstance>(\n options: RuntimeOptions<T>,\n): ServiceRuntime<T> => {\n const adminPrefix = resolveAdminPrefix(options.adminPrefix)\n const internalPaths = Object.entries(options.document?.paths ?? {})\n .filter(([, item]) => item[\"x-mockingbird-internal\"] === true)\n .map(([path]) => path)\n for (const path of internalPaths) {\n if (!path.startsWith(`${ADMIN_PREFIX}/blobs/`))\n throw new Error(`internal transport ${path} must live under ${ADMIN_PREFIX}/blobs/`)\n }\n assertAdminPrefixAvailable(\n adminPrefix,\n Object.keys(options.document?.paths ?? {}).filter((path) => !internalPaths.includes(path)),\n )\n const internalMatch = (path: string): string | undefined => {\n for (const pattern of internalPaths) {\n const actual = path.split(\"/\")\n const expected = pattern.split(\"/\")\n if (\n actual.length === expected.length &&\n expected.every((part, i) => part.startsWith(\"{\") || part === actual[i])\n )\n return pattern\n }\n return undefined\n }\n assertAdminUi(options.adminUi)\n const boot = normalizeBootControls(options.adminControls, \"adminControls\")\n const seed = normalizeSeed(options.seed ?? boot.shared.seed ?? 0)\n // Named outright, the seed is a boot control like any other: it wins over a boot snapshot's.\n if (options.seed !== undefined) boot.shared.seed = seed\n const sqlite = bootSqlite(options.sqlite)\n if (options.idBase !== undefined)\n setIdBase(sqlite, normalizeIdBase(options.idBase, \"idBase\", options.io?.wallNow))\n const clock = options.clock ?? createClock()\n // The shared boot clock is the base clock, which every namespace follows. What a namespace\n // keeps of it for itself is how far its own clock steps before each request.\n const { now: bootNow, frozen: bootFrozen, ...stepping } = boot.shared.clock ?? {}\n if (bootFrozen === true) clock.freeze()\n if (bootNow !== undefined) clock.set(bootNow)\n if (bootFrozen === false) clock.unfreeze()\n const bootClockGiven = bootNow !== undefined || bootFrozen !== undefined\n if (stepping.autoAdvanceMs !== undefined) boot.shared.clock = stepping\n else delete boot.shared.clock\n /** Where the base clock stood when the runtime was created: what a full reset returns it to. */\n const bootClock = clock.state()\n const rng = createRng(seed)\n const wallNow = options.io?.wallNow ?? Date.now\n const monotonicNow = options.io?.monotonicNow ?? (() => performance.now())\n const sleep = options.io?.sleep ?? realSleep\n const metrics = createMetrics()\n const journal = createJournal(options.journalSize ?? DEFAULT_JOURNAL_SIZE)\n const version = options.version ?? PACKAGE_VERSION\n const instances = new Map<string, T>()\n const publicNamespaces = new Set<string>()\n /** The service's own random stream, by storage key. `default` uses {@link rng}. */\n const rngs = new Map<string, Rng>()\n const namespaceClocks = new Map<string, DerivedClock>()\n const namespaceForStorage = new Map<string, string>()\n /**\n * Every namespace has a clock of its own that follows the base clock. Moving one never\n * moves another; moving the base (`runtime.clock`) moves every namespace that is not frozen.\n */\n const namespaceClock = (name = DEFAULT_NAMESPACE): DerivedClock => {\n let found = namespaceClocks.get(name)\n if (!found) {\n found = deriveClock(clock, () => options.onClockChange?.(name))\n namespaceClocks.set(name, found)\n }\n return found\n }\n const fleetPoints = new WeakMap<object, { namespace: string } & Kept>()\n const timelines = new Map<string, Timeline<ServiceTimelineState>>()\n const branchStorage = new Map<string, string>()\n const captured = new Map<string, NamespaceSnapshot>()\n const credentials = createCredentialRegistry()\n for (const [credential, target] of Object.entries(boot.credentials))\n credentials.set(credential, target)\n const operationIdFor = options.document ? operationMatcher(options.document) : () => undefined\n\n const controls = createNamespaceControls({\n seed,\n clock: namespaceClock,\n boot,\n ...(options.presets ? { presets: options.presets } : {}),\n sleep: (ms) => sleep(ms),\n onReseed: (namespace, next) => {\n rngFor(namespace).reseed(next)\n for (const [mapping, storage] of branchStorage)\n if (mapping.startsWith(`${namespace}\\0`)) rngs.get(storage)?.reseed(next)\n },\n onPreset: (preset, namespace, overrides) => {\n if (preset.webhook)\n options.webhooks?.fault(namespace, {\n ...preset.webhook,\n ...(overrides.count !== undefined ? { count: overrides.count } : {}),\n })\n },\n restoreDocument: (namespace, document, scope) => {\n const { clock: carried, ...point } = fromDocument(namespace, document)\n // A boot clock named outright is the base clock's; the snapshot's does not override it.\n restoreAll(\n namespace,\n bootClockGiven || !carried ? point : { ...point, clock: carried },\n scope,\n )\n },\n })\n const { faults, latency } = controls\n\n /** The random stream behind a storage key, created at its namespace's seed. */\n const rngFor = (storage: string): Rng => {\n if (storage === DEFAULT_NAMESPACE) return rng\n let found = rngs.get(storage)\n if (!found) {\n found = createRng(seed)\n rngs.set(storage, found)\n }\n return found\n }\n const seedOf = (namespace: string): number | string => controls.settings(namespace).seed\n\n const storageNamespace = (name: string) =>\n name === DEFAULT_NAMESPACE ? options.name : `${options.name}:${name}`\n\n const instanceFor = (key: string, publicNamespace = key, isolatedRng?: Rng): T => {\n const existing = instances.get(key)\n if (existing) return existing\n if (!KEY_PATTERN.test(key) || !KEY_PATTERN.test(publicNamespace)) {\n throw new RangeError(\n `namespace must match ${KEY_PATTERN}: ${JSON.stringify(publicNamespace)}`,\n )\n }\n if (isolatedRng) rngs.set(key, isolatedRng)\n const created = options.create({\n namespace: storageNamespace(key),\n publicNamespace,\n adminPrefix,\n sqlite,\n clock: namespaceClock(publicNamespace),\n rng: rngFor(key),\n })\n instances.set(key, created)\n namespaceForStorage.set(key, publicNamespace)\n publicNamespaces.add(publicNamespace)\n // A namespace starts from its boot controls and, when one is given, its boot snapshot.\n if (key === publicNamespace) controls.ensure(key)\n return created\n }\n\n const instance = (name: string = DEFAULT_NAMESPACE): T => instanceFor(name)\n\n /** A namespace's clock as a checkpoint keeps it, and how one is put back. */\n const clockOf = (namespace: string): ServiceTimelineState[\"clock\"] => {\n const own = namespaceClock(namespace)\n return Object.freeze({ ...own.state(), pinned: own.pinned() })\n }\n const placeClock = (\n namespace: string,\n state: { now: number; frozen: boolean; pinned?: boolean },\n ): void =>\n // A document only says frozen or not; frozen there means frozen at that instant.\n namespaceClock(namespace).place({ now: state.now, pinned: state.pinned ?? state.frozen })\n\n const capture = (storage: string): ServiceTimelineState => {\n const fresh = snapshotNamespace(sqlite, storageNamespace(storage))\n const previous = captured.get(storage)\n const snapshot: NamespaceSnapshot = {\n namespace: fresh.namespace,\n records: reuseSorted(\n fresh.records,\n previous?.records,\n (left, right) =>\n left.collection < right.collection\n ? -1\n : left.collection > right.collection\n ? 1\n : left.seq - right.seq,\n (left, right) => left.id === right.id && left.value === right.value,\n ),\n sequences: reuseSorted(\n fresh.sequences,\n previous?.sequences,\n (left, right) =>\n left.name < right.name\n ? -1\n : left.name > right.name\n ? 1\n : left.kind < right.kind\n ? -1\n : left.kind > right.kind\n ? 1\n : 0,\n (left, right) => left.value === right.value,\n ),\n }\n Object.freeze(snapshot.records)\n Object.freeze(snapshot.sequences)\n Object.freeze(snapshot)\n captured.set(storage, snapshot)\n return Object.freeze({\n snapshot,\n clock: clockOf(namespaceForStorage.get(storage) ?? storage),\n rngState: rngFor(storage).state(),\n })\n }\n\n const timeline = (name: string = DEFAULT_NAMESPACE): Timeline<ServiceTimelineState> => {\n let found = timelines.get(name)\n if (found) return found\n instance(name)\n found = new Timeline<ServiceTimelineState>({\n now: namespaceClock(name).now,\n ...(options.maxCheckpoints !== undefined ? { maxCheckpoints: options.maxCheckpoints } : {}),\n })\n found.commit(capture(name))\n timelines.set(name, found)\n return found\n }\n\n const restoreStorage = (storage: string, snapshot: NamespaceSnapshot): void => {\n const current = instances.get(storage)\n if (current) options.beforeRestore?.(current)\n restoreNamespace(sqlite, storageNamespace(storage), snapshot)\n }\n\n const physicalBranch = (namespace: string, branch: string): string => {\n if (branch === \"main\") return namespace\n const mapKey = `${namespace}\\0${branch}`\n const existing = branchStorage.get(mapKey)\n if (existing) return existing\n // The hash keeps the internal instance key inside the 64-character namespace contract.\n const key = `branch_${seedFrom(`${options.name}\\0${namespace}\\0${branch}`).toString(36)}`\n branchStorage.set(mapKey, key)\n return key\n }\n\n const ensureBranch = (namespace: string, branch: string, at?: string): string => {\n if (!KEY_PATTERN.test(branch)) throw new RangeError(`branch must match ${KEY_PATTERN}`)\n const history = timeline(namespace)\n if (branch === \"main\") {\n if (at !== undefined) {\n const point = history.checkout(\"main\", at)\n restoreStorage(namespace, point.value.snapshot)\n captured.set(namespace, point.value.snapshot)\n rngFor(namespace).setState(point.value.rngState)\n placeClock(namespace, point.value.clock)\n }\n return namespace\n }\n const storage = physicalBranch(namespace, branch)\n if (!history.hasBranch(branch)) {\n // Capture unobserved background work before branching from the current main head.\n if (at === undefined) history.commit(capture(namespace))\n const point = history.fork(branch, at === undefined ? {} : { from: at })\n const branchRng = createRng(seedOf(namespace))\n if (point) branchRng.setState(point.value.rngState)\n instanceFor(storage, namespace, branchRng)\n if (point) restoreStorage(storage, point.value.snapshot)\n if (point) captured.set(storage, point.value.snapshot)\n } else if (at !== undefined && history.head(branch)?.id !== at) {\n const point = history.checkout(branch, at)\n if (!instances.has(storage)) {\n const branchRng = createRng(seedOf(namespace))\n branchRng.setState(point.value.rngState)\n instanceFor(storage, namespace, branchRng)\n }\n rngFor(storage).setState(point.value.rngState)\n restoreStorage(storage, point.value.snapshot)\n captured.set(storage, point.value.snapshot)\n } else {\n if (!instances.has(storage)) {\n const point = history.head(branch)\n const branchRng = createRng(seedOf(namespace))\n if (point) branchRng.setState(point.value.rngState)\n instanceFor(storage, namespace, branchRng)\n }\n }\n return storage\n }\n\n const checkpoint = (namespace = DEFAULT_NAMESPACE, branch = \"main\"): ServiceCheckpoint => {\n const storage = ensureBranch(namespace, branch)\n return timeline(namespace).commit(capture(storage), { branch })\n }\n\n const branch = (\n name: string,\n branchOptions: { namespace?: string; at?: string } = {},\n ): ServiceCheckpoint => {\n const namespace = branchOptions.namespace ?? DEFAULT_NAMESPACE\n ensureBranch(namespace, name, branchOptions.at)\n const head = timeline(namespace).head(name)\n if (!head) throw new RangeError(`branch ${name} has no checkpoint`)\n return head\n }\n\n const checkout = (\n checkpointId: string,\n checkoutOptions: { namespace?: string; branch?: string } = {},\n ): void => {\n const namespace = checkoutOptions.namespace ?? DEFAULT_NAMESPACE\n const branchName = checkoutOptions.branch ?? \"main\"\n const history = timeline(namespace)\n const point = history.checkout(branchName, checkpointId)\n const storage = ensureBranch(namespace, branchName)\n restoreStorage(storage, point.value.snapshot)\n captured.set(storage, point.value.snapshot)\n placeClock(namespace, point.value.clock)\n rngFor(storage).setState(point.value.rngState)\n }\n\n const reset = async (name: string = DEFAULT_NAMESPACE): Promise<void> => {\n if (name === \"*\") {\n options.webhooks?.clear()\n for (const each of instances.values()) await each.reset()\n timelines.clear()\n for (const storage of branchStorage.values()) {\n instances.delete(storage)\n rngs.delete(storage)\n namespaceForStorage.delete(storage)\n }\n branchStorage.clear()\n captured.clear()\n snapshotStore.clear()\n journal.clear()\n metrics.reset()\n // The base clock goes back to where the runtime found it; a live one keeps running.\n if (bootClock.frozen) restoreClock(clock, bootClock)\n else {\n clock.reset()\n clock.advance(bootClock.offsetMs)\n }\n controls.rebootAll()\n for (const each of new Set([DEFAULT_NAMESPACE, ...publicNamespaces])) controls.ensure(each)\n return\n }\n options.webhooks?.clear(name)\n const target = instances.get(name)\n if (target) await target.reset()\n else clearNamespace(sqlite, storageNamespace(name))\n for (const [mapping, storage] of branchStorage) {\n if (!mapping.startsWith(`${name}\\0`)) continue\n const branchInstance = instances.get(storage)\n if (branchInstance) await branchInstance.reset()\n else clearNamespace(sqlite, storageNamespace(storage))\n branchStorage.delete(mapping)\n instances.delete(storage)\n namespaceForStorage.delete(storage)\n rngs.delete(storage)\n captured.delete(storage)\n }\n timelines.delete(name)\n captured.delete(name)\n snapshotStore.clear(name)\n journal.clear(name)\n metrics.reset(name)\n // Seed, clock, faults, latency and every stream, then the boot snapshot and controls again.\n controls.reboot(name)\n }\n\n const dropNamespace = async (name: string): Promise<void> => {\n await reset(name)\n if (name === DEFAULT_NAMESPACE) return\n instances.delete(name)\n namespaceForStorage.delete(name)\n publicNamespaces.delete(name)\n rngs.delete(name)\n namespaceClocks.delete(name)\n controls.forget(name)\n }\n\n /** Everything a namespace is: records, clock, random streams, faults, latency, webhooks. */\n const captureAll = (namespace: string): Kept => {\n instance(namespace)\n const state = capture(namespace)\n return {\n records: state.snapshot,\n clock: state.clock,\n rngState: state.rngState,\n controls: controls.snapshot(namespace),\n webhooks: options.webhooks?.snapshot(namespace),\n }\n }\n\n /** Put back what `point` holds. What it does not hold stays as it is. */\n const restoreAll = (namespace: string, point: Kept, scope: BootScope = \"all\"): void => {\n instance(namespace)\n if (scope === \"all\") {\n restoreStorage(namespace, point.records)\n captured.set(namespace, point.records)\n }\n if (point.clock) placeClock(namespace, point.clock)\n // Controls before the service's stream: a restored seed restarts it, then it is placed.\n controls.restore(namespace, point.controls)\n if (point.rngState !== undefined) rngFor(namespace).setState(point.rngState)\n if (scope !== \"all\") return\n if (point.webhooks !== undefined) options.webhooks?.restore(namespace, point.webhooks)\n // History continues from the restored state instead of being rewritten.\n timelines.get(namespace)?.commit(capture(namespace), { branch: \"main\" })\n }\n\n const toDocument = (point: Kept): SnapshotDocument => {\n const { settings, streams, faults: rules, latency: waits } = point.controls\n return {\n format: SNAPSHOT_FORMAT,\n service: options.name,\n records: point.records.records.map((row) => {\n // A Collection row is stored as `{seq, value}`; anything else travels as its raw text.\n let parsed: unknown\n try {\n parsed = JSON.parse(row.value)\n } catch {\n parsed = undefined\n }\n const base = { collection: row.collection, id: row.id, seq: row.seq }\n return isRecord(parsed) &&\n \"value\" in parsed &&\n JSON.stringify({ seq: row.seq, value: parsed.value }) === row.value\n ? { ...base, value: parsed.value }\n : { ...base, raw: row.value }\n }),\n sequences: point.records.sequences.map((row) => ({ ...row })),\n ...(point.clock\n ? {\n clock: {\n now: point.clock.now,\n frozen: point.clock.frozen,\n ...(settings?.autoAdvanceMs !== undefined\n ? { autoAdvanceMs: settings.autoAdvanceMs }\n : {}),\n },\n }\n : {}),\n ...(settings?.seed !== undefined ? { seed: settings.seed } : {}),\n ...(point.rngState !== undefined ? { rng: { state: point.rngState, ...streams } } : {}),\n ...(rules ? { faults: rules } : {}),\n ...(waits ? { latency: waits } : {}),\n ...(settings?.virtualTime !== undefined ? { virtualTime: settings.virtualTime } : {}),\n ...(point.webhooks !== undefined\n ? { webhooks: options.webhooks?.exportSnapshot(point.webhooks) }\n : {}),\n }\n }\n\n const position = (value: unknown, label: string): number => {\n if (\n typeof value !== \"number\" ||\n !Number.isSafeInteger(value) ||\n value < 0 ||\n value > 0xffffffff\n )\n throw new ControlError(`${label}: expected an unsigned 32-bit integer`)\n return value\n }\n\n /** A document as restorable state. Checks all of it; touches nothing. */\n const fromDocument = (namespace: string, document: SnapshotDocument): Kept => {\n if (document.service !== undefined && document.service !== options.name)\n throw new ControlError(`snapshot was taken from ${document.service}, not ${options.name}`)\n const highest = new Map<string, number>()\n const seen = new Set<string>()\n const records = document.records.map((row) => {\n const key = `${row.collection}\\0${row.id}`\n if (seen.has(key))\n throw new ControlError(`snapshot.records: duplicate ${row.collection}/${row.id}`)\n seen.add(key)\n const seq = row.seq ?? (highest.get(row.collection) ?? 0) + 1\n highest.set(row.collection, Math.max(highest.get(row.collection) ?? 0, seq))\n return Object.freeze({\n collection: row.collection,\n id: row.id,\n seq,\n value: typeof row.raw === \"string\" ? row.raw : JSON.stringify({ seq, value: row.value }),\n })\n })\n records.sort((left, right) =>\n left.collection < right.collection\n ? -1\n : left.collection > right.collection\n ? 1\n : left.seq - right.seq,\n )\n const sequences = new Map<string, { name: string; kind: string; value: number }>()\n for (const row of document.sequences ?? [])\n sequences.set(`${row.name}\\0${row.kind}`, { ...row })\n // A collection's counter never trails its rows, so the next insert cannot reuse a seq.\n for (const [collection, seq] of highest) {\n const key = `${collection}\\0collection`\n if ((sequences.get(key)?.value ?? 0) < seq)\n sequences.set(key, { name: collection, kind: \"collection\", value: seq })\n }\n const stored: NamespaceSnapshot = Object.freeze({\n namespace: storageNamespace(namespace),\n records: Object.freeze(records) as NamespaceSnapshot[\"records\"],\n sequences: Object.freeze(\n [...sequences.values()]\n .sort((left, right) =>\n left.name < right.name\n ? -1\n : left.name > right.name\n ? 1\n : left.kind < right.kind\n ? -1\n : left.kind > right.kind\n ? 1\n : 0,\n )\n .map((row) => Object.freeze(row)),\n ) as NamespaceSnapshot[\"sequences\"],\n })\n\n const settings: Partial<ControlSettings> = {}\n if (document.seed !== undefined) settings.seed = normalizeSeed(document.seed, \"snapshot.seed\")\n if (document.virtualTime !== undefined) {\n if (typeof document.virtualTime !== \"boolean\")\n throw new ControlError(\"snapshot.virtualTime: expected a boolean\")\n settings.virtualTime = document.virtualTime\n }\n const stepping =\n document.clock?.autoAdvanceMs !== undefined\n ? normalizeClock({ autoAdvance: document.clock.autoAdvanceMs }, \"snapshot.clock\")\n .autoAdvanceMs\n : undefined\n if (stepping !== undefined) settings.autoAdvanceMs = stepping\n const held: ControlsSnapshot = {}\n if (Object.keys(settings).length > 0) held.settings = settings\n if (document.rng?.faults !== undefined || document.rng?.latency !== undefined)\n held.streams = {\n ...(document.rng.faults !== undefined\n ? { faults: position(document.rng.faults, \"snapshot.rng.faults\") }\n : {}),\n ...(document.rng.latency !== undefined\n ? { latency: position(document.rng.latency, \"snapshot.rng.latency\") }\n : {}),\n }\n if (document.faults !== undefined) {\n const given = document.faults\n if (!isRecord(given) || !Array.isArray(given.rules))\n throw new ControlError(\"snapshot.faults: expected {rules: [...]}\")\n held.faults = {\n rules: given.rules.map((each: unknown) => {\n const rule = normalizeFault(each)\n const kept = each as Record<string, unknown>\n return {\n ...rule,\n remaining: typeof kept.remaining === \"number\" ? kept.remaining : (rule.count ?? null),\n hits: typeof kept.hits === \"number\" ? kept.hits : 0,\n seen: typeof kept.seen === \"number\" ? kept.seen : 0,\n ...(typeof kept.position === \"number\" ? { position: kept.position } : {}),\n }\n }),\n nextId: typeof given.nextId === \"number\" ? given.nextId : 0,\n }\n }\n if (document.latency !== undefined)\n held.latency = normalizeLatency(document.latency, \"snapshot.latency\")\n return {\n records: stored,\n ...(document.clock\n ? { clock: { now: document.clock.now, frozen: document.clock.frozen } }\n : {}),\n ...(document.rng?.state !== undefined\n ? { rngState: position(document.rng.state, \"snapshot.rng.state\") }\n : {}),\n controls: held,\n ...(document.webhooks !== undefined\n ? { webhooks: options.webhooks?.importSnapshot(namespace, document.webhooks) }\n : {}),\n }\n }\n\n const kept = new Map<string, Map<string, Stored>>()\n const snapshotCounters = new Map<string, number>()\n const keep = (namespace: string, given: string | undefined, point: Kept): SnapshotInfo => {\n let store = kept.get(namespace)\n if (!store) {\n store = new Map()\n kept.set(namespace, store)\n }\n let id = given\n if (id === undefined) {\n let next = snapshotCounters.get(namespace) ?? 0\n do id = `snap_${++next}`\n while (store.has(id))\n snapshotCounters.set(namespace, next)\n }\n const info: SnapshotInfo = {\n id,\n namespace,\n records: point.records.records.length,\n at: point.clock?.now ?? namespaceClock(namespace).now(),\n portable: true,\n }\n store.set(id, { ...point, info })\n return info\n }\n /** Named snapshots, kept per namespace so two workers never see each other's ids. */\n const snapshotStore: SnapshotStore = {\n create: (namespace, id) => keep(namespace, id, captureAll(namespace)),\n list: (namespace) => [...(kept.get(namespace)?.values() ?? [])].map((each) => each.info),\n get: (namespace, id) => kept.get(namespace)?.get(id)?.info,\n export(namespace, id) {\n const found = kept.get(namespace)?.get(id)\n return found ? toDocument(found) : undefined\n },\n import: (namespace, id, document) => keep(namespace, id, fromDocument(namespace, document)),\n restore(namespace, id) {\n const found = kept.get(namespace)?.get(id)\n if (!found) return false\n restoreAll(namespace, found)\n return true\n },\n remove: (namespace, id) => kept.get(namespace)?.delete(id) ?? false,\n clear(namespace) {\n if (namespace === undefined) {\n kept.clear()\n snapshotCounters.clear()\n return\n }\n kept.delete(namespace)\n snapshotCounters.delete(namespace)\n },\n }\n\n const applyControls = (namespace: string, plan: ControlPlan): void => {\n const { snapshot: document, ...rest } = plan\n // Everything is checked before anything is touched: a rejected document changes nothing.\n controls.check(rest)\n const point = document ? fromDocument(namespace, document) : undefined\n // The snapshot first, so a control given beside it wins over the one it carries.\n if (point) restoreAll(namespace, point)\n controls.apply(namespace, rest)\n }\n\n const describeControls = (namespace: string) => ({\n ...controls.describe(namespace),\n snapshots: snapshotStore.list(namespace),\n })\n\n const snapshot = (name: string = DEFAULT_NAMESPACE): NamespaceSnapshot => {\n return checkpoint(name, \"main\").value.snapshot\n }\n\n const restore = (from: NamespaceSnapshot, name: string = DEFAULT_NAMESPACE): void => {\n instance(name)\n restoreStorage(name, from)\n captured.set(name, from)\n // Import legacy snapshots into the canonical history instead of creating a second rollback\n // mechanism. The compatibility method stays synchronous and keeps its original return type.\n const history = timelines.get(name)\n if (history) history.commit(capture(name), { branch: \"main\" })\n else timeline(name)\n }\n\n const declarationsFor = (namespace: string): readonly StateDeclaration[] => {\n const declared = options.state\n if (!declared) return []\n return typeof declared === \"function\" ? declared(instance(namespace), namespace) : declared\n }\n\n const stateScope = (namespace: string) => ({\n sqlite,\n namespace,\n storageNamespace: storageNamespace(namespace),\n root: instance(namespace),\n declarations: declarationsFor(namespace),\n })\n\n const runtime: ServiceRuntime<T> = {\n name: options.name,\n mount: (prefix) =>\n mount(runtime, prefix, (request) => {\n const namespace = runtime.namespaceOf(request)\n return namespace === DEFAULT_NAMESPACE\n ? \"\"\n : `${adminPrefix}/ns/${encodeURIComponent(namespace)}`\n }),\n sqlite,\n clock,\n setIdBase(base) {\n const resolved = normalizeIdBase(base, \"idBase\", options.io?.wallNow)\n setIdBase(sqlite, resolved)\n return resolved\n },\n faults,\n latency,\n metrics,\n journal,\n rng,\n credentials,\n webhooks: options.webhooks,\n namespaceClock,\n namespaceOf(request) {\n const url = new URL(request.url)\n const prefixed = matchNamespacePath(url.pathname, adminPrefix)\n const selected =\n request.headers.get(NAMESPACE_HEADER) ??\n (prefixed ? decodeURIComponent(prefixed[1] as string) : undefined)\n const path = prefixed ? (prefixed[2] ?? \"/\") : url.pathname\n if (isAdminPath(path, adminPrefix))\n return url.searchParams.get(\"namespace\") ?? selected ?? DEFAULT_NAMESPACE\n if (selected !== undefined) return selected\n const credential = options.credential?.(request)\n return (\n (credential !== undefined ? credentials.get(credential) : undefined) ?? DEFAULT_NAMESPACE\n )\n },\n fleetSnapshot(namespace) {\n const handle = {}\n fleetPoints.set(handle, { namespace, ...captureAll(namespace) })\n return handle\n },\n fleetRestore(handle, namespace) {\n const point =\n typeof handle === \"object\" && handle !== null ? fleetPoints.get(handle) : undefined\n if (!point || point.namespace !== namespace) throw new Error(\"invalid fleet checkpoint\")\n restoreAll(namespace, point)\n timelines.delete(namespace)\n },\n fleetExport(handle) {\n const point =\n typeof handle === \"object\" && handle !== null ? fleetPoints.get(handle) : undefined\n if (!point) throw new Error(\"invalid fleet checkpoint\")\n return toDocument(point)\n },\n fleetImport(namespace, document) {\n const handle = {}\n fleetPoints.set(handle, {\n namespace,\n ...fromDocument(namespace, assertSnapshotDocument(document)),\n })\n return handle\n },\n applyPreset: (name, namespace = DEFAULT_NAMESPACE, overrides = {}) =>\n controls.addFault(namespace, { ...overrides, preset: name }),\n instance,\n namespaces: () => [...publicNamespaces].sort(),\n reset,\n dropNamespace,\n controls: (namespace = DEFAULT_NAMESPACE) => describeControls(namespace),\n configure(document, namespace = DEFAULT_NAMESPACE) {\n applyControls(namespace, normalizeControls(document))\n return describeControls(namespace)\n },\n snapshots: {\n create: (given = {}) =>\n snapshotStore.create(given.namespace ?? DEFAULT_NAMESPACE, given.name),\n list: (namespace = DEFAULT_NAMESPACE) => snapshotStore.list(namespace),\n export(id, namespace = DEFAULT_NAMESPACE) {\n const document = snapshotStore.export(namespace, id)\n if (!document) throw new RangeError(`no snapshot ${id} in namespace ${namespace}`)\n return document\n },\n import: (document, given = {}) =>\n snapshotStore.import(given.namespace ?? DEFAULT_NAMESPACE, given.name, document),\n restore(id, namespace = DEFAULT_NAMESPACE) {\n if (!snapshotStore.restore(namespace, id))\n throw new RangeError(`no snapshot ${id} in namespace ${namespace}`)\n },\n delete: (id, namespace = DEFAULT_NAMESPACE) => snapshotStore.remove(namespace, id),\n },\n headers: controlHeaders,\n snapshot,\n restore,\n checkpoint,\n branch,\n checkout,\n timeline,\n state: (namespace = DEFAULT_NAMESPACE) => inspectState(stateScope(namespace)),\n fetch: async (incoming) => {\n let request = incoming\n // `/__admin/ns/<name>/\u2026` selects a namespace (and is stripped) for SDKs that cannot add headers.\n const prefixed = matchNamespacePath(new URL(request.url).pathname, adminPrefix)\n if (prefixed) {\n const url = new URL(request.url)\n url.pathname = prefixed[2] ?? \"/\"\n const headers = new Headers(request.headers)\n if (!headers.has(NAMESPACE_HEADER)) {\n headers.set(NAMESPACE_HEADER, decodeURIComponent(prefixed[1] as string))\n }\n const hasBody = request.method !== \"GET\" && request.method !== \"HEAD\"\n request = forwardRequestContext(\n request,\n new Request(url, {\n method: request.method,\n headers,\n ...(hasBody ? { body: await request.arrayBuffer() } : {}),\n signal: request.signal,\n }),\n )\n }\n const internalUrl = new URL(request.url)\n const internalPath = isAdminPath(internalUrl.pathname, adminPrefix)\n ? `${ADMIN_PREFIX}${internalUrl.pathname.slice(adminPrefix.length)}`\n : \"\"\n const internal = internalMatch(internalPath)\n const obsoleteInternalPath =\n adminPrefix !== ADMIN_PREFIX && internalMatch(internalUrl.pathname) && !internal\n if (internal) {\n internalUrl.pathname = internalPath\n request = forwardRequestContext(request, new Request(internalUrl, request))\n }\n let namespace = internal\n ? (internalUrl.searchParams.get(\"namespace\") ?? control.namespaceOf(request))\n : control.namespaceOf(request)\n if (!request.headers.has(NAMESPACE_HEADER) && options.credential) {\n const credential = options.credential(request)\n const mapped = credential !== undefined ? credentials.get(credential) : undefined\n if (mapped !== undefined) namespace = mapped\n }\n const selectedBranch = request.headers.get(BRANCH_HEADER) ?? \"main\"\n const at = request.headers.get(AT_HEADER) ?? undefined\n const stamp = (response: Response): Response => {\n // An invalid namespace is not echoed back.\n const value = KEY_PATTERN.test(namespace)\n ? `${options.name}@${version}; ns=${namespace}`\n : `${options.name}@${version}`\n try {\n response.headers.set(MOCKINGBIRD_HEADER, value)\n return response\n } catch {\n // Immutable headers (a response passed through from `fetch`): copy it.\n const copy = new Response(response.body, response)\n copy.headers.set(MOCKINGBIRD_HEADER, value)\n return copy\n }\n }\n if (obsoleteInternalPath)\n return stamp(adminFail(404, \"internal transport is only available under adminPrefix\"))\n const handled = internal ? undefined : await control.handle(request)\n if (handled) return stamp(handled)\n const started = monotonicNow()\n const url = new URL(request.url)\n const operationId = operationIdFor(request, url.pathname)\n let accepted: ServiceCheckpoint | undefined\n let acceptedNotes: ResponseNotes | undefined\n // Injected wait this request spent: latency, fault delays, a timeout.\n let waitedMs = 0\n // With virtual time the wait is the whole duration, so a journal replays byte for byte.\n let virtualTime = false\n let requestClock = clock\n // What a rejection records about the body. The runtime never reads the request stream \u2014\n // consuming it would break a streaming request (e.g. a bidirectional model stream) \u2014 so the\n // byte count comes from `content-length` when the client sent it, and is null otherwise.\n const contentLength = request.headers.get(\"content-length\")\n const received: RejectedRequest = {\n contentType: request.headers.get(\"content-type\"),\n bodyBytes:\n contentLength !== null && /^\\d+$/.test(contentLength) ? Number(contentLength) : null,\n transferEncoding: request.headers.get(\"transfer-encoding\"),\n }\n const log = (status: number, faultId?: string, response?: Response) => {\n const noted = { ...acceptedNotes, ...(response ? responseNotes(response) : {}) }\n const rejected = status >= 400 && faultId === undefined\n const entry: RequestLog = {\n service: options.name,\n namespace,\n operationId,\n method: request.method,\n path: url.pathname,\n status,\n durationMs: virtualTime ? waitedMs : Math.round((monotonicNow() - started) * 100) / 100,\n unmatched: options.document !== undefined && operationId === undefined,\n ...(faultId !== undefined ? { faultId } : {}),\n ...(waitedMs > 0 ? { delayMs: waitedMs } : {}),\n ...(noted?.ids && Object.keys(noted.ids).length > 0 ? { ids: noted.ids } : {}),\n ...(noted?.adopted ? { adopted: true } : {}),\n ...(accepted ? { accepted: true, checkpoint: accepted.id } : {}),\n ...(rejected ? { request: { ...received } } : {}),\n ...(rejected && noted?.issues && noted.issues.length > 0\n ? { issues: noted.issues.map((issue) => ({ ...issue })) }\n : {}),\n }\n metrics.record(entry)\n journal.record({ ...entry, at: new Date(requestClock.now()).toISOString() })\n options.onLog?.(entry)\n }\n if (!KEY_PATTERN.test(namespace)) {\n log(400)\n return stamp(\n new Response(\n JSON.stringify({\n error: {\n type: \"mockingbird_admin\",\n message: `${NAMESPACE_HEADER} must match ${KEY_PATTERN}`,\n },\n }),\n { status: 400, headers: { \"content-type\": \"application/json; charset=utf-8\" } },\n ),\n )\n }\n if (!KEY_PATTERN.test(selectedBranch)) {\n log(400)\n return stamp(adminFail(400, `${BRANCH_HEADER} must match ${KEY_PATTERN}`))\n }\n requestClock = namespaceClock(namespace)\n const refuse = (status: number, message: string): Response => {\n log(status)\n return stamp(adminFail(status, message))\n }\n // Controls carried by this request. Whatever could refuse the request is checked before\n // anything is applied, so a request that is refused has changed nothing.\n let requested: RequestControls | undefined\n let scripted: FaultRule[] = []\n try {\n requested = parseControlHeaders(request.headers)\n if (requested)\n scripted = controls.scriptFaults(namespace, {\n ...(requested.fault ? { fault: requested.fault } : {}),\n ...(requested.timeout !== undefined ? { timeoutMs: requested.timeout } : {}),\n })\n const lost = requested?.restore !== undefined ? CONTROL_HEADERS.restore : at && AT_HEADER\n if (requested?.reset && lost)\n throw new ControlError(\n `${CONTROL_HEADERS.reset}: a reset discards snapshots and history, so ${lost} cannot follow it`,\n )\n } catch (error) {\n if (error instanceof ControlError) return refuse(400, error.message)\n throw error\n }\n // A write that names a checkpoint on `main` first moves `main` back to it. That changes\n // the namespace, so it is guarded like the headers that say so outright.\n const rewinds =\n at !== undefined && selectedBranch === \"main\" && MUTATING_METHODS.has(request.method)\n if (\n (requested || rewinds) &&\n options.adminKey !== undefined &&\n !hasAdminKey(request.headers, options.adminKey)\n )\n return refuse(401, `control headers need ${ADMIN_KEY_HEADER}`)\n controls.ensure(namespace)\n if (requested?.restore !== undefined && !snapshotStore.get(namespace, requested.restore))\n return refuse(404, `no snapshot ${requested.restore} in namespace ${namespace}`)\n if (at !== undefined) {\n try {\n timeline(namespace).get(at)\n } catch (error) {\n return refuse(409, error instanceof Error ? error.message : String(error))\n }\n }\n if (requested) {\n // The order the guide lists them in: reset, restore, seed, time, advance, virtual time.\n if (requested.reset) await reset(namespace)\n if (requested.restore !== undefined) snapshotStore.restore(namespace, requested.restore)\n if (requested.seed !== undefined) controls.reseed(namespace, requested.seed)\n if (requested.time !== undefined)\n controls.changeClock(namespace, { frozen: true, now: requested.time })\n if (requested.advance !== undefined)\n controls.changeClock(namespace, { advanceMs: requested.advance })\n if (requested.virtualTime !== undefined)\n controls.apply(namespace, { virtualTime: requested.virtualTime })\n }\n let storage: string\n try {\n if (\n at !== undefined &&\n selectedBranch === \"main\" &&\n !MUTATING_METHODS.has(request.method)\n ) {\n const point = timeline(namespace).get(at)\n storage = physicalBranch(namespace, `at_${at}`)\n let viewRng = rngs.get(storage)\n if (!viewRng) {\n viewRng = createRng(seedOf(namespace))\n instanceFor(storage, namespace, viewRng)\n }\n viewRng.setState(point.value.rngState)\n restoreStorage(storage, point.value.snapshot)\n captured.set(storage, point.value.snapshot)\n } else {\n storage = ensureBranch(namespace, selectedBranch, at)\n }\n } catch (error) {\n log(409)\n return stamp(adminFail(409, error instanceof Error ? error.message : String(error)))\n }\n const settings = controls.settings(namespace)\n virtualTime = settings.virtualTime\n if (settings.autoAdvanceMs > 0) requestClock.advance(settings.autoAdvanceMs)\n const wait = async (ms: number): Promise<void> => {\n if (!(ms > 0)) return\n waitedMs += ms\n // Virtual: the mock clock pays for the wait and the request carries on at once.\n if (virtualTime) requestClock.advance(ms)\n else await sleepUnlessAborted(ms, request.signal)\n }\n const candidate = {\n operationId,\n method: request.method,\n path: url.pathname,\n namespace,\n headers: request.headers,\n query: url.searchParams,\n // Read from a copy, so the service still gets the body. Not JSON: nothing to match.\n readJson: async (): Promise<unknown> => {\n try {\n return JSON.parse(await request.clone().text())\n } catch {\n return undefined\n }\n },\n wait,\n }\n let hits: FaultHit[]\n try {\n await wait(latency.take(namespace, operationId) + (requested?.delay ?? 0))\n hits = scripted.length > 0 ? await faults.fire(scripted, candidate) : []\n if (!hits.some((hit) => hit.drop || hit.response))\n hits.push(...(await faults.take({ ...candidate, now: requestClock.now() })))\n } catch (error) {\n // The client gave up while the request was being held.\n log(0)\n throw error\n }\n const final = hits.find((hit) => hit.drop || hit.response)\n /** A response is done: cut it short if asked to, name the fault, take the snapshot. */\n const finish = (response: Response): Response => {\n let out = response\n const truncate = hits.find((hit) => hit.truncate !== undefined)?.truncate\n if (truncate !== undefined) out = truncateResponse(out, truncate)\n // The rule the journal names: the one that answered, or the first that shaped it.\n const shaped = final ?? hits[0]\n if (shaped) {\n out = mutableResponse(out)\n out.headers.set(FAULT_HEADER, shaped.id)\n }\n if (requested?.snapshot !== undefined) {\n out = mutableResponse(out)\n out.headers.set(SNAPSHOT_HEADER, snapshotStore.create(namespace, requested.snapshot).id)\n }\n return stamp(out)\n }\n if (final?.drop) {\n log(0, final.id)\n throw new DroppedConnectionError(final.timeout ? \"timeout\" : \"drop\")\n }\n if (final?.response) {\n log(final.response.status, final.id)\n return finish(final.response)\n }\n const fired = hits.filter((hit) => hit.effect !== undefined)\n if (fired.length > 0)\n effects.set(\n request,\n fired.map((hit) => hit.effect),\n )\n let active = true\n acceptance.set(request, (notes) => {\n if (!active || accepted || !MUTATING_METHODS.has(request.method)) return\n accepted = timeline(namespace).commit(capture(storage), { branch: selectedBranch })\n acceptedNotes = notes\n })\n let response: Response\n try {\n response = await instanceFor(storage, namespace).fetch(request)\n } catch (error) {\n log(error instanceof DroppedConnectionError ? 0 : 500, hits[0]?.id)\n throw error\n } finally {\n active = false\n acceptance.delete(request)\n }\n const wireStatus = responseNotes(response)?.wireStatus ?? response.status\n if (MUTATING_METHODS.has(request.method) && wireStatus >= 200 && wireStatus < 400) {\n const current = capture(storage)\n const unchanged =\n accepted &&\n timeline(namespace).head(selectedBranch)?.id === accepted.id &&\n current.snapshot.records === accepted.value.snapshot.records &&\n current.snapshot.sequences === accepted.value.snapshot.sequences &&\n current.rngState === accepted.value.rngState\n const point =\n unchanged && accepted\n ? accepted\n : timeline(namespace).commit(current, { branch: selectedBranch })\n response = mutableResponse(response)\n response.headers.set(CHECKPOINT_HEADER, point.id)\n }\n if (selectedBranch !== \"main\") {\n response = mutableResponse(response)\n response.headers.set(BRANCH_HEADER, selectedBranch)\n }\n if (at !== undefined) {\n response = mutableResponse(response)\n response.headers.set(AT_HEADER, at)\n }\n log(wireStatus, hits[0]?.id, response)\n return finish(response)\n },\n }\n\n /** Wait on the wall clock, giving up the moment the caller does. */\n const sleepUnlessAborted = async (ms: number, signal: AbortSignal | undefined): Promise<void> => {\n if (!signal) return sleep(ms)\n if (signal.aborted) throw signal.reason\n let stop = () => {}\n const aborted = new Promise<never>((_, reject) => {\n const abort = () => reject(signal.reason)\n signal.addEventListener(\"abort\", abort, { once: true })\n stop = () => signal.removeEventListener(\"abort\", abort)\n })\n try {\n await Promise.race([sleep(ms, signal), aborted])\n } finally {\n stop()\n }\n }\n\n const control = createControlPlane({\n name: options.name,\n version,\n startedAt: wallNow(),\n wallNow,\n clock,\n namespaceClock,\n metrics,\n journal,\n defaultNamespace: DEFAULT_NAMESPACE,\n namespaces: runtime.namespaces,\n reset,\n dropNamespace,\n controls,\n snapshots: snapshotStore,\n applyControls,\n timeTravel: {\n checkpoint: (name, branchName) => {\n const point = checkpoint(name, branchName)\n return {\n id: point.id,\n branch: point.branch,\n parent: point.parent,\n at: point.at,\n records: point.value.snapshot.records.length,\n }\n },\n branch: (branchName, branchOptions) => {\n const point = branch(branchName, branchOptions)\n return { id: point.id, branch: point.branch, parent: point.parent, at: point.at }\n },\n checkout: (checkpointId, checkoutOptions) => checkout(checkpointId, checkoutOptions),\n retain: (name, checkpointId) => {\n timeline(name).retain(checkpointId)\n },\n release: (name, checkpointId) => timeline(name).release(checkpointId),\n inspect: (name) => {\n const history = timeline(name)\n return {\n branches: history.branches(),\n checkpoints: history.checkpoints().map(({ id, branch: branchName, parent, at }) => ({\n id,\n branch: branchName,\n parent,\n at,\n })),\n }\n },\n },\n describe: options.describe ?? (() => ({})),\n routes: {\n ...credentialRoutes(credentials),\n ...(options.webhooks ? webhookAdminRoutes(options.webhooks) : {}),\n ...(options.admin?.(runtime) ?? {}),\n ...stateAdminRoutes({\n open: stateScope,\n afterWrite: (namespace) => {\n checkpoint(namespace, \"main\")\n },\n }),\n ...adminUiRoutes(options.name, options.adminUi, adminPrefix),\n },\n adminPrefix,\n adminKey: options.adminKey,\n })\n\n // The default namespace boots now, so its rules precede anything a caller adds later.\n controls.ensure(DEFAULT_NAMESPACE)\n return defineMock(runtime)\n}\n\nconst mutableResponse = (response: Response): Response => {\n try {\n response.headers.set(\"x-mockingbird-mutable-probe\", \"1\")\n response.headers.delete(\"x-mockingbird-mutable-probe\")\n return response\n } catch {\n return new Response(response.body, response)\n }\n}\n\nconst adminJson = (status: number, body: unknown): Response =>\n new Response(JSON.stringify(body), {\n status,\n headers: { \"content-type\": \"application/json; charset=utf-8\" },\n })\n\nconst adminFail = (status: number, message: string): Response =>\n adminJson(status, { error: { type: \"mockingbird_admin\", message } })\n\n/**\n * `PUT /__admin/credentials` accepts `{ credentials: { \"<credential>\": \"<namespace>\" } }`,\n * `[{ credential, namespace }]`, or `{ credentials: [\"<credential>\"] }` with `?namespace=`\n * (maps each to the calling namespace). `GET` lists them masked; `DELETE` removes one\n * (`?credential=`) or all.\n */\nconst credentialRoutes = (registry: CredentialRegistry): AdminRoutes => ({\n \"GET /credentials\": () =>\n adminJson(200, {\n credentials: registry.entries().map(({ credential, namespace }) => ({\n credential: maskCredential(credential),\n namespace,\n })),\n }),\n \"PUT /credentials\": ({ body, namespace }) => {\n const pairs: [string, string][] = []\n const list = Array.isArray(body) ? body : isRecord(body) ? body.credentials : undefined\n if (Array.isArray(list)) {\n for (const each of list) {\n if (typeof each === \"string\") pairs.push([each, namespace])\n else if (isRecord(each) && typeof each.credential === \"string\") {\n pairs.push([\n each.credential,\n typeof each.namespace === \"string\" ? each.namespace : namespace,\n ])\n } else return adminFail(400, \"each entry is a credential string or {credential, namespace}\")\n }\n } else if (isRecord(list)) {\n for (const [credential, target] of Object.entries(list)) {\n if (typeof target !== \"string\")\n return adminFail(400, `namespace for ${credential} must be a string`)\n pairs.push([credential, target])\n }\n } else if (isRecord(body) && typeof body.credential === \"string\") {\n pairs.push([body.credential, typeof body.namespace === \"string\" ? body.namespace : namespace])\n } else {\n return adminFail(400, 'expected {\"credentials\": {\"<credential>\": \"<namespace>\"}}')\n }\n for (const [credential, target] of pairs) {\n if (!KEY_PATTERN.test(target))\n return adminFail(400, `bad namespace ${JSON.stringify(target)}`)\n registry.set(credential, target)\n }\n return adminJson(200, { mapped: pairs.length })\n },\n \"DELETE /credentials\": ({ url }) => {\n const credential = url.searchParams.get(\"credential\")\n if (credential === null) registry.clear()\n else registry.remove(credential)\n return adminJson(200, { status: \"ok\" })\n },\n})\n", "// Generated by @crvouga/mockingbird-openapi-codegen from openapi.yaml. Do not edit.\n\nimport type { OpenAPIDocument } from \"@crvouga/mockingbird-openapi\"\n\nexport const document: OpenAPIDocument = JSON.parse(`{\"openapi\":\"3.1.0\",\"info\":{\"title\":\"Fullscript API (Mockingbird subset)\",\"description\":\"Stateful emulator subset of the Fullscript API for lab ordering: per-practitioner OAuth (authorize, token with authorization_code and refresh_token grants, revoke), clinic, embeddable session grants, lab orders, lab-order events, expiring result PDFs, and signed webhooks. Hand-authored from the EMR consumer (fullscript-api-client.ts, fullscript-event-model.ts, fullscript-webhook-signature.ts).\\\\n\",\"version\":\"1\",\"x-mockingbird-upstream\":{\"note\":\"Wire shapes from the consumer app's EMR backend (its Fullscript services and routers); the vendor's API reference is behind a partner login.\"}},\"servers\":[{\"url\":\"https://api-us-snd.fullscript.io\"}],\"security\":[{\"bearerAuth\":[]}],\"paths\":{\"/api/oauth/token\":{\"post\":{\"operationId\":\"OAuthToken\",\"description\":\"Exchange an authorization code, or rotate a refresh token (the old refresh token stops working).\",\"x-mockingbird\":{\"supported\":true,\"parity\":{\"enabled\":true,\"safe\":true}},\"responses\":{\"200\":{\"description\":\"Token\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/OAuthTokenResponse\"}}}},\"400\":{\"description\":\"invalid_grant / unsupported_grant_type / invalid_request\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/OAuthError\"}}}},\"401\":{\"description\":\"invalid_client\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/OAuthError\"}}}},\"429\":{\"description\":\"Rate limited\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ApiErrors\"}}}}},\"security\":[],\"requestBody\":{\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/TokenRequest\"}}}}}},\"/api/oauth/revoke\":{\"post\":{\"operationId\":\"OAuthRevoke\",\"description\":\"Revoke an access or refresh token (RFC 7009: always 200).\",\"x-mockingbird\":{\"supported\":true,\"parity\":{\"enabled\":true,\"safe\":false}},\"responses\":{\"200\":{\"description\":\"Revoked\",\"content\":{\"application/json\":{\"schema\":{\"type\":\"object\"}}}},\"400\":{\"description\":\"invalid_request\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/OAuthError\"}}}},\"401\":{\"description\":\"invalid_client\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/OAuthError\"}}}},\"429\":{\"description\":\"Rate limited\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ApiErrors\"}}}}},\"security\":[],\"requestBody\":{\"required\":true,\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/RevokeRequest\"}}}}}},\"/api/clinic\":{\"get\":{\"operationId\":\"GetClinic\",\"description\":\"The token's clinic.\",\"x-mockingbird\":{\"supported\":true,\"parity\":{\"enabled\":true,\"safe\":true}},\"responses\":{\"200\":{\"description\":\"Clinic\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ClinicResponse\"}}}},\"401\":{\"description\":\"Missing, invalid, expired or revoked access token\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ApiErrors\"}}}},\"429\":{\"description\":\"Rate limited\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ApiErrors\"}}}}}}},\"/api/clinic/embeddable/session_grants\":{\"post\":{\"operationId\":\"CreateSessionGrant\",\"description\":\"A short-lived secret for the embedded Fullscript widget.\",\"x-mockingbird\":{\"supported\":true,\"parity\":{\"enabled\":true,\"safe\":true}},\"responses\":{\"201\":{\"description\":\"Grant\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/SessionGrant\"}}}},\"401\":{\"description\":\"Missing, invalid, expired or revoked access token\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ApiErrors\"}}}},\"429\":{\"description\":\"Rate limited\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ApiErrors\"}}}}}}},\"/api/clinic/labs/orders\":{\"get\":{\"operationId\":\"ListLabOrders\",\"description\":\"The clinic's lab orders (optionally one patient's), paged.\",\"x-mockingbird\":{\"supported\":true,\"parity\":{\"enabled\":true,\"safe\":true}},\"responses\":{\"200\":{\"description\":\"Page\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/LabOrdersPage\"}}}},\"401\":{\"description\":\"Missing, invalid, expired or revoked access token\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ApiErrors\"}}}},\"429\":{\"description\":\"Rate limited\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ApiErrors\"}}}}},\"parameters\":[{\"name\":\"patient_id\",\"in\":\"query\",\"required\":false,\"schema\":{\"type\":\"string\",\"enum\":[\"pat_seed_1\",\"pat_seed_2\",\"pat_missing\"]}},{\"name\":\"page[number]\",\"in\":\"query\",\"required\":false,\"schema\":{\"type\":\"integer\",\"minimum\":1,\"maximum\":3}},{\"name\":\"page[size]\",\"in\":\"query\",\"required\":false,\"schema\":{\"type\":\"integer\",\"minimum\":1,\"maximum\":100}}]}},\"/api/clinic/labs/orders/{orderId}\":{\"get\":{\"operationId\":\"GetLabOrder\",\"description\":\"One lab order with tests, per-test results and the aggregated result.\",\"x-mockingbird\":{\"supported\":true,\"parity\":{\"enabled\":true,\"safe\":true}},\"responses\":{\"200\":{\"description\":\"Order\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/LabOrderResponse\"}}}},\"401\":{\"description\":\"Missing, invalid, expired or revoked access token\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ApiErrors\"}}}},\"404\":{\"description\":\"Unknown order\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ApiErrors\"}}}},\"429\":{\"description\":\"Rate limited\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ApiErrors\"}}}}},\"parameters\":[{\"name\":\"orderId\",\"in\":\"path\",\"required\":true,\"schema\":{\"type\":\"string\",\"enum\":[\"lo_seed_1\",\"lo_seed_2\",\"lo_seed_3\",\"lo_missing\"]}}]}},\"/api/events/lab_orders\":{\"get\":{\"operationId\":\"ListLabOrderEvents\",\"description\":\"The clinic's lab_order.updated events, newest first by default.\",\"x-mockingbird\":{\"supported\":true,\"parity\":{\"enabled\":true,\"safe\":true}},\"responses\":{\"200\":{\"description\":\"Page\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/EventsPage\"}}}},\"401\":{\"description\":\"Missing, invalid, expired or revoked access token\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ApiErrors\"}}}},\"429\":{\"description\":\"Rate limited\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ApiErrors\"}}}}},\"parameters\":[{\"name\":\"order_by\",\"in\":\"query\",\"required\":false,\"schema\":{\"type\":\"string\",\"enum\":[\"DESC\",\"ASC\"]}},{\"name\":\"page[number]\",\"in\":\"query\",\"required\":false,\"schema\":{\"type\":\"integer\",\"minimum\":1,\"maximum\":3}},{\"name\":\"page[size]\",\"in\":\"query\",\"required\":false,\"schema\":{\"type\":\"integer\",\"minimum\":1,\"maximum\":100}}]}},\"/api/events/{eventId}\":{\"get\":{\"operationId\":\"GetEvent\",\"description\":\"One event with its data.\",\"x-mockingbird\":{\"supported\":true,\"parity\":{\"enabled\":true,\"safe\":true}},\"responses\":{\"200\":{\"description\":\"Event\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/EventResponse\"}}}},\"401\":{\"description\":\"Missing, invalid, expired or revoked access token\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ApiErrors\"}}}},\"404\":{\"description\":\"Unknown event\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ApiErrors\"}}}},\"429\":{\"description\":\"Rate limited\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/ApiErrors\"}}}}},\"parameters\":[{\"name\":\"eventId\",\"in\":\"path\",\"required\":true,\"schema\":{\"type\":\"string\",\"enum\":[\"evt_1\",\"evt_2\",\"evt_3\",\"evt_missing\"]}}]}},\"/oauth/authorize\":{\"get\":{\"operationId\":\"Authorize\",\"description\":\"The consent page: auto-approves as the requested (or default) practitioner and redirects to redirect_uri with code and state.\",\"security\":[],\"x-mockingbird\":{\"supported\":true,\"parity\":{\"enabled\":false,\"reason\":\"Browser redirect flow; covered by acceptance tests.\"}},\"parameters\":[{\"name\":\"client_id\",\"in\":\"query\",\"required\":true,\"schema\":{\"type\":\"string\"}},{\"name\":\"redirect_uri\",\"in\":\"query\",\"required\":true,\"schema\":{\"type\":\"string\"}},{\"name\":\"response_type\",\"in\":\"query\",\"required\":true,\"schema\":{\"type\":\"string\",\"enum\":[\"code\"]}},{\"name\":\"state\",\"in\":\"query\",\"required\":false,\"schema\":{\"type\":\"string\"}},{\"name\":\"scope\",\"in\":\"query\",\"required\":false,\"schema\":{\"type\":\"string\"}},{\"name\":\"practitioner_id\",\"in\":\"query\",\"required\":false,\"schema\":{\"type\":\"string\"}}],\"responses\":{\"302\":{\"description\":\"Redirect back with ?code=&state=\"},\"400\":{\"description\":\"Bad request\",\"content\":{\"application/json\":{\"schema\":{\"$ref\":\"#/components/schemas/OAuthError\"}}}}}}},\"/results/{artifactId}\":{\"get\":{\"operationId\":\"GetResultPdf\",\"description\":\"An expiring result PDF URL (what pdf_url points at).\",\"security\":[],\"x-mockingbird\":{\"supported\":true,\"parity\":{\"enabled\":false,\"reason\":\"Binary PDF behind an expiring signed URL; covered by acceptance tests.\"}},\"parameters\":[{\"name\":\"artifactId\",\"in\":\"path\",\"required\":true,\"schema\":{\"type\":\"string\"}},{\"name\":\"expires\",\"in\":\"query\",\"required\":true,\"schema\":{\"type\":\"string\"}},{\"name\":\"signature\",\"in\":\"query\",\"required\":true,\"schema\":{\"type\":\"string\"}}],\"responses\":{\"200\":{\"description\":\"The PDF\",\"content\":{\"application/pdf\":{\"schema\":{\"type\":\"string\",\"format\":\"binary\"}}}},\"403\":{\"description\":\"Expired or bad signature\"},\"404\":{\"description\":\"Unknown artifact\"}}}}},\"components\":{\"securitySchemes\":{\"bearerAuth\":{\"type\":\"http\",\"scheme\":\"bearer\"}},\"schemas\":{\"TokenRequest\":{\"type\":\"object\",\"required\":[\"grant_type\",\"client_id\",\"client_secret\"],\"properties\":{\"grant_type\":{\"type\":\"string\",\"enum\":[\"authorization_code\",\"refresh_token\"]},\"client_id\":{\"type\":\"string\",\"minLength\":1,\"maxLength\":64,\"examples\":[\"parity-client\"]},\"client_secret\":{\"type\":\"string\",\"minLength\":1,\"maxLength\":64,\"examples\":[\"parity-secret\"]},\"code\":{\"type\":\"string\",\"maxLength\":64},\"refresh_token\":{\"type\":\"string\",\"maxLength\":200},\"redirect_uri\":{\"type\":\"string\",\"maxLength\":200,\"examples\":[\"https://emr.example.com/v1/fullscript/oauth/callback\"]}}},\"RevokeRequest\":{\"type\":\"object\",\"required\":[\"client_id\",\"client_secret\",\"token\"],\"properties\":{\"client_id\":{\"type\":\"string\",\"minLength\":1,\"maxLength\":64},\"client_secret\":{\"type\":\"string\",\"minLength\":1,\"maxLength\":64},\"token\":{\"type\":\"string\",\"minLength\":1,\"maxLength\":200}}},\"OAuthTokenResponse\":{\"type\":\"object\",\"required\":[\"oauth\"],\"properties\":{\"oauth\":{\"type\":\"object\",\"required\":[\"access_token\",\"token_type\",\"expires_in\",\"refresh_token\",\"scope\",\"created_at\",\"resource_owner\"],\"properties\":{\"access_token\":{\"type\":\"string\",\"x-mockingbird-volatile\":{\"kind\":\"token\"}},\"token_type\":{\"type\":\"string\",\"enum\":[\"Bearer\"]},\"expires_in\":{\"type\":\"integer\"},\"refresh_token\":{\"type\":\"string\",\"x-mockingbird-volatile\":{\"kind\":\"token\"}},\"scope\":{\"type\":\"string\"},\"created_at\":{\"type\":\"string\",\"x-mockingbird-volatile\":{\"kind\":\"timestamp\"}},\"resource_owner\":{\"type\":\"object\",\"required\":[\"id\",\"type\"],\"properties\":{\"id\":{\"type\":\"string\"},\"type\":{\"type\":\"string\",\"enum\":[\"Practitioner\",\"Staff\"]},\"clinic_id\":{\"type\":\"string\"}}}}}}},\"OAuthError\":{\"type\":\"object\",\"required\":[\"error\"],\"properties\":{\"error\":{\"type\":\"string\"},\"error_description\":{\"type\":\"string\"}}},\"ApiErrors\":{\"type\":\"object\",\"required\":[\"errors\"],\"properties\":{\"errors\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"required\":[\"code\",\"message\"],\"properties\":{\"code\":{\"type\":\"string\"},\"message\":{\"type\":\"string\"}}}}}},\"ClinicResponse\":{\"type\":\"object\",\"required\":[\"clinic\"],\"properties\":{\"clinic\":{\"type\":\"object\",\"required\":[\"id\",\"name\"],\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"created_at\":{\"type\":\"string\",\"x-mockingbird-volatile\":{\"kind\":\"timestamp\"}}}}}},\"SessionGrant\":{\"type\":\"object\",\"required\":[\"secret_token\",\"expires_at\"],\"properties\":{\"secret_token\":{\"type\":\"string\",\"x-mockingbird-volatile\":{\"kind\":\"token\"}},\"expires_at\":{\"type\":\"string\",\"x-mockingbird-volatile\":{\"kind\":\"timestamp\"}}}},\"LabOrderSummary\":{\"type\":\"object\",\"required\":[\"id\",\"state\",\"treatment_plan_id\",\"patient_id\",\"created_at\",\"updated_at\"],\"properties\":{\"id\":{\"type\":\"string\"},\"state\":{\"type\":\"string\",\"enum\":[\"not_purchased\",\"purchased\",\"schedule_appointment\",\"upcoming_appointment\",\"processing\",\"partial_results\",\"results_ready\",\"interpretation_shared\",\"results_amended\"]},\"treatment_plan_id\":{\"type\":[\"string\",\"null\"]},\"patient_id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"created_at\":{\"type\":\"string\",\"x-mockingbird-volatile\":{\"kind\":\"timestamp\"}},\"updated_at\":{\"type\":\"string\",\"x-mockingbird-volatile\":{\"kind\":\"timestamp\"}}}},\"LabOrdersPage\":{\"type\":\"object\",\"required\":[\"orders\",\"meta\"],\"properties\":{\"orders\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/LabOrderSummary\"}},\"meta\":{\"type\":\"object\",\"required\":[\"current_page\",\"next_page\",\"prev_page\",\"total_pages\",\"total_count\"],\"properties\":{\"current_page\":{\"type\":\"integer\"},\"next_page\":{\"type\":[\"integer\",\"null\"]},\"prev_page\":{\"type\":[\"integer\",\"null\"]},\"total_pages\":{\"type\":\"integer\"},\"total_count\":{\"type\":\"integer\"}}}}},\"LabOrderResponse\":{\"type\":\"object\",\"required\":[\"order\"],\"properties\":{\"order\":{\"type\":\"object\",\"required\":[\"id\",\"state\",\"treatment_plan_id\",\"tests\",\"results\",\"latest_aggregated_result\"],\"properties\":{\"id\":{\"type\":\"string\"},\"state\":{\"type\":\"string\",\"enum\":[\"not_purchased\",\"purchased\",\"schedule_appointment\",\"upcoming_appointment\",\"processing\",\"partial_results\",\"results_ready\",\"interpretation_shared\",\"results_amended\"]},\"treatment_plan_id\":{\"type\":[\"string\",\"null\"]},\"patient_id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"collection_method\":{\"type\":\"string\"},\"created_at\":{\"type\":\"string\",\"x-mockingbird-volatile\":{\"kind\":\"timestamp\"}},\"updated_at\":{\"type\":\"string\",\"x-mockingbird-volatile\":{\"kind\":\"timestamp\"}},\"tests\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"required\":[\"id\",\"name\"],\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"lab_type\":{\"type\":\"string\"}}}},\"results\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"required\":[\"id\",\"name\",\"state\",\"pdf_url\"],\"properties\":{\"id\":{\"type\":\"string\"},\"name\":{\"type\":\"string\"},\"state\":{\"type\":\"string\"},\"pdf_url\":{\"type\":\"string\",\"x-mockingbird-volatile\":{\"kind\":\"url\"}}}}},\"latest_aggregated_result\":{\"type\":[\"object\",\"null\"],\"properties\":{\"id\":{\"type\":\"string\"},\"artifact_id\":{\"type\":\"string\"},\"pdf_url\":{\"type\":\"string\",\"x-mockingbird-volatile\":{\"kind\":\"url\"}},\"status\":{\"type\":\"string\"}}}}}}},\"EventSummary\":{\"type\":\"object\",\"required\":[\"id\",\"type\",\"clinic_id\",\"created_at\"],\"properties\":{\"id\":{\"type\":\"string\"},\"type\":{\"type\":\"string\",\"enum\":[\"lab_order.updated\"]},\"clinic_id\":{\"type\":\"string\"},\"created_at\":{\"type\":\"string\",\"x-mockingbird-volatile\":{\"kind\":\"timestamp\"}}}},\"EventsPage\":{\"type\":\"object\",\"required\":[\"events\",\"meta\"],\"properties\":{\"events\":{\"type\":\"array\",\"items\":{\"$ref\":\"#/components/schemas/EventSummary\"}},\"meta\":{\"type\":\"object\",\"required\":[\"current_page\",\"next_page\",\"prev_page\",\"total_pages\",\"total_count\"],\"properties\":{\"current_page\":{\"type\":\"integer\"},\"next_page\":{\"type\":[\"integer\",\"null\"]},\"prev_page\":{\"type\":[\"integer\",\"null\"]},\"total_pages\":{\"type\":\"integer\"},\"total_count\":{\"type\":\"integer\"}}}}},\"EventResponse\":{\"type\":\"object\",\"required\":[\"event\"],\"properties\":{\"event\":{\"type\":\"object\",\"required\":[\"id\",\"type\",\"clinic_id\",\"created_at\",\"data\"],\"properties\":{\"id\":{\"type\":\"string\"},\"type\":{\"type\":\"string\"},\"clinic_id\":{\"type\":\"string\"},\"created_at\":{\"type\":\"string\",\"x-mockingbird-volatile\":{\"kind\":\"timestamp\"}},\"data\":{\"type\":\"object\"}}}}}}}}`) as OpenAPIDocument\n\nexport type OperationId = \"OAuthToken\" | \"OAuthRevoke\" | \"GetClinic\" | \"CreateSessionGrant\" | \"ListLabOrders\" | \"GetLabOrder\" | \"ListLabOrderEvents\" | \"GetEvent\" | \"Authorize\" | \"GetResultPdf\"\nexport type SupportedOperationId = \"OAuthToken\" | \"OAuthRevoke\" | \"GetClinic\" | \"CreateSessionGrant\" | \"ListLabOrders\" | \"GetLabOrder\" | \"ListLabOrderEvents\" | \"GetEvent\" | \"Authorize\" | \"GetResultPdf\"\nexport const operationIds = [\"OAuthToken\",\"OAuthRevoke\",\"GetClinic\",\"CreateSessionGrant\",\"ListLabOrders\",\"GetLabOrder\",\"ListLabOrderEvents\",\"GetEvent\",\"Authorize\",\"GetResultPdf\"] as const\nexport const supportedOperationIds = [\"OAuthToken\",\"OAuthRevoke\",\"GetClinic\",\"CreateSessionGrant\",\"ListLabOrders\",\"GetLabOrder\",\"ListLabOrderEvents\",\"GetEvent\",\"Authorize\",\"GetResultPdf\"] as const\n", "/** A minimal, valid one-page PDF: what every result URL serves (starts with `%PDF-`). */\nexport const RESULT_PDF: Uint8Array = new TextEncoder().encode(\n \"%PDF-1.4\\n1 0 obj\\n<< /Type /Catalog /Pages 2 0 R >>\\nendobj\\n2 0 obj\\n<< /Type /Pages /Kids [3 0 R] /Count 1 >>\\nendobj\\n3 0 obj\\n<< /Type /Page /Parent 2 0 R /MediaBox [0 0 612 792] /Contents 4 0 R /Resources << /Font << /F1 5 0 R >> >> >>\\nendobj\\n4 0 obj\\n<< /Length 64 >>\\nstream\\nBT /F1 18 Tf 72 720 Td (Mockingbird Fullscript lab result) Tj ET\\nendstream\\nendobj\\n5 0 obj\\n<< /Type /Font /Subtype /Type1 /BaseFont /Helvetica >>\\nendobj\\nxref\\n0 6\\n0000000000 65535 f \\n0000000009 00000 n \\n0000000058 00000 n \\n0000000115 00000 n \\n0000000241 00000 n \\n0000000355 00000 n \\ntrailer\\n<< /Size 6 /Root 1 0 R >>\\nstartxref\\n425\\n%%EOF\\n\",\n)\n", "import { Collection } from \"@crvouga/mockingbird-service\"\nimport type { SqliteClient } from \"@crvouga/mockingbird-sqlite\"\n\n/** Lab order states, in the only order they may move (forward). */\nexport const LAB_ORDER_STATES = [\n \"not_purchased\",\n \"purchased\",\n \"schedule_appointment\",\n \"upcoming_appointment\",\n \"processing\",\n \"partial_results\",\n \"results_ready\",\n \"interpretation_shared\",\n \"results_amended\",\n] as const\n\nexport type LabOrderState = (typeof LAB_ORDER_STATES)[number]\n\nexport const isLabOrderState = (value: unknown): value is LabOrderState =>\n typeof value === \"string\" && (LAB_ORDER_STATES as readonly string[]).includes(value)\n\nexport const stateRank = (state: LabOrderState) => LAB_ORDER_STATES.indexOf(state)\n\nexport type Practitioner = { id: string; type: \"Practitioner\" | \"Staff\"; clinicId: string }\nexport type Clinic = { id: string; name: string; created_at: string }\n\nexport type LabResult = { id: string; name: string; state: string; artifactId: string }\n\nexport type LabOrderRecord = {\n id: string\n clinicId: string\n patientId: string\n treatmentPlanId: string | null\n name: string\n collectionMethod: string\n state: LabOrderState\n tests: { id: string; name: string; lab_type: string }[]\n results: LabResult[]\n aggregated: { id: string; artifactId: string; status: string } | null\n created_at: string\n updated_at: string\n}\n\nexport type EventRecord = {\n id: string\n type: \"lab_order.updated\" | \"order.placed\"\n clinic_id: string\n created_at: string\n data: Record<string, unknown>\n /** Insertion order, for ASC / DESC paging. */\n seq: number\n}\n\nexport type CodeRecord = {\n code: string\n practitionerId: string\n clientId: string\n redirectUri: string | null\n expiresAtMs: number\n used: boolean\n}\n\nexport type RefreshRecord = {\n token: string\n practitionerId: string\n clientId: string\n revoked: boolean\n}\n\n/** Per-namespace knobs, set through `PUT /__admin/settings`; cleared on reset. */\nexport type Settings = {\n /** Only these OAuth clients authenticate; empty means any id/secret pair does. */\n clients: { clientId: string; clientSecret: string }[]\n /** Access-token lifetime on the mock clock. Default 7200 s (2 h). */\n accessTokenTtlSeconds: number\n /** Authorization-code lifetime. Default 600 s. */\n codeTtlSeconds: number\n /** Lifetime of a result PDF URL. Default 900 s. */\n pdfUrlTtlSeconds: number\n /** Origin (plus optional path) result PDF URLs point at; default: the request's own origin. */\n resultsBaseUrl: string | null\n}\n\nexport const DEFAULT_SETTINGS: Settings = {\n clients: [],\n accessTokenTtlSeconds: 7_200,\n codeTtlSeconds: 600,\n pdfUrlTtlSeconds: 900,\n resultsBaseUrl: null,\n}\n\nexport const DEFAULT_CLINIC: Clinic = {\n id: \"clinic_mock_1\",\n name: \"Acme Mock Clinic\",\n created_at: \"2025-01-01T00:00:00.000Z\",\n}\nexport const DEFAULT_PRACTITIONER: Practitioner = {\n id: \"prac_mock_1\",\n type: \"Practitioner\",\n clinicId: DEFAULT_CLINIC.id,\n}\n\ntype Counters = { code: number; refresh: number; order: number; event: number; artifact: number }\n\nexport class FullscriptState {\n readonly practitioners: Collection<Practitioner>\n readonly clinics: Collection<Clinic>\n readonly codes: Collection<CodeRecord>\n readonly refresh: Collection<RefreshRecord>\n readonly revoked: Collection<{ token: string }>\n readonly orders: Collection<LabOrderRecord>\n readonly events: Collection<EventRecord>\n readonly settings: Collection<Settings>\n private readonly counters: Collection<Counters>\n\n constructor(\n sqlite: SqliteClient,\n namespace: string,\n private readonly seed: Partial<Settings>,\n ) {\n this.practitioners = new Collection(sqlite, namespace, \"practitioners\")\n this.clinics = new Collection(sqlite, namespace, \"clinics\")\n this.codes = new Collection(sqlite, namespace, \"codes\")\n this.refresh = new Collection(sqlite, namespace, \"refresh_tokens\")\n this.revoked = new Collection(sqlite, namespace, \"revoked_tokens\")\n this.orders = new Collection(sqlite, namespace, \"lab_orders\")\n this.events = new Collection(sqlite, namespace, \"events\")\n this.settings = new Collection(sqlite, namespace, \"settings\")\n this.counters = new Collection(sqlite, namespace, \"counters\")\n this.ensureSeeded()\n }\n\n ensureSeeded(): void {\n if (this.clinics.count() === 0) this.clinics.insert(DEFAULT_CLINIC.id, DEFAULT_CLINIC)\n if (this.practitioners.count() === 0) {\n this.practitioners.insert(DEFAULT_PRACTITIONER.id, DEFAULT_PRACTITIONER)\n }\n if (!this.settings.has(\"settings\")) {\n this.settings.insert(\"settings\", { ...DEFAULT_SETTINGS, ...this.seed })\n }\n }\n\n current(): Settings {\n return this.settings.get(\"settings\") ?? DEFAULT_SETTINGS\n }\n\n update(patch: Partial<Settings>): Settings {\n const next = { ...this.current(), ...patch }\n this.settings.insert(\"settings\", next)\n return next\n }\n\n next(kind: keyof Counters): number {\n const current = this.counters.get(\"counters\") ?? {\n code: 0,\n refresh: 0,\n order: 0,\n event: 0,\n artifact: 0,\n }\n const next = { ...current, [kind]: current[kind] + 1 }\n this.counters.insert(\"counters\", next)\n return next[kind]\n }\n}\n", "import {\n type AdminRoutes,\n type Clock,\n createRuntime as createServiceRuntime,\n createWebhookHub,\n type FaultPreset,\n HttpError,\n type MockControls,\n type RequestLog,\n type ServiceRuntime,\n signers,\n type WebhookEndpoint,\n type WebhookHub,\n} from \"@crvouga/mockingbird-service\"\nimport type { SqliteClient } from \"@crvouga/mockingbird-sqlite\"\nimport { document } from \"./generated/openapi.js\"\nimport {\n envelope,\n FULLSCRIPT_NAMESPACE,\n FullscriptAPI,\n type SeedOrder,\n tokenCredential,\n} from \"./index.js\"\nimport { isLabOrderState, type Settings } from \"./state.js\"\n\n/** The header our receiver verifies: `t=<unix>,v1=<hex HMAC-SHA256(secret, \"<t>.\" + body)>`. */\nexport const SIGNATURE_HEADER = \"Fullscript-Signature\"\n\nconst API = \"/api/\"\n\n/**\n * Every named Fullscript misbehaviour our EMR integration branches on, switched on with\n * `POST /__admin/faults {\"preset\": \"<name>\"}` (add `count` to limit it).\n */\nexport const FULLSCRIPT_PRESETS: Record<string, FaultPreset> = {\n token_expired: {\n description:\n \"API calls answer 401 token_expired before the token's 2 h (our token service refreshes)\",\n rules: [\n { pathPrefix: \"/api/clinic\", effect: \"token_expired\" },\n { pathPrefix: \"/api/events\", effect: \"token_expired\" },\n ],\n },\n invalid_grant: {\n description:\n \"The refresh_token grant answers 400 invalid_grant (the practitioner must reconnect)\",\n rules: [{ operationId: \"OAuthToken\", effect: \"invalid_grant\" }],\n },\n rate_limited: {\n description: \"API calls answer 429 rate_limited\",\n rules: [\n {\n pathPrefix: API,\n status: 429,\n body: { errors: [{ code: \"rate_limited\", message: \"Too many requests\" }] },\n },\n ],\n },\n server_error: {\n description: \"API calls answer 500\",\n rules: [\n {\n pathPrefix: API,\n status: 500,\n body: { errors: [{ code: \"internal_server_error\", message: \"Something went wrong\" }] },\n },\n ],\n },\n events_schema_drift: {\n description:\n \"The lab-order events list answers an unexpected event type (our zod literal rejects it)\",\n rules: [{ operationId: \"ListLabOrderEvents\", effect: \"events_schema_drift\" }],\n },\n pdf_not_pdf: {\n description: \"Result PDF URLs answer 200 text/html (our downloader rejects the content type)\",\n rules: [\n {\n operationId: \"GetResultPdf\",\n status: 200,\n body: \"<html>Sign in</html>\",\n headers: { \"content-type\": \"text/html\" },\n },\n ],\n },\n pdf_redirect: {\n description: \"Result PDF URLs answer a 302 (our downloader refuses redirects)\",\n rules: [\n {\n operationId: \"GetResultPdf\",\n status: 302,\n body: \"\",\n headers: { location: \"https://login.fullscript.com/\" },\n },\n ],\n },\n pdf_expired: {\n description: \"Result PDF URLs answer 403 as if expired\",\n rules: [\n {\n operationId: \"GetResultPdf\",\n status: 403,\n body: \"Request has expired\",\n headers: { \"content-type\": \"text/plain\" },\n },\n ],\n },\n connection_drop: {\n description: \"The connection drops before any answer (fetch rejects)\",\n rules: [{ pathPrefix: API, drop: true }],\n },\n slow: {\n description: \"API calls answer after 12 s (past our client's 10 s timeout)\",\n rules: [{ pathPrefix: API, latencyMs: 12_000 }],\n },\n webhook_duplicate: {\n description: \"The next webhook is delivered twice\",\n webhook: { mode: \"duplicate\" },\n },\n webhook_reorder: {\n description: \"The next two webhooks arrive swapped\",\n webhook: { mode: \"reorder\" },\n },\n webhook_drop: { description: \"The next webhook is never delivered\", webhook: { mode: \"drop\" } },\n}\n\nexport type FullscriptRuntimeOptions = {\n sqlite?: SqliteClient\n clock?: Clock\n seed?: number | string\n adminPrefix?: string\n adminKey?: string\n /** Admin controls to boot with: clock, latency, faults, seed, a starting snapshot. */\n adminControls?: MockControls\n onLog?: (entry: RequestLog) => void\n settings?: Partial<Settings>\n orders?: readonly SeedOrder[]\n /**\n * Where webhooks go (`POST /v1/fullscript/webhooks`), signed with `secret` (the app's\n * FULLSCRIPT_WEBHOOK_SECRET). With `challenge` (FULLSCRIPT_WEBHOOK_CHALLENGE_KEY), a delivery\n * counts only when the receiver echoes `{challenge}`, as Fullscript requires.\n */\n webhooks?: Omit<WebhookEndpoint, \"id\"> & {\n challenge?: string\n retryDelaysMs?: readonly number[]\n fetch?: (request: Request) => Promise<Response>\n }\n}\n\nexport type FullscriptRuntime = ServiceRuntime<FullscriptAPI> & { readonly webhooks: WebhookHub }\n\nconst json = (status: number, body: unknown) =>\n new Response(JSON.stringify(body), { status, headers: { \"content-type\": \"application/json\" } })\nconst adminError = (status: number, message: string) =>\n json(status, { error: { type: \"mockingbird_admin\", message } })\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n\n/** Whether a receiver's answer echoes the challenge key (`{\"challenge\": \"<key>\"}`). */\nconst echoes = async (response: Response, challenge: string) => {\n try {\n const body = (await response.clone().json()) as { challenge?: unknown }\n return body.challenge === challenge\n } catch {\n return false\n }\n}\n\nconst adminRoutes =\n (send: (request: Request) => Promise<Response>, challenge: string | undefined) =>\n (runtime: ServiceRuntime<FullscriptAPI>): AdminRoutes => ({\n \"POST /oauth/codes\": ({ body, namespace }) => {\n const input = isRecord(body) ? body : {}\n const api = runtime.instance(namespace)\n const practitionerId =\n typeof input.practitionerId === \"string\" ? input.practitionerId : \"prac_mock_1\"\n if (!api.state.practitioners.get(practitionerId))\n return adminError(404, `no practitioner ${practitionerId}`)\n const code = api.issueCode(\n practitionerId,\n typeof input.clientId === \"string\" ? input.clientId : \"any\",\n typeof input.redirectUri === \"string\" ? input.redirectUri : null,\n )\n return json(201, { code })\n },\n \"POST /practitioners\": ({ body, namespace }) => {\n if (!isRecord(body) || typeof body.id !== \"string\" || typeof body.clinicId !== \"string\") {\n return adminError(\n 400,\n 'expected {\"id\", \"clinicId\", \"type\"?: \"Practitioner\"|\"Staff\", \"clinicName\"?}',\n )\n }\n const api = runtime.instance(namespace)\n if (!api.state.clinics.get(body.clinicId)) {\n api.state.clinics.insert(body.clinicId, {\n id: body.clinicId,\n name: typeof body.clinicName === \"string\" ? body.clinicName : body.clinicId,\n created_at: new Date(runtime.namespaceClock(namespace).now()).toISOString(),\n })\n }\n const practitioner = {\n id: body.id,\n clinicId: body.clinicId,\n type: body.type === \"Staff\" ? (\"Staff\" as const) : (\"Practitioner\" as const),\n }\n api.state.practitioners.insert(practitioner.id, practitioner)\n return json(201, practitioner)\n },\n \"GET /lab-orders\": ({ namespace }) =>\n json(200, { orders: runtime.instance(namespace).labOrders() }),\n \"POST /lab-orders\": ({ body, namespace }) => {\n if (!isRecord(body) || typeof body.patientId !== \"string\") {\n return adminError(\n 400,\n 'expected {\"patientId\", \"id\"?, \"clinicId\"?, \"treatmentPlanId\"?, \"name\"?, \"collectionMethod\"?, \"tests\"?: [names]}',\n )\n }\n const text = (key: string) =>\n typeof body[key] === \"string\" ? { [key]: body[key] as string } : {}\n const order = runtime.instance(namespace).createOrder({\n patientId: body.patientId,\n ...text(\"id\"),\n ...text(\"clinicId\"),\n ...text(\"treatmentPlanId\"),\n ...text(\"name\"),\n ...text(\"collectionMethod\"),\n ...(Array.isArray(body.tests) ? { tests: body.tests.map(String) } : {}),\n })\n return json(201, order)\n },\n \"POST /lab-orders/:id/transition\": ({ params, body, namespace }) => {\n if (!isRecord(body) || !isLabOrderState(body.to)) {\n return adminError(\n 400,\n 'expected {\"to\": \"<purchased|schedule_appointment|upcoming_appointment|processing|partial_results|results_ready|interpretation_shared|results_amended>\"}',\n )\n }\n try {\n return json(200, runtime.instance(namespace).transition(params.id as string, body.to))\n } catch (error) {\n if (error instanceof HttpError) return error.toResponse()\n throw error\n }\n },\n \"GET /events\": ({ namespace }) =>\n json(200, { events: runtime.instance(namespace).eventsList() }),\n \"POST /webhooks/verify\": async ({ namespace }) => {\n const endpoints = runtime.webhooks?.endpoints(namespace) ?? []\n const results = await Promise.all(\n endpoints.map(async (endpoint) => {\n try {\n const response = await send(\n new Request(endpoint.url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n }),\n )\n return {\n url: endpoint.url,\n status: response.status,\n challengeEchoed: challenge ? await echoes(response, challenge) : null,\n }\n } catch (error) {\n return {\n url: endpoint.url,\n status: null,\n error: error instanceof Error ? error.message : String(error),\n }\n }\n }),\n )\n return json(200, { endpoints: results })\n },\n \"GET /settings\": ({ namespace }) => json(200, runtime.instance(namespace).state.current()),\n \"PUT /settings\": ({ body, namespace }) => {\n if (!isRecord(body)) return adminError(400, \"expected a JSON object\")\n const patch: Partial<Settings> = {}\n for (const key of [\"accessTokenTtlSeconds\", \"codeTtlSeconds\", \"pdfUrlTtlSeconds\"] as const) {\n if (body[key] !== undefined) {\n if (typeof body[key] !== \"number\") return adminError(400, `${key}: number`)\n patch[key] = body[key] as number\n }\n }\n if (body.resultsBaseUrl !== undefined) {\n if (body.resultsBaseUrl !== null && typeof body.resultsBaseUrl !== \"string\")\n return adminError(400, \"resultsBaseUrl: string | null\")\n patch.resultsBaseUrl = body.resultsBaseUrl as string | null\n }\n if (body.clients !== undefined) {\n if (!Array.isArray(body.clients))\n return adminError(400, \"clients: [{clientId, clientSecret}]\")\n patch.clients = body.clients\n .filter(isRecord)\n .map((c) => ({ clientId: String(c.clientId), clientSecret: String(c.clientSecret) }))\n }\n return json(200, runtime.instance(namespace).state.update(patch))\n },\n })\n\n/**\n * The Fullscript mock with Mockingbird's full service contract: `/__admin/health`, `/__admin/*`,\n * namespaces by header, by `/__admin/ns/<name>` path prefix on FULLSCRIPT_API_URL, or by OAuth client\n * (for API calls), clock control, fault presets, signed webhooks and a request journal.\n */\nexport const createRuntime = (options: FullscriptRuntimeOptions = {}): FullscriptRuntime => {\n const { retryDelaysMs, fetch: rawSend, challenge, ...endpoint } = options.webhooks ?? { url: \"\" }\n const send = rawSend ?? ((request: Request) => fetch(request))\n const hub = createWebhookHub({\n signer: signers.timestamped(SIGNATURE_HEADER),\n ...(retryDelaysMs ? { retryDelaysMs } : {}),\n // Fullscript counts a delivery as acknowledged only when the receiver echoes the\n // challenge key; anything else is retried (recorded as a 502).\n fetch: async (request) => {\n const response = await send(request)\n if (!challenge || !response.ok || (await echoes(response, challenge))) return response\n return new Response(null, { status: 502, statusText: \"challenge not echoed\" })\n },\n endpoints: options.webhooks ? [endpoint as WebhookEndpoint] : [],\n })\n const runtime = createServiceRuntime<FullscriptAPI>({\n name: FULLSCRIPT_NAMESPACE,\n document,\n ...(options.sqlite ? { sqlite: options.sqlite } : {}),\n ...(options.clock ? { clock: options.clock } : {}),\n ...(options.seed !== undefined ? { seed: options.seed } : {}),\n ...(options.adminPrefix !== undefined ? { adminPrefix: options.adminPrefix } : {}),\n ...(options.adminKey !== undefined ? { adminKey: options.adminKey } : {}),\n ...(options.adminControls !== undefined ? { adminControls: options.adminControls } : {}),\n ...(options.onLog ? { onLog: options.onLog } : {}),\n credential: tokenCredential,\n presets: FULLSCRIPT_PRESETS,\n webhooks: hub,\n create: ({ sqlite, namespace, publicNamespace, adminPrefix, clock }) =>\n new FullscriptAPI({\n sqlite,\n namespace,\n publicNamespace,\n adminPrefix,\n now: clock.now,\n ...(options.settings ? { settings: options.settings } : {}),\n ...(options.orders ? { orders: options.orders } : {}),\n onEvent: (event) =>\n hub.publish({\n namespace: publicNamespace,\n type: event.type,\n id: event.id,\n body: envelope(event),\n }),\n }),\n describe: () => ({ webhooks: hub.endpoints(\"default\").length > 0 ? \"on\" : \"off\" }),\n admin: adminRoutes(send, challenge),\n })\n return Object.assign(runtime, { webhooks: hub })\n}\n", "import type { FetchAPI } from \"@crvouga/mockingbird-core\"\nimport {\n type APIOptions,\n annotateResponse,\n bearerToken,\n bodyIssues,\n bootSqlite,\n coerce,\n createService,\n defineOperations,\n faultEffect,\n fromBase64,\n HttpError,\n jsonRes,\n type OperationContext,\n opaqueToken,\n type Service,\n toBase64,\n} from \"@crvouga/mockingbird-service\"\nimport type { SqliteClient } from \"@crvouga/mockingbird-sqlite\"\nimport type { Hono } from \"hono\"\nimport { document, type SupportedOperationId } from \"./generated/openapi.js\"\nimport { RESULT_PDF } from \"./pdf.js\"\nimport {\n DEFAULT_PRACTITIONER,\n type EventRecord,\n FullscriptState,\n type LabOrderRecord,\n type LabOrderState,\n type Practitioner,\n type Settings,\n stateRank,\n} from \"./state.js\"\n\nexport type { FetchAPI } from \"@crvouga/mockingbird-core\"\nexport type { SqliteClient } from \"@crvouga/mockingbird-sqlite\"\nexport type { OperationId, SupportedOperationId } from \"./generated/openapi.js\"\nexport { document, operationIds, supportedOperationIds } from \"./generated/openapi.js\"\nexport { RESULT_PDF } from \"./pdf.js\"\nexport type {\n Clinic,\n EventRecord,\n LabOrderRecord,\n LabOrderState,\n Practitioner,\n Settings,\n} from \"./state.js\"\nexport {\n DEFAULT_CLINIC,\n DEFAULT_PRACTITIONER,\n isLabOrderState,\n LAB_ORDER_STATES,\n} from \"./state.js\"\n\nexport const FULLSCRIPT_NAMESPACE = \"fullscript\"\nconst SCOPE = \"clinic:read labs:read labs:write patients:read\"\nconst TOKEN_PREFIX = \"fsat_\"\n\n/** Fullscript API errors: `{errors: [{code, message}]}`. */\nexport const apiErrors = (status: number, code: string, message: string) =>\n jsonRes(status, { errors: [{ code, message }] })\n\n/** Doorkeeper OAuth errors: `{error, error_description}`. */\nexport const oauthError = (status: number, error: string, description: string) =>\n jsonRes(status, { error, error_description: description })\n\nconst INVALID_GRANT =\n \"The provided authorization grant is invalid, expired, revoked, does not match the redirection URI used in the authorization request, or was issued to another client.\"\nconst INVALID_CLIENT =\n \"Client authentication failed due to unknown client, no client authentication included, or unsupported authentication method.\"\n\nconst base64url = (value: string) =>\n toBase64(new TextEncoder().encode(value))\n .replace(/\\+/g, \"-\")\n .replace(/\\//g, \"_\")\n .replace(/=+$/, \"\")\nconst fromBase64url = (value: string) => {\n try {\n return new TextDecoder(\"utf-8\", { fatal: true }).decode(\n fromBase64(value.replace(/-/g, \"+\").replace(/_/g, \"/\")),\n )\n } catch {\n return undefined\n }\n}\n\ntype TokenClaims = {\n clientId: string\n practitionerId: string\n clinicId: string\n type: Practitioner[\"type\"]\n}\n\nconst sign = (payload: string, issuedAt: number) =>\n opaqueToken(`fullscript:${payload}:${issuedAt}`, 32)\n\n/** Access tokens are self-describing and signed, so any instance can verify them. */\nexport const issueAccessToken = (claims: TokenClaims, issuedAtSeconds: number) => {\n const payload = base64url(\n JSON.stringify([claims.clientId, claims.practitionerId, claims.clinicId, claims.type]),\n )\n return `${TOKEN_PREFIX}${payload}.${issuedAtSeconds}.${sign(payload, issuedAtSeconds)}`\n}\n\nconst readAccessToken = (token: string): (TokenClaims & { issuedAt: number }) | undefined => {\n if (!token.startsWith(TOKEN_PREFIX)) return undefined\n const [payload, issued, signature] = token.slice(TOKEN_PREFIX.length).split(\".\")\n const issuedAt = Number(issued)\n if (!payload || !Number.isInteger(issuedAt) || signature !== sign(payload, issuedAt))\n return undefined\n const decoded = fromBase64url(payload)\n try {\n const [clientId, practitionerId, clinicId, type] = JSON.parse(decoded ?? \"\") as string[]\n if (!clientId || !practitionerId || !clinicId) return undefined\n return {\n clientId,\n practitionerId,\n clinicId,\n type: type === \"Staff\" ? \"Staff\" : \"Practitioner\",\n issuedAt,\n }\n } catch {\n return undefined\n }\n}\n\n/** The OAuth client an access token was issued to (how credentials map to namespaces). */\nexport const tokenCredential = (request: Request): string | undefined => {\n const token = bearerToken(request)\n return token ? (readAccessToken(token)?.clientId ?? token) : undefined\n}\n\n/** A lab order to start a namespace with, walked forward to `state` (events included). */\nexport type SeedOrder = {\n id: string\n patientId: string\n state: LabOrderState\n clinicId?: string\n treatmentPlanId?: string | null\n name?: string\n collectionMethod?: string\n tests?: string[]\n}\n\nexport type FullscriptAPIOptions = APIOptions & {\n settings?: Partial<Settings>\n orders?: readonly SeedOrder[]\n /** The public namespace, so result PDF URLs carry a `/__admin/ns/<name>` prefix. */\n adminPrefix?: string\n publicNamespace?: string\n /** Called for every event; the runtime signs and delivers it. */\n onEvent?: (event: EventRecord) => void\n}\n\n/** An event as the events API returns it. */\nexport const publicEvent = (event: EventRecord) => ({\n id: event.id,\n type: event.type,\n clinic_id: event.clinic_id,\n created_at: event.created_at,\n data: event.data,\n})\n\n/** The webhook body Fullscript posts for an event: `{event_payload: {event}}`. */\nexport const envelope = (event: EventRecord) => ({ event_payload: { event: publicEvent(event) } })\n\nconst page = (context: OperationContext) => {\n const q = context.query as Record<string, unknown>\n const block = (q.page ?? {}) as Record<string, unknown>\n const number = coerce.integer(block.number ?? \"1\")\n const size = coerce.integer(block.size ?? \"20\")\n return {\n number: number.ok && number.value > 0 ? number.value : 1,\n size: size.ok && size.value > 0 ? Math.min(size.value, 100) : 20,\n }\n}\n\nconst meta = (current: number, size: number, total: number) => {\n const totalPages = Math.max(1, Math.ceil(total / size))\n return {\n current_page: current,\n next_page: current < totalPages ? current + 1 : null,\n prev_page: current > 1 ? current - 1 : null,\n total_pages: totalPages,\n total_count: total,\n }\n}\n\n/**\n * Stateful mock of the Fullscript lab-ordering API. Practitioners connect through OAuth;\n * lab orders move forward only through admin transitions, each emitting a `lab_order.updated`\n * event (and `order.placed` on purchase) readable through the events API and delivered as a\n * signed webhook. Results appear with the results-bearing states, as expiring PDF URLs.\n */\nexport class FullscriptAPI implements FetchAPI {\n readonly app: Hono\n readonly sqlite: SqliteClient\n readonly state: FullscriptState\n private readonly service: Service\n private readonly now: () => number\n private readonly prefix: string\n private readonly onEvent: ((event: EventRecord) => void) | undefined\n\n constructor(options: FullscriptAPIOptions = {}) {\n const sqlite = bootSqlite(options.sqlite)\n const namespace = options.namespace ?? FULLSCRIPT_NAMESPACE\n this.now = options.now ?? (() => Date.now())\n this.onEvent = options.onEvent\n this.prefix =\n options.publicNamespace && options.publicNamespace !== \"default\"\n ? `${options.adminPrefix ?? \"/__admin\"}/ns/${encodeURIComponent(options.publicNamespace)}`\n : \"\"\n this.state = new FullscriptState(sqlite, namespace, options.settings ?? {})\n const handlers = defineOperations<SupportedOperationId>({\n OAuthToken: (context) => this.token(context),\n OAuthRevoke: (context) => this.revoke(context),\n GetClinic: (context) => {\n const claims = this.claims(context)\n const clinic = this.state.clinics.get(claims.clinicId)\n if (!clinic) return apiErrors(404, \"not_found\", \"Clinic not found\")\n return jsonRes(200, { clinic })\n },\n CreateSessionGrant: (context) => {\n const claims = this.claims(context)\n const expires = this.now() + 5 * 60_000\n return jsonRes(201, {\n secret_token: `sg_${opaqueToken(`${claims.practitionerId}:${this.now()}`, 40)}`,\n expires_at: new Date(expires).toISOString(),\n })\n },\n ListLabOrders: (context) => {\n const claims = this.claims(context)\n const patient =\n typeof context.query.patient_id === \"string\" ? context.query.patient_id : undefined\n const rows = this.state.orders\n .list({\n order: \"oldest\",\n where: (o) => o.clinicId === claims.clinicId && (!patient || o.patientId === patient),\n })\n .map((r) => r.value)\n const p = page(context)\n return jsonRes(200, {\n orders: rows\n .slice((p.number - 1) * p.size, p.number * p.size)\n .map((o) => this.summary(o)),\n meta: meta(p.number, p.size, rows.length),\n })\n },\n GetLabOrder: (context) => {\n const claims = this.claims(context)\n const order = this.state.orders.get(context.params.orderId ?? \"\")\n if (!order || order.clinicId !== claims.clinicId)\n return apiErrors(404, \"not_found\", \"Lab order not found\")\n return annotateResponse(jsonRes(200, { order: this.detail(order, context) }), {\n ids: { orderId: order.id },\n })\n },\n ListLabOrderEvents: (context) => {\n const claims = this.claims(context)\n const ascending = context.query.order_by === \"ASC\"\n const rows = this.state.events\n .list({\n order: ascending ? \"oldest\" : \"newest\",\n where: (e) => e.clinic_id === claims.clinicId && e.type === \"lab_order.updated\",\n })\n .map((r) => r.value)\n const p = page(context)\n const drift = faultEffect(context.request, \"events_schema_drift\") !== undefined\n return jsonRes(200, {\n events: rows.slice((p.number - 1) * p.size, p.number * p.size).map((e) => ({\n id: e.id,\n type: drift ? \"lab_order.changed\" : e.type,\n clinic_id: e.clinic_id,\n created_at: e.created_at,\n })),\n meta: meta(p.number, p.size, rows.length),\n })\n },\n GetEvent: (context) => {\n const claims = this.claims(context)\n const event = this.state.events.get(context.params.eventId ?? \"\")\n if (!event || event.clinic_id !== claims.clinicId)\n return apiErrors(404, \"not_found\", \"Event not found\")\n return jsonRes(200, { event: this.publicEvent(event) })\n },\n Authorize: (context) => this.authorize(context),\n GetResultPdf: (context) => this.pdf(context),\n })\n this.service = createService({\n document,\n handlers,\n sqlite,\n namespace,\n now: this.now,\n notFound: () => apiErrors(404, \"not_found\", \"Not Found\"),\n onError: (error) => {\n if (error instanceof HttpError) return error.toResponse()\n throw error\n },\n before: (context) => {\n const id = context.operation.operationId\n if (\n id === \"OAuthToken\" ||\n id === \"OAuthRevoke\" ||\n id === \"Authorize\" ||\n id === \"GetResultPdf\"\n ) {\n return undefined\n }\n const token = bearerToken(context.request)\n if (!token)\n return apiErrors(401, \"unauthorized\", \"You need to sign in or authenticate first\")\n if (faultEffect(context.request, \"token_expired\") !== undefined) {\n return apiErrors(401, \"token_expired\", \"The access token expired\")\n }\n const claims = readAccessToken(token)\n if (!claims || this.state.revoked.has(token)) {\n return apiErrors(401, \"invalid_token\", \"The access token is invalid\")\n }\n if (this.now() / 1000 >= claims.issuedAt + this.state.current().accessTokenTtlSeconds) {\n return apiErrors(401, \"token_expired\", \"The access token expired\")\n }\n return undefined\n },\n })\n this.app = this.service.app\n this.sqlite = this.service.sqlite\n for (const seed of options.orders ?? []) this.seedOrder(seed)\n }\n\n fetch(request: Request): Promise<Response> {\n return this.service.fetch(request)\n }\n\n async reset(): Promise<void> {\n await this.service.reset()\n this.state.ensureSeeded()\n }\n\n private iso(): string {\n return new Date(this.now()).toISOString()\n }\n\n private claims(context: OperationContext): TokenClaims {\n return readAccessToken(bearerToken(context.request) ?? \"\") as TokenClaims\n }\n\n private clientOk(clientId: unknown, secret: unknown): boolean {\n const clients = this.state.current().clients\n if (typeof clientId !== \"string\" || typeof secret !== \"string\" || !clientId || !secret)\n return false\n return (\n clients.length === 0 ||\n clients.some((c) => c.clientId === clientId && c.clientSecret === secret)\n )\n }\n\n private body(context: OperationContext): Record<string, unknown> {\n const issues = bodyIssues(context)\n if (issues.length > 0) {\n throw new HttpError(400, {\n error: \"invalid_request\",\n error_description: `The request is missing a required parameter or is otherwise malformed: ${issues.map((i) => `${i.path || \"body\"} ${i.message}`).join(\"; \")}`,\n })\n }\n return context.body.kind === \"json\" ? (context.body.value as Record<string, unknown>) : {}\n }\n\n /** Mint an authorization code for a practitioner (what the consent page does). */\n issueCode(practitionerId: string, clientId: string, redirectUri: string | null): string {\n const code = `code_${opaqueToken(`${practitionerId}:${this.state.next(\"code\")}`, 32)}`\n this.state.codes.insert(code, {\n code,\n practitionerId,\n clientId,\n redirectUri,\n expiresAtMs: this.now() + this.state.current().codeTtlSeconds * 1000,\n used: false,\n })\n return code\n }\n\n private tokenPair(practitioner: Practitioner, clientId: string) {\n const refresh = `fsrt_${opaqueToken(`${practitioner.id}:${this.state.next(\"refresh\")}`, 40)}`\n this.state.refresh.insert(refresh, {\n token: refresh,\n practitionerId: practitioner.id,\n clientId,\n revoked: false,\n })\n const issuedAt = Math.floor(this.now() / 1000)\n return jsonRes(200, {\n oauth: {\n access_token: issueAccessToken(\n {\n clientId,\n practitionerId: practitioner.id,\n clinicId: practitioner.clinicId,\n type: practitioner.type,\n },\n issuedAt,\n ),\n token_type: \"Bearer\",\n expires_in: this.state.current().accessTokenTtlSeconds,\n refresh_token: refresh,\n scope: SCOPE,\n created_at: new Date(issuedAt * 1000).toISOString(),\n resource_owner: {\n id: practitioner.id,\n type: practitioner.type,\n clinic_id: practitioner.clinicId,\n },\n },\n })\n }\n\n private token(context: OperationContext): Response {\n const body = this.body(context)\n const clientId = String(body.client_id)\n if (!this.clientOk(body.client_id, body.client_secret))\n return oauthError(401, \"invalid_client\", INVALID_CLIENT)\n if (body.grant_type === \"authorization_code\") {\n if (typeof body.code !== \"string\" || !body.code) {\n return oauthError(400, \"invalid_request\", \"Missing required parameter: code.\")\n }\n const code = this.state.codes.get(body.code)\n if (\n !code ||\n code.used ||\n code.clientId !== clientId ||\n this.now() > code.expiresAtMs ||\n (code.redirectUri !== null && body.redirect_uri !== code.redirectUri)\n ) {\n return oauthError(400, \"invalid_grant\", INVALID_GRANT)\n }\n this.state.codes.update(code.code, { ...code, used: true })\n const practitioner = this.state.practitioners.get(code.practitionerId) ?? DEFAULT_PRACTITIONER\n return this.tokenPair(practitioner, clientId)\n }\n if (typeof body.refresh_token !== \"string\" || !body.refresh_token) {\n return oauthError(400, \"invalid_request\", \"Missing required parameter: refresh_token.\")\n }\n if (faultEffect(context.request, \"invalid_grant\") !== undefined) {\n return oauthError(400, \"invalid_grant\", INVALID_GRANT)\n }\n const refresh = this.state.refresh.get(body.refresh_token)\n if (!refresh || refresh.revoked || refresh.clientId !== clientId) {\n return oauthError(400, \"invalid_grant\", INVALID_GRANT)\n }\n // Refresh tokens rotate: the presented one is spent.\n this.state.refresh.update(refresh.token, { ...refresh, revoked: true })\n const practitioner =\n this.state.practitioners.get(refresh.practitionerId) ?? DEFAULT_PRACTITIONER\n return this.tokenPair(practitioner, clientId)\n }\n\n private revoke(context: OperationContext): Response {\n const body = this.body(context)\n if (!this.clientOk(body.client_id, body.client_secret))\n return oauthError(401, \"invalid_client\", INVALID_CLIENT)\n const token = String(body.token)\n const refresh = this.state.refresh.get(token)\n if (refresh) this.state.refresh.update(token, { ...refresh, revoked: true })\n else if (readAccessToken(token)) this.state.revoked.insert(token, { token })\n return jsonRes(200, {})\n }\n\n private authorize(context: OperationContext): Response {\n const url = context.url\n const redirect = url.searchParams.get(\"redirect_uri\")\n const clientId = url.searchParams.get(\"client_id\")\n if (!redirect || !clientId || url.searchParams.get(\"response_type\") !== \"code\") {\n return oauthError(\n 400,\n \"invalid_request\",\n \"client_id, redirect_uri and response_type=code are required.\",\n )\n }\n const practitionerId = url.searchParams.get(\"practitioner_id\") ?? DEFAULT_PRACTITIONER.id\n if (!this.state.practitioners.get(practitionerId)) {\n return oauthError(400, \"invalid_request\", `Unknown practitioner ${practitionerId}.`)\n }\n const code = this.issueCode(practitionerId, clientId, redirect)\n const location = new URL(redirect)\n location.searchParams.set(\"code\", code)\n const state = url.searchParams.get(\"state\")\n if (state !== null) location.searchParams.set(\"state\", state)\n return new Response(null, { status: 302, headers: { location: location.toString() } })\n }\n\n private summary(order: LabOrderRecord) {\n return {\n id: order.id,\n state: order.state,\n treatment_plan_id: order.treatmentPlanId,\n patient_id: order.patientId,\n name: order.name,\n created_at: order.created_at,\n updated_at: order.updated_at,\n }\n }\n\n /** A signed, expiring URL for a result artifact, on the mock itself (or `resultsBaseUrl`). */\n private pdfUrl(artifactId: string, context: OperationContext): string {\n const base = this.state.current().resultsBaseUrl ?? `${context.url.origin}${this.prefix}`\n const expires = this.now() + this.state.current().pdfUrlTtlSeconds * 1000\n return `${base.replace(/\\/$/, \"\")}/results/${artifactId}?expires=${expires}&signature=${opaqueToken(`${artifactId}:${expires}`, 24)}`\n }\n\n private detail(order: LabOrderRecord, context: OperationContext) {\n return {\n ...this.summary(order),\n collection_method: order.collectionMethod,\n tests: order.tests,\n results: order.results.map((r) => ({\n id: r.id,\n name: r.name,\n state: r.state,\n pdf_url: this.pdfUrl(r.artifactId, context),\n })),\n latest_aggregated_result: order.aggregated\n ? {\n id: order.aggregated.id,\n artifact_id: order.aggregated.artifactId,\n pdf_url: this.pdfUrl(order.aggregated.artifactId, context),\n status: order.aggregated.status,\n }\n : null,\n }\n }\n\n private pdf(context: OperationContext): Response {\n const artifactId = context.params.artifactId ?? \"\"\n const expires = Number(context.url.searchParams.get(\"expires\"))\n const signature = context.url.searchParams.get(\"signature\")\n if (signature !== opaqueToken(`${artifactId}:${expires}`, 24)) {\n return new Response(\"Forbidden\", { status: 403, headers: { \"content-type\": \"text/plain\" } })\n }\n if (this.now() > expires)\n return new Response(\"Expired\", { status: 403, headers: { \"content-type\": \"text/plain\" } })\n const known = this.state.orders\n .list()\n .some(\n ({ value: o }) =>\n o.aggregated?.artifactId === artifactId ||\n o.results.some((r) => r.artifactId === artifactId),\n )\n if (!known) return new Response(null, { status: 404 })\n return new Response(new Blob([RESULT_PDF as BlobPart]), {\n status: 200,\n headers: {\n \"content-type\": \"application/pdf\",\n \"content-length\": String(RESULT_PDF.byteLength),\n },\n })\n }\n\n private publicEvent(event: EventRecord) {\n return {\n id: event.id,\n type: event.type,\n clinic_id: event.clinic_id,\n created_at: event.created_at,\n data: event.data,\n }\n }\n\n private emit(\n type: EventRecord[\"type\"],\n order: LabOrderRecord,\n data: Record<string, unknown>,\n ): EventRecord {\n const seq = this.state.next(\"event\")\n const event: EventRecord = {\n id: `evt_${seq}`,\n type,\n clinic_id: order.clinicId,\n created_at: this.iso(),\n data,\n seq,\n }\n this.state.events.insert(event.id, event)\n this.onEvent?.(event)\n return event\n }\n\n /** Create a lab order in `not_purchased` (a practitioner recommended labs in a treatment plan). */\n createOrder(input: Omit<SeedOrder, \"state\" | \"id\"> & { id?: string }): LabOrderRecord {\n const id = input.id ?? `lo_${this.state.next(\"order\")}`\n const now = this.iso()\n const order: LabOrderRecord = {\n id,\n clinicId: input.clinicId ?? DEFAULT_PRACTITIONER.clinicId,\n patientId: input.patientId,\n treatmentPlanId: input.treatmentPlanId === undefined ? `tp_${id}` : input.treatmentPlanId,\n name: input.name ?? \"Comprehensive Wellness Panel\",\n collectionMethod: input.collectionMethod ?? \"at_home_phlebotomy\",\n state: \"not_purchased\",\n tests: (input.tests ?? [\"Lipid Panel\", \"Comprehensive Metabolic Panel\"]).map((name, i) => ({\n id: `lt_${id}_${i + 1}`,\n name,\n lab_type: \"labs\",\n })),\n results: [],\n aggregated: null,\n created_at: now,\n updated_at: now,\n }\n this.state.orders.insert(id, order)\n return order\n }\n\n /**\n * Move an order forward (never back) and emit its events: `order.placed` on purchase and\n * `lab_order.updated` for every move. Results-bearing states attach result artifacts.\n */\n transition(orderId: string, to: LabOrderState): LabOrderRecord {\n const order = this.state.orders.get(orderId)\n if (!order)\n throw new HttpError(404, {\n error: { type: \"mockingbird_admin\", message: `no lab order ${orderId}` },\n })\n if (stateRank(to) <= stateRank(order.state)) {\n throw new HttpError(409, {\n error: {\n type: \"mockingbird_admin\",\n message: `lab orders only move forward: ${order.state} \u2192 ${to} is not allowed`,\n },\n })\n }\n const artifact = () => `art_${opaqueToken(`${order.id}:${this.state.next(\"artifact\")}`, 16)}`\n const next: LabOrderRecord = { ...order, state: to, updated_at: this.iso() }\n const rank = stateRank(to)\n if (rank >= stateRank(\"partial_results\")) {\n const wanted = rank >= stateRank(\"results_ready\") ? next.tests.length : 1\n const results = [...next.results]\n for (const test of next.tests.slice(results.length, wanted)) {\n results.push({\n id: `res_${test.id}`,\n name: test.name,\n state: \"final\",\n artifactId: artifact(),\n })\n }\n next.results = results\n }\n if (rank >= stateRank(\"results_ready\") && (!next.aggregated || to === \"results_amended\")) {\n next.aggregated = {\n id: `agg_${order.id}${to === \"results_amended\" ? \"_amended\" : \"\"}`,\n artifactId: artifact(),\n status: to === \"results_amended\" ? \"amended\" : \"final\",\n }\n }\n this.state.orders.update(order.id, next)\n if (to === \"purchased\" || (order.state === \"not_purchased\" && rank > stateRank(\"purchased\"))) {\n this.emit(\"order.placed\", next, {\n id: next.id,\n treatment_plan_ids: next.treatmentPlanId ? [next.treatmentPlanId] : [],\n patient_id: next.patientId,\n line_items: [{ type: \"labs\", lab_type: \"labs\", name: next.name }],\n })\n }\n this.emit(\"lab_order.updated\", next, {\n lab_order: {\n id: next.id,\n state: next.state,\n treatment_plan_id: next.treatmentPlanId,\n patient_id: next.patientId,\n },\n })\n return next\n }\n\n seedOrder(seed: SeedOrder): LabOrderRecord {\n const order = this.state.orders.get(seed.id) ?? this.createOrder(seed)\n return seed.state === order.state ? order : this.transition(order.id, seed.state)\n }\n\n labOrders(): LabOrderRecord[] {\n return this.state.orders.list({ order: \"oldest\" }).map((r) => r.value)\n }\n\n eventsList(): EventRecord[] {\n return this.state.events.list({ order: \"oldest\" }).map((r) => r.value)\n }\n}\n\nexport type { FullscriptRuntime, FullscriptRuntimeOptions } from \"./runtime.js\"\nexport { createRuntime, FULLSCRIPT_PRESETS, SIGNATURE_HEADER } from \"./runtime.js\"\n"],
5
+ "mappings": "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",
6
6
  "names": ["fetch", "_", "document", "document", "document", "document", "fail", "ok", "name", "matches", "name", "document", "name", "isRecord", "name", "next", "isRecord", "name", "name", "isRecord", "assign", "page", "name", "routes", "isRecord", "count", "url", "name", "json", "page", "fail", "isRecord", "name", "field", "json", "adminError", "sign", "ok", "id", "document", "isRecord", "json", "adminError", "name", "document", "snapshot", "branch", "isRecord", "stepping", "kept", "url", "response", "copy", "notes", "json", "adminError", "isRecord", "createRuntime", "practitioner", "name"]
7
7
  }