@syncular/client-react 0.0.6-135 → 0.0.6-138

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,7 +7,7 @@
7
7
  * const syncular = createSyncularReact<MyDb>();
8
8
  * const { SyncProvider, useSyncQuery } = syncular;
9
9
  */
10
- import type { ClientSyncConfig, MutationReceipt, MutationsApi, SubscriptionState, SyncAwaitBootstrapOptions, SyncAwaitPhaseOptions, SyncClientDb, SyncClientPlugin, SyncDiagnostics, SyncInspectorOptions, SyncInspectorSnapshot, SyncProgress, SyncRepairOptions, SyncResetOptions, SyncResetResult, SyncTransport, TransportHealth } from '@syncular/client';
10
+ import type { ClientSyncConfig, MutationReceipt, MutationsApi, PushResultInfo, SubscriptionState, SyncAwaitBootstrapOptions, SyncAwaitPhaseOptions, SyncClientDb, SyncClientPlugin, SyncDiagnostics, SyncInspectorOptions, SyncInspectorSnapshot, SyncProgress, SyncRepairOptions, SyncResetOptions, SyncResetResult, SyncTransport, TransportHealth } from '@syncular/client';
11
11
  import { type ConflictInfo, type OutboxStats, type PresenceEntry, type QueryContext, type SyncConnectionState, SyncEngine, type SyncEngineState, type SyncError, type SyncResult, type SyncTransportMode } from '@syncular/client';
12
12
  import { type Kysely } from 'kysely';
13
13
  import { type ReactNode } from 'react';
