@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.
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
@@ -0,0 +1,477 @@
1
+ import type {
2
+ SyncularChangedRow,
3
+ SyncularCrdtDocumentSnapshot,
4
+ SyncularCrdtFieldCompactionReceipt,
5
+ SyncularCrdtFieldDescriptor,
6
+ SyncularCrdtFieldMaterialization,
7
+ SyncularCrdtFieldRequest,
8
+ SyncularCrdtFieldWriteReceipt,
9
+ SyncularCrdtFieldYjsUpdateRequest,
10
+ SyncularCrdtUpdateLogEntry,
11
+ SyncularRowsChangedEvent,
12
+ } from '@syncular/client';
13
+ import type { SyncularCrdtProjectionHost } from './yjs-document-field-adapter';
14
+
15
+ export const SYNCULAR_CRDT_WEBVIEW_PROTOCOL = 'syncular.crdt.host.v1';
16
+ export const SYNCULAR_CRDT_WEBVIEW_REQUEST = 'syncular.crdt.host.request';
17
+ export const SYNCULAR_CRDT_WEBVIEW_RESPONSE = 'syncular.crdt.host.response';
18
+ export const SYNCULAR_CRDT_WEBVIEW_ROWS_CHANGED =
19
+ 'syncular.crdt.host.rowsChanged';
20
+
21
+ export interface SyncularCrdtWebViewTransport {
22
+ postMessage(message: SyncularCrdtHostMessage): void;
23
+ addMessageListener(listener: (message: unknown) => void): () => void;
24
+ }
25
+
26
+ export interface SyncularCrdtJsonTransportOptions {
27
+ postJsonMessage(message: string): void;
28
+ addJsonMessageListener(listener: (message: string) => void): () => void;
29
+ onInvalidMessage?: (error: unknown, message: string) => void;
30
+ }
31
+
32
+ export interface SyncularCrdtWebViewHostOptions {
33
+ transport: SyncularCrdtWebViewTransport;
34
+ requestId?: () => string;
35
+ timeoutMs?: number;
36
+ }
37
+
38
+ export interface SyncularCrdtWebViewHostResponderOptions {
39
+ transport: SyncularCrdtWebViewTransport;
40
+ host: SyncularCrdtProjectionHost;
41
+ publishRowsChanged?: boolean;
42
+ }
43
+
44
+ export interface SyncularCrdtWebViewHost {
45
+ host: SyncularCrdtProjectionHost;
46
+ close(): void;
47
+ }
48
+
49
+ export interface SyncularCrdtWebViewHostResponder {
50
+ close(): void;
51
+ }
52
+
53
+ export interface SyncularCrdtHostErrorPayload {
54
+ message: string;
55
+ name?: string;
56
+ code?: string;
57
+ details?: unknown;
58
+ }
59
+
60
+ export interface SyncularCrdtHostMethodMap {
61
+ openCrdtField: {
62
+ request: SyncularCrdtFieldRequest;
63
+ response: SyncularCrdtFieldDescriptor;
64
+ };
65
+ applyCrdtFieldYjsUpdate: {
66
+ request: SyncularCrdtFieldYjsUpdateRequest;
67
+ response: SyncularCrdtFieldWriteReceipt;
68
+ };
69
+ enqueueCrdtFieldYjsUpdate: {
70
+ request: SyncularCrdtFieldYjsUpdateRequest;
71
+ response: string;
72
+ };
73
+ materializeCrdtField: {
74
+ request: SyncularCrdtFieldRequest;
75
+ response: SyncularCrdtFieldMaterialization;
76
+ };
77
+ crdtDocumentSnapshot: {
78
+ request: SyncularCrdtFieldRequest;
79
+ response: SyncularCrdtDocumentSnapshot;
80
+ };
81
+ crdtUpdateLog: {
82
+ request: SyncularCrdtFieldRequest & { limit?: number };
83
+ response: SyncularCrdtUpdateLogEntry[];
84
+ };
85
+ snapshotCrdtFieldStateVector: {
86
+ request: SyncularCrdtFieldRequest;
87
+ response: { stateVectorBase64: string };
88
+ };
89
+ compactCrdtField: {
90
+ request: SyncularCrdtFieldRequest & {
91
+ minUncheckpointedUpdates?: number;
92
+ };
93
+ response: SyncularCrdtFieldCompactionReceipt;
94
+ };
95
+ }
96
+
97
+ export type SyncularCrdtHostMethod = keyof SyncularCrdtHostMethodMap;
98
+
99
+ export type SyncularCrdtHostRequestMessage = {
100
+ [Method in SyncularCrdtHostMethod]: {
101
+ protocol: typeof SYNCULAR_CRDT_WEBVIEW_PROTOCOL;
102
+ type: typeof SYNCULAR_CRDT_WEBVIEW_REQUEST;
103
+ id: string;
104
+ method: Method;
105
+ request: SyncularCrdtHostMethodMap[Method]['request'];
106
+ };
107
+ }[SyncularCrdtHostMethod];
108
+
109
+ export type SyncularCrdtHostResponseMessage =
110
+ | {
111
+ protocol: typeof SYNCULAR_CRDT_WEBVIEW_PROTOCOL;
112
+ type: typeof SYNCULAR_CRDT_WEBVIEW_RESPONSE;
113
+ id: string;
114
+ ok: true;
115
+ response: unknown;
116
+ }
117
+ | {
118
+ protocol: typeof SYNCULAR_CRDT_WEBVIEW_PROTOCOL;
119
+ type: typeof SYNCULAR_CRDT_WEBVIEW_RESPONSE;
120
+ id: string;
121
+ ok: false;
122
+ error: SyncularCrdtHostErrorPayload;
123
+ };
124
+
125
+ export interface SyncularCrdtHostRowsChangedMessage {
126
+ protocol: typeof SYNCULAR_CRDT_WEBVIEW_PROTOCOL;
127
+ type: typeof SYNCULAR_CRDT_WEBVIEW_ROWS_CHANGED;
128
+ event: SyncularRowsChangedEvent;
129
+ }
130
+
131
+ export type SyncularCrdtHostMessage =
132
+ | SyncularCrdtHostRequestMessage
133
+ | SyncularCrdtHostResponseMessage
134
+ | SyncularCrdtHostRowsChangedMessage;
135
+
136
+ export interface SyncularNativeRowsChangedEventLike {
137
+ kind: string;
138
+ tables?: string[];
139
+ changedRows?: SyncularChangedRow[];
140
+ payload_json?: {
141
+ source?: string | null;
142
+ changedRows?: SyncularChangedRow[];
143
+ };
144
+ }
145
+
146
+ export function createSyncularCrdtJsonTransport(
147
+ options: SyncularCrdtJsonTransportOptions
148
+ ): SyncularCrdtWebViewTransport {
149
+ return {
150
+ postMessage(message) {
151
+ options.postJsonMessage(JSON.stringify(message));
152
+ },
153
+ addMessageListener(listener) {
154
+ return options.addJsonMessageListener((message) => {
155
+ try {
156
+ const parsed = JSON.parse(message);
157
+ if (isSyncularCrdtHostMessage(parsed)) {
158
+ listener(parsed);
159
+ }
160
+ } catch (error) {
161
+ options.onInvalidMessage?.(error, message);
162
+ }
163
+ });
164
+ },
165
+ };
166
+ }
167
+
168
+ interface PendingRequest {
169
+ resolve: (value: unknown) => void;
170
+ reject: (error: unknown) => void;
171
+ timer: ReturnType<typeof setTimeout> | undefined;
172
+ }
173
+
174
+ export function createSyncularCrdtWebViewHost(
175
+ options: SyncularCrdtWebViewHostOptions
176
+ ): SyncularCrdtWebViewHost {
177
+ const timeoutMs = options.timeoutMs ?? 15_000;
178
+ const nextRequestId = options.requestId ?? randomRequestId;
179
+ const pending = new Map<string, PendingRequest>();
180
+ const rowsChangedListeners = new Set<
181
+ (event: SyncularRowsChangedEvent) => void
182
+ >();
183
+ let closed = false;
184
+
185
+ const unsubscribe = options.transport.addMessageListener((message) => {
186
+ if (!isSyncularCrdtHostMessage(message)) return;
187
+ if (message.type === SYNCULAR_CRDT_WEBVIEW_RESPONSE) {
188
+ const request = pending.get(message.id);
189
+ if (!request) return;
190
+ pending.delete(message.id);
191
+ if (request.timer != null) clearTimeout(request.timer);
192
+ if (message.ok) {
193
+ request.resolve(message.response);
194
+ } else {
195
+ request.reject(errorFromPayload(message.error));
196
+ }
197
+ return;
198
+ }
199
+
200
+ if (message.type === SYNCULAR_CRDT_WEBVIEW_ROWS_CHANGED) {
201
+ for (const listener of rowsChangedListeners) listener(message.event);
202
+ }
203
+ });
204
+
205
+ const request = <Method extends SyncularCrdtHostMethod>(
206
+ method: Method,
207
+ payload: SyncularCrdtHostMethodMap[Method]['request']
208
+ ): Promise<SyncularCrdtHostMethodMap[Method]['response']> => {
209
+ if (closed) {
210
+ return Promise.reject(new Error('Syncular CRDT WebView host is closed'));
211
+ }
212
+ const id = nextRequestId();
213
+ const message: SyncularCrdtHostRequestMessage = {
214
+ protocol: SYNCULAR_CRDT_WEBVIEW_PROTOCOL,
215
+ type: SYNCULAR_CRDT_WEBVIEW_REQUEST,
216
+ id,
217
+ method,
218
+ request: payload,
219
+ } as SyncularCrdtHostRequestMessage;
220
+
221
+ return new Promise<unknown>((resolve, reject) => {
222
+ const timer =
223
+ timeoutMs > 0
224
+ ? setTimeout(() => {
225
+ pending.delete(id);
226
+ reject(
227
+ new Error(
228
+ `Syncular CRDT WebView host request timed out: ${method}`
229
+ )
230
+ );
231
+ }, timeoutMs)
232
+ : undefined;
233
+ pending.set(id, { resolve, reject, timer });
234
+ try {
235
+ options.transport.postMessage(message);
236
+ } catch (error) {
237
+ pending.delete(id);
238
+ if (timer != null) clearTimeout(timer);
239
+ reject(error);
240
+ }
241
+ }) as Promise<SyncularCrdtHostMethodMap[Method]['response']>;
242
+ };
243
+
244
+ return {
245
+ host: {
246
+ openCrdtField(field) {
247
+ return request('openCrdtField', field);
248
+ },
249
+ applyCrdtFieldYjsUpdate(update) {
250
+ return request('applyCrdtFieldYjsUpdate', update);
251
+ },
252
+ enqueueCrdtFieldYjsUpdate(update) {
253
+ return request('enqueueCrdtFieldYjsUpdate', update);
254
+ },
255
+ materializeCrdtField(field) {
256
+ return request('materializeCrdtField', field);
257
+ },
258
+ crdtDocumentSnapshot(field) {
259
+ return request('crdtDocumentSnapshot', field);
260
+ },
261
+ crdtUpdateLog(field) {
262
+ return request('crdtUpdateLog', field);
263
+ },
264
+ snapshotCrdtFieldStateVector(field) {
265
+ return request('snapshotCrdtFieldStateVector', field);
266
+ },
267
+ compactCrdtField(field) {
268
+ return request('compactCrdtField', field);
269
+ },
270
+ addRowsChangedListener(listener) {
271
+ rowsChangedListeners.add(listener);
272
+ return () => {
273
+ rowsChangedListeners.delete(listener);
274
+ };
275
+ },
276
+ },
277
+ close() {
278
+ if (closed) return;
279
+ closed = true;
280
+ unsubscribe();
281
+ rowsChangedListeners.clear();
282
+ for (const [id, pendingRequest] of pending) {
283
+ pending.delete(id);
284
+ if (pendingRequest.timer != null) clearTimeout(pendingRequest.timer);
285
+ pendingRequest.reject(
286
+ new Error('Syncular CRDT WebView host closed before response')
287
+ );
288
+ }
289
+ },
290
+ };
291
+ }
292
+
293
+ export function createSyncularCrdtWebViewHostResponder(
294
+ options: SyncularCrdtWebViewHostResponderOptions
295
+ ): SyncularCrdtWebViewHostResponder {
296
+ let closed = false;
297
+ const unsubscribeRequests = options.transport.addMessageListener(
298
+ (message) => {
299
+ if (!isSyncularCrdtHostMessage(message)) return;
300
+ if (message.type !== SYNCULAR_CRDT_WEBVIEW_REQUEST) return;
301
+ void createSyncularCrdtHostResponseMessage(options.host, message).then(
302
+ (response) => {
303
+ options.transport.postMessage(response);
304
+ }
305
+ );
306
+ }
307
+ );
308
+ const unsubscribeRowsChanged =
309
+ options.publishRowsChanged === false
310
+ ? undefined
311
+ : options.host.addRowsChangedListener((event) => {
312
+ if (closed) return;
313
+ options.transport.postMessage(
314
+ createSyncularCrdtRowsChangedMessage(event)
315
+ );
316
+ });
317
+
318
+ return {
319
+ close() {
320
+ if (closed) return;
321
+ closed = true;
322
+ unsubscribeRequests();
323
+ unsubscribeRowsChanged?.();
324
+ },
325
+ };
326
+ }
327
+
328
+ export async function createSyncularCrdtHostResponseMessage(
329
+ host: SyncularCrdtProjectionHost,
330
+ message: SyncularCrdtHostRequestMessage
331
+ ): Promise<SyncularCrdtHostResponseMessage> {
332
+ try {
333
+ const response = await dispatchSyncularCrdtHostRequest(host, message);
334
+ return {
335
+ protocol: SYNCULAR_CRDT_WEBVIEW_PROTOCOL,
336
+ type: SYNCULAR_CRDT_WEBVIEW_RESPONSE,
337
+ id: message.id,
338
+ ok: true,
339
+ response,
340
+ };
341
+ } catch (error) {
342
+ return {
343
+ protocol: SYNCULAR_CRDT_WEBVIEW_PROTOCOL,
344
+ type: SYNCULAR_CRDT_WEBVIEW_RESPONSE,
345
+ id: message.id,
346
+ ok: false,
347
+ error: errorPayload(error),
348
+ };
349
+ }
350
+ }
351
+
352
+ export function createSyncularCrdtRowsChangedMessage(
353
+ event: SyncularRowsChangedEvent
354
+ ): SyncularCrdtHostRowsChangedMessage {
355
+ return {
356
+ protocol: SYNCULAR_CRDT_WEBVIEW_PROTOCOL,
357
+ type: SYNCULAR_CRDT_WEBVIEW_ROWS_CHANGED,
358
+ event,
359
+ };
360
+ }
361
+
362
+ export function syncularCrdtRowsChangedMessageFromNativeEvent(
363
+ event: unknown
364
+ ): SyncularCrdtHostRowsChangedMessage | undefined {
365
+ if (!isNativeRowsChangedEventLike(event)) return undefined;
366
+ const changedRows =
367
+ event.changedRows ?? event.payload_json?.changedRows ?? [];
368
+ const changedTables =
369
+ event.tables && event.tables.length > 0
370
+ ? event.tables
371
+ : Array.from(new Set(changedRows.map((row) => row.table)));
372
+ return createSyncularCrdtRowsChangedMessage({
373
+ source: event.payload_json?.source ?? 'native',
374
+ changedTables,
375
+ changedRows,
376
+ });
377
+ }
378
+
379
+ export function syncularCrdtRowsChangedMessageFromNativeEventJson(
380
+ eventJson: string
381
+ ): SyncularCrdtHostRowsChangedMessage | undefined {
382
+ return syncularCrdtRowsChangedMessageFromNativeEvent(JSON.parse(eventJson));
383
+ }
384
+
385
+ export function isSyncularCrdtHostMessage(
386
+ message: unknown
387
+ ): message is SyncularCrdtHostMessage {
388
+ if (!isRecord(message)) return false;
389
+ if (message.protocol !== SYNCULAR_CRDT_WEBVIEW_PROTOCOL) return false;
390
+ return (
391
+ message.type === SYNCULAR_CRDT_WEBVIEW_REQUEST ||
392
+ message.type === SYNCULAR_CRDT_WEBVIEW_RESPONSE ||
393
+ message.type === SYNCULAR_CRDT_WEBVIEW_ROWS_CHANGED
394
+ );
395
+ }
396
+
397
+ export function dispatchSyncularCrdtHostRequest(
398
+ host: SyncularCrdtProjectionHost,
399
+ message: SyncularCrdtHostRequestMessage
400
+ ): Promise<unknown> {
401
+ switch (message.method) {
402
+ case 'openCrdtField':
403
+ return host.openCrdtField(message.request);
404
+ case 'applyCrdtFieldYjsUpdate':
405
+ return host.applyCrdtFieldYjsUpdate(message.request);
406
+ case 'enqueueCrdtFieldYjsUpdate':
407
+ if (host.enqueueCrdtFieldYjsUpdate) {
408
+ return host.enqueueCrdtFieldYjsUpdate(message.request);
409
+ }
410
+ return host.applyCrdtFieldYjsUpdate(message.request).then((receipt) => {
411
+ return receipt.clientCommitId;
412
+ });
413
+ case 'materializeCrdtField':
414
+ return host.materializeCrdtField(message.request);
415
+ case 'crdtDocumentSnapshot':
416
+ if (!host.crdtDocumentSnapshot) {
417
+ throw new Error('Host does not expose crdtDocumentSnapshot');
418
+ }
419
+ return host.crdtDocumentSnapshot(message.request);
420
+ case 'crdtUpdateLog':
421
+ if (!host.crdtUpdateLog) {
422
+ throw new Error('Host does not expose crdtUpdateLog');
423
+ }
424
+ return host.crdtUpdateLog(message.request);
425
+ case 'snapshotCrdtFieldStateVector':
426
+ return host.snapshotCrdtFieldStateVector(message.request);
427
+ case 'compactCrdtField':
428
+ return host.compactCrdtField(message.request);
429
+ default:
430
+ return assertNever(message);
431
+ }
432
+ }
433
+
434
+ function errorPayload(error: unknown): SyncularCrdtHostErrorPayload {
435
+ if (error instanceof Error) {
436
+ return {
437
+ message: error.message,
438
+ name: error.name,
439
+ };
440
+ }
441
+ return {
442
+ message: String(error),
443
+ };
444
+ }
445
+
446
+ function errorFromPayload(payload: SyncularCrdtHostErrorPayload): Error {
447
+ const error = new Error(payload.message);
448
+ error.name = payload.name ?? 'Error';
449
+ return error;
450
+ }
451
+
452
+ function isRecord(value: unknown): value is Record<string, unknown> {
453
+ return typeof value === 'object' && value !== null;
454
+ }
455
+
456
+ function isNativeRowsChangedEventLike(
457
+ event: unknown
458
+ ): event is SyncularNativeRowsChangedEventLike {
459
+ if (!isRecord(event)) return false;
460
+ if (event.kind !== 'RowsChanged') return false;
461
+ return (
462
+ Array.isArray(event.tables) ||
463
+ Array.isArray(event.changedRows) ||
464
+ (isRecord(event.payload_json) &&
465
+ Array.isArray(event.payload_json.changedRows))
466
+ );
467
+ }
468
+
469
+ function randomRequestId(): string {
470
+ return `syncular-crdt-${Date.now().toString(36)}-${Math.random()
471
+ .toString(36)
472
+ .slice(2)}`;
473
+ }
474
+
475
+ function assertNever(value: never): never {
476
+ throw new Error(`Unhandled Syncular CRDT WebView method: ${String(value)}`);
477
+ }