@tinycloud/sdk-services 3.3.0-beta.7 → 3.3.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.
Files changed (39) hide show
  1. package/dist/{BaseService-Cc6Ueicm.d.cts → BaseService-BhfKzKke.d.cts} +5 -1
  2. package/dist/{BaseService-DOdXd7sr.d.ts → BaseService-x4AFZiEa.d.ts} +5 -1
  3. package/dist/encryption/index.cjs +18 -5
  4. package/dist/encryption/index.cjs.map +1 -1
  5. package/dist/encryption/index.d.cts +2 -2
  6. package/dist/encryption/index.d.ts +2 -2
  7. package/dist/encryption/index.js +18 -5
  8. package/dist/encryption/index.js.map +1 -1
  9. package/dist/index.cjs +911 -797
  10. package/dist/index.cjs.map +1 -1
  11. package/dist/index.d.cts +95 -11
  12. package/dist/index.d.ts +95 -11
  13. package/dist/index.js +911 -797
  14. package/dist/index.js.map +1 -1
  15. package/dist/internal/decrypt-transport-response-error.d.cts +1 -1
  16. package/dist/internal/decrypt-transport-response-error.d.ts +1 -1
  17. package/dist/kv/index.cjs +72 -80
  18. package/dist/kv/index.cjs.map +1 -1
  19. package/dist/kv/index.d.cts +4 -5
  20. package/dist/kv/index.d.ts +4 -5
  21. package/dist/kv/index.js +72 -80
  22. package/dist/kv/index.js.map +1 -1
  23. package/dist/kv/replication/index.cjs +6 -5
  24. package/dist/kv/replication/index.cjs.map +1 -1
  25. package/dist/kv/replication/index.d.cts +3 -3
  26. package/dist/kv/replication/index.d.ts +3 -3
  27. package/dist/kv/replication/index.js +6 -5
  28. package/dist/kv/replication/index.js.map +1 -1
  29. package/dist/{scope-B-m6cKH-.d.ts → scope-BHTkk5Yk.d.ts} +13 -2
  30. package/dist/{scope-B7oeKdLM.d.cts → scope-DMhalRFn.d.cts} +13 -2
  31. package/dist/sql/index.cjs +30 -16
  32. package/dist/sql/index.cjs.map +1 -1
  33. package/dist/sql/index.d.cts +2 -2
  34. package/dist/sql/index.d.ts +2 -2
  35. package/dist/sql/index.js +30 -16
  36. package/dist/sql/index.js.map +1 -1
  37. package/dist/{types-BjH0ZtGy.d.cts → types-eVS1Whuf.d.cts} +24 -4
  38. package/dist/{types-BjH0ZtGy.d.ts → types-eVS1Whuf.d.ts} +24 -4
  39. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/kv/replication/index.ts","../../../src/kv/replication/constants.ts","../../../src/kv/replication/identity.ts","../../../src/kv/replication/prefix.ts","../../../src/kv/replication/scope.ts","../../../src/errors.ts","../../../src/types.ts","../../../src/kv/replication/outcome.ts","../../../src/kv/replication/pendingWrites.ts","../../../src/kv/replication/localResponse.ts","../../../src/kv/replication/listLocal.ts","../../../src/kv/replication/events.ts","../../../src/kv/replication/grantPolicyConstants.ts","../../../src/kv/replication/grantPolicy.ts","../../../src/kv/replication/controller.ts","../../../src/kv/replication/memoryPendingStore.ts"],"sourcesContent":["export type {\n AuthorityRefusal,\n KVListPage,\n KVReadThrough,\n KVReplicaHandle,\n KVReplicaSpec,\n KVReplicaStorage,\n KVReplicationController,\n KVReplicationDeps,\n LocalGetResult,\n LocalListResult,\n LocalReadMeta,\n LocalReplicaStatus,\n LocalSyncResult,\n PendingWriteRecord,\n PendingWriteState,\n PendingWriteStore,\n PinnedKey,\n PurgeTarget,\n ReplicaAuthorityState,\n ReplicaCoverage,\n ReplicaDevice,\n ReplicaGatedHandle,\n ReplicaGatedSpec,\n ReplicaGatedStorage,\n ReplicaInspectedStatus,\n ReplicaGrantInfo,\n ReplicaPeerCommit,\n ReplicaState,\n ReplicaStatusEntry,\n ReplicationAuthority,\n ReplicationControl,\n ReplicationEvent,\n ReplicationIdentity,\n ReplicationOptions,\n ReplicationPurgeReport,\n ReplicationReason,\n ReplicationScheduler,\n ResolvedReplicationOptions,\n} from \"./types\";\nexport type {\n ProfileReplicaApprovalEntry,\n ProfileReplicaDeferredDenyOutcome,\n ProfileReplicaDeferredToken,\n ProfileReplicaLogoutPending,\n ProfileReplicaPreflight,\n ProfileReplicaPurge,\n ProfileReplicaRootIdentity,\n ProfileReplicaRemoteLogoutState,\n ProfileReplicaUnknownEntry,\n ReplicaAccountGate,\n ReplicaBrowserGateAccess,\n ReplicaBrowserGateSnapshot,\n ReplicaBrowserGateTx,\n ReplicaClock,\n ReplicaDenyInput,\n ReplicaDenyOutcome,\n ReplicaDeliveryDecision,\n ReplicaEraseReport,\n ReplicaGateAccess,\n ReplicaGateSnapshot,\n ReplicaGatedError,\n ReplicaGateReason,\n ReplicaGateScope,\n ReplicaGateTx,\n ReplicaGuardedStore,\n ReplicaLifecycleGate,\n ReplicaPartitionEraser,\n ReplicaPartitionIndexEntry,\n ReplicaPrivateGateHash,\n ReplicaPurgeIntent,\n ReplicaSessionStamp,\n ReplicaStampedReply,\n SaltedHash,\n} from \"./lifecycle\";\nexport type {\n ReplicaAdmitHook,\n ReplicaBrowserPageAdmission,\n ReplicaPageAdmission,\n ReplicaQuotaLedger,\n ReplicaQuotaSpec,\n} from \"./quota\";\nexport type {\n ConsentDeadlineMs,\n ClampConsentAnchor,\n EffectiveGrantExpiry,\n EffectiveGrantExpiryInput,\n MintRemainingMs,\n NeedsSilentRenewal,\n ReplicaConsentAnchor,\n ReplicaConsentSource,\n ReplicaGrantPolicy,\n} from \"./grantPolicyTypes\";\nexport { CLEAR_PENDING_WARNING } from \"./constants\";\nexport {\n canonicalReplicationIdentity,\n replicationIdentityKey,\n} from \"./identity\";\nexport { kvPrefixCovers, requiresSecretsOptIn } from \"./scope\";\nexport { createKVReplication } from \"./controller\";\nexport { createMemoryPendingStore } from \"./memoryPendingStore\";\n","export const CLEAR_PENDING_WARNING =\n \"Clearing pending writes surrenders read-your-writes protection for the cleared keys. If a write whose record was cleared had an unknown outcome or never finished, it may commit now or later; this device can serve an older value until the next sync after that commit, as it would for a write from another device.\";\n","import type { ReplicationIdentity } from \"./types\";\n\nconst SPACE_ID = /^(tinycloud:pkh:eip155:\\d+:)([^:]+)(:.+)$/;\nconst PRINCIPAL_DID = /^(did:pkh:eip155:\\d+:)([^:]+)$/;\n\n/**\n * Pure canonicalization: lower-cases only EIP-155 address segments and preserves all other\n * space/principal bytes. Rejects non-HTTP(S) hosts, credentials, query/fragment, and non-full\n * TinyCloud space ids or non-pkh principals.\n */\nexport function canonicalReplicationIdentity(\n raw: ReplicationIdentity,\n): ReplicationIdentity {\n if (\n !raw ||\n typeof raw.host !== \"string\" ||\n typeof raw.space !== \"string\" ||\n typeof raw.principal !== \"string\"\n ) {\n throw new TypeError(\n \"Replication identity host, space, and principal must be strings\",\n );\n }\n const authority = /^https?:\\/\\/([^/?#]*)/i.exec(raw.host)?.[1];\n let url: URL;\n try {\n url = new URL(raw.host);\n } catch {\n throw new TypeError(\n \"Replication identity host must be an absolute HTTP(S) URL\",\n );\n }\n if (\n !authority ||\n authority.includes(\"@\") ||\n raw.host.includes(\"?\") ||\n raw.host.includes(\"#\") ||\n url.username ||\n url.password\n ) {\n throw new TypeError(\n \"Replication identity host must be HTTP(S) without credentials, query, or fragment\",\n );\n }\n const space = SPACE_ID.exec(raw.space);\n const principal = PRINCIPAL_DID.exec(raw.principal);\n if (!space || !principal) {\n throw new TypeError(\n \"Replication identity requires a full TinyCloud space id and a pkh principal DID\",\n );\n }\n return {\n host: `${url.origin}${url.pathname.replace(/\\/+$/, \"\")}`,\n space: `${space[1]}${space[2]!.toLowerCase()}${space[3]}`,\n principal: `${principal[1]}${principal[2]!.toLowerCase()}`,\n };\n}\n\n/** Stable in-memory key; durable adapters hash its UTF-8 bytes with their platform crypto. */\nexport function replicationIdentityKey(id: ReplicationIdentity): string {\n const canonical = canonicalReplicationIdentity(id);\n return `tc-replication/v1\\n${canonical.host}\\n${canonical.space}\\n${canonical.principal}`;\n}\n","/** Shared prefix boundary and configuration rules; no runtime dependencies. */\nexport function kvPrefixCovers(prefix: string, key: string): boolean {\n return prefix === \"/\" || key.startsWith(prefix);\n}\n\n/** Replication scopes are `/` or non-empty, slash-terminated folder paths. */\nexport function assertFolderPrefix(prefix: unknown): asserts prefix is string {\n const validFolder = typeof prefix === \"string\" &&\n prefix.length > 0 &&\n !prefix.startsWith(\"/\") &&\n !prefix.includes(\"//\") &&\n prefix.endsWith(\"/\");\n if (prefix !== \"/\" && !validFolder) {\n const folderHint = typeof prefix === \"string\"\n ? prefix.replace(/^\\/+/, \"\").replace(/\\/+$/, \"\")\n : \"\";\n const suggestion = folderHint.length > 0 && !folderHint.includes(\"//\")\n ? ` Use ${JSON.stringify(`${folderHint}/`)}.`\n : ' Use \"/\" or a slash-terminated folder path such as \"notes/\".';\n throw new TypeError(`Replication prefix must be \"/\" or a non-empty slash-terminated folder path without empty segments.${suggestion}`);\n }\n}\n","export { kvPrefixCovers } from \"./prefix\";\n\n/** LIST returns its exact path plus descendants below its slash-terminated path. */\nexport function listRangeCovers(path: string, key: string): boolean {\n return path === \"\" || key === path || key.startsWith(path.endsWith(\"/\") ? path : `${path}/`);\n}\n\n/** Whether replicating this space/prefix can copy encrypted secret material to disk. */\nexport function requiresSecretsOptIn(space: string, prefix: string): boolean {\n if (prefix === \"/\") return true;\n if (space === \"secrets\" || space.endsWith(\":secrets\")) return true;\n return prefix.split(\"/\", 1)[0] === \"vault\";\n}\n","/**\n * SDK Services - Error Utilities\n *\n * Utilities for creating and handling service errors.\n */\n\nimport { responseErrorMeta } from \"./responseErrors\";\nimport { CAPABILITY_REGISTRY } from \"@tinycloud/bootstrap\";\nimport { parseNetworkId } from \"./encryption/networkId\";\n\nimport {\n type ServiceError,\n ErrorCodes,\n err,\n serviceError,\n type PermissionHint,\n} from \"./types\";\n\n/** Validate one structured node permission hint without accepting raw errors. */\nexport function parsePermissionHint(value: unknown): PermissionHint | undefined {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return undefined;\n const candidate = value as Record<string, unknown>;\n const keys = Object.keys(candidate).sort();\n if (keys.some((key) => ![\"actions\", \"path\", \"service\", \"space\"].includes(key))) return undefined;\n if (candidate.service !== \"tinycloud.kv\" && candidate.service !== \"tinycloud.encryption\") return undefined;\n if (typeof candidate.path !== \"string\" || candidate.path.length === 0 || candidate.path.includes(\"*\")) return undefined;\n if (candidate.service === \"tinycloud.kv\" &&\n (typeof candidate.space !== \"string\" || candidate.space.length === 0 || !candidate.path.startsWith(\"vault/\") || candidate.path.endsWith(\"/\"))) {\n return undefined;\n }\n if (candidate.service === \"tinycloud.encryption\" &&\n (candidate.space !== undefined || !candidate.path.startsWith(\"urn:tinycloud:encryption:\") || candidate.path.endsWith(\":\"))) {\n return undefined;\n }\n if (!Array.isArray(candidate.actions) || candidate.actions.length !== 1 ||\n typeof candidate.actions[0] !== \"string\" || candidate.actions[0].includes(\"*\")) return undefined;\n const expectedAction = candidate.service === \"tinycloud.kv\"\n ? \"tinycloud.kv/get\"\n : \"tinycloud.encryption/decrypt\";\n if (candidate.actions[0] !== expectedAction) return undefined;\n const space = typeof candidate.space === \"string\" ? candidate.space : undefined;\n return {\n service: candidate.service,\n ...(space === undefined ? {} : { space }),\n path: candidate.path,\n actions: [candidate.actions[0]],\n };\n}\n\n/** Extract only a validated structured hint from an SDK-owned error body. */\nexport function parsePermissionHintFromErrorText(text: string): PermissionHint | undefined {\n try {\n const parsed: unknown = JSON.parse(text);\n if (typeof parsed !== \"object\" || parsed === null) return undefined;\n const root = parsed as Record<string, unknown>;\n const nested = root.error;\n const nestedRecord = typeof nested === \"object\" && nested !== null\n ? nested as Record<string, unknown>\n : undefined;\n return parsePermissionHint(root.permissionHint) ??\n parsePermissionHint(nestedRecord?.permissionHint);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Create a service error for authentication required.\n */\nexport function authRequiredError(service: string): ServiceError {\n return {\n code: ErrorCodes.AUTH_REQUIRED,\n message: \"Authentication required. Please sign in first.\",\n service,\n };\n}\n\n/**\n * Create a service error for expired authentication.\n */\nexport function authExpiredError(service: string): ServiceError {\n return {\n code: ErrorCodes.AUTH_EXPIRED,\n message: \"Session has expired. Please sign in again.\",\n service,\n };\n}\n\n/**\n * Create a service error for network issues.\n */\nexport function networkError(\n service: string,\n message: string,\n cause?: Error\n): ServiceError {\n return {\n code: ErrorCodes.NETWORK_ERROR,\n message,\n service,\n cause,\n };\n}\n\n/**\n * Classify a node retry signal (tinycloud-node #347, TC-1054). The node's\n * bodies are plain text led by a stable token:\n * - `503 sql_busy: <stage>: ...` and `503 unavailable_retryable: ...` are\n * `NODE_BUSY`: nothing was applied; retry after `meta.retryAfterMs`.\n * - `503 request_timeout: ...` is `REQUEST_TIMEOUT`: the deadline passed before\n * any write began, so nothing was applied.\n * - `500 outcome_unknown: ...` is `OUTCOME_UNKNOWN`: a write may have been\n * applied; read back before retrying a non-idempotent operation.\n *\n * `meta.retryable` is the safe-to-retry verdict and `meta.retryAfterMs` the\n * node's `Retry-After` (the node sends whole seconds; anything else is\n * ignored). The SDK never retries on its own. Returns `undefined` for any\n * other response, including the bodyless 503/500 of nodes before 1.21, which\n * callers keep classifying as they always did.\n */\nexport function nodeRetryError(\n service: string,\n message: string,\n response: { status: number; statusText: string; headers: { get(name: string): string | null } },\n errorText: string\n): ServiceError | undefined {\n const body = errorText.trim();\n const [, token, stage] = /^([a-z_]+)(?::\\s*([a-z_]+):)?/.exec(body) ?? [];\n let code: string;\n if (response.status === 503 && (token === \"sql_busy\" || token === \"unavailable_retryable\")) {\n code = ErrorCodes.NODE_BUSY;\n } else if (response.status === 503 && token === \"request_timeout\") {\n code = ErrorCodes.REQUEST_TIMEOUT;\n } else if (response.status === 500 && token === \"outcome_unknown\") {\n code = ErrorCodes.OUTCOME_UNKNOWN;\n } else {\n return undefined;\n }\n const retryable = code !== ErrorCodes.OUTCOME_UNKNOWN;\n const retryAfter = response.headers.get(\"retry-after\")?.trim();\n return serviceError(code, message, service, {\n meta: {\n ...responseErrorMeta(response.status, response.statusText, errorText),\n retryable,\n ...(token === \"sql_busy\" && stage ? { stage } : {}),\n ...(retryable && retryAfter && /^\\d{1,9}$/.test(retryAfter) ? { retryAfterMs: Number(retryAfter) * 1000 } : {}),\n },\n });\n}\n\n/**\n * Abort reason for a service request that exceeded its configured timeout.\n *\n * Named `TimeoutError` (like the reason of the platform's\n * `AbortSignal.timeout()`), so it maps to `ErrorCodes.TIMEOUT` and never to\n * `ErrorCodes.ABORTED`, which is reserved for caller and sign-out aborts.\n */\nexport class RequestTimeoutError extends Error {\n readonly timeoutMs: number;\n\n constructor(timeoutMs: number) {\n super(`Request timed out after ${timeoutMs}ms.`);\n this.name = \"TimeoutError\";\n this.timeoutMs = timeoutMs;\n }\n}\n\n/**\n * Whether an error is a {@link RequestTimeoutError}. Also matches by shape so\n * that a copy of the class from another bundle (ESM/CJS entrypoint) is\n * recognized.\n */\nexport function isRequestTimeoutError(error: unknown): error is RequestTimeoutError {\n return (\n error instanceof RequestTimeoutError ||\n (error instanceof Error &&\n error.name === \"TimeoutError\" &&\n typeof (error as { timeoutMs?: unknown }).timeoutMs === \"number\")\n );\n}\n\n/**\n * Create a service error for timeouts.\n *\n * @param timeoutMs - The configured timeout that elapsed, when known\n * @param cause - The underlying timeout error, when known\n */\nexport function timeoutError(\n service: string,\n timeoutMs?: number,\n cause?: Error\n): ServiceError {\n if (timeoutMs === undefined) {\n return {\n code: ErrorCodes.TIMEOUT,\n message: \"Request timed out.\",\n service,\n ...(cause === undefined ? {} : { cause }),\n };\n }\n return {\n code: ErrorCodes.TIMEOUT,\n message: `Request timed out after ${timeoutMs}ms.`,\n service,\n ...(cause === undefined ? {} : { cause }),\n meta: { timeoutMs },\n };\n}\n\n/**\n * Create a service error for aborted requests.\n */\nexport function abortedError(service: string): ServiceError {\n return {\n code: ErrorCodes.ABORTED,\n message: \"Request was aborted.\",\n service,\n };\n}\n\n/**\n * Create a service error for not found resources.\n */\nexport function notFoundError(\n service: string,\n resource: string\n): ServiceError {\n return {\n code: ErrorCodes.NOT_FOUND,\n message: `Resource not found: ${resource}`,\n service,\n };\n}\n\n/**\n * Create a service error for permission denied.\n */\nexport function permissionDeniedError(\n service: string,\n action: string\n): ServiceError {\n return {\n code: ErrorCodes.PERMISSION_DENIED,\n message: `Permission denied for action: ${action}`,\n service,\n };\n}\n\n/**\n * Parse the server's \"Unauthorized Action: {resource} / {ability}\" pattern.\n */\nexport function parseAuthError(responseText: string): { resource?: string; action?: string } {\n const match = responseText.match(/^Unauthorized Action:\\s*(.+?)\\s*\\/\\s*(tinycloud\\.\\S+)$/m);\n if (match) {\n return { resource: match[1].trim(), action: match[2].trim() };\n }\n return {};\n}\n\n/**\n * Create a service error for unauthorized action (missing capability).\n */\nexport function authUnauthorizedError(\n service: string,\n message: string,\n meta?: Record<string, unknown>\n): ServiceError {\n return serviceError(ErrorCodes.AUTH_UNAUTHORIZED, message, service, { meta });\n}\n\n/**\n * Authorization verdict read from an error's structure, never its message:\n * - `\"unauthenticated\"`: HTTP 401 — the session is missing or stale.\n * - `\"forbidden\"`: HTTP 403, or `AUTH_UNAUTHORIZED` without a status — the\n * session is valid but lacks the capability.\n * - `\"other\"`: a non-authorization HTTP error status (4xx/5xx).\n */\nexport type AuthorizationVerdict = \"unauthenticated\" | \"forbidden\" | \"other\";\n\nconst grantableActions = new Set(\n CAPABILITY_REGISTRY.map(({ urn }) => urn).filter((urn) => !urn.endsWith(\"/*\"))\n);\n\nconst capabilityServices = new Set(\n CAPABILITY_REGISTRY.map(({ service }) => service.slice(\"tinycloud.\".length))\n);\n\n/**\n * Parse a canonical TinyCloud resource, keeping nested space names intact.\n * The first registered service segment is authoritative: a later matching\n * segment in the path cannot turn a different service into grant advice.\n */\nexport function parseCapabilityResource(\n resource: string,\n service: string\n): { space: string; path: string } | undefined {\n if (\n resource.length === 0 ||\n resource.length > 1024 ||\n !capabilityServices.has(service) ||\n /[\\s\\p{C}*#]/u.test(resource) ||\n resource.includes(\"://\")\n ) return undefined;\n\n const segments = resource.split(\"/\");\n if (!/^tinycloud:[A-Za-z0-9][A-Za-z0-9:._-]*$/.test(segments[0])) return undefined;\n const serviceIndex = segments.findIndex((segment, index) =>\n index > 0 && capabilityServices.has(segment)\n );\n if (serviceIndex < 1 || segments[serviceIndex] !== service) return undefined;\n if (segments.slice(1, serviceIndex).some((segment) =>\n segment.length === 0 || segment === \".\" || segment === \"..\"\n )) return undefined;\n const pathSegments = segments.slice(serviceIndex + 1);\n if (pathSegments.some((segment) => segment === \".\" || segment === \"..\")) return undefined;\n if (service !== \"kv\" && (pathSegments.length === 0 || pathSegments[pathSegments.length - 1] === \"\")) return undefined;\n\n return {\n space: segments.slice(0, serviceIndex).join(\"/\"),\n path: pathSegments.join(\"/\"),\n };\n}\n\n/** A capability resource is a canonical TinyCloud resource or encryption network, never a URL or expression. */\nfunction safeCapabilityResource(value: unknown, service: string, action: string): value is string {\n if (typeof value !== \"string\" || value.length === 0 || value.length > 1024) return false;\n if (service === \"encryption\" && value.startsWith(\"urn:tinycloud:encryption:\")) {\n if (\n !/^[A-Za-z0-9_][A-Za-z0-9_.:/-]*$/.test(value) ||\n value.includes(\"//\") ||\n value.split(\"/\").some((segment) => segment === \".\" || segment === \"..\")\n ) return false;\n try {\n parseNetworkId(value);\n return true;\n } catch {\n return false;\n }\n }\n const parsed = parseCapabilityResource(value, service);\n return parsed !== undefined &&\n (!parsed.path.endsWith(\"/\") || (service === \"kv\" && action === \"tinycloud.kv/list\")) &&\n (parsed.path !== \"\" || (service === \"kv\" && action === \"tinycloud.kv/list\"));\n}\n\n/**\n * Return a grantable missing capability only when typed authorization evidence\n * and both safe, service-matched capability fields are present. Status alone,\n * message text, wildcard actions and unrecognized actions cannot grant scope.\n */\nexport function validatedCapabilityOf(\n error: unknown\n): { resource: string; requiredAction: string } | undefined {\n const verdict = authorizationVerdictOf(error);\n if (verdict !== \"unauthenticated\" && verdict !== \"forbidden\") return undefined;\n\n const seen = new Set<unknown>();\n let node: unknown = error;\n for (\n let depth = 0;\n depth < MAX_CAUSE_DEPTH && typeof node === \"object\" && node !== null && !seen.has(node);\n depth += 1\n ) {\n seen.add(node);\n const record = node as Record<string, unknown>;\n const status = errorStatusOf(record);\n const meta = record.meta;\n if (\n (status === 401 || status === 403 || (status === undefined && record.code === ErrorCodes.AUTH_UNAUTHORIZED)) &&\n typeof meta === \"object\" && meta !== null && !Array.isArray(meta)\n ) {\n const metadata = meta as Record<string, unknown>;\n const { resource, requiredAction } = metadata;\n if (typeof requiredAction === \"string\" && grantableActions.has(requiredAction)) {\n const actionService = requiredAction.slice(\"tinycloud.\".length, requiredAction.indexOf(\"/\"));\n const explicitService = record.service === undefined ? metadata.service : record.service;\n if (\n safeCapabilityResource(resource, actionService, requiredAction) &&\n (explicitService === undefined ||\n explicitService === actionService ||\n explicitService === `tinycloud.${actionService}`)\n ) {\n return { resource, requiredAction };\n }\n }\n }\n node = record.cause;\n }\n return undefined;\n}\n\nconst MAX_CAUSE_DEPTH = 8;\n\n/** The first 4xx/5xx among `status`, `statusCode`, `meta.status`. Success and\n * informational statuses (e.g. a 200 `Response` kept as `cause`) are not\n * failures, so they are skipped rather than ending the search. */\nfunction errorStatusOf(node: Record<string, unknown>): number | undefined {\n const meta = node.meta;\n const candidates = [\n node.status,\n node.statusCode,\n typeof meta === \"object\" && meta !== null\n ? (meta as Record<string, unknown>).status\n : undefined,\n ];\n for (const candidate of candidates) {\n if (\n typeof candidate === \"number\" &&\n Number.isInteger(candidate) &&\n candidate >= 400 &&\n candidate <= 599\n ) {\n return candidate;\n }\n }\n return undefined;\n}\n\n/**\n * Classify an error from its typed HTTP error status (`status`, `statusCode`,\n * or `meta.status`, 4xx/5xx only) and `AUTH_UNAUTHORIZED` code, following the\n * `cause` chain outer-first (at most {@link MAX_CAUSE_DEPTH} links, cycles\n * stop the walk) so wrappers that rethrow with `cause` keep the verdict. The\n * outermost error status decides, so an outer 5xx keeps its retry budget even\n * over an inner 401. Returns `undefined` for untyped errors; only then may\n * callers fall back to message heuristics.\n */\nexport function authorizationVerdictOf(\n error: unknown,\n): AuthorizationVerdict | undefined {\n const seen = new Set<unknown>();\n let sawUnauthorizedCode = false;\n let node: unknown = error;\n for (\n let depth = 0;\n depth < MAX_CAUSE_DEPTH && typeof node === \"object\" && node !== null && !seen.has(node);\n depth += 1\n ) {\n seen.add(node);\n const record = node as Record<string, unknown>;\n const status = errorStatusOf(record);\n if (status === 401) return \"unauthenticated\";\n if (status === 403) return \"forbidden\";\n if (status !== undefined) return \"other\";\n if (record.code === ErrorCodes.AUTH_UNAUTHORIZED) sawUnauthorizedCode = true;\n node = record.cause;\n }\n return sawUnauthorizedCode ? \"forbidden\" : undefined;\n}\n\n/**\n * Create a service error for storage quota exceeded (402 Payment Required).\n */\nexport function storageQuotaExceededError(\n service: string,\n message: string,\n meta?: Record<string, unknown>\n): ServiceError {\n return {\n code: ErrorCodes.STORAGE_QUOTA_EXCEEDED,\n message,\n service,\n meta,\n };\n}\n\n/**\n * Create a service error for storage limit reached (413 Payload Too Large).\n */\nexport function storageLimitReachedError(\n service: string,\n message: string,\n meta?: Record<string, unknown>\n): ServiceError {\n return {\n code: ErrorCodes.STORAGE_LIMIT_REACHED,\n message,\n service,\n meta,\n };\n}\n\n/** Shown when a write is rejected because the owner's storage is full. */\nexport const STORAGE_FULL_MESSAGE =\n \"TinyCloud storage is full, so this change was not saved. Reading still works. Free up space or upgrade your plan to save again.\";\n\n/** Shown when a write is larger than the storage the owner has left. */\nexport const STORAGE_WRITE_TOO_LARGE_MESSAGE =\n \"This change is larger than the TinyCloud storage you have left, so it was not saved. Reading still works. Free up space or upgrade your plan to save it.\";\n\n/**\n * Parse the byte counts from a node storage rejection\n * (\"... Used: 155744 bytes, Limit: 0 bytes\"). The limit is the share of the\n * owner's account-wide budget left for this space, so it is 0 when the\n * owner's other spaces already use the whole budget.\n */\nexport function parseStorageQuotaBytes(\n responseText: string\n): { usedBytes: number; limitBytes: number } | undefined {\n const match = responseText.match(/Used:\\s*(\\d+)\\s*bytes,\\s*Limit:\\s*(\\d+)\\s*bytes/i);\n if (!match) return undefined;\n return {\n usedBytes: parseInt(match[1], 10),\n limitBytes: parseInt(match[2], 10),\n };\n}\n\n/**\n * Account-wide storage totals the node attaches to a storage rejection when\n * billing supplied them. `limitBytes` is the plan budget shared by all the\n * owner's spaces, so this is the number to show the user, not the space's.\n */\nexport interface StorageAccountUsage {\n usedBytes: number;\n limitBytes: number;\n /** Plan tier id, e.g. `free` or `paid`. */\n plan?: string;\n}\n\n/** What a node storage rejection says about the space and the account. */\nexport interface StorageRejectionDetails {\n usedBytes?: number;\n limitBytes?: number;\n account?: StorageAccountUsage;\n}\n\nconst STORAGE_REJECTION_BODY_ERRORS: Record<string, true> = {\n storage_quota_exceeded: true,\n storage_limit_reached: true,\n};\n\nfunction isByteCount(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0;\n}\n\nfunction byteCountsOf(value: unknown): { usedBytes: number; limitBytes: number } | undefined {\n if (typeof value !== \"object\" || value === null) return undefined;\n const { usedBytes, limitBytes } = value as Record<string, unknown>;\n return isByteCount(usedBytes) && isByteCount(limitBytes) ? { usedBytes, limitBytes } : undefined;\n}\n\n/**\n * Parse a node storage rejection. The node sends a JSON body\n * (`{error, message, space: {usedBytes, limitBytes}, account?: {usedBytes,\n * limitBytes, plan}}`); older nodes send only the plain-text message. Returns\n * undefined when the body is neither, e.g. a proxy's own 413 page.\n */\nexport function parseStorageRejection(responseText: string): StorageRejectionDetails | undefined {\n let body: unknown;\n try {\n body = JSON.parse(responseText);\n } catch {\n return parseStorageQuotaBytes(responseText);\n }\n if (typeof body !== \"object\" || body === null) return undefined;\n const record = body as Record<string, unknown>;\n const message = typeof record.message === \"string\" ? record.message : \"\";\n const space = byteCountsOf(record.space) ?? parseStorageQuotaBytes(message);\n const isStorageBody = typeof record.error === \"string\" && STORAGE_REJECTION_BODY_ERRORS[record.error] === true;\n if (!space && !isStorageBody) {\n return undefined;\n }\n const details: StorageRejectionDetails = { ...space };\n const account = byteCountsOf(record.account);\n if (account) {\n const plan = (record.account as Record<string, unknown>).plan;\n details.account = typeof plan === \"string\" && plan !== \"\" ? { ...account, plan } : account;\n }\n return details;\n}\n\n/**\n * Build the error for a write the node rejected for storage: 402 when storage\n * is already full, 413 when this write is larger than what is left. KV, SQL\n * and DuckDB all report it with the same codes and message so an app can\n * detect \"storage full\" in one place with {@link isStorageFullError}.\n * `meta.usedBytes`/`meta.limitBytes` describe the space; `meta.account`\n * carries the account totals when the node sent them.\n */\nexport function storageRejectionError(\n service: string,\n status: 402 | 413,\n meta: Record<string, unknown>,\n responseText: string\n): ServiceError {\n const quotaMeta = { ...meta, ...parseStorageRejection(responseText) };\n return status === 402\n ? storageQuotaExceededError(service, STORAGE_FULL_MESSAGE, quotaMeta)\n : storageLimitReachedError(service, STORAGE_WRITE_TOO_LARGE_MESSAGE, quotaMeta);\n}\n\n/**\n * True when a write failed for storage: the owner's TinyCloud storage is full\n * (`STORAGE_QUOTA_EXCEEDED`), or this write is larger than what is left\n * (`STORAGE_LIMIT_REACHED`). Reads keep working in both cases, so apps should\n * stay usable read-only and point the user at freeing up space or upgrading.\n */\nexport function isStorageFullError(error: { code?: string } | null | undefined): boolean {\n return (\n error?.code === ErrorCodes.STORAGE_QUOTA_EXCEEDED ||\n error?.code === ErrorCodes.STORAGE_LIMIT_REACHED\n );\n}\n\n/**\n * Wrap an unknown error in a ServiceError.\n */\nexport function wrapError(\n service: string,\n error: unknown,\n defaultCode: string = ErrorCodes.NETWORK_ERROR\n): ServiceError {\n if (error instanceof Error) {\n // A configured request timeout elapsed (see BaseService.createRequestSignal)\n if (isRequestTimeoutError(error)) {\n return timeoutError(service, error.timeoutMs, error);\n }\n\n // Check for abort errors\n if (error.name === \"AbortError\") {\n return abortedError(service);\n }\n\n // Check for timeout errors (varies by platform)\n if (\n error.name === \"TimeoutError\" ||\n error.message.toLowerCase().includes(\"timeout\")\n ) {\n return timeoutError(service);\n }\n\n return {\n code: defaultCode,\n message: error.message,\n service,\n cause: error,\n };\n }\n\n return {\n code: defaultCode,\n message: String(error),\n service,\n };\n}\n\n/**\n * Create an error Result from a ServiceError.\n */\nexport function errorResult(error: ServiceError) {\n return err(error);\n}\n","/**\n * SDK Services - Core Types\n *\n * These types define the service architecture for TinyCloud SDK.\n * Services use dependency injection via IServiceContext for platform independence.\n */\n\n// =============================================================================\n// Result Type Pattern\n// =============================================================================\n\n/**\n * Result type for service operations.\n * Services return Result instead of throwing, making error handling explicit.\n *\n * @template T - The success data type\n * @template E - The error type (defaults to ServiceError)\n *\n * @example\n * ```typescript\n * const result = await kv.get('key');\n * if (result.ok) {\n * console.log(result.data);\n * } else {\n * console.error(result.error.code);\n * }\n * ```\n */\nexport type Result<T, E = ServiceError> =\n | { ok: true; data: T }\n | { ok: false; error: E };\n\n/**\n * Service error with structured information.\n */\nexport interface ServiceError {\n /** Error code for programmatic handling (e.g., 'KV_NOT_FOUND', 'AUTH_EXPIRED') */\n code: string;\n /** Human-readable error message */\n message: string;\n /** Service that produced the error (e.g., 'kv', 'sql') */\n service: string;\n /** Original error if this wraps another error */\n cause?: Error;\n /** Additional metadata about the error */\n meta?: Record<string, unknown>;\n}\n\n/**\n * A node-supplied permission hint after strict SDK validation. This is\n * deliberately narrower than a general capability: no wildcards, caveats,\n * descriptions, or transport metadata can cross the service boundary.\n */\nexport interface PermissionHint {\n readonly service: \"tinycloud.kv\" | \"tinycloud.encryption\";\n readonly space?: string;\n readonly path: string;\n readonly actions: readonly string[];\n}\n\n/**\n * Storage quota information returned with quota-related errors.\n * @deprecated Read `usedBytes`, `limitBytes` and `account` from the error's\n * `meta`, or use `StorageFullEvent` from `tc.on(\"storage.full\", handler)`.\n */\nexport interface StorageQuotaInfo {\n usedBytes: number;\n limitBytes: number;\n service: string;\n}\n\n/**\n * Standard error codes used across services.\n */\nexport const ErrorCodes = {\n // Common errors\n NOT_FOUND: \"NOT_FOUND\",\n AUTH_EXPIRED: \"AUTH_EXPIRED\",\n AUTH_REQUIRED: \"AUTH_REQUIRED\",\n AUTH_UNAUTHORIZED: \"AUTH_UNAUTHORIZED\",\n /** HTTP 401: the delegation the invocation cites was revoked. */\n AUTH_DELEGATION_REVOKED: \"AUTH_DELEGATION_REVOKED\",\n /** HTTP 401: a delegation the cited one rests on was revoked. */\n AUTH_DELEGATION_ANCESTOR_REVOKED: \"AUTH_DELEGATION_ANCESTOR_REVOKED\",\n NETWORK_ERROR: \"NETWORK_ERROR\",\n TIMEOUT: \"TIMEOUT\",\n ABORTED: \"ABORTED\",\n INVALID_INPUT: \"INVALID_INPUT\",\n PERMISSION_DENIED: \"PERMISSION_DENIED\",\n\n // Node retry signals (tinycloud-node #347). `meta.retryable` says whether a\n // retry is safe; `meta.retryAfterMs` carries the node's Retry-After.\n /** HTTP 503 `sql_busy:<stage>` / `unavailable_retryable`: nothing was applied; retry after `meta.retryAfterMs`. */\n NODE_BUSY: \"NODE_BUSY\",\n /** HTTP 503 `request_timeout`: the node's deadline passed before any write began; nothing was applied. */\n REQUEST_TIMEOUT: \"REQUEST_TIMEOUT\",\n /** HTTP 500 `outcome_unknown`: a write may have been applied; read back before retrying a non-idempotent operation. */\n OUTCOME_UNKNOWN: \"OUTCOME_UNKNOWN\",\n\n // KV-specific errors\n KV_NOT_FOUND: \"KV_NOT_FOUND\",\n KV_WRITE_FAILED: \"KV_WRITE_FAILED\",\n KV_PRECONDITION_FAILED: \"KV_PRECONDITION_FAILED\",\n KV_CONFLICT: \"KV_CONFLICT\",\n KV_RESPONSE_TOO_LARGE: \"KV_RESPONSE_TOO_LARGE\",\n /** HTTP 410 from the change feed: discard sync state and restart without a cursor; `meta.reason` says why. */\n KV_SYNC_RESET_REQUIRED: \"KV_SYNC_RESET_REQUIRED\",\n /** HTTP 403 from the change feed: the retention grant was refused; `meta.reason` says why. */\n KV_RETENTION_GRANT_REFUSED: \"KV_RETENTION_GRANT_REFUSED\",\n\n // SQL-specific errors\n SQL_ERROR: \"SQL_ERROR\",\n SQL_PERMISSION_DENIED: \"SQL_PERMISSION_DENIED\",\n SQL_DATABASE_NOT_FOUND: \"SQL_DATABASE_NOT_FOUND\",\n SQL_RESPONSE_TOO_LARGE: \"SQL_RESPONSE_TOO_LARGE\",\n SQL_QUOTA_EXCEEDED: \"SQL_QUOTA_EXCEEDED\",\n SQL_INVALID_STATEMENT: \"SQL_INVALID_STATEMENT\",\n SQL_SCHEMA_ERROR: \"SQL_SCHEMA_ERROR\",\n SQL_READONLY_VIOLATION: \"SQL_READONLY_VIOLATION\",\n\n // Storage quota errors\n STORAGE_QUOTA_EXCEEDED: \"STORAGE_QUOTA_EXCEEDED\",\n STORAGE_LIMIT_REACHED: \"STORAGE_LIMIT_REACHED\",\n /** The node answered the usage read without usage numbers (it predates the read). */\n STORAGE_STATUS_UNAVAILABLE: \"STORAGE_STATUS_UNAVAILABLE\",\n\n // DuckDB-specific errors\n DUCKDB_ERROR: \"DUCKDB_ERROR\",\n DUCKDB_PERMISSION_DENIED: \"DUCKDB_PERMISSION_DENIED\",\n DUCKDB_DATABASE_NOT_FOUND: \"DUCKDB_DATABASE_NOT_FOUND\",\n DUCKDB_RESPONSE_TOO_LARGE: \"DUCKDB_RESPONSE_TOO_LARGE\",\n DUCKDB_QUOTA_EXCEEDED: \"DUCKDB_QUOTA_EXCEEDED\",\n DUCKDB_INVALID_STATEMENT: \"DUCKDB_INVALID_STATEMENT\",\n DUCKDB_SCHEMA_ERROR: \"DUCKDB_SCHEMA_ERROR\",\n DUCKDB_READONLY_VIOLATION: \"DUCKDB_READONLY_VIOLATION\",\n} as const;\n\nexport type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes];\n\n// =============================================================================\n// Service Session\n// =============================================================================\n\n/**\n * Session data required for authenticated service operations.\n * Both TinyCloudSession and web-sdk Session can be cast to this interface.\n */\nexport interface ServiceSession {\n /** The delegation header containing the UCAN */\n delegationHeader: { Authorization: string };\n /** The delegation CID */\n delegationCid: string;\n /** The space ID for this session */\n spaceId: string;\n /** The verification method DID */\n verificationMethod: string;\n /** The session key JWK (required for invoke) */\n jwk: object;\n}\n\n// =============================================================================\n// Platform Dependencies (Injected)\n// =============================================================================\n\n/**\n * Headers type - compatible with both browser and Node.js.\n */\nexport type ServiceHeaders = Record<string, string> | [string, string][];\n\n/**\n * A single fact object to include in the UCAN invocation.\n * Facts are key-value objects that the server reads from the UCAN facts field.\n */\nexport interface InvocationFact {\n [key: string]: unknown;\n}\n\n/**\n * Facts to include in the UCAN invocation.\n * This is an array of fact objects per the UCAN spec.\n * Used to pass additional parameters that the server reads from the UCAN facts field.\n */\nexport type InvocationFacts = InvocationFact[];\n\n/**\n * Invoke function signature - platform-specific implementation injected via DI.\n * Both node-sdk-wasm and web-sdk-wasm export this with identical signature.\n *\n * @param session - The service session with delegation data\n * @param service - Service name (e.g., \"kv\")\n * @param path - Resource path or key\n * @param action - Action to perform (e.g., \"tinycloud.kv/get\")\n * @param facts - Optional facts to include in the UCAN (e.g., for capabilities/read params)\n * @returns Headers to include in the request\n */\nexport type InvokeFunction = (\n session: ServiceSession,\n service: string,\n path: string,\n action: string,\n facts?: InvocationFacts,\n) => ServiceHeaders;\n\n/**\n * Multi-resource invocation entry.\n */\nexport interface InvokeAnyEntry {\n /**\n * Legacy space-scoped resource. Optional when `resource` is provided.\n */\n spaceId?: string;\n service: string;\n path: string;\n action: string;\n /** Optional raw resource URI. When set, WASM signs this URI directly. */\n resource?: string;\n /** Capability caveats that must remain on this invocation attenuation. */\n caveats?: Record<string, unknown>[];\n}\n\n/**\n * Invoke function for minting a single authorization header that covers\n * multiple capabilities across one effective invoker.\n */\nexport type InvokeAnyFunction = (\n session: ServiceSession,\n entries: InvokeAnyEntry[],\n facts?: InvocationFacts,\n) => ServiceHeaders;\n\n/**\n * Fetch request options - compatible with standard fetch API.\n */\nexport interface FetchRequestInit {\n method?: string;\n headers?: ServiceHeaders;\n body?: Blob | FormData | string;\n signal?: AbortSignal;\n redirect?: \"error\";\n}\n\n/**\n * Fetch response interface - compatible with standard Response.\n */\nexport interface FetchResponse {\n ok: boolean;\n status: number;\n statusText: string;\n body?: unknown;\n headers: {\n get(name: string): string | null;\n };\n json(): Promise<unknown>;\n text(): Promise<string>;\n arrayBuffer(): Promise<ArrayBuffer>;\n blob(): Promise<Blob>;\n}\n\n/**\n * Fetch function signature - allows for custom fetch implementations.\n * Compatible with both browser fetch and Node.js fetch.\n */\nexport type FetchFunction = (\n url: string,\n init?: FetchRequestInit,\n) => Promise<FetchResponse>;\n\n// =============================================================================\n// Retry Policy\n// =============================================================================\n\n/**\n * Configuration for automatic retry of failed requests.\n */\nexport interface RetryPolicy {\n /** Maximum number of attempts (including initial) */\n maxAttempts: number;\n /** Backoff strategy between retries */\n backoff: \"none\" | \"linear\" | \"exponential\";\n /** Base delay in milliseconds for backoff calculation */\n baseDelayMs: number;\n /** Maximum delay in milliseconds between retries */\n maxDelayMs: number;\n /** Error codes that should trigger a retry */\n retryableErrors: string[];\n}\n\n/**\n * Default retry policy.\n */\nexport const defaultRetryPolicy: RetryPolicy = {\n maxAttempts: 3,\n backoff: \"exponential\",\n baseDelayMs: 1000,\n maxDelayMs: 10000,\n retryableErrors: [ErrorCodes.NETWORK_ERROR, ErrorCodes.TIMEOUT],\n};\n\n// =============================================================================\n// Service Context\n// =============================================================================\n\n/**\n * Event handler function type.\n */\nexport type EventHandler = (data: unknown) => void;\n\n/**\n * SDK telemetry event handler.\n */\nexport type TelemetryEventHandler = (event: string, data: unknown) => void;\n\n/**\n * Default-off telemetry configuration.\n */\nexport type TelemetryConfig =\n | boolean\n | {\n enabled?: boolean;\n onEvent?: TelemetryEventHandler;\n };\n\n/**\n * Service interface - base contract for all services.\n */\nexport interface IService {\n /** Initialize service with context */\n initialize(context: IServiceContext): void;\n\n /** Called when session changes (sign-in, sign-out, refresh) */\n onSessionChange(session: ServiceSession | null): void;\n\n /** Called when SDK signs out - should abort pending operations */\n onSignOut(): void;\n\n /** Service-specific configuration */\n readonly config: Record<string, unknown>;\n}\n\n/**\n * Context provided to services for accessing platform dependencies.\n * The SDK creates this context and passes it to services during initialization.\n */\nexport interface IServiceContext {\n // Session management\n /** Current active session, or null if not authenticated */\n readonly session: ServiceSession | null;\n /** Whether there is an active authenticated session */\n readonly isAuthenticated: boolean;\n\n // Platform dependencies (injected by SDK)\n /** Platform-specific invoke function from WASM binding */\n readonly invoke: InvokeFunction;\n /** Optional multi-resource invoke function */\n readonly invokeAny?: InvokeAnyFunction;\n /** Fetch function (defaults to globalThis.fetch) */\n readonly fetch: FetchFunction;\n /** Available TinyCloud host URLs */\n readonly hosts: string[];\n\n // Cross-service access\n /** Get another registered service by name */\n getService<T extends IService>(name: string): T | undefined;\n\n // Telemetry/Events\n /** Emit a telemetry event */\n emit(event: string, data: unknown): void;\n /** Subscribe to events */\n on(event: string, handler: EventHandler): () => void;\n\n // Lifecycle\n /** Abort signal that fires when SDK signs out. */\n readonly abortSignal: AbortSignal;\n /** Additional abort signal for a scoped operation, when active. */\n readonly operationAbortSignal?: AbortSignal;\n /** Install an additional signal for the duration of a scoped operation. */\n setOperationAbortSignal?(signal: AbortSignal | undefined): void;\n // Retry policy\n /** Retry policy for failed requests */\n readonly retryPolicy: RetryPolicy;\n}\n\n// =============================================================================\n// Telemetry Events\n// =============================================================================\n\n/**\n * Event emitted before a service request.\n */\nexport interface ServiceRequestEvent {\n service: string;\n action: string;\n span?: string;\n key?: string;\n timestamp: number;\n}\n\n/**\n * Event emitted after a service response.\n */\nexport interface ServiceResponseEvent {\n service: string;\n action: string;\n span?: string;\n ok: boolean;\n duration: number;\n durationMs?: number;\n status?: number;\n}\n\n/**\n * Event emitted on service error.\n */\nexport interface ServiceErrorEvent {\n service: string;\n span?: string;\n error: ServiceError;\n}\n\n/**\n * Event emitted on retry attempt.\n */\nexport interface ServiceRetryEvent {\n service: string;\n attempt: number;\n maxAttempts: number;\n error: ServiceError;\n}\n\n/**\n * Generic named span event for aggregating operation timings.\n */\nexport interface TelemetrySpanEvent {\n span: string;\n ok: boolean;\n durationMs: number;\n service?: string;\n action?: string;\n status?: number;\n error?: ServiceError;\n}\n\n/**\n * Telemetry event names.\n */\nexport const TelemetryEvents = {\n SPAN: \"telemetry.span\",\n SERVICE_REQUEST: \"service.request\",\n SERVICE_RESPONSE: \"service.response\",\n SERVICE_ERROR: \"service.error\",\n SERVICE_RETRY: \"service.retry\",\n SESSION_CHANGED: \"session.changed\",\n SESSION_EXPIRED: \"session.expired\",\n REPLICATION_READ: \"replication.read\",\n REPLICATION_WRITE: \"replication.write\",\n REPLICATION_SYNC: \"replication.sync\",\n REPLICATION_STATE: \"replication.state\",\n REPLICATION_DIVERGENCE: \"replication.divergence\",\n REPLICATION_GRANT: \"replication.grant\",\n REPLICATION_LIFECYCLE: \"replication.lifecycle\",\n /** Emitted once, on the first write rejected because storage is full. */\n STORAGE_FULL: \"storage.full\",\n} as const;\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Create a success result.\n */\nexport function ok<T>(data: T): Result<T> {\n return { ok: true, data };\n}\n\n/**\n * Create an error result.\n */\nexport function err<E = ServiceError>(error: E): Result<never, E> {\n return { ok: false, error };\n}\n\n/**\n * Create a ServiceError.\n */\nexport function serviceError(\n code: string,\n message: string,\n service: string,\n options?: { cause?: Error; meta?: Record<string, unknown> },\n): ServiceError {\n return {\n code,\n message,\n service,\n cause: options?.cause,\n meta: options?.meta,\n };\n}\n","import { ErrorCodes, type Result } from \"../../types\";\n\nconst DEFINITIVE_FAILURES = new Set<string>([\n ErrorCodes.AUTH_REQUIRED, ErrorCodes.INVALID_INPUT, ErrorCodes.AUTH_UNAUTHORIZED,\n ErrorCodes.KV_PRECONDITION_FAILED, ErrorCodes.STORAGE_QUOTA_EXCEEDED, ErrorCodes.STORAGE_LIMIT_REACHED,\n]);\n\nexport function classifyWriteOutcome<T>(\n op: \"put\" | \"delete\" | \"batchPut\",\n result: Result<T>,\n options: { conditional?: boolean } = {},\n): \"committed\" | \"failed\" | \"ambiguous\" {\n if (result.ok) return \"committed\";\n const { code, meta } = result.error;\n if (op === \"delete\" && code === ErrorCodes.KV_NOT_FOUND) {\n return options.conditional === true ? \"failed\" : \"committed\";\n }\n if (meta?.requestMayHaveDispatched === false) return \"failed\";\n if (DEFINITIVE_FAILURES.has(code)) return \"failed\";\n if (meta?.outcome === \"batch-unconfirmed\") return \"ambiguous\";\n const status = typeof meta?.status === \"number\" ? meta.status : undefined;\n if (status !== undefined && status >= 400 && status < 500) return \"failed\";\n return \"ambiguous\";\n}\n","import { kvPrefixCovers } from \"./scope\";\nimport type { PendingWriteRecord, PendingWriteState } from \"./types\";\n\nexport function emptyPendingState(identity: PendingWriteState[\"identity\"]): PendingWriteState {\n return { v: 2, identity: { ...identity }, committedEpoch: 0, seq: 0, records: [] };\n}\n\nexport function begin(s: PendingWriteState, opId: string, keys: readonly { key: string; op: \"put\" | \"delete\" }[], at: string): PendingWriteRecord[] {\n const records = keys.map(({ key, op }) => ({ opId, seq: ++s.seq, key, op, state: \"in_flight\" as const, epoch: null, at, settledAt: null }));\n s.records.push(...records);\n return records;\n}\n\nexport function settle(s: PendingWriteState, opId: string, outcome: \"committed\" | \"failed\" | \"ambiguous\", at: string, code?: string): void {\n if (outcome === \"failed\") { s.records = s.records.filter((r) => r.opId !== opId); return; }\n const own = s.records.filter((r) => r.opId === opId && r.state === \"in_flight\");\n if (outcome === \"committed\" && own.length > 0) {\n const epoch = ++s.committedEpoch;\n for (const r of own) { r.state = \"committed\"; r.epoch = epoch; r.settledAt = at; }\n return;\n }\n for (const r of own) { r.state = \"ambiguous\"; r.settledAt = at; if (code) r.code = code; }\n}\n\nexport function afterSync(s: PendingWriteState, prefix: string, syncStartEpoch: number): number {\n const before = s.records.length;\n s.records = s.records.filter((r) => !(r.state === \"committed\" && r.epoch !== null && r.epoch <= syncStartEpoch && kvPrefixCovers(prefix, r.key)));\n return before - s.records.length;\n}\n\nexport function clearPrefix(s: PendingWriteState, prefix: string): number {\n const before = s.records.length;\n s.records = s.records.filter((r) => !kvPrefixCovers(prefix, r.key));\n return before - s.records.length;\n}\n\nexport function clearPending(s: PendingWriteState, now: number): number {\n const before = s.records.length;\n s.records = s.records.filter((r) => r.state === \"committed\" || (r.state === \"in_flight\" && now - Date.parse(r.at) <= 10 * 60_000));\n return before - s.records.length;\n}\n\nexport function pinnedKeys(s: PendingWriteState, prefix: string, now: number, cap = 100) {\n return s.records.filter((r) => kvPrefixCovers(prefix, r.key) && (r.state === \"in_flight\" || r.state === \"ambiguous\"))\n .sort((a, b) => a.seq - b.seq).slice(0, cap).map((r) => ({ key: r.key, state: r.state as \"in_flight\" | \"ambiguous\", op: r.op, since: r.at, ...(r.code ? { code: r.code } : {}), likelyOrphaned: r.state === \"in_flight\" && now - Date.parse(r.at) > 10 * 60_000 }));\n}\n","import { err, ErrorCodes, ok, serviceError } from \"../../types\";\nimport type { KVResponse } from \"../types\";\nimport type { LocalGetResult } from \"./types\";\n\nexport type LocalGetResponse<T> = { ok: true; data: KVResponse<T> } | { ok: false; error: { code: string; message: string; service: string; meta?: Record<string, unknown> } };\n\nexport function parseLocalValue<T>(bytes: Uint8Array, contentType: string | undefined, raw: boolean | undefined, binary: boolean | undefined): T {\n if (binary) return bytes as T;\n const text = new TextDecoder().decode(bytes);\n if (raw) return text as T;\n if (contentType?.includes(\"application/json\")) return JSON.parse(text) as T;\n if (contentType?.startsWith(\"text/\")) return text as T;\n if (!text) return undefined as T;\n try { return JSON.parse(text) as T; } catch { return text as T; }\n}\n\nexport function localGet<T>(result: LocalGetResult, key: string, options: { raw?: boolean; binary?: boolean; maxResponseBytes?: number }): LocalGetResponse<T> {\n if (result.status === \"present\") {\n if (options.maxResponseBytes !== undefined && result.value.byteLength > options.maxResponseBytes) {\n return err(serviceError(ErrorCodes.KV_RESPONSE_TOO_LARGE, `KV value at key ${JSON.stringify(key)} exceeds the requested response limit`, \"kv\", { meta: { status: 413 } }));\n }\n const contentType = Object.entries(result.metadata).find(([name]) => name.toLowerCase() === \"content-type\")?.[1];\n const headers = new Headers({ etag: result.etag, \"content-length\": String(result.value.byteLength), \"cache-control\": \"private, no-cache\", ...result.metadata, \"x-tinycloud-source\": \"replica\" });\n return ok({\n data: parseLocalValue<T>(result.value, contentType, options.raw, options.binary),\n headers: {\n etag: result.etag,\n contentType,\n contentLength: result.value.byteLength,\n get: (name: string) => headers.get(name),\n },\n });\n }\n if (result.status === \"absent\" || result.status === \"deleted\") return err(serviceError(ErrorCodes.KV_NOT_FOUND, `Key not found: ${key}`, \"kv\"));\n return err(serviceError(ErrorCodes.NETWORK_ERROR, \"Local value is not available\", \"kv\"));\n}\n","import { err, ErrorCodes, serviceError } from \"../../types\";\nimport { kvPrefixCovers } from \"./scope\";\nimport type { KVListPage, LocalListResult, LocalReadMeta } from \"./types\";\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder(\"utf-8\", { fatal: true });\nexport function utf8Compare(a: string, b: string): number {\n const x = encoder.encode(a), y = encoder.encode(b);\n for (let i = 0; i < Math.min(x.length, y.length); i++) if (x[i] !== y[i]) return x[i]! - y[i]!;\n return x.length - y.length;\n}\nexport function encodeTcr1(space: string, path: string, last: string): string {\n const bytes = encoder.encode(JSON.stringify({ v: 1, space, path, last }));\n let binary = \"\";\n for (let offset = 0; offset < bytes.length; offset += 0x8000) {\n binary += String.fromCharCode(...bytes.subarray(offset, offset + 0x8000));\n }\n const payload = btoa(binary).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n return `tcr1.${payload}`;\n}\nexport function decodeTcr1(cursor: string): { v: 1; space: string; path: string; last: string } | null {\n try {\n const encoded = cursor.slice(5).replace(/-/g, \"+\").replace(/_/g, \"/\");\n const binary = atob(encoded + \"=\".repeat((4 - encoded.length % 4) % 4));\n const bytes = Uint8Array.from(binary, (character) => character.charCodeAt(0));\n const x = JSON.parse(decoder.decode(bytes));\n return x?.v === 1 && typeof x.space === \"string\" && typeof x.path === \"string\" && typeof x.last === \"string\" ? x : null;\n } catch { return null; }\n}\nexport function cursorRestart() {\n return err(serviceError(ErrorCodes.INVALID_INPUT, \"Local list cursor cannot be served; restart without the cursor\", \"kv\", { meta: { replication: \"cursor_restart\" } }));\n}\nexport function localList(handle: { list(o: { prefix: string; after?: string; limit?: number }): Promise<LocalListResult> }, space: string, path: string, limit: number | undefined, cursor: string | undefined, validateMeta: (meta: LocalReadMeta) => void): Promise<KVListPage> {\n const after = cursor ? decodeTcr1(cursor)?.last : undefined;\n const exact = path !== \"\" && !path.endsWith(\"/\") && (after === undefined || utf8Compare(path, after) > 0)\n ? awaitExact(handle, path, after, validateMeta) : Promise.resolve(false);\n return exact.then(async (hasExact) => {\n const child = path === \"\" ? \"\" : path.endsWith(\"/\") ? path : `${path}/`;\n const want = limit === undefined ? undefined : limit + 1 - (hasExact ? 1 : 0);\n const children = await handle.list({ prefix: child, after, limit: want });\n validateMeta(children.meta);\n let keys = (hasExact ? [path] : []).concat(children.keys);\n const truncated = limit !== undefined && keys.length > limit;\n if (truncated) keys = keys.slice(0, limit);\n return { keys, truncated: truncated, ...(truncated ? { nextCursor: encodeTcr1(space, path, keys[keys.length - 1]!) } : {}) };\n });\n}\n\nasync function awaitExact(handle: { list(o: { prefix: string; after?: string; limit?: number }): Promise<LocalListResult> }, path: string, after: string | undefined, validateMeta: (meta: LocalReadMeta) => void): Promise<boolean> {\n if (after !== undefined && utf8Compare(path, after) <= 0) return false;\n const result = await handle.list({ prefix: path, limit: 1 });\n validateMeta(result.meta);\n return result.keys[0] === path;\n}\n\nexport function listPathCovered(prefixes: readonly string[], path: string): string | undefined {\n return prefixes.find((prefix) => kvPrefixCovers(prefix, path));\n}\n","import type { ReplicationEvent, ReplicationScheduler } from \"./types\";\n\nexport type ReplicationEventInput = ReplicationEvent extends infer Event\n ? Event extends { at: string }\n ? Omit<Event, \"at\">\n : never\n : never;\n\nexport function emitEvent(emit: (event: ReplicationEvent) => void, scheduler: ReplicationScheduler, event: ReplicationEventInput): void {\n try { emit({ ...event, at: new Date(scheduler.now()).toISOString() } as ReplicationEvent); } catch { /* Observability never changes KV behavior. */ }\n}\n","/** Grant lifetime constants without browser storage identifiers. */\nconst HOUR_MS = 60 * 60 * 1000;\nconst DAY_MS = 24 * HOUR_MS;\n\n/** Default device-grant lifetime from install (24 h). All durations are milliseconds. */\nexport const DEFAULT_GRANT_TTL_MS = DAY_MS;\n/** `grantTtlMs` above this (7 d) is a config error: TypeError at construction. */\nexport const MAX_GRANT_TTL_MS = 7 * DAY_MS;\n/** Consent deadline = consent anchor + this window (7 d). */\nexport const CONSENT_WINDOW_MS = 7 * DAY_MS;\n/** Silent renewal starts when remaining effective lifetime < this fraction of the effective lifetime. */\nexport const RENEW_BELOW_FRACTION = 0.25;\n","/**\n * Grant lifetime policy (TC-858 plan §6, CONTRACT.md §3). Pure functions over epoch\n * milliseconds. Types and constants come from the shared contract; this file only implements them.\n *\n * Every function fails closed: a non-finite input yields a value that refuses the mint, renewal or\n * read, never a permissive one.\n */\nimport { CONSENT_WINDOW_MS, MAX_GRANT_TTL_MS, RENEW_BELOW_FRACTION } from \"./grantPolicyConstants\";\nexport { MAX_GRANT_TTL_MS } from \"./grantPolicyConstants\";\nimport type {\n ConsentDeadlineMs,\n EffectiveGrantExpiry,\n MintRemainingMs,\n NeedsSilentRenewal,\n ReplicaConsentAnchor,\n} from \"./grantPolicyTypes\";\n\n/** An instant that has already passed: nothing is minted, renewed or served against it. */\nconst EXPIRED = Number.NEGATIVE_INFINITY;\n\n/**\n * Caller contract: clamp the anchor with {@link clampConsentAnchor} first. A non-finite anchor\n * yields an already-passed deadline.\n */\nexport const consentDeadlineMs: ConsentDeadlineMs = (anchor) =>\n Number.isFinite(anchor.at) ? anchor.at + CONSENT_WINDOW_MS : EXPIRED;\n\n/**\n * Returns the anchor the deadline may be computed from. A non-finite anchor or clock yields\n * `null` (no anchor, so no mint). An anchor dated after `now` is pulled back to `now`, so a\n * future-dated anchor cannot extend the 7 d window.\n */\nexport const clampConsentAnchor = (\n anchor: ReplicaConsentAnchor | null,\n now: number,\n): ReplicaConsentAnchor | null => {\n if (anchor === null || !Number.isFinite(anchor.at) || !Number.isFinite(now)) return null;\n return anchor.at > now ? { at: now, source: anchor.source } : anchor;\n};\n\nexport const effectiveGrantExpiry: EffectiveGrantExpiry = ({\n signedExpiresAt,\n installedAt,\n grantTtlMs,\n consentDeadline,\n}) => {\n const signedValid = signedExpiresAt === null || Number.isFinite(signedExpiresAt);\n if (!signedValid || !Number.isFinite(installedAt) || !Number.isFinite(grantTtlMs) || !Number.isFinite(consentDeadline)) {\n return EXPIRED;\n }\n const ttl = Math.min(grantTtlMs, MAX_GRANT_TTL_MS);\n const localBound = Math.min(installedAt + ttl, consentDeadline);\n return signedExpiresAt === null ? localBound : Math.min(signedExpiresAt, localBound);\n};\n\nexport const mintRemainingMs: MintRemainingMs = ({ now, grantTtlMs, consentDeadline }) => {\n if (!Number.isFinite(now) || !Number.isFinite(grantTtlMs) || !Number.isFinite(consentDeadline)) return 0;\n return Math.min(Math.min(grantTtlMs, MAX_GRANT_TTL_MS), consentDeadline - now);\n};\n\nexport const needsSilentRenewal: NeedsSilentRenewal = ({ now, installedAt, effectiveExpiresAt, consentDeadline }) => {\n if (\n !Number.isFinite(now) ||\n !Number.isFinite(installedAt) ||\n !Number.isFinite(effectiveExpiresAt) ||\n !Number.isFinite(consentDeadline)\n ) {\n return false;\n }\n if (!(now < consentDeadline)) return false;\n const remaining = effectiveExpiresAt - now;\n const lifetime = effectiveExpiresAt - installedAt;\n return remaining < lifetime * RENEW_BELOW_FRACTION;\n};\n","import { wrapError } from \"../../errors\";\nimport { ErrorCodes, err, ok, serviceError, type Result } from \"../../types\";\nimport type { KVGetOptions, KVListOptions, KVResponse } from \"../types\";\nimport { kvPrefixCovers, listRangeCovers, requiresSecretsOptIn } from \"./scope\";\nimport { classifyWriteOutcome } from \"./outcome\";\nimport { afterSync, begin, clearPending as clearPendingRecords, clearPrefix, emptyPendingState, pinnedKeys, settle } from \"./pendingWrites\";\nimport { localGet, type LocalGetResponse } from \"./localResponse\";\nimport { cursorRestart, decodeTcr1, listPathCovered, localList } from \"./listLocal\";\nimport { emitEvent, type ReplicationEventInput } from \"./events\";\nimport type { KVListPage, KVReplicaHandle, KVReplicationController, LocalGetResult, LocalReadMeta, LocalReplicaStatus, ReplicaInspectedStatus, ReplicaGrantInfo, PendingWriteState, ReplicaDevice, ReplicaPeerCommit, ReplicationEvent, ReplicationReason, ReplicaStatusEntry, KVReplicationDeps, LocalSyncResult } from \"./types\";\nimport type { ReplicaDeliveryDecision, ReplicaSessionStamp } from \"./lifecycle\";\nimport { DEFAULT_GRANT_TTL_MS, RENEW_BELOW_FRACTION } from \"./grantPolicyConstants\";\nimport { clampConsentAnchor, consentDeadlineMs, mintRemainingMs, needsSilentRenewal } from \"./grantPolicy\";\nimport type { ReplicaConsentAnchor } from \"./grantPolicyTypes\";\n\nconst CLOSE_TIMEOUT_MS = 3_000;\nconst STATUS_REFRESH_TIMEOUT_MS = CLOSE_TIMEOUT_MS;\ntype SyncAbortCause = \"timeout\" | \"caller\" | \"close\" | \"purge\";\ninterface SyncContext { abortCause?: SyncAbortCause }\ninterface StatusInspection { abort: AbortController; settled: Promise<void> }\ninterface InspectedStatusResult { missing: boolean; local?: LocalReplicaStatus | ReplicaInspectedStatus; errorCode?: string }\ninterface ReplicaDerivationPlan { path: \"session\" | \"runtime\"; parentCid: string; expiresAt: number }\ninterface Opened {\n handle?: KVReplicaHandle;\n opening?: Promise<KVReplicaHandle>;\n sync?: Promise<LocalSyncResult>;\n syncContext?: SyncContext;\n abort?: AbortController;\n mintAbort?: AbortController;\n timer?: () => void;\n renewalTimer?: () => void;\n renewing?: Promise<void>;\n lastError?: string;\n reason?: ReplicationReason;\n strategy?: \"session\" | \"minted\" | \"installed\";\n retryAt?: number;\n failures?: number;\n unsupported?: boolean;\n authorityRevoked?: boolean;\n reportedExpired?: boolean;\n reportedCappedCid?: string;\n reportedRenewalUnqualifiedCid?: string;\n}\nconst nowDate = (now: number) => new Date(now).toISOString();\nconst errorCode = (e: unknown): string => typeof e === \"object\" && e !== null && \"code\" in e && typeof e.code === \"string\" ? e.code : \"REPLICA_UNAVAILABLE\";\nfunction raceSignal<T>(job: Promise<T>, signal: AbortSignal): Promise<T> {\n if (signal.aborted) return Promise.reject(signal.reason ?? Object.assign(new Error(\"KV request was aborted\"), { code: ErrorCodes.ABORTED }));\n let remove = () => {};\n const aborted = new Promise<never>((_, reject) => {\n const onAbort = () => reject(signal.reason ?? Object.assign(new Error(\"KV request was aborted\"), { code: ErrorCodes.ABORTED }));\n signal.addEventListener(\"abort\", onAbort, { once: true });\n remove = () => signal.removeEventListener(\"abort\", onAbort);\n });\n return Promise.race([job, aborted]).finally(remove);\n}\n\nexport function createKVReplication(deps: KVReplicationDeps): KVReplicationController {\n const { options, mode, storage, identity, session, authority, pending, scheduler } = deps;\n const emit = (event: ReplicationEventInput): void => emitEvent(deps.emit, scheduler, event);\n const replicas = new Map<string, Opened>();\n const statusInspections = new Set<StatusInspection>();\n let isClosed = false;\n let purgeStarted = false;\n let purgeInProgress = false;\n let previous = deps.previous;\n let pinnedStateReported = false;\n const inProcessProof = new Set<string>();\n let anchorUnavailable = false;\n let consentAnchor: ReplicaConsentAnchor | null = null;\n try {\n consentAnchor = clampConsentAnchor(authority.consentAnchor?.() ?? null, scheduler.now());\n if (consentAnchor?.source === \"first_install\") consentAnchor = null;\n } catch {\n anchorUnavailable = true;\n }\n const grantPolicy = { grantTtlMs: options.grantTtlMs ?? DEFAULT_GRANT_TTL_MS, consentAnchor };\n const quota = options.maxBytes === undefined && options.minFreeBytes === undefined\n ? undefined : { maxBytes: options.maxBytes, minFreeBytes: options.minFreeBytes };\n const policyDeadline = consentAnchor === null ? null : consentDeadlineMs(consentAnchor);\n let scheduledConsentDeadline: number | null = null;\n let cancelConsentTimer: (() => void) | undefined;\n function durableDeadline(): number | null {\n if (storage.kind !== \"indexeddb\" || !deps.stamp) return null;\n try {\n const deadline = storage.lifecycle?.consentDeadline(deps.stamp);\n return typeof deadline === \"number\" && Number.isFinite(deadline) ? deadline : null;\n } catch {\n return null;\n }\n }\n function mintDeadline(): number | null {\n if (policyDeadline === null) return null;\n if (storage.kind !== \"indexeddb\") return policyDeadline;\n const durable = durableDeadline();\n return durable === null ? null : Math.min(policyDeadline, durable);\n }\n function scheduleConsentDeadline(): void {\n const deadline = durableDeadline();\n if (deadline === null || consentDenyStarted || isClosed) return;\n const now = scheduler.now();\n if (!Number.isFinite(now)) return;\n if (scheduledConsentDeadline === deadline && cancelConsentTimer) return;\n scheduledConsentDeadline = deadline;\n cancelConsentTimer?.();\n cancelConsentTimer = scheduler.setTimeout(() => {\n cancelConsentTimer = undefined;\n checkDelivery();\n }, Math.max(0, deadline - now));\n }\n const reportedDeadline = new Set<string>();\n let consentDenyStarted = false;\n function checkDelivery(): ReplicaDeliveryDecision {\n const gate = storage.lifecycle;\n if (!gate) return storage.kind === \"indexeddb\" || anchorUnavailable || deps.stamp !== undefined\n ? { status: \"gated\", gate: \"gate_unavailable\" }\n : { status: \"allow\" };\n if (!deps.stamp) return { status: \"gated\", gate: \"not_established\" };\n if (consentDenyStarted) return { status: \"gated\", gate: \"stamp_stale\" };\n try {\n const decision = gate.checkDelivery(deps.stamp);\n if (decision.status === \"consent_expired\") startConsentDenial();\n if (decision.status !== \"allow\") return decision;\n if (storage.kind === \"indexeddb\") {\n const deadline = durableDeadline();\n if (deadline === null) return { status: \"gated\", gate: \"gate_unavailable\" };\n const now = scheduler.now();\n if (!Number.isFinite(now)) return { status: \"gated\", gate: \"gate_unavailable\" };\n if (now >= deadline) {\n startConsentDenial();\n return { status: \"consent_expired\", code: \"CONSENT_EXPIRED\" };\n }\n }\n return anchorUnavailable ? { status: \"gated\", gate: \"gate_unavailable\" } : decision;\n } catch {\n return { status: \"gated\", gate: \"gate_unavailable\" };\n }\n }\n function markConsentExpired(): boolean {\n if (consentDenyStarted || isClosed || purgeStarted) return false;\n cancelConsentTimer?.();\n cancelConsentTimer = undefined;\n consentDenyStarted = true;\n for (const state of replicas.values()) {\n state.renewalTimer?.();\n state.renewalTimer = undefined;\n state.mintAbort?.abort();\n const id = state.handle?.replicaId;\n if (id && !reportedDeadline.has(id)) {\n reportedDeadline.add(id);\n emit({ type: \"replication.grant\", replicaId: id, action: \"consent_deadline_reached\", code: \"CONSENT_EXPIRED\" });\n }\n }\n return true;\n }\n function observeConsentExpired(stamp: ReplicaSessionStamp): void {\n if (!deps.stamp || stamp.incarnation !== deps.stamp.incarnation || stamp.lifecycleEpoch !== deps.stamp.lifecycleEpoch) return;\n if (markConsentExpired()) emit({ type: \"replication.lifecycle\", action: \"denied\", reason: \"consent_expired\" });\n }\n function startConsentDenial(): void {\n const gate = storage.lifecycle;\n if (!gate || !markConsentExpired()) return;\n void gate.deny({ reason: \"consent_expired\", principal: identity.principal }).then(\n (outcome) => emit({ type: \"replication.lifecycle\", action: outcome.status === \"denied\" ? \"denied\" : outcome.status === \"stale\" ? \"deny_stale\" : outcome.status === \"deleted\" ? \"database_deleted\" : outcome.status === \"marker\" ? \"marker_set\" : \"unguarded\", reason: \"consent_expired\" }),\n () => emit({ type: \"replication.lifecycle\", action: \"deny_failed\", reason: \"consent_expired\" }),\n );\n }\n function deliveryError(decision: Exclude<ReplicaDeliveryDecision, { status: \"allow\" }>): Error {\n return Object.assign(new Error(decision.status === \"consent_expired\" ? \"Replica consent expired\" : \"Replica session is gated\"), {\n code: decision.status === \"consent_expired\" ? decision.code : \"REPLICA_GATED\",\n ...(decision.status === \"gated\" ? { gate: decision.gate } : {}),\n });\n }\n function deliveryReason(code: string): ReplicationReason {\n return code === \"CONSENT_EXPIRED\" || code === \"GRANT_EXPIRED\" ? \"grant_expired\" : code === \"REPLICA_GATED\" ? \"replica_gated\" : \"replica_error\";\n }\n function reportGrantExpiry(prefix: string): void {\n const state = replicas.get(prefix);\n if (!state) return;\n state.reason = \"grant_expired\";\n state.lastError = \"GRANT_EXPIRED\";\n const replicaId = state.handle?.replicaId;\n if (!replicaId || state.reportedExpired) return;\n state.reportedExpired = true;\n emit({ type: \"replication.grant\", replicaId, action: \"expired\", code: \"GRANT_EXPIRED\" });\n }\n function reportGrantCap(state: Opened, handle: KVReplicaHandle, grant: ReplicaGrantInfo | null | undefined): void {\n if (\n !grant?.unconstrained || !handle.replicaId ||\n typeof grant.effectiveExpiresAt !== \"number\" || !Number.isFinite(grant.effectiveExpiresAt) ||\n !(grant.expiresAt === null || grant.effectiveExpiresAt < grant.expiresAt)\n ) return;\n const capKey = `${grant.cid}:${grant.effectiveExpiresAt}`;\n if (state.reportedCappedCid === capKey) return;\n state.reportedCappedCid = capKey;\n emit({ type: \"replication.grant\", replicaId: handle.replicaId, action: \"capped\", effectiveExpiresAt: nowDate(grant.effectiveExpiresAt) });\n }\n const configuredPrefix = (path: string) => options.prefixes.find((prefix) => kvPrefixCovers(prefix, path));\n function recordRevocation(prefix: string, error: unknown): void {\n if (errorCode(error) !== \"GRANT_REVOKED\") return;\n const state = replicas.get(prefix) ?? {};\n state.authorityRevoked = true;\n state.reason = \"grant_revoked\";\n state.lastError = \"GRANT_REVOKED\";\n replicas.set(prefix, state);\n }\n function markRootUnsupported(prefix: string): void {\n const state = replicas.get(prefix) ?? {};\n const firstRefusal = state.lastError !== \"REPLICATION_ROOT_UNSUPPORTED\";\n state.reason = \"replica_unavailable\";\n state.lastError = \"REPLICATION_ROOT_UNSUPPORTED\";\n replicas.set(prefix, state);\n if (firstRefusal) {\n emit({ type: \"replication.state\", space: session.space, replica: prefix, state: \"unavailable\", code: \"REPLICATION_ROOT_UNSUPPORTED\" });\n }\n }\n function unsupportedRoot(prefix: string): Error {\n markRootUnsupported(prefix);\n return Object.assign(new Error(\"This node doesn't support whole-space sync yet.\"), { code: \"REPLICATION_ROOT_UNSUPPORTED\" });\n }\n\n\n function canReuseInstalled(grant: ReplicaGrantInfo | null | undefined, sessionOnly: boolean): boolean {\n if (!grant?.unconstrained) return false;\n if (!deps.stamp) return true;\n if (!sessionOnly && consentAnchor === null) return false;\n const now = scheduler.now();\n const deadline = storage.kind === \"indexeddb\" ? durableDeadline() : policyDeadline ?? grant.consentDeadline;\n return grant.state === \"active\" &&\n typeof grant.installedAt === \"number\" && Number.isFinite(grant.installedAt) &&\n typeof grant.effectiveExpiresAt === \"number\" && Number.isFinite(grant.effectiveExpiresAt) &&\n typeof grant.consentDeadline === \"number\" && Number.isFinite(grant.consentDeadline) &&\n typeof deadline === \"number\" && Number.isFinite(deadline) &&\n Number.isFinite(now) && now >= grant.installedAt &&\n (grant.expiresAt === null || typeof grant.expiresAt === \"number\" && Number.isFinite(grant.expiresAt) && now < grant.expiresAt) &&\n now < Math.min(grant.effectiveExpiresAt, grant.consentDeadline, deadline);\n }\n function sessionRefusal(prefix: string): string | undefined {\n try {\n if (authority.sessionOnly !== true) return undefined;\n // A signed get+sync grant for the configured prefix covers its contained get key/list path.\n const grant = authority.sessionGrant(prefix);\n return \"refused\" in grant ? grant.refused : undefined;\n } catch {\n return \"NOT_COVERED\";\n }\n }\n\n\n async function open(prefix: string): Promise<KVReplicaHandle> {\n const delivery = checkDelivery();\n if (delivery.status !== \"allow\") throw deliveryError(delivery);\n if (isClosed || purgeStarted) throw Object.assign(new Error(\"Replication controller is closed\"), { code: \"REPLICA_CLOSED\" });\n let state = replicas.get(prefix);\n if (state?.handle) return state.handle;\n if (state?.opening) return state.opening;\n state ??= {};\n replicas.set(prefix, state);\n if (state.unsupported) throw Object.assign(new Error(\"Replication runtime is unsupported\"), { code: \"RUNTIME_UNSUPPORTED\" });\n if (state.retryAt !== undefined && scheduler.now() < state.retryAt) throw Object.assign(new Error(\"Replica open is backing off\"), { code: state.lastError ?? \"REPLICA_UNAVAILABLE\" });\n if (requiresSecretsOptIn(session.space, prefix) && !options.allowSecrets) {\n const firstRefusal = state.lastError !== \"SECRETS_OPT_IN_REQUIRED\";\n state.reason = \"replica_unavailable\";\n state.lastError = \"SECRETS_OPT_IN_REQUIRED\";\n if (firstRefusal) emit({ type: \"replication.state\", space: session.space, replica: prefix, state: \"unavailable\", code: \"SECRETS_OPT_IN_REQUIRED\" });\n throw Object.assign(new Error(\"Replication requires allowSecrets for this space or prefix\"), { code: \"SECRETS_OPT_IN_REQUIRED\" });\n }\n state.opening = (async () => {\n if (previous) { await previous; previous = undefined; }\n const delivery = checkDelivery();\n if (delivery.status !== \"allow\") throw deliveryError(delivery);\n const sessionOnly = authority.sessionOnly === true;\n const sessionGrant = authority.sessionGrant(prefix);\n const delegated = \"refused\" in sessionGrant ? undefined : sessionGrant;\n const plan = sessionOnly ? undefined : authority.plan(prefix);\n let refusalCode: string | undefined;\n if (\"refused\" in sessionGrant) refusalCode = sessionGrant.refused;\n if (plan && \"refused\" in plan) refusalCode ??= plan.refused;\n if (deps.stamp && consentAnchor === null && !sessionOnly) refusalCode = \"REPLICA_GATED\";\n let device: ReplicaDevice | undefined;\n if (delegated) { device = delegated.device; state!.strategy = \"session\"; }\n const spec = {\n identity, space: session.space, prefix, allowSecrets: options.allowSecrets, grantPolicy,\n ...(quota ? { quota } : {}),\n ...(deps.stamp ? { stamp: deps.stamp } : {}),\n ...(device ? { device } : {}),\n ...(deps.fetch ? { fetch: deps.fetch } : {}),\n onPeerCommit: (info: ReplicaPeerCommit) => {\n if (isClosed || purgeStarted || state!.handle === undefined) return;\n emit({\n type: \"replication.sync\", space: session.space, replica: prefix,\n trigger: \"peer\", origin: \"peer\", outcome: \"ok\", durationMs: 0, lagMs: null,\n ...(info.changes === undefined ? {} : { changes: info.changes }),\n ...(info.coverage === undefined ? {} : { coverage: info.coverage }),\n });\n },\n };\n if (prefix === \"/\" && deps.nodeFeatures !== undefined && !deps.nodeFeatures.includes(\"kv-sync-root\")) {\n throw unsupportedRoot(prefix);\n }\n const handle = await storage.open(spec);\n state!.handle = handle;\n const afterOpen = checkDelivery();\n if (afterOpen.status !== \"allow\") throw deliveryError(afterOpen);\n emit({ type: \"replication.state\", space: session.space, replica: prefix, state: \"opened\" });\n const runtimePlan = !sessionOnly && plan && !(\"refused\" in plan) ? plan : undefined;\n let installed = runtimePlan || delegated ? await handle.grant() : undefined;\n if (installed && !canReuseInstalled(installed, sessionOnly)) {\n if (installed.unconstrained) refusalCode = consentAnchor === null && !sessionOnly ? \"REPLICA_GATED\" : \"GRANT_EXPIRED\";\n installed = undefined;\n }\n let mintedExpiryMs: number | undefined;\n if (delegated && consentAnchor !== null) {\n const beforeInstall = checkDelivery();\n if (beforeInstall.status !== \"allow\") throw deliveryError(beforeInstall);\n installed = await handle.installGrant(delegated.ucan);\n } else if (runtimePlan) {\n if (!installed || !installed.unconstrained || installed.parentCid !== runtimePlan.parentCid || (installed.expiresAt !== null && runtimePlan.expiresAt > installed.expiresAt + 300_000)) {\n const deadline = mintDeadline();\n const expiryMs = mintRemainingMs({ now: scheduler.now(), grantTtlMs: grantPolicy.grantTtlMs, consentDeadline: deadline ?? Number.NaN });\n if (expiryMs > 0) {\n try {\n const mintAbort = new AbortController();\n state!.mintAbort = mintAbort;\n const minted = await authority.mint(handle.deviceDid, prefix, mintAbort.signal, { expiryMs });\n const beforeInstall = checkDelivery();\n if (beforeInstall.status !== \"allow\") throw deliveryError(beforeInstall);\n installed = await handle.installGrant(minted.ucan);\n state!.strategy = \"minted\";\n mintedExpiryMs = expiryMs;\n } catch (error) {\n if (errorCode(error) === \"CONSENT_EXPIRED\" || errorCode(error) === \"REPLICA_GATED\" || !installed?.unconstrained) throw error;\n } finally { state!.mintAbort = undefined; }\n }\n }\n if (installed?.unconstrained) { state!.strategy ??= \"installed\"; state!.reason = undefined; }\n } else if ((delegated || sessionOnly) && installed?.unconstrained) {\n state!.strategy = \"installed\";\n }\n const beforeGrantEvent = checkDelivery();\n if (beforeGrantEvent.status !== \"allow\") throw deliveryError(beforeGrantEvent);\n reportGrantCap(state!, handle, installed);\n if (mintedExpiryMs !== undefined) state!.reportedExpired = false;\n if (mintedExpiryMs !== undefined && handle.replicaId) emit({ type: \"replication.grant\", replicaId: handle.replicaId, action: \"minted\", expiryMs: mintedExpiryMs });\n if (!installed?.unconstrained) {\n state!.reason = \"grant_missing\";\n state!.lastError = refusalCode ?? \"SESSION_LACKS_SYNC\";\n emit({ type: \"replication.state\", space: session.space, replica: prefix, state: \"grant_missing\", code: state!.lastError });\n } else emit({ type: \"replication.state\", space: session.space, replica: prefix, state: \"grant_installed\", strategy: state!.strategy });\n if (isClosed || purgeStarted) {\n await handle.close();\n throw Object.assign(new Error(\"Replication controller is closed\"), { code: \"REPLICA_CLOSED\" });\n }\n if (installed?.unconstrained) await maybeRenew(prefix, handle, installed, runtimePlan);\n if (mode === \"background\" && state!.reason !== \"grant_missing\") {\n void syncPrefix(prefix, \"start\").catch(() => undefined);\n schedule(prefix);\n }\n return handle;\n })();\n try { return await state.opening; } catch (error) {\n const code = errorCode(error);\n if (code === \"CONSENT_EXPIRED\") startConsentDenial();\n recordRevocation(prefix, error);\n if (code === \"REPLICA_GATED\" || code === \"CONSENT_EXPIRED\") state.reason = deliveryReason(code);\n else if (code !== \"GRANT_REVOKED\") state.reason = \"replica_unavailable\";\n state.lastError = code;\n state.failures = (state.failures ?? 0) + 1;\n if (code === \"RUNTIME_UNSUPPORTED\") state.unsupported = true;\n else if (code !== \"REPLICA_CLOSED\" && code !== \"REPLICATION_ROOT_UNSUPPORTED\" && code !== \"REPLICA_GATED\" && code !== \"CONSENT_EXPIRED\") state.retryAt = scheduler.now() + Math.min(300_000, 5_000 * 2 ** Math.min(state.failures - 1, 6));\n state.handle?.close().catch(() => undefined);\n state.handle = undefined;\n throw error;\n } finally { state.opening = undefined; }\n }\n\n function scheduleRenewal(prefix: string, handle: KVReplicaHandle, grant: ReplicaGrantInfo, plan: ReplicaDerivationPlan): void {\n const state = replicas.get(prefix);\n state?.renewalTimer?.();\n if (state) state.renewalTimer = undefined;\n if (!state || isClosed || purgeStarted || plan.path !== \"session\" || !authority.canRenew) return;\n const { installedAt, effectiveExpiresAt } = grant;\n const deadline = mintDeadline();\n if (\n typeof installedAt !== \"number\" || !Number.isFinite(installedAt) ||\n typeof effectiveExpiresAt !== \"number\" || !Number.isFinite(effectiveExpiresAt) ||\n !(effectiveExpiresAt > installedAt) || deadline === null\n ) return;\n const threshold = installedAt + (effectiveExpiresAt - installedAt) * (1 - RENEW_BELOW_FRACTION);\n const now = scheduler.now();\n if (!Number.isFinite(now) || !(threshold < deadline) || now > threshold) return;\n state.renewalTimer = scheduler.setTimeout(() => {\n state.renewalTimer = undefined;\n void maybeRenew(prefix, handle).catch(() => undefined);\n }, Math.max(0, Math.floor(threshold) + 1 - now));\n }\n\n async function maybeRenew(prefix: string, handle: KVReplicaHandle, knownGrant?: ReplicaGrantInfo, knownPlan?: ReplicaDerivationPlan): Promise<void> {\n const state = replicas.get(prefix);\n if (!state || state.handle !== handle || isClosed || purgeStarted || !authority.canRenew) return;\n if (state.renewing) return state.renewing;\n const decision = checkDelivery();\n if (decision.status !== \"allow\") return;\n const grant = knownGrant ?? await handle.grant();\n if (!grant?.unconstrained) return;\n const { installedAt, effectiveExpiresAt } = grant;\n const deadline = mintDeadline();\n if (\n typeof installedAt !== \"number\" || !Number.isFinite(installedAt) ||\n typeof effectiveExpiresAt !== \"number\" || !Number.isFinite(effectiveExpiresAt) ||\n deadline === null\n ) return;\n const now = scheduler.now();\n if (!needsSilentRenewal({ now, installedAt, effectiveExpiresAt, consentDeadline: deadline })) {\n if (knownPlan) scheduleRenewal(prefix, handle, grant, knownPlan);\n return;\n }\n let plan: ReplicaDerivationPlan | undefined = knownPlan;\n try {\n if (!plan) {\n const selected = authority.plan(prefix);\n if (\"refused\" in selected) {\n if (handle.replicaId) emit({ type: \"replication.grant\", replicaId: handle.replicaId, action: \"renewal_refused\", code: selected.refused });\n return;\n }\n plan = selected;\n }\n } catch {\n if (handle.replicaId) emit({ type: \"replication.grant\", replicaId: handle.replicaId, action: \"renewal_deferred\" });\n return;\n }\n if (plan?.path !== \"session\") {\n if (handle.replicaId && state.reportedRenewalUnqualifiedCid !== grant.cid) {\n state.reportedRenewalUnqualifiedCid = grant.cid;\n emit({ type: \"replication.grant\", replicaId: handle.replicaId, action: \"renewal_deferred\" });\n }\n return;\n }\n const expiryMs = mintRemainingMs({ now, grantTtlMs: grantPolicy.grantTtlMs, consentDeadline: deadline });\n if (!(expiryMs > 0)) return;\n state.renewalTimer?.();\n state.renewalTimer = undefined;\n const mintAbort = new AbortController();\n state.mintAbort = mintAbort;\n const job = Promise.resolve().then(async () => {\n const minted = await authority.mint(handle.deviceDid, prefix, mintAbort.signal, { expiryMs, renewalOnly: true });\n const beforeInstall = checkDelivery();\n if (beforeInstall.status !== \"allow\") throw deliveryError(beforeInstall);\n const installed = await handle.installGrant(minted.ucan);\n const beforeEvent = checkDelivery();\n if (beforeEvent.status !== \"allow\") throw deliveryError(beforeEvent);\n reportGrantCap(state, handle, installed);\n state.reportedExpired = false;\n if (state.reason === \"grant_expired\") state.reason = undefined;\n if (state.lastError === \"GRANT_EXPIRED\") state.lastError = undefined;\n if (handle.replicaId) emit({ type: \"replication.grant\", replicaId: handle.replicaId, action: \"renewed\", expiryMs });\n if (typeof installed.effectiveExpiresAt === \"number\" && installed.effectiveExpiresAt > effectiveExpiresAt) {\n scheduleRenewal(prefix, handle, installed, plan);\n }\n });\n state.renewing = job;\n try {\n await job;\n } catch (error) {\n const code = errorCode(error);\n if (code === \"CONSENT_EXPIRED\" || code === \"REPLICA_GATED\") throw error;\n if (!isClosed && handle.replicaId) {\n const refused = typeof error === \"object\" && error !== null && \"refused\" in error && typeof error.refused === \"string\" ? error.refused : null;\n emit({ type: \"replication.grant\", replicaId: handle.replicaId, action: refused ? \"renewal_refused\" : \"renewal_deferred\", code: refused ?? code });\n }\n } finally {\n state.renewing = undefined;\n if (state.mintAbort === mintAbort) state.mintAbort = undefined;\n }\n }\n\n function schedule(prefix: string): void {\n const state = replicas.get(prefix);\n if (!state || mode !== \"background\" || isClosed || purgeStarted) return;\n state.timer = scheduler.setTimeout(() => {\n state.timer = undefined;\n void syncPrefix(prefix, \"interval\").catch(() => undefined).finally(() => schedule(prefix));\n }, options.syncIntervalMs);\n }\n\n async function syncPrefix(prefix: string, trigger: \"start\" | \"interval\" | \"stale_read\" | \"manual\", signal?: AbortSignal, context?: SyncContext): Promise<LocalSyncResult> {\n if (prefix === \"/\" && deps.nodeFeatures !== undefined && !deps.nodeFeatures.includes(\"kv-sync-root\")) {\n throw unsupportedRoot(prefix);\n }\n const initialRefusal = sessionRefusal(prefix);\n if (initialRefusal) throw Object.assign(new Error(\"Current session does not cover replica sync\"), { code: initialRefusal });\n const handle = await open(prefix);\n const state = replicas.get(prefix)!;\n if (state.sync) return state.sync;\n const abort = new AbortController();\n const syncContext = context ?? {};\n state.syncContext = syncContext;\n state.abort = abort;\n const abortFromCaller = () => {\n syncContext.abortCause ??= \"caller\";\n abort.abort(signal?.reason);\n };\n signal?.addEventListener(\"abort\", abortFromCaller, { once: true });\n const started = scheduler.now();\n let job!: Promise<LocalSyncResult>;\n job = (async () => {\n try {\n const syncStartEpoch = (await pending.read()).committedEpoch;\n const beforeSync = checkDelivery();\n if (beforeSync.status !== \"allow\") throw deliveryError(beforeSync);\n await maybeRenew(prefix, handle);\n const afterRenewal = checkDelivery();\n if (afterRenewal.status !== \"allow\") throw deliveryError(afterRenewal);\n const refusal = sessionRefusal(prefix);\n if (refusal) throw Object.assign(new Error(\"Current session does not cover replica sync\"), { code: refusal });\n const result = await handle.sync({ signal: abort.signal, syncStartEpoch });\n const afterSyncDelivery = checkDelivery();\n if (afterSyncDelivery.status !== \"allow\") throw deliveryError(afterSyncDelivery);\n if (result.status === \"busy\") {\n emit({ type: \"replication.sync\", space: session.space, replica: prefix, trigger, outcome: \"busy\", durationMs: scheduler.now() - started, lagMs: null });\n return result;\n }\n inProcessProof.add(prefix);\n const snapshot = await pending.read();\n const beforePending = checkDelivery();\n if (beforePending.status !== \"allow\") throw deliveryError(beforePending);\n const clearedCandidates = snapshot.records.some((r) => r.state === \"committed\" && r.epoch !== null && r.epoch <= syncStartEpoch && kvPrefixCovers(prefix, r.key));\n const cleared = clearedCandidates ? await pending.update((s) => afterSync(s, prefix, syncStartEpoch)) : 0;\n const beforeResult = checkDelivery();\n if (beforeResult.status !== \"allow\") throw deliveryError(beforeResult);\n emit({ type: \"replication.sync\", space: session.space, replica: prefix, trigger, outcome: \"ok\", durationMs: scheduler.now() - started, lagMs: null, pendingCleared: cleared, pages: result.pages, changes: result.changes, deleted: result.deleted, fetched: result.fetched, contentMissing: result.contentMissing, coverage: result.coverage });\n return result;\n } catch (error) {\n const code = errorCode(error); state.lastError = code; recordRevocation(prefix, error);\n if (code === \"CONSENT_EXPIRED\") startConsentDenial();\n emit({ type: \"replication.sync\", space: session.space, replica: prefix, trigger, outcome: abort.signal.aborted ? \"aborted\" : \"error\", class: code === \"CONSENT_EXPIRED\" || code === \"REPLICA_GATED\" ? \"lifecycle\" : code === \"NETWORK_ERROR\" || code === \"TIMEOUT\" ? \"offline\" : \"node\", code, durationMs: scheduler.now() - started, lagMs: null });\n throw error;\n } finally { signal?.removeEventListener(\"abort\", abortFromCaller); state.abort = undefined; }\n })();\n state.sync = job;\n try { return await job; } finally {\n if (state.sync === job) {\n state.sync = undefined;\n state.syncContext = undefined;\n }\n }\n }\n type DrainedSync = { settled: false } | { settled: true; result: LocalSyncResult } | { settled: true; error: unknown };\n async function drainForegroundSync(prefix: string, sync: Promise<LocalSyncResult>): Promise<DrainedSync> {\n let cancel = () => {};\n const settled: Promise<DrainedSync> = sync.then(\n (result) => ({ settled: true, result }),\n (error: unknown) => ({ settled: true, error }),\n );\n const timeout = new Promise<DrainedSync>((resolve) => {\n cancel = scheduler.setTimeout(() => resolve({ settled: false }), CLOSE_TIMEOUT_MS);\n });\n try {\n const drained = await Promise.race([settled, timeout]);\n if (!drained.settled) emit({ type: \"replication.sync\", space: session.space, replica: prefix, trigger: \"stale_read\", outcome: \"aborted\", code: \"DRAIN_TIMEOUT\", durationMs: CLOSE_TIMEOUT_MS, lagMs: null });\n return drained;\n } finally { cancel(); }\n }\n function validateReadMeta(meta: LocalReadMeta): void {\n if (meta.coverage !== \"complete\") throw Object.assign(new Error(\"Replica coverage changed before the local read\"), { code: \"COVERAGE_INCOMPLETE\" });\n if (meta.authority !== \"valid\") {\n const code = meta.authority === \"expired\" ? \"GRANT_EXPIRED\" : meta.authority === \"revoked\" ? \"GRANT_REVOKED\" : \"GRANT_NOT_YET_VALID\";\n throw Object.assign(new Error(\"Replica authority changed before the local read\"), { code });\n }\n }\n function reasonForReadMetaCode(code: string): ReplicationReason {\n if (code === \"COVERAGE_INCOMPLETE\") return \"coverage_incomplete\";\n if (code === \"GRANT_EXPIRED\") return \"grant_expired\";\n if (code === \"GRANT_REVOKED\") return \"grant_revoked\";\n if (code === \"GRANT_NOT_YET_VALID\") return \"grant_not_yet_valid\";\n return \"replica_error\";\n }\n async function statusAfterDrain(handle: KVReplicaHandle, signal: AbortSignal): Promise<LocalReplicaStatus> {\n let cancel = () => {};\n const timeout = new Promise<never>((_resolve, reject) => {\n cancel = scheduler.setTimeout(\n () => reject(Object.assign(new Error(\"Replica status refresh timed out\"), { code: \"STATUS_TIMEOUT\" })),\n STATUS_REFRESH_TIMEOUT_MS,\n );\n });\n try {\n return await raceSignal(Promise.race([handle.status(), timeout]), signal);\n } finally { cancel(); }\n }\n function staleSyncOutcome(outcome: { result: LocalSyncResult } | { error: unknown }, timedOut: boolean, currentStatus: LocalReplicaStatus): { status: LocalReplicaStatus; syncError?: string; syncedBeforeRead: boolean; failure?: \"busy\" | \"error\" } {\n if (\"error\" in outcome) {\n const code = errorCode(outcome.error);\n if (code === \"NETWORK_ERROR\" || (timedOut && (code === \"ABORTED\" || code === \"TIMEOUT\"))) return { status: currentStatus, syncedBeforeRead: false, syncError: code === \"NETWORK_ERROR\" ? code : \"TIMEOUT\" };\n return { status: currentStatus, syncedBeforeRead: false, syncError: code, failure: \"error\" };\n }\n if (outcome.result.status === \"busy\") return { status: currentStatus, syncedBeforeRead: false, failure: \"busy\" };\n return { status: currentStatus, syncedBeforeRead: true };\n }\n async function freshness(prefix: string, handle: KVReplicaHandle, signal: AbortSignal): Promise<{ status: LocalReplicaStatus; syncError?: string; syncedBeforeRead: boolean; failure?: \"busy\" | \"error\" }> {\n let currentStatus = await handle.status();\n const syncedAt = currentStatus.lastSyncAt === null ? null : Date.parse(currentStatus.lastSyncAt);\n const stale = syncedAt === null || !Number.isFinite(syncedAt) || scheduler.now() - syncedAt > options.maxStalenessMs;\n let snapshot;\n try { snapshot = await pending.read(); } catch (error) { return { status: currentStatus, syncedBeforeRead: false, syncError: errorCode(error), failure: \"error\" }; }\n const behind = currentStatus.syncedThroughEpoch < snapshot.committedEpoch;\n const unproven = !pending.durable && !inProcessProof.has(prefix);\n if ((stale || behind || unproven) && !signal.aborted) {\n const syncController = mode === \"foreground\" ? new AbortController() : undefined;\n const syncState = replicas.get(prefix);\n const ownsSync = !syncState?.sync;\n const syncContext = syncState?.syncContext ?? {};\n const abortFromCaller = () => {\n if (ownsSync) syncContext.abortCause ??= \"caller\";\n syncController?.abort(signal.reason);\n };\n if (syncController) signal.addEventListener(\"abort\", abortFromCaller, { once: true });\n let cancelTimeout = () => {};\n const timeout = new Promise<{ timeout: true }>((resolve) => {\n cancelTimeout = scheduler.setTimeout(() => resolve({ timeout: true }), options.staleSyncTimeoutMs);\n });\n let cancelAbort = () => {};\n const callerAbort = new Promise<{ callerAborted: true }>((resolve) => {\n if (signal.aborted) resolve({ callerAborted: true });\n else {\n const listener = () => resolve({ callerAborted: true });\n signal.addEventListener(\"abort\", listener, { once: true });\n cancelAbort = () => signal.removeEventListener(\"abort\", listener);\n }\n });\n const sync = syncPrefix(prefix, \"stale_read\", syncController?.signal, syncContext);\n const outcome = await Promise.race([\n sync.then((result) => ({ result }), (error: unknown) => ({ error })),\n timeout,\n callerAbort,\n ]);\n cancelTimeout();\n cancelAbort();\n signal.removeEventListener(\"abort\", abortFromCaller);\n if (\"callerAborted\" in outcome) {\n if (syncController && ownsSync) {\n syncContext.abortCause ??= \"caller\";\n syncController.abort(signal.reason);\n await drainForegroundSync(prefix, sync);\n }\n return { status: currentStatus, syncedBeforeRead: false, syncError: cancellationCode(signal) };\n }\n if (\"timeout\" in outcome) {\n if (ownsSync) {\n syncContext.abortCause ??= \"timeout\";\n syncController?.abort(Object.assign(new Error(\"Stale-read sync timed out\"), { code: \"TIMEOUT\" }));\n }\n const drained = syncController ? await drainForegroundSync(prefix, sync) : undefined;\n if (signal.aborted) return { status: currentStatus, syncedBeforeRead: false, syncError: cancellationCode(signal) };\n if (drained && !drained.settled) return { status: currentStatus, syncedBeforeRead: false, syncError: \"DRAIN_TIMEOUT\", failure: \"error\" };\n try { currentStatus = await statusAfterDrain(handle, signal); }\n catch (error) {\n if (signal.aborted) return { status: currentStatus, syncedBeforeRead: false, syncError: cancellationCode(signal), failure: \"error\" };\n return { status: currentStatus, syncedBeforeRead: false, syncError: errorCode(error), failure: \"error\" };\n }\n const timeoutAbort = syncContext.abortCause === \"timeout\";\n return staleSyncOutcome(\n drained?.settled ? (\"result\" in drained ? { result: drained.result } : { error: drained.error }) : { error: Object.assign(new Error(\"Stale-read sync timed out\"), { code: \"TIMEOUT\" }) },\n timeoutAbort || !syncController,\n currentStatus,\n );\n }\n if (\"error\" in outcome) return staleSyncOutcome({ error: outcome.error }, false, currentStatus);\n if (outcome.result.status === \"busy\") return { status: currentStatus, syncedBeforeRead: false, failure: \"busy\" };\n currentStatus = await handle.status();\n return { status: currentStatus, syncedBeforeRead: true };\n }\n return { status: currentStatus, syncedBeforeRead: false };\n }\n\n function readEvent(op: \"get\" | \"list\", path: string, prefix: string | null, source: \"replica\" | \"network\" | \"none\", reason: ReplicationReason, outcome: \"found\" | \"not_found\" | \"error\", started: number, extra: Partial<Extract<ReplicationEvent, { type: \"replication.read\" }>> = {}): void {\n if (prefix !== null && reason === \"grant_expired\" && extra.code !== \"CONSENT_EXPIRED\") reportGrantExpiry(prefix);\n emit({ type: \"replication.read\", op, space: session.space, key: path, replica: prefix, source, reason, outcome, latencyMs: scheduler.now() - started, stalenessMs: null, coverage: null, authority: null, ...extra });\n }\n async function networkRead<T>(\n network: () => Promise<Result<T>>, op: \"get\" | \"list\", path: string, prefix: string | null,\n reason: ReplicationReason, started: number,\n extra: Partial<Extract<ReplicationEvent, { type: \"replication.read\" }>> = {},\n ): Promise<Result<T>> {\n let outcome: \"found\" | \"not_found\" | \"error\" = \"error\";\n try {\n const result = await network();\n outcome = result.ok ? \"found\" : op === \"get\" && (reason === \"pending_write\" || reason === \"not_covered\") && result.error.code === ErrorCodes.KV_NOT_FOUND ? \"not_found\" : \"error\";\n return result;\n } finally {\n readEvent(op, path, prefix, \"network\", reason, outcome, started, extra);\n }\n }\n async function verifyGet<T>(\n r: { space: string; path: string; signal: AbortSignal; network: () => Promise<Result<KVResponse<T>>> },\n local: Result<KVResponse<T>>,\n reason: ReplicationReason,\n started: number,\n extra: Partial<Extract<ReplicationEvent, { type: \"replication.read\" }>>,\n ): Promise<Result<KVResponse<T>>> {\n const prefix = configuredPrefix(r.path) ?? null;\n const localFound = local.ok;\n const localNotFound = !local.ok && local.error.code === ErrorCodes.KV_NOT_FOUND;\n const outcome = localFound ? \"found\" : localNotFound ? \"not_found\" : \"error\";\n try {\n const network = await raceSignal(r.network(), r.signal);\n if (r.signal.aborted) {\n readEvent(\"get\", r.path, prefix, \"none\", \"aborted\", \"error\", started, { ...extra, verify: \"aborted\" });\n return abortedResult(r.signal);\n }\n const delivery = checkDelivery();\n if (delivery.status !== \"allow\") {\n readEvent(\"get\", r.path, prefix, \"network\", delivery.status === \"consent_expired\" ? \"grant_expired\" : \"replica_gated\", network.ok ? \"found\" : \"error\", started, { code: delivery.status === \"consent_expired\" ? delivery.code : \"REPLICA_GATED\" });\n return network;\n }\n const refusal = prefix === null ? undefined : sessionRefusal(prefix);\n if (refusal) {\n readEvent(\"get\", r.path, prefix, \"network\", \"grant_missing\", network.ok ? \"found\" : \"error\", started, { code: refusal });\n return network;\n }\n if (!network.ok && network.error.code !== ErrorCodes.KV_NOT_FOUND) {\n readEvent(\"get\", r.path, prefix, \"replica\", reason, outcome, started, { ...extra, code: network.error.code, verify: \"error\" });\n return local;\n }\n const networkFound = network.ok;\n const networkNotFound = !network.ok && network.error.code === ErrorCodes.KV_NOT_FOUND;\n const localEtag = local.ok ? local.data.headers.etag ?? null : null;\n const networkEtag = network.ok ? network.data.headers.etag ?? null : null;\n const matches = localFound && networkFound ? localEtag === networkEtag : localNotFound && networkNotFound;\n const verify = matches ? \"match\" : \"diverged\";\n if (!matches) {\n emit({\n type: \"replication.divergence\",\n op: \"get\",\n space: r.space,\n key: r.path,\n replica: prefix ?? \"\",\n kind: localFound && networkFound ? \"value\" : localNotFound ? \"missing_local\" : \"extra_local\",\n localEtag,\n networkEtag,\n stalenessMs: typeof extra.stalenessMs === \"number\" ? extra.stalenessMs : null,\n });\n }\n readEvent(\"get\", r.path, prefix, \"replica\", reason, outcome, started, { ...extra, verify });\n return local;\n } catch (error) {\n if (r.signal.aborted) {\n readEvent(\"get\", r.path, prefix, \"none\", \"aborted\", \"error\", started, { ...extra, verify: \"aborted\" });\n return abortedResult(r.signal);\n }\n const delivery = checkDelivery();\n if (delivery.status !== \"allow\") {\n readEvent(\"get\", r.path, prefix, \"network\", delivery.status === \"consent_expired\" ? \"grant_expired\" : \"replica_gated\", \"error\", started, { code: delivery.status === \"consent_expired\" ? delivery.code : \"REPLICA_GATED\" });\n return err(wrapError(\"kv\", error));\n }\n const refusal = prefix === null ? undefined : sessionRefusal(prefix);\n if (refusal) {\n readEvent(\"get\", r.path, prefix, \"network\", \"grant_missing\", \"error\", started, { code: refusal });\n return err(wrapError(\"kv\", error));\n }\n readEvent(\"get\", r.path, prefix, \"replica\", reason, outcome, started, { ...extra, code: errorCode(error), verify: \"error\" });\n return local;\n }\n }\n async function verifyList(\n r: { space: string; listPath: string; signal: AbortSignal; network: () => Promise<Result<KVListPage>> },\n local: KVListPage,\n started: number,\n extra: Partial<Extract<ReplicationEvent, { type: \"replication.read\" }>>,\n ): Promise<Result<KVListPage>> {\n const prefix = listPathCovered(options.prefixes, r.listPath) ?? null;\n try {\n const network = await raceSignal(r.network(), r.signal);\n if (r.signal.aborted) {\n readEvent(\"list\", r.listPath, prefix, \"none\", \"aborted\", \"error\", started, { ...extra, verify: \"aborted\" });\n return abortedResult(r.signal);\n }\n const delivery = checkDelivery();\n if (delivery.status !== \"allow\") {\n readEvent(\"list\", r.listPath, prefix, \"network\", delivery.status === \"consent_expired\" ? \"grant_expired\" : \"replica_gated\", network.ok ? \"found\" : \"error\", started, { code: delivery.status === \"consent_expired\" ? delivery.code : \"REPLICA_GATED\" });\n return network;\n }\n const refusal = prefix === null ? undefined : sessionRefusal(prefix);\n if (refusal) {\n readEvent(\"list\", r.listPath, prefix, \"network\", \"grant_missing\", network.ok ? \"found\" : \"error\", started, { code: refusal });\n return network;\n }\n if (!network.ok) {\n readEvent(\"list\", r.listPath, prefix, \"replica\", \"hit\", \"found\", started, { ...extra, code: network.error.code, verify: \"error\" });\n return ok(local);\n }\n const localSet = new Set(local.keys);\n const networkSet = new Set(network.data.keys);\n const localOnly = local.keys.filter((key) => !networkSet.has(key));\n const networkOnly = network.data.keys.filter((key) => !localSet.has(key));\n const sameKeys = localOnly.length === 0 && networkOnly.length === 0;\n const sameOrder = sameKeys && local.keys.every((key, index) => key === network.data.keys[index]);\n const verify = sameOrder ? \"match\" : \"diverged\";\n if (!sameKeys || !sameOrder) {\n emit({\n type: \"replication.divergence\",\n op: \"list\",\n space: r.space,\n key: r.listPath,\n replica: prefix ?? \"\",\n kind: sameKeys ? \"order\" : \"keys\",\n ...(!sameKeys ? { localOnly, networkOnly } : {}),\n stalenessMs: typeof extra.stalenessMs === \"number\" ? extra.stalenessMs : null,\n });\n }\n readEvent(\"list\", r.listPath, prefix, \"replica\", \"hit\", \"found\", started, { ...extra, verify });\n return ok(local);\n } catch (error) {\n if (r.signal.aborted) {\n readEvent(\"list\", r.listPath, prefix, \"none\", \"aborted\", \"error\", started, { ...extra, verify: \"aborted\" });\n return abortedResult(r.signal);\n }\n const delivery = checkDelivery();\n if (delivery.status !== \"allow\") {\n readEvent(\"list\", r.listPath, prefix, \"network\", delivery.status === \"consent_expired\" ? \"grant_expired\" : \"replica_gated\", \"error\", started, { code: delivery.status === \"consent_expired\" ? delivery.code : \"REPLICA_GATED\" });\n return err(wrapError(\"kv\", error));\n }\n const refusal = prefix === null ? undefined : sessionRefusal(prefix);\n if (refusal) {\n readEvent(\"list\", r.listPath, prefix, \"network\", \"grant_missing\", \"error\", started, { code: refusal });\n return err(wrapError(\"kv\", error));\n }\n readEvent(\"list\", r.listPath, prefix, \"replica\", \"hit\", \"found\", started, { ...extra, code: errorCode(error), verify: \"error\" });\n return ok(local);\n }\n }\n async function reportExistingPins(): Promise<void> {\n if (pinnedStateReported) return;\n pinnedStateReported = true;\n try {\n const records = await pending.read();\n const pins = pinnedKeys(records, \"\", scheduler.now());\n if (pins.length > 0) emit({ type: \"replication.state\", space: session.space, state: \"pinned\", count: pins.length, keys: pins.map((pin) => pin.key) });\n } catch { emit({ type: \"replication.state\", space: session.space, state: \"pending_store_error\", code: \"STORAGE_ERROR\" }); }\n }\n\n async function get<T>(r: { space: string; key: string; path: string; options: KVGetOptions | undefined; signal: AbortSignal; network: () => Promise<Result<KVResponse<T>>> }): Promise<Result<KVResponse<T>>> {\n const started = scheduler.now();\n const prefix = configuredPrefix(r.path);\n if (r.options?.source === \"network\") {\n let outcome: \"found\" | \"not_found\" | \"error\" = \"error\";\n try {\n const value = await r.network();\n outcome = value.ok ? \"found\" : value.error.code === ErrorCodes.KV_NOT_FOUND ? \"not_found\" : \"error\";\n return value;\n } finally {\n observeNetworkRequested({ op: \"get\", space: r.space, path: r.path, reason: \"NETWORK_REQUESTED\", outcome, latencyMs: scheduler.now() - started });\n }\n }\n let networkRejected = false;\n const fallback = async (\n replica: string, reason: ReplicationReason,\n extra: Partial<Extract<ReplicationEvent, { type: \"replication.read\" }>> = {},\n ) => {\n try { return await networkRead(r.network, \"get\", r.path, replica, reason, started, extra); }\n catch (error) { networkRejected = true; throw error; }\n };\n if (prefix === undefined) return networkRead(r.network, \"get\", r.path, null, \"not_covered\", started);\n const delivery = checkDelivery();\n if (delivery.status !== \"allow\") {\n return fallback(prefix, delivery.status === \"consent_expired\" ? \"grant_expired\" : \"replica_gated\",\n { code: delivery.status === \"consent_expired\" ? delivery.code : \"REPLICA_GATED\" });\n }\n const refusal = sessionRefusal(prefix);\n if (refusal) return fallback(prefix, \"grant_missing\", { code: refusal });\n try { await raceSignal(reportExistingPins(), r.signal); } catch { if (r.signal.aborted) return abortedResult(r.signal); }\n let handle: KVReplicaHandle;\n try { handle = await raceSignal(open(prefix), r.signal); }\n catch (error) {\n if (r.signal.aborted) return abortedResult(r.signal);\n if (errorCode(error) === \"CONSENT_EXPIRED\") startConsentDenial();\n const code = errorCode(error);\n return fallback(prefix, code === \"RUNTIME_UNSUPPORTED\" ? \"runtime_unsupported\" : code === \"CONSENT_EXPIRED\" || code === \"REPLICA_GATED\" || code === \"GRANT_EXPIRED\" ? deliveryReason(code) : \"replica_unavailable\", { code });\n }\n if (replicas.get(prefix)?.reason === \"grant_missing\") {\n const code = replicas.get(prefix)?.lastError;\n return fallback(prefix, code === \"GRANT_EXPIRED\" ? \"grant_expired\" : code === \"REPLICA_GATED\" ? \"replica_gated\" : \"grant_missing\", { code });\n }\n\n let fresh: Awaited<ReturnType<typeof freshness>>;\n try { fresh = await freshness(prefix, handle, r.signal); }\n catch (error) {\n recordRevocation(prefix, error);\n if (errorCode(error) === \"CONSENT_EXPIRED\") startConsentDenial();\n if (r.signal.aborted) return abortedResult(r.signal);\n const code = errorCode(error);\n return fallback(prefix, code === \"CONSENT_EXPIRED\" || code === \"REPLICA_GATED\" || code === \"GRANT_EXPIRED\" ? deliveryReason(code) : \"replica_error\", { code });\n }\n if (r.signal.aborted) return abortedResult(r.signal);\n if (fresh.failure) {\n const code = fresh.failure === \"busy\" ? \"REPLICA_BUSY\" : fresh.syncError;\n return fallback(prefix, code === \"GRANT_REVOKED\" ? \"grant_revoked\" : code === \"REPLICA_GATED\" || code === \"CONSENT_EXPIRED\" || code === \"GRANT_EXPIRED\" ? deliveryReason(code) : \"stale\",\n { code, syncedBeforeRead: fresh.syncedBeforeRead });\n }\n let pendingState: PendingWriteState;\n try { pendingState = await raceSignal(pending.read(), r.signal); }\n catch (error) {\n if (r.signal.aborted) return abortedResult(r.signal);\n const code = errorCode(error);\n return fallback(prefix, code === \"REPLICA_GATED\" || code === \"CONSENT_EXPIRED\" || code === \"GRANT_EXPIRED\" ? deliveryReason(code) : \"replica_unavailable\", { code });\n }\n const record = pendingState.records.find((x) => x.key === r.path);\n if (record) return fallback(prefix, \"pending_write\", { pendingState: record.state, syncedBeforeRead: fresh.syncedBeforeRead });\n if (!pending.durable && !inProcessProof.has(prefix)) return fallback(prefix, \"REPLICA_UNPROVEN_SINCE_START\");\n if (fresh.status.syncedThroughEpoch < pendingState.committedEpoch) return fallback(prefix, \"REPLICA_BEHIND_OWN_WRITES\");\n if (fresh.status.authority.state !== \"valid\") return fallback(prefix, fresh.status.authority.state === \"expired\" ? \"grant_expired\" : fresh.status.authority.state === \"revoked\" ? \"grant_revoked\" : \"grant_not_yet_valid\");\n if (fresh.status.coverage !== \"complete\") return fallback(prefix, \"coverage_incomplete\");\n try {\n const local = await raceSignal(handle.get(r.path), r.signal);\n const delivery = checkDelivery();\n if (delivery.status !== \"allow\") throw deliveryError(delivery);\n const refusal = sessionRefusal(prefix);\n if (refusal) return await fallback(prefix, \"grant_missing\", { code: refusal });\n try { validateReadMeta(local.meta); }\n catch (error) {\n const code = errorCode(error);\n recordRevocation(prefix, error);\n return await fallback(prefix, reasonForReadMetaCode(code), { code });\n }\n if (local.status === \"coverage_incomplete\" || local.status === \"not_covered\" || local.status === \"content_missing\") return await fallback(prefix, local.status === \"content_missing\" ? \"content_missing\" : local.status === \"coverage_incomplete\" ? \"coverage_incomplete\" : \"not_covered\");\n if (local.status === \"present\" && r.options?.maxResponseBytes !== undefined && local.value.byteLength > r.options.maxResponseBytes) {\n return await fallback(prefix, \"unsupported_option\");\n }\n const result = localGet<T>(local as LocalGetResult, r.path, r.options ?? {});\n const reason = local.status === \"present\" ? \"hit\" : local.status;\n const syncedAt = fresh.status.lastSyncAt === null ? null : Date.parse(fresh.status.lastSyncAt);\n const event = {\n syncedBeforeRead: fresh.syncedBeforeRead,\n coverage: local.meta.coverage,\n authority: local.meta.authority,\n stalenessMs: syncedAt === null ? null : scheduler.now() - syncedAt,\n ...(fresh.syncError ? { syncError: fresh.syncError } : {}),\n };\n if (options.verify) return await verifyGet(r, result as Result<KVResponse<T>>, reason, started, event);\n readEvent(\"get\", r.path, prefix, \"replica\", reason, result.ok ? \"found\" : result.error.code === ErrorCodes.KV_NOT_FOUND ? \"not_found\" : \"error\", started, event);\n return result as LocalGetResponse<T>;\n } catch (error) {\n if (networkRejected) throw error;\n recordRevocation(prefix, error);\n if (errorCode(error) === \"CONSENT_EXPIRED\") startConsentDenial();\n if (r.signal.aborted) return abortedResult(r.signal);\n return fallback(prefix, deliveryReason(errorCode(error)), { code: errorCode(error) });\n }\n }\n\n async function list(r: { space: string; listPath: string; options: KVListOptions | undefined; signal: AbortSignal; network: () => Promise<Result<KVListPage>> }): Promise<Result<KVListPage>> {\n const started = scheduler.now();\n if (r.options?.source === \"network\") {\n let outcome: \"found\" | \"not_found\" | \"error\" = \"error\";\n try {\n const result = await r.network();\n outcome = result.ok ? \"found\" : \"error\";\n return result;\n } finally {\n observeNetworkRequested({ op: \"list\", space: r.space, path: r.listPath, reason: \"NETWORK_REQUESTED\", outcome, latencyMs: scheduler.now() - started });\n }\n }\n const cursor = r.options?.cursor;\n const decoded = cursor?.startsWith(\"tcr1.\") ? decodeTcr1(cursor) : null;\n if (cursor && cursor.startsWith(\"tcr1.\") && !decoded) { readEvent(\"list\", r.listPath, null, \"none\", \"cursor_restart\", \"error\", started); return cursorRestart(); }\n if (cursor && !cursor.startsWith(\"tcr1.\")) return networkRead(r.network, \"list\", r.listPath, null, \"network_cursor\", started);\n const prefix = listPathCovered(options.prefixes, r.listPath);\n let networkRejected = false;\n const fallback = async (\n replica: string, reason: ReplicationReason,\n extra: Partial<Extract<ReplicationEvent, { type: \"replication.read\" }>> = {},\n ) => {\n try { return await networkRead(r.network, \"list\", r.listPath, replica, reason, started, extra); }\n catch (error) { networkRejected = true; throw error; }\n };\n if (prefix !== undefined && !r.options?.raw) {\n const delivery = checkDelivery();\n if (delivery.status !== \"allow\") {\n if (decoded) { readEvent(\"list\", r.listPath, prefix, \"none\", \"cursor_restart\", \"error\", started); return cursorRestart(); }\n return fallback(prefix, delivery.status === \"consent_expired\" ? \"grant_expired\" : \"replica_gated\",\n { code: delivery.status === \"consent_expired\" ? delivery.code : \"REPLICA_GATED\" });\n }\n }\n if (prefix !== undefined && !r.options?.raw) {\n const refusal = sessionRefusal(prefix);\n if (refusal) {\n if (decoded) { readEvent(\"list\", r.listPath, prefix, \"none\", \"cursor_restart\", \"error\", started); return cursorRestart(); }\n return fallback(prefix, \"grant_missing\", { code: refusal });\n }\n }\n try { await raceSignal(reportExistingPins(), r.signal); } catch { if (r.signal.aborted) return abortedResult(r.signal); }\n const restart = () => { readEvent(\"list\", r.listPath, prefix ?? null, \"none\", \"cursor_restart\", \"error\", started); return cursorRestart(); };\n if (cursor && decoded && (decoded.space !== r.space || decoded.path !== r.listPath)) return restart();\n if (prefix === undefined || r.options?.raw) { if (cursor && decoded) return restart(); return networkRead(r.network, \"list\", r.listPath, prefix ?? null, prefix !== undefined ? \"unsupported_option\" : \"not_covered\", started); }\n let handle: KVReplicaHandle;\n try { handle = await raceSignal(open(prefix), r.signal); }\n catch (error) {\n if (r.signal.aborted) return abortedResult(r.signal);\n if (errorCode(error) === \"CONSENT_EXPIRED\") startConsentDenial();\n if (cursor && decoded) return restart();\n const code = errorCode(error);\n return fallback(prefix, code === \"RUNTIME_UNSUPPORTED\" ? \"runtime_unsupported\" : code === \"CONSENT_EXPIRED\" || code === \"REPLICA_GATED\" || code === \"GRANT_EXPIRED\" ? deliveryReason(code) : \"replica_unavailable\", { code });\n }\n if (replicas.get(prefix)?.reason === \"grant_missing\") {\n if (cursor && decoded) return restart();\n const code = replicas.get(prefix)?.lastError;\n return fallback(prefix, code === \"GRANT_EXPIRED\" ? \"grant_expired\" : code === \"REPLICA_GATED\" ? \"replica_gated\" : \"grant_missing\", { code });\n }\n let fresh: Awaited<ReturnType<typeof freshness>>;\n try { fresh = await freshness(prefix, handle, r.signal); }\n catch (error) {\n recordRevocation(prefix, error);\n if (errorCode(error) === \"CONSENT_EXPIRED\") startConsentDenial();\n if (r.signal.aborted) return abortedResult(r.signal);\n if (cursor && decoded) return restart();\n const code = errorCode(error);\n return fallback(prefix, code === \"CONSENT_EXPIRED\" || code === \"REPLICA_GATED\" || code === \"GRANT_EXPIRED\" ? deliveryReason(code) : \"replica_error\", { code });\n }\n if (r.signal.aborted) return abortedResult(r.signal);\n let state: PendingWriteState;\n try { state = await raceSignal(pending.read(), r.signal); }\n catch (error) {\n if (r.signal.aborted) return abortedResult(r.signal);\n if (cursor && decoded) return restart();\n const code = errorCode(error);\n return fallback(prefix, code === \"REPLICA_GATED\" || code === \"CONSENT_EXPIRED\" || code === \"GRANT_EXPIRED\" ? deliveryReason(code) : \"replica_unavailable\", { code });\n }\n const pendingRange = state.records.find((record) => listRangeCovers(r.listPath, record.key));\n const behind = fresh.status.syncedThroughEpoch < state.committedEpoch;\n if (cursor && decoded && (fresh.failure || pendingRange || behind || fresh.status.coverage !== \"complete\" || fresh.status.authority.state !== \"valid\" || (!pending.durable && !inProcessProof.has(prefix)))) return restart();\n if (behind) return fallback(prefix, \"REPLICA_BEHIND_OWN_WRITES\");\n if (fresh.failure) {\n const code = fresh.failure === \"busy\" ? \"REPLICA_BUSY\" : fresh.syncError;\n return fallback(prefix, code === \"GRANT_REVOKED\" ? \"grant_revoked\" : code === \"REPLICA_GATED\" || code === \"CONSENT_EXPIRED\" || code === \"GRANT_EXPIRED\" ? deliveryReason(code) : \"stale\", { code });\n }\n if (pendingRange) return fallback(prefix, \"pending_write\", { pendingState: pendingRange.state });\n if (!pending.durable && !inProcessProof.has(prefix)) return fallback(prefix, \"REPLICA_UNPROVEN_SINCE_START\");\n if (fresh.status.coverage !== \"complete\" || fresh.status.authority.state !== \"valid\") return fallback(prefix, fresh.status.coverage !== \"complete\" ? \"coverage_incomplete\" : fresh.status.authority.state === \"expired\" ? \"grant_expired\" : fresh.status.authority.state === \"revoked\" ? \"grant_revoked\" : \"grant_not_yet_valid\");\n try {\n const signalHandle = { list: (o: { prefix: string; after?: string; limit?: number }) => raceSignal(handle.list(o), r.signal) };\n const page = await raceSignal(localList(signalHandle, r.space, r.listPath, r.options?.limit, cursor, validateReadMeta), r.signal);\n const latest = await raceSignal(pending.read(), r.signal);\n const laterPending = latest.records.find((record) => listRangeCovers(r.listPath, record.key));\n if (cursor && decoded && (laterPending || fresh.status.syncedThroughEpoch < latest.committedEpoch)) return restart();\n if (fresh.status.syncedThroughEpoch < latest.committedEpoch) return await fallback(prefix, \"REPLICA_BEHIND_OWN_WRITES\");\n if (laterPending) return await fallback(prefix, \"pending_write\", { pendingState: laterPending.state });\n const delivery = checkDelivery();\n if (delivery.status !== \"allow\") throw deliveryError(delivery);\n const refusal = sessionRefusal(prefix);\n if (refusal) {\n if (decoded) return restart();\n return await fallback(prefix, \"grant_missing\", { code: refusal });\n }\n const event = {\n count: page.keys.length,\n syncedBeforeRead: fresh.syncedBeforeRead,\n stalenessMs: fresh.status.lastSyncAt === null ? null : scheduler.now() - Date.parse(fresh.status.lastSyncAt),\n ...(fresh.syncError ? { syncError: fresh.syncError } : {}),\n };\n if (options.verify && !cursor) return await verifyList(r, page, started, event);\n readEvent(\"list\", r.listPath, prefix, \"replica\", \"hit\", \"found\", started, event);\n return ok(page);\n } catch (error) {\n if (networkRejected) throw error;\n if (r.signal.aborted) return abortedResult(r.signal);\n const code = errorCode(error);\n if (code === \"CONSENT_EXPIRED\") startConsentDenial();\n recordRevocation(prefix, error);\n if (cursor && decoded) return restart();\n const reason = code === \"CONSENT_EXPIRED\" || code === \"REPLICA_GATED\" || code === \"GRANT_EXPIRED\" ? deliveryReason(code) : reasonForReadMetaCode(code);\n return fallback(prefix, reason, { code });\n }\n }\n\n async function write<T>(r: { op: \"put\" | \"delete\" | \"batchPut\"; space: string; entries: ReadonlyArray<{ path: string; body?: Blob | string }>; signal: AbortSignal; conditional?: boolean; network: () => Promise<Result<T>> }): Promise<Result<T>> {\n const covered = r.entries.flatMap((entry) => {\n const prefix = configuredPrefix(entry.path);\n return prefix !== undefined ? [{ key: entry.path, op: r.op === \"delete\" ? \"delete\" as const : \"put\" as const }] : [];\n });\n if (covered.length === 0) return r.network();\n if (checkDelivery().status !== \"allow\") return r.network();\n await reportExistingPins();\n if (checkDelivery().status !== \"allow\") return r.network();\n const opId = globalThis.crypto?.randomUUID?.() ?? `${scheduler.now()}-${Math.random()}`;\n try { await pending.update((s) => begin(s, opId, covered, nowDate(scheduler.now()))); }\n catch (error) {\n if (errorCode(error) === \"REPLICA_GATED\" || errorCode(error) === \"CONSENT_EXPIRED\" || checkDelivery().status !== \"allow\") return r.network();\n return err(serviceError(ErrorCodes.KV_WRITE_FAILED, \"Unable to persist pending KV write; request was not dispatched\", \"kv\", { cause: error instanceof Error ? error : undefined, meta: { replication: \"pending_store_unavailable\", requestDispatched: false } }));\n }\n const started = scheduler.now();\n let result: Result<T>;\n try { result = await r.network(); }\n catch (error) {\n const wrapped = wrapError(\"kv\", error);\n result = err({\n ...wrapped,\n meta: { ...wrapped.meta, requestMayHaveDispatched: true },\n });\n }\n const outcome = classifyWriteOutcome(r.op, result, { conditional: r.conditional === true });\n let settleError: unknown;\n try { await pending.update((s) => settle(s, opId, outcome, nowDate(scheduler.now()), result.ok ? undefined : result.error.code)); } catch (error) { settleError = error; }\n emit({ type: \"replication.write\", space: r.space, op: r.op, keys: covered.map((x) => x.key), outcome, ...(!result.ok ? { code: result.error.code } : {}), latencyMs: scheduler.now() - started });\n const state = await pending.read().catch(() => undefined);\n const pins = state ? pinnedKeys(state, \"\", scheduler.now()) : [];\n if (outcome === \"ambiguous\") emit({ type: \"replication.state\", space: r.space, state: \"pinned\", count: pins.length, keys: pins.map((p) => p.key) });\n if (settleError) emit({ type: \"replication.state\", space: r.space, state: \"pending_store_error\", code: \"STORAGE_ERROR\" });\n return result;\n }\n\n function observeNetworkRequested(r: { op: \"get\" | \"list\"; space: string; path: string; reason: \"NETWORK_REQUESTED\"; outcome: \"found\" | \"not_found\" | \"error\"; latencyMs: number }): void {\n emit({ type: \"replication.read\", op: r.op, space: r.space, key: r.path, replica: null, source: \"network\", reason: \"NETWORK_REQUESTED\", outcome: r.outcome, latencyMs: r.latencyMs, stalenessMs: null, coverage: null, authority: null });\n }\n\n async function inspectPersistedStatus(prefix: string): Promise<InspectedStatusResult> {\n if (!storage.inspectStatus || isClosed || purgeInProgress) return { missing: false };\n const sessionGrant = authority.sessionGrant(prefix);\n const device = \"refused\" in sessionGrant ? undefined : sessionGrant.device;\n const spec = { identity, space: session.space, prefix, allowSecrets: options.allowSecrets, ...(device ? { device } : {}), ...(deps.fetch ? { fetch: deps.fetch } : {}) };\n const abort = new AbortController();\n const job = Promise.resolve().then(() => storage.inspectStatus!(spec, { signal: abort.signal }));\n const settled = job.then(() => undefined, () => undefined);\n const inspection = { abort, settled };\n statusInspections.add(inspection);\n void settled.then(() => statusInspections.delete(inspection));\n let cancel = () => {};\n const timeout = new Promise<{ timedOut: true }>((resolve) => {\n cancel = scheduler.setTimeout(() => {\n abort.abort(Object.assign(new Error(\"Replica status inspection timed out\"), { code: \"STATUS_TIMEOUT\" }));\n resolve({ timedOut: true });\n }, STATUS_REFRESH_TIMEOUT_MS);\n });\n try {\n const result = await Promise.race([job.then((local) => ({ local })), timeout]);\n if (\"timedOut\" in result) return { missing: false, errorCode: \"STATUS_TIMEOUT\" };\n return { missing: result.local === undefined, ...(result.local ? { local: result.local } : {}) };\n } catch (error) {\n return { missing: false, errorCode: errorCode(error) };\n } finally { cancel(); }\n }\n\n function cancelStatusInspections(): Promise<void> {\n const active = [...statusInspections];\n for (const inspection of active) inspection.abort.abort(Object.assign(new Error(\"Replica status inspection cancelled\"), { code: \"ABORTED\" }));\n return Promise.all(active.map((inspection) => inspection.settled)).then(() => undefined);\n }\n\n function gatedStatus(decision: Exclude<ReplicaDeliveryDecision, { status: \"allow\" }>): ReplicaStatusEntry[] {\n return options.prefixes.map((prefix) => ({\n prefix,\n state: \"gated\",\n reason: \"replica_gated\",\n gate: decision.status === \"gated\" ? decision.gate : \"stamp_stale\",\n errorCode: decision.status === \"consent_expired\" ? decision.code : \"REPLICA_GATED\",\n pending: { inFlight: 0, committed: 0, ambiguous: 0 },\n pinned: [],\n lagMs: null,\n redacted: true,\n }));\n }\n\n async function status(): Promise<ReplicaStatusEntry[]> {\n const beforeStatus = checkDelivery();\n if (beforeStatus.status !== \"allow\") return gatedStatus(beforeStatus);\n let persistedSnapshot: PendingWriteState | null | undefined;\n try {\n persistedSnapshot = pending.readExisting ? await pending.readExisting() : await pending.read();\n } catch (error) {\n const delivery = checkDelivery();\n if (delivery.status !== \"allow\") return gatedStatus(delivery);\n throw error;\n }\n const afterPending = checkDelivery();\n if (afterPending.status !== \"allow\") return gatedStatus(afterPending);\n const snapshot = persistedSnapshot ?? emptyPendingState(identity);\n const entries = await Promise.all(options.prefixes.map(async (prefix): Promise<ReplicaStatusEntry | undefined> => {\n if (prefix === \"/\" && deps.nodeFeatures !== undefined && !deps.nodeFeatures.includes(\"kv-sync-root\")) {\n markRootUnsupported(prefix);\n }\n const records = snapshot.records.filter((r) => kvPrefixCovers(prefix, r.key));\n const opened = replicas.get(prefix);\n let local: LocalReplicaStatus | ReplicaInspectedStatus | undefined;\n if (opened?.handle) {\n try { local = await opened.handle.status(); }\n catch { /* A generation-fenced or unavailable handle has no live status. */ }\n }\n let inspected: InspectedStatusResult = { missing: false };\n if (!local && !opened?.opening && !opened?.authorityRevoked) inspected = await inspectPersistedStatus(prefix);\n local ??= inspected.local;\n if (inspected.missing && !opened?.reason && !opened?.authorityRevoked && !opened?.opening && !isClosed) return undefined;\n const full = local && !(\"redacted\" in local) ? local : undefined;\n const revoked = opened?.authorityRevoked === true || full?.authority.state === \"revoked\";\n const rootUnsupported = opened?.lastError === \"REPLICATION_ROOT_UNSUPPORTED\";\n const state = isClosed ? \"closed\" as const : revoked ? \"revoked\" as const : rootUnsupported || opened?.reason === \"grant_expired\" ? \"unavailable\" as const : opened?.reason === \"grant_missing\" ? \"grant_missing\" as const : full?.coverage === \"complete\" && full.authority.state === \"valid\" ? \"ready\" as const : opened?.reason || inspected.errorCode ? \"unavailable\" as const : \"idle\" as const;\n return {\n prefix,\n state,\n ...(opened?.reason ? { reason: opened.reason } : inspected.errorCode ? { reason: \"replica_unavailable\" as const } : {}),\n ...(inspected.errorCode ?? opened?.lastError ? { errorCode: inspected.errorCode ?? opened?.lastError } : {}),\n ...(local ?? {}),\n ...(revoked ? { authority: { state: \"revoked\" as const, expiresAt: full?.authority.expiresAt ?? null } } : {}),\n pending: {\n inFlight: records.filter((r) => r.state === \"in_flight\").length,\n committed: records.filter((r) => r.state === \"committed\").length,\n ambiguous: records.filter((r) => r.state === \"ambiguous\").length,\n },\n pinned: pinnedKeys(snapshot, prefix, scheduler.now()),\n lagMs: full?.lastSyncAt ? scheduler.now() - Date.parse(full.lastSyncAt) : null,\n };\n }));\n const beforeReturn = checkDelivery();\n if (beforeReturn.status !== \"allow\") return gatedStatus(beforeReturn);\n return entries.filter((entry): entry is ReplicaStatusEntry => entry !== undefined);\n }\n\n async function sync(o?: { prefix?: string; signal?: AbortSignal }): Promise<void> {\n const prefixes = o?.prefix !== undefined ? options.prefixes.filter((p) => p === o.prefix) : options.prefixes;\n await Promise.all(prefixes.map((prefix) => syncPrefix(prefix, \"manual\", o?.signal).then(() => undefined)));\n }\n\n async function clearPending(): Promise<number> {\n const count = await pending.update((s) => clearPendingRecords(s, scheduler.now()));\n emit({ type: \"replication.state\", space: session.space, state: \"pending_cleared\", count });\n return count;\n }\n\n function purge(o?: { timeoutMs?: number }): Promise<{ purged: string[]; failed: Array<{ prefix: string; code: string }> }> {\n purgeStarted = true;\n purgeInProgress = true;\n cancelConsentTimer?.();\n cancelConsentTimer = undefined;\n const hasStatusInspections = statusInspections.size > 0;\n const statusDrain = cancelStatusInspections();\n for (const state of replicas.values()) {\n state.timer?.();\n state.timer = undefined;\n state.renewalTimer?.();\n state.renewalTimer = undefined;\n state.syncContext && (state.syncContext.abortCause ??= \"purge\");\n state.abort?.abort();\n state.mintAbort?.abort();\n }\n return Promise.resolve().then(async () => {\n const report = { purged: [] as string[], failed: [] as Array<{ prefix: string; code: string }> };\n const timeoutMs = o?.timeoutMs ?? 5_000;\n const withTimeout = async <T>(job: Promise<T>): Promise<T> => {\n let cancel = () => {};\n const timeout = new Promise<never>((_, reject) => {\n cancel = scheduler.setTimeout(() => reject(Object.assign(new Error(\"Replication cleanup timed out\"), { code: \"TIMEOUT\" })), timeoutMs);\n });\n try { return await Promise.race([job, timeout]); }\n finally { cancel(); }\n };\n const drain = Promise.all([\n ...[...replicas.values()].flatMap((state) => [\n state.opening?.catch(() => undefined),\n state.sync?.catch(() => undefined),\n state.renewing?.catch(() => undefined),\n state.handle?.close().catch(() => undefined),\n ]),\n ...(hasStatusInspections ? [statusDrain] : []),\n ]);\n let drainCode: string | undefined;\n try { await withTimeout(drain); } catch (error) { drainCode = errorCode(error); }\n const jobs = options.prefixes.map(async (prefix) => {\n try {\n if (drainCode) throw Object.assign(new Error(\"Replica cleanup did not settle before purge\"), { code: drainCode });\n const grant = authority.sessionGrant(prefix);\n const sessionDeviceDid = replicas.get(prefix)?.handle?.deviceDid ?? (\"refused\" in grant ? undefined : grant.device.did);\n await withTimeout(storage.purge({ identity, space: session.space, prefix, ...(sessionDeviceDid ? { sessionDeviceDid } : {}) }));\n await pending.update((s) => clearPrefix(s, prefix));\n replicas.delete(prefix);\n inProcessProof.delete(prefix);\n report.purged.push(prefix);\n emit({ type: \"replication.state\", space: session.space, replica: prefix, state: \"purged\" });\n } catch (error) {\n const code = errorCode(error);\n report.failed.push({ prefix, code });\n emit({ type: \"replication.state\", space: session.space, replica: prefix, state: \"purge_failed\", code });\n }\n });\n await Promise.all(jobs);\n return report;\n }).finally(() => { purgeInProgress = false; });\n }\n\n async function close(): Promise<void> {\n if (isClosed) return;\n isClosed = true;\n cancelConsentTimer?.();\n cancelConsentTimer = undefined;\n const hasStatusInspections = statusInspections.size > 0;\n const statusDrain = cancelStatusInspections();\n for (const [prefix, state] of replicas) {\n state.timer?.();\n state.timer = undefined;\n state.renewalTimer?.();\n state.renewalTimer = undefined;\n state.mintAbort?.abort();\n state.syncContext && (state.syncContext.abortCause ??= \"close\");\n state.abort?.abort();\n emit({ type: \"replication.state\", space: session.space, replica: prefix, state: \"closed\" });\n }\n const drain = Promise.all([\n ...[...replicas.values()].map(async (state) => {\n await state.opening?.catch(() => undefined);\n await state.renewing?.catch(() => undefined);\n await state.sync?.catch(() => undefined);\n await state.handle?.close().catch(() => undefined);\n }),\n ...(hasStatusInspections ? [statusDrain] : []),\n ]);\n let cancel = () => {};\n let drained = false;\n void drain.then(\n () => { drained = true; cancel(); },\n () => { drained = true; cancel(); },\n );\n const timeout = new Promise<void>((resolve) => {\n queueMicrotask(() => {\n if (!drained) cancel = scheduler.setTimeout(resolve, CLOSE_TIMEOUT_MS);\n });\n });\n\n try { await Promise.race([drain, timeout]); }\n finally { cancel(); }\n }\n\n scheduleConsentDeadline();\n return { get, list, write, observeNetworkRequested, observeConsentExpired, status, sync, purge, clearPending, close };\n}\n\nfunction cancellationCode(signal: AbortSignal): string {\n return wrapError(\"kv\", signal.reason).code === ErrorCodes.TIMEOUT ||\n (typeof signal.reason === \"object\" && signal.reason !== null && \"code\" in signal.reason && signal.reason.code === ErrorCodes.TIMEOUT)\n ? ErrorCodes.TIMEOUT\n : ErrorCodes.ABORTED;\n}\n\nfunction abortedResult(signal: AbortSignal): Result<never> {\n const code = cancellationCode(signal);\n return err(serviceError(code, code === ErrorCodes.TIMEOUT ? \"KV request timed out\" : \"KV request was aborted\", \"kv\"));\n}\n","import { canonicalReplicationIdentity, replicationIdentityKey } from \"./identity\";\nimport { emptyPendingState } from \"./pendingWrites\";\nimport type { PendingWriteState, PendingWriteStore, ReplicationIdentity } from \"./types\";\n\nexport function createMemoryPendingStore(identity: ReplicationIdentity): PendingWriteStore {\n const canonical = canonicalReplicationIdentity(identity);\n const key = replicationIdentityKey(canonical);\n let state = emptyPendingState(canonical);\n let tail: Promise<void> = Promise.resolve();\n return {\n identity: canonical,\n durable: false,\n async read(): Promise<PendingWriteState> { return structuredClone(state); },\n async update<T>(mutate: (s: PendingWriteState) => T): Promise<T> {\n let resolve!: (value: T) => void;\n let reject!: (reason: unknown) => void;\n const result = new Promise<T>((res, rej) => { resolve = res; reject = rej; });\n const operation = tail.then(() => {\n try {\n if (replicationIdentityKey(state.identity) !== key) throw Object.assign(new Error(\"Pending-store identity mismatch\"), { code: \"STORAGE_ERROR\" });\n const next = structuredClone(state);\n const value = mutate(next);\n state = next;\n resolve(value);\n } catch (error) { reject(error); }\n });\n tail = operation.then(() => undefined, () => undefined);\n return result;\n },\n };\n}\n"],"mappings":"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","names":["delivery","sync","refusal","clearPending"]}
