refactor(schedule): make absolute times explicit

This commit is contained in:
Tianyi Cui
2026-08-09 16:30:11 +08:00
parent 3d6498e91b
commit b7ec8429a9
109 changed files with 1248 additions and 3219 deletions

View File

@@ -589,9 +589,6 @@ export class PersistenceCoordinator<TornMarker = unknown> {
if (!Number.isSafeInteger(snapshot.createdAt) || snapshot.createdAt < 0) {
return Promise.reject(new TypeError('session metadata createdAt must be a non-negative safe integer'))
}
if (snapshot.timeZone !== undefined && typeof snapshot.timeZone !== 'string') {
return Promise.reject(new TypeError('session metadata timeZone must be a string'))
}
return this.serialize(snapshot.id, () => this.createCore(snapshot))
}
@@ -804,7 +801,7 @@ export class PersistenceCoordinator<TornMarker = unknown> {
signal?.throwIfAborted()
if (suffix === undefined) throw new Error(`session "${id}" not found`)
this.assertStoredId(id, suffix.meta)
this.assertStoredHeader(suffix.meta)
this.assertVersion(suffix.meta)
if (suffix.events.some(needsLegacyPrefix)) {
const whole = await this.readStoredPrefix(id, signal)
return { meta: whole.meta, events: whole.events.filter(event => event.seq >= fromSeq) }
@@ -826,7 +823,7 @@ export class PersistenceCoordinator<TornMarker = unknown> {
signal?.throwIfAborted()
if (stored === undefined) throw new Error(`session "${id}" not found`)
this.assertStoredId(id, stored.meta)
this.assertStoredHeader(stored.meta)
this.assertVersion(stored.meta)
return {
meta: structuredClone(stored.meta),
events: snapshotStoredEvents(stored.events, id),
@@ -840,7 +837,7 @@ export class PersistenceCoordinator<TornMarker = unknown> {
try {
const { meta, events, revision, tornMarker } = stored
this.assertStoredId(id, meta)
this.assertStoredHeader(meta)
this.assertVersion(meta)
const storedEvents = adoptStoredEvents(events, id)
// Preserve complete interrupted events and synthesize only missing closers.
@@ -984,14 +981,10 @@ export class PersistenceCoordinator<TornMarker = unknown> {
}
}
/** Validate fixed fields decoded from backend-owned storage. */
private assertStoredHeader(meta: SessionHeader): void {
private assertVersion(meta: SessionHeader): void {
if (meta.version !== SESSION_FORMAT_VERSION) {
throw new Error(`unsupported session format version ${meta.version} for "${meta.id}" (only v${SESSION_FORMAT_VERSION} is supported)`)
}
if (meta.timeZone !== undefined && typeof meta.timeZone !== 'string') {
throw new Error(`stored session "${meta.id}" timeZone must be a string`)
}
}
/** Reject backend metadata that is not bound to the requested session id. */
@@ -1001,17 +994,6 @@ export class PersistenceCoordinator<TornMarker = unknown> {
}
}
/** Compare the immutable metadata fields that participate in live adoption identity. */
private assertAdoptableIdentity(meta: SessionHeader, session: Session): void {
this.assertStoredHeader(meta)
if (meta.cwd !== session.header.cwd) {
throw new Error(`session "${session.header.id}" is already persisted at a different cwd (persisted: ${String(meta.cwd)}, live: ${String(session.header.cwd)}) (id collision)`)
}
if (meta.timeZone !== session.header.timeZone) {
throw new Error(`session "${session.header.id}" is already persisted with a different timeZone (persisted: ${String(meta.timeZone)}, live: ${String(session.header.timeZone)}) (id collision)`)
}
}
// --- write path (session/event → flush drain) ---
private installWritePath(): void {
@@ -1179,7 +1161,9 @@ export class PersistenceCoordinator<TornMarker = unknown> {
// the stored header's cwd. The seed guard then ensures the live events
// reproduce the persisted prefix; otherwise a fresh session reusing the
// id could have its leading events filtered as already written.
this.assertAdoptableIdentity(tracked.meta, session)
if (tracked.meta.cwd !== session.header.cwd) {
throw new Error(`session "${id}" is already persisted at a different cwd (persisted: ${String(tracked.meta.cwd)}, live: ${String(session.header.cwd)}) (id collision)`)
}
if (!await this.seedMatchesPersisted(id, seed, tracked.cursor)) {
throw new Error(`session "${id}" is already persisted with ${tracked.cursor} event(s) that do not match this live session (id collision)`)
}
@@ -1230,7 +1214,10 @@ export class PersistenceCoordinator<TornMarker = unknown> {
private async adoptLivePrefix(session: Session, seed: readonly SessionEvent[], stored: StoredPrefix<TornMarker>): Promise<void> {
const { meta, events, tornMarker } = stored
this.assertStoredId(session.header.id, meta)
this.assertAdoptableIdentity(meta, session)
if (meta.cwd !== session.header.cwd) {
throw new Error(`session "${session.header.id}" is already persisted at a different cwd (persisted: ${String(meta.cwd)}, live: ${String(session.header.cwd)}) (id collision)`)
}
this.assertVersion(meta)
const storedEvents = snapshotStoredEvents(events, session.header.id)
if (!seedCoversPrefix(seed, storedEvents)) {
throw new Error(`session "${session.header.id}" already has a persisted log on disk that does not match this live session (id collision)`)