@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.
- package/dist/createSyncularReact.d.ts +67 -3
- package/dist/createSyncularReact.d.ts.map +1 -1
- package/dist/createSyncularReact.js +226 -59
- package/dist/createSyncularReact.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/useSyncGroup.d.ts.map +1 -1
- package/dist/useSyncGroup.js +1 -7
- package/dist/useSyncGroup.js.map +1 -1
- package/package.json +5 -5
- package/src/__tests__/SyncEngine.test.ts +135 -0
- package/src/__tests__/hooks.test.tsx +190 -0
- package/src/createSyncularReact.tsx +349 -63
- package/src/index.ts +2 -0
- package/src/useSyncGroup.ts +3 -7
|
@@ -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":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EACf,YAAY,EAIZ,iBAAiB,EACjB,yBAAyB,EACzB,qBAAqB,EACrB,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,oBAAoB,EACpB,qBAAqB,EAErB,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,eAAe,EAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,KAAK,YAAY,EAMjB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,YAAY,EAEjB,KAAK,mBAAmB,EACxB,UAAU,EAEV,KAAK,eAAe,EACpB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,iBAAiB,EACvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,KAAK,MAAM,EAAO,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAEL,KAAK,SAAS,EAQf,MAAM,OAAO,CAAC;AAMf,KAAK,eAAe,CAAC,OAAO,IAAI;IAC9B,OAAO,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;CACjC,CAAC;AAsDF,MAAM,WAAW,gBAAgB,CAAC,EAAE,SAAS,YAAY;IACvD,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;IACvB,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACf,SAAS,EAAE,aAAa,CAAC;IACzB,QAAQ,EAAE,gBAAgB,CAAC,EAAE,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,UAAU,CAAC,CAAC;CACjE;AAED,MAAM,WAAW,iBAAiB,CAChC,EAAE,SAAS,YAAY,EACvB,QAAQ,SAAS;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE;IAEpC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACf,SAAS,EAAE,aAAa,CAAC;IACzB,IAAI,EAAE,gBAAgB,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IACrC,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5C,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAC1C,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IACrC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;IAC9C,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC1C,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC7B,4FAA4F;IAC5F,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,eAAe,CAAC;IACvB,IAAI,EAAE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC;IAChC,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,kBAAkB,EAAE,MAAM,QAAQ,CAAC,eAAe,CAAC,CAAC;IACpD,WAAW,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC;IACzC,cAAc,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC,CAAC;IAC/C,oBAAoB,EAAE,CACpB,OAAO,CAAC,EAAE,oBAAoB,KAC3B,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACpC,sBAAsB,EAAE,CAAC,IAAI,CAAC,EAAE;QAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;KAC/B,KAAK,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACnC,oBAAoB,EAAE,CACpB,cAAc,EAAE,MAAM,EACtB,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,KAC3B,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAC;IACvC,KAAK,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;IAC/D,MAAM,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;IACjE,UAAU,EAAE,CACV,KAAK,EAAE,YAAY,CAAC,cAAc,CAAC,EACnC,OAAO,CAAC,EAAE,qBAAqB,KAC5B,OAAO,CAAC,YAAY,CAAC,CAAC;IAC3B,sBAAsB,EAAE,CACtB,OAAO,CAAC,EAAE,yBAAyB,KAChC,OAAO,CAAC,YAAY,CAAC,CAAC;CAC5B;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,mBAAmB,CAAC;IAC3B,IAAI,EAAE,iBAAiB,CAAC;IACxB,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;IACxB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,eAAe,CAAC;CACzB;AAED,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,uBAAuB;IACtC;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,qBAAqB,GAAG,IAAI,CAAC;IACvC,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;CAC/B;AAED,MAAM,WAAW,0BAA0B;IACzC,aAAa,EAAE,iBAAiB,EAAE,CAAC;IACnC,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,yBAAyB;IACxC,YAAY,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACvC,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE/D,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,CACP,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,kBAAkB,EAC9B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KACjC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,yBAAyB;IACxC,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,IAAI,EAAE,CAAC,GAAG,SAAS,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,IAAI,EAAE,CAAC,GAAG,SAAS,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,aAAa,CAAC,MAAM,SAAS,MAAM,IAC3C;IACE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,QAAQ,CAAC;IACb,OAAO,CAAC,EAAE,IAAI,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B,GACD;IACE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,QAAQ,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B,CAAC;AAEN,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc,CAAC,MAAM,SAAS,MAAM;IACnD,CAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACxD,MAAM,EAAE,CACN,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,KACtC,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7B,MAAM,EAAE,CACN,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,KACtC,OAAO,CAAC,cAAc,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,iBAAiB,CAAC,MAAM,SAAS,MAAM;IACtD,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IAC/B,UAAU,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAC9E,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB,CAAC,MAAM,SAAS,MAAM;IACvD,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;IAC7C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,KAAK,QAAQ,GAAG,YAAY,GAAG,OAAO,GAAG,KAAK,CAAC;AAE/C,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,eAAe,GAAG;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACpE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,MAAM,MAAM,aAAa,CAAC,EAAE,SAAS,YAAY,IAAI,YAAY,CAC/D,EAAE,EACF;IAAE,IAAI,CAAC,EAAE,QAAQ,CAAA;CAAE,CACpB,GAAG;IACF,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,KAAK,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;IACnD,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,WAAW,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACnC,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACpE,QAAQ,EAAE,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;IACrC,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,0BAA0B,CACzC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAEnC,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,yBAAyB,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAC5E,SAAQ,iBAAiB,CAAC,SAAS,CAAC;IACpC,cAAc,EAAE,CAAC,QAAQ,EAAE,SAAS,KAAK,IAAI,CAAC;IAC9C,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,SAAS,KAAK,IAAI,CAAC;IACrC,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,mBAAmB,CACjC,EAAE,SAAS,YAAY,EACvB,QAAQ,SAAS;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE;;;;;;;;;;;;;;4BA+oBpC,OAAO;wBAiMX,OAAO;2BA0FJ,MAAM;;;;;2BAwWN,SAAS;mCAwBD,SAAS;EA0GvC"}
|
|
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
|
-
|
|
290
|
-
|
|
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
|
|
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
|
-
|
|
323
|
-
|
|
331
|
+
applyUpdate(() => {
|
|
332
|
+
setValue(next);
|
|
333
|
+
setError(null);
|
|
334
|
+
});
|
|
324
335
|
}
|
|
325
336
|
catch (err) {
|
|
326
337
|
if (!isCurrent())
|
|
327
338
|
return;
|
|
328
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
517
|
-
|
|
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
|
-
|
|
627
|
+
const snapshotLastSyncAt = engine.getState().lastSyncAt;
|
|
536
628
|
const fingerprint = fingerprintCollectorRef.current.getCombined();
|
|
537
|
-
|
|
538
|
-
fingerprint === ''
|
|
629
|
+
const didFingerprintChange = fingerprint !== previousFingerprintRef.current ||
|
|
630
|
+
fingerprint === '';
|
|
631
|
+
if (didFingerprintChange) {
|
|
539
632
|
previousFingerprintRef.current = fingerprint;
|
|
540
|
-
setData(result);
|
|
541
633
|
}
|
|
542
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
563
|
-
const
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
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,
|
|
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
|
|
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
|
-
|
|
906
|
-
|
|
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
|
-
|
|
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,
|