@syncular/client 0.1.2 → 0.2.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 (233) hide show
  1. package/README.md +227 -709
  2. package/dist/apply.d.ts +80 -0
  3. package/dist/apply.js +301 -0
  4. package/dist/blob.d.ts +127 -0
  5. package/dist/blob.js +201 -0
  6. package/dist/bun-database.d.ts +22 -0
  7. package/dist/bun-database.js +61 -0
  8. package/dist/client.d.ts +320 -69
  9. package/dist/client.js +1627 -163
  10. package/dist/content-type.d.ts +2 -0
  11. package/dist/content-type.js +2 -0
  12. package/dist/database.d.ts +35 -80
  13. package/dist/database.js +32 -947
  14. package/dist/encryption.d.ts +47 -0
  15. package/dist/encryption.js +75 -0
  16. package/dist/errors.d.ts +8 -22
  17. package/dist/errors.js +10 -207
  18. package/dist/http.d.ts +32 -0
  19. package/dist/http.js +196 -0
  20. package/dist/index.d.ts +28 -16
  21. package/dist/index.js +25 -12
  22. package/dist/invalidation.d.ts +69 -0
  23. package/dist/invalidation.js +84 -0
  24. package/dist/leader-lock.d.ts +28 -0
  25. package/dist/leader-lock.js +38 -0
  26. package/dist/multi-tab.d.ts +134 -0
  27. package/dist/multi-tab.js +399 -0
  28. package/dist/node-database.d.ts +41 -0
  29. package/dist/node-database.js +133 -0
  30. package/dist/outbox.d.ts +56 -0
  31. package/dist/outbox.js +140 -0
  32. package/dist/schema.d.ts +107 -0
  33. package/dist/schema.js +267 -0
  34. package/dist/state.d.ts +40 -0
  35. package/dist/state.js +77 -0
  36. package/dist/transport.d.ts +44 -0
  37. package/dist/transport.js +7 -0
  38. package/dist/wasm-database.d.ts +30 -0
  39. package/dist/wasm-database.js +170 -0
  40. package/dist/window.d.ts +64 -0
  41. package/dist/window.js +0 -0
  42. package/dist/worker-entry.d.ts +16 -2
  43. package/dist/worker-entry.js +300 -456
  44. package/dist/worker-host.d.ts +174 -0
  45. package/dist/worker-host.js +536 -0
  46. package/dist/worker-protocol.d.ts +173 -61
  47. package/dist/worker-protocol.js +7 -16
  48. package/package.json +45 -112
  49. package/src/apply.ts +435 -0
  50. package/src/blob.ts +333 -0
  51. package/src/bun-database.ts +75 -0
  52. package/src/client.ts +2247 -277
  53. package/src/content-type.ts +2 -0
  54. package/src/database.ts +63 -1389
  55. package/src/encryption.ts +123 -0
  56. package/src/errors.ts +11 -265
  57. package/src/http.ts +254 -0
  58. package/src/index.ts +25 -20
  59. package/src/invalidation.ts +128 -0
  60. package/src/leader-lock.ts +68 -0
  61. package/src/multi-tab.ts +550 -0
  62. package/src/node-database.ts +180 -0
  63. package/src/outbox.ts +206 -0
  64. package/src/schema.ts +397 -0
  65. package/src/state.ts +126 -0
  66. package/src/transport.ts +52 -0
  67. package/src/wasm-database.ts +279 -0
  68. package/src/window.ts +0 -0
  69. package/src/worker-entry.ts +391 -545
  70. package/src/worker-host.ts +800 -0
  71. package/src/worker-protocol.ts +204 -99
  72. package/dist/auth-leases.d.ts +0 -11
  73. package/dist/auth-leases.d.ts.map +0 -1
  74. package/dist/auth-leases.js +0 -140
  75. package/dist/auth-leases.js.map +0 -1
  76. package/dist/blob-limits.d.ts +0 -15
  77. package/dist/blob-limits.d.ts.map +0 -1
  78. package/dist/blob-limits.js +0 -66
  79. package/dist/blob-limits.js.map +0 -1
  80. package/dist/bridge-client.d.ts +0 -69
  81. package/dist/bridge-client.d.ts.map +0 -1
  82. package/dist/bridge-client.js +0 -282
  83. package/dist/bridge-client.js.map +0 -1
  84. package/dist/client-config.d.ts +0 -6
  85. package/dist/client-config.d.ts.map +0 -1
  86. package/dist/client-config.js +0 -18
  87. package/dist/client-config.js.map +0 -1
  88. package/dist/client.d.ts.map +0 -1
  89. package/dist/client.js.map +0 -1
  90. package/dist/command-history.d.ts +0 -35
  91. package/dist/command-history.d.ts.map +0 -1
  92. package/dist/command-history.js +0 -378
  93. package/dist/command-history.js.map +0 -1
  94. package/dist/console-diagnostics.d.ts +0 -33
  95. package/dist/console-diagnostics.d.ts.map +0 -1
  96. package/dist/console-diagnostics.js +0 -496
  97. package/dist/console-diagnostics.js.map +0 -1
  98. package/dist/crdt-yjs/index.d.ts +0 -4
  99. package/dist/crdt-yjs/index.d.ts.map +0 -1
  100. package/dist/crdt-yjs/index.js +0 -4
  101. package/dist/crdt-yjs/index.js.map +0 -1
  102. package/dist/crdt-yjs/webview-host-facade.d.ts +0 -126
  103. package/dist/crdt-yjs/webview-host-facade.d.ts.map +0 -1
  104. package/dist/crdt-yjs/webview-host-facade.js +0 -284
  105. package/dist/crdt-yjs/webview-host-facade.js.map +0 -1
  106. package/dist/crdt-yjs/yjs-document-field-adapter.d.ts +0 -153
  107. package/dist/crdt-yjs/yjs-document-field-adapter.d.ts.map +0 -1
  108. package/dist/crdt-yjs/yjs-document-field-adapter.js +0 -406
  109. package/dist/crdt-yjs/yjs-document-field-adapter.js.map +0 -1
  110. package/dist/crdt-yjs/yjs-prosemirror-bridge.d.ts +0 -73
  111. package/dist/crdt-yjs/yjs-prosemirror-bridge.d.ts.map +0 -1
  112. package/dist/crdt-yjs/yjs-prosemirror-bridge.js +0 -169
  113. package/dist/crdt-yjs/yjs-prosemirror-bridge.js.map +0 -1
  114. package/dist/database.d.ts.map +0 -1
  115. package/dist/database.js.map +0 -1
  116. package/dist/diagnostics.d.ts +0 -10
  117. package/dist/diagnostics.d.ts.map +0 -1
  118. package/dist/diagnostics.js +0 -83
  119. package/dist/diagnostics.js.map +0 -1
  120. package/dist/errors.d.ts.map +0 -1
  121. package/dist/errors.js.map +0 -1
  122. package/dist/generated-bridge.d.ts +0 -365
  123. package/dist/generated-bridge.d.ts.map +0 -1
  124. package/dist/generated-bridge.js +0 -250
  125. package/dist/generated-bridge.js.map +0 -1
  126. package/dist/index.d.ts.map +0 -1
  127. package/dist/index.js.map +0 -1
  128. package/dist/mutations.d.ts +0 -72
  129. package/dist/mutations.d.ts.map +0 -1
  130. package/dist/mutations.js +0 -63
  131. package/dist/mutations.js.map +0 -1
  132. package/dist/network.d.ts +0 -3
  133. package/dist/network.d.ts.map +0 -1
  134. package/dist/network.js +0 -17
  135. package/dist/network.js.map +0 -1
  136. package/dist/react/index.d.ts +0 -169
  137. package/dist/react/index.d.ts.map +0 -1
  138. package/dist/react/index.js +0 -628
  139. package/dist/react/index.js.map +0 -1
  140. package/dist/react-native/index.d.ts +0 -35
  141. package/dist/react-native/index.d.ts.map +0 -1
  142. package/dist/react-native/index.js +0 -49
  143. package/dist/react-native/index.js.map +0 -1
  144. package/dist/runtime-contract.d.ts +0 -13
  145. package/dist/runtime-contract.d.ts.map +0 -1
  146. package/dist/runtime-contract.js +0 -24
  147. package/dist/runtime-contract.js.map +0 -1
  148. package/dist/rust-client.d.ts +0 -106
  149. package/dist/rust-client.d.ts.map +0 -1
  150. package/dist/rust-client.js +0 -938
  151. package/dist/rust-client.js.map +0 -1
  152. package/dist/sentry.d.ts +0 -35
  153. package/dist/sentry.d.ts.map +0 -1
  154. package/dist/sentry.js +0 -155
  155. package/dist/sentry.js.map +0 -1
  156. package/dist/sql-safety.d.ts +0 -3
  157. package/dist/sql-safety.d.ts.map +0 -1
  158. package/dist/sql-safety.js +0 -62
  159. package/dist/sql-safety.js.map +0 -1
  160. package/dist/syncular-runtime-artifacts.json +0 -61
  161. package/dist/tauri/index.d.ts +0 -35
  162. package/dist/tauri/index.d.ts.map +0 -1
  163. package/dist/tauri/index.js +0 -114
  164. package/dist/tauri/index.js.map +0 -1
  165. package/dist/types.d.ts +0 -1096
  166. package/dist/types.d.ts.map +0 -1
  167. package/dist/types.js +0 -2
  168. package/dist/types.js.map +0 -1
  169. package/dist/wasm/.syncular-wasm-profile +0 -1
  170. package/dist/wasm/syncular-runtime-artifact.json +0 -21
  171. package/dist/wasm/syncular.d.ts +0 -207
  172. package/dist/wasm/syncular.js +0 -2341
  173. package/dist/wasm/syncular_bg.wasm +0 -0
  174. package/dist/wasm/syncular_bg.wasm.d.ts +0 -97
  175. package/dist/wasm-bindings/runtime-contract.d.ts +0 -22
  176. package/dist/wasm-bindings/runtime-contract.d.ts.map +0 -1
  177. package/dist/wasm-bindings/runtime-contract.js +0 -112
  178. package/dist/wasm-bindings/runtime-contract.js.map +0 -1
  179. package/dist/wasm-core/.syncular-wasm-profile +0 -1
  180. package/dist/wasm-core/syncular-runtime-artifact.json +0 -17
  181. package/dist/wasm-core/syncular.d.ts +0 -162
  182. package/dist/wasm-core/syncular.js +0 -1847
  183. package/dist/wasm-core/syncular_bg.wasm +0 -0
  184. package/dist/wasm-core/syncular_bg.wasm.d.ts +0 -77
  185. package/dist/wasm-perf/.syncular-wasm-profile +0 -1
  186. package/dist/wasm-perf/syncular-runtime-artifact.json +0 -21
  187. package/dist/wasm-perf/syncular.d.ts +0 -207
  188. package/dist/wasm-perf/syncular.js +0 -2341
  189. package/dist/wasm-perf/syncular_bg.wasm +0 -0
  190. package/dist/wasm-perf/syncular_bg.wasm.d.ts +0 -97
  191. package/dist/wasm-runtime.d.ts +0 -23
  192. package/dist/wasm-runtime.d.ts.map +0 -1
  193. package/dist/wasm-runtime.js +0 -69
  194. package/dist/wasm-runtime.js.map +0 -1
  195. package/dist/worker-client.d.ts +0 -123
  196. package/dist/worker-client.d.ts.map +0 -1
  197. package/dist/worker-client.js +0 -1735
  198. package/dist/worker-client.js.map +0 -1
  199. package/dist/worker-entry.d.ts.map +0 -1
  200. package/dist/worker-entry.js.map +0 -1
  201. package/dist/worker-protocol.d.ts.map +0 -1
  202. package/dist/worker-protocol.js.map +0 -1
  203. package/dist/worker-realtime.d.ts +0 -39
  204. package/dist/worker-realtime.d.ts.map +0 -1
  205. package/dist/worker-realtime.js +0 -677
  206. package/dist/worker-realtime.js.map +0 -1
  207. package/src/auth-leases.ts +0 -251
  208. package/src/blob-limits.ts +0 -98
  209. package/src/bridge-client.ts +0 -512
  210. package/src/client-config.ts +0 -29
  211. package/src/command-history.ts +0 -623
  212. package/src/console-diagnostics.ts +0 -617
  213. package/src/crdt-yjs/index.ts +0 -3
  214. package/src/crdt-yjs/webview-host-facade.ts +0 -477
  215. package/src/crdt-yjs/yjs-document-field-adapter.ts +0 -733
  216. package/src/crdt-yjs/yjs-prosemirror-bridge.ts +0 -272
  217. package/src/diagnostics.ts +0 -116
  218. package/src/generated-bridge.ts +0 -741
  219. package/src/mutations.ts +0 -168
  220. package/src/network.ts +0 -32
  221. package/src/react/index.ts +0 -1036
  222. package/src/react-native/index.ts +0 -152
  223. package/src/runtime-contract.ts +0 -48
  224. package/src/rust-client.ts +0 -1491
  225. package/src/sentry.ts +0 -215
  226. package/src/sql-safety.ts +0 -61
  227. package/src/tauri/index.ts +0 -211
  228. package/src/types.ts +0 -1397
  229. package/src/wasm-bindings/generated-wasm-bindings.d.ts +0 -70
  230. package/src/wasm-bindings/runtime-contract.ts +0 -158
  231. package/src/wasm-runtime.ts +0 -145
  232. package/src/worker-client.ts +0 -2289
  233. package/src/worker-realtime.ts +0 -843
