@liveblocks/core 3.15.5 → 3.16.0-feeds1

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.js CHANGED
@@ -6,7 +6,7 @@ var __export = (target, all) => {
6
6
 
7
7
  // src/version.ts
8
8
  var PKG_NAME = "@liveblocks/core";
9
- var PKG_VERSION = "3.15.5";
9
+ var PKG_VERSION = "3.16.0-feeds1";
10
10
  var PKG_FORMAT = "esm";
11
11
 
12
12
  // src/dupe-detection.ts
@@ -3219,10 +3219,26 @@ var ServerMsgCode = Object.freeze({
3219
3219
  COMMENT_REACTION_ADDED: 405,
3220
3220
  COMMENT_REACTION_REMOVED: 406,
3221
3221
  COMMENT_METADATA_UPDATED: 409,
3222
+ // For Feeds
3223
+ FEEDS_LIST: 500,
3224
+ FEEDS_ADDED: 501,
3225
+ FEEDS_UPDATED: 502,
3226
+ FEED_DELETED: 503,
3227
+ FEED_MESSAGES_LIST: 504,
3228
+ FEED_MESSAGES_ADDED: 505,
3229
+ FEED_MESSAGES_UPDATED: 506,
3230
+ FEED_MESSAGES_DELETED: 507,
3231
+ FEED_REQUEST_FAILED: 508,
3222
3232
  // Error codes
3223
3233
  REJECT_STORAGE_OP: 299
3224
3234
  // Sent if a mutation was not allowed on the server (i.e. due to permissions, limit exceeded, etc)
3225
3235
  });
3236
+ var FeedRequestErrorCode = {
3237
+ INTERNAL: "INTERNAL",
3238
+ FEED_ALREADY_EXISTS: "FEED_ALREADY_EXISTS",
3239
+ FEED_NOT_FOUND: "FEED_NOT_FOUND",
3240
+ FEED_MESSAGE_NOT_FOUND: "FEED_MESSAGE_NOT_FOUND"
3241
+ };
3226
3242
 
3227
3243
  // src/types/IWebSocket.ts
3228
3244
  var WebsocketCloseCodes = /* @__PURE__ */ ((WebsocketCloseCodes2) => {
@@ -5186,6 +5202,7 @@ var Permission = /* @__PURE__ */ ((Permission2) => {
5186
5202
  Permission2["PresenceWrite"] = "room:presence:write";
5187
5203
  Permission2["CommentsWrite"] = "comments:write";
5188
5204
  Permission2["CommentsRead"] = "comments:read";
5205
+ Permission2["FeedsWrite"] = "feeds:write";
5189
5206
  return Permission2;
5190
5207
  })(Permission || {});
5191
5208
  function canWriteStorage(scopes) {
@@ -8774,7 +8791,16 @@ var ClientMsgCode = Object.freeze({
8774
8791
  UPDATE_STORAGE: 201,
8775
8792
  // For Yjs support
8776
8793
  FETCH_YDOC: 300,
8777
- UPDATE_YDOC: 301
8794
+ UPDATE_YDOC: 301,
8795
+ // For Feeds
8796
+ FETCH_FEEDS: 510,
8797
+ FETCH_FEED_MESSAGES: 511,
8798
+ ADD_FEED: 512,
8799
+ UPDATE_FEED: 513,
8800
+ DELETE_FEED: 514,
8801
+ ADD_FEED_MESSAGE: 515,
8802
+ UPDATE_FEED_MESSAGE: 516,
8803
+ DELETE_FEED_MESSAGE: 517
8778
8804
  });
8779
8805
 
8780
8806
  // src/refs/ManagedOthers.ts
@@ -9010,12 +9036,15 @@ function defaultMessageFromContext(context) {
9010
9036
  return "Could not update notification settings";
9011
9037
  case "LARGE_MESSAGE_ERROR":
9012
9038
  return "Could not send large message";
9039
+ case "FEED_REQUEST_ERROR":
9040
+ return context.reason ?? "Feed request failed";
9013
9041
  default:
9014
9042
  return assertNever(context, "Unhandled case");
9015
9043
  }
9016
9044
  }
9017
9045
 
9018
9046
  // src/room.ts
9047
+ var FEEDS_TIMEOUT = 5e3;
9019
9048
  function makeIdFactory(connectionId) {
9020
9049
  let count = 0;
9021
9050
  return () => `${connectionId}:${count++}`;
@@ -9250,6 +9279,7 @@ function createRoom(options, config) {
9250
9279
  storageStatus: makeEventSource(),
9251
9280
  ydoc: makeEventSource(),
9252
9281
  comments: makeEventSource(),
9282
+ feeds: makeEventSource(),
9253
9283
  roomWillDestroy: makeEventSource()
9254
9284
  };
9255
9285
  async function createTextMention(mentionId, mention) {
@@ -9670,6 +9700,9 @@ function createRoom(options, config) {
9670
9700
  notify(result.updates);
9671
9701
  sendMessages(messages);
9672
9702
  }
9703
+ function isFeedRequestFailedMsg(msg) {
9704
+ return msg.type === ServerMsgCode.FEED_REQUEST_FAILED;
9705
+ }
9673
9706
  function handleServerMessage(event) {
9674
9707
  if (typeof event.data !== "string") {
9675
9708
  return;
@@ -9783,6 +9816,94 @@ function createRoom(options, config) {
9783
9816
  eventHub.comments.notify(message);
9784
9817
  break;
9785
9818
  }
9819
+ case ServerMsgCode.FEEDS_LIST: {
9820
+ const feedsListMsg = message;
9821
+ const pending = pendingFeedsRequests.get(feedsListMsg.requestId);
9822
+ if (pending) {
9823
+ pending.resolve({
9824
+ feeds: feedsListMsg.feeds,
9825
+ nextCursor: feedsListMsg.nextCursor
9826
+ });
9827
+ pendingFeedsRequests.delete(feedsListMsg.requestId);
9828
+ }
9829
+ eventHub.feeds.notify(feedsListMsg);
9830
+ break;
9831
+ }
9832
+ case ServerMsgCode.FEEDS_ADDED: {
9833
+ const feedsAddedMsg = message;
9834
+ eventHub.feeds.notify(feedsAddedMsg);
9835
+ tryResolvePendingFeedMutationsFromFeedsEvent(feedsAddedMsg);
9836
+ break;
9837
+ }
9838
+ case ServerMsgCode.FEEDS_UPDATED: {
9839
+ const feedsUpdatedMsg = message;
9840
+ eventHub.feeds.notify(feedsUpdatedMsg);
9841
+ tryResolvePendingFeedMutationsFromFeedsEvent(feedsUpdatedMsg);
9842
+ break;
9843
+ }
9844
+ case ServerMsgCode.FEED_DELETED: {
9845
+ eventHub.feeds.notify(message);
9846
+ tryResolvePendingFeedMutationsFromFeedsEvent(message);
9847
+ break;
9848
+ }
9849
+ case ServerMsgCode.FEED_MESSAGES_LIST: {
9850
+ const feedMsgsListMsg = message;
9851
+ const pending = pendingFeedMessagesRequests.get(
9852
+ feedMsgsListMsg.requestId
9853
+ );
9854
+ if (pending) {
9855
+ pending.resolve({
9856
+ messages: feedMsgsListMsg.messages,
9857
+ nextCursor: feedMsgsListMsg.nextCursor
9858
+ });
9859
+ pendingFeedMessagesRequests.delete(feedMsgsListMsg.requestId);
9860
+ }
9861
+ eventHub.feeds.notify(feedMsgsListMsg);
9862
+ break;
9863
+ }
9864
+ case ServerMsgCode.FEED_MESSAGES_ADDED: {
9865
+ const feedMsgsAddedMsg = message;
9866
+ eventHub.feeds.notify(feedMsgsAddedMsg);
9867
+ tryResolvePendingFeedMutationsFromFeedsEvent(feedMsgsAddedMsg);
9868
+ break;
9869
+ }
9870
+ case ServerMsgCode.FEED_MESSAGES_UPDATED: {
9871
+ const feedMsgsUpdatedMsg = message;
9872
+ eventHub.feeds.notify(feedMsgsUpdatedMsg);
9873
+ tryResolvePendingFeedMutationsFromFeedsEvent(feedMsgsUpdatedMsg);
9874
+ break;
9875
+ }
9876
+ case ServerMsgCode.FEED_MESSAGES_DELETED: {
9877
+ eventHub.feeds.notify(message);
9878
+ tryResolvePendingFeedMutationsFromFeedsEvent(message);
9879
+ break;
9880
+ }
9881
+ case ServerMsgCode.FEED_REQUEST_FAILED: {
9882
+ if (!isFeedRequestFailedMsg(message)) {
9883
+ break;
9884
+ }
9885
+ const { requestId, code, reason } = message;
9886
+ const err = new LiveblocksError(reason ?? "Feed request failed", {
9887
+ type: "FEED_REQUEST_ERROR",
9888
+ roomId,
9889
+ requestId,
9890
+ code,
9891
+ reason
9892
+ });
9893
+ if (pendingFeedMutations.has(requestId)) {
9894
+ settleFeedMutation(requestId, "error", err);
9895
+ } else if (pendingFeedsRequests.has(requestId)) {
9896
+ const pending = pendingFeedsRequests.get(requestId);
9897
+ pendingFeedsRequests.delete(requestId);
9898
+ pending?.reject(err);
9899
+ } else if (pendingFeedMessagesRequests.has(requestId)) {
9900
+ const pending = pendingFeedMessagesRequests.get(requestId);
9901
+ pendingFeedMessagesRequests.delete(requestId);
9902
+ pending?.reject(err);
9903
+ }
9904
+ eventHub.feeds.notify(message);
9905
+ break;
9906
+ }
9786
9907
  case ServerMsgCode.STORAGE_STATE_V7:
9787
9908
  // No longer used in V8
9788
9909
  default:
@@ -9886,6 +10007,141 @@ function createRoom(options, config) {
9886
10007
  }
9887
10008
  let _getStorage$ = null;
9888
10009
  let _resolveStoragePromise = null;
10010
+ const pendingFeedsRequests = /* @__PURE__ */ new Map();
10011
+ const pendingFeedMessagesRequests = /* @__PURE__ */ new Map();
10012
+ const pendingFeedMutations = /* @__PURE__ */ new Map();
10013
+ const pendingAddMessageFifoByFeed = /* @__PURE__ */ new Map();
10014
+ function settleFeedMutation(requestId, outcome, error3) {
10015
+ const pending = pendingFeedMutations.get(requestId);
10016
+ if (pending === void 0) {
10017
+ return;
10018
+ }
10019
+ clearTimeout(pending.timeoutId);
10020
+ pendingFeedMutations.delete(requestId);
10021
+ if (pending.kind === "add-message" && !pending.expectedClientMessageId) {
10022
+ const q = pendingAddMessageFifoByFeed.get(pending.feedId);
10023
+ if (q !== void 0) {
10024
+ const idx = q.indexOf(requestId);
10025
+ if (idx >= 0) {
10026
+ q.splice(idx, 1);
10027
+ }
10028
+ if (q.length === 0) {
10029
+ pendingAddMessageFifoByFeed.delete(pending.feedId);
10030
+ }
10031
+ }
10032
+ }
10033
+ if (outcome === "ok") {
10034
+ pending.resolve();
10035
+ } else {
10036
+ pending.reject(error3 ?? new Error("Feed mutation failed"));
10037
+ }
10038
+ }
10039
+ function registerFeedMutation(requestId, kind, feedId, options2) {
10040
+ const { promise, resolve, reject } = Promise_withResolvers();
10041
+ const timeoutId = setTimeout(() => {
10042
+ if (pendingFeedMutations.has(requestId)) {
10043
+ settleFeedMutation(
10044
+ requestId,
10045
+ "error",
10046
+ new Error("Feed mutation timeout")
10047
+ );
10048
+ }
10049
+ }, FEEDS_TIMEOUT);
10050
+ pendingFeedMutations.set(requestId, {
10051
+ resolve,
10052
+ reject,
10053
+ timeoutId,
10054
+ kind,
10055
+ feedId,
10056
+ messageId: options2?.messageId,
10057
+ expectedClientMessageId: options2?.expectedClientMessageId
10058
+ });
10059
+ if (kind === "add-message" && options2?.expectedClientMessageId === void 0) {
10060
+ const q = pendingAddMessageFifoByFeed.get(feedId) ?? [];
10061
+ q.push(requestId);
10062
+ pendingAddMessageFifoByFeed.set(feedId, q);
10063
+ }
10064
+ return promise;
10065
+ }
10066
+ function tryResolvePendingFeedMutationsFromFeedsEvent(message) {
10067
+ switch (message.type) {
10068
+ case ServerMsgCode.FEEDS_ADDED: {
10069
+ for (const feed of message.feeds) {
10070
+ for (const [requestId, pending] of [...pendingFeedMutations]) {
10071
+ if (pending.kind === "add-feed" && pending.feedId === feed.feedId) {
10072
+ settleFeedMutation(requestId, "ok");
10073
+ break;
10074
+ }
10075
+ }
10076
+ }
10077
+ break;
10078
+ }
10079
+ case ServerMsgCode.FEEDS_UPDATED: {
10080
+ for (const feed of message.feeds) {
10081
+ for (const [requestId, pending] of [...pendingFeedMutations]) {
10082
+ if (pending.kind === "update-feed" && pending.feedId === feed.feedId) {
10083
+ settleFeedMutation(requestId, "ok");
10084
+ }
10085
+ }
10086
+ }
10087
+ break;
10088
+ }
10089
+ case ServerMsgCode.FEED_DELETED: {
10090
+ for (const [requestId, pending] of [...pendingFeedMutations]) {
10091
+ if (pending.kind === "delete-feed" && pending.feedId === message.feedId) {
10092
+ settleFeedMutation(requestId, "ok");
10093
+ break;
10094
+ }
10095
+ }
10096
+ break;
10097
+ }
10098
+ case ServerMsgCode.FEED_MESSAGES_ADDED: {
10099
+ for (const m of message.messages) {
10100
+ let matched = false;
10101
+ for (const [requestId, pending] of [...pendingFeedMutations]) {
10102
+ if (pending.kind === "add-message" && pending.feedId === message.feedId && pending.expectedClientMessageId === m.id) {
10103
+ settleFeedMutation(requestId, "ok");
10104
+ matched = true;
10105
+ break;
10106
+ }
10107
+ }
10108
+ if (!matched) {
10109
+ const q = pendingAddMessageFifoByFeed.get(message.feedId);
10110
+ const headId = q?.[0];
10111
+ if (headId !== void 0) {
10112
+ const pending = pendingFeedMutations.get(headId);
10113
+ if (pending?.kind === "add-message" && pending.expectedClientMessageId === void 0) {
10114
+ settleFeedMutation(headId, "ok");
10115
+ }
10116
+ }
10117
+ }
10118
+ }
10119
+ break;
10120
+ }
10121
+ case ServerMsgCode.FEED_MESSAGES_UPDATED: {
10122
+ for (const m of message.messages) {
10123
+ for (const [requestId, pending] of [...pendingFeedMutations]) {
10124
+ if (pending.kind === "update-message" && pending.feedId === message.feedId && pending.messageId === m.id) {
10125
+ settleFeedMutation(requestId, "ok");
10126
+ }
10127
+ }
10128
+ }
10129
+ break;
10130
+ }
10131
+ case ServerMsgCode.FEED_MESSAGES_DELETED: {
10132
+ for (const mid of message.messageIds) {
10133
+ for (const [requestId, pending] of [...pendingFeedMutations]) {
10134
+ if (pending.kind === "delete-message" && pending.feedId === message.feedId && pending.messageId === mid) {
10135
+ settleFeedMutation(requestId, "ok");
10136
+ }
10137
+ }
10138
+ }
10139
+ break;
10140
+ }
10141
+ default:
10142
+ break;
10143
+ }
10144
+ }
9889
10145
  function processInitialStorage(nodes) {
9890
10146
  const unacknowledgedOps = new Map(context.unacknowledgedOps);
9891
10147
  createOrUpdateRootFromMessage(nodes);
@@ -9957,6 +10213,138 @@ function createRoom(options, config) {
9957
10213
  }
9958
10214
  flushNowOrSoon();
9959
10215
  }
10216
+ async function fetchFeeds(options2) {
10217
+ const requestId = nanoid();
10218
+ const { promise, resolve, reject } = Promise_withResolvers();
10219
+ pendingFeedsRequests.set(requestId, { resolve, reject });
10220
+ const message = {
10221
+ type: ClientMsgCode.FETCH_FEEDS,
10222
+ requestId,
10223
+ cursor: options2?.cursor,
10224
+ since: options2?.since,
10225
+ limit: options2?.limit,
10226
+ metadata: options2?.metadata
10227
+ };
10228
+ context.buffer.messages.push(message);
10229
+ flushNowOrSoon();
10230
+ setTimeout(() => {
10231
+ if (pendingFeedsRequests.has(requestId)) {
10232
+ pendingFeedsRequests.delete(requestId);
10233
+ reject(new Error("Feeds fetch timeout"));
10234
+ }
10235
+ }, FEEDS_TIMEOUT);
10236
+ return promise;
10237
+ }
10238
+ async function fetchFeedMessages(feedId, options2) {
10239
+ const requestId = nanoid();
10240
+ const { promise, resolve, reject } = Promise_withResolvers();
10241
+ pendingFeedMessagesRequests.set(requestId, { resolve, reject });
10242
+ const message = {
10243
+ type: ClientMsgCode.FETCH_FEED_MESSAGES,
10244
+ requestId,
10245
+ feedId,
10246
+ cursor: options2?.cursor,
10247
+ since: options2?.since,
10248
+ limit: options2?.limit
10249
+ };
10250
+ context.buffer.messages.push(message);
10251
+ flushNowOrSoon();
10252
+ setTimeout(() => {
10253
+ if (pendingFeedMessagesRequests.has(requestId)) {
10254
+ pendingFeedMessagesRequests.delete(requestId);
10255
+ reject(new Error("Feed messages fetch timeout"));
10256
+ }
10257
+ }, FEEDS_TIMEOUT);
10258
+ return promise;
10259
+ }
10260
+ function addFeed(feedId, options2) {
10261
+ const requestId = nanoid();
10262
+ const promise = registerFeedMutation(requestId, "add-feed", feedId);
10263
+ const message = {
10264
+ type: ClientMsgCode.ADD_FEED,
10265
+ requestId,
10266
+ feedId,
10267
+ metadata: options2?.metadata,
10268
+ createdAt: options2?.createdAt
10269
+ };
10270
+ context.buffer.messages.push(message);
10271
+ flushNowOrSoon();
10272
+ return promise;
10273
+ }
10274
+ function updateFeed(feedId, metadata) {
10275
+ const requestId = nanoid();
10276
+ const promise = registerFeedMutation(requestId, "update-feed", feedId);
10277
+ const message = {
10278
+ type: ClientMsgCode.UPDATE_FEED,
10279
+ requestId,
10280
+ feedId,
10281
+ metadata
10282
+ };
10283
+ context.buffer.messages.push(message);
10284
+ flushNowOrSoon();
10285
+ return promise;
10286
+ }
10287
+ function deleteFeed(feedId) {
10288
+ const requestId = nanoid();
10289
+ const promise = registerFeedMutation(requestId, "delete-feed", feedId);
10290
+ const message = {
10291
+ type: ClientMsgCode.DELETE_FEED,
10292
+ requestId,
10293
+ feedId
10294
+ };
10295
+ context.buffer.messages.push(message);
10296
+ flushNowOrSoon();
10297
+ return promise;
10298
+ }
10299
+ function addFeedMessage(feedId, data, options2) {
10300
+ const requestId = nanoid();
10301
+ const promise = registerFeedMutation(requestId, "add-message", feedId, {
10302
+ expectedClientMessageId: options2?.id
10303
+ });
10304
+ const message = {
10305
+ type: ClientMsgCode.ADD_FEED_MESSAGE,
10306
+ requestId,
10307
+ feedId,
10308
+ data,
10309
+ id: options2?.id,
10310
+ createdAt: options2?.createdAt
10311
+ };
10312
+ context.buffer.messages.push(message);
10313
+ flushNowOrSoon();
10314
+ return promise;
10315
+ }
10316
+ function updateFeedMessage(feedId, messageId, data, options2) {
10317
+ const requestId = nanoid();
10318
+ const promise = registerFeedMutation(requestId, "update-message", feedId, {
10319
+ messageId
10320
+ });
10321
+ const message = {
10322
+ type: ClientMsgCode.UPDATE_FEED_MESSAGE,
10323
+ requestId,
10324
+ feedId,
10325
+ messageId,
10326
+ data,
10327
+ updatedAt: options2?.updatedAt
10328
+ };
10329
+ context.buffer.messages.push(message);
10330
+ flushNowOrSoon();
10331
+ return promise;
10332
+ }
10333
+ function deleteFeedMessage(feedId, messageId) {
10334
+ const requestId = nanoid();
10335
+ const promise = registerFeedMutation(requestId, "delete-message", feedId, {
10336
+ messageId
10337
+ });
10338
+ const message = {
10339
+ type: ClientMsgCode.DELETE_FEED_MESSAGE,
10340
+ requestId,
10341
+ feedId,
10342
+ messageId
10343
+ };
10344
+ context.buffer.messages.push(message);
10345
+ flushNowOrSoon();
10346
+ return promise;
10347
+ }
9960
10348
  function undo() {
9961
10349
  if (context.activeBatch) {
9962
10350
  throw new Error("undo is not allowed during a batch");
@@ -10099,6 +10487,7 @@ function createRoom(options, config) {
10099
10487
  storageStatus: eventHub.storageStatus.observable,
10100
10488
  ydoc: eventHub.ydoc.observable,
10101
10489
  comments: eventHub.comments.observable,
10490
+ feeds: eventHub.feeds.observable,
10102
10491
  roomWillDestroy: eventHub.roomWillDestroy.observable
10103
10492
  };
10104
10493
  async function getThreadsSince(options2) {
@@ -10308,13 +10697,19 @@ function createRoom(options, config) {
10308
10697
  id: roomId,
10309
10698
  subscribe: makeClassicSubscribeFn(
10310
10699
  roomId,
10311
- events,
10700
+ eventHub,
10312
10701
  config.errorEventSource
10313
10702
  ),
10314
10703
  connect: () => managedSocket.connect(),
10315
10704
  reconnect: () => managedSocket.reconnect(),
10316
10705
  disconnect: () => managedSocket.disconnect(),
10317
10706
  destroy: () => {
10707
+ pendingFeedsRequests.forEach(
10708
+ (request) => request.reject(new Error("Room destroyed"))
10709
+ );
10710
+ pendingFeedMessagesRequests.forEach(
10711
+ (request) => request.reject(new Error("Room destroyed"))
10712
+ );
10318
10713
  const { roomWillDestroy, ...eventsExceptDestroy } = eventHub;
10319
10714
  for (const source of Object.values(eventsExceptDestroy)) {
10320
10715
  source.dispose();
@@ -10343,6 +10738,14 @@ function createRoom(options, config) {
10343
10738
  resume: resumeHistory
10344
10739
  },
10345
10740
  fetchYDoc,
10741
+ fetchFeeds,
10742
+ fetchFeedMessages,
10743
+ addFeed,
10744
+ updateFeed,
10745
+ deleteFeed,
10746
+ addFeedMessage,
10747
+ updateFeedMessage,
10748
+ deleteFeedMessage,
10346
10749
  getStorage,
10347
10750
  getStorageSnapshot,
10348
10751
  getStorageStatus,
@@ -11724,6 +12127,7 @@ export {
11724
12127
  DefaultMap,
11725
12128
  Deque,
11726
12129
  DerivedSignal,
12130
+ FeedRequestErrorCode,
11727
12131
  HttpError,
11728
12132
  LiveList,
11729
12133
  LiveMap,