@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
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const require$$0 = require("react");
4
4
  require("@stream-io/state-store");
5
- const feedsClient = require("../feeds-client-CuCL126K.js");
5
+ const feedsClient = require("../feeds-client-K0WzrfH-.js");
6
6
  var shim = { exports: {} };
7
7
  var useSyncExternalStoreShim_production = {};
8
8
  /**
package/dist/es/index.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import { StateStore } from "@stream-io/state-store";
2
2
  export * from "@stream-io/state-store";
3
- import { d as debounce } from "../feeds-client-DljxtRSI.mjs";
4
- import { A, C, a, F, S, b, c, n, m, k, g, e, h, f, j, i, r, s, u, l } from "../feeds-client-DljxtRSI.mjs";
3
+ import { d as debounce } from "../feeds-client-BNiazJbH.mjs";
4
+ import { A, C, a, F, S, b, c, n, m, k, g, e, h, f, j, i, o, r, s, u, l } from "../feeds-client-BNiazJbH.mjs";
5
5
  import { LogLevelEnum } from "@stream-io/logger";
6
6
  const ChannelOwnCapability = {
7
7
  BAN_CHANNEL_MEMBERS: "ban-channel-members",
@@ -461,6 +461,7 @@ export {
461
461
  f as isReactionResponse,
462
462
  j as isVideoFile,
463
463
  i as isVoteAnswer,
464
+ o as ownFeedFields,
464
465
  r as replaceUniqueArrayMerge,
465
466
  s as shouldUpdateState,
466
467
  u as uniqueArrayMerge,
@@ -1,6 +1,6 @@
1
1
  import require$$0, { useCallback, useMemo, useState, useEffect, createContext, useContext, useRef } from "react";
2
2
  import "@stream-io/state-store";
3
- import { F as FeedsClient, g as isCommentResponse, c as checkHasAnotherPage } from "../feeds-client-DljxtRSI.mjs";
3
+ import { F as FeedsClient, g as isCommentResponse, c as checkHasAnotherPage } from "../feeds-client-BNiazJbH.mjs";
4
4
  var shim = { exports: {} };
5
5
  var useSyncExternalStoreShim_production = {};
6
6
  /**
@@ -3918,7 +3918,7 @@ const getRateLimitFromResponseHeader = (response_headers) => {
3918
3918
  };
3919
3919
  return result;
3920
3920
  };
3921
- const version = "0.3.24";
3921
+ const version = "0.3.26";
3922
3922
  const axios = axiosImport.default ?? axiosImport;
3923
3923
  class ApiClient {
3924
3924
  constructor(apiKey, tokenManager, connectionIdManager, options) {
@@ -4780,6 +4780,7 @@ function updateEntityInArray({
4780
4780
  updatedEntities[index] = newEntity;
4781
4781
  return { changed: true, entities: updatedEntities };
4782
4782
  }
4783
+ const ownFeedFields = ["own_capabilities", "own_follows", "own_membership"];
4783
4784
  const updateStateFollowCreated = (follow, currentState, currentFeedId, connectedUserId) => {
4784
4785
  if (follow.status !== "accepted") {
4785
4786
  return { changed: false, data: currentState };
@@ -5486,7 +5487,7 @@ function handleBookmarkUpdated(event) {
5486
5487
  });
5487
5488
  }
5488
5489
  }
5489
- function addActivitiesToState(newActivities, activities, position) {
5490
+ function addActivitiesToState(newActivities, activities, position, { fromWebSocket } = { fromWebSocket: false }) {
5490
5491
  if (activities === void 0) {
5491
5492
  return {
5492
5493
  changed: false,
@@ -5509,7 +5510,7 @@ function addActivitiesToState(newActivities, activities, position) {
5509
5510
  ...activities,
5510
5511
  ...position === "end" ? newActivitiesDeduplicated : []
5511
5512
  ];
5512
- this.newActivitiesAdded(newActivitiesDeduplicated);
5513
+ this.newActivitiesAdded(newActivitiesDeduplicated, { fromWebSocket });
5513
5514
  result = { changed: true, activities: updatedActivities };
5514
5515
  }
5515
5516
  return result;
@@ -5524,7 +5525,8 @@ function handleActivityAdded(event) {
5524
5525
  const result = addActivitiesToState.bind(this)(
5525
5526
  [event.activity],
5526
5527
  currentActivities,
5527
- this.currentState.addNewActivitiesTo
5528
+ this.currentState.addNewActivitiesTo,
5529
+ { fromWebSocket: true }
5528
5530
  );
5529
5531
  if (result.changed) {
5530
5532
  const activity = event.activity;
@@ -6228,8 +6230,8 @@ const deepEqual = (x, y) => {
6228
6230
  return false;
6229
6231
  }
6230
6232
  };
6231
- function getOrCreateActiveFeed(group, id, data, watch) {
6232
- return this.getOrCreateActiveFeed(group, id, data, watch);
6233
+ function getOrCreateActiveFeed(...args) {
6234
+ return this.getOrCreateActiveFeed(...args);
6233
6235
  }
6234
6236
  const _Feed = class _Feed extends FeedApi {
6235
6237
  constructor(client, groupId, id, data, watch = false, addNewActivitiesTo = "start", activityAddedEventFilter) {
@@ -6812,9 +6814,11 @@ const _Feed = class _Feed extends FeedApi {
6812
6814
  event.activity.current_feed = currentActivity.current_feed;
6813
6815
  }
6814
6816
  if (event.activity.feeds.length === 1 && event.activity.current_feed && currentActivity?.current_feed) {
6815
- event.activity.current_feed.own_capabilities = currentActivity.current_feed.own_capabilities;
6816
- event.activity.current_feed.own_follows = currentActivity.current_feed.own_follows;
6817
- event.activity.current_feed.own_membership = currentActivity.current_feed.own_membership;
6817
+ ownFeedFields.forEach((field) => {
6818
+ if (field in currentActivity.current_feed) {
6819
+ event.activity.current_feed[field] = currentActivity.current_feed[field];
6820
+ }
6821
+ });
6818
6822
  }
6819
6823
  }
6820
6824
  eventHandler?.(event);
@@ -6824,17 +6828,31 @@ const _Feed = class _Feed extends FeedApi {
6824
6828
  }
6825
6829
  this.eventDispatcher.dispatch(event);
6826
6830
  }
6827
- newActivitiesAdded(activities) {
6831
+ newActivitiesAdded(activities, options = { fromWebSocket: false }) {
6828
6832
  this.client.hydratePollCache(activities);
6829
- activities.forEach((activity) => {
6830
- if (activity.current_feed) {
6831
- getOrCreateActiveFeed.bind(this.client)(
6832
- activity.current_feed.group_id,
6833
- activity.current_feed.id,
6834
- activity.current_feed
6835
- );
6836
- }
6837
- });
6833
+ this.getOrCreateFeeds(activities, options);
6834
+ }
6835
+ getOrCreateFeeds(activities, options) {
6836
+ const enrichmentOptions = this.currentState.last_get_or_create_request_config?.enrichment_options;
6837
+ if (!enrichmentOptions?.skip_activity_current_feed && !enrichmentOptions?.skip_all) {
6838
+ const feedsToGetOrCreate = /* @__PURE__ */ new Map();
6839
+ activities.forEach((activity) => {
6840
+ if (activity.current_feed && !feedsToGetOrCreate.has(activity.current_feed.feed)) {
6841
+ feedsToGetOrCreate.set(
6842
+ activity.current_feed.feed,
6843
+ activity.current_feed
6844
+ );
6845
+ }
6846
+ });
6847
+ Array.from(feedsToGetOrCreate.values()).forEach((feed) => {
6848
+ getOrCreateActiveFeed.bind(this.client)({
6849
+ group: feed.group_id,
6850
+ id: feed.id,
6851
+ data: feed,
6852
+ fromWebSocket: options.fromWebSocket
6853
+ });
6854
+ });
6855
+ }
6838
6856
  }
