def __init__(
self,
models: list[type[SyncableMixin]],
node_id: str,
transport: Transport,
*,
batch_bytes: int | None = BATCH_BYTES_DEFAULT,
batch_size: int | None = None,
clock: HybridLogicalClock | None = None,
clock_drift_max: int | None = 300,
graph: DependencyGraph | None = None,
lock: SyncLock | None = None,
on_complete: Callable[[DatabaseResult], None] | None = None,
on_phase: Callable[[SyncPhase], None] | None = None,
payload_bytes_max: int | None = None,
payload_records_max: int | None = None,
progress: Callable[[SyncStage, int, int], None] | None = None,
resolver: ConflictResolver | None = None,
storage: DatabaseSyncStorage | None = None,
transaction_fn: Callable[[], AbstractContextManager[Any]] = transaction.atomic,
) -> None:
self._engine = DatabaseEngine(
batch_bytes=batch_bytes,
batch_size=batch_size,
clock=clock or SyncableMixin.get_clock(),
clock_drift_max=clock_drift_max,
graph=graph or build_graph(models),
node_id=node_id,
on_complete=on_complete,
on_phase=on_phase,
payload_bytes_max=payload_bytes_max,
payload_records_max=payload_records_max,
progress=progress,
reconciler=PayloadReconciler(
resolver=resolver or
FieldTimestampWins(),
),
storage=storage or DjangoSyncStorage(models=models),
transaction=transaction_fn,
transport=transport,
)