@liveblocks/yjs 2.17.0-usrnotsettings2 → 2.17.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.
- package/dist/index.d.mts +4 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +45 -26
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +29 -10
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
package/dist/index.d.mts
CHANGED
|
@@ -67,12 +67,14 @@ declare class LiveblocksYjsProvider<P extends JsonObject = DP, S extends LsonObj
|
|
|
67
67
|
private rootDoc;
|
|
68
68
|
private options;
|
|
69
69
|
private indexeddbProvider;
|
|
70
|
+
private isPaused;
|
|
70
71
|
private unsubscribers;
|
|
71
72
|
awareness: Awareness<P, S, U, E, M>;
|
|
72
73
|
rootDocHandler: yDocHandler;
|
|
73
74
|
subdocHandlers: Map<string, yDocHandler>;
|
|
74
75
|
private pending;
|
|
75
76
|
constructor(room: Room<P, S, U, E, M>, doc: Y.Doc, options?: ProviderOptions | undefined);
|
|
77
|
+
private setupOfflineSupport;
|
|
76
78
|
private handleSubdocs;
|
|
77
79
|
private getUniqueUpdateId;
|
|
78
80
|
private updateDoc;
|
|
@@ -82,6 +84,8 @@ declare class LiveblocksYjsProvider<P extends JsonObject = DP, S extends LsonObj
|
|
|
82
84
|
private syncDoc;
|
|
83
85
|
get useV2Encoding(): boolean;
|
|
84
86
|
get synced(): boolean;
|
|
87
|
+
pause(): Promise<void>;
|
|
88
|
+
unpause(): void;
|
|
85
89
|
getStatus(): YjsSyncStatus;
|
|
86
90
|
destroy(): void;
|
|
87
91
|
clearOfflineData(): Promise<void>;
|
package/dist/index.d.ts
CHANGED
|
@@ -67,12 +67,14 @@ declare class LiveblocksYjsProvider<P extends JsonObject = DP, S extends LsonObj
|
|
|
67
67
|
private rootDoc;
|
|
68
68
|
private options;
|
|
69
69
|
private indexeddbProvider;
|
|
70
|
+
private isPaused;
|
|
70
71
|
private unsubscribers;
|
|
71
72
|
awareness: Awareness<P, S, U, E, M>;
|
|
72
73
|
rootDocHandler: yDocHandler;
|
|
73
74
|
subdocHandlers: Map<string, yDocHandler>;
|
|
74
75
|
private pending;
|
|
75
76
|
constructor(room: Room<P, S, U, E, M>, doc: Y.Doc, options?: ProviderOptions | undefined);
|
|
77
|
+
private setupOfflineSupport;
|
|
76
78
|
private handleSubdocs;
|
|
77
79
|
private getUniqueUpdateId;
|
|
78
80
|
private updateDoc;
|
|
@@ -82,6 +84,8 @@ declare class LiveblocksYjsProvider<P extends JsonObject = DP, S extends LsonObj
|
|
|
82
84
|
private syncDoc;
|
|
83
85
|
get useV2Encoding(): boolean;
|
|
84
86
|
get synced(): boolean;
|
|
87
|
+
pause(): Promise<void>;
|
|
88
|
+
unpause(): void;
|
|
85
89
|
getStatus(): YjsSyncStatus;
|
|
86
90
|
destroy(): void;
|
|
87
91
|
clearOfflineData(): Promise<void>;
|
package/dist/index.js
CHANGED
|
@@ -292,7 +292,7 @@ var yDocHandler = (_class2 = class extends Observable {
|
|
|
292
292
|
|
|
293
293
|
// src/version.ts
|
|
294
294
|
var PKG_NAME = "@liveblocks/yjs";
|
|
295
|
-
var PKG_VERSION = "2.17.0
|
|
295
|
+
var PKG_VERSION = "2.17.0";
|
|
296
296
|
var PKG_FORMAT = "cjs";
|
|
297
297
|
|
|
298
298
|
// src/index.ts
|
|
@@ -302,13 +302,14 @@ var LiveblocksYjsProvider = (_class3 = class extends Observable {
|
|
|
302
302
|
|
|
303
303
|
|
|
304
304
|
__init10() {this.indexeddbProvider = null}
|
|
305
|
-
__init11() {this.
|
|
305
|
+
__init11() {this.isPaused = false}
|
|
306
|
+
__init12() {this.unsubscribers = []}
|
|
306
307
|
|
|
307
308
|
|
|
308
|
-
|
|
309
|
-
|
|
309
|
+
__init13() {this.subdocHandlers = /* @__PURE__ */ new Map()}
|
|
310
|
+
__init14() {this.pending = []}
|
|
310
311
|
constructor(room, doc, options = {}) {
|
|
311
|
-
super();_class3.prototype.__init10.call(this);_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);;
|
|
312
|
+
super();_class3.prototype.__init10.call(this);_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);_class3.prototype.__init22.call(this);;
|
|
312
313
|
this.rootDoc = doc;
|
|
313
314
|
this.room = room;
|
|
314
315
|
this.options = options;
|
|
@@ -338,7 +339,7 @@ var LiveblocksYjsProvider = (_class3 = class extends Observable {
|
|
|
338
339
|
return;
|
|
339
340
|
}
|
|
340
341
|
const { stateVector, update: updateStr, guid, v2 } = message;
|
|
341
|
-
const canWrite = _nullishCoalesce(_optionalChain([this, 'access',
|
|
342
|
+
const canWrite = _nullishCoalesce(_optionalChain([this, 'access', _34 => _34.room, 'access', _35 => _35.getSelf, 'call', _36 => _36(), 'optionalAccess', _37 => _37.canWrite]), () => ( true));
|
|
342
343
|
const update = _jsbase64.Base64.toUint8Array(updateStr);
|
|
343
344
|
let foundPendingUpdate = false;
|
|
344
345
|
const updateId = this.getUniqueUpdateId(update);
|
|
@@ -351,7 +352,7 @@ var LiveblocksYjsProvider = (_class3 = class extends Observable {
|
|
|
351
352
|
});
|
|
352
353
|
if (!foundPendingUpdate) {
|
|
353
354
|
if (guid !== void 0) {
|
|
354
|
-
_optionalChain([this, 'access',
|
|
355
|
+
_optionalChain([this, 'access', _38 => _38.subdocHandlers, 'access', _39 => _39.get, 'call', _40 => _40(guid), 'optionalAccess', _41 => _41.handleServerUpdate, 'call', _42 => _42({
|
|
355
356
|
update,
|
|
356
357
|
stateVector,
|
|
357
358
|
readOnly: !canWrite,
|
|
@@ -370,14 +371,7 @@ var LiveblocksYjsProvider = (_class3 = class extends Observable {
|
|
|
370
371
|
})
|
|
371
372
|
);
|
|
372
373
|
if (options.offlineSupport_experimental) {
|
|
373
|
-
this.
|
|
374
|
-
const onIndexedDbSync = () => {
|
|
375
|
-
this.rootDocHandler.synced = true;
|
|
376
|
-
};
|
|
377
|
-
this.indexeddbProvider.on("synced", onIndexedDbSync);
|
|
378
|
-
this.unsubscribers.push(() => {
|
|
379
|
-
_optionalChain([this, 'access', _40 => _40.indexeddbProvider, 'optionalAccess', _41 => _41.off, 'call', _42 => _42("synced", onIndexedDbSync)]);
|
|
380
|
-
});
|
|
374
|
+
this.setupOfflineSupport();
|
|
381
375
|
}
|
|
382
376
|
this.rootDocHandler.on("synced", () => {
|
|
383
377
|
const state = this.rootDocHandler.synced;
|
|
@@ -391,7 +385,20 @@ var LiveblocksYjsProvider = (_class3 = class extends Observable {
|
|
|
391
385
|
this.rootDoc.on("subdocs", this.handleSubdocs);
|
|
392
386
|
this.syncDoc();
|
|
393
387
|
}
|
|
394
|
-
|
|
388
|
+
__init15() {this.setupOfflineSupport = () => {
|
|
389
|
+
this.indexeddbProvider = new (0, _yindexeddb.IndexeddbPersistence)(
|
|
390
|
+
this.room.id,
|
|
391
|
+
this.rootDoc
|
|
392
|
+
);
|
|
393
|
+
const onIndexedDbSync = () => {
|
|
394
|
+
this.rootDocHandler.synced = true;
|
|
395
|
+
};
|
|
396
|
+
this.indexeddbProvider.on("synced", onIndexedDbSync);
|
|
397
|
+
this.unsubscribers.push(() => {
|
|
398
|
+
_optionalChain([this, 'access', _43 => _43.indexeddbProvider, 'optionalAccess', _44 => _44.off, 'call', _45 => _45("synced", onIndexedDbSync)]);
|
|
399
|
+
});
|
|
400
|
+
}}
|
|
401
|
+
__init16() {this.handleSubdocs = ({
|
|
395
402
|
loaded,
|
|
396
403
|
removed,
|
|
397
404
|
added
|
|
@@ -406,18 +413,18 @@ var LiveblocksYjsProvider = (_class3 = class extends Observable {
|
|
|
406
413
|
}
|
|
407
414
|
for (const subdoc of removed) {
|
|
408
415
|
if (this.subdocHandlers.has(subdoc.guid)) {
|
|
409
|
-
_optionalChain([this, 'access',
|
|
416
|
+
_optionalChain([this, 'access', _46 => _46.subdocHandlers, 'access', _47 => _47.get, 'call', _48 => _48(subdoc.guid), 'optionalAccess', _49 => _49.destroy, 'call', _50 => _50()]);
|
|
410
417
|
this.subdocHandlers.delete(subdoc.guid);
|
|
411
418
|
}
|
|
412
419
|
}
|
|
413
420
|
}}
|
|
414
|
-
|
|
421
|
+
__init17() {this.getUniqueUpdateId = (update) => {
|
|
415
422
|
const clock = _nullishCoalesce(Y2.parseUpdateMeta(update).to.get(this.rootDoc.clientID), () => ( "-1"));
|
|
416
423
|
return this.rootDoc.clientID + ":" + clock;
|
|
417
424
|
}}
|
|
418
|
-
|
|
419
|
-
const canWrite = _nullishCoalesce(_optionalChain([this, 'access',
|
|
420
|
-
if (canWrite) {
|
|
425
|
+
__init18() {this.updateDoc = (update, guid) => {
|
|
426
|
+
const canWrite = _nullishCoalesce(_optionalChain([this, 'access', _51 => _51.room, 'access', _52 => _52.getSelf, 'call', _53 => _53(), 'optionalAccess', _54 => _54.canWrite]), () => ( true));
|
|
427
|
+
if (canWrite && !this.isPaused) {
|
|
421
428
|
const updateId = this.getUniqueUpdateId(update);
|
|
422
429
|
this.pending.push(updateId);
|
|
423
430
|
this.room.updateYDoc(
|
|
@@ -428,12 +435,12 @@ var LiveblocksYjsProvider = (_class3 = class extends Observable {
|
|
|
428
435
|
this.emit("status", [this.getStatus()]);
|
|
429
436
|
}
|
|
430
437
|
}}
|
|
431
|
-
|
|
438
|
+
__init19() {this.fetchDoc = (vector, guid) => {
|
|
432
439
|
this.room.fetchYDoc(vector, guid, this.useV2Encoding);
|
|
433
440
|
}}
|
|
434
|
-
|
|
441
|
+
__init20() {this.createSubdocHandler = (subdoc) => {
|
|
435
442
|
if (this.subdocHandlers.has(subdoc.guid)) {
|
|
436
|
-
_optionalChain([this, 'access',
|
|
443
|
+
_optionalChain([this, 'access', _55 => _55.subdocHandlers, 'access', _56 => _56.get, 'call', _57 => _57(subdoc.guid), 'optionalAccess', _58 => _58.syncDoc, 'call', _59 => _59()]);
|
|
437
444
|
return;
|
|
438
445
|
}
|
|
439
446
|
const handler = new yDocHandler({
|
|
@@ -446,7 +453,7 @@ var LiveblocksYjsProvider = (_class3 = class extends Observable {
|
|
|
446
453
|
this.subdocHandlers.set(subdoc.guid, handler);
|
|
447
454
|
}}
|
|
448
455
|
// attempt to load a subdoc of a given guid
|
|
449
|
-
|
|
456
|
+
__init21() {this.loadSubdoc = (guid) => {
|
|
450
457
|
for (const subdoc of this.rootDoc.subdocs) {
|
|
451
458
|
if (subdoc.guid === guid) {
|
|
452
459
|
subdoc.load();
|
|
@@ -455,7 +462,7 @@ var LiveblocksYjsProvider = (_class3 = class extends Observable {
|
|
|
455
462
|
}
|
|
456
463
|
return false;
|
|
457
464
|
}}
|
|
458
|
-
|
|
465
|
+
__init22() {this.syncDoc = () => {
|
|
459
466
|
this.rootDocHandler.syncDoc();
|
|
460
467
|
for (const [_, handler] of this.subdocHandlers) {
|
|
461
468
|
handler.syncDoc();
|
|
@@ -468,6 +475,18 @@ var LiveblocksYjsProvider = (_class3 = class extends Observable {
|
|
|
468
475
|
get synced() {
|
|
469
476
|
return this.rootDocHandler.synced;
|
|
470
477
|
}
|
|
478
|
+
async pause() {
|
|
479
|
+
await _optionalChain([this, 'access', _60 => _60.indexeddbProvider, 'optionalAccess', _61 => _61.destroy, 'call', _62 => _62()]);
|
|
480
|
+
this.indexeddbProvider = null;
|
|
481
|
+
this.isPaused = true;
|
|
482
|
+
}
|
|
483
|
+
unpause() {
|
|
484
|
+
this.isPaused = false;
|
|
485
|
+
if (this.options.offlineSupport_experimental) {
|
|
486
|
+
this.setupOfflineSupport();
|
|
487
|
+
}
|
|
488
|
+
this.rootDocHandler.syncDoc();
|
|
489
|
+
}
|
|
471
490
|
getStatus() {
|
|
472
491
|
if (!this.synced) {
|
|
473
492
|
return "loading";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/liveblocks/liveblocks/packages/liveblocks-yjs/dist/index.js","../src/index.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/version.ts"],"names":["create","applyUpdate","Base64","IndexeddbPersistence"],"mappings":"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","file":"/home/runner/work/liveblocks/liveblocks/packages/liveblocks-yjs/dist/index.js","sourcesContent":[null,"import type {\n BaseUserMeta,\n Json,\n JsonObject,\n LsonObject,\n Room,\n} from \"@liveblocks/client\";\nimport type {\n BaseMetadata,\n DE,\n DM,\n DP,\n DS,\n DU,\n IYjsProvider,\n YjsSyncStatus,\n} from \"@liveblocks/core\";\nimport { ClientMsgCode, detectDupes, kInternal } from \"@liveblocks/core\";\nimport { Base64 } from \"js-base64\";\nimport { Observable } from \"lib0/observable\";\nimport { IndexeddbPersistence } from \"y-indexeddb\";\nimport * as Y from \"yjs\";\n\nimport { Awareness } from \"./awareness\";\nimport yDocHandler from \"./doc\";\nimport { PKG_FORMAT, PKG_NAME, PKG_VERSION } from \"./version\";\n\ndetectDupes(PKG_NAME, PKG_VERSION, PKG_FORMAT);\n\ntype ProviderOptions = {\n autoloadSubdocs?: boolean;\n offlineSupport_experimental?: boolean;\n useV2Encoding_experimental?: boolean;\n};\n\nexport class LiveblocksYjsProvider<\n P extends JsonObject = DP,\n S extends LsonObject = DS,\n U extends BaseUserMeta = DU,\n E extends Json = DE,\n M extends BaseMetadata = DM,\n >\n extends Observable<unknown>\n implements IYjsProvider\n{\n private room: Room<P, S, U, E, M>;\n private rootDoc: Y.Doc;\n private options: ProviderOptions;\n private indexeddbProvider: IndexeddbPersistence | null = null;\n\n private unsubscribers: Array<() => void> = [];\n\n public awareness: Awareness<P, S, U, E, M>;\n\n public rootDocHandler: yDocHandler;\n public subdocHandlers: Map<string, yDocHandler> = new Map();\n\n private pending: string[] = [];\n\n constructor(\n room: Room<P, S, U, E, M>,\n doc: Y.Doc,\n options: ProviderOptions | undefined = {}\n ) {\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 // 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 let foundPendingUpdate = false;\n const updateId = this.getUniqueUpdateId(update);\n this.pending = this.pending.filter((pendingUpdate) => {\n if (pendingUpdate === updateId) {\n foundPendingUpdate = true;\n return false;\n }\n return true;\n });\n // if we found this update in our queue, we don't need to apply it\n if (!foundPendingUpdate) {\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 }\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.indexeddbProvider = new IndexeddbPersistence(room.id, this.rootDoc);\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 // 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 handleSubdocs = ({\n loaded,\n removed,\n added,\n }: {\n loaded: Set<Y.Doc>;\n removed: Set<Y.Doc>;\n added: Set<Y.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 =\n Y.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) {\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: Y.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 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(): Y.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 {\n BaseMetadata,\n BaseUserMeta,\n Json,\n JsonObject,\n LsonObject,\n Room,\n User,\n} from \"@liveblocks/client\";\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<\n P extends JsonObject,\n S extends LsonObject,\n U extends BaseUserMeta,\n E extends Json,\n M extends BaseMetadata,\n> extends Observable<unknown> {\n private room: Room<P, S, U, E, M>;\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: Room<P, S, U, E, M>) {\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 } as unknown as Partial<P>);\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 } as unknown as Partial<P>);\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 } as unknown as Partial<P>);\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","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"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/liveblocks/liveblocks/packages/liveblocks-yjs/dist/index.js","../src/index.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/version.ts"],"names":["create","applyUpdate","Base64","IndexeddbPersistence"],"mappings":"AAAA;ACiBA,wCAAsD;AACtD,qCAAuB;ADfvB;AACA;AEUO,IAAM,OAAA,EAAS,CAAA,EAAA,mBAAM,IAAI,GAAA,CAAI,CAAA;AAgC7B,IAAM,eAAA,EAAiB,CAAC,GAAA,EAAK,GAAA,EAAK,OAAA,EAAA,GAAY;AACnD,EAAA,IAAI,IAAA,EAAM,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA;AACrB,EAAA,GAAA,CAAI,IAAA,IAAQ,KAAA,CAAA,EAAW;AACrB,IAAA,GAAA,CAAI,GAAA,CAAI,GAAA,EAAK,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,EAC9B;AACA,EAAA,OAAO,GAAA;AACT,CAAA;AFvCA;AACA;AGRO,IAAMA,QAAAA,EAAS,CAAA,EAAA,mBAAM,IAAI,GAAA,CAAI,CAAA;AHUpC;AACA;AIkCO,IAAM,KAAA,EAAO,KAAA,CAAM,IAAA;AAgFnB,IAAM,QAAA,EAAU,KAAA,CAAM,OAAA;AJ/G7B;AACA;AK2EO,IAAM,WAAA,EAAN,MAAiB;AAAA,EACtB,WAAA,CAAA,EAAe;AAKb,IAAA,IAAA,CAAK,WAAA,EAAiB,MAAA,CAAO,CAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,EAAA,CAAI,IAAA,EAAM,CAAA,EAAG;AACX,IAAI,cAAA,CAAe,IAAA,CAAK,UAAA,EAAY,IAAA,EAAUA,OAAM,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAA,CAAM,IAAA,EAAM,CAAA,EAAG;AAIb,IAAA,MAAM,GAAA,EAAK,CAAA,GAAI,IAAA,EAAA,GAAS;AACtB,MAAA,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA;AACjB,MAAA,CAAA,CAAE,GAAG,IAAI,CAAA;AAAA,IACX,CAAA;AACA,IAAA,IAAA,CAAK,EAAA,CAAG,IAAA,EAAM,EAAE,CAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,GAAA,CAAK,IAAA,EAAM,CAAA,EAAG;AACZ,IAAA,MAAM,UAAA,EAAY,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,IAAI,CAAA;AAC1C,IAAA,GAAA,CAAI,UAAA,IAAc,KAAA,CAAA,EAAW;AAC3B,MAAA,SAAA,CAAU,MAAA,CAAO,CAAC,CAAA;AAClB,MAAA,GAAA,CAAI,SAAA,CAAU,KAAA,IAAS,CAAA,EAAG;AACxB,QAAA,IAAA,CAAK,UAAA,CAAW,MAAA,CAAO,IAAI,CAAA;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,IAAA,CAAM,IAAA,EAAM,IAAA,EAAM;AAEhB,IAAA,OAAa,IAAA,CAAA,CAAM,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,IAAI,EAAA,GAAS,MAAA,CAAO,CAAA,CAAA,CAAG,MAAA,CAAO,CAAC,CAAA,CAAE,OAAA,CAAQ,CAAA,CAAA,EAAA,GAAK,CAAA,CAAE,GAAG,IAAI,CAAC,CAAA;AAAA,EACjG;AAAA,EAEA,OAAA,CAAA,EAAW;AACT,IAAA,IAAA,CAAK,WAAA,EAAiB,MAAA,CAAO,CAAA;AAAA,EAC/B;AACF,CAAA;ALtFA;AACA;ACtDA,yCAAqC;AACrC,yGAAmB;ADwDnB;AACA;AM9DA,IAAM,eAAA,EAAiB,OAAA;AACvB,IAAM,kBAAA,EAAoB,gBAAA;AAanB,IAAM,UAAA,YAAN,MAAA,QAMG,WAAoB;AAAA,EACpB;AAAA,EACD;AAAA,iBACA,OAAA,kBAA+B,IAAI,GAAA,CAAI,EAAA;AAAA;AAAA,kBAEvC,iBAAA,kBAAwC,IAAI,GAAA,CAAI,EAAA;AAAA;AAAA;AAAA,kBAGhD,KAAA,kBAAqC,IAAI,GAAA,CAAI,EAAA;AAAA;AAAA;AAAA,kBAG7C,eAAA,EAAyB,EAAA;AAAA,EAExB;AAAA,EACR,WAAA,CAAY,GAAA,EAAY,IAAA,EAA2B;AACjD,IAAA,KAAA,CAAM,iJAAA;AACN,IAAA,IAAA,CAAK,IAAA,EAAM,GAAA;AACX,IAAA,IAAA,CAAK,KAAA,EAAO,IAAA;AAEZ,IAAA,IAAA,CAAK,IAAA,CAAK,cAAA,CAAe;AAAA,MACvB,CAAC,iBAAiB,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI;AAAA,IAChC,CAA0B,CAAA;AAC1B,IAAA,IAAA,CAAK,YAAA,EAAc,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,SAAA,CAAU,CAAC,KAAA,EAAA,GAAU;AAC9D,MAAA,IAAI,OAAA;AAKJ,MAAA,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,OAAA,EAAS;AAC1B,QAAA,MAAM,eAAA,EAAiB,IAAA,CAAK,gBAAA,CAAiB,GAAA;AAAA,UAC3C,KAAA,CAAM,IAAA,CAAK;AAAA,QACb,CAAA;AACA,QAAA,GAAA,CAAI,eAAA,IAAmB,KAAA,CAAA,EAAW;AAChC,UAAA,QAAA,EAAU,EAAE,KAAA,EAAO,CAAC,CAAA,EAAG,OAAA,EAAS,CAAC,CAAA,EAAG,OAAA,EAAS,CAAC,cAAc,EAAE,CAAA;AAAA,QAChE;AAEA,QAAA,IAAA,CAAK,uBAAA,CAAwB,KAAA,CAAM,MAAM,CAAA;AAAA,MAC3C;AACA,MAAA,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,QAAA,GAAW,KAAA,CAAM,KAAA,IAAS,QAAA,EAAU;AACrD,QAAA,IAAA,CAAK,uBAAA,CAAwB,KAAA,CAAM,MAAM,CAAA;AACzC,QAAA,MAAM,eAAA,EAAiB,IAAA,CAAK,gBAAA,CAAiB,GAAA;AAAA,UAC3C,KAAA,CAAM,IAAA,CAAK;AAAA,QACb,CAAA;AACA,QAAA,GAAA,CAAI,eAAA,IAAmB,KAAA,CAAA,EAAW;AAChC,UAAA,QAAA,EAAU;AAAA,YACR,KAAA,EAAO,KAAA,CAAM,KAAA,IAAS,QAAA,EAAU,CAAC,cAAc,EAAA,EAAI,CAAC,CAAA;AAAA,YACpD,OAAA,EAAS,KAAA,CAAM,KAAA,IAAS,SAAA,EAAW,CAAC,cAAc,EAAA,EAAI,CAAC,CAAA;AAAA,YACvD,OAAA,EAAS,CAAC;AAAA,UACZ,CAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,OAAA,EAAS;AAC1B,QAAA,IAAA,CAAK,uBAAA,CAAwB,KAAA,CAAM,MAAM,CAAA;AAAA,MAC3C;AACA,MAAA,GAAA,CAAI,QAAA,IAAY,KAAA,CAAA,EAAW;AACzB,QAAA,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,CAAC,OAAA,EAAS,UAAU,CAAC,CAAA;AACzC,QAAA,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,CAAC,OAAA,EAAS,UAAU,CAAC,CAAA;AAAA,MAC3C;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,uBAAA,CACE,MAAA,EACM;AACN,IAAA,IAAA,CAAK,gBAAA,CAAiB,KAAA,CAAM,CAAA;AAC5B,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,IAAA,EAAA,GAAS;AACvB,MAAA,GAAA,CAAI,IAAA,CAAK,QAAA,CAAS,iBAAiB,EAAA,IAAM,KAAA,CAAA,EAAW;AAClD,QAAA,IAAA,CAAK,gBAAA,CAAiB,GAAA;AAAA,UACpB,IAAA,CAAK,YAAA;AAAA,UACL,IAAA,CAAK,QAAA,CAAS,iBAAiB;AAAA,QACjC,CAAA;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,OAAA,CAAA,EAAgB;AACd,IAAA,IAAA,CAAK,IAAA,CAAK,SAAA,EAAW,CAAC,IAAI,CAAC,CAAA;AAC3B,IAAA,IAAA,CAAK,WAAA,CAAY,CAAA;AACjB,IAAA,IAAA,CAAK,aAAA,CAAc,IAAI,CAAA;AACvB,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAA;AAAA,EAChB;AAAA,EAEA,aAAA,CAAA,EAAmC;AACjC,IAAA,MAAM,SAAA,EAAW,IAAA,CAAK,IAAA,CAAK,WAAA,CAAY,CAAA;AACvC,IAAA,GAAA,CACE,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,OAAA,IAAW,EAAA,GACjC,OAAO,QAAA,CAAS,cAAc,EAAA,IAAM,WAAA,EACpC;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,QAAA,CAAS,cAAc,CAAA;AAAA,EAChC;AAAA,EAEA,aAAA,CAAc,KAAA,EAAyC;AACrD,IAAA,MAAM,SAAA,kBAAW,IAAA,qBAAK,IAAA,qBAAK,OAAA,mBAAQ,CAAA,6BAAG,UAAA;AACtC,IAAA,GAAA,CAAI,MAAA,IAAU,IAAA,EAAM;AAClB,MAAA,GAAA,CAAI,SAAA,IAAa,KAAA,CAAA,EAAW;AAE1B,QAAA,MAAA;AAAA,MACF;AACA,MAAA,IAAA,CAAK,IAAA,CAAK,cAAA,CAAe,EAAE,GAAG,QAAA,EAAU,CAAC,cAAc,CAAA,EAAG,KAAK,CAAC,CAAA;AAChE,MAAA,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU;AAAA,QAClB,EAAE,KAAA,EAAO,CAAC,CAAA,EAAG,OAAA,EAAS,CAAC,CAAA,EAAG,OAAA,EAAS,CAAC,IAAA,CAAK,GAAA,CAAI,QAAQ,EAAE,CAAA;AAAA,QACvD;AAAA,MACF,CAAC,CAAA;AACD,MAAA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,kBAAY,QAAA,4BAAA,CAAW,cAAc,GAAA;AAC3C,IAAA,MAAM,MAAA,EAAQ,UAAA,IAAc,KAAA,EAAA,EAAY,CAAC,IAAA,CAAK,GAAA,CAAI,QAAQ,EAAA,EAAI,CAAC,CAAA;AAC/D,IAAA,MAAM,QAAA,EAAU,UAAA,IAAc,KAAA,EAAA,EAAY,CAAC,EAAA,EAAI,CAAC,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA;AACjE,IAAA,IAAA,CAAK,IAAA,CAAK,cAAA,CAAe;AAAA,MACvB,CAAC,cAAc,CAAA,EAAG;AAAA,QAChB,GAAK,UAAA,GAA4B,CAAC,CAAA;AAAA,QAClC,GAAI,MAAA,GAAS,CAAC;AAAA,MAChB;AAAA,IACF,CAA0B,CAAA;AAC1B,IAAA,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,CAAC,EAAE,KAAA,EAAO,OAAA,EAAS,OAAA,EAAS,CAAC,EAAE,CAAA,EAAG,OAAO,CAAC,CAAA;AAAA,EAChE;AAAA,EAEA,kBAAA,CAAmB,KAAA,EAAe,KAAA,EAAgC;AAChE,IAAA,MAAM,SAAA,kBAAW,IAAA,qBAAK,IAAA,qBAAK,OAAA,mBAAQ,CAAA,+BAAG,QAAA,uBAAS,cAAc,GAAA;AAC7D,IAAA,MAAM,OAAA,EAAS,EAAE,CAAC,KAAK,CAAA,EAAG,MAAM,CAAA;AAChC,IAAA,IAAA,CAAK,IAAA,CAAK,cAAA,CAAe;AAAA,MACvB,CAAC,cAAc,CAAA,EAAG,EAAE,GAAK,SAAA,GAA2B,CAAC,CAAA,EAAI,GAAG,OAAO;AAAA,IACrE,CAA0B,CAAA;AAAA,EAC5B;AAAA;AAAA,EAGA,SAAA,CAAA,EAAkC;AAChC,IAAA,MAAM,OAAA,EAAS,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,CAAA;AACnC,IAAA,MAAM,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,CAAC,GAAA,EAA2B,SAAA,EAAA,GAAc;AACrE,MAAA,MAAM,cAAA,EAAgB,SAAA,CAAU,QAAA,CAAS,cAAc,CAAA;AACvD,MAAA,MAAM,cAAA,EAAgB,SAAA,CAAU,QAAA,CAAS,iBAAiB,CAAA;AAG1D,MAAA,GAAA,CAAI,cAAA,IAAkB,KAAA,EAAA,GAAa,cAAA,IAAkB,KAAA,CAAA,EAAW;AAE9D,QAAA,GAAA,CAAI,GAAA,CAAI,aAAA,EAAe,cAAA,GAAiB,CAAC,CAAC,CAAA;AAAA,MAC5C;AACA,MAAA,OAAO,GAAA;AAAA,IACT,CAAA,kBAAG,IAAI,GAAA,CAAqB,CAAC,CAAA;AAG7B,IAAA,MAAM,cAAA,kBAAgB,IAAA,uBAAK,IAAA,uBAAK,OAAA,qBAAQ,CAAA,+BAAG,QAAA,uBAAS,cAAc,GAAA;AAClE,IAAA,GAAA,CAAI,cAAA,IAAkB,KAAA,CAAA,EAAW;AAC/B,MAAA,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,aAAa,CAAA;AAAA,IAC7C;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACF,UAAA;ANqBA;AACA;AOhNA;AAEA;AACA;AAEA,IAAqB,YAAA,aAArB,MAAA,QAAyC,WAAoB;AAAA,kBACnD,cAAA,EAAmC,CAAC,EAAA;AAAA,kBAEpC,QAAA,EAAU,MAAA;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,WAAA,CAAY;AAAA,IACV,GAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,EACF,CAAA,EAMG;AACD,IAAA,KAAA,CAAM,2LAAA;AACN,IAAA,IAAA,CAAK,IAAA,EAAM,GAAA;AACX,IAAA,IAAA,CAAK,cAAA,EAAgB,aAAA;AAErB,IAAA,IAAA,CAAK,GAAA,CAAI,EAAA,CAAG,cAAA,EAAgB,WAAA,EAAa,QAAA,EAAU,IAAA,CAAK,aAAa,CAAA;AACrE,IAAA,IAAA,CAAK,cAAA,EAAgB,CAAC,MAAA,EAAA,GAAuB;AAC3C,MAAA,SAAA,CAAU,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAA,EAAY,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AAAA,IACtD,CAAA;AACA,IAAA,IAAA,CAAK,aAAA,EAAe,CAAC,MAAA,EAAA,GAAmB;AACtC,MAAA,QAAA,CAAS,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAA,EAAY,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA;AAAA,IACrD,CAAA;AAEA,IAAA,IAAA,CAAK,OAAA,CAAQ,CAAA;AAAA,EACf;AAAA,kBAEO,mBAAA,EAAqB,CAAC;AAAA,IAC3B,MAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,EACF,CAAA,EAAA,GAKY;AAEV,IAAA,MAAMC,aAAAA,EAAc,GAAA,EAAO,CAAA,CAAA,cAAA,EAAkB,CAAA,CAAA,WAAA;AAC7C,IAAAA,YAAAA,CAAY,IAAA,CAAK,GAAA,EAAK,MAAA,EAAQ,SAAS,CAAA;AAEvC,IAAA,GAAA,CAAI,WAAA,EAAa;AACf,MAAA,GAAA,CAAI,CAAC,QAAA,EAAU;AAEb,QAAA,IAAI;AAEF,UAAA,MAAM,aAAA,EAAe,IAAA,CAAK,cAAA,EACpB,CAAA,CAAA,sBAAA,EACA,CAAA,CAAA,mBAAA;AACN,UAAA,MAAM,YAAA,EAAc,YAAA;AAAA,YAClB,IAAA,CAAK,GAAA;AAAA,YACL,gBAAA,CAAO,YAAA,CAAa,WAAW;AAAA,UACjC,CAAA;AACA,UAAA,IAAA,CAAK,aAAA,CAAc,WAAW,CAAA;AAAA,QAChC,EAAA,MAAA,CAAS,CAAA,EAAG;AAEV,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA;AAAA,QAChB;AAAA,MACF;AAGA,MAAA,IAAA,CAAK,OAAA,EAAS,IAAA;AAAA,IAChB;AAAA,EACF,EAAA;AAAA,kBAEO,QAAA,EAAU,CAAA,EAAA,GAAY;AAC3B,IAAA,IAAA,CAAK,OAAA,EAAS,KAAA;AAId,IAAA,MAAM,cAAA,EAAgB,gBAAA,CAAO,cAAA,CAAiB,CAAA,CAAA,iBAAA,CAAkB,IAAA,CAAK,GAAG,CAAC,CAAA;AACzE,IAAA,IAAA,CAAK,YAAA,CAAa,aAAa,CAAA;AAAA,EACjC,EAAA;AAAA;AAAA,EAGA,IAAI,MAAA,CAAA,EAAkB;AACpB,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,IAAI,MAAA,CAAO,KAAA,EAAgB;AACzB,IAAA,GAAA,CAAI,IAAA,CAAK,QAAA,IAAY,KAAA,EAAO;AAC1B,MAAA,IAAA,CAAK,QAAA,EAAU,KAAA;AACf,MAAA,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,CAAC,KAAK,CAAC,CAAA;AAC3B,MAAA,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,CAAC,KAAK,CAAC,CAAA;AAAA,IAC3B;AAAA,EACF;AAAA,kBAEQ,cAAA,EAAgB,CACtB,MAAA,EACA,MAAA,EAAA,GACG;AAEH,IAAA,MAAM,YAAA,EAAc,OAAA,WAAkB,gCAAA;AACtC,IAAA,GAAA,CAAI,OAAA,IAAW,UAAA,GAAa,CAAC,WAAA,EAAa;AACxC,MAAA,IAAA,CAAK,aAAA,CAAc,MAAM,CAAA;AAAA,IAC3B;AAAA,EACF,EAAA;AAAA,EAEA,OAAA,CAAA,EAAgB;AACd,IAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,QAAA,EAAU,IAAA,CAAK,aAAa,CAAA;AACzC,IAAA,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,CAAC,KAAA,EAAA,GAAU,KAAA,CAAM,CAAC,CAAA;AAC7C,IAAA,IAAA,CAAK,WAAA,kBAAa,IAAI,GAAA,CAAI,CAAA;AAC1B,IAAA,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,CAAA;AAAA,EACnB;AACF,WAAA;AP2KA;AACA;AQjSO,IAAM,SAAA,EAAW,iBAAA;AACjB,IAAM,YAAA,EAAiD,QAAA;AACvD,IAAM,WAAA,EAAgD,KAAA;ARmS7D;AACA;AC9QA,+BAAA,QAAY,EAAU,WAAA,EAAa,UAAU,CAAA;AAQtC,IAAM,sBAAA,aAAN,MAAA,QAOG,WAEV;AAAA,EACU;AAAA,EACA;AAAA,EACA;AAAA,mBACA,kBAAA,EAAiD,KAAA;AAAA,mBACjD,SAAA,EAAW,MAAA;AAAA,mBAEX,cAAA,EAAmC,CAAC,EAAA;AAAA,EAErC;AAAA,EAEA;AAAA,mBACA,eAAA,kBAA2C,IAAI,GAAA,CAAI,EAAA;AAAA,mBAElD,QAAA,EAAoB,CAAC,EAAA;AAAA,EAE7B,WAAA,CACE,IAAA,EACA,GAAA,EACA,QAAA,EAAuC,CAAC,CAAA,EACxC;AACA,IAAA,KAAA,CAAM,gfAAA;AACN,IAAA,IAAA,CAAK,QAAA,EAAU,GAAA;AACf,IAAA,IAAA,CAAK,KAAA,EAAO,IAAA;AACZ,IAAA,IAAA,CAAK,QAAA,EAAU,OAAA;AACf,IAAA,IAAA,CAAK,eAAA,EAAiB,IAAI,WAAA,CAAY;AAAA,MACpC,GAAA;AAAA,MACA,MAAA,EAAQ,IAAA;AAAA,MACR,SAAA,EAAW,IAAA,CAAK,SAAA;AAAA,MAChB,QAAA,EAAU,IAAA,CAAK,QAAA;AAAA,MACf,aAAA,mBAAe,IAAA,CAAK,OAAA,CAAQ,0BAAA,UAA8B;AAAA,IAC5D,CAAC,CAAA;AAGD,IAAA,IAAA,CAAK,eAAS,CAAA,CAAE,cAAA,CAAe,IAAI,CAAA;AAGnC,IAAA,IAAA,CAAK,UAAA,EAAY,IAAI,SAAA,CAAU,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,IAAI,CAAA;AAEtD,IAAA,IAAA,CAAK,aAAA,CAAc,IAAA;AAAA,MACjB,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,SAAA,CAAU,CAAC,MAAA,EAAA,GAAW;AAC5C,QAAA,GAAA,CAAI,OAAA,IAAW,WAAA,EAAa;AAC1B,UAAA,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,CAAA;AAAA,QAC9B,EAAA,KAAO;AACL,UAAA,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS,KAAA;AAAA,QAC/B;AACA,QAAA,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,CAAC,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,MACxC,CAAC;AAAA,IACH,CAAA;AAEA,IAAA,IAAA,CAAK,aAAA,CAAc,IAAA;AAAA,MACjB,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,CAAC,OAAA,EAAA,GAAY;AAC3C,QAAA,MAAM,EAAE,KAAK,EAAA,EAAI,OAAA;AACjB,QAAA,GAAA,CAAI,KAAA,IAAS,mBAAA,CAAc,WAAA,EAAa;AAEtC,UAAA,MAAA;AAAA,QACF;AACA,QAAA,MAAM,EAAE,WAAA,EAAa,MAAA,EAAQ,SAAA,EAAW,IAAA,EAAM,GAAG,EAAA,EAAI,OAAA;AACrD,QAAA,MAAM,SAAA,mCAAW,IAAA,uBAAK,IAAA,uBAAK,OAAA,qBAAQ,CAAA,+BAAG,UAAA,UAAY,MAAA;AAClD,QAAA,MAAM,OAAA,EAASC,gBAAAA,CAAO,YAAA,CAAa,SAAS,CAAA;AAC5C,QAAA,IAAI,mBAAA,EAAqB,KAAA;AACzB,QAAA,MAAM,SAAA,EAAW,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAA;AAC9C,QAAA,IAAA,CAAK,QAAA,EAAU,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,aAAA,EAAA,GAAkB;AACpD,UAAA,GAAA,CAAI,cAAA,IAAkB,QAAA,EAAU;AAC9B,YAAA,mBAAA,EAAqB,IAAA;AACrB,YAAA,OAAO,KAAA;AAAA,UACT;AACA,UAAA,OAAO,IAAA;AAAA,QACT,CAAC,CAAA;AAED,QAAA,GAAA,CAAI,CAAC,kBAAA,EAAoB;AAEvB,UAAA,GAAA,CAAI,KAAA,IAAS,KAAA,CAAA,EAAW;AACtB,4BAAA,IAAA,uBAAK,cAAA,uBAAe,GAAA,qBAAI,IAAI,CAAA,+BAAG,kBAAA,qBAAmB;AAAA,cAChD,MAAA;AAAA,cACA,WAAA;AAAA,cACA,QAAA,EAAU,CAAC,QAAA;AAAA,cACX;AAAA,YACF,CAAC,GAAA;AAAA,UACH,EAAA,KAAO;AACL,YAAA,IAAA,CAAK,cAAA,CAAe,kBAAA,CAAmB;AAAA,cACrC,MAAA;AAAA,cACA,WAAA;AAAA,cACA,QAAA,EAAU,CAAC,QAAA;AAAA,cACX;AAAA,YACF,CAAC,CAAA;AAAA,UACH;AAAA,QACF;AAGA,QAAA,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,CAAC,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,MACxC,CAAC;AAAA,IACH,CAAA;AAEA,IAAA,GAAA,CAAI,OAAA,CAAQ,2BAAA,EAA6B;AACvC,MAAA,IAAA,CAAK,mBAAA,CAAoB,CAAA;AAAA,IAC3B;AAGA,IAAA,IAAA,CAAK,cAAA,CAAe,EAAA,CAAG,QAAA,EAAU,CAAA,EAAA,GAAM;AACrC,MAAA,MAAM,MAAA,EAAQ,IAAA,CAAK,cAAA,CAAe,MAAA;AAClC,MAAA,IAAA,CAAA,MAAW,CAAC,CAAA,EAAG,OAAO,EAAA,GAAK,IAAA,CAAK,cAAA,EAAgB;AAC9C,QAAA,OAAA,CAAQ,OAAA,CAAQ,CAAA;AAAA,MAClB;AACA,MAAA,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,CAAC,KAAK,CAAC,CAAA;AAC3B,MAAA,IAAA,CAAK,IAAA,CAAK,MAAA,EAAQ,CAAC,KAAK,CAAC,CAAA;AACzB,MAAA,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,CAAC,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,IACxC,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,SAAA,EAAW,IAAA,CAAK,aAAa,CAAA;AAC7C,IAAA,IAAA,CAAK,OAAA,CAAQ,CAAA;AAAA,EACf;AAAA,mBAEQ,oBAAA,EAAsB,CAAA,EAAA,GAAM;AAClC,IAAA,IAAA,CAAK,kBAAA,EAAoB,IAAIC,qCAAAA;AAAA,MAC3B,IAAA,CAAK,IAAA,CAAK,EAAA;AAAA,MACV,IAAA,CAAK;AAAA,IACP,CAAA;AACA,IAAA,MAAM,gBAAA,EAAkB,CAAA,EAAA,GAAM;AAC5B,MAAA,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS,IAAA;AAAA,IAC/B,CAAA;AACA,IAAA,IAAA,CAAK,iBAAA,CAAkB,EAAA,CAAG,QAAA,EAAU,eAAe,CAAA;AAEnD,IAAA,IAAA,CAAK,aAAA,CAAc,IAAA,CAAK,CAAA,EAAA,GAAM;AAC5B,sBAAA,IAAA,uBAAK,iBAAA,+BAAmB,GAAA,qBAAI,QAAA,EAAU,eAAe,GAAA;AAAA,IACvD,CAAC,CAAA;AAAA,EACH,EAAA;AAAA,mBAEQ,cAAA,EAAgB,CAAC;AAAA,IACvB,MAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,EACF,CAAA,EAAA,GAIM;AACJ,IAAA,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,mBAAmB,CAAA;AACvC,IAAA,GAAA,CAAI,IAAA,CAAK,OAAA,CAAQ,eAAA,EAAiB;AAChC,MAAA,IAAA,CAAA,MAAW,OAAA,GAAU,KAAA,EAAO;AAC1B,QAAA,GAAA,CAAI,CAAC,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,EAAG;AACzC,UAAA,MAAA,CAAO,IAAA,CAAK,CAAA;AAAA,QACd;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAA,CAAA,MAAW,OAAA,GAAU,OAAA,EAAS;AAC5B,MAAA,GAAA,CAAI,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,EAAG;AACxC,wBAAA,IAAA,uBAAK,cAAA,uBAAe,GAAA,qBAAI,MAAA,CAAO,IAAI,CAAA,+BAAG,OAAA,qBAAQ,GAAA;AAC9C,QAAA,IAAA,CAAK,cAAA,CAAe,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AAAA,MACxC;AAAA,IACF;AAAA,EACF,EAAA;AAAA,mBAEQ,kBAAA,EAAoB,CAAC,MAAA,EAAA,GAAuB;AAClD,IAAA,MAAM,MAAA,mBACF,EAAA,CAAA,eAAA,CAAgB,MAAM,CAAA,CAAE,EAAA,CAAG,GAAA,CAAI,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,UAAK,MAAA;AAC7D,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,SAAA,EAAW,IAAA,EAAM,KAAA;AAAA,EACvC,EAAA;AAAA,mBAEQ,UAAA,EAAY,CAAC,MAAA,EAAoB,IAAA,EAAA,GAAkB;AACzD,IAAA,MAAM,SAAA,mCAAW,IAAA,uBAAK,IAAA,uBAAK,OAAA,qBAAQ,CAAA,+BAAG,UAAA,UAAY,MAAA;AAClD,IAAA,GAAA,CAAI,SAAA,GAAY,CAAC,IAAA,CAAK,QAAA,EAAU;AAC9B,MAAA,MAAM,SAAA,EAAW,IAAA,CAAK,iBAAA,CAAkB,MAAM,CAAA;AAC9C,MAAA,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,QAAQ,CAAA;AAC1B,MAAA,IAAA,CAAK,IAAA,CAAK,UAAA;AAAA,QACRD,gBAAAA,CAAO,cAAA,CAAe,MAAM,CAAA;AAAA,QAC5B,IAAA;AAAA,QACA,IAAA,CAAK;AAAA,MACP,CAAA;AACA,MAAA,IAAA,CAAK,IAAA,CAAK,QAAA,EAAU,CAAC,IAAA,CAAK,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,IACxC;AAAA,EACF,EAAA;AAAA,mBAEQ,SAAA,EAAW,CAAC,MAAA,EAAgB,IAAA,EAAA,GAAkB;AACpD,IAAA,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,IAAA,CAAK,aAAa,CAAA;AAAA,EACtD,EAAA;AAAA,mBAEQ,oBAAA,EAAsB,CAAC,MAAA,EAAA,GAAwB;AACrD,IAAA,GAAA,CAAI,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,MAAA,CAAO,IAAI,CAAA,EAAG;AAExC,sBAAA,IAAA,uBAAK,cAAA,uBAAe,GAAA,qBAAI,MAAA,CAAO,IAAI,CAAA,+BAAG,OAAA,qBAAQ,GAAA;AAC9C,MAAA,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAA,EAAU,IAAI,WAAA,CAAY;AAAA,MAC9B,GAAA,EAAK,MAAA;AAAA,MACL,MAAA,EAAQ,KAAA;AAAA,MACR,SAAA,EAAW,IAAA,CAAK,SAAA;AAAA,MAChB,QAAA,EAAU,IAAA,CAAK,QAAA;AAAA,MACf,aAAA,mBAAe,IAAA,CAAK,OAAA,CAAQ,0BAAA,UAA8B;AAAA,IAC5D,CAAC,CAAA;AACD,IAAA,IAAA,CAAK,cAAA,CAAe,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,OAAO,CAAA;AAAA,EAC9C,EAAA;AAAA;AAAA,mBAGO,WAAA,EAAa,CAAC,IAAA,EAAA,GAA0B;AAC7C,IAAA,IAAA,CAAA,MAAW,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS;AACzC,MAAA,GAAA,CAAI,MAAA,CAAO,KAAA,IAAS,IAAA,EAAM;AACxB,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA;AACZ,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,OAAO,KAAA;AAAA,EACT,EAAA;AAAA,mBAEQ,QAAA,EAAU,CAAA,EAAA,GAAM;AACtB,IAAA,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,CAAA;AAC5B,IAAA,IAAA,CAAA,MAAW,CAAC,CAAA,EAAG,OAAO,EAAA,GAAK,IAAA,CAAK,cAAA,EAAgB;AAC9C,MAAA,OAAA,CAAQ,OAAA,CAAQ,CAAA;AAAA,IAClB;AAAA,EACF,EAAA;AAAA,EAEA,IAAI,aAAA,CAAA,EAAyB;AAC3B,IAAA,wBAAO,IAAA,CAAK,OAAA,CAAQ,0BAAA,UAA8B,OAAA;AAAA,EACpD;AAAA;AAAA,EAGA,IAAI,MAAA,CAAA,EAAkB;AACpB,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,MAAA;AAAA,EAC7B;AAAA,EAEA,MAAM,KAAA,CAAA,EAAuB;AAC3B,IAAA,sBAAM,IAAA,uBAAK,iBAAA,+BAAmB,OAAA,qBAAQ,GAAA;AACtC,IAAA,IAAA,CAAK,kBAAA,EAAoB,IAAA;AACzB,IAAA,IAAA,CAAK,SAAA,EAAW,IAAA;AAAA,EAClB;AAAA,EAEA,OAAA,CAAA,EAAgB;AACd,IAAA,IAAA,CAAK,SAAA,EAAW,KAAA;AAChB,IAAA,GAAA,CAAI,IAAA,CAAK,OAAA,CAAQ,2BAAA,EAA6B;AAC5C,MAAA,IAAA,CAAK,mBAAA,CAAoB,CAAA;AAAA,IAC3B;AACA,IAAA,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,CAAA;AAAA,EAC9B;AAAA,EAEO,SAAA,CAAA,EAA2B;AAChC,IAAA,GAAA,CAAI,CAAC,IAAA,CAAK,MAAA,EAAQ;AAChB,MAAA,OAAO,SAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,OAAA,IAAW,EAAA,EAAI,eAAA,EAAiB,eAAA;AAAA,EACtD;AAAA,EAEA,OAAA,CAAA,EAAgB;AACd,IAAA,IAAA,CAAK,aAAA,CAAc,OAAA,CAAQ,CAAC,KAAA,EAAA,GAAU,KAAA,CAAM,CAAC,CAAA;AAC7C,IAAA,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,CAAA;AACvB,IAAA,IAAA,CAAK,cAAA,CAAe,OAAA,CAAQ,CAAA;AAC5B,IAAA,IAAA,CAAK,WAAA,kBAAa,IAAI,GAAA,CAAI,CAAA;AAC1B,IAAA,IAAA,CAAA,MAAW,CAAC,CAAA,EAAG,OAAO,EAAA,GAAK,IAAA,CAAK,cAAA,EAAgB;AAC9C,MAAA,OAAA,CAAQ,OAAA,CAAQ,CAAA;AAAA,IAClB;AACA,IAAA,IAAA,CAAK,cAAA,CAAe,KAAA,CAAM,CAAA;AAC1B,IAAA,KAAA,CAAM,OAAA,CAAQ,CAAA;AAAA,EAChB;AAAA,EAEA,MAAM,gBAAA,CAAA,EAAkC;AACtC,IAAA,GAAA,CAAI,CAAC,IAAA,CAAK,iBAAA,EAAmB,MAAA;AAC7B,IAAA,OAAO,IAAA,CAAK,iBAAA,CAAkB,SAAA,CAAU,CAAA;AAAA,EAC1C;AAAA,EAEA,OAAA,CAAA,EAAiB;AACf,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA;AAAA,EAGA,UAAA,CAAA,EAAmB;AAAA,EAEnB;AAAA,EAEA,OAAA,CAAA,EAAgB;AAAA,EAEhB;AACF,WAAA;AD6MA;AACE;AACF,sDAAC","file":"/home/runner/work/liveblocks/liveblocks/packages/liveblocks-yjs/dist/index.js","sourcesContent":[null,"import type {\n BaseUserMeta,\n Json,\n JsonObject,\n LsonObject,\n Room,\n} from \"@liveblocks/client\";\nimport type {\n BaseMetadata,\n DE,\n DM,\n DP,\n DS,\n DU,\n IYjsProvider,\n YjsSyncStatus,\n} from \"@liveblocks/core\";\nimport { ClientMsgCode, detectDupes, kInternal } from \"@liveblocks/core\";\nimport { Base64 } from \"js-base64\";\nimport { Observable } from \"lib0/observable\";\nimport { IndexeddbPersistence } from \"y-indexeddb\";\nimport * as Y from \"yjs\";\n\nimport { Awareness } from \"./awareness\";\nimport yDocHandler from \"./doc\";\nimport { PKG_FORMAT, PKG_NAME, PKG_VERSION } from \"./version\";\n\ndetectDupes(PKG_NAME, PKG_VERSION, PKG_FORMAT);\n\ntype ProviderOptions = {\n autoloadSubdocs?: boolean;\n offlineSupport_experimental?: boolean;\n useV2Encoding_experimental?: boolean;\n};\n\nexport class LiveblocksYjsProvider<\n P extends JsonObject = DP,\n S extends LsonObject = DS,\n U extends BaseUserMeta = DU,\n E extends Json = DE,\n M extends BaseMetadata = DM,\n >\n extends Observable<unknown>\n implements IYjsProvider\n{\n private room: Room<P, S, U, E, M>;\n private rootDoc: Y.Doc;\n private options: ProviderOptions;\n private indexeddbProvider: IndexeddbPersistence | null = null;\n private isPaused = false;\n\n private unsubscribers: Array<() => void> = [];\n\n public awareness: Awareness<P, S, U, E, M>;\n\n public rootDocHandler: yDocHandler;\n public subdocHandlers: Map<string, yDocHandler> = new Map();\n\n private pending: string[] = [];\n\n constructor(\n room: Room<P, S, U, E, M>,\n doc: Y.Doc,\n options: ProviderOptions | undefined = {}\n ) {\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 // 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 let foundPendingUpdate = false;\n const updateId = this.getUniqueUpdateId(update);\n this.pending = this.pending.filter((pendingUpdate) => {\n if (pendingUpdate === updateId) {\n foundPendingUpdate = true;\n return false;\n }\n return true;\n });\n // if we found this update in our queue, we don't need to apply it\n if (!foundPendingUpdate) {\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 }\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<Y.Doc>;\n removed: Set<Y.Doc>;\n added: Set<Y.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 =\n Y.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: Y.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(): Y.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 {\n BaseMetadata,\n BaseUserMeta,\n Json,\n JsonObject,\n LsonObject,\n Room,\n User,\n} from \"@liveblocks/client\";\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<\n P extends JsonObject,\n S extends LsonObject,\n U extends BaseUserMeta,\n E extends Json,\n M extends BaseMetadata,\n> extends Observable<unknown> {\n private room: Room<P, S, U, E, M>;\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: Room<P, S, U, E, M>) {\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 } as unknown as Partial<P>);\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 } as unknown as Partial<P>);\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 } as unknown as Partial<P>);\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","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"]}
|
package/dist/index.mjs
CHANGED
|
@@ -292,7 +292,7 @@ var yDocHandler = class extends Observable {
|
|
|
292
292
|
|
|
293
293
|
// src/version.ts
|
|
294
294
|
var PKG_NAME = "@liveblocks/yjs";
|
|
295
|
-
var PKG_VERSION = "2.17.0
|
|
295
|
+
var PKG_VERSION = "2.17.0";
|
|
296
296
|
var PKG_FORMAT = "esm";
|
|
297
297
|
|
|
298
298
|
// src/index.ts
|
|
@@ -302,6 +302,7 @@ var LiveblocksYjsProvider = class extends Observable {
|
|
|
302
302
|
rootDoc;
|
|
303
303
|
options;
|
|
304
304
|
indexeddbProvider = null;
|
|
305
|
+
isPaused = false;
|
|
305
306
|
unsubscribers = [];
|
|
306
307
|
awareness;
|
|
307
308
|
rootDocHandler;
|
|
@@ -370,14 +371,7 @@ var LiveblocksYjsProvider = class extends Observable {
|
|
|
370
371
|
})
|
|
371
372
|
);
|
|
372
373
|
if (options.offlineSupport_experimental) {
|
|
373
|
-
this.
|
|
374
|
-
const onIndexedDbSync = () => {
|
|
375
|
-
this.rootDocHandler.synced = true;
|
|
376
|
-
};
|
|
377
|
-
this.indexeddbProvider.on("synced", onIndexedDbSync);
|
|
378
|
-
this.unsubscribers.push(() => {
|
|
379
|
-
this.indexeddbProvider?.off("synced", onIndexedDbSync);
|
|
380
|
-
});
|
|
374
|
+
this.setupOfflineSupport();
|
|
381
375
|
}
|
|
382
376
|
this.rootDocHandler.on("synced", () => {
|
|
383
377
|
const state = this.rootDocHandler.synced;
|
|
@@ -391,6 +385,19 @@ var LiveblocksYjsProvider = class extends Observable {
|
|
|
391
385
|
this.rootDoc.on("subdocs", this.handleSubdocs);
|
|
392
386
|
this.syncDoc();
|
|
393
387
|
}
|
|
388
|
+
setupOfflineSupport = () => {
|
|
389
|
+
this.indexeddbProvider = new IndexeddbPersistence2(
|
|
390
|
+
this.room.id,
|
|
391
|
+
this.rootDoc
|
|
392
|
+
);
|
|
393
|
+
const onIndexedDbSync = () => {
|
|
394
|
+
this.rootDocHandler.synced = true;
|
|
395
|
+
};
|
|
396
|
+
this.indexeddbProvider.on("synced", onIndexedDbSync);
|
|
397
|
+
this.unsubscribers.push(() => {
|
|
398
|
+
this.indexeddbProvider?.off("synced", onIndexedDbSync);
|
|
399
|
+
});
|
|
400
|
+
};
|
|
394
401
|
handleSubdocs = ({
|
|
395
402
|
loaded,
|
|
396
403
|
removed,
|
|
@@ -417,7 +424,7 @@ var LiveblocksYjsProvider = class extends Observable {
|
|
|
417
424
|
};
|
|
418
425
|
updateDoc = (update, guid) => {
|
|
419
426
|
const canWrite = this.room.getSelf()?.canWrite ?? true;
|
|
420
|
-
if (canWrite) {
|
|
427
|
+
if (canWrite && !this.isPaused) {
|
|
421
428
|
const updateId = this.getUniqueUpdateId(update);
|
|
422
429
|
this.pending.push(updateId);
|
|
423
430
|
this.room.updateYDoc(
|
|
@@ -468,6 +475,18 @@ var LiveblocksYjsProvider = class extends Observable {
|
|
|
468
475
|
get synced() {
|
|
469
476
|
return this.rootDocHandler.synced;
|
|
470
477
|
}
|
|
478
|
+
async pause() {
|
|
479
|
+
await this.indexeddbProvider?.destroy();
|
|
480
|
+
this.indexeddbProvider = null;
|
|
481
|
+
this.isPaused = true;
|
|
482
|
+
}
|
|
483
|
+
unpause() {
|
|
484
|
+
this.isPaused = false;
|
|
485
|
+
if (this.options.offlineSupport_experimental) {
|
|
486
|
+
this.setupOfflineSupport();
|
|
487
|
+
}
|
|
488
|
+
this.rootDocHandler.syncDoc();
|
|
489
|
+
}
|
|
471
490
|
getStatus() {
|
|
472
491
|
if (!this.synced) {
|
|
473
492
|
return "loading";
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.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/version.ts"],"sourcesContent":["import type {\n BaseUserMeta,\n Json,\n JsonObject,\n LsonObject,\n Room,\n} from \"@liveblocks/client\";\nimport type {\n BaseMetadata,\n DE,\n DM,\n DP,\n DS,\n DU,\n IYjsProvider,\n YjsSyncStatus,\n} from \"@liveblocks/core\";\nimport { ClientMsgCode, detectDupes, kInternal } from \"@liveblocks/core\";\nimport { Base64 } from \"js-base64\";\nimport { Observable } from \"lib0/observable\";\nimport { IndexeddbPersistence } from \"y-indexeddb\";\nimport * as Y from \"yjs\";\n\nimport { Awareness } from \"./awareness\";\nimport yDocHandler from \"./doc\";\nimport { PKG_FORMAT, PKG_NAME, PKG_VERSION } from \"./version\";\n\ndetectDupes(PKG_NAME, PKG_VERSION, PKG_FORMAT);\n\ntype ProviderOptions = {\n autoloadSubdocs?: boolean;\n offlineSupport_experimental?: boolean;\n useV2Encoding_experimental?: boolean;\n};\n\nexport class LiveblocksYjsProvider<\n P extends JsonObject = DP,\n S extends LsonObject = DS,\n U extends BaseUserMeta = DU,\n E extends Json = DE,\n M extends BaseMetadata = DM,\n >\n extends Observable<unknown>\n implements IYjsProvider\n{\n private room: Room<P, S, U, E, M>;\n private rootDoc: Y.Doc;\n private options: ProviderOptions;\n private indexeddbProvider: IndexeddbPersistence | null = null;\n\n private unsubscribers: Array<() => void> = [];\n\n public awareness: Awareness<P, S, U, E, M>;\n\n public rootDocHandler: yDocHandler;\n public subdocHandlers: Map<string, yDocHandler> = new Map();\n\n private pending: string[] = [];\n\n constructor(\n room: Room<P, S, U, E, M>,\n doc: Y.Doc,\n options: ProviderOptions | undefined = {}\n ) {\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 // 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 let foundPendingUpdate = false;\n const updateId = this.getUniqueUpdateId(update);\n this.pending = this.pending.filter((pendingUpdate) => {\n if (pendingUpdate === updateId) {\n foundPendingUpdate = true;\n return false;\n }\n return true;\n });\n // if we found this update in our queue, we don't need to apply it\n if (!foundPendingUpdate) {\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 }\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.indexeddbProvider = new IndexeddbPersistence(room.id, this.rootDoc);\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 // 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 handleSubdocs = ({\n loaded,\n removed,\n added,\n }: {\n loaded: Set<Y.Doc>;\n removed: Set<Y.Doc>;\n added: Set<Y.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 =\n Y.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) {\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: Y.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 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(): Y.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 {\n BaseMetadata,\n BaseUserMeta,\n Json,\n JsonObject,\n LsonObject,\n Room,\n User,\n} from \"@liveblocks/client\";\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<\n P extends JsonObject,\n S extends LsonObject,\n U extends BaseUserMeta,\n E extends Json,\n M extends BaseMetadata,\n> extends Observable<unknown> {\n private room: Room<P, S, U, E, M>;\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: Room<P, S, U, E, M>) {\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 } as unknown as Partial<P>);\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 } as unknown as Partial<P>);\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 } as unknown as Partial<P>);\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","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"],"mappings":"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","names":["Base64","create","create","IndexeddbPersistence","Y","applyUpdate","Base64","IndexeddbPersistence"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.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/version.ts"],"sourcesContent":["import type {\n BaseUserMeta,\n Json,\n JsonObject,\n LsonObject,\n Room,\n} from \"@liveblocks/client\";\nimport type {\n BaseMetadata,\n DE,\n DM,\n DP,\n DS,\n DU,\n IYjsProvider,\n YjsSyncStatus,\n} from \"@liveblocks/core\";\nimport { ClientMsgCode, detectDupes, kInternal } from \"@liveblocks/core\";\nimport { Base64 } from \"js-base64\";\nimport { Observable } from \"lib0/observable\";\nimport { IndexeddbPersistence } from \"y-indexeddb\";\nimport * as Y from \"yjs\";\n\nimport { Awareness } from \"./awareness\";\nimport yDocHandler from \"./doc\";\nimport { PKG_FORMAT, PKG_NAME, PKG_VERSION } from \"./version\";\n\ndetectDupes(PKG_NAME, PKG_VERSION, PKG_FORMAT);\n\ntype ProviderOptions = {\n autoloadSubdocs?: boolean;\n offlineSupport_experimental?: boolean;\n useV2Encoding_experimental?: boolean;\n};\n\nexport class LiveblocksYjsProvider<\n P extends JsonObject = DP,\n S extends LsonObject = DS,\n U extends BaseUserMeta = DU,\n E extends Json = DE,\n M extends BaseMetadata = DM,\n >\n extends Observable<unknown>\n implements IYjsProvider\n{\n private room: Room<P, S, U, E, M>;\n private rootDoc: Y.Doc;\n private options: ProviderOptions;\n private indexeddbProvider: IndexeddbPersistence | null = null;\n private isPaused = false;\n\n private unsubscribers: Array<() => void> = [];\n\n public awareness: Awareness<P, S, U, E, M>;\n\n public rootDocHandler: yDocHandler;\n public subdocHandlers: Map<string, yDocHandler> = new Map();\n\n private pending: string[] = [];\n\n constructor(\n room: Room<P, S, U, E, M>,\n doc: Y.Doc,\n options: ProviderOptions | undefined = {}\n ) {\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 // 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 let foundPendingUpdate = false;\n const updateId = this.getUniqueUpdateId(update);\n this.pending = this.pending.filter((pendingUpdate) => {\n if (pendingUpdate === updateId) {\n foundPendingUpdate = true;\n return false;\n }\n return true;\n });\n // if we found this update in our queue, we don't need to apply it\n if (!foundPendingUpdate) {\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 }\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<Y.Doc>;\n removed: Set<Y.Doc>;\n added: Set<Y.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 =\n Y.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: Y.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(): Y.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 {\n BaseMetadata,\n BaseUserMeta,\n Json,\n JsonObject,\n LsonObject,\n Room,\n User,\n} from \"@liveblocks/client\";\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<\n P extends JsonObject,\n S extends LsonObject,\n U extends BaseUserMeta,\n E extends Json,\n M extends BaseMetadata,\n> extends Observable<unknown> {\n private room: Room<P, S, U, E, M>;\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: Room<P, S, U, E, M>) {\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 } as unknown as Partial<P>);\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 } as unknown as Partial<P>);\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 } as unknown as Partial<P>);\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","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"],"mappings":"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","names":["Base64","create","create","IndexeddbPersistence","Y","applyUpdate","Base64","IndexeddbPersistence"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@liveblocks/yjs",
|
|
3
|
-
"version": "2.17.0
|
|
3
|
+
"version": "2.17.0",
|
|
4
4
|
"description": "An integration with . Liveblocks is the all-in-one toolkit to build collaborative products like Figma, Notion, and more.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "commonjs",
|
|
@@ -33,8 +33,8 @@
|
|
|
33
33
|
"test:watch": "jest --silent --verbose --color=always --watch"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@liveblocks/client": "2.17.0
|
|
37
|
-
"@liveblocks/core": "2.17.0
|
|
36
|
+
"@liveblocks/client": "2.17.0",
|
|
37
|
+
"@liveblocks/core": "2.17.0",
|
|
38
38
|
"js-base64": "^3.7.7",
|
|
39
39
|
"y-indexeddb": "^9.0.12"
|
|
40
40
|
},
|