// Kept transport-independent so all late session completions use the same rule. export type SessionIdentity = { accessToken: string user: { id: number } } export function isSameSession(expected: SessionIdentity | null, current: SessionIdentity | null) { return Boolean(expected && current && expected.accessToken === current.accessToken && expected.user.id === current.user.id) } export function createSessionRequestGuard(readCurrent: () => SessionIdentity | null) { let generation = 0 return { invalidate() { generation += 1 }, begin(session: SessionIdentity) { const requestGeneration = ++generation return () => generation === requestGeneration && isSameSession(session, readCurrent()) }, } }