Sync / foldkit-sync

Testing without a browser or a server

A Storage needs three members, and the loopback transport takes a handler in place of a socket:

ts
import { Effect } from 'effect'
import type { Storage } from 'foldkit-sync'

const memoryStorage = (): Storage => {
  let state: unknown
  return {
    load: () => Effect.sync(() => state),
    save: next => Effect.sync(() => void (state = structuredClone(next))),
    close: Effect.void,
  }
}

const program = Effect.gen(function* () {
  const replica = yield* TodoSync.openReplica(ReplicaId.make('test'), memoryStorage())
  yield* replica.submit(Message.CreatedTodo({ id: 't1', title: 'Milk' }))
  yield* replica.synchronize
  return yield* replica.status
}).pipe(
  Effect.provide(
    Sync.transport.loopback((_cursor, pending) => ({
      operations: [],
      acknowledged: pending.map(operation => operation.opId),
      rejected: [],
    })),
  ),
)

In Node, Sync.indexedDb(name, new IDBFactory()) from fake-indexeddb tests the real storage adapter. examples/sync tests every recovery case below against a real journal.