{"version":3,"file":"commit.d.ts","sourceRoot":"","sources":["../../../src/harness/session/commit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEzG,MAAM,MAAM,mBAAmB,GAAG,KAAK,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAC5D,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAC/D,MAAM,WAAW,sBAAsB;IACtC,IAAI,EAAE,OAAO,CAAC;IACd,EAAE,EAAE,KAAK,CAAC;IACV,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;CACf;AACD,MAAM,WAAW,yBAAyB;IACzC,IAAI,EAAE,OAAO,CAAC;IACd,EAAE,EAAE,QAAQ,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACZ;AACD,MAAM,WAAW,wBAAwB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,QAAQ,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;CACf;AACD,MAAM,WAAW,wBAAwB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,QAAQ,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACZ;AACD,MAAM,MAAM,cAAc,GACvB,mBAAmB,GACnB,mBAAmB,GACnB,sBAAsB,GACtB,yBAAyB,GACzB,wBAAwB,GACxB,wBAAwB,CAAC;AAE5B,MAAM,WAAW,cAAc;IAC9B,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,qBAAqB;IACrC,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IACvC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;CAChC;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,UAAU,CAEvD;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,UAAU,CAElE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,cAAc,CAexF;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,KAAK,CAEhG;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,cAAc,CAMzG;AAED,wBAAgB,uBAAuB,CACtC,MAAM,EAAE,SAAS,cAAc,EAAE,EACjC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,qBAAqB,GAC1B,IAAI,CAsBN","sourcesContent":["import type { CommitResult, Entry, EntryWrite, NewEntry, UsageRow, UsageWrite, Write } from \"./types.ts\";\n\nexport type CommittedEntryWrite = Entry & { kind: \"entry\" };\nexport type CommittedUsageWrite = UsageRow & { kind: \"usage\" };\nexport interface CommittedValueSetWrite {\n\tkind: \"value\";\n\top: \"set\";\n\tseq: number;\n\tnamespace: string;\n\tkey: string;\n\tvalue: unknown;\n}\nexport interface CommittedValueDeleteWrite {\n\tkind: \"value\";\n\top: \"delete\";\n\tseq: number;\n\tnamespace: string;\n\tkey: string;\n}\nexport interface CommittedListAppendWrite {\n\tkind: \"list\";\n\top: \"append\";\n\tseq: number;\n\tnamespace: string;\n\tkey: string;\n\tvalue: unknown;\n}\nexport interface CommittedListDeleteWrite {\n\tkind: \"list\";\n\top: \"delete\";\n\tseq: number;\n\tnamespace: string;\n\tkey: string;\n}\nexport type CommittedWrite =\n\t| CommittedEntryWrite\n\t| CommittedUsageWrite\n\t| CommittedValueSetWrite\n\t| CommittedValueDeleteWrite\n\t| CommittedListAppendWrite\n\t| CommittedListDeleteWrite;\n\nexport interface PreparedCommit {\n\twrites: CommittedWrite[];\n\tresult: Omit<CommitResult, \"stats\">;\n}\n\nexport interface CommitValidationState {\n\thasEntryOrUsageId(id: string): boolean;\n\thasEntryId(id: string): boolean;\n}\n\nexport function insertEntry(entry: NewEntry): EntryWrite {\n\treturn { kind: \"entry\", entry };\n}\n\nexport function insertUsage(row: Omit<UsageRow, \"seq\">): UsageWrite {\n\treturn { kind: \"usage\", row };\n}\n\nexport function commitWrite(write: Write, seq: number, timestamp: number): CommittedWrite {\n\tswitch (write.kind) {\n\t\tcase \"entry\":\n\t\t\treturn { kind: \"entry\", ...write.entry, seq, timestamp };\n\t\tcase \"usage\":\n\t\t\treturn { kind: \"usage\", ...write.row, seq };\n\t\tcase \"value\":\n\t\t\treturn write.op === \"set\"\n\t\t\t\t? { kind: \"value\", op: \"set\", seq, namespace: write.namespace, key: write.key, value: write.value }\n\t\t\t\t: { kind: \"value\", op: \"delete\", seq, namespace: write.namespace, key: write.key };\n\t\tcase \"list\":\n\t\t\treturn write.op === \"append\"\n\t\t\t\t? { kind: \"list\", op: \"append\", seq, namespace: write.namespace, key: write.key, value: write.value }\n\t\t\t\t: { kind: \"list\", op: \"delete\", seq, namespace: write.namespace, key: write.key };\n\t}\n}\n\nexport function materializeCommittedEntry(entry: NewEntry, seq: number, timestamp: number): Entry {\n\treturn { ...entry, seq, timestamp };\n}\n\nexport function prepareStorageCommit(writes: Write[], firstSeq: number, timestamp: number): PreparedCommit {\n\tconst committedWrites = writes.map((write, index) => commitWrite(write, firstSeq + index, timestamp));\n\treturn {\n\t\twrites: committedWrites,\n\t\tresult: { firstSeq, seqs: committedWrites.map((write) => write.seq), timestamp },\n\t};\n}\n\nexport function validateCommittedWrites(\n\twrites: readonly CommittedWrite[],\n\tfirstSeq: number,\n\tstate: CommitValidationState,\n): void {\n\tlet previousSeq = firstSeq - 1;\n\tconst transactionIds = new Set<string>();\n\tconst transactionEntryIds = new Set<string>();\n\tfor (const write of writes) {\n\t\tif (write.seq <= previousSeq) throw new Error(`Non-monotonic storage sequence: ${write.seq}`);\n\t\tpreviousSeq = write.seq;\n\t\tif (write.kind !== \"entry\" && write.kind !== \"usage\") continue;\n\t\tif (state.hasEntryOrUsageId(write.id) || transactionIds.has(write.id)) {\n\t\t\tthrow new Error(`Duplicate entry or usage id: ${write.id}`);\n\t\t}\n\t\tif (\n\t\t\twrite.kind === \"entry\" &&\n\t\t\twrite.parentId !== null &&\n\t\t\t!state.hasEntryId(write.parentId) &&\n\t\t\t!transactionEntryIds.has(write.parentId)\n\t\t) {\n\t\t\tthrow new Error(`Missing parent entry: ${write.parentId}`);\n\t\t}\n\t\ttransactionIds.add(write.id);\n\t\tif (write.kind === \"entry\") transactionEntryIds.add(write.id);\n\t}\n}\n"]}