@stream-io/feeds-client 0.3.24 → 0.3.26

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.
Files changed (35) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/cjs/index.js +2 -1
  3. package/dist/cjs/index.js.map +1 -1
  4. package/dist/cjs/react-bindings.js +1 -1
  5. package/dist/es/index.mjs +3 -2
  6. package/dist/es/react-bindings.mjs +1 -1
  7. package/dist/{feeds-client-DljxtRSI.mjs → feeds-client-BNiazJbH.mjs} +114 -44
  8. package/dist/feeds-client-BNiazJbH.mjs.map +1 -0
  9. package/dist/{feeds-client-CuCL126K.js → feeds-client-K0WzrfH-.js} +114 -44
  10. package/dist/feeds-client-K0WzrfH-.js.map +1 -0
  11. package/dist/types/feed/event-handlers/activity/handle-activity-added.d.ts +3 -1
  12. package/dist/types/feed/event-handlers/activity/handle-activity-added.d.ts.map +1 -1
  13. package/dist/types/feed/feed.d.ts +4 -1
  14. package/dist/types/feed/feed.d.ts.map +1 -1
  15. package/dist/types/feeds-client/feeds-client.d.ts +10 -3
  16. package/dist/types/feeds-client/feeds-client.d.ts.map +1 -1
  17. package/dist/types/feeds-client/get-or-create-active-feed.d.ts +1 -2
  18. package/dist/types/feeds-client/get-or-create-active-feed.d.ts.map +1 -1
  19. package/dist/types/utils/check-own-fields-equality.d.ts +5 -0
  20. package/dist/types/utils/check-own-fields-equality.d.ts.map +1 -0
  21. package/dist/types/utils/index.d.ts +1 -0
  22. package/dist/types/utils/index.d.ts.map +1 -1
  23. package/dist/types/utils/own-feed-fields.d.ts +3 -0
  24. package/dist/types/utils/own-feed-fields.d.ts.map +1 -0
  25. package/package.json +1 -1
  26. package/src/feed/event-handlers/activity/handle-activity-added.ts +3 -1
  27. package/src/feed/feed.ts +49 -16
  28. package/src/feeds-client/feeds-client.ts +69 -30
  29. package/src/feeds-client/get-or-create-active-feed.ts +2 -6
  30. package/src/test-utils/response-generators.ts +2 -1
  31. package/src/utils/check-own-fields-equality.ts +40 -0
  32. package/src/utils/index.ts +1 -0
  33. package/src/utils/own-feed-fields.ts +6 -0
  34. package/dist/feeds-client-CuCL126K.js.map +0 -1
  35. package/dist/feeds-client-DljxtRSI.mjs.map +0 -1
@@ -3936,7 +3936,7 @@ const getRateLimitFromResponseHeader = (response_headers) => {
3936
3936
  };
3937
3937
  return result;
3938
3938
  };
3939
- const version = "0.3.24";
3939
+ const version = "0.3.26";
3940
3940
  const axios = axiosImport.default ?? axiosImport;
