@moyodb/sdk 0.0.0-alpha.3 → 1.0.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.
- package/LICENSE +202 -0
- package/README.md +10 -2
- package/dist/assets/worker-R2dy1Ju5.js +4 -0
- package/dist/assets/worker-R2dy1Ju5.js.map +1 -0
- package/dist/change-events.d.ts.map +1 -1
- package/dist/codec.d.ts.map +1 -1
- package/dist/compression.d.ts.map +1 -1
- package/dist/engine/README.md +20 -4
- package/dist/engine/moyodb_engine.d.ts +115 -54
- package/dist/engine/moyodb_engine.js +885 -391
- package/dist/engine/moyodb_engine_bg.wasm +0 -0
- package/dist/engine/moyodb_engine_bg.wasm.d.ts +55 -47
- package/dist/engine/package.json +3 -3
- package/dist/engine/snippets/moyodb-engine-8ebe6af0cc2e81b7/js/opfs_shim.js +513 -0
- package/dist/engine/snippets/moyodb-engine-cff0a0e2441a7a8f/js/opfs_shim.js +192 -81
- package/dist/errors.d.ts +8 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/indexing.d.ts.map +1 -1
- package/dist/moyodb-sdk.js +1853 -1985
- package/dist/moyodb-sdk.js.map +1 -1
- package/dist/registry.d.ts +2 -1
- package/dist/registry.d.ts.map +1 -1
- package/dist/subscriptions.d.ts.map +1 -1
- package/dist/types.d.ts +29 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/worker-api.d.ts +51 -37
- package/dist/worker-api.d.ts.map +1 -1
- package/dist/worker-client.d.ts +5 -2
- package/dist/worker-client.d.ts.map +1 -1
- package/dist/worker-protocol.d.ts +14 -3
- package/dist/worker-protocol.d.ts.map +1 -1
- package/dist/worker-server.d.ts.map +1 -1
- package/package.json +10 -8
- package/dist/assets/worker-CaOzbBz1.js +0 -2351
- package/dist/assets/worker-CaOzbBz1.js.map +0 -1
- package/dist/moyodb-sdk.umd.cjs +0 -2
- package/dist/moyodb-sdk.umd.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-R2dy1Ju5.js","names":[],"sources":["../../src/internal.ts","../../src/worker-protocol.ts","../../src/worker-server.ts","../../src/codec.ts","../../src/compression.ts","../../src/errors.ts","../../src/indexing.ts","../../src/worker.ts"],"sourcesContent":["export function isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object';\n}\n\nexport function compareStringsByCodeUnit(left: string, right: string): number {\n if (left < right) {\n return -1;\n }\n return left > right ? 1 : 0;\n}\n\nexport function withTimeout<T>(promise: Promise<T>, timeoutMs: number, fallback: T): Promise<T> {\n return new Promise((resolve) => {\n const timeout = setTimeout(() => resolve(fallback), timeoutMs);\n promise.then(\n (value) => {\n clearTimeout(timeout);\n resolve(value);\n },\n () => {\n clearTimeout(timeout);\n resolve(fallback);\n }\n );\n });\n}\n","import type { AutocommitCommand, IndexScanPage, WorkerApi } from './worker-api';\nimport type { BatchOp } from './types';\nimport { isRecord } from './internal';\n\nexport const WORKER_PROTOCOL_VERSION = 1;\nexport const WORKER_PROTOCOL_READY = 'moyodb:worker-protocol:ready';\nexport const WORKER_PROTOCOL_REQUEST = 'moyodb:worker-protocol:request';\nexport const WORKER_PROTOCOL_RESPONSE = 'moyodb:worker-protocol:response';\n\nexport const WORKER_COMMANDS = [\n 'open',\n 'close',\n 'destroy',\n 'deleteDB',\n 'begin',\n 'commit',\n 'rollback',\n 'autocommit',\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 'listStores',\n 'getVersion',\n 'changesSince',\n 'setSchemaVersion',\n 'exportSnapshot',\n 'importSnapshot',\n 'reset',\n 'compact',\n 'rebuild',\n 'stats',\n 'storageInfo',\n 'requestPersistence',\n 'setFailpoint'\n] as const;\n\nexport type WorkerCommand = (typeof WORKER_COMMANDS)[number];\n\ntype WorkerMethod<M extends WorkerCommand> = WorkerApi[M] extends (...args: infer Args) => Promise<infer Result>\n ? { args: Args; result: Result }\n : never;\n\nexport type WorkerCommandArgs<M extends WorkerCommand> = WorkerMethod<M>['args'];\nexport type WorkerCommandResult<M extends WorkerCommand> = WorkerMethod<M>['result'];\n/** Arguments of an autocommit command without the leading transaction id. */\nexport type AutocommitArgs<M extends AutocommitCommand> =\n WorkerCommandArgs<M> extends [number, ...infer Rest] ? Rest : never;\n\nexport const AUTOCOMMIT_COMMANDS = [\n 'get',\n 'getMany',\n 'has',\n 'put',\n 'putMany',\n 'delete',\n 'deleteMany',\n 'applyBatch',\n 'scan',\n 'getByIndex',\n 'scanByIndex',\n 'createStore',\n 'dropStore',\n 'clearStore'\n] as const satisfies readonly AutocommitCommand[];\n\nconst AUTOCOMMIT_COMMAND_SET = new Set<string>(AUTOCOMMIT_COMMANDS);\n\nexport function isAutocommitCommand(value: unknown): value is AutocommitCommand {\n return typeof value === 'string' && AUTOCOMMIT_COMMAND_SET.has(value);\n}\n\nexport type PackedBatchOpKey = {\n kind: 'put' | 'delete';\n key: Uint8Array;\n};\n\ntype PreparedWorkerCommandArgs<M extends WorkerCommand> = WorkerCommandArgs<M> | unknown[];\n\nconst PACKED_BINARY_LIST_V1 = 'moyodb:packed-binary-list:v1';\nconst PACKED_NULLABLE_BINARY_LIST_V1 = 'moyodb:packed-nullable-binary-list:v1';\nconst PACKED_SCAN_ROWS_V1 = 'moyodb:packed-scan-rows:v1';\nconst PACKED_BATCH_OPS_V1 = 'moyodb:packed-batch-ops:v1';\n// Engine-native getMany output: u32 count | count x u32 length (u32::MAX =\n// missing) | concatenated values, all little-endian. Forwarded without repacking.\nconst PACKED_OPTIONAL_VALUES_V1 = 'moyodb:packed-optional-values:v1';\nconst BATCH_OP_DELETE = 0;\nconst BATCH_OP_PUT = 1;\nconst U32_MAX = 0xffff_ffff;\nconst MAX_PACKED_RESPONSE_BYTES = 16 * 1024 * 1024;\nconst EMPTY_TRANSFERABLES: Transferable[] = [];\n\ninterface PackedBinaryListV1 {\n __moyodbPacked: typeof PACKED_BINARY_LIST_V1;\n bytes: Uint8Array;\n}\n\ninterface PackedNullableBinaryListV1 {\n __moyodbPacked: typeof PACKED_NULLABLE_BINARY_LIST_V1;\n bytes: Uint8Array;\n}\n\ninterface PackedScanRowsV1 {\n __moyodbPacked: typeof PACKED_SCAN_ROWS_V1;\n bytes: Uint8Array;\n}\n\ninterface PackedBatchOpsV1 {\n __moyodbPacked: typeof PACKED_BATCH_OPS_V1;\n bytes: Uint8Array;\n}\n\nexport interface PackedOptionalValuesV1 {\n __moyodbPacked: typeof PACKED_OPTIONAL_VALUES_V1;\n bytes: Uint8Array;\n}\n\ninterface PackedIndexScanPage {\n rows: PackedScanRowsV1 | IndexScanPage['rows'];\n cursor: Uint8Array | null;\n}\n\nexport type WorkerProtocolReadyMessage = {\n type: typeof WORKER_PROTOCOL_READY;\n version: typeof WORKER_PROTOCOL_VERSION;\n};\n\nexport type WorkerProtocolRequestMessage = {\n [M in WorkerCommand]: {\n type: typeof WORKER_PROTOCOL_REQUEST;\n version: typeof WORKER_PROTOCOL_VERSION;\n id: number;\n command: M;\n args: PreparedWorkerCommandArgs<M>;\n };\n}[WorkerCommand];\n\nexport interface SerializedWorkerError {\n name: string;\n code?: string;\n message: string;\n stack?: string;\n}\n\nexport type WorkerProtocolSuccessMessage = {\n [M in WorkerCommand]: {\n type: typeof WORKER_PROTOCOL_RESPONSE;\n version: typeof WORKER_PROTOCOL_VERSION;\n id: number;\n ok: true;\n result: WorkerCommandResult<M>;\n };\n}[WorkerCommand];\n\nexport interface WorkerProtocolErrorMessage {\n type: typeof WORKER_PROTOCOL_RESPONSE;\n version: typeof WORKER_PROTOCOL_VERSION;\n id: number;\n ok: false;\n error: SerializedWorkerError;\n}\n\nexport type WorkerProtocolResponseMessage = WorkerProtocolSuccessMessage | WorkerProtocolErrorMessage;\n\nconst WORKER_COMMAND_SET = new Set<string>(WORKER_COMMANDS);\n\nexport function isWorkerCommand(value: unknown): value is WorkerCommand {\n return typeof value === 'string' && WORKER_COMMAND_SET.has(value);\n}\n\nexport function isWorkerProtocolReadyMessage(value: unknown): value is WorkerProtocolReadyMessage {\n return isRecord(value) && value.type === WORKER_PROTOCOL_READY && value.version === WORKER_PROTOCOL_VERSION;\n}\n\nexport function isWorkerProtocolResponseMessage(value: unknown): value is WorkerProtocolResponseMessage {\n return (\n isRecord(value) &&\n value.type === WORKER_PROTOCOL_RESPONSE &&\n value.version === WORKER_PROTOCOL_VERSION &&\n typeof value.id === 'number' &&\n Number.isSafeInteger(value.id) &&\n typeof value.ok === 'boolean'\n );\n}\n\nexport function isWorkerProtocolRequestMessage(value: unknown): value is WorkerProtocolRequestMessage {\n return (\n isRecord(value) &&\n value.type === WORKER_PROTOCOL_REQUEST &&\n value.version === WORKER_PROTOCOL_VERSION &&\n typeof value.id === 'number' &&\n Number.isSafeInteger(value.id) &&\n typeof value.command === 'string' &&\n Array.isArray(value.args)\n );\n}\n\nexport function isWorkerProtocolEnvelope(value: unknown): value is { type: string; id?: unknown } {\n return (\n isRecord(value) &&\n (value.type === WORKER_PROTOCOL_REQUEST ||\n value.type === WORKER_PROTOCOL_RESPONSE ||\n value.type === WORKER_PROTOCOL_READY)\n );\n}\n\nexport function serializeWorkerError(error: unknown): SerializedWorkerError {\n if (isRecord(error)) {\n const code = stringOrUndefined(error.code);\n const name = stringOrUndefined(error.name) ?? code ?? 'Error';\n return {\n name,\n code,\n message: stringOrUndefined(error.message) ?? 'Unknown error',\n stack: stringOrUndefined(error.stack)\n };\n }\n return {\n name: 'Error',\n message: String(error)\n };\n}\n\nexport function deserializeWorkerError(error: SerializedWorkerError): Error {\n const deserialized = new Error(error.message);\n deserialized.name = error.name || error.code || 'Error';\n if (error.stack) {\n deserialized.stack = error.stack;\n }\n if (error.code) {\n Object.defineProperty(deserialized, 'code', {\n value: error.code,\n enumerable: true,\n configurable: true\n });\n }\n return deserialized;\n}\n\nexport function workerProtocolError(name: string, message: string, code = name): Error {\n const error = new Error(message);\n error.name = name;\n Object.defineProperty(error, 'code', {\n value: code,\n enumerable: true,\n configurable: true\n });\n return error;\n}\n\nexport function prepareWorkerCommandPayload<M extends WorkerCommand>(\n command: M,\n args: WorkerCommandArgs<M>\n): { args: PreparedWorkerCommandArgs<M>; transfer: Transferable[] } {\n if (command === 'autocommit') {\n const [mode, inner, innerArgs] = args as WorkerCommandArgs<'autocommit'>;\n if (isAutocommitCommand(inner) && Array.isArray(innerArgs)) {\n // Inner arguments are packed exactly as for the transaction-scoped\n // command; the placeholder transaction id is stripped again.\n const prepared = prepareWorkerCommandPayload(inner, [0, ...innerArgs] as never);\n return {\n args: [mode, inner, (prepared.args as unknown[]).slice(1)],\n transfer: prepared.transfer\n };\n }\n }\n\n if (command === 'importSnapshot') {\n const data = args[0];\n if (data instanceof Uint8Array) {\n const owned = copyToOwnedUint8Array(data);\n return {\n args: [owned] as WorkerCommandArgs<M>,\n transfer: [owned.buffer]\n };\n }\n }\n\n if (command === 'getMany' || command === 'deleteMany') {\n const [txId, store, keys] = args as WorkerCommandArgs<'getMany'> | WorkerCommandArgs<'deleteMany'>;\n if (Array.isArray(keys) && keys.length > 0) {\n const packed = packBinaryList(keys);\n return {\n args: [txId, store, packed],\n transfer: [packed.bytes.buffer]\n };\n }\n }\n\n if (command === 'putMany') {\n const [txId, store, entries, options] = args as WorkerCommandArgs<'putMany'>;\n if (Array.isArray(entries) && entries.length > 0) {\n const packed = packBinaryPairs(entries);\n return {\n args: [txId, store, packed, options],\n transfer: [packed.bytes.buffer]\n };\n }\n }\n\n if (command === 'applyBatch') {\n const [txId, store, ops] = args as WorkerCommandArgs<'applyBatch'>;\n if (Array.isArray(ops) && ops.length > 0) {\n const packed = packBatchOps(ops);\n return {\n args: [txId, store, packed],\n transfer: [packed.bytes.buffer]\n };\n }\n }\n\n return { args, transfer: EMPTY_TRANSFERABLES };\n}\n\nexport function decodeWorkerCommandPayload<M extends WorkerCommand>(\n command: M,\n args: PreparedWorkerCommandArgs<M>\n): WorkerCommandArgs<M> {\n if (command === 'autocommit') {\n const [mode, inner, innerArgs] = args as WorkerCommandArgs<'autocommit'>;\n if (isAutocommitCommand(inner) && Array.isArray(innerArgs)) {\n const decoded = decodeWorkerCommandPayload(inner, [0, ...innerArgs]) as unknown[];\n return [mode, inner, decoded.slice(1)] as WorkerCommandArgs<M>;\n }\n }\n\n if (command === 'getMany' || command === 'deleteMany') {\n const [txId, store, keys] = args as WorkerCommandArgs<'getMany'> | WorkerCommandArgs<'deleteMany'>;\n if (isPackedBinaryList(keys)) {\n return [txId, store, unpackBinaryList(keys)] as WorkerCommandArgs<M>;\n }\n }\n\n if (command === 'putMany') {\n const [txId, store, entries, options] = args as WorkerCommandArgs<'putMany'>;\n if (isPackedBinaryList(entries)) {\n return [txId, store, unpackBinaryPairs(entries), options] as WorkerCommandArgs<M>;\n }\n }\n\n if (command === 'applyBatch') {\n const [txId, store, ops] = args as WorkerCommandArgs<'applyBatch'>;\n if (isPackedBatchOps(ops)) {\n return [txId, store, unpackBatchOps(ops)] as WorkerCommandArgs<M>;\n }\n }\n\n return args;\n}\n\nexport function packedBinaryListBytes(value: unknown): Uint8Array | null {\n return isPackedBinaryList(value) ? value.bytes : null;\n}\n\nexport function packedBatchOpsBytes(value: unknown): Uint8Array | null {\n return isPackedBatchOps(value) ? value.bytes : null;\n}\n\nexport function unpackPackedBinaryList(bytes: Uint8Array): Uint8Array[] {\n return unpackBinaryList({ __moyodbPacked: PACKED_BINARY_LIST_V1, bytes });\n}\n\nexport function unpackPackedBinaryPairs(bytes: Uint8Array): Array<[Uint8Array, Uint8Array]> {\n return unpackBinaryPairs({ __moyodbPacked: PACKED_BINARY_LIST_V1, bytes });\n}\n\nexport function unpackPackedBinaryPairKeys(bytes: Uint8Array): Uint8Array[] {\n return unpackBinaryPairKeys({ __moyodbPacked: PACKED_BINARY_LIST_V1, bytes });\n}\n\nexport function unpackPackedBatchOps(bytes: Uint8Array): Array<BatchOp> {\n return unpackBatchOps({ __moyodbPacked: PACKED_BATCH_OPS_V1, bytes });\n}\n\nexport function unpackPackedBatchOpKeys(bytes: Uint8Array): PackedBatchOpKey[] {\n return unpackBatchOpKeys({ __moyodbPacked: PACKED_BATCH_OPS_V1, bytes });\n}\n\nexport function packedOptionalValues(bytes: Uint8Array): PackedOptionalValuesV1 {\n return { __moyodbPacked: PACKED_OPTIONAL_VALUES_V1, bytes };\n}\n\nexport function unpackPackedOptionalValues(bytes: Uint8Array): Array<Uint8Array | null> {\n if (!(bytes instanceof Uint8Array) || bytes.byteLength < 4) {\n throw workerProtocolError('WorkerProtocolError', 'invalid packed optional-values payload');\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const count = view.getUint32(0, true);\n const metadataBytes = checkedByteCount(count, 4, 'packed optional-values metadata');\n const payloadOffset = checkedAdd(4, metadataBytes, 'packed optional-values header');\n if (payloadOffset > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed optional-values metadata exceeds payload length');\n }\n const items = new Array<Uint8Array | null>(count);\n let readOffset = payloadOffset;\n for (let index = 0; index < count; index += 1) {\n const byteLength = view.getUint32(4 + index * 4, true);\n if (byteLength === U32_MAX) {\n items[index] = null;\n continue;\n }\n const end = readOffset + byteLength;\n if (end > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed optional-values item exceeds payload length');\n }\n items[index] = bytes.subarray(readOffset, end);\n readOffset = end;\n }\n if (readOffset !== bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed optional-values payload has trailing bytes');\n }\n return items;\n}\n\nexport function prepareWorkerResponsePayload<M extends WorkerCommand>(\n command: M,\n result: WorkerCommandResult<M>\n): { result: unknown; transfer: Transferable[] } {\n if (command === 'getMany' && isPackedOptionalValues(result)) {\n return {\n result,\n transfer: collectDirectBinaryTransferable(result.bytes)\n };\n }\n\n if (command === 'scanByIndexPage') {\n const page = result as WorkerCommandResult<'scanByIndexPage'>;\n if (isRecord(page) && Array.isArray(page.rows)) {\n const packed = page.rows.length > 0 ? packScanRows(page.rows) : null;\n const response: PackedIndexScanPage = { rows: packed ?? page.rows, cursor: page.cursor };\n const transfer = packed ? [packed.bytes.buffer] : collectTransferablesForValue(page.rows);\n const cursorBuffer = directBinaryTransferable(page.cursor);\n return {\n result: response,\n transfer: cursorBuffer === null ? transfer : [...transfer, cursorBuffer]\n };\n }\n }\n\n if (command === 'getMany') {\n const values = result as WorkerCommandResult<'getMany'>;\n if (Array.isArray(values) && values.length > 0) {\n const packed = packNullableBinaryList(values);\n if (packed) {\n return {\n result: packed,\n transfer: [packed.bytes.buffer]\n };\n }\n }\n return {\n result,\n transfer: collectTransferablesForValue(result)\n };\n }\n\n if (command === 'scan' || command === 'scanByIndex') {\n const rows = result as WorkerCommandResult<'scan'>;\n if (Array.isArray(rows) && rows.length > 0) {\n const packed = packScanRows(rows);\n if (packed) {\n return {\n result: packed,\n transfer: [packed.bytes.buffer]\n };\n }\n }\n return {\n result,\n transfer: collectTransferablesForValue(result)\n };\n }\n\n if (command === 'get' || command === 'getByIndex' || command === 'exportSnapshot') {\n return {\n result,\n transfer: collectDirectBinaryTransferable(result)\n };\n }\n\n if (command === 'changesSince') {\n return {\n result,\n transfer: collectChangeFeedTransferables(result)\n };\n }\n\n // The remaining command results are protocol scalars, voids, or JSON-like\n // metadata. Avoid a generic deep walk when the result type cannot contain\n // transfer-worthy binary payloads.\n return {\n result,\n transfer: []\n };\n}\n\nexport function decodeWorkerResponsePayload<M extends WorkerCommand>(\n command: M,\n result: unknown\n): WorkerCommandResult<M> {\n if (command === 'getMany' && isPackedNullableBinaryList(result)) {\n return unpackNullableBinaryList(result);\n }\n\n if (command === 'getMany' && isPackedOptionalValues(result)) {\n return unpackPackedOptionalValues(result.bytes) as WorkerCommandResult<M>;\n }\n\n if (command === 'scanByIndexPage' && isRecord(result)) {\n const rows = isPackedScanRows(result.rows) ? unpackScanRows(result.rows) : result.rows;\n const cursor = result.cursor instanceof Uint8Array ? result.cursor : null;\n return { rows, cursor } as WorkerCommandResult<M>;\n }\n\n if ((command === 'scan' || command === 'scanByIndex') && isPackedScanRows(result)) {\n return unpackScanRows(result);\n }\n\n return result;\n}\n\nexport function collectTransferablesForValue(value: unknown): Transferable[] {\n const direct = directBinaryTransferable(value);\n if (direct !== null) {\n return [direct];\n }\n if (value === null || value === undefined || typeof value !== 'object') {\n return EMPTY_TRANSFERABLES;\n }\n\n const buffers = new Set<ArrayBuffer>();\n const seen = new WeakSet<object>();\n collectTransferableBuffers(value, buffers, seen);\n return buffers.size === 0 ? EMPTY_TRANSFERABLES : Array.from(buffers);\n}\n\nfunction collectDirectBinaryTransferable(value: unknown): Transferable[] {\n const direct = directBinaryTransferable(value);\n return direct === null ? EMPTY_TRANSFERABLES : [direct];\n}\n\nfunction directBinaryTransferable(value: unknown): ArrayBuffer | null {\n if (value instanceof ArrayBuffer) {\n return value;\n }\n if (ArrayBuffer.isView(value)) {\n const buffer = value.buffer;\n if (buffer instanceof ArrayBuffer && value.byteOffset === 0 && value.byteLength === buffer.byteLength) {\n return buffer;\n }\n }\n return null;\n}\n\nfunction collectChangeFeedTransferables(value: unknown): Transferable[] {\n if (!isRecord(value) || !Array.isArray(value.changes) || value.changes.length === 0) {\n return EMPTY_TRANSFERABLES;\n }\n\n let buffers: Set<ArrayBuffer> | null = null;\n for (const change of value.changes) {\n if (!isRecord(change)) {\n continue;\n }\n const key = directBinaryTransferable(change.key);\n if (key !== null) {\n buffers ??= new Set<ArrayBuffer>();\n buffers.add(key);\n }\n const changedValue = directBinaryTransferable(change.value);\n if (changedValue !== null) {\n buffers ??= new Set<ArrayBuffer>();\n buffers.add(changedValue);\n }\n }\n return buffers === null || buffers.size === 0 ? EMPTY_TRANSFERABLES : Array.from(buffers);\n}\n\nfunction collectTransferableBuffers(value: unknown, buffers: Set<ArrayBuffer>, seen: WeakSet<object>): void {\n if (value === null || value === undefined) {\n return;\n }\n if (value instanceof ArrayBuffer) {\n buffers.add(value);\n return;\n }\n if (ArrayBuffer.isView(value)) {\n const buffer = value.buffer;\n if (buffer instanceof ArrayBuffer && value.byteOffset === 0 && value.byteLength === buffer.byteLength) {\n buffers.add(buffer);\n }\n return;\n }\n if (typeof value !== 'object') {\n return;\n }\n const object = value;\n if (seen.has(object)) {\n return;\n }\n seen.add(object);\n if (Array.isArray(value)) {\n for (const item of value) {\n collectTransferableBuffers(item, buffers, seen);\n }\n return;\n }\n const record = value as Record<string, unknown>;\n for (const key in record) {\n if (Object.prototype.hasOwnProperty.call(record, key)) {\n collectTransferableBuffers(record[key], buffers, seen);\n }\n }\n}\n\nfunction packBinaryPairs(entries: Array<[Uint8Array, Uint8Array]>): PackedBinaryListV1 {\n const entryCount = entries.length;\n const count = checkedU32(entryCount * 2, 'packed putMany item count');\n const metadataBytes = checkedByteCount(count, 4, 'packed putMany metadata');\n let payloadBytes = 0;\n for (let index = 0; index < entryCount; index += 1) {\n const entry = entries[index];\n const key = entry[0];\n const value = entry[1];\n if (!(key instanceof Uint8Array) || !(value instanceof Uint8Array)) {\n throw workerProtocolError('WorkerProtocolError', 'putMany entry key/value is not a Uint8Array');\n }\n const keyLength = checkedU32(key.byteLength, 'putMany key length');\n const valueLength = checkedU32(value.byteLength, 'putMany value length');\n payloadBytes += keyLength + valueLength;\n if (payloadBytes > U32_MAX) {\n throw workerProtocolError('WorkerProtocolError', 'packed putMany payload exceeds 32-bit payload limit');\n }\n }\n const payloadOffset = checkedAdd(4, metadataBytes, 'packed putMany header');\n const totalBytes = checkedAdd(payloadOffset, payloadBytes, 'packed putMany total');\n const bytes = new Uint8Array(totalBytes);\n const view = new DataView(bytes.buffer);\n view.setUint32(0, count, true);\n let metadataOffset = 4;\n let writeOffset = payloadOffset;\n for (let index = 0; index < entryCount; index += 1) {\n const entry = entries[index];\n const key = entry[0];\n const value = entry[1];\n const keyLength = key.byteLength;\n const valueLength = value.byteLength;\n view.setUint32(metadataOffset, keyLength, true);\n metadataOffset += 4;\n view.setUint32(metadataOffset, valueLength, true);\n metadataOffset += 4;\n bytes.set(key, writeOffset);\n writeOffset += keyLength;\n bytes.set(value, writeOffset);\n writeOffset += valueLength;\n }\n return {\n __moyodbPacked: PACKED_BINARY_LIST_V1,\n bytes\n };\n}\n\nfunction packBinaryList(items: Uint8Array[]): PackedBinaryListV1 {\n const count = items.length;\n const metadataBytes = checkedByteCount(count, 4, 'packed binary-list metadata');\n let payloadBytes = 0;\n for (let index = 0; index < count; index += 1) {\n const item = items[index];\n if (!(item instanceof Uint8Array)) {\n throw workerProtocolError('WorkerProtocolError', 'binary-list payload item is not a Uint8Array');\n }\n const itemLength = checkedU32(item.byteLength, 'binary-list item length');\n payloadBytes += itemLength;\n if (payloadBytes > U32_MAX) {\n throw workerProtocolError('WorkerProtocolError', 'packed binary-list payload exceeds 32-bit payload limit');\n }\n }\n const payloadOffset = checkedAdd(4, metadataBytes, 'packed binary-list header');\n const totalBytes = checkedAdd(payloadOffset, payloadBytes, 'packed binary-list total');\n const bytes = new Uint8Array(totalBytes);\n const view = new DataView(bytes.buffer);\n view.setUint32(0, count, true);\n let metadataOffset = 4;\n let writeOffset = payloadOffset;\n for (let index = 0; index < count; index += 1) {\n const item = items[index];\n const itemLength = item.byteLength;\n view.setUint32(metadataOffset, itemLength, true);\n metadataOffset += 4;\n bytes.set(item, writeOffset);\n writeOffset += itemLength;\n }\n return {\n __moyodbPacked: PACKED_BINARY_LIST_V1,\n bytes\n };\n}\n\nfunction unpackBinaryList(payload: PackedBinaryListV1): Uint8Array[] {\n const bytes = payload.bytes;\n if (!(bytes instanceof Uint8Array) || bytes.byteLength < 4) {\n throw workerProtocolError('WorkerProtocolError', 'invalid packed binary-list payload');\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const count = view.getUint32(0, true);\n const metadataBytes = checkedByteCount(count, 4, 'packed binary-list metadata');\n const payloadOffset = checkedAdd(4, metadataBytes, 'packed binary-list header');\n if (payloadOffset > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed binary-list metadata exceeds payload length');\n }\n\n const items = new Array<Uint8Array>(count);\n let metadataOffset = 4;\n let readOffset = payloadOffset;\n for (let index = 0; index < count; index += 1) {\n const byteLength = view.getUint32(metadataOffset, true);\n metadataOffset += 4;\n const end = readOffset + byteLength;\n if (end > U32_MAX || end > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed binary-list item exceeds payload length');\n }\n items[index] = bytes.subarray(readOffset, end);\n readOffset = end;\n }\n if (readOffset !== bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed binary-list payload has trailing bytes');\n }\n return items;\n}\n\nfunction unpackBinaryPairs(payload: PackedBinaryListV1): Array<[Uint8Array, Uint8Array]> {\n const bytes = payload.bytes;\n if (!(bytes instanceof Uint8Array) || bytes.byteLength < 4) {\n throw workerProtocolError('WorkerProtocolError', 'invalid packed putMany payload');\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const itemCount = view.getUint32(0, true);\n if (itemCount % 2 !== 0) {\n throw workerProtocolError('WorkerProtocolError', 'packed putMany payload has an odd item count');\n }\n const metadataBytes = checkedByteCount(itemCount, 4, 'packed putMany metadata');\n const payloadOffset = checkedAdd(4, metadataBytes, 'packed putMany header');\n if (payloadOffset > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed putMany metadata exceeds payload length');\n }\n\n const entryCount = itemCount / 2;\n const entries = new Array<[Uint8Array, Uint8Array]>(entryCount);\n let metadataOffset = 4;\n let readOffset = payloadOffset;\n for (let index = 0; index < entryCount; index += 1) {\n const keyLength = view.getUint32(metadataOffset, true);\n const valueLength = view.getUint32(metadataOffset + 4, true);\n metadataOffset += 8;\n\n const keyEnd = readOffset + keyLength;\n if (keyEnd > U32_MAX || keyEnd > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed putMany key exceeds payload length');\n }\n const valueEnd = keyEnd + valueLength;\n if (valueEnd > U32_MAX || valueEnd > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed putMany value exceeds payload length');\n }\n entries[index] = [bytes.subarray(readOffset, keyEnd), bytes.subarray(keyEnd, valueEnd)];\n readOffset = valueEnd;\n }\n if (readOffset !== bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed putMany payload has trailing bytes');\n }\n return entries;\n}\n\nfunction unpackBinaryPairKeys(payload: PackedBinaryListV1): Uint8Array[] {\n const bytes = payload.bytes;\n if (!(bytes instanceof Uint8Array) || bytes.byteLength < 4) {\n throw workerProtocolError('WorkerProtocolError', 'invalid packed putMany payload');\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const itemCount = view.getUint32(0, true);\n if (itemCount % 2 !== 0) {\n throw workerProtocolError('WorkerProtocolError', 'packed putMany payload has an odd item count');\n }\n const metadataBytes = checkedByteCount(itemCount, 4, 'packed putMany metadata');\n const payloadOffset = checkedAdd(4, metadataBytes, 'packed putMany header');\n if (payloadOffset > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed putMany metadata exceeds payload length');\n }\n\n const entryCount = itemCount / 2;\n const keys = new Array<Uint8Array>(entryCount);\n let metadataOffset = 4;\n let readOffset = payloadOffset;\n for (let index = 0; index < entryCount; index += 1) {\n const keyLength = view.getUint32(metadataOffset, true);\n const valueLength = view.getUint32(metadataOffset + 4, true);\n metadataOffset += 8;\n\n const keyEnd = readOffset + keyLength;\n if (keyEnd > U32_MAX || keyEnd > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed putMany key exceeds payload length');\n }\n const valueEnd = keyEnd + valueLength;\n if (valueEnd > U32_MAX || valueEnd > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed putMany value exceeds payload length');\n }\n keys[index] = bytes.subarray(readOffset, keyEnd);\n readOffset = valueEnd;\n }\n if (readOffset !== bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed putMany payload has trailing bytes');\n }\n return keys;\n}\n\nfunction packNullableBinaryList(items: Array<Uint8Array | null>): PackedNullableBinaryListV1 | null {\n const count = items.length;\n const metadataBytes = checkedByteCount(count, 5, 'packed nullable binary-list metadata');\n let payloadBytes = 0;\n for (let index = 0; index < count; index += 1) {\n const item = items[index];\n if (item === null) {\n continue;\n }\n if (!(item instanceof Uint8Array)) {\n throw workerProtocolError(\n 'WorkerProtocolError',\n 'nullable binary-list payload item is not a Uint8Array or null'\n );\n }\n const itemLength = checkedU32(item.byteLength, 'nullable binary-list item length');\n payloadBytes += itemLength;\n if (payloadBytes > U32_MAX) {\n throw workerProtocolError(\n 'WorkerProtocolError',\n 'packed nullable binary-list payload exceeds 32-bit payload limit'\n );\n }\n }\n const payloadOffset = checkedAdd(4, metadataBytes, 'packed nullable binary-list header');\n const totalBytes = checkedAdd(payloadOffset, payloadBytes, 'packed nullable binary-list total');\n if (totalBytes > MAX_PACKED_RESPONSE_BYTES) {\n return null;\n }\n const bytes = new Uint8Array(totalBytes);\n const view = new DataView(bytes.buffer);\n view.setUint32(0, count, true);\n let metadataOffset = 4;\n let writeOffset = payloadOffset;\n for (let index = 0; index < count; index += 1) {\n const item = items[index];\n if (item === null) {\n view.setUint8(metadataOffset, 0);\n view.setUint32(metadataOffset + 1, 0, true);\n metadataOffset += 5;\n continue;\n }\n const itemLength = item.byteLength;\n view.setUint8(metadataOffset, 1);\n view.setUint32(metadataOffset + 1, itemLength, true);\n metadataOffset += 5;\n bytes.set(item, writeOffset);\n writeOffset += itemLength;\n }\n return {\n __moyodbPacked: PACKED_NULLABLE_BINARY_LIST_V1,\n bytes\n };\n}\n\nfunction unpackNullableBinaryList(payload: PackedNullableBinaryListV1): Array<Uint8Array | null> {\n const bytes = payload.bytes;\n if (!(bytes instanceof Uint8Array) || bytes.byteLength < 4) {\n throw workerProtocolError('WorkerProtocolError', 'invalid packed nullable binary-list payload');\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const count = view.getUint32(0, true);\n const metadataBytes = checkedByteCount(count, 5, 'packed nullable binary-list metadata');\n const payloadOffset = checkedAdd(4, metadataBytes, 'packed nullable binary-list header');\n if (payloadOffset > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed nullable binary-list metadata exceeds payload length');\n }\n\n const items = new Array<Uint8Array | null>(count);\n let metadataOffset = 4;\n let readOffset = payloadOffset;\n for (let index = 0; index < count; index += 1) {\n const present = view.getUint8(metadataOffset);\n const byteLength = view.getUint32(metadataOffset + 1, true);\n metadataOffset += 5;\n if (present === 0) {\n if (byteLength !== 0) {\n throw workerProtocolError(\n 'WorkerProtocolError',\n 'packed nullable binary-list null item has a payload length'\n );\n }\n items[index] = null;\n continue;\n }\n if (present !== 1) {\n throw workerProtocolError(\n 'WorkerProtocolError',\n `packed nullable binary-list item has invalid presence byte: ${present}`\n );\n }\n const end = readOffset + byteLength;\n if (end > U32_MAX || end > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed nullable binary-list item exceeds payload length');\n }\n items[index] = bytes.subarray(readOffset, end);\n readOffset = end;\n }\n if (readOffset !== bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed nullable binary-list payload has trailing bytes');\n }\n return items;\n}\n\nfunction packScanRows(rows: Array<{ key: Uint8Array; value: Uint8Array }>): PackedScanRowsV1 | null {\n const count = rows.length;\n const metadataBytes = checkedByteCount(count, 8, 'packed scan row metadata');\n let payloadBytes = 0;\n for (let index = 0; index < count; index += 1) {\n const row = rows[index];\n if (!isRecord(row) || !(row.key instanceof Uint8Array) || !(row.value instanceof Uint8Array)) {\n throw workerProtocolError('WorkerProtocolError', 'scan row payload key/value is not a Uint8Array');\n }\n const keyLength = checkedU32(row.key.byteLength, 'scan row key length');\n const valueLength = checkedU32(row.value.byteLength, 'scan row value length');\n payloadBytes += keyLength + valueLength;\n if (payloadBytes > U32_MAX) {\n throw workerProtocolError('WorkerProtocolError', 'packed scan row payload exceeds 32-bit payload limit');\n }\n }\n const payloadOffset = checkedAdd(4, metadataBytes, 'packed scan row header');\n const totalBytes = checkedAdd(payloadOffset, payloadBytes, 'packed scan row total');\n if (totalBytes > MAX_PACKED_RESPONSE_BYTES) {\n return null;\n }\n const bytes = new Uint8Array(totalBytes);\n const view = new DataView(bytes.buffer);\n view.setUint32(0, count, true);\n let metadataOffset = 4;\n let writeOffset = payloadOffset;\n for (let index = 0; index < count; index += 1) {\n const row = rows[index];\n const key = row.key;\n const value = row.value;\n const keyLength = key.byteLength;\n const valueLength = value.byteLength;\n view.setUint32(metadataOffset, keyLength, true);\n view.setUint32(metadataOffset + 4, valueLength, true);\n metadataOffset += 8;\n bytes.set(key, writeOffset);\n writeOffset += keyLength;\n bytes.set(value, writeOffset);\n writeOffset += valueLength;\n }\n return {\n __moyodbPacked: PACKED_SCAN_ROWS_V1,\n bytes\n };\n}\n\nfunction unpackScanRows(payload: PackedScanRowsV1): Array<{ key: Uint8Array; value: Uint8Array }> {\n const bytes = payload.bytes;\n if (!(bytes instanceof Uint8Array) || bytes.byteLength < 4) {\n throw workerProtocolError('WorkerProtocolError', 'invalid packed scan row payload');\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const count = view.getUint32(0, true);\n const metadataBytes = checkedByteCount(count, 8, 'packed scan row metadata');\n const payloadOffset = checkedAdd(4, metadataBytes, 'packed scan row header');\n if (payloadOffset > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed scan row metadata exceeds payload length');\n }\n\n const rows = new Array<{ key: Uint8Array; value: Uint8Array }>(count);\n let metadataOffset = 4;\n let readOffset = payloadOffset;\n for (let index = 0; index < count; index += 1) {\n const keyLength = view.getUint32(metadataOffset, true);\n const valueLength = view.getUint32(metadataOffset + 4, true);\n metadataOffset += 8;\n const keyEnd = readOffset + keyLength;\n if (keyEnd > U32_MAX || keyEnd > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed scan row key exceeds payload length');\n }\n const valueEnd = keyEnd + valueLength;\n if (valueEnd > U32_MAX || valueEnd > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed scan row value exceeds payload length');\n }\n rows[index] = {\n key: bytes.subarray(readOffset, keyEnd),\n value: bytes.subarray(keyEnd, valueEnd)\n };\n readOffset = valueEnd;\n }\n if (readOffset !== bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed scan row payload has trailing bytes');\n }\n return rows;\n}\n\nfunction packBatchOps(ops: Array<BatchOp>): PackedBatchOpsV1 {\n const count = ops.length;\n const metadataBytes = checkedByteCount(count, 9, 'packed batch metadata');\n let payloadBytes = 0;\n for (let index = 0; index < count; index += 1) {\n const op = ops[index];\n if (!(op.key instanceof Uint8Array)) {\n throw workerProtocolError('WorkerProtocolError', 'batch operation key is not a Uint8Array');\n }\n const keyLength = checkedU32(op.key.byteLength, 'batch operation key length');\n payloadBytes += keyLength;\n if (payloadBytes > U32_MAX) {\n throw workerProtocolError('WorkerProtocolError', 'packed batch payload exceeds 32-bit payload limit');\n }\n if (op.kind === 'put') {\n if (!(op.value instanceof Uint8Array)) {\n throw workerProtocolError('WorkerProtocolError', 'batch put value is not a Uint8Array');\n }\n const valueLength = checkedU32(op.value.byteLength, 'batch put value length');\n payloadBytes += valueLength;\n if (payloadBytes > U32_MAX) {\n throw workerProtocolError('WorkerProtocolError', 'packed batch payload exceeds 32-bit payload limit');\n }\n }\n }\n const payloadOffset = checkedAdd(4, metadataBytes, 'packed batch header');\n const totalBytes = checkedAdd(payloadOffset, payloadBytes, 'packed batch total');\n const bytes = new Uint8Array(totalBytes);\n const view = new DataView(bytes.buffer);\n view.setUint32(0, count, true);\n let metadataOffset = 4;\n let writeOffset = payloadOffset;\n for (let index = 0; index < count; index += 1) {\n const op = ops[index];\n const key = op.key;\n const keyLength = key.byteLength;\n const valueLength = op.kind === 'put' ? op.value.byteLength : 0;\n view.setUint8(metadataOffset, op.kind === 'put' ? BATCH_OP_PUT : BATCH_OP_DELETE);\n view.setUint32(metadataOffset + 1, keyLength, true);\n view.setUint32(metadataOffset + 5, valueLength, true);\n metadataOffset += 9;\n bytes.set(key, writeOffset);\n writeOffset += keyLength;\n if (op.kind === 'put') {\n bytes.set(op.value, writeOffset);\n writeOffset += valueLength;\n }\n }\n return {\n __moyodbPacked: PACKED_BATCH_OPS_V1,\n bytes\n };\n}\n\nfunction unpackBatchOps(payload: PackedBatchOpsV1): Array<BatchOp> {\n const bytes = payload.bytes;\n if (!(bytes instanceof Uint8Array) || bytes.byteLength < 4) {\n throw workerProtocolError('WorkerProtocolError', 'invalid packed batch payload');\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const count = view.getUint32(0, true);\n const metadataBytes = checkedByteCount(count, 9, 'packed batch metadata');\n const payloadOffset = checkedAdd(4, metadataBytes, 'packed batch header');\n if (payloadOffset > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed batch metadata exceeds payload length');\n }\n\n const ops = new Array<BatchOp>(count);\n let metadataOffset = 4;\n let readOffset = payloadOffset;\n for (let index = 0; index < count; index += 1) {\n const kind = view.getUint8(metadataOffset);\n const keyLength = view.getUint32(metadataOffset + 1, true);\n const valueLength = view.getUint32(metadataOffset + 5, true);\n metadataOffset += 9;\n\n const keyEnd = readOffset + keyLength;\n if (keyEnd > U32_MAX || keyEnd > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed batch key exceeds payload length');\n }\n const key = bytes.subarray(readOffset, keyEnd);\n readOffset = keyEnd;\n\n if (kind === BATCH_OP_DELETE) {\n if (valueLength !== 0) {\n throw workerProtocolError('WorkerProtocolError', 'packed delete operation has a value payload');\n }\n ops[index] = { kind: 'delete', key };\n continue;\n }\n\n if (kind !== BATCH_OP_PUT) {\n throw workerProtocolError('WorkerProtocolError', `packed batch operation has invalid kind byte: ${kind}`);\n }\n const valueEnd = readOffset + valueLength;\n if (valueEnd > U32_MAX || valueEnd > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed batch value exceeds payload length');\n }\n ops[index] = { kind: 'put', key, value: bytes.subarray(readOffset, valueEnd) };\n readOffset = valueEnd;\n }\n if (readOffset !== bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed batch payload has trailing bytes');\n }\n return ops;\n}\n\nfunction unpackBatchOpKeys(payload: PackedBatchOpsV1): PackedBatchOpKey[] {\n const bytes = payload.bytes;\n if (!(bytes instanceof Uint8Array) || bytes.byteLength < 4) {\n throw workerProtocolError('WorkerProtocolError', 'invalid packed batch payload');\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const count = view.getUint32(0, true);\n const metadataBytes = checkedByteCount(count, 9, 'packed batch metadata');\n const payloadOffset = checkedAdd(4, metadataBytes, 'packed batch header');\n if (payloadOffset > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed batch metadata exceeds payload length');\n }\n\n const ops = new Array<PackedBatchOpKey>(count);\n let metadataOffset = 4;\n let readOffset = payloadOffset;\n for (let index = 0; index < count; index += 1) {\n const kind = view.getUint8(metadataOffset);\n const keyLength = view.getUint32(metadataOffset + 1, true);\n const valueLength = view.getUint32(metadataOffset + 5, true);\n metadataOffset += 9;\n\n const keyEnd = readOffset + keyLength;\n if (keyEnd > U32_MAX || keyEnd > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed batch key exceeds payload length');\n }\n const key = bytes.subarray(readOffset, keyEnd);\n readOffset = keyEnd;\n\n if (kind === BATCH_OP_DELETE) {\n if (valueLength !== 0) {\n throw workerProtocolError('WorkerProtocolError', 'packed delete operation has a value payload');\n }\n ops[index] = { kind: 'delete', key };\n continue;\n }\n\n if (kind !== BATCH_OP_PUT) {\n throw workerProtocolError('WorkerProtocolError', `packed batch operation has invalid kind byte: ${kind}`);\n }\n const valueEnd = readOffset + valueLength;\n if (valueEnd > U32_MAX || valueEnd > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed batch value exceeds payload length');\n }\n ops[index] = { kind: 'put', key };\n readOffset = valueEnd;\n }\n if (readOffset !== bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed batch payload has trailing bytes');\n }\n return ops;\n}\n\nfunction isPackedBinaryList(value: unknown): value is PackedBinaryListV1 {\n return isRecord(value) && value.__moyodbPacked === PACKED_BINARY_LIST_V1 && value.bytes instanceof Uint8Array;\n}\n\nfunction isPackedNullableBinaryList(value: unknown): value is PackedNullableBinaryListV1 {\n return (\n isRecord(value) && value.__moyodbPacked === PACKED_NULLABLE_BINARY_LIST_V1 && value.bytes instanceof Uint8Array\n );\n}\n\nfunction isPackedScanRows(value: unknown): value is PackedScanRowsV1 {\n return isRecord(value) && value.__moyodbPacked === PACKED_SCAN_ROWS_V1 && value.bytes instanceof Uint8Array;\n}\n\nfunction isPackedBatchOps(value: unknown): value is PackedBatchOpsV1 {\n return isRecord(value) && value.__moyodbPacked === PACKED_BATCH_OPS_V1 && value.bytes instanceof Uint8Array;\n}\n\nfunction isPackedOptionalValues(value: unknown): value is PackedOptionalValuesV1 {\n return isRecord(value) && value.__moyodbPacked === PACKED_OPTIONAL_VALUES_V1 && value.bytes instanceof Uint8Array;\n}\n\nfunction checkedByteCount(count: number, itemBytes: number, what: string): number {\n if (!Number.isSafeInteger(count) || count < 0) {\n throw workerProtocolError('WorkerProtocolError', `${what} count is invalid: ${count}`);\n }\n return checkedU32(count * itemBytes, what);\n}\n\nfunction checkedAdd(left: number, right: number, what: string): number {\n const total = left + right;\n return checkedU32(total, what);\n}\n\nfunction checkedU32(value: number, what: string): number {\n if (!Number.isSafeInteger(value) || value < 0 || value > U32_MAX) {\n throw workerProtocolError('WorkerProtocolError', `${what} exceeds 32-bit payload limit`);\n }\n return value;\n}\n\nfunction copyToOwnedUint8Array(value: Uint8Array): Uint8Array {\n const owned = new Uint8Array(value.byteLength);\n owned.set(value);\n return owned;\n}\n\nfunction stringOrUndefined(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n","import type { AutocommitCommand, WorkerApi } from './worker-api';\nimport {\n WORKER_PROTOCOL_READY,\n WORKER_PROTOCOL_RESPONSE,\n WORKER_PROTOCOL_VERSION,\n decodeWorkerCommandPayload,\n isAutocommitCommand,\n packedBatchOpsBytes,\n packedBinaryListBytes,\n prepareWorkerResponsePayload,\n isWorkerCommand,\n isWorkerProtocolEnvelope,\n isWorkerProtocolRequestMessage,\n serializeWorkerError,\n workerProtocolError,\n type WorkerProtocolErrorMessage,\n type WorkerProtocolResponseMessage,\n type WorkerProtocolSuccessMessage,\n type WorkerCommand\n} from './worker-protocol';\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\n/** Commands whose first argument is a transaction handle; they run in that transaction's 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 'reconcileIndexes',\n 'setSchemaVersion'\n]);\n\n/** Commands that replace or tear down engine state and must not overlap any other engine work. */\nconst EXCLUSIVE_COMMANDS = new Set<WorkerCommand>([\n 'open',\n 'close',\n 'destroy',\n 'importSnapshot',\n 'reset',\n 'compact',\n 'rebuild'\n]);\n\n/**\n * Commands that never touch the open engine. They bypass scheduling so a slow\n * browser API (storage estimate, persistence prompt) cannot stall a close.\n */\nconst UNSCHEDULED_COMMANDS = new Set<WorkerCommand>(['deleteDB', 'storageInfo', 'requestPersistence']);\n\nconst noop = () => {};\n\n/**\n * Orders requests the way the engine needs them:\n * - operations of one transaction run strictly one after another, so an\n * awaited step (compression, uniqueness check) cannot interleave with the\n * next operation of the same transaction;\n * - readwrite autocommits queue behind each other instead of failing on the\n * single-writer rule;\n * - exclusive commands wait for all in-flight work and hold back new work\n * 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\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 return this.#runExclusive(task);\n }\n return this.#runShared(laneFor(command, args), task);\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 void settled.then(() => {\n this.#inFlight.delete(settled);\n });\n if (lane !== null) {\n this.#lanes.set(lane, settled);\n void settled.then(() => {\n if (this.#lanes.get(lane) === settled) {\n this.#lanes.delete(lane);\n }\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\nexport function exposeWorkerApi(\n api: WorkerApi,\n scope: DedicatedWorkerGlobalScope = self as DedicatedWorkerGlobalScope\n): WorkerServerHandle {\n const scheduler = new RequestScheduler();\n const handleMessage = (event: MessageEvent<unknown>) => {\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 });\n return {\n close() {\n scope.removeEventListener('message', handleMessage);\n }\n };\n}\n\nasync function dispatchWorkerRequest(\n scope: DedicatedWorkerGlobalScope,\n api: WorkerApi,\n scheduler: RequestScheduler,\n data: unknown\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 postWorkerResponse(\n scope,\n errorResponse(id, workerProtocolError('WorkerProtocolError', 'invalid worker protocol request'))\n );\n return;\n }\n if (!isWorkerCommand(data.command)) {\n postWorkerResponse(\n scope,\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 postWorkerResponse(scope, successResponse(data.id, responsePayload.result), responsePayload.transfer);\n } catch (error) {\n postWorkerResponse(scope, 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 const method = api[command] as unknown as (...methodArgs: unknown[]) => Promise<unknown>;\n return method.apply(api, decodeWorkerCommandPayload(command, args as never) as unknown[]);\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 } as WorkerProtocolSuccessMessage;\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: DedicatedWorkerGlobalScope,\n response: WorkerProtocolResponseMessage,\n transfer: Transferable[] = []\n): void {\n if (response.ok && transfer.length > 0) {\n try {\n scope.postMessage(response, transfer);\n return;\n } catch {}\n }\n scope.postMessage(response);\n}\n","import type { Range } from './types';\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\nconst TYPE_NULL = 0x10;\nconst TYPE_FALSE = 0x20;\nconst TYPE_TRUE = 0x21;\nconst TYPE_NUMBER = 0x30;\nconst TYPE_STRING = 0x40;\nconst TYPE_BYTES = 0x50;\nconst COMPOUND_ESCAPE = 0x00;\nconst COMPOUND_ESCAPE_CONT = 0xff;\nconst COMPOUND_TERM = 0x00;\nconst F64_MASK = 0xffffffffffffffffn;\nexport type CompoundKeyPart = string | number | boolean | null | Uint8Array;\nexport type IndexKeyPrimitive = CompoundKeyPart;\nexport function utf8Encode(value: string): Uint8Array {\n return encoder.encode(value);\n}\nexport function utf8Decode(bytes: Uint8Array): string {\n return decoder.decode(bytes);\n}\nexport function jsonEncode(value: unknown): Uint8Array {\n return utf8Encode(JSON.stringify(value));\n}\nexport function jsonDecode<T>(bytes: Uint8Array): T {\n return JSON.parse(utf8Decode(bytes)) as T;\n}\nexport function u64Key(value: bigint | number): Uint8Array {\n const asBigInt = typeof value === 'bigint' ? value : BigInt(value);\n if (asBigInt < 0n) {\n throw new RangeError('u64Key only accepts non-negative values');\n }\n const buf = new ArrayBuffer(8);\n const view = new DataView(buf);\n view.setBigUint64(0, asBigInt, false);\n return new Uint8Array(buf);\n}\nfunction isCompoundKeyPartList(\n value: CompoundKeyPart | ReadonlyArray<CompoundKeyPart>\n): value is ReadonlyArray<CompoundKeyPart> {\n return Array.isArray(value);\n}\nexport function indexKey(value: CompoundKeyPart | ReadonlyArray<CompoundKeyPart>): Uint8Array {\n if (isCompoundKeyPartList(value)) {\n return compoundKey(...value);\n }\n return encodeCompoundKeyPart(value);\n}\nexport function compoundKey(...parts: CompoundKeyPart[]): Uint8Array {\n return encodeCompoundBytes(parts.map((part) => encodeCompoundKeyPart(part)));\n}\nexport function encodeIndexScalar(value: IndexKeyPrimitive): Uint8Array {\n return encodeCompoundKeyPart(value);\n}\nexport function encodeCompoundKeyParts(parts: ReadonlyArray<Uint8Array>): Uint8Array {\n return encodeCompoundBytes(parts);\n}\nexport function splitCompoundKey(key: Uint8Array): Uint8Array[] {\n const parts: Uint8Array[] = [];\n const current: number[] = [];\n for (let index = 0; index < key.length; index += 1) {\n const byte = key[index];\n if (byte !== COMPOUND_ESCAPE) {\n current.push(byte);\n continue;\n }\n const next = key[index + 1];\n if (next === COMPOUND_ESCAPE_CONT) {\n current.push(COMPOUND_ESCAPE);\n index += 1;\n continue;\n }\n if (next === COMPOUND_TERM) {\n parts.push(Uint8Array.from(current));\n current.length = 0;\n index += 1;\n continue;\n }\n throw new TypeError('invalid compound key encoding');\n }\n if (current.length !== 0) {\n throw new TypeError('compound key terminated unexpectedly');\n }\n return parts;\n}\nexport function prefixSuccessor(prefix: Uint8Array): Uint8Array | null {\n const out = prefix.slice();\n for (let index = out.length - 1; index >= 0; index -= 1) {\n if (out[index] !== 0xff) {\n out[index] += 1;\n return out.subarray(0, index + 1);\n }\n }\n return null;\n}\nexport function prefixRange(prefix: Uint8Array): Range {\n const upper = prefixSuccessor(prefix);\n return upper ? { gte: prefix, lt: upper } : { gte: prefix };\n}\nexport function compoundKeyRange(...parts: CompoundKeyPart[]): Range {\n return prefixRange(compoundKey(...parts));\n}\nfunction encodeCompoundKeyPart(value: CompoundKeyPart): Uint8Array {\n if (value === null) {\n return Uint8Array.of(TYPE_NULL);\n }\n if (typeof value === 'boolean') {\n return Uint8Array.of(value ? TYPE_TRUE : TYPE_FALSE);\n }\n if (typeof value === 'number') {\n return encodeSortableNumber(value);\n }\n if (typeof value === 'string') {\n const body = utf8Encode(value);\n const out = new Uint8Array(1 + body.length);\n out[0] = TYPE_STRING;\n out.set(body, 1);\n return out;\n }\n if (value instanceof Uint8Array) {\n const out = new Uint8Array(1 + value.length);\n out[0] = TYPE_BYTES;\n out.set(value, 1);\n return out;\n }\n throw new TypeError('compound key parts must be string, number, boolean, null, or Uint8Array');\n}\nfunction encodeCompoundBytes(parts: ReadonlyArray<Uint8Array>): Uint8Array {\n let length = 0;\n for (const part of parts) {\n for (const byte of part) {\n length += byte === COMPOUND_ESCAPE ? 2 : 1;\n }\n length += 2;\n }\n const out = new Uint8Array(length);\n let offset = 0;\n for (const part of parts) {\n for (const byte of part) {\n if (byte === COMPOUND_ESCAPE) {\n out[offset] = COMPOUND_ESCAPE;\n out[offset + 1] = COMPOUND_ESCAPE_CONT;\n offset += 2;\n } else {\n out[offset] = byte;\n offset += 1;\n }\n }\n out[offset] = COMPOUND_TERM;\n out[offset + 1] = COMPOUND_TERM;\n offset += 2;\n }\n return out;\n}\nfunction encodeSortableNumber(value: number): Uint8Array {\n if (!Number.isFinite(value)) {\n throw new TypeError('compound key number parts must be finite');\n }\n const normalized = Object.is(value, -0) ? 0 : value;\n const buffer = new ArrayBuffer(9);\n const view = new DataView(buffer);\n view.setUint8(0, TYPE_NUMBER);\n view.setFloat64(1, normalized, false);\n let bits = view.getBigUint64(1, false);\n bits = (bits & (1n << 63n)) !== 0n ? ~bits & F64_MASK : bits ^ (1n << 63n);\n view.setBigUint64(1, bits, false);\n return new Uint8Array(buffer);\n}\n","import { utf8Encode } from './codec';\nimport type { CompressionKind } 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 STORE_FLAG_COMPRESSION_SHIFT = 2;\nconst STORE_FLAG_COMPRESSION_MASK = 0b11 << STORE_FLAG_COMPRESSION_SHIFT;\nexport const STORE_VALUE_COMPRESSION_THRESHOLD = 1024;\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(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 return table;\n})();\ntype EnvelopeHeader = {\n version: number;\n kindTag: number;\n rawLength: number;\n payloadChecksum: number;\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 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 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 for (const byte of bytes) {\n crc = (crc >>> 8) ^ CRC32_TABLE[(crc ^ byte) & 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 out.set(magic, 0);\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, crc32(payload), true);\n out.set(payload, ENVELOPE_HEADER_SIZE);\n return out;\n}\nfunction toOwnedArrayBuffer(bytes: Uint8Array): ArrayBuffer {\n const copy = new Uint8Array(bytes.byteLength);\n copy.set(bytes);\n return copy.buffer;\n}\nfunction readEnvelopeHeader(magic: Uint8Array, bytes: Uint8Array): EnvelopeHeader | null {\n if (bytes.byteLength < ENVELOPE_HEADER_SIZE) {\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 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, kind: CompressionKind): Promise<Uint8Array> {\n ensureCompressionRuntime();\n let stream: ReadableStream<Uint8Array>;\n try {\n stream = new Blob([toOwnedArrayBuffer(data)]).stream().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 ensureCompressionRuntime();\n let stream: ReadableStream<Uint8Array>;\n try {\n stream = new Blob([toOwnedArrayBuffer(data)]).stream().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 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 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 (value.byteLength < STORE_VALUE_COMPRESSION_THRESHOLD) {\n return buildEnvelope(STORE_RECORD_MAGIC, COMPRESSION_TAG_NONE, value.byteLength, value);\n }\n const compressed = await compressBytes(value, compression);\n if (compressed.byteLength >= value.byteLength) {\n return buildEnvelope(STORE_RECORD_MAGIC, COMPRESSION_TAG_NONE, value.byteLength, value);\n }\n return buildEnvelope(STORE_RECORD_MAGIC, compressionTag(compression), value.byteLength, compressed);\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);\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: CompressionOption\n): Promise<Uint8Array> {\n if (compression === false) {\n return snapshot;\n }\n const compressed = await compressBytes(snapshot, compression);\n return buildEnvelope(SNAPSHOT_EXPORT_MAGIC, compressionTag(compression), snapshot.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 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 class MoyoDbError extends Error {\n constructor(name: string, message: string) {\n super(message);\n this.name = name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\nexport class UnsupportedPlatformError extends MoyoDbError {\n constructor(message: string) {\n super('UnsupportedPlatformError', message);\n }\n}\nexport class DatabaseBusyError extends MoyoDbError {\n constructor(message: string) {\n super('DatabaseBusyError', message);\n }\n}\nexport class CorruptionError extends MoyoDbError {\n constructor(message: string) {\n super('CorruptionError', message);\n }\n}\nexport class StoreExistsError extends MoyoDbError {\n constructor(message: string) {\n super('StoreExistsError', message);\n }\n}\nexport class StoreNotFoundError extends MoyoDbError {\n constructor(message: string) {\n super('StoreNotFoundError', message);\n }\n}\nexport class IndexNotFoundError extends MoyoDbError {\n constructor(message: string) {\n super('IndexNotFoundError', message);\n }\n}\nexport class ConstraintError extends MoyoDbError {\n constructor(message: string) {\n super('ConstraintError', message);\n }\n}\nexport class UniqueIndexConstraintError extends ConstraintError {\n constructor(message: string) {\n super(message);\n this.name = 'UniqueIndexConstraintError';\n }\n}\nexport class WriteTransactionAlreadyOpenError extends MoyoDbError {\n constructor(message = 'write transaction already open') {\n super('WriteTransactionAlreadyOpenError', message);\n }\n}\nexport class ReadonlyTransactionError extends MoyoDbError {\n constructor(message = 'readonly transaction cannot perform this operation') {\n super('ReadonlyTransactionError', message);\n }\n}\nexport class TransactionClosedError extends MoyoDbError {\n constructor(message = 'transaction is already closed') {\n super('TransactionClosedError', message);\n }\n}\nexport class DatabaseClosedError extends MoyoDbError {\n constructor(message = 'database handle is closed') {\n super('DatabaseClosedError', message);\n }\n}\nexport class ValueTooLargeError extends MoyoDbError {\n constructor(message: string) {\n super('ValueTooLargeError', message);\n }\n}\nexport class KeyTooLargeError extends MoyoDbError {\n constructor(message: string) {\n super('KeyTooLargeError', message);\n }\n}\nexport class StoreNameTooLongError extends MoyoDbError {\n constructor(message: string) {\n super('StoreNameTooLongError', message);\n }\n}\nexport class ReservedStoreNameError extends MoyoDbError {\n constructor(message: string) {\n super('ReservedStoreNameError', message);\n }\n}\nexport class InvalidRangeError extends MoyoDbError {\n constructor(message: string) {\n super('InvalidRangeError', message);\n }\n}\nexport class StorageError extends MoyoDbError {\n constructor(message: string) {\n super('StorageError', message);\n }\n}\nexport class SerializationError extends MoyoDbError {\n constructor(message: string) {\n super('SerializationError', message);\n }\n}\nexport class InjectedFailureError extends MoyoDbError {\n constructor(message: string) {\n super('InjectedFailureError', message);\n }\n}\nexport class ChangeFeedCompactedError extends MoyoDbError {\n constructor(message: string) {\n super('ChangeFeedCompactedError', message);\n }\n}\n/**\n * The outcome of a commit could not be confirmed (storage failed at or after\n * the WAL append) or the engine hit an unrecoverable fault. The database\n * rejects further work until it is reopened, which replays durable state.\n */\nexport class RecoveryRequiredError extends MoyoDbError {\n constructor(message: string) {\n super('RecoveryRequiredError', message);\n }\n}\nexport class InternalError extends MoyoDbError {\n constructor(message: string) {\n super('InternalError', message);\n }\n}\nexport class InvalidOpenOptionsError extends MoyoDbError {\n constructor(message: string) {\n super('InvalidOpenOptionsError', message);\n }\n}\nexport class VersionError extends MoyoDbError {\n constructor(message: string) {\n super('VersionError', message);\n }\n}\ntype ErrorPayload = {\n code?: string;\n name?: string;\n message?: string;\n};\ntype ErrorConstructor = new (message: string) => Error;\nconst ERROR_CONSTRUCTORS = {\n UnsupportedPlatformError,\n DatabaseBusyError,\n CorruptionError,\n StoreExistsError,\n StoreNotFoundError,\n IndexNotFoundError,\n ConstraintError,\n UniqueIndexConstraintError,\n WriteTransactionAlreadyOpenError,\n ReadonlyTransactionError,\n TransactionClosedError,\n DatabaseClosedError,\n ValueTooLargeError,\n KeyTooLargeError,\n StoreNameTooLongError,\n ReservedStoreNameError,\n InvalidRangeError,\n StorageError,\n SerializationError,\n InjectedFailureError,\n ChangeFeedCompactedError,\n RecoveryRequiredError,\n InternalError,\n InvalidOpenOptionsError,\n VersionError\n} satisfies Record<string, ErrorConstructor>;\n\nfunction instantiateError(code: string, message: string): Error {\n if (Object.prototype.hasOwnProperty.call(ERROR_CONSTRUCTORS, code)) {\n const ErrorConstructor = ERROR_CONSTRUCTORS[code as keyof typeof ERROR_CONSTRUCTORS];\n return new ErrorConstructor(message);\n }\n const err = new Error(message);\n err.name = code;\n return err;\n}\n\nexport function normalizeError(error: unknown): Error {\n if (error instanceof MoyoDbError) {\n return error;\n }\n if (error instanceof Error) {\n if (error.name === 'Error') {\n return error;\n }\n return instantiateError(error.name, error.message);\n }\n const payload = error as ErrorPayload | undefined;\n const code = payload?.code ?? payload?.name ?? 'Error';\n const message = payload?.message ?? String(error);\n return instantiateError(code, message);\n}\n","import { InvalidOpenOptionsError, ReservedStoreNameError, SerializationError } from './errors';\nimport { compareStringsByCodeUnit } from './internal';\nimport {\n encodeCompoundKeyParts,\n encodeIndexScalar,\n prefixRange,\n prefixSuccessor,\n splitCompoundKey,\n utf8Encode\n} from './codec';\nimport type { IndexDef, Range } from './types';\nconst encoder = new TextEncoder();\nconst fatalDecoder = new TextDecoder('utf-8', { fatal: true });\nconst MISSING = Symbol('moyodb.indexing.missing');\nconst FNV64_OFFSET = 0xcbf29ce484222325n;\nconst FNV64_PRIME = 0x100000001b3n;\nconst FNV64_MASK = 0xffffffffffffffffn;\n// Legacy SDK internal namespace preserved for storage-format compatibility; do not rename without a migration.\nconst INTERNAL_STORE_PREFIX = '__browserdb:';\nconst INTERNAL_INDEX_STORE_PREFIX = '__browserdb:index:';\nexport const INDEX_METADATA_STORE = '__browserdb:indexes';\nexport interface NormalizedIndexDef {\n store: string;\n name: string;\n keyPath: string[];\n compound: boolean;\n unique: boolean;\n internalStore: string;\n}\nexport interface DecodedIndexEntryKey {\n logicalKey: Uint8Array;\n primaryKey: Uint8Array;\n}\nexport function isInternalStoreName(name: string): boolean {\n return name.startsWith(INTERNAL_STORE_PREFIX);\n}\nexport function assertPublicStoreName(name: string): void {\n if (isInternalStoreName(name)) {\n throw new ReservedStoreNameError(`reserved store name: ${name}`);\n }\n}\nexport function normalizeIndexDefinitions(value: unknown): NormalizedIndexDef[] {\n if (value === undefined) {\n return [];\n }\n if (!Array.isArray(value)) {\n throw new InvalidOpenOptionsError('indexes must be an array');\n }\n const normalized: NormalizedIndexDef[] = [];\n const identities = new Set<string>();\n const internalStores = new Map<string, string>();\n for (const entry of value) {\n if (entry === null || typeof entry !== 'object' || Array.isArray(entry)) {\n throw new InvalidOpenOptionsError('each index definition must be an object');\n }\n const { store, name, keyPath, unique } = entry as {\n store?: unknown;\n name?: unknown;\n keyPath?: unknown;\n unique?: unknown;\n };\n if (typeof store !== 'string' || store.length === 0) {\n throw new InvalidOpenOptionsError('index store must be a non-empty string');\n }\n if (typeof name !== 'string' || name.length === 0) {\n throw new InvalidOpenOptionsError('index name must be a non-empty string');\n }\n assertPublicStoreName(store);\n const keyPathInfo = normalizeIndexKeyPath(keyPath);\n if (unique !== undefined && typeof unique !== 'boolean') {\n throw new InvalidOpenOptionsError('index unique must be a boolean');\n }\n const def: NormalizedIndexDef = {\n store,\n name,\n keyPath: keyPathInfo.paths,\n compound: keyPathInfo.compound,\n unique: unique ?? false,\n internalStore: makeInternalIndexStoreName(store, name)\n };\n const identity = indexDefinitionIdentity(def.store, def.name);\n if (identities.has(identity)) {\n throw new InvalidOpenOptionsError(`duplicate index definition ${def.store}.${def.name}`);\n }\n identities.add(identity);\n const mappedIdentity = internalStores.get(def.internalStore);\n if (mappedIdentity && mappedIdentity !== identity) {\n throw new InvalidOpenOptionsError(\n `index definitions ${mappedIdentity} and ${identity} map to the same internal store ${def.internalStore}`\n );\n }\n internalStores.set(def.internalStore, identity);\n normalized.push(def);\n }\n normalized.sort(compareNormalizedIndexDefinitions);\n return normalized;\n}\nexport function compareNormalizedIndexDefinitions(left: NormalizedIndexDef, right: NormalizedIndexDef): number {\n const storeCompare = compareStringsByCodeUnit(left.store, right.store);\n if (storeCompare !== 0) {\n return storeCompare;\n }\n const nameCompare = compareStringsByCodeUnit(left.name, right.name);\n if (nameCompare !== 0) {\n return nameCompare;\n }\n const uniqueCompare = Number(left.unique) - Number(right.unique);\n if (uniqueCompare !== 0) {\n return uniqueCompare;\n }\n return compareStringsByCodeUnit(serializeIndexKeyPath(left), serializeIndexKeyPath(right));\n}\nexport function indexDefinitionIdentity(store: string, name: string): string {\n return `${store}\\u0000${name}`;\n}\nexport function findIndexDefinition(\n defs: ReadonlyArray<NormalizedIndexDef>,\n store: string,\n name: string\n): NormalizedIndexDef | null {\n return defs.find((def) => def.store === store && def.name === name) ?? null;\n}\nexport function indexesForStore(defs: ReadonlyArray<NormalizedIndexDef>, store: string): NormalizedIndexDef[] {\n return defs.filter((def) => def.store === store);\n}\nexport function encodeIndexMetadataKey(store: string, name: string): Uint8Array {\n return encodeCompoundKeyParts([utf8Encode(store), utf8Encode(name)]);\n}\nexport function encodeIndexMetadataValue(def: NormalizedIndexDef): Uint8Array {\n return utf8Encode(JSON.stringify(toPublicIndexDefinition(def)));\n}\nexport function decodeIndexMetadataValue(bytes: Uint8Array): NormalizedIndexDef {\n let parsed: unknown;\n try {\n parsed = JSON.parse(fatalDecoder.decode(bytes));\n } catch (error) {\n throw new SerializationError(`invalid persisted index metadata: ${String(error)}`);\n }\n const [def] = normalizeIndexDefinitions([parsed]);\n return def;\n}\nexport function encodeIndexEntryKey(logicalIndexKey: Uint8Array, primaryKey: Uint8Array): Uint8Array {\n return encodeCompoundKeyParts([logicalIndexKey, primaryKey]);\n}\nexport function decodeIndexEntryKey(bytes: Uint8Array): DecodedIndexEntryKey {\n const parts = splitCompoundKey(bytes);\n if (parts.length !== 2) {\n throw new SerializationError('invalid index entry key encoding');\n }\n return {\n logicalKey: parts[0],\n primaryKey: parts[1]\n };\n}\nexport function indexKeyExactRange(logicalIndexKey: Uint8Array): Range {\n return prefixRange(encodeCompoundKeyParts([logicalIndexKey]));\n}\nexport function indexRangeToPhysicalRange(range: Range = {}): Range {\n validateIndexRangeShape(range);\n const physical: Range = {};\n if (range.reverse !== undefined) {\n physical.reverse = range.reverse;\n }\n if (range.limit !== undefined) {\n physical.limit = range.limit;\n }\n if (range.gte) {\n physical.gte = encodeCompoundKeyParts([range.gte]);\n }\n if (range.gt) {\n const lower = prefixSuccessor(encodeCompoundKeyParts([range.gt]));\n if (lower) {\n physical.gte = lower;\n }\n }\n if (range.lt) {\n physical.lt = encodeCompoundKeyParts([range.lt]);\n }\n if (range.lte) {\n const upper = prefixSuccessor(encodeCompoundKeyParts([range.lte]));\n if (upper) {\n physical.lt = upper;\n }\n }\n return physical;\n}\nexport function extractLogicalIndexKey(def: NormalizedIndexDef, valueBytes: Uint8Array): Uint8Array | null {\n const documentValue = decodeIndexedDocument(valueBytes);\n if (def.compound) {\n const parts: Uint8Array[] = [];\n for (const keyPath of def.keyPath) {\n const resolved = resolveKeyPath(documentValue, keyPath);\n if (resolved === MISSING) {\n return null;\n }\n parts.push(encodeDocumentIndexValue(resolved));\n }\n return encodeCompoundKeyParts(parts);\n }\n const resolved = resolveKeyPath(documentValue, def.keyPath[0]);\n if (resolved === MISSING) {\n return null;\n }\n return encodeDocumentIndexValue(resolved);\n}\nexport function serializeNormalizedIndexDefinitions(defs: ReadonlyArray<NormalizedIndexDef>): string {\n return JSON.stringify(toPublicIndexDefinitions(defs));\n}\nexport function cloneNormalizedIndexDefinitions(defs: ReadonlyArray<NormalizedIndexDef>): NormalizedIndexDef[] {\n return defs.map((def) => ({\n store: def.store,\n name: def.name,\n keyPath: [...def.keyPath],\n compound: def.compound,\n unique: def.unique,\n internalStore: def.internalStore\n }));\n}\nexport function toPublicIndexDefinitions(defs: ReadonlyArray<NormalizedIndexDef>): IndexDef[] {\n return defs.map(toPublicIndexDefinition);\n}\nfunction toPublicIndexDefinition(def: NormalizedIndexDef): IndexDef {\n return {\n store: def.store,\n name: def.name,\n keyPath: def.compound ? [...def.keyPath] : def.keyPath[0],\n unique: def.unique\n };\n}\nfunction normalizeIndexKeyPath(value: unknown): {\n paths: string[];\n compound: boolean;\n} {\n if (typeof value === 'string') {\n validateSingleKeyPath(value);\n return { paths: [value], compound: false };\n }\n if (\n !Array.isArray(value) ||\n value.length === 0 ||\n !value.every((item): item is string => typeof item === 'string')\n ) {\n throw new InvalidOpenOptionsError('index keyPath must be a non-empty string or non-empty string[]');\n }\n for (const path of value) {\n validateSingleKeyPath(path);\n }\n return { paths: [...value], compound: true };\n}\nfunction validateSingleKeyPath(value: string): void {\n if (value.length === 0) {\n throw new InvalidOpenOptionsError('index keyPath strings must be non-empty');\n }\n if (value.startsWith('.') || value.endsWith('.') || value.includes('..')) {\n throw new InvalidOpenOptionsError(`invalid index keyPath: ${value}`);\n }\n}\nfunction serializeIndexKeyPath(def: NormalizedIndexDef): string {\n return def.compound ? `[${def.keyPath.join(',')}]` : def.keyPath[0];\n}\nfunction makeInternalIndexStoreName(store: string, name: string): string {\n const storeToken = base64Url(utf8Encode(store));\n const nameToken = base64Url(utf8Encode(name));\n const candidate = `${INTERNAL_INDEX_STORE_PREFIX}${storeToken}:${nameToken}`;\n if (encoder.encode(candidate).length <= 255) {\n return candidate;\n }\n const payload = utf8Encode(indexDefinitionIdentity(store, name));\n return `${INTERNAL_INDEX_STORE_PREFIX}h:${fnv1a64Hex(payload)}`;\n}\nfunction base64Url(bytes: Uint8Array): string {\n let binary = '';\n for (const byte of bytes) {\n binary += String.fromCharCode(byte);\n }\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/u, '');\n}\nfunction fnv1a64Hex(bytes: Uint8Array): string {\n let hash = FNV64_OFFSET;\n for (const byte of bytes) {\n hash ^= BigInt(byte);\n hash = (hash * FNV64_PRIME) & FNV64_MASK;\n }\n return hash.toString(16).padStart(16, '0');\n}\nfunction decodeIndexedDocument(bytes: Uint8Array): unknown {\n try {\n return JSON.parse(fatalDecoder.decode(bytes));\n } catch (error) {\n throw new SerializationError(`indexed values must be valid UTF-8 JSON: ${String(error)}`);\n }\n}\nfunction resolveKeyPath(root: unknown, keyPath: string): unknown {\n let current: unknown = root;\n for (const segment of keyPath.split('.')) {\n if (current === null || current === undefined) {\n return MISSING;\n }\n const target = Object(current) as Record<string, unknown>;\n if (!(segment in target)) {\n return MISSING;\n }\n current = Reflect.get(target, segment);\n }\n return current;\n}\nfunction encodeDocumentIndexValue(value: unknown): Uint8Array {\n if (value instanceof Uint8Array) {\n return encodeIndexScalar(value);\n }\n if (value === null || typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return encodeIndexScalar(value);\n }\n throw new SerializationError(\n `indexed keyPath values must resolve to string, number, boolean, null, or Uint8Array; got ${describeValue(value)}`\n );\n}\nfunction describeValue(value: unknown): string {\n if (Array.isArray(value)) {\n return 'array';\n }\n if (value === null) {\n return 'null';\n }\n return typeof value;\n}\nfunction validateIndexRangeShape(range: Range): void {\n if (range.gt !== undefined && range.gte !== undefined) {\n throw new TypeError('index range cannot specify both gt and gte');\n }\n if (range.lt !== undefined && range.lte !== undefined) {\n throw new TypeError('index range cannot specify both lt and lte');\n }\n}\n","import { exposeWorkerApi } from './worker-server';\nimport {\n packedOptionalValues,\n unpackPackedBatchOpKeys,\n unpackPackedBatchOps,\n unpackPackedBinaryList,\n unpackPackedBinaryPairKeys,\n unpackPackedBinaryPairs,\n unpackPackedOptionalValues,\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 wrapSnapshotWithCompression,\n unwrapSnapshotCompression,\n type CompressionOption\n} from './compression';\nimport { prefixRange, utf8Encode } from './codec';\nimport { isRecord } from './internal';\nimport {\n INDEX_METADATA_STORE,\n cloneNormalizedIndexDefinitions,\n compareNormalizedIndexDefinitions,\n decodeIndexEntryKey,\n decodeIndexMetadataValue,\n encodeIndexEntryKey,\n encodeIndexMetadataKey,\n encodeIndexMetadataValue,\n extractLogicalIndexKey,\n findIndexDefinition,\n indexKeyExactRange,\n indexRangeToPhysicalRange,\n indexesForStore,\n isInternalStoreName,\n normalizeIndexDefinitions,\n toPublicIndexDefinitions,\n type NormalizedIndexDef\n} from './indexing';\nimport type { AutocommitCommand, IndexScanPage, WorkerApi, WorkerOpenRequest } 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 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 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 /** Packed optional values: u32 count | count x u32 length (u32::MAX = missing) | bytes. */\n get_many_packed(txId: WasmU64, store: string, keys: Uint8Array): Uint8Array;\n /** Key metadata only; the value is never materialized. */\n has(txId: WasmU64, store: string, key: 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 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 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 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};\ntype WasmModule = {\n default: (\n options?: string | URL | Request | { module_or_path?: string | URL | Request | Promise<Response> | Response }\n ) => Promise<unknown>;\n deleteDB(name: string): Promise<void>;\n prepareRebuildTarget(name: string): Promise<{\n generationName: string;\n }>;\n /**\n * Publishes `generationName` as the active generation, but only if the\n * control file still names `expectedCurrent` (`null` = no control file).\n * The written control file is read back and verified before resolving.\n */\n swapActiveGeneration(name: string, generationName: string, expectedCurrent: string | null): Promise<void>;\n /** Active generation name, `null` when there is no control file; rejects on a corrupt one. */\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;\nfunction toWasmU64(value: number | bigint): WasmU64 {\n return BigInt(value);\n}\nfunction fromWasmU64(value: number | bigint): number {\n return typeof value === 'bigint' ? Number(value) : value;\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>;\ntype MaintenanceOperation = 'compact' | 'rebuild';\nconst EMPTY_RANGE: Range = {};\nconst EMPTY_VALUE = new Uint8Array(0);\nconst MAX_ENGINE_KEY_BYTES = 1024;\nconst INDEX_SCAN_PAGE_ROWS = 256;\nconst INDEX_SCAN_RAW_CHUNK_ROWS = 512;\nconst HEX_BYTE_STRINGS = Array.from({ length: 256 }, (_value, byte) => byte.toString(16).padStart(2, '0'));\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 {\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 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}\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(), 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}\nclass 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 = new MainThreadPersistenceBridge();\n private txChanges = new Map<number, TrackedTxnChanges>();\n private txModes = new Map<number, TxMode>();\n /**\n * Index schema each transaction runs against: the committed schema at\n * `begin`, replaced by `reconcileIndexes`. Never mutated in place.\n */\n private txIndexSchemas = new Map<number, NormalizedIndexDef[]>();\n private txIndexSchemaChanged = new Set<number>();\n private txStoreCompression = new Map<number, Map<string, CompressionOption>>();\n private committedIndexes: NormalizedIndexDef[] | null = null;\n private committedStoreCompression: Map<string, CompressionOption> | null = null;\n private openOptions: WorkerOpenRequest['options'] | null = null;\n private maintenanceOperation: MaintenanceOperation | null = null;\n async open(request: WorkerOpenRequest): Promise<void> {\n if (this.engine) {\n return;\n }\n assertSecureContext();\n await 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 // The files are deleted next; checkpointing into them is wasted work.\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 await 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 = new Map(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, 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 this.cleanupTxState(txId);\n const recovery = this.recoverEngineIfNeeded();\n // A durable commit is reported as committed. Injected failpoints\n // stand for a crash, which never gets to report anything.\n if (\n !recovery?.pendingCommitted ||\n recovery.pendingTxid === null ||\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 = new Map(storeCompressionSnapshot);\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 = options.compression ?? false;\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.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.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 if (isInternalStoreName(store) || this.storeCompressionForTx(txId, store) === false) {\n return values.map((value) => (value === null ? null : normalizeWasmBytes(value)));\n }\n return Promise.all(\n values.map(async (value) =>\n value === null ? null : this.decodeStoreValue(txId, store, normalizeWasmBytes(value))\n )\n );\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 // Raw values go back to the caller in the engine's own layout.\n return packedOptionalValues(packed);\n }\n return Promise.all(\n unpackPackedOptionalValues(packed).map(async (value) =>\n value === null ? null : this.decodeStoreValue(txId, store, value)\n )\n );\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 // Index maintenance needs the previous value to find its old index keys.\n const oldValue = await this.readStoreValue(txId, store, key);\n const plans = defs.map((def) => {\n const oldLogicalKey = oldValue === null ? null : extractLogicalIndexKey(def, oldValue);\n const newLogicalKey = extractLogicalIndexKey(def, value);\n return {\n def,\n oldLogicalKey,\n newLogicalKey,\n newPhysicalKey: null as Uint8Array | null\n };\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 continue;\n }\n await this.assertUniqueIndexAvailability(txId, plan.def, plan.newLogicalKey, key);\n }\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 for (const plan of plans) {\n if (plan.oldLogicalKey === null) {\n continue;\n }\n if (plan.newLogicalKey !== null && bytesEqual(plan.oldLogicalKey, plan.newLogicalKey)) {\n continue;\n }\n this.deleteIndexEntryIfPresent(txId, plan.def, plan.oldLogicalKey, key);\n }\n for (const plan of plans) {\n if (plan.newLogicalKey === null) {\n continue;\n }\n if (plan.oldLogicalKey !== null && bytesEqual(plan.oldLogicalKey, plan.newLogicalKey)) {\n continue;\n }\n if (plan.newPhysicalKey === null) {\n throw remoteError('InternalError', 'missing index entry key');\n }\n this.putIndexEntry(txId, plan.def, plan.newPhysicalKey, EMPTY_VALUE);\n }\n this.recordPutChange(txId, store, key, baselineExists);\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 remoteError(\n 'InternalError',\n `put_many outcome count mismatch: ${baselines.length} != ${entries.length}`\n );\n }\n this.recordPutChanges(txId, store, entries, baselines);\n return;\n }\n for (const [key, value] of entries) {\n await this.put(txId, store, key, value, options);\n }\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 || this.storeCompressionForTx(txId, store) !== false) {\n await this.putMany(txId, store, unpackPackedBinaryPairs(packedEntries), options);\n return;\n }\n const keys = unpackPackedBinaryPairKeys(packedEntries);\n if (keys.length === 0) {\n return;\n }\n let baselines: Uint8Array;\n try {\n baselines = this.withEngine((engine) =>\n engine.put_many_packed(toWasmU64(txId), store, packedEntries, 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 remoteError(\n 'InternalError',\n `put_many_packed outcome count mismatch: ${baselines.length} != ${keys.length}`\n );\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 // Only index maintenance needs the old value; otherwise the engine's\n // metadata answer is enough.\n const oldValue = defs.length === 0 ? null : await this.readStoreValue(txId, store, key);\n const oldLogicalKeys =\n oldValue === null ? [] : defs.map((def) => ({ def, logicalKey: extractLogicalIndexKey(def, oldValue) }));\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 remoteError(\n 'InternalError',\n `delete_many outcome count mismatch: ${deleted.length} != ${keys.length}`\n );\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 remoteError(\n 'InternalError',\n `delete_many_packed outcome count mismatch: ${deleted.length} != ${keys.length}`\n );\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 remoteError(\n 'InternalError',\n `apply_batch outcome count mismatch: ${outcomes.length} != ${ops.length}`\n );\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.recordBatchKeyOutcomes(txId, store, ops, partialBatchOutcomes(error));\n throw error;\n }\n if (flags.length !== ops.length) {\n throw remoteError(\n 'InternalError',\n `apply_batch_packed outcome count mismatch: ${flags.length} != ${ops.length}`\n );\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 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, prefixRange(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 ): Promise<IndexScanPage> {\n if (!Number.isSafeInteger(limit) || limit <= 0) {\n throw remoteError('InvalidRangeError', 'index scan page limit must be a positive integer');\n }\n const def = this.resolveIndexDefinition(txId, store, indexName);\n return this.loadVisibleIndexPage(txId, def, range, cursor, limit);\n }\n getIndexes(): Promise<IndexDef[]> {\n return Promise.resolve(toPublicIndexDefinitions(this.loadCommittedIndexSchema()));\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 for (const def of target) {\n this.ensureRawStore(txId, def.internalStore);\n this.clearRawStoreIfExists(txId, def.internalStore);\n if (this.rawStoreExistsInTx(txId, def.store)) {\n const rows = await this.readStoreScan(txId, def.store, EMPTY_RANGE);\n for (const row of rows) {\n const logicalKey = extractLogicalIndexKey(def, row.value);\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 = normalizeWasmBytes(change.key);\n let value: Uint8Array | undefined;\n if (change.value !== undefined) {\n value = await this.decodeStoreValueForFeed(change.store, normalizeWasmBytes(change.value));\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: options.limit === undefined ? changes : changes.slice(0, options.limit)\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.rollbackAllTransactions();\n const decompressed = await unwrapSnapshotCompression(data);\n const parsed = unwrapSnapshotWithIndexDefinitions(decompressed);\n this.withEngine((engine) => engine.import_snapshot(parsed.snapshot));\n this.committedIndexes = [];\n this.committedStoreCompression = null;\n await this.applyCommittedIndexSchema(parsed.indexes);\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.runCompactionOperation('compact');\n }\n async rebuild(): Promise<CompactionResult> {\n return this.runCompactionOperation('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: fromWasmU64(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, new Map(this.loadCommittedStoreCompression()));\n try {\n await this.reconcileIndexes(txId, toPublicIndexDefinitions(normalized));\n this.withEngine((engine) => engine.commit_tx(toWasmU64(txId)), { allowDuringMaintenance: true });\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 * Compaction publishes a new generation with a strict swap:\n * 1. read the active generation (a corrupt control file aborts here);\n * 2. stream every live row into a fresh generation inside the engine;\n * 3. compare-and-swap the control file against the generation read in 1;\n * 4. if the swap reports an error, re-read the control file to learn\n * which generation is actually active before deciding what to clean up.\n * The old engine is abandoned, not closed: its files are no longer\n * active, so it must not checkpoint into them.\n */\n private async runCompactionOperation(operation: MaintenanceOperation): 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 const wasm = await this.loadWasm();\n let rebuiltEngine: WasmEngine | null = null;\n let generationName: string | null = null;\n let published = false;\n try {\n const sizeBefore = await wasm.dbDirectorySize(dbName);\n const defs = cloneNormalizedIndexDefinitions(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((engine) => engine.compact_into(target), { allowDuringMaintenance: true });\n if (operation === 'rebuild' && defs.length > 0) {\n // compact copies index entries as they are; rebuild regenerates\n // them from the rows so stale entries do not survive.\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 = 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) {\n // Only unpublished generations are removed; if the control\n // file cannot be read, nothing is deleted.\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 * Brings a poisoned engine back to a trusted state. Returns `null` when\n * the engine was healthy. All open transactions are gone afterwards.\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 }\n this.clearRuntimeCaches();\n return {\n pendingTxid: fromOptionalWasmU64(report.pendingTxid),\n pendingCommitted: report.pendingCommitted === true\n };\n }\n private cleanupTxState(txId: number): void {\n this.txChanges.delete(txId);\n this.txModes.delete(txId);\n this.txIndexSchemas.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 // Earlier key changes are subsumed by the store-level change.\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: Array<BatchOp>,\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 recordBatchKeyOutcomes(\n txId: number,\n store: string,\n ops: 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(): Map<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 return getOrInsert(this.txStoreCompression, txId, () => new Map<string, CompressionOption>());\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.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 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 return await Promise.all(\n rows.map(async (row) => ({\n key: row.key,\n value: await this.decodeStoreValue(txId, store, row.value)\n }))\n );\n }\n private indexesForStoreInTx(txId: number, store: string): NormalizedIndexDef[] {\n return indexesForStore(this.indexSchemaForTx(txId), 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.indexSchemaForTx(txId), 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 this.ignoreNamedError('StoreExistsError', () => {\n this.withEngine((engine) => engine.create_store(toWasmU64(txId), store));\n });\n }\n private clearRawStoreIfExists(txId: number, store: string): void {\n this.ignoreNamedError('StoreNotFoundError', () => {\n this.withEngine((engine) => engine.clear_store(toWasmU64(txId), store));\n });\n }\n private dropRawStoreIfExists(txId: number, store: string): void {\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 return rows.map((row) => ({\n key: normalizeWasmBytes(row.key),\n value: normalizeWasmBytes(row.value)\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 this.putRawValue(txId, def.internalStore, physicalKey, value);\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 rows = this.readRawScan(txId, def.internalStore, indexKeyExactRange(logicalKey));\n for (const row of rows) {\n const decoded = decodeIndexEntryKey(row.key);\n if (bytesEqual(decoded.primaryKey, primaryKey)) {\n continue;\n }\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 }\n /**\n * Reads up to `limit` live rows of an index range, starting after\n * `cursor` (a physical index key from a previous page). Raw index entries\n * are fetched in bounded chunks, so stale entries skipped along the way\n * never force the whole range into memory.\n */\n private async loadVisibleIndexPage(\n txId: number,\n def: NormalizedIndexDef,\n range: Range,\n cursor: Uint8Array | null,\n limit: number\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 for (;;) {\n const chunkRange: Range = { ...physical, limit: INDEX_SCAN_RAW_CHUNK_ROWS };\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.readRawScan(txId, def.internalStore, chunkRange);\n } catch (error) {\n if (isNamedError(error, 'StoreNotFoundError')) {\n return { rows: [], cursor: null };\n }\n throw error;\n }\n for (const row of rawRows) {\n resumeAfter = row.key;\n const resolved = await this.resolveVisibleIndexedRow(txId, def, row.key);\n if (!resolved) {\n continue;\n }\n visible.push(resolved);\n if (visible.length >= limit) {\n return { rows: visible, cursor: row.key.slice() };\n }\n }\n if (rawRows.length < INDEX_SCAN_RAW_CHUNK_ROWS) {\n return { rows: visible, cursor: null };\n }\n }\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 value = await this.readStoreValue(txId, def.store, decoded.primaryKey);\n if (value === null) {\n this.cleanupStaleIndexRow(txId, def, physicalKey);\n return null;\n }\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 return {\n key: decoded.primaryKey.slice(),\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 = (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.txChanges.clear();\n this.txModes.clear();\n this.txIndexSchemas.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}\nasync function assertCapabilities(): Promise<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 const root = await navigator.storage.getDirectory();\n const dir = await root.getDirectoryHandle('__moyodb_capability__', { create: true });\n const file = await dir.getFileHandle('probe.bin', { create: true });\n if (typeof file.createSyncAccessHandle !== 'function') {\n throw remoteError('UnsupportedPlatformError', 'createSyncAccessHandle is unavailable');\n }\n const handle = await file.createSyncAccessHandle();\n handle.close();\n try {\n await dir.removeEntry('probe.bin');\n } catch {}\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 name, `null` without a control file, `undefined` when it cannot be read. */\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 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}\nexposeWorkerApi(new DbWorker());\n"],"mappings":"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"}
|