@syncular/client-react 0.0.1-60
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 +222 -0
- package/dist/createSyncularReact.d.ts.map +1 -0
- package/dist/createSyncularReact.js +775 -0
- package/dist/createSyncularReact.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/package.json +72 -0
- package/src/__tests__/SyncEngine.test.ts +1332 -0
- package/src/__tests__/SyncProvider.strictmode.test.tsx +117 -0
- package/src/__tests__/fingerprint.test.ts +181 -0
- package/src/__tests__/hooks/useMutation.test.tsx +468 -0
- package/src/__tests__/hooks.test.tsx +384 -0
- package/src/__tests__/integration/conflict-resolution.test.ts +439 -0
- package/src/__tests__/integration/provider-reconfig.test.ts +279 -0
- package/src/__tests__/integration/push-flow.test.ts +321 -0
- package/src/__tests__/integration/realtime-sync.test.ts +222 -0
- package/src/__tests__/integration/self-conflict.test.ts +91 -0
- package/src/__tests__/integration/test-setup.ts +550 -0
- package/src/__tests__/integration/two-client-sync.test.ts +373 -0
- package/src/__tests__/setup.ts +7 -0
- package/src/__tests__/test-utils.ts +199 -0
- package/src/__tests__/useMutations.test.tsx +198 -0
- package/src/createSyncularReact.tsx +1346 -0
- package/src/index.ts +36 -0
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @syncular/client-react - Typed React factory
|
|
3
|
+
*
|
|
4
|
+
* Creates a SyncProvider + hooks that are typed to the application's DB schema.
|
|
5
|
+
*
|
|
6
|
+
* Usage:
|
|
7
|
+
* const syncular = createSyncularReact<MyDb>();
|
|
8
|
+
* const { SyncProvider, useSyncQuery } = syncular;
|
|
9
|
+
*/
|
|
10
|
+
import type { ClientTableRegistry, MutationReceipt, MutationsApi, SyncClientDb, SyncClientPlugin, SyncSubscriptionRequest, SyncTransport } from '@syncular/client';
|
|
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
|
+
import { type Kysely } from 'kysely';
|
|
13
|
+
import { type ReactNode } from 'react';
|
|
14
|
+
type ExecutableQuery<TResult> = {
|
|
15
|
+
execute: () => Promise<TResult>;
|
|
16
|
+
};
|
|
17
|
+
export interface SyncContextValue<DB extends SyncClientDb> {
|
|
18
|
+
engine: SyncEngine<DB>;
|
|
19
|
+
db: Kysely<DB>;
|
|
20
|
+
transport: SyncTransport;
|
|
21
|
+
shapes: ClientTableRegistry<DB>;
|
|
22
|
+
}
|
|
23
|
+
export interface SyncProviderProps<DB extends SyncClientDb> {
|
|
24
|
+
db: Kysely<DB>;
|
|
25
|
+
transport: SyncTransport;
|
|
26
|
+
shapes: ClientTableRegistry<DB>;
|
|
27
|
+
actorId?: string | null;
|
|
28
|
+
clientId?: string | null;
|
|
29
|
+
subscriptions?: Array<Omit<SyncSubscriptionRequest, 'cursor'>>;
|
|
30
|
+
limitCommits?: number;
|
|
31
|
+
limitSnapshotRows?: number;
|
|
32
|
+
maxSnapshotPages?: number;
|
|
33
|
+
stateId?: string;
|
|
34
|
+
pollIntervalMs?: number;
|
|
35
|
+
maxRetries?: number;
|
|
36
|
+
migrate?: (db: Kysely<DB>) => Promise<void>;
|
|
37
|
+
onMigrationError?: (error: Error) => void;
|
|
38
|
+
realtimeEnabled?: boolean;
|
|
39
|
+
realtimeFallbackPollMs?: number;
|
|
40
|
+
onError?: (error: SyncError) => void;
|
|
41
|
+
onConflict?: (conflict: ConflictInfo) => void;
|
|
42
|
+
onDataChange?: (scopes: string[]) => void;
|
|
43
|
+
plugins?: SyncClientPlugin[];
|
|
44
|
+
autoStart?: boolean;
|
|
45
|
+
renderWhileStarting?: boolean;
|
|
46
|
+
children: ReactNode;
|
|
47
|
+
}
|
|
48
|
+
export interface UseSyncEngineResult {
|
|
49
|
+
state: SyncEngineState;
|
|
50
|
+
sync: () => Promise<SyncResult>;
|
|
51
|
+
reconnect: () => void;
|
|
52
|
+
disconnect: () => void;
|
|
53
|
+
start: () => Promise<void>;
|
|
54
|
+
resetLocalState: () => void;
|
|
55
|
+
}
|
|
56
|
+
export interface SyncStatus {
|
|
57
|
+
enabled: boolean;
|
|
58
|
+
isOnline: boolean;
|
|
59
|
+
isSyncing: boolean;
|
|
60
|
+
lastSyncAt: number | null;
|
|
61
|
+
pendingCount: number;
|
|
62
|
+
error: SyncError | null;
|
|
63
|
+
isRetrying: boolean;
|
|
64
|
+
retryCount: number;
|
|
65
|
+
}
|
|
66
|
+
export interface UseSyncConnectionResult {
|
|
67
|
+
state: SyncConnectionState;
|
|
68
|
+
mode: SyncTransportMode;
|
|
69
|
+
isConnected: boolean;
|
|
70
|
+
isReconnecting: boolean;
|
|
71
|
+
reconnect: () => void;
|
|
72
|
+
disconnect: () => void;
|
|
73
|
+
}
|
|
74
|
+
export interface UseConflictsResult {
|
|
75
|
+
conflicts: ConflictInfo[];
|
|
76
|
+
count: number;
|
|
77
|
+
hasConflicts: boolean;
|
|
78
|
+
isLoading: boolean;
|
|
79
|
+
refresh: () => Promise<void>;
|
|
80
|
+
}
|
|
81
|
+
export type ConflictResolution = 'accept' | 'reject' | 'merge';
|
|
82
|
+
export interface UseResolveConflictResult {
|
|
83
|
+
resolve: (conflictId: string, resolution: ConflictResolution, mergedData?: Record<string, unknown>) => Promise<void>;
|
|
84
|
+
isPending: boolean;
|
|
85
|
+
error: Error | null;
|
|
86
|
+
reset: () => void;
|
|
87
|
+
}
|
|
88
|
+
export interface UseResolveConflictOptions {
|
|
89
|
+
onSuccess?: (conflictId: string) => void;
|
|
90
|
+
onError?: (error: Error) => void;
|
|
91
|
+
syncAfterResolve?: boolean;
|
|
92
|
+
}
|
|
93
|
+
export interface UseSyncQueryResult<T> {
|
|
94
|
+
data: T | undefined;
|
|
95
|
+
isLoading: boolean;
|
|
96
|
+
error: Error | null;
|
|
97
|
+
refetch: () => Promise<void>;
|
|
98
|
+
}
|
|
99
|
+
export interface UseSyncQueryOptions {
|
|
100
|
+
enabled?: boolean;
|
|
101
|
+
deps?: unknown[];
|
|
102
|
+
keyField?: string;
|
|
103
|
+
}
|
|
104
|
+
export interface UseQueryResult<T> {
|
|
105
|
+
data: T | undefined;
|
|
106
|
+
isLoading: boolean;
|
|
107
|
+
error: Error | null;
|
|
108
|
+
refetch: () => Promise<void>;
|
|
109
|
+
}
|
|
110
|
+
export interface UseQueryOptions {
|
|
111
|
+
enabled?: boolean;
|
|
112
|
+
deps?: unknown[];
|
|
113
|
+
keyField?: string;
|
|
114
|
+
}
|
|
115
|
+
export type MutationInput<TTable extends string> = {
|
|
116
|
+
table?: TTable;
|
|
117
|
+
rowId: string;
|
|
118
|
+
op: 'delete';
|
|
119
|
+
payload?: null;
|
|
120
|
+
baseVersion?: number | null;
|
|
121
|
+
} | {
|
|
122
|
+
table?: TTable;
|
|
123
|
+
rowId: string;
|
|
124
|
+
op: 'upsert';
|
|
125
|
+
payload?: Record<string, unknown> | null;
|
|
126
|
+
baseVersion?: number | null;
|
|
127
|
+
};
|
|
128
|
+
export interface MutationResult {
|
|
129
|
+
commitId: string;
|
|
130
|
+
clientCommitId: string;
|
|
131
|
+
}
|
|
132
|
+
export interface FluentMutation<TTable extends string> {
|
|
133
|
+
(input: MutationInput<TTable>): Promise<MutationResult>;
|
|
134
|
+
upsert: (rowId: string, payload: Record<string, unknown>, options?: {
|
|
135
|
+
baseVersion?: number | null;
|
|
136
|
+
}) => Promise<MutationResult>;
|
|
137
|
+
delete: (rowId: string, options?: {
|
|
138
|
+
baseVersion?: number | null;
|
|
139
|
+
}) => Promise<MutationResult>;
|
|
140
|
+
}
|
|
141
|
+
export interface UseMutationResult<TTable extends string> {
|
|
142
|
+
mutate: FluentMutation<TTable>;
|
|
143
|
+
mutateMany: (inputs: Array<MutationInput<TTable>>) => Promise<MutationResult>;
|
|
144
|
+
isPending: boolean;
|
|
145
|
+
error: Error | null;
|
|
146
|
+
reset: () => void;
|
|
147
|
+
}
|
|
148
|
+
export interface UseMutationOptions<TTable extends string> {
|
|
149
|
+
table: TTable;
|
|
150
|
+
syncImmediately?: boolean;
|
|
151
|
+
onSuccess?: (result: MutationResult) => void;
|
|
152
|
+
onError?: (error: Error) => void;
|
|
153
|
+
}
|
|
154
|
+
type SyncMode = 'background' | 'await' | false;
|
|
155
|
+
export interface UseMutationsOptions {
|
|
156
|
+
sync?: SyncMode;
|
|
157
|
+
versionColumn?: string | null;
|
|
158
|
+
onSuccess?: (result: MutationReceipt & {
|
|
159
|
+
opCount: number;
|
|
160
|
+
}) => void;
|
|
161
|
+
onError?: (error: Error) => void;
|
|
162
|
+
}
|
|
163
|
+
export type MutationsHook<DB extends SyncClientDb> = MutationsApi<DB, {
|
|
164
|
+
sync?: SyncMode;
|
|
165
|
+
}> & {
|
|
166
|
+
$isPending: boolean;
|
|
167
|
+
$error: Error | null;
|
|
168
|
+
$reset: () => void;
|
|
169
|
+
};
|
|
170
|
+
export interface OutboxCommit {
|
|
171
|
+
id: string;
|
|
172
|
+
clientCommitId: string;
|
|
173
|
+
status: 'pending' | 'sending' | 'acked' | 'failed';
|
|
174
|
+
operationsCount: number;
|
|
175
|
+
error: string | null;
|
|
176
|
+
createdAt: number;
|
|
177
|
+
updatedAt: number;
|
|
178
|
+
attemptCount: number;
|
|
179
|
+
}
|
|
180
|
+
export interface UseOutboxResult {
|
|
181
|
+
stats: OutboxStats;
|
|
182
|
+
pending: OutboxCommit[];
|
|
183
|
+
failed: OutboxCommit[];
|
|
184
|
+
hasUnsent: boolean;
|
|
185
|
+
isLoading: boolean;
|
|
186
|
+
refresh: () => Promise<void>;
|
|
187
|
+
clearFailed: () => Promise<number>;
|
|
188
|
+
clearAll: () => Promise<number>;
|
|
189
|
+
}
|
|
190
|
+
export interface UsePresenceResult<TMetadata = Record<string, unknown>> {
|
|
191
|
+
presence: PresenceEntry<TMetadata>[];
|
|
192
|
+
isLoading: boolean;
|
|
193
|
+
}
|
|
194
|
+
export interface UsePresenceWithJoinOptions<TMetadata = Record<string, unknown>> {
|
|
195
|
+
metadata?: TMetadata;
|
|
196
|
+
autoJoin?: boolean;
|
|
197
|
+
}
|
|
198
|
+
export interface UsePresenceWithJoinResult<TMetadata = Record<string, unknown>> extends UsePresenceResult<TMetadata> {
|
|
199
|
+
updateMetadata: (metadata: TMetadata) => void;
|
|
200
|
+
join: (metadata?: TMetadata) => void;
|
|
201
|
+
leave: () => void;
|
|
202
|
+
isJoined: boolean;
|
|
203
|
+
}
|
|
204
|
+
export declare function createSyncularReact<DB extends SyncClientDb>(): {
|
|
205
|
+
readonly SyncProvider: ({ db, transport, shapes, actorId, clientId, subscriptions, limitCommits, limitSnapshotRows, maxSnapshotPages, stateId, pollIntervalMs, maxRetries, migrate, onMigrationError, realtimeEnabled, realtimeFallbackPollMs, onError, onConflict, onDataChange, plugins, autoStart, renderWhileStarting, children, }: SyncProviderProps<DB>) => ReactNode;
|
|
206
|
+
readonly useSyncContext: () => SyncContextValue<DB>;
|
|
207
|
+
readonly useEngine: () => SyncEngine<DB>;
|
|
208
|
+
readonly useSyncEngine: () => UseSyncEngineResult;
|
|
209
|
+
readonly useSyncStatus: () => SyncStatus;
|
|
210
|
+
readonly useSyncConnection: () => UseSyncConnectionResult;
|
|
211
|
+
readonly useSyncQuery: <TResult>(queryFn: (ctx: QueryContext<DB>) => ExecutableQuery<TResult> | Promise<TResult>, options?: UseSyncQueryOptions) => UseSyncQueryResult<TResult>;
|
|
212
|
+
readonly useQuery: <TResult>(queryFn: (ctx: QueryContext<DB>) => ExecutableQuery<TResult> | Promise<TResult>, options?: UseQueryOptions) => UseQueryResult<TResult>;
|
|
213
|
+
readonly useMutation: <TTable extends keyof DB & string>(options: UseMutationOptions<TTable>) => UseMutationResult<TTable>;
|
|
214
|
+
readonly useMutations: (options?: UseMutationsOptions) => MutationsHook<DB>;
|
|
215
|
+
readonly useOutbox: () => UseOutboxResult;
|
|
216
|
+
readonly useConflicts: () => UseConflictsResult;
|
|
217
|
+
readonly useResolveConflict: (options?: UseResolveConflictOptions) => UseResolveConflictResult;
|
|
218
|
+
readonly usePresence: <TMetadata = Record<string, unknown>>(scopeKey: string) => UsePresenceResult<TMetadata>;
|
|
219
|
+
readonly usePresenceWithJoin: <TMetadata = Record<string, unknown>>(scopeKey: string, options?: UsePresenceWithJoinOptions<TMetadata>) => UsePresenceWithJoinResult<TMetadata>;
|
|
220
|
+
};
|
|
221
|
+
export {};
|
|
222
|
+
//# sourceMappingURL=createSyncularReact.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createSyncularReact.d.ts","sourceRoot":"","sources":["../src/createSyncularReact.tsx"],"names":[],"mappings":"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"}
|