@liveblocks/yjs 3.1.4 → 3.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.
- package/dist/index.cjs +129 -58
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +14 -5
- package/dist/index.d.ts +14 -5
- package/dist/index.js +114 -43
- package/dist/index.js.map +1 -1
- package/package.json +4 -3
package/dist/index.cjs
CHANGED
|
@@ -3,11 +3,14 @@ var _core = require('@liveblocks/core');
|
|
|
3
3
|
|
|
4
4
|
// src/version.ts
|
|
5
5
|
var PKG_NAME = "@liveblocks/yjs";
|
|
6
|
-
var PKG_VERSION = "3.1
|
|
6
|
+
var PKG_VERSION = "3.2.1";
|
|
7
7
|
var PKG_FORMAT = "cjs";
|
|
8
8
|
|
|
9
9
|
// src/provider.ts
|
|
10
10
|
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
11
14
|
var _jsbase64 = require('js-base64');
|
|
12
15
|
|
|
13
16
|
// ../../node_modules/lib0/map.js
|
|
@@ -218,13 +221,23 @@ var Awareness = (_class = class extends Observable {
|
|
|
218
221
|
|
|
219
222
|
|
|
220
223
|
|
|
221
|
-
|
|
224
|
+
|
|
225
|
+
var _sha2 = require('@noble/hashes/sha2');
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
var yDocHandler = (_class2 = class _yDocHandler extends Observable {
|
|
222
230
|
__init5() {this.unsubscribers = []}
|
|
223
231
|
__init6() {this._synced = false}
|
|
224
232
|
|
|
225
233
|
|
|
226
234
|
|
|
227
235
|
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
__init7() {this.debounceTimer = null}
|
|
239
|
+
static __initStatic() {this.DEBOUNCE_INTERVAL_MS = 200}
|
|
240
|
+
|
|
228
241
|
constructor({
|
|
229
242
|
doc,
|
|
230
243
|
isRoot,
|
|
@@ -232,7 +245,7 @@ var yDocHandler = (_class2 = class extends Observable {
|
|
|
232
245
|
fetchDoc,
|
|
233
246
|
useV2Encoding
|
|
234
247
|
}) {
|
|
235
|
-
super();_class2.prototype.__init5.call(this);_class2.prototype.__init6.call(this);_class2.prototype.__init7.call(this);_class2.prototype.__init8.call(this);_class2.prototype.__init9.call(this);;
|
|
248
|
+
super();_class2.prototype.__init5.call(this);_class2.prototype.__init6.call(this);_class2.prototype.__init7.call(this);_class2.prototype.__init8.call(this);_class2.prototype.__init9.call(this);_class2.prototype.__init10.call(this);;
|
|
236
249
|
this.doc = doc;
|
|
237
250
|
this.useV2Encoding = useV2Encoding;
|
|
238
251
|
this.doc.on(useV2Encoding ? "updateV2" : "update", this.updateHandler);
|
|
@@ -243,12 +256,27 @@ var yDocHandler = (_class2 = class extends Observable {
|
|
|
243
256
|
fetchDoc(vector, isRoot ? void 0 : this.doc.guid);
|
|
244
257
|
};
|
|
245
258
|
this.syncDoc();
|
|
259
|
+
const encodedSnapshot = this.useV2Encoding ? Y.encodeSnapshotV2(Y.snapshot(this.doc)) : Y.encodeSnapshot(Y.snapshot(this.doc));
|
|
260
|
+
this.localSnapshotHash\u03A3 = new (0, _core.Signal)(
|
|
261
|
+
_jsbase64.Base64.fromUint8Array(_sha2.sha256.call(void 0, encodedSnapshot))
|
|
262
|
+
);
|
|
263
|
+
this.remoteSnapshotHash\u03A3 = new (0, _core.Signal)(null);
|
|
264
|
+
this.isLocalAndRemoteSnapshotEqual\u03A3 = _core.DerivedSignal.from(() => {
|
|
265
|
+
const remoteSnapshotHash = this.remoteSnapshotHash\u03A3.get();
|
|
266
|
+
if (remoteSnapshotHash === null) return false;
|
|
267
|
+
const localSnapshotHash = this.localSnapshotHash\u03A3.get();
|
|
268
|
+
if (localSnapshotHash !== remoteSnapshotHash) {
|
|
269
|
+
return false;
|
|
270
|
+
}
|
|
271
|
+
return true;
|
|
272
|
+
});
|
|
246
273
|
}
|
|
247
|
-
|
|
274
|
+
__init8() {this.handleServerUpdate = ({
|
|
248
275
|
update,
|
|
249
276
|
stateVector,
|
|
250
277
|
readOnly,
|
|
251
|
-
v2
|
|
278
|
+
v2,
|
|
279
|
+
remoteSnapshotHash
|
|
252
280
|
}) => {
|
|
253
281
|
const applyUpdate2 = v2 ? Y.applyUpdateV2 : Y.applyUpdate;
|
|
254
282
|
applyUpdate2(this.doc, update, "backend");
|
|
@@ -267,8 +295,9 @@ var yDocHandler = (_class2 = class extends Observable {
|
|
|
267
295
|
}
|
|
268
296
|
this.synced = true;
|
|
269
297
|
}
|
|
298
|
+
this.remoteSnapshotHash\u03A3.set(remoteSnapshotHash);
|
|
270
299
|
}}
|
|
271
|
-
|
|
300
|
+
__init9() {this.syncDoc = () => {
|
|
272
301
|
this.synced = false;
|
|
273
302
|
const encodedVector = _jsbase64.Base64.fromUint8Array(Y.encodeStateVector(this.doc));
|
|
274
303
|
this.fetchRoomDoc(encodedVector);
|
|
@@ -284,35 +313,57 @@ var yDocHandler = (_class2 = class extends Observable {
|
|
|
284
313
|
this.emit("sync", [state]);
|
|
285
314
|
}
|
|
286
315
|
}
|
|
287
|
-
|
|
316
|
+
debounced_updateLocalSnapshot() {
|
|
317
|
+
if (this.debounceTimer) clearTimeout(this.debounceTimer);
|
|
318
|
+
this.debounceTimer = setTimeout(() => {
|
|
319
|
+
const encodedSnapshot = this.useV2Encoding ? Y.encodeSnapshotV2(Y.snapshot(this.doc)) : Y.encodeSnapshot(Y.snapshot(this.doc));
|
|
320
|
+
this.localSnapshotHash\u03A3.set(
|
|
321
|
+
_jsbase64.Base64.fromUint8Array(_sha2.sha256.call(void 0, encodedSnapshot))
|
|
322
|
+
);
|
|
323
|
+
this.debounceTimer = null;
|
|
324
|
+
}, _yDocHandler.DEBOUNCE_INTERVAL_MS);
|
|
325
|
+
}
|
|
326
|
+
__init10() {this.updateHandler = (update, origin) => {
|
|
327
|
+
this.debounced_updateLocalSnapshot();
|
|
288
328
|
const isFromLocal = origin instanceof _yindexeddb.IndexeddbPersistence;
|
|
289
329
|
if (origin !== "backend" && !isFromLocal) {
|
|
290
330
|
this.updateRoomDoc(update);
|
|
291
331
|
}
|
|
292
332
|
}}
|
|
333
|
+
experimental_getSyncStatus() {
|
|
334
|
+
const remoteSnapshotHash = this.remoteSnapshotHash\u03A3.get();
|
|
335
|
+
if (remoteSnapshotHash === null) {
|
|
336
|
+
return "loading";
|
|
337
|
+
}
|
|
338
|
+
if (!this.isLocalAndRemoteSnapshotEqual\u03A3.get()) {
|
|
339
|
+
return "synchronizing";
|
|
340
|
+
}
|
|
341
|
+
return "synchronized";
|
|
342
|
+
}
|
|
293
343
|
destroy() {
|
|
344
|
+
if (this.debounceTimer) clearTimeout(this.debounceTimer);
|
|
294
345
|
this.doc.off("update", this.updateHandler);
|
|
295
346
|
this.unsubscribers.forEach((unsub) => unsub());
|
|
296
347
|
this._observers = /* @__PURE__ */ new Map();
|
|
297
348
|
this.doc.destroy();
|
|
298
349
|
}
|
|
299
|
-
}, _class2);
|
|
350
|
+
}, _class2.__initStatic(), _class2);
|
|
300
351
|
|
|
301
352
|
// src/provider.ts
|
|
302
353
|
var LiveblocksYjsProvider = (_class3 = class extends Observable {
|
|
303
354
|
|
|
304
355
|
|
|
305
356
|
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
357
|
+
__init11() {this.indexeddbProvider = null}
|
|
358
|
+
__init12() {this.isPaused = false}
|
|
359
|
+
__init13() {this.unsubscribers = []}
|
|
360
|
+
|
|
309
361
|
|
|
362
|
+
__init14() {this.subdocHandlers\u03A3 = new (0, _core.MutableSignal)(/* @__PURE__ */ new Map())}
|
|
310
363
|
|
|
311
|
-
__init13() {this.subdocHandlers = /* @__PURE__ */ new Map()}
|
|
312
364
|
|
|
313
|
-
__init14() {this.pending = []}
|
|
314
365
|
constructor(room, doc, options = {}) {
|
|
315
|
-
super();_class3.prototype.
|
|
366
|
+
super();_class3.prototype.__init11.call(this);_class3.prototype.__init12.call(this);_class3.prototype.__init13.call(this);_class3.prototype.__init14.call(this);_class3.prototype.__init15.call(this);_class3.prototype.__init16.call(this);_class3.prototype.__init17.call(this);_class3.prototype.__init18.call(this);_class3.prototype.__init19.call(this);_class3.prototype.__init20.call(this);_class3.prototype.__init21.call(this);;
|
|
316
367
|
this.rootDoc = doc;
|
|
317
368
|
this.room = room;
|
|
318
369
|
this.options = options;
|
|
@@ -335,7 +386,6 @@ var LiveblocksYjsProvider = (_class3 = class extends Observable {
|
|
|
335
386
|
} else {
|
|
336
387
|
this.rootDocHandler.synced = false;
|
|
337
388
|
}
|
|
338
|
-
this.emit("status", [this.getStatus()]);
|
|
339
389
|
})
|
|
340
390
|
);
|
|
341
391
|
this.unsubscribers.push(
|
|
@@ -344,32 +394,32 @@ var LiveblocksYjsProvider = (_class3 = class extends Observable {
|
|
|
344
394
|
if (type === _core.ClientMsgCode.UPDATE_YDOC) {
|
|
345
395
|
return;
|
|
346
396
|
}
|
|
347
|
-
const {
|
|
348
|
-
|
|
397
|
+
const {
|
|
398
|
+
stateVector,
|
|
399
|
+
update: updateStr,
|
|
400
|
+
guid,
|
|
401
|
+
v2,
|
|
402
|
+
remoteSnapshotHash
|
|
403
|
+
} = message;
|
|
404
|
+
const canWrite = _nullishCoalesce(_optionalChain([this, 'access', _32 => _32.room, 'access', _33 => _33.getSelf, 'call', _34 => _34(), 'optionalAccess', _35 => _35.canWrite]), () => ( true));
|
|
349
405
|
const update = _jsbase64.Base64.toUint8Array(updateStr);
|
|
350
|
-
const updateId = this.getUniqueUpdateId(update);
|
|
351
|
-
this.pending = this.pending.filter((pendingUpdate) => {
|
|
352
|
-
if (pendingUpdate === updateId) {
|
|
353
|
-
return false;
|
|
354
|
-
}
|
|
355
|
-
return true;
|
|
356
|
-
});
|
|
357
406
|
if (guid !== void 0) {
|
|
358
|
-
_optionalChain([this, 'access',
|
|
407
|
+
_optionalChain([this, 'access', _36 => _36.subdocHandlers\u03A3, 'access', _37 => _37.get, 'call', _38 => _38(), 'access', _39 => _39.get, 'call', _40 => _40(guid), 'optionalAccess', _41 => _41.handleServerUpdate, 'call', _42 => _42({
|
|
359
408
|
update,
|
|
360
409
|
stateVector,
|
|
361
410
|
readOnly: !canWrite,
|
|
362
|
-
v2
|
|
411
|
+
v2,
|
|
412
|
+
remoteSnapshotHash
|
|
363
413
|
})]);
|
|
364
414
|
} else {
|
|
365
415
|
this.rootDocHandler.handleServerUpdate({
|
|
366
416
|
update,
|
|
367
417
|
stateVector,
|
|
368
418
|
readOnly: !canWrite,
|
|
369
|
-
v2
|
|
419
|
+
v2,
|
|
420
|
+
remoteSnapshotHash
|
|
370
421
|
});
|
|
371
422
|
}
|
|
372
|
-
this.emit("status", [this.getStatus()]);
|
|
373
423
|
})
|
|
374
424
|
);
|
|
375
425
|
if (options.offlineSupport_experimental) {
|
|
@@ -377,15 +427,33 @@ var LiveblocksYjsProvider = (_class3 = class extends Observable {
|
|
|
377
427
|
}
|
|
378
428
|
this.rootDocHandler.on("synced", () => {
|
|
379
429
|
const state = this.rootDocHandler.synced;
|
|
380
|
-
for (const [_, handler] of this.subdocHandlers) {
|
|
430
|
+
for (const [_, handler] of this.subdocHandlers\u03A3.get()) {
|
|
381
431
|
handler.syncDoc();
|
|
382
432
|
}
|
|
383
433
|
this.emit("synced", [state]);
|
|
384
434
|
this.emit("sync", [state]);
|
|
385
|
-
this.emit("status", [this.getStatus()]);
|
|
386
435
|
});
|
|
387
436
|
this.rootDoc.on("subdocs", this.handleSubdocs);
|
|
388
437
|
this.syncDoc();
|
|
438
|
+
this.syncStatus\u03A3 = _core.DerivedSignal.from(() => {
|
|
439
|
+
const rootDocumentStatus = this.rootDocHandler.experimental_getSyncStatus();
|
|
440
|
+
if (rootDocumentStatus === "loading" || rootDocumentStatus === "synchronizing") {
|
|
441
|
+
return rootDocumentStatus;
|
|
442
|
+
}
|
|
443
|
+
const subdocumentStatuses = Array.from(
|
|
444
|
+
this.subdocHandlers\u03A3.get().values()
|
|
445
|
+
).map((handler) => handler.experimental_getSyncStatus());
|
|
446
|
+
if (subdocumentStatuses.some((state) => state !== "synchronized")) {
|
|
447
|
+
return "synchronizing";
|
|
448
|
+
}
|
|
449
|
+
return "synchronized";
|
|
450
|
+
});
|
|
451
|
+
this.emit("status", [this.getStatus()]);
|
|
452
|
+
this.unsubscribers.push(
|
|
453
|
+
this.syncStatus\u03A3.subscribe(() => {
|
|
454
|
+
this.emit("status", [this.getStatus()]);
|
|
455
|
+
})
|
|
456
|
+
);
|
|
389
457
|
}
|
|
390
458
|
__init15() {this.setupOfflineSupport = () => {
|
|
391
459
|
this.indexeddbProvider = new (0, _yindexeddb.IndexeddbPersistence)(
|
|
@@ -406,43 +474,38 @@ var LiveblocksYjsProvider = (_class3 = class extends Observable {
|
|
|
406
474
|
added
|
|
407
475
|
}) => {
|
|
408
476
|
loaded.forEach(this.createSubdocHandler);
|
|
477
|
+
const subdocHandlers = this.subdocHandlers\u03A3.get();
|
|
409
478
|
if (this.options.autoloadSubdocs) {
|
|
410
479
|
for (const subdoc of added) {
|
|
411
|
-
if (!
|
|
480
|
+
if (!subdocHandlers.has(subdoc.guid)) {
|
|
412
481
|
subdoc.load();
|
|
413
482
|
}
|
|
414
483
|
}
|
|
415
484
|
}
|
|
416
485
|
for (const subdoc of removed) {
|
|
417
|
-
if (
|
|
418
|
-
_optionalChain([
|
|
419
|
-
|
|
486
|
+
if (subdocHandlers.has(subdoc.guid)) {
|
|
487
|
+
_optionalChain([subdocHandlers, 'access', _46 => _46.get, 'call', _47 => _47(subdoc.guid), 'optionalAccess', _48 => _48.destroy, 'call', _49 => _49()]);
|
|
488
|
+
subdocHandlers.delete(subdoc.guid);
|
|
420
489
|
}
|
|
421
490
|
}
|
|
422
491
|
}}
|
|
423
|
-
__init17() {this.
|
|
424
|
-
const
|
|
425
|
-
return this.rootDoc.clientID + ":" + clock;
|
|
426
|
-
}}
|
|
427
|
-
__init18() {this.updateDoc = (update, guid) => {
|
|
428
|
-
const canWrite = _nullishCoalesce(_optionalChain([this, 'access', _51 => _51.room, 'access', _52 => _52.getSelf, 'call', _53 => _53(), 'optionalAccess', _54 => _54.canWrite]), () => ( true));
|
|
492
|
+
__init17() {this.updateDoc = (update, guid) => {
|
|
493
|
+
const canWrite = _nullishCoalesce(_optionalChain([this, 'access', _50 => _50.room, 'access', _51 => _51.getSelf, 'call', _52 => _52(), 'optionalAccess', _53 => _53.canWrite]), () => ( true));
|
|
429
494
|
if (canWrite && !this.isPaused) {
|
|
430
|
-
const updateId = this.getUniqueUpdateId(update);
|
|
431
|
-
this.pending.push(updateId);
|
|
432
495
|
this.room.updateYDoc(
|
|
433
496
|
_jsbase64.Base64.fromUint8Array(update),
|
|
434
497
|
guid,
|
|
435
498
|
this.useV2Encoding
|
|
436
499
|
);
|
|
437
|
-
this.emit("status", [this.getStatus()]);
|
|
438
500
|
}
|
|
439
501
|
}}
|
|
440
|
-
|
|
502
|
+
__init18() {this.fetchDoc = (vector, guid) => {
|
|
441
503
|
this.room.fetchYDoc(vector, guid, this.useV2Encoding);
|
|
442
504
|
}}
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
505
|
+
__init19() {this.createSubdocHandler = (subdoc) => {
|
|
506
|
+
const subdocHandlers = this.subdocHandlers\u03A3.get();
|
|
507
|
+
if (subdocHandlers.has(subdoc.guid)) {
|
|
508
|
+
_optionalChain([subdocHandlers, 'access', _54 => _54.get, 'call', _55 => _55(subdoc.guid), 'optionalAccess', _56 => _56.syncDoc, 'call', _57 => _57()]);
|
|
446
509
|
return;
|
|
447
510
|
}
|
|
448
511
|
const handler = new yDocHandler({
|
|
@@ -452,10 +515,10 @@ var LiveblocksYjsProvider = (_class3 = class extends Observable {
|
|
|
452
515
|
fetchDoc: this.fetchDoc,
|
|
453
516
|
useV2Encoding: _nullishCoalesce(this.options.useV2Encoding_experimental, () => ( false))
|
|
454
517
|
});
|
|
455
|
-
|
|
518
|
+
subdocHandlers.set(subdoc.guid, handler);
|
|
456
519
|
}}
|
|
457
520
|
// attempt to load a subdoc of a given guid
|
|
458
|
-
|
|
521
|
+
__init20() {this.loadSubdoc = (guid) => {
|
|
459
522
|
for (const subdoc of this.rootDoc.subdocs) {
|
|
460
523
|
if (subdoc.guid === guid) {
|
|
461
524
|
subdoc.load();
|
|
@@ -464,9 +527,9 @@ var LiveblocksYjsProvider = (_class3 = class extends Observable {
|
|
|
464
527
|
}
|
|
465
528
|
return false;
|
|
466
529
|
}}
|
|
467
|
-
|
|
530
|
+
__init21() {this.syncDoc = () => {
|
|
468
531
|
this.rootDocHandler.syncDoc();
|
|
469
|
-
for (const [_, handler] of this.subdocHandlers) {
|
|
532
|
+
for (const [_, handler] of this.subdocHandlers\u03A3.get()) {
|
|
470
533
|
handler.syncDoc();
|
|
471
534
|
}
|
|
472
535
|
}}
|
|
@@ -478,7 +541,7 @@ var LiveblocksYjsProvider = (_class3 = class extends Observable {
|
|
|
478
541
|
return this.rootDocHandler.synced;
|
|
479
542
|
}
|
|
480
543
|
async pause() {
|
|
481
|
-
await _optionalChain([this, 'access',
|
|
544
|
+
await _optionalChain([this, 'access', _58 => _58.indexeddbProvider, 'optionalAccess', _59 => _59.destroy, 'call', _60 => _60()]);
|
|
482
545
|
this.indexeddbProvider = null;
|
|
483
546
|
this.isPaused = true;
|
|
484
547
|
}
|
|
@@ -490,20 +553,17 @@ var LiveblocksYjsProvider = (_class3 = class extends Observable {
|
|
|
490
553
|
this.rootDocHandler.syncDoc();
|
|
491
554
|
}
|
|
492
555
|
getStatus() {
|
|
493
|
-
|
|
494
|
-
return "loading";
|
|
495
|
-
}
|
|
496
|
-
return this.pending.length === 0 ? "synchronized" : "synchronizing";
|
|
556
|
+
return this.syncStatus\u03A3.get();
|
|
497
557
|
}
|
|
498
558
|
destroy() {
|
|
499
559
|
this.unsubscribers.forEach((unsub) => unsub());
|
|
500
560
|
this.awareness.destroy();
|
|
501
561
|
this.rootDocHandler.destroy();
|
|
502
562
|
this._observers = /* @__PURE__ */ new Map();
|
|
503
|
-
for (const [_, handler] of this.subdocHandlers) {
|
|
563
|
+
for (const [_, handler] of this.subdocHandlers\u03A3.get()) {
|
|
504
564
|
handler.destroy();
|
|
505
565
|
}
|
|
506
|
-
this.subdocHandlers.clear();
|
|
566
|
+
this.subdocHandlers\u03A3.get().clear();
|
|
507
567
|
super.destroy();
|
|
508
568
|
}
|
|
509
569
|
async clearOfflineData() {
|
|
@@ -518,6 +578,17 @@ var LiveblocksYjsProvider = (_class3 = class extends Observable {
|
|
|
518
578
|
}
|
|
519
579
|
connect() {
|
|
520
580
|
}
|
|
581
|
+
get subdocHandlers() {
|
|
582
|
+
return this.subdocHandlers\u03A3.get();
|
|
583
|
+
}
|
|
584
|
+
set subdocHandlers(value) {
|
|
585
|
+
this.subdocHandlers\u03A3.mutate((map) => {
|
|
586
|
+
map.clear();
|
|
587
|
+
for (const [key, handler] of value) {
|
|
588
|
+
map.set(key, handler);
|
|
589
|
+
}
|
|
590
|
+
});
|
|
591
|
+
}
|
|
521
592
|
}, _class3);
|
|
522
593
|
|
|
523
594
|
// src/providerContext.ts
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/liveblocks/liveblocks/packages/liveblocks-yjs/dist/index.cjs","../src/index.ts","../src/version.ts","../src/provider.ts","../../../node_modules/lib0/map.js","../../../node_modules/lib0/set.js","../../../node_modules/lib0/array.js","../../../node_modules/lib0/observable.js","../src/awareness.ts","../src/doc.ts","../src/providerContext.ts"],"names":["create","applyUpdate","Base64","IndexeddbPersistence"],"mappings":"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","file":"/home/runner/work/liveblocks/liveblocks/packages/liveblocks-yjs/dist/index.cjs","sourcesContent":[null,"import { detectDupes } from \"@liveblocks/core\";\n\nimport { PKG_FORMAT, PKG_NAME, PKG_VERSION } from \"./version\";\n\ndetectDupes(PKG_NAME, PKG_VERSION, PKG_FORMAT);\n\nexport type { ProviderOptions } from \"./provider\";\nexport { LiveblocksYjsProvider } from \"./provider\";\nexport { getYjsProviderForRoom } from \"./providerContext\";\n","declare const __VERSION__: string;\ndeclare const TSUP_FORMAT: string;\n\nexport const PKG_NAME = \"@liveblocks/yjs\";\nexport const PKG_VERSION = typeof __VERSION__ === \"string\" && __VERSION__;\nexport const PKG_FORMAT = typeof TSUP_FORMAT === \"string\" && TSUP_FORMAT;\n","import type { IYjsProvider, OpaqueRoom, YjsSyncStatus } from \"@liveblocks/core\";\nimport { ClientMsgCode, kInternal } from \"@liveblocks/core\";\nimport { Base64 } from \"js-base64\";\nimport { Observable } from \"lib0/observable\";\nimport { IndexeddbPersistence } from \"y-indexeddb\";\nimport { type Doc, parseUpdateMeta, PermanentUserData } from \"yjs\";\n\nimport { Awareness } from \"./awareness\";\nimport yDocHandler from \"./doc\";\n\nexport type ProviderOptions = {\n enablePermanentUserData?: boolean;\n autoloadSubdocs?: boolean;\n offlineSupport_experimental?: boolean;\n useV2Encoding_experimental?: boolean;\n};\n\nexport class LiveblocksYjsProvider\n extends Observable<unknown>\n implements IYjsProvider\n{\n private readonly room: OpaqueRoom;\n private readonly rootDoc: Doc;\n private readonly options: ProviderOptions;\n private indexeddbProvider: IndexeddbPersistence | null = null;\n private isPaused = false;\n\n private readonly unsubscribers: Array<() => void> = [];\n\n public readonly awareness: Awareness;\n\n public readonly rootDocHandler: yDocHandler;\n public readonly subdocHandlers: Map<string, yDocHandler> = new Map();\n\n public readonly permanentUserData?: PermanentUserData;\n\n private pending: string[] = [];\n\n constructor(room: OpaqueRoom, doc: Doc, options: ProviderOptions = {}) {\n super();\n this.rootDoc = doc;\n this.room = room;\n this.options = options;\n this.rootDocHandler = new yDocHandler({\n doc,\n isRoot: true,\n updateDoc: this.updateDoc,\n fetchDoc: this.fetchDoc,\n useV2Encoding: this.options.useV2Encoding_experimental ?? false,\n });\n\n if (this.options.enablePermanentUserData) {\n this.permanentUserData = new PermanentUserData(doc);\n }\n\n // TODO: Display a warning if a YjsProvider is already attached to the room\n room[kInternal].setYjsProvider(this);\n\n // if we have a connectionId already during construction, use that\n this.awareness = new Awareness(this.rootDoc, this.room);\n\n this.unsubscribers.push(\n this.room.events.status.subscribe((status) => {\n if (status === \"connected\") {\n this.rootDocHandler.syncDoc();\n } else {\n this.rootDocHandler.synced = false;\n }\n this.emit(\"status\", [this.getStatus()]);\n })\n );\n\n this.unsubscribers.push(\n this.room.events.ydoc.subscribe((message) => {\n const { type } = message;\n if (type === ClientMsgCode.UPDATE_YDOC) {\n // don't apply updates that came from the client\n return;\n }\n const { stateVector, update: updateStr, guid, v2 } = message;\n const canWrite = this.room.getSelf()?.canWrite ?? true;\n const update = Base64.toUint8Array(updateStr);\n const updateId = this.getUniqueUpdateId(update);\n this.pending = this.pending.filter((pendingUpdate) => {\n if (pendingUpdate === updateId) {\n return false;\n }\n return true;\n });\n // find the right doc and update\n if (guid !== undefined) {\n this.subdocHandlers.get(guid)?.handleServerUpdate({\n update,\n stateVector,\n readOnly: !canWrite,\n v2,\n });\n } else {\n this.rootDocHandler.handleServerUpdate({\n update,\n stateVector,\n readOnly: !canWrite,\n v2,\n });\n }\n // notify any listeners that the status has changed\n this.emit(\"status\", [this.getStatus()]);\n })\n );\n\n if (options.offlineSupport_experimental) {\n this.setupOfflineSupport();\n }\n\n // different consumers listen to sync and synced\n this.rootDocHandler.on(\"synced\", () => {\n const state = this.rootDocHandler.synced;\n for (const [_, handler] of this.subdocHandlers) {\n handler.syncDoc();\n }\n this.emit(\"synced\", [state]);\n this.emit(\"sync\", [state]);\n this.emit(\"status\", [this.getStatus()]);\n });\n this.rootDoc.on(\"subdocs\", this.handleSubdocs);\n this.syncDoc();\n }\n\n private setupOfflineSupport = () => {\n this.indexeddbProvider = new IndexeddbPersistence(\n this.room.id,\n this.rootDoc\n );\n const onIndexedDbSync = () => {\n this.rootDocHandler.synced = true;\n };\n this.indexeddbProvider.on(\"synced\", onIndexedDbSync);\n\n this.unsubscribers.push(() => {\n this.indexeddbProvider?.off(\"synced\", onIndexedDbSync);\n });\n };\n\n private handleSubdocs = ({\n loaded,\n removed,\n added,\n }: {\n loaded: Set<Doc>;\n removed: Set<Doc>;\n added: Set<Doc>;\n }) => {\n loaded.forEach(this.createSubdocHandler);\n if (this.options.autoloadSubdocs) {\n for (const subdoc of added) {\n if (!this.subdocHandlers.has(subdoc.guid)) {\n subdoc.load();\n }\n }\n }\n for (const subdoc of removed) {\n if (this.subdocHandlers.has(subdoc.guid)) {\n this.subdocHandlers.get(subdoc.guid)?.destroy();\n this.subdocHandlers.delete(subdoc.guid);\n }\n }\n };\n\n private getUniqueUpdateId = (update: Uint8Array) => {\n const clock = parseUpdateMeta(update).to.get(this.rootDoc.clientID) ?? \"-1\";\n return this.rootDoc.clientID + \":\" + clock;\n };\n\n private updateDoc = (update: Uint8Array, guid?: string) => {\n const canWrite = this.room.getSelf()?.canWrite ?? true;\n if (canWrite && !this.isPaused) {\n const updateId = this.getUniqueUpdateId(update);\n this.pending.push(updateId);\n this.room.updateYDoc(\n Base64.fromUint8Array(update),\n guid,\n this.useV2Encoding\n );\n this.emit(\"status\", [this.getStatus()]);\n }\n };\n\n private fetchDoc = (vector: string, guid?: string) => {\n this.room.fetchYDoc(vector, guid, this.useV2Encoding);\n };\n\n private createSubdocHandler = (subdoc: Doc): void => {\n if (this.subdocHandlers.has(subdoc.guid)) {\n // if we already handle this subdoc, just fetch it again\n this.subdocHandlers.get(subdoc.guid)?.syncDoc();\n return;\n }\n const handler = new yDocHandler({\n doc: subdoc,\n isRoot: false,\n updateDoc: this.updateDoc,\n fetchDoc: this.fetchDoc,\n useV2Encoding: this.options.useV2Encoding_experimental ?? false,\n });\n this.subdocHandlers.set(subdoc.guid, handler);\n };\n\n // attempt to load a subdoc of a given guid\n public loadSubdoc = (guid: string): boolean => {\n for (const subdoc of this.rootDoc.subdocs) {\n if (subdoc.guid === guid) {\n subdoc.load();\n return true;\n }\n }\n // should we throw instead?\n return false;\n };\n\n private syncDoc = () => {\n this.rootDocHandler.syncDoc();\n for (const [_, handler] of this.subdocHandlers) {\n handler.syncDoc();\n }\n };\n\n get useV2Encoding(): boolean {\n return this.options.useV2Encoding_experimental ?? false;\n }\n\n // The sync'd property is required by some provider implementations\n get synced(): boolean {\n return this.rootDocHandler.synced;\n }\n\n async pause(): Promise<void> {\n await this.indexeddbProvider?.destroy();\n this.indexeddbProvider = null;\n this.isPaused = true;\n }\n\n unpause(): void {\n this.isPaused = false;\n if (this.options.offlineSupport_experimental) {\n this.setupOfflineSupport();\n }\n this.rootDocHandler.syncDoc();\n }\n\n public getStatus(): YjsSyncStatus {\n if (!this.synced) {\n return \"loading\";\n }\n return this.pending.length === 0 ? \"synchronized\" : \"synchronizing\";\n }\n\n destroy(): void {\n this.unsubscribers.forEach((unsub) => unsub());\n this.awareness.destroy();\n this.rootDocHandler.destroy();\n this._observers = new Map();\n for (const [_, handler] of this.subdocHandlers) {\n handler.destroy();\n }\n this.subdocHandlers.clear();\n super.destroy();\n }\n\n async clearOfflineData(): Promise<void> {\n if (!this.indexeddbProvider) return;\n return this.indexeddbProvider.clearData();\n }\n\n getYDoc(): Doc {\n return this.rootDoc;\n }\n\n // Some provider implementations expect to be able to call connect/disconnect, implement as noop\n disconnect(): void {\n // This is a noop for liveblocks as connections are managed by the room\n }\n\n connect(): void {\n // This is a noop for liveblocks as connections are managed by the room\n }\n}\n","/**\n * Utility module to work with key-value stores.\n *\n * @module map\n */\n\n/**\n * Creates a new Map instance.\n *\n * @function\n * @return {Map<any, any>}\n *\n * @function\n */\nexport const create = () => new Map()\n\n/**\n * Copy a Map object into a fresh Map object.\n *\n * @function\n * @template K,V\n * @param {Map<K,V>} m\n * @return {Map<K,V>}\n */\nexport const copy = m => {\n const r = create()\n m.forEach((v, k) => { r.set(k, v) })\n return r\n}\n\n/**\n * Get map property. Create T if property is undefined and set T on map.\n *\n * ```js\n * const listeners = map.setIfUndefined(events, 'eventName', set.create)\n * listeners.add(listener)\n * ```\n *\n * @function\n * @template {Map<any, any>} MAP\n * @template {MAP extends Map<any,infer V> ? function():V : unknown} CF\n * @param {MAP} map\n * @param {MAP extends Map<infer K,any> ? K : unknown} key\n * @param {CF} createT\n * @return {ReturnType<CF>}\n */\nexport const setIfUndefined = (map, key, createT) => {\n let set = map.get(key)\n if (set === undefined) {\n map.set(key, set = createT())\n }\n return set\n}\n\n/**\n * Creates an Array and populates it with the content of all key-value pairs using the `f(value, key)` function.\n *\n * @function\n * @template K\n * @template V\n * @template R\n * @param {Map<K,V>} m\n * @param {function(V,K):R} f\n * @return {Array<R>}\n */\nexport const map = (m, f) => {\n const res = []\n for (const [key, value] of m) {\n res.push(f(value, key))\n }\n return res\n}\n\n/**\n * Tests whether any key-value pairs pass the test implemented by `f(value, key)`.\n *\n * @todo should rename to some - similarly to Array.some\n *\n * @function\n * @template K\n * @template V\n * @param {Map<K,V>} m\n * @param {function(V,K):boolean} f\n * @return {boolean}\n */\nexport const any = (m, f) => {\n for (const [key, value] of m) {\n if (f(value, key)) {\n return true\n }\n }\n return false\n}\n\n/**\n * Tests whether all key-value pairs pass the test implemented by `f(value, key)`.\n *\n * @function\n * @template K\n * @template V\n * @param {Map<K,V>} m\n * @param {function(V,K):boolean} f\n * @return {boolean}\n */\nexport const all = (m, f) => {\n for (const [key, value] of m) {\n if (!f(value, key)) {\n return false\n }\n }\n return true\n}\n","/**\n * Utility module to work with sets.\n *\n * @module set\n */\n\nexport const create = () => new Set()\n\n/**\n * @template T\n * @param {Set<T>} set\n * @return {Array<T>}\n */\nexport const toArray = set => Array.from(set)\n\n/**\n * @template T\n * @param {Set<T>} set\n * @return {T}\n */\nexport const first = set =>\n set.values().next().value ?? undefined\n\n/**\n * @template T\n * @param {Iterable<T>} entries\n * @return {Set<T>}\n */\nexport const from = entries => new Set(entries)\n","/**\n * Utility module to work with Arrays.\n *\n * @module array\n */\n\nimport * as set from './set.js'\n\n/**\n * Return the last element of an array. The element must exist\n *\n * @template L\n * @param {ArrayLike<L>} arr\n * @return {L}\n */\nexport const last = arr => arr[arr.length - 1]\n\n/**\n * @template C\n * @return {Array<C>}\n */\nexport const create = () => /** @type {Array<C>} */ ([])\n\n/**\n * @template D\n * @param {Array<D>} a\n * @return {Array<D>}\n */\nexport const copy = a => /** @type {Array<D>} */ (a.slice())\n\n/**\n * Append elements from src to dest\n *\n * @template M\n * @param {Array<M>} dest\n * @param {Array<M>} src\n */\nexport const appendTo = (dest, src) => {\n for (let i = 0; i < src.length; i++) {\n dest.push(src[i])\n }\n}\n\n/**\n * Transforms something array-like to an actual Array.\n *\n * @function\n * @template T\n * @param {ArrayLike<T>|Iterable<T>} arraylike\n * @return {T}\n */\nexport const from = Array.from\n\n/**\n * True iff condition holds on every element in the Array.\n *\n * @function\n * @template ITEM\n * @template {ArrayLike<ITEM>} ARR\n *\n * @param {ARR} arr\n * @param {function(ITEM, number, ARR):boolean} f\n * @return {boolean}\n */\nexport const every = (arr, f) => {\n for (let i = 0; i < arr.length; i++) {\n if (!f(arr[i], i, arr)) {\n return false\n }\n }\n return true\n}\n\n/**\n * True iff condition holds on some element in the Array.\n *\n * @function\n * @template S\n * @template {ArrayLike<S>} ARR\n * @param {ARR} arr\n * @param {function(S, number, ARR):boolean} f\n * @return {boolean}\n */\nexport const some = (arr, f) => {\n for (let i = 0; i < arr.length; i++) {\n if (f(arr[i], i, arr)) {\n return true\n }\n }\n return false\n}\n\n/**\n * @template ELEM\n *\n * @param {ArrayLike<ELEM>} a\n * @param {ArrayLike<ELEM>} b\n * @return {boolean}\n */\nexport const equalFlat = (a, b) => a.length === b.length && every(a, (item, index) => item === b[index])\n\n/**\n * @template ELEM\n * @param {Array<Array<ELEM>>} arr\n * @return {Array<ELEM>}\n */\nexport const flatten = arr => fold(arr, /** @type {Array<ELEM>} */ ([]), (acc, val) => acc.concat(val))\n\n/**\n * @template T\n * @param {number} len\n * @param {function(number, Array<T>):T} f\n * @return {Array<T>}\n */\nexport const unfold = (len, f) => {\n const array = new Array(len)\n for (let i = 0; i < len; i++) {\n array[i] = f(i, array)\n }\n return array\n}\n\n/**\n * @template T\n * @template RESULT\n * @param {Array<T>} arr\n * @param {RESULT} seed\n * @param {function(RESULT, T, number):RESULT} folder\n */\nexport const fold = (arr, seed, folder) => arr.reduce(folder, seed)\n\nexport const isArray = Array.isArray\n\n/**\n * @template T\n * @param {Array<T>} arr\n * @return {Array<T>}\n */\nexport const unique = arr => from(set.from(arr))\n\n/**\n * @template T\n * @template M\n * @param {ArrayLike<T>} arr\n * @param {function(T):M} mapper\n * @return {Array<T>}\n */\nexport const uniqueBy = (arr, mapper) => {\n /**\n * @type {Set<M>}\n */\n const happened = set.create()\n /**\n * @type {Array<T>}\n */\n const result = []\n for (let i = 0; i < arr.length; i++) {\n const el = arr[i]\n const mapped = mapper(el)\n if (!happened.has(mapped)) {\n happened.add(mapped)\n result.push(el)\n }\n }\n return result\n}\n\n/**\n * @template {ArrayLike<any>} ARR\n * @template {function(ARR extends ArrayLike<infer T> ? T : never, number, ARR):any} MAPPER\n * @param {ARR} arr\n * @param {MAPPER} mapper\n * @return {Array<MAPPER extends function(...any): infer M ? M : never>}\n */\nexport const map = (arr, mapper) => {\n /**\n * @type {Array<any>}\n */\n const res = Array(arr.length)\n for (let i = 0; i < arr.length; i++) {\n res[i] = mapper(/** @type {any} */ (arr[i]), i, /** @type {any} */ (arr))\n }\n return /** @type {any} */ (res)\n}\n","/**\n * Observable class prototype.\n *\n * @module observable\n */\n\nimport * as map from './map.js'\nimport * as set from './set.js'\nimport * as array from './array.js'\n\n/**\n * Handles named events.\n * @experimental\n *\n * This is basically a (better typed) duplicate of Observable, which will replace Observable in the\n * next release.\n *\n * @template {{[key in keyof EVENTS]: function(...any):void}} EVENTS\n */\nexport class ObservableV2 {\n constructor () {\n /**\n * Some desc.\n * @type {Map<string, Set<any>>}\n */\n this._observers = map.create()\n }\n\n /**\n * @template {keyof EVENTS & string} NAME\n * @param {NAME} name\n * @param {EVENTS[NAME]} f\n */\n on (name, f) {\n map.setIfUndefined(this._observers, /** @type {string} */ (name), set.create).add(f)\n return f\n }\n\n /**\n * @template {keyof EVENTS & string} NAME\n * @param {NAME} name\n * @param {EVENTS[NAME]} f\n */\n once (name, f) {\n /**\n * @param {...any} args\n */\n const _f = (...args) => {\n this.off(name, /** @type {any} */ (_f))\n f(...args)\n }\n this.on(name, /** @type {any} */ (_f))\n }\n\n /**\n * @template {keyof EVENTS & string} NAME\n * @param {NAME} name\n * @param {EVENTS[NAME]} f\n */\n off (name, f) {\n const observers = this._observers.get(name)\n if (observers !== undefined) {\n observers.delete(f)\n if (observers.size === 0) {\n this._observers.delete(name)\n }\n }\n }\n\n /**\n * Emit a named event. All registered event listeners that listen to the\n * specified name will receive the event.\n *\n * @todo This should catch exceptions\n *\n * @template {keyof EVENTS & string} NAME\n * @param {NAME} name The event name.\n * @param {Parameters<EVENTS[NAME]>} args The arguments that are applied to the event listener.\n */\n emit (name, args) {\n // copy all listeners to an array first to make sure that no event is emitted to listeners that are subscribed while the event handler is called.\n return array.from((this._observers.get(name) || map.create()).values()).forEach(f => f(...args))\n }\n\n destroy () {\n this._observers = map.create()\n }\n}\n\n/* c8 ignore start */\n/**\n * Handles named events.\n *\n * @deprecated\n * @template N\n */\nexport class Observable {\n constructor () {\n /**\n * Some desc.\n * @type {Map<N, any>}\n */\n this._observers = map.create()\n }\n\n /**\n * @param {N} name\n * @param {function} f\n */\n on (name, f) {\n map.setIfUndefined(this._observers, name, set.create).add(f)\n }\n\n /**\n * @param {N} name\n * @param {function} f\n */\n once (name, f) {\n /**\n * @param {...any} args\n */\n const _f = (...args) => {\n this.off(name, _f)\n f(...args)\n }\n this.on(name, _f)\n }\n\n /**\n * @param {N} name\n * @param {function} f\n */\n off (name, f) {\n const observers = this._observers.get(name)\n if (observers !== undefined) {\n observers.delete(f)\n if (observers.size === 0) {\n this._observers.delete(name)\n }\n }\n }\n\n /**\n * Emit a named event. All registered event listeners that listen to the\n * specified name will receive the event.\n *\n * @todo This should catch exceptions\n *\n * @param {N} name The event name.\n * @param {Array<any>} args The arguments that are applied to the event listener.\n */\n emit (name, args) {\n // copy all listeners to an array first to make sure that no event is emitted to listeners that are subscribed while the event handler is called.\n return array.from((this._observers.get(name) || map.create()).values()).forEach(f => f(...args))\n }\n\n destroy () {\n this._observers = map.create()\n }\n}\n/* c8 ignore end */\n","// TODO: apparently Yjs is full of anys or something, see if we can fix this\n/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\nimport type { BaseUserMeta, JsonObject, User } from \"@liveblocks/client\";\nimport type { OpaqueRoom } from \"@liveblocks/core\";\nimport { Observable } from \"lib0/observable\";\nimport type * as Y from \"yjs\";\n\nconst Y_PRESENCE_KEY = \"__yjs\";\nconst Y_PRESENCE_ID_KEY = \"__yjs_clientid\";\n\ntype MetaClientState = {\n clock: number;\n lastUpdated: number;\n};\n\n/**\n * This class will store Yjs awareness in Liveblock's presence under the __yjs key\n * IMPORTANT: The Yjs awareness protocol uses ydoc.clientId to reference users\n * to their respective documents. To avoid mapping Yjs clientIds to liveblock's connectionId,\n * we simply set the clientId of the doc to the connectionId. Then no further mapping is required\n */\nexport class Awareness extends Observable<unknown> {\n private room: OpaqueRoom;\n public doc: Y.Doc;\n public states: Map<number, unknown> = new Map();\n // used to map liveblock's ActorId to Yjs ClientID, both unique numbers representing a client\n public actorToClientMap: Map<number, number> = new Map();\n // Meta is used to keep track and timeout users who disconnect. Liveblocks provides this for us, so we don't need to\n // manage it here. Unfortunately, it's expected to exist by various integrations, so it's an empty map.\n public meta: Map<number, MetaClientState> = new Map();\n // _checkInterval this would hold a timer to remove users, but Liveblock's presence already handles this\n // unfortunately it's typed by various integrations\n public _checkInterval: number = 0;\n\n private othersUnsub: () => void;\n constructor(doc: Y.Doc, room: OpaqueRoom) {\n super();\n this.doc = doc;\n this.room = room;\n // Add the clientId to presence so we can map it to connectionId later\n this.room.updatePresence({\n [Y_PRESENCE_ID_KEY]: this.doc.clientID,\n });\n this.othersUnsub = this.room.events.others.subscribe((event) => {\n let updates:\n | { added: number[]; updated: number[]; removed: number[] }\n | undefined;\n\n // When others are changed, we emit an event that contains arrays added/updated/removed.\n if (event.type === \"leave\") {\n const targetClientId = this.actorToClientMap.get(\n event.user.connectionId\n );\n if (targetClientId !== undefined) {\n updates = { added: [], updated: [], removed: [targetClientId] };\n }\n // rebuild after the user leaves so we can get the ID of the user who left\n this.rebuildActorToClientMap(event.others);\n }\n if (event.type === \"enter\" || event.type === \"update\") {\n this.rebuildActorToClientMap(event.others);\n const targetClientId = this.actorToClientMap.get(\n event.user.connectionId\n );\n if (targetClientId !== undefined) {\n updates = {\n added: event.type === \"enter\" ? [targetClientId] : [],\n updated: event.type === \"update\" ? [targetClientId] : [],\n removed: [],\n };\n }\n }\n if (event.type === \"reset\") {\n this.rebuildActorToClientMap(event.others);\n }\n if (updates !== undefined) {\n this.emit(\"change\", [updates, \"presence\"]);\n this.emit(\"update\", [updates, \"presence\"]);\n }\n });\n }\n\n rebuildActorToClientMap(\n others: readonly User<JsonObject, BaseUserMeta>[]\n ): void {\n this.actorToClientMap.clear();\n others.forEach((user) => {\n if (user.presence[Y_PRESENCE_ID_KEY] !== undefined) {\n this.actorToClientMap.set(\n user.connectionId,\n user.presence[Y_PRESENCE_ID_KEY] as number\n );\n }\n });\n }\n\n destroy(): void {\n this.emit(\"destroy\", [this]);\n this.othersUnsub();\n this.setLocalState(null);\n super.destroy();\n }\n\n getLocalState(): JsonObject | null {\n const presence = this.room.getPresence();\n if (\n Object.keys(presence).length === 0 ||\n typeof presence[Y_PRESENCE_KEY] === \"undefined\"\n ) {\n return null;\n }\n return presence[Y_PRESENCE_KEY] as JsonObject | null;\n }\n\n setLocalState(state: Partial<JsonObject> | null): void {\n const presence = this.room.getSelf()?.presence;\n if (state === null) {\n if (presence === undefined) {\n // if presence is already undefined, we don't need to change anything here\n return;\n }\n this.room.updatePresence({ ...presence, [Y_PRESENCE_KEY]: null });\n this.emit(\"update\", [\n { added: [], updated: [], removed: [this.doc.clientID] },\n \"local\",\n ]);\n return;\n }\n // if presence was undefined, it's added, if not, it's updated\n const yPresence = presence?.[Y_PRESENCE_KEY];\n const added = yPresence === undefined ? [this.doc.clientID] : [];\n const updated = yPresence === undefined ? [] : [this.doc.clientID];\n this.room.updatePresence({\n [Y_PRESENCE_KEY]: {\n ...((yPresence as JsonObject) || {}),\n ...(state || {}),\n },\n });\n this.emit(\"update\", [{ added, updated, removed: [] }, \"local\"]);\n }\n\n setLocalStateField(field: string, value: JsonObject | null): void {\n const presence = this.room.getSelf()?.presence[Y_PRESENCE_KEY];\n const update = { [field]: value } as Partial<JsonObject>;\n this.room.updatePresence({\n [Y_PRESENCE_KEY]: { ...((presence as JsonObject) || {}), ...update },\n });\n }\n\n // Translate liveblocks presence to yjs awareness\n getStates(): Map<number, unknown> {\n const others = this.room.getOthers();\n const states = others.reduce((acc: Map<number, unknown>, otherUser) => {\n const otherPresence = otherUser.presence[Y_PRESENCE_KEY];\n const otherClientId = otherUser.presence[Y_PRESENCE_ID_KEY] as\n | number\n | undefined;\n if (otherPresence !== undefined && otherClientId !== undefined) {\n // set states of map clientId to yjs presence\n acc.set(otherClientId, otherPresence || {});\n }\n return acc;\n }, new Map<number, unknown>());\n\n // add this client's yjs presence to states (local client not represented in others)\n const localPresence = this.room.getSelf()?.presence[Y_PRESENCE_KEY];\n if (localPresence !== undefined) {\n states.set(this.doc.clientID, localPresence);\n }\n return states;\n }\n}\n","import { Base64 } from \"js-base64\";\nimport { Observable } from \"lib0/observable\";\nimport { IndexeddbPersistence } from \"y-indexeddb\";\nimport * as Y from \"yjs\";\n\nexport default class yDocHandler extends Observable<unknown> {\n private unsubscribers: Array<() => void> = [];\n\n private _synced = false;\n private doc: Y.Doc;\n private updateRoomDoc: (update: Uint8Array) => void;\n private fetchRoomDoc: (vector: string) => void;\n private useV2Encoding: boolean;\n\n constructor({\n doc,\n isRoot,\n updateDoc,\n fetchDoc,\n useV2Encoding,\n }: {\n doc: Y.Doc;\n isRoot: boolean;\n updateDoc: (update: Uint8Array, guid?: string) => void;\n fetchDoc: (vector: string, guid?: string) => void;\n useV2Encoding: boolean;\n }) {\n super();\n this.doc = doc;\n this.useV2Encoding = useV2Encoding;\n // this.doc.load(); // this just emits a load event, it doesn't actually load anything\n this.doc.on(useV2Encoding ? \"updateV2\" : \"update\", this.updateHandler);\n this.updateRoomDoc = (update: Uint8Array) => {\n updateDoc(update, isRoot ? undefined : this.doc.guid);\n };\n this.fetchRoomDoc = (vector: string) => {\n fetchDoc(vector, isRoot ? undefined : this.doc.guid);\n };\n\n this.syncDoc();\n }\n\n public handleServerUpdate = ({\n update,\n stateVector,\n readOnly,\n v2,\n }: {\n update: Uint8Array;\n stateVector: string | null;\n readOnly: boolean;\n v2?: boolean;\n }): void => {\n // apply update from the server, updates from the server can be v1 or v2\n const applyUpdate = v2 ? Y.applyUpdateV2 : Y.applyUpdate;\n applyUpdate(this.doc, update, \"backend\");\n // if this update is the result of a fetch, the state vector is included\n if (stateVector) {\n if (!readOnly) {\n // Use server state to calculate a diff and send it\n try {\n // send v1 or v2update according to client option\n const encodeUpdate = this.useV2Encoding\n ? Y.encodeStateAsUpdateV2\n : Y.encodeStateAsUpdate;\n const localUpdate = encodeUpdate(\n this.doc,\n Base64.toUint8Array(stateVector)\n );\n this.updateRoomDoc(localUpdate);\n } catch (e) {\n // something went wrong encoding local state to send to the server\n console.warn(e);\n }\n }\n // now that we've sent our local and received from server, we're in sync\n // calling `syncDoc` again will sync up the documents\n this.synced = true;\n }\n };\n\n public syncDoc = (): void => {\n this.synced = false;\n\n // The state vector is sent to the server so it knows what to send back\n // if you don't send it, it returns everything\n const encodedVector = Base64.fromUint8Array(Y.encodeStateVector(this.doc));\n this.fetchRoomDoc(encodedVector);\n };\n\n // The sync'd property is required by some provider implementations\n get synced(): boolean {\n return this._synced;\n }\n\n set synced(state: boolean) {\n if (this._synced !== state) {\n this._synced = state;\n this.emit(\"synced\", [state]);\n this.emit(\"sync\", [state]);\n }\n }\n\n private updateHandler = (\n update: Uint8Array,\n origin: string | IndexeddbPersistence\n ) => {\n // don't send updates from indexedb, those will get handled by sync\n const isFromLocal = origin instanceof IndexeddbPersistence;\n if (origin !== \"backend\" && !isFromLocal) {\n this.updateRoomDoc(update);\n }\n };\n\n destroy(): void {\n this.doc.off(\"update\", this.updateHandler);\n this.unsubscribers.forEach((unsub) => unsub());\n this._observers = new Map();\n this.doc.destroy();\n }\n}\n","import type { OpaqueRoom } from \"@liveblocks/core\";\nimport { Doc } from \"yjs\";\n\nimport { LiveblocksYjsProvider, type ProviderOptions } from \"./provider\";\n\n/* NOTE:\n the purpose of the providersMap is to keep the same provider alive across renders\n re-instantiating the provider when the room hasn't changed can cause the yjs doc state to be out of sync\n with liveblocks yjs state. In this instance, we can just check if the room has changed, because the instance\n from useRoom will be referentially equal to the previous instance.\n*/\nconst providersMap = new WeakMap<OpaqueRoom, LiveblocksYjsProvider>();\n\n/**\n * Get a LiveblocksYjsProvider for a room.\n * @param room - The room to get the provider for.\n * @param options - The options for the provider.\n * @returns A LiveblocksYjsProvider for the room.\n */\nconst getYjsProviderForRoom = (\n room: OpaqueRoom,\n options: ProviderOptions = {}\n): LiveblocksYjsProvider => {\n const provider = providersMap.get(room);\n if (provider !== undefined) {\n return provider;\n }\n const doc = new Doc();\n const newProvider = new LiveblocksYjsProvider(room, doc, options);\n\n room.events.roomWillDestroy.subscribeOnce(() => {\n newProvider.destroy();\n });\n providersMap.set(room, newProvider);\n return newProvider;\n};\n\nexport { getYjsProviderForRoom };\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/liveblocks/liveblocks/packages/liveblocks-yjs/dist/index.cjs","../src/index.ts","../src/version.ts","../src/provider.ts","../../../node_modules/lib0/map.js","../../../node_modules/lib0/set.js","../../../node_modules/lib0/array.js","../../../node_modules/lib0/observable.js","../src/awareness.ts","../src/doc.ts","../src/providerContext.ts"],"names":["create","applyUpdate","Base64","DerivedSignal","IndexeddbPersistence"],"mappings":"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","file":"/home/runner/work/liveblocks/liveblocks/packages/liveblocks-yjs/dist/index.cjs","sourcesContent":[null,"import { detectDupes } from \"@liveblocks/core\";\n\nimport { PKG_FORMAT, PKG_NAME, PKG_VERSION } from \"./version\";\n\ndetectDupes(PKG_NAME, PKG_VERSION, PKG_FORMAT);\n\nexport type { ProviderOptions } from \"./provider\";\nexport { LiveblocksYjsProvider } from \"./provider\";\nexport { getYjsProviderForRoom } from \"./providerContext\";\n","declare const __VERSION__: string;\ndeclare const TSUP_FORMAT: string;\n\nexport const PKG_NAME = \"@liveblocks/yjs\";\nexport const PKG_VERSION = typeof __VERSION__ === \"string\" && __VERSION__;\nexport const PKG_FORMAT = typeof TSUP_FORMAT === \"string\" && TSUP_FORMAT;\n","import {\n DerivedSignal,\n type IYjsProvider,\n type OpaqueRoom,\n type YjsSyncStatus,\n} from \"@liveblocks/core\";\nimport { ClientMsgCode, kInternal, MutableSignal } from \"@liveblocks/core\";\nimport { Base64 } from \"js-base64\";\nimport { Observable } from \"lib0/observable\";\nimport { IndexeddbPersistence } from \"y-indexeddb\";\nimport type { Doc } from \"yjs\";\nimport { PermanentUserData } from \"yjs\";\n\nimport { Awareness } from \"./awareness\";\nimport yDocHandler from \"./doc\";\n\nexport type ProviderOptions = {\n enablePermanentUserData?: boolean;\n autoloadSubdocs?: boolean;\n offlineSupport_experimental?: boolean;\n useV2Encoding_experimental?: boolean;\n};\n\nexport class LiveblocksYjsProvider\n extends Observable<unknown>\n implements IYjsProvider\n{\n private readonly room: OpaqueRoom;\n private readonly rootDoc: Doc;\n private readonly options: ProviderOptions;\n private indexeddbProvider: IndexeddbPersistence | null = null;\n private isPaused = false;\n\n private readonly unsubscribers: Array<() => void> = [];\n\n public readonly awareness: Awareness;\n\n public readonly rootDocHandler: yDocHandler;\n private readonly subdocHandlersΣ = new MutableSignal<\n Map<string, yDocHandler>\n >(new Map());\n private readonly syncStatusΣ: DerivedSignal<YjsSyncStatus>;\n\n public readonly permanentUserData?: PermanentUserData;\n\n constructor(room: OpaqueRoom, doc: Doc, options: ProviderOptions = {}) {\n super();\n this.rootDoc = doc;\n this.room = room;\n this.options = options;\n this.rootDocHandler = new yDocHandler({\n doc,\n isRoot: true,\n updateDoc: this.updateDoc,\n fetchDoc: this.fetchDoc,\n useV2Encoding: this.options.useV2Encoding_experimental ?? false,\n });\n\n if (this.options.enablePermanentUserData) {\n this.permanentUserData = new PermanentUserData(doc);\n }\n\n // TODO: Display a warning if a YjsProvider is already attached to the room\n room[kInternal].setYjsProvider(this);\n\n // if we have a connectionId already during construction, use that\n this.awareness = new Awareness(this.rootDoc, this.room);\n\n this.unsubscribers.push(\n this.room.events.status.subscribe((status) => {\n if (status === \"connected\") {\n this.rootDocHandler.syncDoc();\n } else {\n this.rootDocHandler.synced = false;\n }\n })\n );\n\n this.unsubscribers.push(\n this.room.events.ydoc.subscribe((message) => {\n const { type } = message;\n if (type === ClientMsgCode.UPDATE_YDOC) {\n // don't apply updates that came from the client\n return;\n }\n const {\n stateVector,\n update: updateStr,\n guid,\n v2,\n remoteSnapshotHash,\n } = message;\n const canWrite = this.room.getSelf()?.canWrite ?? true;\n const update = Base64.toUint8Array(updateStr);\n\n // find the right doc and update\n if (guid !== undefined) {\n this.subdocHandlersΣ.get().get(guid)?.handleServerUpdate({\n update,\n stateVector,\n readOnly: !canWrite,\n v2,\n remoteSnapshotHash,\n });\n } else {\n this.rootDocHandler.handleServerUpdate({\n update,\n stateVector,\n readOnly: !canWrite,\n v2,\n remoteSnapshotHash,\n });\n }\n })\n );\n\n if (options.offlineSupport_experimental) {\n this.setupOfflineSupport();\n }\n\n // different consumers listen to sync and synced\n this.rootDocHandler.on(\"synced\", () => {\n const state = this.rootDocHandler.synced;\n for (const [_, handler] of this.subdocHandlersΣ.get()) {\n handler.syncDoc();\n }\n this.emit(\"synced\", [state]);\n this.emit(\"sync\", [state]);\n });\n this.rootDoc.on(\"subdocs\", this.handleSubdocs);\n this.syncDoc();\n\n this.syncStatusΣ = DerivedSignal.from(() => {\n // If the root document is loading or synchronizing, we infer that the overall status is also loading or synchronizing.\n const rootDocumentStatus =\n this.rootDocHandler.experimental_getSyncStatus();\n if (\n rootDocumentStatus === \"loading\" ||\n rootDocumentStatus === \"synchronizing\"\n ) {\n return rootDocumentStatus;\n }\n\n // If the root document is synchronized, we check if all subdocs are synchronized. If at least one subdoc is not synchronized, we are still synchronizing.\n const subdocumentStatuses = Array.from(\n this.subdocHandlersΣ.get().values()\n ).map((handler) => handler.experimental_getSyncStatus());\n if (subdocumentStatuses.some((state) => state !== \"synchronized\")) {\n return \"synchronizing\";\n }\n return \"synchronized\";\n });\n\n this.emit(\"status\", [this.getStatus()]);\n\n this.unsubscribers.push(\n this.syncStatusΣ.subscribe(() => {\n this.emit(\"status\", [this.getStatus()]);\n })\n );\n }\n\n private setupOfflineSupport = () => {\n this.indexeddbProvider = new IndexeddbPersistence(\n this.room.id,\n this.rootDoc\n );\n const onIndexedDbSync = () => {\n this.rootDocHandler.synced = true;\n };\n this.indexeddbProvider.on(\"synced\", onIndexedDbSync);\n\n this.unsubscribers.push(() => {\n this.indexeddbProvider?.off(\"synced\", onIndexedDbSync);\n });\n };\n\n private handleSubdocs = ({\n loaded,\n removed,\n added,\n }: {\n loaded: Set<Doc>;\n removed: Set<Doc>;\n added: Set<Doc>;\n }) => {\n loaded.forEach(this.createSubdocHandler);\n const subdocHandlers = this.subdocHandlersΣ.get();\n if (this.options.autoloadSubdocs) {\n for (const subdoc of added) {\n if (!subdocHandlers.has(subdoc.guid)) {\n subdoc.load();\n }\n }\n }\n for (const subdoc of removed) {\n if (subdocHandlers.has(subdoc.guid)) {\n subdocHandlers.get(subdoc.guid)?.destroy();\n subdocHandlers.delete(subdoc.guid);\n }\n }\n };\n\n private updateDoc = (update: Uint8Array, guid?: string) => {\n const canWrite = this.room.getSelf()?.canWrite ?? true;\n if (canWrite && !this.isPaused) {\n this.room.updateYDoc(\n Base64.fromUint8Array(update),\n guid,\n this.useV2Encoding\n );\n }\n };\n\n private fetchDoc = (vector: string, guid?: string) => {\n this.room.fetchYDoc(vector, guid, this.useV2Encoding);\n };\n\n private createSubdocHandler = (subdoc: Doc): void => {\n const subdocHandlers = this.subdocHandlersΣ.get();\n if (subdocHandlers.has(subdoc.guid)) {\n // if we already handle this subdoc, just fetch it again\n subdocHandlers.get(subdoc.guid)?.syncDoc();\n return;\n }\n const handler = new yDocHandler({\n doc: subdoc,\n isRoot: false,\n updateDoc: this.updateDoc,\n fetchDoc: this.fetchDoc,\n useV2Encoding: this.options.useV2Encoding_experimental ?? false,\n });\n subdocHandlers.set(subdoc.guid, handler);\n };\n\n // attempt to load a subdoc of a given guid\n public loadSubdoc = (guid: string): boolean => {\n for (const subdoc of this.rootDoc.subdocs) {\n if (subdoc.guid === guid) {\n subdoc.load();\n return true;\n }\n }\n // should we throw instead?\n return false;\n };\n\n private syncDoc = () => {\n this.rootDocHandler.syncDoc();\n for (const [_, handler] of this.subdocHandlersΣ.get()) {\n handler.syncDoc();\n }\n };\n\n get useV2Encoding(): boolean {\n return this.options.useV2Encoding_experimental ?? false;\n }\n\n // The sync'd property is required by some provider implementations\n get synced(): boolean {\n return this.rootDocHandler.synced;\n }\n\n async pause(): Promise<void> {\n await this.indexeddbProvider?.destroy();\n this.indexeddbProvider = null;\n this.isPaused = true;\n }\n\n unpause(): void {\n this.isPaused = false;\n if (this.options.offlineSupport_experimental) {\n this.setupOfflineSupport();\n }\n this.rootDocHandler.syncDoc();\n }\n\n public getStatus(): YjsSyncStatus {\n return this.syncStatusΣ.get();\n }\n\n destroy(): void {\n this.unsubscribers.forEach((unsub) => unsub());\n this.awareness.destroy();\n this.rootDocHandler.destroy();\n this._observers = new Map();\n for (const [_, handler] of this.subdocHandlersΣ.get()) {\n handler.destroy();\n }\n this.subdocHandlersΣ.get().clear();\n super.destroy();\n }\n\n async clearOfflineData(): Promise<void> {\n if (!this.indexeddbProvider) return;\n return this.indexeddbProvider.clearData();\n }\n\n getYDoc(): Doc {\n return this.rootDoc;\n }\n\n // Some provider implementations expect to be able to call connect/disconnect, implement as noop\n disconnect(): void {\n // This is a noop for liveblocks as connections are managed by the room\n }\n\n connect(): void {\n // This is a noop for liveblocks as connections are managed by the room\n }\n\n get subdocHandlers(): Map<string, yDocHandler> {\n return this.subdocHandlersΣ.get();\n }\n\n set subdocHandlers(value: Map<string, yDocHandler>) {\n this.subdocHandlersΣ.mutate((map) => {\n map.clear();\n for (const [key, handler] of value) {\n map.set(key, handler);\n }\n });\n }\n}\n","/**\n * Utility module to work with key-value stores.\n *\n * @module map\n */\n\n/**\n * Creates a new Map instance.\n *\n * @function\n * @return {Map<any, any>}\n *\n * @function\n */\nexport const create = () => new Map()\n\n/**\n * Copy a Map object into a fresh Map object.\n *\n * @function\n * @template K,V\n * @param {Map<K,V>} m\n * @return {Map<K,V>}\n */\nexport const copy = m => {\n const r = create()\n m.forEach((v, k) => { r.set(k, v) })\n return r\n}\n\n/**\n * Get map property. Create T if property is undefined and set T on map.\n *\n * ```js\n * const listeners = map.setIfUndefined(events, 'eventName', set.create)\n * listeners.add(listener)\n * ```\n *\n * @function\n * @template {Map<any, any>} MAP\n * @template {MAP extends Map<any,infer V> ? function():V : unknown} CF\n * @param {MAP} map\n * @param {MAP extends Map<infer K,any> ? K : unknown} key\n * @param {CF} createT\n * @return {ReturnType<CF>}\n */\nexport const setIfUndefined = (map, key, createT) => {\n let set = map.get(key)\n if (set === undefined) {\n map.set(key, set = createT())\n }\n return set\n}\n\n/**\n * Creates an Array and populates it with the content of all key-value pairs using the `f(value, key)` function.\n *\n * @function\n * @template K\n * @template V\n * @template R\n * @param {Map<K,V>} m\n * @param {function(V,K):R} f\n * @return {Array<R>}\n */\nexport const map = (m, f) => {\n const res = []\n for (const [key, value] of m) {\n res.push(f(value, key))\n }\n return res\n}\n\n/**\n * Tests whether any key-value pairs pass the test implemented by `f(value, key)`.\n *\n * @todo should rename to some - similarly to Array.some\n *\n * @function\n * @template K\n * @template V\n * @param {Map<K,V>} m\n * @param {function(V,K):boolean} f\n * @return {boolean}\n */\nexport const any = (m, f) => {\n for (const [key, value] of m) {\n if (f(value, key)) {\n return true\n }\n }\n return false\n}\n\n/**\n * Tests whether all key-value pairs pass the test implemented by `f(value, key)`.\n *\n * @function\n * @template K\n * @template V\n * @param {Map<K,V>} m\n * @param {function(V,K):boolean} f\n * @return {boolean}\n */\nexport const all = (m, f) => {\n for (const [key, value] of m) {\n if (!f(value, key)) {\n return false\n }\n }\n return true\n}\n","/**\n * Utility module to work with sets.\n *\n * @module set\n */\n\nexport const create = () => new Set()\n\n/**\n * @template T\n * @param {Set<T>} set\n * @return {Array<T>}\n */\nexport const toArray = set => Array.from(set)\n\n/**\n * @template T\n * @param {Set<T>} set\n * @return {T}\n */\nexport const first = set =>\n set.values().next().value ?? undefined\n\n/**\n * @template T\n * @param {Iterable<T>} entries\n * @return {Set<T>}\n */\nexport const from = entries => new Set(entries)\n","/**\n * Utility module to work with Arrays.\n *\n * @module array\n */\n\nimport * as set from './set.js'\n\n/**\n * Return the last element of an array. The element must exist\n *\n * @template L\n * @param {ArrayLike<L>} arr\n * @return {L}\n */\nexport const last = arr => arr[arr.length - 1]\n\n/**\n * @template C\n * @return {Array<C>}\n */\nexport const create = () => /** @type {Array<C>} */ ([])\n\n/**\n * @template D\n * @param {Array<D>} a\n * @return {Array<D>}\n */\nexport const copy = a => /** @type {Array<D>} */ (a.slice())\n\n/**\n * Append elements from src to dest\n *\n * @template M\n * @param {Array<M>} dest\n * @param {Array<M>} src\n */\nexport const appendTo = (dest, src) => {\n for (let i = 0; i < src.length; i++) {\n dest.push(src[i])\n }\n}\n\n/**\n * Transforms something array-like to an actual Array.\n *\n * @function\n * @template T\n * @param {ArrayLike<T>|Iterable<T>} arraylike\n * @return {T}\n */\nexport const from = Array.from\n\n/**\n * True iff condition holds on every element in the Array.\n *\n * @function\n * @template ITEM\n * @template {ArrayLike<ITEM>} ARR\n *\n * @param {ARR} arr\n * @param {function(ITEM, number, ARR):boolean} f\n * @return {boolean}\n */\nexport const every = (arr, f) => {\n for (let i = 0; i < arr.length; i++) {\n if (!f(arr[i], i, arr)) {\n return false\n }\n }\n return true\n}\n\n/**\n * True iff condition holds on some element in the Array.\n *\n * @function\n * @template S\n * @template {ArrayLike<S>} ARR\n * @param {ARR} arr\n * @param {function(S, number, ARR):boolean} f\n * @return {boolean}\n */\nexport const some = (arr, f) => {\n for (let i = 0; i < arr.length; i++) {\n if (f(arr[i], i, arr)) {\n return true\n }\n }\n return false\n}\n\n/**\n * @template ELEM\n *\n * @param {ArrayLike<ELEM>} a\n * @param {ArrayLike<ELEM>} b\n * @return {boolean}\n */\nexport const equalFlat = (a, b) => a.length === b.length && every(a, (item, index) => item === b[index])\n\n/**\n * @template ELEM\n * @param {Array<Array<ELEM>>} arr\n * @return {Array<ELEM>}\n */\nexport const flatten = arr => fold(arr, /** @type {Array<ELEM>} */ ([]), (acc, val) => acc.concat(val))\n\n/**\n * @template T\n * @param {number} len\n * @param {function(number, Array<T>):T} f\n * @return {Array<T>}\n */\nexport const unfold = (len, f) => {\n const array = new Array(len)\n for (let i = 0; i < len; i++) {\n array[i] = f(i, array)\n }\n return array\n}\n\n/**\n * @template T\n * @template RESULT\n * @param {Array<T>} arr\n * @param {RESULT} seed\n * @param {function(RESULT, T, number):RESULT} folder\n */\nexport const fold = (arr, seed, folder) => arr.reduce(folder, seed)\n\nexport const isArray = Array.isArray\n\n/**\n * @template T\n * @param {Array<T>} arr\n * @return {Array<T>}\n */\nexport const unique = arr => from(set.from(arr))\n\n/**\n * @template T\n * @template M\n * @param {ArrayLike<T>} arr\n * @param {function(T):M} mapper\n * @return {Array<T>}\n */\nexport const uniqueBy = (arr, mapper) => {\n /**\n * @type {Set<M>}\n */\n const happened = set.create()\n /**\n * @type {Array<T>}\n */\n const result = []\n for (let i = 0; i < arr.length; i++) {\n const el = arr[i]\n const mapped = mapper(el)\n if (!happened.has(mapped)) {\n happened.add(mapped)\n result.push(el)\n }\n }\n return result\n}\n\n/**\n * @template {ArrayLike<any>} ARR\n * @template {function(ARR extends ArrayLike<infer T> ? T : never, number, ARR):any} MAPPER\n * @param {ARR} arr\n * @param {MAPPER} mapper\n * @return {Array<MAPPER extends function(...any): infer M ? M : never>}\n */\nexport const map = (arr, mapper) => {\n /**\n * @type {Array<any>}\n */\n const res = Array(arr.length)\n for (let i = 0; i < arr.length; i++) {\n res[i] = mapper(/** @type {any} */ (arr[i]), i, /** @type {any} */ (arr))\n }\n return /** @type {any} */ (res)\n}\n","/**\n * Observable class prototype.\n *\n * @module observable\n */\n\nimport * as map from './map.js'\nimport * as set from './set.js'\nimport * as array from './array.js'\n\n/**\n * Handles named events.\n * @experimental\n *\n * This is basically a (better typed) duplicate of Observable, which will replace Observable in the\n * next release.\n *\n * @template {{[key in keyof EVENTS]: function(...any):void}} EVENTS\n */\nexport class ObservableV2 {\n constructor () {\n /**\n * Some desc.\n * @type {Map<string, Set<any>>}\n */\n this._observers = map.create()\n }\n\n /**\n * @template {keyof EVENTS & string} NAME\n * @param {NAME} name\n * @param {EVENTS[NAME]} f\n */\n on (name, f) {\n map.setIfUndefined(this._observers, /** @type {string} */ (name), set.create).add(f)\n return f\n }\n\n /**\n * @template {keyof EVENTS & string} NAME\n * @param {NAME} name\n * @param {EVENTS[NAME]} f\n */\n once (name, f) {\n /**\n * @param {...any} args\n */\n const _f = (...args) => {\n this.off(name, /** @type {any} */ (_f))\n f(...args)\n }\n this.on(name, /** @type {any} */ (_f))\n }\n\n /**\n * @template {keyof EVENTS & string} NAME\n * @param {NAME} name\n * @param {EVENTS[NAME]} f\n */\n off (name, f) {\n const observers = this._observers.get(name)\n if (observers !== undefined) {\n observers.delete(f)\n if (observers.size === 0) {\n this._observers.delete(name)\n }\n }\n }\n\n /**\n * Emit a named event. All registered event listeners that listen to the\n * specified name will receive the event.\n *\n * @todo This should catch exceptions\n *\n * @template {keyof EVENTS & string} NAME\n * @param {NAME} name The event name.\n * @param {Parameters<EVENTS[NAME]>} args The arguments that are applied to the event listener.\n */\n emit (name, args) {\n // copy all listeners to an array first to make sure that no event is emitted to listeners that are subscribed while the event handler is called.\n return array.from((this._observers.get(name) || map.create()).values()).forEach(f => f(...args))\n }\n\n destroy () {\n this._observers = map.create()\n }\n}\n\n/* c8 ignore start */\n/**\n * Handles named events.\n *\n * @deprecated\n * @template N\n */\nexport class Observable {\n constructor () {\n /**\n * Some desc.\n * @type {Map<N, any>}\n */\n this._observers = map.create()\n }\n\n /**\n * @param {N} name\n * @param {function} f\n */\n on (name, f) {\n map.setIfUndefined(this._observers, name, set.create).add(f)\n }\n\n /**\n * @param {N} name\n * @param {function} f\n */\n once (name, f) {\n /**\n * @param {...any} args\n */\n const _f = (...args) => {\n this.off(name, _f)\n f(...args)\n }\n this.on(name, _f)\n }\n\n /**\n * @param {N} name\n * @param {function} f\n */\n off (name, f) {\n const observers = this._observers.get(name)\n if (observers !== undefined) {\n observers.delete(f)\n if (observers.size === 0) {\n this._observers.delete(name)\n }\n }\n }\n\n /**\n * Emit a named event. All registered event listeners that listen to the\n * specified name will receive the event.\n *\n * @todo This should catch exceptions\n *\n * @param {N} name The event name.\n * @param {Array<any>} args The arguments that are applied to the event listener.\n */\n emit (name, args) {\n // copy all listeners to an array first to make sure that no event is emitted to listeners that are subscribed while the event handler is called.\n return array.from((this._observers.get(name) || map.create()).values()).forEach(f => f(...args))\n }\n\n destroy () {\n this._observers = map.create()\n }\n}\n/* c8 ignore end */\n","// TODO: apparently Yjs is full of anys or something, see if we can fix this\n/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\nimport type { BaseUserMeta, JsonObject, User } from \"@liveblocks/client\";\nimport type { OpaqueRoom } from \"@liveblocks/core\";\nimport { Observable } from \"lib0/observable\";\nimport type * as Y from \"yjs\";\n\nconst Y_PRESENCE_KEY = \"__yjs\";\nconst Y_PRESENCE_ID_KEY = \"__yjs_clientid\";\n\ntype MetaClientState = {\n clock: number;\n lastUpdated: number;\n};\n\n/**\n * This class will store Yjs awareness in Liveblock's presence under the __yjs key\n * IMPORTANT: The Yjs awareness protocol uses ydoc.clientId to reference users\n * to their respective documents. To avoid mapping Yjs clientIds to liveblock's connectionId,\n * we simply set the clientId of the doc to the connectionId. Then no further mapping is required\n */\nexport class Awareness extends Observable<unknown> {\n private room: OpaqueRoom;\n public doc: Y.Doc;\n public states: Map<number, unknown> = new Map();\n // used to map liveblock's ActorId to Yjs ClientID, both unique numbers representing a client\n public actorToClientMap: Map<number, number> = new Map();\n // Meta is used to keep track and timeout users who disconnect. Liveblocks provides this for us, so we don't need to\n // manage it here. Unfortunately, it's expected to exist by various integrations, so it's an empty map.\n public meta: Map<number, MetaClientState> = new Map();\n // _checkInterval this would hold a timer to remove users, but Liveblock's presence already handles this\n // unfortunately it's typed by various integrations\n public _checkInterval: number = 0;\n\n private othersUnsub: () => void;\n constructor(doc: Y.Doc, room: OpaqueRoom) {\n super();\n this.doc = doc;\n this.room = room;\n // Add the clientId to presence so we can map it to connectionId later\n this.room.updatePresence({\n [Y_PRESENCE_ID_KEY]: this.doc.clientID,\n });\n this.othersUnsub = this.room.events.others.subscribe((event) => {\n let updates:\n | { added: number[]; updated: number[]; removed: number[] }\n | undefined;\n\n // When others are changed, we emit an event that contains arrays added/updated/removed.\n if (event.type === \"leave\") {\n const targetClientId = this.actorToClientMap.get(\n event.user.connectionId\n );\n if (targetClientId !== undefined) {\n updates = { added: [], updated: [], removed: [targetClientId] };\n }\n // rebuild after the user leaves so we can get the ID of the user who left\n this.rebuildActorToClientMap(event.others);\n }\n if (event.type === \"enter\" || event.type === \"update\") {\n this.rebuildActorToClientMap(event.others);\n const targetClientId = this.actorToClientMap.get(\n event.user.connectionId\n );\n if (targetClientId !== undefined) {\n updates = {\n added: event.type === \"enter\" ? [targetClientId] : [],\n updated: event.type === \"update\" ? [targetClientId] : [],\n removed: [],\n };\n }\n }\n if (event.type === \"reset\") {\n this.rebuildActorToClientMap(event.others);\n }\n if (updates !== undefined) {\n this.emit(\"change\", [updates, \"presence\"]);\n this.emit(\"update\", [updates, \"presence\"]);\n }\n });\n }\n\n rebuildActorToClientMap(\n others: readonly User<JsonObject, BaseUserMeta>[]\n ): void {\n this.actorToClientMap.clear();\n others.forEach((user) => {\n if (user.presence[Y_PRESENCE_ID_KEY] !== undefined) {\n this.actorToClientMap.set(\n user.connectionId,\n user.presence[Y_PRESENCE_ID_KEY] as number\n );\n }\n });\n }\n\n destroy(): void {\n this.emit(\"destroy\", [this]);\n this.othersUnsub();\n this.setLocalState(null);\n super.destroy();\n }\n\n getLocalState(): JsonObject | null {\n const presence = this.room.getPresence();\n if (\n Object.keys(presence).length === 0 ||\n typeof presence[Y_PRESENCE_KEY] === \"undefined\"\n ) {\n return null;\n }\n return presence[Y_PRESENCE_KEY] as JsonObject | null;\n }\n\n setLocalState(state: Partial<JsonObject> | null): void {\n const presence = this.room.getSelf()?.presence;\n if (state === null) {\n if (presence === undefined) {\n // if presence is already undefined, we don't need to change anything here\n return;\n }\n this.room.updatePresence({ ...presence, [Y_PRESENCE_KEY]: null });\n this.emit(\"update\", [\n { added: [], updated: [], removed: [this.doc.clientID] },\n \"local\",\n ]);\n return;\n }\n // if presence was undefined, it's added, if not, it's updated\n const yPresence = presence?.[Y_PRESENCE_KEY];\n const added = yPresence === undefined ? [this.doc.clientID] : [];\n const updated = yPresence === undefined ? [] : [this.doc.clientID];\n this.room.updatePresence({\n [Y_PRESENCE_KEY]: {\n ...((yPresence as JsonObject) || {}),\n ...(state || {}),\n },\n });\n this.emit(\"update\", [{ added, updated, removed: [] }, \"local\"]);\n }\n\n setLocalStateField(field: string, value: JsonObject | null): void {\n const presence = this.room.getSelf()?.presence[Y_PRESENCE_KEY];\n const update = { [field]: value } as Partial<JsonObject>;\n this.room.updatePresence({\n [Y_PRESENCE_KEY]: { ...((presence as JsonObject) || {}), ...update },\n });\n }\n\n // Translate liveblocks presence to yjs awareness\n getStates(): Map<number, unknown> {\n const others = this.room.getOthers();\n const states = others.reduce((acc: Map<number, unknown>, otherUser) => {\n const otherPresence = otherUser.presence[Y_PRESENCE_KEY];\n const otherClientId = otherUser.presence[Y_PRESENCE_ID_KEY] as\n | number\n | undefined;\n if (otherPresence !== undefined && otherClientId !== undefined) {\n // set states of map clientId to yjs presence\n acc.set(otherClientId, otherPresence || {});\n }\n return acc;\n }, new Map<number, unknown>());\n\n // add this client's yjs presence to states (local client not represented in others)\n const localPresence = this.room.getSelf()?.presence[Y_PRESENCE_KEY];\n if (localPresence !== undefined) {\n states.set(this.doc.clientID, localPresence);\n }\n return states;\n }\n}\n","import {\n DerivedSignal,\n Signal as Signal,\n type YjsSyncStatus,\n} from \"@liveblocks/core\";\nimport { sha256 } from \"@noble/hashes/sha2\";\nimport { Base64 } from \"js-base64\";\nimport { Observable } from \"lib0/observable\";\nimport { IndexeddbPersistence } from \"y-indexeddb\";\nimport * as Y from \"yjs\";\n\nexport default class yDocHandler extends Observable<unknown> {\n private unsubscribers: Array<() => void> = [];\n\n private _synced = false;\n private doc: Y.Doc;\n private updateRoomDoc: (update: Uint8Array) => void;\n private fetchRoomDoc: (vector: string) => void;\n private useV2Encoding: boolean;\n private localSnapshotHashΣ: Signal<string>;\n private remoteSnapshotHashΣ: Signal<string | null>;\n\n private debounceTimer: ReturnType<typeof setTimeout> | null = null;\n private static readonly DEBOUNCE_INTERVAL_MS = 200;\n\n private isLocalAndRemoteSnapshotEqualΣ: DerivedSignal<boolean>;\n\n constructor({\n doc,\n isRoot,\n updateDoc,\n fetchDoc,\n useV2Encoding,\n }: {\n doc: Y.Doc;\n isRoot: boolean;\n updateDoc: (update: Uint8Array, guid?: string) => void;\n fetchDoc: (vector: string, guid?: string) => void;\n useV2Encoding: boolean;\n }) {\n super();\n this.doc = doc;\n this.useV2Encoding = useV2Encoding;\n // this.doc.load(); // this just emits a load event, it doesn't actually load anything\n this.doc.on(useV2Encoding ? \"updateV2\" : \"update\", this.updateHandler);\n this.updateRoomDoc = (update: Uint8Array) => {\n updateDoc(update, isRoot ? undefined : this.doc.guid);\n };\n this.fetchRoomDoc = (vector: string) => {\n fetchDoc(vector, isRoot ? undefined : this.doc.guid);\n };\n\n this.syncDoc();\n\n const encodedSnapshot = this.useV2Encoding\n ? Y.encodeSnapshotV2(Y.snapshot(this.doc))\n : Y.encodeSnapshot(Y.snapshot(this.doc));\n\n this.localSnapshotHashΣ = new Signal(\n Base64.fromUint8Array(sha256(encodedSnapshot))\n );\n this.remoteSnapshotHashΣ = new Signal<string | null>(null);\n\n this.isLocalAndRemoteSnapshotEqualΣ = DerivedSignal.from(() => {\n const remoteSnapshotHash = this.remoteSnapshotHashΣ.get();\n if (remoteSnapshotHash === null) return false;\n\n const localSnapshotHash = this.localSnapshotHashΣ.get();\n if (localSnapshotHash !== remoteSnapshotHash) {\n return false;\n }\n return true;\n });\n }\n\n public handleServerUpdate = ({\n update,\n stateVector,\n readOnly,\n v2,\n remoteSnapshotHash,\n }: {\n update: Uint8Array;\n stateVector: string | null;\n readOnly: boolean;\n v2?: boolean;\n remoteSnapshotHash: string;\n }): void => {\n // apply update from the server, updates from the server can be v1 or v2\n const applyUpdate = v2 ? Y.applyUpdateV2 : Y.applyUpdate;\n applyUpdate(this.doc, update, \"backend\");\n // if this update is the result of a fetch, the state vector is included\n if (stateVector) {\n if (!readOnly) {\n // Use server state to calculate a diff and send it\n try {\n // send v1 or v2update according to client option\n const encodeUpdate = this.useV2Encoding\n ? Y.encodeStateAsUpdateV2\n : Y.encodeStateAsUpdate;\n const localUpdate = encodeUpdate(\n this.doc,\n Base64.toUint8Array(stateVector)\n );\n this.updateRoomDoc(localUpdate);\n } catch (e) {\n // something went wrong encoding local state to send to the server\n console.warn(e);\n }\n }\n // now that we've sent our local and received from server, we're in sync\n // calling `syncDoc` again will sync up the documents\n this.synced = true;\n }\n\n this.remoteSnapshotHashΣ.set(remoteSnapshotHash);\n };\n\n public syncDoc = (): void => {\n this.synced = false;\n\n // The state vector is sent to the server so it knows what to send back\n // if you don't send it, it returns everything\n const encodedVector = Base64.fromUint8Array(Y.encodeStateVector(this.doc));\n this.fetchRoomDoc(encodedVector);\n };\n\n // The sync'd property is required by some provider implementations\n get synced(): boolean {\n return this._synced;\n }\n\n set synced(state: boolean) {\n if (this._synced !== state) {\n this._synced = state;\n this.emit(\"synced\", [state]);\n this.emit(\"sync\", [state]);\n }\n }\n\n private debounced_updateLocalSnapshot() {\n if (this.debounceTimer) clearTimeout(this.debounceTimer);\n this.debounceTimer = setTimeout(() => {\n // Compute local snapshot and update the local snapshot state\n const encodedSnapshot = this.useV2Encoding\n ? Y.encodeSnapshotV2(Y.snapshot(this.doc))\n : Y.encodeSnapshot(Y.snapshot(this.doc));\n this.localSnapshotHashΣ.set(\n Base64.fromUint8Array(sha256(encodedSnapshot))\n );\n this.debounceTimer = null;\n }, yDocHandler.DEBOUNCE_INTERVAL_MS);\n }\n\n private updateHandler = (\n update: Uint8Array,\n origin: string | IndexeddbPersistence\n ) => {\n this.debounced_updateLocalSnapshot();\n\n // don't send updates from indexedb, those will get handled by sync\n const isFromLocal = origin instanceof IndexeddbPersistence;\n if (origin !== \"backend\" && !isFromLocal) {\n this.updateRoomDoc(update);\n }\n };\n\n experimental_getSyncStatus(): YjsSyncStatus {\n const remoteSnapshotHash = this.remoteSnapshotHashΣ.get();\n if (remoteSnapshotHash === null) {\n return \"loading\";\n }\n if (!this.isLocalAndRemoteSnapshotEqualΣ.get()) {\n return \"synchronizing\";\n }\n return \"synchronized\";\n }\n\n destroy(): void {\n if (this.debounceTimer) clearTimeout(this.debounceTimer);\n this.doc.off(\"update\", this.updateHandler);\n this.unsubscribers.forEach((unsub) => unsub());\n this._observers = new Map();\n this.doc.destroy();\n }\n}\n","import type { OpaqueRoom } from \"@liveblocks/core\";\nimport { Doc } from \"yjs\";\n\nimport { LiveblocksYjsProvider, type ProviderOptions } from \"./provider\";\n\n/* NOTE:\n the purpose of the providersMap is to keep the same provider alive across renders\n re-instantiating the provider when the room hasn't changed can cause the yjs doc state to be out of sync\n with liveblocks yjs state. In this instance, we can just check if the room has changed, because the instance\n from useRoom will be referentially equal to the previous instance.\n*/\nconst providersMap = new WeakMap<OpaqueRoom, LiveblocksYjsProvider>();\n\n/**\n * Get a LiveblocksYjsProvider for a room.\n * @param room - The room to get the provider for.\n * @param options - The options for the provider.\n * @returns A LiveblocksYjsProvider for the room.\n */\nconst getYjsProviderForRoom = (\n room: OpaqueRoom,\n options: ProviderOptions = {}\n): LiveblocksYjsProvider => {\n const provider = providersMap.get(room);\n if (provider !== undefined) {\n return provider;\n }\n const doc = new Doc();\n const newProvider = new LiveblocksYjsProvider(room, doc, options);\n\n room.events.roomWillDestroy.subscribeOnce(() => {\n newProvider.destroy();\n });\n providersMap.set(room, newProvider);\n return newProvider;\n};\n\nexport { getYjsProviderForRoom };\n"]}
|