diff --git a/dist/storage/capture/capture-store.d.ts.map b/dist/storage/capture/capture-store.d.ts.map index ff1c639b..c93a2719 100644 --- a/dist/storage/capture/capture-store.d.ts.map +++ b/dist/storage/capture/capture-store.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"capture-store.d.ts","sourceRoot":"","sources":["../../../src/storage/capture/capture-store.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAGV,YAAY,EAMb,MAAM,aAAa,CAAC;AAqBrB,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAoK7D"} \ No newline at end of file +{"version":3,"file":"capture-store.d.ts","sourceRoot":"","sources":["../../../src/storage/capture/capture-store.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAGV,YAAY,EAOb,MAAM,aAAa,CAAC;AAuBrB,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAuN7D"} \ No newline at end of file diff --git a/dist/storage/capture/capture-store.js b/dist/storage/capture/capture-store.js index 04bf25c8..95737fc6 100644 --- a/dist/storage/capture/capture-store.js +++ b/dist/storage/capture/capture-store.js @@ -1,9 +1,9 @@ import { join, resolve } from "node:path"; import { withFileLock } from "../index.js"; -import { CAPTURE_COMPACTED_RECORD_VERSION, CAPTURE_DIRECTORY, CAPTURE_HASH, CAPTURE_RECORD_LOCK_DIRECTORY, CAPTURE_RECORD_VERSION, CAPTURE_RECEIPT_VERSION, } from "./constants.js"; +import { CAPTURE_COMPACTED_RECORD_VERSION, CAPTURE_DIRECTORY, CAPTURE_HASH, CAPTURE_RECORD_LOCK_DIRECTORY, CAPTURE_RECORD_VERSION, CAPTURE_RECONSTRUCTION_JOB_KIND, CAPTURE_RECEIPT_VERSION, } from "./constants.js"; import { eventPath, identifierHash, receiptPath, validateIdentifier, validateIntegration, } from "./paths.js"; import { ensurePrivateDirectory, publishExclusive, readPrivateFile, replacePrivateFile, } from "./utils/atomic-file.js"; -import { captureContentDigest, compactCaptureRecord, validateCompactionMarker, } from "./compaction.js"; +import { captureContentDigest, compactCaptureRecord, compactReconstructionJobRecord, validateCompactionMarker, validateSourceSnapshotCleanup, } from "./compaction.js"; import { canonicalJson, canonicalValue } from "./utils/serialization.js"; export function createCaptureStore(root) { const storageRoot = resolve(root); @@ -97,6 +97,51 @@ export function createCaptureStore(root) { return failure("STORAGE_FAILED", error); } }, + async compactReconstructionJob(scope, expected, destination) { + try { + validateScope(scope); + validateIdentifier(destination, "destination"); + if (!sameScope(expected, scope) || expected.eventKind !== CAPTURE_RECONSTRUCTION_JOB_KIND) + throw new TypeError("Capture is not the expected reconstruction job"); + if (destination !== expected.destinationFingerprint) + throw new TypeError("Reconstruction job destination does not match"); + const expectedOriginalContentDigest = captureContentDigest(expected); + if (!CAPTURE_HASH.test(expectedOriginalContentDigest)) + throw new TypeError("Invalid original reconstruction job digest"); + return await withRecordLock(storageRoot, scope, async () => { + const path = eventPath(storageRoot, scope); + const previous = await readRecord(storageRoot, path); + if (previous === undefined) + return { status: "missing-capture" }; + if (!sameScope(previous, scope)) + throw new Error("Capture namespace does not match"); + if (captureContentDigest(previous) !== expectedOriginalContentDigest) + return { status: "changed" }; + const payload = previous.normalizedPayload; + const hasSourceSnapshots = payload !== null && + typeof payload === "object" && + !Array.isArray(payload) && + Object.hasOwn(payload, "sourceSnapshots"); + if (!hasSourceSnapshots && previous.sourceSnapshotCleanup === undefined) + return { status: "unchanged" }; + const receipt = await readReceipt(storageRoot, receiptPath(storageRoot, scope, destination)); + if (receipt?.outcome !== "delivered" || + receipt.destination !== destination || + !sameScope(receipt, scope)) + return { status: "not-delivered" }; + if (previous.sourceSnapshotCleanup !== undefined) + return { status: "already-compacted", record: previous }; + const compacted = compactReconstructionJobRecord(previous, expectedOriginalContentDigest); + if (compacted === undefined) + return { status: "changed" }; + await replacePrivateFile(storageRoot, path, canonicalJson(compacted)); + return { status: "compacted", record: compacted }; + }); + } + catch (error) { + return failure("STORAGE_FAILED", error); + } + }, async recordOutcome(input) { try { validateScope(input); @@ -246,10 +291,16 @@ async function readRecord(root, path) { : undefined; if (value.version === CAPTURE_RECORD_VERSION && "compaction" in value) throw new Error("Invalid compacted capture marker"); + if (value.version === CAPTURE_COMPACTED_RECORD_VERSION && "sourceSnapshotCleanup" in value) + throw new Error("Invalid reconstruction source snapshot cleanup marker"); + const sourceSnapshotCleanup = "sourceSnapshotCleanup" in value + ? validateSourceSnapshotCleanup(value.sourceSnapshotCleanup, value.eventKind, normalizedPayload) + : undefined; return { ...value, normalizedPayload, ...(compaction === undefined ? {} : { compaction }), + ...(sourceSnapshotCleanup === undefined ? {} : { sourceSnapshotCleanup }), }; } async function readReceipt(root, path) { diff --git a/dist/storage/capture/capture-store.js.map b/dist/storage/capture/capture-store.js.map index 8c51a166..149f3234 100644 --- a/dist/storage/capture/capture-store.js.map +++ b/dist/storage/capture/capture-store.js.map @@ -1 +1 @@ -{"version":3,"file":"capture-store.js","sourceRoot":"","sources":["../../../src/storage/capture/capture-store.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"capture-store.js","sourceRoot":"","sources":["../../../src/storage/capture/capture-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EACL,gCAAgC,EAChC,iBAAiB,EACjB,YAAY,EACZ,6BAA6B,EAC7B,sBAAsB,EACtB,+BAA+B,EAC/B,uBAAuB,GACxB,MAAM,gBAAgB,CAAC;AAYxB,OAAO,EACL,SAAS,EACT,cAAc,EACd,WAAW,EACX,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,eAAe,EACf,kBAAkB,GACnB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,8BAA8B,EAC9B,wBAAwB,EACxB,6BAA6B,GAC9B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAEzE,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO;QACL,KAAK,CAAC,OAAO,CAAC,KAAK;YACjB,IAAI,MAAqB,CAAC;YAC1B,IAAI,QAAgB,CAAC;YACrB,IAAI,CAAC;gBACH,aAAa,CAAC,KAAK,CAAC,CAAC;gBACrB,kBAAkB,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;gBAC1C,kBAAkB,CAAC,KAAK,CAAC,sBAAsB,EAAE,yBAAyB,CAAC,CAAC;gBAC5E,kBAAkB,CAAC,KAAK,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;gBAClD,MAAM,GAAG;oBACP,OAAO,EAAE,sBAAsB;oBAC/B,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;oBACxB,WAAW,EAAE,KAAK,CAAC,WAAW;oBAC9B,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,sBAAsB,EAAE,KAAK,CAAC,sBAAsB;oBACpD,SAAS,EAAE,KAAK,CAAC,SAAS;oBAC1B,iBAAiB,EAAE,cAAc,CAAC,KAAK,CAAC,iBAAiB,EAAE,IAAI,GAAG,EAAU,CAAC;oBAC7E,YAAY,EAAE,cAAc,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,GAAG,EAAU,CAAC;oBACnE,kBAAkB,EAAE,cAAc,CAAC,KAAK,CAAC,kBAAkB,EAAE,IAAI,GAAG,EAAU,CAAC;iBAChF,CAAC;gBACF,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;YACnC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,OAAO,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;YAChD,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;gBAC3C,OAAO,MAAM,cAAc,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE;oBACzD,MAAM,iBAAiB,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;oBACpF,IAAI,MAAM,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC;wBAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;oBACnF,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;oBACrD,IAAI,QAAQ,KAAK,SAAS;wBACxB,OAAO;4BACL,MAAM,EAAE,QAAQ;4BAChB,IAAI,EAAE,gBAAgB;4BACtB,OAAO,EAAE,6BAA6B;yBACvC,CAAC;oBACJ,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC;wBAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;oBAC/D,OAAO,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC;wBAClC,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE;wBAC3C,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;gBAC7B,CAAC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,KAAK;YACd,aAAa,CAAC,KAAK,CAAC,CAAC;YACrB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,WAAW,EAAE,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;YAC5E,IAAI,MAAM,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAC;YAC3C,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;YACnF,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,QAAQ;YAC3B,IAAI,CAAC;gBACH,aAAa,CAAC,KAAK,CAAC,CAAC;gBACrB,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC;oBAAE,MAAM,IAAI,SAAS,CAAC,kCAAkC,CAAC,CAAC;gBACzF,MAAM,6BAA6B,GACjC,QAAQ,CAAC,UAAU,EAAE,qBAAqB,IAAI,oBAAoB,CAAC,QAAQ,CAAC,CAAC;gBAC/E,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,6BAA6B,CAAC;oBACnD,MAAM,IAAI,SAAS,CAAC,iCAAiC,CAAC,CAAC;gBACzD,OAAO,MAAM,cAAc,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE;oBACzD,MAAM,IAAI,GAAG,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;oBAC3C,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;oBACrD,IAAI,QAAQ,KAAK,SAAS;wBAAE,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;oBACjE,MAAM,qBAAqB,GACzB,QAAQ,CAAC,UAAU,EAAE,qBAAqB,IAAI,oBAAoB,CAAC,QAAQ,CAAC,CAAC;oBAC/E,IAAI,qBAAqB,KAAK,6BAA6B;wBAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;oBAC1F,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS;wBACnC,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;oBAC3D,MAAM,MAAM,GAAG,oBAAoB,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;oBACrE,IAAI,MAAM,KAAK,SAAS;wBAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;oBACvD,MAAM,kBAAkB,CAAC,WAAW,EAAE,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;oBACnE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC;gBACzC,CAAC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QACD,KAAK,CAAC,wBAAwB,CAC5B,KAAK,EACL,QAAQ,EACR,WAAW;YAEX,IAAI,CAAC;gBACH,aAAa,CAAC,KAAK,CAAC,CAAC;gBACrB,kBAAkB,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;gBAC/C,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,QAAQ,CAAC,SAAS,KAAK,+BAA+B;oBACvF,MAAM,IAAI,SAAS,CAAC,gDAAgD,CAAC,CAAC;gBACxE,IAAI,WAAW,KAAK,QAAQ,CAAC,sBAAsB;oBACjD,MAAM,IAAI,SAAS,CAAC,+CAA+C,CAAC,CAAC;gBACvE,MAAM,6BAA6B,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;gBACrE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,6BAA6B,CAAC;oBACnD,MAAM,IAAI,SAAS,CAAC,4CAA4C,CAAC,CAAC;gBACpE,OAAO,MAAM,cAAc,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE;oBACzD,MAAM,IAAI,GAAG,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;oBAC3C,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;oBACrD,IAAI,QAAQ,KAAK,SAAS;wBAAE,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;oBACjE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC;wBAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;oBACrF,IAAI,oBAAoB,CAAC,QAAQ,CAAC,KAAK,6BAA6B;wBAClE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;oBAC/B,MAAM,OAAO,GAAG,QAAQ,CAAC,iBAAiB,CAAC;oBAC3C,MAAM,kBAAkB,GACtB,OAAO,KAAK,IAAI;wBAChB,OAAO,OAAO,KAAK,QAAQ;wBAC3B,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;wBACvB,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;oBAC5C,IAAI,CAAC,kBAAkB,IAAI,QAAQ,CAAC,qBAAqB,KAAK,SAAS;wBACrE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;oBACjC,MAAM,OAAO,GAAG,MAAM,WAAW,CAC/B,WAAW,EACX,WAAW,CAAC,WAAW,EAAE,KAAK,EAAE,WAAW,CAAC,CAC7C,CAAC;oBACF,IACE,OAAO,EAAE,OAAO,KAAK,WAAW;wBAChC,OAAO,CAAC,WAAW,KAAK,WAAW;wBACnC,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC;wBAE1B,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;oBACrC,IAAI,QAAQ,CAAC,qBAAqB,KAAK,SAAS;wBAC9C,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;oBAC3D,MAAM,SAAS,GAAG,8BAA8B,CAAC,QAAQ,EAAE,6BAA6B,CAAC,CAAC;oBAC1F,IAAI,SAAS,KAAK,SAAS;wBAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;oBAC1D,MAAM,kBAAkB,CAAC,WAAW,EAAE,IAAI,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;oBACtE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;gBACpD,CAAC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QACD,KAAK,CAAC,aAAa,CAAC,KAAK;YACvB,IAAI,CAAC;gBACH,aAAa,CAAC,KAAK,CAAC,CAAC;gBACrB,kBAAkB,CAAC,KAAK,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;gBACrD,IAAI,KAAK,CAAC,OAAO,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;oBAC9D,MAAM,IAAI,SAAS,CAAC,iBAAiB,CAAC,CAAC;gBACzC,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;oBAAE,kBAAkB,CAAC,KAAK,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;gBACnF,OAAO,MAAM,cAAc,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE;oBACzD,IAAI,CAAC,MAAM,UAAU,CAAC,WAAW,EAAE,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS;wBAC9E,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;oBACvC,MAAM,IAAI,GAAG,WAAW,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;oBAChE,MAAM,iBAAiB,CACrB,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,MAAM,EACZ,UAAU,EACV,KAAK,CAAC,WAAW,CAClB,CAAC;oBACF,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;oBACjE,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;oBAC3C,IAAI,MAAM,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC;wBACxC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;oBACrD,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;oBACtD,IAAI,QAAQ,KAAK,SAAS;wBACxB,OAAO;4BACL,MAAM,EAAE,QAAQ;4BAChB,IAAI,EAAE,gBAAgB;4BACtB,OAAO,EAAE,+BAA+B;yBACzC,CAAC;oBACJ,OAAO,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC;wBACjC,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE;wBAC5C,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;gBAC7B,CAAC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW;YAClC,IAAI,CAAC;gBACH,aAAa,CAAC,KAAK,CAAC,CAAC;gBACrB,kBAAkB,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;gBAC/C,IAAI,CAAC,MAAM,UAAU,CAAC,WAAW,EAAE,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS;oBAC9E,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;gBACvC,MAAM,OAAO,GAAG,MAAM,WAAW,CAC/B,WAAW,EACX,WAAW,CAAC,WAAW,EAAE,KAAK,EAAE,WAAW,CAAC,CAC7C,CAAC;gBACF,IAAI,OAAO,KAAK,SAAS;oBAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;gBACxD,OAAO,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,WAAW,KAAK,WAAW;oBACrE,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE;oBAChC,CAAC,CAAC;wBACE,MAAM,EAAE,QAAQ;wBAChB,IAAI,EAAE,gBAAgB;wBACtB,OAAO,EAAE,kCAAkC;qBAC5C,CAAC;YACR,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;KACF,CAAC;IAEF,KAAK,UAAU,iBAAiB,CAC9B,WAAmB,EACnB,SAAiB,EACjB,MAAc,EACd,UAAiC,EACjC,WAAoB;QAEpB,MAAM,YAAY,GAAG;YACnB,iBAAiB;YACjB,cAAc;YACd,WAAW;YACX,UAAU;YACV,cAAc,CAAC,SAAS,CAAC;YACzB,OAAO;YACP,cAAc,CAAC,MAAM,CAAC;YACtB,UAAU;SACX,CAAC;QACF,IAAI,WAAW,KAAK,SAAS;YAAE,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC;QAC9E,MAAM,sBAAsB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,IAAY,EACZ,KAAmB,EACnB,SAA2B;IAE3B,aAAa,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO,sBAAsB,CAC3B,IAAI,EACJ,KAAK,CAAC,WAAW,EACjB,cAAc,CAAC,KAAK,CAAC,SAAS,CAAC,EAC/B,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,EAC5B,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,EAC7B,SAAS,CACV,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,sBAAsB,CACnC,IAAY,EACZ,WAAmB,EACnB,WAAmB,EACnB,QAAgB,EAChB,SAAiB,EACjB,SAA2B;IAE3B,IAAI,CAAC,CAAC,WAAW,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChF,MAAM,IAAI,SAAS,CAAC,kCAAkC,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,MAAM,sBAAsB,CAAC,IAAI,EAAE;QACnD,6BAA6B;QAC7B,cAAc;QACd,WAAW;QACX,UAAU;QACV,WAAW;QACX,OAAO;QACP,QAAQ;QACR,QAAQ;KACT,CAAC,CAAC;IACH,OAAO,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,SAAS,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC;AACvE,CAAC;AAED,SAAS,WAAW,CAAC,IAAmB,EAAE,KAAoB;IAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,qBAAqB,IAAI,oBAAoB,CAAC,IAAI,CAAC,CAAC;IACxF,OAAO,UAAU,KAAK,oBAAoB,CAAC,KAAK,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,YAAY,CAAC,KAAmB,EAAE,UAAkB;IAC3D,OAAO;QACL,OAAO,EAAE,uBAAuB;QAChC,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,GAAG,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;QAC/D,UAAU;KACX,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAY,EAAE,IAAY;IAClD,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACnD,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC7C,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpC,IACE,CAAC,KAAK,CAAC,OAAO,KAAK,sBAAsB;QACvC,KAAK,CAAC,OAAO,KAAK,gCAAgC,CAAC;QACrD,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ;QACtC,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,YAAY,CAAC;QACzC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC;QACxD,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ;QACrC,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;QACnC,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;QAChC,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;QACjC,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;QAC/B,OAAO,KAAK,CAAC,sBAAsB,KAAK,QAAQ;QAChD,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;QACnC,CAAC,CAAC,mBAAmB,IAAI,KAAK,CAAC;QAC/B,CAAC,CAAC,cAAc,IAAI,KAAK,CAAC;QAC1B,CAAC,CAAC,oBAAoB,IAAI,KAAK,CAAC,EAChC,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IACD,KAAK,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI;QAC/B,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC;QACvB,CAAC,KAAK,CAAC,sBAAsB,EAAE,yBAAyB,CAAC;QACzD,CAAC,KAAK,CAAC,SAAS,EAAE,YAAY,CAAC;KACvB,EAAE,CAAC;QACX,kBAAkB,CAAC,UAAoB,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC;IACD,MAAM,KAAK,GAAG;QACZ,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC;IACF,aAAa,CAAC,KAAK,CAAC,CAAC;IACrB,MAAM,iBAAiB,GAAG,cAAc,CAAC,KAAK,CAAC,iBAAiB,EAAE,IAAI,GAAG,EAAU,CAAC,CAAC;IACrF,MAAM,UAAU,GACd,KAAK,CAAC,OAAO,KAAK,gCAAgC;QAChD,CAAC,CAAC,wBAAwB,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,SAAS,EAAE,iBAAiB,CAAC;QAChF,CAAC,CAAC,SAAS,CAAC;IAChB,IAAI,KAAK,CAAC,OAAO,KAAK,sBAAsB,IAAI,YAAY,IAAI,KAAK;QACnE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACtD,IAAI,KAAK,CAAC,OAAO,KAAK,gCAAgC,IAAI,uBAAuB,IAAI,KAAK;QACxF,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,MAAM,qBAAqB,GACzB,uBAAuB,IAAI,KAAK;QAC9B,CAAC,CAAC,6BAA6B,CAC3B,KAAK,CAAC,qBAAqB,EAC3B,KAAK,CAAC,SAAS,EACf,iBAAiB,CAClB;QACH,CAAC,CAAC,SAAS,CAAC;IAChB,OAAO;QACL,GAAI,KAAkC;QACtC,iBAAiB;QACjB,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC;QACnD,GAAG,CAAC,qBAAqB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,CAAC;KAC1E,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,IAAY;IACnD,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACnD,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC7C,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpC,IACE,KAAK,CAAC,OAAO,KAAK,uBAAuB;QACzC,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ;QACrC,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ;QACnC,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;QAChC,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;QACjC,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ;QACrC,CAAC,KAAK,CAAC,OAAO,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC;QAC9D,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ;QACpC,CAAC,QAAQ,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,EACvD,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IACD,kBAAkB,CAAC,KAAK,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IACrD,IAAI,QAAQ,IAAI,KAAK;QAAE,kBAAkB,CAAC,KAAK,CAAC,MAAgB,EAAE,gBAAgB,CAAC,CAAC;IACpF,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAC9C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,IAAI,UAAU,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,UAAU;QACzF,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,OAAO,KAAkC,CAAC;AAC5C,CAAC;AAED,SAAS,WAAW,CAAC,QAAgB;IACnC,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,OAAO,KAAgC,CAAC;AAC1C,CAAC;AAED,SAAS,aAAa,CAAC,KAAmB;IACxC,mBAAmB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACvC,kBAAkB,CAAC,KAAK,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAClD,kBAAkB,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC5C,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,SAAS,CAAC,MAAoB,EAAE,KAAmB;IAC1D,OAAO,CACL,MAAM,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW;QACxC,MAAM,CAAC,SAAS,KAAK,KAAK,CAAC,SAAS;QACpC,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;QAC9B,MAAM,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,CACjC,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,OAAuB,EAAE,KAAmB;IAC/D,OAAO,CACL,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC;QACzB,OAAO,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW;QACzC,OAAO,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO;QACjC,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAChC,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,IAAY,EAAE,KAAc;IAC3C,OAAO;QACL,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,IAAI;QAC9B,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;KAChE,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,KAAK,KAAK,IAAI;QACnB,OAAO,KAAK,KAAK,QAAQ;QACzB,MAAM,IAAI,KAAK;QACf,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QAC9B,CAAC,CAAC,KAAK,CAAC,IAAI;QACZ,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC"} \ No newline at end of file diff --git a/dist/storage/capture/compaction.d.ts b/dist/storage/capture/compaction.d.ts index 2d1a72d1..c42d965e 100644 --- a/dist/storage/capture/compaction.d.ts +++ b/dist/storage/capture/compaction.d.ts @@ -1,5 +1,7 @@ -import type { CompactedCapturePayload, CaptureInput, JsonValue, StoredCapture } from "./models.js"; +import type { CompactedCapturePayload, CaptureInput, JsonValue, SourceSnapshotCleanup, StoredCapture } from "./models.js"; export declare function captureContentDigest(record: CaptureInput | StoredCapture): string; export declare function compactCaptureRecord(record: StoredCapture, originalContentDigest: string): StoredCapture | undefined; +export declare function compactReconstructionJobRecord(record: StoredCapture, originalContentDigest: string): StoredCapture | undefined; +export declare function validateSourceSnapshotCleanup(value: unknown, eventKind: string, normalizedPayload: JsonValue): SourceSnapshotCleanup; export declare function validateCompactionMarker(value: unknown, eventKind: string, normalizedPayload: JsonValue): CompactedCapturePayload; //# sourceMappingURL=compaction.d.ts.map \ No newline at end of file diff --git a/dist/storage/capture/compaction.d.ts.map b/dist/storage/capture/compaction.d.ts.map index 6e306fb6..9a4467cd 100644 --- a/dist/storage/capture/compaction.d.ts.map +++ b/dist/storage/capture/compaction.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"compaction.d.ts","sourceRoot":"","sources":["../../../src/storage/capture/compaction.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,uBAAuB,EAGvB,YAAY,EACZ,SAAS,EACT,aAAa,EACd,MAAM,aAAa,CAAC;AAGrB,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,aAAa,GAAG,MAAM,CAQjF;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,aAAa,EACrB,qBAAqB,EAAE,MAAM,GAC5B,aAAa,GAAG,SAAS,CAa3B;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,SAAS,GAC3B,uBAAuB,CAyDzB"} \ No newline at end of file +{"version":3,"file":"compaction.d.ts","sourceRoot":"","sources":["../../../src/storage/capture/compaction.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,uBAAuB,EAGvB,YAAY,EACZ,SAAS,EACT,qBAAqB,EACrB,aAAa,EACd,MAAM,aAAa,CAAC;AAGrB,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,YAAY,GAAG,aAAa,GAAG,MAAM,CAWjF;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,aAAa,EACrB,qBAAqB,EAAE,MAAM,GAC5B,aAAa,GAAG,SAAS,CAa3B;AAED,wBAAgB,8BAA8B,CAC5C,MAAM,EAAE,aAAa,EACrB,qBAAqB,EAAE,MAAM,GAC5B,aAAa,GAAG,SAAS,CAa3B;AAED,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,SAAS,GAC3B,qBAAqB,CAiBvB;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,SAAS,GAC3B,uBAAuB,CAyDzB"} \ No newline at end of file diff --git a/dist/storage/capture/compaction.js b/dist/storage/capture/compaction.js index bbdfccf0..def6ca39 100644 --- a/dist/storage/capture/compaction.js +++ b/dist/storage/capture/compaction.js @@ -1,13 +1,16 @@ import { createHash } from "node:crypto"; -import { CAPTURE_COMPACTED_RECORD_VERSION, CAPTURE_HASH } from "./constants.js"; +import { CAPTURE_COMPACTED_RECORD_VERSION, CAPTURE_HASH, CAPTURE_RECONSTRUCTION_JOB_KIND, CAPTURE_SOURCE_SNAPSHOT_CLEANUP_VERSION, } from "./constants.js"; import { canonicalJson, canonicalValue } from "./utils/serialization.js"; export function captureContentDigest(record) { if ("compaction" in record && record.compaction !== undefined) return record.compaction.originalContentDigest; + if ("sourceSnapshotCleanup" in record && record.sourceSnapshotCleanup !== undefined) + return record.sourceSnapshotCleanup.originalContentDigest; const content = { ...record }; delete content.version; delete content.capturedAtMs; delete content.compaction; + delete content.sourceSnapshotCleanup; return createHash("sha256").update(canonicalJson(content)).digest("hex"); } export function compactCaptureRecord(record, originalContentDigest) { @@ -25,6 +28,38 @@ export function compactCaptureRecord(record, originalContentDigest) { }, }; } +export function compactReconstructionJobRecord(record, originalContentDigest) { + if (record.eventKind !== CAPTURE_RECONSTRUCTION_JOB_KIND) + return undefined; + const payload = canonicalValue(record.normalizedPayload, new Set()); + if (!isJsonObject(payload) || !Object.hasOwn(payload, "sourceSnapshots")) + return undefined; + delete payload.sourceSnapshots; + return { + ...record, + normalizedPayload: payload, + sourceSnapshotCleanup: { + version: CAPTURE_SOURCE_SNAPSHOT_CLEANUP_VERSION, + originalContentDigest, + }, + }; +} +export function validateSourceSnapshotCleanup(value, eventKind, normalizedPayload) { + if (eventKind !== CAPTURE_RECONSTRUCTION_JOB_KIND || + !isObjectRecord(value) || + !hasExactKeys(value, ["version", "originalContentDigest"]) || + value.version !== CAPTURE_SOURCE_SNAPSHOT_CLEANUP_VERSION || + typeof value.originalContentDigest !== "string" || + !CAPTURE_HASH.test(value.originalContentDigest) || + !isJsonObject(normalizedPayload) || + Object.hasOwn(normalizedPayload, "sourceSnapshots")) { + throw new Error("Invalid reconstruction source snapshot cleanup marker"); + } + return { + version: CAPTURE_SOURCE_SNAPSHOT_CLEANUP_VERSION, + originalContentDigest: value.originalContentDigest, + }; +} export function validateCompactionMarker(value, eventKind, normalizedPayload) { if (!isObjectRecord(value) || !hasExactKeys(value, ["version", "originalContentDigest", "fields"])) { diff --git a/dist/storage/capture/compaction.js.map b/dist/storage/capture/compaction.js.map index 927d0f8c..19659355 100644 --- a/dist/storage/capture/compaction.js.map +++ b/dist/storage/capture/compaction.js.map @@ -1 +1 @@ -{"version":3,"file":"compaction.js","sourceRoot":"","sources":["../../../src/storage/capture/compaction.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"compaction.js","sourceRoot":"","sources":["../../../src/storage/capture/compaction.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/storage/capture/constants.d.ts b/dist/storage/capture/constants.d.ts index 2ee6caac..719b6930 100644 --- a/dist/storage/capture/constants.d.ts +++ b/dist/storage/capture/constants.d.ts @@ -1,6 +1,8 @@ export declare const CAPTURE_DIRECTORY = "capture-v1"; export declare const CAPTURE_RECORD_VERSION = 2; export declare const CAPTURE_COMPACTED_RECORD_VERSION = 3; +export declare const CAPTURE_RECONSTRUCTION_JOB_KIND = "reconstruction-job-v1"; +export declare const CAPTURE_SOURCE_SNAPSHOT_CLEANUP_VERSION = 1; export declare const CAPTURE_RECEIPT_VERSION = 1; export declare const CAPTURE_RECORD_LOCK_DIRECTORY = "record-lock-v1"; export declare const CAPTURE_DIRECTORY_MODE = 448; diff --git a/dist/storage/capture/constants.d.ts.map b/dist/storage/capture/constants.d.ts.map index 6e2461b7..fef58da7 100644 --- a/dist/storage/capture/constants.d.ts.map +++ b/dist/storage/capture/constants.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/storage/capture/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAC9C,eAAO,MAAM,sBAAsB,IAAI,CAAC;AACxC,eAAO,MAAM,gCAAgC,IAAI,CAAC;AAClD,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,eAAO,MAAM,6BAA6B,mBAAmB,CAAC;AAC9D,eAAO,MAAM,sBAAsB,MAAQ,CAAC;AAC5C,eAAO,MAAM,iBAAiB,MAAQ,CAAC;AACvC,eAAO,MAAM,mBAAmB,QAA2B,CAAC;AAC5D,eAAO,MAAM,4BAA4B,OAAO,CAAC;AACjD,eAAO,MAAM,YAAY,QAAoB,CAAC;AAC9C,eAAO,MAAM,oBAAoB,QAAoB,CAAC"} \ No newline at end of file +{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/storage/capture/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAC9C,eAAO,MAAM,sBAAsB,IAAI,CAAC;AACxC,eAAO,MAAM,gCAAgC,IAAI,CAAC;AAClD,eAAO,MAAM,+BAA+B,0BAA0B,CAAC;AACvE,eAAO,MAAM,uCAAuC,IAAI,CAAC;AACzD,eAAO,MAAM,uBAAuB,IAAI,CAAC;AACzC,eAAO,MAAM,6BAA6B,mBAAmB,CAAC;AAC9D,eAAO,MAAM,sBAAsB,MAAQ,CAAC;AAC5C,eAAO,MAAM,iBAAiB,MAAQ,CAAC;AACvC,eAAO,MAAM,mBAAmB,QAA2B,CAAC;AAC5D,eAAO,MAAM,4BAA4B,OAAO,CAAC;AACjD,eAAO,MAAM,YAAY,QAAoB,CAAC;AAC9C,eAAO,MAAM,oBAAoB,QAAoB,CAAC"} \ No newline at end of file diff --git a/dist/storage/capture/constants.js b/dist/storage/capture/constants.js index e1eb85ea..813a1d5d 100644 --- a/dist/storage/capture/constants.js +++ b/dist/storage/capture/constants.js @@ -1,6 +1,8 @@ export const CAPTURE_DIRECTORY = "capture-v1"; export const CAPTURE_RECORD_VERSION = 2; export const CAPTURE_COMPACTED_RECORD_VERSION = 3; +export const CAPTURE_RECONSTRUCTION_JOB_KIND = "reconstruction-job-v1"; +export const CAPTURE_SOURCE_SNAPSHOT_CLEANUP_VERSION = 1; export const CAPTURE_RECEIPT_VERSION = 1; export const CAPTURE_RECORD_LOCK_DIRECTORY = "record-lock-v1"; export const CAPTURE_DIRECTORY_MODE = 0o700; diff --git a/dist/storage/capture/constants.js.map b/dist/storage/capture/constants.js.map index 6d7743ec..be4029d7 100644 --- a/dist/storage/capture/constants.js.map +++ b/dist/storage/capture/constants.js.map @@ -1 +1 @@ -{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/storage/capture/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAC9C,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AACxC,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,CAAC;AAClD,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AACzC,MAAM,CAAC,MAAM,6BAA6B,GAAG,gBAAgB,CAAC;AAC9D,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,CAAC;AAC5C,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC;AACvC,MAAM,CAAC,MAAM,mBAAmB,GAAG,wBAAwB,CAAC;AAC5D,MAAM,CAAC,MAAM,4BAA4B,GAAG,IAAI,CAAC;AACjD,MAAM,CAAC,MAAM,YAAY,GAAG,iBAAiB,CAAC;AAC9C,MAAM,CAAC,MAAM,oBAAoB,GAAG,iBAAiB,CAAC"} \ No newline at end of file +{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/storage/capture/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC;AAC9C,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AACxC,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,CAAC;AAClD,MAAM,CAAC,MAAM,+BAA+B,GAAG,uBAAuB,CAAC;AACvE,MAAM,CAAC,MAAM,uCAAuC,GAAG,CAAC,CAAC;AACzD,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AACzC,MAAM,CAAC,MAAM,6BAA6B,GAAG,gBAAgB,CAAC;AAC9D,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,CAAC;AAC5C,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC;AACvC,MAAM,CAAC,MAAM,mBAAmB,GAAG,wBAAwB,CAAC;AAC5D,MAAM,CAAC,MAAM,4BAA4B,GAAG,IAAI,CAAC;AACjD,MAAM,CAAC,MAAM,YAAY,GAAG,iBAAiB,CAAC;AAC9C,MAAM,CAAC,MAAM,oBAAoB,GAAG,iBAAiB,CAAC"} \ No newline at end of file diff --git a/dist/storage/capture/index.d.ts b/dist/storage/capture/index.d.ts index 4daabe98..4190e3fc 100644 --- a/dist/storage/capture/index.d.ts +++ b/dist/storage/capture/index.d.ts @@ -1,3 +1,3 @@ export { createCaptureStore } from "./capture-store.js"; -export type { CaptureCompactionResult, CaptureInput, CaptureScope, CaptureStore, CaptureWriteResult, JsonValue, OutcomeInput, OutcomeReadResult, OutcomeReceipt, OutcomeWriteResult, StorageFailure, StoredCapture, } from "./models.js"; +export type { CaptureCompactionResult, CaptureInput, ReconstructionJobCleanupResult, CaptureScope, CaptureStore, CaptureWriteResult, JsonValue, OutcomeInput, OutcomeReadResult, OutcomeReceipt, OutcomeWriteResult, StorageFailure, SourceSnapshotCleanup, StoredCapture, } from "./models.js"; //# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/dist/storage/capture/index.d.ts.map b/dist/storage/capture/index.d.ts.map index d50c51c1..18a3f567 100644 --- a/dist/storage/capture/index.d.ts.map +++ b/dist/storage/capture/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/storage/capture/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,YAAY,EACV,uBAAuB,EACvB,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,SAAS,EACT,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,aAAa,GACd,MAAM,aAAa,CAAC"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/storage/capture/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,YAAY,EACV,uBAAuB,EACvB,YAAY,EACZ,8BAA8B,EAC9B,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,SAAS,EACT,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,qBAAqB,EACrB,aAAa,GACd,MAAM,aAAa,CAAC"} \ No newline at end of file diff --git a/dist/storage/capture/models.d.ts b/dist/storage/capture/models.d.ts index 691a99f5..a1ba85e2 100644 --- a/dist/storage/capture/models.d.ts +++ b/dist/storage/capture/models.d.ts @@ -17,6 +17,11 @@ export interface StoredCapture extends CaptureInput { version: number; capturedAtMs: number; compaction?: CompactedCapturePayload; + sourceSnapshotCleanup?: SourceSnapshotCleanup; +} +export interface SourceSnapshotCleanup { + version: 1; + originalContentDigest: string; } export type CompactedFieldDigest = { state: "preserve"; @@ -73,6 +78,21 @@ export type CaptureCompactionResult = { } | { status: "missing-capture"; } | StorageFailure; +export type ReconstructionJobCleanupResult = { + status: "compacted"; + record: StoredCapture; +} | { + status: "already-compacted"; + record: StoredCapture; +} | { + status: "unchanged"; +} | { + status: "not-delivered"; +} | { + status: "changed"; +} | { + status: "missing-capture"; +} | StorageFailure; export interface OutcomeInput extends CaptureScope { destination: string; outcome: "delivered" | "dropped"; @@ -107,6 +127,7 @@ export type OutcomeReadResult = { export interface CaptureStore { capture(input: CaptureInput): Promise; compact(scope: CaptureScope, expected: StoredCapture): Promise; + compactReconstructionJob(scope: CaptureScope, expected: StoredCapture, destination: string): Promise; read(scope: CaptureScope): Promise; recordOutcome(input: OutcomeInput): Promise; readOutcome(scope: CaptureScope, destination: string): Promise; diff --git a/dist/storage/capture/models.d.ts.map b/dist/storage/capture/models.d.ts.map index 254258db..a5d773e4 100644 --- a/dist/storage/capture/models.d.ts.map +++ b/dist/storage/capture/models.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../../src/storage/capture/models.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../../src/storage/capture/models.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/storage/capture/capture-store.test.ts b/src/storage/capture/capture-store.test.ts index ca3f344a..af2e4c24 100644 --- a/src/storage/capture/capture-store.test.ts +++ b/src/storage/capture/capture-store.test.ts @@ -1,5 +1,12 @@ import { execFile } from "node:child_process"; -import { lstatSync, mkdtempSync, readFileSync, symlinkSync, writeFileSync } from "node:fs"; +import { + lstatSync, + mkdtempSync, + readFileSync, + symlinkSync, + unlinkSync, + writeFileSync, +} from "node:fs"; import { mkdir } from "node:fs/promises"; import { tmpdir } from "node:os"; import { dirname, join } from "node:path"; @@ -7,6 +14,7 @@ import { fileURLToPath, pathToFileURL } from "node:url"; import { promisify } from "node:util"; import { describe, expect, it, vi } from "vitest"; import { createCaptureStore } from "./capture-store.js"; +import { CAPTURE_RECONSTRUCTION_JOB_KIND } from "./constants.js"; import type { CaptureInput } from "./models.js"; import { eventPath, identifierHash, receiptPath } from "./paths.js"; import { ensurePrivateDirectory } from "./utils/atomic-file.js"; @@ -182,6 +190,182 @@ describe("immutable capture storage", () => { ).resolves.toEqual({ status: "conflict" }); }); + it("cleans reconstruction snapshots after delivery and preserves capture identity", async () => { + const root = temporaryRoot(); + const store = createCaptureStore(root); + const input: CaptureInput = { + ...captureInput("reconstruction-cleanup"), + runId: "reconstruction:job-1", + eventKind: CAPTURE_RECONSTRUCTION_JOB_KIND, + normalizedPayload: { + jobId: "job-1", + sourceSnapshots: [{ sourceRef: "source-1", submission: { run: { id: "run-1" } } }], + }, + }; + await store.capture(input); + const original = (await store.read(input))!; + const destination = input.destinationFingerprint; + + await expect(store.compactReconstructionJob(input, original, destination)).resolves.toEqual({ + status: "not-delivered", + }); + await store.recordOutcome({ ...input, destination, outcome: "delivered" }); + await expect( + store.compactReconstructionJob(input, original, destination), + ).resolves.toMatchObject({ + status: "compacted", + record: { + version: 2, + normalizedPayload: { jobId: "job-1" }, + sourceSnapshotCleanup: { + version: 1, + originalContentDigest: expect.stringMatching(/^[0-9a-f]{64}$/u), + }, + }, + }); + await expect(store.capture(input)).resolves.toMatchObject({ + status: "duplicate", + record: { sourceSnapshotCleanup: { version: 1 } }, + }); + await expect( + store.capture({ ...input, normalizedPayload: { jobId: "job-1", sourceSnapshots: [] } }), + ).resolves.toEqual({ status: "conflict" }); + await expect( + store.compactReconstructionJob(input, original, destination), + ).resolves.toMatchObject({ status: "already-compacted" }); + + unlinkSync(receiptPath(root, input, destination)); + await expect(store.compactReconstructionJob(input, original, destination)).resolves.toEqual({ + status: "not-delivered", + }); + }); + + it("keeps reconstruction snapshots for dropped or wrong-scope receipts", async () => { + const root = temporaryRoot(); + const store = createCaptureStore(root); + const input: CaptureInput = { + ...captureInput("reconstruction-wrong-scope"), + runId: "reconstruction:wrong-scope", + eventKind: CAPTURE_RECONSTRUCTION_JOB_KIND, + normalizedPayload: { sourceSnapshots: [{ sourceRef: "source-1" }] }, + }; + await store.capture(input); + const original = (await store.read(input))!; + const destination = input.destinationFingerprint; + await store.recordOutcome({ ...input, destination, outcome: "delivered" }); + const path = receiptPath(root, input, destination); + const receipt = JSON.parse(readFileSync(path, "utf8")); + receipt.sessionId = "another-session"; + writeFileSync(path, JSON.stringify(receipt)); + + await expect(store.compactReconstructionJob(input, original, destination)).resolves.toEqual({ + status: "not-delivered", + }); + await expect(store.read(input)).resolves.toMatchObject({ + normalizedPayload: { sourceSnapshots: [{ sourceRef: "source-1" }] }, + }); + + const droppedInput: CaptureInput = { + ...input, + eventId: "reconstruction-dropped", + }; + await store.capture(droppedInput); + const droppedOriginal = (await store.read(droppedInput))!; + await store.recordOutcome({ + ...droppedInput, + destination, + outcome: "dropped", + reason: "expired", + }); + await expect( + store.compactReconstructionJob(droppedInput, droppedOriginal, destination), + ).resolves.toEqual({ status: "not-delivered" }); + await expect(store.read(droppedInput)).resolves.toMatchObject({ + normalizedPayload: { sourceSnapshots: [{ sourceRef: "source-1" }] }, + }); + }); + + it("rejects malformed reconstruction cleanup markers", async () => { + const root = temporaryRoot(); + const store = createCaptureStore(root); + const input: CaptureInput = { + ...captureInput("reconstruction-invalid-marker"), + runId: "reconstruction:invalid-marker", + eventKind: CAPTURE_RECONSTRUCTION_JOB_KIND, + normalizedPayload: { sourceSnapshots: [{ sourceRef: "source-1" }] }, + }; + await store.capture(input); + const original = (await store.read(input))!; + const destination = input.destinationFingerprint; + await store.recordOutcome({ ...input, destination, outcome: "delivered" }); + await store.compactReconstructionJob(input, original, destination); + const path = eventPath(root, input); + const compacted = JSON.parse(readFileSync(path, "utf8")); + + for (const invalid of [ + { + ...compacted, + sourceSnapshotCleanup: { ...compacted.sourceSnapshotCleanup, originalContentDigest: "bad" }, + }, + { + ...compacted, + normalizedPayload: { ...compacted.normalizedPayload, sourceSnapshots: [] }, + }, + { ...compacted, eventKind: "tool-result" }, + ]) { + writeFileSync(path, JSON.stringify(invalid)); + await expect(store.read(input)).rejects.toThrow( + "Invalid reconstruction source snapshot cleanup marker", + ); + } + }); + + it("limits reconstruction cleanup to the capture destination and job kind", async () => { + const root = temporaryRoot(); + const store = createCaptureStore(root); + const reconstructionInput: CaptureInput = { + ...captureInput("reconstruction-wrong-destination"), + runId: "reconstruction:wrong-destination", + eventKind: CAPTURE_RECONSTRUCTION_JOB_KIND, + normalizedPayload: { sourceSnapshots: [{ sourceRef: "source-1" }] }, + }; + await store.capture(reconstructionInput); + const originalReconstruction = (await store.read(reconstructionInput))!; + await store.recordOutcome({ + ...reconstructionInput, + destination: "destination-b", + outcome: "delivered", + }); + await expect( + store.compactReconstructionJob(reconstructionInput, originalReconstruction, "destination-b"), + ).resolves.toMatchObject({ status: "failed" }); + + const ordinaryInput = { + ...captureInput("ordinary-source-snapshots"), + normalizedPayload: { sourceSnapshots: [{ sourceRef: "source-1" }] }, + }; + await store.capture(ordinaryInput); + const originalOrdinary = (await store.read(ordinaryInput))!; + await store.recordOutcome({ + ...ordinaryInput, + destination: ordinaryInput.destinationFingerprint, + outcome: "delivered", + }); + await expect( + store.compactReconstructionJob( + ordinaryInput, + originalOrdinary, + ordinaryInput.destinationFingerprint, + ), + ).resolves.toMatchObject({ status: "failed" }); + await expect(store.read(reconstructionInput)).resolves.toMatchObject({ + normalizedPayload: { sourceSnapshots: [{ sourceRef: "source-1" }] }, + }); + await expect(store.read(ordinaryInput)).resolves.toMatchObject({ + normalizedPayload: { sourceSnapshots: [{ sourceRef: "source-1" }] }, + }); + }); + it("compacts only present patch values and preserves non-payload patch fields", async () => { const root = temporaryRoot(); const store = createCaptureStore(root); diff --git a/src/storage/capture/capture-store.ts b/src/storage/capture/capture-store.ts index a011a4a0..313103df 100644 --- a/src/storage/capture/capture-store.ts +++ b/src/storage/capture/capture-store.ts @@ -6,12 +6,14 @@ import { CAPTURE_HASH, CAPTURE_RECORD_LOCK_DIRECTORY, CAPTURE_RECORD_VERSION, + CAPTURE_RECONSTRUCTION_JOB_KIND, CAPTURE_RECEIPT_VERSION, } from "./constants.js"; import type { CaptureCompactionResult, CaptureScope, CaptureStore, + ReconstructionJobCleanupResult, OutcomeInput, OutcomeReadResult, OutcomeReceipt, @@ -34,7 +36,9 @@ import { import { captureContentDigest, compactCaptureRecord, + compactReconstructionJobRecord, validateCompactionMarker, + validateSourceSnapshotCleanup, } from "./compaction.js"; import { canonicalJson, canonicalValue } from "./utils/serialization.js"; @@ -121,6 +125,57 @@ export function createCaptureStore(root: string): CaptureStore { return failure("STORAGE_FAILED", error); } }, + async compactReconstructionJob( + scope, + expected, + destination, + ): Promise { + try { + validateScope(scope); + validateIdentifier(destination, "destination"); + if (!sameScope(expected, scope) || expected.eventKind !== CAPTURE_RECONSTRUCTION_JOB_KIND) + throw new TypeError("Capture is not the expected reconstruction job"); + if (destination !== expected.destinationFingerprint) + throw new TypeError("Reconstruction job destination does not match"); + const expectedOriginalContentDigest = captureContentDigest(expected); + if (!CAPTURE_HASH.test(expectedOriginalContentDigest)) + throw new TypeError("Invalid original reconstruction job digest"); + return await withRecordLock(storageRoot, scope, async () => { + const path = eventPath(storageRoot, scope); + const previous = await readRecord(storageRoot, path); + if (previous === undefined) return { status: "missing-capture" }; + if (!sameScope(previous, scope)) throw new Error("Capture namespace does not match"); + if (captureContentDigest(previous) !== expectedOriginalContentDigest) + return { status: "changed" }; + const payload = previous.normalizedPayload; + const hasSourceSnapshots = + payload !== null && + typeof payload === "object" && + !Array.isArray(payload) && + Object.hasOwn(payload, "sourceSnapshots"); + if (!hasSourceSnapshots && previous.sourceSnapshotCleanup === undefined) + return { status: "unchanged" }; + const receipt = await readReceipt( + storageRoot, + receiptPath(storageRoot, scope, destination), + ); + if ( + receipt?.outcome !== "delivered" || + receipt.destination !== destination || + !sameScope(receipt, scope) + ) + return { status: "not-delivered" }; + if (previous.sourceSnapshotCleanup !== undefined) + return { status: "already-compacted", record: previous }; + const compacted = compactReconstructionJobRecord(previous, expectedOriginalContentDigest); + if (compacted === undefined) return { status: "changed" }; + await replacePrivateFile(storageRoot, path, canonicalJson(compacted)); + return { status: "compacted", record: compacted }; + }); + } catch (error) { + return failure("STORAGE_FAILED", error); + } + }, async recordOutcome(input) { try { validateScope(input); @@ -306,10 +361,21 @@ async function readRecord(root: string, path: string): Promise = { ...record }; delete content.version; delete content.capturedAtMs; delete content.compaction; + delete content.sourceSnapshotCleanup; return createHash("sha256").update(canonicalJson(content)).digest("hex"); } @@ -38,6 +47,47 @@ export function compactCaptureRecord( }; } +export function compactReconstructionJobRecord( + record: StoredCapture, + originalContentDigest: string, +): StoredCapture | undefined { + if (record.eventKind !== CAPTURE_RECONSTRUCTION_JOB_KIND) return undefined; + const payload = canonicalValue(record.normalizedPayload, new Set()); + if (!isJsonObject(payload) || !Object.hasOwn(payload, "sourceSnapshots")) return undefined; + delete payload.sourceSnapshots; + return { + ...record, + normalizedPayload: payload, + sourceSnapshotCleanup: { + version: CAPTURE_SOURCE_SNAPSHOT_CLEANUP_VERSION, + originalContentDigest, + }, + }; +} + +export function validateSourceSnapshotCleanup( + value: unknown, + eventKind: string, + normalizedPayload: JsonValue, +): SourceSnapshotCleanup { + if ( + eventKind !== CAPTURE_RECONSTRUCTION_JOB_KIND || + !isObjectRecord(value) || + !hasExactKeys(value, ["version", "originalContentDigest"]) || + value.version !== CAPTURE_SOURCE_SNAPSHOT_CLEANUP_VERSION || + typeof value.originalContentDigest !== "string" || + !CAPTURE_HASH.test(value.originalContentDigest) || + !isJsonObject(normalizedPayload) || + Object.hasOwn(normalizedPayload, "sourceSnapshots") + ) { + throw new Error("Invalid reconstruction source snapshot cleanup marker"); + } + return { + version: CAPTURE_SOURCE_SNAPSHOT_CLEANUP_VERSION, + originalContentDigest: value.originalContentDigest, + }; +} + export function validateCompactionMarker( value: unknown, eventKind: string, diff --git a/src/storage/capture/constants.ts b/src/storage/capture/constants.ts index 09e46523..fd961ac6 100644 --- a/src/storage/capture/constants.ts +++ b/src/storage/capture/constants.ts @@ -1,6 +1,8 @@ export const CAPTURE_DIRECTORY = "capture-v1"; export const CAPTURE_RECORD_VERSION = 2; export const CAPTURE_COMPACTED_RECORD_VERSION = 3; +export const CAPTURE_RECONSTRUCTION_JOB_KIND = "reconstruction-job-v1"; +export const CAPTURE_SOURCE_SNAPSHOT_CLEANUP_VERSION = 1; export const CAPTURE_RECEIPT_VERSION = 1; export const CAPTURE_RECORD_LOCK_DIRECTORY = "record-lock-v1"; export const CAPTURE_DIRECTORY_MODE = 0o700; diff --git a/src/storage/capture/index.ts b/src/storage/capture/index.ts index 3ef00378..114b8ca6 100644 --- a/src/storage/capture/index.ts +++ b/src/storage/capture/index.ts @@ -2,6 +2,7 @@ export { createCaptureStore } from "./capture-store.js"; export type { CaptureCompactionResult, CaptureInput, + ReconstructionJobCleanupResult, CaptureScope, CaptureStore, CaptureWriteResult, @@ -11,5 +12,6 @@ export type { OutcomeReceipt, OutcomeWriteResult, StorageFailure, + SourceSnapshotCleanup, StoredCapture, } from "./models.js"; diff --git a/src/storage/capture/models.ts b/src/storage/capture/models.ts index c4e55d27..aebd09cf 100644 --- a/src/storage/capture/models.ts +++ b/src/storage/capture/models.ts @@ -23,6 +23,12 @@ export interface StoredCapture extends CaptureInput { version: number; capturedAtMs: number; compaction?: CompactedCapturePayload; + sourceSnapshotCleanup?: SourceSnapshotCleanup; +} + +export interface SourceSnapshotCleanup { + version: 1; + originalContentDigest: string; } export type CompactedFieldDigest = @@ -71,6 +77,15 @@ export type CaptureCompactionResult = | { status: "missing-capture" } | StorageFailure; +export type ReconstructionJobCleanupResult = + | { status: "compacted"; record: StoredCapture } + | { status: "already-compacted"; record: StoredCapture } + | { status: "unchanged" } + | { status: "not-delivered" } + | { status: "changed" } + | { status: "missing-capture" } + | StorageFailure; + export interface OutcomeInput extends CaptureScope { destination: string; outcome: "delivered" | "dropped"; @@ -101,6 +116,11 @@ export type OutcomeReadResult = export interface CaptureStore { capture(input: CaptureInput): Promise; compact(scope: CaptureScope, expected: StoredCapture): Promise; + compactReconstructionJob( + scope: CaptureScope, + expected: StoredCapture, + destination: string, + ): Promise; read(scope: CaptureScope): Promise; recordOutcome(input: OutcomeInput): Promise; readOutcome(scope: CaptureScope, destination: string): Promise;