@syncular/client 0.0.6-95 → 0.1.0
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/README.md +713 -11
- package/dist/auth-leases.d.ts +11 -0
- package/dist/auth-leases.d.ts.map +1 -0
- package/dist/auth-leases.js +140 -0
- package/dist/auth-leases.js.map +1 -0
- package/dist/blob-limits.d.ts +15 -0
- package/dist/blob-limits.d.ts.map +1 -0
- package/dist/blob-limits.js +66 -0
- package/dist/blob-limits.js.map +1 -0
- package/dist/bridge-client.d.ts +69 -0
- package/dist/bridge-client.d.ts.map +1 -0
- package/dist/bridge-client.js +282 -0
- package/dist/bridge-client.js.map +1 -0
- package/dist/client-config.d.ts +6 -0
- package/dist/client-config.d.ts.map +1 -0
- package/dist/client-config.js +18 -0
- package/dist/client-config.js.map +1 -0
- package/dist/client.d.ts +65 -397
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +150 -960
- package/dist/client.js.map +1 -1
- package/dist/command-history.d.ts +35 -0
- package/dist/command-history.d.ts.map +1 -0
- package/dist/command-history.js +378 -0
- package/dist/command-history.js.map +1 -0
- package/dist/console-diagnostics.d.ts +33 -0
- package/dist/console-diagnostics.d.ts.map +1 -0
- package/dist/console-diagnostics.js +496 -0
- package/dist/console-diagnostics.js.map +1 -0
- package/dist/crdt-yjs/index.d.ts +4 -0
- package/dist/crdt-yjs/index.d.ts.map +1 -0
- package/dist/crdt-yjs/index.js +4 -0
- package/dist/crdt-yjs/index.js.map +1 -0
- package/dist/crdt-yjs/webview-host-facade.d.ts +126 -0
- package/dist/crdt-yjs/webview-host-facade.d.ts.map +1 -0
- package/dist/crdt-yjs/webview-host-facade.js +284 -0
- package/dist/crdt-yjs/webview-host-facade.js.map +1 -0
- package/dist/crdt-yjs/yjs-document-field-adapter.d.ts +153 -0
- package/dist/crdt-yjs/yjs-document-field-adapter.d.ts.map +1 -0
- package/dist/crdt-yjs/yjs-document-field-adapter.js +406 -0
- package/dist/crdt-yjs/yjs-document-field-adapter.js.map +1 -0
- package/dist/crdt-yjs/yjs-prosemirror-bridge.d.ts +73 -0
- package/dist/crdt-yjs/yjs-prosemirror-bridge.d.ts.map +1 -0
- package/dist/crdt-yjs/yjs-prosemirror-bridge.js +169 -0
- package/dist/crdt-yjs/yjs-prosemirror-bridge.js.map +1 -0
- package/dist/database.d.ts +83 -0
- package/dist/database.d.ts.map +1 -0
- package/dist/database.js +916 -0
- package/dist/database.js.map +1 -0
- package/dist/diagnostics.d.ts +10 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +83 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/errors.d.ts +24 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +211 -0
- package/dist/errors.js.map +1 -0
- package/dist/generated-bridge.d.ts +365 -0
- package/dist/generated-bridge.d.ts.map +1 -0
- package/dist/generated-bridge.js +250 -0
- package/dist/generated-bridge.js.map +1 -0
- package/dist/index.d.ts +13 -23
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -25
- package/dist/index.js.map +1 -1
- package/dist/mutations.d.ts +4 -72
- package/dist/mutations.d.ts.map +1 -1
- package/dist/mutations.js +2 -568
- package/dist/mutations.js.map +1 -1
- package/dist/network.d.ts +3 -0
- package/dist/network.d.ts.map +1 -0
- package/dist/network.js +17 -0
- package/dist/network.js.map +1 -0
- package/dist/react/index.d.ts +169 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +628 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react-native/index.d.ts +35 -0
- package/dist/react-native/index.d.ts.map +1 -0
- package/dist/react-native/index.js +49 -0
- package/dist/react-native/index.js.map +1 -0
- package/dist/runtime-contract.d.ts +13 -0
- package/dist/runtime-contract.d.ts.map +1 -0
- package/dist/runtime-contract.js +24 -0
- package/dist/runtime-contract.js.map +1 -0
- package/dist/rust-client.d.ts +106 -0
- package/dist/rust-client.d.ts.map +1 -0
- package/dist/rust-client.js +936 -0
- package/dist/rust-client.js.map +1 -0
- package/dist/sentry.d.ts +35 -0
- package/dist/sentry.d.ts.map +1 -0
- package/dist/sentry.js +155 -0
- package/dist/sentry.js.map +1 -0
- package/dist/sql-safety.d.ts +3 -0
- package/dist/sql-safety.d.ts.map +1 -0
- package/dist/sql-safety.js +62 -0
- package/dist/sql-safety.js.map +1 -0
- package/dist/syncular-runtime-artifacts.json +61 -0
- package/dist/tauri/index.d.ts +35 -0
- package/dist/tauri/index.d.ts.map +1 -0
- package/dist/tauri/index.js +114 -0
- package/dist/tauri/index.js.map +1 -0
- package/dist/types.d.ts +1059 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/wasm/.syncular-wasm-profile +1 -0
- package/dist/wasm/syncular-runtime-artifact.json +21 -0
- package/dist/wasm/syncular.d.ts +207 -0
- package/dist/wasm/syncular.js +2341 -0
- package/dist/wasm/syncular_bg.wasm +0 -0
- package/dist/wasm/syncular_bg.wasm.d.ts +97 -0
- package/dist/wasm-bindings/runtime-contract.d.ts +22 -0
- package/dist/wasm-bindings/runtime-contract.d.ts.map +1 -0
- package/dist/wasm-bindings/runtime-contract.js +112 -0
- package/dist/wasm-bindings/runtime-contract.js.map +1 -0
- package/dist/wasm-core/.syncular-wasm-profile +1 -0
- package/dist/wasm-core/syncular-runtime-artifact.json +17 -0
- package/dist/wasm-core/syncular.d.ts +162 -0
- package/dist/wasm-core/syncular.js +1847 -0
- package/dist/wasm-core/syncular_bg.wasm +0 -0
- package/dist/wasm-core/syncular_bg.wasm.d.ts +77 -0
- package/dist/wasm-perf/.syncular-wasm-profile +1 -0
- package/dist/wasm-perf/syncular-runtime-artifact.json +21 -0
- package/dist/wasm-perf/syncular.d.ts +207 -0
- package/dist/wasm-perf/syncular.js +2341 -0
- package/dist/wasm-perf/syncular_bg.wasm +0 -0
- package/dist/wasm-perf/syncular_bg.wasm.d.ts +97 -0
- package/dist/wasm-runtime.d.ts +18 -0
- package/dist/wasm-runtime.d.ts.map +1 -0
- package/dist/wasm-runtime.js +28 -0
- package/dist/wasm-runtime.js.map +1 -0
- package/dist/worker-client.d.ts +123 -0
- package/dist/worker-client.d.ts.map +1 -0
- package/dist/worker-client.js +1686 -0
- package/dist/worker-client.js.map +1 -0
- package/dist/worker-entry.d.ts +2 -0
- package/dist/worker-entry.d.ts.map +1 -0
- package/dist/worker-entry.js +479 -0
- package/dist/worker-entry.js.map +1 -0
- package/dist/worker-protocol.d.ts +64 -0
- package/dist/worker-protocol.d.ts.map +1 -0
- package/dist/worker-protocol.js +16 -0
- package/dist/worker-protocol.js.map +1 -0
- package/dist/worker-realtime.d.ts +39 -0
- package/dist/worker-realtime.d.ts.map +1 -0
- package/dist/worker-realtime.js +677 -0
- package/dist/worker-realtime.js.map +1 -0
- package/package.json +124 -17
- package/src/auth-leases.ts +251 -0
- package/src/blob-limits.ts +98 -0
- package/src/bridge-client.ts +512 -0
- package/src/client-config.ts +29 -0
- package/src/client.ts +256 -1414
- package/src/command-history.ts +623 -0
- package/src/console-diagnostics.ts +617 -0
- package/src/crdt-yjs/index.ts +3 -0
- package/src/crdt-yjs/webview-host-facade.ts +477 -0
- package/src/crdt-yjs/yjs-document-field-adapter.ts +733 -0
- package/src/crdt-yjs/yjs-prosemirror-bridge.ts +272 -0
- package/src/database.ts +1342 -0
- package/src/diagnostics.ts +116 -0
- package/src/errors.ts +269 -0
- package/src/generated-bridge.ts +741 -0
- package/src/index.ts +21 -25
- package/src/mutations.ts +12 -821
- package/src/network.ts +32 -0
- package/src/react/index.ts +1036 -0
- package/src/react-native/index.ts +152 -0
- package/src/runtime-contract.ts +48 -0
- package/src/rust-client.ts +1488 -0
- package/src/sentry.ts +215 -0
- package/src/sql-safety.ts +61 -0
- package/src/tauri/index.ts +211 -0
- package/src/types.ts +1356 -0
- package/src/wasm-bindings/generated-wasm-bindings.d.ts +70 -0
- package/src/wasm-bindings/runtime-contract.ts +158 -0
- package/src/wasm-runtime.ts +76 -0
- package/src/worker-client.ts +2215 -0
- package/src/worker-entry.ts +584 -0
- package/src/worker-protocol.ts +109 -0
- package/src/worker-realtime.ts +843 -0
- package/dist/blobs/index.d.ts +0 -7
- package/dist/blobs/index.d.ts.map +0 -1
- package/dist/blobs/index.js +0 -7
- package/dist/blobs/index.js.map +0 -1
- package/dist/blobs/manager.d.ts +0 -345
- package/dist/blobs/manager.d.ts.map +0 -1
- package/dist/blobs/manager.js +0 -749
- package/dist/blobs/manager.js.map +0 -1
- package/dist/blobs/migrate.d.ts +0 -14
- package/dist/blobs/migrate.d.ts.map +0 -1
- package/dist/blobs/migrate.js +0 -59
- package/dist/blobs/migrate.js.map +0 -1
- package/dist/blobs/types.d.ts +0 -62
- package/dist/blobs/types.d.ts.map +0 -1
- package/dist/blobs/types.js +0 -5
- package/dist/blobs/types.js.map +0 -1
- package/dist/conflicts.d.ts +0 -31
- package/dist/conflicts.d.ts.map +0 -1
- package/dist/conflicts.js +0 -112
- package/dist/conflicts.js.map +0 -1
- package/dist/create-client.d.ts +0 -118
- package/dist/create-client.d.ts.map +0 -1
- package/dist/create-client.js +0 -178
- package/dist/create-client.js.map +0 -1
- package/dist/engine/SyncEngine.d.ts +0 -272
- package/dist/engine/SyncEngine.d.ts.map +0 -1
- package/dist/engine/SyncEngine.js +0 -1860
- package/dist/engine/SyncEngine.js.map +0 -1
- package/dist/engine/index.d.ts +0 -6
- package/dist/engine/index.d.ts.map +0 -1
- package/dist/engine/index.js +0 -6
- package/dist/engine/index.js.map +0 -1
- package/dist/engine/types.d.ts +0 -345
- package/dist/engine/types.d.ts.map +0 -1
- package/dist/engine/types.js +0 -7
- package/dist/engine/types.js.map +0 -1
- package/dist/handlers/collection.d.ts +0 -6
- package/dist/handlers/collection.d.ts.map +0 -1
- package/dist/handlers/collection.js +0 -21
- package/dist/handlers/collection.js.map +0 -1
- package/dist/handlers/create-handler.d.ts +0 -120
- package/dist/handlers/create-handler.d.ts.map +0 -1
- package/dist/handlers/create-handler.js +0 -145
- package/dist/handlers/create-handler.js.map +0 -1
- package/dist/handlers/types.d.ts +0 -83
- package/dist/handlers/types.d.ts.map +0 -1
- package/dist/handlers/types.js +0 -5
- package/dist/handlers/types.js.map +0 -1
- package/dist/migrate.d.ts +0 -19
- package/dist/migrate.d.ts.map +0 -1
- package/dist/migrate.js +0 -238
- package/dist/migrate.js.map +0 -1
- package/dist/outbox.d.ts +0 -112
- package/dist/outbox.d.ts.map +0 -1
- package/dist/outbox.js +0 -294
- package/dist/outbox.js.map +0 -1
- package/dist/plugins/incrementing-version.d.ts +0 -34
- package/dist/plugins/incrementing-version.d.ts.map +0 -1
- package/dist/plugins/incrementing-version.js +0 -83
- package/dist/plugins/incrementing-version.js.map +0 -1
- package/dist/plugins/index.d.ts +0 -3
- package/dist/plugins/index.d.ts.map +0 -1
- package/dist/plugins/index.js +0 -3
- package/dist/plugins/index.js.map +0 -1
- package/dist/plugins/types.d.ts +0 -49
- package/dist/plugins/types.d.ts.map +0 -1
- package/dist/plugins/types.js +0 -15
- package/dist/plugins/types.js.map +0 -1
- package/dist/proxy/connection.d.ts +0 -33
- package/dist/proxy/connection.d.ts.map +0 -1
- package/dist/proxy/connection.js +0 -153
- package/dist/proxy/connection.js.map +0 -1
- package/dist/proxy/dialect.d.ts +0 -46
- package/dist/proxy/dialect.d.ts.map +0 -1
- package/dist/proxy/dialect.js +0 -58
- package/dist/proxy/dialect.js.map +0 -1
- package/dist/proxy/driver.d.ts +0 -42
- package/dist/proxy/driver.d.ts.map +0 -1
- package/dist/proxy/driver.js +0 -78
- package/dist/proxy/driver.js.map +0 -1
- package/dist/proxy/index.d.ts +0 -10
- package/dist/proxy/index.d.ts.map +0 -1
- package/dist/proxy/index.js +0 -10
- package/dist/proxy/index.js.map +0 -1
- package/dist/proxy/mutations.d.ts +0 -9
- package/dist/proxy/mutations.d.ts.map +0 -1
- package/dist/proxy/mutations.js +0 -11
- package/dist/proxy/mutations.js.map +0 -1
- package/dist/pull-engine.d.ts +0 -48
- package/dist/pull-engine.d.ts.map +0 -1
- package/dist/pull-engine.js +0 -648
- package/dist/pull-engine.js.map +0 -1
- package/dist/push-engine.d.ts +0 -18
- package/dist/push-engine.d.ts.map +0 -1
- package/dist/push-engine.js +0 -167
- package/dist/push-engine.js.map +0 -1
- package/dist/query/FingerprintCollector.d.ts +0 -18
- package/dist/query/FingerprintCollector.d.ts.map +0 -1
- package/dist/query/FingerprintCollector.js +0 -28
- package/dist/query/FingerprintCollector.js.map +0 -1
- package/dist/query/QueryContext.d.ts +0 -33
- package/dist/query/QueryContext.d.ts.map +0 -1
- package/dist/query/QueryContext.js +0 -16
- package/dist/query/QueryContext.js.map +0 -1
- package/dist/query/fingerprint.d.ts +0 -61
- package/dist/query/fingerprint.d.ts.map +0 -1
- package/dist/query/fingerprint.js +0 -91
- package/dist/query/fingerprint.js.map +0 -1
- package/dist/query/index.d.ts +0 -7
- package/dist/query/index.d.ts.map +0 -1
- package/dist/query/index.js +0 -7
- package/dist/query/index.js.map +0 -1
- package/dist/query/tracked-select.d.ts +0 -18
- package/dist/query/tracked-select.d.ts.map +0 -1
- package/dist/query/tracked-select.js +0 -90
- package/dist/query/tracked-select.js.map +0 -1
- package/dist/schema.d.ts +0 -83
- package/dist/schema.d.ts.map +0 -1
- package/dist/schema.js +0 -7
- package/dist/schema.js.map +0 -1
- package/dist/subscription-state.d.ts +0 -46
- package/dist/subscription-state.d.ts.map +0 -1
- package/dist/subscription-state.js +0 -185
- package/dist/subscription-state.js.map +0 -1
- package/dist/sync-loop.d.ts +0 -34
- package/dist/sync-loop.d.ts.map +0 -1
- package/dist/sync-loop.js +0 -253
- package/dist/sync-loop.js.map +0 -1
- package/dist/sync.d.ts +0 -32
- package/dist/sync.d.ts.map +0 -1
- package/dist/sync.js +0 -55
- package/dist/sync.js.map +0 -1
- package/dist/utils/id.d.ts +0 -17
- package/dist/utils/id.d.ts.map +0 -1
- package/dist/utils/id.js +0 -46
- package/dist/utils/id.js.map +0 -1
- package/src/blobs/index.ts +0 -7
- package/src/blobs/manager.ts +0 -1027
- package/src/blobs/migrate.ts +0 -67
- package/src/blobs/types.ts +0 -84
- package/src/client.test.ts +0 -417
- package/src/conflicts.ts +0 -171
- package/src/create-client.test.ts +0 -83
- package/src/create-client.ts +0 -330
- package/src/engine/SyncEngine.test.ts +0 -254
- package/src/engine/SyncEngine.ts +0 -2375
- package/src/engine/index.ts +0 -6
- package/src/engine/types.ts +0 -419
- package/src/handlers/collection.ts +0 -36
- package/src/handlers/create-handler.ts +0 -330
- package/src/handlers/types.ts +0 -108
- package/src/migrate.ts +0 -318
- package/src/outbox.ts +0 -383
- package/src/plugins/incrementing-version.ts +0 -133
- package/src/plugins/index.ts +0 -2
- package/src/plugins/types.ts +0 -63
- package/src/proxy/connection.ts +0 -191
- package/src/proxy/dialect.ts +0 -76
- package/src/proxy/driver.ts +0 -126
- package/src/proxy/index.ts +0 -10
- package/src/proxy/mutations.ts +0 -18
- package/src/pull-engine.test.ts +0 -151
- package/src/pull-engine.ts +0 -855
- package/src/push-engine.ts +0 -216
- package/src/query/FingerprintCollector.ts +0 -29
- package/src/query/QueryContext.ts +0 -54
- package/src/query/fingerprint.ts +0 -109
- package/src/query/index.ts +0 -10
- package/src/query/tracked-select.ts +0 -139
- package/src/schema.ts +0 -94
- package/src/subscription-state.ts +0 -259
- package/src/sync-loop.ts +0 -379
- package/src/sync.ts +0 -170
- package/src/utils/id.ts +0 -55
package/src/engine/index.ts
DELETED
package/src/engine/types.ts
DELETED
|
@@ -1,419 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @syncular/client - Sync engine types
|
|
3
|
-
*
|
|
4
|
-
* Framework-agnostic types for the sync engine.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import type {
|
|
8
|
-
SyncPullResponse,
|
|
9
|
-
SyncPushRequest,
|
|
10
|
-
SyncPushResponse,
|
|
11
|
-
SyncSubscriptionRequest,
|
|
12
|
-
SyncTransport,
|
|
13
|
-
} from '@syncular/core';
|
|
14
|
-
import type { Kysely } from 'kysely';
|
|
15
|
-
import type { ClientHandlerCollection } from '../handlers/collection';
|
|
16
|
-
import type { SyncClientPlugin } from '../plugins/types';
|
|
17
|
-
import type { SyncClientDb } from '../schema';
|
|
18
|
-
import type { SubscriptionState } from '../subscription-state';
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Connection state for the sync engine
|
|
22
|
-
*/
|
|
23
|
-
export type SyncConnectionState =
|
|
24
|
-
| 'disconnected'
|
|
25
|
-
| 'connecting'
|
|
26
|
-
| 'connected'
|
|
27
|
-
| 'reconnecting';
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Transport mode (detected or configured)
|
|
31
|
-
*/
|
|
32
|
-
export type SyncTransportMode = 'polling' | 'realtime';
|
|
33
|
-
|
|
34
|
-
export type TransportFallbackReason = 'network' | 'auth' | 'server' | 'manual';
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Sync engine state
|
|
38
|
-
*/
|
|
39
|
-
export interface SyncEngineState {
|
|
40
|
-
/** Whether sync is enabled */
|
|
41
|
-
enabled: boolean;
|
|
42
|
-
/** Whether currently syncing */
|
|
43
|
-
isSyncing: boolean;
|
|
44
|
-
/** Current connection state */
|
|
45
|
-
connectionState: SyncConnectionState;
|
|
46
|
-
/** Transport mode */
|
|
47
|
-
transportMode: SyncTransportMode;
|
|
48
|
-
/** Last successful sync timestamp */
|
|
49
|
-
lastSyncAt: number | null;
|
|
50
|
-
/** Last error (cleared on successful sync) */
|
|
51
|
-
error: SyncError | null;
|
|
52
|
-
/** Number of pending outbox commits */
|
|
53
|
-
pendingCount: number;
|
|
54
|
-
/** Number of sync retries (reset on success) */
|
|
55
|
-
retryCount: number;
|
|
56
|
-
/** Whether currently retrying */
|
|
57
|
-
isRetrying: boolean;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export interface TransportHealth {
|
|
61
|
-
mode: 'realtime' | 'polling' | 'disconnected';
|
|
62
|
-
connected: boolean;
|
|
63
|
-
lastSuccessfulPollAt: number | null;
|
|
64
|
-
lastRealtimeMessageAt: number | null;
|
|
65
|
-
fallbackReason: TransportFallbackReason | null;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
export type SubscriptionProgressPhase =
|
|
69
|
-
| 'idle'
|
|
70
|
-
| 'bootstrapping'
|
|
71
|
-
| 'catching_up'
|
|
72
|
-
| 'live'
|
|
73
|
-
| 'error';
|
|
74
|
-
|
|
75
|
-
export type SyncChannelPhase =
|
|
76
|
-
| 'idle'
|
|
77
|
-
| 'starting'
|
|
78
|
-
| 'bootstrapping'
|
|
79
|
-
| 'catching_up'
|
|
80
|
-
| 'live'
|
|
81
|
-
| 'error';
|
|
82
|
-
|
|
83
|
-
export interface SubscriptionProgress {
|
|
84
|
-
stateId: string;
|
|
85
|
-
id: string;
|
|
86
|
-
table?: string;
|
|
87
|
-
phase: SubscriptionProgressPhase;
|
|
88
|
-
progressPercent: number;
|
|
89
|
-
rowsProcessed?: number;
|
|
90
|
-
rowsTotal?: number;
|
|
91
|
-
tablesProcessed?: number;
|
|
92
|
-
tablesTotal?: number;
|
|
93
|
-
startedAt?: number;
|
|
94
|
-
completedAt?: number;
|
|
95
|
-
lastErrorCode?: string;
|
|
96
|
-
lastErrorMessage?: string;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
export interface SyncProgress {
|
|
100
|
-
channelPhase: SyncChannelPhase;
|
|
101
|
-
progressPercent: number;
|
|
102
|
-
subscriptions: SubscriptionProgress[];
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* Sync error with context
|
|
107
|
-
*/
|
|
108
|
-
export interface SyncError {
|
|
109
|
-
/** Error code */
|
|
110
|
-
code:
|
|
111
|
-
| 'NETWORK_ERROR'
|
|
112
|
-
| 'AUTH_FAILED'
|
|
113
|
-
| 'SNAPSHOT_CHUNK_NOT_FOUND'
|
|
114
|
-
| 'MIGRATION_FAILED'
|
|
115
|
-
| 'CONFLICT'
|
|
116
|
-
| 'SYNC_ERROR'
|
|
117
|
-
| 'UNKNOWN';
|
|
118
|
-
/** Error message */
|
|
119
|
-
message: string;
|
|
120
|
-
/** Original error if available */
|
|
121
|
-
cause?: Error;
|
|
122
|
-
/** Timestamp when error occurred */
|
|
123
|
-
timestamp: number;
|
|
124
|
-
/** Whether retrying this error is expected to succeed */
|
|
125
|
-
retryable: boolean;
|
|
126
|
-
/** HTTP status code when available */
|
|
127
|
-
httpStatus?: number;
|
|
128
|
-
/** Related subscription id when available */
|
|
129
|
-
subscriptionId?: string;
|
|
130
|
-
/** Related state id when available */
|
|
131
|
-
stateId?: string;
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* Sync event types
|
|
136
|
-
*/
|
|
137
|
-
export type SyncEventType =
|
|
138
|
-
| 'state:change'
|
|
139
|
-
| 'sync:start'
|
|
140
|
-
| 'sync:complete'
|
|
141
|
-
| 'sync:live'
|
|
142
|
-
| 'sync:error'
|
|
143
|
-
| 'bootstrap:start'
|
|
144
|
-
| 'bootstrap:progress'
|
|
145
|
-
| 'bootstrap:complete'
|
|
146
|
-
| 'connection:change'
|
|
147
|
-
| 'outbox:change'
|
|
148
|
-
| 'data:change'
|
|
149
|
-
| 'presence:change';
|
|
150
|
-
|
|
151
|
-
/**
|
|
152
|
-
* Presence entry for a client connected to a scope
|
|
153
|
-
*/
|
|
154
|
-
export interface PresenceEntry<TMetadata = Record<string, unknown>> {
|
|
155
|
-
clientId: string;
|
|
156
|
-
actorId: string;
|
|
157
|
-
joinedAt: number;
|
|
158
|
-
metadata?: TMetadata;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
/**
|
|
162
|
-
* Sync event payloads
|
|
163
|
-
*/
|
|
164
|
-
export interface SyncEventPayloads {
|
|
165
|
-
'state:change': Record<string, never>;
|
|
166
|
-
'sync:start': { timestamp: number };
|
|
167
|
-
'sync:complete': {
|
|
168
|
-
timestamp: number;
|
|
169
|
-
pushedCommits: number;
|
|
170
|
-
pullRounds: number;
|
|
171
|
-
pullResponse: SyncPullResponse;
|
|
172
|
-
};
|
|
173
|
-
'sync:live': { timestamp: number };
|
|
174
|
-
'sync:error': SyncError;
|
|
175
|
-
'bootstrap:start': {
|
|
176
|
-
timestamp: number;
|
|
177
|
-
stateId: string;
|
|
178
|
-
subscriptionId: string;
|
|
179
|
-
};
|
|
180
|
-
'bootstrap:progress': {
|
|
181
|
-
timestamp: number;
|
|
182
|
-
stateId: string;
|
|
183
|
-
subscriptionId: string;
|
|
184
|
-
progress: SubscriptionProgress;
|
|
185
|
-
};
|
|
186
|
-
'bootstrap:complete': {
|
|
187
|
-
timestamp: number;
|
|
188
|
-
stateId: string;
|
|
189
|
-
subscriptionId: string;
|
|
190
|
-
durationMs: number;
|
|
191
|
-
};
|
|
192
|
-
'connection:change': {
|
|
193
|
-
previous: SyncConnectionState;
|
|
194
|
-
current: SyncConnectionState;
|
|
195
|
-
};
|
|
196
|
-
'outbox:change': {
|
|
197
|
-
pendingCount: number;
|
|
198
|
-
sendingCount: number;
|
|
199
|
-
failedCount: number;
|
|
200
|
-
ackedCount: number;
|
|
201
|
-
};
|
|
202
|
-
'data:change': {
|
|
203
|
-
scopes: string[];
|
|
204
|
-
timestamp: number;
|
|
205
|
-
};
|
|
206
|
-
'presence:change': {
|
|
207
|
-
scopeKey: string;
|
|
208
|
-
presence: PresenceEntry[];
|
|
209
|
-
};
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
/**
|
|
213
|
-
* Sync event listener
|
|
214
|
-
*/
|
|
215
|
-
export type SyncEventListener<T extends SyncEventType> = (
|
|
216
|
-
payload: SyncEventPayloads[T]
|
|
217
|
-
) => void;
|
|
218
|
-
|
|
219
|
-
/**
|
|
220
|
-
* Sync engine configuration
|
|
221
|
-
*/
|
|
222
|
-
export interface SyncEngineConfig<DB extends SyncClientDb = SyncClientDb> {
|
|
223
|
-
/** Database instance */
|
|
224
|
-
db: Kysely<DB>;
|
|
225
|
-
/** Sync transport */
|
|
226
|
-
transport: SyncTransport;
|
|
227
|
-
/** Client table handler registry */
|
|
228
|
-
handlers: ClientHandlerCollection<DB>;
|
|
229
|
-
/** Actor id for sync scoping (null/undefined disables sync) */
|
|
230
|
-
actorId: string | null | undefined;
|
|
231
|
-
/** Stable device/app installation id */
|
|
232
|
-
clientId: string | null | undefined;
|
|
233
|
-
/** Subscriptions for partial sync */
|
|
234
|
-
subscriptions: Array<Omit<SyncSubscriptionRequest, 'cursor'>>;
|
|
235
|
-
/** Pull limit (commit count per request) */
|
|
236
|
-
limitCommits?: number;
|
|
237
|
-
/** Bootstrap snapshot rows per page */
|
|
238
|
-
limitSnapshotRows?: number;
|
|
239
|
-
/** Bootstrap snapshot pages per pull */
|
|
240
|
-
maxSnapshotPages?: number;
|
|
241
|
-
/** Optional state row id (multi-profile support) */
|
|
242
|
-
stateId?: string;
|
|
243
|
-
/** Poll interval in milliseconds (polling mode) */
|
|
244
|
-
pollIntervalMs?: number;
|
|
245
|
-
/** Max retries before giving up */
|
|
246
|
-
maxRetries?: number;
|
|
247
|
-
/** Optional app migration to run before sync schema migration. */
|
|
248
|
-
migrate?: (db: Kysely<DB>) => Promise<void>;
|
|
249
|
-
/** Called when migration fails. Receives the error. */
|
|
250
|
-
onMigrationError?: (error: Error) => void;
|
|
251
|
-
/**
|
|
252
|
-
* Enable realtime mode (WebSocket wake-ups).
|
|
253
|
-
* Default behavior is auto-enable when transport supports realtime.
|
|
254
|
-
* Set to false to force polling.
|
|
255
|
-
*/
|
|
256
|
-
realtimeEnabled?: boolean;
|
|
257
|
-
/** Fallback poll interval when realtime reconnecting */
|
|
258
|
-
realtimeFallbackPollMs?: number;
|
|
259
|
-
/** Error callback */
|
|
260
|
-
onError?: (error: SyncError) => void;
|
|
261
|
-
/** Conflict callback */
|
|
262
|
-
onConflict?: (conflict: ConflictInfo) => void;
|
|
263
|
-
/** Data change callback */
|
|
264
|
-
onDataChange?: (scopes: string[]) => void;
|
|
265
|
-
/** Optional client plugins (e.g. encryption) */
|
|
266
|
-
plugins?: SyncClientPlugin[];
|
|
267
|
-
/** Custom SHA-256 hash function (for platforms without crypto.subtle, e.g. React Native) */
|
|
268
|
-
sha256?: (bytes: Uint8Array) => Promise<string>;
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
/**
|
|
272
|
-
* Conflict information for callback
|
|
273
|
-
*/
|
|
274
|
-
export interface ConflictInfo {
|
|
275
|
-
id: string;
|
|
276
|
-
outboxCommitId: string;
|
|
277
|
-
clientCommitId: string;
|
|
278
|
-
opIndex: number;
|
|
279
|
-
resultStatus: 'conflict' | 'error';
|
|
280
|
-
message: string;
|
|
281
|
-
code: string | null;
|
|
282
|
-
serverVersion: number | null;
|
|
283
|
-
serverRowJson: string | null;
|
|
284
|
-
createdAt: number;
|
|
285
|
-
/** Table name from the conflicting operation */
|
|
286
|
-
table: string;
|
|
287
|
-
/** Row ID from the conflicting operation */
|
|
288
|
-
rowId: string;
|
|
289
|
-
/** Local payload that was rejected (extracted from outbox) */
|
|
290
|
-
localPayload: Record<string, unknown> | null;
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
/**
|
|
294
|
-
* Realtime transport interface (duck-typed from transport)
|
|
295
|
-
*/
|
|
296
|
-
export interface RealtimeTransportLike extends SyncTransport {
|
|
297
|
-
connect(
|
|
298
|
-
args: { clientId: string },
|
|
299
|
-
onEvent: (event: {
|
|
300
|
-
event: string;
|
|
301
|
-
data: {
|
|
302
|
-
cursor?: number;
|
|
303
|
-
changes?: unknown[];
|
|
304
|
-
error?: string;
|
|
305
|
-
timestamp: number;
|
|
306
|
-
};
|
|
307
|
-
}) => void,
|
|
308
|
-
onStateChange?: (state: 'disconnected' | 'connecting' | 'connected') => void
|
|
309
|
-
): () => void;
|
|
310
|
-
getConnectionState(): 'disconnected' | 'connecting' | 'connected';
|
|
311
|
-
reconnect(): void;
|
|
312
|
-
sendPresenceJoin?(scopeKey: string, metadata?: Record<string, unknown>): void;
|
|
313
|
-
sendPresenceLeave?(scopeKey: string): void;
|
|
314
|
-
sendPresenceUpdate?(
|
|
315
|
-
scopeKey: string,
|
|
316
|
-
metadata: Record<string, unknown>
|
|
317
|
-
): void;
|
|
318
|
-
onPresenceEvent?(
|
|
319
|
-
callback: (event: {
|
|
320
|
-
action: 'join' | 'leave' | 'update' | 'snapshot';
|
|
321
|
-
scopeKey: string;
|
|
322
|
-
clientId?: string;
|
|
323
|
-
actorId?: string;
|
|
324
|
-
metadata?: Record<string, unknown>;
|
|
325
|
-
entries?: PresenceEntry[];
|
|
326
|
-
}) => void
|
|
327
|
-
): () => void;
|
|
328
|
-
/**
|
|
329
|
-
* Push a commit via WebSocket (bypasses HTTP).
|
|
330
|
-
* Returns `null` if WS is not connected or times out (caller should fall back to HTTP).
|
|
331
|
-
*/
|
|
332
|
-
pushViaWs?(request: SyncPushRequest): Promise<SyncPushResponse | null>;
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
/**
|
|
336
|
-
* Sync result from a single sync cycle
|
|
337
|
-
*/
|
|
338
|
-
export interface SyncResult {
|
|
339
|
-
success: boolean;
|
|
340
|
-
pushedCommits: number;
|
|
341
|
-
pullRounds: number;
|
|
342
|
-
pullResponse: SyncPullResponse;
|
|
343
|
-
error?: SyncError;
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
/**
|
|
347
|
-
* Outbox statistics
|
|
348
|
-
*/
|
|
349
|
-
export interface OutboxStats {
|
|
350
|
-
pending: number;
|
|
351
|
-
sending: number;
|
|
352
|
-
failed: number;
|
|
353
|
-
acked: number;
|
|
354
|
-
total: number;
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
export type SyncResetScope = 'state' | 'subscription' | 'all';
|
|
358
|
-
|
|
359
|
-
export interface SyncResetOptions {
|
|
360
|
-
scope: SyncResetScope;
|
|
361
|
-
stateId?: string;
|
|
362
|
-
subscriptionIds?: string[];
|
|
363
|
-
clearOutbox?: boolean;
|
|
364
|
-
clearConflicts?: boolean;
|
|
365
|
-
clearSyncedTables?: boolean;
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
export interface SyncResetResult {
|
|
369
|
-
deletedSubscriptionStates: number;
|
|
370
|
-
deletedOutboxCommits: number;
|
|
371
|
-
deletedConflicts: number;
|
|
372
|
-
clearedTables: string[];
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
export interface SyncRepairOptions {
|
|
376
|
-
mode: 'rebootstrap-missing-chunks';
|
|
377
|
-
stateId?: string;
|
|
378
|
-
subscriptionIds?: string[];
|
|
379
|
-
clearOutbox?: boolean;
|
|
380
|
-
clearConflicts?: boolean;
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
export interface SyncAwaitPhaseOptions {
|
|
384
|
-
timeoutMs?: number;
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
export interface SyncAwaitBootstrapOptions {
|
|
388
|
-
timeoutMs?: number;
|
|
389
|
-
stateId?: string;
|
|
390
|
-
subscriptionId?: string;
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
export interface SyncDiagnostics {
|
|
394
|
-
timestamp: number;
|
|
395
|
-
state: SyncEngineState;
|
|
396
|
-
transport: TransportHealth;
|
|
397
|
-
progress: SyncProgress;
|
|
398
|
-
outbox: OutboxStats;
|
|
399
|
-
conflictCount: number;
|
|
400
|
-
subscriptions: SubscriptionState[];
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
export interface SyncInspectorEvent {
|
|
404
|
-
id: number;
|
|
405
|
-
event: SyncEventType;
|
|
406
|
-
timestamp: number;
|
|
407
|
-
payload: Record<string, unknown>;
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
export interface SyncInspectorOptions {
|
|
411
|
-
eventLimit?: number;
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
export interface SyncInspectorSnapshot {
|
|
415
|
-
version: 1;
|
|
416
|
-
generatedAt: number;
|
|
417
|
-
diagnostics: Record<string, unknown>;
|
|
418
|
-
recentEvents: SyncInspectorEvent[];
|
|
419
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import type { ClientTableHandler } from './types';
|
|
2
|
-
|
|
3
|
-
export type ClientHandlerCollection<DB> = ClientTableHandler<DB>[];
|
|
4
|
-
|
|
5
|
-
export function createClientHandlerCollection<DB>(
|
|
6
|
-
handlers: ClientTableHandler<DB>[]
|
|
7
|
-
): ClientHandlerCollection<DB> {
|
|
8
|
-
const tables = new Set<string>();
|
|
9
|
-
for (const handler of handlers) {
|
|
10
|
-
if (tables.has(handler.table)) {
|
|
11
|
-
throw new Error(
|
|
12
|
-
`Client table handler already registered: ${handler.table}`
|
|
13
|
-
);
|
|
14
|
-
}
|
|
15
|
-
tables.add(handler.table);
|
|
16
|
-
}
|
|
17
|
-
return handlers;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export function getClientHandler<DB>(
|
|
21
|
-
handlers: ClientHandlerCollection<DB>,
|
|
22
|
-
table: string
|
|
23
|
-
): ClientTableHandler<DB> | undefined {
|
|
24
|
-
return handlers.find((handler) => handler.table === table);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export function getClientHandlerOrThrow<DB>(
|
|
28
|
-
handlers: ClientHandlerCollection<DB>,
|
|
29
|
-
table: string
|
|
30
|
-
): ClientTableHandler<DB> {
|
|
31
|
-
const handler = getClientHandler(handlers, table);
|
|
32
|
-
if (!handler) {
|
|
33
|
-
throw new Error(`Missing client table handler for table: ${table}`);
|
|
34
|
-
}
|
|
35
|
-
return handler;
|
|
36
|
-
}
|