@syncular/client 0.1.3 → 0.2.1

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
@@ -1,406 +0,0 @@
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
@@ -1 +0,0 @@
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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"}
@@ -1,73 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"yjs-prosemirror-bridge.d.ts","sourceRoot":"","sources":["../../src/crdt-yjs/yjs-prosemirror-bridge.ts"],"names":[],"mappings":"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"}
@@ -1,169 +0,0 @@
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