@liveblocks/core 1.0.10 → 1.0.12-yjs1

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.ts CHANGED
@@ -568,8 +568,23 @@ declare type BaseUserMeta = {
568
568
  declare type Callback<T> = (event: T) => void;
569
569
  declare type UnsubscribeCallback = () => void;
570
570
  declare type Observable<T> = {
571
+ /**
572
+ * Register a callback function to be called whenever the event source emits
573
+ * an event.
574
+ */
571
575
  subscribe(callback: Callback<T>): UnsubscribeCallback;
576
+ /**
577
+ * Register a one-time callback function to be called whenever the event
578
+ * source emits an event. After the event fires, the callback is
579
+ * auto-unsubscribed.
580
+ */
572
581
  subscribeOnce(callback: Callback<T>): UnsubscribeCallback;
582
+ /**
583
+ * Returns a promise that will resolve when an event is emitted by this
584
+ * event source. Optionally, specify a predicate that has to match. The first
585
+ * event matching that predicate will then resolve the promise.
586
+ */
587
+ waitUntil(predicate?: (event: T) => boolean): Promise<T>;
573
588
  };
574
589
 
575
590
  interface IWebSocketEvent {
@@ -968,6 +983,17 @@ declare type Room<TPresence extends JsonObject, TStorage extends LsonObject, TUs
968
983
  */
969
984
  addToHistory: boolean;
970
985
  }): void;
986
+ /**
987
+ *
988
+ * Sends YJS document updates to liveblocks server
989
+ *
990
+ * @param {string} data the doc update to send to the server, base64 encoded uint8array
991
+ */
992
+ updateDoc(data: string): void;
993
+ /**
994
+ * Sends a request for the current document from liveblocks server
995
+ */
996
+ getDoc(stateVector?: string): void;
971
997
  /**
972
998
  * Broadcasts an event to other users in the room. Event broadcasted to the room can be listened with {@link Room.subscribe}("event").
973
999
  * @param {any} event the event to broadcast. Should be serializable to JSON
@@ -1022,6 +1048,7 @@ declare type Room<TPresence extends JsonObject, TStorage extends LsonObject, TUs
1022
1048
  */
1023
1049
  readonly storageDidLoad: Observable<void>;
1024
1050
  readonly storageStatus: Observable<StorageStatus>;
1051
+ readonly docUpdated: Observable<string[]>;
1025
1052
  };
1026
1053
  /**
1027
1054
  * Batches modifications made during the given function.
@@ -1359,12 +1386,14 @@ declare enum ClientMsgCode {
1359
1386
  UPDATE_PRESENCE = 100,
1360
1387
  BROADCAST_EVENT = 103,
1361
1388
  FETCH_STORAGE = 200,
1362
- UPDATE_STORAGE = 201
1389
+ UPDATE_STORAGE = 201,
1390
+ FETCH_DOC = 300,
1391
+ UPDATE_DOC = 301
1363
1392
  }
1364
1393
  /**
1365
1394
  * Messages that can be sent from the client to the server.
1366
1395
  */
