def build_client_engine(
models: list[type[SyncableMixin]],
node_id: str,
url: str,
*,
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,
headers: dict[str, str] | 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,
) -> DatabaseEngine:
resolved_clock, resolved_graph, reconciler, resolved_storage = _resolve_common(
models,
clock,
graph,
resolver,
storage,
)
return DatabaseEngine(
batch_bytes=batch_bytes,
batch_size=batch_size,
clock=resolved_clock,
clock_drift_max=clock_drift_max,
graph=resolved_graph,
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=reconciler,
storage=resolved_storage,
transaction=transaction_fn,
transport=HttpTransport(url=url, headers=headers or {}),
)