fix(session-projection-cache): coldSnapshot honors not-found with zero registered units

Review finding (PR #791): with no projection definitions registered,
restoreFloor() is undefined and the fast path returned a successful empty
snapshot without touching persistence — a nonexistent session 'succeeded',
violating the documented not-found contract in that supported topology.
The no-unit branch now probes readFrom(id, 0): an absent log rejects with
the seam's not-found, a present one dates the empty cut at its stored end.
This commit is contained in:
imccyu
2026-07-28 11:44:19 +08:00
parent 54c893d7af
commit 1ef7c9473c
2 changed files with 29 additions and 1 deletions
@@ -141,8 +141,14 @@ export class SessionProjectionCache extends Service {
async coldSnapshot(id: SessionId, signal?: AbortSignal): Promise<ProjectionSnapshot> {
const cached = this.checkpointOf(id)
const floor = this.ctx.sessionProjections.restoreFloor(cached)
if (floor === undefined) return { asOfSeq: -1, values: {} }
const persistence = this.ctx.sessionPersistence
if (floor === undefined) {
// No unit registered: nothing to fold, but the not-found contract must
// hold in this topology too — the probe read rejects for an absent log
// and dates the empty cut for a present one.
const probe = await persistence.readFrom(id, 0, signal)
return { asOfSeq: probe.events.at(-1)?.seq ?? -1, values: {} }
}
let restored: { snapshot: ProjectionSnapshot; checkpoint: ProjectionCheckpoint }
const tail = await persistence.readFrom(id, floor, signal)
try {