package/src/types.ts DELETED
@@ -1,1397 +0,0 @@
1
- import type {
2
- BlobRef,
3
- ColumnCodecSource,
4
- SyncularErrorCategory as CoreSyncularErrorCategory,
5
- SyncularErrorCode as CoreSyncularErrorCode,
6
- SyncularErrorRecommendedAction as CoreSyncularErrorRecommendedAction,
7
- SyncAuthLeaseIssueRequest,
8
- SyncAuthLifecycle,
9
- SyncOperation,
10
- } from '@syncular/core';
11
- import type { CompiledQuery } from 'kysely';
12
- import type { SyncularWasmArtifactVariant } from './wasm-bindings/runtime-contract';
13
-
14
- export type SyncularClientMode = 'remote' | 'local-sync-compatible';
15
-
16
- export interface SyncularClientConfig {
17
- mode?: SyncularClientMode;
18
- baseUrl?: string;
19
- clientId: string;
20
- actorId: string;
21
- projectId?: string | null;
22
- pull?: SyncularPullOptions;
23
- push?: SyncularPushOptions;
24
- fileName?: string;
25
- storage?: SyncularStorage;
26
- clearOnInit?: boolean;
27
- stateId?: string;
28
- schemaVersion?: number;
29
- appSchema?: SyncularAppSchema;
30
- }
31
-
32
- export interface ResolvedSyncularClientConfig
33
- extends Omit<SyncularClientConfig, 'baseUrl' | 'mode'> {
34
- mode: SyncularClientMode;
35
- baseUrl: string;
36
- }
37
-
38
- export interface SyncularPullOptions {
39
- limitCommits?: number;
40
- limitSnapshotRows?: number;
41
- maxSnapshotPages?: number;
42
- dedupeRows?: boolean | null;
43
- /** Numeric bootstrap phase considered critical. Defaults to 0. */
44
- criticalBootstrapPhase?: number;
45
- /** Numeric bootstrap phase considered interactive. Defaults to 1. */
46
- interactiveBootstrapPhase?: number;
47
- /** Defaults to false; snapshot bootstrap rows hydrate local SQLite instead of being returned. */
48
- includeSnapshotRows?: boolean;
49
- collectChangedRows?: boolean;
50
- maxSnapshotChangedRows?: number | null;
51
- collectServerTimings?: boolean;
52
- }
53
-
54
- export interface SyncularPushOptions {
55
- /**
56
- * Fixed maximum pending outbox commits to send in one push request.
57
- * When omitted, Rust uses 20 for normal queues and adapts up to 1000 for
58
- * large due outboxes. Configured values disable that adaptive default and
59
- * must remain bounded.
60
- */
61
- outboxBatchLimit?: number;
62
- /**
63
- * Maximum adaptive outbox batch size used when outboxBatchLimit is omitted.
64
- * Defaults to 1000.
65
- */
66
- adaptiveOutboxBatchLimit?: number;
67
- /**
68
- * Due outbox size that must be exceeded before adaptive batching engages.
69
- * Defaults to 100.
70
- */
71
- adaptiveOutboxBatchThreshold?: number;
72
- }
73
-
74
- export interface SyncularTransportStats {
75
- requestCount: number;
76
- requestBytes: number;
77
- responseBytes: number;
78
- snapshotChunkCount: number;
79
- snapshotChunkBinaryCount: number;
80
- snapshotChunkRowCount: number;
81
- snapshotChunkFetchMs: number;
82
- snapshotChunkDecompressMs: number;
83
- snapshotChunkHashMs: number;
84
- snapshotChunkDecodeMs: number;
85
- snapshotArtifactCount: number;
86
- snapshotArtifactBytes: number;
87
- snapshotArtifactFetchMs: number;
88
- snapshotArtifactDecompressMs: number;
89
- snapshotArtifactHashMs: number;
90
- syncPackDecodeMs: number;
91
- serverBootstrapSnapshotQueryMs: number;
92
- serverBootstrapRowFrameEncodeMs: number;
93
- serverBootstrapSnapshotBinaryEncodeMs: number;
94
- serverBootstrapChunkCacheLookupMs: number;
95
- serverBootstrapArtifactCacheLookupMs: number;
96
- serverBootstrapChunkGzipMs: number;
97
- serverBootstrapChunkHashMs: number;
98
- serverBootstrapChunkPersistMs: number;
99
- }
100
-
101
- export type SyncularStorage = 'memory' | 'indexedDb' | 'opfsSahPool';
102
-
103
- export type SyncularAuthHeaders = Record<string, string>;
104
-
105
- export interface SyncularAuthLeaseRecord {
106
- leaseId: string;
107
- kid: string;
108
- actorId: string;
109
- issuedAtMs: number;
110
- notBeforeMs: number;
111
- expiresAtMs: number;
112
- schemaVersion: number;
113
- payloadJson: string;
114
- token: string;
115
- status: string;
116
- lastValidationError?: string | null;
117
- createdAtMs: number;
118
- updatedAtMs: number;
119
- }
120
-
121
- export interface SyncularFieldEncryptionRule {
122
- scope: string;
123
- table?: string;
124
- fields: string[];
125
- rowIdField?: string;
126
- }
127
-
128
- export interface SyncularFieldEncryptionConfig {
129
- rules: SyncularFieldEncryptionRule[];
130
- keys: Record<string, string | Uint8Array>;
131
- encryptionKid?: string;
132
- decryptionErrorMode?: 'throw' | 'keepCiphertext';
133
- envelopePrefix?: string;
134
- }
135
-
136
- export interface SyncularEncryptedCrdtConfig {
137
- keys: Record<string, string | Uint8Array>;
138
- encryptionKid?: string;
139
- partitionId?: string;
140
- }
141
-
142
- export interface SyncularBlobEncryptionConfig {
143
- keys: Record<string, string | Uint8Array>;
144
- encryptionKid?: string;
145
- }
146
-
147
- export type SyncularEncryptionHelperMethod =
148
- | 'generateSymmetricKey'
149
- | 'keyToMnemonic'
150
- | 'mnemonicToKey'
151
- | 'generateKeypair'
152
- | 'wrapKeyForRecipient'
153
- | 'unwrapKey'
154
- | 'keyToShareUrl'
155
- | 'publicKeyToShareUrl'
156
- | 'parseShareUrl'
157
- | 'deriveScopedPassphraseKeyPbkdf2'
158
- | 'derivePassphraseKeyArgon2id';
159
-
160
- export type SyncularRealtimeConnectionState =
161
- | 'disconnected'
162
- | 'connecting'
163
- | 'connected';
164
-
165
- export type SyncularDiagnosticLevel = 'debug' | 'info' | 'warn' | 'error';
166
-
167
- export type SyncularDiagnosticSource =
168
- | 'client'
169
- | 'worker'
170
- | 'sync'
171
- | 'auth'
172
- | 'realtime'
173
- | 'storage'
174
- | 'blob';
175
-
176
- export interface SyncularDiagnosticEvent {
177
- at: number;
178
- level: SyncularDiagnosticLevel;
179
- source: SyncularDiagnosticSource;
180
- code: string;
181
- message: string;
182
- syncAttemptId?: string;
183
- traceId?: string;
184
- spanId?: string;
185
- clientId?: string;
186
- subscriptionId?: string;
187
- table?: string;
188
- rowId?: string;
189
- cursor?: number | string | null;
190
- details?: Record<string, unknown>;
191
- }
192
-
193
- export type SyncularDiagnosticSink = (event: SyncularDiagnosticEvent) => void;
194
-
195
- export interface SyncularSyncAttempt {
196
- syncAttemptId: string;
197
- traceId: string;
198
- spanId: string;
199
- traceparent: string;
200
- }
201
-
202
- export interface SyncularSyncRequestOptions {
203
- syncAttempt?: SyncularSyncAttempt;
204
- }
205
-
206
- export interface SyncularRealtimeOptions {
207
- enabled?: boolean;
208
- wsUrl?: string;
209
- params?: Record<string, string>;
210
- getParams?: (args: {
211
- clientId: string;
212
- }) => Record<string, string> | Promise<Record<string, string>>;
213
- initialReconnectDelayMs?: number;
214
- maxReconnectDelayMs?: number;
215
- reconnectBackoffFactor?: number;
216
- reconnectJitterRatio?: number;
217
- pullRecoveryJitterMs?: number;
218
- heartbeatTimeoutMs?: number;
219
- }
220
-
221
- export interface SyncularNetworkStatusSource {
222
- isOnline(): boolean | undefined;
223
- addEventListener?(type: 'online' | 'offline', listener: () => void): void;
224
- removeEventListener?(type: 'online' | 'offline', listener: () => void): void;
225
- }
226
-
227
- export interface SyncularDatabaseSyncOptions {
228
- autoSyncAfterMutation?: boolean;
229
- mutationSyncDebounceMs?: number | false;
230
- network?: SyncularNetworkStatusSource | false;
231
- rowsChangedDebounceMs?: number | false;
232
- autoProcessBlobUploadsAfterStore?: boolean;
233
- blobUploadDebounceMs?: number | false;
234
- }
235
-
236
- export interface SyncularBlobUploadQueueProcessOptions {
237
- retryNow?: boolean;
238
- }
239
-
240
- export interface SyncularConsoleDiagnosticsOptions {
241
- enabled?: boolean;
242
- endpoint?: string;
243
- baseUrl?: string;
244
- token?: string;
245
- getHeaders?: () => SyncularAuthHeaders | Promise<SyncularAuthHeaders>;
246
- clientId?: string;
247
- actorId?: string;
248
- partitionId?: string;
249
- debounceMs?: number | false;
250
- maxPayloadBytes?: number;
251
- network?: SyncularNetworkStatusSource | false;
252
- }
253
-
254
- /**
255
- * Advanced lifecycle controls for `createSyncularDatabase`. The common knobs
256
- * (`realtime`, `pollIntervalMs`, `subscriptions`) live on
257
- * {@link CreateSyncularDatabaseOptions} directly.
258
- */
259
- export interface SyncularDatabaseLifecycleOptions {
260
- /**
261
- * Start the sync lifecycle while opening the database. Defaults to `true`
262
- * for remote databases and `false` for local
263
- * (`mode: 'local-sync-compatible'`) databases. When disabled, call
264
- * `database.start()` yourself.
265
- */
266
- autoStart?: boolean;
267
- /** Run an initial sync when the lifecycle starts. Defaults to `true`. */
268
- initialSync?: boolean;
269
- /** Sync after realtime (re)connects. Defaults to `true`. */
270
- syncOnRealtimeConnect?: boolean;
271
- }
272
-
273
- export type SyncularWorkerRequestTimeoutMs = number | false;
274
-
275
- export interface SyncularWorkerRequestTimeouts {
276
- /**
277
- * Timeout for ordinary short worker requests. Defaults to 30 seconds.
278
- * Use `false` to disable the ordinary request timeout.
279
- */
280
- defaultMs?: SyncularWorkerRequestTimeoutMs;
281
- /**
282
- * Timeout for sync/bootstrap requests. Defaults to `false` because initial
283
- * browser bootstrap and large pull/apply cycles can be legitimately long.
284
- */
285
- syncMs?: SyncularWorkerRequestTimeoutMs;
286
- /**
287
- * Timeout for blob transfer/queue requests. Defaults to `false`; transport
288
- * and auth layers should own network abort policy.
289
- */
290
- blobMs?: SyncularWorkerRequestTimeoutMs;
291
- /**
292
- * Timeout for local maintenance requests such as compaction, repair, reset,
293
- * and support bundle import/export. Defaults to `false`.
294
- */
295
- storageMaintenanceMs?: SyncularWorkerRequestTimeoutMs;
296
- /** Per-request override keyed by worker request type. */
297
- byType?: Record<string, SyncularWorkerRequestTimeoutMs | undefined>;
298
- }
299
-
300
- export interface CreateSyncularDatabaseOptions {
301
- config: SyncularClientConfig;
302
- worker?: Worker | (() => Worker);
303
- /**
304
- * Worker request timeout policy. A number preserves the legacy behavior and
305
- * applies to every request type. An object uses request-class defaults so
306
- * long-running sync/bootstrap/maintenance operations are not capped by the
307
- * ordinary request timeout.
308
- */
309
- requestTimeoutMs?:
310
- | SyncularWorkerRequestTimeoutMs
311
- | SyncularWorkerRequestTimeouts;
312
- /**
313
- * WASM runtime artifact to load. Defaults to the packaged 'full' artifact;
314
- * pass a variant name ('core', 'full-perf') or an explicit artifact.
315
- */
316
- runtime?: SyncularRuntimeArtifact | SyncularWasmArtifactVariant;
317
- runtimeArtifacts?: readonly SyncularRuntimeArtifactCandidate[];
318
- requiredRuntimeFeatures?: readonly string[];
319
- blobLimits?: SyncularBlobLimits;
320
- codecs?: ColumnCodecSource;
321
- appTables?: readonly string[];
322
- tableConfig?: SyncularTableConfigMap;
323
- getHeaders?: () => SyncularAuthHeaders | Promise<SyncularAuthHeaders>;
324
- authLifecycle?: SyncAuthLifecycle;
325
- diagnostics?: SyncularDiagnosticSink;
326
- consoleDiagnostics?: boolean | SyncularConsoleDiagnosticsOptions;
327
- /**
328
- * Realtime websocket options for the managed sync lifecycle. Defaults to
329
- * `true` (connect with default options) when the lifecycle starts.
330
- */
331
- realtime?: boolean | SyncularRealtimeOptions;
332
- /**
333
- * Interval polling fallback for the managed sync lifecycle. Off by default.
334
- */
335
- pollIntervalMs?: number | false;
336
- /** Sync subscriptions registered while opening the database. */
337
- subscriptions?: readonly SyncularSubscriptionSpec[];
338
- lifecycle?: SyncularDatabaseLifecycleOptions;
339
- sync?: SyncularDatabaseSyncOptions;
340
- }
341
-
342
- export interface SyncularRuntimeArtifact {
343
- wasmGlueUrl?: string | URL;
344
- wasmUrl?: string | URL | Request;
345
- }
346
-
347
- export interface SyncularRuntimeArtifactCandidate
348
- extends SyncularRuntimeArtifact {
349
- name?: string;
350
- features: readonly string[];
351
- }
352
-
353
- export interface SyncularRuntimeArtifactCatalog {
354
- catalogVersion: 1;
355
- packageName: string;
356
- packageVersion: string;
357
- generatedAt?: string;
358
- artifacts: readonly SyncularRuntimeArtifactCatalogEntry[];
359
- }
360
-
361
- export interface SyncularRuntimeArtifactCatalogEntry {
362
- name: string;
363
- variant?: string;
364
- profile?: string;
365
- features: readonly string[];
366
- rustFeatures?: readonly string[];
367
- wasmGlueUrl: string;
368
- wasmUrl: string;
369
- rawBytes?: number;
370
- gzipBytes?: number;
371
- }
372
-
373
- export type SyncularTableConfigMap = Record<string, SyncularTableConfig>;
374
-
375
- export interface SyncularTableConfig {
376
- primaryKeyColumn?: string;
377
- serverVersionColumn?: string | null;
378
- softDeleteColumn?: string | null;
379
- blobColumns?: readonly string[];
380
- crdtYjsFields?: readonly SyncularCrdtYjsFieldConfig[];
381
- encryptedFields?: readonly {
382
- field: string;
383
- scope?: string;
384
- rowIdField?: string;
385
- }[];
386
- }
387
-
388
- export interface SyncularAppSchema {
389
- schemaVersion: number;
390
- localBaseSchema?: SyncularLocalBaseSchema;
391
- tables: readonly SyncularAppTableMetadata[];
392
- migrations?: readonly SyncularEmbeddedMigration[];
393
- }
394
-
395
- export interface SyncularLocalBaseSchema {
396
- tableSetupSql: readonly string[];
397
- }
398
-
399
- export interface SyncularEmbeddedMigration {
400
- version: string;
401
- schemaVersion: number;
402
- name: string;
403
- upSql: string;
404
- }
405
-
406
- export interface SyncularAppTableMetadata {
407
- name: string;
408
- primaryKeyColumn: string;
409
- serverVersionColumn: string;
410
- softDeleteColumn?: string | null;
411
- subscriptionId: string;
412
- columns: readonly SyncularColumnMetadata[];
413
- blobColumns: readonly string[];
414
- crdtYjsFields: readonly SyncularCrdtYjsFieldMetadata[];
415
- encryptedFields: readonly SyncularEncryptedFieldMetadata[];
416
- scopes: readonly SyncularScopeMetadata[];
417
- }
418
-
419
- export interface SyncularColumnMetadata {
420
- name: string;
421
- typeFamily: string;
422
- notnullRequired: boolean;
423
- primaryKey: boolean;
424
- }
425
-
426
- export interface SyncularScopeMetadata {
427
- name: string;
428
- column: string;
429
- source: 'actorId' | 'projectId';
430
- required: boolean;
431
- }
432
-
433
- export interface SyncularCrdtYjsFieldMetadata {
434
- field: string;
435
- stateColumn: string;
436
- containerKey: string;
437
- rowIdField: string;
438
- kind: SyncularYjsFieldKind;
439
- syncMode: SyncularYjsSyncMode;
440
- }
441
-
442
- export interface SyncularEncryptedFieldMetadata {
443
- field: string;
444
- scope: string;
445
- rowIdField: string;
446
- }
447
-
448
- export type SyncularYjsFieldKind = 'text' | 'xml-fragment' | 'prosemirror';
449
- export type SyncularYjsSyncMode = 'server-merge' | 'encrypted-update-log';
450
-
451
- export interface SyncularCrdtYjsFieldConfig {
452
- field: string;
453
- stateColumn: string;
454
- containerKey?: string;
455
- rowIdField?: string;
456
- kind?: SyncularYjsFieldKind;
457
- syncMode?: SyncularYjsSyncMode;
458
- }
459
-
460
- export interface SyncularYjsUpdateEnvelope {
461
- updateId: string;
462
- updateBase64: string;
463
- }
464
-
465
- export type SyncularYjsUpdateInput =
466
- | SyncularYjsUpdateEnvelope
467
- | readonly SyncularYjsUpdateEnvelope[];
468
-
469
- export type SyncularYjsPayloadEnvelope<Field extends string = string> = {
470
- __yjs?: Partial<Record<Field, SyncularYjsUpdateInput>>;
471
- };
472
-
473
- export interface SyncularCrdtFieldRequest {
474
- table: string;
475
- rowId: string;
476
- field: string;
477
- }
478
-
479
- export interface SyncularCrdtFieldDescriptor extends SyncularCrdtFieldRequest {
480
- stateColumn: string;
481
- containerKey: string;
482
- rowIdField: string;
483
- kind: SyncularYjsFieldKind;
484
- syncMode: SyncularYjsSyncMode;
485
- }
486
-
487
- export interface SyncularCrdtFieldTextRequest extends SyncularCrdtFieldRequest {
488
- nextText: string;
489
- }
490
-
491
- export interface SyncularCrdtFieldYjsUpdateRequest
492
- extends SyncularCrdtFieldRequest {
493
- update: SyncularYjsUpdateEnvelope;
494
- }
495
-
496
- export interface SyncularCrdtFieldCompactionRequest
497
- extends SyncularCrdtFieldRequest {
498
- minUncheckpointedUpdates?: number;
499
- }
500
-
501
- export interface SyncularCrdtFieldWriteReceipt {
502
- clientCommitId: string;
503
- syncMode: SyncularYjsSyncMode;
504
- }
505
-
506
- export interface SyncularCrdtFieldMaterialization {
507
- value: unknown;
508
- stateBase64?: string | null;
509
- stateVectorBase64: string;
510
- }
511
-
512
- export interface SyncularCrdtDocumentSnapshot extends SyncularCrdtFieldRequest {
513
- documentKey: string;
514
- stateColumn: string;
515
- syncMode: SyncularYjsSyncMode;
516
- stateBase64?: string | null;
517
- stateVectorBase64: string;
518
- pendingUpdates: number;
519
- flushedUpdates: number;
520
- ackedUpdates: number;
521
- logUpdates: number;
522
- updatedAt: number;
523
- compactedAt?: number | null;
524
- }
525
-
526
- export type SyncularCrdtUpdateOrigin = 'local' | 'remote' | 'compaction';
527
- export type SyncularCrdtUpdateStatus =
528
- | 'pending'
529
- | 'flushed'
530
- | 'acked'
531
- | 'pruned';
532
-
533
- export interface SyncularCrdtUpdateLogEntry {
534
- id: number;
535
- documentKey: string;
536
- updateId: string;
537
- clientCommitId?: string | null;
538
- origin: SyncularCrdtUpdateOrigin;
539
- status: SyncularCrdtUpdateStatus;
540
- updateBase64: string;
541
- stateVectorBase64: string;
542
- createdAt: number;
543
- flushedAt?: number | null;
544
- ackedAt?: number | null;
545
- }
546
-
547
- export interface SyncularCrdtFieldCompactionStats {
548
- pendingUpdates: number;
549
- flushedUpdates: number;
550
- ackedUpdates: number;
551
- logUpdates: number;
552
- stateVectorBase64: string;
553
- updatedAt: number;
554
- compactedAt?: number | null;
555
- }
556
-
557
- export interface SyncularEncryptedCrdtStreamStats {
558
- updateCount: number;
559
- checkpointCount: number;
560
- checkpointableUpdateCount: number;
561
- maxServerSeq?: number | null;
562
- latestCheckpointCoversSeq?: number | null;
563
- }
564
-
565
- export interface SyncularCrdtFieldCompactionReceipt {
566
- checkpointCreated: boolean;
567
- clientCommitId?: string | null;
568
- before: SyncularCrdtFieldCompactionStats;
569
- after: SyncularCrdtFieldCompactionStats;
570
- encryptedStreamBefore?: SyncularEncryptedCrdtStreamStats | null;
571
- encryptedStreamAfter?: SyncularEncryptedCrdtStreamStats | null;
572
- }
573
-
574
- export interface SyncularBuildYjsTextUpdateArgs {
575
- previousStateBase64?: string | null;
576
- nextText: string;
577
- containerKey?: string;
578
- updateId?: string;
579
- }
580
-
581
- export interface SyncularBuildYjsTextUpdateResult {
582
- update: SyncularYjsUpdateEnvelope;
583
- nextStateBase64: string;
584
- nextText: string;
585
- }
586
-
587
- export interface SyncularApplyYjsTextUpdatesArgs {
588
- previousStateBase64?: string | null;
589
- updates: readonly SyncularYjsUpdateEnvelope[];
590
- containerKey?: string;
591
- }
592
-
593
- export interface SyncularApplyYjsTextUpdatesResult {
594
- nextStateBase64: string;
595
- text: string;
596
- }
597
-
598
- export interface SyncularApplyYjsEnvelopeToPayloadArgs {
599
- table: string;
600
- rowId?: string | null;
601
- payload: Record<string, unknown>;
602
- existingRow?: Record<string, unknown> | null;
603
- rules: readonly (SyncularCrdtYjsFieldConfig & { table: string })[];
604
- envelopeKey?: string;
605
- strict?: boolean;
606
- stripEnvelope?: boolean;
607
- }
608
-
609
- export interface SyncularSubscriptionSpec {
610
- id: string;
611
- table: string;
612
- scopes: Record<string, string | string[]>;
613
- params?: Record<string, unknown>;
614
- /**
615
- * Local-only startup phase. Lower phases bootstrap first; ready or currently
616
- * bootstrapping higher phases continue to participate in pull requests.
617
- */
618
- bootstrapPhase?: number;
619
- }
620
-
621
- export interface SyncularChangedRow {
622
- table: string;
623
- rowId?: string | null;
624
- operation: 'insert' | 'update' | 'delete' | 'compact' | string;
625
- changedFields: string[];
626
- crdtFields: string[];
627
- crdtFieldChanges?: SyncularChangedCrdtField[];
628
- commitId?: string | null;
629
- commitSeq?: number | null;
630
- subscriptionId?: string | null;
631
- serverVersion?: number | null;
632
- }
633
-
634
- export interface SyncularChangedCrdtField {
635
- field: string;
636
- stateColumn: string;
637
- containerKey: string;
638
- rowIdField: string;
639
- kind: string;
640
- syncMode: string;
641
- }
642
-
643
- export interface SyncularRowsChangedEvent {
644
- source: 'localWrite' | 'remotePull' | string;
645
- changedTables: string[];
646
- changedRows: SyncularChangedRow[];
647
- changedRowsTruncated?: boolean;
648
- }
649
-
650
- export type SyncularRowsChangedSink = (event: SyncularRowsChangedEvent) => void;
651
-
652
- export interface SyncularOutboxStats {
653
- pending: number;
654
- sending: number;
655
- failed: number;
656
- acked: number;
657
- total: number;
658
- }
659
-
660
- export interface SyncularConflictStats {
661
- unresolved: number;
662
- resolved: number;
663
- total: number;
664
- }
665
-
666
- export interface SyncularPresenceEntry<TMetadata = Record<string, unknown>> {
667
- clientId: string;
668
- actorId: string;
669
- joinedAt: number;
670
- metadata?: TMetadata;
671
- }
672
-
673
- export interface SyncularPresenceChangeEvent<
674
- TMetadata = Record<string, unknown>,
675
- > {
676
- scopeKey: string;
677
- presence: SyncularPresenceEntry<TMetadata>[];
678
- }
679
-
680
- export type SyncularPresenceSink<TMetadata = Record<string, unknown>> = (
681
- event: SyncularPresenceChangeEvent<TMetadata>
682
- ) => void;
683
-
684
- export interface SyncularBlobUploadEvent {
685
- ref: BlobRef;
686
- }
687
-
688
- export interface SyncularBlobUploadErrorEvent {
689
- hash: string;
690
- error: string;
691
- ref?: BlobRef;
692
- }
693
-
694
- export type SyncularLifecyclePhase =
695
- | 'closed'
696
- | 'offline'
697
- | 'connecting'
698
- | 'syncing'
699
- | 'recovering'
700
- | 'authRequired'
701
- | 'degraded'
702
- | 'complete';
703
-
704
- export interface SyncularLifecycleState {
705
- phase: SyncularLifecyclePhase;
706
- realtime: SyncularRealtimeConnectionState;
707
- online: boolean;
708
- requiresAction: boolean;
709
- pendingRequests: number;
710
- bootstrap?: Pick<
711
- SyncularBootstrapStatus,
712
- | 'complete'
713
- | 'criticalReady'
714
- | 'interactiveReady'
715
- | 'isBootstrapping'
716
- | 'progressPercent'
717
- >;
718
- outbox?: SyncularOutboxStats;
719
- conflicts?: SyncularConflictStats;
720
- blobUploads?: SyncularBlobUploadQueueStats;
721
- lastDiagnostic?: SyncularDiagnosticEvent;
722
- lastError?: {
723
- message: string;
724
- code?: string;
725
- };
726
- }
727
-
728
- export interface SyncularClientEventMap {
729
- rowsChanged: SyncularRowsChangedEvent;
730
- lifecycleChanged: SyncularLifecycleState;
731
- bootstrapChanged: SyncularBootstrapStatus;
732
- outboxChanged: SyncularOutboxStats;
733
- conflictsChanged: SyncularConflictStats;
734
- blobUploadsChanged: SyncularBlobUploadQueueStats;
735
- blobUploadCompleted: SyncularBlobUploadEvent;
736
- blobUploadFailed: SyncularBlobUploadErrorEvent;
737
- presenceChanged: SyncularPresenceChangeEvent;
738
- }
739
-
740
- export type SyncularClientEventType = keyof SyncularClientEventMap;
741
-
742
- export type SyncularClientEventSink<T extends SyncularClientEventType> = (
743
- event: SyncularClientEventMap[T]
744
- ) => void;
745
-
746
- export type SyncularErrorCode = CoreSyncularErrorCode;
747
-
748
- export type SyncularErrorCategory = CoreSyncularErrorCategory;
749
-
750
- export type SyncularErrorRecommendedAction = CoreSyncularErrorRecommendedAction;
751
-
752
- export interface SyncularSyncResult {
753
- changedTables: string[];
754
- changedRows: SyncularChangedRow[];
755
- changedRowsTruncated: boolean;
756
- subscriptions: SyncularSubscriptionResult[];
757
- bootstrap: SyncularBootstrapStatus;
758
- pushedCommits: number;
759
- timings: SyncularSyncTimings;
760
- }
761
-
762
- export interface SyncularSyncTimings {
763
- totalMs: number;
764
- pushMs: number;
765
- pullMs: number;
766
- pullRequestMs: number;
767
- syncPackDecodeMs: number;
768
- pullTransformMs: number;
769
- integrityVerifyMs: number;
770
- snapshotFetchMs: number;
771
- pullApplyMs: number;
772
- scopeClearMs: number;
773
- snapshotRowApplyMs: number;
774
- snapshotArtifactApplyMs: number;
775
- snapshotArtifactCheckpointMs: number;
776
- snapshotArtifactCheckpointCount: number;
777
- snapshotChunkApplyMs: number;
778
- snapshotChunkMaterializeMs: number;
779
- snapshotChunkResetMs: number;
780
- snapshotChunkBindMs: number;
781
- snapshotChunkStepMs: number;
782
- commitApplyMs: number;
783
- subscriptionStateMs: number;
784
- notifyMs: number;
785
- }
786
-
787
- export interface SyncularConflictSummary {
788
- id: string;
789
- clientCommitId: string;
790
- opIndex: number;
791
- resultStatus: string;
792
- message: string;
793
- code: string | null;
794
- serverVersion: number | null;
795
- resolvedAt: number | null;
796
- resolution: string | null;
797
- }
798
-
799
- export type SyncularConflictResolution =
800
- | 'keep-local'
801
- | 'keep-server'
802
- | 'dismiss';
803
-
804
- export interface SyncularSubscriptionResult {
805
- id: string;
806
- table: string;
807
- status: string;
808
- scopes: Record<string, string | string[]>;
809
- nextCursor: number;
810
- bootstrapPhase: number;
811
- bootstrapState: SyncularBootstrapState | null;
812
- ready: boolean;
813
- phase: SyncularBootstrapSubscriptionPhase;
814
- progressPercent: number;
815
- snapshotRows: unknown[];
816
- commits: unknown[];
817
- }
818
-
819
- export interface SyncularBootstrapState {
820
- asOfCommitSeq: number;
821
- tables: string[];
822
- tableIndex: number;
823
- rowCursor: string | null;
824
- }
825
-
826
- export type SyncularBootstrapSubscriptionPhase =
827
- | 'pending'
828
- | 'bootstrapping'
829
- | 'live'
830
- | 'error'
831
- | string;
832
-
833
- export type SyncularBootstrapChannelPhase =
834
- | 'idle'
835
- | 'bootstrapping'
836
- | 'live'
837
- | 'error'
838
- | string;
839
-
840
- export interface SyncularBootstrapSubscriptionStatus {
841
- id: string;
842
- table: string;
843
- expected: boolean;
844
- ready: boolean;
845
- status: string | null;
846
- phase: SyncularBootstrapSubscriptionPhase;
847
- progressPercent: number;
848
- cursor: number | null;
849
- bootstrapState: SyncularBootstrapState | null;
850
- bootstrapPhase: number;
851
- }
852
-
853
- export interface SyncularBootstrapPhaseStatus {
854
- phase: number;
855
- expectedSubscriptionIds: string[];
856
- readySubscriptionIds: string[];
857
- pendingSubscriptionIds: string[];
858
- isReady: boolean;
859
- progressPercent: number;
860
- }
861
-
862
- export interface SyncularBootstrapStatus {
863
- channelPhase: SyncularBootstrapChannelPhase;
864
- progressPercent: number;
865
- isBootstrapping: boolean;
866
- criticalReady: boolean;
867
- interactiveReady: boolean;
868
- complete: boolean;
869
- activePhase: number | null;
870
- expectedSubscriptionIds: string[];
871
- readySubscriptionIds: string[];
872
- pendingSubscriptionIds: string[];
873
- subscriptions: SyncularBootstrapSubscriptionStatus[];
874
- phases: SyncularBootstrapPhaseStatus[];
875
- }
876
-
877
- export interface SyncularSchemaState {
878
- schemaId: string;
879
- schemaVersion: number | null;
880
- currentSchemaVersion: number;
881
- updatedAt: number | null;
882
- }
883
-
884
- export type SyncularLocalHealthSeverity = 'info' | 'warning' | 'error';
885
-
886
- export type SyncularLocalHealthRepairAction =
887
- | 'forceRebootstrap'
888
- | 'clearOrphanedState'
889
- | 'clearOrphanedSyncedRows'
890
- | 'manualInspection';
891
-
892
- export interface SyncularLocalHealthFinding {
893
- severity: SyncularLocalHealthSeverity;
894
- code: string;
895
- component: string;
896
- message: string;
897
- subscriptionId?: string;
898
- table?: string;
899
- repairAction?: SyncularLocalHealthRepairAction;
900
- details?: Record<string, unknown>;
901
- }
902
-
903
- export interface SyncularLocalHealthReport {
904
- generatedAt: number;
905
- ok: boolean;
906
- checkedSubscriptions: number;
907
- checkedSubscriptionStates: number;
908
- checkedVerifiedRoots: number;
909
- checkedOutboxCommits: number;
910
- checkedConflicts: number;
911
- checkedSyncedRows: number;
912
- checkedBlobReferences: number;
913
- checkedCrdtDocuments: number;
914
- checkedCrdtUpdateLogEntries: number;
915
- findings: SyncularLocalHealthFinding[];
916
- }
917
-
918
- export interface SyncularLocalHealthRepairRequest {
919
- action: SyncularLocalHealthRepairAction;
920
- subscriptionIds?: readonly string[];
921
- tables?: readonly string[];
922
- }
923
-
924
- export interface SyncularLocalHealthRepairReport {
925
- action: SyncularLocalHealthRepairAction;
926
- deletedSubscriptionStates: number;
927
- deletedVerifiedRoots: number;
928
- forcedRebootstrapSubscriptions: number;
929
- clearedOrphanedSyncedRows: number;
930
- clearedTables: string[];
931
- }
932
-
933
- export interface SyncularLocalSyncResetRequest {
934
- subscriptionIds?: readonly string[];
935
- clearSyncedRows?: boolean;
936
- }
937
-
938
- export interface SyncularLocalSyncResetReport {
939
- resetSubscriptions: number;
940
- deletedSubscriptionStates: number;
941
- deletedVerifiedRoots: number;
942
- clearedSyncedRows: number;
943
- clearedTables: string[];
944
- }
945
-
946
- export interface SyncularLocalSupportSubscription {
947
- id: string;
948
- table: string;
949
- scopeKeys: string[];
950
- scopeValueCount: number;
951
- paramsKeys: string[];
952
- paramsValueCount: number;
953
- bootstrapPhase: number;
954
- }
955
-
956
- export interface SyncularLocalSupportSubscriptionState {
957
- stateId: string;
958
- subscriptionId: string;
959
- table: string;
960
- scopeKeys: string[];
961
- scopeValueCount: number;
962
- paramsKeys: string[];
963
- paramsValueCount: number;
964
- cursor: number;
965
- status: string;
966
- bootstrapStatePresent: boolean;
967
- bootstrapStateByteLen: number;
968
- }
969
-
970
- export interface SyncularLocalSupportVerifiedRoot {
971
- stateId: string;
972
- subscriptionId: string;
973
- partitionIdPresent: boolean;
974
- partitionIdByteLen: number;
975
- commitSeq: number;
976
- rootByteLen: number;
977
- rootIsCanonicalHex: boolean;
978
- }
979
-
980
- export interface SyncularLocalSupportOutboxSummary {
981
- total: number;
982
- byStatus: Record<string, number>;
983
- bySchemaVersion: Record<string, number>;
984
- }
985
-
986
- export interface SyncularLocalSupportConflictSummary {
987
- total: number;
988
- unresolved: number;
989
- resolved: number;
990
- byResultStatus: Record<string, number>;
991
- byCode: Record<string, number>;
992
- }
993
-
994
- export interface SyncularLocalSupportBundle {
995
- formatVersion: number;
996
- generatedAt: number;
997
- redacted: true;
998
- source: string;
999
- health: SyncularLocalHealthReport;
1000
- appSchemaState: SyncularSchemaState;
1001
- subscriptions: SyncularLocalSupportSubscription[];
1002
- subscriptionStates: SyncularLocalSupportSubscriptionState[];
1003
- verifiedRoots: SyncularLocalSupportVerifiedRoot[];
1004
- outbox: SyncularLocalSupportOutboxSummary;
1005
- conflicts: SyncularLocalSupportConflictSummary;
1006
- blob?: Record<string, number>;
1007
- crdt?: Record<string, number>;
1008
- }
1009
-
1010
- export interface SyncularLocalSupportBundleImportReport {
1011
- formatVersion: number;
1012
- generatedAt: number;
1013
- redacted: boolean;
1014
- source: string;
1015
- healthOk: boolean;
1016
- findingCount: number;
1017
- subscriptionCount: number;
1018
- subscriptionStateCount: number;
1019
- verifiedRootCount: number;
1020
- checkedSubscriptionStates: number;
1021
- checkedVerifiedRoots: number;
1022
- checkedOutboxCommits: number;
1023
- checkedConflicts: number;
1024
- checkedSyncedRows: number;
1025
- }
1026
-
1027
- export interface SyncularRustRuntimeInfo {
1028
- crateName: string;
1029
- crateVersion: string;
1030
- schemaVersion: number;
1031
- features: string[];
1032
- }
1033
-
1034
- export interface SyncularRuntimeInfo {
1035
- packageName: string;
1036
- packageVersion: string;
1037
- workerProtocolVersion: number;
1038
- storage?: SyncularStorage;
1039
- storageFallback?: SyncularStorageFallbackInfo;
1040
- workerUrl?: string;
1041
- wasmGlueUrl: string;
1042
- wasmUrl: string;
1043
- rust?: SyncularRustRuntimeInfo;
1044
- }
1045
-
1046
- export interface SyncularStorageFallbackInfo {
1047
- from: SyncularStorage;
1048
- to: SyncularStorage;
1049
- reason: string;
1050
- }
1051
-
1052
- export interface SyncularConnectionState {
1053
- closed: boolean;
1054
- pendingRequests: number;
1055
- realtime: SyncularRealtimeConnectionState;
1056
- storageFallback?: SyncularStorageFallbackInfo;
1057
- lastDiagnostic?: SyncularDiagnosticEvent;
1058
- lastError?: {
1059
- message: string;
1060
- code?: string;
1061
- };
1062
- }
1063
-
1064
- export interface SyncularDiagnosticSubscriptionSnapshot {
1065
- id: string;
1066
- table: string;
1067
- scopeKeys: string[];
1068
- scopeValueCount: number;
1069
- paramsKeys: string[];
1070
- paramsValueCount: number;
1071
- status: string | null;
1072
- ready: boolean;
1073
- phase: SyncularBootstrapSubscriptionPhase;
1074
- progressPercent: number;
1075
- cursor: number | null;
1076
- bootstrapPhase: number;
1077
- bootstrapState: SyncularBootstrapState | null;
1078
- }
1079
-
1080
- export interface SyncularDiagnosticSnapshot {
1081
- generatedAt: number;
1082
- runtime: SyncularRuntimeInfo;
1083
- connection: SyncularConnectionState;
1084
- subscriptions: SyncularDiagnosticSubscriptionSnapshot[];
1085
- recentDiagnostics: SyncularDiagnosticEvent[];
1086
- recentSyncTimings: SyncularSyncTimings[];
1087
- bootstrap?: SyncularBootstrapStatus;
1088
- transportStats?: SyncularTransportStats;
1089
- outboxStats?: SyncularOutboxStats;
1090
- conflictStats?: SyncularConflictStats;
1091
- blobUploadStats?: SyncularBlobUploadQueueStats;
1092
- }
1093
-
1094
- export interface SyncularSqlResult<
1095
- Row extends Record<string, unknown> = Record<string, unknown>,
1096
- > {
1097
- rows: Row[];
1098
- numAffectedRows?: number;
1099
- insertId?: number;
1100
- }
1101
-
1102
- export interface SyncularLiveQuerySnapshot<
1103
- Row extends Record<string, unknown> = Record<string, unknown>,
1104
- > {
1105
- id: string;
1106
- rows: Row[];
1107
- }
1108
-
1109
- export interface SyncularLiveQueryEvent<
1110
- Row extends Record<string, unknown> = Record<string, unknown>,
1111
- > {
1112
- queryId: string;
1113
- version: number;
1114
- changedRows: SyncularChangedRow[];
1115
- rows: Row[];
1116
- }
1117
-
1118
- export interface SyncularLiveQueryDependencyHint {
1119
- table: string;
1120
- rowIds?: readonly string[];
1121
- fields?: readonly string[];
1122
- }
1123
-
1124
- export interface SyncularLiveQueryDiagnostic {
1125
- id: string;
1126
- tables: string[];
1127
- dependencyHintCount: number;
1128
- rerunCount: number;
1129
- skippedRerunCount: number;
1130
- emittedEventCount: number;
1131
- }
1132
-
1133
- export interface SyncularLiveQueryDiagnostics {
1134
- queries: SyncularLiveQueryDiagnostic[];
1135
- }
1136
-
1137
- export interface SyncularLiveQueries {
1138
- live<Row extends Record<string, unknown>>(
1139
- query: { compile(): CompiledQuery },
1140
- options: SyncularLiveQueryOptions<Row>
1141
- ): Promise<SyncularLiveQuerySubscription>;
1142
- }
1143
-
1144
- export interface SyncularLiveQueryOptions<Row extends Record<string, unknown>> {
1145
- tables?: readonly string[];
1146
- /**
1147
- * Optional row/field dependency hints for queries whose dependencies cannot
1148
- * be inferred safely from the query-builder AST, such as aliased or raw SQL.
1149
- * Hints must reference one of the observed tables.
1150
- */
1151
- dependencyHints?: readonly SyncularLiveQueryDependencyHint[];
1152
- onChange(rows: Row[], event: SyncularLiveQueryChange<Row>): void;
1153
- }
1154
-
1155
- export interface SyncularLiveQueryChange<Row extends Record<string, unknown>>
1156
- extends SyncularLiveQueryEvent<Row> {
1157
- initial: boolean;
1158
- }
1159
-
1160
- export interface SyncularLiveQuerySubscription {
1161
- id: string;
1162
- unsubscribe(): void;
1163
- }
1164
-
1165
- export interface SyncularSqlClient {
1166
- executeSql<Row extends Record<string, unknown> = Record<string, unknown>>(
1167
- sql: string,
1168
- params?: readonly unknown[]
1169
- ): Promise<SyncularSqlResult<Row>>;
1170
- subscribeQuery<Row extends Record<string, unknown> = Record<string, unknown>>(
1171
- sql: string,
1172
- params: readonly unknown[],
1173
- tables: readonly string[],
1174
- hints?: readonly SyncularLiveQueryDependencyHint[]
1175
- ): Promise<SyncularLiveQuerySnapshot<Row>>;
1176
- unsubscribeQuery(id: string): Promise<void>;
1177
- drainLiveQueryEvents<
1178
- Row extends Record<string, unknown> = Record<string, unknown>,
1179
- >(): Promise<Array<SyncularLiveQueryEvent<Row>>>;
1180
- close(): Promise<void>;
1181
- }
1182
-
1183
- export interface SyncularUnsafeSqlClient extends SyncularSqlClient {
1184
- executeUnsafeSql<
1185
- Row extends Record<string, unknown> = Record<string, unknown>,
1186
- >(sql: string, params?: readonly unknown[]): Promise<SyncularSqlResult<Row>>;
1187
- }
1188
-
1189
- export interface SyncularBlobStoreOptions {
1190
- mimeType?: string;
1191
- immediate?: boolean;
1192
- }
1193
-
1194
- export interface SyncularBlobLimits {
1195
- maxPayloadBytes?: number;
1196
- }
1197
-
1198
- export interface SyncularBlobUploadQueueStats {
1199
- pending: number;
1200
- uploading: number;
1201
- failed: number;
1202
- }
1203
-
1204
- export interface SyncularBlobCacheStats {
1205
- count: number;
1206
- totalBytes: number;
1207
- }
1208
-
1209
- export interface SyncularStorageCompactionOptions {
1210
- olderThanMs?: number;
1211
- maxBlobCacheBytes?: number;
1212
- pruneAckedOutbox?: boolean;
1213
- pruneResolvedConflicts?: boolean;
1214
- pruneFailedBlobUploads?: boolean;
1215
- pruneInactiveSubscriptionStates?: boolean;
1216
- pruneTombstones?: boolean;
1217
- maxTombstoneServerVersion?: number;
1218
- pruneEncryptedCrdtUpdates?: boolean;
1219
- maxEncryptedCrdtCheckpointsPerStream?: number;
1220
- pruneCrdtUpdateLog?: boolean;
1221
- }
1222
-
1223
- export interface SyncularStorageCompactionReport {
1224
- ackedOutboxCommitsDeleted: number;
1225
- resolvedConflictsDeleted: number;
1226
- failedBlobUploadsDeleted: number;
1227
- inactiveSubscriptionStatesDeleted: number;
1228
- tombstoneRowsDeleted: number;
1229
- blobCacheBytesPruned: number;
1230
- encryptedCrdtUpdatesDeleted: number;
1231
- encryptedCrdtCheckpointsDeleted: number;
1232
- crdtUpdateLogDeleted: number;
1233
- }
1234
-
1235
- export interface SyncularBlobs {
1236
- store(
1237
- data: Blob | File | Uint8Array,
1238
- options?: SyncularBlobStoreOptions
1239
- ): Promise<BlobRef>;
1240
- retrieve(ref: BlobRef): Promise<Uint8Array>;
1241
- isLocal(hash: string): Promise<boolean>;
1242
- preload(refs: readonly BlobRef[]): Promise<void>;
1243
- processUploadQueue(
1244
- options?: SyncularBlobUploadQueueProcessOptions
1245
- ): Promise<{ uploaded: number; failed: number }>;
1246
- getUploadQueueStats(): Promise<SyncularBlobUploadQueueStats>;
1247
- getCacheStats(): Promise<SyncularBlobCacheStats>;
1248
- pruneCache(maxBytes?: number): Promise<number>;
1249
- clearCache(): Promise<void>;
1250
- }
1251
-
1252
- export interface SyncularRuntimeClient extends SyncularSqlClient {
1253
- setAuthHeaders(headers: SyncularAuthHeaders): Promise<void>;
1254
- issueAuthLease(
1255
- request: SyncAuthLeaseIssueRequest
1256
- ): Promise<SyncularAuthLeaseRecord>;
1257
- upsertAuthLease(lease: SyncularAuthLeaseRecord): Promise<void>;
1258
- authLease(leaseId: string): Promise<SyncularAuthLeaseRecord | null>;
1259
- activeAuthLeases(
1260
- actorId?: string | null,
1261
- nowMs?: number
1262
- ): Promise<SyncularAuthLeaseRecord[]>;
1263
- setFieldEncryption(
1264
- config: SyncularFieldEncryptionConfig | null
1265
- ): Promise<void>;
1266
- setEncryptedCrdt(config: SyncularEncryptedCrdtConfig | null): Promise<void>;
1267
- setBlobEncryption(config: SyncularBlobEncryptionConfig | null): Promise<void>;
1268
- startRealtime(options?: boolean | SyncularRealtimeOptions): Promise<void>;
1269
- stopRealtime(): Promise<void>;
1270
- setSubscriptions(
1271
- subscriptions: readonly SyncularSubscriptionSpec[]
1272
- ): Promise<void>;
1273
- forceSubscriptionsBootstrap(
1274
- subscriptionIds?: readonly string[]
1275
- ): Promise<number>;
1276
- applyMutation(operation: SyncOperation, localRow?: unknown): Promise<string>;
1277
- applyLeasedMutation(
1278
- operation: SyncOperation,
1279
- localRow?: unknown
1280
- ): Promise<string>;
1281
- applyMutationsBatch(
1282
- operations: Array<{ operation: SyncOperation; localRow?: unknown | null }>
1283
- ): Promise<string[]>;
1284
- applyMutationsCommit(
1285
- operations: Array<{ operation: SyncOperation; localRow?: unknown | null }>
1286
- ): Promise<string>;
1287
- applyLeasedMutationsCommit(
1288
- operations: Array<{ operation: SyncOperation; localRow?: unknown | null }>
1289
- ): Promise<string>;
1290
- syncPull(options?: SyncularSyncRequestOptions): Promise<SyncularSyncResult>;
1291
- syncPush(options?: SyncularSyncRequestOptions): Promise<SyncularSyncResult>;
1292
- syncOnce(options?: SyncularSyncRequestOptions): Promise<SyncularSyncResult>;
1293
- resumeFromBackground(
1294
- options?: SyncularSyncRequestOptions
1295
- ): Promise<SyncularSyncResult>;
1296
- conflictSummaries(): Promise<SyncularConflictSummary[]>;
1297
- retryConflictKeepLocal(id: string): Promise<string>;
1298
- resolveConflict(
1299
- id: string,
1300
- resolution: SyncularConflictResolution
1301
- ): Promise<void>;
1302
- listTable<Row extends Record<string, unknown> = Record<string, unknown>>(
1303
- table: string
1304
- ): Promise<Row[]>;
1305
- storeBlob(
1306
- data: Uint8Array,
1307
- options?: SyncularBlobStoreOptions
1308
- ): Promise<BlobRef>;
1309
- retrieveBlob(ref: BlobRef): Promise<Uint8Array>;
1310
- isBlobLocal(hash: string): Promise<boolean>;
1311
- processBlobUploadQueue(
1312
- options?: SyncularBlobUploadQueueProcessOptions
1313
- ): Promise<{ uploaded: number; failed: number }>;
1314
- blobUploadQueueStats(): Promise<SyncularBlobUploadQueueStats>;
1315
- blobCacheStats(): Promise<SyncularBlobCacheStats>;
1316
- pruneBlobCache(maxBytes?: number): Promise<number>;
1317
- clearBlobCache(): Promise<void>;
1318
- compactStorage(
1319
- options?: SyncularStorageCompactionOptions
1320
- ): Promise<SyncularStorageCompactionReport>;
1321
- generatedSchemaState(): Promise<SyncularSchemaState>;
1322
- localHealthCheck(): Promise<SyncularLocalHealthReport>;
1323
- repairLocalHealth(
1324
- request: SyncularLocalHealthRepairRequest
1325
- ): Promise<SyncularLocalHealthRepairReport>;
1326
- resetLocalSyncState(
1327
- request?: SyncularLocalSyncResetRequest
1328
- ): Promise<SyncularLocalSyncResetReport>;
1329
- exportLocalSupportBundle(): Promise<SyncularLocalSupportBundle>;
1330
- importLocalSupportBundle(
1331
- bundle: SyncularLocalSupportBundle | string
1332
- ): Promise<SyncularLocalSupportBundleImportReport>;
1333
- buildYjsTextUpdate(
1334
- args: SyncularBuildYjsTextUpdateArgs
1335
- ): Promise<SyncularBuildYjsTextUpdateResult>;
1336
- applyYjsTextUpdates(
1337
- args: SyncularApplyYjsTextUpdatesArgs
1338
- ): Promise<SyncularApplyYjsTextUpdatesResult>;
1339
- applyYjsEnvelopeToPayload(
1340
- args: SyncularApplyYjsEnvelopeToPayloadArgs
1341
- ): Promise<Record<string, unknown>>;
1342
- openCrdtField(
1343
- request: SyncularCrdtFieldRequest
1344
- ): Promise<SyncularCrdtFieldDescriptor>;
1345
- applyCrdtFieldText(
1346
- request: SyncularCrdtFieldTextRequest
1347
- ): Promise<SyncularCrdtFieldWriteReceipt>;
1348
- applyCrdtFieldYjsUpdate(
1349
- request: SyncularCrdtFieldYjsUpdateRequest
1350
- ): Promise<SyncularCrdtFieldWriteReceipt>;
1351
- materializeCrdtField(
1352
- request: SyncularCrdtFieldRequest
1353
- ): Promise<SyncularCrdtFieldMaterialization>;
1354
- crdtDocumentSnapshot(
1355
- request: SyncularCrdtFieldRequest
1356
- ): Promise<SyncularCrdtDocumentSnapshot>;
1357
- crdtUpdateLog(
1358
- request: SyncularCrdtFieldRequest & { limit?: number }
1359
- ): Promise<SyncularCrdtUpdateLogEntry[]>;
1360
- snapshotCrdtFieldStateVector(
1361
- request: SyncularCrdtFieldRequest
1362
- ): Promise<{ stateVectorBase64: string }>;
1363
- compactCrdtField(
1364
- request: SyncularCrdtFieldCompactionRequest
1365
- ): Promise<SyncularCrdtFieldCompactionReceipt>;
1366
- encryptionHelper(
1367
- method: SyncularEncryptionHelperMethod,
1368
- args?: unknown
1369
- ): Promise<unknown>;
1370
- runtimeInfo(): Promise<SyncularRuntimeInfo>;
1371
- connectionState(): SyncularConnectionState;
1372
- lifecycleState(): SyncularLifecycleState;
1373
- diagnosticSnapshot(): Promise<SyncularDiagnosticSnapshot>;
1374
- addDiagnosticListener(listener: SyncularDiagnosticSink): () => void;
1375
- addEventListener<T extends SyncularClientEventType>(
1376
- event: T,
1377
- listener: SyncularClientEventSink<T>
1378
- ): () => void;
1379
- addRowsChangedListener(listener: SyncularRowsChangedSink): () => void;
1380
- getPresence<TMetadata = Record<string, unknown>>(
1381
- scopeKey: string
1382
- ): SyncularPresenceEntry<TMetadata>[];
1383
- joinPresence(scopeKey: string, metadata?: Record<string, unknown>): void;
1384
- leavePresence(scopeKey: string): void;
1385
- updatePresenceMetadata(
1386
- scopeKey: string,
1387
- metadata: Record<string, unknown>
1388
- ): void;
1389
- addPresenceListener<TMetadata = Record<string, unknown>>(
1390
- listener: SyncularPresenceSink<TMetadata>
1391
- ): () => void;
1392
- addLiveQueryListener(
1393
- queryId: string,
1394
- listener: (event: SyncularLiveQueryEvent<Record<string, unknown>>) => void
1395
- ): void;
1396
- removeLiveQueryListener(queryId: string): void;
1397
- }