3941
3941
  class ApiClient {
3942
3942
  constructor(apiKey, tokenManager, connectionIdManager, options) {
@@ -4798,6 +4798,7 @@ function updateEntityInArray({
4798
4798
  updatedEntities[index] = newEntity;
4799
4799
  return { changed: true, entities: updatedEntities };
4800
4800
  }
4801
+ const ownFeedFields = ["own_capabilities", "own_follows", "own_membership"];
4801
4802
  const updateStateFollowCreated = (follow, currentState, currentFeedId, connectedUserId) => {
4802
4803
  if (follow.status !== "accepted") {
4803
4804
  return { changed: false, data: currentState };
@@ -5504,7 +5505,7 @@ function handleBookmarkUpdated(event) {
5504
5505
  });
5505
5506
  }
5506
5507
  }
5507
- function addActivitiesToState(newActivities, activities, position) {
5508
+ function addActivitiesToState(newActivities, activities, position, { fromWebSocket } = { fromWebSocket: false }) {
5508
5509
  if (activities === void 0) {
5509
5510
  return {
5510
5511
  changed: false,
@@ -5527,7 +5528,7 @@ function addActivitiesToState(newActivities, activities, position) {
5527
5528
  ...activities,
5528
5529
  ...position === "end" ? newActivitiesDeduplicated : []
5529
5530
  ];
5530
- this.newActivitiesAdded(newActivitiesDeduplicated);
5531
+ this.newActivitiesAdded(newActivitiesDeduplicated, { fromWebSocket });
5531
5532
  result = { changed: true, activities: updatedActivities };
5532
5533
  }
5533
5534
  return result;
@@ -5542,7 +5543,8 @@ function handleActivityAdded(event) {
5542
5543
  const result = addActivitiesToState.bind(this)(
5543
5544
  [event.activity],
5544
5545
  currentActivities,
5545
- this.currentState.addNewActivitiesTo
5546
+ this.currentState.addNewActivitiesTo,
5547
+ { fromWebSocket: true }
5546
5548
  );
5547
5549
  if (result.changed) {
5548
5550
  const activity = event.activity;
@@ -6246,8 +6248,8 @@ const deepEqual = (x, y) => {
6246
6248
  return false;
6247
6249
  }
6248
6250
  };
6249
- function getOrCreateActiveFeed(group, id, data, watch) {
6250
- return this.getOrCreateActiveFeed(group, id, data, watch);
6251
+ function getOrCreateActiveFeed(...args) {
6252
+ return this.getOrCreateActiveFeed(...args);
6251
6253
  }
6252
6254
  const _Feed = class _Feed extends FeedApi {
6253
6255
  constructor(client, groupId, id, data, watch = false, addNewActivitiesTo = "start", activityAddedEventFilter) {
@@ -6830,9 +6832,11 @@ const _Feed = class _Feed extends FeedApi {
6830
6832
  event.activity.current_feed = currentActivity.current_feed;
6831
6833
  }
6832
6834
  if (event.activity.feeds.length === 1 && event.activity.current_feed && currentActivity?.current_feed) {
6833
- event.activity.current_feed.own_capabilities = currentActivity.current_feed.own_capabilities;
6834
- event.activity.current_feed.own_follows = currentActivity.current_feed.own_follows;
6835
- event.activity.current_feed.own_membership = currentActivity.current_feed.own_membership;
6835
+ ownFeedFields.forEach((field) => {
6836
+ if (field in currentActivity.current_feed) {
6837
+ event.activity.current_feed[field] = currentActivity.current_feed[field];
6838
+ }
6839
+ });
6836
6840
  }
6837
6841
  }
6838
6842
  eventHandler?.(event);
@@ -6842,17 +6846,31 @@ const _Feed = class _Feed extends FeedApi {
6842
6846
  }
6843
6847
  this.eventDispatcher.dispatch(event);
6844
6848
  }
6845
- newActivitiesAdded(activities) {
6849
+ newActivitiesAdded(activities, options = { fromWebSocket: false }) {
6846
6850
  this.client.hydratePollCache(activities);
6847
- activities.forEach((activity) => {
6848
- if (activity.current_feed) {
6849
- getOrCreateActiveFeed.bind(this.client)(
6850
- activity.current_feed.group_id,
6851
- activity.current_feed.id,
6852
- activity.current_feed
6853
- );
6854
- }
6855
- });
6851
+ this.getOrCreateFeeds(activities, options);
6852
+ }
6853
+ getOrCreateFeeds(activities, options) {
6854
+ const enrichmentOptions = this.currentState.last_get_or_create_request_config?.enrichment_options;
6855
+ if (!enrichmentOptions?.skip_activity_current_feed && !enrichmentOptions?.skip_all) {
6856
+ const feedsToGetOrCreate = /* @__PURE__ */ new Map();
6857
+ activities.forEach((activity) => {
6858
+ if (activity.current_feed && !feedsToGetOrCreate.has(activity.current_feed.feed)) {
6859
+ feedsToGetOrCreate.set(
6860
+ activity.current_feed.feed,
6861
+ activity.current_feed
6862
+ );
6863
+ }
6864
+ });
6865
+ Array.from(feedsToGetOrCreate.values()).forEach((feed) => {
6866
+ getOrCreateActiveFeed.bind(this.client)({
6867
+ group: feed.group_id,
6868
+ id: feed.id,
6869
+ data: feed,
6870
+ fromWebSocket: options.fromWebSocket
6871
+ });
6872
+ });
6873
+ }
6856
6874
  }
6857
6875
  };
6858
6876
  _Feed.noop = () => {
@@ -7142,6 +7160,30 @@ class ActivityWithStateUpdates {
7142
7160
  function getFeed() {
7143
7161
  return this.feed;
7144
7162
  }
7163
+ const isOwnFollowsEqual = (currentState, newState) => {
7164
+ const existingFollows = new Set(
7165
+ currentState.own_follows?.map(
7166
+ (f) => `${f.source_feed.feed}:${f.target_feed.feed}:${f.updated_at.getTime()}`
7167
+ )
7168
+ );
7169
+ const newFollows = new Set(
7170
+ newState.own_follows?.map(
7171
+ (f) => `${f.source_feed.feed}:${f.target_feed.feed}:${f.updated_at.getTime()}`
7172
+ )
7173
+ );
7174
+ if (existingFollows.size === newFollows.size) {
7175
+ const areEqual = Array.from(existingFollows).every(
7176
+ (f) => newFollows.has(f)
7177
+ );
7178
+ if (areEqual) {
7179
+ return true;
7180
+ }
7181
+ }
7182
+ return false;
7183
+ };
7184
+ const isOwnMembershipEqual = (currentState, newState) => {
7185
+ return (currentState.own_membership?.updated_at.getTime() ?? 0) === (newState.own_membership?.updated_at.getTime() ?? 0);
7186
+ };
7145
7187
  class FeedsClient extends FeedsApi {
7146
7188
  constructor(apiKey, options) {
7147
7189
  const tokenManager = new TokenManager();
@@ -7393,13 +7435,11 @@ class FeedsClient extends FeedsApi {
7393
7435
  this.on = this.eventDispatcher.on;
7394
7436
  this.off = this.eventDispatcher.off;
7395
7437
  this.feed = (groupId, id, options2) => {
7396
- return this.getOrCreateActiveFeed(
7397
- groupId,
7438
+ return this.getOrCreateActiveFeed({
7439
+ group: groupId,
7398
7440
  id,
7399
- void 0,
7400
- void 0,
7401
- options2
7402
- );
7441
+ options: options2
7442
+ });
7403
7443
  };
7404
7444
  this.activityWithStateUpdates = (id) => {
7405
7445
  let activity = this.activeActivities[id];
@@ -7416,7 +7456,14 @@ class FeedsClient extends FeedsApi {
7416
7456
  };
7417
7457
  this.eventDispatcher.dispatch(networkEvent);
7418
7458
  };
7419
- this.getOrCreateActiveFeed = (group, id, data, watch, options2) => {
7459
+ this.getOrCreateActiveFeed = ({
7460
+ group,
7461
+ id,
7462
+ data,
7463
+ watch,
7464
+ options: options2,
7465
+ fromWebSocket = false
7466
+ }) => {
7420
7467
  const fid = `${group}:${id}`;
7421
7468
  let isCreated = false;
7422
7469
  if (!this.activeFeeds[fid]) {
@@ -7441,7 +7488,29 @@ class FeedsClient extends FeedsApi {
7441
7488
  }
7442
7489
  }
7443
7490
  if (!feed.currentState.watch) {
7444
- if (data) handleFeedUpdated.call(feed, { feed: data });
7491
+ if (!isCreated && data) {
7492
+ if ((feed.currentState.updated_at?.getTime() ?? 0) < data.updated_at.getTime()) {
7493
+ handleFeedUpdated.call(feed, { feed: data });
7494
+ } else if ((feed.currentState.updated_at?.getTime() ?? 0) === data.updated_at.getTime() && !fromWebSocket) {
7495
+ const fieldsToUpdate = [];
7496
+ if (!isOwnFollowsEqual(feed.currentState, data)) {
7497
+ fieldsToUpdate.push("own_follows");
7498
+ }
7499
+ if (!isOwnMembershipEqual(feed.currentState, data)) {
7500
+ fieldsToUpdate.push("own_membership");
7501
+ }
7502
+ if (fieldsToUpdate.length > 0) {
7503
+ const fieldsToUpdateData = fieldsToUpdate.reduce(
7504
+ (acc, field) => {
7505
+ acc[field] = data[field];
7506
+ return acc;
7507
+ },
7508
+ {}
7509
+ );
7510
+ feed.state.partialNext(fieldsToUpdateData);
7511
+ }
7512
+ }
7513
+ }
7445
7514
  if (watch) handleWatchStarted.call(feed);
7446
7515
  }
7447
7516
  return feed;
@@ -7475,11 +7544,11 @@ class FeedsClient extends FeedsApi {
7475
7544
  }
7476
7545
  case "feeds.feed.created": {
7477
7546
  if (this.activeFeeds[event.feed.id]) break;
7478
- this.getOrCreateActiveFeed(
7479
- event.feed.group_id,
7480
- event.feed.id,
7481
- event.feed
7482
- );
7547
+ this.getOrCreateActiveFeed({
7548
+ group: event.feed.group_id,
7549
+ id: event.feed.id,
7550
+ data: event.feed
7551
+ });
7483
7552
  break;
7484
7553
  }
7485
7554
  case "feeds.feed.deleted": {
@@ -7619,12 +7688,12 @@ class FeedsClient extends FeedsApi {
7619
7688
  const response = await this._queryFeeds(request);
7620
7689
  const feedResponses = response.feeds;
7621
7690
  const feeds = feedResponses.map(
7622
- (feedResponse) => this.getOrCreateActiveFeed(
7623
- feedResponse.group_id,
7624
- feedResponse.id,
7625
- feedResponse,
7626
- request?.watch
7627
- )
7691
+ (feedResponse) => this.getOrCreateActiveFeed({
7692
+ group: feedResponse.group_id,
7693
+ id: feedResponse.id,
7694
+ data: feedResponse,
7695
+ watch: request?.watch
7696
+ })
7628
7697
  );
7629
7698
  this.hydrateCapabilitiesCache(feedResponses);
7630
7699
  return {
@@ -7714,11 +7783,11 @@ class FeedsClient extends FeedsApi {
7714
7783
  async getFollowSuggestions(...params) {
7715
7784
  const response = await super.getFollowSuggestions(...params);
7716
7785
  response.suggestions.forEach((suggestion) => {
7717
- this.getOrCreateActiveFeed(
7718
- suggestion.group_id,
7719
- suggestion.id,
7720
- suggestion
7721
- );
7786
+ this.getOrCreateActiveFeed({
7787
+ group: suggestion.group_id,
7788
+ id: suggestion.id,
7789
+ data: suggestion
7790
+ });
7722
7791
  });
7723
7792
  return response;
7724
7793
  }
@@ -7797,8 +7866,9 @@ exports.isImageFile = isImageFile;
7797
7866
  exports.isReactionResponse = isReactionResponse;
7798
7867
  exports.isVideoFile = isVideoFile;
7799
7868
  exports.isVoteAnswer = isVoteAnswer;
7869
+ exports.ownFeedFields = ownFeedFields;
7800
7870
  exports.replaceUniqueArrayMerge = replaceUniqueArrayMerge;
7801
7871
  exports.shouldUpdateState = shouldUpdateState;
7802
7872
  exports.uniqueArrayMerge = uniqueArrayMerge;
7803
7873
  exports.updateEntityInArray = updateEntityInArray;
7804
- //# sourceMappingURL=feeds-client-CuCL126K.js.map
7874
+ //# sourceMappingURL=feeds-client-K0WzrfH-.js.map