1
+ {"version":3,"sources":["../../../src/kv/replication/index.ts","../../../src/kv/replication/constants.ts","../../../src/kv/replication/identity.ts","../../../src/kv/replication/prefix.ts","../../../src/kv/replication/scope.ts","../../../src/errors.ts","../../../src/types.ts","../../../src/kv/replication/outcome.ts","../../../src/kv/replication/pendingWrites.ts","../../../src/kv/replication/localResponse.ts","../../../src/kv/replication/listLocal.ts","../../../src/kv/replication/events.ts","../../../src/kv/replication/grantPolicyConstants.ts","../../../src/kv/replication/grantPolicy.ts","../../../src/kv/replication/controller.ts","../../../src/kv/replication/memoryPendingStore.ts"],"sourcesContent":["export type {\n AuthorityRefusal,\n KVListPage,\n KVReadThrough,\n KVReplicaHandle,\n KVReplicaSpec,\n KVReplicaStorage,\n KVReplicationController,\n KVReplicationDeps,\n LocalGetResult,\n LocalListResult,\n LocalReadMeta,\n LocalReplicaStatus,\n LocalSyncResult,\n PendingWriteRecord,\n PendingWriteState,\n PendingWriteStore,\n PinnedKey,\n PurgeTarget,\n ReplicaAuthorityState,\n ReplicaCoverage,\n ReplicaDevice,\n ReplicaGatedHandle,\n ReplicaGatedSpec,\n ReplicaGatedStorage,\n ReplicaInspectedStatus,\n ReplicaGrantInfo,\n ReplicaPeerCommit,\n ReplicaState,\n ReplicaStatusEntry,\n ReplicationAuthority,\n ReplicationControl,\n ReplicationEvent,\n ReplicationIdentity,\n ReplicationOptions,\n ReplicationPurgeReport,\n ReplicationReason,\n ReplicationScheduler,\n ResolvedReplicationOptions,\n} from \"./types\";\nexport type {\n ProfileReplicaApprovalEntry,\n ProfileReplicaDeferredDenyOutcome,\n ProfileReplicaDeferredToken,\n ProfileReplicaLogoutPending,\n ProfileReplicaPreflight,\n ProfileReplicaPurge,\n ProfileReplicaRootIdentity,\n ProfileReplicaRemoteLogoutState,\n ProfileReplicaUnknownEntry,\n ReplicaAccountGate,\n ReplicaBrowserGateAccess,\n ReplicaBrowserGateSnapshot,\n ReplicaBrowserGateTx,\n ReplicaClock,\n ReplicaDenyInput,\n ReplicaDenyOutcome,\n ReplicaDeliveryDecision,\n ReplicaEraseReport,\n ReplicaGateAccess,\n ReplicaGateSnapshot,\n ReplicaGatedError,\n ReplicaGateReason,\n ReplicaGateScope,\n ReplicaGateTx,\n ReplicaGuardedStore,\n ReplicaLifecycleGate,\n ReplicaPartitionEraser,\n ReplicaPartitionIndexEntry,\n ReplicaPrivateGateHash,\n ReplicaPurgeIntent,\n ReplicaSessionStamp,\n ReplicaStampedReply,\n SaltedHash,\n} from \"./lifecycle\";\nexport type {\n ReplicaAdmitHook,\n ReplicaBrowserPageAdmission,\n ReplicaPageAdmission,\n ReplicaQuotaLedger,\n ReplicaQuotaSpec,\n} from \"./quota\";\nexport type {\n ConsentDeadlineMs,\n ClampConsentAnchor,\n EffectiveGrantExpiry,\n EffectiveGrantExpiryInput,\n MintRemainingMs,\n NeedsSilentRenewal,\n ReplicaConsentAnchor,\n ReplicaConsentSource,\n ReplicaGrantPolicy,\n} from \"./grantPolicyTypes\";\nexport { CLEAR_PENDING_WARNING } from \"./constants\";\nexport {\n canonicalReplicationIdentity,\n replicationIdentityKey,\n} from \"./identity\";\nexport { kvPrefixCovers, requiresSecretsOptIn } from \"./scope\";\nexport { createKVReplication } from \"./controller\";\nexport { createMemoryPendingStore } from \"./memoryPendingStore\";\n","export const CLEAR_PENDING_WARNING =\n \"Clearing pending writes surrenders read-your-writes protection for the cleared keys. If a write whose record was cleared had an unknown outcome or never finished, it may commit now or later; this device can serve an older value until the next sync after that commit, as it would for a write from another device.\";\n","import type { ReplicationIdentity } from \"./types\";\n\nconst SPACE_ID = /^(tinycloud:pkh:eip155:\\d+:)([^:]+)(:.+)$/;\nconst PRINCIPAL_DID = /^(did:pkh:eip155:\\d+:)([^:]+)$/;\n\n/**\n * Pure canonicalization: lower-cases only EIP-155 address segments and preserves all other\n * space/principal bytes. Rejects non-HTTP(S) hosts, credentials, query/fragment, and non-full\n * TinyCloud space ids or non-pkh principals.\n */\nexport function canonicalReplicationIdentity(\n raw: ReplicationIdentity,\n): ReplicationIdentity {\n if (\n !raw ||\n typeof raw.host !== \"string\" ||\n typeof raw.space !== \"string\" ||\n typeof raw.principal !== \"string\"\n ) {\n throw new TypeError(\n \"Replication identity host, space, and principal must be strings\",\n );\n }\n const authority = /^https?:\\/\\/([^/?#]*)/i.exec(raw.host)?.[1];\n let url: URL;\n try {\n url = new URL(raw.host);\n } catch {\n throw new TypeError(\n \"Replication identity host must be an absolute HTTP(S) URL\",\n );\n }\n if (\n !authority ||\n authority.includes(\"@\") ||\n raw.host.includes(\"?\") ||\n raw.host.includes(\"#\") ||\n url.username ||\n url.password\n ) {\n throw new TypeError(\n \"Replication identity host must be HTTP(S) without credentials, query, or fragment\",\n );\n }\n const space = SPACE_ID.exec(raw.space);\n const principal = PRINCIPAL_DID.exec(raw.principal);\n if (!space || !principal) {\n throw new TypeError(\n \"Replication identity requires a full TinyCloud space id and a pkh principal DID\",\n );\n }\n return {\n host: `${url.origin}${url.pathname.replace(/\\/+$/, \"\")}`,\n space: `${space[1]}${space[2]!.toLowerCase()}${space[3]}`,\n principal: `${principal[1]}${principal[2]!.toLowerCase()}`,\n };\n}\n\n/** Stable in-memory key; durable adapters hash its UTF-8 bytes with their platform crypto. */\nexport function replicationIdentityKey(id: ReplicationIdentity): string {\n const canonical = canonicalReplicationIdentity(id);\n return `tc-replication/v1\\n${canonical.host}\\n${canonical.space}\\n${canonical.principal}`;\n}\n","/** Shared prefix boundary and configuration rules; no runtime dependencies. */\nexport function kvPrefixCovers(prefix: string, key: string): boolean {\n return prefix === \"/\" || key.startsWith(prefix);\n}\n\n/** Replication scopes are `/` or non-empty, slash-terminated folder paths. */\nexport function assertFolderPrefix(prefix: unknown): asserts prefix is string {\n const validFolder = typeof prefix === \"string\" &&\n prefix.length > 0 &&\n !prefix.startsWith(\"/\") &&\n !prefix.includes(\"//\") &&\n prefix.endsWith(\"/\");\n if (prefix !== \"/\" && !validFolder) {\n const folderHint = typeof prefix === \"string\"\n ? prefix.replace(/^\\/+/, \"\").replace(/\\/+$/, \"\")\n : \"\";\n const suggestion = folderHint.length > 0 && !folderHint.includes(\"//\")\n ? ` Use ${JSON.stringify(`${folderHint}/`)}.`\n : ' Use \"/\" or a slash-terminated folder path such as \"notes/\".';\n throw new TypeError(`Replication prefix must be \"/\" or a non-empty slash-terminated folder path without empty segments.${suggestion}`);\n }\n}\n","export { kvPrefixCovers } from \"./prefix\";\n\n/** LIST returns its exact path plus descendants below its slash-terminated path. */\nexport function listRangeCovers(path: string, key: string): boolean {\n return path === \"\" || key === path || key.startsWith(path.endsWith(\"/\") ? path : `${path}/`);\n}\n\n/** Whether replicating this space/prefix can copy encrypted secret material to disk. */\nexport function requiresSecretsOptIn(space: string, prefix: string): boolean {\n if (prefix === \"/\") return true;\n if (space === \"secrets\" || space.endsWith(\":secrets\")) return true;\n return prefix.split(\"/\", 1)[0] === \"vault\";\n}\n","/**\n * SDK Services - Error Utilities\n *\n * Utilities for creating and handling service errors.\n */\n\nimport { responseErrorMeta } from \"./responseErrors\";\nimport { CAPABILITY_REGISTRY } from \"@tinycloud/bootstrap\";\nimport { parseNetworkId } from \"./encryption/networkId\";\n\nimport {\n type ServiceError,\n ErrorCodes,\n err,\n serviceError,\n type PermissionHint,\n} from \"./types\";\n\n/** Validate one structured node permission hint without accepting raw errors. */\nexport function parsePermissionHint(value: unknown): PermissionHint | undefined {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return undefined;\n const candidate = value as Record<string, unknown>;\n const keys = Object.keys(candidate).sort();\n if (keys.some((key) => ![\"actions\", \"path\", \"service\", \"space\"].includes(key))) return undefined;\n if (candidate.service !== \"tinycloud.kv\" && candidate.service !== \"tinycloud.encryption\") return undefined;\n if (typeof candidate.path !== \"string\" || candidate.path.length === 0 || candidate.path.includes(\"*\")) return undefined;\n if (candidate.service === \"tinycloud.kv\" &&\n (typeof candidate.space !== \"string\" || candidate.space.length === 0 || !candidate.path.startsWith(\"vault/\") || candidate.path.endsWith(\"/\"))) {\n return undefined;\n }\n if (candidate.service === \"tinycloud.encryption\" &&\n (candidate.space !== undefined || !candidate.path.startsWith(\"urn:tinycloud:encryption:\") || candidate.path.endsWith(\":\"))) {\n return undefined;\n }\n if (!Array.isArray(candidate.actions) || candidate.actions.length !== 1 ||\n typeof candidate.actions[0] !== \"string\" || candidate.actions[0].includes(\"*\")) return undefined;\n const expectedAction = candidate.service === \"tinycloud.kv\"\n ? \"tinycloud.kv/get\"\n : \"tinycloud.encryption/decrypt\";\n if (candidate.actions[0] !== expectedAction) return undefined;\n const space = typeof candidate.space === \"string\" ? candidate.space : undefined;\n return {\n service: candidate.service,\n ...(space === undefined ? {} : { space }),\n path: candidate.path,\n actions: [candidate.actions[0]],\n };\n}\n\n/** Extract only a validated structured hint from an SDK-owned error body. */\nexport function parsePermissionHintFromErrorText(text: string): PermissionHint | undefined {\n try {\n const parsed: unknown = JSON.parse(text);\n if (typeof parsed !== \"object\" || parsed === null) return undefined;\n const root = parsed as Record<string, unknown>;\n const nested = root.error;\n const nestedRecord = typeof nested === \"object\" && nested !== null\n ? nested as Record<string, unknown>\n : undefined;\n return parsePermissionHint(root.permissionHint) ??\n parsePermissionHint(nestedRecord?.permissionHint);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Create a service error for authentication required.\n */\nexport function authRequiredError(service: string): ServiceError {\n return {\n code: ErrorCodes.AUTH_REQUIRED,\n message: \"Authentication required. Please sign in first.\",\n service,\n };\n}\n\n/**\n * Create a service error for expired authentication.\n */\nexport function authExpiredError(service: string): ServiceError {\n return {\n code: ErrorCodes.AUTH_EXPIRED,\n message: \"Session has expired. Please sign in again.\",\n service,\n };\n}\n\n/**\n * Create a service error for network issues.\n */\nexport function networkError(\n service: string,\n message: string,\n cause?: Error\n): ServiceError {\n return {\n code: ErrorCodes.NETWORK_ERROR,\n message,\n service,\n cause,\n };\n}\n\n/**\n * Classify a node retry signal (tinycloud-node #347, TC-1054). The node's\n * bodies are plain text led by a stable token:\n * - `503 sql_busy: <stage>: ...` and `503 unavailable_retryable: ...` (and\n * `read_audit_busy`) are `NODE_BUSY`: nothing was applied; retry after `meta.retryAfterMs`.\n * - `503 request_timeout: ...` is `REQUEST_TIMEOUT`: the deadline passed before\n * any write began, so nothing was applied.\n * - `500 outcome_unknown: ...` is `OUTCOME_UNKNOWN`: a write may have been\n * applied; read back before retrying a non-idempotent operation.\n *\n * `meta.retryable` is the safe-to-retry verdict and `meta.retryAfterMs` the\n * node's `Retry-After` (the node sends whole seconds; anything else is\n * ignored). `invokeWithRetry` retries `NODE_BUSY` and `REQUEST_TIMEOUT`;\n * `OUTCOME_UNKNOWN` is never retried. Returns `undefined` for any\n * other response, including the bodyless 503/500 of nodes before 1.21, which\n * callers keep classifying as they always did.\n */\nexport function nodeRetryError(\n service: string,\n message: string,\n response: { status: number; statusText: string; headers: { get(name: string): string | null } },\n errorText: string\n): ServiceError | undefined {\n const body = errorText.trim();\n const [, token, stage] = /^([a-z_]+)(?::\\s*([a-z_]+):)?/.exec(body) ?? [];\n let code: string;\n if (response.status === 503 && (token === \"sql_busy\" || token === \"unavailable_retryable\" || token === \"read_audit_busy\")) {\n code = ErrorCodes.NODE_BUSY;\n } else if (response.status === 503 && token === \"request_timeout\") {\n code = ErrorCodes.REQUEST_TIMEOUT;\n } else if (response.status === 500 && token === \"outcome_unknown\") {\n code = ErrorCodes.OUTCOME_UNKNOWN;\n } else {\n return undefined;\n }\n const retryable = code !== ErrorCodes.OUTCOME_UNKNOWN;\n const retryAfter = response.headers.get(\"retry-after\")?.trim();\n return serviceError(code, message, service, {\n meta: {\n ...responseErrorMeta(response.status, response.statusText, errorText),\n retryable,\n ...(token === \"sql_busy\" && stage ? { stage } : {}),\n ...(retryable && retryAfter && /^\\d{1,9}$/.test(retryAfter) ? { retryAfterMs: Number(retryAfter) * 1000 } : {}),\n },\n });\n}\n\n/**\n * Abort reason for a service request that exceeded its configured timeout.\n *\n * Named `TimeoutError` (like the reason of the platform's\n * `AbortSignal.timeout()`), so it maps to `ErrorCodes.TIMEOUT` and never to\n * `ErrorCodes.ABORTED`, which is reserved for caller and sign-out aborts.\n */\nexport class RequestTimeoutError extends Error {\n readonly timeoutMs: number;\n\n constructor(timeoutMs: number) {\n super(`Request timed out after ${timeoutMs}ms.`);\n this.name = \"TimeoutError\";\n this.timeoutMs = timeoutMs;\n }\n}\n\n/**\n * Whether an error is a {@link RequestTimeoutError}. Also matches by shape so\n * that a copy of the class from another bundle (ESM/CJS entrypoint) is\n * recognized.\n */\nexport function isRequestTimeoutError(error: unknown): error is RequestTimeoutError {\n return (\n error instanceof RequestTimeoutError ||\n (error instanceof Error &&\n error.name === \"TimeoutError\" &&\n typeof (error as { timeoutMs?: unknown }).timeoutMs === \"number\")\n );\n}\n\n/**\n * Create a service error for timeouts.\n *\n * @param timeoutMs - The configured timeout that elapsed, when known\n * @param cause - The underlying timeout error, when known\n */\nexport function timeoutError(\n service: string,\n timeoutMs?: number,\n cause?: Error\n): ServiceError {\n if (timeoutMs === undefined) {\n return {\n code: ErrorCodes.TIMEOUT,\n message: \"Request timed out.\",\n service,\n ...(cause === undefined ? {} : { cause }),\n };\n }\n return {\n code: ErrorCodes.TIMEOUT,\n message: `Request timed out after ${timeoutMs}ms.`,\n service,\n ...(cause === undefined ? {} : { cause }),\n meta: { timeoutMs },\n };\n}\n\n/**\n * Create a service error for aborted requests.\n */\nexport function abortedError(service: string): ServiceError {\n return {\n code: ErrorCodes.ABORTED,\n message: \"Request was aborted.\",\n service,\n };\n}\n\n/**\n * Create a service error for not found resources.\n */\nexport function notFoundError(\n service: string,\n resource: string\n): ServiceError {\n return {\n code: ErrorCodes.NOT_FOUND,\n message: `Resource not found: ${resource}`,\n service,\n };\n}\n\n/**\n * Create a service error for permission denied.\n */\nexport function permissionDeniedError(\n service: string,\n action: string\n): ServiceError {\n return {\n code: ErrorCodes.PERMISSION_DENIED,\n message: `Permission denied for action: ${action}`,\n service,\n };\n}\n\n/**\n * Parse the server's \"Unauthorized Action: {resource} / {ability}\" pattern.\n */\nexport function parseAuthError(responseText: string): { resource?: string; action?: string } {\n const match = responseText.match(/^Unauthorized Action:\\s*(.+?)\\s*\\/\\s*(tinycloud\\.\\S+)$/m);\n if (match) {\n return { resource: match[1].trim(), action: match[2].trim() };\n }\n return {};\n}\n\n/**\n * Create a service error for unauthorized action (missing capability).\n */\nexport function authUnauthorizedError(\n service: string,\n message: string,\n meta?: Record<string, unknown>\n): ServiceError {\n return serviceError(ErrorCodes.AUTH_UNAUTHORIZED, message, service, { meta });\n}\n\n/**\n * Authorization verdict read from an error's structure, never its message:\n * - `\"unauthenticated\"`: HTTP 401 — the session is missing or stale.\n * - `\"forbidden\"`: HTTP 403, or `AUTH_UNAUTHORIZED` without a status — the\n * session is valid but lacks the capability.\n * - `\"other\"`: a non-authorization HTTP error status (4xx/5xx).\n */\nexport type AuthorizationVerdict = \"unauthenticated\" | \"forbidden\" | \"other\";\n\nconst grantableActions = new Set(\n CAPABILITY_REGISTRY.map(({ urn }) => urn).filter((urn) => !urn.endsWith(\"/*\"))\n);\n\nconst capabilityServices = new Set(\n CAPABILITY_REGISTRY.map(({ service }) => service.slice(\"tinycloud.\".length))\n);\n\n/**\n * Parse a canonical TinyCloud resource, keeping nested space names intact.\n * The first registered service segment is authoritative: a later matching\n * segment in the path cannot turn a different service into grant advice.\n */\nexport function parseCapabilityResource(\n resource: string,\n service: string\n): { space: string; path: string } | undefined {\n if (\n resource.length === 0 ||\n resource.length > 1024 ||\n !capabilityServices.has(service) ||\n /[\\s\\p{C}*#]/u.test(resource) ||\n resource.includes(\"://\")\n ) return undefined;\n\n const segments = resource.split(\"/\");\n if (!/^tinycloud:[A-Za-z0-9][A-Za-z0-9:._-]*$/.test(segments[0])) return undefined;\n const serviceIndex = segments.findIndex((segment, index) =>\n index > 0 && capabilityServices.has(segment)\n );\n if (serviceIndex < 1 || segments[serviceIndex] !== service) return undefined;\n if (segments.slice(1, serviceIndex).some((segment) =>\n segment.length === 0 || segment === \".\" || segment === \"..\"\n )) return undefined;\n const pathSegments = segments.slice(serviceIndex + 1);\n if (pathSegments.some((segment) => segment === \".\" || segment === \"..\")) return undefined;\n if (service !== \"kv\" && (pathSegments.length === 0 || pathSegments[pathSegments.length - 1] === \"\")) return undefined;\n\n return {\n space: segments.slice(0, serviceIndex).join(\"/\"),\n path: pathSegments.join(\"/\"),\n };\n}\n\n/** A capability resource is a canonical TinyCloud resource or encryption network, never a URL or expression. */\nfunction safeCapabilityResource(value: unknown, service: string, action: string): value is string {\n if (typeof value !== \"string\" || value.length === 0 || value.length > 1024) return false;\n if (service === \"encryption\" && value.startsWith(\"urn:tinycloud:encryption:\")) {\n if (\n !/^[A-Za-z0-9_][A-Za-z0-9_.:/-]*$/.test(value) ||\n value.includes(\"//\") ||\n value.split(\"/\").some((segment) => segment === \".\" || segment === \"..\")\n ) return false;\n try {\n parseNetworkId(value);\n return true;\n } catch {\n return false;\n }\n }\n const parsed = parseCapabilityResource(value, service);\n return parsed !== undefined &&\n (!parsed.path.endsWith(\"/\") || (service === \"kv\" && action === \"tinycloud.kv/list\")) &&\n (parsed.path !== \"\" || (service === \"kv\" && action === \"tinycloud.kv/list\"));\n}\n\n/**\n * Return a grantable missing capability only when typed authorization evidence\n * and both safe, service-matched capability fields are present. Status alone,\n * message text, wildcard actions and unrecognized actions cannot grant scope.\n */\nexport function validatedCapabilityOf(\n error: unknown\n): { resource: string; requiredAction: string } | undefined {\n const verdict = authorizationVerdictOf(error);\n if (verdict !== \"unauthenticated\" && verdict !== \"forbidden\") return undefined;\n\n const seen = new Set<unknown>();\n let node: unknown = error;\n for (\n let depth = 0;\n depth < MAX_CAUSE_DEPTH && typeof node === \"object\" && node !== null && !seen.has(node);\n depth += 1\n ) {\n seen.add(node);\n const record = node as Record<string, unknown>;\n const status = errorStatusOf(record);\n const meta = record.meta;\n if (\n (status === 401 || status === 403 || (status === undefined && record.code === ErrorCodes.AUTH_UNAUTHORIZED)) &&\n typeof meta === \"object\" && meta !== null && !Array.isArray(meta)\n ) {\n const metadata = meta as Record<string, unknown>;\n const { resource, requiredAction } = metadata;\n if (typeof requiredAction === \"string\" && grantableActions.has(requiredAction)) {\n const actionService = requiredAction.slice(\"tinycloud.\".length, requiredAction.indexOf(\"/\"));\n const explicitService = record.service === undefined ? metadata.service : record.service;\n if (\n safeCapabilityResource(resource, actionService, requiredAction) &&\n (explicitService === undefined ||\n explicitService === actionService ||\n explicitService === `tinycloud.${actionService}`)\n ) {\n return { resource, requiredAction };\n }\n }\n }\n node = record.cause;\n }\n return undefined;\n}\n\nconst MAX_CAUSE_DEPTH = 8;\n\n/** The first 4xx/5xx among `status`, `statusCode`, `meta.status`. Success and\n * informational statuses (e.g. a 200 `Response` kept as `cause`) are not\n * failures, so they are skipped rather than ending the search. */\nfunction errorStatusOf(node: Record<string, unknown>): number | undefined {\n const meta = node.meta;\n const candidates = [\n node.status,\n node.statusCode,\n typeof meta === \"object\" && meta !== null\n ? (meta as Record<string, unknown>).status\n : undefined,\n ];\n for (const candidate of candidates) {\n if (\n typeof candidate === \"number\" &&\n Number.isInteger(candidate) &&\n candidate >= 400 &&\n candidate <= 599\n ) {\n return candidate;\n }\n }\n return undefined;\n}\n\n/**\n * Classify an error from its typed HTTP error status (`status`, `statusCode`,\n * or `meta.status`, 4xx/5xx only) and `AUTH_UNAUTHORIZED` code, following the\n * `cause` chain outer-first (at most {@link MAX_CAUSE_DEPTH} links, cycles\n * stop the walk) so wrappers that rethrow with `cause` keep the verdict. The\n * outermost error status decides, so an outer 5xx keeps its retry budget even\n * over an inner 401. Returns `undefined` for untyped errors; only then may\n * callers fall back to message heuristics.\n */\nexport function authorizationVerdictOf(\n error: unknown,\n): AuthorizationVerdict | undefined {\n const seen = new Set<unknown>();\n let sawUnauthorizedCode = false;\n let node: unknown = error;\n for (\n let depth = 0;\n depth < MAX_CAUSE_DEPTH && typeof node === \"object\" && node !== null && !seen.has(node);\n depth += 1\n ) {\n seen.add(node);\n const record = node as Record<string, unknown>;\n const status = errorStatusOf(record);\n if (status === 401) return \"unauthenticated\";\n if (status === 403) return \"forbidden\";\n if (status !== undefined) return \"other\";\n if (record.code === ErrorCodes.AUTH_UNAUTHORIZED) sawUnauthorizedCode = true;\n node = record.cause;\n }\n return sawUnauthorizedCode ? \"forbidden\" : undefined;\n}\n\n/**\n * Create a service error for storage quota exceeded (402 Payment Required).\n */\nexport function storageQuotaExceededError(\n service: string,\n message: string,\n meta?: Record<string, unknown>\n): ServiceError {\n return {\n code: ErrorCodes.STORAGE_QUOTA_EXCEEDED,\n message,\n service,\n meta,\n };\n}\n\n/**\n * Create a service error for storage limit reached (413 Payload Too Large).\n */\nexport function storageLimitReachedError(\n service: string,\n message: string,\n meta?: Record<string, unknown>\n): ServiceError {\n return {\n code: ErrorCodes.STORAGE_LIMIT_REACHED,\n message,\n service,\n meta,\n };\n}\n\n/** Shown when a write is rejected because the owner's storage is full. */\nexport const STORAGE_FULL_MESSAGE =\n \"TinyCloud storage is full, so this change was not saved. Reading still works. Free up space or upgrade your plan to save again.\";\n\n/** Shown when a write is larger than the storage the owner has left. */\nexport const STORAGE_WRITE_TOO_LARGE_MESSAGE =\n \"This change is larger than the TinyCloud storage you have left, so it was not saved. Reading still works. Free up space or upgrade your plan to save it.\";\n\n/**\n * Parse the byte counts from a node storage rejection\n * (\"... Used: 155744 bytes, Limit: 0 bytes\"). The limit is the share of the\n * owner's account-wide budget left for this space, so it is 0 when the\n * owner's other spaces already use the whole budget.\n */\nexport function parseStorageQuotaBytes(\n responseText: string\n): { usedBytes: number; limitBytes: number } | undefined {\n const match = responseText.match(/Used:\\s*(\\d+)\\s*bytes,\\s*Limit:\\s*(\\d+)\\s*bytes/i);\n if (!match) return undefined;\n return {\n usedBytes: parseInt(match[1], 10),\n limitBytes: parseInt(match[2], 10),\n };\n}\n\n/**\n * Account-wide storage totals the node attaches to a storage rejection when\n * billing supplied them. `limitBytes` is the plan budget shared by all the\n * owner's spaces, so this is the number to show the user, not the space's.\n */\nexport interface StorageAccountUsage {\n usedBytes: number;\n limitBytes: number;\n /** Plan tier id, e.g. `free` or `paid`. */\n plan?: string;\n}\n\n/** What a node storage rejection says about the space and the account. */\nexport interface StorageRejectionDetails {\n usedBytes?: number;\n limitBytes?: number;\n account?: StorageAccountUsage;\n}\n\nconst STORAGE_REJECTION_BODY_ERRORS: Record<string, true> = {\n storage_quota_exceeded: true,\n storage_limit_reached: true,\n};\n\nfunction isByteCount(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0;\n}\n\nfunction byteCountsOf(value: unknown): { usedBytes: number; limitBytes: number } | undefined {\n if (typeof value !== \"object\" || value === null) return undefined;\n const { usedBytes, limitBytes } = value as Record<string, unknown>;\n return isByteCount(usedBytes) && isByteCount(limitBytes) ? { usedBytes, limitBytes } : undefined;\n}\n\n/**\n * Parse a node storage rejection. The node sends a JSON body\n * (`{error, message, space: {usedBytes, limitBytes}, account?: {usedBytes,\n * limitBytes, plan}}`); older nodes send only the plain-text message. Returns\n * undefined when the body is neither, e.g. a proxy's own 413 page.\n */\nexport function parseStorageRejection(responseText: string): StorageRejectionDetails | undefined {\n let body: unknown;\n try {\n body = JSON.parse(responseText);\n } catch {\n return parseStorageQuotaBytes(responseText);\n }\n if (typeof body !== \"object\" || body === null) return undefined;\n const record = body as Record<string, unknown>;\n const message = typeof record.message === \"string\" ? record.message : \"\";\n const space = byteCountsOf(record.space) ?? parseStorageQuotaBytes(message);\n const isStorageBody = typeof record.error === \"string\" && STORAGE_REJECTION_BODY_ERRORS[record.error] === true;\n if (!space && !isStorageBody) {\n return undefined;\n }\n const details: StorageRejectionDetails = { ...space };\n const account = byteCountsOf(record.account);\n if (account) {\n const plan = (record.account as Record<string, unknown>).plan;\n details.account = typeof plan === \"string\" && plan !== \"\" ? { ...account, plan } : account;\n }\n return details;\n}\n\n/**\n * Build the error for a write the node rejected for storage: 402 when storage\n * is already full, 413 when this write is larger than what is left. KV, SQL\n * and DuckDB all report it with the same codes and message so an app can\n * detect \"storage full\" in one place with {@link isStorageFullError}.\n * `meta.usedBytes`/`meta.limitBytes` describe the space; `meta.account`\n * carries the account totals when the node sent them.\n */\nexport function storageRejectionError(\n service: string,\n status: 402 | 413,\n meta: Record<string, unknown>,\n responseText: string\n): ServiceError {\n const quotaMeta = { ...meta, ...parseStorageRejection(responseText) };\n return status === 402\n ? storageQuotaExceededError(service, STORAGE_FULL_MESSAGE, quotaMeta)\n : storageLimitReachedError(service, STORAGE_WRITE_TOO_LARGE_MESSAGE, quotaMeta);\n}\n\n/**\n * True when a write failed for storage: the owner's TinyCloud storage is full\n * (`STORAGE_QUOTA_EXCEEDED`), or this write is larger than what is left\n * (`STORAGE_LIMIT_REACHED`). Reads keep working in both cases, so apps should\n * stay usable read-only and point the user at freeing up space or upgrading.\n */\nexport function isStorageFullError(error: { code?: string } | null | undefined): boolean {\n return (\n error?.code === ErrorCodes.STORAGE_QUOTA_EXCEEDED ||\n error?.code === ErrorCodes.STORAGE_LIMIT_REACHED\n );\n}\n\n/**\n * Wrap an unknown error in a ServiceError.\n */\nexport function wrapError(\n service: string,\n error: unknown,\n defaultCode: string = ErrorCodes.NETWORK_ERROR\n): ServiceError {\n if (error instanceof Error) {\n // A configured request timeout elapsed (see BaseService.createRequestSignal)\n if (isRequestTimeoutError(error)) {\n return timeoutError(service, error.timeoutMs, error);\n }\n\n // Check for abort errors\n if (error.name === \"AbortError\") {\n return abortedError(service);\n }\n\n // Check for timeout errors (varies by platform)\n if (\n error.name === \"TimeoutError\" ||\n error.message.toLowerCase().includes(\"timeout\")\n ) {\n return timeoutError(service);\n }\n\n return {\n code: defaultCode,\n message: error.message,\n service,\n cause: error,\n };\n }\n\n return {\n code: defaultCode,\n message: String(error),\n service,\n };\n}\n\n/**\n * Create an error Result from a ServiceError.\n */\nexport function errorResult(error: ServiceError) {\n return err(error);\n}\n","/**\n * SDK Services - Core Types\n *\n * These types define the service architecture for TinyCloud SDK.\n * Services use dependency injection via IServiceContext for platform independence.\n */\n\n// =============================================================================\n// Result Type Pattern\n// =============================================================================\n\n/**\n * Result type for service operations.\n * Services return Result instead of throwing, making error handling explicit.\n *\n * @template T - The success data type\n * @template E - The error type (defaults to ServiceError)\n *\n * @example\n * ```typescript\n * const result = await kv.get('key');\n * if (result.ok) {\n * console.log(result.data);\n * } else {\n * console.error(result.error.code);\n * }\n * ```\n */\nexport type Result<T, E = ServiceError> =\n | { ok: true; data: T }\n | { ok: false; error: E };\n\n/**\n * Service error with structured information.\n */\nexport interface ServiceError {\n /** Error code for programmatic handling (e.g., 'KV_NOT_FOUND', 'AUTH_EXPIRED') */\n code: string;\n /** Human-readable error message */\n message: string;\n /** Service that produced the error (e.g., 'kv', 'sql') */\n service: string;\n /** Original error if this wraps another error */\n cause?: Error;\n /** Additional metadata about the error */\n meta?: Record<string, unknown>;\n}\n\n/**\n * A node-supplied permission hint after strict SDK validation. This is\n * deliberately narrower than a general capability: no wildcards, caveats,\n * descriptions, or transport metadata can cross the service boundary.\n */\nexport interface PermissionHint {\n readonly service: \"tinycloud.kv\" | \"tinycloud.encryption\";\n readonly space?: string;\n readonly path: string;\n readonly actions: readonly string[];\n}\n\n/**\n * Storage quota information returned with quota-related errors.\n * @deprecated Read `usedBytes`, `limitBytes` and `account` from the error's\n * `meta`, or use `StorageFullEvent` from `tc.on(\"storage.full\", handler)`.\n */\nexport interface StorageQuotaInfo {\n usedBytes: number;\n limitBytes: number;\n service: string;\n}\n\n/**\n * Standard error codes used across services.\n */\nexport const ErrorCodes = {\n // Common errors\n NOT_FOUND: \"NOT_FOUND\",\n AUTH_EXPIRED: \"AUTH_EXPIRED\",\n AUTH_REQUIRED: \"AUTH_REQUIRED\",\n AUTH_UNAUTHORIZED: \"AUTH_UNAUTHORIZED\",\n /** HTTP 401: the delegation the invocation cites was revoked. */\n AUTH_DELEGATION_REVOKED: \"AUTH_DELEGATION_REVOKED\",\n /** HTTP 401: a delegation the cited one rests on was revoked. */\n AUTH_DELEGATION_ANCESTOR_REVOKED: \"AUTH_DELEGATION_ANCESTOR_REVOKED\",\n NETWORK_ERROR: \"NETWORK_ERROR\",\n TIMEOUT: \"TIMEOUT\",\n ABORTED: \"ABORTED\",\n INVALID_INPUT: \"INVALID_INPUT\",\n PERMISSION_DENIED: \"PERMISSION_DENIED\",\n\n // Node retry signals (tinycloud-node #347). `meta.retryable` says whether a\n // retry is safe; `meta.retryAfterMs` carries the node's Retry-After.\n /** HTTP 503 `sql_busy:<stage>` / `unavailable_retryable`/`read_audit_busy`: nothing was applied; retry after `meta.retryAfterMs`. */\n NODE_BUSY: \"NODE_BUSY\",\n /** HTTP 503 `request_timeout`: the node's deadline passed before any write began; nothing was applied. */\n REQUEST_TIMEOUT: \"REQUEST_TIMEOUT\",\n /** HTTP 500 `outcome_unknown`: a write may have been applied; read back before retrying a non-idempotent operation. */\n OUTCOME_UNKNOWN: \"OUTCOME_UNKNOWN\",\n\n // KV-specific errors\n KV_NOT_FOUND: \"KV_NOT_FOUND\",\n KV_WRITE_FAILED: \"KV_WRITE_FAILED\",\n KV_PRECONDITION_FAILED: \"KV_PRECONDITION_FAILED\",\n KV_CONFLICT: \"KV_CONFLICT\",\n KV_RESPONSE_TOO_LARGE: \"KV_RESPONSE_TOO_LARGE\",\n /** HTTP 410 from the change feed: discard sync state and restart without a cursor; `meta.reason` says why. */\n KV_SYNC_RESET_REQUIRED: \"KV_SYNC_RESET_REQUIRED\",\n /** HTTP 403 from the change feed: the retention grant was refused; `meta.reason` says why. */\n KV_RETENTION_GRANT_REFUSED: \"KV_RETENTION_GRANT_REFUSED\",\n\n // SQL-specific errors\n SQL_ERROR: \"SQL_ERROR\",\n SQL_PERMISSION_DENIED: \"SQL_PERMISSION_DENIED\",\n SQL_DATABASE_NOT_FOUND: \"SQL_DATABASE_NOT_FOUND\",\n SQL_RESPONSE_TOO_LARGE: \"SQL_RESPONSE_TOO_LARGE\",\n SQL_QUOTA_EXCEEDED: \"SQL_QUOTA_EXCEEDED\",\n SQL_INVALID_STATEMENT: \"SQL_INVALID_STATEMENT\",\n SQL_SCHEMA_ERROR: \"SQL_SCHEMA_ERROR\",\n SQL_READONLY_VIOLATION: \"SQL_READONLY_VIOLATION\",\n\n // Storage quota errors\n STORAGE_QUOTA_EXCEEDED: \"STORAGE_QUOTA_EXCEEDED\",\n STORAGE_LIMIT_REACHED: \"STORAGE_LIMIT_REACHED\",\n /** The node answered the usage read without usage numbers (it predates the read). */\n STORAGE_STATUS_UNAVAILABLE: \"STORAGE_STATUS_UNAVAILABLE\",\n\n // DuckDB-specific errors\n DUCKDB_ERROR: \"DUCKDB_ERROR\",\n DUCKDB_PERMISSION_DENIED: \"DUCKDB_PERMISSION_DENIED\",\n DUCKDB_DATABASE_NOT_FOUND: \"DUCKDB_DATABASE_NOT_FOUND\",\n DUCKDB_RESPONSE_TOO_LARGE: \"DUCKDB_RESPONSE_TOO_LARGE\",\n DUCKDB_QUOTA_EXCEEDED: \"DUCKDB_QUOTA_EXCEEDED\",\n DUCKDB_INVALID_STATEMENT: \"DUCKDB_INVALID_STATEMENT\",\n DUCKDB_SCHEMA_ERROR: \"DUCKDB_SCHEMA_ERROR\",\n DUCKDB_READONLY_VIOLATION: \"DUCKDB_READONLY_VIOLATION\",\n} as const;\n\nexport type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes];\n\n// =============================================================================\n// Service Session\n// =============================================================================\n\n/**\n * Session data required for authenticated service operations.\n * Both TinyCloudSession and web-sdk Session can be cast to this interface.\n */\nexport interface ServiceSession {\n /** The delegation header containing the UCAN */\n delegationHeader: { Authorization: string };\n /** The delegation CID */\n delegationCid: string;\n /** The space ID for this session */\n spaceId: string;\n /** The verification method DID */\n verificationMethod: string;\n /** The session key JWK (required for invoke) */\n jwk: object;\n}\n\n// =============================================================================\n// Platform Dependencies (Injected)\n// =============================================================================\n\n/**\n * Headers type - compatible with both browser and Node.js.\n */\nexport type ServiceHeaders = Record<string, string> | [string, string][];\n\n/**\n * A single fact object to include in the UCAN invocation.\n * Facts are key-value objects that the server reads from the UCAN facts field.\n */\nexport interface InvocationFact {\n [key: string]: unknown;\n}\n\n/**\n * Facts to include in the UCAN invocation.\n * This is an array of fact objects per the UCAN spec.\n * Used to pass additional parameters that the server reads from the UCAN facts field.\n */\nexport type InvocationFacts = InvocationFact[];\n\n/**\n * Invoke function signature - platform-specific implementation injected via DI.\n * Both node-sdk-wasm and web-sdk-wasm export this with identical signature.\n *\n * @param session - The service session with delegation data\n * @param service - Service name (e.g., \"kv\")\n * @param path - Resource path or key\n * @param action - Action to perform (e.g., \"tinycloud.kv/get\")\n * @param facts - Optional facts to include in the UCAN (e.g., for capabilities/read params)\n * @returns Headers to include in the request\n */\nexport type InvokeFunction = (\n session: ServiceSession,\n service: string,\n path: string,\n action: string,\n facts?: InvocationFacts,\n) => ServiceHeaders;\n\n/**\n * Multi-resource invocation entry.\n */\nexport interface InvokeAnyEntry {\n /**\n * Legacy space-scoped resource. Optional when `resource` is provided.\n */\n spaceId?: string;\n service: string;\n path: string;\n action: string;\n /** Optional raw resource URI. When set, WASM signs this URI directly. */\n resource?: string;\n /** Capability caveats that must remain on this invocation attenuation. */\n caveats?: Record<string, unknown>[];\n}\n\n/**\n * Invoke function for minting a single authorization header that covers\n * multiple capabilities across one effective invoker.\n */\nexport type InvokeAnyFunction = (\n session: ServiceSession,\n entries: InvokeAnyEntry[],\n facts?: InvocationFacts,\n) => ServiceHeaders;\n\n/**\n * Fetch request options - compatible with standard fetch API.\n */\nexport interface FetchRequestInit {\n method?: string;\n headers?: ServiceHeaders;\n body?: Blob | FormData | string;\n signal?: AbortSignal;\n redirect?: \"error\";\n}\n\n/**\n * Fetch response interface - compatible with standard Response.\n */\nexport interface FetchResponse {\n ok: boolean;\n status: number;\n statusText: string;\n body?: unknown;\n headers: {\n get(name: string): string | null;\n };\n json(): Promise<unknown>;\n text(): Promise<string>;\n arrayBuffer(): Promise<ArrayBuffer>;\n blob(): Promise<Blob>;\n /** Present on standard Responses; the retry reads a clone so the caller's body stays intact. */\n clone?(): FetchResponse;\n /** Set by `ServiceContext.invokeWithRetry` on the response it returns: how many requests it took. */\n retry?: RetryStats;\n}\n\n/** What automatic retry cost one request, so latency can be split from backoff. */\nexport interface RetryStats {\n /** Requests sent, including the first (1 means no retry). */\n attempts: number;\n /** Total milliseconds spent waiting between attempts. */\n backoffMs: number;\n}\n\n/**\n * Fetch function signature - allows for custom fetch implementations.\n * Compatible with both browser fetch and Node.js fetch.\n */\nexport type FetchFunction = (\n url: string,\n init?: FetchRequestInit,\n) => Promise<FetchResponse>;\n\n// =============================================================================\n// Retry Policy\n// =============================================================================\n\n/**\n * Automatic retry of node responses that guarantee nothing was applied\n * (`NODE_BUSY`, `REQUEST_TIMEOUT`). Applied once, in the service context's\n * `invokeWithRetry`, which re-mints the signed invocation per attempt. Backoff\n * is full-jitter: each delay is uniform in `[0, step]`, where\n * `step` is the strategy's delay capped at `maxDelayMs`. A node `Retry-After`\n * replaces the delay. Opt out with `{ maxAttempts: 1 }`.\n */\nexport interface RetryPolicy {\n /** Maximum number of attempts (including initial) */\n maxAttempts: number;\n /** Backoff strategy between retries */\n backoff: \"none\" | \"linear\" | \"exponential\";\n /** Base delay in milliseconds for backoff calculation */\n baseDelayMs: number;\n /** Maximum delay in milliseconds between retries */\n maxDelayMs: number;\n /** Node error codes that trigger a retry. `OUTCOME_UNKNOWN` is never retried. */\n retryableErrors: string[];\n /** Total time budget for all attempts and waits, in milliseconds. Unset: no cap. */\n maxTotalMs?: number;\n}\n\n/**\n * Default retry policy.\n */\nexport const defaultRetryPolicy: RetryPolicy = {\n maxAttempts: 4,\n backoff: \"exponential\",\n baseDelayMs: 250,\n maxDelayMs: 4000,\n retryableErrors: [ErrorCodes.NODE_BUSY, ErrorCodes.REQUEST_TIMEOUT],\n maxTotalMs: 12000,\n};\n\n// =============================================================================\n// Service Context\n// =============================================================================\n\n/**\n * Event handler function type.\n */\nexport type EventHandler = (data: unknown) => void;\n\n/**\n * SDK telemetry event handler.\n */\nexport type TelemetryEventHandler = (event: string, data: unknown) => void;\n\n/**\n * Default-off telemetry configuration.\n */\nexport type TelemetryConfig =\n | boolean\n | {\n enabled?: boolean;\n onEvent?: TelemetryEventHandler;\n };\n\n/**\n * Service interface - base contract for all services.\n */\nexport interface IService {\n /** Initialize service with context */\n initialize(context: IServiceContext): void;\n\n /** Called when session changes (sign-in, sign-out, refresh) */\n onSessionChange(session: ServiceSession | null): void;\n\n /** Called when SDK signs out - should abort pending operations */\n onSignOut(): void;\n\n /** Service-specific configuration */\n readonly config: Record<string, unknown>;\n}\n\n/**\n * Context provided to services for accessing platform dependencies.\n * The SDK creates this context and passes it to services during initialization.\n */\nexport interface IServiceContext {\n // Session management\n /** Current active session, or null if not authenticated */\n readonly session: ServiceSession | null;\n /** Whether there is an active authenticated session */\n readonly isAuthenticated: boolean;\n\n // Platform dependencies (injected by SDK)\n /** Platform-specific invoke function from WASM binding */\n readonly invoke: InvokeFunction;\n /** Optional multi-resource invoke function */\n readonly invokeAny?: InvokeAnyFunction;\n /** Fetch function (defaults to globalThis.fetch) */\n readonly fetch: FetchFunction;\n /** Send a signed invocation, retrying a busy node; `build` re-signs per attempt. Absent: sends once. */\n invokeWithRetry?(\n url: string,\n build: () => FetchRequestInit | Promise<FetchRequestInit>,\n ): Promise<FetchResponse>;\n /** Available TinyCloud host URLs */\n readonly hosts: string[];\n\n // Cross-service access\n /** Get another registered service by name */\n getService<T extends IService>(name: string): T | undefined;\n\n // Telemetry/Events\n /** Emit a telemetry event */\n emit(event: string, data: unknown): void;\n /** Subscribe to events */\n on(event: string, handler: EventHandler): () => void;\n\n // Lifecycle\n /** Abort signal that fires when SDK signs out. */\n readonly abortSignal: AbortSignal;\n /** Additional abort signal for a scoped operation, when active. */\n readonly operationAbortSignal?: AbortSignal;\n /** Install an additional signal for the duration of a scoped operation. */\n setOperationAbortSignal?(signal: AbortSignal | undefined): void;\n // Retry policy\n /** Retry policy for failed requests */\n readonly retryPolicy: RetryPolicy;\n}\n\n// =============================================================================\n// Telemetry Events\n// =============================================================================\n\n/**\n * Event emitted before a service request.\n */\nexport interface ServiceRequestEvent {\n service: string;\n action: string;\n span?: string;\n key?: string;\n timestamp: number;\n}\n\n/**\n * Event emitted after a service response.\n */\nexport interface ServiceResponseEvent {\n service: string;\n action: string;\n span?: string;\n ok: boolean;\n duration: number;\n durationMs?: number;\n status?: number;\n}\n\n/**\n * Event emitted on service error.\n */\nexport interface ServiceErrorEvent {\n service: string;\n span?: string;\n error: ServiceError;\n}\n\n/**\n * Event emitted on retry attempt.\n */\nexport interface ServiceRetryEvent {\n service: string;\n attempt: number;\n maxAttempts: number;\n error: ServiceError;\n}\n\n/**\n * Generic named span event for aggregating operation timings.\n */\nexport interface TelemetrySpanEvent {\n span: string;\n ok: boolean;\n durationMs: number;\n service?: string;\n action?: string;\n status?: number;\n error?: ServiceError;\n}\n\n/**\n * Telemetry event names.\n */\nexport const TelemetryEvents = {\n SPAN: \"telemetry.span\",\n SERVICE_REQUEST: \"service.request\",\n SERVICE_RESPONSE: \"service.response\",\n SERVICE_ERROR: \"service.error\",\n SERVICE_RETRY: \"service.retry\",\n SESSION_CHANGED: \"session.changed\",\n SESSION_EXPIRED: \"session.expired\",\n REPLICATION_READ: \"replication.read\",\n REPLICATION_WRITE: \"replication.write\",\n REPLICATION_SYNC: \"replication.sync\",\n REPLICATION_STATE: \"replication.state\",\n REPLICATION_DIVERGENCE: \"replication.divergence\",\n REPLICATION_GRANT: \"replication.grant\",\n REPLICATION_LIFECYCLE: \"replication.lifecycle\",\n /** Emitted once, on the first write rejected because storage is full. */\n STORAGE_FULL: \"storage.full\",\n} as const;\n\n// =============================================================================\n// Helper Functions\n// =============================================================================\n\n/**\n * Create a success result.\n */\nexport function ok<T>(data: T): Result<T> {\n return { ok: true, data };\n}\n\n/**\n * Create an error result.\n */\nexport function err<E = ServiceError>(error: E): Result<never, E> {\n return { ok: false, error };\n}\n\n/**\n * Create a ServiceError.\n */\nexport function serviceError(\n code: string,\n message: string,\n service: string,\n options?: { cause?: Error; meta?: Record<string, unknown> },\n): ServiceError {\n return {\n code,\n message,\n service,\n cause: options?.cause,\n meta: options?.meta,\n };\n}\n","import { ErrorCodes, type Result } from \"../../types\";\n\nconst DEFINITIVE_FAILURES = new Set<string>([\n ErrorCodes.AUTH_REQUIRED, ErrorCodes.INVALID_INPUT, ErrorCodes.AUTH_UNAUTHORIZED,\n ErrorCodes.KV_PRECONDITION_FAILED, ErrorCodes.STORAGE_QUOTA_EXCEEDED, ErrorCodes.STORAGE_LIMIT_REACHED,\n]);\n\nexport function classifyWriteOutcome<T>(\n op: \"put\" | \"delete\" | \"batchPut\",\n result: Result<T>,\n options: { conditional?: boolean } = {},\n): \"committed\" | \"failed\" | \"ambiguous\" {\n if (result.ok) return \"committed\";\n const { code, meta } = result.error;\n if (op === \"delete\" && code === ErrorCodes.KV_NOT_FOUND) {\n return options.conditional === true ? \"failed\" : \"committed\";\n }\n if (meta?.requestMayHaveDispatched === false) return \"failed\";\n if (DEFINITIVE_FAILURES.has(code)) return \"failed\";\n if (meta?.outcome === \"batch-unconfirmed\") return \"ambiguous\";\n const status = typeof meta?.status === \"number\" ? meta.status : undefined;\n if (status !== undefined && status >= 400 && status < 500) return \"failed\";\n return \"ambiguous\";\n}\n","import { kvPrefixCovers } from \"./scope\";\nimport type { PendingWriteRecord, PendingWriteState } from \"./types\";\n\nexport function emptyPendingState(identity: PendingWriteState[\"identity\"]): PendingWriteState {\n return { v: 2, identity: { ...identity }, committedEpoch: 0, seq: 0, records: [] };\n}\n\nexport function begin(s: PendingWriteState, opId: string, keys: readonly { key: string; op: \"put\" | \"delete\" }[], at: string): PendingWriteRecord[] {\n const records = keys.map(({ key, op }) => ({ opId, seq: ++s.seq, key, op, state: \"in_flight\" as const, epoch: null, at, settledAt: null }));\n s.records.push(...records);\n return records;\n}\n\nexport function settle(s: PendingWriteState, opId: string, outcome: \"committed\" | \"failed\" | \"ambiguous\", at: string, code?: string): void {\n if (outcome === \"failed\") { s.records = s.records.filter((r) => r.opId !== opId); return; }\n const own = s.records.filter((r) => r.opId === opId && r.state === \"in_flight\");\n if (outcome === \"committed\" && own.length > 0) {\n const epoch = ++s.committedEpoch;\n for (const r of own) { r.state = \"committed\"; r.epoch = epoch; r.settledAt = at; }\n return;\n }\n for (const r of own) { r.state = \"ambiguous\"; r.settledAt = at; if (code) r.code = code; }\n}\n\nexport function afterSync(s: PendingWriteState, prefix: string, syncStartEpoch: number): number {\n const before = s.records.length;\n s.records = s.records.filter((r) => !(r.state === \"committed\" && r.epoch !== null && r.epoch <= syncStartEpoch && kvPrefixCovers(prefix, r.key)));\n return before - s.records.length;\n}\n\nexport function clearPrefix(s: PendingWriteState, prefix: string): number {\n const before = s.records.length;\n s.records = s.records.filter((r) => !kvPrefixCovers(prefix, r.key));\n return before - s.records.length;\n}\n\nexport function clearPending(s: PendingWriteState, now: number): number {\n const before = s.records.length;\n s.records = s.records.filter((r) => r.state === \"committed\" || (r.state === \"in_flight\" && now - Date.parse(r.at) <= 10 * 60_000));\n return before - s.records.length;\n}\n\nexport function pinnedKeys(s: PendingWriteState, prefix: string, now: number, cap = 100) {\n return s.records.filter((r) => kvPrefixCovers(prefix, r.key) && (r.state === \"in_flight\" || r.state === \"ambiguous\"))\n .sort((a, b) => a.seq - b.seq).slice(0, cap).map((r) => ({ key: r.key, state: r.state as \"in_flight\" | \"ambiguous\", op: r.op, since: r.at, ...(r.code ? { code: r.code } : {}), likelyOrphaned: r.state === \"in_flight\" && now - Date.parse(r.at) > 10 * 60_000 }));\n}\n","import { err, ErrorCodes, ok, serviceError } from \"../../types\";\nimport type { KVResponse } from \"../types\";\nimport type { LocalGetResult } from \"./types\";\n\nexport type LocalGetResponse<T> = { ok: true; data: KVResponse<T> } | { ok: false; error: { code: string; message: string; service: string; meta?: Record<string, unknown> } };\n\nexport function parseLocalValue<T>(bytes: Uint8Array, contentType: string | undefined, raw: boolean | undefined, binary: boolean | undefined): T {\n if (binary) return bytes as T;\n const text = new TextDecoder().decode(bytes);\n if (raw) return text as T;\n if (contentType?.includes(\"application/json\")) return JSON.parse(text) as T;\n if (contentType?.startsWith(\"text/\")) return text as T;\n if (!text) return undefined as T;\n try { return JSON.parse(text) as T; } catch { return text as T; }\n}\n\nexport function localGet<T>(result: LocalGetResult, key: string, options: { raw?: boolean; binary?: boolean; maxResponseBytes?: number }): LocalGetResponse<T> {\n if (result.status === \"present\") {\n if (options.maxResponseBytes !== undefined && result.value.byteLength > options.maxResponseBytes) {\n return err(serviceError(ErrorCodes.KV_RESPONSE_TOO_LARGE, `KV value at key ${JSON.stringify(key)} exceeds the requested response limit`, \"kv\", { meta: { status: 413 } }));\n }\n const contentType = Object.entries(result.metadata).find(([name]) => name.toLowerCase() === \"content-type\")?.[1];\n const headers = new Headers({ etag: result.etag, \"content-length\": String(result.value.byteLength), \"cache-control\": \"private, no-cache\", ...result.metadata, \"x-tinycloud-source\": \"replica\" });\n return ok({\n data: parseLocalValue<T>(result.value, contentType, options.raw, options.binary),\n headers: {\n etag: result.etag,\n contentType,\n contentLength: result.value.byteLength,\n get: (name: string) => headers.get(name),\n },\n });\n }\n if (result.status === \"absent\" || result.status === \"deleted\") return err(serviceError(ErrorCodes.KV_NOT_FOUND, `Key not found: ${key}`, \"kv\"));\n return err(serviceError(ErrorCodes.NETWORK_ERROR, \"Local value is not available\", \"kv\"));\n}\n","import { err, ErrorCodes, serviceError } from \"../../types\";\nimport { kvPrefixCovers } from \"./scope\";\nimport type { KVListPage, LocalListResult, LocalReadMeta } from \"./types\";\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder(\"utf-8\", { fatal: true });\nexport function utf8Compare(a: string, b: string): number {\n const x = encoder.encode(a), y = encoder.encode(b);\n for (let i = 0; i < Math.min(x.length, y.length); i++) if (x[i] !== y[i]) return x[i]! - y[i]!;\n return x.length - y.length;\n}\nexport function encodeTcr1(space: string, path: string, last: string): string {\n const bytes = encoder.encode(JSON.stringify({ v: 1, space, path, last }));\n let binary = \"\";\n for (let offset = 0; offset < bytes.length; offset += 0x8000) {\n binary += String.fromCharCode(...bytes.subarray(offset, offset + 0x8000));\n }\n const payload = btoa(binary).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n return `tcr1.${payload}`;\n}\nexport function decodeTcr1(cursor: string): { v: 1; space: string; path: string; last: string } | null {\n try {\n const encoded = cursor.slice(5).replace(/-/g, \"+\").replace(/_/g, \"/\");\n const binary = atob(encoded + \"=\".repeat((4 - encoded.length % 4) % 4));\n const bytes = Uint8Array.from(binary, (character) => character.charCodeAt(0));\n const x = JSON.parse(decoder.decode(bytes));\n return x?.v === 1 && typeof x.space === \"string\" && typeof x.path === \"string\" && typeof x.last === \"string\" ? x : null;\n } catch { return null; }\n}\nexport function cursorRestart() {\n return err(serviceError(ErrorCodes.INVALID_INPUT, \"Local list cursor cannot be served; restart without the cursor\", \"kv\", { meta: { replication: \"cursor_restart\" } }));\n}\nexport function localList(handle: { list(o: { prefix: string; after?: string; limit?: number }): Promise<LocalListResult> }, space: string, path: string, limit: number | undefined, cursor: string | undefined, validateMeta: (meta: LocalReadMeta) => void): Promise<KVListPage> {\n const after = cursor ? decodeTcr1(cursor)?.last : undefined;\n const exact = path !== \"\" && !path.endsWith(\"/\") && (after === undefined || utf8Compare(path, after) > 0)\n ? awaitExact(handle, path, after, validateMeta) : Promise.resolve(false);\n return exact.then(async (hasExact) => {\n const child = path === \"\" ? \"\" : path.endsWith(\"/\") ? path : `${path}/`;\n const want = limit === undefined ? undefined : limit + 1 - (hasExact ? 1 : 0);\n const children = await handle.list({ prefix: child, after, limit: want });\n validateMeta(children.meta);\n let keys = (hasExact ? [path] : []).concat(children.keys);\n const truncated = limit !== undefined && keys.length > limit;\n if (truncated) keys = keys.slice(0, limit);\n return { keys, truncated: truncated, ...(truncated ? { nextCursor: encodeTcr1(space, path, keys[keys.length - 1]!) } : {}) };\n });\n}\n\nasync function awaitExact(handle: { list(o: { prefix: string; after?: string; limit?: number }): Promise<LocalListResult> }, path: string, after: string | undefined, validateMeta: (meta: LocalReadMeta) => void): Promise<boolean> {\n if (after !== undefined && utf8Compare(path, after) <= 0) return false;\n const result = await handle.list({ prefix: path, limit: 1 });\n validateMeta(result.meta);\n return result.keys[0] === path;\n}\n\nexport function listPathCovered(prefixes: readonly string[], path: string): string | undefined {\n return prefixes.find((prefix) => kvPrefixCovers(prefix, path));\n}\n","import type { ReplicationEvent, ReplicationScheduler } from \"./types\";\n\nexport type ReplicationEventInput = ReplicationEvent extends infer Event\n ? Event extends { at: string }\n ? Omit<Event, \"at\">\n : never\n : never;\n\nexport function emitEvent(emit: (event: ReplicationEvent) => void, scheduler: ReplicationScheduler, event: ReplicationEventInput): void {\n try { emit({ ...event, at: new Date(scheduler.now()).toISOString() } as ReplicationEvent); } catch { /* Observability never changes KV behavior. */ }\n}\n","/** Grant lifetime constants without browser storage identifiers. */\nconst HOUR_MS = 60 * 60 * 1000;\nconst DAY_MS = 24 * HOUR_MS;\n\n/** Default device-grant lifetime from install (24 h). All durations are milliseconds. */\nexport const DEFAULT_GRANT_TTL_MS = DAY_MS;\n/** `grantTtlMs` above this (7 d) is a config error: TypeError at construction. */\nexport const MAX_GRANT_TTL_MS = 7 * DAY_MS;\n/** Consent deadline = consent anchor + this window (7 d). */\nexport const CONSENT_WINDOW_MS = 7 * DAY_MS;\n/** Silent renewal starts when remaining effective lifetime < this fraction of the effective lifetime. */\nexport const RENEW_BELOW_FRACTION = 0.25;\n","/**\n * Grant lifetime policy (TC-858 plan §6, CONTRACT.md §3). Pure functions over epoch\n * milliseconds. Types and constants come from the shared contract; this file only implements them.\n *\n * Every function fails closed: a non-finite input yields a value that refuses the mint, renewal or\n * read, never a permissive one.\n */\nimport { CONSENT_WINDOW_MS, MAX_GRANT_TTL_MS, RENEW_BELOW_FRACTION } from \"./grantPolicyConstants\";\nexport { MAX_GRANT_TTL_MS } from \"./grantPolicyConstants\";\nimport type {\n ConsentDeadlineMs,\n EffectiveGrantExpiry,\n MintRemainingMs,\n NeedsSilentRenewal,\n ReplicaConsentAnchor,\n} from \"./grantPolicyTypes\";\n\n/** An instant that has already passed: nothing is minted, renewed or served against it. */\nconst EXPIRED = Number.NEGATIVE_INFINITY;\n\n/**\n * Caller contract: clamp the anchor with {@link clampConsentAnchor} first. A non-finite anchor\n * yields an already-passed deadline.\n */\nexport const consentDeadlineMs: ConsentDeadlineMs = (anchor) =>\n Number.isFinite(anchor.at) ? anchor.at + CONSENT_WINDOW_MS : EXPIRED;\n\n/**\n * Returns the anchor the deadline may be computed from. A non-finite anchor or clock yields\n * `null` (no anchor, so no mint). An anchor dated after `now` is pulled back to `now`, so a\n * future-dated anchor cannot extend the 7 d window.\n */\nexport const clampConsentAnchor = (\n anchor: ReplicaConsentAnchor | null,\n now: number,\n): ReplicaConsentAnchor | null => {\n if (anchor === null || !Number.isFinite(anchor.at) || !Number.isFinite(now)) return null;\n return anchor.at > now ? { at: now, source: anchor.source } : anchor;\n};\n\nexport const effectiveGrantExpiry: EffectiveGrantExpiry = ({\n signedExpiresAt,\n installedAt,\n grantTtlMs,\n consentDeadline,\n}) => {\n const signedValid = signedExpiresAt === null || Number.isFinite(signedExpiresAt);\n if (!signedValid || !Number.isFinite(installedAt) || !Number.isFinite(grantTtlMs) || !Number.isFinite(consentDeadline)) {\n return EXPIRED;\n }\n const ttl = Math.min(grantTtlMs, MAX_GRANT_TTL_MS);\n const localBound = Math.min(installedAt + ttl, consentDeadline);\n return signedExpiresAt === null ? localBound : Math.min(signedExpiresAt, localBound);\n};\n\nexport const mintRemainingMs: MintRemainingMs = ({ now, grantTtlMs, consentDeadline }) => {\n if (!Number.isFinite(now) || !Number.isFinite(grantTtlMs) || !Number.isFinite(consentDeadline)) return 0;\n return Math.min(Math.min(grantTtlMs, MAX_GRANT_TTL_MS), consentDeadline - now);\n};\n\nexport const needsSilentRenewal: NeedsSilentRenewal = ({ now, installedAt, effectiveExpiresAt, consentDeadline }) => {\n if (\n !Number.isFinite(now) ||\n !Number.isFinite(installedAt) ||\n !Number.isFinite(effectiveExpiresAt) ||\n !Number.isFinite(consentDeadline)\n ) {\n return false;\n }\n if (!(now < consentDeadline)) return false;\n const remaining = effectiveExpiresAt - now;\n const lifetime = effectiveExpiresAt - installedAt;\n return remaining < lifetime * RENEW_BELOW_FRACTION;\n};\n","import { wrapError } from \"../../errors\";\nimport { ErrorCodes, err, ok, serviceError, type Result } from \"../../types\";\nimport type { KVGetOptions, KVListOptions, KVResponse } from \"../types\";\nimport { kvPrefixCovers, listRangeCovers, requiresSecretsOptIn } from \"./scope\";\nimport { classifyWriteOutcome } from \"./outcome\";\nimport { afterSync, begin, clearPending as clearPendingRecords, clearPrefix, emptyPendingState, pinnedKeys, settle } from \"./pendingWrites\";\nimport { localGet, type LocalGetResponse } from \"./localResponse\";\nimport { cursorRestart, decodeTcr1, listPathCovered, localList } from \"./listLocal\";\nimport { emitEvent, type ReplicationEventInput } from \"./events\";\nimport type { KVListPage, KVReplicaHandle, KVReplicationController, LocalGetResult, LocalReadMeta, LocalReplicaStatus, ReplicaInspectedStatus, ReplicaGrantInfo, PendingWriteState, ReplicaDevice, ReplicaPeerCommit, ReplicationEvent, ReplicationReason, ReplicaStatusEntry, KVReplicationDeps, LocalSyncResult } from \"./types\";\nimport type { ReplicaDeliveryDecision, ReplicaSessionStamp } from \"./lifecycle\";\nimport { DEFAULT_GRANT_TTL_MS, RENEW_BELOW_FRACTION } from \"./grantPolicyConstants\";\nimport { clampConsentAnchor, consentDeadlineMs, mintRemainingMs, needsSilentRenewal } from \"./grantPolicy\";\nimport type { ReplicaConsentAnchor } from \"./grantPolicyTypes\";\n\nconst CLOSE_TIMEOUT_MS = 3_000;\nconst STATUS_REFRESH_TIMEOUT_MS = CLOSE_TIMEOUT_MS;\ntype SyncAbortCause = \"timeout\" | \"caller\" | \"close\" | \"purge\";\ninterface SyncContext { abortCause?: SyncAbortCause }\ninterface StatusInspection { abort: AbortController; settled: Promise<void> }\ninterface InspectedStatusResult { missing: boolean; local?: LocalReplicaStatus | ReplicaInspectedStatus; errorCode?: string }\ninterface ReplicaDerivationPlan { path: \"session\" | \"runtime\"; parentCid: string; expiresAt: number }\ninterface Opened {\n handle?: KVReplicaHandle;\n opening?: Promise<KVReplicaHandle>;\n sync?: Promise<LocalSyncResult>;\n syncContext?: SyncContext;\n abort?: AbortController;\n mintAbort?: AbortController;\n timer?: () => void;\n renewalTimer?: () => void;\n renewing?: Promise<void>;\n lastError?: string;\n reason?: ReplicationReason;\n strategy?: \"session\" | \"minted\" | \"installed\";\n retryAt?: number;\n failures?: number;\n unsupported?: boolean;\n authorityRevoked?: boolean;\n reportedExpired?: boolean;\n reportedCappedCid?: string;\n reportedRenewalUnqualifiedCid?: string;\n}\nconst nowDate = (now: number) => new Date(now).toISOString();\nconst errorCode = (e: unknown): string => typeof e === \"object\" && e !== null && \"code\" in e && typeof e.code === \"string\" ? e.code : \"REPLICA_UNAVAILABLE\";\nfunction raceSignal<T>(job: Promise<T>, signal: AbortSignal): Promise<T> {\n if (signal.aborted) return Promise.reject(signal.reason ?? Object.assign(new Error(\"KV request was aborted\"), { code: ErrorCodes.ABORTED }));\n let remove = () => {};\n const aborted = new Promise<never>((_, reject) => {\n const onAbort = () => reject(signal.reason ?? Object.assign(new Error(\"KV request was aborted\"), { code: ErrorCodes.ABORTED }));\n signal.addEventListener(\"abort\", onAbort, { once: true });\n remove = () => signal.removeEventListener(\"abort\", onAbort);\n });\n return Promise.race([job, aborted]).finally(remove);\n}\n\nexport function createKVReplication(deps: KVReplicationDeps): KVReplicationController {\n const { options, mode, storage, identity, session, authority, pending, scheduler } = deps;\n const emit = (event: ReplicationEventInput): void => emitEvent(deps.emit, scheduler, event);\n const replicas = new Map<string, Opened>();\n const statusInspections = new Set<StatusInspection>();\n let isClosed = false;\n let purgeStarted = false;\n let purgeInProgress = false;\n let previous = deps.previous;\n let pinnedStateReported = false;\n const inProcessProof = new Set<string>();\n let anchorUnavailable = false;\n let consentAnchor: ReplicaConsentAnchor | null = null;\n try {\n consentAnchor = clampConsentAnchor(authority.consentAnchor?.() ?? null, scheduler.now());\n if (consentAnchor?.source === \"first_install\") consentAnchor = null;\n } catch {\n anchorUnavailable = true;\n }\n const grantPolicy = { grantTtlMs: options.grantTtlMs ?? DEFAULT_GRANT_TTL_MS, consentAnchor };\n const quota = options.maxBytes === undefined && options.minFreeBytes === undefined\n ? undefined : { maxBytes: options.maxBytes, minFreeBytes: options.minFreeBytes };\n const policyDeadline = consentAnchor === null ? null : consentDeadlineMs(consentAnchor);\n let scheduledConsentDeadline: number | null = null;\n let cancelConsentTimer: (() => void) | undefined;\n function durableDeadline(): number | null {\n if (storage.kind !== \"indexeddb\" || !deps.stamp) return null;\n try {\n const deadline = storage.lifecycle?.consentDeadline(deps.stamp);\n return typeof deadline === \"number\" && Number.isFinite(deadline) ? deadline : null;\n } catch {\n return null;\n }\n }\n function mintDeadline(): number | null {\n if (policyDeadline === null) return null;\n if (storage.kind !== \"indexeddb\") return policyDeadline;\n const durable = durableDeadline();\n return durable === null ? null : Math.min(policyDeadline, durable);\n }\n function scheduleConsentDeadline(): void {\n const deadline = durableDeadline();\n if (deadline === null || consentDenyStarted || isClosed) return;\n const now = scheduler.now();\n if (!Number.isFinite(now)) return;\n if (scheduledConsentDeadline === deadline && cancelConsentTimer) return;\n scheduledConsentDeadline = deadline;\n cancelConsentTimer?.();\n cancelConsentTimer = scheduler.setTimeout(() => {\n cancelConsentTimer = undefined;\n checkDelivery();\n }, Math.max(0, deadline - now));\n }\n const reportedDeadline = new Set<string>();\n let consentDenyStarted = false;\n function checkDelivery(): ReplicaDeliveryDecision {\n const gate = storage.lifecycle;\n if (!gate) return storage.kind === \"indexeddb\" || anchorUnavailable || deps.stamp !== undefined\n ? { status: \"gated\", gate: \"gate_unavailable\" }\n : { status: \"allow\" };\n if (!deps.stamp) return { status: \"gated\", gate: \"not_established\" };\n if (consentDenyStarted) return { status: \"gated\", gate: \"stamp_stale\" };\n try {\n const decision = gate.checkDelivery(deps.stamp);\n if (decision.status === \"consent_expired\") startConsentDenial();\n if (decision.status !== \"allow\") return decision;\n if (storage.kind === \"indexeddb\") {\n const deadline = durableDeadline();\n if (deadline === null) return { status: \"gated\", gate: \"gate_unavailable\" };\n const now = scheduler.now();\n if (!Number.isFinite(now)) return { status: \"gated\", gate: \"gate_unavailable\" };\n if (now >= deadline) {\n startConsentDenial();\n return { status: \"consent_expired\", code: \"CONSENT_EXPIRED\" };\n }\n }\n return anchorUnavailable ? { status: \"gated\", gate: \"gate_unavailable\" } : decision;\n } catch {\n return { status: \"gated\", gate: \"gate_unavailable\" };\n }\n }\n function markConsentExpired(): boolean {\n if (consentDenyStarted || isClosed || purgeStarted) return false;\n cancelConsentTimer?.();\n cancelConsentTimer = undefined;\n consentDenyStarted = true;\n for (const state of replicas.values()) {\n state.renewalTimer?.();\n state.renewalTimer = undefined;\n state.mintAbort?.abort();\n const id = state.handle?.replicaId;\n if (id && !reportedDeadline.has(id)) {\n reportedDeadline.add(id);\n emit({ type: \"replication.grant\", replicaId: id, action: \"consent_deadline_reached\", code: \"CONSENT_EXPIRED\" });\n }\n }\n return true;\n }\n function observeConsentExpired(stamp: ReplicaSessionStamp): void {\n if (!deps.stamp || stamp.incarnation !== deps.stamp.incarnation || stamp.lifecycleEpoch !== deps.stamp.lifecycleEpoch) return;\n if (markConsentExpired()) emit({ type: \"replication.lifecycle\", action: \"denied\", reason: \"consent_expired\" });\n }\n function startConsentDenial(): void {\n const gate = storage.lifecycle;\n if (!gate || !markConsentExpired()) return;\n void gate.deny({ reason: \"consent_expired\", principal: identity.principal }).then(\n (outcome) => emit({ type: \"replication.lifecycle\", action: outcome.status === \"denied\" ? \"denied\" : outcome.status === \"stale\" ? \"deny_stale\" : outcome.status === \"deleted\" ? \"database_deleted\" : outcome.status === \"marker\" ? \"marker_set\" : \"unguarded\", reason: \"consent_expired\" }),\n () => emit({ type: \"replication.lifecycle\", action: \"deny_failed\", reason: \"consent_expired\" }),\n );\n }\n function deliveryError(decision: Exclude<ReplicaDeliveryDecision, { status: \"allow\" }>): Error {\n return Object.assign(new Error(decision.status === \"consent_expired\" ? \"Replica consent expired\" : \"Replica session is gated\"), {\n code: decision.status === \"consent_expired\" ? decision.code : \"REPLICA_GATED\",\n ...(decision.status === \"gated\" ? { gate: decision.gate } : {}),\n });\n }\n function deliveryReason(code: string): ReplicationReason {\n return code === \"CONSENT_EXPIRED\" || code === \"GRANT_EXPIRED\" ? \"grant_expired\" : code === \"REPLICA_GATED\" ? \"replica_gated\" : \"replica_error\";\n }\n function reportGrantExpiry(prefix: string): void {\n const state = replicas.get(prefix);\n if (!state) return;\n state.reason = \"grant_expired\";\n state.lastError = \"GRANT_EXPIRED\";\n const replicaId = state.handle?.replicaId;\n if (!replicaId || state.reportedExpired) return;\n state.reportedExpired = true;\n emit({ type: \"replication.grant\", replicaId, action: \"expired\", code: \"GRANT_EXPIRED\" });\n }\n function reportGrantCap(state: Opened, handle: KVReplicaHandle, grant: ReplicaGrantInfo | null | undefined): void {\n if (\n !grant?.unconstrained || !handle.replicaId ||\n typeof grant.effectiveExpiresAt !== \"number\" || !Number.isFinite(grant.effectiveExpiresAt) ||\n !(grant.expiresAt === null || grant.effectiveExpiresAt < grant.expiresAt)\n ) return;\n const capKey = `${grant.cid}:${grant.effectiveExpiresAt}`;\n if (state.reportedCappedCid === capKey) return;\n state.reportedCappedCid = capKey;\n emit({ type: \"replication.grant\", replicaId: handle.replicaId, action: \"capped\", effectiveExpiresAt: nowDate(grant.effectiveExpiresAt) });\n }\n const configuredPrefix = (path: string) => options.prefixes.find((prefix) => kvPrefixCovers(prefix, path));\n function recordRevocation(prefix: string, error: unknown): void {\n if (errorCode(error) !== \"GRANT_REVOKED\") return;\n const state = replicas.get(prefix) ?? {};\n state.authorityRevoked = true;\n state.reason = \"grant_revoked\";\n state.lastError = \"GRANT_REVOKED\";\n replicas.set(prefix, state);\n }\n function markRootUnsupported(prefix: string): void {\n const state = replicas.get(prefix) ?? {};\n const firstRefusal = state.lastError !== \"REPLICATION_ROOT_UNSUPPORTED\";\n state.reason = \"replica_unavailable\";\n state.lastError = \"REPLICATION_ROOT_UNSUPPORTED\";\n replicas.set(prefix, state);\n if (firstRefusal) {\n emit({ type: \"replication.state\", space: session.space, replica: prefix, state: \"unavailable\", code: \"REPLICATION_ROOT_UNSUPPORTED\" });\n }\n }\n function unsupportedRoot(prefix: string): Error {\n markRootUnsupported(prefix);\n return Object.assign(new Error(\"This node doesn't support whole-space sync yet.\"), { code: \"REPLICATION_ROOT_UNSUPPORTED\" });\n }\n\n\n function canReuseInstalled(grant: ReplicaGrantInfo | null | undefined, sessionOnly: boolean): boolean {\n if (!grant?.unconstrained) return false;\n if (!deps.stamp) return true;\n if (!sessionOnly && consentAnchor === null) return false;\n const now = scheduler.now();\n const deadline = storage.kind === \"indexeddb\" ? durableDeadline() : policyDeadline ?? grant.consentDeadline;\n return grant.state === \"active\" &&\n typeof grant.installedAt === \"number\" && Number.isFinite(grant.installedAt) &&\n typeof grant.effectiveExpiresAt === \"number\" && Number.isFinite(grant.effectiveExpiresAt) &&\n typeof grant.consentDeadline === \"number\" && Number.isFinite(grant.consentDeadline) &&\n typeof deadline === \"number\" && Number.isFinite(deadline) &&\n Number.isFinite(now) && now >= grant.installedAt &&\n (grant.expiresAt === null || typeof grant.expiresAt === \"number\" && Number.isFinite(grant.expiresAt) && now < grant.expiresAt) &&\n now < Math.min(grant.effectiveExpiresAt, grant.consentDeadline, deadline);\n }\n function sessionRefusal(prefix: string): string | undefined {\n try {\n if (authority.sessionOnly !== true) return undefined;\n // A signed get+sync grant for the configured prefix covers its contained get key/list path.\n const grant = authority.sessionGrant(prefix);\n return \"refused\" in grant ? grant.refused : undefined;\n } catch {\n return \"NOT_COVERED\";\n }\n }\n\n\n async function open(prefix: string): Promise<KVReplicaHandle> {\n const delivery = checkDelivery();\n if (delivery.status !== \"allow\") throw deliveryError(delivery);\n if (isClosed || purgeStarted) throw Object.assign(new Error(\"Replication controller is closed\"), { code: \"REPLICA_CLOSED\" });\n let state = replicas.get(prefix);\n if (state?.handle) return state.handle;\n if (state?.opening) return state.opening;\n state ??= {};\n replicas.set(prefix, state);\n if (state.unsupported) throw Object.assign(new Error(\"Replication runtime is unsupported\"), { code: \"RUNTIME_UNSUPPORTED\" });\n if (state.retryAt !== undefined && scheduler.now() < state.retryAt) throw Object.assign(new Error(\"Replica open is backing off\"), { code: state.lastError ?? \"REPLICA_UNAVAILABLE\" });\n if (requiresSecretsOptIn(session.space, prefix) && !options.allowSecrets) {\n const firstRefusal = state.lastError !== \"SECRETS_OPT_IN_REQUIRED\";\n state.reason = \"replica_unavailable\";\n state.lastError = \"SECRETS_OPT_IN_REQUIRED\";\n if (firstRefusal) emit({ type: \"replication.state\", space: session.space, replica: prefix, state: \"unavailable\", code: \"SECRETS_OPT_IN_REQUIRED\" });\n throw Object.assign(new Error(\"Replication requires allowSecrets for this space or prefix\"), { code: \"SECRETS_OPT_IN_REQUIRED\" });\n }\n state.opening = (async () => {\n if (previous) { await previous; previous = undefined; }\n const delivery = checkDelivery();\n if (delivery.status !== \"allow\") throw deliveryError(delivery);\n const sessionOnly = authority.sessionOnly === true;\n const sessionGrant = authority.sessionGrant(prefix);\n const delegated = \"refused\" in sessionGrant ? undefined : sessionGrant;\n const plan = sessionOnly ? undefined : authority.plan(prefix);\n let refusalCode: string | undefined;\n if (\"refused\" in sessionGrant) refusalCode = sessionGrant.refused;\n if (plan && \"refused\" in plan) refusalCode ??= plan.refused;\n if (deps.stamp && consentAnchor === null && !sessionOnly) refusalCode = \"REPLICA_GATED\";\n let device: ReplicaDevice | undefined;\n if (delegated) { device = delegated.device; state!.strategy = \"session\"; }\n const spec = {\n identity, space: session.space, prefix, allowSecrets: options.allowSecrets, grantPolicy,\n ...(quota ? { quota } : {}),\n ...(deps.stamp ? { stamp: deps.stamp } : {}),\n ...(device ? { device } : {}),\n ...(deps.fetch ? { fetch: deps.fetch } : {}),\n onPeerCommit: (info: ReplicaPeerCommit) => {\n if (isClosed || purgeStarted || state!.handle === undefined) return;\n emit({\n type: \"replication.sync\", space: session.space, replica: prefix,\n trigger: \"peer\", origin: \"peer\", outcome: \"ok\", durationMs: 0, lagMs: null,\n ...(info.changes === undefined ? {} : { changes: info.changes }),\n ...(info.coverage === undefined ? {} : { coverage: info.coverage }),\n });\n },\n };\n if (prefix === \"/\" && deps.nodeFeatures !== undefined && !deps.nodeFeatures.includes(\"kv-sync-root\")) {\n throw unsupportedRoot(prefix);\n }\n const handle = await storage.open(spec);\n state!.handle = handle;\n const afterOpen = checkDelivery();\n if (afterOpen.status !== \"allow\") throw deliveryError(afterOpen);\n emit({ type: \"replication.state\", space: session.space, replica: prefix, state: \"opened\" });\n const runtimePlan = !sessionOnly && plan && !(\"refused\" in plan) ? plan : undefined;\n let installed = runtimePlan || delegated ? await handle.grant() : undefined;\n if (installed && !canReuseInstalled(installed, sessionOnly)) {\n if (installed.unconstrained) refusalCode = consentAnchor === null && !sessionOnly ? \"REPLICA_GATED\" : \"GRANT_EXPIRED\";\n installed = undefined;\n }\n let mintedExpiryMs: number | undefined;\n if (delegated && consentAnchor !== null) {\n const beforeInstall = checkDelivery();\n if (beforeInstall.status !== \"allow\") throw deliveryError(beforeInstall);\n installed = await handle.installGrant(delegated.ucan);\n } else if (runtimePlan) {\n if (!installed || !installed.unconstrained || installed.parentCid !== runtimePlan.parentCid || (installed.expiresAt !== null && runtimePlan.expiresAt > installed.expiresAt + 300_000)) {\n const deadline = mintDeadline();\n const expiryMs = mintRemainingMs({ now: scheduler.now(), grantTtlMs: grantPolicy.grantTtlMs, consentDeadline: deadline ?? Number.NaN });\n if (expiryMs > 0) {\n try {\n const mintAbort = new AbortController();\n state!.mintAbort = mintAbort;\n const minted = await authority.mint(handle.deviceDid, prefix, mintAbort.signal, { expiryMs });\n const beforeInstall = checkDelivery();\n if (beforeInstall.status !== \"allow\") throw deliveryError(beforeInstall);\n installed = await handle.installGrant(minted.ucan);\n state!.strategy = \"minted\";\n mintedExpiryMs = expiryMs;\n } catch (error) {\n if (errorCode(error) === \"CONSENT_EXPIRED\" || errorCode(error) === \"REPLICA_GATED\" || !installed?.unconstrained) throw error;\n } finally { state!.mintAbort = undefined; }\n }\n }\n if (installed?.unconstrained) { state!.strategy ??= \"installed\"; state!.reason = undefined; }\n } else if ((delegated || sessionOnly) && installed?.unconstrained) {\n state!.strategy = \"installed\";\n }\n const beforeGrantEvent = checkDelivery();\n if (beforeGrantEvent.status !== \"allow\") throw deliveryError(beforeGrantEvent);\n reportGrantCap(state!, handle, installed);\n if (mintedExpiryMs !== undefined) state!.reportedExpired = false;\n if (mintedExpiryMs !== undefined && handle.replicaId) emit({ type: \"replication.grant\", replicaId: handle.replicaId, action: \"minted\", expiryMs: mintedExpiryMs });\n if (!installed?.unconstrained) {\n state!.reason = \"grant_missing\";\n state!.lastError = refusalCode ?? \"SESSION_LACKS_SYNC\";\n emit({ type: \"replication.state\", space: session.space, replica: prefix, state: \"grant_missing\", code: state!.lastError });\n } else emit({ type: \"replication.state\", space: session.space, replica: prefix, state: \"grant_installed\", strategy: state!.strategy });\n if (isClosed || purgeStarted) {\n await handle.close();\n throw Object.assign(new Error(\"Replication controller is closed\"), { code: \"REPLICA_CLOSED\" });\n }\n if (installed?.unconstrained) await maybeRenew(prefix, handle, installed, runtimePlan);\n if (mode === \"background\" && state!.reason !== \"grant_missing\") {\n void syncPrefix(prefix, \"start\").catch(() => undefined);\n schedule(prefix);\n }\n return handle;\n })();\n try { return await state.opening; } catch (error) {\n const code = errorCode(error);\n if (code === \"CONSENT_EXPIRED\") startConsentDenial();\n recordRevocation(prefix, error);\n if (code === \"REPLICA_GATED\" || code === \"CONSENT_EXPIRED\") state.reason = deliveryReason(code);\n else if (code !== \"GRANT_REVOKED\") state.reason = \"replica_unavailable\";\n state.lastError = code;\n state.failures = (state.failures ?? 0) + 1;\n if (code === \"RUNTIME_UNSUPPORTED\") state.unsupported = true;\n else if (code !== \"REPLICA_CLOSED\" && code !== \"REPLICATION_ROOT_UNSUPPORTED\" && code !== \"REPLICA_GATED\" && code !== \"CONSENT_EXPIRED\") state.retryAt = scheduler.now() + Math.min(300_000, 5_000 * 2 ** Math.min(state.failures - 1, 6));\n state.handle?.close().catch(() => undefined);\n state.handle = undefined;\n throw error;\n } finally { state.opening = undefined; }\n }\n\n function scheduleRenewal(prefix: string, handle: KVReplicaHandle, grant: ReplicaGrantInfo, plan: ReplicaDerivationPlan): void {\n const state = replicas.get(prefix);\n state?.renewalTimer?.();\n if (state) state.renewalTimer = undefined;\n if (!state || isClosed || purgeStarted || plan.path !== \"session\" || !authority.canRenew) return;\n const { installedAt, effectiveExpiresAt } = grant;\n const deadline = mintDeadline();\n if (\n typeof installedAt !== \"number\" || !Number.isFinite(installedAt) ||\n typeof effectiveExpiresAt !== \"number\" || !Number.isFinite(effectiveExpiresAt) ||\n !(effectiveExpiresAt > installedAt) || deadline === null\n ) return;\n const threshold = installedAt + (effectiveExpiresAt - installedAt) * (1 - RENEW_BELOW_FRACTION);\n const now = scheduler.now();\n if (!Number.isFinite(now) || !(threshold < deadline) || now > threshold) return;\n state.renewalTimer = scheduler.setTimeout(() => {\n state.renewalTimer = undefined;\n void maybeRenew(prefix, handle).catch(() => undefined);\n }, Math.max(0, Math.floor(threshold) + 1 - now));\n }\n\n async function maybeRenew(prefix: string, handle: KVReplicaHandle, knownGrant?: ReplicaGrantInfo, knownPlan?: ReplicaDerivationPlan): Promise<void> {\n const state = replicas.get(prefix);\n if (!state || state.handle !== handle || isClosed || purgeStarted || !authority.canRenew) return;\n if (state.renewing) return state.renewing;\n const decision = checkDelivery();\n if (decision.status !== \"allow\") return;\n const grant = knownGrant ?? await handle.grant();\n if (!grant?.unconstrained) return;\n const { installedAt, effectiveExpiresAt } = grant;\n const deadline = mintDeadline();\n if (\n typeof installedAt !== \"number\" || !Number.isFinite(installedAt) ||\n typeof effectiveExpiresAt !== \"number\" || !Number.isFinite(effectiveExpiresAt) ||\n deadline === null\n ) return;\n const now = scheduler.now();\n if (!needsSilentRenewal({ now, installedAt, effectiveExpiresAt, consentDeadline: deadline })) {\n if (knownPlan) scheduleRenewal(prefix, handle, grant, knownPlan);\n return;\n }\n let plan: ReplicaDerivationPlan | undefined = knownPlan;\n try {\n if (!plan) {\n const selected = authority.plan(prefix);\n if (\"refused\" in selected) {\n if (handle.replicaId) emit({ type: \"replication.grant\", replicaId: handle.replicaId, action: \"renewal_refused\", code: selected.refused });\n return;\n }\n plan = selected;\n }\n } catch {\n if (handle.replicaId) emit({ type: \"replication.grant\", replicaId: handle.replicaId, action: \"renewal_deferred\" });\n return;\n }\n if (plan?.path !== \"session\") {\n if (handle.replicaId && state.reportedRenewalUnqualifiedCid !== grant.cid) {\n state.reportedRenewalUnqualifiedCid = grant.cid;\n emit({ type: \"replication.grant\", replicaId: handle.replicaId, action: \"renewal_deferred\" });\n }\n return;\n }\n const expiryMs = mintRemainingMs({ now, grantTtlMs: grantPolicy.grantTtlMs, consentDeadline: deadline });\n if (!(expiryMs > 0)) return;\n state.renewalTimer?.();\n state.renewalTimer = undefined;\n const mintAbort = new AbortController();\n state.mintAbort = mintAbort;\n const job = Promise.resolve().then(async () => {\n const minted = await authority.mint(handle.deviceDid, prefix, mintAbort.signal, { expiryMs, renewalOnly: true });\n const beforeInstall = checkDelivery();\n if (beforeInstall.status !== \"allow\") throw deliveryError(beforeInstall);\n const installed = await handle.installGrant(minted.ucan);\n const beforeEvent = checkDelivery();\n if (beforeEvent.status !== \"allow\") throw deliveryError(beforeEvent);\n reportGrantCap(state, handle, installed);\n state.reportedExpired = false;\n if (state.reason === \"grant_expired\") state.reason = undefined;\n if (state.lastError === \"GRANT_EXPIRED\") state.lastError = undefined;\n if (handle.replicaId) emit({ type: \"replication.grant\", replicaId: handle.replicaId, action: \"renewed\", expiryMs });\n if (typeof installed.effectiveExpiresAt === \"number\" && installed.effectiveExpiresAt > effectiveExpiresAt) {\n scheduleRenewal(prefix, handle, installed, plan);\n }\n });\n state.renewing = job;\n try {\n await job;\n } catch (error) {\n const code = errorCode(error);\n if (code === \"CONSENT_EXPIRED\" || code === \"REPLICA_GATED\") throw error;\n if (!isClosed && handle.replicaId) {\n const refused = typeof error === \"object\" && error !== null && \"refused\" in error && typeof error.refused === \"string\" ? error.refused : null;\n emit({ type: \"replication.grant\", replicaId: handle.replicaId, action: refused ? \"renewal_refused\" : \"renewal_deferred\", code: refused ?? code });\n }\n } finally {\n state.renewing = undefined;\n if (state.mintAbort === mintAbort) state.mintAbort = undefined;\n }\n }\n\n function schedule(prefix: string): void {\n const state = replicas.get(prefix);\n if (!state || mode !== \"background\" || isClosed || purgeStarted) return;\n state.timer = scheduler.setTimeout(() => {\n state.timer = undefined;\n void syncPrefix(prefix, \"interval\").catch(() => undefined).finally(() => schedule(prefix));\n }, options.syncIntervalMs);\n }\n\n async function syncPrefix(prefix: string, trigger: \"start\" | \"interval\" | \"stale_read\" | \"manual\", signal?: AbortSignal, context?: SyncContext): Promise<LocalSyncResult> {\n if (prefix === \"/\" && deps.nodeFeatures !== undefined && !deps.nodeFeatures.includes(\"kv-sync-root\")) {\n throw unsupportedRoot(prefix);\n }\n const initialRefusal = sessionRefusal(prefix);\n if (initialRefusal) throw Object.assign(new Error(\"Current session does not cover replica sync\"), { code: initialRefusal });\n const handle = await open(prefix);\n const state = replicas.get(prefix)!;\n if (state.sync) return state.sync;\n const abort = new AbortController();\n const syncContext = context ?? {};\n state.syncContext = syncContext;\n state.abort = abort;\n const abortFromCaller = () => {\n syncContext.abortCause ??= \"caller\";\n abort.abort(signal?.reason);\n };\n signal?.addEventListener(\"abort\", abortFromCaller, { once: true });\n const started = scheduler.now();\n let job!: Promise<LocalSyncResult>;\n job = (async () => {\n try {\n const syncStartEpoch = (await pending.read()).committedEpoch;\n const beforeSync = checkDelivery();\n if (beforeSync.status !== \"allow\") throw deliveryError(beforeSync);\n await maybeRenew(prefix, handle);\n const afterRenewal = checkDelivery();\n if (afterRenewal.status !== \"allow\") throw deliveryError(afterRenewal);\n const refusal = sessionRefusal(prefix);\n if (refusal) throw Object.assign(new Error(\"Current session does not cover replica sync\"), { code: refusal });\n const result = await handle.sync({ signal: abort.signal, syncStartEpoch });\n const afterSyncDelivery = checkDelivery();\n if (afterSyncDelivery.status !== \"allow\") throw deliveryError(afterSyncDelivery);\n if (result.status === \"busy\") {\n emit({ type: \"replication.sync\", space: session.space, replica: prefix, trigger, outcome: \"busy\", durationMs: scheduler.now() - started, lagMs: null });\n return result;\n }\n inProcessProof.add(prefix);\n const snapshot = await pending.read();\n const beforePending = checkDelivery();\n if (beforePending.status !== \"allow\") throw deliveryError(beforePending);\n const clearedCandidates = snapshot.records.some((r) => r.state === \"committed\" && r.epoch !== null && r.epoch <= syncStartEpoch && kvPrefixCovers(prefix, r.key));\n const cleared = clearedCandidates ? await pending.update((s) => afterSync(s, prefix, syncStartEpoch)) : 0;\n const beforeResult = checkDelivery();\n if (beforeResult.status !== \"allow\") throw deliveryError(beforeResult);\n emit({ type: \"replication.sync\", space: session.space, replica: prefix, trigger, outcome: \"ok\", durationMs: scheduler.now() - started, lagMs: null, pendingCleared: cleared, pages: result.pages, changes: result.changes, deleted: result.deleted, fetched: result.fetched, contentMissing: result.contentMissing, coverage: result.coverage });\n return result;\n } catch (error) {\n const code = errorCode(error); state.lastError = code; recordRevocation(prefix, error);\n if (code === \"CONSENT_EXPIRED\") startConsentDenial();\n emit({ type: \"replication.sync\", space: session.space, replica: prefix, trigger, outcome: abort.signal.aborted ? \"aborted\" : \"error\", class: code === \"CONSENT_EXPIRED\" || code === \"REPLICA_GATED\" ? \"lifecycle\" : code === \"NETWORK_ERROR\" || code === \"TIMEOUT\" ? \"offline\" : \"node\", code, durationMs: scheduler.now() - started, lagMs: null });\n throw error;\n } finally { signal?.removeEventListener(\"abort\", abortFromCaller); state.abort = undefined; }\n })();\n state.sync = job;\n try { return await job; } finally {\n if (state.sync === job) {\n state.sync = undefined;\n state.syncContext = undefined;\n }\n }\n }\n type DrainedSync = { settled: false } | { settled: true; result: LocalSyncResult } | { settled: true; error: unknown };\n async function drainForegroundSync(prefix: string, sync: Promise<LocalSyncResult>): Promise<DrainedSync> {\n let cancel = () => {};\n const settled: Promise<DrainedSync> = sync.then(\n (result) => ({ settled: true, result }),\n (error: unknown) => ({ settled: true, error }),\n );\n const timeout = new Promise<DrainedSync>((resolve) => {\n cancel = scheduler.setTimeout(() => resolve({ settled: false }), CLOSE_TIMEOUT_MS);\n });\n try {\n const drained = await Promise.race([settled, timeout]);\n if (!drained.settled) emit({ type: \"replication.sync\", space: session.space, replica: prefix, trigger: \"stale_read\", outcome: \"aborted\", code: \"DRAIN_TIMEOUT\", durationMs: CLOSE_TIMEOUT_MS, lagMs: null });\n return drained;\n } finally { cancel(); }\n }\n function validateReadMeta(meta: LocalReadMeta): void {\n if (meta.coverage !== \"complete\") throw Object.assign(new Error(\"Replica coverage changed before the local read\"), { code: \"COVERAGE_INCOMPLETE\" });\n if (meta.authority !== \"valid\") {\n const code = meta.authority === \"expired\" ? \"GRANT_EXPIRED\" : meta.authority === \"revoked\" ? \"GRANT_REVOKED\" : \"GRANT_NOT_YET_VALID\";\n throw Object.assign(new Error(\"Replica authority changed before the local read\"), { code });\n }\n }\n function reasonForReadMetaCode(code: string): ReplicationReason {\n if (code === \"COVERAGE_INCOMPLETE\") return \"coverage_incomplete\";\n if (code === \"GRANT_EXPIRED\") return \"grant_expired\";\n if (code === \"GRANT_REVOKED\") return \"grant_revoked\";\n if (code === \"GRANT_NOT_YET_VALID\") return \"grant_not_yet_valid\";\n return \"replica_error\";\n }\n async function statusAfterDrain(handle: KVReplicaHandle, signal: AbortSignal): Promise<LocalReplicaStatus> {\n let cancel = () => {};\n const timeout = new Promise<never>((_resolve, reject) => {\n cancel = scheduler.setTimeout(\n () => reject(Object.assign(new Error(\"Replica status refresh timed out\"), { code: \"STATUS_TIMEOUT\" })),\n STATUS_REFRESH_TIMEOUT_MS,\n );\n });\n try {\n return await raceSignal(Promise.race([handle.status(), timeout]), signal);\n } finally { cancel(); }\n }\n function staleSyncOutcome(outcome: { result: LocalSyncResult } | { error: unknown }, timedOut: boolean, currentStatus: LocalReplicaStatus): { status: LocalReplicaStatus; syncError?: string; syncedBeforeRead: boolean; failure?: \"busy\" | \"error\" } {\n if (\"error\" in outcome) {\n const code = errorCode(outcome.error);\n if (code === \"NETWORK_ERROR\" || (timedOut && (code === \"ABORTED\" || code === \"TIMEOUT\"))) return { status: currentStatus, syncedBeforeRead: false, syncError: code === \"NETWORK_ERROR\" ? code : \"TIMEOUT\" };\n return { status: currentStatus, syncedBeforeRead: false, syncError: code, failure: \"error\" };\n }\n if (outcome.result.status === \"busy\") return { status: currentStatus, syncedBeforeRead: false, failure: \"busy\" };\n return { status: currentStatus, syncedBeforeRead: true };\n }\n async function freshness(prefix: string, handle: KVReplicaHandle, signal: AbortSignal): Promise<{ status: LocalReplicaStatus; syncError?: string; syncedBeforeRead: boolean; failure?: \"busy\" | \"error\" }> {\n let currentStatus = await handle.status();\n const syncedAt = currentStatus.lastSyncAt === null ? null : Date.parse(currentStatus.lastSyncAt);\n const stale = syncedAt === null || !Number.isFinite(syncedAt) || scheduler.now() - syncedAt > options.maxStalenessMs;\n let snapshot;\n try { snapshot = await pending.read(); } catch (error) { return { status: currentStatus, syncedBeforeRead: false, syncError: errorCode(error), failure: \"error\" }; }\n const behind = currentStatus.syncedThroughEpoch < snapshot.committedEpoch;\n const unproven = !pending.durable && !inProcessProof.has(prefix);\n if ((stale || behind || unproven) && !signal.aborted) {\n const syncController = mode === \"foreground\" ? new AbortController() : undefined;\n const syncState = replicas.get(prefix);\n const ownsSync = !syncState?.sync;\n const syncContext = syncState?.syncContext ?? {};\n const abortFromCaller = () => {\n if (ownsSync) syncContext.abortCause ??= \"caller\";\n syncController?.abort(signal.reason);\n };\n if (syncController) signal.addEventListener(\"abort\", abortFromCaller, { once: true });\n let cancelTimeout = () => {};\n const timeout = new Promise<{ timeout: true }>((resolve) => {\n cancelTimeout = scheduler.setTimeout(() => resolve({ timeout: true }), options.staleSyncTimeoutMs);\n });\n let cancelAbort = () => {};\n const callerAbort = new Promise<{ callerAborted: true }>((resolve) => {\n if (signal.aborted) resolve({ callerAborted: true });\n else {\n const listener = () => resolve({ callerAborted: true });\n signal.addEventListener(\"abort\", listener, { once: true });\n cancelAbort = () => signal.removeEventListener(\"abort\", listener);\n }\n });\n const sync = syncPrefix(prefix, \"stale_read\", syncController?.signal, syncContext);\n const outcome = await Promise.race([\n sync.then((result) => ({ result }), (error: unknown) => ({ error })),\n timeout,\n callerAbort,\n ]);\n cancelTimeout();\n cancelAbort();\n signal.removeEventListener(\"abort\", abortFromCaller);\n if (\"callerAborted\" in outcome) {\n if (syncController && ownsSync) {\n syncContext.abortCause ??= \"caller\";\n syncController.abort(signal.reason);\n await drainForegroundSync(prefix, sync);\n }\n return { status: currentStatus, syncedBeforeRead: false, syncError: cancellationCode(signal) };\n }\n if (\"timeout\" in outcome) {\n if (ownsSync) {\n syncContext.abortCause ??= \"timeout\";\n syncController?.abort(Object.assign(new Error(\"Stale-read sync timed out\"), { code: \"TIMEOUT\" }));\n }\n const drained = syncController ? await drainForegroundSync(prefix, sync) : undefined;\n if (signal.aborted) return { status: currentStatus, syncedBeforeRead: false, syncError: cancellationCode(signal) };\n if (drained && !drained.settled) return { status: currentStatus, syncedBeforeRead: false, syncError: \"DRAIN_TIMEOUT\", failure: \"error\" };\n try { currentStatus = await statusAfterDrain(handle, signal); }\n catch (error) {\n if (signal.aborted) return { status: currentStatus, syncedBeforeRead: false, syncError: cancellationCode(signal), failure: \"error\" };\n return { status: currentStatus, syncedBeforeRead: false, syncError: errorCode(error), failure: \"error\" };\n }\n const timeoutAbort = syncContext.abortCause === \"timeout\";\n return staleSyncOutcome(\n drained?.settled ? (\"result\" in drained ? { result: drained.result } : { error: drained.error }) : { error: Object.assign(new Error(\"Stale-read sync timed out\"), { code: \"TIMEOUT\" }) },\n timeoutAbort || !syncController,\n currentStatus,\n );\n }\n if (\"error\" in outcome) return staleSyncOutcome({ error: outcome.error }, false, currentStatus);\n if (outcome.result.status === \"busy\") return { status: currentStatus, syncedBeforeRead: false, failure: \"busy\" };\n currentStatus = await handle.status();\n return { status: currentStatus, syncedBeforeRead: true };\n }\n return { status: currentStatus, syncedBeforeRead: false };\n }\n\n function readEvent(op: \"get\" | \"list\", path: string, prefix: string | null, source: \"replica\" | \"network\" | \"none\", reason: ReplicationReason, outcome: \"found\" | \"not_found\" | \"error\", started: number, extra: Partial<Extract<ReplicationEvent, { type: \"replication.read\" }>> = {}): void {\n if (prefix !== null && reason === \"grant_expired\" && extra.code !== \"CONSENT_EXPIRED\") reportGrantExpiry(prefix);\n emit({ type: \"replication.read\", op, space: session.space, key: path, replica: prefix, source, reason, outcome, latencyMs: scheduler.now() - started, stalenessMs: null, coverage: null, authority: null, ...extra });\n }\n async function networkRead<T>(\n network: () => Promise<Result<T>>, op: \"get\" | \"list\", path: string, prefix: string | null,\n reason: ReplicationReason, started: number,\n extra: Partial<Extract<ReplicationEvent, { type: \"replication.read\" }>> = {},\n ): Promise<Result<T>> {\n let outcome: \"found\" | \"not_found\" | \"error\" = \"error\";\n try {\n const result = await network();\n outcome = result.ok ? \"found\" : op === \"get\" && (reason === \"pending_write\" || reason === \"not_covered\") && result.error.code === ErrorCodes.KV_NOT_FOUND ? \"not_found\" : \"error\";\n return result;\n } finally {\n readEvent(op, path, prefix, \"network\", reason, outcome, started, extra);\n }\n }\n async function verifyGet<T>(\n r: { space: string; path: string; signal: AbortSignal; network: () => Promise<Result<KVResponse<T>>> },\n local: Result<KVResponse<T>>,\n reason: ReplicationReason,\n started: number,\n extra: Partial<Extract<ReplicationEvent, { type: \"replication.read\" }>>,\n ): Promise<Result<KVResponse<T>>> {\n const prefix = configuredPrefix(r.path) ?? null;\n const localFound = local.ok;\n const localNotFound = !local.ok && local.error.code === ErrorCodes.KV_NOT_FOUND;\n const outcome = localFound ? \"found\" : localNotFound ? \"not_found\" : \"error\";\n try {\n const network = await raceSignal(r.network(), r.signal);\n if (r.signal.aborted) {\n readEvent(\"get\", r.path, prefix, \"none\", \"aborted\", \"error\", started, { ...extra, verify: \"aborted\" });\n return abortedResult(r.signal);\n }\n const delivery = checkDelivery();\n if (delivery.status !== \"allow\") {\n readEvent(\"get\", r.path, prefix, \"network\", delivery.status === \"consent_expired\" ? \"grant_expired\" : \"replica_gated\", network.ok ? \"found\" : \"error\", started, { code: delivery.status === \"consent_expired\" ? delivery.code : \"REPLICA_GATED\" });\n return network;\n }\n const refusal = prefix === null ? undefined : sessionRefusal(prefix);\n if (refusal) {\n readEvent(\"get\", r.path, prefix, \"network\", \"grant_missing\", network.ok ? \"found\" : \"error\", started, { code: refusal });\n return network;\n }\n if (!network.ok && network.error.code !== ErrorCodes.KV_NOT_FOUND) {\n readEvent(\"get\", r.path, prefix, \"replica\", reason, outcome, started, { ...extra, code: network.error.code, verify: \"error\" });\n return local;\n }\n const networkFound = network.ok;\n const networkNotFound = !network.ok && network.error.code === ErrorCodes.KV_NOT_FOUND;\n const localEtag = local.ok ? local.data.headers.etag ?? null : null;\n const networkEtag = network.ok ? network.data.headers.etag ?? null : null;\n const matches = localFound && networkFound ? localEtag === networkEtag : localNotFound && networkNotFound;\n const verify = matches ? \"match\" : \"diverged\";\n if (!matches) {\n emit({\n type: \"replication.divergence\",\n op: \"get\",\n space: r.space,\n key: r.path,\n replica: prefix ?? \"\",\n kind: localFound && networkFound ? \"value\" : localNotFound ? \"missing_local\" : \"extra_local\",\n localEtag,\n networkEtag,\n stalenessMs: typeof extra.stalenessMs === \"number\" ? extra.stalenessMs : null,\n });\n }\n readEvent(\"get\", r.path, prefix, \"replica\", reason, outcome, started, { ...extra, verify });\n return local;\n } catch (error) {\n if (r.signal.aborted) {\n readEvent(\"get\", r.path, prefix, \"none\", \"aborted\", \"error\", started, { ...extra, verify: \"aborted\" });\n return abortedResult(r.signal);\n }\n const delivery = checkDelivery();\n if (delivery.status !== \"allow\") {\n readEvent(\"get\", r.path, prefix, \"network\", delivery.status === \"consent_expired\" ? \"grant_expired\" : \"replica_gated\", \"error\", started, { code: delivery.status === \"consent_expired\" ? delivery.code : \"REPLICA_GATED\" });\n return err(wrapError(\"kv\", error));\n }\n const refusal = prefix === null ? undefined : sessionRefusal(prefix);\n if (refusal) {\n readEvent(\"get\", r.path, prefix, \"network\", \"grant_missing\", \"error\", started, { code: refusal });\n return err(wrapError(\"kv\", error));\n }\n readEvent(\"get\", r.path, prefix, \"replica\", reason, outcome, started, { ...extra, code: errorCode(error), verify: \"error\" });\n return local;\n }\n }\n async function verifyList(\n r: { space: string; listPath: string; signal: AbortSignal; network: () => Promise<Result<KVListPage>> },\n local: KVListPage,\n started: number,\n extra: Partial<Extract<ReplicationEvent, { type: \"replication.read\" }>>,\n ): Promise<Result<KVListPage>> {\n const prefix = listPathCovered(options.prefixes, r.listPath) ?? null;\n try {\n const network = await raceSignal(r.network(), r.signal);\n if (r.signal.aborted) {\n readEvent(\"list\", r.listPath, prefix, \"none\", \"aborted\", \"error\", started, { ...extra, verify: \"aborted\" });\n return abortedResult(r.signal);\n }\n const delivery = checkDelivery();\n if (delivery.status !== \"allow\") {\n readEvent(\"list\", r.listPath, prefix, \"network\", delivery.status === \"consent_expired\" ? \"grant_expired\" : \"replica_gated\", network.ok ? \"found\" : \"error\", started, { code: delivery.status === \"consent_expired\" ? delivery.code : \"REPLICA_GATED\" });\n return network;\n }\n const refusal = prefix === null ? undefined : sessionRefusal(prefix);\n if (refusal) {\n readEvent(\"list\", r.listPath, prefix, \"network\", \"grant_missing\", network.ok ? \"found\" : \"error\", started, { code: refusal });\n return network;\n }\n if (!network.ok) {\n readEvent(\"list\", r.listPath, prefix, \"replica\", \"hit\", \"found\", started, { ...extra, code: network.error.code, verify: \"error\" });\n return ok(local);\n }\n const localSet = new Set(local.keys);\n const networkSet = new Set(network.data.keys);\n const localOnly = local.keys.filter((key) => !networkSet.has(key));\n const networkOnly = network.data.keys.filter((key) => !localSet.has(key));\n const sameKeys = localOnly.length === 0 && networkOnly.length === 0;\n const sameOrder = sameKeys && local.keys.every((key, index) => key === network.data.keys[index]);\n const verify = sameOrder ? \"match\" : \"diverged\";\n if (!sameKeys || !sameOrder) {\n emit({\n type: \"replication.divergence\",\n op: \"list\",\n space: r.space,\n key: r.listPath,\n replica: prefix ?? \"\",\n kind: sameKeys ? \"order\" : \"keys\",\n ...(!sameKeys ? { localOnly, networkOnly } : {}),\n stalenessMs: typeof extra.stalenessMs === \"number\" ? extra.stalenessMs : null,\n });\n }\n readEvent(\"list\", r.listPath, prefix, \"replica\", \"hit\", \"found\", started, { ...extra, verify });\n return ok(local);\n } catch (error) {\n if (r.signal.aborted) {\n readEvent(\"list\", r.listPath, prefix, \"none\", \"aborted\", \"error\", started, { ...extra, verify: \"aborted\" });\n return abortedResult(r.signal);\n }\n const delivery = checkDelivery();\n if (delivery.status !== \"allow\") {\n readEvent(\"list\", r.listPath, prefix, \"network\", delivery.status === \"consent_expired\" ? \"grant_expired\" : \"replica_gated\", \"error\", started, { code: delivery.status === \"consent_expired\" ? delivery.code : \"REPLICA_GATED\" });\n return err(wrapError(\"kv\", error));\n }\n const refusal = prefix === null ? undefined : sessionRefusal(prefix);\n if (refusal) {\n readEvent(\"list\", r.listPath, prefix, \"network\", \"grant_missing\", \"error\", started, { code: refusal });\n return err(wrapError(\"kv\", error));\n }\n readEvent(\"list\", r.listPath, prefix, \"replica\", \"hit\", \"found\", started, { ...extra, code: errorCode(error), verify: \"error\" });\n return ok(local);\n }\n }\n async function reportExistingPins(): Promise<void> {\n if (pinnedStateReported) return;\n pinnedStateReported = true;\n try {\n const records = await pending.read();\n const pins = pinnedKeys(records, \"\", scheduler.now());\n if (pins.length > 0) emit({ type: \"replication.state\", space: session.space, state: \"pinned\", count: pins.length, keys: pins.map((pin) => pin.key) });\n } catch { emit({ type: \"replication.state\", space: session.space, state: \"pending_store_error\", code: \"STORAGE_ERROR\" }); }\n }\n\n async function get<T>(r: { space: string; key: string; path: string; options: KVGetOptions | undefined; signal: AbortSignal; network: () => Promise<Result<KVResponse<T>>> }): Promise<Result<KVResponse<T>>> {\n const started = scheduler.now();\n const prefix = configuredPrefix(r.path);\n if (r.options?.source === \"network\") {\n let outcome: \"found\" | \"not_found\" | \"error\" = \"error\";\n try {\n const value = await r.network();\n outcome = value.ok ? \"found\" : value.error.code === ErrorCodes.KV_NOT_FOUND ? \"not_found\" : \"error\";\n return value;\n } finally {\n observeNetworkRequested({ op: \"get\", space: r.space, path: r.path, reason: \"NETWORK_REQUESTED\", outcome, latencyMs: scheduler.now() - started });\n }\n }\n let networkRejected = false;\n const fallback = async (\n replica: string, reason: ReplicationReason,\n extra: Partial<Extract<ReplicationEvent, { type: \"replication.read\" }>> = {},\n ) => {\n try { return await networkRead(r.network, \"get\", r.path, replica, reason, started, extra); }\n catch (error) { networkRejected = true; throw error; }\n };\n if (prefix === undefined) return networkRead(r.network, \"get\", r.path, null, \"not_covered\", started);\n const delivery = checkDelivery();\n if (delivery.status !== \"allow\") {\n return fallback(prefix, delivery.status === \"consent_expired\" ? \"grant_expired\" : \"replica_gated\",\n { code: delivery.status === \"consent_expired\" ? delivery.code : \"REPLICA_GATED\" });\n }\n const refusal = sessionRefusal(prefix);\n if (refusal) return fallback(prefix, \"grant_missing\", { code: refusal });\n try { await raceSignal(reportExistingPins(), r.signal); } catch { if (r.signal.aborted) return abortedResult(r.signal); }\n let handle: KVReplicaHandle;\n try { handle = await raceSignal(open(prefix), r.signal); }\n catch (error) {\n if (r.signal.aborted) return abortedResult(r.signal);\n if (errorCode(error) === \"CONSENT_EXPIRED\") startConsentDenial();\n const code = errorCode(error);\n return fallback(prefix, code === \"RUNTIME_UNSUPPORTED\" ? \"runtime_unsupported\" : code === \"CONSENT_EXPIRED\" || code === \"REPLICA_GATED\" || code === \"GRANT_EXPIRED\" ? deliveryReason(code) : \"replica_unavailable\", { code });\n }\n if (replicas.get(prefix)?.reason === \"grant_missing\") {\n const code = replicas.get(prefix)?.lastError;\n return fallback(prefix, code === \"GRANT_EXPIRED\" ? \"grant_expired\" : code === \"REPLICA_GATED\" ? \"replica_gated\" : \"grant_missing\", { code });\n }\n\n let fresh: Awaited<ReturnType<typeof freshness>>;\n try { fresh = await freshness(prefix, handle, r.signal); }\n catch (error) {\n recordRevocation(prefix, error);\n if (errorCode(error) === \"CONSENT_EXPIRED\") startConsentDenial();\n if (r.signal.aborted) return abortedResult(r.signal);\n const code = errorCode(error);\n return fallback(prefix, code === \"CONSENT_EXPIRED\" || code === \"REPLICA_GATED\" || code === \"GRANT_EXPIRED\" ? deliveryReason(code) : \"replica_error\", { code });\n }\n if (r.signal.aborted) return abortedResult(r.signal);\n if (fresh.failure) {\n const code = fresh.failure === \"busy\" ? \"REPLICA_BUSY\" : fresh.syncError;\n return fallback(prefix, code === \"GRANT_REVOKED\" ? \"grant_revoked\" : code === \"REPLICA_GATED\" || code === \"CONSENT_EXPIRED\" || code === \"GRANT_EXPIRED\" ? deliveryReason(code) : \"stale\",\n { code, syncedBeforeRead: fresh.syncedBeforeRead });\n }\n let pendingState: PendingWriteState;\n try { pendingState = await raceSignal(pending.read(), r.signal); }\n catch (error) {\n if (r.signal.aborted) return abortedResult(r.signal);\n const code = errorCode(error);\n return fallback(prefix, code === \"REPLICA_GATED\" || code === \"CONSENT_EXPIRED\" || code === \"GRANT_EXPIRED\" ? deliveryReason(code) : \"replica_unavailable\", { code });\n }\n const record = pendingState.records.find((x) => x.key === r.path);\n if (record) return fallback(prefix, \"pending_write\", { pendingState: record.state, syncedBeforeRead: fresh.syncedBeforeRead });\n if (!pending.durable && !inProcessProof.has(prefix)) return fallback(prefix, \"REPLICA_UNPROVEN_SINCE_START\");\n if (fresh.status.syncedThroughEpoch < pendingState.committedEpoch) return fallback(prefix, \"REPLICA_BEHIND_OWN_WRITES\");\n if (fresh.status.authority.state !== \"valid\") return fallback(prefix, fresh.status.authority.state === \"expired\" ? \"grant_expired\" : fresh.status.authority.state === \"revoked\" ? \"grant_revoked\" : \"grant_not_yet_valid\");\n if (fresh.status.coverage !== \"complete\") return fallback(prefix, \"coverage_incomplete\");\n try {\n const local = await raceSignal(handle.get(r.path), r.signal);\n const delivery = checkDelivery();\n if (delivery.status !== \"allow\") throw deliveryError(delivery);\n const refusal = sessionRefusal(prefix);\n if (refusal) return await fallback(prefix, \"grant_missing\", { code: refusal });\n try { validateReadMeta(local.meta); }\n catch (error) {\n const code = errorCode(error);\n recordRevocation(prefix, error);\n return await fallback(prefix, reasonForReadMetaCode(code), { code });\n }\n if (local.status === \"coverage_incomplete\" || local.status === \"not_covered\" || local.status === \"content_missing\") return await fallback(prefix, local.status === \"content_missing\" ? \"content_missing\" : local.status === \"coverage_incomplete\" ? \"coverage_incomplete\" : \"not_covered\");\n if (local.status === \"present\" && r.options?.maxResponseBytes !== undefined && local.value.byteLength > r.options.maxResponseBytes) {\n return await fallback(prefix, \"unsupported_option\");\n }\n const result = localGet<T>(local as LocalGetResult, r.path, r.options ?? {});\n const reason = local.status === \"present\" ? \"hit\" : local.status;\n const syncedAt = fresh.status.lastSyncAt === null ? null : Date.parse(fresh.status.lastSyncAt);\n const event = {\n syncedBeforeRead: fresh.syncedBeforeRead,\n coverage: local.meta.coverage,\n authority: local.meta.authority,\n stalenessMs: syncedAt === null ? null : scheduler.now() - syncedAt,\n ...(fresh.syncError ? { syncError: fresh.syncError } : {}),\n };\n if (options.verify) return await verifyGet(r, result as Result<KVResponse<T>>, reason, started, event);\n readEvent(\"get\", r.path, prefix, \"replica\", reason, result.ok ? \"found\" : result.error.code === ErrorCodes.KV_NOT_FOUND ? \"not_found\" : \"error\", started, event);\n return result as LocalGetResponse<T>;\n } catch (error) {\n if (networkRejected) throw error;\n recordRevocation(prefix, error);\n if (errorCode(error) === \"CONSENT_EXPIRED\") startConsentDenial();\n if (r.signal.aborted) return abortedResult(r.signal);\n return fallback(prefix, deliveryReason(errorCode(error)), { code: errorCode(error) });\n }\n }\n\n async function list(r: { space: string; listPath: string; options: KVListOptions | undefined; signal: AbortSignal; network: () => Promise<Result<KVListPage>> }): Promise<Result<KVListPage>> {\n const started = scheduler.now();\n if (r.options?.source === \"network\") {\n let outcome: \"found\" | \"not_found\" | \"error\" = \"error\";\n try {\n const result = await r.network();\n outcome = result.ok ? \"found\" : \"error\";\n return result;\n } finally {\n observeNetworkRequested({ op: \"list\", space: r.space, path: r.listPath, reason: \"NETWORK_REQUESTED\", outcome, latencyMs: scheduler.now() - started });\n }\n }\n const cursor = r.options?.cursor;\n const decoded = cursor?.startsWith(\"tcr1.\") ? decodeTcr1(cursor) : null;\n if (cursor && cursor.startsWith(\"tcr1.\") && !decoded) { readEvent(\"list\", r.listPath, null, \"none\", \"cursor_restart\", \"error\", started); return cursorRestart(); }\n if (cursor && !cursor.startsWith(\"tcr1.\")) return networkRead(r.network, \"list\", r.listPath, null, \"network_cursor\", started);\n const prefix = listPathCovered(options.prefixes, r.listPath);\n let networkRejected = false;\n const fallback = async (\n replica: string, reason: ReplicationReason,\n extra: Partial<Extract<ReplicationEvent, { type: \"replication.read\" }>> = {},\n ) => {\n try { return await networkRead(r.network, \"list\", r.listPath, replica, reason, started, extra); }\n catch (error) { networkRejected = true; throw error; }\n };\n if (prefix !== undefined && !r.options?.raw) {\n const delivery = checkDelivery();\n if (delivery.status !== \"allow\") {\n if (decoded) { readEvent(\"list\", r.listPath, prefix, \"none\", \"cursor_restart\", \"error\", started); return cursorRestart(); }\n return fallback(prefix, delivery.status === \"consent_expired\" ? \"grant_expired\" : \"replica_gated\",\n { code: delivery.status === \"consent_expired\" ? delivery.code : \"REPLICA_GATED\" });\n }\n }\n if (prefix !== undefined && !r.options?.raw) {\n const refusal = sessionRefusal(prefix);\n if (refusal) {\n if (decoded) { readEvent(\"list\", r.listPath, prefix, \"none\", \"cursor_restart\", \"error\", started); return cursorRestart(); }\n return fallback(prefix, \"grant_missing\", { code: refusal });\n }\n }\n try { await raceSignal(reportExistingPins(), r.signal); } catch { if (r.signal.aborted) return abortedResult(r.signal); }\n const restart = () => { readEvent(\"list\", r.listPath, prefix ?? null, \"none\", \"cursor_restart\", \"error\", started); return cursorRestart(); };\n if (cursor && decoded && (decoded.space !== r.space || decoded.path !== r.listPath)) return restart();\n if (prefix === undefined || r.options?.raw) { if (cursor && decoded) return restart(); return networkRead(r.network, \"list\", r.listPath, prefix ?? null, prefix !== undefined ? \"unsupported_option\" : \"not_covered\", started); }\n let handle: KVReplicaHandle;\n try { handle = await raceSignal(open(prefix), r.signal); }\n catch (error) {\n if (r.signal.aborted) return abortedResult(r.signal);\n if (errorCode(error) === \"CONSENT_EXPIRED\") startConsentDenial();\n if (cursor && decoded) return restart();\n const code = errorCode(error);\n return fallback(prefix, code === \"RUNTIME_UNSUPPORTED\" ? \"runtime_unsupported\" : code === \"CONSENT_EXPIRED\" || code === \"REPLICA_GATED\" || code === \"GRANT_EXPIRED\" ? deliveryReason(code) : \"replica_unavailable\", { code });\n }\n if (replicas.get(prefix)?.reason === \"grant_missing\") {\n if (cursor && decoded) return restart();\n const code = replicas.get(prefix)?.lastError;\n return fallback(prefix, code === \"GRANT_EXPIRED\" ? \"grant_expired\" : code === \"REPLICA_GATED\" ? \"replica_gated\" : \"grant_missing\", { code });\n }\n let fresh: Awaited<ReturnType<typeof freshness>>;\n try { fresh = await freshness(prefix, handle, r.signal); }\n catch (error) {\n recordRevocation(prefix, error);\n if (errorCode(error) === \"CONSENT_EXPIRED\") startConsentDenial();\n if (r.signal.aborted) return abortedResult(r.signal);\n if (cursor && decoded) return restart();\n const code = errorCode(error);\n return fallback(prefix, code === \"CONSENT_EXPIRED\" || code === \"REPLICA_GATED\" || code === \"GRANT_EXPIRED\" ? deliveryReason(code) : \"replica_error\", { code });\n }\n if (r.signal.aborted) return abortedResult(r.signal);\n let state: PendingWriteState;\n try { state = await raceSignal(pending.read(), r.signal); }\n catch (error) {\n if (r.signal.aborted) return abortedResult(r.signal);\n if (cursor && decoded) return restart();\n const code = errorCode(error);\n return fallback(prefix, code === \"REPLICA_GATED\" || code === \"CONSENT_EXPIRED\" || code === \"GRANT_EXPIRED\" ? deliveryReason(code) : \"replica_unavailable\", { code });\n }\n const pendingRange = state.records.find((record) => listRangeCovers(r.listPath, record.key));\n const behind = fresh.status.syncedThroughEpoch < state.committedEpoch;\n if (cursor && decoded && (fresh.failure || pendingRange || behind || fresh.status.coverage !== \"complete\" || fresh.status.authority.state !== \"valid\" || (!pending.durable && !inProcessProof.has(prefix)))) return restart();\n if (behind) return fallback(prefix, \"REPLICA_BEHIND_OWN_WRITES\");\n if (fresh.failure) {\n const code = fresh.failure === \"busy\" ? \"REPLICA_BUSY\" : fresh.syncError;\n return fallback(prefix, code === \"GRANT_REVOKED\" ? \"grant_revoked\" : code === \"REPLICA_GATED\" || code === \"CONSENT_EXPIRED\" || code === \"GRANT_EXPIRED\" ? deliveryReason(code) : \"stale\", { code });\n }\n if (pendingRange) return fallback(prefix, \"pending_write\", { pendingState: pendingRange.state });\n if (!pending.durable && !inProcessProof.has(prefix)) return fallback(prefix, \"REPLICA_UNPROVEN_SINCE_START\");\n if (fresh.status.coverage !== \"complete\" || fresh.status.authority.state !== \"valid\") return fallback(prefix, fresh.status.coverage !== \"complete\" ? \"coverage_incomplete\" : fresh.status.authority.state === \"expired\" ? \"grant_expired\" : fresh.status.authority.state === \"revoked\" ? \"grant_revoked\" : \"grant_not_yet_valid\");\n try {\n const signalHandle = { list: (o: { prefix: string; after?: string; limit?: number }) => raceSignal(handle.list(o), r.signal) };\n const page = await raceSignal(localList(signalHandle, r.space, r.listPath, r.options?.limit, cursor, validateReadMeta), r.signal);\n const latest = await raceSignal(pending.read(), r.signal);\n const laterPending = latest.records.find((record) => listRangeCovers(r.listPath, record.key));\n if (cursor && decoded && (laterPending || fresh.status.syncedThroughEpoch < latest.committedEpoch)) return restart();\n if (fresh.status.syncedThroughEpoch < latest.committedEpoch) return await fallback(prefix, \"REPLICA_BEHIND_OWN_WRITES\");\n if (laterPending) return await fallback(prefix, \"pending_write\", { pendingState: laterPending.state });\n const delivery = checkDelivery();\n if (delivery.status !== \"allow\") throw deliveryError(delivery);\n const refusal = sessionRefusal(prefix);\n if (refusal) {\n if (decoded) return restart();\n return await fallback(prefix, \"grant_missing\", { code: refusal });\n }\n const event = {\n count: page.keys.length,\n syncedBeforeRead: fresh.syncedBeforeRead,\n stalenessMs: fresh.status.lastSyncAt === null ? null : scheduler.now() - Date.parse(fresh.status.lastSyncAt),\n ...(fresh.syncError ? { syncError: fresh.syncError } : {}),\n };\n if (options.verify && !cursor) return await verifyList(r, page, started, event);\n readEvent(\"list\", r.listPath, prefix, \"replica\", \"hit\", \"found\", started, event);\n return ok(page);\n } catch (error) {\n if (networkRejected) throw error;\n if (r.signal.aborted) return abortedResult(r.signal);\n const code = errorCode(error);\n if (code === \"CONSENT_EXPIRED\") startConsentDenial();\n recordRevocation(prefix, error);\n if (cursor && decoded) return restart();\n const reason = code === \"CONSENT_EXPIRED\" || code === \"REPLICA_GATED\" || code === \"GRANT_EXPIRED\" ? deliveryReason(code) : reasonForReadMetaCode(code);\n return fallback(prefix, reason, { code });\n }\n }\n\n async function write<T>(r: { op: \"put\" | \"delete\" | \"batchPut\"; space: string; entries: ReadonlyArray<{ path: string; body?: Blob | string }>; signal: AbortSignal; conditional?: boolean; network: () => Promise<Result<T>> }): Promise<Result<T>> {\n const covered = r.entries.flatMap((entry) => {\n const prefix = configuredPrefix(entry.path);\n return prefix !== undefined ? [{ key: entry.path, op: r.op === \"delete\" ? \"delete\" as const : \"put\" as const }] : [];\n });\n if (covered.length === 0) return r.network();\n if (checkDelivery().status !== \"allow\") return r.network();\n await reportExistingPins();\n if (checkDelivery().status !== \"allow\") return r.network();\n const opId = globalThis.crypto?.randomUUID?.() ?? `${scheduler.now()}-${Math.random()}`;\n try { await pending.update((s) => begin(s, opId, covered, nowDate(scheduler.now()))); }\n catch (error) {\n if (errorCode(error) === \"REPLICA_GATED\" || errorCode(error) === \"CONSENT_EXPIRED\" || checkDelivery().status !== \"allow\") return r.network();\n return err(serviceError(ErrorCodes.KV_WRITE_FAILED, \"Unable to persist pending KV write; request was not dispatched\", \"kv\", { cause: error instanceof Error ? error : undefined, meta: { replication: \"pending_store_unavailable\", requestDispatched: false } }));\n }\n const started = scheduler.now();\n let result: Result<T>;\n try { result = await r.network(); }\n catch (error) {\n const wrapped = wrapError(\"kv\", error);\n result = err({\n ...wrapped,\n meta: { ...wrapped.meta, requestMayHaveDispatched: true },\n });\n }\n const outcome = classifyWriteOutcome(r.op, result, { conditional: r.conditional === true });\n let settleError: unknown;\n try { await pending.update((s) => settle(s, opId, outcome, nowDate(scheduler.now()), result.ok ? undefined : result.error.code)); } catch (error) { settleError = error; }\n emit({ type: \"replication.write\", space: r.space, op: r.op, keys: covered.map((x) => x.key), outcome, ...(!result.ok ? { code: result.error.code } : {}), latencyMs: scheduler.now() - started });\n const state = await pending.read().catch(() => undefined);\n const pins = state ? pinnedKeys(state, \"\", scheduler.now()) : [];\n if (outcome === \"ambiguous\") emit({ type: \"replication.state\", space: r.space, state: \"pinned\", count: pins.length, keys: pins.map((p) => p.key) });\n if (settleError) emit({ type: \"replication.state\", space: r.space, state: \"pending_store_error\", code: \"STORAGE_ERROR\" });\n return result;\n }\n\n function observeNetworkRequested(r: { op: \"get\" | \"list\"; space: string; path: string; reason: \"NETWORK_REQUESTED\"; outcome: \"found\" | \"not_found\" | \"error\"; latencyMs: number }): void {\n emit({ type: \"replication.read\", op: r.op, space: r.space, key: r.path, replica: null, source: \"network\", reason: \"NETWORK_REQUESTED\", outcome: r.outcome, latencyMs: r.latencyMs, stalenessMs: null, coverage: null, authority: null });\n }\n\n async function inspectPersistedStatus(prefix: string): Promise<InspectedStatusResult> {\n if (!storage.inspectStatus || isClosed || purgeInProgress) return { missing: false };\n const sessionGrant = authority.sessionGrant(prefix);\n const device = \"refused\" in sessionGrant ? undefined : sessionGrant.device;\n const spec = { identity, space: session.space, prefix, allowSecrets: options.allowSecrets, ...(device ? { device } : {}), ...(deps.fetch ? { fetch: deps.fetch } : {}) };\n const abort = new AbortController();\n const job = Promise.resolve().then(() => storage.inspectStatus!(spec, { signal: abort.signal }));\n const settled = job.then(() => undefined, () => undefined);\n const inspection = { abort, settled };\n statusInspections.add(inspection);\n void settled.then(() => statusInspections.delete(inspection));\n let cancel = () => {};\n const timeout = new Promise<{ timedOut: true }>((resolve) => {\n cancel = scheduler.setTimeout(() => {\n abort.abort(Object.assign(new Error(\"Replica status inspection timed out\"), { code: \"STATUS_TIMEOUT\" }));\n resolve({ timedOut: true });\n }, STATUS_REFRESH_TIMEOUT_MS);\n });\n try {\n const result = await Promise.race([job.then((local) => ({ local })), timeout]);\n if (\"timedOut\" in result) return { missing: false, errorCode: \"STATUS_TIMEOUT\" };\n return { missing: result.local === undefined, ...(result.local ? { local: result.local } : {}) };\n } catch (error) {\n return { missing: false, errorCode: errorCode(error) };\n } finally { cancel(); }\n }\n\n function cancelStatusInspections(): Promise<void> {\n const active = [...statusInspections];\n for (const inspection of active) inspection.abort.abort(Object.assign(new Error(\"Replica status inspection cancelled\"), { code: \"ABORTED\" }));\n return Promise.all(active.map((inspection) => inspection.settled)).then(() => undefined);\n }\n\n function gatedStatus(decision: Exclude<ReplicaDeliveryDecision, { status: \"allow\" }>): ReplicaStatusEntry[] {\n return options.prefixes.map((prefix) => ({\n prefix,\n state: \"gated\",\n reason: \"replica_gated\",\n gate: decision.status === \"gated\" ? decision.gate : \"stamp_stale\",\n errorCode: decision.status === \"consent_expired\" ? decision.code : \"REPLICA_GATED\",\n pending: { inFlight: 0, committed: 0, ambiguous: 0 },\n pinned: [],\n lagMs: null,\n redacted: true,\n }));\n }\n\n async function status(): Promise<ReplicaStatusEntry[]> {\n const beforeStatus = checkDelivery();\n if (beforeStatus.status !== \"allow\") return gatedStatus(beforeStatus);\n let persistedSnapshot: PendingWriteState | null | undefined;\n try {\n persistedSnapshot = pending.readExisting ? await pending.readExisting() : await pending.read();\n } catch (error) {\n const delivery = checkDelivery();\n if (delivery.status !== \"allow\") return gatedStatus(delivery);\n throw error;\n }\n const afterPending = checkDelivery();\n if (afterPending.status !== \"allow\") return gatedStatus(afterPending);\n const snapshot = persistedSnapshot ?? emptyPendingState(identity);\n const entries = await Promise.all(options.prefixes.map(async (prefix): Promise<ReplicaStatusEntry | undefined> => {\n if (prefix === \"/\" && deps.nodeFeatures !== undefined && !deps.nodeFeatures.includes(\"kv-sync-root\")) {\n markRootUnsupported(prefix);\n }\n const records = snapshot.records.filter((r) => kvPrefixCovers(prefix, r.key));\n const opened = replicas.get(prefix);\n let local: LocalReplicaStatus | ReplicaInspectedStatus | undefined;\n if (opened?.handle) {\n try { local = await opened.handle.status(); }\n catch { /* A generation-fenced or unavailable handle has no live status. */ }\n }\n let inspected: InspectedStatusResult = { missing: false };\n if (!local && !opened?.opening && !opened?.authorityRevoked) inspected = await inspectPersistedStatus(prefix);\n local ??= inspected.local;\n if (inspected.missing && !opened?.reason && !opened?.authorityRevoked && !opened?.opening && !isClosed) return undefined;\n const full = local && !(\"redacted\" in local) ? local : undefined;\n const revoked = opened?.authorityRevoked === true || full?.authority.state === \"revoked\";\n const rootUnsupported = opened?.lastError === \"REPLICATION_ROOT_UNSUPPORTED\";\n const state = isClosed ? \"closed\" as const : revoked ? \"revoked\" as const : rootUnsupported || opened?.reason === \"grant_expired\" ? \"unavailable\" as const : opened?.reason === \"grant_missing\" ? \"grant_missing\" as const : full?.coverage === \"complete\" && full.authority.state === \"valid\" ? \"ready\" as const : opened?.reason || inspected.errorCode ? \"unavailable\" as const : \"idle\" as const;\n return {\n prefix,\n state,\n ...(opened?.reason ? { reason: opened.reason } : inspected.errorCode ? { reason: \"replica_unavailable\" as const } : {}),\n ...(inspected.errorCode ?? opened?.lastError ? { errorCode: inspected.errorCode ?? opened?.lastError } : {}),\n ...(local ?? {}),\n ...(revoked ? { authority: { state: \"revoked\" as const, expiresAt: full?.authority.expiresAt ?? null } } : {}),\n pending: {\n inFlight: records.filter((r) => r.state === \"in_flight\").length,\n committed: records.filter((r) => r.state === \"committed\").length,\n ambiguous: records.filter((r) => r.state === \"ambiguous\").length,\n },\n pinned: pinnedKeys(snapshot, prefix, scheduler.now()),\n lagMs: full?.lastSyncAt ? scheduler.now() - Date.parse(full.lastSyncAt) : null,\n };\n }));\n const beforeReturn = checkDelivery();\n if (beforeReturn.status !== \"allow\") return gatedStatus(beforeReturn);\n return entries.filter((entry): entry is ReplicaStatusEntry => entry !== undefined);\n }\n\n async function sync(o?: { prefix?: string; signal?: AbortSignal }): Promise<void> {\n const prefixes = o?.prefix !== undefined ? options.prefixes.filter((p) => p === o.prefix) : options.prefixes;\n await Promise.all(prefixes.map((prefix) => syncPrefix(prefix, \"manual\", o?.signal).then(() => undefined)));\n }\n\n async function clearPending(): Promise<number> {\n const count = await pending.update((s) => clearPendingRecords(s, scheduler.now()));\n emit({ type: \"replication.state\", space: session.space, state: \"pending_cleared\", count });\n return count;\n }\n\n function purge(o?: { timeoutMs?: number }): Promise<{ purged: string[]; failed: Array<{ prefix: string; code: string }> }> {\n purgeStarted = true;\n purgeInProgress = true;\n cancelConsentTimer?.();\n cancelConsentTimer = undefined;\n const hasStatusInspections = statusInspections.size > 0;\n const statusDrain = cancelStatusInspections();\n for (const state of replicas.values()) {\n state.timer?.();\n state.timer = undefined;\n state.renewalTimer?.();\n state.renewalTimer = undefined;\n state.syncContext && (state.syncContext.abortCause ??= \"purge\");\n state.abort?.abort();\n state.mintAbort?.abort();\n }\n return Promise.resolve().then(async () => {\n const report = { purged: [] as string[], failed: [] as Array<{ prefix: string; code: string }> };\n const timeoutMs = o?.timeoutMs ?? 5_000;\n const withTimeout = async <T>(job: Promise<T>): Promise<T> => {\n let cancel = () => {};\n const timeout = new Promise<never>((_, reject) => {\n cancel = scheduler.setTimeout(() => reject(Object.assign(new Error(\"Replication cleanup timed out\"), { code: \"TIMEOUT\" })), timeoutMs);\n });\n try { return await Promise.race([job, timeout]); }\n finally { cancel(); }\n };\n const drain = Promise.all([\n ...[...replicas.values()].flatMap((state) => [\n state.opening?.catch(() => undefined),\n state.sync?.catch(() => undefined),\n state.renewing?.catch(() => undefined),\n state.handle?.close().catch(() => undefined),\n ]),\n ...(hasStatusInspections ? [statusDrain] : []),\n ]);\n let drainCode: string | undefined;\n try { await withTimeout(drain); } catch (error) { drainCode = errorCode(error); }\n const jobs = options.prefixes.map(async (prefix) => {\n try {\n if (drainCode) throw Object.assign(new Error(\"Replica cleanup did not settle before purge\"), { code: drainCode });\n const grant = authority.sessionGrant(prefix);\n const sessionDeviceDid = replicas.get(prefix)?.handle?.deviceDid ?? (\"refused\" in grant ? undefined : grant.device.did);\n await withTimeout(storage.purge({ identity, space: session.space, prefix, ...(sessionDeviceDid ? { sessionDeviceDid } : {}) }));\n await pending.update((s) => clearPrefix(s, prefix));\n replicas.delete(prefix);\n inProcessProof.delete(prefix);\n report.purged.push(prefix);\n emit({ type: \"replication.state\", space: session.space, replica: prefix, state: \"purged\" });\n } catch (error) {\n const code = errorCode(error);\n report.failed.push({ prefix, code });\n emit({ type: \"replication.state\", space: session.space, replica: prefix, state: \"purge_failed\", code });\n }\n });\n await Promise.all(jobs);\n return report;\n }).finally(() => { purgeInProgress = false; });\n }\n\n async function close(): Promise<void> {\n if (isClosed) return;\n isClosed = true;\n cancelConsentTimer?.();\n cancelConsentTimer = undefined;\n const hasStatusInspections = statusInspections.size > 0;\n const statusDrain = cancelStatusInspections();\n for (const [prefix, state] of replicas) {\n state.timer?.();\n state.timer = undefined;\n state.renewalTimer?.();\n state.renewalTimer = undefined;\n state.mintAbort?.abort();\n state.syncContext && (state.syncContext.abortCause ??= \"close\");\n state.abort?.abort();\n emit({ type: \"replication.state\", space: session.space, replica: prefix, state: \"closed\" });\n }\n const drain = Promise.all([\n ...[...replicas.values()].map(async (state) => {\n await state.opening?.catch(() => undefined);\n await state.renewing?.catch(() => undefined);\n await state.sync?.catch(() => undefined);\n await state.handle?.close().catch(() => undefined);\n }),\n ...(hasStatusInspections ? [statusDrain] : []),\n ]);\n let cancel = () => {};\n let drained = false;\n void drain.then(\n () => { drained = true; cancel(); },\n () => { drained = true; cancel(); },\n );\n const timeout = new Promise<void>((resolve) => {\n queueMicrotask(() => {\n if (!drained) cancel = scheduler.setTimeout(resolve, CLOSE_TIMEOUT_MS);\n });\n });\n\n try { await Promise.race([drain, timeout]); }\n finally { cancel(); }\n }\n\n scheduleConsentDeadline();\n return { get, list, write, observeNetworkRequested, observeConsentExpired, status, sync, purge, clearPending, close };\n}\n\nfunction cancellationCode(signal: AbortSignal): string {\n return wrapError(\"kv\", signal.reason).code === ErrorCodes.TIMEOUT ||\n (typeof signal.reason === \"object\" && signal.reason !== null && \"code\" in signal.reason && signal.reason.code === ErrorCodes.TIMEOUT)\n ? ErrorCodes.TIMEOUT\n : ErrorCodes.ABORTED;\n}\n\nfunction abortedResult(signal: AbortSignal): Result<never> {\n const code = cancellationCode(signal);\n return err(serviceError(code, code === ErrorCodes.TIMEOUT ? \"KV request timed out\" : \"KV request was aborted\", \"kv\"));\n}\n","import { canonicalReplicationIdentity, replicationIdentityKey } from \"./identity\";\nimport { emptyPendingState } from \"./pendingWrites\";\nimport type { PendingWriteState, PendingWriteStore, ReplicationIdentity } from \"./types\";\n\nexport function createMemoryPendingStore(identity: ReplicationIdentity): PendingWriteStore {\n const canonical = canonicalReplicationIdentity(identity);\n const key = replicationIdentityKey(canonical);\n let state = emptyPendingState(canonical);\n let tail: Promise<void> = Promise.resolve();\n return {\n identity: canonical,\n durable: false,\n async read(): Promise<PendingWriteState> { return structuredClone(state); },\n async update<T>(mutate: (s: PendingWriteState) => T): Promise<T> {\n let resolve!: (value: T) => void;\n let reject!: (reason: unknown) => void;\n const result = new Promise<T>((res, rej) => { resolve = res; reject = rej; });\n const operation = tail.then(() => {\n try {\n if (replicationIdentityKey(state.identity) !== key) throw Object.assign(new Error(\"Pending-store identity mismatch\"), { code: \"STORAGE_ERROR\" });\n const next = structuredClone(state);\n const value = mutate(next);\n state = next;\n resolve(value);\n } catch (error) { reject(error); }\n });\n tail = operation.then(() => undefined, () => undefined);\n return result;\n },\n };\n}\n"],"mappings":"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","names":["delivery","sync","refusal","clearPending"]}