@tanstack/db
Version:
A reactive client store for building super fast apps on sync
39 lines (34 loc) • 1.32 kB
text/typescript
import type { SyncAppliedReceipt } from './types'
const ACCEPTED = Symbol(`tanstack-db.sync-receipt.accepted`)
type AcceptedReceipt = Promise<void> & { [ACCEPTED]?: SyncAppliedReceipt }
/**
* Attaches the moment a sync transaction was accepted to the receipt that
* resolves when it is visible. A wrapping sync, such as persistence, accepts
* after its durable step.
*
* @internal Adapter infrastructure, not an application API.
*/
export function withAcceptedReceipt(
visible: Promise<void>,
accepted: SyncAppliedReceipt,
): Promise<void> {
;(visible as AcceptedReceipt)[ACCEPTED] = accepted
return visible
}
/**
* The moment a receipt's sync transaction was accepted. Handler-facing writes
* and Collection readiness wait for this, not for visibility: a transaction held by a persisting
* optimistic transaction becomes visible only when that transaction settles,
* so a handler awaiting visibility would wait for itself. Core accepts at
* `commit()`. A receipt that carries no acceptance moment is treated as
* accepted only when it resolves.
*
* @internal Adapter infrastructure, not an application API.
*/
export function whenSyncAccepted(
receipt: SyncAppliedReceipt,
): SyncAppliedReceipt {
return receipt === true
? true
: ((receipt as AcceptedReceipt)[ACCEPTED] ?? receipt)
}