@moyodb/sdk 1.4.0 → 1.5.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 (36) hide show
  1. package/README.md +2 -2
  2. package/dist/assets/browser-worker-p7uX85l-.js +4 -0
  3. package/dist/assets/browser-worker-p7uX85l-.js.map +1 -0
  4. package/dist/assets/shared-worker-BALTqEUe.js +2 -0
  5. package/dist/assets/shared-worker-BALTqEUe.js.map +1 -0
  6. package/dist/chunks/{indexing-B0duqlUs.js → indexing-DdpU69Fd.js} +302 -69
  7. package/dist/chunks/{indexing-B0duqlUs.js.map → indexing-DdpU69Fd.js.map} +1 -1
  8. package/dist/codec.d.ts.map +1 -1
  9. package/dist/compression.d.ts.map +1 -1
  10. package/dist/engine/README.md +2 -2
  11. package/dist/engine/moyodb_engine.d.ts +2 -2
  12. package/dist/engine/moyodb_engine.js +22 -22
  13. package/dist/engine/moyodb_engine_bg.wasm +0 -0
  14. package/dist/engine/moyodb_engine_bg.wasm.d.ts +2 -2
  15. package/dist/engine/package.json +1 -1
  16. package/dist/engine/snippets/{moyodb-engine-1d53039816cbc2f7 → moyodb-engine-1f8134232168280b}/js/opfs_shim.js +8 -2
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/indexing.d.ts +7 -0
  19. package/dist/indexing.d.ts.map +1 -1
  20. package/dist/moyodb-sdk.js +1329 -931
  21. package/dist/moyodb-sdk.js.map +1 -1
  22. package/dist/node-engine.js +382 -47
  23. package/dist/node-engine.js.map +1 -1
  24. package/dist/node.js +332 -44
  25. package/dist/node.js.map +1 -1
  26. package/dist/registry.d.ts.map +1 -1
  27. package/dist/subscriptions.d.ts.map +1 -1
  28. package/dist/worker-client.d.ts.map +1 -1
  29. package/dist/worker-server.d.ts.map +1 -1
  30. package/dist/worker.d.ts +10 -3
  31. package/dist/worker.d.ts.map +1 -1
  32. package/package.json +2 -1
  33. package/dist/assets/browser-worker-Bj2ErRvC.js +0 -4
  34. package/dist/assets/browser-worker-Bj2ErRvC.js.map +0 -1
  35. package/dist/assets/shared-worker-CMeTcusa.js +0 -2
  36. package/dist/assets/shared-worker-CMeTcusa.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"node-engine.js","names":[],"sources":["../src/worker-server.ts","../src/snappy.ts","../src/compression.ts","../src/worker.ts"],"sourcesContent":["import type { AutocommitCommand, WorkerApi } from './worker-api';\nimport {\n MAX_WORKER_BATCH_BYTES,\n MAX_WORKER_BATCH_MESSAGES,\n WORKER_PROTOCOL_READY,\n WORKER_PROTOCOL_RESPONSE,\n WORKER_PROTOCOL_RESPONSE_BATCH,\n WORKER_PROTOCOL_VERSION,\n captureWorkerPayload,\n decodeWorkerCommandPayload,\n isAutocommitCommand,\n packedBatchOpsBytes,\n packedBinaryListBytes,\n prepareWorkerResponsePayload,\n isWorkerCommand,\n isWorkerProtocolEnvelope,\n isWorkerProtocolRequestBatchMessage,\n isWorkerProtocolRequestMessage,\n serializeWorkerError,\n workerProtocolError,\n type WorkerProtocolErrorMessage,\n type WorkerProtocolResponseMessage,\n type WorkerProtocolResponseBatchMessage,\n type WorkerProtocolSuccessMessage,\n type WorkerCommand\n} from './worker-protocol';\nimport { isRecord } from './internal';\n\ntype PackedWorkerApi = WorkerApi & {\n getManyPacked?: (txId: number, store: string, packedKeys: Uint8Array) => Promise<unknown>;\n putManyPacked?: (txId: number, store: string, packedEntries: Uint8Array, options?: unknown) => Promise<unknown>;\n deleteManyPacked?: (txId: number, store: string, packedKeys: Uint8Array) => Promise<unknown>;\n applyBatchPacked?: (txId: number, store: string, packedOps: Uint8Array) => Promise<unknown>;\n};\n\nexport interface WorkerServerHandle {\n close(): void;\n}\n\nexport interface WorkerServerScope {\n postMessage(message: unknown, transfer?: Transferable[]): void;\n addEventListener(type: 'message', listener: (event: MessageEvent<unknown>) => void): void;\n removeEventListener(type: 'message', listener: (event: MessageEvent<unknown>) => void): void;\n readonly location: { readonly origin: string };\n}\n\n/** The first argument identifies the transaction lane. */\nconst TRANSACTION_COMMANDS = new Set<WorkerCommand>([\n 'commit',\n 'rollback',\n 'createStore',\n 'dropStore',\n 'clearStore',\n 'get',\n 'getMany',\n 'has',\n 'put',\n 'putMany',\n 'delete',\n 'deleteMany',\n 'applyBatch',\n 'scan',\n 'getByIndex',\n 'scanByIndex',\n 'scanByIndexPage',\n 'getIndexes',\n 'reconcileIndexes',\n 'setSchemaVersion'\n]);\n\n/** These commands require exclusive access to the open engine. */\nconst EXCLUSIVE_COMMANDS = new Set<WorkerCommand>([\n 'open',\n 'close',\n 'destroy',\n 'importSnapshot',\n 'reset',\n 'compact',\n 'rebuild'\n]);\n\n/**\n * These commands do not use the open engine, so browser storage calls\n * can run without delaying its close.\n */\nconst UNSCHEDULED_COMMANDS = new Set<WorkerCommand>(['deleteDB', 'storageInfo', 'requestPersistence']);\n\nconst noop = () => {};\n\n/**\n * Serializes each transaction lane, including awaited work. Readwrite\n * autocommits share one writer lane. Exclusive commands wait for scheduled\n * work and block later scheduled work until they finish.\n */\nclass RequestScheduler {\n #lanes = new Map<number | string, Promise<void>>();\n #inFlight = new Set<Promise<void>>();\n #barrier: Promise<void> = Promise.resolve();\n #cursorLanes = new Map<number, number | string>();\n\n schedule<T>(command: WorkerCommand, args: unknown[], task: () => Promise<T>): Promise<T> {\n if (UNSCHEDULED_COMMANDS.has(command)) {\n return task();\n }\n if (EXCLUSIVE_COMMANDS.has(command)) {\n if (this.#cursorLanes.size === 0) return this.#runExclusive(task);\n return this.#runExclusive(async () => {\n const result = await task();\n this.#cursorLanes.clear();\n return result;\n });\n }\n if (\n command !== 'scanPage' &&\n command !== 'closeCursor' &&\n !((command === 'commit' || command === 'rollback') && this.#cursorLanes.size > 0)\n ) {\n return this.#runShared(laneFor(command, args), task);\n }\n const request = command === 'scanPage' && isRecord(args[0]) ? args[0] : null;\n const cursorId = request?.cursorId ?? (command === 'closeCursor' ? args[0] : undefined);\n const cursorLane = typeof cursorId === 'number' ? this.#cursorLanes.get(cursorId) : undefined;\n // Explicit cursors share their transaction lane. Implicit cursors own a separate read snapshot.\n const lane =\n cursorLane ??\n (request && typeof request.txId === 'number'\n ? request.txId\n : typeof cursorId === 'number'\n ? `cursor:${cursorId}`\n : laneFor(command, args));\n return this.#runShared(lane, async () => {\n try {\n const result = await task();\n if (request && isRecord(result)) {\n if (typeof cursorId === 'number') this.#cursorLanes.delete(cursorId);\n if (typeof result.cursorId === 'number') {\n this.#cursorLanes.set(result.cursorId, lane ?? `cursor:${result.cursorId}`);\n }\n }\n return result;\n } finally {\n if (command === 'closeCursor' && typeof cursorId === 'number') this.#cursorLanes.delete(cursorId);\n if (command === 'commit' || command === 'rollback') {\n for (const [cursor, ownerLane] of this.#cursorLanes) {\n if (ownerLane === args[0]) this.#cursorLanes.delete(cursor);\n }\n }\n }\n });\n }\n\n #runShared<T>(lane: number | string | null, task: () => Promise<T>): Promise<T> {\n const barrier = this.#barrier;\n const previous = lane === null ? undefined : this.#lanes.get(lane);\n const result = (async () => {\n await barrier;\n if (previous) {\n await previous;\n }\n return task();\n })();\n const settled = result.then(noop, noop);\n this.#inFlight.add(settled);\n if (lane !== null) {\n this.#lanes.set(lane, settled);\n }\n void settled.then(() => {\n this.#inFlight.delete(settled);\n if (lane !== null && this.#lanes.get(lane) === settled) {\n this.#lanes.delete(lane);\n }\n });\n return result;\n }\n\n #runExclusive<T>(task: () => Promise<T>): Promise<T> {\n const previousBarrier = this.#barrier;\n const pending = Array.from(this.#inFlight);\n const result = (async () => {\n await previousBarrier;\n await Promise.all(pending);\n return task();\n })();\n this.#barrier = result.then(noop, noop);\n return result;\n }\n}\n\nconst AUTOCOMMIT_WRITER_LANE = 'autocommit:readwrite';\n\nfunction laneFor(command: WorkerCommand, args: unknown[]): number | string | null {\n if (TRANSACTION_COMMANDS.has(command) && typeof args[0] === 'number') {\n return args[0];\n }\n if (command === 'autocommit' && args[0] === 'readwrite') {\n return AUTOCOMMIT_WRITER_LANE;\n }\n return null;\n}\n\ntype SendResponse = (response: WorkerProtocolResponseMessage, transfer?: Transferable[]) => void;\n\nclass ResponseQueue {\n private queued: Array<{ response: WorkerProtocolResponseMessage; transfer: Transferable[] }> = [];\n private queuedBytes = 0;\n private flushScheduled = false;\n private flushChannel: MessageChannel | null = null;\n private closed = false;\n\n constructor(private readonly scope: WorkerServerScope) {}\n\n enqueue: SendResponse = (response, transfer = []) => {\n if (this.closed) return;\n const captured = captureWorkerPayload(response, transfer);\n if (this.queued.length > 0 && this.queuedBytes + captured.byteLength > MAX_WORKER_BATCH_BYTES) {\n this.flush();\n }\n this.queued.push({ response: captured.value, transfer: captured.transfer });\n this.queuedBytes += captured.byteLength;\n if (!this.flushScheduled) {\n this.flushScheduled = true;\n queueMicrotask(() => {\n if (this.closed || this.queued.length === 0) {\n this.flushScheduled = false;\n return;\n }\n // A task boundary groups replies from successive transaction-lane\n // microtasks and releases ready replies while other requests remain pending.\n this.flushChannel ??= this.createFlushChannel();\n this.flushChannel.port2.postMessage(null);\n });\n }\n if (this.queued.length >= MAX_WORKER_BATCH_MESSAGES || this.queuedBytes >= MAX_WORKER_BATCH_BYTES) {\n this.flush();\n }\n };\n\n close(): void {\n this.closed = true;\n this.queued = [];\n this.queuedBytes = 0;\n this.flushChannel?.port1.close();\n this.flushChannel?.port2.close();\n this.flushChannel = null;\n }\n\n private createFlushChannel(): MessageChannel {\n const channel = new MessageChannel();\n channel.port1.addEventListener('message', () => {\n this.flushScheduled = false;\n this.flush();\n });\n channel.port1.start();\n return channel;\n }\n\n flush(): void {\n const queued = this.queued;\n this.queued = [];\n this.queuedBytes = 0;\n if (this.closed || queued.length === 0) return;\n const response: WorkerProtocolResponseMessage | WorkerProtocolResponseBatchMessage =\n queued.length === 1\n ? queued[0].response\n : {\n type: WORKER_PROTOCOL_RESPONSE_BATCH,\n version: WORKER_PROTOCOL_VERSION,\n responses: queued.map((entry) => entry.response)\n };\n const transfer: Transferable[] = [];\n for (const entry of queued) {\n for (const buffer of entry.transfer) transfer.push(buffer);\n }\n postWorkerResponse(this.scope, response, transfer);\n }\n}\n\nexport function exposeWorkerApi(api: WorkerApi, scope: WorkerServerScope = self): WorkerServerHandle {\n const scheduler = new RequestScheduler();\n const responses = new ResponseQueue(scope);\n const handleMessage = (event: MessageEvent<unknown>) => {\n if (event.origin !== '' && event.origin !== scope.location.origin) {\n return;\n }\n if (isWorkerProtocolRequestBatchMessage(event.data)) {\n let remaining = event.data.requests.length;\n const respond: SendResponse = (response, transfer) => {\n responses.enqueue(response, transfer);\n remaining -= 1;\n // Flush fully settled batches in this task. The fallback releases partial replies.\n if (remaining === 0) responses.flush();\n };\n for (const request of event.data.requests) {\n void dispatchWorkerRequest(scope, api, scheduler, request, respond);\n }\n return;\n }\n void dispatchWorkerRequest(scope, api, scheduler, event.data);\n };\n scope.addEventListener('message', handleMessage);\n scope.postMessage({\n type: WORKER_PROTOCOL_READY,\n version: WORKER_PROTOCOL_VERSION,\n batching: 1\n });\n return {\n close() {\n scope.removeEventListener('message', handleMessage);\n responses.close();\n }\n };\n}\n\nasync function dispatchWorkerRequest(\n scope: WorkerServerScope,\n api: WorkerApi,\n scheduler: RequestScheduler,\n data: unknown,\n respond: SendResponse = (response, transfer) => postWorkerResponse(scope, response, transfer)\n): Promise<void> {\n if (!isWorkerProtocolEnvelope(data)) {\n return;\n }\n const id = typeof data.id === 'number' && Number.isSafeInteger(data.id) ? data.id : 0;\n if (!isWorkerProtocolRequestMessage(data)) {\n respond(errorResponse(id, workerProtocolError('WorkerProtocolError', 'invalid worker protocol request')));\n return;\n }\n if (!isWorkerCommand(data.command)) {\n respond(\n errorResponse(\n data.id,\n workerProtocolError('WorkerProtocolError', `unsupported worker command: ${String(data.command)}`)\n )\n );\n return;\n }\n const command = data.command;\n const args = data.args as unknown[];\n try {\n let responseCommand: WorkerCommand = command;\n let invoke: () => Promise<unknown>;\n if (command === 'autocommit') {\n const [mode, inner, innerArgs] = args;\n if (\n (mode !== 'readonly' && mode !== 'readwrite') ||\n !isAutocommitCommand(inner) ||\n !Array.isArray(innerArgs)\n ) {\n throw workerProtocolError('WorkerProtocolError', 'invalid autocommit request');\n }\n assertImplemented(api, inner);\n responseCommand = inner;\n invoke = () => runAutocommit(api, mode, inner, innerArgs);\n } else {\n assertImplemented(api, command);\n invoke = () => invokeCommand(api, command, args);\n }\n const result = await scheduler.schedule(command, args, invoke);\n const responsePayload = prepareWorkerResponsePayload(responseCommand, result as never);\n respond(successResponse(data.id, responsePayload.result), responsePayload.transfer);\n } catch (error) {\n respond(errorResponse(data.id, error));\n }\n}\n\nfunction assertImplemented(api: WorkerApi, command: WorkerCommand): void {\n if (typeof (api[command] as unknown) !== 'function') {\n throw workerProtocolError('WorkerProtocolError', `worker command is not implemented: ${command}`);\n }\n}\n\nfunction invokeCommand(api: WorkerApi, command: WorkerCommand, args: unknown[]): Promise<unknown> {\n const packedResult = dispatchPackedCommand(api, command, args);\n if (packedResult !== null) {\n return packedResult;\n }\n return (api[command] as unknown as (...methodArgs: unknown[]) => Promise<unknown>).apply(\n api,\n decodeWorkerCommandPayload(command, args as never) as unknown[]\n );\n}\n\nasync function runAutocommit(\n api: WorkerApi,\n mode: 'readonly' | 'readwrite',\n command: AutocommitCommand,\n args: unknown[]\n): Promise<unknown> {\n const txId = await api.begin(mode);\n let result: unknown;\n try {\n result = await invokeCommand(api, command, [txId, ...args]);\n } catch (error) {\n try {\n await api.rollback(txId);\n } catch {}\n throw error;\n }\n if (mode === 'readwrite') {\n await api.commit(txId);\n } else {\n await api.rollback(txId);\n }\n return result;\n}\n\nfunction dispatchPackedCommand(api: WorkerApi, command: WorkerCommand, args: unknown[]): Promise<unknown> | null {\n const packedApi = api as PackedWorkerApi;\n if (command === 'getMany' || command === 'deleteMany') {\n const [txId, store, keys] = args;\n if (typeof txId !== 'number' || typeof store !== 'string') {\n return null;\n }\n const packedKeys = packedBinaryListBytes(keys);\n if (packedKeys === null) {\n return null;\n }\n if (command === 'getMany' && typeof packedApi.getManyPacked === 'function') {\n return packedApi.getManyPacked(txId, store, packedKeys);\n }\n if (command === 'deleteMany' && typeof packedApi.deleteManyPacked === 'function') {\n return packedApi.deleteManyPacked(txId, store, packedKeys);\n }\n return null;\n }\n\n if (command === 'putMany') {\n const [txId, store, entries, options] = args;\n if (typeof txId !== 'number' || typeof store !== 'string' || typeof packedApi.putManyPacked !== 'function') {\n return null;\n }\n const packedEntries = packedBinaryListBytes(entries);\n return packedEntries === null ? null : packedApi.putManyPacked(txId, store, packedEntries, options);\n }\n\n if (command === 'applyBatch') {\n const [txId, store, ops] = args;\n if (typeof txId !== 'number' || typeof store !== 'string' || typeof packedApi.applyBatchPacked !== 'function') {\n return null;\n }\n const packedOps = packedBatchOpsBytes(ops);\n return packedOps === null ? null : packedApi.applyBatchPacked(txId, store, packedOps);\n }\n\n return null;\n}\n\nfunction successResponse(id: number, result: unknown): WorkerProtocolSuccessMessage {\n return {\n type: WORKER_PROTOCOL_RESPONSE,\n version: WORKER_PROTOCOL_VERSION,\n id,\n ok: true,\n result\n };\n}\n\nfunction errorResponse(id: number, error: unknown): WorkerProtocolErrorMessage {\n return {\n type: WORKER_PROTOCOL_RESPONSE,\n version: WORKER_PROTOCOL_VERSION,\n id,\n ok: false,\n error: serializeWorkerError(error)\n };\n}\n\nfunction postWorkerResponse(\n scope: WorkerServerScope,\n response: WorkerProtocolResponseMessage | WorkerProtocolResponseBatchMessage,\n transfer: Transferable[] = []\n): void {\n if (transfer.length > 0) {\n try {\n scope.postMessage(response, transfer);\n return;\n } catch {}\n }\n scope.postMessage(response);\n}\n","const BLOCK_SIZE = 65536;\nconst HASH_BITS = 14;\nconst HASH_SIZE = 1 << HASH_BITS;\nconst MAX_LENGTH = 0xffff_ffff;\nconst MATCH_TABLE = new Uint32Array(HASH_SIZE);\n\nfunction corrupt(message: string): Error {\n const error = new Error(`invalid Snappy block: ${message}`);\n error.name = 'CorruptionError';\n return error;\n}\n\nfunction word(bytes: Uint8Array, offset: number): number {\n return (bytes[offset] | (bytes[offset + 1] << 8) | (bytes[offset + 2] << 16) | (bytes[offset + 3] << 24)) >>> 0;\n}\n\nfunction hash(value: number, bits: number): number {\n return Math.imul(value, 0x9e3779b1) >>> (32 - bits);\n}\n\nexport function encodeSnappy(input: Uint8Array): Uint8Array {\n if (input.byteLength > MAX_LENGTH) {\n throw new RangeError('Snappy input exceeds the 32-bit length limit');\n }\n const output = new Uint8Array(input.byteLength + Math.ceil(input.byteLength / 6) + 32);\n let written = 0;\n let remainingLength = input.byteLength;\n while (remainingLength >= 128) {\n output[written++] = (remainingLength & 0x7f) | 0x80;\n remainingLength = Math.floor(remainingLength / 128);\n }\n output[written++] = remainingLength;\n\n const literal = (start: number, end: number): void => {\n if (start === end) {\n return;\n }\n let length = end - start - 1;\n if (length < 60) {\n output[written++] = length << 2;\n } else {\n const lengthBytes = length <= 0xff ? 1 : length <= 0xffff ? 2 : length <= 0xffffff ? 3 : 4;\n output[written++] = (59 + lengthBytes) << 2;\n for (let index = 0; index < lengthBytes; index += 1) {\n output[written++] = length & 0xff;\n length >>>= 8;\n }\n }\n output.set(input.subarray(start, end), written);\n written += end - start;\n };\n const copy = (offset: number, length: number): void => {\n while (length > 0) {\n const count = Math.min(length, 64);\n if (count >= 4 && count <= 11 && offset < 2048) {\n output[written++] = 1 | ((count - 4) << 2) | ((offset >>> 8) << 5);\n output[written++] = offset & 0xff;\n } else {\n output[written++] = 2 | ((count - 1) << 2);\n output[written++] = offset & 0xff;\n output[written++] = offset >>> 8;\n }\n length -= count;\n }\n };\n\n let hashBits = 8;\n while (1 << hashBits < Math.min(input.byteLength, HASH_SIZE)) {\n hashBits += 1;\n }\n const tableSize = 1 << hashBits;\n // Encoding is synchronous. Calls can reuse this bounded scratch table.\n const table = MATCH_TABLE;\n for (let blockStart = 0; blockStart < input.byteLength; blockStart += BLOCK_SIZE) {\n const blockEnd = Math.min(blockStart + BLOCK_SIZE, input.byteLength);\n table.fill(0, 0, tableSize);\n let position = blockStart;\n let literalStart = blockStart;\n let misses = 0;\n while (position + 4 <= blockEnd) {\n const current = word(input, position);\n const slot = hash(current, hashBits);\n const previous = table[slot];\n table[slot] = position - blockStart + 1;\n const candidate = blockStart + previous - 1;\n if (previous === 0 || current !== word(input, candidate)) {\n misses += 1;\n position += 1 + Math.min(misses >>> 5, 64);\n continue;\n }\n literal(literalStart, position);\n const matchStart = position;\n position += 4;\n while (position < blockEnd && input[position] === input[candidate + position - matchStart]) {\n position += 1;\n }\n copy(matchStart - candidate, position - matchStart);\n literalStart = position;\n misses = 0;\n if (position + 4 <= blockEnd) {\n table[hash(word(input, position - 1), hashBits)] = position - blockStart;\n }\n }\n literal(literalStart, blockEnd);\n }\n return output.subarray(0, written);\n}\n\nexport function decodeSnappy(input: Uint8Array, maxOutputBytes: number, expectedOutputBytes?: number): Uint8Array {\n if (!Number.isSafeInteger(maxOutputBytes) || maxOutputBytes < 0 || maxOutputBytes > MAX_LENGTH) {\n throw new RangeError('invalid Snappy output limit');\n }\n let read = 0;\n let length = 0;\n for (let index = 0; ; index += 1) {\n if (read >= input.byteLength || index === 5) {\n throw corrupt('truncated or invalid length');\n }\n const byte = input[read++];\n if (index === 4 && byte > 0x0f) {\n throw corrupt('length exceeds 32 bits');\n }\n length += (byte & 0x7f) * 2 ** (index * 7);\n if (byte < 128) {\n break;\n }\n }\n if (length > maxOutputBytes) {\n throw corrupt(`output exceeds ${maxOutputBytes} byte limit`);\n }\n if (expectedOutputBytes !== undefined && length !== expectedOutputBytes) {\n throw corrupt(`length mismatch: expected ${expectedOutputBytes} bytes, got ${length}`);\n }\n const output = new Uint8Array(length);\n let written = 0;\n while (read < input.byteLength) {\n const tag = input[read++];\n const kind = tag & 3;\n if (kind === 0) {\n let count = tag >>> 2;\n if (count < 60) {\n count += 1;\n } else {\n const lengthBytes = count - 59;\n if (lengthBytes > input.byteLength - read) {\n throw corrupt('truncated literal length');\n }\n count = 1;\n for (let index = 0; index < lengthBytes; index += 1) {\n count += input[read++] * 2 ** (index * 8);\n }\n }\n if (count > input.byteLength - read || count > length - written) {\n throw corrupt('literal exceeds input or output');\n }\n output.set(input.subarray(read, read + count), written);\n read += count;\n written += count;\n continue;\n }\n const offsetBytes = kind === 1 ? 1 : kind === 2 ? 2 : 4;\n if (offsetBytes > input.byteLength - read) {\n throw corrupt('truncated copy offset');\n }\n const count = kind === 1 ? 4 + ((tag >>> 2) & 7) : 1 + (tag >>> 2);\n let offset = kind === 1 ? (tag & 0xe0) << 3 : 0;\n for (let index = 0; index < offsetBytes; index += 1) {\n offset += input[read++] * 2 ** (index * 8);\n }\n if (offset === 0 || offset > written || count > length - written) {\n throw corrupt('copy exceeds output or has an invalid offset');\n }\n let copied = 0;\n // Overlapping copies repeat the decoded prefix. Each step doubles it.\n while (copied < count) {\n const chunk = Math.min(offset + copied, count - copied);\n output.copyWithin(written + copied, written - offset, written - offset + chunk);\n copied += chunk;\n }\n written += count;\n }\n if (written !== length) {\n throw corrupt(`length mismatch: expected ${length} bytes, got ${written}`);\n }\n return output;\n}\n","import { utf8Encode } from './codec';\nimport { decodeSnappy, encodeSnappy } from './snappy';\nimport type { CompressionKind, SnapshotCompressionKind } from './types';\nexport type CompressionOption = CompressionKind | false;\nconst STORE_RECORD_MAGIC = utf8Encode('BDBZVAL1');\nconst SNAPSHOT_EXPORT_MAGIC = utf8Encode('BDBZSNP1');\nconst ENVELOPE_VERSION = 1;\nconst ENVELOPE_HEADER_SIZE = 18;\nconst COMPRESSION_TAG_NONE = 0;\nconst COMPRESSION_TAG_GZIP = 1;\nconst COMPRESSION_TAG_DEFLATE = 2;\nconst COMPRESSION_TAG_SNAPPY = 3;\nconst STORE_FLAG_COMPRESSION_SHIFT = 2;\nconst STORE_FLAG_COMPRESSION_MASK = 0b11 << STORE_FLAG_COMPRESSION_SHIFT;\nexport const STORE_VALUE_COMPRESSION_THRESHOLD = 1024;\nexport const STORE_VALUE_MIN_COMPRESSION_SAVING_PERCENT = 10;\nexport const STORE_VALUE_COMPRESSION_POLICY_VERSION = 2;\nexport const STORE_VALUE_COMPRESSION_PREFLIGHT_MIN_BYTES = 64 * 1024;\nexport const STORE_VALUE_COMPRESSION_PREFLIGHT_WINDOW_BYTES = 1024;\nexport const STORE_VALUE_COMPRESSION_PREFLIGHT_WINDOW_COUNT = 3;\nexport const STORE_VALUE_COMPRESSION_ENVELOPE_BYTES = ENVELOPE_HEADER_SIZE;\nconst MAX_DECOMPRESSED_STORE_VALUE_BYTES = 8 * 1024 * 1024;\nconst MAX_DECOMPRESSED_SNAPSHOT_BYTES = 256 * 1024 * 1024;\nconst CRC32_TABLE = (() => {\n const table = new Uint32Array(8 * 256);\n for (let index = 0; index < 256; index += 1) {\n let crc = index;\n for (let bit = 0; bit < 8; bit += 1) {\n if ((crc & 1) !== 0) {\n crc = (crc >>> 1) ^ 0xedb88320;\n } else {\n crc >>>= 1;\n }\n }\n table[index] = crc >>> 0;\n }\n for (let index = 0; index < 256; index += 1) {\n let crc = table[index];\n for (let slice = 1; slice < 8; slice += 1) {\n crc = (crc >>> 8) ^ table[crc & 0xff];\n table[slice * 256 + index] = crc >>> 0;\n }\n }\n return table;\n})();\ntype EnvelopeHeader = {\n version: number;\n kindTag: number;\n rawLength: number;\n payloadChecksum: number;\n};\nexport type PreparedStoreValueRecord = {\n readonly byteLength: number;\n readonly payload: Uint8Array;\n readonly rawLength: number;\n readonly kindTag: number | null;\n};\nfunction namedError(name: string, message: string): Error {\n const error = new Error(message);\n error.name = name;\n return error;\n}\nfunction compressionTag(kind: CompressionOption): number {\n switch (kind) {\n case false:\n return COMPRESSION_TAG_NONE;\n case 'gzip':\n return COMPRESSION_TAG_GZIP;\n case 'deflate':\n return COMPRESSION_TAG_DEFLATE;\n case 'snappy':\n return COMPRESSION_TAG_SNAPPY;\n default:\n throw namedError('InternalError', `unsupported compression kind: ${String(kind)}`);\n }\n}\nfunction compressionKindFromTag(tag: number): CompressionOption {\n switch (tag) {\n case COMPRESSION_TAG_NONE:\n return false;\n case COMPRESSION_TAG_GZIP:\n return 'gzip';\n case COMPRESSION_TAG_DEFLATE:\n return 'deflate';\n case COMPRESSION_TAG_SNAPPY:\n return 'snappy';\n default:\n throw namedError('CorruptionError', `invalid compression tag: ${tag}`);\n }\n}\nfunction compressionRuntimeUnavailable(): Error {\n return namedError(\n 'UnsupportedPlatformError',\n 'CompressionStream and DecompressionStream are required for moyodb compression'\n );\n}\nfunction ensureCompressionRuntime(): void {\n if (typeof CompressionStream !== 'function' || typeof DecompressionStream !== 'function') {\n throw compressionRuntimeUnavailable();\n }\n}\nfunction crc32(bytes: Uint8Array): number {\n let crc = 0xffffffff;\n let offset = 0;\n const blockEnd = bytes.byteLength - 7;\n // Table slices apply eight IEEE CRC32 byte updates in one step.\n for (; offset < blockEnd; offset += 8) {\n const first =\n crc ^ bytes[offset] ^ (bytes[offset + 1] << 8) ^ (bytes[offset + 2] << 16) ^ (bytes[offset + 3] << 24);\n crc =\n CRC32_TABLE[1792 + (first & 0xff)] ^\n CRC32_TABLE[1536 + ((first >>> 8) & 0xff)] ^\n CRC32_TABLE[1280 + ((first >>> 16) & 0xff)] ^\n CRC32_TABLE[1024 + (first >>> 24)] ^\n CRC32_TABLE[768 + bytes[offset + 4]] ^\n CRC32_TABLE[512 + bytes[offset + 5]] ^\n CRC32_TABLE[256 + bytes[offset + 6]] ^\n CRC32_TABLE[bytes[offset + 7]];\n }\n for (; offset < bytes.byteLength; offset += 1) {\n crc = (crc >>> 8) ^ CRC32_TABLE[(crc ^ bytes[offset]) & 0xff];\n }\n return (crc ^ 0xffffffff) >>> 0;\n}\nfunction buildEnvelope(magic: Uint8Array, kindTag: number, rawLength: number, payload: Uint8Array): Uint8Array {\n const out = new Uint8Array(ENVELOPE_HEADER_SIZE + payload.byteLength);\n writeEnvelope(out, 0, magic, kindTag, rawLength, payload);\n return out;\n}\nfunction writeEnvelope(\n out: Uint8Array,\n offset: number,\n magic: Uint8Array,\n kindTag: number,\n rawLength: number,\n payload: Uint8Array\n): void {\n // A borrowed payload can overlap the destination header.\n const checksum = crc32(payload);\n out.set(payload, offset + ENVELOPE_HEADER_SIZE);\n out.set(magic, offset);\n out[offset + 8] = ENVELOPE_VERSION;\n out[offset + 9] = kindTag;\n const view = new DataView(out.buffer, out.byteOffset + offset, ENVELOPE_HEADER_SIZE);\n view.setUint32(10, rawLength, true);\n view.setUint32(14, checksum, true);\n}\nfunction compressionIsProfitable(rawLength: number, compressedLength: number): boolean {\n return (\n (compressedLength + ENVELOPE_HEADER_SIZE) * 100 <=\n rawLength * (100 - STORE_VALUE_MIN_COMPRESSION_SAVING_PERCENT)\n );\n}\nfunction snappyPreflightIsProfitable(value: Uint8Array): boolean {\n if (value.byteLength < STORE_VALUE_COMPRESSION_PREFLIGHT_MIN_BYTES) {\n return true;\n }\n let compressedLength = 0;\n for (let index = 0; index < STORE_VALUE_COMPRESSION_PREFLIGHT_WINDOW_COUNT; index += 1) {\n const offset = Math.floor(\n ((value.byteLength - STORE_VALUE_COMPRESSION_PREFLIGHT_WINDOW_BYTES) * index) /\n (STORE_VALUE_COMPRESSION_PREFLIGHT_WINDOW_COUNT - 1)\n );\n compressedLength += encodeSnappy(\n value.subarray(offset, offset + STORE_VALUE_COMPRESSION_PREFLIGHT_WINDOW_BYTES)\n ).byteLength;\n }\n return compressionIsProfitable(\n STORE_VALUE_COMPRESSION_PREFLIGHT_WINDOW_BYTES * STORE_VALUE_COMPRESSION_PREFLIGHT_WINDOW_COUNT,\n compressedLength\n );\n}\nfunction buildStoreRecord(input: Uint8Array, compressed: Uint8Array, compression: CompressionKind): Uint8Array {\n if (!compressionIsProfitable(input.byteLength, compressed.byteLength)) {\n return buildEnvelope(STORE_RECORD_MAGIC, COMPRESSION_TAG_NONE, input.byteLength, input);\n }\n return buildEnvelope(STORE_RECORD_MAGIC, compressionTag(compression), input.byteLength, compressed);\n}\nfunction validateStoreValueLength(value: Uint8Array): void {\n if (value.byteLength > MAX_DECOMPRESSED_STORE_VALUE_BYTES) {\n throw namedError(\n 'ValueTooLargeError',\n `value has ${value.byteLength} bytes, exceeding the ${MAX_DECOMPRESSED_STORE_VALUE_BYTES} byte limit`\n );\n }\n}\n// Raw payloads borrow value until the prepared record is written.\nexport function prepareFastStoreValueRecord(\n value: Uint8Array,\n compression: 'snappy' | false\n): PreparedStoreValueRecord {\n if (compression === false) {\n return { payload: value, rawLength: value.byteLength, byteLength: value.byteLength, kindTag: null };\n }\n validateStoreValueLength(value);\n let payload = value;\n let kindTag = COMPRESSION_TAG_NONE;\n if (value.byteLength >= STORE_VALUE_COMPRESSION_THRESHOLD && snappyPreflightIsProfitable(value)) {\n const compressed = encodeSnappy(value);\n if (compressionIsProfitable(value.byteLength, compressed.byteLength)) {\n payload = compressed;\n kindTag = COMPRESSION_TAG_SNAPPY;\n }\n }\n return { payload, rawLength: value.byteLength, byteLength: ENVELOPE_HEADER_SIZE + payload.byteLength, kindTag };\n}\nexport function writePreparedStoreValueRecord(\n record: PreparedStoreValueRecord,\n target: Uint8Array,\n offset: number\n): number {\n if (!Number.isSafeInteger(offset) || offset < 0 || record.byteLength > target.byteLength - offset) {\n throw namedError('InternalError', 'prepared store value exceeds its destination');\n }\n if (record.kindTag === null) {\n target.set(record.payload, offset);\n } else {\n writeEnvelope(target, offset, STORE_RECORD_MAGIC, record.kindTag, record.rawLength, record.payload);\n }\n return offset + record.byteLength;\n}\n// Copy before the stream can suspend so caller mutations cannot change its input.\nfunction copyBytes(bytes: Uint8Array): Uint8Array<ArrayBuffer> {\n const copy = new Uint8Array(bytes.byteLength);\n copy.set(bytes);\n return copy;\n}\nfunction byteStream(bytes: Uint8Array<ArrayBuffer>): ReadableStream<Uint8Array<ArrayBuffer>> {\n let offset = 0;\n return new ReadableStream({\n pull(controller) {\n if (offset < bytes.byteLength) {\n const end = Math.min(offset + 64 * 1024, bytes.byteLength);\n // The stream owns the input; chunk views need no further copies.\n controller.enqueue(bytes.subarray(offset, end));\n offset = end;\n }\n if (offset === bytes.byteLength) {\n controller.close();\n }\n }\n });\n}\nfunction readEnvelopeHeader(magic: Uint8Array, bytes: Uint8Array, strict = true): EnvelopeHeader | null {\n if (bytes.byteLength < magic.byteLength) {\n return null;\n }\n for (let index = 0; index < magic.byteLength; index += 1) {\n if (bytes[index] !== magic[index]) {\n return null;\n }\n }\n if (bytes.byteLength < ENVELOPE_HEADER_SIZE) {\n if (strict) {\n throw namedError(\n 'CorruptionError',\n `truncated compression envelope: expected at least ${ENVELOPE_HEADER_SIZE} bytes, got ${bytes.byteLength}`\n );\n }\n return null;\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, ENVELOPE_HEADER_SIZE);\n return {\n version: bytes[8],\n kindTag: bytes[9],\n rawLength: view.getUint32(10, true),\n payloadChecksum: view.getUint32(14, true)\n };\n}\nasync function compressBytes(data: Uint8Array<ArrayBuffer>, kind: SnapshotCompressionKind): Promise<Uint8Array> {\n ensureCompressionRuntime();\n let stream: ReadableStream<Uint8Array>;\n try {\n stream = byteStream(data).pipeThrough(new CompressionStream(kind));\n } catch {\n throw compressionRuntimeUnavailable();\n }\n try {\n return new Uint8Array(await new Response(stream).arrayBuffer());\n } catch (error) {\n throw namedError('InternalError', `failed to compress bytes with ${kind}: ${String(error)}`);\n }\n}\nasync function decompressBytes(\n data: Uint8Array,\n kind: CompressionKind,\n label: string,\n maxOutputBytes?: number\n): Promise<Uint8Array> {\n if (kind === 'snappy') {\n return decodeSnappy(data, maxOutputBytes ?? MAX_DECOMPRESSED_STORE_VALUE_BYTES, maxOutputBytes);\n }\n ensureCompressionRuntime();\n let stream: ReadableStream<Uint8Array>;\n try {\n stream = byteStream(copyBytes(data)).pipeThrough(new DecompressionStream(kind));\n } catch {\n throw compressionRuntimeUnavailable();\n }\n try {\n return await readBoundedStream(stream, label, maxOutputBytes);\n } catch (error) {\n throw namedError('CorruptionError', `failed to decompress ${label}: ${String(error)}`);\n }\n}\n\nasync function readBoundedStream(\n stream: ReadableStream<Uint8Array>,\n label: string,\n maxOutputBytes?: number\n): Promise<Uint8Array> {\n const reader = stream.getReader();\n const chunks: Uint8Array[] = [];\n let totalBytes = 0;\n try {\n for (let next = await reader.read(); !next.done; next = await reader.read()) {\n const value = next.value;\n totalBytes += value.byteLength;\n if (maxOutputBytes !== undefined && totalBytes > maxOutputBytes) {\n await reader.cancel(`decompressed ${label} exceeded ${maxOutputBytes} bytes`);\n throw namedError('CorruptionError', `decompressed ${label} exceeds ${maxOutputBytes} byte limit`);\n }\n chunks.push(value);\n }\n } finally {\n reader.releaseLock();\n }\n if (chunks.length === 1) {\n return chunks[0];\n }\n const out = new Uint8Array(totalBytes);\n let offset = 0;\n for (const chunk of chunks) {\n out.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return out;\n}\nexport function compressionFromStoreFlags(flags: number): CompressionOption {\n const encoded = (flags & STORE_FLAG_COMPRESSION_MASK) >>> STORE_FLAG_COMPRESSION_SHIFT;\n switch (encoded) {\n case 0:\n return false;\n case 1:\n return 'gzip';\n case 2:\n return 'deflate';\n case 3:\n return 'snappy';\n default:\n throw namedError('CorruptionError', `invalid store compression flags: ${encoded}`);\n }\n}\nexport async function encodeStoreValueRecord(value: Uint8Array, compression: CompressionOption): Promise<Uint8Array> {\n if (compression === false) {\n return value;\n }\n if (compression === 'snappy') {\n const record = prepareFastStoreValueRecord(value, compression);\n const output = new Uint8Array(record.byteLength);\n writePreparedStoreValueRecord(record, output, 0);\n return output;\n }\n validateStoreValueLength(value);\n if (value.byteLength < STORE_VALUE_COMPRESSION_THRESHOLD) {\n return buildEnvelope(STORE_RECORD_MAGIC, COMPRESSION_TAG_NONE, value.byteLength, value);\n }\n const input = copyBytes(value);\n return buildStoreRecord(input, await compressBytes(input, compression), compression);\n}\nexport async function decodeStoreValueRecord(\n value: Uint8Array,\n options: {\n strict: boolean;\n }\n): Promise<Uint8Array> {\n const header = readEnvelopeHeader(STORE_RECORD_MAGIC, value, options.strict);\n if (!header) {\n return value;\n }\n if (header.version !== ENVELOPE_VERSION) {\n if (options.strict) {\n throw namedError('CorruptionError', `unsupported value record version: ${header.version}`);\n }\n return value;\n }\n let compression: CompressionOption;\n try {\n compression = compressionKindFromTag(header.kindTag);\n } catch (error) {\n if (options.strict) {\n throw error;\n }\n return value;\n }\n const payload = value.subarray(ENVELOPE_HEADER_SIZE);\n if (crc32(payload) !== header.payloadChecksum) {\n if (options.strict) {\n throw namedError('CorruptionError', 'value record checksum mismatch');\n }\n return value;\n }\n if (compression === false) {\n if (payload.byteLength !== header.rawLength) {\n if (options.strict) {\n throw namedError(\n 'CorruptionError',\n `value record length mismatch: expected ${header.rawLength} bytes, got ${payload.byteLength}`\n );\n }\n return value;\n }\n return payload.slice();\n }\n if (header.rawLength > MAX_DECOMPRESSED_STORE_VALUE_BYTES) {\n throw namedError(\n 'CorruptionError',\n `compressed value advertises ${header.rawLength} decompressed bytes, exceeding the ${MAX_DECOMPRESSED_STORE_VALUE_BYTES} byte limit`\n );\n }\n const decompressed = await decompressBytes(payload, compression, `value record (${compression})`, header.rawLength);\n if (decompressed.byteLength !== header.rawLength) {\n throw namedError(\n 'CorruptionError',\n `decompressed value length mismatch: expected ${header.rawLength} bytes, got ${decompressed.byteLength}`\n );\n }\n return decompressed;\n}\nexport async function wrapSnapshotWithCompression(\n snapshot: Uint8Array,\n compression: SnapshotCompressionKind | false\n): Promise<Uint8Array> {\n if (compression === false) {\n return snapshot;\n }\n if (!['gzip', 'deflate'].includes(compression)) {\n throw namedError('InternalError', `unsupported snapshot compression kind: ${String(compression)}`);\n }\n const input = copyBytes(snapshot);\n const compressed = await compressBytes(input, compression);\n return buildEnvelope(SNAPSHOT_EXPORT_MAGIC, compressionTag(compression), input.byteLength, compressed);\n}\nexport async function unwrapSnapshotCompression(snapshot: Uint8Array): Promise<Uint8Array> {\n const header = readEnvelopeHeader(SNAPSHOT_EXPORT_MAGIC, snapshot);\n if (!header) {\n return snapshot;\n }\n if (header.version !== ENVELOPE_VERSION) {\n throw namedError('CorruptionError', `unsupported snapshot compression version: ${header.version}`);\n }\n const compression = compressionKindFromTag(header.kindTag);\n if (compression === false) {\n throw namedError('CorruptionError', 'snapshot compression envelope cannot store kind \"none\"');\n }\n if (compression === 'snappy') {\n throw namedError('CorruptionError', `invalid snapshot compression tag: ${header.kindTag}`);\n }\n const payload = snapshot.subarray(ENVELOPE_HEADER_SIZE);\n if (crc32(payload) !== header.payloadChecksum) {\n throw namedError('CorruptionError', 'snapshot compression checksum mismatch');\n }\n if (header.rawLength > MAX_DECOMPRESSED_SNAPSHOT_BYTES) {\n throw namedError(\n 'CorruptionError',\n `compressed snapshot advertises ${header.rawLength} decompressed bytes, exceeding the ${MAX_DECOMPRESSED_SNAPSHOT_BYTES} byte limit`\n );\n }\n const decompressed = await decompressBytes(\n payload,\n compression,\n `snapshot export (${compression})`,\n header.rawLength\n );\n if (decompressed.byteLength !== header.rawLength) {\n throw namedError(\n 'CorruptionError',\n `decompressed snapshot length mismatch: expected ${header.rawLength} bytes, got ${decompressed.byteLength}`\n );\n }\n return decompressed;\n}\n","export { exposeWorkerApi } from './worker-server';\nimport {\n packedOptionalValues,\n packedScanRows,\n unpackPackedBatchOpKeys,\n unpackPackedBatchOps,\n unpackPackedBinaryList,\n unpackPackedBinaryPairKeys,\n unpackPackedOptionalValues,\n unpackPackedScanRows,\n type PackedBatchOpKey,\n type PackedOptionalValuesV1\n} from './worker-protocol';\nimport type { CommitAppliedEvent, StoreChangeSet } from './change-events';\nimport {\n compressionFromStoreFlags,\n decodeStoreValueRecord,\n encodeStoreValueRecord,\n prepareFastStoreValueRecord,\n writePreparedStoreValueRecord,\n wrapSnapshotWithCompression,\n unwrapSnapshotCompression,\n type CompressionOption,\n type PreparedStoreValueRecord\n} from './compression';\nimport { utf8Encode } from './codec';\nimport { clampTimerDelayMs, isRecord } from './internal';\nimport {\n INDEX_METADATA_STORE,\n cloneNormalizedIndexDefinitions,\n compareNormalizedIndexDefinitions,\n createIndexKeyExtractor,\n decodeIndexEntryKey,\n decodeIndexMetadataValue,\n decodeIndexedDocument,\n encodeIndexEntryKey,\n encodeIndexMetadataKey,\n encodeIndexMetadataValue,\n extractLogicalIndexKey,\n extractLogicalIndexKeyFromDocument,\n findIndexDefinition,\n indexKeyExactRange,\n indexRangeToPhysicalRange,\n isInternalStoreName,\n normalizeIndexDefinitions,\n toPublicIndexDefinitions,\n type DecodedIndexEntryKey,\n type NormalizedIndexDef\n} from './indexing';\nimport type {\n AutocommitCommand,\n IndexScanPage,\n WorkerApi,\n WorkerOpenRequest,\n WorkerScanPage,\n WorkerScanPageRequest\n} from './worker-api';\nimport type {\n BatchOp,\n ChangeFeed,\n ChangeFeedOptions,\n ChangeFeedSettings,\n CompactionResult,\n CreateStoreOptions,\n DbChange,\n DbStats,\n DebugFailpoint,\n EngineHealth,\n ExportSnapshotOptions,\n IndexDef,\n PutOptions,\n Range,\n ScanItem,\n StorageInfo,\n TxMode\n} from './types';\ntype WasmBatchOutcome =\n | {\n kind: 'put';\n baselineExists: boolean;\n }\n | {\n kind: 'delete';\n deleted: boolean;\n };\ntype IndexedPutOp = { store: string; kind: 'delete' | 'put'; key: Uint8Array };\ntype PreparedPutValue = PreparedStoreValueRecord | Uint8Array;\ntype NativeValueState = {\n live: boolean;\n expired: boolean;\n revisionKnown: boolean;\n revisionEpoch: bigint;\n revisionOrdinal: bigint;\n expiresAt: bigint;\n maxValueBytes: number;\n};\ntype WasmChangeRecord = Omit<ChangeFeed['changes'][number], 'txId'> & {\n txId: number | bigint;\n};\ntype WasmChangeFeed = {\n changes: WasmChangeRecord[];\n latestTxId: number | bigint;\n};\ntype WasmDbStats = Omit<\n DbStats,\n | 'db_id'\n | 'catalog_root_page_id'\n | 'next_page_id'\n | 'last_committed_txid'\n | 'last_replayed_wal_offset'\n | 'manifest_len'\n | 'main_len'\n | 'wal_len'\n | 'health'\n> & {\n db_id: number | bigint;\n catalog_root_page_id: number | bigint;\n next_page_id: number | bigint;\n last_committed_txid: number | bigint;\n last_replayed_wal_offset: number | bigint;\n manifest_len: number | bigint;\n main_len: number | bigint;\n wal_len: number | bigint;\n health: WasmEngineHealth;\n};\ntype WasmEngineHealth =\n | { state: 'healthy' }\n | { state: 'recoveryRequired'; reason: string; pendingTxid?: number | bigint | null }\n | { state: 'closed' };\ntype WasmRecoveryReport = {\n lastCommittedTxid: number | bigint;\n pendingTxid?: number | bigint | null;\n pendingCommitted: boolean;\n};\ntype WasmChangeFeedPolicy = {\n enabled: boolean;\n retainTxids?: number | bigint | null;\n};\ntype WasmEngine = {\n open(name: string, options: unknown): Promise<void>;\n openGeneration(name: string, generationName: string, options: unknown): Promise<void>;\n /** Checkpoints when healthy, then releases the files. */\n close(): void;\n /** Releases the files without writing anything. */\n abandon(): void;\n health(): WasmEngineHealth;\n needs_recovery(): boolean;\n recover(): WasmRecoveryReport;\n checkpoint(): void;\n compact_into(target: WasmEngine): WasmU64;\n compact_into_skipping_stores(target: WasmEngine, skipStores: string[]): WasmU64;\n change_feed_policy(): WasmChangeFeedPolicy;\n set_change_feed_policy(txId: WasmU64, policy: { enabled: boolean; retainTxids: number | null }): void;\n begin_tx(mode: TxMode): WasmU64;\n commit_tx(txId: WasmU64): WasmU64;\n rollback_tx(txId: WasmU64): void;\n create_store(txId: WasmU64, name: string, options?: unknown): void;\n drop_store(txId: WasmU64, name: string): void;\n clear_store(txId: WasmU64, name: string): void;\n get(txId: WasmU64, store: string, key: Uint8Array): Uint8Array | null;\n get_many(txId: WasmU64, store: string, keys: Array<Uint8Array>): Array<Uint8Array | null>;\n /** Little-endian u32 count | count x u32 length (u32::MAX = missing) | bytes. */\n get_many_packed(txId: WasmU64, store: string, keys: Uint8Array): Uint8Array;\n get_many_value_sizes?(txId: WasmU64, store: string, keys: Uint8Array): Uint32Array;\n get_many_value_states?(txId: WasmU64, store: string, keys: Uint8Array): Uint8Array;\n /** Checks existence without loading the value body; TTL headers may be read. */\n has(txId: WasmU64, store: string, key: Uint8Array): boolean;\n /** Optional for SDK compatibility with older bindings. */\n has_many?(txId: WasmU64, store: string, keys: Array<Uint8Array>): boolean[];\n /** Returns whether a live value existed before the write. */\n put(txId: WasmU64, store: string, key: Uint8Array, value: Uint8Array, options?: unknown): boolean;\n put_many(txId: WasmU64, store: string, entries: Array<[Uint8Array, Uint8Array]>, options?: unknown): boolean[];\n /** One byte per entry: 1 when a live value existed before the write. */\n put_many_packed(txId: WasmU64, store: string, entries: Uint8Array, options?: unknown): Uint8Array;\n put_many_indexed_packed(\n txId: WasmU64,\n store: string,\n entries: Uint8Array,\n indexOps: IndexedPutOp[][],\n options?: unknown\n ): Uint8Array;\n put_index_entry_checked?(\n txId: WasmU64,\n primaryStore: string,\n indexStore: string,\n primaryKey: Uint8Array,\n indexKey: Uint8Array,\n revisionEpoch: WasmU64,\n revisionOrdinal: WasmU64\n ): void;\n delete(txId: WasmU64, store: string, key: Uint8Array): boolean;\n delete_many(txId: WasmU64, store: string, keys: Array<Uint8Array>): boolean[];\n /** One byte per key: 1 when a live value was deleted. */\n delete_many_packed(txId: WasmU64, store: string, keys: Uint8Array): Uint8Array;\n apply_batch(txId: WasmU64, store: string, ops: Array<BatchOp>): WasmBatchOutcome[];\n /** One byte per op: baselineExists for puts, deleted for deletes. */\n apply_batch_packed(txId: WasmU64, store: string, ops: Uint8Array): Uint8Array;\n scan(txId: WasmU64, store: string, range: unknown): unknown;\n open_scan_cursor(txId: WasmU64, store: string, range: unknown, keysOnly: boolean): number;\n scan_cursor_next(\n cursorId: number,\n maxRows: number,\n maxBytes: number\n ): {\n packet: Uint8Array;\n rowCount: number;\n exhausted: boolean;\n };\n close_scan_cursor(cursorId: number): void;\n changes_since(txId: WasmU64, options?: unknown): unknown;\n get_schema_version(): WasmU64;\n export_snapshot(): Uint8Array;\n list_store_configs(): unknown;\n import_snapshot(data: Uint8Array): WasmU64;\n import_snapshot_into(target: WasmEngine, data: Uint8Array): WasmU64;\n reset(): WasmU64;\n list_stores(): unknown;\n set_schema_version(txId: WasmU64, version: WasmU64): void;\n stats(): unknown;\n set_failpoint(failpoint: string | null): void;\n};\nexport type WasmModule = {\n default: (\n options?:\n | string\n | URL\n | Request\n | BufferSource\n | WebAssembly.Module\n | {\n module_or_path?:\n string | URL | Request | BufferSource | WebAssembly.Module | Promise<Response> | Response;\n }\n ) => Promise<unknown>;\n deleteDB(name: string): Promise<void>;\n prepareRebuildTarget(name: string): Promise<{\n generationName: string;\n }>;\n /**\n * Publishes only if the active generation matches `expectedCurrent`.\n * `null` requires no active generation. The written control file is\n * flushed and verified before resolving.\n */\n swapActiveGeneration(name: string, generationName: string, expectedCurrent: string | null): Promise<void>;\n /** Active generation, or null for legacy storage. Corrupt control state needs legacy files for fallback. */\n readActiveGeneration(name: string): Promise<string | null>;\n cleanupInactiveEntries(name: string): Promise<void>;\n dbDirectorySize(name: string): Promise<number>;\n WasmEngine: new () => WasmEngine;\n};\ntype WasmU64 = bigint;\nexport interface WorkerPersistenceBridge {\n persisted(): Promise<boolean>;\n persist(): Promise<boolean>;\n close(): void;\n}\nexport interface DbWorkerOptions {\n loadWasm?: () => Promise<WasmModule>;\n persistence?: WorkerPersistenceBridge;\n}\nfunction toWasmU64(value: number | bigint): WasmU64 {\n return BigInt(value);\n}\nfunction fromWasmU64(value: number | bigint): number {\n const number = typeof value === 'bigint' ? Number(value) : value;\n if (!Number.isSafeInteger(number) || number < 0) {\n throw remoteError('SerializationError', 'WASM integer exceeds the JavaScript safe integer range');\n }\n return number;\n}\nfunction fromOptionalWasmU64(value: number | bigint | null | undefined): number | null {\n return value === null || value === undefined ? null : fromWasmU64(value);\n}\nfunction toWasmPutOptions(options: PutOptions): unknown {\n return options.ttl === undefined ? options : { ...options, ttl: toWasmU64(options.ttl) };\n}\nfunction toWasmRange(range: Range): Range {\n const normalized: Range = {};\n if (range.gt !== undefined) {\n normalized.gt = range.gt;\n }\n if (range.gte !== undefined) {\n normalized.gte = range.gte;\n }\n if (range.lt !== undefined) {\n normalized.lt = range.lt;\n }\n if (range.lte !== undefined) {\n normalized.lte = range.lte;\n }\n if (range.reverse !== undefined) {\n normalized.reverse = range.reverse;\n }\n if (range.limit !== undefined) {\n normalized.limit = range.limit;\n }\n return normalized;\n}\ninterface TrackedKeyChange {\n key: Uint8Array;\n baselineExists: boolean;\n finalKind: DbChange['kind'];\n}\ninterface TrackedStoreChanges {\n touched: boolean;\n /** Latest store-level change; every tracked key change happened after it. */\n storeLevel: 'clear' | 'drop' | null;\n keys: Map<string, TrackedKeyChange>;\n}\ntype TrackedTxnChanges = Map<string, TrackedStoreChanges>;\n// Published maps stay immutable. Create/drop gives the transaction a private\n// copy, which commit publishes.\ntype StoreCompressionSnapshot =\n | { owned: false; values: ReadonlyMap<string, CompressionOption> }\n | { owned: true; values: Map<string, CompressionOption> };\ntype MaintenanceOperation = 'compact' | 'rebuild' | 'import';\nconst EMPTY_RANGE: Range = {};\nconst EMPTY_VALUE = new Uint8Array(0);\nconst MAX_ENGINE_KEY_BYTES = 1024;\nconst MAX_PACKED_BYTES = 0xffff_ffff;\nconst INDEX_PUT_BATCH_ROWS = 64;\nconst INDEX_PUT_BATCH_BYTES = 4 * 1024 * 1024;\nconst INDEX_SCAN_PAGE_ROWS = 256;\nconst INDEX_SCAN_PAGE_BYTES = 8 * 1024 * 1024 + 18 + MAX_ENGINE_KEY_BYTES + 12;\nconst INDEX_SCAN_RAW_CHUNK_ROWS = 512;\nconst RECONCILE_DOCUMENT_CACHE_BYTES = 4 * 1024 * 1024;\nconst RECONCILE_DOCUMENT_CACHE_ROWS = 4096;\nconst HEX_BYTE_STRINGS = Array.from({ length: 256 }, (_value, byte) => byte.toString(16).padStart(2, '0'));\nconst COMPRESSED_READ_CONCURRENCY = 8;\nfunction getOrInsert<K, V>(map: Map<K, V>, key: K, create: () => V): V {\n const existing = map.get(key);\n if (existing !== undefined) {\n return existing;\n }\n const created = create();\n map.set(key, created);\n return created;\n}\nconst PERSISTENCE_BRIDGE_INIT = 'moyodb:persistence-bridge:init';\nconst PERSISTENCE_BRIDGE_REQUEST = 'moyodb:persistence-bridge:request';\nconst PERSISTENCE_BRIDGE_RESPONSE = 'moyodb:persistence-bridge:response';\ntype PersistenceBridgeOperation = 'persist' | 'persisted';\ninterface PersistenceBridgeRequest {\n type: typeof PERSISTENCE_BRIDGE_REQUEST;\n id: number;\n op: PersistenceBridgeOperation;\n}\ninterface PersistenceBridgeResponse {\n type: typeof PERSISTENCE_BRIDGE_RESPONSE;\n id: number;\n granted: boolean;\n}\nfunction isPersistenceBridgeResponse(value: unknown): value is PersistenceBridgeResponse {\n return (\n isRecord(value) &&\n value.type === PERSISTENCE_BRIDGE_RESPONSE &&\n typeof value.id === 'number' &&\n typeof value.granted === 'boolean'\n );\n}\nclass MainThreadPersistenceBridge implements WorkerPersistenceBridge {\n private port: MessagePort | null = null;\n private nextRequestId = 1;\n private pending = new Map<\n number,\n {\n resolve: (value: boolean) => void;\n }\n >();\n private readyResolve: ((port: MessagePort | null) => void) | null = null;\n private ready: Promise<MessagePort | null>;\n constructor() {\n this.ready = new Promise((resolve) => {\n this.readyResolve = resolve;\n });\n self.addEventListener('message', this.handleInitMessage as EventListener);\n }\n async persisted(): Promise<boolean> {\n return this.request('persisted');\n }\n async persist(): Promise<boolean> {\n return this.request('persist');\n }\n close(): void {\n self.removeEventListener('message', this.handleInitMessage as EventListener);\n if (this.readyResolve) {\n this.readyResolve(null);\n this.readyResolve = null;\n }\n if (this.port) {\n this.port.onmessage = null;\n this.port.close();\n this.port = null;\n }\n for (const pending of this.pending.values()) {\n pending.resolve(false);\n }\n this.pending.clear();\n }\n private async request(op: PersistenceBridgeOperation): Promise<boolean> {\n const port = await this.ready;\n if (!port || this.port !== port) {\n return false;\n }\n return new Promise<boolean>((resolve) => {\n const id = this.nextRequestId;\n this.nextRequestId += 1;\n this.pending.set(id, { resolve });\n const request: PersistenceBridgeRequest = {\n type: PERSISTENCE_BRIDGE_REQUEST,\n id,\n op\n };\n try {\n port.postMessage(request);\n } catch {\n this.pending.delete(id);\n resolve(false);\n }\n });\n }\n private handleInitMessage = (event: MessageEvent<unknown>) => {\n if (event.origin !== '' && event.origin !== self.location.origin) {\n return;\n }\n const data = event.data as {\n type?: string;\n } | null;\n if (data?.type !== PERSISTENCE_BRIDGE_INIT) {\n return;\n }\n if (event.ports.length === 0) {\n return;\n }\n const port = event.ports[0];\n if (this.port) {\n port.close();\n return;\n }\n this.port = port;\n this.port.onmessage = this.handleResponse;\n this.port.start();\n self.removeEventListener('message', this.handleInitMessage as EventListener);\n this.readyResolve?.(port);\n this.readyResolve = null;\n };\n private handleResponse = (event: MessageEvent<unknown>) => {\n const data = event.data;\n if (!isPersistenceBridgeResponse(data)) {\n return;\n }\n const pending = this.pending.get(data.id);\n if (!pending) {\n return;\n }\n this.pending.delete(data.id);\n pending.resolve(Boolean(data.granted));\n };\n}\nasync function estimateOriginStorage(): Promise<{\n usage: number;\n quota: number;\n}> {\n const storage = navigator.storage;\n if (typeof storage.estimate !== 'function') {\n return { usage: 0, quota: 0 };\n }\n const estimate = await storage.estimate();\n return {\n usage: estimate.usage ?? 0,\n quota: estimate.quota ?? 0\n };\n}\nfunction bytesToHex(bytes: Uint8Array): string {\n let out = '';\n for (let index = 0; index < bytes.byteLength; index += 1) {\n out += HEX_BYTE_STRINGS[bytes[index]];\n }\n return out;\n}\nfunction bytesEqual(left: Uint8Array, right: Uint8Array): boolean {\n if (left.byteLength !== right.byteLength) {\n return false;\n }\n for (let index = 0; index < left.byteLength; index += 1) {\n if (left[index] !== right[index]) {\n return false;\n }\n }\n return true;\n}\nfunction copyRange(range: Range): Range {\n const copy = toWasmRange(range);\n for (const bound of ['gt', 'gte', 'lt', 'lte'] as const) {\n const value = copy[bound];\n if (value !== undefined) {\n copy[bound] = value.slice();\n }\n }\n return copy;\n}\nfunction rangesEqual(left: Range, right: Range): boolean {\n for (const bound of ['gt', 'gte', 'lt', 'lte'] as const) {\n const a = left[bound];\n const b = right[bound];\n if (a === undefined ? b !== undefined : b === undefined || !bytesEqual(a, b)) {\n return false;\n }\n }\n return left.reverse === right.reverse && left.limit === right.limit;\n}\n\nfunction normalizeWasmBytes(value: Uint8Array | ArrayBuffer | ArrayLike<number>): Uint8Array {\n if (value instanceof Uint8Array) {\n return value.byteOffset === 0 && value.byteLength === value.buffer.byteLength ? value : value.slice();\n }\n return new Uint8Array(value);\n}\nfunction errorName(error: unknown): string | null {\n if (!isRecord(error)) {\n return null;\n }\n const candidate = error.name ?? error.code;\n return typeof candidate === 'string' ? candidate : null;\n}\nfunction isNamedError(error: unknown, name: string): boolean {\n return errorName(error) === name;\n}\nconst INDEX_SNAPSHOT_TRAILER_MAGIC = utf8Encode('BDBIDX1');\nconst indexSnapshotDecoder = new TextDecoder('utf-8', { fatal: true });\nfunction wrapSnapshotWithIndexDefinitions(snapshot: Uint8Array, defs: ReadonlyArray<NormalizedIndexDef>): Uint8Array {\n if (defs.length === 0) {\n return snapshot;\n }\n const manifest = utf8Encode(JSON.stringify(toPublicIndexDefinitions(defs)));\n const lengthBuffer = new ArrayBuffer(4);\n new DataView(lengthBuffer).setUint32(0, manifest.byteLength, true);\n const out = new Uint8Array(snapshot.byteLength + manifest.byteLength + 4 + INDEX_SNAPSHOT_TRAILER_MAGIC.byteLength);\n let offset = 0;\n out.set(snapshot, offset);\n offset += snapshot.byteLength;\n out.set(manifest, offset);\n offset += manifest.byteLength;\n out.set(new Uint8Array(lengthBuffer), offset);\n offset += 4;\n out.set(INDEX_SNAPSHOT_TRAILER_MAGIC, offset);\n return out;\n}\nfunction unwrapSnapshotWithIndexDefinitions(data: Uint8Array): {\n snapshot: Uint8Array;\n indexes: NormalizedIndexDef[];\n} {\n const magicLength = INDEX_SNAPSHOT_TRAILER_MAGIC.byteLength;\n if (data.byteLength < magicLength + 4) {\n return { snapshot: data, indexes: [] };\n }\n const magicOffset = data.byteLength - magicLength;\n if (!bytesEqual(data.subarray(magicOffset), INDEX_SNAPSHOT_TRAILER_MAGIC)) {\n return { snapshot: data, indexes: [] };\n }\n const lengthOffset = magicOffset - 4;\n if (lengthOffset < 0) {\n return { snapshot: data, indexes: [] };\n }\n const manifestLength = new DataView(data.buffer, data.byteOffset + lengthOffset, 4).getUint32(0, true);\n const manifestOffset = lengthOffset - manifestLength;\n if (manifestOffset < 0) {\n throw remoteError('CorruptionError', 'invalid snapshot index trailer length');\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(indexSnapshotDecoder.decode(data.subarray(manifestOffset, lengthOffset)));\n } catch (error) {\n throw remoteError('CorruptionError', `invalid snapshot index trailer: ${String(error)}`);\n }\n return {\n snapshot: data.subarray(0, manifestOffset),\n indexes: normalizeIndexDefinitions(parsed)\n };\n}\nfunction lifecycleEventChannel(dbName: string): BroadcastChannel {\n return new BroadcastChannel(`db:${dbName}:events`);\n}\nfunction broadcastLifecycleEvent(dbName: string, type: 'owner_changed' | 'db_closed' | 'db_deleted') {\n const channel = lifecycleEventChannel(dbName);\n try {\n channel.postMessage({ type, dbName, txid: null });\n } finally {\n channel.close();\n }\n}\nclass OwnershipLease {\n private releaseResolver: (() => void) | null = null;\n private requestPromise: Promise<unknown> | null = null;\n private held = false;\n async acquire(dbName: string, ownerWaitMs: number): Promise<void> {\n const holdPromise = new Promise<void>((resolve) => {\n this.releaseResolver = resolve;\n });\n const lockName = `db:${dbName}:owner`;\n if (ownerWaitMs === 0) {\n let acquiredResolve: ((value: boolean) => void) | null = null;\n const acquiredPromise = new Promise<boolean>((resolve) => {\n acquiredResolve = resolve;\n });\n const request = navigator.locks.request(\n lockName,\n { mode: 'exclusive', ifAvailable: true },\n async (lock) => {\n if (!lock) {\n acquiredResolve?.(false);\n return false;\n }\n this.held = true;\n acquiredResolve?.(true);\n await holdPromise;\n return true;\n }\n );\n const acquired = await acquiredPromise;\n if (!acquired) {\n throw remoteError('DatabaseBusyError', `database ${dbName} is already owned by another tab`);\n }\n this.requestPromise = request;\n return;\n }\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), clampTimerDelayMs(ownerWaitMs));\n let acquiredResolve: (() => void) | null = null;\n const acquiredPromise = new Promise<void>((resolve) => {\n acquiredResolve = resolve;\n });\n this.requestPromise = navigator.locks.request(\n lockName,\n { mode: 'exclusive', signal: controller.signal },\n async (_lock) => {\n clearTimeout(timeout);\n this.held = true;\n acquiredResolve?.();\n await holdPromise;\n return true;\n }\n );\n try {\n await Promise.race([acquiredPromise, this.requestPromise]);\n } catch {\n if (!this.held) {\n throw remoteError('DatabaseBusyError', `timed out waiting for ownership of ${dbName}`);\n }\n }\n }\n async release(): Promise<void> {\n if (!this.held) {\n return;\n }\n this.releaseResolver?.();\n try {\n await this.requestPromise;\n } finally {\n this.releaseResolver = null;\n this.requestPromise = null;\n this.held = false;\n }\n }\n}\nexport class DbWorker implements WorkerApi {\n private dbName: string | null = null;\n private engine: WasmEngine | null = null;\n private events: BroadcastChannel | null = null;\n private lease: OwnershipLease | null = null;\n private wasmReady: Promise<WasmModule> | null = null;\n private persistenceBridge: WorkerPersistenceBridge;\n private txChanges = new Map<number, TrackedTxnChanges>();\n private txModes = new Map<number, TxMode>();\n private primaryCursors = new Map<\n number,\n { engineId: number; txId: number; ownsTx: boolean; store: string; range: Range; callerTxId?: number }\n >();\n private nextPrimaryCursorId = 1;\n /**\n * Shared committed schema at begin. Reconciliation replaces the array;\n * it never mutates the shared schema.\n */\n private txIndexSchemas = new Map<number, NormalizedIndexDef[]>();\n private indexesBySchema = new WeakMap<NormalizedIndexDef[], Map<string, NormalizedIndexDef[]>>();\n private txEnsuredRawStores = new Map<number, Set<string>>();\n private txIndexSchemaChanged = new Set<number>();\n private txStoreCompression = new Map<number, StoreCompressionSnapshot>();\n private committedIndexes: NormalizedIndexDef[] | null = null;\n private committedStoreCompression: ReadonlyMap<string, CompressionOption> | null = null;\n private openOptions: WorkerOpenRequest['options'] | null = null;\n private maintenanceOperation: MaintenanceOperation | null = null;\n constructor(private readonly options: DbWorkerOptions = {}) {\n this.persistenceBridge = options.persistence ?? new MainThreadPersistenceBridge();\n }\n async open(request: WorkerOpenRequest): Promise<void> {\n if (this.engine) {\n return;\n }\n assertSecureContext();\n assertCapabilities();\n this.dbName = request.dbName;\n this.events = new BroadcastChannel(`db:${request.dbName}:events`);\n this.lease = new OwnershipLease();\n let engine: WasmEngine | null = null;\n try {\n await this.lease.acquire(request.dbName, request.options.ownerWaitMs);\n const wasm = await this.loadWasm();\n engine = new wasm.WasmEngine();\n await engine.open(request.dbName, {\n create_if_missing: request.options.createIfMissing,\n cache_pages: request.options.cachePages\n });\n if (request.options.changeFeed) {\n applyChangeFeedPolicy(engine, request.options.changeFeed);\n }\n if (request.options.debugFailpoint) {\n engine.set_failpoint(request.options.debugFailpoint);\n }\n this.engine = engine;\n this.openOptions = request.options;\n this.clearRuntimeCaches();\n this.maintenanceOperation = null;\n this.events.postMessage({ type: 'owner_changed', dbName: request.dbName, txid: null });\n } catch (err) {\n await this.cleanupAfterFailedOpen(engine);\n throw remapError(err);\n }\n }\n async close(): Promise<void> {\n this.ensureNotInMaintenance();\n const dbName = this.dbName;\n this.clearRuntimeCaches();\n try {\n this.engine?.close();\n } catch (err) {\n throw remapError(err);\n } finally {\n this.engine = null;\n if (dbName && this.events) {\n this.events.postMessage({ type: 'db_closed', dbName, txid: null });\n }\n this.events?.close();\n this.events = null;\n if (dbName && this.lease) {\n await this.lease.release();\n }\n if (dbName) {\n broadcastLifecycleEvent(dbName, 'owner_changed');\n }\n this.disposePersistenceBridge();\n this.lease = null;\n this.dbName = null;\n this.openOptions = null;\n this.maintenanceOperation = null;\n }\n }\n async destroy(): Promise<void> {\n this.ensureNotInMaintenance();\n const dbName = this.dbName;\n if (!dbName) {\n return;\n }\n let failure: unknown = null;\n try {\n this.rollbackAllTransactions();\n // Skip the checkpoint because the database files will be deleted.\n this.engine?.abandon();\n const wasm = await this.loadWasm();\n await wasm.deleteDB(dbName);\n broadcastLifecycleEvent(dbName, 'db_deleted');\n } catch (err) {\n failure = err;\n } finally {\n this.engine = null;\n this.clearRuntimeCaches();\n this.events?.close();\n this.events = null;\n if (this.lease) {\n try {\n await this.lease.release();\n } catch (err) {\n if (failure === null) {\n failure = err;\n }\n }\n }\n broadcastLifecycleEvent(dbName, 'owner_changed');\n this.disposePersistenceBridge();\n this.lease = null;\n this.dbName = null;\n this.openOptions = null;\n this.maintenanceOperation = null;\n }\n if (failure !== null) {\n throw remapError(failure);\n }\n }\n async deleteDB(dbName: string): Promise<void> {\n assertSecureContext();\n assertCapabilities();\n const lease = new OwnershipLease();\n let failure: unknown = null;\n let acquired = false;\n try {\n await lease.acquire(dbName, 0);\n acquired = true;\n const wasm = await this.loadWasm();\n await wasm.deleteDB(dbName);\n broadcastLifecycleEvent(dbName, 'db_deleted');\n } catch (err) {\n failure = err;\n } finally {\n try {\n await lease.release();\n } catch (err) {\n if (failure === null) {\n failure = err;\n }\n }\n if (acquired) {\n broadcastLifecycleEvent(dbName, 'owner_changed');\n }\n }\n if (failure !== null) {\n throw remapError(failure);\n }\n }\n begin(mode: TxMode): Promise<number> {\n this.recoverEngineIfNeeded();\n const indexSchema = this.loadCommittedIndexSchema();\n const storeCompression = this.loadCommittedStoreCompression();\n const txId = fromWasmU64(this.withEngine((engine) => engine.begin_tx(mode)));\n this.txChanges.set(txId, new Map<string, TrackedStoreChanges>());\n this.txModes.set(txId, mode);\n this.txIndexSchemas.set(txId, indexSchema);\n this.txStoreCompression.set(txId, { owned: false, values: storeCompression });\n return Promise.resolve(txId);\n }\n commit(txId: number): Promise<number> {\n const tracked = this.txChanges.get(txId) ?? new Map<string, TrackedStoreChanges>();\n const indexOverride = this.txIndexSchemaChanged.has(txId) ? this.txIndexSchemas.get(txId) : undefined;\n const storeCompressionSnapshot = this.txStoreCompression.get(txId);\n const txMode = this.txModes.get(txId);\n let txid: number;\n try {\n txid = fromWasmU64(this.withEngine((engine) => engine.commit_tx(toWasmU64(txId))));\n } catch (err) {\n // A failed public commit consumes its handle, but some engine errors\n // retain the transaction. Release it before clearing the SDK state.\n try {\n if (this.engine && !this.engine.needs_recovery()) {\n this.withEngine((engine) => engine.rollback_tx(toWasmU64(txId)));\n }\n } catch {}\n this.cleanupTxState(txId);\n const recovery = this.recoverEngineIfNeeded();\n // Report a recovered durable commit as success. Injected failures\n // model a crash. RecoveryRequiredError refers to an earlier failed\n // operation, so its recovery report cannot confirm this commit.\n if (\n !recovery?.pendingCommitted ||\n recovery.pendingTxid === null ||\n isNamedError(err, 'RecoveryRequiredError') ||\n isNamedError(err, 'InjectedFailureError')\n ) {\n throw err;\n }\n txid = recovery.pendingTxid;\n }\n if (indexOverride) {\n this.committedIndexes = cloneNormalizedIndexDefinitions(indexOverride);\n }\n if (txMode === 'readwrite' && storeCompressionSnapshot) {\n this.committedStoreCompression = storeCompressionSnapshot.values;\n }\n this.cleanupTxState(txId);\n if (this.dbName && this.events) {\n const event: CommitAppliedEvent = {\n type: 'commit_applied',\n dbName: this.dbName,\n txid,\n stores: this.finalizeTrackedChanges(tracked)\n };\n this.events.postMessage(event);\n }\n return Promise.resolve(txid);\n }\n rollback(txId: number): Promise<void> {\n try {\n this.withEngine((engine) => engine.rollback_tx(toWasmU64(txId)));\n } finally {\n this.cleanupTxState(txId);\n }\n return Promise.resolve();\n }\n async autocommit(mode: TxMode, command: AutocommitCommand, args: unknown[]): Promise<unknown> {\n const txId = await this.begin(mode);\n const method = this[command] as unknown as (...methodArgs: unknown[]) => Promise<unknown>;\n let result: unknown;\n try {\n result = await method.apply(this, [txId, ...args]);\n } catch (error) {\n try {\n await this.rollback(txId);\n } catch {}\n throw error;\n }\n if (mode === 'readwrite') {\n await this.commit(txId);\n } else {\n await this.rollback(txId);\n }\n return result;\n }\n createStore(txId: number, name: string, options: CreateStoreOptions = {}): Promise<void> {\n const compression = isInternalStoreName(name) ? false : (options.compression ?? 'snappy');\n this.txEnsuredRawStores.get(txId)?.delete(name);\n this.withEngine((engine) => engine.create_store(toWasmU64(txId), name, { compression }));\n this.recordStoreCompressionCreate(txId, name, compression);\n this.ensureInternalStoresForStore(txId, name);\n this.markStoreTouched(txId, name);\n return Promise.resolve();\n }\n dropStore(txId: number, name: string): Promise<void> {\n const defs = this.indexesForStoreInTx(txId, name);\n this.txEnsuredRawStores.get(txId)?.delete(name);\n this.withEngine((engine) => engine.drop_store(toWasmU64(txId), name));\n this.recordStoreCompressionDrop(txId, name);\n for (const def of defs) {\n this.dropRawStoreIfExists(txId, def.internalStore);\n }\n this.recordStoreLevelChange(txId, name, 'drop');\n return Promise.resolve();\n }\n clearStore(txId: number, name: string): Promise<void> {\n const defs = this.indexesForStoreInTx(txId, name);\n this.txEnsuredRawStores.get(txId)?.delete(name);\n this.withEngine((engine) => engine.clear_store(toWasmU64(txId), name));\n for (const def of defs) {\n this.clearRawStoreIfExists(txId, def.internalStore);\n }\n this.recordStoreLevelChange(txId, name, 'clear');\n return Promise.resolve();\n }\n async get(txId: number, store: string, key: Uint8Array): Promise<Uint8Array | null> {\n return this.readStoreValue(txId, store, key);\n }\n async getMany(txId: number, store: string, keys: Array<Uint8Array>): Promise<Array<Uint8Array | null>> {\n const values = this.withEngine((engine) => engine.get_many(toWasmU64(txId), store, keys));\n const compressed = !isInternalStoreName(store) && this.storeCompressionForTx(txId, store) !== false;\n // Normalize all borrowed views before a decoder can suspend. Values\n // waiting for a decoder must also retain stable buffers.\n for (let index = 0; index < values.length; index += 1) {\n const value = values[index];\n if (value !== null) {\n values[index] = normalizeWasmBytes(value);\n }\n }\n return compressed ? this.decodeStoreValues(txId, store, values) : values;\n }\n async getManyPacked(\n txId: number,\n store: string,\n packedKeys: Uint8Array\n ): Promise<PackedOptionalValuesV1 | Array<Uint8Array | null>> {\n const packed = normalizeWasmBytes(\n this.withEngine((engine) => engine.get_many_packed(toWasmU64(txId), store, packedKeys))\n );\n if (isInternalStoreName(store) || this.storeCompressionForTx(txId, store) === false) {\n // The protocol accepts the engine packet directly.\n return packedOptionalValues(packed);\n }\n // Decoders retain views of this private packet, including while queued.\n return this.decodeStoreValues(txId, store, unpackPackedOptionalValues(packed));\n }\n has(txId: number, store: string, key: Uint8Array): Promise<boolean> {\n return Promise.resolve(this.withEngine((engine) => engine.has(toWasmU64(txId), store, key)));\n }\n async put(\n txId: number,\n store: string,\n key: Uint8Array,\n value: Uint8Array,\n options: PutOptions = {}\n ): Promise<void> {\n const defs = this.indexesForStoreInTx(txId, store);\n if (defs.length === 0) {\n const storedValue = await this.encodeStoreValueForWrite(txId, store, value);\n const baselineExists = this.withEngine((engine) =>\n engine.put(toWasmU64(txId), store, key, storedValue, toWasmPutOptions(options))\n );\n this.recordPutChange(txId, store, key, baselineExists);\n return;\n }\n await this.putIndexedMany(txId, store, [key, value], defs, options);\n }\n async putMany(\n txId: number,\n store: string,\n entries: Array<[Uint8Array, Uint8Array]>,\n options: PutOptions = {}\n ): Promise<void> {\n if (entries.length === 0) {\n return;\n }\n const defs = this.indexesForStoreInTx(txId, store);\n if (defs.length === 0) {\n const storedEntries = await this.encodeEntriesForWrite(txId, store, entries);\n let baselines: boolean[];\n try {\n baselines = this.withEngine((engine) =>\n engine.put_many(toWasmU64(txId), store, storedEntries, toWasmPutOptions(options))\n );\n } catch (error) {\n const partial = partialBooleanOutcomes(error);\n this.recordPutChanges(txId, store, entries, partial);\n throw error;\n }\n if (baselines.length !== entries.length) {\n throw outcomeCountMismatch('put_many', baselines.length, entries.length);\n }\n this.recordPutChanges(txId, store, entries, baselines);\n return;\n }\n const items = new Array<Uint8Array>(entries.length * 2);\n for (let index = 0; index < entries.length; index += 1) {\n items[index * 2] = entries[index][0];\n items[index * 2 + 1] = entries[index][1];\n }\n await this.putIndexedMany(txId, store, items, defs, options);\n }\n async putManyPacked(\n txId: number,\n store: string,\n packedEntries: Uint8Array,\n options: PutOptions = {}\n ): Promise<void> {\n const defs = this.indexesForStoreInTx(txId, store);\n if (defs.length !== 0) {\n const items = unpackPackedBinaryList(packedEntries);\n if (items.length % 2 !== 0) {\n throw remoteError('WorkerProtocolError', 'packed putMany payload has an odd item count');\n }\n await this.putIndexedMany(txId, store, items, defs, options);\n return;\n }\n const compression = this.storeCompressionForTx(txId, store);\n const items = compression === false ? null : unpackPackedBinaryList(packedEntries);\n if (items !== null && items.length % 2 !== 0) {\n throw remoteError('WorkerProtocolError', 'packed putMany payload has an odd item count');\n }\n const keys =\n items === null\n ? unpackPackedBinaryPairKeys(packedEntries)\n : items.filter((_item, index) => index % 2 === 0);\n if (keys.length === 0) {\n return;\n }\n const storedEntries =\n items === null ? packedEntries : await this.encodePackedEntriesForWrite(txId, store, items, keys);\n let baselines: Uint8Array;\n try {\n baselines = this.withEngine((engine) =>\n engine.put_many_packed(toWasmU64(txId), store, storedEntries, toWasmPutOptions(options))\n );\n } catch (error) {\n const partial = partialBooleanOutcomes(error);\n this.recordPutKeyChanges(txId, store, keys, partial);\n throw error;\n }\n if (baselines.length !== keys.length) {\n throw outcomeCountMismatch('put_many_packed', baselines.length, keys.length);\n }\n this.recordPutKeyChanges(txId, store, keys, baselines);\n }\n async delete(txId: number, store: string, key: Uint8Array): Promise<boolean> {\n const defs = this.indexesForStoreInTx(txId, store);\n // Load the previous document only when its index keys must be removed.\n const oldValue = defs.length === 0 ? null : await this.readStoreValue(txId, store, key);\n const oldKeyFor = oldValue === null ? null : createIndexKeyExtractor(oldValue);\n const oldLogicalKeys = oldKeyFor === null ? [] : defs.map((def) => ({ def, logicalKey: oldKeyFor(def) }));\n const deleted = this.withEngine((engine) => engine.delete(toWasmU64(txId), store, key));\n if (!deleted) {\n this.recordDeleteChange(txId, store, key, false);\n return false;\n }\n for (const entry of oldLogicalKeys) {\n if (entry.logicalKey !== null) {\n this.deleteIndexEntryIfPresent(txId, entry.def, entry.logicalKey, key);\n }\n }\n this.recordDeleteChange(txId, store, key, true);\n return true;\n }\n async deleteMany(txId: number, store: string, keys: Array<Uint8Array>): Promise<void> {\n if (keys.length === 0) {\n return;\n }\n const defs = this.indexesForStoreInTx(txId, store);\n if (defs.length === 0) {\n let deleted: boolean[];\n try {\n deleted = this.withEngine((engine) => engine.delete_many(toWasmU64(txId), store, keys));\n } catch (error) {\n const partial = partialBooleanOutcomes(error);\n for (let i = 0; i < partial.length && i < keys.length; i += 1) {\n this.recordDeleteChange(txId, store, keys[i], partial[i]);\n }\n throw error;\n }\n if (deleted.length !== keys.length) {\n throw outcomeCountMismatch('delete_many', deleted.length, keys.length);\n }\n for (let i = 0; i < keys.length; i += 1) {\n this.recordDeleteChange(txId, store, keys[i], deleted[i]);\n }\n return;\n }\n for (const key of keys) {\n await this.delete(txId, store, key);\n }\n }\n async deleteManyPacked(txId: number, store: string, packedKeys: Uint8Array): Promise<void> {\n const defs = this.indexesForStoreInTx(txId, store);\n const keys = unpackPackedBinaryList(packedKeys);\n if (keys.length === 0) {\n return;\n }\n if (defs.length !== 0) {\n await this.deleteMany(txId, store, keys);\n return;\n }\n let deleted: Uint8Array;\n try {\n deleted = this.withEngine((engine) => engine.delete_many_packed(toWasmU64(txId), store, packedKeys));\n } catch (error) {\n const partial = partialBooleanOutcomes(error);\n for (let i = 0; i < partial.length && i < keys.length; i += 1) {\n this.recordDeleteChange(txId, store, keys[i], partial[i]);\n }\n throw error;\n }\n if (deleted.length !== keys.length) {\n throw outcomeCountMismatch('delete_many_packed', deleted.length, keys.length);\n }\n for (let i = 0; i < keys.length; i += 1) {\n this.recordDeleteChange(txId, store, keys[i], deleted[i] === 1);\n }\n }\n async applyBatch(txId: number, store: string, ops: Array<BatchOp>): Promise<void> {\n if (ops.length === 0) {\n return;\n }\n const defs = this.indexesForStoreInTx(txId, store);\n if (defs.length === 0) {\n const storedOps = await this.encodeBatchOpsForWrite(txId, store, ops);\n let outcomes: WasmBatchOutcome[];\n try {\n outcomes = this.withEngine((engine) => engine.apply_batch(toWasmU64(txId), store, storedOps));\n } catch (error) {\n this.recordBatchOutcomes(txId, store, ops, partialBatchOutcomes(error));\n throw error;\n }\n if (outcomes.length !== ops.length) {\n throw outcomeCountMismatch('apply_batch', outcomes.length, ops.length);\n }\n this.recordBatchOutcomes(txId, store, ops, outcomes);\n return;\n }\n for (const op of ops) {\n if (op.kind === 'put') {\n await this.put(txId, store, op.key, op.value);\n } else {\n await this.delete(txId, store, op.key);\n }\n }\n }\n async applyBatchPacked(txId: number, store: string, packedOps: Uint8Array): Promise<void> {\n const defs = this.indexesForStoreInTx(txId, store);\n if (defs.length !== 0 || this.storeCompressionForTx(txId, store) !== false) {\n const ops = unpackPackedBatchOps(packedOps);\n if (ops.length === 0) {\n return;\n }\n await this.applyBatch(txId, store, ops);\n return;\n }\n const ops = unpackPackedBatchOpKeys(packedOps);\n if (ops.length === 0) {\n return;\n }\n let flags: Uint8Array;\n try {\n flags = this.withEngine((engine) => engine.apply_batch_packed(toWasmU64(txId), store, packedOps));\n } catch (error) {\n this.recordBatchOutcomes(txId, store, ops, partialBatchOutcomes(error));\n throw error;\n }\n if (flags.length !== ops.length) {\n throw outcomeCountMismatch('apply_batch_packed', flags.length, ops.length);\n }\n for (let i = 0; i < ops.length; i += 1) {\n const op = ops[i];\n if (op.kind === 'put') {\n this.recordPutChange(txId, store, op.key, flags[i] === 1);\n } else {\n this.recordDeleteChange(txId, store, op.key, flags[i] === 1);\n }\n }\n }\n async scan(txId: number, store: string, range: Range): Promise<ScanItem[]> {\n return this.readStoreScan(txId, store, range);\n }\n async scanPage(request: WorkerScanPageRequest): Promise<WorkerScanPage> {\n if (\n !Number.isSafeInteger(request.maxRows) ||\n request.maxRows <= 0 ||\n request.maxRows > MAX_PACKED_BYTES ||\n !Number.isSafeInteger(request.maxBytes) ||\n request.maxBytes < 4 ||\n request.maxBytes > MAX_PACKED_BYTES\n ) {\n throw remoteError(\n 'InvalidRangeError',\n 'scan page budgets must be positive u32 integers; maxBytes must be at least 4'\n );\n }\n let cursorId = request.cursorId;\n let cursor = cursorId === undefined ? undefined : this.primaryCursors.get(cursorId);\n if (cursorId !== undefined) {\n if (!cursor) {\n throw remoteError('TransactionClosedError', 'scan cursor is closed');\n }\n if (\n cursor.store !== request.store ||\n cursor.callerTxId !== request.txId ||\n !rangesEqual(cursor.range, request.range ?? EMPTY_RANGE)\n ) {\n throw remoteError('InvalidRangeError', 'scan continuation does not match the cursor');\n }\n } else {\n const ownsTx = request.txId === undefined;\n const txId = request.txId ?? (await this.begin('readonly'));\n const range = copyRange(request.range ?? EMPTY_RANGE);\n let engineId: number;\n try {\n engineId = this.withEngine((engine) =>\n engine.open_scan_cursor(toWasmU64(txId), request.store, toWasmRange(range), false)\n );\n } catch (error) {\n if (ownsTx) {\n try {\n await this.rollback(txId);\n } catch {}\n }\n throw error;\n }\n cursorId = this.nextPrimaryCursorId++;\n cursor = { engineId, txId, ownsTx, store: request.store, range, callerTxId: request.txId };\n this.primaryCursors.set(cursorId, cursor);\n }\n try {\n const page = this.withEngine((engine) =>\n engine.scan_cursor_next(cursor.engineId, request.maxRows, request.maxBytes)\n );\n const packet = normalizeWasmBytes(page.packet);\n const rowCount =\n packet.byteLength < 4 ? -1 : new DataView(packet.buffer, packet.byteOffset, 4).getUint32(0, true);\n if (rowCount !== page.rowCount || rowCount > request.maxRows || packet.byteLength > request.maxBytes) {\n throw remoteError('CorruptionError', 'scan cursor returned an invalid page budget or count');\n }\n const compressed = this.storeCompressionForTx(cursor.txId, cursor.store) !== false;\n const rows = compressed ? unpackPackedScanRows(packet) : null;\n let bytes = packet.byteLength;\n if (rows !== null) {\n bytes = 4;\n for (const row of rows) {\n row.value = await this.decodeStoreValue(cursor.txId, cursor.store, row.value);\n bytes += 8 + row.key.byteLength + row.value.byteLength;\n if (bytes > request.maxBytes) {\n throw remoteError('ValueTooLargeError', 'decoded scan page exceeds maxBytes');\n }\n }\n }\n if (page.exhausted) {\n await this.closeCursor(cursorId!);\n }\n return {\n rows: rows ?? (packedScanRows(packet) as unknown as ScanItem[]),\n done: page.exhausted,\n bytes,\n ...(page.exhausted ? {} : { cursorId })\n };\n } catch (error) {\n try {\n await this.closeCursor(cursorId!);\n } catch {}\n throw error;\n }\n }\n async closeCursor(cursorId: number): Promise<void> {\n const cursor = this.primaryCursors.get(cursorId);\n if (!cursor) {\n return;\n }\n this.primaryCursors.delete(cursorId);\n try {\n this.withEngine((engine) => engine.close_scan_cursor(cursor.engineId));\n } finally {\n if (cursor.ownsTx) {\n await this.rollback(cursor.txId);\n }\n }\n }\n async getByIndex(txId: number, store: string, indexName: string, key: Uint8Array): Promise<Uint8Array | null> {\n const def = this.resolveIndexDefinition(txId, store, indexName);\n const page = await this.loadVisibleIndexPage(txId, def, { gte: key, lte: key }, null, 1);\n return page.rows.length === 0 ? null : page.rows[0].value;\n }\n async scanByIndex(txId: number, store: string, indexName: string, range: Range = {}): Promise<ScanItem[]> {\n const def = this.resolveIndexDefinition(txId, store, indexName);\n const rows: ScanItem[] = [];\n let remaining = range.limit ?? Number.POSITIVE_INFINITY;\n let cursor: Uint8Array | null = null;\n while (remaining > 0) {\n const page = await this.loadVisibleIndexPage(\n txId,\n def,\n range,\n cursor,\n Math.min(remaining, INDEX_SCAN_PAGE_ROWS)\n );\n rows.push(...page.rows);\n remaining -= page.rows.length;\n if (page.cursor === null) {\n break;\n }\n cursor = page.cursor;\n }\n return rows;\n }\n async scanByIndexPage(\n txId: number,\n store: string,\n indexName: string,\n range: Range,\n cursor: Uint8Array | null,\n limit: number,\n maxBytes: number = INDEX_SCAN_PAGE_BYTES\n ): Promise<IndexScanPage> {\n if (!Number.isSafeInteger(limit) || limit <= 0) {\n throw remoteError('InvalidRangeError', 'index scan page limit must be a positive integer');\n }\n if (!Number.isSafeInteger(maxBytes) || maxBytes < 4 || maxBytes > MAX_PACKED_BYTES) {\n throw remoteError('InvalidRangeError', 'index scan page maxBytes must be a u32 integer of at least 4');\n }\n const def = this.resolveIndexDefinition(txId, store, indexName);\n return this.loadVisibleIndexPage(txId, def, range, cursor, limit, maxBytes);\n }\n getIndexes(txId?: number): Promise<IndexDef[]> {\n return Promise.resolve(\n toPublicIndexDefinitions(txId === undefined ? this.loadCommittedIndexSchema() : this.indexSchemaForTx(txId))\n );\n }\n async reconcileIndexes(txId: number, indexes: IndexDef[]): Promise<void> {\n const target = normalizeIndexDefinitions(indexes);\n this.ensureRawStore(txId, INDEX_METADATA_STORE);\n const current = this.readIndexSchemaInTx(txId);\n const targetStores = new Set(target.map((def) => def.internalStore));\n for (const def of current) {\n if (!targetStores.has(def.internalStore)) {\n this.dropRawStoreIfExists(txId, def.internalStore);\n }\n }\n this.clearRawStoreIfExists(txId, INDEX_METADATA_STORE);\n let documentStore: string | null = null;\n let cachedBytes = 0;\n let sourceRows: ScanItem[] | null = null;\n const canRefreshVisibility = typeof this.engine?.has_many === 'function';\n const documents = new Map<string, { bytes: Uint8Array; inputBytes: number; document: unknown }>();\n for (const def of target) {\n if (documentStore !== def.store) {\n documents.clear();\n cachedBytes = 0;\n sourceRows = null;\n documentStore = def.store;\n }\n this.ensureRawStore(txId, def.internalStore);\n this.clearRawStoreIfExists(txId, def.internalStore);\n if (this.rawStoreExistsInTx(txId, def.store)) {\n let rows: ScanItem[];\n if (sourceRows !== null) {\n // The transaction lane keeps source keys and bytes stable.\n // Refresh TTL visibility and stage expiry before validating\n // this index, using one timestamp for all cached rows.\n const visible = this.withEngine((engine) =>\n engine.has_many!(\n toWasmU64(txId),\n def.store,\n sourceRows!.map((row) => row.key)\n )\n );\n if (visible.length !== sourceRows.length) {\n throw outcomeCountMismatch('has_many', visible.length, sourceRows.length);\n }\n rows = sourceRows.filter((_row, index) => visible[index]);\n } else {\n // Full scans refresh visibility when caching is unavailable.\n rows = await this.readStoreScan(txId, def.store, EMPTY_RANGE);\n if (canRefreshVisibility && rows.length <= RECONCILE_DOCUMENT_CACHE_ROWS) {\n let inputBytes = 0;\n for (const row of rows) {\n inputBytes += row.key.byteLength + row.value.byteLength;\n if (inputBytes > RECONCILE_DOCUMENT_CACHE_BYTES) {\n break;\n }\n }\n if (inputBytes <= RECONCILE_DOCUMENT_CACHE_BYTES) {\n // Source rows and the document cache share owned value buffers.\n sourceRows = rows;\n }\n }\n }\n for (const row of rows) {\n const token = bytesToHex(row.key);\n const cached = documents.get(token);\n let document: unknown;\n if (cached && (cached.bytes === row.value || bytesEqual(cached.bytes, row.value))) {\n document = cached.document;\n cached.bytes = row.value;\n } else {\n document = decodeIndexedDocument(row.value);\n const previousBytes = cached?.inputBytes ?? 0;\n const inputBytes = row.key.byteLength + row.value.byteLength;\n if (\n (cached || documents.size < RECONCILE_DOCUMENT_CACHE_ROWS) &&\n cachedBytes - previousBytes + inputBytes <= RECONCILE_DOCUMENT_CACHE_BYTES\n ) {\n documents.set(token, { bytes: row.value, inputBytes, document });\n cachedBytes += inputBytes - previousBytes;\n } else if (cached) {\n documents.delete(token);\n cachedBytes -= previousBytes;\n }\n }\n const logicalKey = extractLogicalIndexKeyFromDocument(def, document);\n if (logicalKey === null) {\n continue;\n }\n await this.assertUniqueIndexAvailability(txId, def, logicalKey, row.key);\n this.putIndexEntry(txId, def, this.buildIndexEntryKey(def, logicalKey, row.key), EMPTY_VALUE);\n }\n }\n this.putRawValue(\n txId,\n INDEX_METADATA_STORE,\n encodeIndexMetadataKey(def.store, def.name),\n encodeIndexMetadataValue(def)\n );\n }\n this.txIndexSchemas.set(txId, cloneNormalizedIndexDefinitions(target));\n this.txIndexSchemaChanged.add(txId);\n }\n listStores(): Promise<string[]> {\n return Promise.resolve(this.currentStoreNames());\n }\n getVersion(): Promise<number> {\n return Promise.resolve(fromWasmU64(this.withEngine((engine) => engine.get_schema_version())));\n }\n async changesSince(txId: number, options: ChangeFeedOptions = {}): Promise<ChangeFeed> {\n const visibleStores = options.stores?.filter((store) => !isInternalStoreName(store));\n const engineOptions: ChangeFeedOptions = {\n ...options,\n stores: visibleStores ? [...visibleStores] : undefined,\n limit: visibleStores ? options.limit : undefined\n };\n const feed = this.withEngine((engine) =>\n engine.changes_since(toWasmU64(txId), engineOptions)\n ) as WasmChangeFeed;\n const allowedStores = visibleStores ? new Set(visibleStores) : null;\n const changes: ChangeFeed['changes'] = [];\n for (const change of feed.changes) {\n if (isInternalStoreName(change.store)) {\n continue;\n }\n if (allowedStores && !allowedStores.has(change.store)) {\n continue;\n }\n const key =\n options.limit === undefined || changes.length < options.limit ? normalizeWasmBytes(change.key) : null;\n let value: Uint8Array | undefined;\n if (change.value !== undefined) {\n // Validate returned public records beyond the output limit\n // so their corruption errors still reach the caller.\n value = await this.decodeStoreValueForFeed(change.store, normalizeWasmBytes(change.value));\n }\n if (key === null) {\n continue;\n }\n changes.push({\n txId: fromWasmU64(change.txId),\n store: change.store,\n key,\n kind: change.kind,\n value\n });\n }\n return {\n latestTxId: fromWasmU64(feed.latestTxId),\n changes\n };\n }\n setSchemaVersion(txId: number, version: number): Promise<void> {\n this.withEngine((engine) => engine.set_schema_version(toWasmU64(txId), toWasmU64(version)));\n return Promise.resolve();\n }\n async exportSnapshot(options: ExportSnapshotOptions = {}): Promise<Uint8Array> {\n const defs = cloneNormalizedIndexDefinitions(this.loadCommittedIndexSchema());\n const bytes = this.withEngine((engine) => engine.export_snapshot());\n const wrapped = wrapSnapshotWithIndexDefinitions(normalizeWasmBytes(bytes), defs);\n return await wrapSnapshotWithCompression(wrapped, options.compression ?? false);\n }\n async importSnapshot(data: Uint8Array): Promise<void> {\n this.ensureNotInMaintenance();\n const decompressed = await unwrapSnapshotCompression(data);\n const parsed = unwrapSnapshotWithIndexDefinitions(decompressed);\n await this.runGenerationOperation('import', parsed);\n }\n async reset(): Promise<void> {\n const dbName = this.dbName;\n if (!dbName) {\n throw remoteError('InternalError', 'engine is not open');\n }\n const defs = cloneNormalizedIndexDefinitions(this.loadCommittedIndexSchema());\n this.rollbackAllTransactions();\n const stores: StoreChangeSet[] = this.currentStoreNames().map((store) => ({\n store,\n changes: [{ key: new Uint8Array(0), kind: 'clear' }]\n }));\n const txid = fromWasmU64(this.withEngine((engine) => engine.reset()));\n this.committedIndexes = [];\n await this.applyCommittedIndexSchema(defs);\n if (this.events) {\n const event: CommitAppliedEvent = {\n type: 'commit_applied',\n dbName,\n txid,\n stores\n };\n this.events.postMessage(event);\n }\n }\n async compact(): Promise<CompactionResult> {\n return this.runGenerationOperation('compact');\n }\n async rebuild(): Promise<CompactionResult> {\n return this.runGenerationOperation('rebuild');\n }\n stats(): Promise<DbStats> {\n const stats = this.withEngine((engine) => engine.stats()) as WasmDbStats;\n return Promise.resolve({\n ...stats,\n db_id: typeof stats.db_id === 'bigint' ? Number(stats.db_id) : stats.db_id,\n catalog_root_page_id: fromWasmU64(stats.catalog_root_page_id),\n next_page_id: fromWasmU64(stats.next_page_id),\n last_committed_txid: fromWasmU64(stats.last_committed_txid),\n last_replayed_wal_offset: fromWasmU64(stats.last_replayed_wal_offset),\n manifest_len: fromWasmU64(stats.manifest_len),\n main_len: fromWasmU64(stats.main_len),\n wal_len: fromWasmU64(stats.wal_len),\n health: normalizeEngineHealth(stats.health),\n store_count: this.currentStoreNames().length\n });\n }\n async storageInfo(): Promise<StorageInfo> {\n const [dbSize, estimate, persisted] = await Promise.all([\n this.dbDirectorySize(),\n estimateOriginStorage(),\n this.persistenceBridge.persisted()\n ]);\n return {\n dbSize,\n originUsage: estimate.usage,\n originQuota: estimate.quota,\n persisted\n };\n }\n async requestPersistence(): Promise<boolean> {\n return this.persistenceBridge.persist();\n }\n setFailpoint(failpoint: DebugFailpoint): Promise<void> {\n this.withEngine((engine) => engine.set_failpoint(failpoint));\n return Promise.resolve();\n }\n private requireDbName(): string {\n if (!this.dbName) {\n throw remoteError('InternalError', 'engine is not open');\n }\n return this.dbName;\n }\n private ensureNotInMaintenance(): void {\n if (!this.maintenanceOperation) {\n return;\n }\n const dbName = this.dbName ?? 'database';\n throw remoteError('DatabaseBusyError', `database ${dbName} is busy: ${this.maintenanceOperation} in progress`);\n }\n private currentCachePages(): number {\n return this.openOptions?.cachePages ?? 256;\n }\n private async dbDirectorySize(): Promise<number> {\n const wasm = await this.loadWasm();\n return wasm.dbDirectorySize(this.requireDbName());\n }\n private async applyCommittedIndexSchema(defs: ReadonlyArray<NormalizedIndexDef>): Promise<void> {\n const normalized = cloneNormalizedIndexDefinitions(defs);\n if (normalized.length === 0) {\n this.committedIndexes = [];\n return;\n }\n const txId = fromWasmU64(\n this.withEngine((engine) => engine.begin_tx('readwrite'), { allowDuringMaintenance: true })\n );\n this.txChanges.set(txId, new Map());\n this.txModes.set(txId, 'readwrite');\n this.txStoreCompression.set(txId, { owned: false, values: this.loadCommittedStoreCompression() });\n try {\n await this.reconcileIndexes(txId, toPublicIndexDefinitions(normalized));\n fromWasmU64(\n this.withEngine((engine) => engine.commit_tx(toWasmU64(txId)), { allowDuringMaintenance: true })\n );\n this.committedIndexes = cloneNormalizedIndexDefinitions(normalized);\n } catch (error) {\n try {\n this.withEngine((engine) => engine.rollback_tx(toWasmU64(txId)), { allowDuringMaintenance: true });\n } catch {}\n throw error;\n } finally {\n this.cleanupTxState(txId);\n }\n }\n /**\n * Publishes a fresh generation only if the active generation has not changed.\n * A failed swap may have reached storage; read the control file before cleanup.\n * After publication, abandon the old engine to avoid a checkpoint into inactive files.\n */\n private async runGenerationOperation(\n operation: MaintenanceOperation,\n imported?: { snapshot: Uint8Array; indexes: NormalizedIndexDef[] }\n ): Promise<CompactionResult> {\n const dbName = this.requireDbName();\n if (this.maintenanceOperation) {\n throw remoteError(\n 'DatabaseBusyError',\n `database ${dbName} is busy: ${this.maintenanceOperation} in progress`\n );\n }\n this.maintenanceOperation = operation;\n const start = performance.now();\n let wasm: WasmModule | null = null;\n let rebuiltEngine: WasmEngine | null = null;\n let generationName: string | null = null;\n let published = false;\n try {\n wasm = await this.loadWasm();\n const sizeBefore = await wasm.dbDirectorySize(dbName);\n const defs = cloneNormalizedIndexDefinitions(imported?.indexes ?? this.loadCommittedIndexSchema());\n this.rollbackAllTransactions({ allowDuringMaintenance: true });\n const expectedGeneration = await wasm.readActiveGeneration(dbName);\n generationName = (await wasm.prepareRebuildTarget(dbName)).generationName;\n rebuiltEngine = new wasm.WasmEngine();\n await rebuiltEngine.openGeneration(dbName, generationName, {\n create_if_missing: true,\n cache_pages: this.currentCachePages()\n });\n const target = rebuiltEngine;\n this.withEngine(\n (engine) =>\n imported\n ? fromWasmU64(engine.import_snapshot_into(target, imported.snapshot))\n : operation === 'rebuild'\n ? engine.compact_into_skipping_stores(target, [\n ...defs.map((def) => def.internalStore),\n INDEX_METADATA_STORE\n ])\n : engine.compact_into(target),\n { allowDuringMaintenance: true }\n );\n if ((operation === 'rebuild' || imported) && defs.length > 0) {\n // Regenerate managed indexes before activating the target generation.\n const previousEngine = this.engine;\n const previousMaintenance = this.maintenanceOperation;\n this.engine = target;\n this.maintenanceOperation = null;\n try {\n this.committedIndexes = [];\n this.committedStoreCompression = null;\n await this.applyCommittedIndexSchema(defs);\n } finally {\n this.engine = previousEngine;\n this.maintenanceOperation = previousMaintenance;\n this.committedStoreCompression = null;\n }\n }\n try {\n await wasm.swapActiveGeneration(dbName, generationName, expectedGeneration);\n published = true;\n } catch (swapError) {\n published = (await readActiveGenerationOrNull(wasm, dbName)) === generationName;\n if (!published) {\n throw swapError;\n }\n }\n const previousEngine = this.engine;\n this.engine = rebuiltEngine;\n rebuiltEngine = null;\n this.committedIndexes = defs;\n this.committedStoreCompression = null;\n try {\n previousEngine?.abandon();\n } catch {}\n try {\n await wasm.cleanupInactiveEntries(dbName);\n } catch {}\n const sizeAfter = imported ? sizeBefore : await wasm.dbDirectorySize(dbName);\n return {\n sizeBefore,\n sizeAfter,\n reclaimedBytes: Math.max(0, sizeBefore - sizeAfter),\n durationMs: performance.now() - start\n };\n } catch (error) {\n if (!published) {\n this.committedIndexes = null;\n this.committedStoreCompression = null;\n try {\n rebuiltEngine?.abandon();\n } catch {}\n if (generationName !== null && wasm !== null) {\n // Cleanup requires proof that the target generation is inactive.\n const active = await readActiveGenerationOrNull(wasm, dbName);\n if (active !== undefined && active !== generationName) {\n try {\n await wasm.cleanupInactiveEntries(dbName);\n } catch {}\n }\n }\n }\n throw remapError(error);\n } finally {\n this.maintenanceOperation = null;\n }\n }\n /**\n * Returns null when no recovery is needed. A recovery attempt invalidates\n * all open transactions, even if recovery fails.\n */\n private recoverEngineIfNeeded(): { pendingTxid: number | null; pendingCommitted: boolean } | null {\n const engine = this.engine;\n if (!engine || !engine.needs_recovery()) {\n return null;\n }\n let report: WasmRecoveryReport;\n try {\n report = engine.recover();\n } catch (error) {\n throw remoteError(\n 'RecoveryRequiredError',\n `database ${this.dbName ?? ''} needs recovery and recovery failed: ${remapError(error).message}`\n );\n } finally {\n // Engine recovery discards transactions before storage I/O can fail.\n this.clearRuntimeCaches();\n }\n return {\n pendingTxid: fromOptionalWasmU64(report.pendingTxid),\n pendingCommitted: report.pendingCommitted === true\n };\n }\n private cleanupTxState(txId: number): void {\n for (const [cursorId, cursor] of this.primaryCursors) {\n if (cursor.txId === txId) {\n this.primaryCursors.delete(cursorId);\n try {\n this.engine?.close_scan_cursor(cursor.engineId);\n } catch {}\n }\n }\n this.txChanges.delete(txId);\n this.txModes.delete(txId);\n this.txIndexSchemas.delete(txId);\n this.txEnsuredRawStores.delete(txId);\n this.txIndexSchemaChanged.delete(txId);\n this.txStoreCompression.delete(txId);\n }\n private getOrCreateTrackedTxn(txId: number): TrackedTxnChanges {\n return getOrInsert(this.txChanges, txId, () => new Map<string, TrackedStoreChanges>());\n }\n private getOrCreateTrackedStore(txId: number, store: string): TrackedStoreChanges {\n return getOrInsert(this.getOrCreateTrackedTxn(txId), store, () => ({\n touched: false,\n storeLevel: null,\n keys: new Map()\n }));\n }\n private recordStoreLevelChange(txId: number, store: string, kind: 'clear' | 'drop'): void {\n if (isInternalStoreName(store)) {\n return;\n }\n const trackedStore = this.getOrCreateTrackedStore(txId, store);\n trackedStore.touched = true;\n trackedStore.storeLevel = kind;\n // The clear/drop event replaces earlier key changes.\n trackedStore.keys.clear();\n }\n private recordPutChange(txId: number, store: string, key: Uint8Array, baselineExists: boolean): void {\n this.recordKeyChange(txId, store, key, baselineExists, 'put');\n }\n private recordPutChanges(\n txId: number,\n store: string,\n entries: Array<[Uint8Array, Uint8Array]>,\n baselines: boolean[]\n ): void {\n if (isInternalStoreName(store)) {\n return;\n }\n const trackedStore = this.getOrCreateTrackedStore(txId, store);\n trackedStore.touched = true;\n const count = Math.min(entries.length, baselines.length);\n for (let i = 0; i < count; i += 1) {\n this.setTrackedKeyChange(trackedStore, entries[i][0], baselines[i], 'put');\n }\n }\n private recordPutKeyChanges(\n txId: number,\n store: string,\n keys: Uint8Array[],\n baselines: ArrayLike<boolean | number>\n ): void {\n if (isInternalStoreName(store)) {\n return;\n }\n const trackedStore = this.getOrCreateTrackedStore(txId, store);\n trackedStore.touched = true;\n const count = Math.min(keys.length, baselines.length);\n for (let i = 0; i < count; i += 1) {\n this.setTrackedKeyChange(trackedStore, keys[i], baselines[i] === true || baselines[i] === 1, 'put');\n }\n }\n private recordDeleteChange(txId: number, store: string, key: Uint8Array, deleted: boolean): void {\n if (deleted) {\n this.recordKeyChange(txId, store, key, true, 'delete');\n }\n }\n private recordKeyChange(\n txId: number,\n store: string,\n key: Uint8Array,\n baselineExists: boolean,\n finalKind: DbChange['kind']\n ): void {\n if (isInternalStoreName(store)) {\n return;\n }\n const trackedStore = this.getOrCreateTrackedStore(txId, store);\n trackedStore.touched = true;\n this.setTrackedKeyChange(trackedStore, key, baselineExists, finalKind);\n }\n private setTrackedKeyChange(\n trackedStore: TrackedStoreChanges,\n key: Uint8Array,\n baselineExists: boolean,\n finalKind: DbChange['kind']\n ): void {\n const keyId = bytesToHex(key);\n const existing = trackedStore.keys.get(keyId);\n trackedStore.keys.set(keyId, {\n key: existing?.key ?? key.slice(),\n baselineExists: existing?.baselineExists ?? baselineExists,\n finalKind\n });\n }\n private markStoreTouched(txId: number, store: string): void {\n if (isInternalStoreName(store)) {\n return;\n }\n this.getOrCreateTrackedStore(txId, store).touched = true;\n }\n private recordBatchOutcomes(\n txId: number,\n store: string,\n ops: ReadonlyArray<BatchOp | PackedBatchOpKey>,\n outcomes: Array<WasmBatchOutcome>\n ): void {\n for (let i = 0; i < outcomes.length && i < ops.length; i += 1) {\n const op = ops[i];\n const outcome = outcomes[i];\n if (op.kind === 'put' && outcome.kind === 'put') {\n this.recordPutChange(txId, store, op.key, outcome.baselineExists);\n } else if (op.kind === 'delete' && outcome.kind === 'delete') {\n this.recordDeleteChange(txId, store, op.key, outcome.deleted);\n }\n }\n }\n private finalizeTrackedChanges(tracked: TrackedTxnChanges): StoreChangeSet[] {\n const stores: StoreChangeSet[] = [];\n for (const [store, trackedStore] of tracked) {\n if (!trackedStore.touched || isInternalStoreName(store)) {\n continue;\n }\n const changes: DbChange[] = [];\n if (trackedStore.storeLevel !== null) {\n changes.push({ key: new Uint8Array(0), kind: trackedStore.storeLevel });\n }\n for (const change of trackedStore.keys.values()) {\n if (change.finalKind === 'delete' && !change.baselineExists) {\n continue;\n }\n changes.push({\n key: change.key,\n kind: change.finalKind\n });\n }\n stores.push({ store, changes });\n }\n return stores;\n }\n private rollbackAllTransactions(\n options: {\n allowDuringMaintenance?: boolean;\n } = {}\n ): void {\n if (!this.engine || this.txChanges.size === 0) {\n this.clearTxCaches();\n return;\n }\n const txIds = Array.from(this.txChanges.keys());\n for (const txId of txIds) {\n try {\n this.withEngine((engine) => engine.rollback_tx(toWasmU64(txId)), options);\n } finally {\n this.cleanupTxState(txId);\n }\n }\n }\n private currentStoreNames(): string[] {\n return this.allRawStoreNames().filter((store) => !isInternalStoreName(store));\n }\n private allRawStoreNames(): string[] {\n return this.withEngine((engine) => engine.list_stores()) as string[];\n }\n private loadCommittedStoreCompression(): ReadonlyMap<string, CompressionOption> {\n if (this.committedStoreCompression) {\n return this.committedStoreCompression;\n }\n const rows = this.withEngine((engine) => engine.list_store_configs()) as Array<{\n name: string;\n flags: number | bigint;\n }>;\n const loaded = new Map<string, CompressionOption>();\n for (const row of rows) {\n if (typeof row.name !== 'string') {\n throw remoteError('CorruptionError', 'invalid store config row: missing name');\n }\n const flags = typeof row.flags === 'bigint' ? Number(row.flags) : row.flags;\n if (typeof flags !== 'number' || !Number.isSafeInteger(flags) || flags < 0) {\n throw remoteError('CorruptionError', `invalid store flags for ${row.name}`);\n }\n loaded.set(row.name, compressionFromStoreFlags(flags));\n }\n this.committedStoreCompression = loaded;\n return loaded;\n }\n private ensureTxStoreCompression(txId: number): Map<string, CompressionOption> {\n const snapshot = this.txStoreCompression.get(txId);\n if (snapshot?.owned) {\n return snapshot.values;\n }\n const values = new Map(snapshot?.values);\n this.txStoreCompression.set(txId, { owned: true, values });\n return values;\n }\n private recordStoreCompressionCreate(txId: number, store: string, compression: CompressionOption): void {\n if (isInternalStoreName(store)) {\n return;\n }\n this.ensureTxStoreCompression(txId).set(store, compression);\n }\n private recordStoreCompressionDrop(txId: number, store: string): void {\n if (isInternalStoreName(store)) {\n return;\n }\n this.ensureTxStoreCompression(txId).delete(store);\n }\n private storeCompressionForTx(txId: number, store: string): CompressionOption {\n if (isInternalStoreName(store)) {\n return false;\n }\n const snapshot = this.txStoreCompression.get(txId);\n if (snapshot) {\n return snapshot.values.get(store) ?? false;\n }\n return this.loadCommittedStoreCompression().get(store) ?? false;\n }\n private async encodeEntriesForWrite(\n txId: number,\n store: string,\n entries: Array<[Uint8Array, Uint8Array]>\n ): Promise<Array<[Uint8Array, Uint8Array]>> {\n if (isInternalStoreName(store)) {\n return entries;\n }\n const compression = this.storeCompressionForTx(txId, store);\n if (compression === false) {\n return entries;\n }\n const storedEntries: Array<[Uint8Array, Uint8Array]> = [];\n for (const [key, value] of entries) {\n storedEntries.push([key, await encodeStoreValueRecord(value, compression)]);\n }\n return storedEntries;\n }\n private async encodePackedEntriesForWrite(\n txId: number,\n store: string,\n items: Uint8Array[],\n keys: Uint8Array[]\n ): Promise<Uint8Array> {\n const records = new Array<PreparedPutValue>(items.length / 2);\n for (let index = 0; index < records.length; index += 1) {\n const value = this.preparePutValue(txId, store, items[index * 2 + 1]);\n records[index] = value instanceof Promise ? await value : value;\n }\n return this.packPreparedPutEntries(keys, records);\n }\n private preparePutValue(txId: number, store: string, value: Uint8Array): PreparedPutValue | Promise<Uint8Array> {\n const compression = this.storeCompressionForTx(txId, store);\n return compression === 'snappy' || compression === false\n ? prepareFastStoreValueRecord(value, compression)\n : encodeStoreValueRecord(value, compression);\n }\n private packPreparedPutEntries(keys: Uint8Array[], records: PreparedPutValue[]): Uint8Array {\n let total = 4 + keys.length * 8;\n for (let index = 0; index < keys.length; index += 1) {\n total += keys[index].byteLength + records[index].byteLength;\n if (total > MAX_PACKED_BYTES) {\n throw remoteError('WorkerProtocolError', 'compressed packed putMany exceeds the u32 byte limit');\n }\n }\n const bytes = new Uint8Array(total);\n const view = new DataView(bytes.buffer);\n view.setUint32(0, keys.length * 2, true);\n let offset = 4 + keys.length * 8;\n for (let index = 0; index < records.length; index += 1) {\n const key = keys[index];\n const record = records[index];\n view.setUint32(4 + index * 8, key.byteLength, true);\n view.setUint32(8 + index * 8, record.byteLength, true);\n bytes.set(key, offset);\n offset += key.byteLength;\n if (record instanceof Uint8Array) {\n bytes.set(record, offset);\n offset += record.byteLength;\n } else {\n offset = writePreparedStoreValueRecord(record, bytes, offset);\n }\n }\n return bytes;\n }\n private async putIndexedMany(\n txId: number,\n store: string,\n items: Uint8Array[],\n defs: NormalizedIndexDef[],\n options: PutOptions\n ): Promise<void> {\n let keys: Uint8Array[] = [];\n let values: PreparedPutValue[] = [];\n let indexOps: IndexedPutOp[][] = [];\n let bytes = 4;\n const pendingPrimaries = new Set<string>();\n const pendingUniqueKeys = new Set<string>();\n const flush = (): void => {\n if (keys.length === 0) {\n return;\n }\n const batchKeys = keys;\n const batchValues = values;\n const batchOps = indexOps;\n // Detach the plan so a failed flush cannot be retried by the error handler.\n keys = [];\n values = [];\n indexOps = [];\n bytes = 4;\n pendingPrimaries.clear();\n pendingUniqueKeys.clear();\n const packet = this.packPreparedPutEntries(batchKeys, batchValues);\n let baselines: Uint8Array;\n try {\n baselines = this.withEngine((engine) =>\n engine.put_many_indexed_packed(toWasmU64(txId), store, packet, batchOps, toWasmPutOptions(options))\n );\n } catch (error) {\n const partial = partialBooleanOutcomes(error);\n if (partial.length > 0) {\n this.recordPutKeyChanges(txId, store, batchKeys, partial);\n }\n throw error;\n }\n if (baselines.length !== batchKeys.length) {\n throw remoteError(\n 'InternalError',\n `put_many_indexed_packed outcome count mismatch: ${baselines.length} != ${batchKeys.length}`\n );\n }\n this.recordPutKeyChanges(txId, store, batchKeys, baselines);\n };\n for (let index = 0; index < items.length / 2; index += 1) {\n const key = items[index * 2];\n const value = items[index * 2 + 1];\n const primaryToken = bytesToHex(key);\n if (pendingPrimaries.has(primaryToken)) {\n flush();\n }\n try {\n const oldValue = await this.readStoreValue(txId, store, key);\n const oldKeyFor = oldValue === null ? null : createIndexKeyExtractor(oldValue);\n const newKeyFor = createIndexKeyExtractor(value);\n const plans = defs.map((def) => ({\n def,\n oldLogicalKey: oldKeyFor === null ? null : oldKeyFor(def),\n newLogicalKey: newKeyFor(def),\n newPhysicalKey: null as Uint8Array | null\n }));\n if (\n plans.some(\n (plan) =>\n plan.def.unique &&\n plan.newLogicalKey !== null &&\n pendingUniqueKeys.has(`${plan.def.internalStore}:${bytesToHex(plan.newLogicalKey)}`)\n )\n ) {\n // Reused unique keys must observe all earlier primary and index writes.\n flush();\n index -= 1;\n continue;\n }\n this.ensureInternalStoresForDefinitions(txId, defs);\n for (const plan of plans) {\n if (plan.newLogicalKey === null) {\n continue;\n }\n plan.newPhysicalKey = this.buildIndexEntryKey(plan.def, plan.newLogicalKey, key);\n if (plan.oldLogicalKey === null || !bytesEqual(plan.oldLogicalKey, plan.newLogicalKey)) {\n await this.assertUniqueIndexAvailability(txId, plan.def, plan.newLogicalKey, key);\n }\n }\n const preparedValue = this.preparePutValue(txId, store, value);\n const storedValue = preparedValue instanceof Promise ? await preparedValue : preparedValue;\n const ops: IndexedPutOp[] = [];\n for (const plan of plans) {\n if (\n plan.oldLogicalKey !== null &&\n (plan.newLogicalKey === null || !bytesEqual(plan.oldLogicalKey, plan.newLogicalKey))\n ) {\n ops.push({\n store: plan.def.internalStore,\n kind: 'delete',\n key: encodeIndexEntryKey(plan.oldLogicalKey, key)\n });\n }\n }\n for (const plan of plans) {\n if (plan.newPhysicalKey !== null) {\n ops.push({ store: plan.def.internalStore, kind: 'put', key: plan.newPhysicalKey });\n }\n if (plan.def.unique) {\n for (const logicalKey of [plan.oldLogicalKey, plan.newLogicalKey]) {\n if (logicalKey !== null) {\n pendingUniqueKeys.add(`${plan.def.internalStore}:${bytesToHex(logicalKey)}`);\n }\n }\n }\n }\n keys.push(key);\n values.push(storedValue);\n indexOps.push(ops);\n bytes += 8 + key.byteLength + storedValue.byteLength;\n for (const op of ops) {\n bytes += op.key.byteLength;\n }\n pendingPrimaries.add(primaryToken);\n } catch (error) {\n flush();\n throw error;\n }\n if (options.ttl !== undefined || keys.length >= INDEX_PUT_BATCH_ROWS || bytes >= INDEX_PUT_BATCH_BYTES) {\n flush();\n }\n }\n flush();\n }\n private async encodeBatchOpsForWrite(txId: number, store: string, ops: Array<BatchOp>): Promise<Array<BatchOp>> {\n if (isInternalStoreName(store)) {\n return ops;\n }\n const compression = this.storeCompressionForTx(txId, store);\n if (compression === false) {\n return ops;\n }\n const storedOps: Array<BatchOp> = [];\n for (const op of ops) {\n storedOps.push(\n op.kind === 'put'\n ? { kind: 'put', key: op.key, value: await encodeStoreValueRecord(op.value, compression) }\n : op\n );\n }\n return storedOps;\n }\n private async encodeStoreValueForWrite(txId: number, store: string, value: Uint8Array): Promise<Uint8Array> {\n if (isInternalStoreName(store)) {\n return value;\n }\n return encodeStoreValueRecord(value, this.storeCompressionForTx(txId, store));\n }\n private async decodeStoreValue(txId: number, store: string, value: Uint8Array): Promise<Uint8Array> {\n if (isInternalStoreName(store)) {\n return value;\n }\n const compression = this.storeCompressionForTx(txId, store);\n if (compression === false) {\n return value;\n }\n return decodeStoreValueRecord(value, { strict: true });\n }\n private async decodeStoreValueForFeed(store: string, value: Uint8Array): Promise<Uint8Array> {\n if (isInternalStoreName(store)) {\n return value;\n }\n const compression = this.loadCommittedStoreCompression().get(store) ?? false;\n return decodeStoreValueRecord(value, { strict: compression !== false });\n }\n private async readStoreValue(txId: number, store: string, key: Uint8Array): Promise<Uint8Array | null> {\n const value = this.readRawValue(txId, store, key);\n return value === null ? null : this.decodeStoreValue(txId, store, value);\n }\n private async readStoreScan(txId: number, store: string, range: Range): Promise<ScanItem[]> {\n const rows = this.readRawScan(txId, store, range);\n if (isInternalStoreName(store) || this.storeCompressionForTx(txId, store) === false) {\n return rows;\n }\n const values = rows.map((row) => row.value);\n await this.decodeStoreValues(txId, store, values);\n for (let index = 0; index < rows.length; index += 1) {\n rows[index].value = values[index];\n }\n return rows;\n }\n private async decodeStoreValues(\n txId: number,\n store: string,\n values: Array<Uint8Array | null>\n ): Promise<Array<Uint8Array | null>> {\n const state = { next: 0, failed: false, failure: undefined as unknown };\n const decodeNext = async (): Promise<void> => {\n while (!state.failed && state.next < values.length) {\n const index = state.next++;\n const value = values[index];\n if (value === null) {\n continue;\n }\n try {\n values[index] = await this.decodeStoreValue(txId, store, value);\n } catch (error) {\n if (!state.failed) {\n state.failed = true;\n state.failure = error;\n }\n }\n }\n };\n // Drain active decoders before reporting the first observed failure.\n await Promise.all(Array.from({ length: Math.min(COMPRESSED_READ_CONCURRENCY, values.length) }, decodeNext));\n if (state.failed) {\n throw state.failure;\n }\n return values;\n }\n private indexesForStoreInTx(txId: number, store: string): NormalizedIndexDef[] {\n // Cache by immutable schema array so readers keep their original lookup\n // after another transaction publishes a replacement.\n const schema = this.indexSchemaForTx(txId);\n let byStore = this.indexesBySchema.get(schema);\n if (!byStore) {\n byStore = new Map<string, NormalizedIndexDef[]>();\n for (const def of schema) {\n const defs = byStore.get(def.store);\n if (defs) {\n defs.push(def);\n } else {\n byStore.set(def.store, [def]);\n }\n }\n this.indexesBySchema.set(schema, byStore);\n }\n return byStore.get(store) ?? [];\n }\n private resolveIndexDefinition(txId: number, store: string, indexName: string): NormalizedIndexDef {\n if (!this.rawStoreExistsInTx(txId, store)) {\n throw remoteError('StoreNotFoundError', `store not found: ${store}`);\n }\n const def = findIndexDefinition(this.indexesForStoreInTx(txId, store), store, indexName);\n if (!def) {\n throw remoteError('IndexNotFoundError', `index not found: ${store}.${indexName}`);\n }\n return def;\n }\n private indexSchemaForTx(txId: number): NormalizedIndexDef[] {\n const override = this.txIndexSchemas.get(txId);\n if (override) {\n return override;\n }\n if (this.committedIndexes) {\n return this.committedIndexes;\n }\n const loaded = this.readIndexSchemaInTx(txId);\n this.committedIndexes = cloneNormalizedIndexDefinitions(loaded);\n return this.committedIndexes;\n }\n private loadCommittedIndexSchema(): NormalizedIndexDef[] {\n if (this.committedIndexes) {\n return this.committedIndexes;\n }\n const txId = fromWasmU64(this.withEngine((engine) => engine.begin_tx('readonly')));\n try {\n const loaded = this.readIndexSchemaInTx(txId);\n this.committedIndexes = cloneNormalizedIndexDefinitions(loaded);\n return this.committedIndexes;\n } finally {\n this.withEngine((engine) => engine.rollback_tx(toWasmU64(txId)));\n }\n }\n private readIndexSchemaInTx(txId: number): NormalizedIndexDef[] {\n if (!this.rawStoreExistsInTx(txId, INDEX_METADATA_STORE)) {\n return [];\n }\n const rows = this.readRawScan(txId, INDEX_METADATA_STORE, EMPTY_RANGE);\n const defs = rows.map((row) => decodeIndexMetadataValue(row.value));\n defs.sort(compareNormalizedIndexDefinitions);\n return defs;\n }\n private rawStoreExistsInTx(txId: number, store: string): boolean {\n try {\n this.readRawScan(txId, store, { limit: 0 });\n return true;\n } catch (error) {\n if (isNamedError(error, 'StoreNotFoundError')) {\n return false;\n }\n throw error;\n }\n }\n private ensureRawStore(txId: number, store: string): void {\n const cacheable = this.txModes.get(txId) === 'readwrite';\n if (cacheable && this.txEnsuredRawStores.get(txId)?.has(store)) {\n return;\n }\n this.ignoreNamedError('StoreExistsError', () => {\n this.withEngine((engine) => engine.create_store(toWasmU64(txId), store));\n });\n if (cacheable) {\n getOrInsert(this.txEnsuredRawStores, txId, () => new Set<string>()).add(store);\n }\n }\n private clearRawStoreIfExists(txId: number, store: string): void {\n try {\n this.withEngine((engine) => engine.clear_store(toWasmU64(txId), store));\n } catch (error) {\n if (!isNamedError(error, 'StoreNotFoundError')) {\n throw error;\n }\n this.txEnsuredRawStores.get(txId)?.delete(store);\n }\n }\n private dropRawStoreIfExists(txId: number, store: string): void {\n this.txEnsuredRawStores.get(txId)?.delete(store);\n this.ignoreNamedError('StoreNotFoundError', () => {\n this.withEngine((engine) => engine.drop_store(toWasmU64(txId), store));\n });\n }\n private ensureInternalStoresForDefinitions(txId: number, defs: ReadonlyArray<NormalizedIndexDef>): void {\n for (const def of defs) {\n this.ensureRawStore(txId, def.internalStore);\n }\n }\n private ensureInternalStoresForStore(txId: number, store: string): void {\n this.ensureInternalStoresForDefinitions(txId, this.indexesForStoreInTx(txId, store));\n }\n private readRawValue(txId: number, store: string, key: Uint8Array): Uint8Array | null {\n const value = this.withEngine((engine) => engine.get(toWasmU64(txId), store, key));\n return value === null ? null : normalizeWasmBytes(value);\n }\n private readRawScan(txId: number, store: string, range: Range): ScanItem[] {\n const rows = this.withEngine((engine) => engine.scan(toWasmU64(txId), store, toWasmRange(range))) as ScanItem[];\n // The binding returns a fresh array and row objects, so normalization\n // can update them without affecting another caller.\n for (const row of rows) {\n row.key = normalizeWasmBytes(row.key);\n row.value = normalizeWasmBytes(row.value);\n }\n return rows;\n }\n private readIndexKeyScan(txId: number, store: string, range: Range): ScanItem[] {\n if (\n typeof this.engine?.open_scan_cursor !== 'function' ||\n typeof this.engine?.scan_cursor_next !== 'function' ||\n typeof this.engine?.close_scan_cursor !== 'function'\n ) {\n return this.readRawScan(txId, store, range);\n }\n const maxRows = range.limit ?? INDEX_SCAN_RAW_CHUNK_ROWS;\n const maxBytes = 4 + maxRows * (8 + MAX_ENGINE_KEY_BYTES);\n const cursorId = this.withEngine((engine) =>\n engine.open_scan_cursor(toWasmU64(txId), store, toWasmRange(range), true)\n );\n try {\n const page = this.withEngine((engine) => engine.scan_cursor_next(cursorId, maxRows, maxBytes));\n const packet = normalizeWasmBytes(page.packet);\n const rows = unpackPackedScanRows(packet);\n if (\n rows.length !== page.rowCount ||\n rows.length > maxRows ||\n packet.byteLength > maxBytes ||\n rows.some((row) => row.value.byteLength !== 0)\n ) {\n throw remoteError('CorruptionError', 'index key cursor returned an invalid page');\n }\n return rows;\n } finally {\n this.withEngine((engine) => engine.close_scan_cursor(cursorId));\n }\n }\n private putRawValue(txId: number, store: string, key: Uint8Array, value: Uint8Array): void {\n this.withEngine((engine) => engine.put(toWasmU64(txId), store, key, value));\n }\n private putIndexEntry(txId: number, def: NormalizedIndexDef, physicalKey: Uint8Array, value: Uint8Array): void {\n if (typeof this.engine?.put_index_entry_checked === 'function') {\n const primaryKey = decodeIndexEntryKey(physicalKey).primaryKey;\n const state = this.readNativeValueState(txId, def.store, primaryKey);\n if (state?.revisionKnown) {\n this.withEngine((engine) =>\n engine.put_index_entry_checked!(\n toWasmU64(txId),\n def.store,\n def.internalStore,\n primaryKey,\n physicalKey,\n state.revisionEpoch,\n state.revisionOrdinal\n )\n );\n return;\n }\n }\n this.putRawValue(txId, def.internalStore, physicalKey, value);\n }\n private readNativeValueState(txId: number, store: string, key: Uint8Array): NativeValueState | null {\n if (typeof this.engine?.get_many_value_states !== 'function') {\n return null;\n }\n try {\n const keys = new Uint8Array(8 + key.byteLength);\n const keyView = new DataView(keys.buffer);\n keyView.setUint32(0, 1, true);\n keyView.setUint32(4, key.byteLength, true);\n keys.set(key, 8);\n const packet = normalizeWasmBytes(\n this.withEngine((engine) => engine.get_many_value_states!(toWasmU64(txId), store, keys))\n );\n return this.decodeNativeValueStates(packet, 1)?.[0] ?? null;\n } catch {\n return null;\n }\n }\n private packNativeKeys(keys: Uint8Array[]): Uint8Array {\n let total = 4 + keys.length * 4;\n for (const key of keys) {\n total += key.byteLength;\n }\n const packet = new Uint8Array(total);\n const view = new DataView(packet.buffer);\n view.setUint32(0, keys.length, true);\n let offset = 4 + keys.length * 4;\n for (let index = 0; index < keys.length; index += 1) {\n const key = keys[index];\n view.setUint32(4 + index * 4, key.byteLength, true);\n packet.set(key, offset);\n offset += key.byteLength;\n }\n return packet;\n }\n private decodeNativeValueStates(packet: Uint8Array, count: number): NativeValueState[] | null {\n if (packet.byteLength !== 4 + count * 32) {\n return null;\n }\n const view = new DataView(packet.buffer, packet.byteOffset, packet.byteLength);\n if (view.getUint32(0, true) !== count) {\n return null;\n }\n const states = new Array<NativeValueState>(count);\n for (let index = 0; index < count; index += 1) {\n const offset = 4 + index * 32;\n const flags = view.getUint32(offset, true);\n const revisionEpoch = view.getBigUint64(offset + 12, true);\n const revisionOrdinal = view.getBigUint64(offset + 20, true);\n if (\n (flags & ~7) !== 0 ||\n (flags & 3) === 3 ||\n ((flags & 4) !== 0 && ((flags & 3) === 0 || revisionEpoch === 0n || revisionOrdinal === 0n))\n ) {\n return null;\n }\n states[index] = {\n live: (flags & 1) !== 0,\n expired: (flags & 2) !== 0,\n revisionKnown: (flags & 4) !== 0,\n expiresAt: view.getBigUint64(offset + 4, true),\n revisionEpoch,\n revisionOrdinal,\n maxValueBytes: view.getUint32(offset + 28, true)\n };\n }\n return states;\n }\n private inspectIndexedValue(\n txId: number,\n def: NormalizedIndexDef,\n physicalKey: Uint8Array,\n primaryKey: Uint8Array\n ): 'missing' | 'trusted' | 'unknown' {\n const primary = this.readNativeValueState(txId, def.store, primaryKey);\n if (primary === null) {\n return 'unknown';\n }\n if (!primary.live) {\n if (primary.expired && this.txModes.get(txId) === 'readwrite') {\n const live = this.withEngine((engine) => engine.has(toWasmU64(txId), def.store, primaryKey));\n if (live) {\n return 'unknown';\n }\n }\n return 'missing';\n }\n if (!primary.revisionKnown) {\n return 'unknown';\n }\n const index = this.readNativeValueState(txId, def.internalStore, physicalKey);\n // Native managed writes copy the primary revision. Raw writes receive a new revision.\n return index?.live &&\n index.revisionKnown &&\n index.revisionEpoch === primary.revisionEpoch &&\n index.revisionOrdinal === primary.revisionOrdinal\n ? 'trusted'\n : 'unknown';\n }\n private deleteIndexEntryIfPresent(\n txId: number,\n def: NormalizedIndexDef,\n logicalKey: Uint8Array,\n primaryKey: Uint8Array\n ): void {\n const physicalKey = this.buildIndexEntryKey(def, logicalKey, primaryKey);\n this.ignoreNamedError('StoreNotFoundError', () => {\n this.withEngine((engine) => engine.delete(toWasmU64(txId), def.internalStore, physicalKey));\n });\n }\n private buildIndexEntryKey(def: NormalizedIndexDef, logicalKey: Uint8Array, primaryKey: Uint8Array): Uint8Array {\n const physicalKey = encodeIndexEntryKey(logicalKey, primaryKey);\n if (physicalKey.byteLength > MAX_ENGINE_KEY_BYTES) {\n throw remoteError('KeyTooLargeError', `index key too large for ${def.store}.${def.name}`);\n }\n return physicalKey;\n }\n private async assertUniqueIndexAvailability(\n txId: number,\n def: NormalizedIndexDef,\n logicalKey: Uint8Array,\n primaryKey: Uint8Array\n ): Promise<void> {\n if (!def.unique) {\n return;\n }\n const physical = indexKeyExactRange(logicalKey);\n let cursor: Uint8Array | null = null;\n let chunkLimit = 1;\n for (;;) {\n const range: Range = { ...physical, limit: chunkLimit };\n if (cursor !== null) {\n range.gt = cursor;\n delete range.gte;\n }\n // Stop at the first live conflict. Grow bounded chunks only while\n // skipping stale rows so unrelated tail errors stay unobserved.\n const rows = this.readIndexKeyScan(txId, def.internalStore, range);\n for (const row of rows) {\n cursor = row.key;\n const decoded = decodeIndexEntryKey(row.key);\n if (bytesEqual(decoded.primaryKey, primaryKey)) {\n continue;\n }\n const state = this.inspectIndexedValue(txId, def, row.key, decoded.primaryKey);\n if (state === 'missing') {\n this.cleanupStaleIndexRow(txId, def, row.key);\n continue;\n }\n if (state === 'trusted') {\n throw remoteError(\n 'UniqueIndexConstraintError',\n `unique index constraint violation on ${def.store}.${def.name}`\n );\n }\n // Keep TTL cleanup and document errors in index row order.\n const value = await this.readStoreValue(txId, def.store, decoded.primaryKey);\n if (value === null) {\n this.cleanupStaleIndexRow(txId, def, row.key);\n continue;\n }\n const currentLogicalKey = extractLogicalIndexKey(def, value);\n if (currentLogicalKey === null || !bytesEqual(currentLogicalKey, logicalKey)) {\n this.cleanupStaleIndexRow(txId, def, row.key);\n continue;\n }\n throw remoteError(\n 'UniqueIndexConstraintError',\n `unique index constraint violation on ${def.store}.${def.name}`\n );\n }\n if (rows.length < chunkLimit) {\n return;\n }\n chunkLimit = Math.min(INDEX_SCAN_RAW_CHUNK_ROWS, chunkLimit * 2);\n }\n }\n /**\n * Resumes after a physical index key in the scan direction. Bounded raw\n * chunks prevent stale entries from forcing the whole range into memory.\n * The output limit counts only live rows.\n */\n private async loadVisibleIndexPage(\n txId: number,\n def: NormalizedIndexDef,\n range: Range,\n cursor: Uint8Array | null,\n limit: number,\n maxBytes: number = INDEX_SCAN_PAGE_BYTES\n ): Promise<IndexScanPage> {\n const { limit: _ignored, ...withoutLimit } = range;\n const physical = indexRangeToPhysicalRange(withoutLimit);\n const reverse = physical.reverse === true;\n let resumeAfter = cursor;\n const visible: ScanItem[] = [];\n let outputBytes = 4;\n // Start with the requested row count. Grow wholly stale chunks\n // geometrically to avoid one scan per expired row at small limits.\n let staleChunkFloor = 1;\n for (;;) {\n const chunkLimit = Math.min(INDEX_SCAN_RAW_CHUNK_ROWS, Math.max(limit - visible.length, staleChunkFloor));\n const chunkRange: Range = { ...physical, limit: chunkLimit };\n if (resumeAfter !== null) {\n if (reverse) {\n delete chunkRange.lte;\n chunkRange.lt = resumeAfter;\n } else {\n delete chunkRange.gte;\n chunkRange.gt = resumeAfter;\n }\n }\n let rawRows: ScanItem[];\n try {\n rawRows = this.readIndexKeyScan(txId, def.internalStore, chunkRange);\n } catch (error) {\n if (isNamedError(error, 'StoreNotFoundError')) {\n return { rows: [], cursor: null };\n }\n throw error;\n }\n const visibleBefore = visible.length;\n let batchStart = 0;\n let batchEnd = 0;\n let batch: ReturnType<DbWorker['readIndexPrimaryValues']> = null;\n for (let index = 0; index < rawRows.length; index += 1) {\n if (index === batchEnd) {\n batchStart = index;\n batch = this.readIndexPrimaryValues(\n txId,\n def,\n rawRows,\n index,\n Math.min(rawRows.length, index + limit - visible.length),\n maxBytes - outputBytes\n );\n batchEnd = index + (batch?.entries.length ?? 1);\n }\n const row = rawRows[index];\n const resolved = batch\n ? await this.resolveVisibleIndexedValue(\n txId,\n def,\n row.key,\n batch.entries[index - batchStart],\n batch.values[index - batchStart],\n batch.trusted[index - batchStart]\n )\n : await this.resolveVisibleIndexedRow(txId, def, row.key);\n if (batch !== null) {\n batch.values[index - batchStart] = null;\n }\n if (!resolved) {\n resumeAfter = row.key;\n continue;\n }\n const nextBytes = outputBytes + 8 + resolved.key.byteLength + resolved.value.byteLength;\n if (nextBytes > maxBytes) {\n if (visible.length === 0) {\n throw remoteError('ValueTooLargeError', 'indexed scan row exceeds maxBytes');\n }\n if (resumeAfter === null) {\n throw remoteError('InternalError', 'indexed scan lost its continuation key');\n }\n // The next page must retry this live row.\n return { rows: visible, cursor: resumeAfter.slice() };\n }\n visible.push(resolved);\n outputBytes = nextBytes;\n resumeAfter = row.key;\n if (visible.length >= limit) {\n return { rows: visible, cursor: row.key.slice() };\n }\n }\n if (rawRows.length < chunkLimit) {\n return { rows: visible, cursor: null };\n }\n staleChunkFloor =\n visible.length === visibleBefore ? Math.min(INDEX_SCAN_RAW_CHUNK_ROWS, chunkLimit * 2) : 1;\n }\n }\n private readIndexPrimaryValues(\n txId: number,\n def: NormalizedIndexDef,\n rows: ScanItem[],\n start: number,\n end: number,\n remainingBytes: number\n ): { entries: DecodedIndexEntryKey[]; values: Array<Uint8Array | null>; trusted: boolean[] } | null {\n if (\n this.txModes.get(txId) !== 'readonly' ||\n end - start <= 1 ||\n (typeof this.engine?.get_many_value_sizes !== 'function' &&\n typeof this.engine?.get_many_value_states !== 'function')\n ) {\n return null;\n }\n let entries: DecodedIndexEntryKey[];\n let values: Array<Uint8Array | null>;\n let trusted: boolean[];\n let loaded: Array<Uint8Array | null>;\n let selectedIndices: number[];\n try {\n entries = rows.slice(start, end).map((row) => decodeIndexEntryKey(row.key));\n const packedKeys = this.packNativeKeys(entries.map((entry) => entry.primaryKey));\n let primaryStates: NativeValueState[] | null = null;\n let indexStates: NativeValueState[] | null = null;\n let sizes: Uint32Array;\n if (typeof this.engine?.get_many_value_states === 'function') {\n primaryStates = this.decodeNativeValueStates(\n normalizeWasmBytes(\n this.withEngine((engine) =>\n engine.get_many_value_states!(toWasmU64(txId), def.store, packedKeys)\n )\n ),\n entries.length\n );\n if (primaryStates === null) {\n return null;\n }\n sizes = Uint32Array.from(primaryStates, (state) =>\n state.live ? state.maxValueBytes : MAX_PACKED_BYTES\n );\n if (primaryStates.some((state) => state.live && state.revisionKnown)) {\n const indexKeys = this.packNativeKeys(rows.slice(start, end).map((row) => row.key));\n indexStates = this.decodeNativeValueStates(\n normalizeWasmBytes(\n this.withEngine((engine) =>\n engine.get_many_value_states!(toWasmU64(txId), def.internalStore, indexKeys)\n )\n ),\n entries.length\n );\n if (indexStates === null) {\n return null;\n }\n }\n } else {\n sizes = this.withEngine((engine) =>\n engine.get_many_value_sizes!(toWasmU64(txId), def.store, packedKeys)\n );\n }\n if (sizes.length !== entries.length) {\n return null;\n }\n let selected = 0;\n for (const entry of entries) {\n const size = sizes[selected];\n if (!Number.isSafeInteger(size) || size < 0 || size > MAX_PACKED_BYTES) {\n return null;\n }\n const required = size === MAX_PACKED_BYTES ? 0 : 8 + entry.primaryKey.byteLength + size;\n if (required > remainingBytes) {\n break;\n }\n remainingBytes -= required;\n selected += 1;\n }\n if (selected <= 1) {\n return null;\n }\n // Native sizes bound body reads. Each document still requires index validation.\n entries.length = selected;\n trusted = new Array<boolean>(selected).fill(false);\n const selectedKeys: Uint8Array[] = [];\n selectedIndices = [];\n values = new Array<Uint8Array | null>(selected).fill(null);\n for (let index = 0; index < selected; index += 1) {\n const primary = primaryStates?.[index];\n if (primary === undefined || primary.live) {\n selectedKeys.push(entries[index].primaryKey);\n selectedIndices.push(index);\n }\n const proof = indexStates?.[index];\n trusted[index] = Boolean(\n primary?.live &&\n primary.revisionKnown &&\n proof?.live &&\n proof.revisionKnown &&\n primary.revisionEpoch === proof.revisionEpoch &&\n primary.revisionOrdinal === proof.revisionOrdinal\n );\n }\n loaded =\n selectedKeys.length === 0\n ? []\n : this.withEngine((engine) => engine.get_many(toWasmU64(txId), def.store, selectedKeys));\n } catch {\n // Row order preserves an earlier document error if a later preflight or body read fails.\n return null;\n }\n if (loaded.length !== selectedIndices.length) {\n throw outcomeCountMismatch('get_many', loaded.length, selectedIndices.length);\n }\n for (let index = 0; index < loaded.length; index += 1) {\n values[selectedIndices[index]] = loaded[index];\n loaded[index] = null;\n }\n return { entries, values, trusted };\n }\n private async resolveVisibleIndexedRow(\n txId: number,\n def: NormalizedIndexDef,\n physicalKey: Uint8Array\n ): Promise<ScanItem | null> {\n const decoded = decodeIndexEntryKey(physicalKey);\n const state = this.inspectIndexedValue(txId, def, physicalKey, decoded.primaryKey);\n if (state === 'missing') {\n this.cleanupStaleIndexRow(txId, def, physicalKey);\n return null;\n }\n const value = this.readRawValue(txId, def.store, decoded.primaryKey);\n return this.resolveVisibleIndexedValue(txId, def, physicalKey, decoded, value, state === 'trusted');\n }\n private async resolveVisibleIndexedValue(\n txId: number,\n def: NormalizedIndexDef,\n physicalKey: Uint8Array,\n decoded: DecodedIndexEntryKey,\n rawValue: Uint8Array | null,\n trusted: boolean = false\n ): Promise<ScanItem | null> {\n if (rawValue === null) {\n this.cleanupStaleIndexRow(txId, def, physicalKey);\n return null;\n }\n const value = await this.decodeStoreValue(txId, def.store, normalizeWasmBytes(rawValue));\n if (!trusted) {\n const currentLogicalKey = extractLogicalIndexKey(def, value);\n if (currentLogicalKey === null || !bytesEqual(currentLogicalKey, decoded.logicalKey)) {\n this.cleanupStaleIndexRow(txId, def, physicalKey);\n return null;\n }\n }\n return {\n key: decoded.primaryKey,\n value\n };\n }\n private cleanupStaleIndexRow(txId: number, def: NormalizedIndexDef, physicalKey: Uint8Array): void {\n if (this.txModes.get(txId) !== 'readwrite') {\n return;\n }\n try {\n this.withEngine((engine) => engine.delete(toWasmU64(txId), def.internalStore, physicalKey));\n } catch {}\n }\n private async loadWasm(): Promise<WasmModule> {\n if (!this.wasmReady) {\n this.wasmReady = this.options.loadWasm\n ? this.options.loadWasm()\n : (async () => {\n // Absolute URLs stay outside Vite's ?import transform, which rejects JS in /public.\n const moduleUrl = new URL('/engine/moyodb_engine.js', import.meta.url).href;\n const wasmUrl = new URL('/engine/moyodb_engine_bg.wasm', import.meta.url).href;\n const wasmModule = (await import(\n /* @vite-ignore */\n moduleUrl\n )) as WasmModule;\n await wasmModule.default({ module_or_path: wasmUrl });\n return wasmModule;\n })();\n }\n return this.wasmReady;\n }\n private withEngine<T>(\n fn: (engine: NonNullable<DbWorker['engine']>) => T,\n options: {\n allowDuringMaintenance?: boolean;\n } = {}\n ): T {\n if (this.maintenanceOperation && !options.allowDuringMaintenance) {\n this.ensureNotInMaintenance();\n }\n if (!this.engine) {\n throw remoteError('InternalError', 'engine is not open');\n }\n try {\n return fn(this.engine);\n } catch (err) {\n throw remapError(err);\n }\n }\n private ignoreNamedError(name: string, fn: () => void): void {\n try {\n fn();\n } catch (error) {\n if (isNamedError(error, name)) {\n return;\n }\n throw error;\n }\n }\n private clearTxCaches(): void {\n this.primaryCursors.clear();\n this.txChanges.clear();\n this.txModes.clear();\n this.txIndexSchemas.clear();\n this.txEnsuredRawStores.clear();\n this.txIndexSchemaChanged.clear();\n this.txStoreCompression.clear();\n }\n private clearRuntimeCaches(): void {\n this.clearTxCaches();\n this.committedIndexes = null;\n this.committedStoreCompression = null;\n }\n private async cleanupAfterFailedOpen(engine: WasmEngine | null): Promise<void> {\n try {\n engine?.abandon();\n } catch {}\n this.engine = null;\n this.clearRuntimeCaches();\n this.events?.close();\n this.events = null;\n if (this.lease) {\n try {\n await this.lease.release();\n } catch {}\n }\n this.lease = null;\n this.disposePersistenceBridge();\n this.dbName = null;\n this.openOptions = null;\n this.maintenanceOperation = null;\n }\n private disposePersistenceBridge(): void {\n this.persistenceBridge.close();\n }\n}\nfunction assertCapabilities(): void {\n if (typeof navigator.storage.getDirectory !== 'function') {\n throw remoteError('UnsupportedPlatformError', 'navigator.storage.getDirectory is unavailable');\n }\n if (typeof BroadcastChannel === 'undefined') {\n throw remoteError('UnsupportedPlatformError', 'BroadcastChannel is unavailable');\n }\n // Real database handle acquisition validates storage access. A shared\n // probe file adds I/O and can lock out otherwise independent databases.\n if (\n typeof FileSystemFileHandle === 'undefined' ||\n typeof FileSystemFileHandle.prototype.createSyncAccessHandle !== 'function'\n ) {\n throw remoteError('UnsupportedPlatformError', 'createSyncAccessHandle is unavailable');\n }\n}\nfunction assertSecureContext() {\n if (!self.isSecureContext) {\n throw remoteError('UnsupportedPlatformError', 'moyodb requires a secure context (HTTPS)');\n }\n}\nfunction remoteError(code: string, message: string): Error {\n const error = new Error(message);\n error.name = code;\n Object.defineProperty(error, 'code', {\n value: code,\n enumerable: true,\n configurable: true\n });\n return error;\n}\nfunction applyChangeFeedPolicy(engine: WasmEngine, settings: Required<ChangeFeedSettings>): void {\n const current = engine.change_feed_policy();\n const currentRetain = fromOptionalWasmU64(current.retainTxids);\n if (current.enabled === settings.enabled && (!settings.enabled || currentRetain === settings.retainTxids)) {\n return;\n }\n const txId = engine.begin_tx('readwrite');\n try {\n engine.set_change_feed_policy(txId, { enabled: settings.enabled, retainTxids: settings.retainTxids });\n engine.commit_tx(txId);\n } catch (error) {\n try {\n engine.rollback_tx(txId);\n } catch {}\n throw remapError(error);\n }\n}\n/** Active generation, null for legacy storage, undefined if reading fails. */\nasync function readActiveGenerationOrNull(wasm: WasmModule, dbName: string): Promise<string | null | undefined> {\n try {\n return await wasm.readActiveGeneration(dbName);\n } catch {\n return undefined;\n }\n}\nfunction normalizeEngineHealth(health: WasmEngineHealth): EngineHealth {\n if (health.state === 'recoveryRequired') {\n return {\n state: 'recoveryRequired',\n reason: health.reason,\n pendingTxid: fromOptionalWasmU64(health.pendingTxid)\n };\n }\n return { state: health.state };\n}\nfunction outcomeCountMismatch(operation: string, actual: number, expected: number): Error {\n return remoteError('InternalError', `${operation} outcome count mismatch: ${actual} != ${expected}`);\n}\nfunction partialBooleanOutcomes(error: unknown): boolean[] {\n if (!isRecord(error) || !Array.isArray(error.partial)) {\n return [];\n }\n return error.partial.filter((value): value is boolean => typeof value === 'boolean');\n}\nfunction partialBatchOutcomes(error: unknown): WasmBatchOutcome[] {\n if (!isRecord(error) || !Array.isArray(error.partial)) {\n return [];\n }\n return error.partial.filter((value): value is WasmBatchOutcome => {\n if (!isRecord(value) || typeof value.kind !== 'string') {\n return false;\n }\n return (\n (value.kind === 'put' && typeof value.baselineExists === 'boolean') ||\n (value.kind === 'delete' && typeof value.deleted === 'boolean')\n );\n });\n}\nfunction remapError(err: unknown): Error {\n if (err instanceof Error) {\n return err;\n }\n if (isRecord(err)) {\n const code = typeof err.code === 'string' ? err.code : typeof err.name === 'string' ? err.name : 'Error';\n const message = typeof err.message === 'string' ? err.message : 'Unknown error';\n const error = remoteError(code, message);\n if ('partial' in err) {\n Object.defineProperty(error, 'partial', {\n value: err.partial,\n enumerable: true,\n configurable: true\n });\n }\n return error;\n }\n return remoteError('Error', String(err));\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"node-engine.js","names":[],"sources":["../src/worker-server.ts","../src/snappy.ts","../src/compression.ts","../src/worker.ts"],"sourcesContent":["import type { AutocommitCommand, WorkerApi } from './worker-api';\nimport {\n MAX_WORKER_BATCH_BYTES,\n MAX_WORKER_BATCH_MESSAGES,\n WORKER_PROTOCOL_READY,\n WORKER_PROTOCOL_RESPONSE,\n WORKER_PROTOCOL_RESPONSE_BATCH,\n WORKER_PROTOCOL_VERSION,\n captureWorkerPayload,\n decodeWorkerCommandPayload,\n isAutocommitCommand,\n packedBatchOpsBytes,\n packedBinaryListBytes,\n prepareWorkerResponsePayload,\n isWorkerCommand,\n isWorkerProtocolEnvelope,\n isWorkerProtocolRequestBatchMessage,\n isWorkerProtocolRequestMessage,\n serializeWorkerError,\n workerProtocolError,\n type WorkerProtocolErrorMessage,\n type WorkerProtocolResponseMessage,\n type WorkerProtocolResponseBatchMessage,\n type WorkerProtocolSuccessMessage,\n type WorkerCommand\n} from './worker-protocol';\nimport { isRecord } from './internal';\n\ntype PackedWorkerApi = WorkerApi & {\n getManyPacked?: (txId: number, store: string, packedKeys: Uint8Array) => Promise<unknown>;\n putManyPacked?: (txId: number, store: string, packedEntries: Uint8Array, options?: unknown) => Promise<unknown>;\n deleteManyPacked?: (txId: number, store: string, packedKeys: Uint8Array) => Promise<unknown>;\n applyBatchPacked?: (txId: number, store: string, packedOps: Uint8Array) => Promise<unknown>;\n};\n\nexport interface WorkerServerHandle {\n close(): void;\n}\n\nexport interface WorkerServerScope {\n postMessage(message: unknown, transfer?: Transferable[]): void;\n addEventListener(type: 'message', listener: (event: MessageEvent<unknown>) => void): void;\n removeEventListener(type: 'message', listener: (event: MessageEvent<unknown>) => void): void;\n readonly location: { readonly origin: string };\n}\n\n/** The first argument identifies the transaction lane. */\nconst TRANSACTION_COMMANDS = new Set<WorkerCommand>([\n 'commit',\n 'rollback',\n 'createStore',\n 'dropStore',\n 'clearStore',\n 'get',\n 'getMany',\n 'has',\n 'put',\n 'putMany',\n 'delete',\n 'deleteMany',\n 'applyBatch',\n 'scan',\n 'getByIndex',\n 'scanByIndex',\n 'scanByIndexPage',\n 'getIndexes',\n 'reconcileIndexes',\n 'setSchemaVersion'\n]);\n\n/** These commands require exclusive access to the open engine. */\nconst EXCLUSIVE_COMMANDS = new Set<WorkerCommand>([\n 'open',\n 'close',\n 'destroy',\n 'importSnapshot',\n 'reset',\n 'compact',\n 'rebuild'\n]);\n\n/**\n * These commands do not use the open engine, so browser storage calls\n * can run without delaying its close.\n */\nconst UNSCHEDULED_COMMANDS = new Set<WorkerCommand>(['deleteDB', 'storageInfo', 'requestPersistence']);\n\nconst noop = () => {};\n\n/**\n * Serializes each transaction lane, including awaited work. Readwrite\n * autocommits share one writer lane. Exclusive commands wait for scheduled\n * work and block later scheduled work until they finish.\n */\nclass RequestScheduler {\n #lanes = new Map<number | string, Promise<void>>();\n #inFlight = new Set<Promise<void>>();\n #barrier: Promise<void> = Promise.resolve();\n #cursorLanes = new Map<number, number | string>();\n\n schedule<T>(command: WorkerCommand, args: unknown[], task: () => Promise<T>): Promise<T> {\n if (UNSCHEDULED_COMMANDS.has(command)) {\n return task();\n }\n if (EXCLUSIVE_COMMANDS.has(command)) {\n if (this.#cursorLanes.size === 0) return this.#runExclusive(task);\n return this.#runExclusive(async () => {\n const result = await task();\n this.#cursorLanes.clear();\n return result;\n });\n }\n if (\n command !== 'scanPage' &&\n command !== 'closeCursor' &&\n !((command === 'commit' || command === 'rollback') && this.#cursorLanes.size > 0)\n ) {\n return this.#runShared(laneFor(command, args), task);\n }\n const request = command === 'scanPage' && isRecord(args[0]) ? args[0] : null;\n const cursorId = request?.cursorId ?? (command === 'closeCursor' ? args[0] : undefined);\n const cursorLane = typeof cursorId === 'number' ? this.#cursorLanes.get(cursorId) : undefined;\n // Explicit cursors share their transaction lane. Implicit cursors own a separate read snapshot.\n const lane =\n cursorLane ??\n (request && typeof request.txId === 'number'\n ? request.txId\n : typeof cursorId === 'number'\n ? `cursor:${cursorId}`\n : laneFor(command, args));\n return this.#runShared(lane, async () => {\n try {\n const result = await task();\n if (request && isRecord(result)) {\n if (typeof cursorId === 'number') this.#cursorLanes.delete(cursorId);\n if (typeof result.cursorId === 'number') {\n this.#cursorLanes.set(result.cursorId, lane ?? `cursor:${result.cursorId}`);\n }\n }\n return result;\n } finally {\n if (command === 'closeCursor' && typeof cursorId === 'number') this.#cursorLanes.delete(cursorId);\n if (command === 'commit' || command === 'rollback') {\n for (const [cursor, ownerLane] of this.#cursorLanes) {\n if (ownerLane === args[0]) this.#cursorLanes.delete(cursor);\n }\n }\n }\n });\n }\n\n #runShared<T>(lane: number | string | null, task: () => Promise<T>): Promise<T> {\n const barrier = this.#barrier;\n const previous = lane === null ? undefined : this.#lanes.get(lane);\n const result = (async () => {\n await barrier;\n if (previous) {\n await previous;\n }\n return task();\n })();\n const settled = result.then(noop, noop);\n this.#inFlight.add(settled);\n if (lane !== null) {\n this.#lanes.set(lane, settled);\n }\n void settled.then(() => {\n this.#inFlight.delete(settled);\n if (lane !== null && this.#lanes.get(lane) === settled) {\n this.#lanes.delete(lane);\n }\n });\n return result;\n }\n\n #runExclusive<T>(task: () => Promise<T>): Promise<T> {\n const previousBarrier = this.#barrier;\n const pending = Array.from(this.#inFlight);\n const result = (async () => {\n await previousBarrier;\n await Promise.all(pending);\n return task();\n })();\n this.#barrier = result.then(noop, noop);\n return result;\n }\n}\n\nconst AUTOCOMMIT_WRITER_LANE = 'autocommit:readwrite';\n\nfunction laneFor(command: WorkerCommand, args: unknown[]): number | string | null {\n if (TRANSACTION_COMMANDS.has(command) && typeof args[0] === 'number') {\n return args[0];\n }\n if (command === 'autocommit' && args[0] === 'readwrite') {\n return AUTOCOMMIT_WRITER_LANE;\n }\n return null;\n}\n\ntype SendResponse = (response: WorkerProtocolResponseMessage, transfer?: Transferable[]) => void;\n\nclass ResponseQueue {\n private queued: Array<{ response: WorkerProtocolResponseMessage; transfer: Transferable[] }> = [];\n private queuedBytes = 0;\n private flushScheduled = false;\n private flushChannel: MessageChannel | null = null;\n private closed = false;\n\n constructor(private readonly scope: WorkerServerScope) {}\n\n enqueue(response: WorkerProtocolResponseMessage, transfer: Transferable[] = [], flushNow = false): void {\n if (this.closed) return;\n const byteLength = payloadBytes(response);\n if (this.queued.length > 0 && this.queuedBytes + byteLength > MAX_WORKER_BATCH_BYTES) {\n this.flush();\n }\n // Posting before the next turn is the snapshot. Deferred replies are frozen first.\n const releaseNow =\n flushNow ||\n this.queued.length + 1 >= MAX_WORKER_BATCH_MESSAGES ||\n this.queuedBytes + byteLength >= MAX_WORKER_BATCH_BYTES;\n if (releaseNow) {\n this.queued.push({ response, transfer });\n this.queuedBytes += byteLength;\n this.flush();\n return;\n }\n const captured = snapshotQueuedPayload(response, transfer);\n this.queued.push({ response: captured.value, transfer: captured.transfer });\n this.queuedBytes += captured.byteLength;\n if (!this.flushScheduled) {\n this.flushScheduled = true;\n queueMicrotask(() => {\n if (this.closed || this.queued.length === 0) {\n this.flushScheduled = false;\n return;\n }\n // A task boundary groups replies from successive transaction-lane\n // microtasks and releases ready replies while other requests remain pending.\n this.flushChannel ??= this.createFlushChannel();\n this.flushChannel.port2.postMessage(null);\n });\n }\n }\n\n close(): void {\n this.closed = true;\n this.queued = [];\n this.queuedBytes = 0;\n this.flushChannel?.port1.close();\n this.flushChannel?.port2.close();\n this.flushChannel = null;\n }\n\n private createFlushChannel(): MessageChannel {\n const channel = new MessageChannel();\n channel.port1.addEventListener('message', () => {\n this.flushScheduled = false;\n this.flush();\n });\n channel.port1.start();\n return channel;\n }\n\n flush(): void {\n const queued = this.queued;\n this.queued = [];\n this.queuedBytes = 0;\n if (this.closed || queued.length === 0) return;\n const response: WorkerProtocolResponseMessage | WorkerProtocolResponseBatchMessage =\n queued.length === 1\n ? queued[0].response\n : {\n type: WORKER_PROTOCOL_RESPONSE_BATCH,\n version: WORKER_PROTOCOL_VERSION,\n responses: queued.map((entry) => entry.response)\n };\n const transfer: Transferable[] = [];\n for (const entry of queued) {\n for (const buffer of entry.transfer) transfer.push(buffer);\n }\n postWorkerResponse(this.scope, response, transfer);\n }\n}\n\nexport function exposeWorkerApi(api: WorkerApi, scope: WorkerServerScope = self): WorkerServerHandle {\n const scheduler = new RequestScheduler();\n const responses = new ResponseQueue(scope);\n const handleMessage = (event: MessageEvent<unknown>) => {\n if (event.origin !== '' && event.origin !== scope.location.origin) {\n return;\n }\n if (isWorkerProtocolRequestBatchMessage(event.data)) {\n let remaining = event.data.requests.length;\n const respond: SendResponse = (response, transfer) => {\n remaining -= 1;\n // Flush fully settled batches in this task. The fallback releases partial replies.\n responses.enqueue(response, transfer, remaining === 0);\n };\n for (const request of event.data.requests) {\n void dispatchWorkerRequest(scope, api, scheduler, request, respond);\n }\n return;\n }\n void dispatchWorkerRequest(scope, api, scheduler, event.data);\n };\n scope.addEventListener('message', handleMessage);\n scope.postMessage({\n type: WORKER_PROTOCOL_READY,\n version: WORKER_PROTOCOL_VERSION,\n batching: 1\n });\n return {\n close() {\n scope.removeEventListener('message', handleMessage);\n responses.close();\n }\n };\n}\n\nasync function dispatchWorkerRequest(\n scope: WorkerServerScope,\n api: WorkerApi,\n scheduler: RequestScheduler,\n data: unknown,\n respond: SendResponse = (response, transfer) => postWorkerResponse(scope, response, transfer)\n): Promise<void> {\n if (!isWorkerProtocolEnvelope(data)) {\n return;\n }\n const id = typeof data.id === 'number' && Number.isSafeInteger(data.id) ? data.id : 0;\n if (!isWorkerProtocolRequestMessage(data)) {\n respond(errorResponse(id, workerProtocolError('WorkerProtocolError', 'invalid worker protocol request')));\n return;\n }\n if (!isWorkerCommand(data.command)) {\n respond(\n errorResponse(\n data.id,\n workerProtocolError('WorkerProtocolError', `unsupported worker command: ${String(data.command)}`)\n )\n );\n return;\n }\n const command = data.command;\n const args = data.args as unknown[];\n try {\n let responseCommand: WorkerCommand = command;\n let invoke: () => Promise<unknown>;\n if (command === 'autocommit') {\n const [mode, inner, innerArgs] = args;\n if (\n (mode !== 'readonly' && mode !== 'readwrite') ||\n !isAutocommitCommand(inner) ||\n !Array.isArray(innerArgs)\n ) {\n throw workerProtocolError('WorkerProtocolError', 'invalid autocommit request');\n }\n assertImplemented(api, inner);\n responseCommand = inner;\n invoke = () => runAutocommit(api, mode, inner, innerArgs);\n } else {\n assertImplemented(api, command);\n invoke = () => invokeCommand(api, command, args);\n }\n const result = await scheduler.schedule(command, args, invoke);\n const responsePayload = prepareWorkerResponsePayload(responseCommand, result as never);\n respond(successResponse(data.id, responsePayload.result), responsePayload.transfer);\n } catch (error) {\n respond(errorResponse(data.id, error));\n }\n}\n\nfunction assertImplemented(api: WorkerApi, command: WorkerCommand): void {\n if (typeof (api[command] as unknown) !== 'function') {\n throw workerProtocolError('WorkerProtocolError', `worker command is not implemented: ${command}`);\n }\n}\n\nfunction invokeCommand(api: WorkerApi, command: WorkerCommand, args: unknown[]): Promise<unknown> {\n const packedResult = dispatchPackedCommand(api, command, args);\n if (packedResult !== null) {\n return packedResult;\n }\n return (api[command] as unknown as (...methodArgs: unknown[]) => Promise<unknown>).apply(\n api,\n decodeWorkerCommandPayload(command, args as never) as unknown[]\n );\n}\n\nasync function runAutocommit(\n api: WorkerApi,\n mode: 'readonly' | 'readwrite',\n command: AutocommitCommand,\n args: unknown[]\n): Promise<unknown> {\n const txId = await api.begin(mode);\n let result: unknown;\n try {\n result = await invokeCommand(api, command, [txId, ...args]);\n } catch (error) {\n try {\n await api.rollback(txId);\n } catch {}\n throw error;\n }\n if (mode === 'readwrite') {\n await api.commit(txId);\n } else {\n await api.rollback(txId);\n }\n return result;\n}\n\nfunction dispatchPackedCommand(api: WorkerApi, command: WorkerCommand, args: unknown[]): Promise<unknown> | null {\n const packedApi = api as PackedWorkerApi;\n if (command === 'getMany' || command === 'deleteMany') {\n const [txId, store, keys] = args;\n if (typeof txId !== 'number' || typeof store !== 'string') {\n return null;\n }\n const packedKeys = packedBinaryListBytes(keys);\n if (packedKeys === null) {\n return null;\n }\n if (command === 'getMany' && typeof packedApi.getManyPacked === 'function') {\n return packedApi.getManyPacked(txId, store, packedKeys);\n }\n if (command === 'deleteMany' && typeof packedApi.deleteManyPacked === 'function') {\n return packedApi.deleteManyPacked(txId, store, packedKeys);\n }\n return null;\n }\n\n if (command === 'putMany') {\n const [txId, store, entries, options] = args;\n if (typeof txId !== 'number' || typeof store !== 'string' || typeof packedApi.putManyPacked !== 'function') {\n return null;\n }\n const packedEntries = packedBinaryListBytes(entries);\n return packedEntries === null ? null : packedApi.putManyPacked(txId, store, packedEntries, options);\n }\n\n if (command === 'applyBatch') {\n const [txId, store, ops] = args;\n if (typeof txId !== 'number' || typeof store !== 'string' || typeof packedApi.applyBatchPacked !== 'function') {\n return null;\n }\n const packedOps = packedBatchOpsBytes(ops);\n return packedOps === null ? null : packedApi.applyBatchPacked(txId, store, packedOps);\n }\n\n return null;\n}\n\nfunction successResponse(id: number, result: unknown): WorkerProtocolSuccessMessage {\n return {\n type: WORKER_PROTOCOL_RESPONSE,\n version: WORKER_PROTOCOL_VERSION,\n id,\n ok: true,\n result\n };\n}\n\nfunction errorResponse(id: number, error: unknown): WorkerProtocolErrorMessage {\n return {\n type: WORKER_PROTOCOL_RESPONSE,\n version: WORKER_PROTOCOL_VERSION,\n id,\n ok: false,\n error: serializeWorkerError(error)\n };\n}\n\nfunction postWorkerResponse(\n scope: WorkerServerScope,\n response: WorkerProtocolResponseMessage | WorkerProtocolResponseBatchMessage,\n transfer: Transferable[] = []\n): void {\n if (transfer.length > 0) {\n try {\n scope.postMessage(response, transfer);\n return;\n } catch {}\n }\n scope.postMessage(response);\n}\n\ninterface ViewGeometry {\n offset: number;\n length: number;\n dataView: boolean;\n}\n\nconst STANDARD_VIEW_CONSTRUCTORS = new Set<object>([\n DataView,\n Uint8Array,\n Uint8ClampedArray,\n Uint16Array,\n Uint32Array,\n Int8Array,\n Int16Array,\n Int32Array,\n Float32Array,\n Float64Array,\n BigInt64Array,\n BigUint64Array\n]);\n\n/**\n * Freeze a queued payload so the later postMessage is its only structured clone.\n * Listed buffers move now. Other ArrayBuffers are copied. SharedArrayBuffers stay shared.\n */\nfunction snapshotQueuedPayload<T>(\n value: T,\n transfer: readonly Transferable[]\n): { value: T; transfer: Transferable[]; byteLength: number } {\n const moving = new Set<ArrayBuffer>();\n for (const item of transfer) {\n if (!(item instanceof ArrayBuffer) || isResizableBuffer(item)) {\n return captureWorkerPayload(value, transfer as Transferable[]);\n }\n moving.add(item);\n }\n const geometries = new Map<ArrayBufferView, ViewGeometry>();\n if (!isPlainPayload(value, geometries, new WeakSet<object>())) {\n return captureWorkerPayload(value, transfer as Transferable[]);\n }\n const relocated = new Map<ArrayBuffer, ArrayBuffer>();\n for (const buffer of moving) {\n relocated.set(buffer, moveArrayBuffer(buffer));\n }\n const owned: ArrayBuffer[] = [];\n const seen = new WeakMap<object, unknown>();\n const cloneValue = (item: unknown): unknown => {\n if (item === null || typeof item !== 'object') {\n return item;\n }\n const existing = seen.get(item);\n if (existing !== undefined) {\n return existing;\n }\n if (typeof SharedArrayBuffer !== 'undefined' && item instanceof SharedArrayBuffer) {\n seen.set(item, item);\n return item;\n }\n if (item instanceof ArrayBuffer) {\n const next = relocated.get(item) ?? item.slice(0);\n seen.set(item, next);\n owned.push(next);\n return next;\n }\n if (ArrayBuffer.isView(item)) {\n const geometry = geometries.get(item);\n if (!geometry) {\n throw workerProtocolError('WorkerProtocolError', 'worker payload could not be queued');\n }\n const buffer = item.buffer;\n const nextBuffer =\n typeof SharedArrayBuffer !== 'undefined' && buffer instanceof SharedArrayBuffer\n ? buffer\n : (cloneValue(buffer) as ArrayBuffer);\n const out = retargetView(item, nextBuffer, geometry);\n seen.set(item, out);\n return out;\n }\n if (Array.isArray(item)) {\n const out = new Array<unknown>(item.length);\n seen.set(item, out);\n for (let index = 0; index < item.length; index += 1) {\n if (index in item) {\n out[index] = cloneValue(item[index]);\n }\n }\n return out;\n }\n const out: Record<string, unknown> = Object.getPrototypeOf(item) === null ? Object.create(null) : {};\n seen.set(item, out);\n const record = item as Record<string, unknown>;\n for (const key in record) {\n if (Object.prototype.hasOwnProperty.call(record, key)) {\n out[key] = cloneValue(record[key]);\n }\n }\n return out;\n };\n const cloned = cloneValue(value) as T;\n return { value: cloned, transfer: owned, byteLength: payloadBytes(cloned) };\n}\n\nfunction payloadBytes(value: unknown): number {\n let byteLength = 0;\n const seen = new WeakSet<object>();\n const visit = (item: unknown): void => {\n if (!Number.isFinite(byteLength)) return;\n if (typeof item === 'string') {\n byteLength += 8 + item.length * 2;\n return;\n }\n if (item === null || typeof item !== 'object') {\n byteLength += 8;\n return;\n }\n if (seen.has(item)) {\n return;\n }\n seen.add(item);\n byteLength += 8;\n if (item instanceof ArrayBuffer) {\n byteLength += item.byteLength;\n } else if (typeof SharedArrayBuffer !== 'undefined' && item instanceof SharedArrayBuffer) {\n byteLength += item.byteLength;\n } else if (ArrayBuffer.isView(item)) {\n visit(item.buffer);\n } else if (Array.isArray(item)) {\n if (Object.getPrototypeOf(item) !== Array.prototype || hasExtraKeys(item)) {\n byteLength = Number.POSITIVE_INFINITY;\n return;\n }\n for (let index = 0; index < item.length; index += 1) {\n const descriptor = Object.getOwnPropertyDescriptor(item, String(index));\n if (descriptor && !('value' in descriptor)) {\n byteLength = Number.POSITIVE_INFINITY;\n return;\n }\n visit(descriptor?.value);\n }\n } else if (item instanceof Map) {\n for (const [key, child] of item) {\n visit(key);\n visit(child);\n }\n } else if (item instanceof Set) {\n for (const child of item) {\n visit(child);\n }\n } else {\n const record = item as Record<string, unknown>;\n for (const key in record) {\n if (Object.prototype.hasOwnProperty.call(record, key)) {\n const descriptor = Object.getOwnPropertyDescriptor(record, key);\n // Let postMessage evaluate accessors and preserve special data keys.\n if (key === '__proto__' || !descriptor || !('value' in descriptor)) {\n byteLength = Number.POSITIVE_INFINITY;\n return;\n }\n byteLength += 8 + key.length * 2;\n visit(descriptor.value);\n }\n }\n }\n };\n visit(value);\n return byteLength;\n}\n\nfunction isPlainPayload(\n value: unknown,\n geometries: Map<ArrayBufferView, ViewGeometry>,\n seen: WeakSet<object>\n): boolean {\n if (typeof value === 'function' || typeof value === 'symbol') {\n return false;\n }\n if (value === null || typeof value !== 'object') {\n return true;\n }\n if (seen.has(value)) {\n return true;\n }\n seen.add(value);\n if (typeof SharedArrayBuffer !== 'undefined' && value instanceof SharedArrayBuffer) {\n return !isResizableBuffer(value);\n }\n if (value instanceof ArrayBuffer) {\n return !isResizableBuffer(value);\n }\n if (ArrayBuffer.isView(value)) {\n if (!isStandardView(value)) {\n return false;\n }\n const buffer = value.buffer;\n if (typeof SharedArrayBuffer !== 'undefined' && buffer instanceof SharedArrayBuffer) {\n if (isResizableBuffer(buffer)) {\n return false;\n }\n geometries.set(value, viewGeometry(value));\n return true;\n }\n if (!(buffer instanceof ArrayBuffer) || isResizableBuffer(buffer)) {\n return false;\n }\n geometries.set(value, viewGeometry(value));\n return true;\n }\n if (value instanceof Map || value instanceof Set || value instanceof Date || value instanceof RegExp) {\n return false;\n }\n if (Array.isArray(value)) {\n if (hasExtraKeys(value) || hasEnumerableSymbols(value)) {\n return false;\n }\n for (const child of value) {\n if (!isPlainPayload(child, geometries, seen)) {\n return false;\n }\n }\n return true;\n }\n const proto = Object.getPrototypeOf(value);\n if (proto !== Object.prototype && proto !== null) {\n return false;\n }\n if (hasEnumerableSymbols(value)) {\n return false;\n }\n const record = value as Record<string, unknown>;\n for (const key in record) {\n if (Object.prototype.hasOwnProperty.call(record, key) && !isPlainPayload(record[key], geometries, seen)) {\n return false;\n }\n }\n return true;\n}\n\nfunction hasExtraKeys(value: readonly unknown[]): boolean {\n const record: object = value;\n for (const key in record) {\n if (!Object.prototype.hasOwnProperty.call(value, key)) {\n continue;\n }\n const index = Number(key);\n if (!Number.isInteger(index) || index < 0 || index >= value.length || String(index) !== key) {\n return true;\n }\n }\n return false;\n}\n\nfunction hasEnumerableSymbols(value: object): boolean {\n for (const symbol of Object.getOwnPropertySymbols(value)) {\n if (Object.prototype.propertyIsEnumerable.call(value, symbol)) {\n return true;\n }\n }\n return false;\n}\n\nfunction isStandardView(view: ArrayBufferView): boolean {\n return STANDARD_VIEW_CONSTRUCTORS.has(view.constructor);\n}\n\nfunction viewGeometry(view: ArrayBufferView): ViewGeometry {\n if (view instanceof DataView) {\n return { offset: view.byteOffset, length: view.byteLength, dataView: true };\n }\n return { offset: view.byteOffset, length: (view as Uint8Array).length, dataView: false };\n}\n\nfunction retargetView(view: ArrayBufferView, buffer: ArrayBufferLike, geometry: ViewGeometry): ArrayBufferView {\n if (geometry.dataView) {\n return new DataView(buffer, geometry.offset, geometry.length);\n }\n const Typed = view.constructor as new (\n buffer: ArrayBufferLike,\n byteOffset: number,\n length: number\n ) => ArrayBufferView;\n return new Typed(buffer, geometry.offset, geometry.length);\n}\n\nfunction moveArrayBuffer(buffer: ArrayBuffer): ArrayBuffer {\n const movable = buffer as ArrayBuffer & { transfer?: () => ArrayBuffer };\n if (typeof movable.transfer === 'function') {\n return movable.transfer();\n }\n return structuredClone(buffer, { transfer: [buffer] });\n}\n\nfunction isResizableBuffer(buffer: ArrayBuffer | SharedArrayBuffer): boolean {\n return (buffer as { resizable?: boolean }).resizable === true;\n}\n","const BLOCK_SIZE = 65536;\nconst HASH_BITS = 14;\nconst HASH_SIZE = 1 << HASH_BITS;\nconst MAX_LENGTH = 0xffff_ffff;\nconst MATCH_TABLE = new Uint32Array(HASH_SIZE);\n\nfunction corrupt(message: string): Error {\n const error = new Error(`invalid Snappy block: ${message}`);\n error.name = 'CorruptionError';\n return error;\n}\n\nfunction word(bytes: Uint8Array, offset: number): number {\n return (bytes[offset] | (bytes[offset + 1] << 8) | (bytes[offset + 2] << 16) | (bytes[offset + 3] << 24)) >>> 0;\n}\n\nfunction hash(value: number, bits: number): number {\n return Math.imul(value, 0x9e3779b1) >>> (32 - bits);\n}\n\nexport function encodeSnappy(input: Uint8Array): Uint8Array {\n if (input.byteLength > MAX_LENGTH) {\n throw new RangeError('Snappy input exceeds the 32-bit length limit');\n }\n const output = new Uint8Array(input.byteLength + Math.ceil(input.byteLength / 6) + 32);\n let written = 0;\n let remainingLength = input.byteLength;\n while (remainingLength >= 128) {\n output[written++] = (remainingLength & 0x7f) | 0x80;\n remainingLength = Math.floor(remainingLength / 128);\n }\n output[written++] = remainingLength;\n\n const literal = (start: number, end: number): void => {\n if (start === end) {\n return;\n }\n let length = end - start - 1;\n if (length < 60) {\n output[written++] = length << 2;\n } else {\n const lengthBytes = length <= 0xff ? 1 : length <= 0xffff ? 2 : length <= 0xffffff ? 3 : 4;\n output[written++] = (59 + lengthBytes) << 2;\n for (let index = 0; index < lengthBytes; index += 1) {\n output[written++] = length & 0xff;\n length >>>= 8;\n }\n }\n output.set(input.subarray(start, end), written);\n written += end - start;\n };\n const copy = (offset: number, length: number): void => {\n while (length > 0) {\n const count = Math.min(length, 64);\n if (count >= 4 && count <= 11 && offset < 2048) {\n output[written++] = 1 | ((count - 4) << 2) | ((offset >>> 8) << 5);\n output[written++] = offset & 0xff;\n } else {\n output[written++] = 2 | ((count - 1) << 2);\n output[written++] = offset & 0xff;\n output[written++] = offset >>> 8;\n }\n length -= count;\n }\n };\n\n let hashBits = 8;\n while (1 << hashBits < Math.min(input.byteLength, HASH_SIZE)) {\n hashBits += 1;\n }\n const tableSize = 1 << hashBits;\n // Encoding is synchronous. Calls can reuse this bounded scratch table.\n const table = MATCH_TABLE;\n for (let blockStart = 0; blockStart < input.byteLength; blockStart += BLOCK_SIZE) {\n const blockEnd = Math.min(blockStart + BLOCK_SIZE, input.byteLength);\n table.fill(0, 0, tableSize);\n let position = blockStart;\n let literalStart = blockStart;\n let misses = 0;\n while (position + 4 <= blockEnd) {\n const current = word(input, position);\n const slot = hash(current, hashBits);\n const previous = table[slot];\n table[slot] = position - blockStart + 1;\n const candidate = blockStart + previous - 1;\n if (previous === 0 || current !== word(input, candidate)) {\n misses += 1;\n position += 1 + Math.min(misses >>> 5, 64);\n continue;\n }\n literal(literalStart, position);\n const matchStart = position;\n position += 4;\n while (position < blockEnd && input[position] === input[candidate + position - matchStart]) {\n position += 1;\n }\n copy(matchStart - candidate, position - matchStart);\n literalStart = position;\n misses = 0;\n if (position + 4 <= blockEnd) {\n table[hash(word(input, position - 1), hashBits)] = position - blockStart;\n }\n }\n literal(literalStart, blockEnd);\n }\n return output.subarray(0, written);\n}\n\nexport function decodeSnappy(input: Uint8Array, maxOutputBytes: number, expectedOutputBytes?: number): Uint8Array {\n if (!Number.isSafeInteger(maxOutputBytes) || maxOutputBytes < 0 || maxOutputBytes > MAX_LENGTH) {\n throw new RangeError('invalid Snappy output limit');\n }\n let read = 0;\n let length = 0;\n for (let index = 0; ; index += 1) {\n if (read >= input.byteLength || index === 5) {\n throw corrupt('truncated or invalid length');\n }\n const byte = input[read++];\n if (index === 4 && byte > 0x0f) {\n throw corrupt('length exceeds 32 bits');\n }\n length += (byte & 0x7f) * 2 ** (index * 7);\n if (byte < 128) {\n break;\n }\n }\n if (length > maxOutputBytes) {\n throw corrupt(`output exceeds ${maxOutputBytes} byte limit`);\n }\n if (expectedOutputBytes !== undefined && length !== expectedOutputBytes) {\n throw corrupt(`length mismatch: expected ${expectedOutputBytes} bytes, got ${length}`);\n }\n const output = new Uint8Array(length);\n let written = 0;\n while (read < input.byteLength) {\n const tag = input[read++];\n const kind = tag & 3;\n if (kind === 0) {\n let count = tag >>> 2;\n if (count < 60) {\n count += 1;\n } else {\n const lengthBytes = count - 59;\n if (lengthBytes > input.byteLength - read) {\n throw corrupt('truncated literal length');\n }\n count = 1;\n for (let index = 0; index < lengthBytes; index += 1) {\n count += input[read++] * 2 ** (index * 8);\n }\n }\n if (count > input.byteLength - read || count > length - written) {\n throw corrupt('literal exceeds input or output');\n }\n output.set(input.subarray(read, read + count), written);\n read += count;\n written += count;\n continue;\n }\n const offsetBytes = kind === 1 ? 1 : kind === 2 ? 2 : 4;\n if (offsetBytes > input.byteLength - read) {\n throw corrupt('truncated copy offset');\n }\n const count = kind === 1 ? 4 + ((tag >>> 2) & 7) : 1 + (tag >>> 2);\n let offset = kind === 1 ? (tag & 0xe0) << 3 : 0;\n for (let index = 0; index < offsetBytes; index += 1) {\n offset += input[read++] * 2 ** (index * 8);\n }\n if (offset === 0 || offset > written || count > length - written) {\n throw corrupt('copy exceeds output or has an invalid offset');\n }\n let copied = 0;\n // Overlapping copies repeat the decoded prefix. Each step doubles it.\n while (copied < count) {\n const chunk = Math.min(offset + copied, count - copied);\n output.copyWithin(written + copied, written - offset, written - offset + chunk);\n copied += chunk;\n }\n written += count;\n }\n if (written !== length) {\n throw corrupt(`length mismatch: expected ${length} bytes, got ${written}`);\n }\n return output;\n}\n","import { utf8Encode } from './codec';\nimport { decodeSnappy, encodeSnappy } from './snappy';\nimport type { CompressionKind, SnapshotCompressionKind } from './types';\nexport type CompressionOption = CompressionKind | false;\nconst STORE_RECORD_MAGIC = utf8Encode('BDBZVAL1');\nconst SNAPSHOT_EXPORT_MAGIC = utf8Encode('BDBZSNP1');\nconst ENVELOPE_VERSION = 1;\nconst ENVELOPE_HEADER_SIZE = 18;\nconst COMPRESSION_TAG_NONE = 0;\nconst COMPRESSION_TAG_GZIP = 1;\nconst COMPRESSION_TAG_DEFLATE = 2;\nconst COMPRESSION_TAG_SNAPPY = 3;\nconst STORE_FLAG_COMPRESSION_SHIFT = 2;\nconst STORE_FLAG_COMPRESSION_MASK = 0b11 << STORE_FLAG_COMPRESSION_SHIFT;\nexport const STORE_VALUE_COMPRESSION_THRESHOLD = 1024;\nexport const STORE_VALUE_MIN_COMPRESSION_SAVING_PERCENT = 10;\nexport const STORE_VALUE_COMPRESSION_POLICY_VERSION = 2;\nexport const STORE_VALUE_COMPRESSION_PREFLIGHT_MIN_BYTES = 64 * 1024;\nexport const STORE_VALUE_COMPRESSION_PREFLIGHT_WINDOW_BYTES = 1024;\nexport const STORE_VALUE_COMPRESSION_PREFLIGHT_WINDOW_COUNT = 3;\nexport const STORE_VALUE_COMPRESSION_ENVELOPE_BYTES = ENVELOPE_HEADER_SIZE;\nconst MAX_DECOMPRESSED_STORE_VALUE_BYTES = 8 * 1024 * 1024;\nconst MAX_DECOMPRESSED_SNAPSHOT_BYTES = 256 * 1024 * 1024;\nconst CRC32_TABLE = (() => {\n const table = new Uint32Array(8 * 256);\n for (let index = 0; index < 256; index += 1) {\n let crc = index;\n for (let bit = 0; bit < 8; bit += 1) {\n if ((crc & 1) !== 0) {\n crc = (crc >>> 1) ^ 0xedb88320;\n } else {\n crc >>>= 1;\n }\n }\n table[index] = crc >>> 0;\n }\n for (let index = 0; index < 256; index += 1) {\n let crc = table[index];\n for (let slice = 1; slice < 8; slice += 1) {\n crc = (crc >>> 8) ^ table[crc & 0xff];\n table[slice * 256 + index] = crc >>> 0;\n }\n }\n return table;\n})();\ntype EnvelopeHeader = {\n version: number;\n kindTag: number;\n rawLength: number;\n payloadChecksum: number;\n};\nexport type PreparedStoreValueRecord = {\n readonly byteLength: number;\n readonly payload: Uint8Array;\n readonly rawLength: number;\n readonly kindTag: number | null;\n};\nfunction namedError(name: string, message: string): Error {\n const error = new Error(message);\n error.name = name;\n return error;\n}\nfunction compressionTag(kind: CompressionOption): number {\n switch (kind) {\n case false:\n return COMPRESSION_TAG_NONE;\n case 'gzip':\n return COMPRESSION_TAG_GZIP;\n case 'deflate':\n return COMPRESSION_TAG_DEFLATE;\n case 'snappy':\n return COMPRESSION_TAG_SNAPPY;\n default:\n throw namedError('InternalError', `unsupported compression kind: ${String(kind)}`);\n }\n}\nfunction compressionKindFromTag(tag: number): CompressionOption {\n switch (tag) {\n case COMPRESSION_TAG_NONE:\n return false;\n case COMPRESSION_TAG_GZIP:\n return 'gzip';\n case COMPRESSION_TAG_DEFLATE:\n return 'deflate';\n case COMPRESSION_TAG_SNAPPY:\n return 'snappy';\n default:\n throw namedError('CorruptionError', `invalid compression tag: ${tag}`);\n }\n}\nfunction compressionRuntimeUnavailable(): Error {\n return namedError(\n 'UnsupportedPlatformError',\n 'CompressionStream and DecompressionStream are required for moyodb compression'\n );\n}\nfunction ensureCompressionRuntime(): void {\n if (typeof CompressionStream !== 'function' || typeof DecompressionStream !== 'function') {\n throw compressionRuntimeUnavailable();\n }\n}\nfunction crc32(bytes: Uint8Array): number {\n let crc = 0xffffffff;\n let offset = 0;\n const blockEnd = bytes.byteLength - 7;\n // Table slices apply eight IEEE CRC32 byte updates in one step.\n for (; offset < blockEnd; offset += 8) {\n const first =\n crc ^ bytes[offset] ^ (bytes[offset + 1] << 8) ^ (bytes[offset + 2] << 16) ^ (bytes[offset + 3] << 24);\n crc =\n CRC32_TABLE[1792 + (first & 0xff)] ^\n CRC32_TABLE[1536 + ((first >>> 8) & 0xff)] ^\n CRC32_TABLE[1280 + ((first >>> 16) & 0xff)] ^\n CRC32_TABLE[1024 + (first >>> 24)] ^\n CRC32_TABLE[768 + bytes[offset + 4]] ^\n CRC32_TABLE[512 + bytes[offset + 5]] ^\n CRC32_TABLE[256 + bytes[offset + 6]] ^\n CRC32_TABLE[bytes[offset + 7]];\n }\n for (; offset < bytes.byteLength; offset += 1) {\n crc = (crc >>> 8) ^ CRC32_TABLE[(crc ^ bytes[offset]) & 0xff];\n }\n return (crc ^ 0xffffffff) >>> 0;\n}\nfunction buildEnvelope(magic: Uint8Array, kindTag: number, rawLength: number, payload: Uint8Array): Uint8Array {\n const out = new Uint8Array(ENVELOPE_HEADER_SIZE + payload.byteLength);\n writeEnvelope(out, 0, magic, kindTag, rawLength, payload);\n return out;\n}\nfunction writeEnvelope(\n out: Uint8Array,\n offset: number,\n magic: Uint8Array,\n kindTag: number,\n rawLength: number,\n payload: Uint8Array\n): void {\n // A borrowed payload can overlap the destination header.\n const checksum = crc32(payload);\n out.set(payload, offset + ENVELOPE_HEADER_SIZE);\n out.set(magic, offset);\n out[offset + 8] = ENVELOPE_VERSION;\n out[offset + 9] = kindTag;\n const view = new DataView(out.buffer, out.byteOffset + offset, ENVELOPE_HEADER_SIZE);\n view.setUint32(10, rawLength, true);\n view.setUint32(14, checksum, true);\n}\nfunction writeEnvelopeHeader(\n out: Uint8Array,\n magic: Uint8Array,\n kindTag: number,\n rawLength: number,\n payload: Uint8Array\n): void {\n const checksum = crc32(payload);\n out.set(magic);\n out[8] = ENVELOPE_VERSION;\n out[9] = kindTag;\n const view = new DataView(out.buffer, out.byteOffset, ENVELOPE_HEADER_SIZE);\n view.setUint32(10, rawLength, true);\n view.setUint32(14, checksum, true);\n}\nfunction envelopeFromChunks(\n magic: Uint8Array,\n kindTag: number,\n rawLength: number,\n chunks: Uint8Array[],\n totalBytes: number\n): Uint8Array {\n const out = new Uint8Array(ENVELOPE_HEADER_SIZE + totalBytes);\n let offset = ENVELOPE_HEADER_SIZE;\n for (const chunk of chunks) {\n out.set(chunk, offset);\n offset += chunk.byteLength;\n }\n writeEnvelopeHeader(out, magic, kindTag, rawLength, out.subarray(ENVELOPE_HEADER_SIZE));\n return out;\n}\nfunction compressionIsProfitable(rawLength: number, compressedLength: number): boolean {\n return (\n (compressedLength + ENVELOPE_HEADER_SIZE) * 100 <=\n rawLength * (100 - STORE_VALUE_MIN_COMPRESSION_SAVING_PERCENT)\n );\n}\nfunction snappyPreflightIsProfitable(value: Uint8Array): boolean {\n if (value.byteLength < STORE_VALUE_COMPRESSION_PREFLIGHT_MIN_BYTES) {\n return true;\n }\n let compressedLength = 0;\n for (let index = 0; index < STORE_VALUE_COMPRESSION_PREFLIGHT_WINDOW_COUNT; index += 1) {\n const offset = Math.floor(\n ((value.byteLength - STORE_VALUE_COMPRESSION_PREFLIGHT_WINDOW_BYTES) * index) /\n (STORE_VALUE_COMPRESSION_PREFLIGHT_WINDOW_COUNT - 1)\n );\n compressedLength += encodeSnappy(\n value.subarray(offset, offset + STORE_VALUE_COMPRESSION_PREFLIGHT_WINDOW_BYTES)\n ).byteLength;\n }\n return compressionIsProfitable(\n STORE_VALUE_COMPRESSION_PREFLIGHT_WINDOW_BYTES * STORE_VALUE_COMPRESSION_PREFLIGHT_WINDOW_COUNT,\n compressedLength\n );\n}\nfunction validateStoreValueLength(value: Uint8Array): void {\n if (value.byteLength > MAX_DECOMPRESSED_STORE_VALUE_BYTES) {\n throw namedError(\n 'ValueTooLargeError',\n `value has ${value.byteLength} bytes, exceeding the ${MAX_DECOMPRESSED_STORE_VALUE_BYTES} byte limit`\n );\n }\n}\n// Raw payloads borrow value until the prepared record is written.\nexport function prepareFastStoreValueRecord(\n value: Uint8Array,\n compression: 'snappy' | false\n): PreparedStoreValueRecord {\n if (compression === false) {\n return { payload: value, rawLength: value.byteLength, byteLength: value.byteLength, kindTag: null };\n }\n validateStoreValueLength(value);\n let payload = value;\n let kindTag = COMPRESSION_TAG_NONE;\n if (value.byteLength >= STORE_VALUE_COMPRESSION_THRESHOLD && snappyPreflightIsProfitable(value)) {\n const compressed = encodeSnappy(value);\n if (compressionIsProfitable(value.byteLength, compressed.byteLength)) {\n payload = compressed;\n kindTag = COMPRESSION_TAG_SNAPPY;\n }\n }\n return { payload, rawLength: value.byteLength, byteLength: ENVELOPE_HEADER_SIZE + payload.byteLength, kindTag };\n}\nexport function writePreparedStoreValueRecord(\n record: PreparedStoreValueRecord,\n target: Uint8Array,\n offset: number\n): number {\n if (!Number.isSafeInteger(offset) || offset < 0 || record.byteLength > target.byteLength - offset) {\n throw namedError('InternalError', 'prepared store value exceeds its destination');\n }\n if (record.kindTag === null) {\n target.set(record.payload, offset);\n } else {\n writeEnvelope(target, offset, STORE_RECORD_MAGIC, record.kindTag, record.rawLength, record.payload);\n }\n return offset + record.byteLength;\n}\n// Copy before the stream can suspend so caller mutations cannot change its input.\nfunction copyBytes(bytes: Uint8Array): Uint8Array<ArrayBuffer> {\n const copy = new Uint8Array(bytes.byteLength);\n copy.set(bytes);\n return copy;\n}\nfunction byteStream(bytes: Uint8Array<ArrayBuffer>): ReadableStream<Uint8Array<ArrayBuffer>> {\n let offset = 0;\n return new ReadableStream({\n pull(controller) {\n if (offset < bytes.byteLength) {\n const end = Math.min(offset + 64 * 1024, bytes.byteLength);\n // The stream owns the input; chunk views need no further copies.\n controller.enqueue(bytes.subarray(offset, end));\n offset = end;\n }\n if (offset === bytes.byteLength) {\n controller.close();\n }\n }\n });\n}\nfunction readEnvelopeHeader(magic: Uint8Array, bytes: Uint8Array, strict = true): EnvelopeHeader | null {\n if (bytes.byteLength < magic.byteLength) {\n return null;\n }\n for (let index = 0; index < magic.byteLength; index += 1) {\n if (bytes[index] !== magic[index]) {\n return null;\n }\n }\n if (bytes.byteLength < ENVELOPE_HEADER_SIZE) {\n if (strict) {\n throw namedError(\n 'CorruptionError',\n `truncated compression envelope: expected at least ${ENVELOPE_HEADER_SIZE} bytes, got ${bytes.byteLength}`\n );\n }\n return null;\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, ENVELOPE_HEADER_SIZE);\n return {\n version: bytes[8],\n kindTag: bytes[9],\n rawLength: view.getUint32(10, true),\n payloadChecksum: view.getUint32(14, true)\n };\n}\n// `stopAtBytes` abandons a result that will not be smaller than the raw payload.\n// The caller then seals the snapshot it already owns instead of copying those bytes again.\nasync function collectCompressed(\n input: Uint8Array<ArrayBuffer>,\n kind: SnapshotCompressionKind,\n stopAtBytes?: number\n): Promise<{\n chunks: Uint8Array[];\n totalBytes: number;\n} | null> {\n ensureCompressionRuntime();\n let stream: ReadableStream<Uint8Array>;\n try {\n stream = byteStream(input).pipeThrough(new CompressionStream(kind));\n } catch {\n throw compressionRuntimeUnavailable();\n }\n const reader = stream.getReader();\n const chunks: Uint8Array[] = [];\n let totalBytes = 0;\n let stopped = false;\n try {\n for (let next = await reader.read(); !next.done; next = await reader.read()) {\n const part = next.value;\n totalBytes += part.byteLength;\n if (stopAtBytes !== undefined && totalBytes >= stopAtBytes) {\n stopped = true;\n await reader.cancel('compressed output is not smaller than the raw payload');\n break;\n }\n chunks.push(part);\n }\n } catch (error) {\n if (!stopped) {\n throw namedError('InternalError', `failed to compress bytes with ${kind}: ${String(error)}`);\n }\n } finally {\n try {\n reader.releaseLock();\n } catch {\n // cancel() may already have released this reader.\n }\n }\n if (stopped || (stopAtBytes !== undefined && totalBytes >= stopAtBytes)) {\n return null;\n }\n return { chunks, totalBytes };\n}\nasync function decompressBytes(\n data: Uint8Array,\n kind: CompressionKind,\n label: string,\n maxOutputBytes?: number\n): Promise<Uint8Array> {\n if (kind === 'snappy') {\n return decodeSnappy(data, maxOutputBytes ?? MAX_DECOMPRESSED_STORE_VALUE_BYTES, maxOutputBytes);\n }\n ensureCompressionRuntime();\n let stream: ReadableStream<Uint8Array>;\n try {\n stream = byteStream(copyBytes(data)).pipeThrough(new DecompressionStream(kind));\n } catch {\n throw compressionRuntimeUnavailable();\n }\n try {\n return await readBoundedStream(stream, label, maxOutputBytes);\n } catch (error) {\n throw namedError('CorruptionError', `failed to decompress ${label}: ${String(error)}`);\n }\n}\n\nasync function readBoundedStream(\n stream: ReadableStream<Uint8Array>,\n label: string,\n maxOutputBytes?: number\n): Promise<Uint8Array> {\n const reader = stream.getReader();\n const chunks: Uint8Array[] = [];\n let totalBytes = 0;\n try {\n for (let next = await reader.read(); !next.done; next = await reader.read()) {\n const value = next.value;\n totalBytes += value.byteLength;\n if (maxOutputBytes !== undefined && totalBytes > maxOutputBytes) {\n await reader.cancel(`decompressed ${label} exceeded ${maxOutputBytes} bytes`);\n throw namedError('CorruptionError', `decompressed ${label} exceeds ${maxOutputBytes} byte limit`);\n }\n chunks.push(value);\n }\n } finally {\n reader.releaseLock();\n }\n if (chunks.length === 1) {\n return chunks[0];\n }\n const out = new Uint8Array(totalBytes);\n let offset = 0;\n for (const chunk of chunks) {\n out.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return out;\n}\nexport function compressionFromStoreFlags(flags: number): CompressionOption {\n const encoded = (flags & STORE_FLAG_COMPRESSION_MASK) >>> STORE_FLAG_COMPRESSION_SHIFT;\n switch (encoded) {\n case 0:\n return false;\n case 1:\n return 'gzip';\n case 2:\n return 'deflate';\n case 3:\n return 'snappy';\n default:\n throw namedError('CorruptionError', `invalid store compression flags: ${encoded}`);\n }\n}\nexport async function encodeStoreValueRecord(value: Uint8Array, compression: CompressionOption): Promise<Uint8Array> {\n validateStoreValueLength(value);\n if (compression === false) {\n return value;\n }\n if (compression === 'snappy') {\n const record = prepareFastStoreValueRecord(value, compression);\n const output = new Uint8Array(record.byteLength);\n writePreparedStoreValueRecord(record, output, 0);\n return output;\n }\n if (value.byteLength < STORE_VALUE_COMPRESSION_THRESHOLD) {\n return buildEnvelope(STORE_RECORD_MAGIC, COMPRESSION_TAG_NONE, value.byteLength, value);\n }\n const stored = new Uint8Array(ENVELOPE_HEADER_SIZE + value.byteLength);\n const payload = stored.subarray(ENVELOPE_HEADER_SIZE);\n payload.set(value);\n const compressed = await collectCompressed(payload, compression, payload.byteLength);\n if (compressed === null || !compressionIsProfitable(payload.byteLength, compressed.totalBytes)) {\n writeEnvelopeHeader(stored, STORE_RECORD_MAGIC, COMPRESSION_TAG_NONE, payload.byteLength, payload);\n return stored;\n }\n return envelopeFromChunks(\n STORE_RECORD_MAGIC,\n compressionTag(compression),\n payload.byteLength,\n compressed.chunks,\n compressed.totalBytes\n );\n}\nexport async function decodeStoreValueRecord(\n value: Uint8Array,\n options: {\n strict: boolean;\n }\n): Promise<Uint8Array> {\n const header = readEnvelopeHeader(STORE_RECORD_MAGIC, value, options.strict);\n if (!header) {\n return value;\n }\n if (header.version !== ENVELOPE_VERSION) {\n if (options.strict) {\n throw namedError('CorruptionError', `unsupported value record version: ${header.version}`);\n }\n return value;\n }\n let compression: CompressionOption;\n try {\n compression = compressionKindFromTag(header.kindTag);\n } catch (error) {\n if (options.strict) {\n throw error;\n }\n return value;\n }\n const payload = value.subarray(ENVELOPE_HEADER_SIZE);\n if (crc32(payload) !== header.payloadChecksum) {\n if (options.strict) {\n throw namedError('CorruptionError', 'value record checksum mismatch');\n }\n return value;\n }\n if (compression === false) {\n if (payload.byteLength !== header.rawLength) {\n if (options.strict) {\n throw namedError(\n 'CorruptionError',\n `value record length mismatch: expected ${header.rawLength} bytes, got ${payload.byteLength}`\n );\n }\n return value;\n }\n return payload.slice();\n }\n if (header.rawLength > MAX_DECOMPRESSED_STORE_VALUE_BYTES) {\n throw namedError(\n 'CorruptionError',\n `compressed value advertises ${header.rawLength} decompressed bytes, exceeding the ${MAX_DECOMPRESSED_STORE_VALUE_BYTES} byte limit`\n );\n }\n const decompressed = await decompressBytes(payload, compression, `value record (${compression})`, header.rawLength);\n if (decompressed.byteLength !== header.rawLength) {\n throw namedError(\n 'CorruptionError',\n `decompressed value length mismatch: expected ${header.rawLength} bytes, got ${decompressed.byteLength}`\n );\n }\n return decompressed;\n}\nexport async function wrapSnapshotWithCompression(\n snapshot: Uint8Array,\n compression: SnapshotCompressionKind | false\n): Promise<Uint8Array> {\n if (compression === false) {\n return snapshot;\n }\n if (!['gzip', 'deflate'].includes(compression)) {\n throw namedError('InternalError', `unsupported snapshot compression kind: ${String(compression)}`);\n }\n if (snapshot.byteLength > MAX_DECOMPRESSED_SNAPSHOT_BYTES) {\n throw namedError(\n 'SerializationError',\n `snapshot has ${snapshot.byteLength} bytes, exceeding the ${MAX_DECOMPRESSED_SNAPSHOT_BYTES} byte limit`\n );\n }\n const input = copyBytes(snapshot);\n const compressed = await collectCompressed(input, compression);\n if (compressed === null) {\n throw namedError('InternalError', `failed to compress bytes with ${compression}`);\n }\n return envelopeFromChunks(\n SNAPSHOT_EXPORT_MAGIC,\n compressionTag(compression),\n input.byteLength,\n compressed.chunks,\n compressed.totalBytes\n );\n}\nexport async function unwrapSnapshotCompression(snapshot: Uint8Array): Promise<Uint8Array> {\n const header = readEnvelopeHeader(SNAPSHOT_EXPORT_MAGIC, snapshot);\n if (!header) {\n return snapshot;\n }\n if (header.version !== ENVELOPE_VERSION) {\n throw namedError('CorruptionError', `unsupported snapshot compression version: ${header.version}`);\n }\n const compression = compressionKindFromTag(header.kindTag);\n if (compression === false) {\n throw namedError('CorruptionError', 'snapshot compression envelope cannot store kind \"none\"');\n }\n if (compression === 'snappy') {\n throw namedError('CorruptionError', `invalid snapshot compression tag: ${header.kindTag}`);\n }\n const payload = snapshot.subarray(ENVELOPE_HEADER_SIZE);\n if (crc32(payload) !== header.payloadChecksum) {\n throw namedError('CorruptionError', 'snapshot compression checksum mismatch');\n }\n if (header.rawLength > MAX_DECOMPRESSED_SNAPSHOT_BYTES) {\n throw namedError(\n 'CorruptionError',\n `compressed snapshot advertises ${header.rawLength} decompressed bytes, exceeding the ${MAX_DECOMPRESSED_SNAPSHOT_BYTES} byte limit`\n );\n }\n const decompressed = await decompressBytes(\n payload,\n compression,\n `snapshot export (${compression})`,\n header.rawLength\n );\n if (decompressed.byteLength !== header.rawLength) {\n throw namedError(\n 'CorruptionError',\n `decompressed snapshot length mismatch: expected ${header.rawLength} bytes, got ${decompressed.byteLength}`\n );\n }\n return decompressed;\n}\n","export { exposeWorkerApi } from './worker-server';\nimport {\n packedOptionalValues,\n packedScanRows,\n unpackPackedBatchOpKeys,\n unpackPackedBatchOps,\n unpackPackedBinaryList,\n unpackPackedBinaryPairKeys,\n unpackPackedOptionalValues,\n unpackPackedScanRows,\n type PackedBatchOpKey,\n type PackedOptionalValuesV1\n} from './worker-protocol';\nimport type { CommitAppliedEvent, StoreChangeSet } from './change-events';\nimport {\n compressionFromStoreFlags,\n decodeStoreValueRecord,\n encodeStoreValueRecord,\n prepareFastStoreValueRecord,\n writePreparedStoreValueRecord,\n wrapSnapshotWithCompression,\n unwrapSnapshotCompression,\n type CompressionOption,\n type PreparedStoreValueRecord\n} from './compression';\nimport { utf8Encode } from './codec';\nimport { clampTimerDelayMs, isRecord } from './internal';\nimport {\n INDEX_METADATA_STORE,\n cloneNormalizedIndexDefinitions,\n compareNormalizedIndexDefinitions,\n createIndexKeyExtractor,\n decodeIndexEntryKey,\n decodeIndexMetadataValue,\n decodeIndexedDocument,\n encodeIndexEntryKey,\n encodeIndexMetadataKey,\n encodeIndexMetadataValue,\n extractLogicalIndexKey,\n extractLogicalIndexKeyFromDocument,\n findIndexDefinition,\n assertValidScanRange,\n indexKeyExactRange,\n indexRangeToPhysicalRange,\n isInternalStoreName,\n normalizeIndexDefinitions,\n toPublicIndexDefinitions,\n type DecodedIndexEntryKey,\n type NormalizedIndexDef\n} from './indexing';\nimport type {\n AutocommitCommand,\n IndexScanPage,\n WorkerApi,\n WorkerOpenRequest,\n WorkerScanPage,\n WorkerScanPageRequest\n} from './worker-api';\nimport type {\n BatchOp,\n ChangeFeed,\n ChangeFeedOptions,\n ChangeFeedSettings,\n CompactionResult,\n CreateStoreOptions,\n DbChange,\n DbStats,\n DebugFailpoint,\n EngineHealth,\n ExportSnapshotOptions,\n IndexDef,\n PutOptions,\n Range,\n ScanItem,\n StorageInfo,\n TxMode\n} from './types';\ntype WasmBatchOutcome =\n | {\n kind: 'put';\n baselineExists: boolean;\n }\n | {\n kind: 'delete';\n deleted: boolean;\n };\ntype IndexedPutOp = { store: string; kind: 'delete' | 'put'; key: Uint8Array };\ntype PreparedPutValue = PreparedStoreValueRecord | Uint8Array;\ntype NativeValueState = {\n live: boolean;\n expired: boolean;\n revisionKnown: boolean;\n revisionEpoch: bigint;\n revisionOrdinal: bigint;\n expiresAt: bigint;\n maxValueBytes: number;\n};\ntype WasmChangeRecord = Omit<ChangeFeed['changes'][number], 'txId'> & {\n txId: number | bigint;\n};\ntype WasmChangeFeed = {\n changes: WasmChangeRecord[];\n latestTxId: number | bigint;\n};\ntype WasmDbStats = Omit<\n DbStats,\n | 'db_id'\n | 'catalog_root_page_id'\n | 'next_page_id'\n | 'last_committed_txid'\n | 'last_replayed_wal_offset'\n | 'manifest_len'\n | 'main_len'\n | 'wal_len'\n | 'health'\n> & {\n db_id: number | bigint;\n catalog_root_page_id: number | bigint;\n next_page_id: number | bigint;\n last_committed_txid: number | bigint;\n last_replayed_wal_offset: number | bigint;\n manifest_len: number | bigint;\n main_len: number | bigint;\n wal_len: number | bigint;\n health: WasmEngineHealth;\n};\ntype WasmEngineHealth =\n | { state: 'healthy' }\n | { state: 'recoveryRequired'; reason: string; pendingTxid?: number | bigint | null }\n | { state: 'closed' };\ntype WasmRecoveryReport = {\n lastCommittedTxid: number | bigint;\n pendingTxid?: number | bigint | null;\n pendingCommitted: boolean;\n};\ntype WasmChangeFeedPolicy = {\n enabled: boolean;\n retainTxids?: number | bigint | null;\n};\ntype WasmEngine = {\n open(name: string, options: unknown): Promise<void>;\n openGeneration(name: string, generationName: string, options: unknown): Promise<void>;\n /** Checkpoints when healthy, then releases the files. */\n close(): void;\n /** Releases the files without writing anything. */\n abandon(): void;\n health(): WasmEngineHealth;\n needs_recovery(): boolean;\n recover(): WasmRecoveryReport;\n checkpoint(): void;\n compact_into(target: WasmEngine): WasmU64;\n compact_into_skipping_stores(target: WasmEngine, skipStores: string[]): WasmU64;\n change_feed_policy(): WasmChangeFeedPolicy;\n set_change_feed_policy(txId: WasmU64, policy: { enabled: boolean; retainTxids: number | null }): void;\n begin_tx(mode: TxMode): WasmU64;\n commit_tx(txId: WasmU64): WasmU64;\n rollback_tx(txId: WasmU64): void;\n create_store(txId: WasmU64, name: string, options?: unknown): void;\n drop_store(txId: WasmU64, name: string): void;\n clear_store(txId: WasmU64, name: string): void;\n get(txId: WasmU64, store: string, key: Uint8Array): Uint8Array | null;\n get_many(txId: WasmU64, store: string, keys: Array<Uint8Array>): Array<Uint8Array | null>;\n /** Little-endian u32 count | count x u32 length (u32::MAX = missing) | bytes. */\n get_many_packed(txId: WasmU64, store: string, keys: Uint8Array): Uint8Array;\n get_many_value_sizes?(txId: WasmU64, store: string, keys: Uint8Array): Uint32Array;\n get_many_value_states?(txId: WasmU64, store: string, keys: Uint8Array): Uint8Array;\n /** Checks existence without loading the value body; TTL headers may be read. */\n has(txId: WasmU64, store: string, key: Uint8Array): boolean;\n /** Optional for SDK compatibility with older bindings. */\n has_many?(txId: WasmU64, store: string, keys: Array<Uint8Array>): boolean[];\n /** Returns whether a live value existed before the write. */\n put(txId: WasmU64, store: string, key: Uint8Array, value: Uint8Array, options?: unknown): boolean;\n put_many(txId: WasmU64, store: string, entries: Array<[Uint8Array, Uint8Array]>, options?: unknown): boolean[];\n /** One byte per entry: 1 when a live value existed before the write. */\n put_many_packed(txId: WasmU64, store: string, entries: Uint8Array, options?: unknown): Uint8Array;\n put_many_indexed_packed(\n txId: WasmU64,\n store: string,\n entries: Uint8Array,\n indexOps: IndexedPutOp[][],\n options?: unknown\n ): Uint8Array;\n put_index_entry_checked?(\n txId: WasmU64,\n primaryStore: string,\n indexStore: string,\n primaryKey: Uint8Array,\n indexKey: Uint8Array,\n revisionEpoch: WasmU64,\n revisionOrdinal: WasmU64\n ): void;\n delete(txId: WasmU64, store: string, key: Uint8Array): boolean;\n delete_many(txId: WasmU64, store: string, keys: Array<Uint8Array>): boolean[];\n /** One byte per key: 1 when a live value was deleted. */\n delete_many_packed(txId: WasmU64, store: string, keys: Uint8Array): Uint8Array;\n apply_batch(txId: WasmU64, store: string, ops: Array<BatchOp>): WasmBatchOutcome[];\n /** One byte per op: baselineExists for puts, deleted for deletes. */\n apply_batch_packed(txId: WasmU64, store: string, ops: Uint8Array): Uint8Array;\n scan(txId: WasmU64, store: string, range: unknown): unknown;\n open_scan_cursor(txId: WasmU64, store: string, range: unknown, keysOnly: boolean): number;\n scan_cursor_next(\n cursorId: number,\n maxRows: number,\n maxBytes: number\n ): {\n packet: Uint8Array;\n rowCount: number;\n exhausted: boolean;\n };\n close_scan_cursor(cursorId: number): void;\n changes_since(txId: WasmU64, options?: unknown): unknown;\n get_schema_version(): WasmU64;\n export_snapshot(): Uint8Array;\n list_store_configs(): unknown;\n import_snapshot(data: Uint8Array): WasmU64;\n import_snapshot_into(target: WasmEngine, data: Uint8Array): WasmU64;\n reset(): WasmU64;\n list_stores(): unknown;\n set_schema_version(txId: WasmU64, version: WasmU64): void;\n stats(): unknown;\n set_failpoint(failpoint: string | null): void;\n};\nexport type WasmModule = {\n default: (\n options?:\n | string\n | URL\n | Request\n | BufferSource\n | WebAssembly.Module\n | {\n module_or_path?:\n string | URL | Request | BufferSource | WebAssembly.Module | Promise<Response> | Response;\n }\n ) => Promise<unknown>;\n deleteDB(name: string): Promise<void>;\n prepareRebuildTarget(name: string): Promise<{\n generationName: string;\n }>;\n /**\n * Publishes only if the active generation matches `expectedCurrent`.\n * `null` requires no active generation. The written control file is\n * flushed and verified before resolving.\n */\n swapActiveGeneration(name: string, generationName: string, expectedCurrent: string | null): Promise<void>;\n /** Active generation, or null for legacy storage. Corrupt control state needs legacy files for fallback. */\n readActiveGeneration(name: string): Promise<string | null>;\n cleanupInactiveEntries(name: string): Promise<void>;\n dbDirectorySize(name: string): Promise<number>;\n WasmEngine: new () => WasmEngine;\n};\ntype WasmU64 = bigint;\nexport interface WorkerPersistenceBridge {\n persisted(): Promise<boolean>;\n persist(): Promise<boolean>;\n close(): void;\n}\nexport interface DbWorkerOptions {\n loadWasm?: () => Promise<WasmModule>;\n persistence?: WorkerPersistenceBridge;\n}\nfunction toWasmU64(value: number | bigint): WasmU64 {\n return BigInt(value);\n}\nfunction fromWasmU64(value: number | bigint): number {\n const number = typeof value === 'bigint' ? Number(value) : value;\n if (!Number.isSafeInteger(number) || number < 0) {\n throw remoteError('SerializationError', 'WASM integer exceeds the JavaScript safe integer range');\n }\n return number;\n}\nfunction fromOptionalWasmU64(value: number | bigint | null | undefined): number | null {\n return value === null || value === undefined ? null : fromWasmU64(value);\n}\nfunction toWasmPutOptions(options: PutOptions): unknown {\n return options.ttl === undefined ? options : { ...options, ttl: toWasmU64(options.ttl) };\n}\nfunction toWasmRange(range: Range): Range {\n assertValidScanRange(range);\n const normalized: Range = {};\n if (range.gt !== undefined) {\n normalized.gt = range.gt;\n }\n if (range.gte !== undefined) {\n normalized.gte = range.gte;\n }\n if (range.lt !== undefined) {\n normalized.lt = range.lt;\n }\n if (range.lte !== undefined) {\n normalized.lte = range.lte;\n }\n if (range.reverse !== undefined) {\n normalized.reverse = range.reverse;\n }\n if (range.limit !== undefined) {\n normalized.limit = range.limit;\n }\n return normalized;\n}\ninterface TrackedKeyChange {\n key: Uint8Array;\n baselineExists: boolean;\n finalKind: DbChange['kind'];\n}\ninterface TrackedStoreChanges {\n touched: boolean;\n /** Latest store-level change; every tracked key change happened after it. */\n storeLevel: 'clear' | 'drop' | null;\n keys: Map<string, TrackedKeyChange>;\n}\ntype TrackedTxnChanges = Map<string, TrackedStoreChanges>;\ninterface IndexBoundCache {\n txId: number;\n def: NormalizedIndexDef;\n reverse: boolean;\n gt?: Uint8Array;\n gte?: Uint8Array;\n lt?: Uint8Array;\n lte?: Uint8Array;\n physical: Range;\n}\n// Published maps stay immutable. Create/drop gives the transaction a private\n// copy, which commit publishes.\ntype StoreCompressionSnapshot =\n | { owned: false; values: ReadonlyMap<string, CompressionOption> }\n | { owned: true; values: Map<string, CompressionOption> };\ntype MaintenanceOperation = 'compact' | 'rebuild' | 'import';\nconst EMPTY_RANGE: Range = {};\nconst EMPTY_VALUE = new Uint8Array(0);\nconst MAX_ENGINE_KEY_BYTES = 1024;\nconst MAX_PACKED_BYTES = 0xffff_ffff;\nconst INDEX_PUT_BATCH_ROWS = 64;\nconst INDEX_PUT_BATCH_BYTES = 4 * 1024 * 1024;\n// Same ceiling as compression.ts. Uncompressed writes reject here and skip the encoder.\nconst MAX_PLAIN_STORE_VALUE_BYTES = 8 * 1024 * 1024;\nconst INDEX_SCAN_PAGE_ROWS = 256;\nconst INDEX_SCAN_PAGE_BYTES = 8 * 1024 * 1024 + 18 + MAX_ENGINE_KEY_BYTES + 12;\nconst INDEX_SCAN_RAW_CHUNK_ROWS = 512;\nconst RECONCILE_DOCUMENT_CACHE_BYTES = 4 * 1024 * 1024;\nconst RECONCILE_DOCUMENT_CACHE_ROWS = 4096;\nconst HEX_BYTE_STRINGS = Array.from({ length: 256 }, (_value, byte) => byte.toString(16).padStart(2, '0'));\nconst COMPRESSED_READ_CONCURRENCY = 8;\nfunction getOrInsert<K, V>(map: Map<K, V>, key: K, create: () => V): V {\n const existing = map.get(key);\n if (existing !== undefined) {\n return existing;\n }\n const created = create();\n map.set(key, created);\n return created;\n}\nconst PERSISTENCE_BRIDGE_INIT = 'moyodb:persistence-bridge:init';\nconst PERSISTENCE_BRIDGE_REQUEST = 'moyodb:persistence-bridge:request';\nconst PERSISTENCE_BRIDGE_RESPONSE = 'moyodb:persistence-bridge:response';\ntype PersistenceBridgeOperation = 'persist' | 'persisted';\ninterface PersistenceBridgeRequest {\n type: typeof PERSISTENCE_BRIDGE_REQUEST;\n id: number;\n op: PersistenceBridgeOperation;\n}\ninterface PersistenceBridgeResponse {\n type: typeof PERSISTENCE_BRIDGE_RESPONSE;\n id: number;\n granted: boolean;\n}\nfunction isPersistenceBridgeResponse(value: unknown): value is PersistenceBridgeResponse {\n return (\n isRecord(value) &&\n value.type === PERSISTENCE_BRIDGE_RESPONSE &&\n typeof value.id === 'number' &&\n typeof value.granted === 'boolean'\n );\n}\nclass MainThreadPersistenceBridge implements WorkerPersistenceBridge {\n private port: MessagePort | null = null;\n private nextRequestId = 1;\n private pending = new Map<\n number,\n {\n resolve: (value: boolean) => void;\n }\n >();\n private readyResolve: ((port: MessagePort | null) => void) | null = null;\n private ready: Promise<MessagePort | null>;\n constructor() {\n this.ready = new Promise((resolve) => {\n this.readyResolve = resolve;\n });\n self.addEventListener('message', this.handleInitMessage as EventListener);\n }\n async persisted(): Promise<boolean> {\n return this.request('persisted');\n }\n async persist(): Promise<boolean> {\n return this.request('persist');\n }\n close(): void {\n self.removeEventListener('message', this.handleInitMessage as EventListener);\n if (this.readyResolve) {\n this.readyResolve(null);\n this.readyResolve = null;\n }\n if (this.port) {\n this.port.onmessage = null;\n this.port.close();\n this.port = null;\n }\n for (const pending of this.pending.values()) {\n pending.resolve(false);\n }\n this.pending.clear();\n }\n private async request(op: PersistenceBridgeOperation): Promise<boolean> {\n const port = await this.ready;\n if (!port || this.port !== port) {\n return false;\n }\n return new Promise<boolean>((resolve) => {\n const id = this.nextRequestId;\n this.nextRequestId += 1;\n this.pending.set(id, { resolve });\n const request: PersistenceBridgeRequest = {\n type: PERSISTENCE_BRIDGE_REQUEST,\n id,\n op\n };\n try {\n port.postMessage(request);\n } catch {\n this.pending.delete(id);\n resolve(false);\n }\n });\n }\n private handleInitMessage = (event: MessageEvent<unknown>) => {\n if (event.origin !== '' && event.origin !== self.location.origin) {\n return;\n }\n const data = event.data as {\n type?: string;\n } | null;\n if (data?.type !== PERSISTENCE_BRIDGE_INIT) {\n return;\n }\n if (event.ports.length === 0) {\n return;\n }\n const port = event.ports[0];\n if (this.port) {\n port.close();\n return;\n }\n this.port = port;\n this.port.onmessage = this.handleResponse;\n this.port.start();\n self.removeEventListener('message', this.handleInitMessage as EventListener);\n this.readyResolve?.(port);\n this.readyResolve = null;\n };\n private handleResponse = (event: MessageEvent<unknown>) => {\n const data = event.data;\n if (!isPersistenceBridgeResponse(data)) {\n return;\n }\n const pending = this.pending.get(data.id);\n if (!pending) {\n return;\n }\n this.pending.delete(data.id);\n pending.resolve(Boolean(data.granted));\n };\n}\nasync function estimateOriginStorage(): Promise<{\n usage: number;\n quota: number;\n}> {\n const storage = navigator.storage;\n if (typeof storage.estimate !== 'function') {\n return { usage: 0, quota: 0 };\n }\n const estimate = await storage.estimate();\n return {\n usage: estimate.usage ?? 0,\n quota: estimate.quota ?? 0\n };\n}\nfunction bytesToHex(bytes: Uint8Array): string {\n let out = '';\n for (let index = 0; index < bytes.byteLength; index += 1) {\n out += HEX_BYTE_STRINGS[bytes[index]];\n }\n return out;\n}\nfunction bytesEqual(left: Uint8Array, right: Uint8Array): boolean {\n if (left.byteLength !== right.byteLength) {\n return false;\n }\n for (let index = 0; index < left.byteLength; index += 1) {\n if (left[index] !== right[index]) {\n return false;\n }\n }\n return true;\n}\nfunction copyRange(range: Range): Range {\n const copy = toWasmRange(range);\n for (const bound of ['gt', 'gte', 'lt', 'lte'] as const) {\n const value = copy[bound];\n if (value !== undefined) {\n copy[bound] = value.slice();\n }\n }\n return copy;\n}\nfunction rangesEqual(left: Range, right: Range): boolean {\n for (const bound of ['gt', 'gte', 'lt', 'lte'] as const) {\n const a = left[bound];\n const b = right[bound];\n if (a === undefined ? b !== undefined : b === undefined || !bytesEqual(a, b)) {\n return false;\n }\n }\n return left.reverse === right.reverse && left.limit === right.limit;\n}\nfunction sameBound(cached: Uint8Array | undefined, next: Uint8Array | undefined): boolean {\n if (cached === undefined || next === undefined) {\n return cached === next;\n }\n return bytesEqual(cached, next);\n}\nfunction copyBound(value: Uint8Array | undefined): Uint8Array | undefined {\n return value === undefined ? undefined : value.slice();\n}\nfunction compoundEntryKeyLength(logicalKey: Uint8Array, primaryKey: Uint8Array): number {\n return escapedPartLength(logicalKey) + escapedPartLength(primaryKey);\n}\nfunction escapedPartLength(part: Uint8Array): number {\n let length = 2;\n for (let index = 0; index < part.length; index += 1) {\n length += part[index] === 0 ? 2 : 1;\n }\n return length;\n}\nfunction limitPlainStoreValue(value: Uint8Array): Uint8Array {\n if (value.byteLength > MAX_PLAIN_STORE_VALUE_BYTES) {\n const error = new Error(\n `stored value has ${value.byteLength} bytes, exceeding the ${MAX_PLAIN_STORE_VALUE_BYTES} byte limit`\n );\n error.name = 'ValueTooLargeError';\n throw error;\n }\n return value;\n}\n\nfunction normalizeWasmBytes(value: Uint8Array | ArrayBuffer | ArrayLike<number>): Uint8Array {\n if (value instanceof Uint8Array) {\n return value.byteOffset === 0 && value.byteLength === value.buffer.byteLength ? value : value.slice();\n }\n return new Uint8Array(value);\n}\nfunction errorName(error: unknown): string | null {\n if (!isRecord(error)) {\n return null;\n }\n const candidate = error.name ?? error.code;\n return typeof candidate === 'string' ? candidate : null;\n}\nfunction isNamedError(error: unknown, name: string): boolean {\n return errorName(error) === name;\n}\nconst INDEX_SNAPSHOT_TRAILER_MAGIC = utf8Encode('BDBIDX1');\nconst indexSnapshotDecoder = new TextDecoder('utf-8', { fatal: true });\nfunction wrapSnapshotWithIndexDefinitions(snapshot: Uint8Array, defs: ReadonlyArray<NormalizedIndexDef>): Uint8Array {\n if (defs.length === 0) {\n return snapshot;\n }\n const manifest = utf8Encode(JSON.stringify(toPublicIndexDefinitions(defs)));\n const lengthBuffer = new ArrayBuffer(4);\n new DataView(lengthBuffer).setUint32(0, manifest.byteLength, true);\n const out = new Uint8Array(snapshot.byteLength + manifest.byteLength + 4 + INDEX_SNAPSHOT_TRAILER_MAGIC.byteLength);\n let offset = 0;\n out.set(snapshot, offset);\n offset += snapshot.byteLength;\n out.set(manifest, offset);\n offset += manifest.byteLength;\n out.set(new Uint8Array(lengthBuffer), offset);\n offset += 4;\n out.set(INDEX_SNAPSHOT_TRAILER_MAGIC, offset);\n return out;\n}\nfunction unwrapSnapshotWithIndexDefinitions(data: Uint8Array): {\n snapshot: Uint8Array;\n indexes: NormalizedIndexDef[];\n} {\n const magicLength = INDEX_SNAPSHOT_TRAILER_MAGIC.byteLength;\n if (data.byteLength < magicLength + 4) {\n return { snapshot: data, indexes: [] };\n }\n const magicOffset = data.byteLength - magicLength;\n if (!bytesEqual(data.subarray(magicOffset), INDEX_SNAPSHOT_TRAILER_MAGIC)) {\n return { snapshot: data, indexes: [] };\n }\n const lengthOffset = magicOffset - 4;\n if (lengthOffset < 0) {\n return { snapshot: data, indexes: [] };\n }\n const manifestLength = new DataView(data.buffer, data.byteOffset + lengthOffset, 4).getUint32(0, true);\n const manifestOffset = lengthOffset - manifestLength;\n if (manifestOffset < 0) {\n throw remoteError('CorruptionError', 'invalid snapshot index trailer length');\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(indexSnapshotDecoder.decode(data.subarray(manifestOffset, lengthOffset)));\n } catch (error) {\n throw remoteError('CorruptionError', `invalid snapshot index trailer: ${String(error)}`);\n }\n return {\n snapshot: data.subarray(0, manifestOffset),\n indexes: normalizeIndexDefinitions(parsed)\n };\n}\nfunction lifecycleEventChannel(dbName: string): BroadcastChannel {\n return new BroadcastChannel(`db:${dbName}:events`);\n}\nfunction broadcastLifecycleEvent(dbName: string, type: 'owner_changed' | 'db_closed' | 'db_deleted') {\n const channel = lifecycleEventChannel(dbName);\n try {\n channel.postMessage({ type, dbName, txid: null });\n } finally {\n channel.close();\n }\n}\nclass OwnershipLease {\n private releaseResolver: (() => void) | null = null;\n private requestPromise: Promise<unknown> | null = null;\n private held = false;\n async acquire(dbName: string, ownerWaitMs: number): Promise<void> {\n const holdPromise = new Promise<void>((resolve) => {\n this.releaseResolver = resolve;\n });\n const lockName = `db:${dbName}:owner`;\n if (ownerWaitMs === 0) {\n let acquiredResolve: ((value: boolean) => void) | null = null;\n const acquiredPromise = new Promise<boolean>((resolve) => {\n acquiredResolve = resolve;\n });\n const request = navigator.locks.request(\n lockName,\n { mode: 'exclusive', ifAvailable: true },\n async (lock) => {\n if (!lock) {\n acquiredResolve?.(false);\n return false;\n }\n this.held = true;\n acquiredResolve?.(true);\n await holdPromise;\n return true;\n }\n );\n const acquired = await acquiredPromise;\n if (!acquired) {\n throw remoteError('DatabaseBusyError', `database ${dbName} is already owned by another tab`);\n }\n this.requestPromise = request;\n return;\n }\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), clampTimerDelayMs(ownerWaitMs));\n let acquiredResolve: (() => void) | null = null;\n const acquiredPromise = new Promise<void>((resolve) => {\n acquiredResolve = resolve;\n });\n this.requestPromise = navigator.locks.request(\n lockName,\n { mode: 'exclusive', signal: controller.signal },\n async (_lock) => {\n clearTimeout(timeout);\n this.held = true;\n acquiredResolve?.();\n await holdPromise;\n return true;\n }\n );\n try {\n await Promise.race([acquiredPromise, this.requestPromise]);\n } catch {\n if (!this.held) {\n throw remoteError('DatabaseBusyError', `timed out waiting for ownership of ${dbName}`);\n }\n }\n }\n async release(): Promise<void> {\n if (!this.held) {\n return;\n }\n this.releaseResolver?.();\n try {\n await this.requestPromise;\n } finally {\n this.releaseResolver = null;\n this.requestPromise = null;\n this.held = false;\n }\n }\n}\nexport class DbWorker implements WorkerApi {\n private dbName: string | null = null;\n private engine: WasmEngine | null = null;\n private events: BroadcastChannel | null = null;\n private lease: OwnershipLease | null = null;\n private wasmReady: Promise<WasmModule> | null = null;\n private persistenceBridge: WorkerPersistenceBridge;\n private txChanges = new Map<number, TrackedTxnChanges>();\n private txModes = new Map<number, TxMode>();\n private primaryCursors = new Map<\n number,\n { engineId: number; txId: number; ownsTx: boolean; store: string; range: Range; callerTxId?: number }\n >();\n private nextPrimaryCursorId = 1;\n /**\n * Shared committed schema at begin. Reconciliation replaces the array;\n * it never mutates the shared schema.\n */\n private txIndexSchemas = new Map<number, NormalizedIndexDef[]>();\n private indexesBySchema = new WeakMap<NormalizedIndexDef[], Map<string, NormalizedIndexDef[]>>();\n /** Readonly scans reuse a resolved index; readwrite scans recheck so TTL staging still runs. */\n private readonlyIndexCache = new Map<number, Map<string, Map<string, NormalizedIndexDef>>>();\n private indexBoundCache: IndexBoundCache | null = null;\n private txEnsuredRawStores = new Map<number, Set<string>>();\n private txIndexSchemaChanged = new Set<number>();\n private txStoreCompression = new Map<number, StoreCompressionSnapshot>();\n private committedIndexes: NormalizedIndexDef[] | null = null;\n private committedStoreCompression: ReadonlyMap<string, CompressionOption> | null = null;\n private openOptions: WorkerOpenRequest['options'] | null = null;\n private maintenanceOperation: MaintenanceOperation | null = null;\n constructor(private readonly options: DbWorkerOptions = {}) {\n this.persistenceBridge = options.persistence ?? new MainThreadPersistenceBridge();\n }\n async open(request: WorkerOpenRequest): Promise<void> {\n if (this.engine) {\n return;\n }\n assertSecureContext();\n assertCapabilities();\n this.dbName = request.dbName;\n this.events = new BroadcastChannel(`db:${request.dbName}:events`);\n this.lease = new OwnershipLease();\n let engine: WasmEngine | null = null;\n try {\n await this.lease.acquire(request.dbName, request.options.ownerWaitMs);\n const wasm = await this.loadWasm();\n engine = new wasm.WasmEngine();\n await engine.open(request.dbName, {\n create_if_missing: request.options.createIfMissing,\n cache_pages: request.options.cachePages\n });\n if (request.options.changeFeed) {\n applyChangeFeedPolicy(engine, request.options.changeFeed);\n }\n if (request.options.debugFailpoint) {\n engine.set_failpoint(request.options.debugFailpoint);\n }\n this.engine = engine;\n this.openOptions = request.options;\n this.clearRuntimeCaches();\n this.maintenanceOperation = null;\n this.events.postMessage({ type: 'owner_changed', dbName: request.dbName, txid: null });\n } catch (err) {\n await this.cleanupAfterFailedOpen(engine);\n throw remapError(err);\n }\n }\n async close(): Promise<void> {\n this.ensureNotInMaintenance();\n const dbName = this.dbName;\n this.clearRuntimeCaches();\n try {\n this.engine?.close();\n } catch (err) {\n throw remapError(err);\n } finally {\n this.engine = null;\n if (dbName && this.events) {\n this.events.postMessage({ type: 'db_closed', dbName, txid: null });\n }\n this.events?.close();\n this.events = null;\n if (dbName && this.lease) {\n await this.lease.release();\n }\n if (dbName) {\n broadcastLifecycleEvent(dbName, 'owner_changed');\n }\n this.disposePersistenceBridge();\n this.lease = null;\n this.dbName = null;\n this.openOptions = null;\n this.maintenanceOperation = null;\n }\n }\n async destroy(): Promise<void> {\n this.ensureNotInMaintenance();\n const dbName = this.dbName;\n if (!dbName) {\n return;\n }\n let failure: unknown = null;\n try {\n this.rollbackAllTransactions();\n // Skip the checkpoint because the database files will be deleted.\n this.engine?.abandon();\n const wasm = await this.loadWasm();\n await wasm.deleteDB(dbName);\n broadcastLifecycleEvent(dbName, 'db_deleted');\n } catch (err) {\n failure = err;\n } finally {\n this.engine = null;\n this.clearRuntimeCaches();\n this.events?.close();\n this.events = null;\n if (this.lease) {\n try {\n await this.lease.release();\n } catch (err) {\n if (failure === null) {\n failure = err;\n }\n }\n }\n broadcastLifecycleEvent(dbName, 'owner_changed');\n this.disposePersistenceBridge();\n this.lease = null;\n this.dbName = null;\n this.openOptions = null;\n this.maintenanceOperation = null;\n }\n if (failure !== null) {\n throw remapError(failure);\n }\n }\n async deleteDB(dbName: string): Promise<void> {\n assertSecureContext();\n assertCapabilities();\n const lease = new OwnershipLease();\n let failure: unknown = null;\n let acquired = false;\n try {\n await lease.acquire(dbName, 0);\n acquired = true;\n const wasm = await this.loadWasm();\n await wasm.deleteDB(dbName);\n broadcastLifecycleEvent(dbName, 'db_deleted');\n } catch (err) {\n failure = err;\n } finally {\n try {\n await lease.release();\n } catch (err) {\n if (failure === null) {\n failure = err;\n }\n }\n if (acquired) {\n broadcastLifecycleEvent(dbName, 'owner_changed');\n }\n }\n if (failure !== null) {\n throw remapError(failure);\n }\n }\n begin(mode: TxMode): Promise<number> {\n this.recoverEngineIfNeeded();\n const indexSchema = this.loadCommittedIndexSchema();\n const storeCompression = this.loadCommittedStoreCompression();\n const txId = fromWasmU64(this.withEngine((engine) => engine.begin_tx(mode)));\n this.txChanges.set(txId, new Map<string, TrackedStoreChanges>());\n this.txModes.set(txId, mode);\n this.txIndexSchemas.set(txId, indexSchema);\n this.txStoreCompression.set(txId, { owned: false, values: storeCompression });\n return Promise.resolve(txId);\n }\n commit(txId: number): Promise<number> {\n const tracked = this.txChanges.get(txId) ?? new Map<string, TrackedStoreChanges>();\n const indexOverride = this.txIndexSchemaChanged.has(txId) ? this.txIndexSchemas.get(txId) : undefined;\n const storeCompressionSnapshot = this.txStoreCompression.get(txId);\n const txMode = this.txModes.get(txId);\n let txid: number;\n try {\n txid = fromWasmU64(this.withEngine((engine) => engine.commit_tx(toWasmU64(txId))));\n } catch (err) {\n // A failed public commit consumes its handle, but some engine errors\n // retain the transaction. Release it before clearing the SDK state.\n try {\n if (this.engine && !this.engine.needs_recovery()) {\n this.withEngine((engine) => engine.rollback_tx(toWasmU64(txId)));\n }\n } catch {}\n this.cleanupTxState(txId);\n const recovery = this.recoverEngineIfNeeded();\n // Report a recovered durable commit as success. Injected failures\n // model a crash. RecoveryRequiredError refers to an earlier failed\n // operation, so its recovery report cannot confirm this commit.\n if (\n !recovery?.pendingCommitted ||\n recovery.pendingTxid === null ||\n isNamedError(err, 'RecoveryRequiredError') ||\n isNamedError(err, 'InjectedFailureError')\n ) {\n throw err;\n }\n txid = recovery.pendingTxid;\n }\n if (indexOverride) {\n this.committedIndexes = cloneNormalizedIndexDefinitions(indexOverride);\n }\n if (txMode === 'readwrite' && storeCompressionSnapshot) {\n this.committedStoreCompression = storeCompressionSnapshot.values;\n }\n this.cleanupTxState(txId);\n if (this.dbName && this.events) {\n const event: CommitAppliedEvent = {\n type: 'commit_applied',\n dbName: this.dbName,\n txid,\n stores: this.finalizeTrackedChanges(tracked)\n };\n this.events.postMessage(event);\n }\n return Promise.resolve(txid);\n }\n rollback(txId: number): Promise<void> {\n try {\n this.withEngine((engine) => engine.rollback_tx(toWasmU64(txId)));\n } finally {\n this.cleanupTxState(txId);\n }\n return Promise.resolve();\n }\n async autocommit(mode: TxMode, command: AutocommitCommand, args: unknown[]): Promise<unknown> {\n const txId = await this.begin(mode);\n const method = this[command] as unknown as (...methodArgs: unknown[]) => Promise<unknown>;\n let result: unknown;\n try {\n result = await method.apply(this, [txId, ...args]);\n } catch (error) {\n try {\n await this.rollback(txId);\n } catch {}\n throw error;\n }\n if (mode === 'readwrite') {\n await this.commit(txId);\n } else {\n await this.rollback(txId);\n }\n return result;\n }\n createStore(txId: number, name: string, options: CreateStoreOptions = {}): Promise<void> {\n const compression = isInternalStoreName(name) ? false : (options.compression ?? 'snappy');\n this.txEnsuredRawStores.get(txId)?.delete(name);\n this.withEngine((engine) => engine.create_store(toWasmU64(txId), name, { compression }));\n this.recordStoreCompressionCreate(txId, name, compression);\n this.ensureInternalStoresForStore(txId, name);\n this.markStoreTouched(txId, name);\n return Promise.resolve();\n }\n dropStore(txId: number, name: string): Promise<void> {\n const defs = this.indexesForStoreInTx(txId, name);\n this.txEnsuredRawStores.get(txId)?.delete(name);\n this.withEngine((engine) => engine.drop_store(toWasmU64(txId), name));\n this.recordStoreCompressionDrop(txId, name);\n for (const def of defs) {\n this.dropRawStoreIfExists(txId, def.internalStore);\n }\n this.recordStoreLevelChange(txId, name, 'drop');\n return Promise.resolve();\n }\n clearStore(txId: number, name: string): Promise<void> {\n const defs = this.indexesForStoreInTx(txId, name);\n this.txEnsuredRawStores.get(txId)?.delete(name);\n this.withEngine((engine) => engine.clear_store(toWasmU64(txId), name));\n for (const def of defs) {\n this.clearRawStoreIfExists(txId, def.internalStore);\n }\n this.recordStoreLevelChange(txId, name, 'clear');\n return Promise.resolve();\n }\n async get(txId: number, store: string, key: Uint8Array): Promise<Uint8Array | null> {\n return this.readStoreValue(txId, store, key);\n }\n async getMany(txId: number, store: string, keys: Array<Uint8Array>): Promise<Array<Uint8Array | null>> {\n const values = this.withEngine((engine) => engine.get_many(toWasmU64(txId), store, keys));\n const compressed = !isInternalStoreName(store) && this.storeCompressionForTx(txId, store) !== false;\n // Normalize all borrowed views before a decoder can suspend. Values\n // waiting for a decoder must also retain stable buffers.\n for (let index = 0; index < values.length; index += 1) {\n const value = values[index];\n if (value !== null) {\n values[index] = normalizeWasmBytes(value);\n }\n }\n return compressed ? this.decodeStoreValues(txId, store, values) : values;\n }\n async getManyPacked(\n txId: number,\n store: string,\n packedKeys: Uint8Array\n ): Promise<PackedOptionalValuesV1 | Array<Uint8Array | null>> {\n const packed = normalizeWasmBytes(\n this.withEngine((engine) => engine.get_many_packed(toWasmU64(txId), store, packedKeys))\n );\n if (isInternalStoreName(store) || this.storeCompressionForTx(txId, store) === false) {\n // The protocol accepts the engine packet directly.\n return packedOptionalValues(packed);\n }\n // Decoders retain views of this private packet, including while queued.\n return this.decodeStoreValues(txId, store, unpackPackedOptionalValues(packed));\n }\n has(txId: number, store: string, key: Uint8Array): Promise<boolean> {\n return Promise.resolve(this.withEngine((engine) => engine.has(toWasmU64(txId), store, key)));\n }\n async put(\n txId: number,\n store: string,\n key: Uint8Array,\n value: Uint8Array,\n options: PutOptions = {}\n ): Promise<void> {\n await this.putEntry(txId, store, key, value, options);\n }\n private async putEntry(\n txId: number,\n store: string,\n key: Uint8Array,\n value: Uint8Array,\n options: PutOptions,\n knownDefs?: readonly NormalizedIndexDef[],\n knownCompression?: CompressionOption\n ): Promise<void> {\n const defs = knownDefs ?? this.indexesForStoreInTx(txId, store);\n const compression = knownCompression ?? this.storeCompressionForTx(txId, store);\n if (defs.length === 0) {\n const preparedValue = this.prepareStoredValue(store, value, compression);\n const storedValue = preparedValue instanceof Uint8Array ? preparedValue : await preparedValue;\n const baselineExists = this.withEngine((engine) =>\n engine.put(toWasmU64(txId), store, key, storedValue, toWasmPutOptions(options))\n );\n this.recordPutChange(txId, store, key, baselineExists);\n return;\n }\n await this.putIndexedMany(txId, store, [key, value], defs, options);\n }\n async putMany(\n txId: number,\n store: string,\n entries: Array<[Uint8Array, Uint8Array]>,\n options: PutOptions = {}\n ): Promise<void> {\n if (entries.length === 0) {\n return;\n }\n const defs = this.indexesForStoreInTx(txId, store);\n if (defs.length === 0) {\n const storedEntries = await this.encodeEntriesForWrite(txId, store, entries);\n let baselines: boolean[];\n try {\n baselines = this.withEngine((engine) =>\n engine.put_many(toWasmU64(txId), store, storedEntries, toWasmPutOptions(options))\n );\n } catch (error) {\n const partial = partialBooleanOutcomes(error);\n this.recordPutChanges(txId, store, entries, partial);\n throw error;\n }\n if (baselines.length !== entries.length) {\n throw outcomeCountMismatch('put_many', baselines.length, entries.length);\n }\n this.recordPutChanges(txId, store, entries, baselines);\n return;\n }\n const items = new Array<Uint8Array>(entries.length * 2);\n for (let index = 0; index < entries.length; index += 1) {\n items[index * 2] = entries[index][0];\n items[index * 2 + 1] = entries[index][1];\n }\n await this.putIndexedMany(txId, store, items, defs, options);\n }\n async putManyPacked(\n txId: number,\n store: string,\n packedEntries: Uint8Array,\n options: PutOptions = {}\n ): Promise<void> {\n const defs = this.indexesForStoreInTx(txId, store);\n if (defs.length !== 0) {\n const items = unpackPackedBinaryList(packedEntries);\n if (items.length % 2 !== 0) {\n throw remoteError('WorkerProtocolError', 'packed putMany payload has an odd item count');\n }\n await this.putIndexedMany(txId, store, items, defs, options);\n return;\n }\n const compression = this.storeCompressionForTx(txId, store);\n const items = compression === false ? null : unpackPackedBinaryList(packedEntries);\n if (items !== null && items.length % 2 !== 0) {\n throw remoteError('WorkerProtocolError', 'packed putMany payload has an odd item count');\n }\n const keys =\n items === null\n ? unpackPackedBinaryPairKeys(packedEntries)\n : items.filter((_item, index) => index % 2 === 0);\n if (keys.length === 0) {\n return;\n }\n const storedEntries =\n items === null ? packedEntries : await this.encodePackedEntriesForWrite(txId, store, items, keys);\n let baselines: Uint8Array;\n try {\n baselines = this.withEngine((engine) =>\n engine.put_many_packed(toWasmU64(txId), store, storedEntries, toWasmPutOptions(options))\n );\n } catch (error) {\n const partial = partialBooleanOutcomes(error);\n this.recordPutKeyChanges(txId, store, keys, partial);\n throw error;\n }\n if (baselines.length !== keys.length) {\n throw outcomeCountMismatch('put_many_packed', baselines.length, keys.length);\n }\n this.recordPutKeyChanges(txId, store, keys, baselines);\n }\n async delete(txId: number, store: string, key: Uint8Array): Promise<boolean> {\n const defs = this.indexesForStoreInTx(txId, store);\n // Load the previous document only when its index keys must be removed.\n const oldValue = defs.length === 0 ? null : await this.readStoreValue(txId, store, key);\n const oldKeyFor = oldValue === null ? null : createIndexKeyExtractor(oldValue);\n const oldLogicalKeys = oldKeyFor === null ? [] : defs.map((def) => ({ def, logicalKey: oldKeyFor(def) }));\n const deleted = this.withEngine((engine) => engine.delete(toWasmU64(txId), store, key));\n if (!deleted) {\n this.recordDeleteChange(txId, store, key, false);\n return false;\n }\n for (const entry of oldLogicalKeys) {\n if (entry.logicalKey !== null) {\n this.deleteIndexEntryIfPresent(txId, entry.def, entry.logicalKey, key);\n }\n }\n this.recordDeleteChange(txId, store, key, true);\n return true;\n }\n async deleteMany(txId: number, store: string, keys: Array<Uint8Array>): Promise<void> {\n if (keys.length === 0) {\n return;\n }\n const defs = this.indexesForStoreInTx(txId, store);\n if (defs.length === 0) {\n let deleted: boolean[];\n try {\n deleted = this.withEngine((engine) => engine.delete_many(toWasmU64(txId), store, keys));\n } catch (error) {\n const partial = partialBooleanOutcomes(error);\n for (let i = 0; i < partial.length && i < keys.length; i += 1) {\n this.recordDeleteChange(txId, store, keys[i], partial[i]);\n }\n throw error;\n }\n if (deleted.length !== keys.length) {\n throw outcomeCountMismatch('delete_many', deleted.length, keys.length);\n }\n for (let i = 0; i < keys.length; i += 1) {\n this.recordDeleteChange(txId, store, keys[i], deleted[i]);\n }\n return;\n }\n for (const key of keys) {\n await this.delete(txId, store, key);\n }\n }\n async deleteManyPacked(txId: number, store: string, packedKeys: Uint8Array): Promise<void> {\n const defs = this.indexesForStoreInTx(txId, store);\n const keys = unpackPackedBinaryList(packedKeys);\n if (keys.length === 0) {\n return;\n }\n if (defs.length !== 0) {\n await this.deleteMany(txId, store, keys);\n return;\n }\n let deleted: Uint8Array;\n try {\n deleted = this.withEngine((engine) => engine.delete_many_packed(toWasmU64(txId), store, packedKeys));\n } catch (error) {\n const partial = partialBooleanOutcomes(error);\n for (let i = 0; i < partial.length && i < keys.length; i += 1) {\n this.recordDeleteChange(txId, store, keys[i], partial[i]);\n }\n throw error;\n }\n if (deleted.length !== keys.length) {\n throw outcomeCountMismatch('delete_many_packed', deleted.length, keys.length);\n }\n for (let i = 0; i < keys.length; i += 1) {\n this.recordDeleteChange(txId, store, keys[i], deleted[i] === 1);\n }\n }\n async applyBatch(txId: number, store: string, ops: Array<BatchOp>): Promise<void> {\n if (ops.length === 0) {\n return;\n }\n const defs = this.indexesForStoreInTx(txId, store);\n if (defs.length === 0) {\n const storedOps = await this.encodeBatchOpsForWrite(txId, store, ops);\n let outcomes: WasmBatchOutcome[];\n try {\n outcomes = this.withEngine((engine) => engine.apply_batch(toWasmU64(txId), store, storedOps));\n } catch (error) {\n this.recordBatchOutcomes(txId, store, ops, partialBatchOutcomes(error));\n throw error;\n }\n if (outcomes.length !== ops.length) {\n throw outcomeCountMismatch('apply_batch', outcomes.length, ops.length);\n }\n this.recordBatchOutcomes(txId, store, ops, outcomes);\n return;\n }\n for (const op of ops) {\n if (op.kind === 'put') {\n await this.put(txId, store, op.key, op.value);\n } else {\n await this.delete(txId, store, op.key);\n }\n }\n }\n async applyBatchPacked(txId: number, store: string, packedOps: Uint8Array): Promise<void> {\n const defs = this.indexesForStoreInTx(txId, store);\n if (defs.length !== 0 || this.storeCompressionForTx(txId, store) !== false) {\n const ops = unpackPackedBatchOps(packedOps);\n if (ops.length === 0) {\n return;\n }\n await this.applyBatch(txId, store, ops);\n return;\n }\n const ops = unpackPackedBatchOpKeys(packedOps);\n if (ops.length === 0) {\n return;\n }\n let flags: Uint8Array;\n try {\n flags = this.withEngine((engine) => engine.apply_batch_packed(toWasmU64(txId), store, packedOps));\n } catch (error) {\n this.recordBatchOutcomes(txId, store, ops, partialBatchOutcomes(error));\n throw error;\n }\n if (flags.length !== ops.length) {\n throw outcomeCountMismatch('apply_batch_packed', flags.length, ops.length);\n }\n for (let i = 0; i < ops.length; i += 1) {\n const op = ops[i];\n if (op.kind === 'put') {\n this.recordPutChange(txId, store, op.key, flags[i] === 1);\n } else {\n this.recordDeleteChange(txId, store, op.key, flags[i] === 1);\n }\n }\n }\n async scan(txId: number, store: string, range: Range): Promise<ScanItem[]> {\n return this.readStoreScan(txId, store, range);\n }\n async scanPage(request: WorkerScanPageRequest): Promise<WorkerScanPage> {\n if (\n !Number.isSafeInteger(request.maxRows) ||\n request.maxRows <= 0 ||\n request.maxRows > MAX_PACKED_BYTES ||\n !Number.isSafeInteger(request.maxBytes) ||\n request.maxBytes < 4 ||\n request.maxBytes > MAX_PACKED_BYTES\n ) {\n throw remoteError(\n 'InvalidRangeError',\n 'scan page budgets must be positive u32 integers; maxBytes must be at least 4'\n );\n }\n let cursorId = request.cursorId;\n let cursor = cursorId === undefined ? undefined : this.primaryCursors.get(cursorId);\n if (cursorId !== undefined) {\n if (!cursor) {\n throw remoteError('TransactionClosedError', 'scan cursor is closed');\n }\n if (\n cursor.store !== request.store ||\n cursor.callerTxId !== request.txId ||\n !rangesEqual(cursor.range, request.range ?? EMPTY_RANGE)\n ) {\n throw remoteError('InvalidRangeError', 'scan continuation does not match the cursor');\n }\n } else {\n const ownsTx = request.txId === undefined;\n const txId = request.txId ?? (await this.begin('readonly'));\n const range = copyRange(request.range ?? EMPTY_RANGE);\n let engineId: number;\n try {\n engineId = this.withEngine((engine) =>\n engine.open_scan_cursor(toWasmU64(txId), request.store, toWasmRange(range), false)\n );\n } catch (error) {\n if (ownsTx) {\n try {\n await this.rollback(txId);\n } catch {}\n }\n throw error;\n }\n cursorId = this.nextPrimaryCursorId++;\n cursor = { engineId, txId, ownsTx, store: request.store, range, callerTxId: request.txId };\n this.primaryCursors.set(cursorId, cursor);\n }\n try {\n const page = this.withEngine((engine) =>\n engine.scan_cursor_next(cursor.engineId, request.maxRows, request.maxBytes)\n );\n const packet = normalizeWasmBytes(page.packet);\n const rowCount =\n packet.byteLength < 4 ? -1 : new DataView(packet.buffer, packet.byteOffset, 4).getUint32(0, true);\n if (rowCount !== page.rowCount || rowCount > request.maxRows || packet.byteLength > request.maxBytes) {\n throw remoteError('CorruptionError', 'scan cursor returned an invalid page budget or count');\n }\n const compressed = this.storeCompressionForTx(cursor.txId, cursor.store) !== false;\n const rows = compressed ? unpackPackedScanRows(packet) : null;\n let bytes = packet.byteLength;\n if (rows !== null) {\n bytes = 4;\n for (const row of rows) {\n row.value = await decodeStoreValueRecord(row.value, { strict: true });\n bytes += 8 + row.key.byteLength + row.value.byteLength;\n if (bytes > request.maxBytes) {\n throw remoteError('ValueTooLargeError', 'decoded scan page exceeds maxBytes');\n }\n }\n }\n if (page.exhausted) {\n await this.closeCursor(cursorId!);\n }\n return {\n rows: rows ?? (packedScanRows(packet) as unknown as ScanItem[]),\n done: page.exhausted,\n bytes,\n ...(page.exhausted ? {} : { cursorId })\n };\n } catch (error) {\n try {\n await this.closeCursor(cursorId!);\n } catch {}\n throw error;\n }\n }\n async closeCursor(cursorId: number): Promise<void> {\n const cursor = this.primaryCursors.get(cursorId);\n if (!cursor) {\n return;\n }\n this.primaryCursors.delete(cursorId);\n try {\n this.withEngine((engine) => engine.close_scan_cursor(cursor.engineId));\n } finally {\n if (cursor.ownsTx) {\n await this.rollback(cursor.txId);\n }\n }\n }\n async getByIndex(txId: number, store: string, indexName: string, key: Uint8Array): Promise<Uint8Array | null> {\n const def = this.resolveIndexDefinition(txId, store, indexName);\n const page = await this.loadVisibleIndexPage(txId, def, { gte: key, lte: key }, null, 1);\n return page.rows.length === 0 ? null : page.rows[0].value;\n }\n async scanByIndex(txId: number, store: string, indexName: string, range: Range = {}): Promise<ScanItem[]> {\n assertValidScanRange(range);\n const def = this.resolveIndexDefinition(txId, store, indexName);\n const rows: ScanItem[] = [];\n let remaining = range.limit ?? Number.POSITIVE_INFINITY;\n if (remaining <= 0) {\n return rows;\n }\n const physical = this.physicalIndexRange(txId, def, range);\n let cursor: Uint8Array | null = null;\n while (remaining > 0) {\n const page = await this.loadVisibleIndexPage(\n txId,\n def,\n range,\n cursor,\n Math.min(remaining, INDEX_SCAN_PAGE_ROWS),\n INDEX_SCAN_PAGE_BYTES,\n physical\n );\n rows.push(...page.rows);\n remaining -= page.rows.length;\n if (page.cursor === null) {\n break;\n }\n cursor = page.cursor;\n }\n return rows;\n }\n async scanByIndexPage(\n txId: number,\n store: string,\n indexName: string,\n range: Range,\n cursor: Uint8Array | null,\n limit: number,\n maxBytes: number = INDEX_SCAN_PAGE_BYTES\n ): Promise<IndexScanPage> {\n if (!Number.isSafeInteger(limit) || limit <= 0) {\n throw remoteError('InvalidRangeError', 'index scan page limit must be a positive integer');\n }\n if (!Number.isSafeInteger(maxBytes) || maxBytes < 4 || maxBytes > MAX_PACKED_BYTES) {\n throw remoteError('InvalidRangeError', 'index scan page maxBytes must be a u32 integer of at least 4');\n }\n const def = this.resolveIndexDefinition(txId, store, indexName);\n return this.loadVisibleIndexPage(\n txId,\n def,\n range,\n cursor,\n limit,\n maxBytes,\n this.physicalIndexRange(txId, def, range)\n );\n }\n getIndexes(txId?: number): Promise<IndexDef[]> {\n return Promise.resolve(\n toPublicIndexDefinitions(txId === undefined ? this.loadCommittedIndexSchema() : this.indexSchemaForTx(txId))\n );\n }\n async reconcileIndexes(txId: number, indexes: IndexDef[]): Promise<void> {\n const target = normalizeIndexDefinitions(indexes);\n this.ensureRawStore(txId, INDEX_METADATA_STORE);\n const current = this.readIndexSchemaInTx(txId);\n const targetStores = new Set(target.map((def) => def.internalStore));\n for (const def of current) {\n if (!targetStores.has(def.internalStore)) {\n this.dropRawStoreIfExists(txId, def.internalStore);\n }\n }\n this.clearRawStoreIfExists(txId, INDEX_METADATA_STORE);\n let documentStore: string | null = null;\n let cachedBytes = 0;\n let sourceRows: ScanItem[] | null = null;\n const canRefreshVisibility = typeof this.engine?.has_many === 'function';\n const documents = new Map<string, { bytes: Uint8Array; inputBytes: number; document: unknown }>();\n for (const def of target) {\n if (documentStore !== def.store) {\n documents.clear();\n cachedBytes = 0;\n sourceRows = null;\n documentStore = def.store;\n }\n this.ensureRawStore(txId, def.internalStore);\n this.clearRawStoreIfExists(txId, def.internalStore);\n if (this.rawStoreExistsInTx(txId, def.store)) {\n let rows: ScanItem[];\n if (sourceRows !== null) {\n // The transaction lane keeps source keys and bytes stable.\n // Refresh TTL visibility and stage expiry before validating\n // this index, using one timestamp for all cached rows.\n const visible = this.withEngine((engine) =>\n engine.has_many!(\n toWasmU64(txId),\n def.store,\n sourceRows!.map((row) => row.key)\n )\n );\n if (visible.length !== sourceRows.length) {\n throw outcomeCountMismatch('has_many', visible.length, sourceRows.length);\n }\n rows = sourceRows.filter((_row, index) => visible[index]);\n } else {\n // Full scans refresh visibility when caching is unavailable.\n rows = await this.readStoreScan(txId, def.store, EMPTY_RANGE);\n if (canRefreshVisibility && rows.length <= RECONCILE_DOCUMENT_CACHE_ROWS) {\n let inputBytes = 0;\n for (const row of rows) {\n inputBytes += row.key.byteLength + row.value.byteLength;\n if (inputBytes > RECONCILE_DOCUMENT_CACHE_BYTES) {\n break;\n }\n }\n if (inputBytes <= RECONCILE_DOCUMENT_CACHE_BYTES) {\n // Source rows and the document cache share owned value buffers.\n sourceRows = rows;\n }\n }\n }\n for (const row of rows) {\n const token = bytesToHex(row.key);\n const cached = documents.get(token);\n let document: unknown;\n if (cached && (cached.bytes === row.value || bytesEqual(cached.bytes, row.value))) {\n document = cached.document;\n cached.bytes = row.value;\n } else {\n document = decodeIndexedDocument(row.value);\n const previousBytes = cached?.inputBytes ?? 0;\n const inputBytes = row.key.byteLength + row.value.byteLength;\n if (\n (cached || documents.size < RECONCILE_DOCUMENT_CACHE_ROWS) &&\n cachedBytes - previousBytes + inputBytes <= RECONCILE_DOCUMENT_CACHE_BYTES\n ) {\n documents.set(token, { bytes: row.value, inputBytes, document });\n cachedBytes += inputBytes - previousBytes;\n } else if (cached) {\n documents.delete(token);\n cachedBytes -= previousBytes;\n }\n }\n const logicalKey = extractLogicalIndexKeyFromDocument(def, document);\n if (logicalKey === null) {\n continue;\n }\n await this.assertUniqueIndexAvailability(txId, def, logicalKey, row.key);\n this.putIndexEntry(txId, def, this.buildIndexEntryKey(def, logicalKey, row.key), EMPTY_VALUE);\n }\n }\n this.putRawValue(\n txId,\n INDEX_METADATA_STORE,\n encodeIndexMetadataKey(def.store, def.name),\n encodeIndexMetadataValue(def)\n );\n }\n this.txIndexSchemas.set(txId, cloneNormalizedIndexDefinitions(target));\n this.txIndexSchemaChanged.add(txId);\n }\n listStores(): Promise<string[]> {\n return Promise.resolve(this.currentStoreNames());\n }\n getVersion(): Promise<number> {\n return Promise.resolve(fromWasmU64(this.withEngine((engine) => engine.get_schema_version())));\n }\n async changesSince(txId: number, options: ChangeFeedOptions = {}): Promise<ChangeFeed> {\n const visibleStores = options.stores?.filter((store) => !isInternalStoreName(store));\n const engineOptions: ChangeFeedOptions = {\n ...options,\n stores: visibleStores ? [...visibleStores] : undefined,\n limit: visibleStores ? options.limit : undefined\n };\n const feed = this.withEngine((engine) =>\n engine.changes_since(toWasmU64(txId), engineOptions)\n ) as WasmChangeFeed;\n const allowedStores = visibleStores ? new Set(visibleStores) : null;\n const changes: ChangeFeed['changes'] = [];\n for (const change of feed.changes) {\n if (isInternalStoreName(change.store)) {\n continue;\n }\n if (allowedStores && !allowedStores.has(change.store)) {\n continue;\n }\n const key =\n options.limit === undefined || changes.length < options.limit ? normalizeWasmBytes(change.key) : null;\n let value: Uint8Array | undefined;\n if (change.value !== undefined) {\n // Validate returned public records beyond the output limit\n // so their corruption errors still reach the caller.\n value = await this.decodeStoreValueForFeed(change.store, normalizeWasmBytes(change.value));\n }\n if (key === null) {\n continue;\n }\n changes.push({\n txId: fromWasmU64(change.txId),\n store: change.store,\n key,\n kind: change.kind,\n value\n });\n }\n return {\n latestTxId: fromWasmU64(feed.latestTxId),\n changes\n };\n }\n setSchemaVersion(txId: number, version: number): Promise<void> {\n this.withEngine((engine) => engine.set_schema_version(toWasmU64(txId), toWasmU64(version)));\n return Promise.resolve();\n }\n async exportSnapshot(options: ExportSnapshotOptions = {}): Promise<Uint8Array> {\n const defs = cloneNormalizedIndexDefinitions(this.loadCommittedIndexSchema());\n const bytes = this.withEngine((engine) => engine.export_snapshot());\n const wrapped = wrapSnapshotWithIndexDefinitions(normalizeWasmBytes(bytes), defs);\n return await wrapSnapshotWithCompression(wrapped, options.compression ?? false);\n }\n async importSnapshot(data: Uint8Array): Promise<void> {\n this.ensureNotInMaintenance();\n const decompressed = await unwrapSnapshotCompression(data);\n const parsed = unwrapSnapshotWithIndexDefinitions(decompressed);\n await this.runGenerationOperation('import', parsed);\n }\n async reset(): Promise<void> {\n const dbName = this.dbName;\n if (!dbName) {\n throw remoteError('InternalError', 'engine is not open');\n }\n const defs = cloneNormalizedIndexDefinitions(this.loadCommittedIndexSchema());\n this.rollbackAllTransactions();\n const stores: StoreChangeSet[] = this.currentStoreNames().map((store) => ({\n store,\n changes: [{ key: new Uint8Array(0), kind: 'clear' }]\n }));\n const txid = fromWasmU64(this.withEngine((engine) => engine.reset()));\n this.committedIndexes = [];\n await this.applyCommittedIndexSchema(defs);\n if (this.events) {\n const event: CommitAppliedEvent = {\n type: 'commit_applied',\n dbName,\n txid,\n stores\n };\n this.events.postMessage(event);\n }\n }\n async compact(): Promise<CompactionResult> {\n return this.runGenerationOperation('compact');\n }\n async rebuild(): Promise<CompactionResult> {\n return this.runGenerationOperation('rebuild');\n }\n stats(): Promise<DbStats> {\n const stats = this.withEngine((engine) => engine.stats()) as WasmDbStats;\n return Promise.resolve({\n ...stats,\n db_id: typeof stats.db_id === 'bigint' ? Number(stats.db_id) : stats.db_id,\n catalog_root_page_id: fromWasmU64(stats.catalog_root_page_id),\n next_page_id: fromWasmU64(stats.next_page_id),\n last_committed_txid: fromWasmU64(stats.last_committed_txid),\n last_replayed_wal_offset: fromWasmU64(stats.last_replayed_wal_offset),\n manifest_len: fromWasmU64(stats.manifest_len),\n main_len: fromWasmU64(stats.main_len),\n wal_len: fromWasmU64(stats.wal_len),\n health: normalizeEngineHealth(stats.health),\n store_count: this.currentStoreNames().length\n });\n }\n async storageInfo(): Promise<StorageInfo> {\n const [dbSize, estimate, persisted] = await Promise.all([\n this.dbDirectorySize(),\n estimateOriginStorage(),\n this.persistenceBridge.persisted()\n ]);\n return {\n dbSize,\n originUsage: estimate.usage,\n originQuota: estimate.quota,\n persisted\n };\n }\n async requestPersistence(): Promise<boolean> {\n return this.persistenceBridge.persist();\n }\n setFailpoint(failpoint: DebugFailpoint): Promise<void> {\n this.withEngine((engine) => engine.set_failpoint(failpoint));\n return Promise.resolve();\n }\n private requireDbName(): string {\n if (!this.dbName) {\n throw remoteError('InternalError', 'engine is not open');\n }\n return this.dbName;\n }\n private ensureNotInMaintenance(): void {\n if (!this.maintenanceOperation) {\n return;\n }\n const dbName = this.dbName ?? 'database';\n throw remoteError('DatabaseBusyError', `database ${dbName} is busy: ${this.maintenanceOperation} in progress`);\n }\n private currentCachePages(): number {\n return this.openOptions?.cachePages ?? 256;\n }\n private async dbDirectorySize(): Promise<number> {\n const wasm = await this.loadWasm();\n return wasm.dbDirectorySize(this.requireDbName());\n }\n private async applyCommittedIndexSchema(defs: ReadonlyArray<NormalizedIndexDef>): Promise<void> {\n const normalized = cloneNormalizedIndexDefinitions(defs);\n if (normalized.length === 0) {\n this.committedIndexes = [];\n return;\n }\n const txId = fromWasmU64(\n this.withEngine((engine) => engine.begin_tx('readwrite'), { allowDuringMaintenance: true })\n );\n this.txChanges.set(txId, new Map());\n this.txModes.set(txId, 'readwrite');\n this.txStoreCompression.set(txId, { owned: false, values: this.loadCommittedStoreCompression() });\n try {\n await this.reconcileIndexes(txId, toPublicIndexDefinitions(normalized));\n fromWasmU64(\n this.withEngine((engine) => engine.commit_tx(toWasmU64(txId)), { allowDuringMaintenance: true })\n );\n this.committedIndexes = cloneNormalizedIndexDefinitions(normalized);\n } catch (error) {\n try {\n this.withEngine((engine) => engine.rollback_tx(toWasmU64(txId)), { allowDuringMaintenance: true });\n } catch {}\n throw error;\n } finally {\n this.cleanupTxState(txId);\n }\n }\n /**\n * Publishes a fresh generation only if the active generation has not changed.\n * A failed swap may have reached storage; read the control file before cleanup.\n * After publication, abandon the old engine to avoid a checkpoint into inactive files.\n */\n private async runGenerationOperation(\n operation: MaintenanceOperation,\n imported?: { snapshot: Uint8Array; indexes: NormalizedIndexDef[] }\n ): Promise<CompactionResult> {\n const dbName = this.requireDbName();\n if (this.maintenanceOperation) {\n throw remoteError(\n 'DatabaseBusyError',\n `database ${dbName} is busy: ${this.maintenanceOperation} in progress`\n );\n }\n this.maintenanceOperation = operation;\n const start = performance.now();\n let wasm: WasmModule | null = null;\n let rebuiltEngine: WasmEngine | null = null;\n let generationName: string | null = null;\n let published = false;\n try {\n wasm = await this.loadWasm();\n const sizeBefore = await wasm.dbDirectorySize(dbName);\n const defs = cloneNormalizedIndexDefinitions(imported?.indexes ?? this.loadCommittedIndexSchema());\n this.rollbackAllTransactions({ allowDuringMaintenance: true });\n const expectedGeneration = await wasm.readActiveGeneration(dbName);\n generationName = (await wasm.prepareRebuildTarget(dbName)).generationName;\n rebuiltEngine = new wasm.WasmEngine();\n await rebuiltEngine.openGeneration(dbName, generationName, {\n create_if_missing: true,\n cache_pages: this.currentCachePages()\n });\n const target = rebuiltEngine;\n this.withEngine(\n (engine) =>\n imported\n ? fromWasmU64(engine.import_snapshot_into(target, imported.snapshot))\n : operation === 'rebuild'\n ? engine.compact_into_skipping_stores(target, [\n ...defs.map((def) => def.internalStore),\n INDEX_METADATA_STORE\n ])\n : engine.compact_into(target),\n { allowDuringMaintenance: true }\n );\n if ((operation === 'rebuild' || imported) && defs.length > 0) {\n // Regenerate managed indexes before activating the target generation.\n const previousEngine = this.engine;\n const previousMaintenance = this.maintenanceOperation;\n this.engine = target;\n this.maintenanceOperation = null;\n try {\n this.committedIndexes = [];\n this.committedStoreCompression = null;\n await this.applyCommittedIndexSchema(defs);\n } finally {\n this.engine = previousEngine;\n this.maintenanceOperation = previousMaintenance;\n this.committedStoreCompression = null;\n }\n }\n try {\n await wasm.swapActiveGeneration(dbName, generationName, expectedGeneration);\n published = true;\n } catch (swapError) {\n published = (await readActiveGenerationOrNull(wasm, dbName)) === generationName;\n if (!published) {\n throw swapError;\n }\n }\n const previousEngine = this.engine;\n this.engine = rebuiltEngine;\n rebuiltEngine = null;\n this.committedIndexes = defs;\n this.committedStoreCompression = null;\n try {\n previousEngine?.abandon();\n } catch {}\n try {\n await wasm.cleanupInactiveEntries(dbName);\n } catch {}\n const sizeAfter = imported ? sizeBefore : await wasm.dbDirectorySize(dbName);\n return {\n sizeBefore,\n sizeAfter,\n reclaimedBytes: Math.max(0, sizeBefore - sizeAfter),\n durationMs: performance.now() - start\n };\n } catch (error) {\n if (!published) {\n this.committedIndexes = null;\n this.committedStoreCompression = null;\n try {\n rebuiltEngine?.abandon();\n } catch {}\n if (generationName !== null && wasm !== null) {\n // Cleanup requires proof that the target generation is inactive.\n const active = await readActiveGenerationOrNull(wasm, dbName);\n if (active !== undefined && active !== generationName) {\n try {\n await wasm.cleanupInactiveEntries(dbName);\n } catch {}\n }\n }\n }\n throw remapError(error);\n } finally {\n this.maintenanceOperation = null;\n }\n }\n /**\n * Returns null when no recovery is needed. A recovery attempt invalidates\n * all open transactions, even if recovery fails.\n */\n private recoverEngineIfNeeded(): { pendingTxid: number | null; pendingCommitted: boolean } | null {\n const engine = this.engine;\n if (!engine || !engine.needs_recovery()) {\n return null;\n }\n let report: WasmRecoveryReport;\n try {\n report = engine.recover();\n } catch (error) {\n throw remoteError(\n 'RecoveryRequiredError',\n `database ${this.dbName ?? ''} needs recovery and recovery failed: ${remapError(error).message}`\n );\n } finally {\n // Engine recovery discards transactions before storage I/O can fail.\n this.clearRuntimeCaches();\n }\n return {\n pendingTxid: fromOptionalWasmU64(report.pendingTxid),\n pendingCommitted: report.pendingCommitted === true\n };\n }\n private cleanupTxState(txId: number): void {\n for (const [cursorId, cursor] of this.primaryCursors) {\n if (cursor.txId === txId) {\n this.primaryCursors.delete(cursorId);\n try {\n this.engine?.close_scan_cursor(cursor.engineId);\n } catch {}\n }\n }\n this.txChanges.delete(txId);\n this.txModes.delete(txId);\n this.txIndexSchemas.delete(txId);\n this.readonlyIndexCache.delete(txId);\n this.txEnsuredRawStores.delete(txId);\n this.txIndexSchemaChanged.delete(txId);\n this.txStoreCompression.delete(txId);\n if (this.indexBoundCache?.txId === txId) {\n this.indexBoundCache = null;\n }\n }\n private getOrCreateTrackedTxn(txId: number): TrackedTxnChanges {\n return getOrInsert(this.txChanges, txId, () => new Map<string, TrackedStoreChanges>());\n }\n private getOrCreateTrackedStore(txId: number, store: string): TrackedStoreChanges {\n return getOrInsert(this.getOrCreateTrackedTxn(txId), store, () => ({\n touched: false,\n storeLevel: null,\n keys: new Map()\n }));\n }\n private recordStoreLevelChange(txId: number, store: string, kind: 'clear' | 'drop'): void {\n if (isInternalStoreName(store)) {\n return;\n }\n const trackedStore = this.getOrCreateTrackedStore(txId, store);\n trackedStore.touched = true;\n trackedStore.storeLevel = kind;\n // The clear/drop event replaces earlier key changes.\n trackedStore.keys.clear();\n }\n private recordPutChange(txId: number, store: string, key: Uint8Array, baselineExists: boolean): void {\n this.recordKeyChange(txId, store, key, baselineExists, 'put');\n }\n private recordPutChanges(\n txId: number,\n store: string,\n entries: Array<[Uint8Array, Uint8Array]>,\n baselines: boolean[]\n ): void {\n if (isInternalStoreName(store)) {\n return;\n }\n const trackedStore = this.getOrCreateTrackedStore(txId, store);\n trackedStore.touched = true;\n const count = Math.min(entries.length, baselines.length);\n for (let i = 0; i < count; i += 1) {\n this.setTrackedKeyChange(trackedStore, entries[i][0], baselines[i], 'put');\n }\n }\n private recordPutKeyChanges(\n txId: number,\n store: string,\n keys: Uint8Array[],\n baselines: ArrayLike<boolean | number>\n ): void {\n if (isInternalStoreName(store)) {\n return;\n }\n const trackedStore = this.getOrCreateTrackedStore(txId, store);\n trackedStore.touched = true;\n const count = Math.min(keys.length, baselines.length);\n for (let i = 0; i < count; i += 1) {\n this.setTrackedKeyChange(trackedStore, keys[i], baselines[i] === true || baselines[i] === 1, 'put');\n }\n }\n private recordDeleteChange(txId: number, store: string, key: Uint8Array, deleted: boolean): void {\n if (deleted) {\n this.recordKeyChange(txId, store, key, true, 'delete');\n }\n }\n private recordKeyChange(\n txId: number,\n store: string,\n key: Uint8Array,\n baselineExists: boolean,\n finalKind: DbChange['kind']\n ): void {\n if (isInternalStoreName(store)) {\n return;\n }\n const trackedStore = this.getOrCreateTrackedStore(txId, store);\n trackedStore.touched = true;\n this.setTrackedKeyChange(trackedStore, key, baselineExists, finalKind);\n }\n private setTrackedKeyChange(\n trackedStore: TrackedStoreChanges,\n key: Uint8Array,\n baselineExists: boolean,\n finalKind: DbChange['kind']\n ): void {\n const keyId = bytesToHex(key);\n const existing = trackedStore.keys.get(keyId);\n trackedStore.keys.set(keyId, {\n key: existing?.key ?? key.slice(),\n baselineExists: existing?.baselineExists ?? baselineExists,\n finalKind\n });\n }\n private markStoreTouched(txId: number, store: string): void {\n if (isInternalStoreName(store)) {\n return;\n }\n this.getOrCreateTrackedStore(txId, store).touched = true;\n }\n private recordBatchOutcomes(\n txId: number,\n store: string,\n ops: ReadonlyArray<BatchOp | PackedBatchOpKey>,\n outcomes: Array<WasmBatchOutcome>\n ): void {\n for (let i = 0; i < outcomes.length && i < ops.length; i += 1) {\n const op = ops[i];\n const outcome = outcomes[i];\n if (op.kind === 'put' && outcome.kind === 'put') {\n this.recordPutChange(txId, store, op.key, outcome.baselineExists);\n } else if (op.kind === 'delete' && outcome.kind === 'delete') {\n this.recordDeleteChange(txId, store, op.key, outcome.deleted);\n }\n }\n }\n private finalizeTrackedChanges(tracked: TrackedTxnChanges): StoreChangeSet[] {\n const stores: StoreChangeSet[] = [];\n for (const [store, trackedStore] of tracked) {\n if (!trackedStore.touched || isInternalStoreName(store)) {\n continue;\n }\n const changes: DbChange[] = [];\n if (trackedStore.storeLevel !== null) {\n changes.push({ key: new Uint8Array(0), kind: trackedStore.storeLevel });\n }\n for (const change of trackedStore.keys.values()) {\n if (change.finalKind === 'delete' && !change.baselineExists) {\n continue;\n }\n changes.push({\n key: change.key,\n kind: change.finalKind\n });\n }\n stores.push({ store, changes });\n }\n return stores;\n }\n private rollbackAllTransactions(\n options: {\n allowDuringMaintenance?: boolean;\n } = {}\n ): void {\n if (!this.engine || this.txChanges.size === 0) {\n this.clearTxCaches();\n return;\n }\n const txIds = Array.from(this.txChanges.keys());\n for (const txId of txIds) {\n try {\n this.withEngine((engine) => engine.rollback_tx(toWasmU64(txId)), options);\n } finally {\n this.cleanupTxState(txId);\n }\n }\n }\n private currentStoreNames(): string[] {\n return this.allRawStoreNames().filter((store) => !isInternalStoreName(store));\n }\n private allRawStoreNames(): string[] {\n return this.withEngine((engine) => engine.list_stores()) as string[];\n }\n private loadCommittedStoreCompression(): ReadonlyMap<string, CompressionOption> {\n if (this.committedStoreCompression) {\n return this.committedStoreCompression;\n }\n const rows = this.withEngine((engine) => engine.list_store_configs()) as Array<{\n name: string;\n flags: number | bigint;\n }>;\n const loaded = new Map<string, CompressionOption>();\n for (const row of rows) {\n if (typeof row.name !== 'string') {\n throw remoteError('CorruptionError', 'invalid store config row: missing name');\n }\n const flags = typeof row.flags === 'bigint' ? Number(row.flags) : row.flags;\n if (typeof flags !== 'number' || !Number.isSafeInteger(flags) || flags < 0) {\n throw remoteError('CorruptionError', `invalid store flags for ${row.name}`);\n }\n loaded.set(row.name, compressionFromStoreFlags(flags));\n }\n this.committedStoreCompression = loaded;\n return loaded;\n }\n private ensureTxStoreCompression(txId: number): Map<string, CompressionOption> {\n const snapshot = this.txStoreCompression.get(txId);\n if (snapshot?.owned) {\n return snapshot.values;\n }\n const values = new Map(snapshot?.values);\n this.txStoreCompression.set(txId, { owned: true, values });\n return values;\n }\n private recordStoreCompressionCreate(txId: number, store: string, compression: CompressionOption): void {\n if (isInternalStoreName(store)) {\n return;\n }\n this.ensureTxStoreCompression(txId).set(store, compression);\n }\n private recordStoreCompressionDrop(txId: number, store: string): void {\n if (isInternalStoreName(store)) {\n return;\n }\n this.ensureTxStoreCompression(txId).delete(store);\n }\n private storeCompressionForTx(txId: number, store: string): CompressionOption {\n if (isInternalStoreName(store)) {\n return false;\n }\n const snapshot = this.txStoreCompression.get(txId);\n if (snapshot) {\n return snapshot.values.get(store) ?? false;\n }\n return this.loadCommittedStoreCompression().get(store) ?? false;\n }\n private async encodeEntriesForWrite(\n txId: number,\n store: string,\n entries: Array<[Uint8Array, Uint8Array]>\n ): Promise<Array<[Uint8Array, Uint8Array]>> {\n if (isInternalStoreName(store)) {\n return entries;\n }\n const compression = this.storeCompressionForTx(txId, store);\n if (compression === false) {\n return entries;\n }\n const storedEntries: Array<[Uint8Array, Uint8Array]> = [];\n for (const [key, value] of entries) {\n storedEntries.push([key, await encodeStoreValueRecord(value, compression)]);\n }\n return storedEntries;\n }\n private async encodePackedEntriesForWrite(\n txId: number,\n store: string,\n items: Uint8Array[],\n keys: Uint8Array[]\n ): Promise<Uint8Array> {\n const records = new Array<PreparedPutValue>(items.length / 2);\n for (let index = 0; index < records.length; index += 1) {\n const value = this.preparePutValue(txId, store, items[index * 2 + 1]);\n records[index] = value instanceof Promise ? await value : value;\n }\n return this.packPreparedPutEntries(keys, records);\n }\n private preparePutValue(txId: number, store: string, value: Uint8Array): PreparedPutValue | Promise<Uint8Array> {\n const compression = this.storeCompressionForTx(txId, store);\n return compression === 'snappy' || compression === false\n ? prepareFastStoreValueRecord(value, compression)\n : encodeStoreValueRecord(value, compression);\n }\n private packPreparedPutEntries(keys: Uint8Array[], records: PreparedPutValue[]): Uint8Array {\n let total = 4 + keys.length * 8;\n for (let index = 0; index < keys.length; index += 1) {\n total += keys[index].byteLength + records[index].byteLength;\n if (total > MAX_PACKED_BYTES) {\n throw remoteError('WorkerProtocolError', 'compressed packed putMany exceeds the u32 byte limit');\n }\n }\n const bytes = new Uint8Array(total);\n const view = new DataView(bytes.buffer);\n view.setUint32(0, keys.length * 2, true);\n let offset = 4 + keys.length * 8;\n for (let index = 0; index < records.length; index += 1) {\n const key = keys[index];\n const record = records[index];\n view.setUint32(4 + index * 8, key.byteLength, true);\n view.setUint32(8 + index * 8, record.byteLength, true);\n bytes.set(key, offset);\n offset += key.byteLength;\n if (record instanceof Uint8Array) {\n bytes.set(record, offset);\n offset += record.byteLength;\n } else {\n offset = writePreparedStoreValueRecord(record, bytes, offset);\n }\n }\n return bytes;\n }\n private async putIndexedMany(\n txId: number,\n store: string,\n items: Uint8Array[],\n defs: readonly NormalizedIndexDef[],\n options: PutOptions\n ): Promise<void> {\n let keys: Uint8Array[] = [];\n let values: PreparedPutValue[] = [];\n let indexOps: IndexedPutOp[][] = [];\n let bytes = 4;\n const pendingPrimaries = new Set<string>();\n const pendingUniqueKeys = new Set<string>();\n const flush = (): void => {\n if (keys.length === 0) {\n return;\n }\n const batchKeys = keys;\n const batchValues = values;\n const batchOps = indexOps;\n // Detach the plan so a failed flush cannot be retried by the error handler.\n keys = [];\n values = [];\n indexOps = [];\n bytes = 4;\n pendingPrimaries.clear();\n pendingUniqueKeys.clear();\n const packet = this.packPreparedPutEntries(batchKeys, batchValues);\n let baselines: Uint8Array;\n try {\n baselines = this.withEngine((engine) =>\n engine.put_many_indexed_packed(toWasmU64(txId), store, packet, batchOps, toWasmPutOptions(options))\n );\n } catch (error) {\n const partial = partialBooleanOutcomes(error);\n if (partial.length > 0) {\n this.recordPutKeyChanges(txId, store, batchKeys, partial);\n }\n throw error;\n }\n if (baselines.length !== batchKeys.length) {\n throw remoteError(\n 'InternalError',\n `put_many_indexed_packed outcome count mismatch: ${baselines.length} != ${batchKeys.length}`\n );\n }\n this.recordPutKeyChanges(txId, store, batchKeys, baselines);\n };\n for (let index = 0; index < items.length / 2; index += 1) {\n const key = items[index * 2];\n const value = items[index * 2 + 1];\n const primaryToken = bytesToHex(key);\n if (pendingPrimaries.has(primaryToken)) {\n flush();\n }\n try {\n const oldValue = await this.readStoreValue(txId, store, key);\n const oldKeyFor = oldValue === null ? null : createIndexKeyExtractor(oldValue);\n const newKeyFor = createIndexKeyExtractor(value);\n const plans = defs.map((def) => ({\n def,\n oldLogicalKey: oldKeyFor === null ? null : oldKeyFor(def),\n newLogicalKey: newKeyFor(def),\n newPhysicalKey: null as Uint8Array | null\n }));\n if (\n plans.some(\n (plan) =>\n plan.def.unique &&\n plan.newLogicalKey !== null &&\n pendingUniqueKeys.has(`${plan.def.internalStore}:${bytesToHex(plan.newLogicalKey)}`)\n )\n ) {\n // Reused unique keys must observe all earlier primary and index writes.\n flush();\n index -= 1;\n continue;\n }\n this.ensureInternalStoresForDefinitions(txId, defs);\n for (const plan of plans) {\n if (plan.newLogicalKey === null) {\n continue;\n }\n plan.newPhysicalKey = this.buildIndexEntryKey(plan.def, plan.newLogicalKey, key);\n if (plan.oldLogicalKey === null || !bytesEqual(plan.oldLogicalKey, plan.newLogicalKey)) {\n await this.assertUniqueIndexAvailability(txId, plan.def, plan.newLogicalKey, key);\n }\n }\n const preparedValue = this.preparePutValue(txId, store, value);\n const storedValue = preparedValue instanceof Promise ? await preparedValue : preparedValue;\n const ops: IndexedPutOp[] = [];\n for (const plan of plans) {\n if (\n plan.oldLogicalKey !== null &&\n (plan.newLogicalKey === null || !bytesEqual(plan.oldLogicalKey, plan.newLogicalKey))\n ) {\n ops.push({\n store: plan.def.internalStore,\n kind: 'delete',\n key: encodeIndexEntryKey(plan.oldLogicalKey, key)\n });\n }\n }\n for (const plan of plans) {\n if (plan.newPhysicalKey !== null) {\n ops.push({ store: plan.def.internalStore, kind: 'put', key: plan.newPhysicalKey });\n }\n if (plan.def.unique) {\n for (const logicalKey of [plan.oldLogicalKey, plan.newLogicalKey]) {\n if (logicalKey !== null) {\n pendingUniqueKeys.add(`${plan.def.internalStore}:${bytesToHex(logicalKey)}`);\n }\n }\n }\n }\n keys.push(key);\n values.push(storedValue);\n indexOps.push(ops);\n bytes += 8 + key.byteLength + storedValue.byteLength;\n for (const op of ops) {\n bytes += op.key.byteLength;\n }\n pendingPrimaries.add(primaryToken);\n } catch (error) {\n flush();\n throw error;\n }\n if (options.ttl !== undefined || keys.length >= INDEX_PUT_BATCH_ROWS || bytes >= INDEX_PUT_BATCH_BYTES) {\n flush();\n }\n }\n flush();\n }\n private async encodeBatchOpsForWrite(txId: number, store: string, ops: Array<BatchOp>): Promise<Array<BatchOp>> {\n if (isInternalStoreName(store)) {\n return ops;\n }\n const compression = this.storeCompressionForTx(txId, store);\n if (compression === false) {\n return ops;\n }\n const storedOps: Array<BatchOp> = [];\n for (const op of ops) {\n storedOps.push(\n op.kind === 'put'\n ? { kind: 'put', key: op.key, value: await encodeStoreValueRecord(op.value, compression) }\n : op\n );\n }\n return storedOps;\n }\n private prepareStoredValue(\n store: string,\n value: Uint8Array,\n compression: CompressionOption\n ): Uint8Array | Promise<Uint8Array> {\n if (isInternalStoreName(store)) {\n return value;\n }\n if (compression === false) {\n return limitPlainStoreValue(value);\n }\n return encodeStoreValueRecord(value, compression);\n }\n private async decodeStoreValueForFeed(store: string, value: Uint8Array): Promise<Uint8Array> {\n if (isInternalStoreName(store)) {\n return value;\n }\n const compression = this.loadCommittedStoreCompression().get(store) ?? false;\n return decodeStoreValueRecord(value, { strict: compression !== false });\n }\n private async readStoreValue(\n txId: number,\n store: string,\n key: Uint8Array,\n knownCompression?: CompressionOption\n ): Promise<Uint8Array | null> {\n const value = this.readRawValue(txId, store, key);\n if (value === null || isInternalStoreName(store)) {\n return value;\n }\n const compression = knownCompression ?? this.storeCompressionForTx(txId, store);\n if (compression === false) {\n return value;\n }\n return await decodeStoreValueRecord(value, { strict: true });\n }\n private async readStoreScan(txId: number, store: string, range: Range): Promise<ScanItem[]> {\n const rows = this.readRawScan(txId, store, range);\n if (isInternalStoreName(store) || this.storeCompressionForTx(txId, store) === false) {\n return rows;\n }\n const values = rows.map((row) => row.value);\n await this.decodeStoreValues(txId, store, values);\n for (let index = 0; index < rows.length; index += 1) {\n rows[index].value = values[index];\n }\n return rows;\n }\n private async decodeStoreValues(\n _txId: number,\n _store: string,\n values: Array<Uint8Array | null>\n ): Promise<Array<Uint8Array | null>> {\n const state = { next: 0, failed: false, failure: undefined as unknown };\n const decodeNext = async (): Promise<void> => {\n while (!state.failed && state.next < values.length) {\n const index = state.next++;\n const value = values[index];\n if (value === null) {\n continue;\n }\n try {\n values[index] = await decodeStoreValueRecord(value, { strict: true });\n } catch (error) {\n if (!state.failed) {\n state.failed = true;\n state.failure = error;\n }\n }\n }\n };\n // Drain active decoders before reporting the first observed failure.\n await Promise.all(Array.from({ length: Math.min(COMPRESSED_READ_CONCURRENCY, values.length) }, decodeNext));\n if (state.failed) {\n throw state.failure;\n }\n return values;\n }\n private indexesForStoreInTx(txId: number, store: string): NormalizedIndexDef[] {\n // Cache by immutable schema array so readers keep their original lookup\n // after another transaction publishes a replacement.\n const schema = this.indexSchemaForTx(txId);\n let byStore = this.indexesBySchema.get(schema);\n if (!byStore) {\n byStore = new Map<string, NormalizedIndexDef[]>();\n for (const def of schema) {\n const defs = byStore.get(def.store);\n if (defs) {\n defs.push(def);\n } else {\n byStore.set(def.store, [def]);\n }\n }\n this.indexesBySchema.set(schema, byStore);\n }\n return byStore.get(store) ?? [];\n }\n private resolveIndexDefinition(txId: number, store: string, indexName: string): NormalizedIndexDef {\n // Readwrite existence checks also stage expired mutations. Readonly\n // snapshots do not, so later scans of the same index can reuse the def.\n if (this.txModes.get(txId) === 'readonly') {\n const byStore = this.readonlyIndexCache.get(txId)?.get(store);\n if (byStore) {\n const cached = byStore.get(indexName);\n if (cached) {\n return cached;\n }\n const def = findIndexDefinition(this.indexesForStoreInTx(txId, store), store, indexName);\n if (!def) {\n throw remoteError('IndexNotFoundError', `index not found: ${store}.${indexName}`);\n }\n byStore.set(indexName, def);\n return def;\n }\n }\n if (!this.rawStoreExistsInTx(txId, store)) {\n throw remoteError('StoreNotFoundError', `store not found: ${store}`);\n }\n const def = findIndexDefinition(this.indexesForStoreInTx(txId, store), store, indexName);\n if (!def) {\n throw remoteError('IndexNotFoundError', `index not found: ${store}.${indexName}`);\n }\n if (this.txModes.get(txId) === 'readonly') {\n const byStore = getOrInsert(this.readonlyIndexCache, txId, () => new Map());\n getOrInsert(byStore, store, () => new Map()).set(indexName, def);\n }\n return def;\n }\n private physicalIndexRange(txId: number, def: NormalizedIndexDef, range: Range): Range {\n assertValidScanRange(range);\n const reverse = range.reverse === true;\n const cached = this.indexBoundCache;\n if (\n cached !== null &&\n cached.txId === txId &&\n cached.def === def &&\n cached.reverse === reverse &&\n sameBound(cached.gt, range.gt) &&\n sameBound(cached.gte, range.gte) &&\n sameBound(cached.lt, range.lt) &&\n sameBound(cached.lte, range.lte)\n ) {\n return cached.physical;\n }\n const { limit: _ignored, ...withoutLimit } = range;\n const physical = indexRangeToPhysicalRange(withoutLimit);\n this.indexBoundCache = {\n txId,\n def,\n reverse,\n gt: copyBound(range.gt),\n gte: copyBound(range.gte),\n lt: copyBound(range.lt),\n lte: copyBound(range.lte),\n physical\n };\n return physical;\n }\n private indexSchemaForTx(txId: number): NormalizedIndexDef[] {\n const override = this.txIndexSchemas.get(txId);\n if (override) {\n return override;\n }\n if (this.committedIndexes) {\n return this.committedIndexes;\n }\n const loaded = this.readIndexSchemaInTx(txId);\n this.committedIndexes = cloneNormalizedIndexDefinitions(loaded);\n return this.committedIndexes;\n }\n private loadCommittedIndexSchema(): NormalizedIndexDef[] {\n if (this.committedIndexes) {\n return this.committedIndexes;\n }\n const txId = fromWasmU64(this.withEngine((engine) => engine.begin_tx('readonly')));\n try {\n const loaded = this.readIndexSchemaInTx(txId);\n this.committedIndexes = cloneNormalizedIndexDefinitions(loaded);\n return this.committedIndexes;\n } finally {\n this.withEngine((engine) => engine.rollback_tx(toWasmU64(txId)));\n }\n }\n private readIndexSchemaInTx(txId: number): NormalizedIndexDef[] {\n if (!this.rawStoreExistsInTx(txId, INDEX_METADATA_STORE)) {\n return [];\n }\n const rows = this.readRawScan(txId, INDEX_METADATA_STORE, EMPTY_RANGE);\n const defs = rows.map((row) => decodeIndexMetadataValue(row.value));\n defs.sort(compareNormalizedIndexDefinitions);\n return defs;\n }\n private rawStoreExistsInTx(txId: number, store: string): boolean {\n try {\n this.readRawScan(txId, store, { limit: 0 });\n return true;\n } catch (error) {\n if (isNamedError(error, 'StoreNotFoundError')) {\n return false;\n }\n throw error;\n }\n }\n private ensureRawStore(txId: number, store: string): void {\n const cacheable = this.txModes.get(txId) === 'readwrite';\n if (cacheable && this.txEnsuredRawStores.get(txId)?.has(store)) {\n return;\n }\n this.ignoreNamedError('StoreExistsError', () => {\n this.withEngine((engine) => engine.create_store(toWasmU64(txId), store));\n });\n if (cacheable) {\n getOrInsert(this.txEnsuredRawStores, txId, () => new Set<string>()).add(store);\n }\n }\n private clearRawStoreIfExists(txId: number, store: string): void {\n try {\n this.withEngine((engine) => engine.clear_store(toWasmU64(txId), store));\n } catch (error) {\n if (!isNamedError(error, 'StoreNotFoundError')) {\n throw error;\n }\n this.txEnsuredRawStores.get(txId)?.delete(store);\n }\n }\n private dropRawStoreIfExists(txId: number, store: string): void {\n this.txEnsuredRawStores.get(txId)?.delete(store);\n this.ignoreNamedError('StoreNotFoundError', () => {\n this.withEngine((engine) => engine.drop_store(toWasmU64(txId), store));\n });\n }\n private ensureInternalStoresForDefinitions(txId: number, defs: ReadonlyArray<NormalizedIndexDef>): void {\n for (const def of defs) {\n this.ensureRawStore(txId, def.internalStore);\n }\n }\n private ensureInternalStoresForStore(txId: number, store: string): void {\n this.ensureInternalStoresForDefinitions(txId, this.indexesForStoreInTx(txId, store));\n }\n private readRawValue(txId: number, store: string, key: Uint8Array): Uint8Array | null {\n const value = this.withEngine((engine) => engine.get(toWasmU64(txId), store, key));\n return value === null ? null : normalizeWasmBytes(value);\n }\n private readRawScan(txId: number, store: string, range: Range): ScanItem[] {\n const rows = this.withEngine((engine) => engine.scan(toWasmU64(txId), store, toWasmRange(range))) as ScanItem[];\n // The binding returns a fresh array and row objects, so normalization\n // can update them without affecting another caller.\n for (const row of rows) {\n row.key = normalizeWasmBytes(row.key);\n row.value = normalizeWasmBytes(row.value);\n }\n return rows;\n }\n private readIndexKeyScan(txId: number, store: string, range: Range): ScanItem[] {\n if (\n typeof this.engine?.open_scan_cursor !== 'function' ||\n typeof this.engine?.scan_cursor_next !== 'function' ||\n typeof this.engine?.close_scan_cursor !== 'function'\n ) {\n return this.readRawScan(txId, store, range);\n }\n const maxRows = range.limit ?? INDEX_SCAN_RAW_CHUNK_ROWS;\n const maxBytes = 4 + maxRows * (8 + MAX_ENGINE_KEY_BYTES);\n const cursorId = this.withEngine((engine) =>\n engine.open_scan_cursor(toWasmU64(txId), store, toWasmRange(range), true)\n );\n try {\n const page = this.withEngine((engine) => engine.scan_cursor_next(cursorId, maxRows, maxBytes));\n const packet = normalizeWasmBytes(page.packet);\n const rows = unpackPackedScanRows(packet);\n if (\n rows.length !== page.rowCount ||\n rows.length > maxRows ||\n packet.byteLength > maxBytes ||\n rows.some((row) => row.value.byteLength !== 0)\n ) {\n throw remoteError('CorruptionError', 'index key cursor returned an invalid page');\n }\n return rows;\n } finally {\n this.withEngine((engine) => engine.close_scan_cursor(cursorId));\n }\n }\n private putRawValue(txId: number, store: string, key: Uint8Array, value: Uint8Array): void {\n this.withEngine((engine) => engine.put(toWasmU64(txId), store, key, value));\n }\n private putIndexEntry(txId: number, def: NormalizedIndexDef, physicalKey: Uint8Array, value: Uint8Array): void {\n if (typeof this.engine?.put_index_entry_checked === 'function') {\n const primaryKey = decodeIndexEntryKey(physicalKey).primaryKey;\n const state = this.readNativeValueState(txId, def.store, primaryKey);\n if (state?.revisionKnown) {\n this.withEngine((engine) =>\n engine.put_index_entry_checked!(\n toWasmU64(txId),\n def.store,\n def.internalStore,\n primaryKey,\n physicalKey,\n state.revisionEpoch,\n state.revisionOrdinal\n )\n );\n return;\n }\n }\n this.putRawValue(txId, def.internalStore, physicalKey, value);\n }\n private readNativeValueState(txId: number, store: string, key: Uint8Array): NativeValueState | null {\n if (typeof this.engine?.get_many_value_states !== 'function') {\n return null;\n }\n try {\n const keys = new Uint8Array(8 + key.byteLength);\n const keyView = new DataView(keys.buffer);\n keyView.setUint32(0, 1, true);\n keyView.setUint32(4, key.byteLength, true);\n keys.set(key, 8);\n const packet = normalizeWasmBytes(\n this.withEngine((engine) => engine.get_many_value_states!(toWasmU64(txId), store, keys))\n );\n return this.decodeNativeValueStates(packet, 1)?.[0] ?? null;\n } catch {\n return null;\n }\n }\n private packNativeKeys(keys: Uint8Array[]): Uint8Array {\n let total = 4 + keys.length * 4;\n for (const key of keys) {\n total += key.byteLength;\n }\n const packet = new Uint8Array(total);\n const view = new DataView(packet.buffer);\n view.setUint32(0, keys.length, true);\n let offset = 4 + keys.length * 4;\n for (let index = 0; index < keys.length; index += 1) {\n const key = keys[index];\n view.setUint32(4 + index * 4, key.byteLength, true);\n packet.set(key, offset);\n offset += key.byteLength;\n }\n return packet;\n }\n private decodeNativeValueStates(packet: Uint8Array, count: number): NativeValueState[] | null {\n if (packet.byteLength !== 4 + count * 32) {\n return null;\n }\n const view = new DataView(packet.buffer, packet.byteOffset, packet.byteLength);\n if (view.getUint32(0, true) !== count) {\n return null;\n }\n const states = new Array<NativeValueState>(count);\n for (let index = 0; index < count; index += 1) {\n const offset = 4 + index * 32;\n const flags = view.getUint32(offset, true);\n const revisionEpoch = view.getBigUint64(offset + 12, true);\n const revisionOrdinal = view.getBigUint64(offset + 20, true);\n if (\n (flags & ~7) !== 0 ||\n (flags & 3) === 3 ||\n ((flags & 4) !== 0 && ((flags & 3) === 0 || revisionEpoch === 0n || revisionOrdinal === 0n))\n ) {\n return null;\n }\n states[index] = {\n live: (flags & 1) !== 0,\n expired: (flags & 2) !== 0,\n revisionKnown: (flags & 4) !== 0,\n expiresAt: view.getBigUint64(offset + 4, true),\n revisionEpoch,\n revisionOrdinal,\n maxValueBytes: view.getUint32(offset + 28, true)\n };\n }\n return states;\n }\n private inspectIndexedValue(\n txId: number,\n def: NormalizedIndexDef,\n physicalKey: Uint8Array,\n primaryKey: Uint8Array\n ): 'missing' | 'trusted' | 'unknown' {\n const primary = this.readNativeValueState(txId, def.store, primaryKey);\n if (primary === null) {\n return 'unknown';\n }\n if (!primary.live) {\n if (primary.expired && this.txModes.get(txId) === 'readwrite') {\n const live = this.withEngine((engine) => engine.has(toWasmU64(txId), def.store, primaryKey));\n if (live) {\n return 'unknown';\n }\n }\n return 'missing';\n }\n if (!primary.revisionKnown) {\n return 'unknown';\n }\n const index = this.readNativeValueState(txId, def.internalStore, physicalKey);\n // Native managed writes copy the primary revision. Raw writes receive a new revision.\n return index?.live &&\n index.revisionKnown &&\n index.revisionEpoch === primary.revisionEpoch &&\n index.revisionOrdinal === primary.revisionOrdinal\n ? 'trusted'\n : 'unknown';\n }\n private deleteIndexEntryIfPresent(\n txId: number,\n def: NormalizedIndexDef,\n logicalKey: Uint8Array,\n primaryKey: Uint8Array\n ): void {\n const physicalKey = this.buildIndexEntryKey(def, logicalKey, primaryKey);\n this.ignoreNamedError('StoreNotFoundError', () => {\n this.withEngine((engine) => engine.delete(toWasmU64(txId), def.internalStore, physicalKey));\n });\n }\n private buildIndexEntryKey(def: NormalizedIndexDef, logicalKey: Uint8Array, primaryKey: Uint8Array): Uint8Array {\n const physicalKey = encodeIndexEntryKey(logicalKey, primaryKey);\n if (physicalKey.byteLength > MAX_ENGINE_KEY_BYTES) {\n throw remoteError('KeyTooLargeError', `index key too large for ${def.store}.${def.name}`);\n }\n return physicalKey;\n }\n private assertIndexEntryKeySize(def: NormalizedIndexDef, logicalKey: Uint8Array, primaryKey: Uint8Array): void {\n if (compoundEntryKeyLength(logicalKey, primaryKey) > MAX_ENGINE_KEY_BYTES) {\n throw remoteError('KeyTooLargeError', `index key too large for ${def.store}.${def.name}`);\n }\n }\n private async assertUniqueIndexAvailability(\n txId: number,\n def: NormalizedIndexDef,\n logicalKey: Uint8Array,\n primaryKey: Uint8Array,\n knownCompression?: CompressionOption\n ): Promise<void> {\n if (!def.unique) {\n return;\n }\n const physical = indexKeyExactRange(logicalKey);\n let cursor: Uint8Array | null = null;\n let chunkLimit = 1;\n for (;;) {\n const range: Range = { ...physical, limit: chunkLimit };\n if (cursor !== null) {\n range.gt = cursor;\n delete range.gte;\n }\n // Stop at the first live conflict. Grow bounded chunks only while\n // skipping stale rows so unrelated tail errors stay unobserved.\n const rows = this.readIndexKeyScan(txId, def.internalStore, range);\n for (const row of rows) {\n cursor = row.key;\n const decoded = decodeIndexEntryKey(row.key);\n if (bytesEqual(decoded.primaryKey, primaryKey)) {\n continue;\n }\n const state = this.inspectIndexedValue(txId, def, row.key, decoded.primaryKey);\n if (state === 'missing') {\n this.cleanupStaleIndexRow(txId, def, row.key);\n continue;\n }\n if (state === 'trusted') {\n throw remoteError(\n 'UniqueIndexConstraintError',\n `unique index constraint violation on ${def.store}.${def.name}`\n );\n }\n // Keep TTL cleanup and document errors in index row order.\n const value = await this.readStoreValue(txId, def.store, decoded.primaryKey, knownCompression);\n if (value === null) {\n this.cleanupStaleIndexRow(txId, def, row.key);\n continue;\n }\n const currentLogicalKey = extractLogicalIndexKey(def, value);\n if (currentLogicalKey === null || !bytesEqual(currentLogicalKey, logicalKey)) {\n this.cleanupStaleIndexRow(txId, def, row.key);\n continue;\n }\n throw remoteError(\n 'UniqueIndexConstraintError',\n `unique index constraint violation on ${def.store}.${def.name}`\n );\n }\n if (rows.length < chunkLimit) {\n return;\n }\n chunkLimit = Math.min(INDEX_SCAN_RAW_CHUNK_ROWS, chunkLimit * 2);\n }\n }\n /**\n * Resumes after a physical index key in the scan direction. Bounded raw\n * chunks prevent stale entries from forcing the whole range into memory.\n * The output limit counts only live rows.\n */\n private async loadVisibleIndexPage(\n txId: number,\n def: NormalizedIndexDef,\n range: Range,\n cursor: Uint8Array | null,\n limit: number,\n maxBytes: number = INDEX_SCAN_PAGE_BYTES,\n physicalRange?: Range\n ): Promise<IndexScanPage> {\n const { limit: _ignored, ...withoutLimit } = range;\n const physical = physicalRange ?? indexRangeToPhysicalRange(withoutLimit);\n const reverse = physical.reverse === true;\n const compression = this.storeCompressionForTx(txId, def.store);\n let resumeAfter = cursor;\n const visible: ScanItem[] = [];\n let outputBytes = 4;\n // Start with the requested row count. Grow wholly stale chunks\n // geometrically to avoid one scan per expired row at small limits.\n let staleChunkFloor = 1;\n for (;;) {\n const chunkLimit = Math.min(INDEX_SCAN_RAW_CHUNK_ROWS, Math.max(limit - visible.length, staleChunkFloor));\n const chunkRange: Range = { ...physical, limit: chunkLimit };\n if (resumeAfter !== null) {\n if (reverse) {\n delete chunkRange.lte;\n chunkRange.lt = resumeAfter;\n } else {\n delete chunkRange.gte;\n chunkRange.gt = resumeAfter;\n }\n }\n let rawRows: ScanItem[];\n try {\n rawRows = this.readIndexKeyScan(txId, def.internalStore, chunkRange);\n } catch (error) {\n if (isNamedError(error, 'StoreNotFoundError')) {\n return { rows: [], cursor: null };\n }\n throw error;\n }\n const visibleBefore = visible.length;\n let batchStart = 0;\n let batchEnd = 0;\n let batch: ReturnType<DbWorker['readIndexPrimaryValues']> = null;\n for (let index = 0; index < rawRows.length; index += 1) {\n if (index === batchEnd) {\n batchStart = index;\n batch = this.readIndexPrimaryValues(\n txId,\n def,\n rawRows,\n index,\n Math.min(rawRows.length, index + limit - visible.length),\n maxBytes - outputBytes\n );\n batchEnd = index + (batch?.entries.length ?? 1);\n if (batch && compression !== false) {\n this.stabilizeWasmValues(batch.values);\n }\n }\n const row = rawRows[index];\n const resolved = batch\n ? await this.resolveVisibleIndexedValue(\n txId,\n def,\n row.key,\n batch.entries[index - batchStart],\n batch.values[index - batchStart],\n batch.trusted[index - batchStart],\n compression,\n true\n )\n : await this.visibleIndexedRow(txId, def, row.key, compression);\n if (batch !== null) {\n batch.values[index - batchStart] = null;\n }\n if (!resolved) {\n resumeAfter = row.key;\n continue;\n }\n const nextBytes = outputBytes + 8 + resolved.key.byteLength + resolved.value.byteLength;\n if (nextBytes > maxBytes) {\n if (visible.length === 0) {\n throw remoteError('ValueTooLargeError', 'indexed scan row exceeds maxBytes');\n }\n if (resumeAfter === null) {\n throw remoteError('InternalError', 'indexed scan lost its continuation key');\n }\n // The next page must retry this live row.\n return { rows: visible, cursor: resumeAfter.slice() };\n }\n visible.push(resolved);\n outputBytes = nextBytes;\n resumeAfter = row.key;\n if (visible.length >= limit) {\n // readRawScan already detached this key from the engine buffer.\n return { rows: visible, cursor: row.key };\n }\n }\n if (rawRows.length < chunkLimit) {\n return { rows: visible, cursor: null };\n }\n staleChunkFloor =\n visible.length === visibleBefore ? Math.min(INDEX_SCAN_RAW_CHUNK_ROWS, chunkLimit * 2) : 1;\n }\n }\n private readIndexPrimaryValues(\n txId: number,\n def: NormalizedIndexDef,\n rows: ScanItem[],\n start: number,\n end: number,\n remainingBytes: number\n ): { entries: DecodedIndexEntryKey[]; values: Array<Uint8Array | null>; trusted: boolean[] } | null {\n if (\n this.txModes.get(txId) !== 'readonly' ||\n end - start <= 1 ||\n (typeof this.engine?.get_many_value_sizes !== 'function' &&\n typeof this.engine?.get_many_value_states !== 'function')\n ) {\n return null;\n }\n let entries: DecodedIndexEntryKey[];\n let values: Array<Uint8Array | null>;\n let trusted: boolean[];\n let loaded: Array<Uint8Array | null>;\n let selectedIndices: number[];\n try {\n entries = rows.slice(start, end).map((row) => decodeIndexEntryKey(row.key));\n const packedKeys = this.packNativeKeys(entries.map((entry) => entry.primaryKey));\n let primaryStates: NativeValueState[] | null = null;\n let indexStates: NativeValueState[] | null = null;\n let sizes: Uint32Array;\n if (typeof this.engine?.get_many_value_states === 'function') {\n primaryStates = this.decodeNativeValueStates(\n normalizeWasmBytes(\n this.withEngine((engine) =>\n engine.get_many_value_states!(toWasmU64(txId), def.store, packedKeys)\n )\n ),\n entries.length\n );\n if (primaryStates === null) {\n return null;\n }\n sizes = Uint32Array.from(primaryStates, (state) =>\n state.live ? state.maxValueBytes : MAX_PACKED_BYTES\n );\n if (primaryStates.some((state) => state.live && state.revisionKnown)) {\n const indexKeys = this.packNativeKeys(rows.slice(start, end).map((row) => row.key));\n indexStates = this.decodeNativeValueStates(\n normalizeWasmBytes(\n this.withEngine((engine) =>\n engine.get_many_value_states!(toWasmU64(txId), def.internalStore, indexKeys)\n )\n ),\n entries.length\n );\n if (indexStates === null) {\n return null;\n }\n }\n } else {\n sizes = this.withEngine((engine) =>\n engine.get_many_value_sizes!(toWasmU64(txId), def.store, packedKeys)\n );\n }\n if (sizes.length !== entries.length) {\n return null;\n }\n let selected = 0;\n for (const entry of entries) {\n const size = sizes[selected];\n if (!Number.isSafeInteger(size) || size < 0 || size > MAX_PACKED_BYTES) {\n return null;\n }\n const required = size === MAX_PACKED_BYTES ? 0 : 8 + entry.primaryKey.byteLength + size;\n if (required > remainingBytes) {\n break;\n }\n remainingBytes -= required;\n selected += 1;\n }\n if (selected <= 1) {\n return null;\n }\n // Native sizes bound body reads. Each document still requires index validation.\n entries.length = selected;\n trusted = new Array<boolean>(selected).fill(false);\n const selectedKeys: Uint8Array[] = [];\n selectedIndices = [];\n values = new Array<Uint8Array | null>(selected).fill(null);\n for (let index = 0; index < selected; index += 1) {\n const primary = primaryStates?.[index];\n if (primary === undefined || primary.live) {\n selectedKeys.push(entries[index].primaryKey);\n selectedIndices.push(index);\n }\n const proof = indexStates?.[index];\n trusted[index] = Boolean(\n primary?.live &&\n primary.revisionKnown &&\n proof?.live &&\n proof.revisionKnown &&\n primary.revisionEpoch === proof.revisionEpoch &&\n primary.revisionOrdinal === proof.revisionOrdinal\n );\n }\n loaded =\n selectedKeys.length === 0\n ? []\n : this.withEngine((engine) => engine.get_many(toWasmU64(txId), def.store, selectedKeys));\n } catch {\n // Row order preserves an earlier document error if a later preflight or body read fails.\n return null;\n }\n if (loaded.length !== selectedIndices.length) {\n throw outcomeCountMismatch('get_many', loaded.length, selectedIndices.length);\n }\n for (let index = 0; index < loaded.length; index += 1) {\n values[selectedIndices[index]] = loaded[index];\n loaded[index] = null;\n }\n return { entries, values, trusted };\n }\n private stabilizeWasmValues(values: Array<Uint8Array | null>): void {\n for (let index = 0; index < values.length; index += 1) {\n const value = values[index];\n if (value !== null) {\n values[index] = normalizeWasmBytes(value);\n }\n }\n }\n private visibleIndexedRow(\n txId: number,\n def: NormalizedIndexDef,\n physicalKey: Uint8Array,\n compression: CompressionOption\n ): ScanItem | null | Promise<ScanItem | null> {\n const decoded = decodeIndexEntryKey(physicalKey);\n const state = this.inspectIndexedValue(txId, def, physicalKey, decoded.primaryKey);\n if (state === 'missing') {\n this.cleanupStaleIndexRow(txId, def, physicalKey);\n return null;\n }\n const value = this.readRawValue(txId, def.store, decoded.primaryKey);\n return this.resolveVisibleIndexedValue(\n txId,\n def,\n physicalKey,\n decoded,\n value,\n state === 'trusted',\n compression,\n true\n );\n }\n private resolveVisibleIndexedValue(\n txId: number,\n def: NormalizedIndexDef,\n physicalKey: Uint8Array,\n decoded: DecodedIndexEntryKey,\n rawValue: Uint8Array | null,\n trusted: boolean = false,\n compression: CompressionOption,\n stable: boolean\n ): ScanItem | null | Promise<ScanItem | null> {\n if (rawValue === null) {\n this.cleanupStaleIndexRow(txId, def, physicalKey);\n return null;\n }\n const bytes = stable ? rawValue : normalizeWasmBytes(rawValue);\n if (compression === false) {\n return this.finishVisibleIndexedValue(txId, def, physicalKey, decoded, bytes, trusted);\n }\n return decodeStoreValueRecord(bytes, { strict: true }).then((value) =>\n this.finishVisibleIndexedValue(txId, def, physicalKey, decoded, value, trusted)\n );\n }\n private finishVisibleIndexedValue(\n txId: number,\n def: NormalizedIndexDef,\n physicalKey: Uint8Array,\n decoded: DecodedIndexEntryKey,\n value: Uint8Array,\n trusted: boolean\n ): ScanItem | null {\n if (!trusted) {\n const currentLogicalKey = extractLogicalIndexKey(def, value);\n if (currentLogicalKey === null || !bytesEqual(currentLogicalKey, decoded.logicalKey)) {\n this.cleanupStaleIndexRow(txId, def, physicalKey);\n return null;\n }\n }\n return {\n key: decoded.primaryKey,\n value\n };\n }\n private cleanupStaleIndexRow(txId: number, def: NormalizedIndexDef, physicalKey: Uint8Array): void {\n if (this.txModes.get(txId) !== 'readwrite') {\n return;\n }\n try {\n this.withEngine((engine) => engine.delete(toWasmU64(txId), def.internalStore, physicalKey));\n } catch {}\n }\n private async loadWasm(): Promise<WasmModule> {\n if (!this.wasmReady) {\n this.wasmReady = this.options.loadWasm\n ? this.options.loadWasm()\n : (async () => {\n // Absolute URLs stay outside Vite's ?import transform, which rejects JS in /public.\n const moduleUrl = new URL('/engine/moyodb_engine.js', import.meta.url).href;\n const wasmUrl = new URL('/engine/moyodb_engine_bg.wasm', import.meta.url).href;\n const wasmModule = (await import(\n /* @vite-ignore */\n moduleUrl\n )) as WasmModule;\n await wasmModule.default({ module_or_path: wasmUrl });\n return wasmModule;\n })();\n }\n return this.wasmReady;\n }\n private withEngine<T>(\n fn: (engine: NonNullable<DbWorker['engine']>) => T,\n options: {\n allowDuringMaintenance?: boolean;\n } = {}\n ): T {\n if (this.maintenanceOperation && !options.allowDuringMaintenance) {\n this.ensureNotInMaintenance();\n }\n if (!this.engine) {\n throw remoteError('InternalError', 'engine is not open');\n }\n try {\n return fn(this.engine);\n } catch (err) {\n throw remapError(err);\n }\n }\n private ignoreNamedError(name: string, fn: () => void): void {\n try {\n fn();\n } catch (error) {\n if (isNamedError(error, name)) {\n return;\n }\n throw error;\n }\n }\n private clearTxCaches(): void {\n this.primaryCursors.clear();\n this.txChanges.clear();\n this.txModes.clear();\n this.txIndexSchemas.clear();\n this.readonlyIndexCache.clear();\n this.indexBoundCache = null;\n this.txEnsuredRawStores.clear();\n this.txIndexSchemaChanged.clear();\n this.txStoreCompression.clear();\n }\n private clearRuntimeCaches(): void {\n this.clearTxCaches();\n this.committedIndexes = null;\n this.committedStoreCompression = null;\n }\n private async cleanupAfterFailedOpen(engine: WasmEngine | null): Promise<void> {\n try {\n engine?.abandon();\n } catch {}\n this.engine = null;\n this.clearRuntimeCaches();\n this.events?.close();\n this.events = null;\n if (this.lease) {\n try {\n await this.lease.release();\n } catch {}\n }\n this.lease = null;\n this.disposePersistenceBridge();\n this.dbName = null;\n this.openOptions = null;\n this.maintenanceOperation = null;\n }\n private disposePersistenceBridge(): void {\n this.persistenceBridge.close();\n }\n}\nfunction assertCapabilities(): void {\n if (typeof navigator.storage.getDirectory !== 'function') {\n throw remoteError('UnsupportedPlatformError', 'navigator.storage.getDirectory is unavailable');\n }\n if (typeof BroadcastChannel === 'undefined') {\n throw remoteError('UnsupportedPlatformError', 'BroadcastChannel is unavailable');\n }\n // Real database handle acquisition validates storage access. A shared\n // probe file adds I/O and can lock out otherwise independent databases.\n if (\n typeof FileSystemFileHandle === 'undefined' ||\n typeof FileSystemFileHandle.prototype.createSyncAccessHandle !== 'function'\n ) {\n throw remoteError('UnsupportedPlatformError', 'createSyncAccessHandle is unavailable');\n }\n}\nfunction assertSecureContext() {\n if (!self.isSecureContext) {\n throw remoteError('UnsupportedPlatformError', 'moyodb requires a secure context (HTTPS)');\n }\n}\nfunction remoteError(code: string, message: string): Error {\n const error = new Error(message);\n error.name = code;\n Object.defineProperty(error, 'code', {\n value: code,\n enumerable: true,\n configurable: true\n });\n return error;\n}\nfunction applyChangeFeedPolicy(engine: WasmEngine, settings: Required<ChangeFeedSettings>): void {\n const current = engine.change_feed_policy();\n const currentRetain = fromOptionalWasmU64(current.retainTxids);\n if (current.enabled === settings.enabled && (!settings.enabled || currentRetain === settings.retainTxids)) {\n return;\n }\n const txId = engine.begin_tx('readwrite');\n try {\n engine.set_change_feed_policy(txId, { enabled: settings.enabled, retainTxids: settings.retainTxids });\n engine.commit_tx(txId);\n } catch (error) {\n try {\n engine.rollback_tx(txId);\n } catch {}\n throw remapError(error);\n }\n}\n/** Active generation, null for legacy storage, undefined if reading fails. */\nasync function readActiveGenerationOrNull(wasm: WasmModule, dbName: string): Promise<string | null | undefined> {\n try {\n return await wasm.readActiveGeneration(dbName);\n } catch {\n return undefined;\n }\n}\nfunction normalizeEngineHealth(health: WasmEngineHealth): EngineHealth {\n if (health.state === 'recoveryRequired') {\n return {\n state: 'recoveryRequired',\n reason: health.reason,\n pendingTxid: fromOptionalWasmU64(health.pendingTxid)\n };\n }\n return { state: health.state };\n}\nfunction outcomeCountMismatch(operation: string, actual: number, expected: number): Error {\n return remoteError('InternalError', `${operation} outcome count mismatch: ${actual} != ${expected}`);\n}\nfunction partialBooleanOutcomes(error: unknown): boolean[] {\n if (!isRecord(error) || !Array.isArray(error.partial)) {\n return [];\n }\n return error.partial.filter((value): value is boolean => typeof value === 'boolean');\n}\nfunction partialBatchOutcomes(error: unknown): WasmBatchOutcome[] {\n if (!isRecord(error) || !Array.isArray(error.partial)) {\n return [];\n }\n return error.partial.filter((value): value is WasmBatchOutcome => {\n if (!isRecord(value) || typeof value.kind !== 'string') {\n return false;\n }\n return (\n (value.kind === 'put' && typeof value.baselineExists === 'boolean') ||\n (value.kind === 'delete' && typeof value.deleted === 'boolean')\n );\n });\n}\nfunction remapError(err: unknown): Error {\n if (err instanceof Error) {\n return err;\n }\n if (isRecord(err)) {\n const code = typeof err.code === 'string' ? err.code : typeof err.name === 'string' ? err.name : 'Error';\n const message = typeof err.message === 'string' ? err.message : 'Unknown error';\n const error = remoteError(code, message);\n if ('partial' in err) {\n Object.defineProperty(error, 'partial', {\n value: err.partial,\n enumerable: true,\n configurable: true\n });\n }\n return error;\n }\n return remoteError('Error', String(err));\n}\n"],"mappings":"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"}