{"version":3,"sources":["../../protocol/src/ids.ts","../../protocol/src/helpers.ts","../../protocol/src/errors.ts","../../core/src/client-connection-health.ts","../../core/src/client-connection-lifecycle.ts","../../core/src/client-errors.ts","../../core/src/client-outbox.ts","../../core/src/transport.ts","../../core/src/client-connection.ts","../../core/src/mutations.ts","../../core/src/persist.ts","../../core/src/overlay.ts","../../core/src/sub-registry.ts","../../core/src/query-store.ts","../../core/src/rooms.ts","../../core/src/client.ts","../../core/src/tx.ts","../../core/src/index.ts","../src/client.ts"],"names":["isJson","tx","init","overlay"],"mappings":"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","file":"client.cjs","sourcesContent":["// Protocol version, identifier aliases, and value types — the primitives every\n// other protocol module builds on.\n\n/** Wire protocol version, bumped on breaking changes to the on-the-wire message\n *  shapes so client and server can detect a mismatch. Currently `1`. */\nexport const PROTOCOL_VERSION = 1 as const;\nexport const PROTOCOL_VERSION_HEADER = \"x-odla-protocol-version\";\n\n// ----------------------------------------------------------------------------\n// Identifiers\n// ----------------------------------------------------------------------------\nexport type EntityId = string; // UUIDv7\nexport type AppId = string;\nexport type ClientId = string;\nexport type SubId = string;\nexport type MutationId = string;\nexport type QueryHash = string;\n/** Monotonic per app DO. Treat as an OPAQUE PER-STREAM WATERMARK: only compare\n * txIds from the same app stream; never do arithmetic on them. */\nexport type TxId = number;\n/** Names an entity's home graph (cell). Today every app is exactly one graph, so\n * refs omit it; it exists so cross-cell references stay expressible later. */\nexport type GraphId = string;\n\n// ----------------------------------------------------------------------------\n// Values\n// ----------------------------------------------------------------------------\nexport type ValueType = \"string\" | \"number\" | \"boolean\" | \"date\" | \"json\" | \"ref\";\nexport type Scalar = string | number | boolean | null;\nexport type Json = Scalar | Json[] | { [key: string]: Json };\nexport type Value = Scalar | Json;\n","import { PROTOCOL_VERSION, type EntityId } from \"./ids\";\nimport type { ClientMsg, ServerMsg } from \"./messages\";\n\n/**\n * Generate a UUIDv7 (time-ordered). Uses the Web Crypto API available in both\n * the browser, Node >=20, and the Workers runtime.\n */\nexport function uuidv7(): EntityId {\n  const bytes = new Uint8Array(16);\n  crypto.getRandomValues(bytes);\n\n  const ts = BigInt(Date.now());\n  bytes[0] = Number((ts >> 40n) & 0xffn);\n  bytes[1] = Number((ts >> 32n) & 0xffn);\n  bytes[2] = Number((ts >> 24n) & 0xffn);\n  bytes[3] = Number((ts >> 16n) & 0xffn);\n  bytes[4] = Number((ts >> 8n) & 0xffn);\n  bytes[5] = Number(ts & 0xffn);\n\n  // version 7\n  bytes[6] = (bytes[6]! & 0x0f) | 0x70;\n  // variant (RFC 4122)\n  bytes[8] = (bytes[8]! & 0x3f) | 0x80;\n\n  const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n  return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;\n}\n\nconst CLIENT_OPS = new Set([\n  \"init\", \"subscribe\", \"subscribe-batch\", \"unsubscribe\", \"transact\",\n  \"presence-set\", \"presence-clear\", \"room-publish\", \"ping\",\n]);\nconst SERVER_OPS = new Set([\n  \"init-ok\", \"query-result\", \"query-result-batch\", \"query-diff\", \"tx-ack\",\n  \"mutation-reject\", \"tx\", \"presence\", \"room-event\", \"error\", \"pong\", \"echo\",\n]);\nexport const MAX_WS_MESSAGE_BYTES = 1_100_000;\nexport const MAX_TRANSACTION_OPS = 1_000;\n/** Durable Object sockets retain at most this many live query registrations. */\nexport const MAX_ACTIVE_SUBSCRIPTIONS = 32;\n\n/** Cheap structural guard for an inbound client message. */\nexport function isClientMsg(x: unknown): x is ClientMsg {\n  if (!isEnvelope(x, CLIENT_OPS)) return false;\n  const m = x as Record<string, unknown>;\n  switch (m.op) {\n    case \"init\":\n      return isShortString(m.clientId) && optionalString(m.auth) && optionalNonNegativeNumber(m.lastSeenTx) &&\n        (m.caps === undefined || (Array.isArray(m.caps) && m.caps.length <= 32 && m.caps.every(isShortString))) &&\n        (m.resume === undefined || (Array.isArray(m.resume) && m.resume.length <= MAX_ACTIVE_SUBSCRIPTIONS && m.resume.every(isResume)));\n    case \"subscribe\": return isShortString(m.subId) && isRecord(m.query);\n    case \"subscribe-batch\":\n      return Array.isArray(m.subs) && m.subs.length >= 1 && m.subs.length <= MAX_ACTIVE_SUBSCRIPTIONS && m.subs.every(isResume);\n    case \"unsubscribe\": return isShortString(m.subId);\n    case \"transact\": return isShortString(m.mutationId) && Array.isArray(m.ops) && m.ops.length <= MAX_TRANSACTION_OPS && m.ops.every(isOp);\n    case \"presence-set\": return isRoom(m.room) && isJson(m.presence);\n    case \"presence-clear\": return isRoom(m.room);\n    case \"room-publish\": return isRoom(m.room) && isJson(m.event);\n    case \"ping\": return true;\n    default: return false;\n  }\n}\n\n/** Cheap structural guard for an inbound server message. */\nexport function isServerMsg(x: unknown): x is ServerMsg {\n  if (!isEnvelope(x, SERVER_OPS)) return false;\n  const m = x as Record<string, unknown>;\n  switch (m.op) {\n    case \"init-ok\":\n      return isFiniteNumber(m.serverTime) && isFiniteNumber(m.currentTx) && optionalNonNegativeNumber(m.epoch) &&\n        (m.caps === undefined || (Array.isArray(m.caps) && m.caps.length <= 32 && m.caps.every(isShortString)));\n    case \"query-result\": return isShortString(m.subId) && isShortString(m.queryHash) && isFiniteNumber(m.txId) && isRecord(m.result);\n    case \"query-result-batch\":\n      return isFiniteNumber(m.txId) && Array.isArray(m.results) && m.results.length >= 1 &&\n        m.results.length <= MAX_ACTIVE_SUBSCRIPTIONS && m.results.every(isBatchResult);\n    case \"query-diff\": return isShortString(m.subId) && isShortString(m.queryHash) && isFiniteNumber(m.txId) && isRecord(m.diff);\n    case \"tx-ack\": return isShortString(m.mutationId) && isFiniteNumber(m.txId);\n    case \"mutation-reject\": return isShortString(m.mutationId) && isErr(m.error);\n    case \"tx\": return isFiniteNumber(m.txId);\n    case \"presence\": return isRoom(m.room) && Array.isArray(m.peers) && m.peers.every(isPeer);\n    case \"room-event\": return isRoom(m.room) && isShortString(m.from) && isJson(m.event);\n    case \"error\": return isErr(m.error);\n    case \"pong\": return true;\n    case \"echo\": return typeof m.data === \"string\";\n    default: return false;\n  }\n}\n\nexport type WireParse<T> =\n  | { ok: true; value: T }\n  | { ok: false; code: \"invalid_json\" | \"protocol_version\" | \"bad_message\" | \"message_too_large\"; receivedVersion?: unknown };\n\n/** Parse with enough detail for a peer to report an actionable version error. */\nexport function parseClientMsgDetailed(data: string): WireParse<ClientMsg> {\n  if (new TextEncoder().encode(data).byteLength > MAX_WS_MESSAGE_BYTES) return { ok: false, code: \"message_too_large\" };\n  let parsed: unknown;\n  try {\n    parsed = JSON.parse(data);\n  } catch {\n    return { ok: false, code: \"invalid_json\" };\n  }\n  if (typeof parsed === \"object\" && parsed !== null && (parsed as { v?: unknown }).v !== PROTOCOL_VERSION) {\n    return { ok: false, code: \"protocol_version\", receivedVersion: (parsed as { v?: unknown }).v };\n  }\n  return isClientMsg(parsed) ? { ok: true, value: parsed } : { ok: false, code: \"bad_message\" };\n}\n\n/** Parse a raw WebSocket text frame into a typed client message, or null. */\nexport function parseClientMsg(data: string): ClientMsg | null {\n  const result = parseClientMsgDetailed(data);\n  return result.ok ? result.value : null;\n}\n\n/** Parse a server WebSocket frame, rejecting unknown ops and versions. */\nexport function parseServerMsg(data: string): WireParse<ServerMsg> {\n  if (new TextEncoder().encode(data).byteLength > MAX_WS_MESSAGE_BYTES) return { ok: false, code: \"message_too_large\" };\n  let parsed: unknown;\n  try {\n    parsed = JSON.parse(data);\n  } catch {\n    return { ok: false, code: \"invalid_json\" };\n  }\n  if (typeof parsed === \"object\" && parsed !== null && (parsed as { v?: unknown }).v !== PROTOCOL_VERSION) {\n    return { ok: false, code: \"protocol_version\", receivedVersion: (parsed as { v?: unknown }).v };\n  }\n  return isServerMsg(parsed) ? { ok: true, value: parsed } : { ok: false, code: \"bad_message\" };\n}\n\n/** Serialize a server message for the wire. */\nexport function encodeServerMsg(msg: ServerMsg): string {\n  return JSON.stringify(msg);\n}\n\nfunction isEnvelope(value: unknown, ops: ReadonlySet<string>): value is Record<string, unknown> {\n  return isRecord(value) && value.v === PROTOCOL_VERSION && typeof value.op === \"string\" && ops.has(value.op);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n  return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isShortString(value: unknown): value is string {\n  return typeof value === \"string\" && value.length > 0 && value.length <= 512;\n}\n\nfunction optionalString(value: unknown): boolean {\n  return value === undefined || typeof value === \"string\";\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n  return typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction optionalNonNegativeNumber(value: unknown): boolean {\n  return value === undefined || (isFiniteNumber(value) && value >= 0);\n}\n\nfunction isRoom(value: unknown): value is string {\n  return typeof value === \"string\" && value.length > 0 && value.length <= 256;\n}\n\nfunction isResume(value: unknown): boolean {\n  return isRecord(value) && isShortString(value.subId) && isRecord(value.query);\n}\n\nfunction isBatchResult(value: unknown): boolean {\n  return isRecord(value) && isShortString(value.subId) && isShortString(value.queryHash) && isRecord(value.result);\n}\n\nfunction isEntityRef(value: unknown): boolean {\n  if (isShortString(value)) return true;\n  if (!isRecord(value)) return false;\n  if (isShortString(value.id)) return value.graph === undefined || isShortString(value.graph);\n  return isShortString(value.ns) && isShortString(value.attr) && isScalar(value.value) &&\n    (value.graph === undefined || isShortString(value.graph));\n}\n\nfunction isOp(value: unknown): boolean {\n  if (!isRecord(value) || !isShortString(value.ns) || !isEntityRef(value.id)) return false;\n  switch (value.t) {\n    case \"update\": case \"merge\": return isRecord(value.attrs);\n    case \"increment\": return isShortString(value.attr) && isFiniteNumber(value.by);\n    case \"delete\": return true;\n    case \"retract\": return Array.isArray(value.attrs) && value.attrs.every(isShortString);\n    case \"link\": case \"unlink\": return isShortString(value.label) && isEntityRef(value.target);\n    default: return false;\n  }\n}\n\nfunction isErr(value: unknown): boolean {\n  return isRecord(value) && isShortString(value.code) && typeof value.message === \"string\" &&\n    (value.detail === undefined || isJson(value.detail));\n}\n\nfunction isPeer(value: unknown): boolean {\n  return isRecord(value) && isShortString(value.peerId) && isJson(value.presence);\n}\n\nfunction isScalar(value: unknown): boolean {\n  return value === null || typeof value === \"string\" || typeof value === \"boolean\" || isFiniteNumber(value);\n}\n\nfunction isJson(value: unknown, depth = 0): boolean {\n  if (isScalar(value)) return true;\n  if (depth >= 32) return false;\n  if (Array.isArray(value)) return value.every((item) => isJson(item, depth + 1));\n  return isRecord(value) && Object.values(value).every((item) => isJson(item, depth + 1));\n}\n","import type { Json } from \"./ids\";\nimport type { ErrShape } from \"./ops\";\nimport { PROTOCOL_VERSION, PROTOCOL_VERSION_HEADER } from \"./ids\";\n\n/** Stable SDK error shared by HTTP and realtime clients. Branch on `code`, not\n * message text; `status` is present for HTTP failures. */\nexport class OdlaError extends Error {\n  readonly code: string;\n  readonly status?: number;\n  readonly detail?: Json;\n  readonly retryable: boolean;\n  readonly requestId?: string;\n\n  constructor(\n    code: string,\n    message: string,\n    opts: { status?: number; detail?: Json; retryable?: boolean; requestId?: string; cause?: unknown } = {},\n  ) {\n    super(message, opts.cause === undefined ? undefined : { cause: opts.cause });\n    this.name = \"OdlaError\";\n    this.code = code;\n    this.status = opts.status;\n    this.detail = opts.detail;\n    this.retryable = opts.retryable ?? isRetryableStatus(opts.status);\n    this.requestId = opts.requestId;\n  }\n}\n\nexport function errorFromShape(shape: ErrShape, opts: { status?: number; requestId?: string } = {}): OdlaError {\n  return new OdlaError(shape.code, shape.message, { ...opts, detail: shape.detail });\n}\n\n/** Parse the platform's `{error:{code,message,detail}}` envelope without ever\n * reflecting an arbitrary HTML/text error body into application logs. */\nexport async function errorFromResponse(response: Response, operation: string): Promise<OdlaError> {\n  let shape: Partial<ErrShape> | undefined;\n  try {\n    const body = (await response.json()) as { error?: Partial<ErrShape> };\n    shape = body?.error;\n  } catch {\n    // Proxies may return HTML/plain text; keep the stable fallback below.\n  }\n  const code = typeof shape?.code === \"string\" ? shape.code : `http_${response.status}`;\n  const message = typeof shape?.message === \"string\" && shape.message\n    ? shape.message\n    : `odla ${operation} failed with HTTP ${response.status}`;\n  return new OdlaError(code, message, {\n    status: response.status,\n    detail: isJson(shape?.detail) ? shape.detail : undefined,\n    requestId: response.headers?.get?.(\"x-request-id\") ?? response.headers?.get?.(\"cf-ray\") ?? undefined,\n  });\n}\n\n/** Accept old servers that omit negotiation, but fail before decoding a\n * response that explicitly declares an incompatible wire contract. */\nexport function assertProtocolResponse(response: Response): void {\n  const received = response.headers?.get?.(PROTOCOL_VERSION_HEADER);\n  if (received && received !== String(PROTOCOL_VERSION)) {\n    throw new OdlaError(\"protocol_version\", `odla protocol ${received} is incompatible with client ${PROTOCOL_VERSION}`, {\n      status: response.status,\n      detail: { supported: PROTOCOL_VERSION, received },\n    });\n  }\n}\n\nfunction isRetryableStatus(status: number | undefined): boolean {\n  return status === 408 || status === 429 || (status !== undefined && status >= 500);\n}\n\nfunction isJson(value: unknown): value is Json {\n  if (value === null || [\"string\", \"number\", \"boolean\"].includes(typeof value)) return true;\n  if (Array.isArray(value)) return value.every(isJson);\n  return typeof value === \"object\" && value !== null && Object.values(value).every(isJson);\n}\n","import type { ClientMsg, ServerMsg } from \"@odla/protocol\";\nimport type {\n  ClientTelemetryEvent,\n  ConnectionHealth,\n  ConnectionStatus,\n  FreshnessMode,\n  InitOptions,\n} from \"./client-options\";\n\nconst DEFAULT_HEARTBEAT_INTERVAL_MS = 15_000;\nconst DEFAULT_STALE_AFTER_MS = 45_000;\n\ninterface HealthContext {\n  canHeartbeat(): boolean;\n  send(message: ClientMsg): void;\n  queue(): { depth: number; bytes: number };\n}\n\n/** Owns content-free connection health, timers, and telemetry separately from\n * transport/auth/reconnect orchestration. */\nexport class ConnectionHealthTracker {\n  private heartbeatTimer: ReturnType<typeof setTimeout> | null = null;\n  private staleTimer: ReturnType<typeof setTimeout> | null = null;\n  private pendingHeartbeatAt: number | null = null;\n  private lastConnectedAt?: number;\n  private lastEventAt?: number;\n  private heartbeatRttMs?: number;\n  private lastError?: { code: string; at: number };\n  private status: ConnectionStatus = {\n    state: \"dialing\",\n    attempt: 0,\n    changedAt: Date.now(),\n  };\n  private readonly staleAfterMs: number;\n  private readonly heartbeatIntervalMs: number;\n\n  constructor(\n    opts: Pick<\n      InitOptions,\n      \"heartbeatIntervalMs\" | \"onHealth\" | \"onTelemetry\" | \"staleAfterMs\"\n    >,\n    private readonly context: HealthContext,\n  ) {\n    this.staleAfterMs = duration(opts.staleAfterMs, DEFAULT_STALE_AFTER_MS);\n    this.heartbeatIntervalMs =\n      opts.heartbeatIntervalMs === 0\n        ? 0\n        : duration(opts.heartbeatIntervalMs, DEFAULT_HEARTBEAT_INTERVAL_MS);\n    this.onHealth = opts.onHealth;\n    this.onTelemetry = opts.onTelemetry;\n  }\n\n  private readonly onHealth?: InitOptions[\"onHealth\"];\n  private readonly onTelemetry?: InitOptions[\"onTelemetry\"];\n\n  snapshot(): ConnectionHealth {\n    const queue = this.context.queue();\n    return {\n      mode: this.mode(),\n      transport: \"websocket\",\n      state: this.status.state,\n      ...(this.lastConnectedAt === undefined\n        ? {}\n        : { lastConnectedAt: this.lastConnectedAt }),\n      ...(this.lastEventAt === undefined\n        ? {}\n        : { lastEventAt: this.lastEventAt }),\n      staleAfterMs: this.staleAfterMs,\n      reconnectAttempt: this.status.attempt,\n      ...(this.heartbeatRttMs === undefined\n        ? {}\n        : { heartbeatRttMs: this.heartbeatRttMs }),\n      outboxDepth: queue.depth,\n      outboxBytes: queue.bytes,\n      ...(this.lastError ? { lastError: { ...this.lastError } } : {}),\n    };\n  }\n\n  transition(status: ConnectionStatus): void {\n    this.status = { ...status };\n    this.emit({\n      type: \"connection.state\",\n      at: status.changedAt,\n      state: status.state,\n      attempt: status.attempt,\n      ...(status.retryInMs === undefined\n        ? {}\n        : { retryInMs: status.retryInMs }),\n      ...(status.errorCode ? { errorCode: status.errorCode } : {}),\n    });\n    this.notify();\n  }\n\n  connected(): void {\n    this.lastConnectedAt = Date.now();\n    this.serverFrame();\n  }\n\n  serverFrame(message?: ServerMsg): void {\n    const wasStale = this.mode() === \"stale\";\n    this.lastEventAt = Date.now();\n    this.scheduleStale();\n    if (wasStale) {\n      this.emit({\n        type: \"connection.freshness\",\n        at: this.lastEventAt,\n        mode: \"live\",\n        lastEventAt: this.lastEventAt,\n      });\n    }\n    if (message?.op === \"pong\" && this.pendingHeartbeatAt !== null) {\n      this.heartbeatRttMs = Math.max(0, Date.now() - this.pendingHeartbeatAt);\n      this.pendingHeartbeatAt = null;\n      this.emit({\n        type: \"connection.heartbeat\",\n        at: Date.now(),\n        rttMs: this.heartbeatRttMs,\n      });\n    }\n    this.notify();\n  }\n\n  error(code: string): void {\n    this.lastError = { code, at: Date.now() };\n    this.notify();\n  }\n\n  queue(overflow = false): void {\n    const queue = this.context.queue();\n    this.emit({\n      type: \"connection.queue\",\n      at: Date.now(),\n      depth: queue.depth,\n      bytes: queue.bytes,\n      ...(overflow ? { overflow: true } : {}),\n    });\n    this.notify();\n  }\n\n  start(): void {\n    this.clear();\n    this.scheduleStale();\n    if (this.heartbeatIntervalMs > 0) {\n      this.heartbeatTimer = setTimeout(\n        () => this.heartbeat(),\n        this.heartbeatIntervalMs,\n      );\n    }\n  }\n\n  clear(): void {\n    if (this.heartbeatTimer) clearTimeout(this.heartbeatTimer);\n    if (this.staleTimer) clearTimeout(this.staleTimer);\n    this.heartbeatTimer = null;\n    this.staleTimer = null;\n    this.pendingHeartbeatAt = null;\n  }\n\n  private heartbeat(): void {\n    this.heartbeatTimer = null;\n    if (!this.context.canHeartbeat()) return;\n    if (this.pendingHeartbeatAt === null) {\n      this.pendingHeartbeatAt = Date.now();\n      this.context.send({ v: 1, op: \"ping\" });\n    }\n    this.heartbeatTimer = setTimeout(\n      () => this.heartbeat(),\n      this.heartbeatIntervalMs,\n    );\n  }\n\n  private scheduleStale(): void {\n    if (this.staleTimer) clearTimeout(this.staleTimer);\n    this.staleTimer = null;\n    if (!this.context.canHeartbeat() || this.lastEventAt === undefined) return;\n    const delay = Math.max(\n      0,\n      this.lastEventAt + this.staleAfterMs - Date.now(),\n    );\n    this.staleTimer = setTimeout(() => {\n      this.staleTimer = null;\n      if (!this.context.canHeartbeat()) return;\n      if (this.mode() !== \"stale\") {\n        this.scheduleStale();\n        return;\n      }\n      this.emit({\n        type: \"connection.freshness\",\n        at: Date.now(),\n        mode: \"stale\",\n        lastEventAt: this.lastEventAt,\n      });\n      this.notify();\n    }, delay);\n  }\n\n  private mode(): FreshnessMode {\n    if (this.status.state === \"closed\") return \"closed\";\n    if (this.status.state === \"synced\") {\n      return this.lastEventAt !== undefined &&\n        Date.now() - this.lastEventAt >= this.staleAfterMs\n        ? \"stale\"\n        : \"live\";\n    }\n    return this.status.state === \"backoff\" || this.status.attempt > 0\n      ? \"reconnecting\"\n      : \"connecting\";\n  }\n\n  private notify(): void {\n    try {\n      this.onHealth?.(this.snapshot());\n    } catch {\n      // Health observers cannot break the transport lifecycle.\n    }\n  }\n\n  private emit(event: ClientTelemetryEvent): void {\n    try {\n      this.onTelemetry?.(event);\n    } catch {\n      // Telemetry observers cannot break the transport lifecycle.\n    }\n  }\n}\n\nfunction duration(value: number | undefined, fallback: number): number {\n  if (value === undefined || !Number.isFinite(value)) return fallback;\n  return Math.max(1, Math.floor(value));\n}\n","import type { ConnectionStatus, InitOptions } from \"./client-options\";\nimport type { ConnectionHealthTracker } from \"./client-connection-health\";\n\nconst INITIAL_RECONNECT_MS = 500;\nconst MAX_RECONNECT_MS = 30_000;\n\n/** Owns status/backoff state so transport orchestration does not also become a\n * status machine. */\nexport class ConnectionLifecycle {\n  private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n  private reconnectAttempt = 0;\n  private closed = false;\n  private status: ConnectionStatus = {\n    state: \"dialing\",\n    attempt: 0,\n    changedAt: Date.now(),\n  };\n\n  constructor(\n    private readonly onStatus: InitOptions[\"onStatus\"],\n    private readonly health: ConnectionHealthTracker,\n    private readonly reconnect: () => void,\n  ) {}\n\n  get isClosed(): boolean {\n    return this.closed;\n  }\n\n  snapshot(): ConnectionStatus {\n    return { ...this.status };\n  }\n\n  beginDial(): void {\n    this.cancelReconnect();\n    this.transition(\"dialing\");\n  }\n\n  resetAttempts(): void {\n    this.reconnectAttempt = 0;\n  }\n\n  transition(\n    state: ConnectionStatus[\"state\"],\n    errorCode?: string,\n    retryInMs?: number,\n  ): void {\n    this.status = {\n      state,\n      attempt: this.reconnectAttempt,\n      changedAt: Date.now(),\n      ...(retryInMs === undefined ? {} : { retryInMs }),\n      ...(errorCode ? { errorCode } : {}),\n    };\n    try {\n      this.onStatus?.({ ...this.status });\n    } catch {\n      // Observers cannot break the transport lifecycle.\n    }\n    this.health.transition(this.status);\n  }\n\n  backoff(errorCode?: string): void {\n    if (this.reconnectTimer || this.closed) return;\n    const base = Math.min(\n      INITIAL_RECONNECT_MS * 2 ** this.reconnectAttempt,\n      MAX_RECONNECT_MS,\n    );\n    const delay = Math.floor(base / 2 + (Math.random() * base) / 2);\n    this.reconnectAttempt += 1;\n    this.transition(\"backoff\", errorCode, delay);\n    this.reconnectTimer = setTimeout(() => {\n      this.reconnectTimer = null;\n      this.reconnect();\n    }, delay);\n  }\n\n  close(errorCode?: string): void {\n    this.closed = true;\n    this.cancelReconnect();\n    this.transition(\"closed\", errorCode);\n  }\n\n  cancelReconnect(): void {\n    if (!this.reconnectTimer) return;\n    clearTimeout(this.reconnectTimer);\n    this.reconnectTimer = null;\n  }\n}\n","import { OdlaError, PROTOCOL_VERSION } from \"@odla/protocol\";\nimport type { ServerMsg, WireParse } from \"@odla/protocol\";\n\ntype FailedServerParse = Extract<WireParse<ServerMsg>, { ok: false }>;\n\n/** Turn a rejected server frame into the stable public client error taxonomy. */\nexport function serverFrameError(parsed: FailedServerParse): OdlaError {\n  if (parsed.code === \"protocol_version\") {\n    return new OdlaError(\n      \"protocol_version\",\n      `server protocol ${String(parsed.receivedVersion)} is incompatible with client ${PROTOCOL_VERSION}`,\n      { detail: { supported: PROTOCOL_VERSION, received: String(parsed.receivedVersion) } },\n    );\n  }\n  if (parsed.code === \"message_too_large\") {\n    return new OdlaError(\"message_too_large\", \"server message exceeded the protocol size limit\");\n  }\n  const message = parsed.code === \"invalid_json\"\n    ? \"server sent invalid JSON\"\n    : \"server sent an unknown message\";\n  return new OdlaError(\"bad_message\", message);\n}\n","import type { ClientMsg } from \"@odla/protocol\";\n\nconst MAX_OUTBOX_MESSAGES = 1_000;\nconst MAX_OUTBOX_BYTES = 5 * 1024 * 1024;\n\nexport class ConnectionOutbox {\n  private messages: string[] = [];\n  private bytes = 0;\n\n  stats(): { depth: number; bytes: number } {\n    return { depth: this.messages.length, bytes: this.bytes };\n  }\n\n  enqueue(message: string): boolean {\n    const nextBytes = this.bytes + message.length;\n    if (\n      this.messages.length >= MAX_OUTBOX_MESSAGES ||\n      nextBytes > MAX_OUTBOX_BYTES\n    ) {\n      return false;\n    }\n    this.messages.push(message);\n    this.bytes = nextBytes;\n    return true;\n  }\n\n  retainRoomEvents(): void {\n    this.replace(\n      this.messages.filter((message) => messageOp(message) === \"room-publish\"),\n    );\n  }\n\n  flushNonMutations(send: (message: string) => void): void {\n    for (const message of this.messages) {\n      if (messageOp(message) !== \"transact\") send(message);\n    }\n    this.clear();\n  }\n\n  clear(): void {\n    this.replace([]);\n  }\n\n  private replace(messages: string[]): void {\n    this.messages = messages;\n    this.bytes = messages.reduce(\n      (total, message) => total + message.length,\n      0,\n    );\n  }\n}\n\nfunction messageOp(raw: string): ClientMsg[\"op\"] | null {\n  try {\n    return (JSON.parse(raw) as ClientMsg).op;\n  } catch {\n    return null;\n  }\n}\n","export interface Transport {\n  send(data: string): void;\n  close(): void;\n}\nexport interface TransportHandlers {\n  onOpen(): void;\n  onMessage(data: string): void;\n  onClose(): void;\n}\nexport type TransportFactory = (url: string, handlers: TransportHandlers) => Transport;\n\n/** Default transport: a real browser/Workers WebSocket. Internal — the barrel\n * exposes the injectable `TransportFactory` type, not this concrete default. */\nexport const webSocketTransport: TransportFactory = (url, h) => {\n  const ws = new WebSocket(url);\n  let closed = false;\n  const closeOnce = () => {\n    if (closed) return;\n    closed = true;\n    h.onClose();\n  };\n  ws.addEventListener(\"open\", () => h.onOpen());\n  ws.addEventListener(\"message\", (e) => h.onMessage(typeof e.data === \"string\" ? e.data : \"\"));\n  ws.addEventListener(\"close\", closeOnce);\n  ws.addEventListener(\"error\", closeOnce);\n  return { send: (d) => ws.send(d), close: () => ws.close() };\n};\n","import { OdlaError, parseServerMsg } from \"@odla/protocol\";\nimport type { ClientMsg, ServerMsg } from \"@odla/protocol\";\nimport { ConnectionHealthTracker } from \"./client-connection-health\";\nimport { ConnectionLifecycle } from \"./client-connection-lifecycle\";\nimport { serverFrameError } from \"./client-errors\";\nimport type {\n  ConnectionHealth,\n  ConnectionStatus,\n  InitOptions,\n} from \"./client-options\";\nimport { ConnectionOutbox } from \"./client-outbox\";\nimport {\n  webSocketTransport,\n  type Transport,\n  type TransportFactory,\n} from \"./transport\";\n\nconst INIT_TIMEOUT_MS = 10_000;\n\nexport abstract class RealtimeConnection {\n  private transport: Transport | null = null;\n  private readonly outbox = new ConnectionOutbox();\n  private readonly factory: TransportFactory;\n  private readonly url: string;\n  private readonly getToken?: InitOptions[\"getToken\"];\n  private initTimer: ReturnType<typeof setTimeout> | null = null;\n  private generation = 0;\n  private closedGeneration = 0;\n  private readonly onError?: InitOptions[\"onError\"];\n  private readonly health: ConnectionHealthTracker;\n  private readonly lifecycle: ConnectionLifecycle;\n  /** True only after the server has accepted init, not merely after socket open. */\n  protected isOpen = false;\n\n  protected constructor(opts: InitOptions, url: string) {\n    this.factory = opts.transport ?? webSocketTransport;\n    this.url = url;\n    this.getToken = opts.getToken;\n    this.onError = opts.onError;\n    this.health = new ConnectionHealthTracker(opts, {\n      canHeartbeat: () =>\n        this.isOpen && !this.lifecycle.isClosed && this.transport !== null,\n      send: (message) => this.transport?.send(JSON.stringify(message)),\n      queue: () => this.outbox.stats(),\n    });\n    this.lifecycle = new ConnectionLifecycle(\n      opts.onStatus,\n      this.health,\n      () => this.connect(),\n    );\n  }\n\n  protected abstract createInitMessage(\n    auth: string | undefined,\n  ): ClientMsg;\n  protected abstract onServerMessage(message: ServerMsg): void;\n  protected abstract onReconnectStart(): void;\n  protected abstract onConnectionSynced(): void;\n  protected abstract onTerminalError(error: OdlaError): void;\n\n  protected connect(): void {\n    if (this.lifecycle.isClosed) return;\n    const generation = ++this.generation;\n    this.closedGeneration = 0;\n    this.isOpen = false;\n    this.health.clear();\n    this.onReconnectStart();\n    this.lifecycle.beginDial();\n    let tokenPromise: Promise<string | null | undefined> | null = null;\n    if (this.getToken) {\n      try {\n        tokenPromise = Promise.resolve(this.getToken());\n      } catch (error) {\n        tokenPromise = Promise.reject(error);\n      }\n      tokenPromise.catch(() => {});\n    }\n    this.transport = this.factory(this.url, {\n      onOpen: () => void this.onOpen(generation, tokenPromise),\n      onMessage: (data) => this.onMessage(generation, data),\n      onClose: () => this.onClose(generation),\n    });\n  }\n\n  private async onOpen(\n    generation: number,\n    tokenPromise: Promise<string | null | undefined> | null,\n  ): Promise<void> {\n    if (\n      !this.isCurrent(generation) ||\n      this.lifecycle.snapshot().state !== \"dialing\"\n    ) {\n      return;\n    }\n    this.lifecycle.transition(\"authenticating\");\n    let auth: string | undefined;\n    try {\n      auth = tokenPromise ? (await tokenPromise) ?? undefined : undefined;\n    } catch (cause) {\n      const error = new OdlaError(\n        \"auth_token_failed\",\n        \"failed to obtain a realtime authentication token\",\n        { retryable: true, cause },\n      );\n      this.reportError(error);\n      this.failConnection(generation, error.code);\n      return;\n    }\n    if (!this.isCurrent(generation)) return;\n    this.transport?.send(JSON.stringify(this.createInitMessage(auth)));\n    this.outbox.retainRoomEvents();\n    this.lifecycle.transition(\"syncing\");\n    this.clearInitTimer();\n    this.initTimer = setTimeout(() => {\n      if (!this.isCurrent(generation) || this.isOpen) return;\n      const error = new OdlaError(\n        \"init_timeout\",\n        \"realtime initialization timed out\",\n        { retryable: true },\n      );\n      this.reportError(error);\n      this.failConnection(generation, error.code);\n    }, INIT_TIMEOUT_MS);\n  }\n\n  private onMessage(generation: number, data: string): void {\n    if (!this.isCurrent(generation)) return;\n    const parsed = parseServerMsg(data);\n    if (!parsed.ok) {\n      const error = serverFrameError(parsed);\n      this.reportError(error);\n      if (parsed.code === \"protocol_version\") this.terminate(error);\n      return;\n    }\n    const message = parsed.value;\n    if (!this.isOpen && message.op !== \"init-ok\" && message.op !== \"error\") {\n      return;\n    }\n    if (message.op === \"init-ok\") {\n      if (this.lifecycle.snapshot().state !== \"syncing\") return;\n      this.clearInitTimer();\n      this.isOpen = true;\n      this.lifecycle.resetAttempts();\n      this.health.connected();\n      this.onServerMessage(message);\n      this.outbox.flushNonMutations((raw) => this.transport?.send(raw));\n      this.health.queue();\n      this.onConnectionSynced();\n      this.lifecycle.transition(\"synced\");\n      this.health.start();\n      return;\n    }\n    this.health.serverFrame(message);\n    this.onServerMessage(message);\n  }\n\n  protected send(message: ClientMsg): void {\n    const raw = JSON.stringify(message);\n    if (this.isOpen && this.transport) this.transport.send(raw);\n    else if (!this.outbox.enqueue(raw)) {\n      this.health.queue(true);\n      const error = new OdlaError(\n        \"outbox_overflow\",\n        \"realtime outbox limit exceeded\",\n      );\n      this.reportError(error);\n      this.terminate(error);\n    } else {\n      this.health.queue();\n    }\n  }\n\n  close(): void {\n    this.clearTimers();\n    this.health.clear();\n    this.isOpen = false;\n    const transport = this.transport;\n    this.transport = null;\n    this.generation += 1;\n    this.lifecycle.close();\n    transport?.close();\n  }\n\n  connectionStatus(): ConnectionStatus {\n    return this.lifecycle.snapshot();\n  }\n\n  connectionHealth(): ConnectionHealth {\n    return this.health.snapshot();\n  }\n\n  protected terminate(error: OdlaError): void {\n    this.clearTimers();\n    this.health.clear();\n    this.isOpen = false;\n    this.outbox.clear();\n    this.health.queue();\n    this.onTerminalError(error);\n    const transport = this.transport;\n    this.transport = null;\n    this.generation += 1;\n    this.lifecycle.close(error.code);\n    transport?.close();\n  }\n\n  protected reportError(error: OdlaError): void {\n    this.health.error(error.code);\n    try {\n      this.onError?.(error);\n    } catch {\n      // Error observers cannot break recovery.\n    }\n  }\n\n  private onClose(generation: number, errorCode?: string): void {\n    if (\n      generation !== this.generation ||\n      this.closedGeneration === generation\n    ) {\n      return;\n    }\n    this.closedGeneration = generation;\n    this.clearInitTimer();\n    this.health.clear();\n    this.isOpen = false;\n    this.transport = null;\n    if (this.lifecycle.isClosed) {\n      this.lifecycle.transition(\"closed\", errorCode);\n      return;\n    }\n    this.lifecycle.backoff(errorCode);\n  }\n\n  private failConnection(generation: number, errorCode: string): void {\n    if (!this.isCurrent(generation)) return;\n    const transport = this.transport;\n    this.onClose(generation, errorCode);\n    transport?.close();\n  }\n\n  private isCurrent(generation: number): boolean {\n    return (\n      !this.lifecycle.isClosed &&\n      generation === this.generation &&\n      this.closedGeneration !== generation\n    );\n  }\n\n  private clearInitTimer(): void {\n    if (!this.initTimer) return;\n    clearTimeout(this.initTimer);\n    this.initTimer = null;\n  }\n\n  private clearTimers(): void {\n    this.clearInitTimer();\n    this.lifecycle.cancelReconnect();\n  }\n}\n","import { uuidv7 } from \"@odla/protocol\";\nimport type { Op } from \"@odla/protocol\";\n\nexport interface PendingMutation {\n  mutationId: string;\n  ops: Op[];\n}\n\n/**\n * The optimistic mutation pipeline: unacked mutations plus their promise\n * waiters. The client overlays `ops()` onto every confirmed snapshot, replays\n * `pending` after a reconnect (post-epoch-check), and settles waiters on\n * ack/reject. Extracted from SyncClient so each file owns one concern.\n */\nexport class MutationQueue {\n  pending: PendingMutation[] = [];\n  private waiters = new Map<string, { resolve: (txId: number) => void; reject: (e: Error) => void }>();\n\n  /** Every unacked op, in submission order — the optimistic overlay input. */\n  ops(): Op[] {\n    return this.pending.flatMap((p) => p.ops);\n  }\n\n  enqueue(ops: Op[], mutationId = uuidv7()): { mutationId: string; promise: Promise<number> } {\n    this.pending.push({ mutationId, ops });\n    const promise = new Promise<number>((resolve, reject) => this.waiters.set(mutationId, { resolve, reject }));\n    return { mutationId, promise };\n  }\n\n  ack(mutationId: string, txId: number): void {\n    this.pending = this.pending.filter((p) => p.mutationId !== mutationId);\n    this.waiters.get(mutationId)?.resolve(txId);\n    this.waiters.delete(mutationId);\n  }\n\n  reject(mutationId: string, e: Error): void {\n    this.pending = this.pending.filter((p) => p.mutationId !== mutationId);\n    this.waiters.get(mutationId)?.reject(e);\n    this.waiters.delete(mutationId);\n  }\n\n  /** History rewound (PITR): discard every pending mutation, rejecting its\n   * waiter loudly — replaying into the restored history would corrupt it. */\n  discardAll(e: Error): void {\n    const stale = this.pending;\n    this.pending = [];\n    for (const p of stale) {\n      this.waiters.get(p.mutationId)?.reject(e);\n      this.waiters.delete(p.mutationId);\n    }\n  }\n\n  /** Terminal client error: settle every waiter and clear the queue. */\n  failAll(e: Error): void {\n    for (const w of this.waiters.values()) w.reject(e);\n    this.waiters.clear();\n    this.pending = [];\n  }\n}\n","import type { InstaQLQuery, Op, QueryResult } from \"@odla/protocol\";\n\n/** Snapshot persisted for offline/instant-reload (confirmed results + unacked\n * mutations + the durable clientId so replay stays idempotent across reloads). */\nexport interface PersistedState {\n  clientId: string;\n  lastSeenTx: number;\n  pending: Array<{ mutationId: string; ops: Op[] }>;\n  cache: Array<[string, QueryResult]>; // queryKey -> confirmed result\n  /** Server sync epoch. Changes only when the app's history was rewound (PITR\n   * restore) — on mismatch the cache/pending/watermark are discarded. */\n  epoch?: number;\n}\nexport interface PersistAdapter {\n  load(): Promise<PersistedState | null>;\n  save(state: PersistedState): void | Promise<void>;\n}\n\n/** Stable JSON (sorted keys) so equivalent queries share one cache entry.\n * Internal — used by the sync client for cache keys. */\nexport function stableStringify(v: unknown): string {\n  if (v === null || typeof v !== \"object\") return JSON.stringify(v) ?? \"null\";\n  if (Array.isArray(v)) return \"[\" + v.map(stableStringify).join(\",\") + \"]\";\n  const keys = Object.keys(v as Record<string, unknown>).sort();\n  return \"{\" + keys.map((k) => JSON.stringify(k) + \":\" + stableStringify((v as Record<string, unknown>)[k])).join(\",\") + \"}\";\n}\nexport const queryKey = (q: InstaQLQuery): string => stableStringify(q);\n\n/** IndexedDB-backed persistence keyed by appId. No-ops where IndexedDB is absent. */\nexport function indexedDbAdapter(appId: string): PersistAdapter {\n  const DB_NAME = \"odla\";\n  const STORE = \"kv\";\n  const KEY = `app:${appId}`;\n  const hasIDB = typeof indexedDB !== \"undefined\";\n  const openDb = (): Promise<IDBDatabase> =>\n    new Promise((resolve, reject) => {\n      const req = indexedDB.open(DB_NAME, 1);\n      req.onupgradeneeded = () => req.result.createObjectStore(STORE);\n      req.onsuccess = () => resolve(req.result);\n      req.onerror = () => reject(req.error);\n    });\n  return {\n    async load() {\n      if (!hasIDB) return null;\n      try {\n        const db = await openDb();\n        return await new Promise<PersistedState | null>((resolve) => {\n          const r = db.transaction(STORE, \"readonly\").objectStore(STORE).get(KEY);\n          r.onsuccess = () => resolve((r.result as PersistedState) ?? null);\n          r.onerror = () => resolve(null);\n        });\n      } catch {\n        return null;\n      }\n    },\n    async save(state) {\n      if (!hasIDB) return;\n      try {\n        const db = await openDb();\n        await new Promise<void>((resolve) => {\n          const tx = db.transaction(STORE, \"readwrite\");\n          tx.objectStore(STORE).put(state, KEY);\n          tx.oncomplete = () => resolve();\n          tx.onerror = () => resolve();\n        });\n      } catch {\n        // best-effort\n      }\n    },\n  };\n}\n","import type { Entity, Json, NamespaceDiff, Op, QueryResult } from \"@odla/protocol\";\n\n// ---------------------------------------------------------------------------\n// Optimistic overlay (client mirror of the store's op semantics, top-level)\n// ---------------------------------------------------------------------------\nfunction deepMerge(base: Json, patch: Json): Json {\n  if (\n    typeof base !== \"object\" || base === null || Array.isArray(base) ||\n    typeof patch !== \"object\" || patch === null || Array.isArray(patch)\n  ) {\n    return patch;\n  }\n  const out: { [k: string]: Json } = { ...base };\n  for (const [k, v] of Object.entries(patch)) {\n    if (v === null) delete out[k];\n    else out[k] = k in out ? deepMerge(out[k]!, v) : v;\n  }\n  return out;\n}\n\nexport function overlay(result: QueryResult, ops: Op[]): QueryResult {\n  const out = structuredClone(result) as QueryResult;\n  for (const op of ops) {\n    const arr = out[op.ns];\n    if (!Array.isArray(arr)) continue; // only namespaces present in this query are overlaid\n    const id = typeof op.id === \"string\" ? op.id : null;\n    if (!id) continue; // lookup() refs are resolved server-side\n    if (op.t === \"update\") {\n      const e = arr.find((x) => x.id === id);\n      if (e) Object.assign(e, op.attrs);\n      else arr.push({ id, ...op.attrs });\n    } else if (op.t === \"merge\") {\n      const e = arr.find((x) => x.id === id);\n      const merged = deepMerge((e ?? {}) as Json, op.attrs as Json) as Record<string, unknown>;\n      if (e) Object.assign(e, merged);\n      else arr.push({ id, ...merged });\n    } else if (op.t === \"delete\") {\n      out[op.ns] = arr.filter((x) => x.id !== id);\n    } else if (op.t === \"retract\") {\n      const e = arr.find((x) => x.id === id);\n      if (e) for (const label of op.attrs) delete (e as Record<string, unknown>)[label];\n    } else if (op.t === \"increment\") {\n      const e = arr.find((x) => x.id === id);\n      if (e) {\n        const value = e[op.attr];\n        const current = typeof value === \"number\" ? value : 0;\n        e[op.attr] = current + op.by;\n      }\n    }\n    // link/unlink overlay relations server-side only (v1)\n  }\n  return out;\n}\n\n/** Apply an incremental `query-diff` to a confirmed result, preserving the\n * server's ordering. Internal — used by the sync client's diff handler. */\nexport function applyDiff(confirmed: QueryResult, diff: Record<string, NamespaceDiff>): QueryResult {\n  const next: QueryResult = { ...confirmed };\n  for (const [ns, d] of Object.entries(diff)) {\n    const byId = new Map((next[ns] ?? []).map((e) => [e.id, e] as const));\n    for (const id of d.removed) byId.delete(id);\n    for (const e of d.changed) byId.set(e.id, e);\n    next[ns] = d.order.map((id) => byId.get(id)).filter((e): e is Entity => e !== undefined);\n  }\n  return next;\n}\n","import type { InstaQLQuery, QueryResult, QueryTotals } from \"@odla/protocol\";\nimport { queryKey } from \"./persist\";\nimport type { QueryCallback } from \"./tx\";\n\n/**\n * One subscriber's handle. A wrapper object rather than the bare callback:\n * two subscribers passing the SAME memoized function must still count as two\n * references, or the first unsubscribe would silently kill the second.\n */\nexport interface SubToken {\n  readonly cb: QueryCallback;\n}\n\n/** A multiplexed wire subscription: every subscriber of one distinct query. */\nexport interface SubEntry {\n  /** The single wire subId all sharers ride on. */\n  subId: string;\n  /** Stable queryKey — identical to the confirmed-result cache's key. */\n  readonly key: string;\n  readonly query: InstaQLQuery;\n  readonly tokens: Set<SubToken>;\n  /** Last confirmed server result for this query (pre-overlay). */\n  confirmed?: QueryResult;\n  /** Last totals the server reported, replayed on every notify so an overlay\n   * repaint does not blank a pager that is showing \"of 12\". */\n  totals?: QueryTotals;\n}\n\n/**\n * Client-side identical-query multiplexer. N subscribers of the same InstaQL\n * query (keyed by stable stringify, so property order is irrelevant) share\n * ONE wire subscription: one subscribe frame, one server-side ref, one\n * result/diff stream — instead of N of each, which also burned through the\n * per-socket MAX_ACTIVE_SUBSCRIPTIONS budget.\n */\nexport class SubRegistry {\n  private byKey = new Map<string, SubEntry>();\n  private bySubId = new Map<string, SubEntry>();\n\n  /** Join (or create) the entry for `query`. `isNew` = a wire subscribe is needed. */\n  add(query: InstaQLQuery, cb: QueryCallback, mintId: () => string): { entry: SubEntry; token: SubToken; isNew: boolean } {\n    const key = queryKey(query);\n    let entry = this.byKey.get(key);\n    const isNew = !entry;\n    if (!entry) {\n      entry = { subId: mintId(), key, query, tokens: new Set() };\n      this.byKey.set(key, entry);\n      this.bySubId.set(entry.subId, entry);\n    }\n    const token: SubToken = { cb };\n    entry.tokens.add(token);\n    return { entry, token, isNew };\n  }\n\n  /** Drop one subscriber. True when the last reference left and the entry\n   * retired — that is the only moment a wire unsubscribe should be sent. */\n  remove(entry: SubEntry, token: SubToken): boolean {\n    if (!entry.tokens.delete(token)) return false; // idempotent double-unsubscribe\n    if (entry.tokens.size > 0) return false;\n    this.byKey.delete(entry.key);\n    this.bySubId.delete(entry.subId);\n    return true;\n  }\n\n  bySub(subId: string): SubEntry | undefined {\n    return this.bySubId.get(subId);\n  }\n\n  all(): IterableIterator<SubEntry> {\n    return this.byKey.values();\n  }\n}\n","import { MAX_ACTIVE_SUBSCRIPTIONS, uuidv7 } from \"@odla/protocol\";\nimport type { ClientMsg, InstaQLQuery, NamespaceDiff, Op, QueryResult, QueryTotals, SubResume } from \"@odla/protocol\";\nimport { applyDiff, overlay } from \"./overlay\";\nimport { queryKey } from \"./persist\";\nimport { SubRegistry, type SubEntry } from \"./sub-registry\";\nimport type { QueryCallback } from \"./tx\";\n\n/** What the store needs from the client: wire access + overlay inputs. */\nexport interface QueryStoreHost {\n  send(msg: ClientMsg): void;\n  isOpen(): boolean;\n  pendingOps(): Op[];\n}\n\n/**\n * Owns all live-query state: the identical-query multiplexer, the confirmed\n * result cache, microtask-coalesced subscribe flushing (one subscribe-batch\n * frame when the server advertised the \"batch\" cap, individual frames\n * otherwise), and result/diff application. Extracted from SyncClient so each\n * file owns one concern.\n */\nexport class QueryStore {\n  private readonly registry = new SubRegistry();\n  /** queryKey -> last confirmed result; also the persisted snapshot source. */\n  cache = new Map<string, QueryResult>();\n  serverCaps = new Set<string>();\n  private queue: SubEntry[] = [];\n  private flushScheduled = false;\n\n  constructor(private readonly host: QueryStoreHost) {}\n\n  subscribe(query: InstaQLQuery, cb: QueryCallback): () => void {\n    const { entry, token, isNew } = this.registry.add(query, cb, uuidv7);\n    if (isNew) {\n      entry.confirmed = this.cache.get(entry.key);\n      if (this.host.isOpen()) {\n        // Coalesce same-tick subscribes into one flush (and, cap permitting,\n        // one frame) instead of a frame per hook.\n        this.queue.push(entry);\n        this.scheduleFlush();\n      }\n    }\n    if (entry.confirmed) {\n      // Instant render from shared state — only the JOINING token, and only\n      // if it is still subscribed when the microtask runs.\n      queueMicrotask(() => {\n        if (entry.tokens.has(token) && entry.confirmed) token.cb(overlay(entry.confirmed, this.host.pendingOps()));\n      });\n    }\n    return () => {\n      if (!this.registry.remove(entry, token)) return;\n      const queued = this.queue.indexOf(entry);\n      if (queued >= 0) {\n        this.queue.splice(queued, 1); // subscribed+gone in one tick: never hit the wire\n        return;\n      }\n      if (this.host.isOpen()) this.host.send({ v: 1, op: \"unsubscribe\", subId: entry.subId });\n    };\n  }\n\n  private scheduleFlush(): void {\n    if (this.flushScheduled) return;\n    this.flushScheduled = true;\n    queueMicrotask(() => {\n      this.flushScheduled = false;\n      const entries = this.queue;\n      this.queue = [];\n      if (!entries.length || !this.host.isOpen()) return;\n      if (this.serverCaps.has(\"batch\") && entries.length > 1) {\n        for (let i = 0; i < entries.length; i += MAX_ACTIVE_SUBSCRIPTIONS) {\n          const chunk = entries.slice(i, i + MAX_ACTIVE_SUBSCRIPTIONS);\n          this.host.send({ v: 1, op: \"subscribe-batch\", subs: chunk.map((e) => ({ subId: e.subId, query: e.query })) });\n        }\n      } else {\n        for (const e of entries) this.host.send({ v: 1, op: \"subscribe\", subId: e.subId, query: e.query });\n      }\n    });\n  }\n\n  /** Synchronous cached read (confirmed ⊕ pending overlay), or null. */\n  peek(query: InstaQLQuery): QueryResult | null {\n    const base = this.cache.get(queryKey(query));\n    return base ? overlay(base, this.host.pendingOps()) : null;\n  }\n\n  notifyEntry(entry: SubEntry): void {\n    if (!entry.confirmed) return;\n    const view = overlay(entry.confirmed, this.host.pendingOps());\n    for (const t of entry.tokens) t.cb(view, entry.totals);\n  }\n\n  notifyAll(): void {\n    for (const e of this.registry.all()) this.notifyEntry(e);\n  }\n\n  /** Apply a confirmed full result for a wire sub. False when unknown (raced\n   * an unsubscribe) — the caller then skips watermark/persist bookkeeping. */\n  confirm(subId: string, result: QueryResult, totals?: QueryTotals): boolean {\n    const e = this.registry.bySub(subId);\n    if (!e) return false;\n    e.confirmed = result;\n    e.totals = totals;\n    this.cache.set(e.key, result);\n    this.notifyEntry(e);\n    return true;\n  }\n\n  applyDiffFor(subId: string, diff: Record<string, NamespaceDiff>, totals?: QueryTotals): boolean {\n    const e = this.registry.bySub(subId);\n    if (!e || !e.confirmed) return false;\n    e.confirmed = applyDiff(e.confirmed, diff);\n    // A diff frame carries totals whole (a count has no incremental form); an\n    // absent field means the query never asked for one.\n    e.totals = totals;\n    this.cache.set(e.key, e.confirmed);\n    this.notifyEntry(e);\n    return true;\n  }\n\n  /** One resume item per DISTINCT query (all sharers ride the same subId). */\n  resumeList(): SubResume[] {\n    return [...this.registry.all()].map((e) => ({ subId: e.subId, query: e.query }));\n  }\n\n  /** Fresh connection: caps are per-connection, and anything still queued\n   * rides the init resume instead of a late subscribe frame. */\n  onReconnect(): void {\n    this.serverCaps.clear();\n    this.queue = [];\n  }\n\n  /**\n   * Reconcile subscriptions created or removed while the init handshake was in\n   * flight. Entries already carried by init.resume need no duplicate frame.\n   */\n  onSynced(resumedSubIds: ReadonlySet<string>): void {\n    const current = [...this.registry.all()];\n    const currentIds = new Set(current.map((entry) => entry.subId));\n    for (const subId of resumedSubIds) {\n      if (!currentIds.has(subId)) this.host.send({ v: 1, op: \"unsubscribe\", subId });\n    }\n    for (const entry of current) {\n      if (!resumedSubIds.has(entry.subId)) this.queue.push(entry);\n    }\n    if (this.queue.length) this.scheduleFlush();\n  }\n\n  /** Epoch bump (PITR): every derived result is invalid. */\n  clearConfirmed(): void {\n    this.cache.clear();\n    for (const e of this.registry.all()) e.confirmed = undefined;\n  }\n\n  /** After hydrate: seed live entries from the restored cache and render. */\n  seedFromCache(): void {\n    for (const e of this.registry.all()) {\n      const cached = this.cache.get(e.key);\n      if (cached) {\n        e.confirmed = cached;\n        this.notifyEntry(e);\n      }\n    }\n  }\n}\n","import type { ClientMsg, Json } from \"@odla/protocol\";\n\n/** An ephemeral room: presence + fire-and-forget events, never persisted. */\nexport interface Room {\n  /** Set (or update) this client's presence in the room. */\n  setPresence(presence: Json): void;\n  /** Broadcast a transient event to other peers in the room. */\n  publish(event: Json): void;\n  /** Subscribe to the room's full presence roster (fires on any change). */\n  onPresence(cb: (peers: Array<{ peerId: string; presence: Json }>) => void): () => void;\n  /** Subscribe to events published by other peers. */\n  onEvent(cb: (from: string, event: Json) => void): () => void;\n  /** Leave the room (clears this client's presence). */\n  leave(): void;\n}\n\ntype PresenceCb = (peers: Array<{ peerId: string; presence: Json }>) => void;\ntype EventCb = (from: string, event: Json) => void;\ninterface RoomState {\n  presence?: Json;\n  presenceCbs: Set<PresenceCb>;\n  eventCbs: Set<EventCb>;\n}\n\n/**\n * Client-side registry of ephemeral rooms (presence + events). Owns no transport;\n * it emits messages through the injected `send` (so buffering while offline stays\n * the sync client's concern) and is fed inbound frames by the client's dispatcher.\n */\nexport class RoomRegistry {\n  private rooms = new Map<string, RoomState>();\n  constructor(private send: (msg: ClientMsg) => void) {}\n\n  private getRoom(room: string): RoomState {\n    let r = this.rooms.get(room);\n    if (!r) {\n      r = { presenceCbs: new Set(), eventCbs: new Set() };\n      this.rooms.set(room, r);\n    }\n    return r;\n  }\n\n  setPresence(room: string, presence: Json): void {\n    this.getRoom(room).presence = presence;\n    this.send({ v: 1, op: \"presence-set\", room, presence });\n  }\n  clear(room: string): void {\n    const r = this.rooms.get(room);\n    if (r) r.presence = undefined;\n    this.send({ v: 1, op: \"presence-clear\", room });\n  }\n  publish(room: string, event: Json): void {\n    this.send({ v: 1, op: \"room-publish\", room, event });\n  }\n  onPresence(room: string, cb: PresenceCb): () => void {\n    const r = this.getRoom(room);\n    r.presenceCbs.add(cb);\n    return () => r.presenceCbs.delete(cb);\n  }\n  onEvent(room: string, cb: EventCb): () => void {\n    const r = this.getRoom(room);\n    r.eventCbs.add(cb);\n    return () => r.eventCbs.delete(cb);\n  }\n\n  /** Deliver an inbound presence roster to this room's subscribers. */\n  dispatchPresence(room: string, peers: Array<{ peerId: string; presence: Json }>): void {\n    const r = this.rooms.get(room);\n    if (r) for (const cb of r.presenceCbs) cb(peers);\n  }\n  /** Deliver an inbound peer event to this room's subscribers. */\n  dispatchEvent(room: string, from: string, event: Json): void {\n    const r = this.rooms.get(room);\n    if (r) for (const cb of r.eventCbs) cb(from, event);\n  }\n\n  /** Re-assert presence in rejoined rooms after a (re)connect — ephemeral state\n   * lived only client-side, so the server has forgotten it. */\n  reassert(): void {\n    for (const [room, r] of this.rooms) {\n      if (r.presence !== undefined) {\n        this.send({ v: 1, op: \"presence-set\", room, presence: r.presence });\n      }\n    }\n  }\n}\n","import { errorFromShape, OdlaError, PROTOCOL_VERSION, uuidv7 } from \"@odla/protocol\";\nimport type {\n  ClientMsg,\n  InstaQLQuery,\n  Op,\n  QueryResult,\n  ServerMsg,\n} from \"@odla/protocol\";\nimport { RealtimeConnection } from \"./client-connection\";\nimport type { InitOptions } from \"./client-options\";\nimport { MutationQueue } from \"./mutations\";\nimport { indexedDbAdapter, type PersistAdapter } from \"./persist\";\nimport { QueryStore } from \"./query-store\";\nimport { RoomRegistry } from \"./rooms\";\nimport type { QueryCallback } from \"./tx\";\nexport type {\n  ClientTelemetryEvent,\n  ConnectionHealth,\n  ConnectionState,\n  ConnectionStatus,\n  FreshnessMode,\n  InitOptions,\n} from \"./client-options\";\n\nexport class SyncClient extends RealtimeConnection {\n  private clientId = uuidv7();\n  private lastSeenTx = 0;\n  private readonly queries = new QueryStore({\n    send: (message) => this.send(message),\n    isOpen: () => this.isOpen,\n    pendingOps: () => this.mq.ops(),\n  });\n  private readonly mq = new MutationQueue();\n  readonly rooms = new RoomRegistry((message) => this.send(message));\n  private initializedSubIds = new Set<string>();\n  private adapter?: PersistAdapter;\n  private persistScheduled = false;\n  private epoch: number | null = null;\n\n  constructor(opts: InitOptions) {\n    const endpoint = (opts.endpoint ?? \"ws://localhost:8787\").replace(/\\/$/, \"\");\n    super(opts, `${endpoint}/app/${opts.appId}/connect`);\n    if (opts.persist) {\n      this.adapter =\n        opts.persist === true ? indexedDbAdapter(opts.appId) : opts.persist;\n      void this.hydrateThenConnect();\n    } else {\n      this.connect();\n    }\n  }\n\n  private async hydrateThenConnect(): Promise<void> {\n    const state = await this.adapter!.load().catch(() => null);\n    if (state) {\n      this.clientId = state.clientId ?? this.clientId;\n      this.lastSeenTx = state.lastSeenTx ?? 0;\n      this.mq.pending = state.pending ?? [];\n      this.queries.cache = new Map(state.cache ?? []);\n      this.epoch = state.epoch ?? null;\n      this.queries.seedFromCache();\n    }\n    this.connect();\n  }\n\n  private schedulePersist(): void {\n    if (!this.adapter || this.persistScheduled) return;\n    this.persistScheduled = true;\n    queueMicrotask(() => {\n      this.persistScheduled = false;\n      void this.adapter!.save({\n        clientId: this.clientId,\n        lastSeenTx: this.lastSeenTx,\n        pending: this.mq.pending,\n        cache: [...this.queries.cache.entries()],\n        epoch: this.epoch ?? undefined,\n      });\n    });\n  }\n\n  protected onReconnectStart(): void {\n    this.queries.onReconnect();\n  }\n\n  protected createInitMessage(auth: string | undefined): ClientMsg {\n    const resume = this.queries.resumeList();\n    this.initializedSubIds = new Set(resume.map((entry) => entry.subId));\n    return {\n      v: PROTOCOL_VERSION,\n      op: \"init\",\n      clientId: this.clientId,\n      auth,\n      lastSeenTx: this.lastSeenTx,\n      resume,\n      caps: [\"diff\", \"batch\"],\n    };\n  }\n\n  protected onConnectionSynced(): void {\n    this.rooms.reassert();\n    this.schedulePersist();\n  }\n\n  protected onTerminalError(error: OdlaError): void {\n    this.mq.failAll(error);\n    this.queries.notifyAll();\n    this.schedulePersist();\n  }\n\n  protected onServerMessage(msg: ServerMsg): void {\n    switch (msg.op) {\n      case \"init-ok\": {\n        const serverEpoch = msg.epoch ?? 1;\n        if (this.epoch !== null && this.epoch !== serverEpoch) {\n          this.queries.clearConfirmed();\n          this.lastSeenTx = 0;\n          this.mq.discardAll(\n            new OdlaError(\n              \"history_restored\",\n              \"server history was restored; pending mutation was discarded\",\n            ),\n          );\n        }\n        this.epoch = serverEpoch;\n        this.lastSeenTx = Math.max(this.lastSeenTx, msg.currentTx);\n        if (msg.caps) this.queries.serverCaps = new Set(msg.caps);\n        this.queries.onSynced(this.initializedSubIds);\n        for (const pending of this.mq.pending) {\n          this.send({\n            v: 1,\n            op: \"transact\",\n            mutationId: pending.mutationId,\n            ops: pending.ops,\n          });\n        }\n        break;\n      }\n      case \"query-result\": {\n        if (this.queries.confirm(msg.subId, msg.result, msg.totals)) {\n          this.lastSeenTx = Math.max(this.lastSeenTx, msg.txId);\n          this.schedulePersist();\n        }\n        break;\n      }\n      case \"query-result-batch\": {\n        let applied = false;\n        for (const item of msg.results) {\n          applied =\n            this.queries.confirm(item.subId, item.result, item.totals) || applied;\n        }\n        if (applied) {\n          this.lastSeenTx = Math.max(this.lastSeenTx, msg.txId);\n          this.schedulePersist();\n        }\n        break;\n      }\n      case \"query-diff\": {\n        if (this.queries.applyDiffFor(msg.subId, msg.diff, msg.totals)) {\n          this.lastSeenTx = Math.max(this.lastSeenTx, msg.txId);\n          this.schedulePersist();\n        }\n        break;\n      }\n      case \"tx-ack\": {\n        this.mq.ack(msg.mutationId, msg.txId);\n        this.lastSeenTx = Math.max(this.lastSeenTx, msg.txId);\n        this.queries.notifyAll();\n        this.schedulePersist();\n        break;\n      }\n      case \"mutation-reject\": {\n        this.mq.reject(msg.mutationId, errorFromShape(msg.error));\n        this.queries.notifyAll();\n        this.schedulePersist();\n        break;\n      }\n      case \"presence\":\n        this.rooms.dispatchPresence(msg.room, msg.peers);\n        break;\n      case \"room-event\":\n        this.rooms.dispatchEvent(msg.room, msg.from, msg.event);\n        break;\n      case \"error\": {\n        const error = errorFromShape(msg.error);\n        this.reportError(error);\n        if (error.code === \"protocol_version\") this.terminate(error);\n        break;\n      }\n      default:\n        break;\n    }\n  }\n\n  subscribeQuery(query: InstaQLQuery, cb: QueryCallback): () => void {\n    return this.queries.subscribe(query, cb);\n  }\n\n  /** Synchronous read of the last confirmed result with optimistic overlay. */\n  peekQuery(query: InstaQLQuery): QueryResult | null {\n    return this.queries.peek(query);\n  }\n\n  transact(ops: Op[], mutationId?: string): Promise<number> {\n    const queued = this.mq.enqueue(ops, mutationId);\n    this.queries.notifyAll();\n    this.schedulePersist();\n    this.send({\n      v: 1,\n      op: \"transact\",\n      mutationId: queued.mutationId,\n      ops,\n    });\n    return queued.promise;\n  }\n}\n","import type { EntityRef, Json, Op, QueryResult, QueryTotals, Value } from \"@odla/protocol\";\n\n/** What a subscriber receives. `totals` is present only for queries whose nodes\n * asked for `count`; it is a second argument rather than a field on the result\n * so the plain `(result) => void` callback keeps working untouched. */\nexport type QueryCallback = (result: QueryResult, totals?: QueryTotals) => void;\n\n// ---------------------------------------------------------------------------\n// Transaction builder\n// ---------------------------------------------------------------------------\ntype Attrs = Record<string, Value>;\n\n/**\n * Chainable builder for one entity's mutations. Created via the {@link tx}\n * proxy (`tx.<namespace>[id]`), it accumulates ops in `ops`; each method\n * (`update`, `merge`, `delete`, `retract`, `link`, `unlink`) pushes one `Op`\n * and returns `this` so calls chain. Pass the chain (or an array of chains) to\n * `transact`.\n */\nexport class TxChain {\n  readonly ops: Op[] = [];\n  constructor(\n    private ns: string,\n    private id: EntityRef,\n  ) {}\n  update(attrs: Attrs): this {\n    this.ops.push({ t: \"update\", ns: this.ns, id: this.id, attrs });\n    return this;\n  }\n  merge(attrs: Record<string, Json>): this {\n    this.ops.push({ t: \"merge\", ns: this.ns, id: this.id, attrs });\n    return this;\n  }\n  delete(): this {\n    this.ops.push({ t: \"delete\", ns: this.ns, id: this.id });\n    return this;\n  }\n  /**\n   * Remove the named scalar/json attributes from this entity, returning them to\n   * the absence-of-triple state — the scalar sibling of {@link unlink}. Use it\n   * to CLEAR a value: a typed scalar attribute cannot store `null`, so\n   * `retract([\"dueAt\"])` is how you unset one. A no-op for attributes already\n   * absent; retracting a required attribute aborts the transaction.\n   */\n  retract(attrs: string[]): this {\n    this.ops.push({ t: \"retract\", ns: this.ns, id: this.id, attrs });\n    return this;\n  }\n  link(label: string, target: EntityRef): this {\n    this.ops.push({ t: \"link\", ns: this.ns, id: this.id, label, target });\n    return this;\n  }\n  unlink(label: string, target: EntityRef): this {\n    this.ops.push({ t: \"unlink\", ns: this.ns, id: this.id, label, target });\n    return this;\n  }\n}\n\nexport type TxInput = TxChain | Op | TxInput[];\n/**\n * Flatten a transaction input into the wire `Op[]`. Accepts a {@link TxChain}\n * (returns its accumulated `ops`), a bare `Op` literal (wrapped in a\n * single-element array), or an arbitrarily nested array of either, recursing to\n * produce one flat, ordered op list — the shape sent to the `transact` endpoint.\n */\nexport function flattenTx(input: TxInput): Op[] {\n  if (Array.isArray(input)) return input.flatMap(flattenTx);\n  if (input instanceof TxChain) return input.ops;\n  return [input];\n}\n\ntype NamespaceProxy = Record<string, TxChain>;\nexport const tx: Record<string, NamespaceProxy> = new Proxy(\n  {},\n  {\n    get(_t, ns: string): NamespaceProxy {\n      return new Proxy({}, { get: (_n, id: string): TxChain => new TxChain(ns, id) }) as NamespaceProxy;\n    },\n  },\n) as Record<string, NamespaceProxy>;\n","/**\n * @odla/core — framework-neutral client. Manages the WebSocket transport, the\n * query store, optimistic local apply, and rebase reconciliation. The transport\n * is injectable so sync logic is testable without a real socket.\n *\n * Optimism: a transaction is applied to the local overlay immediately and the\n * UI updates; the server is authoritative and pushes fresh snapshots. The\n * visible view is always `confirmed ⊕ replay(pending)`. An ack/reject drops the\n * pending mutation; the next rebase reflects the truth (rollback on reject).\n *\n * Split by concern (transport / persist / tx / overlay / rooms / client); this\n * module is the facade + public barrel — the surface consumers import.\n */\nimport {\n  assertProtocolResponse,\n  errorFromResponse,\n  PROTOCOL_VERSION,\n  PROTOCOL_VERSION_HEADER,\n  uuidv7,\n} from \"@odla/protocol\";\nimport type { AggregateResult, AggregateSpec, InstaQLQuery, QueryOpts, QueryResult } from \"@odla/protocol\";\nimport { SyncClient } from \"./client\";\nimport type { InitOptions } from \"./client\";\nimport { flattenTx, tx, TxChain } from \"./tx\";\nimport type { QueryCallback, TxInput } from \"./tx\";\nimport type { Room } from \"./rooms\";\n\nexport type { Transport, TransportHandlers, TransportFactory } from \"./transport\";\nexport type { PersistedState, PersistAdapter } from \"./persist\";\nexport { indexedDbAdapter } from \"./persist\";\nexport { TxChain, flattenTx, tx } from \"./tx\";\nexport type { TxInput, QueryCallback } from \"./tx\";\nexport { overlay } from \"./overlay\";\nexport type { Room } from \"./rooms\";\nexport type {\n  ClientTelemetryEvent,\n  ConnectionHealth,\n  FreshnessMode,\n  InitOptions,\n} from \"./client\";\nexport { uuidv7 };\nexport { OdlaError } from \"@odla/protocol\";\n\nexport interface Db {\n  tx: Record<string, Record<string, TxChain>>;\n  subscribeQuery(query: InstaQLQuery, cb: QueryCallback): () => void;\n  /** Synchronous cached read (confirmed ⊕ pending overlay) for a warm first\n   * paint; null when the query has never resolved. Optional so existing\n   * Db-shaped test doubles keep compiling. */\n  peekQuery?(query: InstaQLQuery): QueryResult | null;\n  transact(input: TxInput, opts?: { mutationId?: string }): Promise<number>;\n  /** One-shot aggregate (count/sum/avg/min/max) over a namespace's matching rows. */\n  aggregate(ns: string, spec: AggregateSpec, opts?: QueryOpts): Promise<AggregateResult>;\n  /** Join/get an ephemeral presence room (cursors, typing, who's-online). */\n  room(name: string): Room;\n  /** Current realtime lifecycle; optional for compatible Db-shaped adapters. */\n  connectionStatus?(): import(\"./client-options\").ConnectionStatus;\n  /** Content-free realtime freshness/RTT/queue health for UI and telemetry. */\n  connectionHealth?(): import(\"./client-options\").ConnectionHealth;\n  close(): void;\n  id(): string;\n}\n\nexport function init(opts: InitOptions): Db {\n  const client = new SyncClient(opts);\n  const httpBase = (opts.endpoint ?? \"ws://localhost:8787\").replace(/\\/$/, \"\").replace(/^ws/, \"http\");\n  const doFetch = opts.fetch ?? globalThis.fetch;\n  return {\n    tx,\n    subscribeQuery: (q, cb) => client.subscribeQuery(q, cb),\n    peekQuery: (q) => client.peekQuery(q),\n    transact: (input, o) => client.transact(flattenTx(input), o?.mutationId),\n    aggregate: async (ns, spec, qopts) => {\n      const token = opts.getToken ? await opts.getToken() : null;\n      const headers: Record<string, string> = {\n        \"content-type\": \"application/json\",\n        [PROTOCOL_VERSION_HEADER]: String(PROTOCOL_VERSION),\n      };\n      if (token) headers.authorization = `Bearer ${token}`;\n      const r = await doFetch(`${httpBase}/app/${opts.appId}/aggregate`, {\n        method: \"POST\",\n        headers,\n        body: JSON.stringify({ ns, opts: qopts, aggregate: spec }),\n      });\n      assertProtocolResponse(r);\n      if (r.ok === false) throw await errorFromResponse(r, \"aggregate\");\n      const j = (await r.json()) as { aggregate: AggregateResult };\n      return j.aggregate;\n    },\n    room: (name) => ({\n      setPresence: (presence) => client.rooms.setPresence(name, presence),\n      publish: (event) => client.rooms.publish(name, event),\n      onPresence: (cb) => client.rooms.onPresence(name, cb),\n      onEvent: (cb) => client.rooms.onEvent(name, cb),\n      leave: () => client.rooms.clear(name),\n    }),\n    connectionStatus: () => client.connectionStatus(),\n    connectionHealth: () => client.connectionHealth(),\n    close: () => client.close(),\n    id: () => uuidv7(),\n  };\n}\n","/**\n * Realtime, permission-governed browser/Worker client.\n *\n * Unlike the root admin entry, this client accepts an end-user token through\n * `getToken`; it must never receive a full `odla_sk_` application key.\n */\nimport { init as coreInit, overlay as coreOverlay, tx as coreTx } from \"@odla/core\";\nimport type * as CoreApi from \"@odla/core\";\nimport type * as ProtocolApi from \"@odla/protocol\";\n\n/** Create a permission-governed realtime client using an end-user token callback. */\nexport const init = coreInit;\n/** Namespace/id proxy for building optimistic realtime transaction operations. */\nexport const tx = coreTx;\n/** Apply optimistic transaction operations over a query result for immediate UI feedback. */\nexport const overlay = coreOverlay;\nexport { flattenTx, TxChain, indexedDbAdapter, uuidv7, OdlaError } from \"@odla/core\";\n/** Connected realtime database client returned by `init`. */\nexport type Db = CoreApi.Db;\n/** Realtime client endpoint, app identity, token, transport, persistence, and error options. */\nexport type InitOptions = CoreApi.InitOptions;\n/** Content-free live/reconnecting/stale/closed state, RTT, and queue snapshot. */\nexport type ConnectionHealth = CoreApi.ConnectionHealth;\n/** Low-cardinality connection event suitable for an observability adapter. */\nexport type ClientTelemetryEvent = CoreApi.ClientTelemetryEvent;\n/** Freshness mode shared by connection health callbacks and UI indicators. */\nexport type FreshnessMode = CoreApi.FreshnessMode;\n/** Optional persisted-query adapter contract such as the bundled IndexedDB implementation. */\nexport type PersistAdapter = CoreApi.PersistAdapter;\n/** Callback invoked with the current optimistic query result. */\nexport type QueryCallback = CoreApi.QueryCallback;\n/** Realtime transport contract used to connect, send, and close a session. */\nexport type Transport = CoreApi.Transport;\n/** Injectable factory for constructing a realtime transport from handlers. */\nexport type TransportFactory = CoreApi.TransportFactory;\n/** Lifecycle and message handlers supplied to a realtime transport. */\nexport type TransportHandlers = CoreApi.TransportHandlers;\n/** Transaction builder output accepted by the optimistic client. */\nexport type TxInput = CoreApi.TxInput;\nexport type {\n  PersistedState,\n  Room,\n} from \"@odla/core\";\n/** Result shape returned by a bounded aggregate query. */\nexport type AggregateResult = ProtocolApi.AggregateResult;\n/** One graph entity with an id plus selected attributes and relations. */\nexport type Entity = ProtocolApi.Entity;\n/** Per-node filters, ordering, limits, offsets, and full-text search options. */\nexport type QueryOpts = ProtocolApi.QueryOpts;\n/** Data object produced by an InstaQL query shape. */\nexport type QueryResult = ProtocolApi.QueryResult;\nexport type {\n  AggregateSpec,\n  InstaQLQuery,\n} from \"@odla/protocol\";\n"]}