@edv4h/usketch-plugin-sync-ywebsocket 1.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.
@@ -0,0 +1,492 @@
1
+ import { Awareness } from "y-protocols/awareness";
2
+ import { WebsocketProvider } from "y-websocket";
3
+ import * as Y from "yjs";
4
+ import { SyncStatusTracker } from "./sync-status-tracker.js";
5
+ function toPlainObject(shape) {
6
+ return JSON.parse(JSON.stringify(shape));
7
+ }
8
+ export function createYwebsocketSync(store, options) {
9
+ const { url, roomName, shapesMapKey = "shapes", resolveParams, onCloseCode, idleTimeoutMs = 0, autoConnect = true, doc: providedDoc, WebSocketPolyfill, } = options;
10
+ const doc = providedDoc ?? new Y.Doc();
11
+ const ownsDoc = providedDoc === undefined;
12
+ const shapesMap = doc.getMap(shapesMapKey);
13
+ const status = new SyncStatusTracker();
14
+ let destroyed = false;
15
+ let isSyncing = false;
16
+ let attempt = 0;
17
+ let currentState = null;
18
+ let lastCloseCode;
19
+ let lastCloseReason;
20
+ // `paused` is set by `disconnect()` and cleared by `resume()` / destroy, so an
21
+ // in-flight `connect()` (mid-`await resolveParams`) bails out instead of
22
+ // creating a socket after a user-initiated disconnect.
23
+ let paused = false;
24
+ // Generation counter to cancel stale async `connect()` runs. Each `connect()`
25
+ // captures its generation and re-checks after every await boundary; any
26
+ // disconnect/destroy increments the counter and invalidates pending runs.
27
+ let connectGeneration = 0;
28
+ // A long-lived Awareness bound to `doc`. Created up-front so `wsProvider.awareness`
29
+ // is always valid (WsProviderHandle consumers, e.g. presence-cursor, destructure
30
+ // it at plugin-creation time). The same instance is passed into every
31
+ // WebsocketProvider so remote awareness updates keep flowing through reconnects.
32
+ const sharedAwareness = new Awareness(doc);
33
+ // WsProviderHandle event listener sets — persist across reconnects.
34
+ const statusListeners = new Set();
35
+ const broadcastListeners = new Set();
36
+ // Latest socket-level status. Read by the local mutation handler to decide
37
+ // whether a freshly-added shape should be treated as already "confirmed"
38
+ // (the socket is open so y-websocket immediately broadcasts the update) or
39
+ // as "pending" (offline → diverges until a re-sync).
40
+ let currentWsStatus = "disconnected";
41
+ function notifyStatus(next) {
42
+ currentWsStatus = next;
43
+ // "connected" at the transport level only means the socket is open — the
44
+ // first Yjs sync has not necessarily completed. Map to "syncing" until the
45
+ // provider's `sync` event fires; `onSync` will flip the tracker to "synced".
46
+ status.update({
47
+ state: next === "connected"
48
+ ? "syncing"
49
+ : next === "connecting"
50
+ ? "connecting"
51
+ : next === "disconnected"
52
+ ? "disconnected"
53
+ : "error",
54
+ error: next === "failed" ? "connection failed" : null,
55
+ });
56
+ for (const listener of statusListeners) {
57
+ listener(next);
58
+ }
59
+ }
60
+ // ── Store ↔ Y.Doc binding ──────────────────────────────────────────────────
61
+ // These observers are set up once; they keep working across provider reconnects
62
+ // because they bind to `doc` / `shapesMap` rather than the provider.
63
+ const unsubMutation = store.onMutation((event) => {
64
+ if (isSyncing || destroyed)
65
+ return;
66
+ const payload = event.payload;
67
+ if (!payload?.id)
68
+ return;
69
+ // Batch the divergence note + the shapeCount/lastSyncedAt update so
70
+ // subscribers see exactly one snapshot change per local mutation.
71
+ status.batch(() => {
72
+ isSyncing = true;
73
+ try {
74
+ switch (event.type) {
75
+ case "shape:added":
76
+ case "shape:updated": {
77
+ const shape = store.getShape(payload.id);
78
+ if (shape) {
79
+ const isNew = !shapesMap.has(payload.id);
80
+ shapesMap.set(payload.id, toPlainObject(shape));
81
+ if (isNew && event.type === "shape:added") {
82
+ // Socket open → y-websocket immediately broadcasts this
83
+ // shape to the server, so it's effectively confirmed. We
84
+ // only flag local adds as "unconfirmed" while the
85
+ // connection is down, so the warning shows up exactly
86
+ // for offline edits / orphaned IndexedDB state.
87
+ const isOnline = currentWsStatus === "connected";
88
+ status.noteShapeAdded(payload.id, isOnline ? "remote" : "local");
89
+ }
90
+ }
91
+ break;
92
+ }
93
+ case "shape:removed": {
94
+ shapesMap.delete(payload.id);
95
+ status.noteShapeRemoved(payload.id);
96
+ break;
97
+ }
98
+ }
99
+ }
100
+ finally {
101
+ isSyncing = false;
102
+ }
103
+ // Keep the status snapshot in sync with the authoritative Y.Map size so
104
+ // consumers (DebugHUD etc.) see up-to-date counts after local edits too.
105
+ status.update({ shapeCount: shapesMap.size, lastSyncedAt: Date.now() });
106
+ });
107
+ resetIdleTimer();
108
+ });
109
+ const shapesObserver = (events) => {
110
+ if (isSyncing || destroyed)
111
+ return;
112
+ // `transaction.local === true` means this Y.Doc edit originated from
113
+ // our own client — the store mutation handler above has already noted
114
+ // the addition (as "remote" if the socket was open, "local" otherwise).
115
+ // `false` means the change came from the server / another peer, so it
116
+ // must be marked as confirmed here when we forward it to the store.
117
+ const isLocalTxn = events.transaction.local;
118
+ // Batch all per-key notes plus the trailing `update(...)` so we fire
119
+ // exactly one notification per Yjs transaction.
120
+ status.batch(() => {
121
+ isSyncing = true;
122
+ try {
123
+ for (const [key, change] of events.changes.keys) {
124
+ switch (change.action) {
125
+ case "add":
126
+ case "update": {
127
+ const value = shapesMap.get(key);
128
+ if (value) {
129
+ const shape = value;
130
+ const existing = store.getShape(key);
131
+ if (existing) {
132
+ store.updateShape(key, shape);
133
+ }
134
+ else {
135
+ store.addShape(shape);
136
+ if (!isLocalTxn) {
137
+ // Remote add → confirmed by server.
138
+ status.noteShapeAdded(key, "remote");
139
+ }
140
+ }
141
+ }
142
+ break;
143
+ }
144
+ case "delete": {
145
+ if (store.getShape(key)) {
146
+ store.deleteShape(key);
147
+ }
148
+ status.noteShapeRemoved(key);
149
+ break;
150
+ }
151
+ }
152
+ }
153
+ }
154
+ finally {
155
+ isSyncing = false;
156
+ }
157
+ status.update({ shapeCount: shapesMap.size, lastSyncedAt: Date.now() });
158
+ });
159
+ };
160
+ shapesMap.observe(shapesObserver);
161
+ // ── Initial load: existing Y.Doc → store (pre-connection, e.g. from a persisted doc) ──
162
+ function applyInitialLoad() {
163
+ if (shapesMap.size === 0)
164
+ return;
165
+ const idsNeedingZIndex = [];
166
+ const loadedIds = [];
167
+ isSyncing = true;
168
+ try {
169
+ for (const [id, value] of shapesMap.entries()) {
170
+ const shape = value;
171
+ if (!store.getShape(id)) {
172
+ store.addShape(shape);
173
+ }
174
+ // Track legacy shapes that were persisted before z-order was introduced.
175
+ if (typeof shape.zIndex !== "string") {
176
+ idsNeedingZIndex.push(id);
177
+ }
178
+ loadedIds.push(id);
179
+ }
180
+ }
181
+ finally {
182
+ isSyncing = false;
183
+ }
184
+ // Pre-connection load (typically from IndexedDB). These haven't been
185
+ // confirmed by the current server session yet — they'll be promoted to
186
+ // "confirmed" by `setConfirmedFromServer` when the first sync event
187
+ // fires. Use the bulk API so initial-load shapes don't trigger O(n²)
188
+ // recompute cycles.
189
+ if (loadedIds.length > 0) {
190
+ status.noteShapesLoaded(loadedIds, "local");
191
+ }
192
+ // Backfill zIndex into Y.Map for any shape that got an auto-assigned one,
193
+ // so other clients observe the same stable z-order on subsequent loads.
194
+ if (idsNeedingZIndex.length > 0) {
195
+ doc.transact(() => {
196
+ for (const id of idsNeedingZIndex) {
197
+ const current = store.getShape(id);
198
+ if (current)
199
+ shapesMap.set(id, toPlainObject(current));
200
+ }
201
+ });
202
+ }
203
+ // `noteShapesLoaded(...)` above already recomputed `shapeCount` and
204
+ // notified once for the batch, so no follow-up `update({ shapeCount })`
205
+ // is needed here.
206
+ }
207
+ applyInitialLoad();
208
+ // ── Idle timer ─────────────────────────────────────────────────────────────
209
+ let idleTimer = null;
210
+ function clearIdleTimer() {
211
+ if (idleTimer) {
212
+ clearTimeout(idleTimer);
213
+ idleTimer = null;
214
+ }
215
+ }
216
+ function resetIdleTimer() {
217
+ if (idleTimeoutMs <= 0 || destroyed)
218
+ return;
219
+ clearIdleTimer();
220
+ idleTimer = setTimeout(() => {
221
+ disconnect({ reason: "idle" });
222
+ }, idleTimeoutMs);
223
+ }
224
+ // ── Provider lifecycle ─────────────────────────────────────────────────────
225
+ let whenSyncedResolve = null;
226
+ const whenSynced = new Promise((resolve) => {
227
+ whenSyncedResolve = resolve;
228
+ });
229
+ let firstSyncSettled = false;
230
+ function settleFirstSync() {
231
+ if (firstSyncSettled)
232
+ return;
233
+ firstSyncSettled = true;
234
+ whenSyncedResolve?.();
235
+ }
236
+ async function connect() {
237
+ if (destroyed || paused || currentState)
238
+ return;
239
+ const myGeneration = ++connectGeneration;
240
+ status.update({ state: "connecting" });
241
+ let connParams = {};
242
+ if (resolveParams) {
243
+ try {
244
+ const ctx = {
245
+ attempt,
246
+ previousCloseCode: lastCloseCode,
247
+ previousCloseReason: lastCloseReason,
248
+ };
249
+ const resolved = await resolveParams(ctx);
250
+ // After await: bail out if disconnect/destroy happened or a newer
251
+ // connect() superseded this run.
252
+ if (destroyed || paused || myGeneration !== connectGeneration)
253
+ return;
254
+ connParams = resolved.params ?? {};
255
+ }
256
+ catch (err) {
257
+ if (destroyed || paused || myGeneration !== connectGeneration)
258
+ return;
259
+ status.update({
260
+ state: "error",
261
+ error: err instanceof Error ? err.message : String(err),
262
+ });
263
+ // Unblock `whenSynced` so plugin setup can proceed — consumers should
264
+ // inspect `status.getSnapshot()` to detect the persistent failure state.
265
+ settleFirstSync();
266
+ scheduleReconnect();
267
+ return;
268
+ }
269
+ }
270
+ if (destroyed || paused || myGeneration !== connectGeneration)
271
+ return;
272
+ const provider = new WebsocketProvider(url, roomName, doc, {
273
+ connect: true,
274
+ params: connParams,
275
+ awareness: sharedAwareness,
276
+ WebSocketPolyfill: WebSocketPolyfill,
277
+ resyncInterval: 0,
278
+ });
279
+ const onStatus = (event) => {
280
+ if (event.status === "connected") {
281
+ attempt = 0;
282
+ lastCloseCode = undefined;
283
+ lastCloseReason = undefined;
284
+ notifyStatus("connected");
285
+ resetIdleTimer();
286
+ }
287
+ else if (event.status === "connecting") {
288
+ notifyStatus("connecting");
289
+ }
290
+ else {
291
+ notifyStatus("disconnected");
292
+ }
293
+ };
294
+ const onSync = (isSynced) => {
295
+ if (isSynced) {
296
+ // At this moment `shapesMap` reflects the merged server state
297
+ // (server's view ∪ what we uploaded). Treat every key here as
298
+ // confirmed. Anything added afterward without a subsequent
299
+ // sync event will diverge.
300
+ status.setConfirmedFromServer(shapesMap.keys());
301
+ status.update({
302
+ state: "synced",
303
+ shapeCount: shapesMap.size,
304
+ lastSyncedAt: Date.now(),
305
+ });
306
+ settleFirstSync();
307
+ }
308
+ };
309
+ const onConnectionClose = (event) => {
310
+ const code = event?.code ?? 0;
311
+ const reason = event?.reason ?? "";
312
+ lastCloseCode = code;
313
+ lastCloseReason = reason;
314
+ const decision = onCloseCode?.(code, reason);
315
+ if (decision === "stop") {
316
+ tearDownProvider();
317
+ notifyStatus("disconnected");
318
+ settleFirstSync();
319
+ return;
320
+ }
321
+ // "retry" or undefined → fall through to reconnect
322
+ tearDownProvider();
323
+ if (decision === "retry") {
324
+ // Explicit retry reconnects immediately, so reset the backoff counter
325
+ // (this also resets `ctx.attempt` — see ResolveParamsContext.attempt docstring).
326
+ attempt = 0;
327
+ void connect();
328
+ }
329
+ else {
330
+ scheduleReconnect();
331
+ }
332
+ };
333
+ const onConnectionError = () => {
334
+ // y-websocket emits connection-error before close; we rely on close for reconnect.
335
+ };
336
+ provider.on("status", onStatus);
337
+ provider.on("sync", onSync);
338
+ provider.on("connection-close", onConnectionClose);
339
+ provider.on("connection-error", onConnectionError);
340
+ currentState = {
341
+ provider,
342
+ unbind: () => {
343
+ provider.off("status", onStatus);
344
+ provider.off("sync", onSync);
345
+ provider.off("connection-close", onConnectionClose);
346
+ provider.off("connection-error", onConnectionError);
347
+ },
348
+ };
349
+ }
350
+ function tearDownProvider() {
351
+ if (!currentState)
352
+ return;
353
+ currentState.unbind();
354
+ try {
355
+ currentState.provider.disconnect();
356
+ }
357
+ catch {
358
+ // ignore
359
+ }
360
+ try {
361
+ // `destroy` cleans up the socket but keeps the awareness instance that we've
362
+ // captured. We reattach to a fresh one on reconnect via `sharedAwareness`.
363
+ currentState.provider.destroy();
364
+ }
365
+ catch {
366
+ // ignore
367
+ }
368
+ currentState = null;
369
+ }
370
+ let reconnectTimer = null;
371
+ function scheduleReconnect() {
372
+ if (destroyed)
373
+ return;
374
+ if (reconnectTimer)
375
+ return;
376
+ attempt += 1;
377
+ // Exponential backoff with jitter, cap 30s
378
+ const base = Math.min(1000 * 2 ** Math.min(attempt, 6), 30000);
379
+ const delay = base + Math.random() * 1000;
380
+ reconnectTimer = setTimeout(() => {
381
+ reconnectTimer = null;
382
+ void connect();
383
+ }, delay);
384
+ }
385
+ function disconnect(_opts) {
386
+ // Pause + bump generation so any in-flight `connect()` (e.g. mid-await
387
+ // on resolveParams) aborts before it can create a provider.
388
+ paused = true;
389
+ connectGeneration += 1;
390
+ if (reconnectTimer) {
391
+ clearTimeout(reconnectTimer);
392
+ reconnectTimer = null;
393
+ }
394
+ clearIdleTimer();
395
+ tearDownProvider();
396
+ notifyStatus("disconnected");
397
+ }
398
+ function resume() {
399
+ if (destroyed)
400
+ return;
401
+ // Clear pause and any pending backoff so we don't get overlapping connects.
402
+ paused = false;
403
+ if (reconnectTimer) {
404
+ clearTimeout(reconnectTimer);
405
+ reconnectTimer = null;
406
+ }
407
+ resetIdleTimer();
408
+ if (currentState)
409
+ return;
410
+ attempt = 0;
411
+ void connect();
412
+ }
413
+ // ── WsProviderHandle adapter ───────────────────────────────────────────────
414
+ const wsProvider = {
415
+ get connected() {
416
+ return Boolean(currentState && (currentState.provider.wsconnected ?? false));
417
+ },
418
+ // Always bound to `doc` and reused across every WebsocketProvider — consumers
419
+ // (e.g. presence-cursor) can destructure at plugin-creation time without races.
420
+ awareness: sharedAwareness,
421
+ broadcast(_msg) {
422
+ // y-websocket has no broadcast channel separate from Y.Doc updates; no-op.
423
+ },
424
+ onBroadcast(handler) {
425
+ broadcastListeners.add(handler);
426
+ return () => broadcastListeners.delete(handler);
427
+ },
428
+ onStatusChange(handler) {
429
+ statusListeners.add(handler);
430
+ // Fire current state immediately for parity with createWsProvider behavior.
431
+ // Use the status tracker so pre-provider connection attempts (e.g. while
432
+ // awaiting `resolveParams`) correctly report `"connecting"` instead of
433
+ // `"disconnected"`.
434
+ const snapshot = status.getSnapshot().state;
435
+ const initial = snapshot === "synced"
436
+ ? "connected"
437
+ : snapshot === "connecting" || snapshot === "syncing"
438
+ ? "connecting"
439
+ : snapshot === "error"
440
+ ? "failed"
441
+ : "disconnected";
442
+ handler(initial);
443
+ return () => statusListeners.delete(handler);
444
+ },
445
+ requestPartition(_names) {
446
+ // y-websocket has no partition concept; no-op.
447
+ },
448
+ onPartitionMeta(_handler) {
449
+ return () => {
450
+ // no-op
451
+ };
452
+ },
453
+ destroy() {
454
+ destroy();
455
+ },
456
+ };
457
+ function destroy() {
458
+ if (destroyed)
459
+ return;
460
+ destroyed = true;
461
+ // Invalidate any in-flight `connect()` awaiting `resolveParams`.
462
+ connectGeneration += 1;
463
+ if (reconnectTimer) {
464
+ clearTimeout(reconnectTimer);
465
+ reconnectTimer = null;
466
+ }
467
+ clearIdleTimer();
468
+ tearDownProvider();
469
+ shapesMap.unobserve(shapesObserver);
470
+ unsubMutation();
471
+ statusListeners.clear();
472
+ broadcastListeners.clear();
473
+ sharedAwareness.destroy();
474
+ if (ownsDoc) {
475
+ doc.destroy();
476
+ }
477
+ settleFirstSync();
478
+ }
479
+ if (autoConnect) {
480
+ void connect();
481
+ }
482
+ return {
483
+ doc,
484
+ status,
485
+ whenSynced,
486
+ wsProvider,
487
+ disconnect: () => disconnect({ reason: "manual" }),
488
+ resume,
489
+ destroy,
490
+ };
491
+ }
492
+ //# sourceMappingURL=yws-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yws-sync.js","sourceRoot":"","sources":["../src/yws-sync.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "@edv4h/usketch-plugin-sync-ywebsocket",
3
+ "version": "1.1.0",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "source": "./src/index.ts",
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "dependencies": {
15
+ "y-protocols": "1.0.7",
16
+ "y-websocket": "^3.0.0",
17
+ "yjs": "^13.6.0",
18
+ "@edv4h/usketch-shared": "2.0.0",
19
+ "@edv4h/usketch-sync": "1.0.0"
20
+ },
21
+ "peerDependencies": {
22
+ "react": ">=19"
23
+ },
24
+ "devDependencies": {
25
+ "@types/react": "19.2.14",
26
+ "typescript": "5.9.3",
27
+ "vitest": "3.2.4"
28
+ },
29
+ "publishConfig": {
30
+ "access": "public"
31
+ },
32
+ "files": [
33
+ "dist",
34
+ "README.md"
35
+ ],
36
+ "license": "MIT",
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "git+https://github.com/EdV4H/usketch.git",
40
+ "directory": "plugins/usketch-plugin-sync-ywebsocket"
41
+ },
42
+ "homepage": "https://github.com/EdV4H/usketch#readme",
43
+ "bugs": {
44
+ "url": "https://github.com/EdV4H/usketch/issues"
45
+ },
46
+ "scripts": {
47
+ "build": "tsc -p tsconfig.json",
48
+ "typecheck": "tsc --noEmit",
49
+ "test": "vitest run --passWithNoTests",
50
+ "clean": "rm -rf dist"
51
+ }
52
+ }