6839
6857
  };
6840
6858
  _Feed.noop = () => {
@@ -7124,6 +7142,30 @@ class ActivityWithStateUpdates {
7124
7142
  function getFeed() {
7125
7143
  return this.feed;
7126
7144
  }
7145
+ const isOwnFollowsEqual = (currentState, newState) => {
7146
+ const existingFollows = new Set(
7147
+ currentState.own_follows?.map(
7148
+ (f) => `${f.source_feed.feed}:${f.target_feed.feed}:${f.updated_at.getTime()}`
7149
+ )
7150
+ );
7151
+ const newFollows = new Set(
7152
+ newState.own_follows?.map(
7153
+ (f) => `${f.source_feed.feed}:${f.target_feed.feed}:${f.updated_at.getTime()}`
7154
+ )
7155
+ );
7156
+ if (existingFollows.size === newFollows.size) {
7157
+ const areEqual = Array.from(existingFollows).every(
7158
+ (f) => newFollows.has(f)
7159
+ );
7160
+ if (areEqual) {
7161
+ return true;
7162
+ }
7163
+ }
7164
+ return false;
7165
+ };
7166
+ const isOwnMembershipEqual = (currentState, newState) => {
7167
+ return (currentState.own_membership?.updated_at.getTime() ?? 0) === (newState.own_membership?.updated_at.getTime() ?? 0);
7168
+ };
7127
7169
  class FeedsClient extends FeedsApi {
7128
7170
  constructor(apiKey, options) {
7129
7171
  const tokenManager = new TokenManager();
@@ -7375,13 +7417,11 @@ class FeedsClient extends FeedsApi {
7375
7417
  this.on = this.eventDispatcher.on;
7376
7418
  this.off = this.eventDispatcher.off;
7377
7419
  this.feed = (groupId, id, options2) => {
7378
- return this.getOrCreateActiveFeed(
7379
- groupId,
7420
+ return this.getOrCreateActiveFeed({
7421
+ group: groupId,
7380
7422
  id,
7381
- void 0,
7382
- void 0,
7383
- options2
7384
- );
7423
+ options: options2
7424
+ });
7385
7425
  };
7386
7426
  this.activityWithStateUpdates = (id) => {
7387
7427
  let activity = this.activeActivities[id];
@@ -7398,7 +7438,14 @@ class FeedsClient extends FeedsApi {
7398
7438
  };
7399
7439
  this.eventDispatcher.dispatch(networkEvent);
7400
7440
  };
7401
- this.getOrCreateActiveFeed = (group, id, data, watch, options2) => {
7441
+ this.getOrCreateActiveFeed = ({
7442
+ group,
7443
+ id,
7444
+ data,
7445
+ watch,
7446
+ options: options2,
7447
+ fromWebSocket = false
7448
+ }) => {
7402
7449
  const fid = `${group}:${id}`;
7403
7450
  let isCreated = false;
7404
7451
  if (!this.activeFeeds[fid]) {
@@ -7423,7 +7470,29 @@ class FeedsClient extends FeedsApi {
7423
7470
  }
7424
7471
  }
7425
7472
  if (!feed.currentState.watch) {
7426
- if (data) handleFeedUpdated.call(feed, { feed: data });
7473
+ if (!isCreated && data) {
7474
+ if ((feed.currentState.updated_at?.getTime() ?? 0) < data.updated_at.getTime()) {
7475
+ handleFeedUpdated.call(feed, { feed: data });
7476
+ } else if ((feed.currentState.updated_at?.getTime() ?? 0) === data.updated_at.getTime() && !fromWebSocket) {
7477
+ const fieldsToUpdate = [];
7478
+ if (!isOwnFollowsEqual(feed.currentState, data)) {
7479
+ fieldsToUpdate.push("own_follows");
7480
+ }
7481
+ if (!isOwnMembershipEqual(feed.currentState, data)) {
7482
+ fieldsToUpdate.push("own_membership");
7483
+ }
7484
+ if (fieldsToUpdate.length > 0) {
7485
+ const fieldsToUpdateData = fieldsToUpdate.reduce(
7486
+ (acc, field) => {
7487
+ acc[field] = data[field];
7488
+ return acc;
7489
+ },
7490
+ {}
7491
+ );
7492
+ feed.state.partialNext(fieldsToUpdateData);
7493
+ }
7494
+ }
7495
+ }
7427
7496
  if (watch) handleWatchStarted.call(feed);
7428
7497
  }
7429
7498
  return feed;
@@ -7457,11 +7526,11 @@ class FeedsClient extends FeedsApi {
7457
7526
  }
7458
7527
  case "feeds.feed.created": {
7459
7528
  if (this.activeFeeds[event.feed.id]) break;
7460
- this.getOrCreateActiveFeed(
7461
- event.feed.group_id,
7462
- event.feed.id,
7463
- event.feed
7464
- );
7529
+ this.getOrCreateActiveFeed({
7530
+ group: event.feed.group_id,
7531
+ id: event.feed.id,
7532
+ data: event.feed
7533
+ });
7465
7534
  break;
7466
7535
  }
7467
7536
  case "feeds.feed.deleted": {
@@ -7601,12 +7670,12 @@ class FeedsClient extends FeedsApi {
7601
7670
  const response = await this._queryFeeds(request);
7602
7671
  const feedResponses = response.feeds;
7603
7672
  const feeds = feedResponses.map(
7604
- (feedResponse) => this.getOrCreateActiveFeed(
7605
- feedResponse.group_id,
7606
- feedResponse.id,
7607
- feedResponse,
7608
- request?.watch
7609
- )
7673
+ (feedResponse) => this.getOrCreateActiveFeed({
7674
+ group: feedResponse.group_id,
7675
+ id: feedResponse.id,
7676
+ data: feedResponse,
7677
+ watch: request?.watch
7678
+ })
7610
7679
  );
7611
7680
  this.hydrateCapabilitiesCache(feedResponses);
7612
7681
  return {
@@ -7696,11 +7765,11 @@ class FeedsClient extends FeedsApi {
7696
7765
  async getFollowSuggestions(...params) {
7697
7766
  const response = await super.getFollowSuggestions(...params);
7698
7767
  response.suggestions.forEach((suggestion) => {
7699
- this.getOrCreateActiveFeed(
7700
- suggestion.group_id,
7701
- suggestion.id,
7702
- suggestion
7703
- );
7768
+ this.getOrCreateActiveFeed({
7769
+ group: suggestion.group_id,
7770
+ id: suggestion.id,
7771
+ data: suggestion
7772
+ });
7704
7773
  });
7705
7774
  return response;
7706
7775
  }
@@ -7781,8 +7850,9 @@ export {
7781
7850
  updateEntityInArray as l,
7782
7851
  feedsLoggerSystem as m,
7783
7852
  ensureExhausted as n,
7853
+ ownFeedFields as o,
7784
7854
  replaceUniqueArrayMerge as r,
7785
7855
  shouldUpdateState as s,
7786
7856
  uniqueArrayMerge as u
7787
7857
  };
7788
- //# sourceMappingURL=feeds-client-DljxtRSI.mjs.map
7858
+ //# sourceMappingURL=feeds-client-BNiazJbH.mjs.map