@syncular/client 0.0.6-96 → 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.
Files changed (356) hide show
  1. package/README.md +713 -11
  2. package/dist/auth-leases.d.ts +11 -0
  3. package/dist/auth-leases.d.ts.map +1 -0
  4. package/dist/auth-leases.js +140 -0
  5. package/dist/auth-leases.js.map +1 -0
  6. package/dist/blob-limits.d.ts +15 -0
  7. package/dist/blob-limits.d.ts.map +1 -0
  8. package/dist/blob-limits.js +66 -0
  9. package/dist/blob-limits.js.map +1 -0
  10. package/dist/bridge-client.d.ts +69 -0
  11. package/dist/bridge-client.d.ts.map +1 -0
  12. package/dist/bridge-client.js +282 -0
  13. package/dist/bridge-client.js.map +1 -0
  14. package/dist/client-config.d.ts +6 -0
  15. package/dist/client-config.d.ts.map +1 -0
  16. package/dist/client-config.js +18 -0
  17. package/dist/client-config.js.map +1 -0
  18. package/dist/client.d.ts +65 -397
  19. package/dist/client.d.ts.map +1 -1
  20. package/dist/client.js +150 -960
  21. package/dist/client.js.map +1 -1
  22. package/dist/command-history.d.ts +35 -0
  23. package/dist/command-history.d.ts.map +1 -0
  24. package/dist/command-history.js +378 -0
  25. package/dist/command-history.js.map +1 -0
  26. package/dist/console-diagnostics.d.ts +33 -0
  27. package/dist/console-diagnostics.d.ts.map +1 -0
  28. package/dist/console-diagnostics.js +496 -0
  29. package/dist/console-diagnostics.js.map +1 -0
  30. package/dist/crdt-yjs/index.d.ts +4 -0
  31. package/dist/crdt-yjs/index.d.ts.map +1 -0
  32. package/dist/crdt-yjs/index.js +4 -0
  33. package/dist/crdt-yjs/index.js.map +1 -0
  34. package/dist/crdt-yjs/webview-host-facade.d.ts +126 -0
  35. package/dist/crdt-yjs/webview-host-facade.d.ts.map +1 -0
  36. package/dist/crdt-yjs/webview-host-facade.js +284 -0
  37. package/dist/crdt-yjs/webview-host-facade.js.map +1 -0
  38. package/dist/crdt-yjs/yjs-document-field-adapter.d.ts +153 -0
  39. package/dist/crdt-yjs/yjs-document-field-adapter.d.ts.map +1 -0
  40. package/dist/crdt-yjs/yjs-document-field-adapter.js +406 -0
  41. package/dist/crdt-yjs/yjs-document-field-adapter.js.map +1 -0
  42. package/dist/crdt-yjs/yjs-prosemirror-bridge.d.ts +73 -0
  43. package/dist/crdt-yjs/yjs-prosemirror-bridge.d.ts.map +1 -0
  44. package/dist/crdt-yjs/yjs-prosemirror-bridge.js +169 -0
  45. package/dist/crdt-yjs/yjs-prosemirror-bridge.js.map +1 -0
  46. package/dist/database.d.ts +83 -0
  47. package/dist/database.d.ts.map +1 -0
  48. package/dist/database.js +916 -0
  49. package/dist/database.js.map +1 -0
  50. package/dist/diagnostics.d.ts +10 -0
  51. package/dist/diagnostics.d.ts.map +1 -0
  52. package/dist/diagnostics.js +83 -0
  53. package/dist/diagnostics.js.map +1 -0
  54. package/dist/errors.d.ts +24 -0
  55. package/dist/errors.d.ts.map +1 -0
  56. package/dist/errors.js +211 -0
  57. package/dist/errors.js.map +1 -0
  58. package/dist/generated-bridge.d.ts +365 -0
  59. package/dist/generated-bridge.d.ts.map +1 -0
  60. package/dist/generated-bridge.js +250 -0
  61. package/dist/generated-bridge.js.map +1 -0
  62. package/dist/index.d.ts +13 -23
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +14 -25
  65. package/dist/index.js.map +1 -1
  66. package/dist/mutations.d.ts +4 -72
  67. package/dist/mutations.d.ts.map +1 -1
  68. package/dist/mutations.js +2 -568
  69. package/dist/mutations.js.map +1 -1
  70. package/dist/network.d.ts +3 -0
  71. package/dist/network.d.ts.map +1 -0
  72. package/dist/network.js +17 -0
  73. package/dist/network.js.map +1 -0
  74. package/dist/react/index.d.ts +169 -0
  75. package/dist/react/index.d.ts.map +1 -0
  76. package/dist/react/index.js +628 -0
  77. package/dist/react/index.js.map +1 -0
  78. package/dist/react-native/index.d.ts +35 -0
  79. package/dist/react-native/index.d.ts.map +1 -0
  80. package/dist/react-native/index.js +49 -0
  81. package/dist/react-native/index.js.map +1 -0
  82. package/dist/runtime-contract.d.ts +13 -0
  83. package/dist/runtime-contract.d.ts.map +1 -0
  84. package/dist/runtime-contract.js +24 -0
  85. package/dist/runtime-contract.js.map +1 -0
  86. package/dist/rust-client.d.ts +106 -0
  87. package/dist/rust-client.d.ts.map +1 -0
  88. package/dist/rust-client.js +936 -0
  89. package/dist/rust-client.js.map +1 -0
  90. package/dist/sentry.d.ts +35 -0
  91. package/dist/sentry.d.ts.map +1 -0
  92. package/dist/sentry.js +155 -0
  93. package/dist/sentry.js.map +1 -0
  94. package/dist/sql-safety.d.ts +3 -0
  95. package/dist/sql-safety.d.ts.map +1 -0
  96. package/dist/sql-safety.js +62 -0
  97. package/dist/sql-safety.js.map +1 -0
  98. package/dist/syncular-runtime-artifacts.json +61 -0
  99. package/dist/tauri/index.d.ts +35 -0
  100. package/dist/tauri/index.d.ts.map +1 -0
  101. package/dist/tauri/index.js +114 -0
  102. package/dist/tauri/index.js.map +1 -0
  103. package/dist/types.d.ts +1059 -0
  104. package/dist/types.d.ts.map +1 -0
  105. package/dist/types.js +2 -0
  106. package/dist/types.js.map +1 -0
  107. package/dist/wasm/.syncular-wasm-profile +1 -0
  108. package/dist/wasm/syncular-runtime-artifact.json +21 -0
  109. package/dist/wasm/syncular.d.ts +207 -0
  110. package/dist/wasm/syncular.js +2341 -0
  111. package/dist/wasm/syncular_bg.wasm +0 -0
  112. package/dist/wasm/syncular_bg.wasm.d.ts +97 -0
  113. package/dist/wasm-bindings/runtime-contract.d.ts +22 -0
  114. package/dist/wasm-bindings/runtime-contract.d.ts.map +1 -0
  115. package/dist/wasm-bindings/runtime-contract.js +112 -0
  116. package/dist/wasm-bindings/runtime-contract.js.map +1 -0
  117. package/dist/wasm-core/.syncular-wasm-profile +1 -0
  118. package/dist/wasm-core/syncular-runtime-artifact.json +17 -0
  119. package/dist/wasm-core/syncular.d.ts +162 -0
  120. package/dist/wasm-core/syncular.js +1847 -0
  121. package/dist/wasm-core/syncular_bg.wasm +0 -0
  122. package/dist/wasm-core/syncular_bg.wasm.d.ts +77 -0
  123. package/dist/wasm-perf/.syncular-wasm-profile +1 -0
  124. package/dist/wasm-perf/syncular-runtime-artifact.json +21 -0
  125. package/dist/wasm-perf/syncular.d.ts +207 -0
  126. package/dist/wasm-perf/syncular.js +2341 -0
  127. package/dist/wasm-perf/syncular_bg.wasm +0 -0
  128. package/dist/wasm-perf/syncular_bg.wasm.d.ts +97 -0
  129. package/dist/wasm-runtime.d.ts +18 -0
  130. package/dist/wasm-runtime.d.ts.map +1 -0
  131. package/dist/wasm-runtime.js +28 -0
  132. package/dist/wasm-runtime.js.map +1 -0
  133. package/dist/worker-client.d.ts +123 -0
  134. package/dist/worker-client.d.ts.map +1 -0
  135. package/dist/worker-client.js +1686 -0
  136. package/dist/worker-client.js.map +1 -0
  137. package/dist/worker-entry.d.ts +2 -0
  138. package/dist/worker-entry.d.ts.map +1 -0
  139. package/dist/worker-entry.js +479 -0
  140. package/dist/worker-entry.js.map +1 -0
  141. package/dist/worker-protocol.d.ts +64 -0
  142. package/dist/worker-protocol.d.ts.map +1 -0
  143. package/dist/worker-protocol.js +16 -0
  144. package/dist/worker-protocol.js.map +1 -0
  145. package/dist/worker-realtime.d.ts +39 -0
  146. package/dist/worker-realtime.d.ts.map +1 -0
  147. package/dist/worker-realtime.js +677 -0
  148. package/dist/worker-realtime.js.map +1 -0
  149. package/package.json +124 -17
  150. package/src/auth-leases.ts +251 -0
  151. package/src/blob-limits.ts +98 -0
  152. package/src/bridge-client.ts +512 -0
  153. package/src/client-config.ts +29 -0
  154. package/src/client.ts +256 -1414
  155. package/src/command-history.ts +623 -0
  156. package/src/console-diagnostics.ts +617 -0
  157. package/src/crdt-yjs/index.ts +3 -0
  158. package/src/crdt-yjs/webview-host-facade.ts +477 -0
  159. package/src/crdt-yjs/yjs-document-field-adapter.ts +733 -0
  160. package/src/crdt-yjs/yjs-prosemirror-bridge.ts +272 -0
  161. package/src/database.ts +1342 -0
  162. package/src/diagnostics.ts +116 -0
  163. package/src/errors.ts +269 -0
  164. package/src/generated-bridge.ts +741 -0
  165. package/src/index.ts +21 -25
  166. package/src/mutations.ts +12 -821
  167. package/src/network.ts +32 -0
  168. package/src/react/index.ts +1036 -0
  169. package/src/react-native/index.ts +152 -0
  170. package/src/runtime-contract.ts +48 -0
  171. package/src/rust-client.ts +1488 -0
  172. package/src/sentry.ts +215 -0
  173. package/src/sql-safety.ts +61 -0
  174. package/src/tauri/index.ts +211 -0
  175. package/src/types.ts +1356 -0
  176. package/src/wasm-bindings/generated-wasm-bindings.d.ts +70 -0
  177. package/src/wasm-bindings/runtime-contract.ts +158 -0
  178. package/src/wasm-runtime.ts +76 -0
  179. package/src/worker-client.ts +2215 -0
  180. package/src/worker-entry.ts +584 -0
  181. package/src/worker-protocol.ts +109 -0
  182. package/src/worker-realtime.ts +843 -0
  183. package/dist/blobs/index.d.ts +0 -7
  184. package/dist/blobs/index.d.ts.map +0 -1
  185. package/dist/blobs/index.js +0 -7
  186. package/dist/blobs/index.js.map +0 -1
  187. package/dist/blobs/manager.d.ts +0 -345
  188. package/dist/blobs/manager.d.ts.map +0 -1
  189. package/dist/blobs/manager.js +0 -749
  190. package/dist/blobs/manager.js.map +0 -1
  191. package/dist/blobs/migrate.d.ts +0 -14
  192. package/dist/blobs/migrate.d.ts.map +0 -1
  193. package/dist/blobs/migrate.js +0 -59
  194. package/dist/blobs/migrate.js.map +0 -1
  195. package/dist/blobs/types.d.ts +0 -62
  196. package/dist/blobs/types.d.ts.map +0 -1
  197. package/dist/blobs/types.js +0 -5
  198. package/dist/blobs/types.js.map +0 -1
  199. package/dist/conflicts.d.ts +0 -31
  200. package/dist/conflicts.d.ts.map +0 -1
  201. package/dist/conflicts.js +0 -112
  202. package/dist/conflicts.js.map +0 -1
  203. package/dist/create-client.d.ts +0 -118
  204. package/dist/create-client.d.ts.map +0 -1
  205. package/dist/create-client.js +0 -178
  206. package/dist/create-client.js.map +0 -1
  207. package/dist/engine/SyncEngine.d.ts +0 -272
  208. package/dist/engine/SyncEngine.d.ts.map +0 -1
  209. package/dist/engine/SyncEngine.js +0 -1860
  210. package/dist/engine/SyncEngine.js.map +0 -1
  211. package/dist/engine/index.d.ts +0 -6
  212. package/dist/engine/index.d.ts.map +0 -1
  213. package/dist/engine/index.js +0 -6
  214. package/dist/engine/index.js.map +0 -1
  215. package/dist/engine/types.d.ts +0 -345
  216. package/dist/engine/types.d.ts.map +0 -1
  217. package/dist/engine/types.js +0 -7
  218. package/dist/engine/types.js.map +0 -1
  219. package/dist/handlers/collection.d.ts +0 -6
  220. package/dist/handlers/collection.d.ts.map +0 -1
  221. package/dist/handlers/collection.js +0 -21
  222. package/dist/handlers/collection.js.map +0 -1
  223. package/dist/handlers/create-handler.d.ts +0 -120
  224. package/dist/handlers/create-handler.d.ts.map +0 -1
  225. package/dist/handlers/create-handler.js +0 -145
  226. package/dist/handlers/create-handler.js.map +0 -1
  227. package/dist/handlers/types.d.ts +0 -83
  228. package/dist/handlers/types.d.ts.map +0 -1
  229. package/dist/handlers/types.js +0 -5
  230. package/dist/handlers/types.js.map +0 -1
  231. package/dist/migrate.d.ts +0 -19
  232. package/dist/migrate.d.ts.map +0 -1
  233. package/dist/migrate.js +0 -238
  234. package/dist/migrate.js.map +0 -1
  235. package/dist/outbox.d.ts +0 -112
  236. package/dist/outbox.d.ts.map +0 -1
  237. package/dist/outbox.js +0 -294
  238. package/dist/outbox.js.map +0 -1
  239. package/dist/plugins/incrementing-version.d.ts +0 -34
  240. package/dist/plugins/incrementing-version.d.ts.map +0 -1
  241. package/dist/plugins/incrementing-version.js +0 -83
  242. package/dist/plugins/incrementing-version.js.map +0 -1
  243. package/dist/plugins/index.d.ts +0 -3
  244. package/dist/plugins/index.d.ts.map +0 -1
  245. package/dist/plugins/index.js +0 -3
  246. package/dist/plugins/index.js.map +0 -1
  247. package/dist/plugins/types.d.ts +0 -49
  248. package/dist/plugins/types.d.ts.map +0 -1
  249. package/dist/plugins/types.js +0 -15
  250. package/dist/plugins/types.js.map +0 -1
  251. package/dist/proxy/connection.d.ts +0 -33
  252. package/dist/proxy/connection.d.ts.map +0 -1
  253. package/dist/proxy/connection.js +0 -153
  254. package/dist/proxy/connection.js.map +0 -1
  255. package/dist/proxy/dialect.d.ts +0 -46
  256. package/dist/proxy/dialect.d.ts.map +0 -1
  257. package/dist/proxy/dialect.js +0 -58
  258. package/dist/proxy/dialect.js.map +0 -1
  259. package/dist/proxy/driver.d.ts +0 -42
  260. package/dist/proxy/driver.d.ts.map +0 -1
  261. package/dist/proxy/driver.js +0 -78
  262. package/dist/proxy/driver.js.map +0 -1
  263. package/dist/proxy/index.d.ts +0 -10
  264. package/dist/proxy/index.d.ts.map +0 -1
  265. package/dist/proxy/index.js +0 -10
  266. package/dist/proxy/index.js.map +0 -1
  267. package/dist/proxy/mutations.d.ts +0 -9
  268. package/dist/proxy/mutations.d.ts.map +0 -1
  269. package/dist/proxy/mutations.js +0 -11
  270. package/dist/proxy/mutations.js.map +0 -1
  271. package/dist/pull-engine.d.ts +0 -48
  272. package/dist/pull-engine.d.ts.map +0 -1
  273. package/dist/pull-engine.js +0 -648
  274. package/dist/pull-engine.js.map +0 -1
  275. package/dist/push-engine.d.ts +0 -18
  276. package/dist/push-engine.d.ts.map +0 -1
  277. package/dist/push-engine.js +0 -167
  278. package/dist/push-engine.js.map +0 -1
  279. package/dist/query/FingerprintCollector.d.ts +0 -18
  280. package/dist/query/FingerprintCollector.d.ts.map +0 -1
  281. package/dist/query/FingerprintCollector.js +0 -28
  282. package/dist/query/FingerprintCollector.js.map +0 -1
  283. package/dist/query/QueryContext.d.ts +0 -33
  284. package/dist/query/QueryContext.d.ts.map +0 -1
  285. package/dist/query/QueryContext.js +0 -16
  286. package/dist/query/QueryContext.js.map +0 -1
  287. package/dist/query/fingerprint.d.ts +0 -61
  288. package/dist/query/fingerprint.d.ts.map +0 -1
  289. package/dist/query/fingerprint.js +0 -91
  290. package/dist/query/fingerprint.js.map +0 -1
  291. package/dist/query/index.d.ts +0 -7
  292. package/dist/query/index.d.ts.map +0 -1
  293. package/dist/query/index.js +0 -7
  294. package/dist/query/index.js.map +0 -1
  295. package/dist/query/tracked-select.d.ts +0 -18
  296. package/dist/query/tracked-select.d.ts.map +0 -1
  297. package/dist/query/tracked-select.js +0 -90
  298. package/dist/query/tracked-select.js.map +0 -1
  299. package/dist/schema.d.ts +0 -83
  300. package/dist/schema.d.ts.map +0 -1
  301. package/dist/schema.js +0 -7
  302. package/dist/schema.js.map +0 -1
  303. package/dist/subscription-state.d.ts +0 -46
  304. package/dist/subscription-state.d.ts.map +0 -1
  305. package/dist/subscription-state.js +0 -185
  306. package/dist/subscription-state.js.map +0 -1
  307. package/dist/sync-loop.d.ts +0 -34
  308. package/dist/sync-loop.d.ts.map +0 -1
  309. package/dist/sync-loop.js +0 -253
  310. package/dist/sync-loop.js.map +0 -1
  311. package/dist/sync.d.ts +0 -32
  312. package/dist/sync.d.ts.map +0 -1
  313. package/dist/sync.js +0 -55
  314. package/dist/sync.js.map +0 -1
  315. package/dist/utils/id.d.ts +0 -17
  316. package/dist/utils/id.d.ts.map +0 -1
  317. package/dist/utils/id.js +0 -46
  318. package/dist/utils/id.js.map +0 -1
  319. package/src/blobs/index.ts +0 -7
  320. package/src/blobs/manager.ts +0 -1027
  321. package/src/blobs/migrate.ts +0 -67
  322. package/src/blobs/types.ts +0 -84
  323. package/src/client.test.ts +0 -417
  324. package/src/conflicts.ts +0 -171
  325. package/src/create-client.test.ts +0 -83
  326. package/src/create-client.ts +0 -330
  327. package/src/engine/SyncEngine.test.ts +0 -254
  328. package/src/engine/SyncEngine.ts +0 -2375
  329. package/src/engine/index.ts +0 -6
  330. package/src/engine/types.ts +0 -419
  331. package/src/handlers/collection.ts +0 -36
  332. package/src/handlers/create-handler.ts +0 -330
  333. package/src/handlers/types.ts +0 -108
  334. package/src/migrate.ts +0 -318
  335. package/src/outbox.ts +0 -383
  336. package/src/plugins/incrementing-version.ts +0 -133
  337. package/src/plugins/index.ts +0 -2
  338. package/src/plugins/types.ts +0 -63
  339. package/src/proxy/connection.ts +0 -191
  340. package/src/proxy/dialect.ts +0 -76
  341. package/src/proxy/driver.ts +0 -126
  342. package/src/proxy/index.ts +0 -10
  343. package/src/proxy/mutations.ts +0 -18
  344. package/src/pull-engine.test.ts +0 -151
  345. package/src/pull-engine.ts +0 -855
  346. package/src/push-engine.ts +0 -216
  347. package/src/query/FingerprintCollector.ts +0 -29
  348. package/src/query/QueryContext.ts +0 -54
  349. package/src/query/fingerprint.ts +0 -109
  350. package/src/query/index.ts +0 -10
  351. package/src/query/tracked-select.ts +0 -139
  352. package/src/schema.ts +0 -94
  353. package/src/subscription-state.ts +0 -259
  354. package/src/sync-loop.ts +0 -379
  355. package/src/sync.ts +0 -170
  356. package/src/utils/id.ts +0 -55
@@ -1,6 +0,0 @@
1
- /**
2
- * @syncular/client - Engine exports
3
- */
4
-
5
- export { SyncEngine } from './SyncEngine';
6
- export * from './types';
@@ -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
- }