@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,406 @@
1
+ export function createYjsDocumentFieldAdapter(host, field, binding, options = {}) {
2
+ const flushDelayMs = options.flushDelayMs ?? 16;
3
+ const maxPendingUpdates = options.maxPendingUpdates ?? 1024;
4
+ const updateId = options.updateId ?? randomUpdateId;
5
+ const pending = [];
6
+ let flushTimer;
7
+ let activeFlush;
8
+ let descriptor;
9
+ const scheduleFlush = () => {
10
+ if (flushTimer != null)
11
+ return;
12
+ flushTimer = setTimeout(() => {
13
+ flushTimer = undefined;
14
+ void adapter.flush().catch((error) => {
15
+ options.onFlushError?.(error);
16
+ });
17
+ }, flushDelayMs);
18
+ };
19
+ const adapter = {
20
+ open() {
21
+ return host.openCrdtField(field).then((nextDescriptor) => {
22
+ descriptor = nextDescriptor;
23
+ return nextDescriptor;
24
+ });
25
+ },
26
+ async start() {
27
+ await adapter.open();
28
+ if (options.restoreOnStart) {
29
+ await adapter.restoreFromPersistedState();
30
+ }
31
+ const unsubscribe = binding.subscribeLocalUpdates((update) => {
32
+ if (pending.length >= maxPendingUpdates) {
33
+ options.onBackpressure?.({
34
+ pendingUpdates: pending.length,
35
+ maxPendingUpdates,
36
+ });
37
+ throw new Error(`Syncular CRDT adapter pending update limit exceeded (${maxPendingUpdates})`);
38
+ }
39
+ pending.push({
40
+ updateId: updateId(),
41
+ updateBase64: bytesToBase64(update),
42
+ });
43
+ scheduleFlush();
44
+ });
45
+ return async () => {
46
+ if (flushTimer != null) {
47
+ clearTimeout(flushTimer);
48
+ flushTimer = undefined;
49
+ }
50
+ unsubscribe();
51
+ await adapter.flush();
52
+ };
53
+ },
54
+ flush() {
55
+ activeFlush ??= (async () => {
56
+ options.onFlushStart?.({ pendingUpdates: pending.length });
57
+ while (pending.length > 0) {
58
+ const update = pending[0];
59
+ if (update == null)
60
+ continue;
61
+ if (host.enqueueCrdtFieldYjsUpdate) {
62
+ await host.enqueueCrdtFieldYjsUpdate({ ...field, update });
63
+ }
64
+ else {
65
+ await host.applyCrdtFieldYjsUpdate({ ...field, update });
66
+ }
67
+ pending.shift();
68
+ }
69
+ options.onFlushSuccess?.({ pendingUpdates: pending.length });
70
+ })().finally(() => {
71
+ activeFlush = undefined;
72
+ });
73
+ return activeFlush;
74
+ },
75
+ pendingUpdateCount() {
76
+ return pending.length;
77
+ },
78
+ async restoreFromPersistedState() {
79
+ const currentDescriptor = descriptor ?? (await adapter.open());
80
+ const [materialized, documentSnapshot] = await Promise.all([
81
+ host.materializeCrdtField(field),
82
+ host.crdtDocumentSnapshot?.(field),
83
+ ]);
84
+ const stateBase64 = documentSnapshot?.stateBase64 ?? materialized.stateBase64 ?? null;
85
+ const receipt = {
86
+ field,
87
+ descriptor: currentDescriptor,
88
+ materialization: materialized,
89
+ documentSnapshot,
90
+ stateBase64,
91
+ stateVectorBase64: documentSnapshot?.stateVectorBase64 ?? materialized.stateVectorBase64,
92
+ restoredState: stateBase64 != null && stateBase64 !== '',
93
+ };
94
+ if (stateBase64 != null && stateBase64 !== '') {
95
+ binding.replaceDocumentState?.(base64ToBytes(stateBase64), receipt);
96
+ }
97
+ binding.replaceMaterializedValue?.(materialized.value);
98
+ return receipt;
99
+ },
100
+ async refreshMaterializedValue() {
101
+ const materialized = await host.materializeCrdtField(field);
102
+ binding.replaceMaterializedValue?.(materialized.value);
103
+ return materialized;
104
+ },
105
+ async snapshotStateVector() {
106
+ const snapshot = await host.snapshotCrdtFieldStateVector(field);
107
+ return snapshot.stateVectorBase64;
108
+ },
109
+ applyRemoteUpdate(update) {
110
+ binding.applyRemoteUpdate?.(base64ToBytes(update.updateBase64));
111
+ },
112
+ compact(minUncheckpointedUpdates = 100) {
113
+ return host.compactCrdtField({ ...field, minUncheckpointedUpdates });
114
+ },
115
+ };
116
+ return adapter;
117
+ }
118
+ export function createYjsEditorBackpressureController(options = {}) {
119
+ const retryDelayMs = options.retryDelayMs ?? 750;
120
+ const maxRetryDelayMs = options.maxRetryDelayMs ?? 8_000;
121
+ const autoRetry = options.autoRetry ?? true;
122
+ let adapter;
123
+ let currentState = 'open';
124
+ let retryAttempt = 0;
125
+ let retryTimer;
126
+ let lastEvent = {
127
+ state: 'open',
128
+ pendingUpdates: 0,
129
+ retryAttempt: 0,
130
+ };
131
+ const clearRetryTimer = () => {
132
+ if (retryTimer != null) {
133
+ clearTimeout(retryTimer);
134
+ retryTimer = undefined;
135
+ }
136
+ };
137
+ const publish = (state, event = {}) => {
138
+ currentState = state;
139
+ lastEvent = {
140
+ ...lastEvent,
141
+ ...event,
142
+ state,
143
+ retryAttempt,
144
+ pendingUpdates: event.pendingUpdates ?? adapter?.pendingUpdateCount() ?? 0,
145
+ };
146
+ options.onStateChange?.(lastEvent);
147
+ return lastEvent;
148
+ };
149
+ const block = (event) => {
150
+ const nextEvent = publish('blocked', event);
151
+ options.setEditorReadOnly?.(true, nextEvent);
152
+ options.showSavingBlocked?.(nextEvent);
153
+ scheduleRetry(nextEvent);
154
+ };
155
+ const unblock = (event = {}) => {
156
+ clearRetryTimer();
157
+ retryAttempt = 0;
158
+ const nextEvent = publish('open', event);
159
+ options.clearSavingBlocked?.(nextEvent);
160
+ options.setEditorReadOnly?.(false, nextEvent);
161
+ };
162
+ const scheduleRetry = (event) => {
163
+ if (!autoRetry || adapter == null || retryTimer != null)
164
+ return;
165
+ const nextRetryDelayMs = Math.min(maxRetryDelayMs, retryDelayMs * 2 ** retryAttempt);
166
+ lastEvent = { ...event, nextRetryDelayMs };
167
+ retryTimer = setTimeout(() => {
168
+ retryTimer = undefined;
169
+ void controller.retryNow();
170
+ }, nextRetryDelayMs);
171
+ };
172
+ const controller = {
173
+ fieldOptions: {
174
+ onBackpressure(event) {
175
+ retryAttempt = 0;
176
+ block({
177
+ pendingUpdates: event.pendingUpdates,
178
+ maxPendingUpdates: event.maxPendingUpdates,
179
+ });
180
+ },
181
+ onFlushStart(event) {
182
+ if (currentState === 'blocked') {
183
+ publish('recovering', { pendingUpdates: event.pendingUpdates });
184
+ }
185
+ },
186
+ onFlushSuccess(event) {
187
+ if (event.pendingUpdates === 0 && currentState !== 'open') {
188
+ unblock({ pendingUpdates: 0 });
189
+ }
190
+ },
191
+ onFlushError(error) {
192
+ retryAttempt += 1;
193
+ const event = publish(currentState === 'open' ? 'blocked' : currentState, {
194
+ error,
195
+ });
196
+ options.onRetryError?.(error, event);
197
+ scheduleRetry(event);
198
+ },
199
+ },
200
+ attach(nextAdapter) {
201
+ adapter = nextAdapter;
202
+ },
203
+ detach() {
204
+ adapter = undefined;
205
+ clearRetryTimer();
206
+ },
207
+ state() {
208
+ return currentState;
209
+ },
210
+ async retryNow() {
211
+ clearRetryTimer();
212
+ if (adapter == null)
213
+ return;
214
+ publish('recovering');
215
+ try {
216
+ await adapter.flush();
217
+ if (adapter.pendingUpdateCount() === 0) {
218
+ unblock({ pendingUpdates: 0 });
219
+ }
220
+ else {
221
+ retryAttempt += 1;
222
+ block({ pendingUpdates: adapter.pendingUpdateCount() });
223
+ }
224
+ }
225
+ catch (error) {
226
+ retryAttempt += 1;
227
+ const event = publish('blocked', { error });
228
+ options.onRetryError?.(error, event);
229
+ scheduleRetry(event);
230
+ }
231
+ },
232
+ stop() {
233
+ clearRetryTimer();
234
+ retryAttempt = 0;
235
+ if (currentState !== 'open') {
236
+ unblock({ pendingUpdates: adapter?.pendingUpdateCount() ?? 0 });
237
+ }
238
+ },
239
+ };
240
+ return controller;
241
+ }
242
+ export function createRichEditorCrdtAdapter(host, field, binding, projection, options = {}) {
243
+ const document = createYjsDocumentFieldAdapter(host, field, binding, {
244
+ restoreOnStart: true,
245
+ ...options.field,
246
+ });
247
+ const projections = createCrdtFieldProjectionMaterializer(host, field, projection, {
248
+ materializeOnStart: true,
249
+ ...options.projections,
250
+ });
251
+ let stopDocument;
252
+ let stopProjections;
253
+ const adapter = {
254
+ document,
255
+ projections,
256
+ async start() {
257
+ stopDocument = await document.start();
258
+ stopProjections = await projections.start();
259
+ return () => adapter.stop();
260
+ },
261
+ async stop() {
262
+ const currentStopDocument = stopDocument;
263
+ const currentStopProjections = stopProjections;
264
+ stopProjections = undefined;
265
+ stopDocument = undefined;
266
+ await currentStopDocument?.();
267
+ await currentStopProjections?.();
268
+ },
269
+ async flush() {
270
+ await document.flush();
271
+ await projections.flush();
272
+ },
273
+ restoreFromPersistedState() {
274
+ return document.restoreFromPersistedState();
275
+ },
276
+ compact(minUncheckpointedUpdates) {
277
+ return document.compact(minUncheckpointedUpdates);
278
+ },
279
+ };
280
+ return adapter;
281
+ }
282
+ export function createCrdtFieldProjectionMaterializer(host, field, projection, options = {}) {
283
+ let descriptor;
284
+ let unsubscribeRowsChanged;
285
+ let queue = Promise.resolve();
286
+ const open = async () => {
287
+ descriptor ??= await host.openCrdtField(field);
288
+ return descriptor;
289
+ };
290
+ const runMaterialization = async (cause) => {
291
+ const currentDescriptor = await open();
292
+ const updateLogLimit = Math.max(0, options.updateLogLimit ?? 0);
293
+ const [materialization, documentSnapshot, updateLog] = await Promise.all([
294
+ host.materializeCrdtField(field),
295
+ host.crdtDocumentSnapshot?.(field),
296
+ updateLogLimit > 0
297
+ ? host.crdtUpdateLog?.({ ...field, limit: updateLogLimit })
298
+ : undefined,
299
+ ]);
300
+ const stateVectorBase64 = documentSnapshot?.stateVectorBase64 ?? materialization.stateVectorBase64;
301
+ const event = {
302
+ field,
303
+ descriptor: currentDescriptor,
304
+ materialization,
305
+ documentSnapshot,
306
+ updateLog,
307
+ latestUpdate: updateLog?.[0],
308
+ reason: cause.reason,
309
+ source: cause.source,
310
+ operation: cause.changedRow?.operation,
311
+ commitId: cause.changedRow?.commitId,
312
+ commitSeq: cause.changedRow?.commitSeq,
313
+ serverVersion: cause.changedRow?.serverVersion,
314
+ stateVectorBase64,
315
+ changedRow: cause.changedRow,
316
+ };
317
+ try {
318
+ const nextProjection = await projection.derive(materialization, event);
319
+ await projection.apply(nextProjection, event);
320
+ options.onMaterialized?.(nextProjection, event);
321
+ return event;
322
+ }
323
+ catch (error) {
324
+ options.onError?.(error, event);
325
+ throw error;
326
+ }
327
+ };
328
+ const enqueueMaterialization = (cause) => {
329
+ queue = queue
330
+ .then(() => runMaterialization(cause))
331
+ .then(() => undefined, () => undefined);
332
+ };
333
+ const materializer = {
334
+ async start() {
335
+ const currentDescriptor = await open();
336
+ unsubscribeRowsChanged = host.addRowsChangedListener((event) => {
337
+ const changedRow = event.changedRows.find((row) => crdtChangedRowMatchesField(row, field, currentDescriptor));
338
+ if (changedRow == null)
339
+ return;
340
+ enqueueMaterialization({
341
+ reason: projectionReasonForRowsChanged(event, changedRow),
342
+ source: event.source,
343
+ changedRow,
344
+ });
345
+ });
346
+ if (options.materializeOnStart) {
347
+ enqueueMaterialization({ reason: 'startup', source: 'startup' });
348
+ }
349
+ return () => materializer.stop();
350
+ },
351
+ async stop() {
352
+ unsubscribeRowsChanged?.();
353
+ unsubscribeRowsChanged = undefined;
354
+ await materializer.flush();
355
+ },
356
+ flush() {
357
+ return queue;
358
+ },
359
+ materialize(cause = {}) {
360
+ return runMaterialization({
361
+ reason: cause.reason ?? 'manual',
362
+ source: cause.source ?? 'manual',
363
+ changedRow: cause.changedRow,
364
+ });
365
+ },
366
+ };
367
+ return materializer;
368
+ }
369
+ export function crdtChangedRowMatchesField(row, field, descriptor) {
370
+ if (row.table !== field.table || row.rowId !== field.rowId)
371
+ return false;
372
+ return (row.crdtFields.includes(descriptor.stateColumn) ||
373
+ row.changedFields.includes(descriptor.stateColumn) ||
374
+ row.changedFields.includes(field.field));
375
+ }
376
+ export function projectionReasonForRowsChanged(event, row) {
377
+ if (row.operation === 'compact')
378
+ return 'compaction';
379
+ if (event.source === 'remotePull')
380
+ return 'remote-apply';
381
+ return 'local-write';
382
+ }
383
+ export function bytesToBase64(bytes) {
384
+ const maybeBuffer = globalThis.Buffer;
385
+ if (maybeBuffer != null)
386
+ return maybeBuffer.from(bytes).toString('base64');
387
+ let binary = '';
388
+ for (const byte of bytes)
389
+ binary += String.fromCharCode(byte);
390
+ return btoa(binary);
391
+ }
392
+ export function base64ToBytes(value) {
393
+ const maybeBuffer = globalThis.Buffer;
394
+ if (maybeBuffer != null)
395
+ return maybeBuffer.from(value, 'base64');
396
+ const binary = atob(value);
397
+ const bytes = new Uint8Array(binary.length);
398
+ for (let index = 0; index < binary.length; index += 1) {
399
+ bytes[index] = binary.charCodeAt(index);
400
+ }
401
+ return bytes;
402
+ }
403
+ function randomUpdateId() {
404
+ return (globalThis.crypto?.randomUUID?.() ?? `yjs-${Date.now()}-${Math.random()}`);
405
+ }
406
+ //# sourceMappingURL=yjs-document-field-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yjs-document-field-adapter.js","sourceRoot":"","sources":["../../src/crdt-yjs/yjs-document-field-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ import * as Y from 'yjs';
2
+ import type { SyncularCrdtProjectionDefinition, SyncularCrdtProjectionEvent, YjsDocumentBinding, YjsDocumentRestoreReceipt } from './yjs-document-field-adapter';
3
+ export interface YjsProseMirrorBridgeOptions {
4
+ containerKey: string;
5
+ doc?: Y.Doc;
6
+ localOrigin?: unknown;
7
+ remoteOrigin?: unknown;
8
+ ignoredOrigins?: readonly unknown[];
9
+ onDocumentReplaced?: (event: YjsProseMirrorDocumentReplacedEvent) => void;
10
+ }
11
+ export interface YjsProseMirrorDocumentReplacedEvent {
12
+ doc: Y.Doc;
13
+ fragment: Y.XmlFragment;
14
+ receipt?: YjsDocumentRestoreReceipt;
15
+ }
16
+ export interface YjsProseMirrorBridge extends YjsDocumentBinding {
17
+ doc(): Y.Doc;
18
+ fragment(): Y.XmlFragment;
19
+ replaceDocumentFromState(state: Uint8Array, receipt?: YjsDocumentRestoreReceipt): void;
20
+ encodeStateAsUpdate(): Uint8Array;
21
+ destroy(): void;
22
+ }
23
+ export interface ProseMirrorReadModel {
24
+ table: string;
25
+ rowId: string;
26
+ field: string;
27
+ prosemirrorJson: unknown;
28
+ title: string;
29
+ preview: string;
30
+ outline: string[];
31
+ searchText: string;
32
+ stateVectorBase64: string;
33
+ source: SyncularCrdtProjectionEvent['source'];
34
+ reason: SyncularCrdtProjectionEvent['reason'];
35
+ operation?: string;
36
+ commitId?: string | null;
37
+ commitSeq?: number | null;
38
+ serverVersion?: number | null;
39
+ documentKey?: string;
40
+ pendingUpdates?: number;
41
+ flushedUpdates?: number;
42
+ ackedUpdates?: number;
43
+ logUpdates?: number;
44
+ updatedAt?: number;
45
+ compactedAt?: number | null;
46
+ latestUpdateId?: string;
47
+ latestUpdateStatus?: string;
48
+ }
49
+ export interface ProseMirrorReadModelStore {
50
+ upsert(model: ProseMirrorReadModel, event: SyncularCrdtProjectionEvent): void | Promise<void>;
51
+ }
52
+ export interface ProseMirrorReadModelProjectionOptions {
53
+ store: ProseMirrorReadModelStore;
54
+ derive?: (value: unknown, event: SyncularCrdtProjectionEvent) => {
55
+ prosemirrorJson: unknown;
56
+ title: string;
57
+ preview: string;
58
+ outline: string[];
59
+ searchText: string;
60
+ };
61
+ }
62
+ export declare function createYjsProseMirrorBridge(options: YjsProseMirrorBridgeOptions): YjsProseMirrorBridge;
63
+ export declare function prosemirrorJsonProjection(value: unknown): {
64
+ prosemirrorJson: unknown;
65
+ title: string;
66
+ preview: string;
67
+ outline: string[];
68
+ searchText: string;
69
+ };
70
+ export declare function createProseMirrorReadModelProjection(options: ProseMirrorReadModelProjectionOptions): SyncularCrdtProjectionDefinition<ProseMirrorReadModel>;
71
+ export declare function extractProseMirrorText(value: unknown): string;
72
+ export declare function extractProseMirrorHeadings(value: unknown): string[];
73
+ //# sourceMappingURL=yjs-prosemirror-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yjs-prosemirror-bridge.d.ts","sourceRoot":"","sources":["../../src/crdt-yjs/yjs-prosemirror-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,169 @@
1
+ import * as Y from 'yjs';
2
+ const DEFAULT_REMOTE_ORIGIN = Symbol.for('syncular.crdt.remote');
3
+ export function createYjsProseMirrorBridge(options) {
4
+ let doc = options.doc ?? new Y.Doc();
5
+ let fragment = doc.getXmlFragment(options.containerKey);
6
+ const remoteOrigin = options.remoteOrigin ?? DEFAULT_REMOTE_ORIGIN;
7
+ const ignoredOrigins = new Set([
8
+ remoteOrigin,
9
+ ...(options.ignoredOrigins ?? []),
10
+ ]);
11
+ const localListeners = new Set();
12
+ const docUnsubscribers = new Map();
13
+ const attachListener = (listener) => {
14
+ const handler = (update, origin) => {
15
+ if (ignoredOrigins.has(origin))
16
+ return;
17
+ listener(update);
18
+ };
19
+ doc.on('update', handler);
20
+ docUnsubscribers.set(listener, () => {
21
+ doc.off('update', handler);
22
+ });
23
+ };
24
+ const attachAllListeners = () => {
25
+ for (const listener of localListeners)
26
+ attachListener(listener);
27
+ };
28
+ const detachAllListeners = () => {
29
+ for (const unsubscribe of docUnsubscribers.values())
30
+ unsubscribe();
31
+ docUnsubscribers.clear();
32
+ };
33
+ const replaceDoc = (nextDoc, receipt) => {
34
+ detachAllListeners();
35
+ doc.destroy();
36
+ doc = nextDoc;
37
+ fragment = doc.getXmlFragment(options.containerKey);
38
+ attachAllListeners();
39
+ options.onDocumentReplaced?.({ doc, fragment, receipt });
40
+ };
41
+ return {
42
+ subscribeLocalUpdates(listener) {
43
+ localListeners.add(listener);
44
+ attachListener(listener);
45
+ return () => {
46
+ localListeners.delete(listener);
47
+ docUnsubscribers.get(listener)?.();
48
+ docUnsubscribers.delete(listener);
49
+ };
50
+ },
51
+ applyRemoteUpdate(update) {
52
+ Y.applyUpdate(doc, update, remoteOrigin);
53
+ },
54
+ replaceDocumentState(state, receipt) {
55
+ this.replaceDocumentFromState(state, receipt);
56
+ },
57
+ replaceMaterializedValue() { },
58
+ doc() {
59
+ return doc;
60
+ },
61
+ fragment() {
62
+ return fragment;
63
+ },
64
+ replaceDocumentFromState(state, receipt) {
65
+ const nextDoc = new Y.Doc();
66
+ if (state.length > 0) {
67
+ Y.applyUpdate(nextDoc, state, remoteOrigin);
68
+ }
69
+ replaceDoc(nextDoc, receipt);
70
+ },
71
+ encodeStateAsUpdate() {
72
+ return Y.encodeStateAsUpdate(doc);
73
+ },
74
+ destroy() {
75
+ detachAllListeners();
76
+ localListeners.clear();
77
+ doc.destroy();
78
+ },
79
+ };
80
+ }
81
+ export function prosemirrorJsonProjection(value) {
82
+ const text = extractProseMirrorText(value);
83
+ const headings = extractProseMirrorHeadings(value);
84
+ return {
85
+ prosemirrorJson: value,
86
+ title: headings[0] ?? firstLine(text) ?? '',
87
+ preview: text.slice(0, 240),
88
+ outline: headings,
89
+ searchText: text,
90
+ };
91
+ }
92
+ export function createProseMirrorReadModelProjection(options) {
93
+ return {
94
+ derive(materialization, event) {
95
+ const derived = options.derive?.(materialization.value, event) ??
96
+ prosemirrorJsonProjection(materialization.value);
97
+ return {
98
+ table: event.field.table,
99
+ rowId: event.field.rowId,
100
+ field: event.field.field,
101
+ ...derived,
102
+ stateVectorBase64: event.stateVectorBase64,
103
+ source: event.source,
104
+ reason: event.reason,
105
+ operation: event.operation,
106
+ commitId: event.commitId,
107
+ commitSeq: event.commitSeq,
108
+ serverVersion: event.serverVersion,
109
+ documentKey: event.documentSnapshot?.documentKey,
110
+ pendingUpdates: event.documentSnapshot?.pendingUpdates,
111
+ flushedUpdates: event.documentSnapshot?.flushedUpdates,
112
+ ackedUpdates: event.documentSnapshot?.ackedUpdates,
113
+ logUpdates: event.documentSnapshot?.logUpdates,
114
+ updatedAt: event.documentSnapshot?.updatedAt,
115
+ compactedAt: event.documentSnapshot?.compactedAt,
116
+ latestUpdateId: event.latestUpdate?.updateId,
117
+ latestUpdateStatus: event.latestUpdate?.status,
118
+ };
119
+ },
120
+ apply(model, event) {
121
+ return options.store.upsert(model, event);
122
+ },
123
+ };
124
+ }
125
+ export function extractProseMirrorText(value) {
126
+ const parts = [];
127
+ const visit = (node) => {
128
+ if (node == null || typeof node !== 'object')
129
+ return;
130
+ const record = node;
131
+ if (typeof record.text === 'string') {
132
+ parts.push(record.text);
133
+ }
134
+ const content = record.content;
135
+ if (Array.isArray(content)) {
136
+ for (const child of content)
137
+ visit(child);
138
+ }
139
+ };
140
+ visit(value);
141
+ return parts.join(' ').replace(/\s+/g, ' ').trim();
142
+ }
143
+ export function extractProseMirrorHeadings(value) {
144
+ const headings = [];
145
+ const visit = (node) => {
146
+ if (node == null || typeof node !== 'object')
147
+ return;
148
+ const record = node;
149
+ if (record.type === 'heading') {
150
+ const text = extractProseMirrorText(record);
151
+ if (text !== '')
152
+ headings.push(text);
153
+ }
154
+ const content = record.content;
155
+ if (Array.isArray(content)) {
156
+ for (const child of content)
157
+ visit(child);
158
+ }
159
+ };
160
+ visit(value);
161
+ return headings;
162
+ }
163
+ function firstLine(value) {
164
+ return value
165
+ .split(/\r?\n/)
166
+ .map((line) => line.trim())
167
+ .find((line) => line !== '');
168
+ }
169
+ //# sourceMappingURL=yjs-prosemirror-bridge.js.map