1367
- declare type ClientMsg<TPresence extends JsonObject, TRoomEvent extends Json> = BroadcastEventClientMsg<TRoomEvent> | UpdatePresenceClientMsg<TPresence> | UpdateStorageClientMsg | FetchStorageClientMsg;
1396
+ declare type ClientMsg<TPresence extends JsonObject, TRoomEvent extends Json> = BroadcastEventClientMsg<TRoomEvent> | UpdatePresenceClientMsg<TPresence> | UpdateStorageClientMsg | FetchStorageClientMsg | FetchDocClientMsg | UpdateDocClientMsg;
1368
1397
  declare type BroadcastEventClientMsg<TRoomEvent extends Json> = {
1369
1398
  type: ClientMsgCode.BROADCAST_EVENT;
1370
1399
  event: TRoomEvent;
@@ -1402,6 +1431,14 @@ declare type UpdateStorageClientMsg = {
1402
1431
  declare type FetchStorageClientMsg = {
1403
1432
  readonly type: ClientMsgCode.FETCH_STORAGE;
1404
1433
  };
1434
+ declare type FetchDocClientMsg = {
1435
+ readonly type: ClientMsgCode.FETCH_DOC;
1436
+ readonly vector?: string;
1437
+ };
1438
+ declare type UpdateDocClientMsg = {
1439
+ readonly type: ClientMsgCode.UPDATE_DOC;
1440
+ readonly data: string;
1441
+ };
1405
1442
 
1406
1443
  declare type IdTuple<T> = [id: string, value: T];
1407
1444
  declare enum CrdtType {
@@ -1451,12 +1488,14 @@ declare enum ServerMsgCode {
1451
1488
  ROOM_STATE = 104,
1452
1489
  INITIAL_STORAGE_STATE = 200,
1453
1490
  UPDATE_STORAGE = 201,
1454
- REJECT_STORAGE_OP = 299
1491
+ REJECT_STORAGE_OP = 299,
1492
+ FETCH_DOC = 300,
1493
+ DOC_UPDATE = 301
1455
1494
  }
1456
1495
  /**
1457
1496
  * Messages that can be sent from the server to the client.
1458
1497
  */
1459
- declare type ServerMsg<TPresence extends JsonObject, TUserMeta extends BaseUserMeta, TRoomEvent extends Json> = UpdatePresenceServerMsg<TPresence> | UserJoinServerMsg<TUserMeta> | UserLeftServerMsg | BroadcastedEventServerMsg<TRoomEvent> | RoomStateServerMsg<TUserMeta> | InitialDocumentStateServerMsg | UpdateStorageServerMsg | RejectedStorageOpServerMsg;
1498
+ declare type ServerMsg<TPresence extends JsonObject, TUserMeta extends BaseUserMeta, TRoomEvent extends Json> = UpdatePresenceServerMsg<TPresence> | UserJoinServerMsg<TUserMeta> | UserLeftServerMsg | BroadcastedEventServerMsg<TRoomEvent> | RoomStateServerMsg<TUserMeta> | InitialDocumentStateServerMsg | UpdateStorageServerMsg | RejectedStorageOpServerMsg | FetchDoc;
1460
1499
  /**
1461
1500
  * Sent by the WebSocket server and broadcasted to all clients to announce that
1462
1501
  * a User updated their presence. For example, when a user moves their cursor.
@@ -1539,6 +1578,10 @@ declare type UserLeftServerMsg = {
1539
1578
  readonly type: ServerMsgCode.USER_LEFT;
1540
1579
  readonly actor: number;
1541
1580
  };
1581
+ declare type FetchDoc = {
1582
+ readonly type: ServerMsgCode.FETCH_DOC;
1583
+ readonly data: string[];
1584
+ };
1542
1585
  /**
1543
1586
  * Sent by the WebSocket server and broadcasted to all clients to announce that
1544
1587
  * a User broadcasted an Event to everyone in the Room.
@@ -1787,4 +1830,4 @@ declare type EnsureJson<T> = [
1787
1830
  [K in keyof T]: EnsureJson<T[K]>;
1788
1831
  };
1789
1832
 
1790
- export { AckOp, AppOnlyAuthToken, AuthToken, BaseUserMeta, BroadcastEventClientMsg, BroadcastOptions, BroadcastedEventServerMsg, Client, ClientMsg, ClientMsgCode, ConnectionStatus, CrdtType, CreateChildOp, CreateListOp, CreateMapOp, CreateObjectOp, CreateOp, CreateRegisterOp, CreateRootObjectOp, DeleteCrdtOp, DeleteObjectKeyOp, DevToolsTreeNode as DevTools, protocol as DevToolsMsg, EnsureJson, FetchStorageClientMsg, History, IWebSocket, IWebSocketCloseEvent, IWebSocketEvent, IWebSocketInstance, IWebSocketMessageEvent, IdTuple, Immutable, InitialDocumentStateServerMsg, Json, JsonArray, JsonObject, JsonScalar, LiveList, LiveListUpdate, LiveMap, LiveMapUpdate, LiveNode, LiveObject, LiveObjectUpdate, LiveStructure, Lson, LsonObject, NodeMap, Op, OpCode, Others, ParentToChildNodeMap, PlainLson, PlainLsonFields, PlainLsonList, PlainLsonMap, PlainLsonObject, RejectedStorageOpServerMsg, Resolve, Room, RoomAuthToken, RoomInitializers, RoomStateServerMsg, SerializedChild, SerializedCrdt, SerializedList, SerializedMap, SerializedObject, SerializedRegister, SerializedRootObject, ServerMsg, ServerMsgCode, SetParentKeyOp, StorageStatus, StorageUpdate, ToImmutable, ToJson, UpdateObjectOp, UpdatePresenceClientMsg, UpdatePresenceServerMsg, UpdateStorageClientMsg, UpdateStorageServerMsg, User, UserJoinServerMsg, UserLeftServerMsg, WebsocketCloseCodes, asArrayWithLegacyMethods, asPos, assert, assertNever, b64decode, createClient, deprecate, deprecateIf, errorIf, freeze, isAppOnlyAuthToken, isAuthToken, isChildCrdt, isJsonArray, isJsonObject, isJsonScalar, isPlainObject, isRoomAuthToken, isRootCrdt, legacy_patchImmutableObject, lsonToJson, makePosition, nn, patchLiveObjectKey, shallow, throwUsageError, toPlainLson, tryParseJson };
1833
+ export { AckOp, AppOnlyAuthToken, AuthToken, BaseUserMeta, BroadcastEventClientMsg, BroadcastOptions, BroadcastedEventServerMsg, Client, ClientMsg, ClientMsgCode, ConnectionStatus, CrdtType, CreateChildOp, CreateListOp, CreateMapOp, CreateObjectOp, CreateOp, CreateRegisterOp, CreateRootObjectOp, DeleteCrdtOp, DeleteObjectKeyOp, DevToolsTreeNode as DevTools, protocol as DevToolsMsg, EnsureJson, FetchDocClientMsg, FetchStorageClientMsg, History, IWebSocket, IWebSocketCloseEvent, IWebSocketEvent, IWebSocketInstance, IWebSocketMessageEvent, IdTuple, Immutable, InitialDocumentStateServerMsg, Json, JsonArray, JsonObject, JsonScalar, LiveList, LiveListUpdate, LiveMap, LiveMapUpdate, LiveNode, LiveObject, LiveObjectUpdate, LiveStructure, Lson, LsonObject, NodeMap, Op, OpCode, Others, ParentToChildNodeMap, PlainLson, PlainLsonFields, PlainLsonList, PlainLsonMap, PlainLsonObject, RejectedStorageOpServerMsg, Resolve, Room, RoomAuthToken, RoomInitializers, RoomStateServerMsg, SerializedChild, SerializedCrdt, SerializedList, SerializedMap, SerializedObject, SerializedRegister, SerializedRootObject, ServerMsg, ServerMsgCode, SetParentKeyOp, StorageStatus, StorageUpdate, ToImmutable, ToJson, UpdateDocClientMsg, UpdateObjectOp, UpdatePresenceClientMsg, UpdatePresenceServerMsg, UpdateStorageClientMsg, UpdateStorageServerMsg, User, UserJoinServerMsg, UserLeftServerMsg, WebsocketCloseCodes, asArrayWithLegacyMethods, asPos, assert, assertNever, b64decode, createClient, deprecate, deprecateIf, errorIf, freeze, isAppOnlyAuthToken, isAuthToken, isChildCrdt, isJsonArray, isJsonObject, isJsonScalar, isPlainObject, isRoomAuthToken, isRootCrdt, legacy_patchImmutableObject, lsonToJson, makePosition, nn, patchLiveObjectKey, shallow, throwUsageError, toPlainLson, tryParseJson };
package/dist/index.js CHANGED
@@ -54,6 +54,19 @@ var __async = (__this, __arguments, generator) => {
54
54
  function makeEventSource() {
55
55
  const _onetimeObservers = /* @__PURE__ */ new Set();
56
56
  const _observers = /* @__PURE__ */ new Set();
57
+ let _buffer = null;
58
+ function pause() {
59
+ _buffer = [];
60
+ }
61
+ function unpause() {
62
+ if (_buffer === null) {
63
+ return;
64
+ }
65
+ for (const event of _buffer) {
66
+ notify(event);
67
+ }
68
+ _buffer = null;
69
+ }
57
70
  function subscribe(callback) {
58
71
  _observers.add(callback);
59
72
  return () => _observers.delete(callback);
@@ -62,6 +75,25 @@ function makeEventSource() {
62
75
  _onetimeObservers.add(callback);
63
76
  return () => _onetimeObservers.delete(callback);
64
77
  }
78
+ function waitUntil(predicate) {
79
+ return __async(this, null, function* () {
80
+ let unsub;
81
+ return new Promise((res) => {
82
+ unsub = subscribe((event) => {
83
+ if (predicate === void 0 || predicate(event)) {
84
+ res(event);
85
+ }
86
+ });
87
+ }).finally(() => unsub == null ? void 0 : unsub());
88
+ });
89
+ }
90
+ function notifyOrBuffer(event) {
91
+ if (_buffer !== null) {
92
+ _buffer.push(event);
93
+ } else {
94
+ notify(event);
95
+ }
96
+ }
65
97
  function notify(event) {
66
98
  _onetimeObservers.forEach((callback) => callback(event));
67
99
  _onetimeObservers.clear();
@@ -71,16 +103,24 @@ function makeEventSource() {
71
103
  _onetimeObservers.clear();
72
104
  _observers.clear();
73
105
  }
106
+ function count() {
107
+ return _onetimeObservers.size + _observers.size;
108
+ }
74
109
  return {
75
110
  // Private/internal control over event emission
76
- notify,
111
+ notify: notifyOrBuffer,
77
112
  subscribe,
78
113
  subscribeOnce,
79
114
  clear,
115
+ count,
116
+ waitUntil,
117
+ pause,
118
+ unpause,
80
119
  // Publicly exposable subscription API
81
120
  observable: {
82
121
  subscribe,
83
- subscribeOnce
122
+ subscribeOnce,
123
+ waitUntil
84
124
  }
85
125
  };
86
126
  }
@@ -117,7 +157,7 @@ var onMessageFromPanel = eventSource.observable;
117
157
  // src/devtools/index.ts
118
158
  var VERSION = true ? (
119
159
  /* istanbul ignore next */
120
- "1.0.10"
160
+ "1.0.12-yjs1"
121
161
  ) : "dev";
122
162
  var _devtoolsSetupHasRun = false;
123
163
  function setupDevTools(getAllRooms) {
@@ -2399,7 +2439,6 @@ var LiveObject = class extends AbstractCrdt {
2399
2439
  id,
2400
2440
  data: {}
2401
2441
  };
2402
- reverse.push(reverseUpdate);
2403
2442
  for (const key in op.data) {
2404
2443
  const oldValue = this._map.get(key);
2405
2444
  if (isLiveNode(oldValue)) {
@@ -3008,6 +3047,8 @@ var ClientMsgCode = /* @__PURE__ */ ((ClientMsgCode2) => {
3008
3047
  ClientMsgCode2[ClientMsgCode2["BROADCAST_EVENT"] = 103] = "BROADCAST_EVENT";
3009
3048
  ClientMsgCode2[ClientMsgCode2["FETCH_STORAGE"] = 200] = "FETCH_STORAGE";
3010
3049
  ClientMsgCode2[ClientMsgCode2["UPDATE_STORAGE"] = 201] = "UPDATE_STORAGE";
3050
+ ClientMsgCode2[ClientMsgCode2["FETCH_DOC"] = 300] = "FETCH_DOC";
3051
+ ClientMsgCode2[ClientMsgCode2["UPDATE_DOC"] = 301] = "UPDATE_DOC";
3011
3052
  return ClientMsgCode2;
3012
3053
  })(ClientMsgCode || {});
3013
3054
 
@@ -3021,6 +3062,8 @@ var ServerMsgCode = /* @__PURE__ */ ((ServerMsgCode2) => {
3021
3062
  ServerMsgCode2[ServerMsgCode2["INITIAL_STORAGE_STATE"] = 200] = "INITIAL_STORAGE_STATE";
3022
3063
  ServerMsgCode2[ServerMsgCode2["UPDATE_STORAGE"] = 201] = "UPDATE_STORAGE";
3023
3064
  ServerMsgCode2[ServerMsgCode2["REJECT_STORAGE_OP"] = 299] = "REJECT_STORAGE_OP";
3065
+ ServerMsgCode2[ServerMsgCode2["FETCH_DOC"] = 300] = "FETCH_DOC";
3066
+ ServerMsgCode2[ServerMsgCode2["DOC_UPDATE"] = 301] = "DOC_UPDATE";
3024
3067
  return ServerMsgCode2;
3025
3068
  })(ServerMsgCode || {});
3026
3069
 
@@ -3381,7 +3424,8 @@ function createRoom(options, config) {
3381
3424
  storage: makeEventSource(),
3382
3425
  history: makeEventSource(),
3383
3426
  storageDidLoad: makeEventSource(),
3384
- storageStatus: makeEventSource()
3427
+ storageStatus: makeEventSource(),
3428
+ docUpdated: makeEventSource()
3385
3429
  };
3386
3430
  const effects = config.mockedEffects || {
3387
3431
  authenticateAndConnect(auth, createWebSocket) {
@@ -3901,6 +3945,10 @@ function createRoom(options, config) {
3901
3945
  }
3902
3946
  break;
3903
3947
  }
3948
+ case 300 /* FETCH_DOC */: {
3949
+ eventHub.docUpdated.notify(message.data);
3950
+ break;
3951
+ }
3904
3952
  case 104 /* ROOM_STATE */: {
3905
3953
  updates.others.push(onRoomStateMessage(message));
3906
3954
  break;
@@ -4154,6 +4202,13 @@ ${Array.from(traces).join("\n\n")}`
4154
4202
  }
4155
4203
  return messages;
4156
4204
  }
4205
+ function updateDoc(data) {
4206
+ context.buffer.messages.push({
4207
+ type: 301 /* UPDATE_DOC */,
4208
+ data
4209
+ });
4210
+ tryFlushing();
4211
+ }
4157
4212
  function broadcastEvent(event, options2 = {
4158
4213
  shouldQueueEventIfNotReady: false
4159
4214
  }) {
@@ -4205,6 +4260,10 @@ ${Array.from(traces).join("\n\n")}`
4205
4260
  };
4206
4261
  });
4207
4262
  }
4263
+ function getDoc(vector = "") {
4264
+ context.buffer.messages.push({ type: 300 /* FETCH_DOC */, vector });
4265
+ tryFlushing();
4266
+ }
4208
4267
  function undo() {
4209
4268
  if (context.activeBatch) {
4210
4269
  throw new Error("undo is not allowed during a batch");
@@ -4329,7 +4388,8 @@ ${Array.from(traces).join("\n\n")}`
4329
4388
  storage: eventHub.storage.observable,
4330
4389
  history: eventHub.history.observable,
4331
4390
  storageDidLoad: eventHub.storageDidLoad.observable,
4332
- storageStatus: eventHub.storageStatus.observable
4391
+ storageStatus: eventHub.storageStatus.observable,
4392
+ docUpdated: eventHub.docUpdated.observable
4333
4393
  };
4334
4394
  function transition(event) {
4335
4395
  switch (event.type) {
@@ -4400,6 +4460,7 @@ ${Array.from(traces).join("\n\n")}`
4400
4460
  reconnect,
4401
4461
  // Presence
4402
4462
  updatePresence,
4463
+ updateDoc,
4403
4464
  broadcastEvent,
4404
4465
  // Storage
4405
4466
  batch,
@@ -4411,6 +4472,7 @@ ${Array.from(traces).join("\n\n")}`
4411
4472
  pause: pauseHistory,
4412
4473
  resume: resumeHistory
4413
4474
  },
4475
+ getDoc,
4414
4476
  getStorage,
4415
4477
  getStorageSnapshot,
4416
4478
  getStorageStatus,
@@ -4525,7 +4587,7 @@ function prepareCreateWebSocket(liveblocksServer, WebSocketPolyfill) {
4525
4587
  // @ts-ignore (__PACKAGE_VERSION__ will be injected by the build script)
4526
4588
  true ? (
4527
4589
  /* istanbul ignore next */
4528
- "1.0.10"
4590
+ "1.0.12-yjs1"
4529
4591
  ) : "dev"}`
4530
4592
  );
4531
4593
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@liveblocks/core",
3
- "version": "1.0.10",
3
+ "version": "1.0.12-yjs1",
4
4
  "description": "Shared code and foundational internals for Liveblocks",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",