@@ -42,7 +42,25 @@ export interface SyncProviderProps<DB extends SyncClientDb, Identity extends {
42
42
  realtimeFallbackPollMs?: number;
43
43
  onError?: (error: SyncError) => void;
44
44
  onConflict?: (conflict: ConflictInfo) => void;
45
+ onPushResult?: (result: PushResultInfo) => void;
45
46
  onDataChange?: (scopes: string[]) => void;
47
+ /**
48
+ * Debounce window (ms) for coalescing `data:change` events.
49
+ * - `0` (default): emit immediately
50
+ * - `>0`: merge scopes and emit once per window
51
+ */
52
+ dataChangeDebounceMs?: number;
53
+ /**
54
+ * Debounce override while sync is actively running.
55
+ * Falls back to `dataChangeDebounceMs` when omitted.
56
+ */
57
+ dataChangeDebounceMsWhenSyncing?: number;
58
+ /**
59
+ * Debounce override while connection is reconnecting.
60
+ * Falls back to `dataChangeDebounceMsWhenSyncing` (if syncing) and then
61
+ * `dataChangeDebounceMs` when omitted.
62
+ */
63
+ dataChangeDebounceMsWhenReconnecting?: number;
46
64
  plugins?: SyncClientPlugin[];
47
65
  /** Custom SHA-256 hash function (for platforms without crypto.subtle, e.g. React Native) */
48
66
  sha256?: (bytes: Uint8Array) => Promise<string>;
@@ -158,6 +176,20 @@ export interface UseConflictsResult {
158
176
  isLoading: boolean;
159
177
  refresh: () => Promise<void>;
160
178
  }
179
+ export interface UseNewConflictsOptions {
180
+ /**
181
+ * Max number of buffered conflict notifications kept in memory.
182
+ * Oldest notifications are dropped once the buffer reaches this size.
183
+ */
184
+ maxBuffered?: number;
185
+ }
186
+ export interface UseNewConflictsResult {
187
+ conflicts: ConflictInfo[];
188
+ latest: ConflictInfo | null;
189
+ count: number;
190
+ clear: () => void;
191
+ dismiss: (conflictId: string) => void;
192
+ }
161
193
  export type ConflictResolution = 'accept' | 'reject' | 'merge';
162
194
  export interface UseResolveConflictResult {
163
195
  resolve: (conflictId: string, resolution: ConflictResolution, mergedData?: Record<string, unknown>) => Promise<void>;
@@ -178,6 +210,12 @@ export interface UseSyncQueryResult<T> {
178
210
  lastSyncAt: number | null;
179
211
  refetch: () => Promise<void>;
180
212
  }
213
+ interface UseSyncQueryMetrics {
214
+ executions: number;
215
+ coalescedRefreshes: number;
216
+ skippedDataUpdates: number;
217
+ lastDurationMs: number | null;
218
+ }
181
219
  export interface UseSyncQueryOptions {
182
220
  enabled?: boolean;
183
221
  deps?: unknown[];
@@ -185,6 +223,15 @@ export interface UseSyncQueryOptions {
185
223
  watchTables?: string[];
186
224
  pollIntervalMs?: number;
187
225
  staleAfterMs?: number;
226
+ /**
227
+ * If true (default), non-urgent hook state updates are scheduled in
228
+ * `startTransition` to keep UI interactions responsive under bursty sync.
229
+ */
230
+ transitionUpdates?: boolean;
231
+ /**
232
+ * Optional low-overhead instrumentation callback for query executions.
233
+ */
234
+ onMetrics?: (metrics: UseSyncQueryMetrics) => void;
188
235
  }
189
236
  export interface UseQueryResult<T> {
190
237
  data: T | undefined;
@@ -272,6 +319,22 @@ export interface UseOutboxResult {
272
319
  clearFailed: () => Promise<number>;
273
320
  clearAll: () => Promise<number>;
274
321
  }
322
+ interface UseOutboxMetrics {
323
+ refreshes: number;
324
+ coalescedRefreshes: number;
325
+ lastDurationMs: number | null;
326
+ }
327
+ interface UseOutboxOptions {
328
+ /**
329
+ * If true (default), non-urgent outbox state updates are scheduled in
330
+ * `startTransition` to reduce render contention during sync bursts.
331
+ */
332
+ transitionUpdates?: boolean;
333
+ /**
334
+ * Optional low-overhead instrumentation callback for outbox refreshes.
335
+ */
336
+ onMetrics?: (metrics: UseOutboxMetrics) => void;
337
+ }
275
338
  export interface UsePresenceResult<TMetadata = Record<string, unknown>> {
276
339
  presence: PresenceEntry<TMetadata>[];
277
340
  isLoading: boolean;
@@ -291,7 +354,7 @@ export declare function createSyncularReact<DB extends SyncClientDb, Identity ex
291
354
  } = {
292
355
  actorId: string;
293
356
  }>(): {
294
- readonly SyncProvider: ({ db, transport, sync, identity, clientId, limitCommits, limitSnapshotRows, maxSnapshotPages, stateId, pollIntervalMs, maxRetries, migrate, onMigrationError, realtimeEnabled, realtimeFallbackPollMs, onError, onConflict, onDataChange, plugins, sha256, autoStart, renderWhileStarting, children, }: SyncProviderProps<DB, Identity>) => ReactNode;
357
+ readonly SyncProvider: ({ db, transport, sync, identity, clientId, limitCommits, limitSnapshotRows, maxSnapshotPages, stateId, pollIntervalMs, maxRetries, migrate, onMigrationError, realtimeEnabled, realtimeFallbackPollMs, onError, onConflict, onPushResult, onDataChange, dataChangeDebounceMs, dataChangeDebounceMsWhenSyncing, dataChangeDebounceMsWhenReconnecting, plugins, sha256, autoStart, renderWhileStarting, children, }: SyncProviderProps<DB, Identity>) => ReactNode;
295
358
  readonly useSyncContext: () => SyncContextValue<DB>;
296
359
  readonly useEngine: () => SyncEngine<DB>;
297
360
  readonly useSyncEngine: () => UseSyncEngineResult;
@@ -308,8 +371,9 @@ export declare function createSyncularReact<DB extends SyncClientDb, Identity ex
308
371
  readonly useQuery: <TResult>(queryFn: (ctx: QueryContext<DB>) => ExecutableQuery<TResult> | Promise<TResult>, options?: UseQueryOptions) => UseQueryResult<TResult>;
309
372
  readonly useMutation: <TTable extends keyof DB & string>(options: UseMutationOptions<TTable>) => UseMutationResult<TTable>;
310
373
  readonly useMutations: (options?: UseMutationsOptions) => MutationsHook<DB>;
311
- readonly useOutbox: () => UseOutboxResult;
374
+ readonly useOutbox: (options?: UseOutboxOptions) => UseOutboxResult;
312
375
  readonly useConflicts: () => UseConflictsResult;
376
+ readonly useNewConflicts: (options?: UseNewConflictsOptions) => UseNewConflictsResult;
313
377
  readonly useResolveConflict: (options?: UseResolveConflictOptions) => UseResolveConflictResult;
314
378
  readonly usePresence: <TMetadata = Record<string, unknown>>(scopeKey: string) => UsePresenceResult<TMetadata>;
315
379
  readonly usePresenceWithJoin: <TMetadata = Record<string, unknown>>(scopeKey: string, options?: UsePresenceWithJoinOptions<TMetadata>) => UsePresenceWithJoinResult<TMetadata>;
@@ -1 +1 @@
1
- {"version":3,"file":"createSyncularReact.d.ts","sourceRoot":"","sources":["../src/createSyncularReact.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"createSyncularReact.d.ts","sourceRoot":"","sources":["../src/createSyncularReact.tsx"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { createMutationsApi, createOutboxCommit, createQueryContext, enqueueOutboxCommit, FingerprintCollector, resolveConflict as resolveConflictDb, SyncEngine, } from '@syncular/client';
3
3
  import { sql } from 'kysely';
4
- import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, useSyncExternalStore, } from 'react';
4
+ import { createContext, startTransition, useCallback, useContext, useEffect, useMemo, useRef, useState, useSyncExternalStore, } from 'react';
5
5
  function isRecord(value) {
6
6
  return typeof value === 'object' && value !== null && !Array.isArray(value);
7
7
  }
@@ -55,7 +55,7 @@ const SYNC_SUBSCRIPTION_REFRESH_EVENTS = [
55
55
  ];
56
56
  export function createSyncularReact() {
57
57
  const SyncContext = createContext(null);
58
- function SyncProvider({ db, transport, sync, identity, clientId, limitCommits, limitSnapshotRows, maxSnapshotPages, stateId, pollIntervalMs, maxRetries, migrate, onMigrationError, realtimeEnabled, realtimeFallbackPollMs, onError, onConflict, onDataChange, plugins, sha256, autoStart = true, renderWhileStarting = true, children, }) {
58
+ function SyncProvider({ db, transport, sync, identity, clientId, limitCommits, limitSnapshotRows, maxSnapshotPages, stateId, pollIntervalMs, maxRetries, migrate, onMigrationError, realtimeEnabled, realtimeFallbackPollMs, onError, onConflict, onPushResult, onDataChange, dataChangeDebounceMs, dataChangeDebounceMsWhenSyncing, dataChangeDebounceMsWhenReconnecting, plugins, sha256, autoStart = true, renderWhileStarting = true, children, }) {
59
59
  const resolvedSubscriptions = useMemo(() => sync.subscriptions(identity), [sync, identity]);
60
60
  const config = useMemo(() => ({
61
61
  db,
@@ -76,7 +76,11 @@ export function createSyncularReact() {
76
76
  realtimeFallbackPollMs,
77
77
  onError,
78
78
  onConflict,
79
+ onPushResult,
79
80
  onDataChange,
81
+ dataChangeDebounceMs,
82
+ dataChangeDebounceMsWhenSyncing,
83
+ dataChangeDebounceMsWhenReconnecting,
80
84
  plugins,
81
85
  sha256,
82
86
  }), [
@@ -98,7 +102,11 @@ export function createSyncularReact() {
98
102
  realtimeFallbackPollMs,
99
103
  onError,
100
104
  onConflict,
105
+ onPushResult,
101
106
  onDataChange,
107
+ dataChangeDebounceMs,
108
+ dataChangeDebounceMsWhenSyncing,
109
+ dataChangeDebounceMsWhenReconnecting,
102
110
  plugins,
103
111
  sha256,
104
112
  ]);
@@ -285,23 +293,15 @@ export function createSyncularReact() {
285
293
  }
286
294
  function useTransportHealth() {
287
295
  const engine = useEngine();
296
+ const getSnapshot = useCallback(() => engine.getTransportHealth(), [engine]);
288
297
  const health = useSyncExternalStore(useCallback((callback) => {
289
- const unsubscribers = [
290
- engine.subscribe(callback),
291
- engine.on('connection:change', callback),
292
- engine.on('sync:complete', callback),
293
- engine.on('sync:error', callback),
294
- ];
295
- return () => {
296
- for (const unsubscribe of unsubscribers)
297
- unsubscribe();
298
- };
299
- }, [engine]), useCallback(() => engine.getTransportHealth(), [engine]), useCallback(() => engine.getTransportHealth(), [engine]));
298
+ return engine.subscribeSelector(getSnapshot, callback);
299
+ }, [engine, getSnapshot]), getSnapshot, getSnapshot);
300
300
  return useMemo(() => ({ health }), [health]);
301
301
  }
302
302
  function useAsyncEngineResource(options) {
303
303
  const engine = useEngine();
304
- const { initialValue, load, refreshOn, pollIntervalMs, shouldPoll } = options;
304
+ const { initialValue, load, refreshOn, pollIntervalMs, shouldPoll, transitionUpdates = true, } = options;
305
305
  const loadRef = useRef(load);
306
306
  loadRef.current = load;
307
307
  const [value, setValue] = useState(initialValue);
@@ -309,7 +309,16 @@ export function createSyncularReact() {
309
309
  const [error, setError] = useState(null);
310
310
  const loadedRef = useRef(false);
311
311
  const versionRef = useRef(0);
312
- const refresh = useCallback(async () => {
312
+ const inFlightRefreshRef = useRef(null);
313
+ const refreshQueuedRef = useRef(false);
314
+ const applyUpdate = useCallback((update) => {
315
+ if (transitionUpdates) {
316
+ startTransition(update);
317
+ return;
318
+ }
319
+ update();
320
+ }, [transitionUpdates]);
321
+ const refreshOnce = useCallback(async () => {
313
322
  const version = ++versionRef.current;
314
323
  const isCurrent = () => version === versionRef.current;
315
324
  if (!loadedRef.current) {
@@ -319,21 +328,45 @@ export function createSyncularReact() {
319
328
  const next = await loadRef.current();
320
329
  if (!isCurrent())
321
330
  return;
322
- setValue(next);
323
- setError(null);
331
+ applyUpdate(() => {
332
+ setValue(next);
333
+ setError(null);
334
+ });
324
335
  }
325
336
  catch (err) {
326
337
  if (!isCurrent())
327
338
  return;
328
- setError(err instanceof Error ? err : new Error(String(err)));
339
+ applyUpdate(() => {
340
+ setError(err instanceof Error ? err : new Error(String(err)));
341
+ });
329
342
  }
330
343
  finally {
331
344
  if (isCurrent()) {
332
345
  loadedRef.current = true;
333
- setIsLoading(false);
346
+ applyUpdate(() => {
347
+ setIsLoading(false);
348
+ });
334
349
  }
335
350
  }
336
- }, []);
351
+ }, [applyUpdate]);
352
+ const refresh = useCallback(async () => {
353
+ refreshQueuedRef.current = true;
354
+ if (inFlightRefreshRef.current) {
355
+ await inFlightRefreshRef.current;
356
+ return;
357
+ }
358
+ const runLoop = async () => {
359
+ while (refreshQueuedRef.current) {
360
+ refreshQueuedRef.current = false;
361
+ await refreshOnce();
362
+ }
363
+ };
364
+ const inFlight = runLoop().finally(() => {
365
+ inFlightRefreshRef.current = null;
366
+ });
367
+ inFlightRefreshRef.current = inFlight;
368
+ await inFlight;
369
+ }, [refreshOnce]);
337
370
  useEffect(() => {
338
371
  void refresh();
339
372
  }, [refresh]);
@@ -432,7 +465,7 @@ export function createSyncularReact() {
432
465
  const { value: conflicts, isLoading, refresh, } = useAsyncEngineResource({
433
466
  initialValue: [],
434
467
  load: () => engine.getConflicts(),
435
- refreshOn: ['sync:complete', 'sync:error'],
468
+ refreshOn: ['sync:complete', 'sync:error', 'conflict:new'],
436
469
  });
437
470
  return useMemo(() => ({
438
471
  conflicts,
@@ -442,6 +475,38 @@ export function createSyncularReact() {
442
475
  refresh,
443
476
  }), [conflicts, isLoading, refresh]);
444
477
  }
478
+ function useNewConflicts(options = {}) {
479
+ const engine = useEngine();
480
+ const maxBuffered = Math.max(1, Math.min(500, options.maxBuffered ?? 100));
481
+ const [conflicts, setConflicts] = useState([]);
482
+ useEffect(() => {
483
+ setConflicts([]);
484
+ const unsubscribe = engine.on('conflict:new', (conflict) => {
485
+ setConflicts((previous) => {
486
+ if (previous.some((item) => item.id === conflict.id)) {
487
+ return previous;
488
+ }
489
+ const next = [...previous, conflict];
490
+ const overflow = next.length - maxBuffered;
491
+ return overflow > 0 ? next.slice(overflow) : next;
492
+ });
493
+ });
494
+ return unsubscribe;
495
+ }, [engine, maxBuffered]);
496
+ const clear = useCallback(() => {
497
+ setConflicts([]);
498
+ }, []);
499
+ const dismiss = useCallback((conflictId) => {
500
+ setConflicts((previous) => previous.filter((conflict) => conflict.id !== conflictId));
501
+ }, []);
502
+ return useMemo(() => ({
503
+ conflicts,
504
+ latest: conflicts[conflicts.length - 1] ?? null,
505
+ count: conflicts.length,
506
+ clear,
507
+ dismiss,
508
+ }), [conflicts, clear, dismiss]);
509
+ }
445
510
  function useResolveConflict(options = {}) {
446
511
  const { onSuccess, onError, syncAfterResolve = true } = options;
447
512
  const { db } = useSyncContext();
@@ -491,7 +556,7 @@ export function createSyncularReact() {
491
556
  }), [resolve, isPending, error, reset]);
492
557
  }
493
558
  function useSyncQuery(queryFn, options = {}) {
494
- const { enabled = true, deps = [], keyField = 'id', watchTables = [], pollIntervalMs, staleAfterMs, } = options;
559
+ const { enabled = true, deps = [], keyField = 'id', watchTables = [], pollIntervalMs, staleAfterMs, transitionUpdates = true, onMetrics, } = options;
495
560
  const { db } = useSyncContext();
496
561
  const engine = useEngine();
497
562
  const watchTablesSet = useMemo(() => new Set(watchTables), [watchTables]);
@@ -507,15 +572,42 @@ export function createSyncularReact() {
507
572
  const fingerprintCollectorRef = useRef(new FingerprintCollector());
508
573
  const previousFingerprintRef = useRef('');
509
574
  const hasLoadedRef = useRef(false);
510
- const executeQuery = useCallback(async () => {
575
+ const inFlightQueryRef = useRef(null);
576
+ const queryQueuedRef = useRef(false);
577
+ const metricsRef = useRef({
578
+ executions: 0,
579
+ coalescedRefreshes: 0,
580
+ skippedDataUpdates: 0,
581
+ lastDurationMs: null,
582
+ });
583
+ const onMetricsRef = useRef(onMetrics);
584
+ onMetricsRef.current = onMetrics;
585
+ const emitMetrics = useCallback(() => {
586
+ onMetricsRef.current?.({ ...metricsRef.current });
587
+ }, []);
588
+ const applyUpdate = useCallback((update) => {
589
+ if (transitionUpdates) {
590
+ startTransition(update);
591
+ return;
592
+ }
593
+ update();
594
+ }, [transitionUpdates]);
595
+ const executeQueryOnce = useCallback(async () => {
596
+ const startedAt = Date.now();
597
+ metricsRef.current.executions += 1;
511
598
  if (!enabled) {
512
599
  if (previousFingerprintRef.current !== 'disabled') {
513
600
  previousFingerprintRef.current = 'disabled';
514
- setData(undefined);
515
601
  }
516
- setLastSyncAt(engine.getState().lastSyncAt);
517
- setIsLoading(false);
602
+ const snapshotLastSyncAt = engine.getState().lastSyncAt;
603
+ applyUpdate(() => {
604
+ setData(undefined);
605
+ setLastSyncAt(snapshotLastSyncAt);
606
+ setIsLoading(false);
607
+ });
518
608
  hasLoadedRef.current = true;
609
+ metricsRef.current.lastDurationMs = Date.now() - startedAt;
610
+ emitMetrics();
519
611
  return;
520
612
  }
521
613
  const version = ++versionRef.current;
@@ -532,47 +624,77 @@ export function createSyncularReact() {
532
624
  : await fnResult;
533
625
  if (version === versionRef.current) {
534
626
  watchedScopesRef.current = scopeCollector;
535
- setLastSyncAt(engine.getState().lastSyncAt);
627
+ const snapshotLastSyncAt = engine.getState().lastSyncAt;
536
628
  const fingerprint = fingerprintCollectorRef.current.getCombined();
537
- if (fingerprint !== previousFingerprintRef.current ||
538
- fingerprint === '') {
629
+ const didFingerprintChange = fingerprint !== previousFingerprintRef.current ||
630
+ fingerprint === '';
631
+ if (didFingerprintChange) {
539
632
  previousFingerprintRef.current = fingerprint;
540
- setData(result);
541
633
  }
542
- setError(null);
634
+ else {
635
+ metricsRef.current.skippedDataUpdates += 1;
636
+ }
637
+ applyUpdate(() => {
638
+ setLastSyncAt(snapshotLastSyncAt);
639
+ if (didFingerprintChange) {
640
+ setData(result);
641
+ }
642
+ setError(null);
643
+ });
543
644
  }
544
645
  }
545
646
  catch (err) {
546
647
  if (version === versionRef.current) {
547
- setError(err instanceof Error ? err : new Error(String(err)));
648
+ applyUpdate(() => {
649
+ setError(err instanceof Error ? err : new Error(String(err)));
650
+ });
548
651
  }
549
652
  }
550
653
  finally {
551
654
  if (version === versionRef.current) {
552
- setIsLoading(false);
655
+ applyUpdate(() => {
656
+ setIsLoading(false);
657
+ });
553
658
  hasLoadedRef.current = true;
659
+ metricsRef.current.lastDurationMs = Date.now() - startedAt;
660
+ emitMetrics();
554
661
  }
555
662
  }
556
- }, [db, enabled, engine, keyField]);
663
+ }, [db, enabled, engine, keyField, applyUpdate, emitMetrics]);
664
+ const executeQuery = useCallback(async () => {
665
+ queryQueuedRef.current = true;
666
+ if (inFlightQueryRef.current) {
667
+ metricsRef.current.coalescedRefreshes += 1;
668
+ emitMetrics();
669
+ await inFlightQueryRef.current;
670
+ return;
671
+ }
672
+ const runLoop = async () => {
673
+ while (queryQueuedRef.current) {
674
+ queryQueuedRef.current = false;
675
+ await executeQueryOnce();
676
+ }
677
+ };
678
+ const inFlight = runLoop().finally(() => {
679
+ inFlightQueryRef.current = null;
680
+ });
681
+ inFlightQueryRef.current = inFlight;
682
+ await inFlight;
683
+ }, [executeQueryOnce, emitMetrics]);
557
684
  useEffect(() => {
558
685
  executeQuery();
559
686
  // eslint-disable-next-line react-hooks/exhaustive-deps
560
687
  }, [executeQuery, ...deps]);
688
+ const getLastSyncAtSnapshot = useCallback(() => engine.getState().lastSyncAt, [engine]);
561
689
  useEffect(() => {
562
- const unsubscribe = engine.subscribe(() => {
563
- const nextLastSyncAt = engine.getState().lastSyncAt;
564
- setLastSyncAt((previous) => previous === nextLastSyncAt ? previous : nextLastSyncAt);
565
- });
566
- return unsubscribe;
567
- }, [engine]);
568
- useEffect(() => {
569
- if (!enabled)
570
- return;
571
- const unsubscribe = engine.on('sync:complete', () => {
572
- void executeQuery();
690
+ const unsubscribe = engine.subscribeSelector(getLastSyncAtSnapshot, () => {
691
+ const snapshotLastSyncAt = getLastSyncAtSnapshot();
692
+ applyUpdate(() => {
693
+ setLastSyncAt(snapshotLastSyncAt);
694
+ });
573
695
  });
574
696
  return unsubscribe;
575
- }, [engine, enabled, executeQuery]);
697
+ }, [engine, getLastSyncAtSnapshot, applyUpdate]);
576
698
  useEffect(() => {
577
699
  if (!enabled)
578
700
  return;
@@ -844,9 +966,10 @@ export function createSyncularReact() {
844
966
  $reset: reset,
845
967
  }), [api, error, isPending, reset]);
846
968
  }
847
- function useOutbox() {
969
+ function useOutbox(options = {}) {
848
970
  const { db } = useSyncContext();
849
971
  const engine = useEngine();
972
+ const { transitionUpdates = true, onMetrics } = options;
850
973
  const [stats, setStats] = useState({
851
974
  pending: 0,
852
975
  sending: 0,
@@ -857,11 +980,31 @@ export function createSyncularReact() {
857
980
  const [pending, setPending] = useState([]);
858
981
  const [failed, setFailed] = useState([]);
859
982
  const [isLoading, setIsLoading] = useState(true);
860
- const refresh = useCallback(async () => {
983
+ const inFlightRefreshRef = useRef(null);
984
+ const refreshQueuedRef = useRef(false);
985
+ const metricsRef = useRef({
986
+ refreshes: 0,
987
+ coalescedRefreshes: 0,
988
+ lastDurationMs: null,
989
+ });
990
+ const onMetricsRef = useRef(onMetrics);
991
+ onMetricsRef.current = onMetrics;
992
+ const emitMetrics = useCallback(() => {
993
+ onMetricsRef.current?.({ ...metricsRef.current });
994
+ }, []);
995
+ const applyUpdate = useCallback((update) => {
996
+ if (transitionUpdates) {
997
+ startTransition(update);
998
+ return;
999
+ }
1000
+ update();
1001
+ }, [transitionUpdates]);
1002
+ const refreshOnce = useCallback(async () => {
1003
+ const startedAt = Date.now();
1004
+ metricsRef.current.refreshes += 1;
861
1005
  try {
862
1006
  setIsLoading(true);
863
1007
  const newStats = await engine.refreshOutboxStats({ emit: false });
864
- setStats(newStats);
865
1008
  const rowsResult = await sql `
866
1009
  select
867
1010
  ${sql.ref('id')},
@@ -902,16 +1045,45 @@ export function createSyncularReact() {
902
1045
  attemptCount: Number(row.attempt_count),
903
1046
  };
904
1047
  });
905
- setPending(commits.filter((c) => c.status === 'pending'));
906
- setFailed(commits.filter((c) => c.status === 'failed'));
1048
+ const nextPending = commits.filter((c) => c.status === 'pending');
1049
+ const nextFailed = commits.filter((c) => c.status === 'failed');
1050
+ applyUpdate(() => {
1051
+ setStats(newStats);
1052
+ setPending(nextPending);
1053
+ setFailed(nextFailed);
1054
+ });
907
1055
  }
908
1056
  catch (err) {
909
1057
  console.error('[useOutbox] Failed to refresh:', err);
910
1058
  }
911
1059
  finally {
912
- setIsLoading(false);
1060
+ applyUpdate(() => {
1061
+ setIsLoading(false);
1062
+ });
1063
+ metricsRef.current.lastDurationMs = Date.now() - startedAt;
1064
+ emitMetrics();
913
1065
  }
914
- }, [db, engine]);
1066
+ }, [db, engine, applyUpdate, emitMetrics]);
1067
+ const refresh = useCallback(async () => {
1068
+ refreshQueuedRef.current = true;
1069
+ if (inFlightRefreshRef.current) {
1070
+ metricsRef.current.coalescedRefreshes += 1;
1071
+ emitMetrics();
1072
+ await inFlightRefreshRef.current;
1073
+ return;
1074
+ }
1075
+ const runLoop = async () => {
1076
+ while (refreshQueuedRef.current) {
1077
+ refreshQueuedRef.current = false;
1078
+ await refreshOnce();
1079
+ }
1080
+ };
1081
+ const inFlight = runLoop().finally(() => {
1082
+ inFlightRefreshRef.current = null;
1083
+ });
1084
+ inFlightRefreshRef.current = inFlight;
1085
+ await inFlight;
1086
+ }, [refreshOnce, emitMetrics]);
915
1087
  useEffect(() => {
916
1088
  refresh();
917
1089
  }, [refresh]);
@@ -921,12 +1093,6 @@ export function createSyncularReact() {
921
1093
  });
922
1094
  return unsubscribe;
923
1095
  }, [engine, refresh]);
924
- useEffect(() => {
925
- const unsubscribe = engine.on('sync:complete', () => {
926
- refresh();
927
- });
928
- return unsubscribe;
929
- }, [engine, refresh]);
930
1096
  const hasUnsent = stats.pending > 0 || stats.failed > 0;
931
1097
  const clearFailed = useCallback(async () => {
932
1098
  const count = await engine.clearFailedCommits();
@@ -1048,6 +1214,7 @@ export function createSyncularReact() {
1048
1214
  useMutations,
1049
1215
  useOutbox,
1050
1216
  useConflicts,
1217
+ useNewConflicts,
1051
1218
  useResolveConflict,
1052
1219
  usePresence,
1053
1220
  usePresenceWithJoin,