@stream-io/feeds-client 0.3.38 → 0.3.39
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/CHANGELOG.md +12 -0
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/react-bindings.js +20 -4
- package/dist/cjs/react-bindings.js.map +1 -1
- package/dist/es/index.mjs +2 -2
- package/dist/es/index.mjs.map +1 -1
- package/dist/es/react-bindings.mjs +20 -4
- package/dist/es/react-bindings.mjs.map +1 -1
- package/dist/{feeds-client-eEru7Ibh.js → feeds-client-CT1eKizN.js} +44 -11
- package/dist/feeds-client-CT1eKizN.js.map +1 -0
- package/dist/{feeds-client-B5rMw7wy.mjs → feeds-client-DnryJ-rf.mjs} +44 -11
- package/dist/feeds-client-DnryJ-rf.mjs.map +1 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/dist/types/bindings/react/contexts/StreamActivityWithStateUpdatesContext.d.ts +13 -0
- package/dist/types/bindings/react/contexts/StreamActivityWithStateUpdatesContext.d.ts.map +1 -0
- package/dist/types/bindings/react/hooks/feed-state-hooks/useActivityComments.d.ts +1 -1
- package/dist/types/bindings/react/hooks/feed-state-hooks/useActivityComments.d.ts.map +1 -1
- package/dist/types/bindings/react/index.d.ts +2 -0
- package/dist/types/bindings/react/index.d.ts.map +1 -1
- package/dist/types/bindings/react/wrappers/StreamActivityWithStateUpdates.d.ts +13 -0
- package/dist/types/bindings/react/wrappers/StreamActivityWithStateUpdates.d.ts.map +1 -0
- package/dist/types/common/real-time/StableWSConnection.d.ts +3 -3
- package/dist/types/common/real-time/StableWSConnection.d.ts.map +1 -1
- package/dist/types/feed/feed.d.ts +3 -3
- package/dist/types/feed/feed.d.ts.map +1 -1
- package/dist/types/feeds-client/feeds-client.d.ts +6 -17
- package/dist/types/feeds-client/feeds-client.d.ts.map +1 -1
- package/dist/types/gen/feeds/FeedsApi.d.ts +4 -1
- package/dist/types/gen/feeds/FeedsApi.d.ts.map +1 -1
- package/dist/types/gen/model-decoders/event-decoder-mapping.d.ts.map +1 -1
- package/dist/types/gen/models/index.d.ts +20 -0
- package/dist/types/gen/models/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/bindings/react/contexts/StreamActivityWithStateUpdatesContext.tsx +19 -0
- package/src/bindings/react/hooks/feed-state-hooks/useActivityComments.ts +6 -3
- package/src/bindings/react/hooks/useCreateFeedsClient.ts +1 -1
- package/src/bindings/react/index.ts +2 -0
- package/src/bindings/react/wrappers/StreamActivityWithStateUpdates.tsx +24 -0
- package/src/feed/feed.ts +9 -1
- package/src/feeds-client/feeds-client.ts +13 -19
- package/src/gen/feeds/FeedsApi.ts +26 -0
- package/src/gen/model-decoders/decoders.ts +18 -0
- package/src/gen/model-decoders/event-decoder-mapping.ts +3 -0
- package/src/gen/models/index.ts +28 -0
- package/dist/feeds-client-B5rMw7wy.mjs.map +0 -1
- package/dist/feeds-client-eEru7Ibh.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"feeds-client-eEru7Ibh.js","sources":["../src/gen/model-decoders/decoders.ts","../src/gen/feeds/FeedsApi.ts","../src/utils/logger.ts","../src/common/utils.ts","../src/common/TokenManager.ts","../src/common/ConnectionIdManager.ts","../src/common/EventDispatcher.ts","../src/common/real-time/StableWSConnection.ts","../src/common/types.ts","../src/common/rate-limit.ts","../src/common/ApiClient.ts","../src/gen/model-decoders/event-decoder-mapping.ts","../src/gen/moderation/ModerationApi.ts","../src/moderation-client.ts","../src/common/Poll.ts","../src/gen/feeds/FeedApi.ts","../src/utils/check-has-another-page.ts","../src/utils/unique-array-merge.ts","../src/utils/constants.ts","../src/utils/type-assertions.ts","../src/utils/ensure-exhausted.ts","../src/utils/state-update-queue.ts","../src/utils/update-entity-in-array.ts","../src/feed/event-handlers/follow/handle-follow-created.ts","../src/feed/event-handlers/follow/handle-follow-deleted.ts","../src/feed/event-handlers/follow/handle-follow-updated.ts","../src/utils/event-triggered-by-connected-user.ts","../src/feed/event-handlers/comment/handle-comment-added.ts","../src/feed/event-handlers/comment/handle-comment-deleted.ts","../src/feed/event-handlers/comment/handle-comment-updated.ts","../src/feed/event-handlers/comment/handle-comment-reaction-added.ts","../src/feed/event-handlers/comment/handle-comment-reaction-deleted.ts","../src/feed/event-handlers/comment/handle-comment-reaction-updated.ts","../src/feed/event-handlers/feed-member/handle-feed-member-added.ts","../src/feed/event-handlers/feed-member/handle-feed-member-updated.ts","../src/feed/event-handlers/feed-member/handle-feed-member-removed.ts","../src/feed/event-handlers/bookmark/handle-bookmark-added.ts","../src/feed/event-handlers/bookmark/handle-bookmark-deleted.ts","../src/feed/event-handlers/bookmark/handle-bookmark-updated.ts","../src/feed/event-handlers/activity/handle-activity-added.ts","../src/feed/event-handlers/activity/handle-activity-deleted.ts","../src/feed/event-handlers/activity/handle-activity-removed-from-feed.ts","../src/feed/event-handlers/activity-updater.ts","../src/feed/event-handlers/activity/handle-activity-updated.ts","../src/feed/event-handlers/activity/handle-activity-reaction-added.ts","../src/feed/event-handlers/activity/handle-activity-reaction-deleted.ts","../src/feed/event-handlers/activity/handle-activity-reaction-updated.ts","../src/feed/event-handlers/activity/handle-activity-marked.ts","../src/feed/event-handlers/feed/handle-feed-updated.ts","../src/feed/event-handlers/add-aggregated-activities-to-state.ts","../src/feed/event-handlers/notification-feed/handle-notification-feed-updated.ts","../src/feed/event-handlers/story-feeds/handle-story-feeds-updated.ts","../src/feed/event-handlers/watch/handle-watch-started.ts","../src/feed/event-handlers/watch/handle-watch-stopped.ts","../src/feed/event-handlers/is-activity-pin.ts","../src/feed/event-handlers/activity/handle-activity-feedback.ts","../src/utils/deep-equal.ts","../src/feeds-client/get-or-create-active-feed.ts","../src/utils/throttling/throttle.ts","../src/utils/throttling/throttled-get-batched-own-fields.ts","../src/feed/feed.ts","../src/feeds-client/event-handlers/user/handle-user-updated.ts","../src/common/real-time/event-models.ts","../src/feed/event-handlers/comment/utils/update-comment-count.ts","../src/feeds-client/active-activity.ts","../src/activity-with-state-updates/activity-with-state-updates.ts","../src/activity-with-state-updates/get-feed.ts","../src/utils/check-own-fields-equality.ts","../src/feeds-client/feeds-client.ts"],"sourcesContent":["type Decoder = (i: any) => any;\n\ntype TypeMapping = Record<string, { type: string; isSingle: boolean }>;\n\nexport const decoders: Record<string, Decoder> = {};\n\nconst decodeDatetimeType = (input: number | string) =>\n typeof input === 'number'\n ? new Date(Math.floor(input / 1000000))\n : new Date(input);\n\ndecoders.DatetimeType = decodeDatetimeType;\n\nconst decode = (typeMappings: TypeMapping, input?: Record<string, any>) => {\n if (!input || Object.keys(typeMappings).length === 0) return input;\n\n Object.keys(typeMappings).forEach((key) => {\n if (input[key] != null) {\n if (typeMappings[key]) {\n const decoder = decoders[typeMappings[key].type];\n if (decoder) {\n if (typeMappings[key].isSingle) {\n input[key] = decoder(input[key]);\n } else {\n Object.keys(input[key]).forEach((k) => {\n input[key][k] = decoder(input[key][k]);\n });\n }\n }\n }\n }\n });\n\n return input;\n};\n\ndecoders.AcceptFeedMemberInviteResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n member: { type: 'FeedMemberResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.AcceptFollowResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n follow: { type: 'FollowResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.ActionLogResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n review_queue_item: { type: 'ReviewQueueItemResponse', isSingle: true },\n\n target_user: { type: 'UserResponse', isSingle: true },\n\n user: { type: 'UserResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.ActivityAddedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n activity: { type: 'ActivityResponse', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.ActivityDeletedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n activity: { type: 'ActivityResponse', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.ActivityFeedbackEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.ActivityMarkEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.ActivityPinResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n activity: { type: 'ActivityResponse', isSingle: true },\n\n user: { type: 'UserResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.ActivityPinnedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n pinned_activity: { type: 'PinActivityResponse', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.ActivityReactionAddedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n activity: { type: 'ActivityResponse', isSingle: true },\n\n reaction: { type: 'FeedsReactionResponse', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.ActivityReactionDeletedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n activity: { type: 'ActivityResponse', isSingle: true },\n\n reaction: { type: 'FeedsReactionResponse', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.ActivityReactionUpdatedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n activity: { type: 'ActivityResponse', isSingle: true },\n\n reaction: { type: 'FeedsReactionResponse', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.ActivityRemovedFromFeedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n activity: { type: 'ActivityResponse', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.ActivityResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n comments: { type: 'CommentResponse', isSingle: false },\n\n latest_reactions: { type: 'FeedsReactionResponse', isSingle: false },\n\n mentioned_users: { type: 'UserResponse', isSingle: false },\n\n own_bookmarks: { type: 'BookmarkResponse', isSingle: false },\n\n own_reactions: { type: 'FeedsReactionResponse', isSingle: false },\n\n collections: { type: 'EnrichedCollectionResponse', isSingle: false },\n\n reaction_groups: { type: 'ReactionGroupResponse', isSingle: false },\n\n user: { type: 'UserResponse', isSingle: true },\n\n deleted_at: { type: 'DatetimeType', isSingle: true },\n\n edited_at: { type: 'DatetimeType', isSingle: true },\n\n expires_at: { type: 'DatetimeType', isSingle: true },\n\n current_feed: { type: 'FeedResponse', isSingle: true },\n\n parent: { type: 'ActivityResponse', isSingle: true },\n\n poll: { type: 'PollResponseData', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.ActivityUnpinnedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n pinned_activity: { type: 'PinActivityResponse', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.ActivityUpdatedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n activity: { type: 'ActivityResponse', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.AddActivityResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n activity: { type: 'ActivityResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.AddBookmarkResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n bookmark: { type: 'BookmarkResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.AddCommentReactionResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n comment: { type: 'CommentResponse', isSingle: true },\n\n reaction: { type: 'FeedsReactionResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.AddCommentResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n comment: { type: 'CommentResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.AddCommentsBatchResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n comments: { type: 'CommentResponse', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.AddReactionResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n activity: { type: 'ActivityResponse', isSingle: true },\n\n reaction: { type: 'FeedsReactionResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.AggregatedActivityResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n activities: { type: 'ActivityResponse', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.AppUpdatedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.AppealItemResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n user: { type: 'UserResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.Ban = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n expires: { type: 'DatetimeType', isSingle: true },\n\n channel: { type: 'Channel', isSingle: true },\n\n created_by: { type: 'User', isSingle: true },\n\n target: { type: 'User', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.BlockListResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.BlockUsersResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.BlockedUserResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n blocked_user: { type: 'UserResponse', isSingle: true },\n\n user: { type: 'UserResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.BookmarkAddedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n bookmark: { type: 'BookmarkResponse', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.BookmarkDeletedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n bookmark: { type: 'BookmarkResponse', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.BookmarkFolderDeletedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n bookmark_folder: { type: 'BookmarkFolderResponse', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.BookmarkFolderResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n user: { type: 'UserResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.BookmarkFolderUpdatedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n bookmark_folder: { type: 'BookmarkFolderResponse', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.BookmarkResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n activity: { type: 'ActivityResponse', isSingle: true },\n\n user: { type: 'UserResponse', isSingle: true },\n\n folder: { type: 'BookmarkFolderResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.BookmarkUpdatedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n bookmark: { type: 'BookmarkResponse', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.CallParticipantResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n joined_at: { type: 'DatetimeType', isSingle: true },\n\n user: { type: 'UserResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.CallResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n created_by: { type: 'UserResponse', isSingle: true },\n\n ended_at: { type: 'DatetimeType', isSingle: true },\n\n starts_at: { type: 'DatetimeType', isSingle: true },\n\n session: { type: 'CallSessionResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.CallSessionResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n participants: { type: 'CallParticipantResponse', isSingle: false },\n\n accepted_by: { type: 'DatetimeType', isSingle: false },\n\n missed_by: { type: 'DatetimeType', isSingle: false },\n\n rejected_by: { type: 'DatetimeType', isSingle: false },\n\n ended_at: { type: 'DatetimeType', isSingle: true },\n\n live_ended_at: { type: 'DatetimeType', isSingle: true },\n\n live_started_at: { type: 'DatetimeType', isSingle: true },\n\n started_at: { type: 'DatetimeType', isSingle: true },\n\n timer_ends_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.Channel = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n deleted_at: { type: 'DatetimeType', isSingle: true },\n\n last_message_at: { type: 'DatetimeType', isSingle: true },\n\n message_count_updated_at: { type: 'DatetimeType', isSingle: true },\n\n active_live_locations: { type: 'SharedLocation', isSingle: false },\n\n invites: { type: 'ChannelMember', isSingle: false },\n\n members: { type: 'ChannelMember', isSingle: false },\n\n config: { type: 'ChannelConfig', isSingle: true },\n\n created_by: { type: 'User', isSingle: true },\n\n members_lookup: { type: 'ChannelMemberLookup', isSingle: false },\n\n truncated_by: { type: 'User', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.ChannelConfig = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.ChannelConfigWithInfo = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n commands: { type: 'Command', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.ChannelMember = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n archived_at: { type: 'DatetimeType', isSingle: true },\n\n ban_expires: { type: 'DatetimeType', isSingle: true },\n\n deleted_at: { type: 'DatetimeType', isSingle: true },\n\n invite_accepted_at: { type: 'DatetimeType', isSingle: true },\n\n invite_rejected_at: { type: 'DatetimeType', isSingle: true },\n\n pinned_at: { type: 'DatetimeType', isSingle: true },\n\n user: { type: 'User', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.ChannelMemberLookup = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n archived_at: { type: 'DatetimeType', isSingle: true },\n\n ban_expires: { type: 'DatetimeType', isSingle: true },\n\n pinned_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.ChannelMemberResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n archived_at: { type: 'DatetimeType', isSingle: true },\n\n ban_expires: { type: 'DatetimeType', isSingle: true },\n\n deleted_at: { type: 'DatetimeType', isSingle: true },\n\n invite_accepted_at: { type: 'DatetimeType', isSingle: true },\n\n invite_rejected_at: { type: 'DatetimeType', isSingle: true },\n\n pinned_at: { type: 'DatetimeType', isSingle: true },\n\n user: { type: 'UserResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.ChannelMute = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n expires: { type: 'DatetimeType', isSingle: true },\n\n channel: { type: 'ChannelResponse', isSingle: true },\n\n user: { type: 'UserResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.ChannelResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n deleted_at: { type: 'DatetimeType', isSingle: true },\n\n hide_messages_before: { type: 'DatetimeType', isSingle: true },\n\n last_message_at: { type: 'DatetimeType', isSingle: true },\n\n mute_expires_at: { type: 'DatetimeType', isSingle: true },\n\n truncated_at: { type: 'DatetimeType', isSingle: true },\n\n members: { type: 'ChannelMemberResponse', isSingle: false },\n\n config: { type: 'ChannelConfigWithInfo', isSingle: true },\n\n created_by: { type: 'UserResponse', isSingle: true },\n\n truncated_by: { type: 'UserResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.CollectionResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.Command = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.CommentAddedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n activity: { type: 'ActivityResponse', isSingle: true },\n\n comment: { type: 'CommentResponse', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.CommentDeletedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n comment: { type: 'CommentResponse', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.CommentReactionAddedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n activity: { type: 'ActivityResponse', isSingle: true },\n\n comment: { type: 'CommentResponse', isSingle: true },\n\n reaction: { type: 'FeedsReactionResponse', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.CommentReactionDeletedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n comment: { type: 'CommentResponse', isSingle: true },\n\n reaction: { type: 'FeedsReactionResponse', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.CommentReactionUpdatedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n activity: { type: 'ActivityResponse', isSingle: true },\n\n comment: { type: 'CommentResponse', isSingle: true },\n\n reaction: { type: 'FeedsReactionResponse', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.CommentResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n mentioned_users: { type: 'UserResponse', isSingle: false },\n\n own_reactions: { type: 'FeedsReactionResponse', isSingle: false },\n\n user: { type: 'UserResponse', isSingle: true },\n\n deleted_at: { type: 'DatetimeType', isSingle: true },\n\n edited_at: { type: 'DatetimeType', isSingle: true },\n\n latest_reactions: { type: 'FeedsReactionResponse', isSingle: false },\n\n reaction_groups: { type: 'ReactionGroupResponse', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.CommentUpdatedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n comment: { type: 'CommentResponse', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.ConfigResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.CreateBlockListResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n blocklist: { type: 'BlockListResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.CreateCollectionsResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n collections: { type: 'CollectionResponse', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.CreateFeedsBatchResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n feeds: { type: 'FeedResponse', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.CreateGuestResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n user: { type: 'UserResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.DeleteActivityReactionResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n activity: { type: 'ActivityResponse', isSingle: true },\n\n reaction: { type: 'FeedsReactionResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.DeleteBookmarkResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n bookmark: { type: 'BookmarkResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.DeleteCommentReactionResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n comment: { type: 'CommentResponse', isSingle: true },\n\n reaction: { type: 'FeedsReactionResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.DeleteCommentResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n activity: { type: 'ActivityResponse', isSingle: true },\n\n comment: { type: 'CommentResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.Device = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.DeviceResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.DraftPayloadResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n mentioned_users: { type: 'UserResponse', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.DraftResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n message: { type: 'DraftPayloadResponse', isSingle: true },\n\n channel: { type: 'ChannelResponse', isSingle: true },\n\n parent_message: { type: 'MessageResponse', isSingle: true },\n\n quoted_message: { type: 'MessageResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.EgressRTMPResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n started_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.EnrichedCollectionResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.EntityCreatorResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n deactivated_at: { type: 'DatetimeType', isSingle: true },\n\n deleted_at: { type: 'DatetimeType', isSingle: true },\n\n last_active: { type: 'DatetimeType', isSingle: true },\n\n revoke_tokens_issued_before: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.FeedCreatedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n members: { type: 'FeedMemberResponse', isSingle: false },\n\n feed: { type: 'FeedResponse', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.FeedDeletedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.FeedGroupChangedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.FeedGroupDeletedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.FeedMemberAddedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n member: { type: 'FeedMemberResponse', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.FeedMemberRemovedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.FeedMemberResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n user: { type: 'UserResponse', isSingle: true },\n\n invite_accepted_at: { type: 'DatetimeType', isSingle: true },\n\n invite_rejected_at: { type: 'DatetimeType', isSingle: true },\n\n membership_level: { type: 'MembershipLevelResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.FeedMemberUpdatedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n member: { type: 'FeedMemberResponse', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.FeedOwnData = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n own_followings: { type: 'FollowResponse', isSingle: false },\n\n own_follows: { type: 'FollowResponse', isSingle: false },\n\n own_membership: { type: 'FeedMemberResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.FeedResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n created_by: { type: 'UserResponse', isSingle: true },\n\n deleted_at: { type: 'DatetimeType', isSingle: true },\n\n own_followings: { type: 'FollowResponse', isSingle: false },\n\n own_follows: { type: 'FollowResponse', isSingle: false },\n\n own_membership: { type: 'FeedMemberResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.FeedSuggestionResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n created_by: { type: 'UserResponse', isSingle: true },\n\n deleted_at: { type: 'DatetimeType', isSingle: true },\n\n own_followings: { type: 'FollowResponse', isSingle: false },\n\n own_follows: { type: 'FollowResponse', isSingle: false },\n\n own_membership: { type: 'FeedMemberResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.FeedUpdatedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n feed: { type: 'FeedResponse', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.FeedsReactionResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n user: { type: 'UserResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.FollowBatchResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created: { type: 'FollowResponse', isSingle: false },\n\n follows: { type: 'FollowResponse', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.FollowCreatedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n follow: { type: 'FollowResponse', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.FollowDeletedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n follow: { type: 'FollowResponse', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.FollowResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n source_feed: { type: 'FeedResponse', isSingle: true },\n\n target_feed: { type: 'FeedResponse', isSingle: true },\n\n request_accepted_at: { type: 'DatetimeType', isSingle: true },\n\n request_rejected_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.FollowUpdatedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n follow: { type: 'FollowResponse', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.FullUserResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n channel_mutes: { type: 'ChannelMute', isSingle: false },\n\n devices: { type: 'DeviceResponse', isSingle: false },\n\n mutes: { type: 'UserMuteResponse', isSingle: false },\n\n ban_expires: { type: 'DatetimeType', isSingle: true },\n\n deactivated_at: { type: 'DatetimeType', isSingle: true },\n\n deleted_at: { type: 'DatetimeType', isSingle: true },\n\n last_active: { type: 'DatetimeType', isSingle: true },\n\n revoke_tokens_issued_before: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.GetActivityResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n activity: { type: 'ActivityResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.GetAppealResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n item: { type: 'AppealItemResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.GetBlockedUsersResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n blocks: { type: 'BlockedUserResponse', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.GetCommentRepliesResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n comments: { type: 'ThreadedCommentResponse', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.GetCommentResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n comment: { type: 'CommentResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.GetCommentsResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n comments: { type: 'ThreadedCommentResponse', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.GetConfigResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n config: { type: 'ConfigResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.GetFollowSuggestionsResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n suggestions: { type: 'FeedSuggestionResponse', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.GetOrCreateFeedResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n activities: { type: 'ActivityResponse', isSingle: false },\n\n aggregated_activities: {\n type: 'AggregatedActivityResponse',\n isSingle: false,\n },\n\n followers: { type: 'FollowResponse', isSingle: false },\n\n following: { type: 'FollowResponse', isSingle: false },\n\n members: { type: 'FeedMemberResponse', isSingle: false },\n\n pinned_activities: { type: 'ActivityPinResponse', isSingle: false },\n\n feed: { type: 'FeedResponse', isSingle: true },\n\n notification_status: { type: 'NotificationStatusResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.HealthCheckEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.ListBlockListResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n blocklists: { type: 'BlockListResponse', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.ListDevicesResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n devices: { type: 'DeviceResponse', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.MembershipLevelResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.Message = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n latest_reactions: { type: 'Reaction', isSingle: false },\n\n mentioned_users: { type: 'User', isSingle: false },\n\n own_reactions: { type: 'Reaction', isSingle: false },\n\n reaction_groups: { type: 'ReactionGroupResponse', isSingle: false },\n\n deleted_at: { type: 'DatetimeType', isSingle: true },\n\n message_text_updated_at: { type: 'DatetimeType', isSingle: true },\n\n pin_expires: { type: 'DatetimeType', isSingle: true },\n\n pinned_at: { type: 'DatetimeType', isSingle: true },\n\n thread_participants: { type: 'User', isSingle: false },\n\n member: { type: 'ChannelMember', isSingle: true },\n\n pinned_by: { type: 'User', isSingle: true },\n\n poll: { type: 'Poll', isSingle: true },\n\n quoted_message: { type: 'Message', isSingle: true },\n\n reminder: { type: 'MessageReminder', isSingle: true },\n\n shared_location: { type: 'SharedLocation', isSingle: true },\n\n user: { type: 'User', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.MessageReminder = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n remind_at: { type: 'DatetimeType', isSingle: true },\n\n channel: { type: 'Channel', isSingle: true },\n\n message: { type: 'Message', isSingle: true },\n\n user: { type: 'User', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.MessageResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n latest_reactions: { type: 'ReactionResponse', isSingle: false },\n\n mentioned_users: { type: 'UserResponse', isSingle: false },\n\n own_reactions: { type: 'ReactionResponse', isSingle: false },\n\n user: { type: 'UserResponse', isSingle: true },\n\n deleted_at: { type: 'DatetimeType', isSingle: true },\n\n message_text_updated_at: { type: 'DatetimeType', isSingle: true },\n\n pin_expires: { type: 'DatetimeType', isSingle: true },\n\n pinned_at: { type: 'DatetimeType', isSingle: true },\n\n thread_participants: { type: 'UserResponse', isSingle: false },\n\n draft: { type: 'DraftResponse', isSingle: true },\n\n member: { type: 'ChannelMemberResponse', isSingle: true },\n\n pinned_by: { type: 'UserResponse', isSingle: true },\n\n poll: { type: 'PollResponseData', isSingle: true },\n\n quoted_message: { type: 'MessageResponse', isSingle: true },\n\n reaction_groups: { type: 'ReactionGroupResponse', isSingle: false },\n\n reminder: { type: 'ReminderResponseData', isSingle: true },\n\n shared_location: { type: 'SharedLocationResponseData', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.ModerationCustomActionEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n review_queue_item: { type: 'ReviewQueueItemResponse', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n\n message: { type: 'MessageResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.ModerationFlagResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n review_queue_item: { type: 'ReviewQueueItemResponse', isSingle: true },\n\n user: { type: 'UserResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.ModerationFlaggedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n user: { type: 'User', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.ModerationMarkReviewedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n item: { type: 'ReviewQueueItemResponse', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n\n message: { type: 'MessageResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.MuteResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n mutes: { type: 'UserMute', isSingle: false },\n\n own_user: { type: 'OwnUser', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.NotificationFeedUpdatedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n\n aggregated_activities: {\n type: 'AggregatedActivityResponse',\n isSingle: false,\n },\n\n notification_status: { type: 'NotificationStatusResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.NotificationStatusResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n last_read_at: { type: 'DatetimeType', isSingle: true },\n\n last_seen_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.OwnBatchResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n data: { type: 'FeedOwnData', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.OwnUser = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n channel_mutes: { type: 'ChannelMute', isSingle: false },\n\n devices: { type: 'Device', isSingle: false },\n\n mutes: { type: 'UserMute', isSingle: false },\n\n deactivated_at: { type: 'DatetimeType', isSingle: true },\n\n deleted_at: { type: 'DatetimeType', isSingle: true },\n\n last_active: { type: 'DatetimeType', isSingle: true },\n\n last_engaged_at: { type: 'DatetimeType', isSingle: true },\n\n push_preferences: { type: 'PushPreferences', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.PinActivityResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n activity: { type: 'ActivityResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.Poll = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n latest_answers: { type: 'PollVote', isSingle: false },\n\n own_votes: { type: 'PollVote', isSingle: false },\n\n created_by: { type: 'User', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.PollClosedFeedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n poll: { type: 'PollResponseData', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.PollDeletedFeedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n poll: { type: 'PollResponseData', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.PollResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n poll: { type: 'PollResponseData', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.PollResponseData = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n latest_answers: { type: 'PollVoteResponseData', isSingle: false },\n\n own_votes: { type: 'PollVoteResponseData', isSingle: false },\n\n created_by: { type: 'UserResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.PollUpdatedFeedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n poll: { type: 'PollResponseData', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.PollVote = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n user: { type: 'User', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.PollVoteCastedFeedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n poll: { type: 'PollResponseData', isSingle: true },\n\n poll_vote: { type: 'PollVoteResponseData', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.PollVoteChangedFeedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n poll: { type: 'PollResponseData', isSingle: true },\n\n poll_vote: { type: 'PollVoteResponseData', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.PollVoteRemovedFeedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n poll: { type: 'PollResponseData', isSingle: true },\n\n poll_vote: { type: 'PollVoteResponseData', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.PollVoteResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n poll: { type: 'PollResponseData', isSingle: true },\n\n vote: { type: 'PollVoteResponseData', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.PollVoteResponseData = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n user: { type: 'UserResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.PollVotesResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n votes: { type: 'PollVoteResponseData', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.PushPreferences = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n disabled_until: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.QueryActivitiesResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n activities: { type: 'ActivityResponse', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.QueryActivityReactionsResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n reactions: { type: 'FeedsReactionResponse', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.QueryAppealsResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n items: { type: 'AppealItemResponse', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.QueryBookmarkFoldersResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n bookmark_folders: { type: 'BookmarkFolderResponse', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.QueryBookmarksResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n bookmarks: { type: 'BookmarkResponse', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.QueryCommentReactionsResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n reactions: { type: 'FeedsReactionResponse', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.QueryCommentsResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n comments: { type: 'CommentResponse', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.QueryFeedMembersResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n members: { type: 'FeedMemberResponse', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.QueryFeedsResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n feeds: { type: 'FeedResponse', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.QueryFollowsResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n follows: { type: 'FollowResponse', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.QueryModerationConfigsResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n configs: { type: 'ConfigResponse', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.QueryPollsResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n polls: { type: 'PollResponseData', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.QueryUsersResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n users: { type: 'FullUserResponse', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.Reaction = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n deleted_at: { type: 'DatetimeType', isSingle: true },\n\n user: { type: 'User', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.ReactionGroupResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n first_reaction_at: { type: 'DatetimeType', isSingle: true },\n\n last_reaction_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.ReactionResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n user: { type: 'UserResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.ReadCollectionsResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n collections: { type: 'CollectionResponse', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.RejectFeedMemberInviteResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n member: { type: 'FeedMemberResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.RejectFollowResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n follow: { type: 'FollowResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.ReminderResponseData = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n remind_at: { type: 'DatetimeType', isSingle: true },\n\n channel: { type: 'ChannelResponse', isSingle: true },\n\n message: { type: 'MessageResponse', isSingle: true },\n\n user: { type: 'UserResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.ReviewQueueItemResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n actions: { type: 'ActionLogResponse', isSingle: false },\n\n bans: { type: 'Ban', isSingle: false },\n\n flags: { type: 'ModerationFlagResponse', isSingle: false },\n\n completed_at: { type: 'DatetimeType', isSingle: true },\n\n reviewed_at: { type: 'DatetimeType', isSingle: true },\n\n appeal: { type: 'AppealItemResponse', isSingle: true },\n\n assigned_to: { type: 'UserResponse', isSingle: true },\n\n call: { type: 'CallResponse', isSingle: true },\n\n entity_creator: { type: 'EntityCreatorResponse', isSingle: true },\n\n feeds_v2_reaction: { type: 'Reaction', isSingle: true },\n\n feeds_v3_activity: { type: 'ActivityResponse', isSingle: true },\n\n feeds_v3_comment: { type: 'CommentResponse', isSingle: true },\n\n message: { type: 'MessageResponse', isSingle: true },\n\n reaction: { type: 'Reaction', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.SharedLocation = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n end_at: { type: 'DatetimeType', isSingle: true },\n\n channel: { type: 'Channel', isSingle: true },\n\n message: { type: 'Message', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.SharedLocationResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n end_at: { type: 'DatetimeType', isSingle: true },\n\n channel: { type: 'ChannelResponse', isSingle: true },\n\n message: { type: 'MessageResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.SharedLocationResponseData = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n end_at: { type: 'DatetimeType', isSingle: true },\n\n channel: { type: 'ChannelResponse', isSingle: true },\n\n message: { type: 'MessageResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.SharedLocationsResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n active_live_locations: {\n type: 'SharedLocationResponseData',\n isSingle: false,\n },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.SingleFollowResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n follow: { type: 'FollowResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.StoriesFeedUpdatedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n\n activities: { type: 'ActivityResponse', isSingle: false },\n\n aggregated_activities: {\n type: 'AggregatedActivityResponse',\n isSingle: false,\n },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.SubmitActionResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n appeal_item: { type: 'AppealItemResponse', isSingle: true },\n\n item: { type: 'ReviewQueueItemResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.ThreadedCommentResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n mentioned_users: { type: 'UserResponse', isSingle: false },\n\n own_reactions: { type: 'FeedsReactionResponse', isSingle: false },\n\n user: { type: 'UserResponse', isSingle: true },\n\n deleted_at: { type: 'DatetimeType', isSingle: true },\n\n edited_at: { type: 'DatetimeType', isSingle: true },\n\n latest_reactions: { type: 'FeedsReactionResponse', isSingle: false },\n\n replies: { type: 'ThreadedCommentResponse', isSingle: false },\n\n reaction_groups: { type: 'ReactionGroupResponse', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.UnfollowBatchResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n follows: { type: 'FollowResponse', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.UnfollowResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n follow: { type: 'FollowResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.UnpinActivityResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n activity: { type: 'ActivityResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.UpdateActivityPartialResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n activity: { type: 'ActivityResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.UpdateActivityResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n activity: { type: 'ActivityResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.UpdateBlockListResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n blocklist: { type: 'BlockListResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.UpdateBookmarkFolderResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n bookmark_folder: { type: 'BookmarkFolderResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.UpdateBookmarkResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n bookmark: { type: 'BookmarkResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.UpdateCollectionsResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n collections: { type: 'CollectionResponse', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.UpdateCommentResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n comment: { type: 'CommentResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.UpdateFeedMembersResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n added: { type: 'FeedMemberResponse', isSingle: false },\n\n updated: { type: 'FeedMemberResponse', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.UpdateFeedResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n feed: { type: 'FeedResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.UpdateFollowResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n follow: { type: 'FollowResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.UpdateUsersResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n users: { type: 'FullUserResponse', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.UpsertActivitiesResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n activities: { type: 'ActivityResponse', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.UpsertConfigResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n config: { type: 'ConfigResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.UpsertPushPreferencesResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n user_preferences: { type: 'PushPreferences', isSingle: false },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.User = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n ban_expires: { type: 'DatetimeType', isSingle: true },\n\n created_at: { type: 'DatetimeType', isSingle: true },\n\n deactivated_at: { type: 'DatetimeType', isSingle: true },\n\n deleted_at: { type: 'DatetimeType', isSingle: true },\n\n last_active: { type: 'DatetimeType', isSingle: true },\n\n last_engaged_at: { type: 'DatetimeType', isSingle: true },\n\n revoke_tokens_issued_before: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.UserBannedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n created_by: { type: 'User', isSingle: true },\n\n expiration: { type: 'DatetimeType', isSingle: true },\n\n user: { type: 'User', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.UserDeactivatedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n created_by: { type: 'User', isSingle: true },\n\n user: { type: 'User', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.UserMute = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n expires: { type: 'DatetimeType', isSingle: true },\n\n target: { type: 'User', isSingle: true },\n\n user: { type: 'User', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.UserMuteResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n expires: { type: 'DatetimeType', isSingle: true },\n\n target: { type: 'UserResponse', isSingle: true },\n\n user: { type: 'UserResponse', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.UserMutedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n user: { type: 'User', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.UserReactivatedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n user: { type: 'User', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.UserResponse = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n updated_at: { type: 'DatetimeType', isSingle: true },\n\n deactivated_at: { type: 'DatetimeType', isSingle: true },\n\n deleted_at: { type: 'DatetimeType', isSingle: true },\n\n last_active: { type: 'DatetimeType', isSingle: true },\n\n revoke_tokens_issued_before: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n\ndecoders.UserUpdatedEvent = (input?: Record<string, any>) => {\n const typeMappings: TypeMapping = {\n created_at: { type: 'DatetimeType', isSingle: true },\n\n received_at: { type: 'DatetimeType', isSingle: true },\n };\n return decode(typeMappings, input);\n};\n","import type { ApiClient, StreamResponse } from '../../gen-imports';\nimport type {\n AcceptFeedMemberInviteRequest,\n AcceptFeedMemberInviteResponse,\n AcceptFollowRequest,\n AcceptFollowResponse,\n ActivityFeedbackRequest,\n ActivityFeedbackResponse,\n AddActivityRequest,\n AddActivityResponse,\n AddBookmarkRequest,\n AddBookmarkResponse,\n AddCommentReactionRequest,\n AddCommentReactionResponse,\n AddCommentRequest,\n AddCommentResponse,\n AddCommentsBatchRequest,\n AddCommentsBatchResponse,\n AddReactionRequest,\n AddReactionResponse,\n BlockUsersRequest,\n BlockUsersResponse,\n CastPollVoteRequest,\n CreateBlockListRequest,\n CreateBlockListResponse,\n CreateCollectionsRequest,\n CreateCollectionsResponse,\n CreateDeviceRequest,\n CreateFeedsBatchRequest,\n CreateFeedsBatchResponse,\n CreateGuestRequest,\n CreateGuestResponse,\n CreatePollOptionRequest,\n CreatePollRequest,\n DeleteActivitiesRequest,\n DeleteActivitiesResponse,\n DeleteActivityReactionResponse,\n DeleteActivityResponse,\n DeleteBookmarkFolderResponse,\n DeleteBookmarkResponse,\n DeleteCollectionsResponse,\n DeleteCommentReactionResponse,\n DeleteCommentResponse,\n DeleteFeedResponse,\n FileUploadRequest,\n FileUploadResponse,\n FollowBatchRequest,\n FollowBatchResponse,\n FollowRequest,\n GetActivityResponse,\n GetApplicationResponse,\n GetBlockedUsersResponse,\n GetCommentRepliesResponse,\n GetCommentResponse,\n GetCommentsResponse,\n GetFollowSuggestionsResponse,\n GetOGResponse,\n GetOrCreateFeedRequest,\n GetOrCreateFeedResponse,\n ImageUploadRequest,\n ImageUploadResponse,\n ListBlockListResponse,\n ListDevicesResponse,\n MarkActivityRequest,\n OwnBatchRequest,\n OwnBatchResponse,\n PinActivityRequest,\n PinActivityResponse,\n PollOptionResponse,\n PollResponse,\n PollVoteResponse,\n PollVotesResponse,\n QueryActivitiesRequest,\n QueryActivitiesResponse,\n QueryActivityReactionsRequest,\n QueryActivityReactionsResponse,\n QueryBookmarkFoldersRequest,\n QueryBookmarkFoldersResponse,\n QueryBookmarksRequest,\n QueryBookmarksResponse,\n QueryCommentReactionsRequest,\n QueryCommentReactionsResponse,\n QueryCommentsRequest,\n QueryCommentsResponse,\n QueryFeedMembersRequest,\n QueryFeedMembersResponse,\n QueryFeedsRequest,\n QueryFeedsResponse,\n QueryFollowsRequest,\n QueryFollowsResponse,\n QueryPollVotesRequest,\n QueryPollsRequest,\n QueryPollsResponse,\n QueryUsersPayload,\n QueryUsersResponse,\n ReadCollectionsResponse,\n RejectFeedMemberInviteRequest,\n RejectFeedMemberInviteResponse,\n RejectFollowRequest,\n RejectFollowResponse,\n Response,\n SharedLocationResponse,\n SharedLocationsResponse,\n SingleFollowResponse,\n UnblockUsersRequest,\n UnblockUsersResponse,\n UnfollowBatchRequest,\n UnfollowBatchResponse,\n UnfollowResponse,\n UnpinActivityResponse,\n UpdateActivityPartialRequest,\n UpdateActivityPartialResponse,\n UpdateActivityRequest,\n UpdateActivityResponse,\n UpdateBlockListRequest,\n UpdateBlockListResponse,\n UpdateBookmarkFolderRequest,\n UpdateBookmarkFolderResponse,\n UpdateBookmarkRequest,\n UpdateBookmarkResponse,\n UpdateCollectionsRequest,\n UpdateCollectionsResponse,\n UpdateCommentRequest,\n UpdateCommentResponse,\n UpdateFeedMembersRequest,\n UpdateFeedMembersResponse,\n UpdateFeedRequest,\n UpdateFeedResponse,\n UpdateFollowRequest,\n UpdateFollowResponse,\n UpdateLiveLocationRequest,\n UpdatePollOptionRequest,\n UpdatePollPartialRequest,\n UpdatePollRequest,\n UpdateUsersPartialRequest,\n UpdateUsersRequest,\n UpdateUsersResponse,\n UpsertActivitiesRequest,\n UpsertActivitiesResponse,\n UpsertPushPreferencesRequest,\n UpsertPushPreferencesResponse,\n WSAuthMessage,\n} from '../models';\nimport { decoders } from '../model-decoders/decoders';\n\nexport class FeedsApi {\n constructor(public readonly apiClient: ApiClient) {}\n\n async getApp(): Promise<StreamResponse<GetApplicationResponse>> {\n const response = await this.apiClient.sendRequest<\n StreamResponse<GetApplicationResponse>\n >('GET', '/api/v2/app', undefined, undefined);\n\n decoders.GetApplicationResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async listBlockLists(request?: {\n team?: string;\n }): Promise<StreamResponse<ListBlockListResponse>> {\n const queryParams = {\n team: request?.team,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<ListBlockListResponse>\n >('GET', '/api/v2/blocklists', undefined, queryParams);\n\n decoders.ListBlockListResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async createBlockList(\n request: CreateBlockListRequest,\n ): Promise<StreamResponse<CreateBlockListResponse>> {\n const body = {\n name: request?.name,\n words: request?.words,\n is_leet_check_enabled: request?.is_leet_check_enabled,\n is_plural_check_enabled: request?.is_plural_check_enabled,\n team: request?.team,\n type: request?.type,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<CreateBlockListResponse>\n >(\n 'POST',\n '/api/v2/blocklists',\n undefined,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.CreateBlockListResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async deleteBlockList(request: {\n name: string;\n team?: string;\n }): Promise<StreamResponse<Response>> {\n const queryParams = {\n team: request?.team,\n };\n const pathParams = {\n name: request?.name,\n };\n\n const response = await this.apiClient.sendRequest<StreamResponse<Response>>(\n 'DELETE',\n '/api/v2/blocklists/{name}',\n pathParams,\n queryParams,\n );\n\n decoders.Response?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async updateBlockList(\n request: UpdateBlockListRequest & { name: string },\n ): Promise<StreamResponse<UpdateBlockListResponse>> {\n const pathParams = {\n name: request?.name,\n };\n const body = {\n is_leet_check_enabled: request?.is_leet_check_enabled,\n is_plural_check_enabled: request?.is_plural_check_enabled,\n team: request?.team,\n words: request?.words,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<UpdateBlockListResponse>\n >(\n 'PUT',\n '/api/v2/blocklists/{name}',\n pathParams,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.UpdateBlockListResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async deleteDevice(request: {\n id: string;\n }): Promise<StreamResponse<Response>> {\n const queryParams = {\n id: request?.id,\n };\n\n const response = await this.apiClient.sendRequest<StreamResponse<Response>>(\n 'DELETE',\n '/api/v2/devices',\n undefined,\n queryParams,\n );\n\n decoders.Response?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async listDevices(): Promise<StreamResponse<ListDevicesResponse>> {\n const response = await this.apiClient.sendRequest<\n StreamResponse<ListDevicesResponse>\n >('GET', '/api/v2/devices', undefined, undefined);\n\n decoders.ListDevicesResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async createDevice(\n request: CreateDeviceRequest,\n ): Promise<StreamResponse<Response>> {\n const body = {\n id: request?.id,\n push_provider: request?.push_provider,\n push_provider_name: request?.push_provider_name,\n voip_token: request?.voip_token,\n };\n\n const response = await this.apiClient.sendRequest<StreamResponse<Response>>(\n 'POST',\n '/api/v2/devices',\n undefined,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.Response?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async addActivity(\n request: AddActivityRequest,\n ): Promise<StreamResponse<AddActivityResponse>> {\n const body = {\n type: request?.type,\n feeds: request?.feeds,\n create_notification_activity: request?.create_notification_activity,\n expires_at: request?.expires_at,\n id: request?.id,\n parent_id: request?.parent_id,\n poll_id: request?.poll_id,\n restrict_replies: request?.restrict_replies,\n skip_enrich_url: request?.skip_enrich_url,\n skip_push: request?.skip_push,\n text: request?.text,\n visibility: request?.visibility,\n visibility_tag: request?.visibility_tag,\n attachments: request?.attachments,\n collection_refs: request?.collection_refs,\n filter_tags: request?.filter_tags,\n interest_tags: request?.interest_tags,\n mentioned_user_ids: request?.mentioned_user_ids,\n custom: request?.custom,\n location: request?.location,\n search_data: request?.search_data,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<AddActivityResponse>\n >(\n 'POST',\n '/api/v2/feeds/activities',\n undefined,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.AddActivityResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async upsertActivities(\n request: UpsertActivitiesRequest,\n ): Promise<StreamResponse<UpsertActivitiesResponse>> {\n const body = {\n activities: request?.activities,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<UpsertActivitiesResponse>\n >(\n 'POST',\n '/api/v2/feeds/activities/batch',\n undefined,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.UpsertActivitiesResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async deleteActivities(\n request: DeleteActivitiesRequest,\n ): Promise<StreamResponse<DeleteActivitiesResponse>> {\n const body = {\n ids: request?.ids,\n delete_notification_activity: request?.delete_notification_activity,\n hard_delete: request?.hard_delete,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<DeleteActivitiesResponse>\n >(\n 'POST',\n '/api/v2/feeds/activities/delete',\n undefined,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.DeleteActivitiesResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async queryActivities(\n request?: QueryActivitiesRequest,\n ): Promise<StreamResponse<QueryActivitiesResponse>> {\n const body = {\n limit: request?.limit,\n next: request?.next,\n prev: request?.prev,\n sort: request?.sort,\n filter: request?.filter,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<QueryActivitiesResponse>\n >(\n 'POST',\n '/api/v2/feeds/activities/query',\n undefined,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.QueryActivitiesResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async deleteBookmark(request: {\n activity_id: string;\n folder_id?: string;\n }): Promise<StreamResponse<DeleteBookmarkResponse>> {\n const queryParams = {\n folder_id: request?.folder_id,\n };\n const pathParams = {\n activity_id: request?.activity_id,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<DeleteBookmarkResponse>\n >(\n 'DELETE',\n '/api/v2/feeds/activities/{activity_id}/bookmarks',\n pathParams,\n queryParams,\n );\n\n decoders.DeleteBookmarkResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async updateBookmark(\n request: UpdateBookmarkRequest & { activity_id: string },\n ): Promise<StreamResponse<UpdateBookmarkResponse>> {\n const pathParams = {\n activity_id: request?.activity_id,\n };\n const body = {\n folder_id: request?.folder_id,\n new_folder_id: request?.new_folder_id,\n custom: request?.custom,\n new_folder: request?.new_folder,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<UpdateBookmarkResponse>\n >(\n 'PATCH',\n '/api/v2/feeds/activities/{activity_id}/bookmarks',\n pathParams,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.UpdateBookmarkResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async addBookmark(\n request: AddBookmarkRequest & { activity_id: string },\n ): Promise<StreamResponse<AddBookmarkResponse>> {\n const pathParams = {\n activity_id: request?.activity_id,\n };\n const body = {\n folder_id: request?.folder_id,\n custom: request?.custom,\n new_folder: request?.new_folder,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<AddBookmarkResponse>\n >(\n 'POST',\n '/api/v2/feeds/activities/{activity_id}/bookmarks',\n pathParams,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.AddBookmarkResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async activityFeedback(\n request: ActivityFeedbackRequest & { activity_id: string },\n ): Promise<StreamResponse<ActivityFeedbackResponse>> {\n const pathParams = {\n activity_id: request?.activity_id,\n };\n const body = {\n hide: request?.hide,\n show_less: request?.show_less,\n show_more: request?.show_more,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<ActivityFeedbackResponse>\n >(\n 'POST',\n '/api/v2/feeds/activities/{activity_id}/feedback',\n pathParams,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.ActivityFeedbackResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async castPollVote(\n request: CastPollVoteRequest & { activity_id: string; poll_id: string },\n ): Promise<StreamResponse<PollVoteResponse>> {\n const pathParams = {\n activity_id: request?.activity_id,\n poll_id: request?.poll_id,\n };\n const body = {\n vote: request?.vote,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<PollVoteResponse>\n >(\n 'POST',\n '/api/v2/feeds/activities/{activity_id}/polls/{poll_id}/vote',\n pathParams,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.PollVoteResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async deletePollVote(request: {\n activity_id: string;\n poll_id: string;\n vote_id: string;\n user_id?: string;\n }): Promise<StreamResponse<PollVoteResponse>> {\n const queryParams = {\n user_id: request?.user_id,\n };\n const pathParams = {\n activity_id: request?.activity_id,\n poll_id: request?.poll_id,\n vote_id: request?.vote_id,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<PollVoteResponse>\n >(\n 'DELETE',\n '/api/v2/feeds/activities/{activity_id}/polls/{poll_id}/vote/{vote_id}',\n pathParams,\n queryParams,\n );\n\n decoders.PollVoteResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async addActivityReaction(\n request: AddReactionRequest & { activity_id: string },\n ): Promise<StreamResponse<AddReactionResponse>> {\n const pathParams = {\n activity_id: request?.activity_id,\n };\n const body = {\n type: request?.type,\n create_notification_activity: request?.create_notification_activity,\n enforce_unique: request?.enforce_unique,\n skip_push: request?.skip_push,\n custom: request?.custom,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<AddReactionResponse>\n >(\n 'POST',\n '/api/v2/feeds/activities/{activity_id}/reactions',\n pathParams,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.AddReactionResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async queryActivityReactions(\n request: QueryActivityReactionsRequest & { activity_id: string },\n ): Promise<StreamResponse<QueryActivityReactionsResponse>> {\n const pathParams = {\n activity_id: request?.activity_id,\n };\n const body = {\n limit: request?.limit,\n next: request?.next,\n prev: request?.prev,\n sort: request?.sort,\n filter: request?.filter,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<QueryActivityReactionsResponse>\n >(\n 'POST',\n '/api/v2/feeds/activities/{activity_id}/reactions/query',\n pathParams,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.QueryActivityReactionsResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async deleteActivityReaction(request: {\n activity_id: string;\n type: string;\n delete_notification_activity?: boolean;\n }): Promise<StreamResponse<DeleteActivityReactionResponse>> {\n const queryParams = {\n delete_notification_activity: request?.delete_notification_activity,\n };\n const pathParams = {\n activity_id: request?.activity_id,\n type: request?.type,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<DeleteActivityReactionResponse>\n >(\n 'DELETE',\n '/api/v2/feeds/activities/{activity_id}/reactions/{type}',\n pathParams,\n queryParams,\n );\n\n decoders.DeleteActivityReactionResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async deleteActivity(request: {\n id: string;\n hard_delete?: boolean;\n delete_notification_activity?: boolean;\n }): Promise<StreamResponse<DeleteActivityResponse>> {\n const queryParams = {\n hard_delete: request?.hard_delete,\n delete_notification_activity: request?.delete_notification_activity,\n };\n const pathParams = {\n id: request?.id,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<DeleteActivityResponse>\n >('DELETE', '/api/v2/feeds/activities/{id}', pathParams, queryParams);\n\n decoders.DeleteActivityResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async getActivity(request: {\n id: string;\n }): Promise<StreamResponse<GetActivityResponse>> {\n const pathParams = {\n id: request?.id,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<GetActivityResponse>\n >('GET', '/api/v2/feeds/activities/{id}', pathParams, undefined);\n\n decoders.GetActivityResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async updateActivityPartial(\n request: UpdateActivityPartialRequest & { id: string },\n ): Promise<StreamResponse<UpdateActivityPartialResponse>> {\n const pathParams = {\n id: request?.id,\n };\n const body = {\n handle_mention_notifications: request?.handle_mention_notifications,\n unset: request?.unset,\n set: request?.set,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<UpdateActivityPartialResponse>\n >(\n 'PATCH',\n '/api/v2/feeds/activities/{id}',\n pathParams,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.UpdateActivityPartialResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async updateActivity(\n request: UpdateActivityRequest & { id: string },\n ): Promise<StreamResponse<UpdateActivityResponse>> {\n const pathParams = {\n id: request?.id,\n };\n const body = {\n expires_at: request?.expires_at,\n handle_mention_notifications: request?.handle_mention_notifications,\n poll_id: request?.poll_id,\n restrict_replies: request?.restrict_replies,\n skip_enrich_url: request?.skip_enrich_url,\n text: request?.text,\n visibility: request?.visibility,\n visibility_tag: request?.visibility_tag,\n attachments: request?.attachments,\n collection_refs: request?.collection_refs,\n feeds: request?.feeds,\n filter_tags: request?.filter_tags,\n interest_tags: request?.interest_tags,\n mentioned_user_ids: request?.mentioned_user_ids,\n custom: request?.custom,\n location: request?.location,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<UpdateActivityResponse>\n >(\n 'PUT',\n '/api/v2/feeds/activities/{id}',\n pathParams,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.UpdateActivityResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async queryBookmarkFolders(\n request?: QueryBookmarkFoldersRequest,\n ): Promise<StreamResponse<QueryBookmarkFoldersResponse>> {\n const body = {\n limit: request?.limit,\n next: request?.next,\n prev: request?.prev,\n sort: request?.sort,\n filter: request?.filter,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<QueryBookmarkFoldersResponse>\n >(\n 'POST',\n '/api/v2/feeds/bookmark_folders/query',\n undefined,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.QueryBookmarkFoldersResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async deleteBookmarkFolder(request: {\n folder_id: string;\n }): Promise<StreamResponse<DeleteBookmarkFolderResponse>> {\n const pathParams = {\n folder_id: request?.folder_id,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<DeleteBookmarkFolderResponse>\n >(\n 'DELETE',\n '/api/v2/feeds/bookmark_folders/{folder_id}',\n pathParams,\n undefined,\n );\n\n decoders.DeleteBookmarkFolderResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async updateBookmarkFolder(\n request: UpdateBookmarkFolderRequest & { folder_id: string },\n ): Promise<StreamResponse<UpdateBookmarkFolderResponse>> {\n const pathParams = {\n folder_id: request?.folder_id,\n };\n const body = {\n name: request?.name,\n custom: request?.custom,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<UpdateBookmarkFolderResponse>\n >(\n 'PATCH',\n '/api/v2/feeds/bookmark_folders/{folder_id}',\n pathParams,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.UpdateBookmarkFolderResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async queryBookmarks(\n request?: QueryBookmarksRequest,\n ): Promise<StreamResponse<QueryBookmarksResponse>> {\n const body = {\n limit: request?.limit,\n next: request?.next,\n prev: request?.prev,\n sort: request?.sort,\n filter: request?.filter,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<QueryBookmarksResponse>\n >(\n 'POST',\n '/api/v2/feeds/bookmarks/query',\n undefined,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.QueryBookmarksResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async deleteCollections(request: {\n collection_refs: string[];\n }): Promise<StreamResponse<DeleteCollectionsResponse>> {\n const queryParams = {\n collection_refs: request?.collection_refs,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<DeleteCollectionsResponse>\n >('DELETE', '/api/v2/feeds/collections', undefined, queryParams);\n\n decoders.DeleteCollectionsResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async readCollections(request: {\n collection_refs: string[];\n }): Promise<StreamResponse<ReadCollectionsResponse>> {\n const queryParams = {\n collection_refs: request?.collection_refs,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<ReadCollectionsResponse>\n >('GET', '/api/v2/feeds/collections', undefined, queryParams);\n\n decoders.ReadCollectionsResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async updateCollections(\n request: UpdateCollectionsRequest,\n ): Promise<StreamResponse<UpdateCollectionsResponse>> {\n const body = {\n collections: request?.collections,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<UpdateCollectionsResponse>\n >(\n 'PATCH',\n '/api/v2/feeds/collections',\n undefined,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.UpdateCollectionsResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async createCollections(\n request: CreateCollectionsRequest,\n ): Promise<StreamResponse<CreateCollectionsResponse>> {\n const body = {\n collections: request?.collections,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<CreateCollectionsResponse>\n >(\n 'POST',\n '/api/v2/feeds/collections',\n undefined,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.CreateCollectionsResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async getComments(request: {\n object_id: string;\n object_type: string;\n depth?: number;\n sort?: string;\n replies_limit?: number;\n limit?: number;\n prev?: string;\n next?: string;\n }): Promise<StreamResponse<GetCommentsResponse>> {\n const queryParams = {\n object_id: request?.object_id,\n object_type: request?.object_type,\n depth: request?.depth,\n sort: request?.sort,\n replies_limit: request?.replies_limit,\n limit: request?.limit,\n prev: request?.prev,\n next: request?.next,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<GetCommentsResponse>\n >('GET', '/api/v2/feeds/comments', undefined, queryParams);\n\n decoders.GetCommentsResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async addComment(\n request?: AddCommentRequest,\n ): Promise<StreamResponse<AddCommentResponse>> {\n const body = {\n comment: request?.comment,\n create_notification_activity: request?.create_notification_activity,\n id: request?.id,\n object_id: request?.object_id,\n object_type: request?.object_type,\n parent_id: request?.parent_id,\n skip_enrich_url: request?.skip_enrich_url,\n skip_push: request?.skip_push,\n attachments: request?.attachments,\n mentioned_user_ids: request?.mentioned_user_ids,\n custom: request?.custom,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<AddCommentResponse>\n >(\n 'POST',\n '/api/v2/feeds/comments',\n undefined,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.AddCommentResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async addCommentsBatch(\n request: AddCommentsBatchRequest,\n ): Promise<StreamResponse<AddCommentsBatchResponse>> {\n const body = {\n comments: request?.comments,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<AddCommentsBatchResponse>\n >(\n 'POST',\n '/api/v2/feeds/comments/batch',\n undefined,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.AddCommentsBatchResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async queryComments(\n request: QueryCommentsRequest,\n ): Promise<StreamResponse<QueryCommentsResponse>> {\n const body = {\n filter: request?.filter,\n limit: request?.limit,\n next: request?.next,\n prev: request?.prev,\n sort: request?.sort,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<QueryCommentsResponse>\n >(\n 'POST',\n '/api/v2/feeds/comments/query',\n undefined,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.QueryCommentsResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async deleteComment(request: {\n id: string;\n hard_delete?: boolean;\n delete_notification_activity?: boolean;\n }): Promise<StreamResponse<DeleteCommentResponse>> {\n const queryParams = {\n hard_delete: request?.hard_delete,\n delete_notification_activity: request?.delete_notification_activity,\n };\n const pathParams = {\n id: request?.id,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<DeleteCommentResponse>\n >('DELETE', '/api/v2/feeds/comments/{id}', pathParams, queryParams);\n\n decoders.DeleteCommentResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async getComment(request: {\n id: string;\n }): Promise<StreamResponse<GetCommentResponse>> {\n const pathParams = {\n id: request?.id,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<GetCommentResponse>\n >('GET', '/api/v2/feeds/comments/{id}', pathParams, undefined);\n\n decoders.GetCommentResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async updateComment(\n request: UpdateCommentRequest & { id: string },\n ): Promise<StreamResponse<UpdateCommentResponse>> {\n const pathParams = {\n id: request?.id,\n };\n const body = {\n comment: request?.comment,\n handle_mention_notifications: request?.handle_mention_notifications,\n skip_enrich_url: request?.skip_enrich_url,\n skip_push: request?.skip_push,\n attachments: request?.attachments,\n mentioned_user_ids: request?.mentioned_user_ids,\n custom: request?.custom,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<UpdateCommentResponse>\n >(\n 'PATCH',\n '/api/v2/feeds/comments/{id}',\n pathParams,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.UpdateCommentResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async addCommentReaction(\n request: AddCommentReactionRequest & { id: string },\n ): Promise<StreamResponse<AddCommentReactionResponse>> {\n const pathParams = {\n id: request?.id,\n };\n const body = {\n type: request?.type,\n create_notification_activity: request?.create_notification_activity,\n enforce_unique: request?.enforce_unique,\n skip_push: request?.skip_push,\n custom: request?.custom,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<AddCommentReactionResponse>\n >(\n 'POST',\n '/api/v2/feeds/comments/{id}/reactions',\n pathParams,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.AddCommentReactionResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async queryCommentReactions(\n request: QueryCommentReactionsRequest & { id: string },\n ): Promise<StreamResponse<QueryCommentReactionsResponse>> {\n const pathParams = {\n id: request?.id,\n };\n const body = {\n limit: request?.limit,\n next: request?.next,\n prev: request?.prev,\n sort: request?.sort,\n filter: request?.filter,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<QueryCommentReactionsResponse>\n >(\n 'POST',\n '/api/v2/feeds/comments/{id}/reactions/query',\n pathParams,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.QueryCommentReactionsResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async deleteCommentReaction(request: {\n id: string;\n type: string;\n delete_notification_activity?: boolean;\n }): Promise<StreamResponse<DeleteCommentReactionResponse>> {\n const queryParams = {\n delete_notification_activity: request?.delete_notification_activity,\n };\n const pathParams = {\n id: request?.id,\n type: request?.type,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<DeleteCommentReactionResponse>\n >(\n 'DELETE',\n '/api/v2/feeds/comments/{id}/reactions/{type}',\n pathParams,\n queryParams,\n );\n\n decoders.DeleteCommentReactionResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async getCommentReplies(request: {\n id: string;\n depth?: number;\n sort?: string;\n replies_limit?: number;\n limit?: number;\n prev?: string;\n next?: string;\n }): Promise<StreamResponse<GetCommentRepliesResponse>> {\n const queryParams = {\n depth: request?.depth,\n sort: request?.sort,\n replies_limit: request?.replies_limit,\n limit: request?.limit,\n prev: request?.prev,\n next: request?.next,\n };\n const pathParams = {\n id: request?.id,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<GetCommentRepliesResponse>\n >('GET', '/api/v2/feeds/comments/{id}/replies', pathParams, queryParams);\n\n decoders.GetCommentRepliesResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async deleteFeed(request: {\n feed_group_id: string;\n feed_id: string;\n hard_delete?: boolean;\n }): Promise<StreamResponse<DeleteFeedResponse>> {\n const queryParams = {\n hard_delete: request?.hard_delete,\n };\n const pathParams = {\n feed_group_id: request?.feed_group_id,\n feed_id: request?.feed_id,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<DeleteFeedResponse>\n >(\n 'DELETE',\n '/api/v2/feeds/feed_groups/{feed_group_id}/feeds/{feed_id}',\n pathParams,\n queryParams,\n );\n\n decoders.DeleteFeedResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async getOrCreateFeed(\n request: GetOrCreateFeedRequest & {\n feed_group_id: string;\n feed_id: string;\n connection_id?: string;\n },\n ): Promise<StreamResponse<GetOrCreateFeedResponse>> {\n const queryParams = {\n connection_id: request?.connection_id,\n };\n const pathParams = {\n feed_group_id: request?.feed_group_id,\n feed_id: request?.feed_id,\n };\n const body = {\n id_around: request?.id_around,\n limit: request?.limit,\n next: request?.next,\n prev: request?.prev,\n view: request?.view,\n watch: request?.watch,\n data: request?.data,\n enrichment_options: request?.enrichment_options,\n external_ranking: request?.external_ranking,\n filter: request?.filter,\n followers_pagination: request?.followers_pagination,\n following_pagination: request?.following_pagination,\n interest_weights: request?.interest_weights,\n member_pagination: request?.member_pagination,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<GetOrCreateFeedResponse>\n >(\n 'POST',\n '/api/v2/feeds/feed_groups/{feed_group_id}/feeds/{feed_id}',\n pathParams,\n queryParams,\n body,\n 'application/json',\n );\n\n decoders.GetOrCreateFeedResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async updateFeed(\n request: UpdateFeedRequest & { feed_group_id: string; feed_id: string },\n ): Promise<StreamResponse<UpdateFeedResponse>> {\n const pathParams = {\n feed_group_id: request?.feed_group_id,\n feed_id: request?.feed_id,\n };\n const body = {\n description: request?.description,\n name: request?.name,\n filter_tags: request?.filter_tags,\n custom: request?.custom,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<UpdateFeedResponse>\n >(\n 'PUT',\n '/api/v2/feeds/feed_groups/{feed_group_id}/feeds/{feed_id}',\n pathParams,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.UpdateFeedResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async markActivity(\n request: MarkActivityRequest & { feed_group_id: string; feed_id: string },\n ): Promise<StreamResponse<Response>> {\n const pathParams = {\n feed_group_id: request?.feed_group_id,\n feed_id: request?.feed_id,\n };\n const body = {\n mark_all_read: request?.mark_all_read,\n mark_all_seen: request?.mark_all_seen,\n mark_read: request?.mark_read,\n mark_seen: request?.mark_seen,\n mark_watched: request?.mark_watched,\n };\n\n const response = await this.apiClient.sendRequest<StreamResponse<Response>>(\n 'POST',\n '/api/v2/feeds/feed_groups/{feed_group_id}/feeds/{feed_id}/activities/mark/batch',\n pathParams,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.Response?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async unpinActivity(request: {\n feed_group_id: string;\n feed_id: string;\n activity_id: string;\n }): Promise<StreamResponse<UnpinActivityResponse>> {\n const pathParams = {\n feed_group_id: request?.feed_group_id,\n feed_id: request?.feed_id,\n activity_id: request?.activity_id,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<UnpinActivityResponse>\n >(\n 'DELETE',\n '/api/v2/feeds/feed_groups/{feed_group_id}/feeds/{feed_id}/activities/{activity_id}/pin',\n pathParams,\n undefined,\n );\n\n decoders.UnpinActivityResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async pinActivity(\n request: PinActivityRequest & {\n feed_group_id: string;\n feed_id: string;\n activity_id: string;\n },\n ): Promise<StreamResponse<PinActivityResponse>> {\n const pathParams = {\n feed_group_id: request?.feed_group_id,\n feed_id: request?.feed_id,\n activity_id: request?.activity_id,\n };\n const body = {};\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<PinActivityResponse>\n >(\n 'POST',\n '/api/v2/feeds/feed_groups/{feed_group_id}/feeds/{feed_id}/activities/{activity_id}/pin',\n pathParams,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.PinActivityResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async updateFeedMembers(\n request: UpdateFeedMembersRequest & {\n feed_group_id: string;\n feed_id: string;\n },\n ): Promise<StreamResponse<UpdateFeedMembersResponse>> {\n const pathParams = {\n feed_group_id: request?.feed_group_id,\n feed_id: request?.feed_id,\n };\n const body = {\n operation: request?.operation,\n limit: request?.limit,\n next: request?.next,\n prev: request?.prev,\n members: request?.members,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<UpdateFeedMembersResponse>\n >(\n 'PATCH',\n '/api/v2/feeds/feed_groups/{feed_group_id}/feeds/{feed_id}/members',\n pathParams,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.UpdateFeedMembersResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async acceptFeedMemberInvite(\n request: AcceptFeedMemberInviteRequest & {\n feed_id: string;\n feed_group_id: string;\n },\n ): Promise<StreamResponse<AcceptFeedMemberInviteResponse>> {\n const pathParams = {\n feed_id: request?.feed_id,\n feed_group_id: request?.feed_group_id,\n };\n const body = {};\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<AcceptFeedMemberInviteResponse>\n >(\n 'POST',\n '/api/v2/feeds/feed_groups/{feed_group_id}/feeds/{feed_id}/members/accept',\n pathParams,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.AcceptFeedMemberInviteResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async queryFeedMembers(\n request: QueryFeedMembersRequest & {\n feed_group_id: string;\n feed_id: string;\n },\n ): Promise<StreamResponse<QueryFeedMembersResponse>> {\n const pathParams = {\n feed_group_id: request?.feed_group_id,\n feed_id: request?.feed_id,\n };\n const body = {\n limit: request?.limit,\n next: request?.next,\n prev: request?.prev,\n sort: request?.sort,\n filter: request?.filter,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<QueryFeedMembersResponse>\n >(\n 'POST',\n '/api/v2/feeds/feed_groups/{feed_group_id}/feeds/{feed_id}/members/query',\n pathParams,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.QueryFeedMembersResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async rejectFeedMemberInvite(\n request: RejectFeedMemberInviteRequest & {\n feed_group_id: string;\n feed_id: string;\n },\n ): Promise<StreamResponse<RejectFeedMemberInviteResponse>> {\n const pathParams = {\n feed_group_id: request?.feed_group_id,\n feed_id: request?.feed_id,\n };\n const body = {};\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<RejectFeedMemberInviteResponse>\n >(\n 'POST',\n '/api/v2/feeds/feed_groups/{feed_group_id}/feeds/{feed_id}/members/reject',\n pathParams,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.RejectFeedMemberInviteResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async stopWatchingFeed(request: {\n feed_group_id: string;\n feed_id: string;\n connection_id?: string;\n }): Promise<StreamResponse<Response>> {\n const queryParams = {\n connection_id: request?.connection_id,\n };\n const pathParams = {\n feed_group_id: request?.feed_group_id,\n feed_id: request?.feed_id,\n };\n\n const response = await this.apiClient.sendRequest<StreamResponse<Response>>(\n 'DELETE',\n '/api/v2/feeds/feed_groups/{feed_group_id}/feeds/{feed_id}/watch',\n pathParams,\n queryParams,\n );\n\n decoders.Response?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async getFollowSuggestions(request: {\n feed_group_id: string;\n limit?: number;\n }): Promise<StreamResponse<GetFollowSuggestionsResponse>> {\n const queryParams = {\n limit: request?.limit,\n };\n const pathParams = {\n feed_group_id: request?.feed_group_id,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<GetFollowSuggestionsResponse>\n >(\n 'GET',\n '/api/v2/feeds/feed_groups/{feed_group_id}/follow_suggestions',\n pathParams,\n queryParams,\n );\n\n decoders.GetFollowSuggestionsResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async createFeedsBatch(\n request: CreateFeedsBatchRequest,\n ): Promise<StreamResponse<CreateFeedsBatchResponse>> {\n const body = {\n feeds: request?.feeds,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<CreateFeedsBatchResponse>\n >(\n 'POST',\n '/api/v2/feeds/feeds/batch',\n undefined,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.CreateFeedsBatchResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async ownBatch(\n request: OwnBatchRequest & { connection_id?: string },\n ): Promise<StreamResponse<OwnBatchResponse>> {\n const queryParams = {\n connection_id: request?.connection_id,\n };\n const body = {\n feeds: request?.feeds,\n fields: request?.fields,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<OwnBatchResponse>\n >(\n 'POST',\n '/api/v2/feeds/feeds/own/batch',\n undefined,\n queryParams,\n body,\n 'application/json',\n );\n\n decoders.OwnBatchResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n protected async _queryFeeds(\n request?: QueryFeedsRequest & { connection_id?: string },\n ): Promise<StreamResponse<QueryFeedsResponse>> {\n const queryParams = {\n connection_id: request?.connection_id,\n };\n const body = {\n limit: request?.limit,\n next: request?.next,\n prev: request?.prev,\n watch: request?.watch,\n sort: request?.sort,\n filter: request?.filter,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<QueryFeedsResponse>\n >(\n 'POST',\n '/api/v2/feeds/feeds/query',\n undefined,\n queryParams,\n body,\n 'application/json',\n );\n\n decoders.QueryFeedsResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async updateFollow(\n request: UpdateFollowRequest,\n ): Promise<StreamResponse<UpdateFollowResponse>> {\n const body = {\n source: request?.source,\n target: request?.target,\n create_notification_activity: request?.create_notification_activity,\n follower_role: request?.follower_role,\n push_preference: request?.push_preference,\n skip_push: request?.skip_push,\n custom: request?.custom,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<UpdateFollowResponse>\n >(\n 'PATCH',\n '/api/v2/feeds/follows',\n undefined,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.UpdateFollowResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async follow(\n request: FollowRequest,\n ): Promise<StreamResponse<SingleFollowResponse>> {\n const body = {\n source: request?.source,\n target: request?.target,\n create_notification_activity: request?.create_notification_activity,\n push_preference: request?.push_preference,\n skip_push: request?.skip_push,\n custom: request?.custom,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<SingleFollowResponse>\n >(\n 'POST',\n '/api/v2/feeds/follows',\n undefined,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.SingleFollowResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async acceptFollow(\n request: AcceptFollowRequest,\n ): Promise<StreamResponse<AcceptFollowResponse>> {\n const body = {\n source: request?.source,\n target: request?.target,\n follower_role: request?.follower_role,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<AcceptFollowResponse>\n >(\n 'POST',\n '/api/v2/feeds/follows/accept',\n undefined,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.AcceptFollowResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async followBatch(\n request: FollowBatchRequest,\n ): Promise<StreamResponse<FollowBatchResponse>> {\n const body = {\n follows: request?.follows,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<FollowBatchResponse>\n >(\n 'POST',\n '/api/v2/feeds/follows/batch',\n undefined,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.FollowBatchResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async getOrCreateFollows(\n request: FollowBatchRequest,\n ): Promise<StreamResponse<FollowBatchResponse>> {\n const body = {\n follows: request?.follows,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<FollowBatchResponse>\n >(\n 'POST',\n '/api/v2/feeds/follows/batch/upsert',\n undefined,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.FollowBatchResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async queryFollows(\n request?: QueryFollowsRequest,\n ): Promise<StreamResponse<QueryFollowsResponse>> {\n const body = {\n limit: request?.limit,\n next: request?.next,\n prev: request?.prev,\n sort: request?.sort,\n filter: request?.filter,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<QueryFollowsResponse>\n >(\n 'POST',\n '/api/v2/feeds/follows/query',\n undefined,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.QueryFollowsResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async rejectFollow(\n request: RejectFollowRequest,\n ): Promise<StreamResponse<RejectFollowResponse>> {\n const body = {\n source: request?.source,\n target: request?.target,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<RejectFollowResponse>\n >(\n 'POST',\n '/api/v2/feeds/follows/reject',\n undefined,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.RejectFollowResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async unfollow(request: {\n source: string;\n target: string;\n delete_notification_activity?: boolean;\n }): Promise<StreamResponse<UnfollowResponse>> {\n const queryParams = {\n delete_notification_activity: request?.delete_notification_activity,\n };\n const pathParams = {\n source: request?.source,\n target: request?.target,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<UnfollowResponse>\n >(\n 'DELETE',\n '/api/v2/feeds/follows/{source}/{target}',\n pathParams,\n queryParams,\n );\n\n decoders.UnfollowResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async getOrCreateUnfollows(\n request: UnfollowBatchRequest,\n ): Promise<StreamResponse<UnfollowBatchResponse>> {\n const body = {\n follows: request?.follows,\n delete_notification_activity: request?.delete_notification_activity,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<UnfollowBatchResponse>\n >(\n 'POST',\n '/api/v2/feeds/unfollow/batch/upsert',\n undefined,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.UnfollowBatchResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async createGuest(\n request: CreateGuestRequest,\n ): Promise<StreamResponse<CreateGuestResponse>> {\n const body = {\n user: request?.user,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<CreateGuestResponse>\n >('POST', '/api/v2/guest', undefined, undefined, body, 'application/json');\n\n decoders.CreateGuestResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async longPoll(request?: {\n connection_id?: string;\n json?: WSAuthMessage;\n }): Promise<StreamResponse<{}>> {\n const queryParams = {\n connection_id: request?.connection_id,\n json: request?.json,\n };\n\n const response = await this.apiClient.sendRequest<StreamResponse<{}>>(\n 'GET',\n '/api/v2/longpoll',\n undefined,\n queryParams,\n );\n\n decoders['{}']?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async getOG(request: {\n url: string;\n }): Promise<StreamResponse<GetOGResponse>> {\n const queryParams = {\n url: request?.url,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<GetOGResponse>\n >('GET', '/api/v2/og', undefined, queryParams);\n\n decoders.GetOGResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async createPoll(\n request: CreatePollRequest,\n ): Promise<StreamResponse<PollResponse>> {\n const body = {\n name: request?.name,\n allow_answers: request?.allow_answers,\n allow_user_suggested_options: request?.allow_user_suggested_options,\n description: request?.description,\n enforce_unique_vote: request?.enforce_unique_vote,\n id: request?.id,\n is_closed: request?.is_closed,\n max_votes_allowed: request?.max_votes_allowed,\n voting_visibility: request?.voting_visibility,\n options: request?.options,\n custom: request?.custom,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<PollResponse>\n >('POST', '/api/v2/polls', undefined, undefined, body, 'application/json');\n\n decoders.PollResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async updatePoll(\n request: UpdatePollRequest,\n ): Promise<StreamResponse<PollResponse>> {\n const body = {\n id: request?.id,\n name: request?.name,\n allow_answers: request?.allow_answers,\n allow_user_suggested_options: request?.allow_user_suggested_options,\n description: request?.description,\n enforce_unique_vote: request?.enforce_unique_vote,\n is_closed: request?.is_closed,\n max_votes_allowed: request?.max_votes_allowed,\n voting_visibility: request?.voting_visibility,\n options: request?.options,\n custom: request?.custom,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<PollResponse>\n >('PUT', '/api/v2/polls', undefined, undefined, body, 'application/json');\n\n decoders.PollResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async queryPolls(\n request?: QueryPollsRequest & { user_id?: string },\n ): Promise<StreamResponse<QueryPollsResponse>> {\n const queryParams = {\n user_id: request?.user_id,\n };\n const body = {\n limit: request?.limit,\n next: request?.next,\n prev: request?.prev,\n sort: request?.sort,\n filter: request?.filter,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<QueryPollsResponse>\n >(\n 'POST',\n '/api/v2/polls/query',\n undefined,\n queryParams,\n body,\n 'application/json',\n );\n\n decoders.QueryPollsResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async deletePoll(request: {\n poll_id: string;\n user_id?: string;\n }): Promise<StreamResponse<Response>> {\n const queryParams = {\n user_id: request?.user_id,\n };\n const pathParams = {\n poll_id: request?.poll_id,\n };\n\n const response = await this.apiClient.sendRequest<StreamResponse<Response>>(\n 'DELETE',\n '/api/v2/polls/{poll_id}',\n pathParams,\n queryParams,\n );\n\n decoders.Response?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async getPoll(request: {\n poll_id: string;\n user_id?: string;\n }): Promise<StreamResponse<PollResponse>> {\n const queryParams = {\n user_id: request?.user_id,\n };\n const pathParams = {\n poll_id: request?.poll_id,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<PollResponse>\n >('GET', '/api/v2/polls/{poll_id}', pathParams, queryParams);\n\n decoders.PollResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async updatePollPartial(\n request: UpdatePollPartialRequest & { poll_id: string },\n ): Promise<StreamResponse<PollResponse>> {\n const pathParams = {\n poll_id: request?.poll_id,\n };\n const body = {\n unset: request?.unset,\n set: request?.set,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<PollResponse>\n >(\n 'PATCH',\n '/api/v2/polls/{poll_id}',\n pathParams,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.PollResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async createPollOption(\n request: CreatePollOptionRequest & { poll_id: string },\n ): Promise<StreamResponse<PollOptionResponse>> {\n const pathParams = {\n poll_id: request?.poll_id,\n };\n const body = {\n text: request?.text,\n custom: request?.custom,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<PollOptionResponse>\n >(\n 'POST',\n '/api/v2/polls/{poll_id}/options',\n pathParams,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.PollOptionResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async updatePollOption(\n request: UpdatePollOptionRequest & { poll_id: string },\n ): Promise<StreamResponse<PollOptionResponse>> {\n const pathParams = {\n poll_id: request?.poll_id,\n };\n const body = {\n id: request?.id,\n text: request?.text,\n custom: request?.custom,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<PollOptionResponse>\n >(\n 'PUT',\n '/api/v2/polls/{poll_id}/options',\n pathParams,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.PollOptionResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async deletePollOption(request: {\n poll_id: string;\n option_id: string;\n user_id?: string;\n }): Promise<StreamResponse<Response>> {\n const queryParams = {\n user_id: request?.user_id,\n };\n const pathParams = {\n poll_id: request?.poll_id,\n option_id: request?.option_id,\n };\n\n const response = await this.apiClient.sendRequest<StreamResponse<Response>>(\n 'DELETE',\n '/api/v2/polls/{poll_id}/options/{option_id}',\n pathParams,\n queryParams,\n );\n\n decoders.Response?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async getPollOption(request: {\n poll_id: string;\n option_id: string;\n user_id?: string;\n }): Promise<StreamResponse<PollOptionResponse>> {\n const queryParams = {\n user_id: request?.user_id,\n };\n const pathParams = {\n poll_id: request?.poll_id,\n option_id: request?.option_id,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<PollOptionResponse>\n >(\n 'GET',\n '/api/v2/polls/{poll_id}/options/{option_id}',\n pathParams,\n queryParams,\n );\n\n decoders.PollOptionResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async queryPollVotes(\n request: QueryPollVotesRequest & { poll_id: string; user_id?: string },\n ): Promise<StreamResponse<PollVotesResponse>> {\n const queryParams = {\n user_id: request?.user_id,\n };\n const pathParams = {\n poll_id: request?.poll_id,\n };\n const body = {\n limit: request?.limit,\n next: request?.next,\n prev: request?.prev,\n sort: request?.sort,\n filter: request?.filter,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<PollVotesResponse>\n >(\n 'POST',\n '/api/v2/polls/{poll_id}/votes',\n pathParams,\n queryParams,\n body,\n 'application/json',\n );\n\n decoders.PollVotesResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async updatePushNotificationPreferences(\n request: UpsertPushPreferencesRequest,\n ): Promise<StreamResponse<UpsertPushPreferencesResponse>> {\n const body = {\n preferences: request?.preferences,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<UpsertPushPreferencesResponse>\n >(\n 'POST',\n '/api/v2/push_preferences',\n undefined,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.UpsertPushPreferencesResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async deleteFile(request?: {\n url?: string;\n }): Promise<StreamResponse<Response>> {\n const queryParams = {\n url: request?.url,\n };\n\n const response = await this.apiClient.sendRequest<StreamResponse<Response>>(\n 'DELETE',\n '/api/v2/uploads/file',\n undefined,\n queryParams,\n );\n\n decoders.Response?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async uploadFile(\n request?: FileUploadRequest,\n ): Promise<StreamResponse<FileUploadResponse>> {\n const body = {\n file: request?.file,\n user: request?.user,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<FileUploadResponse>\n >(\n 'POST',\n '/api/v2/uploads/file',\n undefined,\n undefined,\n body,\n 'multipart/form-data',\n );\n\n decoders.FileUploadResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async deleteImage(request?: {\n url?: string;\n }): Promise<StreamResponse<Response>> {\n const queryParams = {\n url: request?.url,\n };\n\n const response = await this.apiClient.sendRequest<StreamResponse<Response>>(\n 'DELETE',\n '/api/v2/uploads/image',\n undefined,\n queryParams,\n );\n\n decoders.Response?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async uploadImage(\n request?: ImageUploadRequest,\n ): Promise<StreamResponse<ImageUploadResponse>> {\n const body = {\n file: request?.file,\n upload_sizes: request?.upload_sizes,\n user: request?.user,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<ImageUploadResponse>\n >(\n 'POST',\n '/api/v2/uploads/image',\n undefined,\n undefined,\n body,\n 'multipart/form-data',\n );\n\n decoders.ImageUploadResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async queryUsers(request?: {\n payload?: QueryUsersPayload;\n }): Promise<StreamResponse<QueryUsersResponse>> {\n const queryParams = {\n payload: request?.payload,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<QueryUsersResponse>\n >('GET', '/api/v2/users', undefined, queryParams);\n\n decoders.QueryUsersResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async updateUsersPartial(\n request: UpdateUsersPartialRequest,\n ): Promise<StreamResponse<UpdateUsersResponse>> {\n const body = {\n users: request?.users,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<UpdateUsersResponse>\n >('PATCH', '/api/v2/users', undefined, undefined, body, 'application/json');\n\n decoders.UpdateUsersResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async updateUsers(\n request: UpdateUsersRequest,\n ): Promise<StreamResponse<UpdateUsersResponse>> {\n const body = {\n users: request?.users,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<UpdateUsersResponse>\n >('POST', '/api/v2/users', undefined, undefined, body, 'application/json');\n\n decoders.UpdateUsersResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async getBlockedUsers(): Promise<StreamResponse<GetBlockedUsersResponse>> {\n const response = await this.apiClient.sendRequest<\n StreamResponse<GetBlockedUsersResponse>\n >('GET', '/api/v2/users/block', undefined, undefined);\n\n decoders.GetBlockedUsersResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async blockUsers(\n request: BlockUsersRequest,\n ): Promise<StreamResponse<BlockUsersResponse>> {\n const body = {\n blocked_user_id: request?.blocked_user_id,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<BlockUsersResponse>\n >(\n 'POST',\n '/api/v2/users/block',\n undefined,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.BlockUsersResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async getUserLiveLocations(): Promise<\n StreamResponse<SharedLocationsResponse>\n > {\n const response = await this.apiClient.sendRequest<\n StreamResponse<SharedLocationsResponse>\n >('GET', '/api/v2/users/live_locations', undefined, undefined);\n\n decoders.SharedLocationsResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async updateLiveLocation(\n request: UpdateLiveLocationRequest,\n ): Promise<StreamResponse<SharedLocationResponse>> {\n const body = {\n message_id: request?.message_id,\n end_at: request?.end_at,\n latitude: request?.latitude,\n longitude: request?.longitude,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<SharedLocationResponse>\n >(\n 'PUT',\n '/api/v2/users/live_locations',\n undefined,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.SharedLocationResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async unblockUsers(\n request: UnblockUsersRequest,\n ): Promise<StreamResponse<UnblockUsersResponse>> {\n const body = {\n blocked_user_id: request?.blocked_user_id,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<UnblockUsersResponse>\n >(\n 'POST',\n '/api/v2/users/unblock',\n undefined,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.UnblockUsersResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n}\n","import * as loggerInternal from '@stream-io/logger';\n\ntype AvailableScopes =\n | 'api-client'\n | 'event-dispatcher'\n | 'token-manager'\n | 'stable-ws-connection'\n | 'helpers';\n\nexport type ConfigureLoggersOptions =\n loggerInternal.ConfigureLoggersOptions<AvailableScopes>;\nexport type Logger = loggerInternal.Logger<AvailableScopes>;\n\nexport const feedsLoggerSystem =\n loggerInternal.createLoggerSystem<AvailableScopes>();\n\nexport type { LogLevel, Sink } from '@stream-io/logger';\nexport { LogLevelEnum } from '@stream-io/logger';\n","export const sleep = (m: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, m));\n\nexport function isFunction<T>(value: Function | T): value is Function {\n return (\n value &&\n (Object.prototype.toString.call(value) === '[object Function]' ||\n typeof value === 'function' ||\n value instanceof Function)\n );\n}\n\n/**\n * A map of known error codes.\n */\nexport const KnownCodes = {\n TOKEN_EXPIRED: 40,\n WS_CLOSED_SUCCESS: 1000,\n WS_CLOSED_ABRUPTLY: 1006,\n WS_POLICY_VIOLATION: 1008,\n};\n\n/**\n * retryInterval - A retry interval which increases acc to number of failures\n *\n * @return {number} Duration to wait in milliseconds\n */\nexport function retryInterval(numberOfFailures: number) {\n // try to reconnect in 0.25-5 seconds (random to spread out the load from failures)\n const max = Math.min(500 + numberOfFailures * 2000, 5000);\n const min = Math.min(Math.max(250, (numberOfFailures - 1) * 2000), 5000);\n return Math.floor(Math.random() * (max - min) + min);\n}\n\nexport function randomId() {\n return generateUUIDv4();\n}\n\n// https://tools.ietf.org/html/rfc4122\nexport function generateUUIDv4() {\n const bytes = getRandomBytes(16);\n bytes[6] = (bytes[6] & 0x0f) | 0x40; // version\n bytes[8] = (bytes[8] & 0xbf) | 0x80; // variant\n\n return (\n hex(bytes.subarray(0, 4)) +\n '-' +\n hex(bytes.subarray(4, 6)) +\n '-' +\n hex(bytes.subarray(6, 8)) +\n '-' +\n hex(bytes.subarray(8, 10)) +\n '-' +\n hex(bytes.subarray(10, 16))\n );\n}\n\nfunction hex(bytes: Uint8Array): string {\n let s = '';\n for (let i = 0; i < bytes.length; i++) {\n s += bytes[i].toString(16).padStart(2, '0');\n }\n return s;\n}\n\nfunction getRandomValuesWithMathRandom(bytes: Uint8Array): void {\n const max = Math.pow(2, (8 * bytes.byteLength) / bytes.length);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = Math.random() * max;\n }\n}\ndeclare const msCrypto: Crypto;\n\nconst getRandomValues = (() => {\n if (typeof crypto !== 'undefined' && typeof crypto?.getRandomValues !== 'undefined') {\n return crypto.getRandomValues.bind(crypto);\n } else if (typeof msCrypto !== 'undefined') {\n return msCrypto.getRandomValues.bind(msCrypto);\n } else {\n return getRandomValuesWithMathRandom;\n }\n})();\n\nfunction getRandomBytes(length: number): Uint8Array {\n const bytes = new Uint8Array(length);\n getRandomValues(bytes);\n return bytes;\n}\n\n/**\n * listenForConnectionChanges - Adds an event listener fired on browser going online or offline\n */\nexport function addConnectionEventListeners(cb: (e: Event) => void) {\n if (typeof window !== 'undefined' && window.addEventListener) {\n window.addEventListener('offline', cb);\n window.addEventListener('online', cb);\n }\n}\n\nexport function removeConnectionEventListeners(cb: (e: Event) => void) {\n if (typeof window !== 'undefined' && window.removeEventListener) {\n window.removeEventListener('offline', cb);\n window.removeEventListener('online', cb);\n }\n}\n\nexport const streamDevToken = (userId: string) => {\n return [\n 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9', // {\"alg\": \"HS256\", \"typ\": \"JWT\"}\n window.btoa(JSON.stringify({ user_id: userId })),\n 'devtoken', // hardcoded signature\n ].join('.');\n};\n\n\nexport interface DebouncedFunc<T extends (...args: any[]) => any> {\n /**\n * Call the original function, but applying the debounce rules.\n *\n * If the debounced function can be run immediately, this calls it and returns its return\n * value.\n *\n * Otherwise, it returns the return value of the last invocation, or undefined if the debounced\n * function was not invoked yet.\n */\n (...args: Parameters<T>): ReturnType<T> | undefined;\n\n /**\n * Throw away any pending invocation of the debounced function.\n */\n cancel(): void;\n\n /**\n * If there is a pending invocation of the debounced function, invoke it immediately and return\n * its return value.\n *\n * Otherwise, return the value from the last invocation, or undefined if the debounced function\n * was never invoked.\n */\n flush(): ReturnType<T> | undefined;\n}\n\nexport const debounce = <T extends (...args: any[]) => any>(\n fn: T,\n timeout = 0,\n {\n leading = false,\n trailing = true,\n }: { leading?: boolean; trailing?: boolean } = {},\n): DebouncedFunc<T> => {\n let runningTimeout: null | NodeJS.Timeout = null;\n let argsForTrailingExecution: Parameters<T> | null = null;\n let lastResult: ReturnType<T> | undefined;\n\n const debouncedFn = (...args: Parameters<T>) => {\n if (runningTimeout) {\n clearTimeout(runningTimeout);\n } else if (leading) {\n lastResult = fn(...args);\n }\n if (trailing) argsForTrailingExecution = args;\n\n const timeoutHandler = () => {\n if (argsForTrailingExecution) {\n lastResult = fn(...argsForTrailingExecution);\n argsForTrailingExecution = null;\n }\n runningTimeout = null;\n };\n\n runningTimeout = setTimeout(timeoutHandler, timeout);\n return lastResult;\n };\n\n debouncedFn.cancel = () => {\n if (runningTimeout) clearTimeout(runningTimeout);\n };\n\n debouncedFn.flush = () => {\n if (runningTimeout) {\n clearTimeout(runningTimeout);\n runningTimeout = null;\n if (argsForTrailingExecution) {\n lastResult = fn(...argsForTrailingExecution);\n }\n }\n return lastResult;\n };\n return debouncedFn;\n};\n\nexport const capitalize = <T extends string>(s: T) => {\n return `${s.charAt(0).toLocaleUpperCase()}${s.slice(1)}` as Capitalize<T>;\n};\n","import { feedsLoggerSystem } from '../utils/logger';\nimport { isFunction, sleep } from './utils';\n\n/**\n * TokenManager\n *\n * Handles all the operations around user token.\n */\nexport class TokenManager {\n loadTokenPromise: Promise<string> | null;\n type: 'static' | 'provider';\n token?: string;\n tokenProvider?: string | (() => Promise<string>);\n private _isAnonymous: boolean = false;\n private readonly logger = feedsLoggerSystem.getLogger('token-manager');\n\n constructor() {\n this.loadTokenPromise = null;\n\n this.type = 'static';\n }\n\n get isAnonymous() {\n return this._isAnonymous;\n }\n\n /**\n * Set the static string token or token provider.\n * Token provider should return a token string or a promise which resolves to string token.\n *\n * @param {TokenOrProvider} tokenOrProvider - the token or token provider. Providing `undefined` will set the token manager to anonymous mode.\n */\n setTokenOrProvider = (tokenOrProvider?: string | (() => Promise<string>)) => {\n if (tokenOrProvider === undefined) {\n this._isAnonymous = true;\n tokenOrProvider = '';\n } else {\n this._isAnonymous = false;\n }\n\n if (isFunction(tokenOrProvider)) {\n this.tokenProvider = tokenOrProvider;\n this.type = 'provider';\n }\n\n if (typeof tokenOrProvider === 'string') {\n this.token = tokenOrProvider;\n this.type = 'static';\n }\n };\n\n /**\n * Resets the token manager.\n * Useful for client disconnection or switching user.\n */\n reset = () => {\n this._isAnonymous = false;\n this.token = undefined;\n this.tokenProvider = undefined;\n this.loadTokenPromise = null;\n };\n\n // Fetches a token from tokenProvider function and sets in tokenManager.\n // In case of static token, it will simply resolve to static token.\n loadToken = () => {\n this.logger.info('Loading a new token');\n\n if (this.loadTokenPromise) {\n return this.loadTokenPromise;\n }\n\n this.loadTokenPromise = new Promise(async (resolve, reject) => {\n if (this.type === 'static') {\n this.loadTokenPromise = null;\n return resolve(this.token!);\n }\n\n if (this.tokenProvider && typeof this.tokenProvider !== 'string') {\n this.token = undefined;\n const tokenProvider = this.tokenProvider;\n const loadTokenWithRetries = async (previousFailuresCount = 0) => {\n try {\n this.token = await tokenProvider();\n } catch (e) {\n const numberOfFailures = ++previousFailuresCount;\n await sleep(1000);\n if (numberOfFailures === 3) {\n this.loadTokenPromise = null;\n return reject(\n new Error(\n `Stream error: tried to get token ${numberOfFailures} times, but it failed with ${e}. Check your token provider`,\n { cause: e },\n ),\n );\n } else {\n return await loadTokenWithRetries(numberOfFailures);\n }\n }\n this.loadTokenPromise = null;\n resolve(this.token);\n };\n return await loadTokenWithRetries();\n }\n });\n\n return this.loadTokenPromise;\n };\n\n // Returns the current token, or fetches in a new one if there is no current token\n getToken = () => {\n if (this._isAnonymous) {\n return '';\n }\n\n if (this.token) {\n return this.token;\n }\n\n if (this.tokenProvider) {\n if (this.loadTokenPromise) {\n return this.loadTokenPromise;\n } else {\n return this.loadToken();\n }\n }\n\n throw new Error(`Can't get token because token provider isn't set`);\n };\n\n isStatic = () => this.type === 'static';\n}\n","export class ConnectionIdManager {\n loadConnectionIdPromise: Promise<string | undefined> | undefined;\n connectionId?: string;\n private resolve?: (connectionId?: string) => void;\n private reject?: (reason: any) => void;\n\n reset = () => {\n this.loadConnectionIdPromise = undefined;\n this.resolve = undefined;\n this.reject = undefined;\n this.connectionId = undefined;\n };\n\n resetConnectionIdPromise = () => {\n this.connectionId = undefined;\n this.loadConnectionIdPromise = new Promise<string | undefined>(\n (resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n },\n );\n };\n\n resolveConnectionidPromise = (connectionId?: string) => {\n this.connectionId = connectionId;\n this.resolve?.(connectionId);\n this.loadConnectionIdPromise = undefined;\n this.resolve = undefined;\n this.reject = undefined;\n };\n\n rejectConnectionIdPromise = (reason: any) => {\n this.connectionId = undefined;\n this.reject?.(reason);\n this.loadConnectionIdPromise = undefined;\n this.resolve = undefined;\n this.reject = undefined;\n };\n\n getConnectionId = () => {\n if (this.connectionId) {\n return this.connectionId;\n }\n\n if (this.loadConnectionIdPromise) {\n return this.loadConnectionIdPromise;\n }\n\n throw new Error(\n `No connection id was provided when trying to query with presence/watch. You should call \"connectUser\" to get a WebSocket connection id`,\n );\n };\n}\n","import type { FeedsEvent } from '../types';\nimport { feedsLoggerSystem } from '../utils/logger';\n\nexport class EventDispatcher<\n Type extends string = FeedsEvent['type'],\n Event extends { type: string } = FeedsEvent,\n> {\n private subscribers: Partial<\n Record<Type | 'all', Array<(event: Event) => void> | undefined>\n > = {};\n\n private readonly logger = feedsLoggerSystem.getLogger('event-dispatcher');\n\n dispatch = (event: Event) => {\n const listeners = [\n ...(this.subscribers[event.type as Type] ?? []),\n ...(this.subscribers.all ?? []),\n ];\n for (const fn of listeners) {\n try {\n fn(event);\n } catch (e) {\n // TODO: do we really want to silence this error?\n this.logger.error('Listener failed with error', e);\n }\n }\n };\n\n on = (eventName: Type | 'all', handler: (event: Event) => void) => {\n (this.subscribers[eventName] ??= []).push(handler);\n return () => {\n this.off(eventName, handler);\n };\n };\n\n off = (eventName: Type | 'all', handler: (event: Event) => void) => {\n this.subscribers[eventName] = (this.subscribers[eventName] ?? []).filter(\n (f) => f !== handler,\n );\n };\n\n offAll = (eventName?: Type | 'all') => {\n if (eventName) {\n this.subscribers[eventName] = [];\n } else {\n this.subscribers = {};\n }\n };\n}\n","import {\n addConnectionEventListeners,\n KnownCodes,\n randomId,\n removeConnectionEventListeners,\n retryInterval,\n sleep,\n} from '../utils';\nimport type { UserRequest } from '../../gen/models';\nimport type { TokenManager } from '../TokenManager';\nimport { EventDispatcher } from '../EventDispatcher';\nimport type { ConnectionIdManager } from '../ConnectionIdManager';\nimport type { ConnectedEvent } from './event-models';\nimport { feedsLoggerSystem } from '../../utils/logger';\n\n// Type guards to check WebSocket error type\nconst isCloseEvent = (\n res: CloseEvent | Event | ErrorEvent,\n): res is CloseEvent => (res as CloseEvent).code !== undefined;\n\nconst isErrorEvent = (\n res: CloseEvent | Event | ErrorEvent,\n): res is ErrorEvent => (res as ErrorEvent).error !== undefined;\n\nconst isWSError = (error: WSError | any): error is WSError =>\n typeof error.isWSFailure !== 'undefined' ||\n typeof error.code !== 'undefined' ||\n typeof error.StatusCode !== 'undefined';\n\nexport type WSConfig = {\n baseUrl: string;\n user: UserRequest;\n};\n\ntype WSError = Error & {\n code?: string | number;\n isWSFailure?: boolean;\n StatusCode?: string | number;\n};\n\n/**\n * StableWSConnection - A WS connection that reconnects upon failure.\n * - the browser will sometimes report that you're online or offline\n * - the WS connection can break and fail (there is a 30s health check)\n * - sometimes your WS connection will seem to work while the user is in fact offline\n * - to speed up online/offline detection you can use the window.addEventListener('offline');\n *\n * There are 4 ways in which a connection can become unhealthy:\n * - websocket.onerror is called\n * - websocket.onclose is called\n * - the health check fails and no event is received for ~40 seconds\n * - the browser indicates the connection is now offline\n *\n * There are 2 assumptions we make about the server:\n * - state can be recovered by querying the channel again\n * - if the servers fails to publish a message to the client, the WS connection is destroyed\n */\nexport class StableWSConnection {\n // local vars\n connectionID?: string;\n connectionOpen?: Promise<ConnectedEvent>;\n authenticationSent: boolean;\n consecutiveFailures: number;\n pingInterval: number;\n healthCheckTimeoutRef?: NodeJS.Timeout;\n isConnecting: boolean;\n isDisconnected: boolean;\n isHealthy: boolean;\n isResolved?: boolean;\n lastEvent: Date | null;\n connectionCheckTimeout: number;\n connectionCheckTimeoutRef?: NodeJS.Timeout;\n rejectPromise?: (reason?: WSError) => void;\n requestID: string | undefined;\n resolvePromise?: (value: ConnectedEvent) => void;\n totalFailures: number;\n ws?: WebSocket;\n wsID: number;\n private readonly dispatcher = new EventDispatcher();\n private readonly clientId: string;\n private readonly logger = feedsLoggerSystem.getLogger('stable-ws-connection');\n\n constructor(\n private readonly config: WSConfig,\n private readonly tokenManager: TokenManager,\n private readonly connectionIdManager: ConnectionIdManager,\n private readonly decoders: Array<(event: any) => any> = [],\n ) {\n /** consecutive failures influence the duration of the timeout */\n this.consecutiveFailures = 0;\n /** keep track of the total number of failures */\n this.totalFailures = 0;\n /** We only make 1 attempt to reconnect at the same time.. */\n this.isConnecting = false;\n /** True after the auth payload is sent to the server */\n this.authenticationSent = false;\n /** To avoid reconnect if client is disconnected */\n this.isDisconnected = false;\n /** Boolean that indicates if the connection promise is resolved */\n this.isResolved = false;\n /** Boolean that indicates if we have a working connection to the server */\n this.isHealthy = false;\n /** Incremented when a new WS connection is made */\n this.wsID = 1;\n /** Store the last event time for health checks */\n this.lastEvent = null;\n /** Send a health check message every 25 seconds */\n this.pingInterval = 25 * 1000;\n this.connectionCheckTimeout = this.pingInterval + 10 * 1000;\n this.clientId = `${config.user.id}-${randomId()}`;\n\n addConnectionEventListeners(this.onlineStatusChanged);\n }\n\n on = this.dispatcher.on;\n off = this.dispatcher.off;\n offAll = this.dispatcher.offAll;\n\n /**\n * connect - Connect to the WS URL\n * the default 15s timeout allows between 2~3 tries\n * @return {ConnectAPIResponse<ConnectedEvent>} Promise that completes once the first health check message is received\n */\n async connect(timeout = 15000) {\n const logger = this.logger.withExtraTags('connect');\n if (this.isConnecting) {\n throw Error(\n `You've called connect twice, can only attempt 1 connection at the time`,\n );\n }\n\n this.isDisconnected = false;\n\n if (!this.connectionIdManager.loadConnectionIdPromise) {\n this.connectionIdManager.resetConnectionIdPromise();\n }\n\n try {\n const healthCheck = await this._connect();\n this.consecutiveFailures = 0;\n\n logger.debug(`Established ws connection with healthcheck`, healthCheck);\n } catch (error) {\n this.isHealthy = false;\n this.consecutiveFailures += 1;\n\n if (isWSError(error)) {\n if (\n error.code === KnownCodes.TOKEN_EXPIRED &&\n !this.tokenManager.isStatic()\n ) {\n logger.debug(\n 'WS failure due to expired token, so going to try to reload token and reconnect',\n );\n void this._reconnect({ refreshToken: true });\n } else {\n if (!error.isWSFailure) {\n // API rejected the connection and we should not retry\n throw new Error(\n JSON.stringify({\n code: error.code,\n StatusCode: error.StatusCode,\n message: error.message,\n isWSFailure: error.isWSFailure,\n }),\n );\n }\n }\n } else {\n throw error;\n }\n }\n\n return await this._waitForHealthy(timeout);\n }\n\n /**\n * _waitForHealthy polls the promise connection to see if its resolved until it times out\n * the default 15s timeout allows between 2~3 tries\n * @param timeout duration(ms)\n */\n async _waitForHealthy(timeout = 15000) {\n return await Promise.race([\n (async () => {\n const interval = 50; // ms\n for (let i = 0; i <= timeout; i += interval) {\n try {\n return await this.connectionOpen;\n } catch (error: any) {\n if (i === timeout) {\n throw new Error(\n JSON.stringify({\n code: error.code,\n StatusCode: error.StatusCode,\n message: error.message,\n isWSFailure: error.isWSFailure,\n }),\n );\n }\n await sleep(interval);\n }\n }\n })(),\n (async () => {\n await sleep(timeout);\n this.isConnecting = false;\n throw new Error(\n JSON.stringify({\n code: '',\n StatusCode: '',\n message: 'initial WS connection could not be established',\n isWSFailure: true,\n }),\n );\n })(),\n ]);\n }\n\n /**\n * disconnect - Disconnect the connection and doesn't recover...\n *\n */\n disconnect(timeout?: number) {\n const logger = this.logger.withExtraTags('disconnect');\n logger.debug(`Closing the WS connection for wsID ${this.wsID}`);\n\n this.wsID += 1;\n this.isConnecting = false;\n this.isDisconnected = true;\n\n // start by removing all the listeners\n if (this.healthCheckTimeoutRef) {\n clearInterval(this.healthCheckTimeoutRef);\n }\n if (this.connectionCheckTimeoutRef) {\n clearInterval(this.connectionCheckTimeoutRef);\n }\n\n removeConnectionEventListeners(this.onlineStatusChanged);\n\n this.isHealthy = false;\n\n // remove ws handlers...\n if (this.ws) {\n this.ws.onclose = () => {};\n this.ws.onerror = () => {};\n this.ws.onmessage = () => {};\n }\n\n let isClosedPromise: Promise<void>;\n // and finally close...\n // Assigning to local here because we will remove it from this before the\n // promise resolves.\n const { ws } = this;\n if (ws?.close && ws.readyState === ws.OPEN) {\n isClosedPromise = new Promise((resolve) => {\n const onclose = (event: CloseEvent) => {\n logger.debug(\n `resolving isClosedPromise ${\n event ? 'with' : 'without'\n } close frame`,\n { event },\n );\n resolve();\n };\n\n ws.onclose = onclose;\n // In case we don't receive close frame websocket server in time,\n // lets not wait for more than 1 second.\n setTimeout(onclose, timeout ?? 1000);\n });\n\n logger.debug(`Manually closed connection by calling client.disconnect()`);\n\n ws.close(\n KnownCodes.WS_CLOSED_SUCCESS,\n 'Manually closed connection by calling client.disconnect()',\n );\n } else {\n logger.debug(`WS connection doesn't exist or it is already closed.`);\n isClosedPromise = Promise.resolve();\n }\n\n delete this.ws;\n\n return isClosedPromise;\n }\n\n /**\n * _connect - Connect to the WS endpoint\n *\n * @return {ConnectAPIResponse<ConnectedEvent>} Promise that completes once the first health check message is received\n */\n async _connect() {\n const logger = this.logger.withExtraTags('_connect');\n if (this.isConnecting) return; // simply ignore _connect if it's currently trying to connect\n this.isConnecting = true;\n this.requestID = randomId();\n let isTokenReady = false;\n try {\n logger.debug(`waiting for token`);\n await this.tokenManager.getToken();\n isTokenReady = true;\n } catch (_) {\n // token provider has failed before, so try again\n }\n\n try {\n if (!isTokenReady) {\n logger.debug(`tokenProvider failed before, so going to retry`);\n await this.tokenManager.loadToken();\n }\n\n this._setupConnectionPromise();\n const wsURL = this.config.baseUrl;\n logger.debug(`Connecting to ${wsURL}`, {\n wsURL,\n requestID: this.requestID,\n });\n this.ws = new WebSocket(wsURL);\n this.ws.onopen = this.onopen.bind(this, this.wsID);\n this.ws.onclose = this.onclose.bind(this, this.wsID);\n this.ws.onerror = this.onerror.bind(this, this.wsID);\n this.ws.onmessage = this.onmessage.bind(this, this.wsID);\n const response = await this.connectionOpen;\n this.isConnecting = false;\n\n if (response) {\n return response;\n }\n } catch (err) {\n this.isConnecting = false;\n throw err;\n }\n }\n\n /**\n * _reconnect - Retry the connection to WS endpoint\n *\n * @param {{ interval?: number; refreshToken?: boolean }} options Following options are available\n *\n * - `interval`\t{int}\t\t\tnumber of ms that function should wait before reconnecting\n * - `refreshToken` {boolean}\treload/refresh user token be refreshed before attempting reconnection.\n */\n async _reconnect(\n options: { interval?: number; refreshToken?: boolean } = {},\n ): Promise<void> {\n const logger = this.logger.withExtraTags('_reconnect');\n\n logger.debug('Initiating the reconnect');\n\n // only allow 1 connection at the time\n if (this.isConnecting || this.isHealthy) {\n logger.debug('Abort (1) since already connecting or healthy');\n return;\n }\n\n // reconnect in case of on error or on close\n // also reconnect if the health check cycle fails\n let interval = options.interval;\n if (!interval) {\n interval = retryInterval(this.consecutiveFailures);\n }\n // reconnect, or try again after a little while...\n await sleep(interval);\n\n // Check once again if by some other call to _reconnect is active or connection is\n // already restored, then no need to proceed.\n if (this.isConnecting || this.isHealthy) {\n logger.debug('Abort (2) since already connecting or healthy');\n return;\n }\n\n if (this.isDisconnected) {\n logger.debug('Abort (3) since disconnect() is called');\n return;\n }\n\n logger.debug('Destroying current WS connection');\n\n // cleanup the old connection\n this._destroyCurrentWSConnection();\n\n if (options.refreshToken) {\n await this.tokenManager.loadToken();\n }\n\n try {\n await this._connect();\n // logger.debug('Waiting for recoverCallBack');\n // await this.client.recoverState();\n // logger.debug('Finished recoverCallBack');\n\n this.consecutiveFailures = 0;\n } catch (error: any) {\n this.isHealthy = false;\n this.consecutiveFailures += 1;\n if (\n error.code === KnownCodes.TOKEN_EXPIRED &&\n !this.tokenManager.isStatic()\n ) {\n logger.debug(\n 'WS failure due to expired token, so going to try to reload token and reconnect',\n );\n\n return await this._reconnect({ refreshToken: true });\n }\n\n // reconnect on WS failures, don't reconnect if there is a code bug\n if (error.isWSFailure) {\n logger.debug('WS failure, so going to try to reconnect');\n\n void this._reconnect();\n }\n }\n logger.debug('== END ==');\n }\n\n /**\n * onlineStatusChanged - this function is called when the browser connects or disconnects from the internet.\n *\n * @param {Event} event Event with type online or offline\n *\n */\n onlineStatusChanged = (event: Event) => {\n const logger = this.logger.withExtraTags('onlineStatusChanged');\n\n if (event.type === 'offline') {\n // mark the connection as down\n logger.debug('Status changing to offline');\n // we know that the app is offline so dispatch the unhealthy connection event immediately\n this._setHealth(false, true);\n } else if (event.type === 'online') {\n // retry right now...\n // We check this.isHealthy, not sure if it's always\n // smart to create a new WS connection if the old one is still up and running.\n // it's possible we didn't miss any messages, so this process is just expensive and not needed.\n logger.debug(`Status changing to online. isHealthy: ${this.isHealthy}`);\n if (!this.isHealthy) {\n void this._reconnect({ interval: 10 });\n }\n }\n };\n\n onopen = async (wsID: number) => {\n const logger = this.logger.withExtraTags('onopen');\n\n if (this.wsID !== wsID) return;\n\n const user = this.config.user;\n if (!user) {\n logger.warn(`User not set, can't connect to WS`);\n return;\n }\n\n const token = await this.tokenManager.getToken();\n if (!token && !this.tokenManager.isAnonymous) {\n logger.warn(`Token not set, can't connect authenticate`);\n return;\n }\n\n const authMessage = {\n token,\n user_details: {\n id: user.id,\n name: user.name,\n image: user.image,\n custom: user.custom,\n },\n products: ['feeds'],\n };\n\n this.authenticationSent = true;\n this.ws?.send(JSON.stringify(authMessage));\n logger.debug('onopen callback', { wsID });\n };\n\n onmessage = (wsID: number, event: MessageEvent) => {\n const logger = this.logger.withExtraTags('onmessage');\n\n if (this.wsID !== wsID) return;\n\n logger.debug('onmessage callback', {\n event: { ...event, data: JSON.parse(event.data) },\n wsID,\n });\n let data = typeof event.data === 'string' ? JSON.parse(event.data) : null;\n this.decoders.forEach((decode) => {\n data = decode(data);\n });\n\n // we wait till the first message before we consider the connection open.\n // the reason for this is that auth errors and similar errors trigger a ws.onopen and immediately\n // after that a ws.onclose.\n if (!this.isResolved && data && data.type === 'connection.error') {\n this.isResolved = true;\n if (data.error) {\n this.rejectPromise?.(this._errorFromWSEvent(data, false));\n return;\n }\n }\n\n // trigger the event..\n this.lastEvent = new Date();\n\n if (\n data &&\n (data.type === 'health.check' || data.type === 'connection.ok')\n ) {\n // the initial health-check should come from the client\n this.scheduleNextPing();\n }\n\n if (data && data.type === 'connection.ok') {\n this.resolvePromise?.(data);\n this.connectionID = (data as ConnectedEvent).connection_id;\n this._setHealth(true);\n }\n\n if (data && data.type === 'connection.error' && data.error) {\n const { code } = data.error;\n this.isHealthy = false;\n this.isConnecting = false;\n this.consecutiveFailures += 1;\n if (code === KnownCodes.TOKEN_EXPIRED && !this.tokenManager.isStatic()) {\n clearTimeout(this.connectionCheckTimeoutRef);\n logger.debug(\n 'WS failure due to expired token, so going to try to reload token and reconnect',\n );\n void this._reconnect({ refreshToken: true });\n }\n }\n\n if (data) {\n data.received_at = new Date();\n this.dispatcher.dispatch(data);\n }\n this.scheduleConnectionCheck();\n };\n\n onclose = (wsID: number, event: CloseEvent) => {\n const logger = this.logger.withExtraTags('onclose');\n\n if (this.wsID !== wsID) return;\n\n logger.debug('onclose callback - ' + event.code, {\n event,\n wsID,\n });\n\n if (event.code === KnownCodes.WS_CLOSED_SUCCESS) {\n // this is a permanent error raised by stream..\n // usually caused by invalid auth details\n this.rejectPromise?.(this._errorFromWSEvent(event));\n logger.debug(`WS connection reject with error ${event.reason}`, {\n event,\n });\n } else {\n this.consecutiveFailures += 1;\n this.totalFailures += 1;\n this._setHealth(false);\n this.isConnecting = false;\n\n this.rejectPromise?.(this._errorFromWSEvent(event));\n\n logger.debug(`WS connection closed. Calling reconnect ...`, {\n event,\n });\n\n // reconnect if its an abnormal failure\n void this._reconnect();\n }\n };\n\n onerror = (wsID: number, event: Event) => {\n if (this.wsID !== wsID) return;\n\n this.consecutiveFailures += 1;\n this.totalFailures += 1;\n this._setHealth(false);\n this.isConnecting = false;\n this.rejectPromise?.(this._errorFromWSEvent(event));\n this.logger\n .withExtraTags('onerror')\n .debug(`WS connection resulted into error`, {\n event,\n });\n\n void this._reconnect();\n };\n\n /**\n * _setHealth - Sets the connection to healthy or unhealthy.\n * Broadcasts an event in case the connection status changed.\n *\n * @param {boolean} healthy boolean indicating if the connection is healthy or not\n * @param {boolean} dispatchImmediately boolean indicating to dispatch event immediately even if the connection is unhealthy\n *\n */\n _setHealth = (healthy: boolean, dispatchImmediately = false) => {\n if (healthy === this.isHealthy) return;\n\n this.isHealthy = healthy;\n\n if (this.isHealthy || dispatchImmediately) {\n this.dispatchConnectionChanged();\n return;\n }\n\n // we're offline, wait few seconds and fire and event if still offline\n setTimeout(() => {\n if (this.isHealthy) return;\n this.dispatchConnectionChanged();\n }, 5000);\n };\n\n dispatchConnectionChanged = () => {\n if (this.isHealthy) {\n if (this.connectionID) {\n this.connectionIdManager?.resolveConnectionidPromise(this.connectionID);\n } else {\n throw new Error(\n `Stream error: WebSocket connection is healthy, but connection id isn't set`,\n );\n }\n } else {\n if (this.connectionIdManager.loadConnectionIdPromise) {\n this.connectionIdManager.rejectConnectionIdPromise(\n new Error(\n `Stream error: Failed to get WebSocket connection id because WebSocket connection failed`,\n ),\n );\n }\n this.connectionIdManager.reset();\n }\n this.dispatcher.dispatch({\n type: 'connection.changed',\n online: this.isHealthy,\n });\n };\n\n /**\n * _errorFromWSEvent - Creates an error object for the WS event\n *\n */\n _errorFromWSEvent = (\n event: CloseEvent | Event | ErrorEvent,\n isWSFailure = true,\n ): WSError => {\n let code;\n let statusCode;\n let message;\n if (isCloseEvent(event)) {\n code = event.code;\n statusCode = 'unknown';\n message = event.reason;\n }\n\n if (isErrorEvent(event)) {\n code = event.error.code;\n statusCode = event.error.StatusCode;\n message = event.error.message;\n }\n\n // Keeping this `warn` level log, to avoid cluttering of error logs from ws failures.\n this.logger\n .withExtraTags('_errorFromWSEvent')\n .debug(`WS failed with code ${code}`, {\n event,\n });\n\n const error = new Error(\n `WS failed with code ${code} and reason - ${message}`,\n ) as Error & {\n code?: string | number;\n isWSFailure?: boolean;\n StatusCode?: string | number;\n };\n error.code = code;\n /**\n * StatusCode does not exist on any event types but has been left\n * as is to preserve JS functionality during the TS implementation\n */\n error.StatusCode = statusCode;\n error.isWSFailure = isWSFailure;\n return error;\n };\n\n /**\n * _destroyCurrentWSConnection - Removes the current WS connection\n *\n */\n _destroyCurrentWSConnection() {\n // increment the ID, meaning we will ignore all messages from the old\n // ws connection from now on.\n this.wsID += 1;\n\n try {\n if (this.ws) {\n this.ws.onclose = () => {};\n this.ws.onerror = () => {};\n this.ws.onmessage = () => {};\n this.ws.onopen = () => {};\n this.ws.close();\n }\n } catch (_) {\n // we don't care\n }\n }\n\n /**\n * _setupPromise - sets up the this.connectOpen promise\n */\n _setupConnectionPromise = () => {\n this.isResolved = false;\n /** a promise that is resolved once ws.open is called */\n this.connectionOpen = new Promise<ConnectedEvent>((resolve, reject) => {\n this.resolvePromise = resolve;\n this.rejectPromise = reject;\n });\n };\n\n /**\n * Schedules a next health check ping for websocket.\n */\n scheduleNextPing = () => {\n if (this.healthCheckTimeoutRef) {\n clearTimeout(this.healthCheckTimeoutRef);\n }\n\n // 30 seconds is the recommended interval (messenger uses this)\n this.healthCheckTimeoutRef = setTimeout(() => {\n // send the healthcheck..., server replies with a health check event\n const data = [{ type: 'health.check', client_id: this.clientId }];\n // try to send on the connection\n try {\n this.ws?.send(JSON.stringify(data));\n } catch (_) {\n // error will already be detected elsewhere\n }\n }, this.pingInterval);\n };\n\n /**\n * scheduleConnectionCheck - schedules a check for time difference between last received event and now.\n * If the difference is more than 35 seconds, it means our health check logic has failed and websocket needs\n * to be reconnected.\n */\n scheduleConnectionCheck = () => {\n if (this.connectionCheckTimeoutRef) {\n clearTimeout(this.connectionCheckTimeoutRef);\n }\n\n this.connectionCheckTimeoutRef = setTimeout(() => {\n const now = new Date();\n if (\n this.lastEvent &&\n now.getTime() - this.lastEvent.getTime() > this.connectionCheckTimeout\n ) {\n this.logger\n .withExtraTags('scheduleConnectionCheck')\n .debug('going to reconnect');\n this._setHealth(false);\n void this._reconnect();\n }\n }, this.connectionCheckTimeout);\n };\n}\n","import type { ConfigureLoggersOptions } from '../utils/logger';\n\nexport * from './search/types';\n\nexport type FeedsClientOptions = {\n base_url?: string;\n timeout?: number;\n configure_loggers_options?: ConfigureLoggersOptions;\n query_batch_own_fields_throttling_interval?: number;\n};\n\nexport type RateLimit = {\n rate_limit?: number;\n rate_limit_remaining?: number;\n rate_limit_reset?: Date;\n};\n\nexport type RequestMetadata = {\n response_headers: Record<string, string>;\n rate_limit: RateLimit;\n response_code: number;\n client_request_id: string;\n};\n\nexport type StreamResponse<T> = T & {\n metadata: RequestMetadata;\n};\n\nexport class StreamApiError extends Error {\n public name = 'StreamApiError';\n constructor(\n message: string,\n public metadata?: Partial<RequestMetadata>,\n public code?: number,\n errorOptions?: ErrorOptions,\n ) {\n super(message, errorOptions);\n }\n}\n\nexport interface NetworkChangedEvent {\n type: 'network.changed';\n online: boolean;\n}\n","import type { RateLimit } from './types';\n\nexport const getRateLimitFromResponseHeader = (\n response_headers: Record<string, string>,\n) => {\n const rate_limit = response_headers['x-ratelimit-limit']\n ? +response_headers['x-ratelimit-limit']!\n : undefined;\n const rate_limit_remaining = response_headers['x-ratelimit-remaining']\n ? +response_headers['x-ratelimit-remaining']!\n : undefined;\n const rate_limit_reset = response_headers['x-ratelimit-reset']\n ? new Date(+response_headers['x-ratelimit-reset']! * 1000)\n : undefined;\n\n const result: RateLimit = {\n rate_limit,\n rate_limit_remaining,\n rate_limit_reset,\n };\n\n return result;\n};\n","import type {\n AxiosError,\n AxiosInstance,\n AxiosResponse,\n RawAxiosRequestHeaders,\n} from 'axios';\nimport axiosImport from 'axios';\n// @ts-expect-error This is needed in the event of the CJS variant being hit\n// from the React Native SDK, to prevent the default `require` from being\n// accessed directly from `require('axios')` rather than `require('axios').default`.\nconst axios = axiosImport.default ?? axiosImport;\nimport type { RequestMetadata, FeedsClientOptions } from './types';\nimport { StreamApiError } from './types';\nimport { getRateLimitFromResponseHeader } from './rate-limit';\nimport { KnownCodes, randomId } from './utils';\nimport type { TokenManager } from './TokenManager';\nimport type { ConnectionIdManager } from './ConnectionIdManager';\nimport { feedsLoggerSystem } from '../utils/logger';\n// this gets replaced during the build process (var version = 'x.y.z';)\nimport { version } from '../../package.json';\n\ntype RequiredAtLeastOne<T> = {\n [K in keyof T]: Required<Pick<T, K>> & Partial<Omit<T, K>>;\n}[keyof T];\n\n// Information that can be set to be sent as part of the header of each request\nexport type ExtraHeaderInformation = Partial<{\n sdkIdentifier: { name: string; version: string };\n deviceIdentifier: RequiredAtLeastOne<{ os: string; model: string }>;\n}>;\n\nexport class ApiClient {\n public readonly baseUrl: string;\n private readonly axiosInstance: AxiosInstance;\n private timeout: number;\n public extraHeaderInformation: ExtraHeaderInformation = {};\n private readonly logger = feedsLoggerSystem.getLogger('api-client');\n\n constructor(\n public readonly apiKey: string,\n private readonly tokenManager: TokenManager,\n private readonly connectionIdManager: ConnectionIdManager,\n options?: FeedsClientOptions,\n ) {\n this.baseUrl = options?.base_url ?? 'https://feeds.stream-io-api.com';\n this.timeout = options?.timeout ?? 3000;\n this.axiosInstance = axios.create({\n baseURL: this.baseUrl,\n });\n }\n\n sendRequest = async <T>(\n method: string,\n url: string,\n pathParams?: Record<string, string>,\n queryParams?: Record<string, any>,\n body?: any,\n requestContentType?: string,\n ): Promise<{ body: T; metadata: RequestMetadata }> => {\n queryParams = queryParams ?? {};\n queryParams.api_key = this.apiKey;\n\n if (\n queryParams?.watch ||\n queryParams?.presence ||\n queryParams?.payload?.watch ||\n queryParams?.payload?.presence ||\n body?.watch ||\n body?.presence\n ) {\n this.logger.info('Getting connection_id for watch or presence request');\n const connectionId = await this.connectionIdManager.getConnectionId();\n if (connectionId) {\n queryParams.connection_id = connectionId;\n }\n }\n\n let requestUrl = url;\n if (pathParams) {\n Object.keys(pathParams).forEach((paramName) => {\n requestUrl = requestUrl.replace(\n `{${paramName}}`,\n encodeURIComponent(pathParams[paramName]),\n );\n });\n }\n const client_request_id = randomId();\n\n const token = await this.tokenManager.getToken();\n\n const headers: RawAxiosRequestHeaders = {\n ...this.commonHeaders,\n Authorization: token,\n 'Content-Type': requestContentType ?? 'application/json',\n 'x-client-request-id': client_request_id,\n };\n\n const encodedBody =\n requestContentType === 'multipart/form-data' ? new FormData() : body;\n if (requestContentType === 'multipart/form-data') {\n Object.keys(body).forEach((key) => {\n const value = body[key];\n if (value != null) {\n encodedBody.append(key, value);\n }\n });\n }\n\n try {\n this.logger.debug(\n `Sending request ${method.toUpperCase()}:${requestUrl} with:`,\n { queryParams },\n { body },\n );\n const response = await this.axiosInstance.request<T>({\n url: requestUrl,\n method,\n headers,\n params: queryParams,\n paramsSerializer: (params) => this.queryParamsStringify(params),\n data: encodedBody,\n timeout:\n // multipart/form-data requests should not have a timeout allowing ample time for file uploads\n requestContentType === 'multipart/form-data' ? 0 : this.timeout,\n });\n\n const metadata: RequestMetadata = this.getRequestMetadata(\n client_request_id,\n response,\n );\n\n return { body: response.data, metadata };\n } catch (error) {\n if (!this.isAxiosError(error)) {\n throw new Error('Unknown error received during an API call', {\n cause: error,\n });\n } else if (!error.response) {\n throw new StreamApiError(`Stream error ${error.message}`);\n }\n\n // Stream specific error response\n const data = error.response.data as StreamApiError;\n const code = data?.code ?? error.response.status;\n const message = data?.message ?? error.response.statusText;\n if (\n code === KnownCodes.TOKEN_EXPIRED &&\n error.response.status === 401 &&\n !this.tokenManager.isStatic()\n ) {\n this.logger.info(\n 'Token expired, fetching a new one and retrying request',\n );\n await this.tokenManager.loadToken();\n return await this.sendRequest(\n method,\n url,\n pathParams,\n queryParams,\n body,\n );\n }\n\n throw new StreamApiError(\n `Stream error code ${code}: ${message}`,\n this.getRequestMetadata(client_request_id, error.response),\n code,\n undefined,\n );\n }\n };\n\n get webSocketBaseUrl() {\n const params = new URLSearchParams();\n params.set('api_key', this.apiKey);\n Object.keys(this.commonHeaders).forEach((key) => {\n params.set(key, this.commonHeaders[key]);\n });\n\n const wsBaseURL = this.baseUrl\n .replace('http', 'ws')\n .replace(':3030', ':8800');\n\n return `${wsBaseURL}/api/v2/connect?${params.toString()}`;\n }\n\n public generateStreamClientHeader() {\n // TODO: figure out a way to inject this during the build process\n const clientBundle = import.meta.env.VITE_CLIENT_BUNDLE;\n\n let userAgentString = '';\n if (this.extraHeaderInformation.sdkIdentifier) {\n userAgentString = `stream-feeds-${this.extraHeaderInformation.sdkIdentifier.name}-v${this.extraHeaderInformation.sdkIdentifier.version}-llc-v${version}`;\n } else {\n userAgentString = `stream-feeds-js-v${version}`;\n }\n\n const { os, model } = this.extraHeaderInformation.deviceIdentifier ?? {};\n\n return (\n [\n // reports the device OS, if provided\n ['os', os],\n // reports the device model, if provided\n ['device_model', model],\n // reports which bundle is being picked from the exports\n ['client_bundle', clientBundle],\n ] as const\n ).reduce(\n (withArguments, [key, value]) =>\n value && value.length > 0\n ? withArguments.concat(`|${key}=${value}`)\n : withArguments,\n userAgentString,\n );\n }\n\n private get commonHeaders(): Record<string, string> {\n return {\n 'stream-auth-type': this.tokenManager.isAnonymous ? 'anonymous' : 'jwt',\n 'X-Stream-Client': this.generateStreamClientHeader(),\n };\n }\n\n private isAxiosError(error: any | AxiosError): error is AxiosError {\n return typeof error.request !== 'undefined';\n }\n\n private readonly queryParamsStringify = (params: Record<string, any>) => {\n const newParams = [];\n for (const k in params) {\n const param = params[k];\n if (Array.isArray(param)) {\n newParams.push(`${k}=${encodeURIComponent(param.join(','))}`);\n } else if (param instanceof Date) {\n newParams.push(param.toISOString());\n } else if (typeof param === 'object') {\n newParams.push(`${k}=${encodeURIComponent(JSON.stringify(param))}`);\n } else {\n if (\n typeof param === 'string' ||\n typeof param === 'number' ||\n typeof param === 'boolean'\n ) {\n newParams.push(`${k}=${encodeURIComponent(param)}`);\n }\n }\n }\n\n return newParams.join('&');\n };\n\n private readonly getRequestMetadata = (\n requestId: string,\n response: AxiosResponse,\n ) => {\n const response_headers = response.headers as Record<string, string>;\n return {\n client_request_id: requestId,\n response_headers,\n response_code: response.status,\n rate_limit: getRateLimitFromResponseHeader(response_headers),\n };\n };\n}\n","import type { WSEvent } from '../models';\nimport { decoders } from '../model-decoders/decoders';\n\nconst eventDecoderMapping: Record<\n WSEvent['type'],\n (data: Record<string, any>) => WSEvent\n> = {\n 'app.updated': (data: Record<string, any>) => decoders.AppUpdatedEvent(data),\n\n 'feeds.activity.added': (data: Record<string, any>) =>\n decoders.ActivityAddedEvent(data),\n\n 'feeds.activity.deleted': (data: Record<string, any>) =>\n decoders.ActivityDeletedEvent(data),\n\n 'feeds.activity.feedback': (data: Record<string, any>) =>\n decoders.ActivityFeedbackEvent(data),\n\n 'feeds.activity.marked': (data: Record<string, any>) =>\n decoders.ActivityMarkEvent(data),\n\n 'feeds.activity.pinned': (data: Record<string, any>) =>\n decoders.ActivityPinnedEvent(data),\n\n 'feeds.activity.reaction.added': (data: Record<string, any>) =>\n decoders.ActivityReactionAddedEvent(data),\n\n 'feeds.activity.reaction.deleted': (data: Record<string, any>) =>\n decoders.ActivityReactionDeletedEvent(data),\n\n 'feeds.activity.reaction.updated': (data: Record<string, any>) =>\n decoders.ActivityReactionUpdatedEvent(data),\n\n 'feeds.activity.removed_from_feed': (data: Record<string, any>) =>\n decoders.ActivityRemovedFromFeedEvent(data),\n\n 'feeds.activity.unpinned': (data: Record<string, any>) =>\n decoders.ActivityUnpinnedEvent(data),\n\n 'feeds.activity.updated': (data: Record<string, any>) =>\n decoders.ActivityUpdatedEvent(data),\n\n 'feeds.bookmark.added': (data: Record<string, any>) =>\n decoders.BookmarkAddedEvent(data),\n\n 'feeds.bookmark.deleted': (data: Record<string, any>) =>\n decoders.BookmarkDeletedEvent(data),\n\n 'feeds.bookmark.updated': (data: Record<string, any>) =>\n decoders.BookmarkUpdatedEvent(data),\n\n 'feeds.bookmark_folder.deleted': (data: Record<string, any>) =>\n decoders.BookmarkFolderDeletedEvent(data),\n\n 'feeds.bookmark_folder.updated': (data: Record<string, any>) =>\n decoders.BookmarkFolderUpdatedEvent(data),\n\n 'feeds.comment.added': (data: Record<string, any>) =>\n decoders.CommentAddedEvent(data),\n\n 'feeds.comment.deleted': (data: Record<string, any>) =>\n decoders.CommentDeletedEvent(data),\n\n 'feeds.comment.reaction.added': (data: Record<string, any>) =>\n decoders.CommentReactionAddedEvent(data),\n\n 'feeds.comment.reaction.deleted': (data: Record<string, any>) =>\n decoders.CommentReactionDeletedEvent(data),\n\n 'feeds.comment.reaction.updated': (data: Record<string, any>) =>\n decoders.CommentReactionUpdatedEvent(data),\n\n 'feeds.comment.updated': (data: Record<string, any>) =>\n decoders.CommentUpdatedEvent(data),\n\n 'feeds.feed.created': (data: Record<string, any>) =>\n decoders.FeedCreatedEvent(data),\n\n 'feeds.feed.deleted': (data: Record<string, any>) =>\n decoders.FeedDeletedEvent(data),\n\n 'feeds.feed.updated': (data: Record<string, any>) =>\n decoders.FeedUpdatedEvent(data),\n\n 'feeds.feed_group.changed': (data: Record<string, any>) =>\n decoders.FeedGroupChangedEvent(data),\n\n 'feeds.feed_group.deleted': (data: Record<string, any>) =>\n decoders.FeedGroupDeletedEvent(data),\n\n 'feeds.feed_member.added': (data: Record<string, any>) =>\n decoders.FeedMemberAddedEvent(data),\n\n 'feeds.feed_member.removed': (data: Record<string, any>) =>\n decoders.FeedMemberRemovedEvent(data),\n\n 'feeds.feed_member.updated': (data: Record<string, any>) =>\n decoders.FeedMemberUpdatedEvent(data),\n\n 'feeds.follow.created': (data: Record<string, any>) =>\n decoders.FollowCreatedEvent(data),\n\n 'feeds.follow.deleted': (data: Record<string, any>) =>\n decoders.FollowDeletedEvent(data),\n\n 'feeds.follow.updated': (data: Record<string, any>) =>\n decoders.FollowUpdatedEvent(data),\n\n 'feeds.notification_feed.updated': (data: Record<string, any>) =>\n decoders.NotificationFeedUpdatedEvent(data),\n\n 'feeds.poll.closed': (data: Record<string, any>) =>\n decoders.PollClosedFeedEvent(data),\n\n 'feeds.poll.deleted': (data: Record<string, any>) =>\n decoders.PollDeletedFeedEvent(data),\n\n 'feeds.poll.updated': (data: Record<string, any>) =>\n decoders.PollUpdatedFeedEvent(data),\n\n 'feeds.poll.vote_casted': (data: Record<string, any>) =>\n decoders.PollVoteCastedFeedEvent(data),\n\n 'feeds.poll.vote_changed': (data: Record<string, any>) =>\n decoders.PollVoteChangedFeedEvent(data),\n\n 'feeds.poll.vote_removed': (data: Record<string, any>) =>\n decoders.PollVoteRemovedFeedEvent(data),\n\n 'feeds.stories_feed.updated': (data: Record<string, any>) =>\n decoders.StoriesFeedUpdatedEvent(data),\n\n 'health.check': (data: Record<string, any>) =>\n decoders.HealthCheckEvent(data),\n\n 'moderation.custom_action': (data: Record<string, any>) =>\n decoders.ModerationCustomActionEvent(data),\n\n 'moderation.flagged': (data: Record<string, any>) =>\n decoders.ModerationFlaggedEvent(data),\n\n 'moderation.mark_reviewed': (data: Record<string, any>) =>\n decoders.ModerationMarkReviewedEvent(data),\n\n 'user.banned': (data: Record<string, any>) => decoders.UserBannedEvent(data),\n\n 'user.deactivated': (data: Record<string, any>) =>\n decoders.UserDeactivatedEvent(data),\n\n 'user.muted': (data: Record<string, any>) => decoders.UserMutedEvent(data),\n\n 'user.reactivated': (data: Record<string, any>) =>\n decoders.UserReactivatedEvent(data),\n\n 'user.updated': (data: Record<string, any>) =>\n decoders.UserUpdatedEvent(data),\n};\n\nexport const decodeWSEvent = (data: { type: string } & Record<string, any>) => {\n if (Object.hasOwn(eventDecoderMapping, data.type)) {\n return eventDecoderMapping[data.type as WSEvent['type']](data);\n } else {\n return data;\n }\n};\n","import type { ApiClient, StreamResponse } from '../../gen-imports';\nimport type {\n AppealRequest,\n AppealResponse,\n BanRequest,\n BanResponse,\n DeleteModerationConfigResponse,\n FlagRequest,\n FlagResponse,\n GetAppealResponse,\n GetConfigResponse,\n MuteRequest,\n MuteResponse,\n QueryAppealsRequest,\n QueryAppealsResponse,\n QueryModerationConfigsRequest,\n QueryModerationConfigsResponse,\n QueryReviewQueueRequest,\n QueryReviewQueueResponse,\n SubmitActionRequest,\n SubmitActionResponse,\n UpsertConfigRequest,\n UpsertConfigResponse,\n} from '../models';\nimport { decoders } from '../model-decoders/decoders';\n\nexport class ModerationApi {\n constructor(public readonly apiClient: ApiClient) {}\n\n async appeal(\n request: AppealRequest,\n ): Promise<StreamResponse<AppealResponse>> {\n const body = {\n appeal_reason: request?.appeal_reason,\n entity_id: request?.entity_id,\n entity_type: request?.entity_type,\n attachments: request?.attachments,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<AppealResponse>\n >(\n 'POST',\n '/api/v2/moderation/appeal',\n undefined,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.AppealResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async getAppeal(request: {\n id: string;\n }): Promise<StreamResponse<GetAppealResponse>> {\n const pathParams = {\n id: request?.id,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<GetAppealResponse>\n >('GET', '/api/v2/moderation/appeal/{id}', pathParams, undefined);\n\n decoders.GetAppealResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async queryAppeals(\n request?: QueryAppealsRequest,\n ): Promise<StreamResponse<QueryAppealsResponse>> {\n const body = {\n limit: request?.limit,\n next: request?.next,\n prev: request?.prev,\n sort: request?.sort,\n filter: request?.filter,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<QueryAppealsResponse>\n >(\n 'POST',\n '/api/v2/moderation/appeals',\n undefined,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.QueryAppealsResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async ban(request: BanRequest): Promise<StreamResponse<BanResponse>> {\n const body = {\n target_user_id: request?.target_user_id,\n banned_by_id: request?.banned_by_id,\n channel_cid: request?.channel_cid,\n delete_messages: request?.delete_messages,\n ip_ban: request?.ip_ban,\n reason: request?.reason,\n shadow: request?.shadow,\n timeout: request?.timeout,\n banned_by: request?.banned_by,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<BanResponse>\n >(\n 'POST',\n '/api/v2/moderation/ban',\n undefined,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.BanResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async upsertConfig(\n request: UpsertConfigRequest,\n ): Promise<StreamResponse<UpsertConfigResponse>> {\n const body = {\n key: request?.key,\n async: request?.async,\n team: request?.team,\n ai_image_config: request?.ai_image_config,\n ai_text_config: request?.ai_text_config,\n ai_video_config: request?.ai_video_config,\n automod_platform_circumvention_config:\n request?.automod_platform_circumvention_config,\n automod_semantic_filters_config: request?.automod_semantic_filters_config,\n automod_toxicity_config: request?.automod_toxicity_config,\n aws_rekognition_config: request?.aws_rekognition_config,\n block_list_config: request?.block_list_config,\n bodyguard_config: request?.bodyguard_config,\n google_vision_config: request?.google_vision_config,\n llm_config: request?.llm_config,\n rule_builder_config: request?.rule_builder_config,\n velocity_filter_config: request?.velocity_filter_config,\n video_call_rule_config: request?.video_call_rule_config,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<UpsertConfigResponse>\n >(\n 'POST',\n '/api/v2/moderation/config',\n undefined,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.UpsertConfigResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async deleteConfig(request: {\n key: string;\n team?: string;\n }): Promise<StreamResponse<DeleteModerationConfigResponse>> {\n const queryParams = {\n team: request?.team,\n };\n const pathParams = {\n key: request?.key,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<DeleteModerationConfigResponse>\n >('DELETE', '/api/v2/moderation/config/{key}', pathParams, queryParams);\n\n decoders.DeleteModerationConfigResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async getConfig(request: {\n key: string;\n team?: string;\n }): Promise<StreamResponse<GetConfigResponse>> {\n const queryParams = {\n team: request?.team,\n };\n const pathParams = {\n key: request?.key,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<GetConfigResponse>\n >('GET', '/api/v2/moderation/config/{key}', pathParams, queryParams);\n\n decoders.GetConfigResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async queryModerationConfigs(\n request?: QueryModerationConfigsRequest,\n ): Promise<StreamResponse<QueryModerationConfigsResponse>> {\n const body = {\n limit: request?.limit,\n next: request?.next,\n prev: request?.prev,\n sort: request?.sort,\n filter: request?.filter,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<QueryModerationConfigsResponse>\n >(\n 'POST',\n '/api/v2/moderation/configs',\n undefined,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.QueryModerationConfigsResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async flag(request: FlagRequest): Promise<StreamResponse<FlagResponse>> {\n const body = {\n entity_id: request?.entity_id,\n entity_type: request?.entity_type,\n entity_creator_id: request?.entity_creator_id,\n reason: request?.reason,\n custom: request?.custom,\n moderation_payload: request?.moderation_payload,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<FlagResponse>\n >(\n 'POST',\n '/api/v2/moderation/flag',\n undefined,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.FlagResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async mute(request: MuteRequest): Promise<StreamResponse<MuteResponse>> {\n const body = {\n target_ids: request?.target_ids,\n timeout: request?.timeout,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<MuteResponse>\n >(\n 'POST',\n '/api/v2/moderation/mute',\n undefined,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.MuteResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async queryReviewQueue(\n request?: QueryReviewQueueRequest,\n ): Promise<StreamResponse<QueryReviewQueueResponse>> {\n const body = {\n limit: request?.limit,\n lock_count: request?.lock_count,\n lock_duration: request?.lock_duration,\n lock_items: request?.lock_items,\n next: request?.next,\n prev: request?.prev,\n stats_only: request?.stats_only,\n sort: request?.sort,\n filter: request?.filter,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<QueryReviewQueueResponse>\n >(\n 'POST',\n '/api/v2/moderation/review_queue',\n undefined,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.QueryReviewQueueResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n\n async submitAction(\n request: SubmitActionRequest,\n ): Promise<StreamResponse<SubmitActionResponse>> {\n const body = {\n action_type: request?.action_type,\n appeal_id: request?.appeal_id,\n item_id: request?.item_id,\n ban: request?.ban,\n block: request?.block,\n custom: request?.custom,\n delete_activity: request?.delete_activity,\n delete_comment: request?.delete_comment,\n delete_message: request?.delete_message,\n delete_reaction: request?.delete_reaction,\n delete_user: request?.delete_user,\n mark_reviewed: request?.mark_reviewed,\n reject_appeal: request?.reject_appeal,\n restore: request?.restore,\n shadow_block: request?.shadow_block,\n unban: request?.unban,\n unblock: request?.unblock,\n };\n\n const response = await this.apiClient.sendRequest<\n StreamResponse<SubmitActionResponse>\n >(\n 'POST',\n '/api/v2/moderation/submit_action',\n undefined,\n undefined,\n body,\n 'application/json',\n );\n\n decoders.SubmitActionResponse?.(response.body);\n\n return { ...response.body, metadata: response.metadata };\n }\n}\n","import { ModerationApi } from './gen/moderation/ModerationApi';\n\nexport class ModerationClient extends ModerationApi {}\n","import { StateStore } from '@stream-io/state-store';\nimport type { FeedsClient } from '../feeds-client';\nimport type {\n PollVoteResponseData,\n QueryPollVotesRequest,\n PollUpdatedFeedEvent,\n WSEvent,\n PollClosedFeedEvent,\n PollVoteCastedFeedEvent,\n PollVoteChangedFeedEvent,\n PollVoteRemovedFeedEvent,\n PollResponseData,\n} from '../gen/models';\n\nconst isPollUpdatedEvent = (\n e: WSEvent,\n): e is { type: 'feeds.poll.updated' } & PollUpdatedFeedEvent =>\n e.type === 'feeds.poll.updated';\nconst isPollClosedEventEvent = (\n e: WSEvent,\n): e is { type: 'feeds.poll.closed' } & PollClosedFeedEvent =>\n e.type === 'feeds.poll.closed';\nconst isPollVoteCastedEvent = (\n e: WSEvent,\n): e is { type: 'feeds.poll.vote_casted' } & PollVoteCastedFeedEvent =>\n e.type === 'feeds.poll.vote_casted';\nconst isPollVoteChangedEvent = (\n e: WSEvent,\n): e is { type: 'feeds.poll.vote_changed' } & PollVoteChangedFeedEvent =>\n e.type === 'feeds.poll.vote_changed';\nconst isPollVoteRemovedEvent = (\n e: WSEvent,\n): e is { type: 'feeds.poll.vote_removed' } & PollVoteRemovedFeedEvent =>\n e.type === 'feeds.poll.vote_removed';\n\nexport const isVoteAnswer = (vote: PollVoteResponseData) =>\n !!vote?.answer_text;\n\nexport type PollAnswersQueryParams = QueryPollVotesRequest & {\n poll_id: string;\n user_id?: string;\n};\n\ntype OptionId = string;\n\nexport type PollState = Omit<PollResponseData, 'own_votes' | 'id'> & {\n last_activity_at: Date;\n max_voted_option_ids: OptionId[];\n own_votes_by_option_id: Record<OptionId, PollVoteResponseData>;\n own_answer?: PollVoteResponseData; // each user can have only one answer\n};\n\ntype PollInitOptions = {\n client: FeedsClient;\n poll: PollResponseData;\n};\n\nexport class StreamPoll {\n public readonly state: StateStore<PollState>;\n public id: string;\n private readonly client: FeedsClient;\n\n constructor({ client, poll }: PollInitOptions) {\n this.client = client;\n this.id = poll.id;\n\n this.state = new StateStore<PollState>(\n this.getInitialStateFromPollResponse(poll),\n );\n }\n\n private readonly getInitialStateFromPollResponse = (\n poll: PollInitOptions['poll'],\n ) => {\n const { own_votes, id, ...pollResponseForState } = poll;\n const { ownAnswer, ownVotes } = own_votes?.reduce<{\n ownVotes: PollVoteResponseData[];\n ownAnswer?: PollVoteResponseData;\n }>(\n (acc, voteOrAnswer) => {\n if (isVoteAnswer(voteOrAnswer)) {\n acc.ownAnswer = voteOrAnswer;\n } else {\n acc.ownVotes.push(voteOrAnswer);\n }\n return acc;\n },\n { ownVotes: [] },\n ) ?? { ownVotes: [] };\n\n return {\n ...pollResponseForState,\n last_activity_at: new Date(),\n max_voted_option_ids: getMaxVotedOptionIds(\n pollResponseForState.vote_counts_by_option,\n ),\n own_answer: ownAnswer,\n own_votes_by_option_id: getOwnVotesByOptionId(ownVotes),\n };\n };\n\n public reinitializeState = (poll: PollInitOptions['poll']) => {\n this.state.partialNext(this.getInitialStateFromPollResponse(poll));\n };\n\n get data(): PollState {\n return this.state.getLatestValue();\n }\n\n public handlePollUpdated = (event: PollUpdatedFeedEvent) => {\n if (event.poll?.id && event.poll.id !== this.id) return;\n if (!isPollUpdatedEvent(event as WSEvent)) return;\n const { id, ...pollData } = event.poll;\n this.state.partialNext({\n ...pollData,\n last_activity_at: new Date(event.created_at),\n });\n };\n\n public handlePollClosed = (event: PollClosedFeedEvent) => {\n if (event.poll?.id && event.poll.id !== this.id) return;\n if (!isPollClosedEventEvent(event as WSEvent)) return;\n this.state.partialNext({\n is_closed: true,\n last_activity_at: new Date(event.created_at),\n });\n };\n\n public handleVoteCasted = (event: PollVoteCastedFeedEvent) => {\n if (event.poll?.id && event.poll.id !== this.id) return;\n if (!isPollVoteCastedEvent(event as WSEvent)) return;\n const currentState = this.data;\n const isOwnVote =\n event.poll_vote.user_id ===\n this.client.state.getLatestValue().connected_user?.id;\n let latestAnswers = [...currentState.latest_answers];\n let ownAnswer = currentState.own_answer;\n const ownVotesByOptionId = currentState.own_votes_by_option_id;\n let maxVotedOptionIds = currentState.max_voted_option_ids;\n\n if (isOwnVote) {\n if (isVoteAnswer(event.poll_vote)) {\n ownAnswer = event.poll_vote;\n } else if (event.poll_vote.option_id) {\n ownVotesByOptionId[event.poll_vote.option_id] = event.poll_vote;\n }\n }\n\n if (isVoteAnswer(event.poll_vote)) {\n latestAnswers = [event.poll_vote, ...latestAnswers];\n } else {\n maxVotedOptionIds = getMaxVotedOptionIds(\n event.poll.vote_counts_by_option,\n );\n }\n\n const {\n answers_count,\n latest_votes_by_option,\n vote_count,\n vote_counts_by_option,\n } = event.poll;\n this.state.partialNext({\n answers_count,\n latest_votes_by_option,\n vote_count,\n vote_counts_by_option,\n latest_answers: latestAnswers,\n last_activity_at: new Date(event.created_at),\n own_answer: ownAnswer,\n own_votes_by_option_id: ownVotesByOptionId,\n max_voted_option_ids: maxVotedOptionIds,\n });\n };\n\n public handleVoteChanged = (event: PollVoteChangedFeedEvent) => {\n // this event is triggered only when event.poll.enforce_unique_vote === true\n if (event.poll?.id && event.poll.id !== this.id) return;\n if (!isPollVoteChangedEvent(event as WSEvent)) return;\n const currentState = this.data;\n const isOwnVote =\n event.poll_vote.user_id ===\n this.client.state.getLatestValue().connected_user?.id;\n let latestAnswers = [...currentState.latest_answers];\n let ownAnswer = currentState.own_answer;\n let ownVotesByOptionId = currentState.own_votes_by_option_id;\n let maxVotedOptionIds = currentState.max_voted_option_ids;\n\n if (isOwnVote) {\n if (isVoteAnswer(event.poll_vote)) {\n latestAnswers = [\n event.poll_vote,\n ...latestAnswers.filter((answer) => answer.id !== event.poll_vote.id),\n ];\n ownAnswer = event.poll_vote;\n } else if (event.poll_vote.option_id) {\n if (event.poll.enforce_unique_vote) {\n ownVotesByOptionId = { [event.poll_vote.option_id]: event.poll_vote };\n } else {\n ownVotesByOptionId = Object.entries(ownVotesByOptionId).reduce<\n Record<OptionId, PollVoteResponseData>\n >((acc, [optionId, vote]) => {\n if (\n optionId !== event.poll_vote.option_id &&\n vote.id === event.poll_vote.id\n ) {\n return acc;\n }\n acc[optionId] = vote;\n return acc;\n }, {});\n ownVotesByOptionId[event.poll_vote.option_id] = event.poll_vote;\n }\n\n if (ownAnswer?.id === event.poll_vote.id) {\n ownAnswer = undefined;\n }\n maxVotedOptionIds = getMaxVotedOptionIds(\n event.poll.vote_counts_by_option,\n );\n }\n } else if (isVoteAnswer(event.poll_vote)) {\n latestAnswers = [event.poll_vote, ...latestAnswers];\n } else {\n maxVotedOptionIds = getMaxVotedOptionIds(\n event.poll.vote_counts_by_option,\n );\n }\n\n const {\n answers_count,\n latest_votes_by_option,\n vote_count,\n vote_counts_by_option,\n } = event.poll;\n this.state.partialNext({\n answers_count,\n latest_votes_by_option,\n vote_count,\n vote_counts_by_option,\n latest_answers: latestAnswers,\n last_activity_at: new Date(event.created_at),\n own_answer: ownAnswer,\n own_votes_by_option_id: ownVotesByOptionId,\n max_voted_option_ids: maxVotedOptionIds,\n });\n };\n\n public handleVoteRemoved = (event: PollVoteRemovedFeedEvent) => {\n if (event.poll?.id && event.poll.id !== this.id) return;\n if (!isPollVoteRemovedEvent(event as WSEvent)) return;\n const currentState = this.data;\n const isOwnVote =\n event.poll_vote.user_id ===\n this.client.state.getLatestValue().connected_user?.id;\n let latestAnswers = [...currentState.latest_answers];\n let ownAnswer = currentState.own_answer;\n const ownVotesByOptionId = { ...currentState.own_votes_by_option_id };\n let maxVotedOptionIds = currentState.max_voted_option_ids;\n\n if (isVoteAnswer(event.poll_vote)) {\n latestAnswers = latestAnswers.filter(\n (answer) => answer.id !== event.poll_vote.id,\n );\n if (isOwnVote) {\n ownAnswer = undefined;\n }\n } else {\n maxVotedOptionIds = getMaxVotedOptionIds(\n event.poll.vote_counts_by_option,\n );\n if (isOwnVote && event.poll_vote.option_id) {\n delete ownVotesByOptionId[event.poll_vote.option_id];\n }\n }\n\n const {\n answers_count,\n latest_votes_by_option,\n vote_count,\n vote_counts_by_option,\n } = event.poll;\n this.state.partialNext({\n answers_count,\n latest_votes_by_option,\n vote_count,\n vote_counts_by_option,\n latest_answers: latestAnswers,\n last_activity_at: new Date(event.created_at),\n own_answer: ownAnswer,\n own_votes_by_option_id: ownVotesByOptionId,\n max_voted_option_ids: maxVotedOptionIds,\n });\n };\n}\n\nfunction getMaxVotedOptionIds(\n voteCountsByOption: PollResponseData['vote_counts_by_option'],\n) {\n let maxVotes = 0;\n let winningOptions: string[] = [];\n for (const [id, count] of Object.entries(voteCountsByOption ?? {})) {\n if (count > maxVotes) {\n winningOptions = [id];\n maxVotes = count;\n } else if (count === maxVotes) {\n winningOptions.push(id);\n }\n }\n return winningOptions;\n}\n\nfunction getOwnVotesByOptionId(ownVotes: PollVoteResponseData[]) {\n return !ownVotes\n ? ({} satisfies Record<OptionId, PollVoteResponseData>)\n : ownVotes.reduce<Record<OptionId, PollVoteResponseData>>((acc, vote) => {\n if (isVoteAnswer(vote) || !vote.option_id) return acc;\n acc[vote.option_id] = vote;\n return acc;\n }, {});\n}\n","import type { StreamResponse, FeedsApi } from '../../gen-imports';\nimport type {\n AcceptFeedMemberInviteRequest,\n AcceptFeedMemberInviteResponse,\n DeleteFeedResponse,\n GetOrCreateFeedRequest,\n GetOrCreateFeedResponse,\n MarkActivityRequest,\n PinActivityRequest,\n PinActivityResponse,\n QueryFeedMembersRequest,\n QueryFeedMembersResponse,\n RejectFeedMemberInviteRequest,\n RejectFeedMemberInviteResponse,\n Response,\n UnpinActivityResponse,\n UpdateFeedMembersRequest,\n UpdateFeedMembersResponse,\n UpdateFeedRequest,\n UpdateFeedResponse,\n} from '../models';\n\nexport class FeedApi {\n constructor(\n protected feedsApi: FeedsApi,\n public readonly group: string,\n public readonly id: string,\n ) {}\n\n delete(request?: {\n hard_delete?: boolean;\n }): Promise<StreamResponse<DeleteFeedResponse>> {\n return this.feedsApi.deleteFeed({\n feed_id: this.id,\n feed_group_id: this.group,\n ...request,\n });\n }\n\n getOrCreate(\n request?: GetOrCreateFeedRequest & { connection_id?: string },\n ): Promise<StreamResponse<GetOrCreateFeedResponse>> {\n return this.feedsApi.getOrCreateFeed({\n feed_id: this.id,\n feed_group_id: this.group,\n ...request,\n });\n }\n\n update(\n request?: UpdateFeedRequest,\n ): Promise<StreamResponse<UpdateFeedResponse>> {\n return this.feedsApi.updateFeed({\n feed_id: this.id,\n feed_group_id: this.group,\n ...request,\n });\n }\n\n markActivity(\n request?: MarkActivityRequest,\n ): Promise<StreamResponse<Response>> {\n return this.feedsApi.markActivity({\n feed_id: this.id,\n feed_group_id: this.group,\n ...request,\n });\n }\n\n unpinActivity(request: {\n activity_id: string;\n }): Promise<StreamResponse<UnpinActivityResponse>> {\n return this.feedsApi.unpinActivity({\n feed_id: this.id,\n feed_group_id: this.group,\n ...request,\n });\n }\n\n pinActivity(\n request: PinActivityRequest & { activity_id: string },\n ): Promise<StreamResponse<PinActivityResponse>> {\n return this.feedsApi.pinActivity({\n feed_id: this.id,\n feed_group_id: this.group,\n ...request,\n });\n }\n\n updateFeedMembers(\n request: UpdateFeedMembersRequest,\n ): Promise<StreamResponse<UpdateFeedMembersResponse>> {\n return this.feedsApi.updateFeedMembers({\n feed_id: this.id,\n feed_group_id: this.group,\n ...request,\n });\n }\n\n acceptFeedMemberInvite(\n request?: AcceptFeedMemberInviteRequest,\n ): Promise<StreamResponse<AcceptFeedMemberInviteResponse>> {\n return this.feedsApi.acceptFeedMemberInvite({\n feed_id: this.id,\n feed_group_id: this.group,\n ...request,\n });\n }\n\n queryFeedMembers(\n request?: QueryFeedMembersRequest,\n ): Promise<StreamResponse<QueryFeedMembersResponse>> {\n return this.feedsApi.queryFeedMembers({\n feed_id: this.id,\n feed_group_id: this.group,\n ...request,\n });\n }\n\n rejectFeedMemberInvite(\n request?: RejectFeedMemberInviteRequest,\n ): Promise<StreamResponse<RejectFeedMemberInviteResponse>> {\n return this.feedsApi.rejectFeedMemberInvite({\n feed_id: this.id,\n feed_group_id: this.group,\n ...request,\n });\n }\n\n stopWatching(request?: {\n connection_id?: string;\n }): Promise<StreamResponse<Response>> {\n return this.feedsApi.stopWatchingFeed({\n feed_id: this.id,\n feed_group_id: this.group,\n ...request,\n });\n }\n}\n","export const checkHasAnotherPage = <T extends unknown | undefined>(\n v: T,\n cursor: string | undefined,\n) =>\n (typeof v === 'undefined' && typeof cursor === 'undefined') ||\n typeof cursor === 'string';\n","export const uniqueArrayMerge = <T>(\n existingArray: T[],\n arrayToMerge: T[],\n getKey: (v: T) => string,\n) => {\n const existing = new Set<string>();\n\n existingArray.forEach((value) => {\n const key = getKey(value);\n existing.add(key);\n });\n\n const filteredArrayToMerge = arrayToMerge.filter((value) => {\n const key = getKey(value);\n return !existing.has(key);\n });\n\n return existingArray.concat(filteredArrayToMerge);\n};\n\nexport const replaceUniqueArrayMerge = <T>(\n existingArray: T[],\n arrayToMerge: T[],\n getKey: (v: T) => string,\n) => {\n const existingMap = new Map<string, T>();\n (existingArray ?? []).forEach((item) => {\n existingMap.set(getKey(item), item);\n });\n\n const result: T[] = [];\n arrayToMerge.forEach((item) => {\n existingMap.set(getKey(item), item);\n });\n\n existingArray.forEach((originalItem) => {\n const updatedItem = existingMap.get(getKey(originalItem));\n if (updatedItem) {\n result.push(updatedItem);\n existingMap.delete(getKey(originalItem));\n }\n });\n\n existingMap.forEach((item) => {\n result.push(item);\n });\n\n return result;\n};\n","export const Constants = {\n DEFAULT_COMMENT_PAGINATION: 'first',\n} as const;\n","import type {\n AddCommentReactionResponse,\n AddReactionResponse,\n DeleteActivityReactionResponse,\n CommentResponse,\n DeleteCommentReactionResponse,\n FollowResponse,\n} from '../gen/models';\nimport type { StreamFile } from '../types';\n\nexport const isFollowResponse = (data: object): data is FollowResponse => {\n return 'source_feed' in data && 'target_feed' in data;\n};\n\nexport const isReactionResponse = (\n data: object,\n): data is\n | AddReactionResponse\n | AddCommentReactionResponse\n | DeleteActivityReactionResponse\n | DeleteCommentReactionResponse => {\n return 'reaction' in data && ('activity' in data || 'comment' in data);\n};\n\nexport const isCommentResponse = (\n entity: object,\n): entity is CommentResponse => {\n return typeof (entity as CommentResponse)?.object_id === 'string';\n};\n\nexport const isImageFile = (file: StreamFile) => {\n // photoshop files begin with 'image/'\n return file.type.startsWith('image/') && !file.type.endsWith('.photoshop');\n};\n\nexport const isVideoFile = (file: StreamFile) => {\n return file.type.startsWith('video/');\n};\n","import { feedsLoggerSystem } from './logger';\n\nexport const ensureExhausted = (x: never, message: string) => {\n feedsLoggerSystem.getLogger('helpers').warn(message, x);\n};\n","import type {\n FollowResponse,\n} from '../gen/models';\nimport type {\n ActivityReactionAddedPayload,\n ActivityReactionDeletedPayload,\n ActivityUpdatedPayload,\n CommentAddedPayload,\n CommentDeletedPayload,\n CommentReactionAddedPayload,\n CommentReactionDeletedPayload,\n CommentUpdatedPayload,\n} from '../feed';\nimport { ensureExhausted } from './ensure-exhausted';\nimport type {\n CommentReactionUpdatedPayload\n} from '../feed/event-handlers/comment/handle-comment-reaction-updated';\nimport type {\n ActivityReactionUpdatedPayload\n} from '../feed/event-handlers/activity/handle-activity-reaction-updated';\n\nexport type StateUpdateQueuePrefix =\n | 'activity-updated'\n | 'activity-reaction-created'\n | 'activity-reaction-deleted'\n | 'activity-reaction-updated'\n | 'comment-reaction-created'\n | 'comment-reaction-deleted'\n | 'comment-reaction-updated'\n | 'follow-created'\n | 'follow-deleted'\n | 'follow-updated'\n | 'comment-created'\n | 'comment-deleted'\n | 'comment-updated';\n\ntype StateUpdateQueuePayloadByPrefix = {\n 'activity-updated': ActivityUpdatedPayload;\n 'activity-reaction-created': ActivityReactionAddedPayload;\n 'activity-reaction-deleted': ActivityReactionDeletedPayload;\n 'activity-reaction-updated': ActivityReactionUpdatedPayload;\n 'comment-reaction-created': CommentReactionAddedPayload;\n 'comment-reaction-deleted': CommentReactionDeletedPayload;\n 'comment-reaction-updated': CommentReactionUpdatedPayload;\n 'follow-created': FollowResponse;\n 'follow-deleted': FollowResponse;\n 'follow-updated': FollowResponse;\n 'comment-created': CommentAddedPayload;\n 'comment-deleted': CommentDeletedPayload;\n 'comment-updated': CommentUpdatedPayload;\n};\n\n// Union of ([payload, prefix]) tuples:\nexport type StateUpdateQueuePairTuples = {\n [K in StateUpdateQueuePrefix]: [StateUpdateQueuePayloadByPrefix[K], K];\n}[StateUpdateQueuePrefix];\n\n/**\n * Decide whether to apply a state update that may arrive twice (HTTP + WS)\n * for the same logical change initiated by the connected user.\n *\n * ###### Why\n * When `watch` is enabled and the connected user triggers a change, you often get:\n * - an immediate local/HTTP-driven update (e.g., optimistic UI, REST response)\n * - a subsequent server broadcast over WebSocket for the same change\n *\n * This helper suppresses the duplicate so you apply the update exactly once.\n *\n * ###### How it works\n * - Builds a prefixed key from `stateUpdateQueueId` and the transport:\n * - HTTP → `http-${id}`\n * - WS → `ws-${id}`\n * - If the *paired* key already exists (e.g., WS sees `http-${id}` or HTTP sees `ws-${id}`),\n * it removes that key and returns `false` (skip as duplicate).\n * - Otherwise it enqueues the current prefixed key and returns `true` (apply update).\n *\n * ###### When it returns `true`\n * - `watch` is `false` -> no deduping needed\n * - `isTriggeredByConnectedUser` is `false` -> dedupe only targets that echo the initiator's\n * - First arrival for a given `id` and transport pair\n *\n * ###### When it returns `false`\n * The *second* arrival for the same logical `{id}` from the *other* transport is detected\n * (e.g., you already saw `http-${id}`, now a `ws-${id}` arrives).\n *\n * ###### Example\n * ```ts\n * const queue = new Set<string>();\n *\n * 1) User follows someone → HTTP path resolves first\n * if (shouldUpdateState({\n * stateUpdateQueueId: 'follow:targetUserId',\n * stateUpdateQueue: queue,\n * watch: true,\n * fromWs: false,\n * isTriggeredByConnectedUser: true,\n * })) {\n * applyFollowLocally();\n * }\n *\n * 2) A moment later WS echoes the same follow\n * if (shouldUpdateState({\n * stateUpdateQueueId: 'follow:targetUserId',\n * stateUpdateQueue: queue,\n * watch: true,\n * fromWs: true,\n * isTriggeredByConnectedUser: true,\n * })) {\n * // This will return false → skip duplicate\n * applyFollowLocally();\n * }\n * ```\n *\n * ###### Reverse order also works\n * If WS lands first and HTTP lands second, the second one will be skipped.\n *\n * ###### Choosing good IDs\n * Use a stable, collision-free `stateUpdateQueueId` for the same logical change.\n * Examples:\n * - `follow-created-${sourceFeed.id}-${targetFeed.id}`\n * - `activity-reaction-added-${activity.id}-${reaction.type}`\n *\n * @param config\n * @param config.stateUpdateQueueId - Stable identifier for the logical change\n * @param config.stateUpdateQueue - A shared Set used as a small dedupe cache\n * @param config.watch - Whether watch/broadcast mode is enabled\n * @param config.fromWs - `true` if this event came from WebSocket; `false` for HTTP (default: true)\n * @param config.isTriggeredByConnectedUser - Only dedupe echoes of our own actions\n *\n * @returns {boolean} Whether or not the state update should be applied.\n */\nexport const shouldUpdateState = ({\n stateUpdateQueueId,\n stateUpdateQueue,\n watch,\n fromWs = true,\n isTriggeredByConnectedUser = false,\n}: {\n stateUpdateQueueId?: string;\n stateUpdateQueue: Set<string>;\n watch: boolean;\n fromWs?: boolean;\n isTriggeredByConnectedUser: boolean;\n}): boolean => {\n if (!watch || !isTriggeredByConnectedUser || !stateUpdateQueueId) {\n return true;\n }\n\n const prefixedStateUpdateQueueId = fromWs\n ? `ws-${stateUpdateQueueId}`\n : `http-${stateUpdateQueueId}`;\n const pairedStateUpdateQueueId = fromWs\n ? `http-${stateUpdateQueueId}`\n : `ws-${stateUpdateQueueId}`;\n\n if (watch && stateUpdateQueue.has(pairedStateUpdateQueueId)) {\n stateUpdateQueue.delete(pairedStateUpdateQueueId);\n return false;\n }\n\n stateUpdateQueue.add(prefixedStateUpdateQueueId);\n return true;\n};\n\nexport function getStateUpdateQueueId(\n ...args: StateUpdateQueuePairTuples\n) {\n const [data, prefix] = args;\n const toJoin = [prefix as string];\n\n switch (prefix) {\n case 'activity-updated': {\n return toJoin.concat([data.activity.id]).join('-')\n }\n case 'activity-reaction-created':\n case 'activity-reaction-deleted':\n case 'activity-reaction-updated': {\n return toJoin\n .concat([\n data.activity.id,\n data.reaction.type,\n ])\n .join('-');\n }\n case 'comment-reaction-created':\n case 'comment-reaction-deleted':\n case 'comment-reaction-updated': {\n return toJoin\n .concat([\n data.comment.id,\n data.reaction.type,\n ])\n .join('-');\n }\n case 'comment-created':\n case 'comment-deleted':\n case 'comment-updated': {\n return toJoin.concat([data.comment.id]).join('-')\n }\n case 'follow-created':\n case 'follow-deleted':\n case 'follow-updated': {\n return toJoin\n .concat([data.source_feed.feed, data.target_feed.feed])\n .join('-');\n }\n default: {\n ensureExhausted(data, 'Encountered unknown state update queue prefix.')\n }\n }\n}\n","/**\n * Utility function through which you can update an entity in an array;\n *\n * - if the entity is not found, it returns the original array unchanged\n * - if the entity is found and updated, it returns a new array with the updated entity\n * - if the entity is found but not updated (updater returns `matchedEntity`), it returns the original array unchanged\n *\n * - `changed: boolean` indicates whether the array has changed or not - this is QOL enhancement, you\n * can compare returned array to the original one\n *\n */\nexport function updateEntityInArray<T>(_: {\n matcher: (entity: T) => boolean;\n entities: T[];\n updater: (currentEntity: T) => T;\n}): { changed: boolean; entities: T[] };\nexport function updateEntityInArray<T>(_: {\n matcher: (entity: T) => boolean;\n entities: T[] | undefined;\n updater: (currentEntity: T) => T;\n}): { changed: boolean; entities: T[] | undefined };\nexport function updateEntityInArray<T>({\n matcher,\n updater,\n entities,\n}: {\n matcher: (entity: T) => boolean;\n entities: T[] | undefined;\n updater: (currentEntity: T) => T;\n}) {\n if (!entities || !entities.length) {\n return { changed: false, entities };\n }\n\n const index = entities.findIndex(matcher);\n\n if (index === -1) {\n return { changed: false, entities };\n }\n\n const newEntity = updater(entities[index]);\n\n if (newEntity === entities[index]) {\n return { changed: false, entities };\n }\n\n const updatedEntities = [...entities];\n updatedEntities[index] = newEntity;\n\n return { changed: true, entities: updatedEntities };\n}\n","import type { Feed, FeedState } from '../../feed';\nimport type { FollowResponse } from '../../../gen/models';\nimport type {\n EventPayload,\n PartializeAllBut,\n UpdateStateResult,\n} from '../../../types-internal';\nimport { getStateUpdateQueueId, shouldUpdateState } from '../../../utils';\n\nexport const updateStateFollowCreated = (\n follow: FollowResponse,\n currentState: FeedState,\n currentFeedId: string,\n connectedUserId?: string,\n): UpdateStateResult<{ data: FeedState }> => {\n // filter non-accepted follows (the way getOrCreate does by default)\n if (follow.status !== 'accepted') {\n return { changed: false, data: currentState };\n }\n\n let newState: FeedState = { ...currentState };\n\n // this feed followed someone\n if (follow.source_feed.feed === currentFeedId) {\n newState = {\n ...newState,\n // Update FeedResponse fields, that has the new follower/following count\n ...follow.source_feed,\n };\n\n // Only update if following array already exists\n if (currentState.following !== undefined) {\n newState.following = [follow, ...currentState.following];\n }\n } else if (\n // someone followed this feed\n follow.target_feed.feed === currentFeedId\n ) {\n const source = follow.source_feed;\n\n newState = {\n ...newState,\n // Update FeedResponse fields, that has the new follower/following count\n ...follow.target_feed,\n };\n\n if (source.created_by.id === connectedUserId) {\n newState.own_follows = currentState.own_follows\n ? currentState.own_follows.concat(follow)\n : [follow];\n }\n\n // Only update if followers array already exists\n if (currentState.followers !== undefined) {\n newState.followers = [follow, ...currentState.followers];\n }\n }\n\n return { changed: true, data: newState };\n};\n\nexport function handleFollowCreated(\n this: Feed,\n eventOrResponse: PartializeAllBut<\n EventPayload<'feeds.follow.created'>,\n 'follow'\n >,\n fromWs?: boolean,\n) {\n const follow = eventOrResponse.follow;\n\n if (\n !shouldUpdateState({\n stateUpdateQueueId: getStateUpdateQueueId(follow, 'follow-created'),\n stateUpdateQueue: this.stateUpdateQueue,\n watch: this.currentState.watch,\n fromWs,\n isTriggeredByConnectedUser:\n this.client.state.getLatestValue().connected_user?.id ===\n follow.source_feed.created_by.id,\n })\n ) {\n return;\n }\n const connectedUser = this.client.state.getLatestValue().connected_user;\n const result = updateStateFollowCreated(\n follow,\n this.currentState,\n this.feed,\n connectedUser?.id,\n );\n if (result.changed) {\n this.state.next(result.data);\n }\n}\n","import type { Feed, FeedState } from '../../../feed';\nimport type { FollowResponse } from '../../../gen/models';\nimport type {\n EventPayload,\n PartializeAllBut,\n UpdateStateResult,\n} from '../../../types-internal';\n\nimport { getStateUpdateQueueId, shouldUpdateState } from '../../../utils';\n\nexport const updateStateFollowDeleted = (\n follow: FollowResponse,\n currentState: FeedState,\n currentFeedId: string,\n connectedUserId?: string,\n): UpdateStateResult<{ data: FeedState }> => {\n let newState: FeedState = { ...currentState };\n\n // this feed unfollowed someone\n if (follow.source_feed.feed === currentFeedId) {\n newState = {\n ...newState,\n // Update FeedResponse fields, that has the new follower/following count\n ...follow.source_feed,\n };\n\n // Only update if following array already exists\n if (currentState.following !== undefined) {\n newState.following = currentState.following.filter(\n (followItem) => followItem.target_feed.feed !== follow.target_feed.feed,\n );\n }\n } else if (\n // someone unfollowed this feed\n follow.target_feed.feed === currentFeedId\n ) {\n const source = follow.source_feed;\n\n newState = {\n ...newState,\n // Update FeedResponse fields, that has the new follower/following count\n ...follow.target_feed,\n };\n\n if (source.created_by.id === connectedUserId) {\n newState.own_follows = currentState.own_follows\n ? currentState.own_follows.filter(\n (followItem) =>\n followItem.source_feed.feed !== follow.source_feed.feed,\n )\n : [];\n }\n\n // Only update if followers array already exists\n if (currentState.followers !== undefined) {\n newState.followers = currentState.followers.filter(\n (followItem) => followItem.source_feed.feed !== follow.source_feed.feed,\n );\n }\n }\n\n return { changed: true, data: newState };\n};\n\nexport function handleFollowDeleted(\n this: Feed,\n eventOrResponse: PartializeAllBut<\n EventPayload<'feeds.follow.deleted'>,\n 'follow'\n >,\n fromWs?: boolean,\n) {\n const follow = eventOrResponse.follow;\n\n if (\n !shouldUpdateState({\n stateUpdateQueueId: getStateUpdateQueueId(follow, 'follow-deleted'),\n stateUpdateQueue: this.stateUpdateQueue,\n watch: this.currentState.watch,\n fromWs,\n isTriggeredByConnectedUser:\n this.client.state.getLatestValue().connected_user?.id ===\n follow.source_feed.created_by.id,\n })\n ) {\n return;\n }\n\n const connectedUser = this.client.state.getLatestValue().connected_user;\n const result = updateStateFollowDeleted(\n follow,\n this.currentState,\n this.feed,\n connectedUser?.id,\n );\n\n if (result.changed) {\n this.state.next(result.data);\n }\n}\n","import type { Feed, FeedState } from '../../feed';\nimport { getStateUpdateQueueId, shouldUpdateState } from '../../../utils';\nimport type { EventPayload, PartializeAllBut } from '../../../types-internal';\n\nexport function handleFollowUpdated(\n this: Feed,\n eventOrResponse: PartializeAllBut<\n EventPayload<'feeds.follow.updated'>,\n 'follow'\n >,\n fromWs?: boolean,\n) {\n const follow = eventOrResponse.follow;\n const connectedUserId = this.client.state.getLatestValue().connected_user?.id;\n const currentFeedId = this.feed;\n\n if (\n !shouldUpdateState({\n stateUpdateQueueId: getStateUpdateQueueId(follow, 'follow-updated'),\n stateUpdateQueue: this.stateUpdateQueue,\n watch: this.currentState.watch,\n fromWs,\n isTriggeredByConnectedUser:\n this.client.state.getLatestValue().connected_user?.id ===\n follow.source_feed.created_by.id,\n })\n ) {\n return;\n }\n\n this.state.next((currentState) => {\n let newState: FeedState | undefined;\n\n // this feed followed someone\n if (follow.source_feed.feed === currentFeedId) {\n newState ??= {\n ...currentState,\n // Update FeedResponse fields, that has the new follower/following count\n ...follow.source_feed,\n };\n\n const index =\n currentState.following?.findIndex(\n (f) => f.target_feed.feed === follow.target_feed.feed,\n ) ?? -1;\n\n if (index >= 0) {\n newState.following = [...newState.following!];\n newState.following[index] = follow;\n }\n } else if (\n // someone followed this feed\n follow.target_feed.feed === currentFeedId\n ) {\n const source = follow.source_feed;\n\n newState ??= {\n ...currentState,\n // Update FeedResponse fields, that has the new follower/following count\n ...follow.target_feed,\n };\n\n if (\n source.created_by.id === connectedUserId &&\n currentState.own_follows\n ) {\n const index = currentState.own_follows.findIndex(\n (f) => f.source_feed.feed === follow.source_feed.feed,\n );\n\n if (index >= 0) {\n newState.own_follows = [...currentState.own_follows];\n newState.own_follows[index] = follow;\n }\n }\n\n const index =\n currentState.followers?.findIndex(\n (f) => f.source_feed.feed === follow.source_feed.feed,\n ) ?? -1;\n\n if (index >= 0) {\n newState.followers = [...newState.followers!];\n newState.followers[index] = follow;\n }\n }\n\n return newState ?? currentState;\n });\n}\n","import type { Feed } from '../feed';\nimport type { UserResponseCommonFields } from '../gen/models';\n\nexport function eventTriggeredByConnectedUser(\n this: Feed,\n payload: { user?: UserResponseCommonFields },\n) {\n const connectedUser = this.client.state.getLatestValue().connected_user;\n const payloadUser = payload.user ?? connectedUser;\n\n return (\n typeof connectedUser !== 'undefined' &&\n connectedUser?.id === payloadUser?.id\n );\n}\n","import type { Feed } from '../../feed';\nimport type { EventPayload, PartializeAllBut } from '../../../types-internal';\nimport { getStateUpdateQueueId, shouldUpdateState } from '../../../utils';\nimport { eventTriggeredByConnectedUser } from '../../../utils/event-triggered-by-connected-user';\n\nexport type CommentAddedPayload = PartializeAllBut<\n EventPayload<'feeds.comment.added'>,\n 'comment'\n>;\n\nexport function handleCommentAdded(\n this: Feed,\n payload: CommentAddedPayload,\n fromWs?: boolean,\n) {\n const { comment } = payload;\n const entityId = comment.parent_id ?? comment.object_id;\n\n if (\n !shouldUpdateState({\n stateUpdateQueueId: getStateUpdateQueueId(payload, 'comment-created'),\n stateUpdateQueue: this.stateUpdateQueue,\n watch: this.currentState.watch,\n fromWs,\n isTriggeredByConnectedUser: eventTriggeredByConnectedUser.call(this, payload),\n })\n ) {\n return;\n }\n\n this.state.next((currentState) => {\n const entityState = currentState.comments_by_entity_id[entityId];\n\n if (typeof entityState?.comments === 'undefined') {\n return currentState;\n }\n\n const newComments = entityState?.comments ? [...entityState.comments] : [];\n\n if (entityState.pagination?.sort === 'last') {\n newComments.unshift(comment);\n } else {\n // 'first' and other sort options\n newComments.push(comment);\n }\n\n return {\n ...currentState,\n comments_by_entity_id: {\n ...currentState.comments_by_entity_id,\n [entityId]: {\n ...currentState.comments_by_entity_id[entityId],\n comments: newComments,\n },\n },\n };\n });\n}\n","import type { Feed } from '../../feed';\nimport type { EventPayload} from '../../../types-internal';\nimport { type PartializeAllBut } from '../../../types-internal';\nimport { getStateUpdateQueueId, shouldUpdateState } from '../../../utils';\nimport {\n eventTriggeredByConnectedUser\n} from '../../../utils/event-triggered-by-connected-user';\n\nexport type CommentDeletedPayload = PartializeAllBut<\n EventPayload<'feeds.comment.deleted'>,\n 'comment'\n>;\n\nexport function handleCommentDeleted(\n this: Feed,\n payload: CommentDeletedPayload,\n fromWs?: boolean,\n) {\n const { comment } = payload;\n const entityId = comment.parent_id ?? comment.object_id;\n\n if (\n !shouldUpdateState({\n stateUpdateQueueId: getStateUpdateQueueId(\n payload,\n 'comment-deleted',\n ),\n stateUpdateQueue: this.stateUpdateQueue,\n watch: this.currentState.watch,\n fromWs,\n isTriggeredByConnectedUser: eventTriggeredByConnectedUser.call(this, payload),\n })\n ) {\n return;\n }\n\n this.state.next((currentState) => {\n let newCommentsByEntityId:\n | typeof currentState.comments_by_entity_id\n | undefined;\n\n const index = this.getCommentIndex(comment, currentState);\n\n if (index !== -1) {\n newCommentsByEntityId ??= {\n ...currentState.comments_by_entity_id,\n [entityId]: {\n ...currentState.comments_by_entity_id[entityId],\n },\n };\n\n newCommentsByEntityId[entityId]!.comments = [\n ...newCommentsByEntityId[entityId]!.comments!,\n ];\n\n newCommentsByEntityId[entityId]?.comments?.splice(index, 1);\n }\n\n if (typeof currentState.comments_by_entity_id[comment.id] !== 'undefined') {\n newCommentsByEntityId ??= {\n ...currentState.comments_by_entity_id,\n };\n\n delete newCommentsByEntityId[comment.id];\n }\n\n if (!newCommentsByEntityId) {\n return currentState;\n }\n\n return {\n ...currentState,\n comments_by_entity_id: newCommentsByEntityId,\n };\n });\n}\n","import type { Feed } from '../../feed';\nimport type { EventPayload} from '../../../types-internal';\nimport { type PartializeAllBut } from '../../../types-internal';\nimport { getStateUpdateQueueId, shouldUpdateState } from '../../../utils';\nimport {\n eventTriggeredByConnectedUser\n} from '../../../utils/event-triggered-by-connected-user';\n\nexport type CommentUpdatedPayload = PartializeAllBut<\n EventPayload<'feeds.comment.updated'>,\n 'comment'\n>;\n\nexport function handleCommentUpdated(\n this: Feed,\n payload: CommentUpdatedPayload,\n fromWs?: boolean,\n) {\n const { comment } = payload;\n const entityId = comment.parent_id ?? comment.object_id;\n\n if (\n !shouldUpdateState({\n stateUpdateQueueId: getStateUpdateQueueId(\n payload,\n 'comment-updated',\n ),\n stateUpdateQueue: this.stateUpdateQueue,\n watch: this.currentState.watch,\n fromWs,\n isTriggeredByConnectedUser: eventTriggeredByConnectedUser.call(this, payload),\n })\n ) {\n return;\n }\n\n this.state.next((currentState) => {\n const entityState = currentState.comments_by_entity_id[entityId];\n\n if (!entityState?.comments?.length) return currentState;\n\n const index = this.getCommentIndex(comment, currentState);\n\n if (index === -1) return currentState;\n\n const newComments = [...entityState.comments];\n\n newComments[index] = comment;\n\n return {\n ...currentState,\n comments_by_entity_id: {\n ...currentState.comments_by_entity_id,\n [entityId]: {\n ...currentState.comments_by_entity_id[entityId],\n comments: newComments,\n },\n },\n };\n });\n}\n","import type { Feed } from '../../feed';\nimport type { EventPayload } from '../../../types-internal';\nimport { type PartializeAllBut } from '../../../types-internal';\nimport { getStateUpdateQueueId, shouldUpdateState } from '../../../utils';\n\nexport type CommentReactionAddedPayload = PartializeAllBut<\n EventPayload<'feeds.comment.reaction.added'>,\n 'comment' | 'reaction'\n>;\n\nexport function handleCommentReactionAdded(\n this: Feed,\n payload: CommentReactionAddedPayload,\n fromWs?: boolean,\n) {\n const { comment, reaction } = payload;\n const connectedUser = this.client.state.getLatestValue().connected_user;\n\n const isOwnReaction = reaction.user.id === connectedUser?.id;\n\n if (\n !shouldUpdateState({\n stateUpdateQueueId: getStateUpdateQueueId(\n payload,\n 'comment-reaction-created',\n ),\n stateUpdateQueue: this.stateUpdateQueue,\n watch: this.currentState.watch,\n fromWs,\n isTriggeredByConnectedUser: isOwnReaction,\n })\n ) {\n return;\n }\n\n this.state.next((currentState) => {\n const commentIndex = this.getCommentIndex(comment, currentState);\n\n if (commentIndex === -1) return currentState;\n\n const forId = comment.parent_id ?? comment.object_id;\n\n const entityState = currentState.comments_by_entity_id[forId];\n\n const newComments = entityState?.comments?.concat([]) ?? [];\n\n let ownReactions = newComments[commentIndex].own_reactions;\n\n if (isOwnReaction) {\n ownReactions = ownReactions.concat(reaction) ?? [reaction];\n }\n\n newComments[commentIndex] = {\n ...newComments[commentIndex],\n reaction_count: comment.reaction_count ?? 0,\n latest_reactions: comment.latest_reactions ?? [],\n reaction_groups: comment.reaction_groups ?? {},\n own_reactions: ownReactions,\n };\n\n return {\n ...currentState,\n comments_by_entity_id: {\n ...currentState.comments_by_entity_id,\n [forId]: {\n ...entityState,\n comments: newComments,\n },\n },\n };\n });\n}\n","import type { Feed } from '../../feed';\nimport type { EventPayload} from '../../../types-internal';\nimport { type PartializeAllBut } from '../../../types-internal';\nimport { getStateUpdateQueueId, shouldUpdateState } from '../../../utils';\n\nexport type CommentReactionDeletedPayload = PartializeAllBut<\n EventPayload<'feeds.comment.reaction.deleted'>,\n 'comment' | 'reaction'\n>;\n\nexport function handleCommentReactionDeleted(\n this: Feed,\n payload: CommentReactionDeletedPayload,\n fromWs?: boolean,\n) {\n const { comment, reaction } = payload;\n const connectedUser = this.client.state.getLatestValue().connected_user;\n\n const isOwnReaction = reaction.user.id === connectedUser?.id;\n\n if (\n !shouldUpdateState({\n stateUpdateQueueId: getStateUpdateQueueId(\n payload,\n 'comment-reaction-deleted',\n ),\n stateUpdateQueue: this.stateUpdateQueue,\n watch: this.currentState.watch,\n fromWs,\n isTriggeredByConnectedUser: isOwnReaction,\n })\n ) {\n return;\n }\n\n this.state.next((currentState) => {\n const commentIndex = this.getCommentIndex(comment, currentState);\n\n if (commentIndex === -1) return currentState;\n\n const forId = comment.parent_id ?? comment.object_id;\n\n const entityState = currentState.comments_by_entity_id[forId];\n\n const newComments = entityState?.comments?.concat([]) ?? [];\n\n let ownReactions = newComments[commentIndex].own_reactions;\n\n if (isOwnReaction) {\n ownReactions = ownReactions.filter(\n (r) => r.type !== reaction.type,\n );\n }\n\n newComments[commentIndex] = {\n ...newComments[commentIndex],\n reaction_count: comment.reaction_count ?? 0,\n // TODO: FIXME this should be handled by the backend\n latest_reactions: comment.latest_reactions ?? [],\n reaction_groups: comment.reaction_groups ?? {},\n own_reactions: ownReactions,\n };\n\n return {\n ...currentState,\n comments_by_entity_id: {\n ...currentState.comments_by_entity_id,\n [forId]: {\n ...entityState,\n comments: newComments,\n },\n },\n };\n });\n}\n","import type { Feed } from '../../feed';\nimport type { EventPayload } from '../../../types-internal';\nimport { type PartializeAllBut } from '../../../types-internal';\nimport { getStateUpdateQueueId, shouldUpdateState } from '../../../utils';\n\nexport type CommentReactionUpdatedPayload = PartializeAllBut<\n EventPayload<'feeds.comment.reaction.updated'>,\n 'comment' | 'reaction'\n>;\n\nexport function handleCommentReactionUpdated(\n this: Feed,\n payload: CommentReactionUpdatedPayload,\n fromWs?: boolean,\n) {\n const { comment, reaction } = payload;\n const connectedUser = this.client.state.getLatestValue().connected_user;\n\n const isOwnReaction = reaction.user.id === connectedUser?.id;\n\n if (\n !shouldUpdateState({\n stateUpdateQueueId: getStateUpdateQueueId(\n payload,\n 'comment-reaction-updated',\n ),\n stateUpdateQueue: this.stateUpdateQueue,\n watch: this.currentState.watch,\n fromWs,\n isTriggeredByConnectedUser: isOwnReaction,\n })\n ) {\n return;\n }\n\n this.state.next((currentState) => {\n const commentIndex = this.getCommentIndex(comment, currentState);\n\n if (commentIndex === -1) return currentState;\n\n const forId = comment.parent_id ?? comment.object_id;\n\n const entityState = currentState.comments_by_entity_id[forId];\n\n const newComments = entityState?.comments?.concat([]) ?? [];\n\n let ownReactions = newComments[commentIndex].own_reactions;\n\n if (isOwnReaction) {\n ownReactions = [reaction];\n }\n\n newComments[commentIndex] = {\n ...newComments[commentIndex],\n reaction_count: comment.reaction_count ?? 0,\n latest_reactions: comment.latest_reactions ?? [],\n reaction_groups: comment.reaction_groups ?? {},\n own_reactions: ownReactions,\n };\n\n return {\n ...currentState,\n comments_by_entity_id: {\n ...currentState.comments_by_entity_id,\n [forId]: {\n ...entityState,\n comments: newComments,\n },\n },\n };\n });\n}\n","import type { Feed, FeedState } from '../../../feed';\nimport type { EventPayload } from '../../../types-internal';\n\nexport function handleFeedMemberAdded(\n this: Feed,\n event: EventPayload<'feeds.feed_member.added'>,\n) {\n const { connected_user: connectedUser } = this.client.state.getLatestValue();\n\n this.state.next((currentState) => {\n let newState: FeedState | undefined;\n\n if (typeof currentState.members !== 'undefined') {\n newState ??= {\n ...currentState,\n };\n\n newState.members = [event.member, ...currentState.members];\n }\n\n if (connectedUser?.id === event.member.user.id) {\n newState ??= {\n ...currentState,\n };\n\n newState.own_membership = event.member;\n }\n\n return newState ?? currentState;\n });\n}\n","import type { Feed, FeedState } from '../../../feed';\nimport type { EventPayload } from '../../../types-internal';\n\nexport function handleFeedMemberUpdated(\n this: Feed,\n event: EventPayload<'feeds.feed_member.updated'>,\n) {\n const { connected_user: connectedUser } = this.client.state.getLatestValue();\n\n this.state.next((currentState) => {\n const memberIndex =\n currentState.members?.findIndex(\n (member) => member.user.id === event.member.user.id,\n ) ?? -1;\n\n let newState: FeedState | undefined;\n\n if (memberIndex !== -1) {\n // if there's an index, there's a member to update\n const newMembers = [...currentState.members!];\n newMembers[memberIndex] = event.member;\n\n newState ??= {\n ...currentState,\n };\n\n newState.members = newMembers;\n }\n\n if (connectedUser?.id === event.member.user.id) {\n newState ??= {\n ...currentState,\n };\n\n newState.own_membership = event.member;\n }\n\n return newState ?? currentState;\n });\n}\n","import type { Feed, FeedState } from '../../../feed';\nimport type { EventPayload } from '../../../types-internal';\n\nexport function handleFeedMemberRemoved(\n this: Feed,\n event: EventPayload<'feeds.feed_member.removed'>,\n) {\n const { connected_user: connectedUser } = this.client.state.getLatestValue();\n\n this.state.next((currentState) => {\n let newState: FeedState | undefined;\n\n if (typeof currentState.members !== 'undefined') {\n const filtered = currentState.members.filter(\n (member) => member.user.id !== event.member_id,\n );\n\n if (filtered.length !== currentState.members.length) {\n newState ??= { ...currentState };\n newState.members = filtered;\n }\n }\n\n if (\n connectedUser?.id === event.member_id &&\n typeof currentState.own_membership !== 'undefined'\n ) {\n newState ??= { ...currentState };\n delete newState.own_membership;\n }\n\n return newState ?? currentState;\n });\n}\n","import type { Feed } from '../../../feed';\nimport type {\n ActivityPinResponse,\n ActivityResponse,\n BookmarkAddedEvent,\n} from '../../../gen/models';\nimport type { EventPayload } from '../../../types-internal';\nimport { updateEntityInArray } from '../../../utils';\n\nconst sharedUpdateActivity = ({\n currentActivity,\n event,\n eventBelongsToCurrentUser,\n}: {\n currentActivity: ActivityResponse;\n event: BookmarkAddedEvent;\n eventBelongsToCurrentUser: boolean;\n}): ActivityResponse => {\n let newOwnBookmarks = currentActivity.own_bookmarks;\n\n if (eventBelongsToCurrentUser) {\n newOwnBookmarks = [...newOwnBookmarks, event.bookmark];\n }\n\n return {\n ...currentActivity,\n bookmark_count: event.bookmark.activity.bookmark_count,\n own_bookmarks: newOwnBookmarks,\n };\n};\n\nexport const addBookmarkToActivities = (\n event: BookmarkAddedEvent,\n activities: ActivityResponse[] | undefined,\n eventBelongsToCurrentUser: boolean,\n) =>\n updateEntityInArray({\n entities: activities,\n matcher: (activity) => activity.id === event.bookmark.activity.id,\n updater: (matchedActivity) =>\n sharedUpdateActivity({\n currentActivity: matchedActivity,\n event,\n eventBelongsToCurrentUser,\n }),\n });\n\nexport const addBookmarkToPinnedActivities = (\n event: BookmarkAddedEvent,\n pinnedActivities: ActivityPinResponse[] | undefined,\n eventBelongsToCurrentUser: boolean,\n) =>\n updateEntityInArray({\n entities: pinnedActivities,\n matcher: (pinnedActivity) =>\n pinnedActivity.activity.id === event.bookmark.activity.id,\n updater: (matchedPinnedActivity) => {\n const newActivity = sharedUpdateActivity({\n currentActivity: matchedPinnedActivity.activity,\n event,\n eventBelongsToCurrentUser,\n });\n\n if (newActivity === matchedPinnedActivity.activity) {\n return matchedPinnedActivity;\n }\n\n return {\n ...matchedPinnedActivity,\n activity: newActivity,\n };\n },\n });\n\nexport function handleBookmarkAdded(\n this: Feed,\n event: EventPayload<'feeds.bookmark.added'>,\n) {\n const {\n activities: currentActivities,\n pinned_activities: currentPinnedActivities,\n } = this.currentState;\n const { connected_user: connectedUser } = this.client.state.getLatestValue();\n const eventBelongsToCurrentUser =\n event.bookmark.user.id === connectedUser?.id;\n\n const [result1, result2] = [\n addBookmarkToActivities(\n event,\n currentActivities,\n eventBelongsToCurrentUser,\n ),\n addBookmarkToPinnedActivities(\n event,\n currentPinnedActivities,\n eventBelongsToCurrentUser,\n ),\n ];\n\n if (result1.changed || result2.changed) {\n this.state.partialNext({\n activities: result1.entities,\n pinned_activities: result2.entities,\n });\n }\n}\n","import type { Feed } from '../../../feed';\nimport type {\n ActivityPinResponse,\n ActivityResponse,\n BookmarkDeletedEvent,\n BookmarkResponse,\n} from '../../../gen/models';\nimport type { EventPayload } from '../../../types-internal';\nimport { updateEntityInArray } from '../../../utils';\n\n// Helper function to check if two bookmarks are the same\n// A bookmark is identified by activity_id + folder_id + user_id\nexport const isSameBookmark = (\n bookmark1: BookmarkResponse,\n bookmark2: BookmarkResponse,\n): boolean => {\n return (\n bookmark1.user.id === bookmark2.user.id &&\n bookmark1.activity.id === bookmark2.activity.id &&\n bookmark1.folder?.id === bookmark2.folder?.id\n );\n};\n\nconst sharedUpdateActivity = ({\n currentActivity,\n event,\n eventBelongsToCurrentUser,\n}: {\n currentActivity: ActivityResponse;\n event: BookmarkDeletedEvent;\n eventBelongsToCurrentUser: boolean;\n}): ActivityResponse => {\n let newOwnBookmarks = currentActivity.own_bookmarks;\n\n if (eventBelongsToCurrentUser) {\n newOwnBookmarks = currentActivity.own_bookmarks.filter(\n (bookmark) => !isSameBookmark(bookmark, event.bookmark),\n );\n }\n\n return {\n ...currentActivity,\n bookmark_count: event.bookmark.activity.bookmark_count,\n own_bookmarks: newOwnBookmarks,\n };\n};\n\nexport const removeBookmarkFromActivities = (\n event: BookmarkDeletedEvent,\n activities: ActivityResponse[] | undefined,\n eventBelongsToCurrentUser: boolean,\n) =>\n updateEntityInArray({\n entities: activities,\n matcher: (activity) => activity.id === event.bookmark.activity.id,\n updater: (matchedActivity) =>\n sharedUpdateActivity({\n currentActivity: matchedActivity,\n event,\n eventBelongsToCurrentUser,\n }),\n });\n\nexport const removeBookmarkFromPinnedActivities = (\n event: BookmarkDeletedEvent,\n pinnedActivities: ActivityPinResponse[] | undefined,\n eventBelongsToCurrentUser: boolean,\n) =>\n updateEntityInArray({\n entities: pinnedActivities,\n matcher: (pinnedActivity) =>\n pinnedActivity.activity.id === event.bookmark.activity.id,\n updater: (matchedPinnedActivity) => {\n const newActivity = sharedUpdateActivity({\n currentActivity: matchedPinnedActivity.activity,\n event,\n eventBelongsToCurrentUser,\n });\n\n if (newActivity === matchedPinnedActivity.activity) {\n return matchedPinnedActivity;\n }\n\n return {\n ...matchedPinnedActivity,\n activity: newActivity,\n };\n },\n });\n\nexport function handleBookmarkDeleted(\n this: Feed,\n event: EventPayload<'feeds.bookmark.deleted'>,\n) {\n const {\n activities: currentActivities,\n pinned_activities: currentPinnedActivities,\n } = this.currentState;\n const { connected_user: connectedUser } = this.client.state.getLatestValue();\n const eventBelongsToCurrentUser =\n event.bookmark.user.id === connectedUser?.id;\n\n const [result1, result2] = [\n removeBookmarkFromActivities(\n event,\n currentActivities,\n eventBelongsToCurrentUser,\n ),\n removeBookmarkFromPinnedActivities(\n event,\n currentPinnedActivities,\n eventBelongsToCurrentUser,\n ),\n ];\n\n if (result1.changed || result2.changed) {\n this.state.partialNext({\n activities: result1.entities,\n pinned_activities: result2.entities,\n });\n }\n}\n","import type { Feed } from '../../../feed';\nimport type {\n ActivityPinResponse,\n ActivityResponse,\n BookmarkUpdatedEvent,\n} from '../../../gen/models';\nimport type { EventPayload } from '../../../types-internal';\nimport { updateEntityInArray } from '../../../utils';\n\nimport { isSameBookmark } from './handle-bookmark-deleted';\n\nconst sharedUpdateActivity = ({\n currentActivity,\n event,\n eventBelongsToCurrentUser,\n}: {\n currentActivity: ActivityResponse;\n event: BookmarkUpdatedEvent;\n eventBelongsToCurrentUser: boolean;\n}): ActivityResponse => {\n let newOwnBookmarks = currentActivity.own_bookmarks;\n\n if (eventBelongsToCurrentUser) {\n const bookmarkIndex = newOwnBookmarks.findIndex((bookmark) =>\n isSameBookmark(bookmark, event.bookmark),\n );\n\n if (bookmarkIndex !== -1) {\n newOwnBookmarks = [...newOwnBookmarks];\n newOwnBookmarks[bookmarkIndex] = event.bookmark;\n }\n }\n\n return {\n ...currentActivity,\n bookmark_count: event.bookmark.activity.bookmark_count,\n own_bookmarks: newOwnBookmarks,\n };\n};\n\nexport const updateBookmarkInActivities = (\n event: BookmarkUpdatedEvent,\n activities: ActivityResponse[] | undefined,\n eventBelongsToCurrentUser: boolean,\n) =>\n updateEntityInArray({\n entities: activities,\n matcher: (activity) => activity.id === event.bookmark.activity.id,\n updater: (matchedActivity) =>\n sharedUpdateActivity({\n currentActivity: matchedActivity,\n event,\n eventBelongsToCurrentUser,\n }),\n });\n\nexport const updateBookmarkInPinnedActivities = (\n event: BookmarkUpdatedEvent,\n pinnedActivities: ActivityPinResponse[] | undefined,\n eventBelongsToCurrentUser: boolean,\n) =>\n updateEntityInArray({\n entities: pinnedActivities,\n matcher: (pinnedActivity) =>\n pinnedActivity.activity.id === event.bookmark.activity.id,\n updater: (matchedPinnedActivity) => {\n const newActivity = sharedUpdateActivity({\n currentActivity: matchedPinnedActivity.activity,\n event,\n eventBelongsToCurrentUser,\n });\n\n if (newActivity === matchedPinnedActivity.activity) {\n return matchedPinnedActivity;\n }\n\n return {\n ...matchedPinnedActivity,\n activity: newActivity,\n };\n },\n });\n\nexport function handleBookmarkUpdated(\n this: Feed,\n event: EventPayload<'feeds.bookmark.updated'>,\n) {\n const {\n activities: currentActivities,\n pinned_activities: currentPinnedActivities,\n } = this.currentState;\n const { connected_user: connectedUser } = this.client.state.getLatestValue();\n const eventBelongsToCurrentUser =\n event.bookmark.user.id === connectedUser?.id;\n\n const [result1, result2] = [\n updateBookmarkInActivities(\n event,\n currentActivities,\n eventBelongsToCurrentUser,\n ),\n updateBookmarkInPinnedActivities(\n event,\n currentPinnedActivities,\n eventBelongsToCurrentUser,\n ),\n ];\n\n if (result1.changed || result2.changed) {\n this.state.partialNext({\n activities: result1.entities,\n pinned_activities: result2.entities,\n });\n }\n}\n","import type { Feed } from '../../feed';\nimport type { ActivityResponse } from '../../../gen/models';\nimport type { EventPayload } from '../../../types-internal';\n\nexport function addActivitiesToState(\n this: Feed,\n newActivities: ActivityResponse[],\n activities: ActivityResponse[] | undefined,\n position: 'start' | 'end',\n { fromWebSocket }: { fromWebSocket: boolean } = { fromWebSocket: false },\n) {\n if (activities === undefined) {\n return {\n changed: false,\n activities: [],\n };\n }\n\n let result = {\n changed: false,\n activities,\n };\n\n const newActivitiesDeduplicated: ActivityResponse[] = [];\n newActivities.forEach((newActivityResponse) => {\n if (!this.hasActivity(newActivityResponse.id)) {\n newActivitiesDeduplicated.push(newActivityResponse);\n }\n });\n\n if (newActivitiesDeduplicated.length > 0) {\n const updatedActivities = [\n ...(position === 'start' ? newActivitiesDeduplicated : []),\n ...activities,\n ...(position === 'end' ? newActivitiesDeduplicated : []),\n ];\n this.newActivitiesAdded(newActivitiesDeduplicated, { fromWebSocket });\n\n result = { changed: true, activities: updatedActivities };\n }\n\n return result;\n}\n\nexport function handleActivityAdded(\n this: Feed,\n event: EventPayload<'feeds.activity.added'>,\n) {\n if (this.activityAddedEventFilter) {\n if (!this.activityAddedEventFilter(event)) {\n return;\n }\n }\n const currentActivities = this.currentState.activities;\n const result = addActivitiesToState.bind(this)(\n [event.activity],\n currentActivities,\n this.currentState.addNewActivitiesTo,\n { fromWebSocket: true },\n );\n if (result.changed) {\n const activity = event.activity;\n this.client.hydratePollCache([activity]);\n\n this.state.partialNext({ activities: result.activities });\n }\n}\n","import type { Feed } from '../../feed';\nimport type {\n ActivityPinResponse,\n ActivityResponse,\n} from '../../../gen/models';\nimport type { EventPayload, UpdateStateResult } from '../../../types-internal';\n\nexport function removeActivityFromState(\n this: Feed,\n activityResponse: ActivityResponse,\n activities: ActivityResponse[] | undefined,\n): UpdateStateResult<{\n activities: ActivityResponse[] | undefined;\n}> {\n if (this.hasActivity(activityResponse.id)) {\n const index =\n activities?.findIndex(\n (activity) => activity.id === activityResponse.id,\n ) ?? -1;\n const newActivities = [...activities!];\n newActivities.splice(index, 1);\n return { changed: true, activities: newActivities };\n } else {\n return { changed: false, activities };\n }\n}\n\nexport const removePinnedActivityFromState = (\n activityResponse: ActivityResponse,\n pinnedActivities: ActivityPinResponse[] | undefined,\n): UpdateStateResult<{\n pinned_activities: ActivityPinResponse[] | undefined;\n}> => {\n const index =\n pinnedActivities?.findIndex(\n (pinnedActivity) => pinnedActivity.activity.id === activityResponse.id,\n ) ?? -1;\n\n if (index !== -1) {\n const newActivities = [...pinnedActivities!];\n newActivities.splice(index, 1);\n return { changed: true, pinned_activities: newActivities };\n } else {\n return { changed: false, pinned_activities: pinnedActivities };\n }\n};\n\nexport function handleActivityDeleted(\n this: Feed,\n event: EventPayload<'feeds.activity.deleted'>,\n) {\n const {\n activities: currentActivities,\n pinned_activities: currentPinnedActivities,\n } = this.currentState;\n\n const [result1, result2] = [\n this.hasActivity(event.activity.id)\n ? removeActivityFromState.bind(this)(event.activity, currentActivities)\n : undefined,\n removePinnedActivityFromState(event.activity, currentPinnedActivities),\n ];\n\n if (result1?.changed || result2.changed) {\n this.state.partialNext({\n activities: result1?.changed ? result1.activities : currentActivities,\n pinned_activities: result2.pinned_activities,\n });\n }\n}\n","import type { Feed } from '../../../feed';\nimport type { EventPayload } from '../../../types-internal';\nimport { removeActivityFromState } from './handle-activity-deleted';\n\nexport function handleActivityRemovedFromFeed(\n this: Feed,\n event: EventPayload<'feeds.activity.removed_from_feed'>,\n) {\n const currentActivities = this.currentState.activities;\n if (currentActivities) {\n const result = removeActivityFromState.bind(this)(event.activity, currentActivities);\n if (result.changed) {\n this.state.partialNext({ activities: result.activities });\n }\n }\n}\n","import type { ActivityResponse } from '../../gen/models';\n\nexport const updateActivity = ({\n currentActivity,\n newActivtiy,\n}: {\n currentActivity: ActivityResponse;\n newActivtiy: ActivityResponse;\n}) => {\n return {\n ...newActivtiy,\n own_reactions: currentActivity.own_reactions,\n own_bookmarks: currentActivity.own_bookmarks,\n };\n};\n","import type { Feed } from '../../../feed';\nimport type {\n ActivityPinResponse,\n ActivityResponse,\n} from '../../../gen/models';\nimport type { EventPayload, PartializeAllBut } from '../../../types-internal';\nimport {\n getStateUpdateQueueId,\n shouldUpdateState,\n updateEntityInArray,\n} from '../../../utils';\nimport { eventTriggeredByConnectedUser } from '../../../utils/event-triggered-by-connected-user';\nimport { updateActivity } from '../activity-updater';\n\nexport type ActivityUpdatedPayload = PartializeAllBut<\n EventPayload<'feeds.activity.updated'>,\n 'activity'\n>;\n\nconst sharedUpdateActivity = updateActivity;\n\nexport const updateActivityInState = (\n event: ActivityUpdatedPayload,\n activities: ActivityResponse[] | undefined,\n) =>\n updateEntityInArray({\n entities: activities,\n matcher: (activity) => activity.id === event.activity.id,\n updater: (matchedActivity) =>\n sharedUpdateActivity({\n currentActivity: matchedActivity,\n newActivtiy: event.activity,\n }),\n });\n\nexport const updatePinnedActivityInState = (\n event: ActivityUpdatedPayload,\n pinnedActivities: ActivityPinResponse[] | undefined,\n) =>\n updateEntityInArray({\n entities: pinnedActivities,\n matcher: (pinnedActivity) =>\n pinnedActivity.activity.id === event.activity.id,\n updater: (matchedPinnedActivity) => {\n const newActivity = sharedUpdateActivity({\n currentActivity: matchedPinnedActivity.activity,\n newActivtiy: event.activity,\n });\n\n if (newActivity === matchedPinnedActivity.activity) {\n return matchedPinnedActivity;\n }\n\n return {\n ...matchedPinnedActivity,\n activity: newActivity,\n };\n },\n });\n\nexport function handleActivityUpdated(\n this: Feed,\n payload: ActivityUpdatedPayload,\n fromWs?: boolean,\n) {\n if (\n !shouldUpdateState({\n stateUpdateQueueId: getStateUpdateQueueId(payload, 'activity-updated'),\n stateUpdateQueue: this.stateUpdateQueue,\n watch: this.currentState.watch,\n fromWs,\n isTriggeredByConnectedUser: eventTriggeredByConnectedUser.call(\n this,\n payload,\n ),\n })\n ) {\n return;\n }\n const {\n activities: currentActivities,\n pinned_activities: currentPinnedActivities,\n } = this.currentState;\n\n const [result1, result2] = [\n this.hasActivity(payload.activity.id)\n ? updateActivityInState(payload, currentActivities)\n : undefined,\n updatePinnedActivityInState(payload, currentPinnedActivities),\n ];\n\n if (result1?.changed || result2.changed) {\n this.client.hydratePollCache([payload.activity]);\n\n this.state.partialNext({\n activities: result1?.changed ? result1.entities : currentActivities,\n pinned_activities: result2.entities,\n });\n }\n}\n","import type { Feed } from '../../feed';\nimport type {\n ActivityPinResponse,\n ActivityResponse,\n} from '../../../gen/models';\nimport type { EventPayload, PartializeAllBut } from '../../../types-internal';\nimport {\n getStateUpdateQueueId,\n shouldUpdateState,\n updateEntityInArray,\n} from '../../../utils';\n\nexport type ActivityReactionAddedPayload = PartializeAllBut<\n EventPayload<'feeds.activity.reaction.added'>,\n 'activity' | 'reaction'\n>;\n\n// shared function to update the activity with the new reaction\nconst sharedUpdateActivity = ({\n payload,\n currentActivity,\n eventBelongsToCurrentUser,\n}: {\n payload: ActivityReactionAddedPayload;\n currentActivity: ActivityResponse;\n eventBelongsToCurrentUser: boolean;\n}) => {\n const { activity: newActivity, reaction: newReaction } = payload;\n let newOwnReactions = currentActivity.own_reactions;\n\n if (eventBelongsToCurrentUser) {\n newOwnReactions = [...currentActivity.own_reactions, newReaction];\n }\n\n return {\n ...currentActivity,\n latest_reactions: newActivity.latest_reactions,\n reaction_groups: newActivity.reaction_groups,\n reaction_count: newActivity.reaction_count,\n own_reactions: newOwnReactions,\n };\n};\n\nexport const addReactionToActivities = (\n payload: ActivityReactionAddedPayload,\n activities: ActivityResponse[] | undefined,\n eventBelongsToCurrentUser: boolean,\n) =>\n updateEntityInArray({\n entities: activities,\n matcher: (activity) => activity.id === payload.activity.id,\n updater: (matchedActivity) =>\n sharedUpdateActivity({\n payload,\n currentActivity: matchedActivity,\n eventBelongsToCurrentUser,\n }),\n });\n\nexport const addReactionToPinnedActivities = (\n payload: ActivityReactionAddedPayload,\n pinnedActivities: ActivityPinResponse[] | undefined,\n eventBelongsToCurrentUser: boolean,\n) =>\n updateEntityInArray({\n entities: pinnedActivities,\n matcher: (pinnedActivity) =>\n pinnedActivity.activity.id === payload.activity.id,\n updater: (matchedPinnedActivity) => {\n const updatedActivity = sharedUpdateActivity({\n payload,\n currentActivity: matchedPinnedActivity.activity,\n eventBelongsToCurrentUser,\n });\n\n // this should never happen, but just in case\n if (updatedActivity === matchedPinnedActivity.activity) {\n return matchedPinnedActivity;\n }\n\n return {\n ...matchedPinnedActivity,\n activity: updatedActivity,\n };\n },\n });\n\nexport function handleActivityReactionAdded(\n this: Feed,\n payload: ActivityReactionAddedPayload,\n fromWs?: boolean,\n) {\n const connectedUser = this.client.state.getLatestValue().connected_user;\n\n const eventBelongsToCurrentUser =\n typeof connectedUser !== 'undefined' &&\n payload.reaction.user.id === connectedUser.id;\n\n if (\n !shouldUpdateState({\n stateUpdateQueueId: getStateUpdateQueueId(\n payload,\n 'activity-reaction-created',\n ),\n stateUpdateQueue: this.stateUpdateQueue,\n watch: this.currentState.watch,\n fromWs,\n isTriggeredByConnectedUser: eventBelongsToCurrentUser,\n })\n ) {\n return;\n }\n\n const {\n activities: currentActivities,\n pinned_activities: currentPinnedActivities,\n } = this.currentState;\n\n const [result1, result2] = [\n this.hasActivity(payload.activity.id)\n ? addReactionToActivities(\n payload,\n currentActivities,\n eventBelongsToCurrentUser,\n )\n : undefined,\n addReactionToPinnedActivities(\n payload,\n currentPinnedActivities,\n eventBelongsToCurrentUser,\n ),\n ];\n\n if (result1?.changed || result2.changed) {\n this.state.partialNext({\n ...(result1 ? { activities: result1.entities } : {}),\n pinned_activities: result2.entities,\n });\n }\n}\n","import type { Feed } from '../../feed';\nimport type { ActivityPinResponse, ActivityResponse } from '../../../gen/models';\nimport type { EventPayload, PartializeAllBut } from '../../../types-internal';\nimport {\n getStateUpdateQueueId,\n shouldUpdateState,\n updateEntityInArray,\n} from '../../../utils';\n\nexport type ActivityReactionDeletedPayload = PartializeAllBut<\n EventPayload<'feeds.activity.reaction.deleted'>,\n 'activity' | 'reaction'\n>;\n\nconst sharedUpdateActivity = ({\n currentActivity,\n payload,\n eventBelongsToCurrentUser,\n}: {\n currentActivity: ActivityResponse;\n payload: ActivityReactionDeletedPayload;\n eventBelongsToCurrentUser: boolean;\n}) => {\n const { activity: newActivity, reaction: newReaction } = payload;\n let newOwnReactions = currentActivity.own_reactions;\n\n if (eventBelongsToCurrentUser) {\n newOwnReactions = currentActivity.own_reactions.filter(\n (reaction) =>\n !(\n reaction.type === newReaction.type &&\n reaction.user.id === newReaction.user.id\n ),\n );\n }\n\n return {\n ...currentActivity,\n latest_reactions: newActivity.latest_reactions,\n reaction_groups: newActivity.reaction_groups,\n reaction_count: newActivity.reaction_count,\n own_reactions: newOwnReactions,\n };\n};\n\nexport const removeReactionFromActivities = (\n payload: ActivityReactionDeletedPayload,\n activities: ActivityResponse[] | undefined,\n eventBelongsToCurrentUser: boolean,\n) =>\n updateEntityInArray({\n entities: activities,\n matcher: (activity) => activity.id === payload.activity.id,\n updater: (matchedActivity) =>\n sharedUpdateActivity({\n currentActivity: matchedActivity,\n payload,\n eventBelongsToCurrentUser,\n }),\n });\n\nexport const removeReactionFromPinnedActivities = (\n payload: ActivityReactionDeletedPayload,\n activities: ActivityPinResponse[] | undefined,\n eventBelongsToCurrentUser: boolean,\n) =>\n updateEntityInArray({\n entities: activities,\n matcher: (pinnedActivity) =>\n pinnedActivity.activity.id === payload.activity.id,\n updater: (matchedPinnedActivity) => {\n const newActivity = sharedUpdateActivity({\n currentActivity: matchedPinnedActivity.activity,\n payload,\n eventBelongsToCurrentUser,\n });\n\n if (newActivity === matchedPinnedActivity.activity) {\n return matchedPinnedActivity;\n }\n\n return {\n ...matchedPinnedActivity,\n activity: newActivity,\n };\n },\n });\n\nexport function handleActivityReactionDeleted(\n this: Feed,\n payload: ActivityReactionDeletedPayload,\n fromWs?: boolean,\n) {\n const connectedUser = this.client.state.getLatestValue().connected_user;\n const eventBelongsToCurrentUser =\n typeof connectedUser !== 'undefined' &&\n payload.reaction.user.id === connectedUser.id;\n\n if (\n !shouldUpdateState({\n stateUpdateQueueId: getStateUpdateQueueId(\n payload,\n 'activity-reaction-deleted',\n ),\n stateUpdateQueue: this.stateUpdateQueue,\n watch: this.currentState.watch,\n fromWs,\n isTriggeredByConnectedUser: eventBelongsToCurrentUser\n })\n ) {\n return;\n }\n\n const {\n activities: currentActivities,\n pinned_activities: currentPinnedActivities,\n } = this.currentState;\n\n const [result1, result2] = [\n this.hasActivity(payload.activity.id)\n ? removeReactionFromActivities(\n payload,\n currentActivities,\n eventBelongsToCurrentUser,\n )\n : undefined,\n removeReactionFromPinnedActivities(\n payload,\n currentPinnedActivities,\n eventBelongsToCurrentUser,\n ),\n ];\n\n if (result1?.changed || result2.changed) {\n this.state.partialNext({\n ...(result1 ? { activities: result1.entities } : {}),\n pinned_activities: result2.entities,\n });\n }\n}\n","import type { Feed } from '../../feed';\nimport type {\n ActivityPinResponse,\n ActivityResponse,\n} from '../../../gen/models';\nimport type { EventPayload, PartializeAllBut } from '../../../types-internal';\nimport {\n getStateUpdateQueueId,\n shouldUpdateState,\n updateEntityInArray,\n} from '../../../utils';\n\nexport type ActivityReactionUpdatedPayload = PartializeAllBut<\n EventPayload<'feeds.activity.reaction.updated'>,\n 'activity' | 'reaction'\n>;\n\n// shared function to update the activity with the new reaction\nconst sharedUpdateActivity = ({\n payload,\n currentActivity,\n eventBelongsToCurrentUser,\n}: {\n payload: ActivityReactionUpdatedPayload;\n currentActivity: ActivityResponse;\n eventBelongsToCurrentUser: boolean;\n}) => {\n const { activity: newActivity, reaction: newReaction } = payload;\n let ownReactions = currentActivity.own_reactions;\n\n if (eventBelongsToCurrentUser) {\n ownReactions = [newReaction];\n }\n\n return {\n ...currentActivity,\n latest_reactions: newActivity.latest_reactions,\n reaction_groups: newActivity.reaction_groups,\n reaction_count: newActivity.reaction_count,\n own_reactions: ownReactions,\n };\n};\n\nexport const updateReactionInActivities = (\n payload: ActivityReactionUpdatedPayload,\n activities: ActivityResponse[] | undefined,\n eventBelongsToCurrentUser: boolean,\n) =>\n updateEntityInArray({\n entities: activities,\n matcher: (activity) => activity.id === payload.activity.id,\n updater: (matchedActivity) =>\n sharedUpdateActivity({\n payload,\n currentActivity: matchedActivity,\n eventBelongsToCurrentUser,\n }),\n });\n\nexport const updateReactionInPinnedActivities = (\n payload: ActivityReactionUpdatedPayload,\n pinnedActivities: ActivityPinResponse[] | undefined,\n eventBelongsToCurrentUser: boolean,\n) =>\n updateEntityInArray({\n entities: pinnedActivities,\n matcher: (pinnedActivity) =>\n pinnedActivity.activity.id === payload.activity.id,\n updater: (matchedPinnedActivity) => {\n const updatedActivity = sharedUpdateActivity({\n payload,\n currentActivity: matchedPinnedActivity.activity,\n eventBelongsToCurrentUser,\n });\n\n // this should never happen, but just in case\n if (updatedActivity === matchedPinnedActivity.activity) {\n return matchedPinnedActivity;\n }\n\n return {\n ...matchedPinnedActivity,\n activity: updatedActivity,\n };\n },\n });\n\nexport function handleActivityReactionUpdated(\n this: Feed,\n payload: ActivityReactionUpdatedPayload,\n fromWs?: boolean,\n) {\n const connectedUser = this.client.state.getLatestValue().connected_user;\n\n const eventBelongsToCurrentUser =\n typeof connectedUser !== 'undefined' &&\n payload.reaction.user.id === connectedUser.id;\n\n if (\n !shouldUpdateState({\n stateUpdateQueueId: getStateUpdateQueueId(\n payload,\n 'activity-reaction-updated',\n ),\n stateUpdateQueue: this.stateUpdateQueue,\n watch: this.currentState.watch,\n fromWs,\n isTriggeredByConnectedUser: eventBelongsToCurrentUser,\n })\n ) {\n return;\n }\n\n const {\n activities: currentActivities,\n pinned_activities: currentPinnedActivities,\n } = this.currentState;\n\n const [result1, result2] = [\n this.hasActivity(payload.activity.id)\n ? updateReactionInActivities(\n payload,\n currentActivities,\n eventBelongsToCurrentUser,\n )\n : undefined,\n updateReactionInPinnedActivities(\n payload,\n currentPinnedActivities,\n eventBelongsToCurrentUser,\n ),\n ];\n\n if (result1?.changed || result2.changed) {\n this.state.partialNext({\n ...(result1 ? { activities: result1.entities } : {}),\n pinned_activities: result2.entities,\n });\n }\n}\n","import type {\n ActivityMarkEvent,\n NotificationStatusResponse,\n} from '../../../gen/models';\nimport type { EventPayload, UpdateStateResult } from '../../../types-internal';\nimport type { Feed } from '../../feed';\n\nexport const updateNotificationStatusFromActivityMarked = (\n event: ActivityMarkEvent,\n currentNotificationStatus: NotificationStatusResponse | undefined,\n aggregatedActivities: Array<{ group: string }> = [],\n): UpdateStateResult<{\n data?: { notification_status: NotificationStatusResponse };\n}> => {\n if (!currentNotificationStatus) {\n return {\n changed: false,\n };\n }\n\n const newState = {\n ...currentNotificationStatus,\n };\n\n if (event.mark_all_read) {\n const allGroupIds = aggregatedActivities.map((activity) => activity.group);\n newState.read_activities = [\n ...new Set([\n ...(currentNotificationStatus.read_activities ?? []),\n ...allGroupIds,\n ]),\n ];\n }\n\n if (event.mark_read && event.mark_read.length > 0) {\n newState.read_activities = [\n ...new Set([\n ...(currentNotificationStatus?.read_activities ?? []),\n ...event.mark_read,\n ]),\n ];\n }\n\n if (event.mark_all_seen) {\n newState.last_seen_at = new Date();\n }\n\n return {\n changed: true,\n data: { notification_status: newState },\n };\n};\n\nexport function handleActivityMarked(\n this: Feed,\n event: EventPayload<'feeds.activity.marked'>,\n) {\n const result = updateNotificationStatusFromActivityMarked(\n event,\n this.currentState.notification_status,\n this.currentState.aggregated_activities,\n );\n if (result.changed) {\n this.state.partialNext({\n notification_status: result.data?.notification_status,\n });\n }\n}\n","import type { Feed } from '../../../feed';\nimport type { EventPayload, PartializeAllBut } from '../../../types-internal';\n\nexport function handleFeedUpdated(\n this: Feed,\n event: PartializeAllBut<EventPayload<'feeds.feed.updated'>, 'feed'>,\n) {\n this.state.partialNext({ ...event.feed });\n}\n","import type { AggregatedActivityResponse } from '../../gen/models';\nimport type { UpdateStateResult } from '../../types-internal';\nimport { replaceUniqueArrayMerge, uniqueArrayMerge } from '../../utils';\nimport { updateActivity } from './activity-updater';\n\nexport const addAggregatedActivitiesToState = (\n newAggregatedActivities: AggregatedActivityResponse[],\n aggregatedActivities: AggregatedActivityResponse[] | undefined,\n position: 'start' | 'end' | 'replace',\n) => {\n let result: UpdateStateResult<{\n aggregated_activities: AggregatedActivityResponse[];\n }>;\n if (newAggregatedActivities.length === 0) {\n result = {\n changed: false,\n aggregated_activities: aggregatedActivities ?? [],\n };\n } else {\n result = {\n changed: true,\n aggregated_activities: [],\n };\n\n // Merge update activities in the group\n newAggregatedActivities.forEach((newAggregatedActivity) => {\n const existingAggregatedActivity = aggregatedActivities?.find(\n (a) => a.group === newAggregatedActivity.group,\n );\n if (existingAggregatedActivity) {\n for (let i = 0; i < newAggregatedActivity.activities.length; i++) {\n const activity = newAggregatedActivity.activities[i];\n const existingActivity = existingAggregatedActivity.activities.find(\n (a) => a.id === activity.id,\n );\n if (existingActivity) {\n newAggregatedActivity.activities[i] = updateActivity({\n currentActivity: existingActivity,\n newActivtiy: activity,\n });\n }\n }\n }\n });\n\n switch (position) {\n case 'start':\n result.aggregated_activities = uniqueArrayMerge(\n newAggregatedActivities,\n aggregatedActivities ?? [],\n (a) => a.group,\n );\n break;\n case 'end':\n result.aggregated_activities = uniqueArrayMerge(\n aggregatedActivities ?? [],\n newAggregatedActivities,\n (a) => a.group,\n );\n break;\n case 'replace':\n result.aggregated_activities = replaceUniqueArrayMerge(\n aggregatedActivities ?? [],\n newAggregatedActivities,\n (a) => a.group,\n );\n break;\n }\n }\n\n return result;\n};\n","import type { Feed } from '../..';\nimport type {\n AggregatedActivityResponse,\n NotificationFeedUpdatedEvent,\n NotificationStatusResponse,\n} from '../../../gen/models';\nimport type { EventPayload, UpdateStateResult } from '../../../types-internal';\nimport { addAggregatedActivitiesToState } from '../add-aggregated-activities-to-state';\n\nexport const updateNotificationStatus = (\n newNotificationStatus?: NotificationStatusResponse,\n currentNotificationStatus?: NotificationStatusResponse,\n) => {\n if (!newNotificationStatus && !currentNotificationStatus) {\n return {\n changed: false,\n notification_status: undefined,\n };\n } else if (!newNotificationStatus) {\n return {\n changed: false,\n notification_status: currentNotificationStatus,\n };\n } else {\n return {\n changed: true,\n notification_status: {\n ...newNotificationStatus,\n },\n };\n }\n};\n\nexport const updateNotificationFeedFromEvent = (\n event: NotificationFeedUpdatedEvent,\n currentAggregatedActivities?: AggregatedActivityResponse[],\n currentNotificationStatus?: NotificationStatusResponse,\n): UpdateStateResult<{\n data?: {\n notification_status?: NotificationStatusResponse;\n aggregated_activities?: AggregatedActivityResponse[];\n };\n}> => {\n const updates: {\n notification_status?: NotificationStatusResponse;\n aggregated_activities?: AggregatedActivityResponse[];\n } = {};\n\n if (event.notification_status) {\n const notificationStatusResult = updateNotificationStatus(\n event.notification_status,\n currentNotificationStatus,\n );\n\n if (notificationStatusResult.changed) {\n updates.notification_status =\n notificationStatusResult.notification_status;\n }\n }\n\n if (event.aggregated_activities && currentAggregatedActivities) {\n const aggregatedActivitiesResult = addAggregatedActivitiesToState(\n event.aggregated_activities,\n currentAggregatedActivities,\n 'start',\n );\n\n if (aggregatedActivitiesResult.changed) {\n updates.aggregated_activities =\n aggregatedActivitiesResult.aggregated_activities;\n }\n }\n\n if (Object.keys(updates).length > 0) {\n return {\n changed: true,\n data: updates,\n };\n }\n\n return {\n changed: false,\n };\n};\n\nexport function handleNotificationFeedUpdated(\n this: Feed,\n event: EventPayload<'feeds.notification_feed.updated'>,\n) {\n const result = updateNotificationFeedFromEvent(\n event,\n this.currentState.aggregated_activities,\n this.currentState.notification_status,\n );\n if (result.changed) {\n this.state.partialNext({\n notification_status: result.data?.notification_status,\n aggregated_activities: result.data?.aggregated_activities,\n });\n }\n}\n","import type {\n ActivityResponse,\n AggregatedActivityResponse,\n StoriesFeedUpdatedEvent,\n} from '../../../gen/models';\nimport type { UpdateStateResult, EventPayload } from '../../../types-internal';\nimport type { Feed } from '../../feed';\nimport { updateActivity } from '../activity-updater';\nimport { addAggregatedActivitiesToState } from '../add-aggregated-activities-to-state';\n\nexport const updateActivities = (\n activitiesToUpsert: ActivityResponse[],\n currentActivities: ActivityResponse[] | undefined,\n) => {\n if (\n !activitiesToUpsert ||\n activitiesToUpsert.length === 0 ||\n !currentActivities\n ) {\n return {\n changed: false,\n activities: currentActivities ?? [],\n };\n }\n\n const result: ActivityResponse[] = [];\n for (let i = 0; i < currentActivities.length; i++) {\n const activity = currentActivities[i];\n const updatedActivity = activitiesToUpsert.find(\n (a) => a.id === activity.id,\n );\n if (updatedActivity) {\n result.push(\n updateActivity({\n currentActivity: activity,\n newActivtiy: updatedActivity,\n }),\n );\n } else {\n result.push(activity);\n }\n }\n\n return {\n changed: true,\n activities: result,\n };\n};\n\nexport function updateStoriesFeedFromEvent(\n aggregatedActivities: AggregatedActivityResponse[] | undefined,\n activities: ActivityResponse[] | undefined,\n event: StoriesFeedUpdatedEvent,\n): UpdateStateResult<{\n data?: {\n aggregated_activities?: AggregatedActivityResponse[];\n activities?: ActivityResponse[];\n };\n}> {\n if (\n (!aggregatedActivities &&\n event.aggregated_activities &&\n event.aggregated_activities?.length > 0) ||\n (!activities && event.activities && event.activities?.length > 0)\n ) {\n return {\n changed: false,\n };\n }\n\n const result = {\n changed: true,\n data: {\n aggregated_activities: aggregatedActivities,\n activities: activities,\n },\n };\n if (event.aggregated_activities) {\n const aggregatedActivitiesResult = addAggregatedActivitiesToState(\n event.aggregated_activities,\n aggregatedActivities,\n 'replace',\n );\n\n if (aggregatedActivitiesResult.changed) {\n result.data.aggregated_activities =\n aggregatedActivitiesResult.aggregated_activities;\n }\n }\n\n if (event.activities) {\n const activitiesResult = updateActivities(event.activities, activities);\n if (activitiesResult.changed) {\n result.data.activities = activitiesResult.activities;\n }\n }\n\n if (event.aggregated_activities || event.activities) {\n return result;\n }\n\n return {\n changed: false,\n };\n}\n\nexport function handleStoriesFeedUpdated(\n this: Feed,\n event: EventPayload<'feeds.stories_feed.updated'>,\n) {\n const result = updateStoriesFeedFromEvent(\n this.currentState.aggregated_activities,\n this.currentState.activities,\n event,\n );\n if (result.changed) {\n this.state.partialNext({\n aggregated_activities: result.data?.aggregated_activities,\n activities: result.data?.activities,\n });\n }\n}\n","import type { Feed } from '../../feed';\n\nexport function handleWatchStarted(this: Feed) {\n this.state.partialNext({ watch: true });\n}\n","import type { Feed } from '../../feed';\n\nexport function handleWatchStopped(this: Feed) {\n this.state.partialNext({ watch: false });\n}\n","import type { ActivityPinResponse, ActivityResponse } from '../../gen/models';\n\nexport const isPin = (\n entity: ActivityResponse | ActivityPinResponse,\n): entity is ActivityPinResponse => {\n return 'activity' in entity;\n};\n","import { updateEntityInArray } from '../../../utils';\nimport { isPin } from '../is-activity-pin';\nimport type { Feed } from '../../feed';\nimport type { EventPayload } from '../../../types-internal';\nimport type { ActivityFeedbackEventPayload, ActivityPinResponse, ActivityResponse } from '../../../gen/models';\n\nconst updateActivityFromFeedback = <\n T extends ActivityResponse | ActivityPinResponse,\n>(\n feedback: ActivityFeedbackEventPayload,\n activities: T[] | undefined,\n) => {\n if (!activities) {\n return {\n changed: false,\n entities: [],\n };\n }\n return updateEntityInArray<T>({\n entities: activities,\n matcher: (e) =>\n isPin(e)\n ? e.activity.id === feedback.activity_id\n : e.id === feedback.activity_id,\n updater: (e) => {\n if (isPin(e)) {\n return {\n ...e,\n activity: {\n ...e.activity,\n hidden: feedback.value === 'true',\n },\n };\n } else {\n return {\n ...e,\n hidden: feedback.value === 'true',\n };\n }\n },\n });\n};\n\nexport function handleActivityFeedback(\n this: Feed,\n event: EventPayload<'feeds.activity.feedback'>,\n) {\n const {\n activities: currentActivities,\n pinned_activities: currentPinnedActivities,\n } = this.currentState;\n const { connected_user: connectedUser } = this.client.state.getLatestValue();\n const eventBelongsToCurrentUser =\n event.activity_feedback.user.id === connectedUser?.id;\n\n if (!eventBelongsToCurrentUser || event.activity_feedback.action !== 'hide') {\n return;\n }\n\n const [result1, result2] = [\n updateActivityFromFeedback(event.activity_feedback, currentActivities),\n updateActivityFromFeedback(\n event.activity_feedback,\n currentPinnedActivities,\n ),\n ];\n\n if (result1.changed || result2.changed) {\n this.state.partialNext({\n activities: result1.entities,\n pinned_activities: result2.entities,\n });\n }\n}\n","export const deepEqual = (x: any, y: any) => {\n if (x === y) {\n return true;\n } else if (\n typeof x == 'object' &&\n x != null &&\n typeof y == 'object' &&\n y != null\n ) {\n if (Object.keys(x).length != Object.keys(y).length) return false;\n\n for (const prop in x) {\n if (Object.prototype.hasOwnProperty.call(y, prop)) {\n if (!deepEqual(x[prop], y[prop])) return false;\n } else return false;\n }\n\n return true;\n } else {\n return false;\n }\n};\n","import type { FeedsClient } from './feeds-client';\n\nexport function getOrCreateActiveFeed(\n this: FeedsClient,\n ...args: Parameters<FeedsClient['getOrCreateActiveFeed']>\n) {\n return this.getOrCreateActiveFeed(...args);\n}\n","export type ThrottledCallback = (...args: unknown[]) => unknown;\n\nexport type ThrottledFunction<T extends unknown[]> = (...args: T) => void;\n\n/**\n * Throttle a function so it runs at most once per `timeout` ms.\n *\n * - `leading`: fire immediately when the window opens\n * - `trailing`: remember the latest args/this and fire once when the window closes\n *\n * defaults: `{ leading: true, trailing: false }`\n *\n * notes:\n * - make one throttled instance and reuse it; re-creating it resets internal state\n *\n * @typeParam T - the function type being throttled\n * @param fn - function to throttle\n * @param timeout - minimum time between invocations (ms)\n * @param options - behavior switches\n * @param options.leading - call on the leading edge (default: true)\n * @param options.trailing - call once at the end of the window with the latest args (default: false)\n * @returns a throttled function with the same call signature as `fn`\n *\n * @example\n * const send = (payload: Data) => api.post('/endpoint', payload);\n * const sendThrottled = throttle(send, 2000, { leading: true, trailing: true });\n * // call `sendThrottled` freely; it won’t invoke `send` more than once every 2s\n */\nexport const throttle = <T extends unknown[]>(\n fn: (...args: T) => void,\n timeout = 200,\n {\n leading = true,\n trailing = false,\n }: { leading?: boolean; trailing?: boolean } = {},\n) => {\n let timer: NodeJS.Timeout | null = null;\n let storedArgs: T | null = null;\n let storedThis: unknown = null;\n let lastInvokeTime: number | undefined; // timestamp of last actual invocation\n\n const invoke = (args: T, thisArg: unknown) => {\n lastInvokeTime = Date.now();\n fn.apply(thisArg, args);\n };\n\n const scheduleTrailing = (delay: number) => {\n if (timer) return;\n timer = setTimeout(() => {\n timer = null;\n if (trailing && storedArgs) {\n invoke(storedArgs, storedThis);\n storedArgs = null;\n storedThis = null;\n }\n }, delay);\n };\n\n return {\n throttledFn: function (this: unknown, ...args: T) {\n const now = Date.now();\n\n const hasBeenInvoked = lastInvokeTime != null;\n\n // if we have never invoked and `leading` is `false`, treat `lastInvokeTime` as now\n if (!hasBeenInvoked && !leading) lastInvokeTime = now;\n\n const timeSinceLast = hasBeenInvoked ? now - lastInvokeTime! : timeout;\n const remaining = timeout - timeSinceLast;\n\n // capture latest args for possible trailing invocation\n if (trailing) {\n storedArgs = args;\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n storedThis = this;\n }\n\n // if enough time has passed, invoke immediately\n if (remaining <= 0) {\n // if there's a pending timer, clear it because we're invoking now\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n\n // leading: call now\n if (leading) {\n // if trailing is also `true`, we've already stored args above;\n // make sure we don't call the same args twice\n if (trailing) {\n // if the `storedArgs` are exactly the args we're about to call,\n // clear storedArgs to avoid double invocation by trailing (comparing\n // by reference is fine because the `args` array is new each call)\n if (storedArgs === args) {\n storedArgs = null;\n storedThis = null;\n }\n }\n invoke(args, this);\n } else {\n // not leading but trailing: schedule a trailing call after `timeout`\n if (trailing) scheduleTrailing(timeout);\n }\n\n return;\n }\n\n // not enough time passed: we're in cooldown, so if\n // trailing is requested, ensure a trailing invocation\n // is scheduled at the end of the remaining time\n if (trailing && !timer) {\n scheduleTrailing(remaining);\n }\n // if `trailing` is `false`, we simply drop the call (throttle)\n },\n cancelTimer: () => {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n },\n };\n};\n","import type { FeedsClient } from '../../feeds-client';\nimport type { ThrottledFunction } from './throttle';\n\nconst BATCH_OWN_FIELDS_API_LIMIT = 100;\n\nexport type GetBatchedOwnFields = {\n feeds: string[];\n};\n\nexport type GetBatchedOwnFieldsThrottledCallback = [\n feeds: string[],\n callback: (feedsToClear: string[]) => void | Promise<void>,\n];\n\nexport type ThrottledGetBatchedOwnFields =\n ThrottledFunction<GetBatchedOwnFieldsThrottledCallback>;\n\nexport const DEFAULT_BATCH_OWN_FIELDS_THROTTLING_INTERVAL = 2000;\n\nconst queuedFeeds: Set<string> = new Set();\n\nexport function queueBatchedOwnFields(\n this: FeedsClient,\n { feeds }: GetBatchedOwnFields,\n) {\n for (const feed of feeds) {\n queuedFeeds.add(feed);\n }\n\n if (queuedFeeds.size > 0) {\n this.throttledGetBatchOwnFields(\n [...queuedFeeds].slice(0, BATCH_OWN_FIELDS_API_LIMIT),\n (feedsToClear: string[]) => {\n for (const feed of feedsToClear) {\n queuedFeeds.delete(feed);\n }\n },\n );\n }\n}\n\nexport function clearQueuedFeeds() {\n queuedFeeds.clear();\n}\n","import type {\n ActivityRequest,\n FeedResponse,\n GetOrCreateFeedRequest,\n GetOrCreateFeedResponse,\n QueryFollowsRequest,\n WSEvent,\n ActivityResponse,\n CommentResponse,\n PagerResponse,\n QueryFeedMembersRequest,\n SortParamRequest,\n ThreadedCommentResponse,\n FollowRequest,\n QueryCommentsRequest,\n ActivityAddedEvent,\n EnrichmentOptions,\n} from '../gen/models';\nimport type { StreamResponse } from '../gen-imports';\nimport { StateStore } from '@stream-io/state-store';\nimport { EventDispatcher } from '../common/EventDispatcher';\nimport { FeedApi } from '../gen/feeds/FeedApi';\nimport type { FeedsClient } from '../feeds-client';\nimport {\n handleFollowUpdated,\n handleFollowCreated,\n handleFollowDeleted,\n handleCommentAdded,\n handleCommentDeleted,\n handleCommentUpdated,\n handleBookmarkDeleted,\n handleBookmarkUpdated,\n handleActivityAdded,\n addActivitiesToState,\n handleActivityUpdated,\n handleFeedMemberAdded,\n handleFeedMemberRemoved,\n handleFeedMemberUpdated,\n handleBookmarkAdded,\n handleActivityDeleted,\n handleActivityRemovedFromFeed,\n handleFeedUpdated,\n handleNotificationFeedUpdated,\n handleActivityMarked,\n handleActivityReactionAdded,\n handleActivityReactionDeleted,\n handleActivityReactionUpdated,\n handleCommentReactionAdded,\n handleCommentReactionDeleted,\n handleCommentReactionUpdated,\n addAggregatedActivitiesToState,\n updateNotificationStatus,\n handleStoriesFeedUpdated,\n} from './event-handlers';\nimport { capitalize } from '../common/utils';\nimport type {\n ActivityIdOrCommentId,\n GetCommentsRepliesRequest,\n GetCommentsRequest,\n LoadingStates,\n PagerResponseWithLoadingStates,\n} from '../types';\nimport {\n checkHasAnotherPage,\n Constants,\n feedsLoggerSystem,\n uniqueArrayMerge,\n} from '../utils';\nimport { handleActivityFeedback } from './event-handlers/activity/handle-activity-feedback';\nimport { deepEqual } from '../utils/deep-equal';\nimport { getOrCreateActiveFeed } from '../feeds-client/get-or-create-active-feed';\nimport { queueBatchedOwnFields } from '../utils/throttling';\n\nexport type FeedState = Omit<\n Partial<GetOrCreateFeedResponse & FeedResponse>,\n 'feed' | 'duration'\n> & {\n /**\n * True when loading state using `getOrCreate`\n */\n is_loading: boolean;\n /**\n * True when loading activities using `getOrCreate` or `getNextPage`\n */\n is_loading_activities: boolean;\n\n comments_by_entity_id: Record<\n ActivityIdOrCommentId,\n | {\n pagination?: PagerResponseWithLoadingStates & {\n // registered on first pagination attempt and then used for real-time updates & subsequent pagination calls\n sort?: QueryCommentsRequest['sort'] | (string & {});\n };\n /**\n * Id of the \"store\" where the actual parent is stored in the comments array.\n *\n * Example:\n * ```\n * // top-level comment:\n * const comment1 = {\n * id: 'comment-1',\n * object_id: 'activity-1',\n * }\n * // child comment:\n * const comment2 = {\n * id: 'comment-2',\n * object_id: 'activity-1',\n * parent_id: 'comment-1',\n * }\n * ```\n * When these comments are loaded, they're stored in the state like this:\n * ```\n * {\n * comments_by_entity_id: {\n * 'activity-1': {\n * comments: [comment1],\n * entity_parent_id: undefined,\n * },\n * 'comment-1': {\n * comments: [comment2],\n * entity_parent_id: 'activity-1', // parent store where \"comment-1\" is located in \"comments\" array\n * }\n * }\n * }\n * ```\n */\n entity_parent_id?: ActivityIdOrCommentId;\n comments?: CommentResponse[];\n }\n | undefined\n >;\n\n followers_pagination?: LoadingStates & { sort?: SortParamRequest[] };\n\n following_pagination?: LoadingStates & { sort?: SortParamRequest[] };\n\n member_pagination?: LoadingStates & { sort?: SortParamRequest[] };\n\n last_get_or_create_request_config?: GetOrCreateFeedRequest;\n\n /**\n * `true` if the feed is receiving real-time updates via WebSocket\n */\n watch: boolean;\n\n /**\n * When a new activity is received from a WebSocket event by default it's added to the start of the list. You can change this to `end` to add it to the end of the list.\n * Useful for story feeds.\n */\n addNewActivitiesTo: 'start' | 'end';\n};\n\ntype EventHandlerByEventType = {\n [Key in NonNullable<WSEvent['type']>]: Key extends Extract<\n WSEvent,\n { type: Key }\n >['type']\n ? ((event: Extract<WSEvent, { type: Key }>) => void) | undefined\n : never;\n};\n\nexport class Feed extends FeedApi {\n readonly state: StateStore<FeedState>;\n private static readonly noop = () => {};\n protected indexedActivityIds: Set<string> = new Set();\n protected readonly stateUpdateQueue: Set<string> = new Set();\n\n private readonly eventHandlers: EventHandlerByEventType = {\n 'feeds.activity.added': handleActivityAdded.bind(this),\n 'feeds.activity.deleted': handleActivityDeleted.bind(this),\n 'feeds.activity.reaction.added': handleActivityReactionAdded.bind(this),\n 'feeds.activity.reaction.deleted': handleActivityReactionDeleted.bind(this),\n 'feeds.activity.reaction.updated': handleActivityReactionUpdated.bind(this),\n 'feeds.activity.removed_from_feed':\n handleActivityRemovedFromFeed.bind(this),\n 'feeds.activity.updated': handleActivityUpdated.bind(this),\n 'feeds.bookmark.added': handleBookmarkAdded.bind(this),\n 'feeds.bookmark.deleted': handleBookmarkDeleted.bind(this),\n 'feeds.bookmark.updated': handleBookmarkUpdated.bind(this),\n 'feeds.bookmark_folder.deleted': Feed.noop,\n 'feeds.bookmark_folder.updated': Feed.noop,\n 'feeds.comment.added': handleCommentAdded.bind(this),\n 'feeds.comment.deleted': handleCommentDeleted.bind(this),\n 'feeds.comment.updated': handleCommentUpdated.bind(this),\n 'feeds.feed.created': Feed.noop,\n 'feeds.feed.deleted': Feed.noop,\n 'feeds.feed.updated': handleFeedUpdated.bind(this),\n 'feeds.feed_group.changed': Feed.noop,\n 'feeds.feed_group.deleted': Feed.noop,\n 'feeds.follow.created': handleFollowCreated.bind(this),\n 'feeds.follow.deleted': handleFollowDeleted.bind(this),\n 'feeds.follow.updated': handleFollowUpdated.bind(this),\n 'feeds.comment.reaction.added': handleCommentReactionAdded.bind(this),\n 'feeds.comment.reaction.deleted': handleCommentReactionDeleted.bind(this),\n 'feeds.comment.reaction.updated': handleCommentReactionUpdated.bind(this),\n 'feeds.feed_member.added': handleFeedMemberAdded.bind(this),\n 'feeds.feed_member.removed': handleFeedMemberRemoved.bind(this),\n 'feeds.feed_member.updated': handleFeedMemberUpdated.bind(this),\n 'feeds.notification_feed.updated': handleNotificationFeedUpdated.bind(this),\n 'feeds.stories_feed.updated': handleStoriesFeedUpdated.bind(this),\n // the poll events should be removed from here\n 'feeds.poll.closed': Feed.noop,\n 'feeds.poll.deleted': Feed.noop,\n 'feeds.poll.updated': Feed.noop,\n 'feeds.poll.vote_casted': Feed.noop,\n 'feeds.poll.vote_changed': Feed.noop,\n 'feeds.poll.vote_removed': Feed.noop,\n 'feeds.activity.pinned': Feed.noop,\n 'feeds.activity.unpinned': Feed.noop,\n 'feeds.activity.marked': handleActivityMarked.bind(this),\n 'moderation.custom_action': Feed.noop,\n 'moderation.flagged': Feed.noop,\n 'moderation.mark_reviewed': Feed.noop,\n 'health.check': Feed.noop,\n 'app.updated': Feed.noop,\n 'user.banned': Feed.noop,\n 'user.deactivated': Feed.noop,\n 'user.muted': Feed.noop,\n 'user.reactivated': Feed.noop,\n 'user.updated': Feed.noop,\n 'feeds.activity.feedback': handleActivityFeedback.bind(this),\n };\n\n protected eventDispatcher: EventDispatcher<WSEvent['type'], WSEvent> =\n new EventDispatcher<WSEvent['type'], WSEvent>();\n private inProgressGetOrCreate?: {\n request?: GetOrCreateFeedRequest;\n promise: Promise<StreamResponse<GetOrCreateFeedResponse>>;\n };\n\n constructor(\n client: FeedsClient,\n groupId: 'user' | 'timeline' | (string & {}),\n id: string,\n data?: FeedResponse,\n watch = false,\n addNewActivitiesTo: 'start' | 'end' = 'start',\n public activityAddedEventFilter?: (event: ActivityAddedEvent) => boolean,\n ) {\n super(client, groupId, id);\n this.state = new StateStore<FeedState>({\n feed: `${groupId}:${id}`,\n group_id: groupId,\n id,\n ...(data ?? {}),\n is_loading: false,\n is_loading_activities: false,\n comments_by_entity_id: {},\n watch,\n addNewActivitiesTo,\n });\n this.client = client;\n\n this.state.subscribeWithSelector(\n (nextState) => ({ activities: nextState.activities }),\n (nextState) => {\n const { activities: nextActivities = [] } = nextState;\n\n if (this.indexedActivityIds.size !== nextActivities?.length) {\n this.indexedActivityIds = new Set(\n nextActivities.map((activity) => activity.id),\n );\n }\n },\n );\n }\n\n protected readonly client: FeedsClient;\n\n get feed() {\n return `${this.group}:${this.id}`;\n }\n\n get currentState() {\n return this.state.getLatestValue();\n }\n\n set addNewActivitiesTo(value: 'start' | 'end') {\n this.state.partialNext({ addNewActivitiesTo: value });\n }\n\n hasActivity(activityId: string) {\n return this.indexedActivityIds.has(activityId);\n }\n\n hasPinnedActivity(activityId: string) {\n return this.currentState.pinned_activities?.some(\n (pinnedActivity) => pinnedActivity.activity.id === activityId,\n );\n }\n\n async synchronize() {\n const { last_get_or_create_request_config } = this.state.getLatestValue();\n if (last_get_or_create_request_config?.watch) {\n this.inProgressGetOrCreate = undefined;\n await this.getOrCreate(last_get_or_create_request_config);\n }\n }\n\n async getOrCreate(request?: GetOrCreateFeedRequest) {\n if (\n !request?.next &&\n this.inProgressGetOrCreate &&\n deepEqual(request, this.inProgressGetOrCreate.request)\n ) {\n return this.inProgressGetOrCreate.promise;\n }\n\n if (this.currentState.is_loading_activities) {\n throw new Error('Only one getOrCreate call is allowed at a time');\n }\n\n this.state.partialNext({\n is_loading: !request?.next,\n is_loading_activities: true,\n });\n\n // TODO: pull comments/comment_pagination from activities and comment_sort from request\n // and pre-populate comments_by_entity_id (once comment_sort and comment_limit are supported)\n\n try {\n const responsePromise = super.getOrCreate(request);\n\n if (!request?.next) {\n this.inProgressGetOrCreate = { request, promise: responsePromise };\n }\n\n const response = await responsePromise;\n\n const currentActivityFeeds = [];\n for (const activity of response.activities) {\n if (activity.current_feed) {\n currentActivityFeeds.push(activity.current_feed);\n }\n }\n\n if (request?.next) {\n const { activities: currentActivities = [] } = this.currentState;\n\n const result = addActivitiesToState.bind(this)(\n response.activities,\n currentActivities,\n 'end',\n );\n\n const aggregatedActivitiesResult = addAggregatedActivitiesToState(\n response.aggregated_activities,\n this.currentState.aggregated_activities,\n 'end',\n );\n\n const notificationStatusResult = updateNotificationStatus(\n response.notification_status,\n this.currentState.notification_status,\n );\n\n if (\n result.changed ||\n aggregatedActivitiesResult.changed ||\n notificationStatusResult.changed\n ) {\n this.state.partialNext({\n activities: result.activities,\n aggregated_activities:\n aggregatedActivitiesResult.aggregated_activities,\n notification_status: notificationStatusResult.notification_status,\n next: response.next,\n prev: response.prev,\n });\n }\n } else {\n // Empty queue when reinitializing the state\n this.stateUpdateQueue.clear();\n const responseCopy: Partial<\n StreamResponse<GetOrCreateFeedResponse>['feed'] &\n StreamResponse<Omit<GetOrCreateFeedResponse, 'feed'>>\n > = {\n ...response,\n ...response.feed,\n };\n\n delete responseCopy.feed;\n delete responseCopy.metadata;\n delete responseCopy.duration;\n\n // recreate the caches so that they are updated on the next state update\n this.indexedActivityIds = new Set();\n\n // TODO: lazy-load comments from activities when comment_sort and comment_pagination are supported\n\n this.state.next((currentState) => {\n const nextState: FeedState = {\n ...currentState,\n ...responseCopy,\n };\n\n if (!request?.followers_pagination?.limit) {\n delete nextState.followers;\n }\n if (!request?.following_pagination?.limit) {\n delete nextState.following;\n }\n if (response.members.length === 0 && response.feed.member_count > 0) {\n delete nextState.members;\n }\n\n nextState.last_get_or_create_request_config = request;\n nextState.watch = request?.watch ? request.watch : currentState.watch;\n\n return nextState;\n });\n }\n\n this.newActivitiesAdded(response.activities);\n\n return response;\n } finally {\n this.state.partialNext({\n is_loading: false,\n is_loading_activities: false,\n });\n if (!request?.next) {\n this.inProgressGetOrCreate = undefined;\n }\n }\n }\n\n /**\n * Returns index of the provided comment object.\n */\n protected getCommentIndex(\n comment: Pick<CommentResponse, 'object_id' | 'parent_id' | 'id'>,\n state?: FeedState,\n ) {\n const { comments_by_entity_id = {} } = state ?? this.currentState;\n\n const currentComments =\n comments_by_entity_id[comment.parent_id ?? comment.object_id]?.comments;\n\n if (!currentComments?.length) {\n return -1;\n }\n\n // @ts-expect-error this will just fail if the comment is not object from state\n let commentIndex = currentComments.indexOf(comment);\n\n // fast lookup failed, try slower approach\n if (commentIndex === -1) {\n commentIndex = currentComments.findIndex(\n (comment_) => comment_.id === comment.id,\n );\n }\n\n return commentIndex;\n }\n\n /**\n * Load child comments of entity (activity or comment) into the state, if the target entity is comment,\n * `entityParentId` should be provided (`CommentResponse.parent_id ?? CommentResponse.object_id`).\n */\n private loadCommentsIntoState(data: {\n entityParentId?: string;\n entityId: string;\n comments: Array<CommentResponse & ThreadedCommentResponse>;\n next?: string;\n sort: string;\n }) {\n // add initial (top level) object for processing\n const traverseArray = [\n {\n entityId: data.entityId,\n entityParentId: data.entityParentId,\n comments: data.comments,\n next: data.next,\n },\n ];\n\n this.state.next((currentState) => {\n const newCommentsByEntityId = {\n ...currentState.comments_by_entity_id,\n };\n\n while (traverseArray.length) {\n const item = traverseArray.pop()!;\n\n const entityId = item.entityId;\n\n // go over entity comments and generate new objects\n // for further processing if there are any replies\n item.comments.forEach((comment) => {\n if (!comment.replies?.length) return;\n\n traverseArray.push({\n entityId: comment.id,\n entityParentId: entityId,\n comments: comment.replies,\n next: comment.meta?.next_cursor,\n });\n });\n\n // omit replies & meta from the comments (transform ThreadedCommentResponse to CommentResponse)\n // this is somehow faster than copying the whole\n // object and deleting the desired properties\n const newComments: CommentResponse[] = item.comments.map(\n ({ replies: _r, meta: _m, ...restOfTheCommentResponse }) =>\n restOfTheCommentResponse,\n );\n\n const existingComments = newCommentsByEntityId[entityId]?.comments;\n\n newCommentsByEntityId[entityId] = {\n ...newCommentsByEntityId[entityId],\n entity_parent_id: item.entityParentId,\n pagination: {\n ...newCommentsByEntityId[entityId]?.pagination,\n next: item.next,\n sort: data.sort,\n },\n comments: existingComments\n ? uniqueArrayMerge(\n existingComments,\n newComments,\n (comment) => comment.id,\n )\n : newComments,\n };\n }\n\n return {\n ...currentState,\n comments_by_entity_id: newCommentsByEntityId,\n };\n });\n }\n\n private async loadNextPageComments({\n entityId,\n base,\n sort,\n entityParentId,\n }: {\n entityParentId?: string;\n entityId: string;\n sort: string;\n base: () => Promise<\n PagerResponse & {\n comments: Array<CommentResponse & ThreadedCommentResponse>;\n }\n >;\n }) {\n let error: unknown;\n\n try {\n this.state.next((currentState) => ({\n ...currentState,\n comments_by_entity_id: {\n ...currentState.comments_by_entity_id,\n [entityId]: {\n ...currentState.comments_by_entity_id[entityId],\n pagination: {\n ...currentState.comments_by_entity_id[entityId]?.pagination,\n loading_next_page: true,\n },\n },\n },\n }));\n\n const { next, comments } = await base();\n\n this.loadCommentsIntoState({\n entityId,\n comments,\n entityParentId,\n next,\n sort,\n });\n } catch (e) {\n error = e;\n } finally {\n this.state.next((currentState) => ({\n ...currentState,\n comments_by_entity_id: {\n ...currentState.comments_by_entity_id,\n [entityId]: {\n ...currentState.comments_by_entity_id[entityId],\n pagination: {\n ...currentState.comments_by_entity_id[entityId]?.pagination,\n loading_next_page: false,\n },\n },\n },\n }));\n }\n\n if (error) {\n throw error;\n }\n }\n\n public async loadNextPageActivityComments(\n activity: ActivityResponse | string,\n request?: Partial<\n Omit<GetCommentsRequest, 'object_id' | 'object_type' | 'next'>\n >,\n ) {\n const currentEntityState =\n this.currentState.comments_by_entity_id[\n typeof activity === 'string' ? activity : activity.id\n ];\n const currentPagination = currentEntityState?.pagination;\n const currentNextCursor = currentPagination?.next;\n const currentSort = currentPagination?.sort;\n const isLoading = currentPagination?.loading_next_page;\n\n const sort =\n currentSort ?? request?.sort ?? Constants.DEFAULT_COMMENT_PAGINATION;\n\n if (\n isLoading ||\n !checkHasAnotherPage(currentEntityState?.comments, currentNextCursor)\n ) {\n return;\n }\n\n const entityId = typeof activity === 'string' ? activity : activity.id;\n await this.loadNextPageComments({\n entityId: entityId,\n base: () =>\n this.client.getComments({\n ...request,\n sort,\n object_id: entityId,\n object_type: 'activity',\n next: currentNextCursor,\n }),\n sort,\n });\n }\n\n public async loadNextPageCommentReplies(\n comment: CommentResponse,\n request?: Partial<Omit<GetCommentsRepliesRequest, 'comment_id' | 'next'>>,\n ) {\n const currentEntityState =\n this.currentState.comments_by_entity_id[comment.id];\n const currentPagination = currentEntityState?.pagination;\n const currentNextCursor = currentPagination?.next;\n const currentSort = currentPagination?.sort;\n const isLoading = currentPagination?.loading_next_page;\n\n const sort =\n currentSort ?? request?.sort ?? Constants.DEFAULT_COMMENT_PAGINATION;\n\n if (\n isLoading ||\n !checkHasAnotherPage(currentEntityState?.comments, currentNextCursor)\n ) {\n return;\n }\n\n await this.loadNextPageComments({\n entityId: comment.id,\n base: () =>\n this.client.getCommentReplies({\n ...request,\n id: comment.id,\n // use known sort first (prevents broken pagination)\n sort,\n next: currentNextCursor,\n }),\n entityParentId: comment.parent_id ?? comment.object_id,\n sort,\n });\n }\n\n private async loadNextPageFollows(\n type: 'followers' | 'following',\n request: Pick<QueryFollowsRequest, 'limit' | 'sort'>,\n ) {\n const paginationKey = `${type}_pagination` as const;\n const method = `query${capitalize(type)}` as const;\n\n const currentFollows = this.currentState[type];\n const currentNextCursor = this.currentState[paginationKey]?.next;\n const isLoading = this.currentState[paginationKey]?.loading_next_page;\n const sort = this.currentState[paginationKey]?.sort ?? request.sort;\n let error: unknown;\n\n if (isLoading || !checkHasAnotherPage(currentFollows, currentNextCursor)) {\n return;\n }\n\n try {\n this.state.next((currentState) => {\n return {\n ...currentState,\n [paginationKey]: {\n ...currentState[paginationKey],\n loading_next_page: true,\n },\n };\n });\n\n const { next: newNextCursor, follows } = await this[method]({\n ...request,\n next: currentNextCursor,\n sort,\n });\n\n this.state.next((currentState) => {\n return {\n ...currentState,\n [type]:\n currentState[type] === undefined\n ? follows\n : uniqueArrayMerge(\n currentState[type],\n follows,\n (follow) =>\n `${follow.source_feed.feed}-${follow.target_feed.feed}`,\n ),\n [paginationKey]: {\n ...currentState[paginationKey],\n next: newNextCursor,\n sort,\n },\n };\n });\n } catch (e) {\n error = e;\n } finally {\n this.state.next((currentState) => {\n return {\n ...currentState,\n [paginationKey]: {\n ...currentState[paginationKey],\n loading_next_page: false,\n },\n };\n });\n }\n\n if (error) {\n throw error;\n }\n }\n\n async loadNextPageFollowers(\n request: Pick<QueryFollowsRequest, 'limit' | 'sort'>,\n ) {\n await this.loadNextPageFollows('followers', request);\n }\n\n async loadNextPageFollowing(\n request: Pick<QueryFollowsRequest, 'limit' | 'sort'>,\n ) {\n await this.loadNextPageFollows('following', request);\n }\n\n async loadNextPageMembers(\n request: Omit<QueryFeedMembersRequest, 'next' | 'prev'>,\n ) {\n const currentMembers = this.currentState.members;\n const currentNextCursor = this.currentState.member_pagination?.next;\n const isLoading = this.currentState.member_pagination?.loading_next_page;\n const sort = this.currentState.member_pagination?.sort ?? request.sort;\n let error: unknown;\n\n if (isLoading || !checkHasAnotherPage(currentMembers, currentNextCursor)) {\n return;\n }\n\n try {\n this.state.next((currentState) => ({\n ...currentState,\n member_pagination: {\n ...currentState.member_pagination,\n loading_next_page: true,\n },\n }));\n\n const { next: newNextCursor, members } =\n await this.client.queryFeedMembers({\n ...request,\n sort,\n feed_id: this.id,\n feed_group_id: this.group,\n next: currentNextCursor,\n });\n\n this.state.next((currentState) => ({\n ...currentState,\n members: currentState.members\n ? uniqueArrayMerge(\n currentState.members,\n members,\n ({ user }) => user.id,\n )\n : members,\n member_pagination: {\n ...currentState.member_pagination,\n next: newNextCursor,\n // set sort if not defined yet\n sort: currentState.member_pagination?.sort ?? request.sort,\n },\n }));\n } catch (e) {\n error = e;\n } finally {\n this.state.next((currentState) => ({\n ...currentState,\n member_pagination: {\n ...currentState.member_pagination,\n loading_next_page: false,\n },\n }));\n }\n\n if (error) {\n throw error;\n }\n }\n\n /**\n * Method which queries followers of this feed (feeds which target this feed).\n *\n * _Note: Useful only for feeds with `groupId` of `user` value._\n */\n async queryFollowers(request: Omit<QueryFollowsRequest, 'filter'>) {\n const filter: QueryFollowsRequest['filter'] = {\n target_feed: this.feed,\n };\n\n const response = await this.client.queryFollows({\n filter,\n ...request,\n });\n\n return response;\n }\n\n /**\n * Method which queries following of this feed (target feeds of this feed).\n *\n * _Note: Useful only for feeds with `groupId` of `timeline` value._\n */\n async queryFollowing(request: Omit<QueryFollowsRequest, 'filter'>) {\n const filter: QueryFollowsRequest['filter'] = {\n source_feed: this.feed,\n };\n\n const response = await this.client.queryFollows({\n filter,\n ...request,\n });\n\n return response;\n }\n\n async follow(\n feedOrFid: Feed | string,\n options?: Omit<FollowRequest, 'source' | 'target'>,\n ) {\n const fid = typeof feedOrFid === 'string' ? feedOrFid : feedOrFid.feed;\n\n const response = await this.client.follow({\n ...options,\n source: this.feed,\n target: fid,\n });\n\n return response;\n }\n\n async unfollow(feedOrFid: Feed | string) {\n const fid = typeof feedOrFid === 'string' ? feedOrFid : feedOrFid.feed;\n\n const response = await this.client.unfollow({\n source: this.feed,\n target: fid,\n });\n\n return response;\n }\n\n /**\n * Fetches the next page of activities for the feed.\n * @returns The response from the API or `undefined` if there is no next page.\n */\n async getNextPage() {\n const currentState = this.currentState;\n\n if (!currentState.next) {\n return;\n }\n\n return await this.getOrCreate({\n ...currentState.last_get_or_create_request_config,\n member_pagination: {\n limit: 0,\n },\n followers_pagination: {\n limit: 0,\n },\n following_pagination: {\n limit: 0,\n },\n watch: undefined,\n next: currentState.next,\n });\n }\n\n async addActivity(request: Omit<ActivityRequest, 'feeds'>) {\n const response = await this.client.addActivity({\n ...request,\n feeds: [this.feed],\n });\n\n return response;\n }\n\n on = this.eventDispatcher.on;\n off = this.eventDispatcher.off;\n\n handleWSEvent(event: WSEvent) {\n const eventHandler = this.eventHandlers[event.type];\n\n // no need to run noop function\n if (eventHandler !== Feed.noop) {\n // Backfill current_feed if activity is posted to multiple feeds\n if (\n 'activity' in event &&\n event.activity.feeds.length > 1 &&\n this.hasActivity(event.activity.id)\n ) {\n const currentActivity = this.currentState.activities?.find(\n (a) => a.id === event.activity.id,\n );\n\n if (!event.activity.current_feed && currentActivity?.current_feed) {\n event.activity.current_feed = currentActivity.current_feed;\n }\n }\n // @ts-expect-error intersection of handler arguments results to never\n eventHandler?.(event);\n }\n\n if (typeof eventHandler === 'undefined') {\n feedsLoggerSystem\n .getLogger('event-dispatcher')\n .warn(`Received unknown feed event, type: ${event.type}`, event);\n }\n\n this.eventDispatcher.dispatch(event);\n }\n\n protected newActivitiesAdded(\n activities: ActivityResponse[],\n options: {\n fromWebSocket: boolean;\n } = { fromWebSocket: false },\n ) {\n this.client.hydratePollCache(activities);\n this.getOrCreateFeeds(activities, options);\n }\n\n private getOrCreateFeeds(\n activities: ActivityResponse[],\n options: {\n fromWebSocket: boolean;\n },\n ) {\n const enrichmentOptions =\n this.currentState.last_get_or_create_request_config?.enrichment_options;\n if (this.shouldAddToActiveFeeds(enrichmentOptions)) {\n const feedsToGetOrCreate = new Map<string, FeedResponse>();\n activities.forEach((activity) => {\n if (\n activity.current_feed &&\n !feedsToGetOrCreate.has(activity.current_feed.feed)\n ) {\n feedsToGetOrCreate.set(\n activity.current_feed.feed,\n activity.current_feed,\n );\n }\n });\n const newFeeds = Array.from(feedsToGetOrCreate.values());\n const fieldsToUpdate: Array<\n 'own_capabilities' | 'own_follows' | 'own_followings' | 'own_membership'\n > = [];\n if (!options.fromWebSocket) {\n fieldsToUpdate.push('own_membership');\n if (!enrichmentOptions?.skip_own_capabilities) {\n fieldsToUpdate.push('own_capabilities');\n }\n if (!enrichmentOptions?.skip_own_follows) {\n fieldsToUpdate.push('own_follows');\n }\n if (enrichmentOptions?.enrich_own_followings) {\n fieldsToUpdate.push('own_followings');\n }\n }\n newFeeds.forEach((feed) => {\n getOrCreateActiveFeed.bind(this.client)({\n group: feed.group_id,\n id: feed.id,\n data: feed,\n fieldsToUpdate,\n });\n });\n if (options.fromWebSocket) {\n const uninitializedFeeds = newFeeds.filter((feedResponse) => {\n const feed = this.client.feed(feedResponse.group_id, feedResponse.id);\n // own_capabilities can only be undefined if we haven't fetched it yet\n return feed.currentState.own_capabilities === undefined;\n });\n if (uninitializedFeeds.length > 0) {\n queueBatchedOwnFields.bind(this.client)({\n feeds: uninitializedFeeds.map((feed) => feed.feed),\n });\n }\n }\n }\n }\n\n private shouldAddToActiveFeeds(enrichmentOptions?: EnrichmentOptions) {\n if (!enrichmentOptions) {\n return true;\n }\n return (\n !enrichmentOptions?.skip_activity &&\n !enrichmentOptions?.skip_activity_current_feed &&\n !enrichmentOptions?.skip_all\n );\n }\n}\n","import type { EventPayload } from '../../../types-internal';\nimport type { FeedsClient, FeedsClientState } from '../../feeds-client';\n\nexport function handleUserUpdated(\n this: FeedsClient,\n event: EventPayload<'user.updated'>,\n) {\n this.state.next((currentState) => {\n let newState: FeedsClientState | undefined;\n\n const { connected_user } = currentState;\n\n if (connected_user && connected_user.id === event.user.id) {\n newState ??= {\n ...currentState,\n };\n\n newState.connected_user = {\n ...connected_user,\n ...event.user,\n };\n }\n\n // TODO: update other users in user map (if/once applicable)\n\n return newState ?? currentState;\n });\n}\n","import type { ConnectedUser } from '../../types';\nimport type { StreamApiError } from '../types';\n\nexport interface ConnectionChangedEvent {\n type: 'connection.changed';\n online: boolean;\n}\n\n/**\n * This event is sent when the WS connection is established and authenticated, this event contains the full user object as it is stored on the server\n * @export\n * @interface ConnectedEvent\n */\nexport interface ConnectedEvent {\n /**\n * The connection_id for this client\n * @type {string}\n * @memberof ConnectedEvent\n */\n connection_id: string;\n /**\n *\n * @type {string}\n * @memberof ConnectedEvent\n */\n created_at: string;\n /**\n *\n * @type {OwnUserResponse}\n * @memberof ConnectedEvent\n */\n me: ConnectedUser;\n /**\n * The type of event: \"connection.ok\" in this case\n * @type {string}\n * @memberof ConnectedEvent\n */\n type: string;\n}\n\nexport enum UnhandledErrorType {\n ReconnectionReconciliation = 'reconnection-reconciliation',\n FetchingOwnCapabilitiesOnNewActivity = 'fetching-own-capabilities-on-new-activity',\n}\n\nexport type SyncFailure = {\n feed: string;\n reason: unknown;\n activity_id?: string;\n};\n\nexport type UnhandledErrorEvent = {\n type: 'errors.unhandled';\n error_type: UnhandledErrorType;\n} & (\n | {\n error_type: UnhandledErrorType.ReconnectionReconciliation;\n failures: SyncFailure[];\n }\n | {\n error_type: UnhandledErrorType.FetchingOwnCapabilitiesOnNewActivity;\n error: StreamApiError;\n }\n);\n","import { handleCommentUpdated } from '../handle-comment-updated';\nimport { handleActivityUpdated } from '../../activity';\nimport type { Feed } from '../../../feed';\nimport type { ActivityResponse, CommentResponse } from '../../../../gen/models';\n\nexport function updateCommentCount(\n this: Feed,\n {\n activity,\n comment,\n replyCountUpdater,\n }: {\n activity: ActivityResponse;\n comment: CommentResponse;\n replyCountUpdater: (prevCount: number) => number;\n },\n) {\n const parentActivityId = comment.object_id;\n // we update a comment if the new one is depth 2 or deeper\n if (comment?.parent_id) {\n // if the comment has a parent comment, we need to update the reply count on it\n // if the parent has a parent comment as well, parent comment is stored in a list indexed by grandparent comment id\n const grandparentCommentId =\n this.currentState.comments_by_entity_id[comment?.parent_id ?? '']\n ?.entity_parent_id;\n // pick the grandparent of the comment we are trying to add so that we\n // can update its state; if it doesn't exist the parent is an activity\n const idToUpdate = grandparentCommentId ?? parentActivityId;\n const commentToUpdate = this.currentState.comments_by_entity_id[\n idToUpdate\n ]?.comments?.find((c) => c.id === comment.parent_id);\n if (commentToUpdate) {\n handleCommentUpdated.bind(this)(\n {\n comment: {\n ...commentToUpdate,\n reply_count: replyCountUpdater(commentToUpdate.reply_count),\n },\n },\n false,\n );\n }\n }\n\n // finally, update the activity comment_count if it exists\n if (this.hasActivity(activity.id)) {\n handleActivityUpdated.bind(this)({\n activity,\n }, false);\n }\n}\n","import type { ActivityWithStateUpdates } from '../activity-with-state-updates/activity-with-state-updates';\nimport { Feed } from '../feed';\nimport type { FeedsClient } from './feeds-client';\n\nexport function connectActivityToFeed(\n this: FeedsClient,\n {\n fid,\n }: {\n fid: string;\n },\n) {\n const [group, id] = fid.split(':');\n const activeFeed = this.activeFeeds[fid];\n\n const feed = new Feed(\n this,\n group,\n id,\n undefined,\n activeFeed?.currentState.watch,\n );\n\n return feed;\n}\n\nexport function isAnyFeedWatched(this: FeedsClient, fids: string[]) {\n for (const fid of fids) {\n const feed = this.activeFeeds[fid];\n if (feed && feed.currentState.last_get_or_create_request_config?.watch) {\n return true;\n }\n }\n\n return false;\n}\n\nexport function disconnectActivityFromFeed(\n this: FeedsClient,\n activity: ActivityWithStateUpdates,\n) {\n const index = this.activeActivities.indexOf(activity);\n if (index !== -1) {\n this.activeActivities.splice(index, 1);\n }\n}\n","import { StateStore } from '@stream-io/state-store';\nimport { addActivitiesToState, type Feed, type FeedState } from '../feed';\nimport type { FeedsClient } from '../feeds-client';\nimport type { ActivityResponse } from '../gen/models';\nimport {\n connectActivityToFeed,\n disconnectActivityFromFeed,\n isAnyFeedWatched,\n} from '../feeds-client/active-activity';\nimport type { GetCommentsRequest } from '../types';\nimport { deepEqual } from '../utils/deep-equal';\n\ntype GetActivityConfig = {\n comments?: Partial<\n Omit<GetCommentsRequest, 'object_id' | 'object_type' | 'next'>\n >;\n};\n\nexport type ActivityState = { activity?: ActivityResponse } & Pick<\n FeedState,\n 'comments_by_entity_id'\n> & {\n /**\n * True when state is being fetched from API\n */\n is_loading: boolean;\n /**\n * @internal\n */\n last_get_request_config?: GetActivityConfig;\n };\n\nexport class ActivityWithStateUpdates {\n readonly state: StateStore<ActivityState>;\n protected feed: Feed | undefined;\n private unsubscribeFromFeedState?: () => void;\n private inProgressGet?: {\n request?: GetActivityConfig;\n promise: Promise<ActivityResponse>;\n };\n\n constructor(\n public readonly id: string,\n private readonly feedsClient: FeedsClient,\n { fromResponse }: { fromResponse?: ActivityResponse } = { fromResponse: undefined },\n ) {\n this.state = new StateStore<ActivityState>({\n activity: undefined,\n comments_by_entity_id: {},\n is_loading: false,\n });\n\n if (fromResponse) {\n this.setFeed({\n fid: fromResponse.feeds[0],\n initialState: fromResponse,\n });\n this.subscribeToFeedState();\n }\n }\n\n get currentState() {\n return this.state.getLatestValue();\n }\n\n get feeds() {\n return this.currentState.activity?.feeds ?? [];\n }\n\n /**\n * Fetch activity and load it into state\n * @param watch - Whether to watch the feed the activity belongs to for real-time updates\n * @param feed - The feed to watch. Use only if the activity belongs to multiple feeds and you want to specify the feed explicitly.\n * @param feedSelector - A function to select the feed from the activity response. Use only if the activity belongs to multiple feeds and you want to specify the feed explicitly.\n */\n async get(request: GetActivityConfig = {}) {\n if (this.inProgressGet && deepEqual(this.inProgressGet.request, request)) {\n return this.inProgressGet.promise;\n }\n\n const { comments } = request;\n\n this.state.partialNext({\n is_loading: true,\n last_get_request_config: request,\n });\n\n const getActivityRequest = this.feedsClient\n .getActivity({\n id: this.id,\n })\n .then((response) => response.activity);\n this.inProgressGet = { request, promise: getActivityRequest };\n const activityResponse = await getActivityRequest;\n\n this.feedsClient.hydratePollCache([activityResponse]);\n\n this.setFeed({\n // We set feed to first containing feed\n // But in WS event handler we match events by any of the containing feeds, so as long as any of the containing feeds are watched, we'll do a state update\n // This is a bit hacky, proper solution would be to refactor all activity event handlers and detach them from feed instance\n fid: activityResponse.feeds[0],\n initialState: activityResponse,\n });\n\n if (this.feed) {\n this.feed.activityAddedEventFilter = () => false;\n }\n\n if (comments) {\n await this.loadNextPageActivityComments(comments);\n }\n\n this.subscribeToFeedState();\n\n this.inProgressGet = undefined;\n\n return activityResponse;\n }\n\n loadNextPageActivityComments(\n request?: Partial<\n Omit<GetCommentsRequest, 'object_id' | 'object_type' | 'next'>\n >,\n ) {\n const activity = this.feed?.currentState.activities?.[0];\n if (!activity || !this.feed) {\n throw new Error('Initialize activity first');\n }\n if (!this.currentState.last_get_request_config?.comments) {\n this.state.partialNext({\n last_get_request_config: {\n ...this.currentState.last_get_request_config,\n comments: request,\n },\n });\n }\n return this.feed.loadNextPageActivityComments(activity, request);\n }\n\n loadNextPageCommentReplies(\n ...params: Parameters<Feed['loadNextPageCommentReplies']>\n ) {\n if (!this.feed) {\n throw new Error('Initialize activity first');\n }\n return this.feed.loadNextPageCommentReplies(...params);\n }\n\n dispose() {\n this.unsubscribeFromFeedState?.();\n disconnectActivityFromFeed.call(this.feedsClient, this);\n }\n\n /**\n * @internal\n */\n async synchronize() {\n const allFids = this.currentState.activity?.feeds ?? [];\n if (!isAnyFeedWatched.call(this.feedsClient, allFids)) {\n return;\n }\n this.inProgressGet = undefined;\n return this.get(this.currentState.last_get_request_config);\n }\n\n private setFeed({\n fid,\n initialState,\n }: {\n fid: string;\n initialState: ActivityResponse;\n }) {\n this.feed = connectActivityToFeed.call(this.feedsClient, { fid });\n\n const { activities } = addActivitiesToState.bind(this.feed)(\n [initialState],\n [],\n 'start',\n );\n this.feed?.state.partialNext({\n activities,\n });\n }\n\n private subscribeToFeedState() {\n this.unsubscribeFromFeedState?.();\n this.unsubscribeFromFeedState = this.feed?.state.subscribeWithSelector(\n (state) => ({\n activity: state.activities?.find((activity) => activity.id === this.id),\n comments_by_entity_id: state.comments_by_entity_id,\n }),\n (state) => {\n if (state.activity) {\n this.state.partialNext({\n activity: state.activity,\n comments_by_entity_id: state.comments_by_entity_id,\n is_loading: false,\n });\n }\n },\n );\n }\n}\n","import type { ActivityWithStateUpdates } from './activity-with-state-updates';\n\nexport function getFeed(this: ActivityWithStateUpdates) {\n return this.feed;\n}\n","import type { FeedState } from '../feed';\nimport type { FeedResponse, FollowResponse } from '../gen/models';\n\nconst areFollowArraysEqual = (\n currentFollows: FollowResponse[] | undefined,\n newFollows: FollowResponse[] | undefined,\n): boolean => {\n const existingFollows = new Set(\n currentFollows?.map(\n (f) =>\n `${f.source_feed.feed}:${f.target_feed.feed}:${f.updated_at.getTime()}`,\n ),\n );\n const newFollowsSet = new Set(\n newFollows?.map(\n (f) =>\n `${f.source_feed.feed}:${f.target_feed.feed}:${f.updated_at.getTime()}`,\n ),\n );\n if (existingFollows.size === newFollowsSet.size) {\n const areEqual = Array.from(existingFollows).every((f) =>\n newFollowsSet.has(f),\n );\n if (areEqual) {\n return true;\n }\n }\n\n return false;\n};\n\nexport const isOwnFollowsEqual = (\n currentState: FeedState,\n newState: FeedResponse,\n) => {\n return areFollowArraysEqual(currentState.own_follows, newState.own_follows);\n};\n\nexport const isOwnMembershipEqual = (\n currentState: FeedState,\n newState: FeedResponse,\n) => {\n return (\n (currentState.own_membership?.updated_at.getTime() ?? 0) ===\n (newState.own_membership?.updated_at.getTime() ?? 0)\n );\n};\n\nexport const isOwnCapabilitiesEqual = (\n currentState: FeedState,\n newState: FeedResponse,\n) => {\n return (\n [...(currentState.own_capabilities ?? [])].sort().join(',') ===\n [...(newState.own_capabilities ?? [])].sort().join(',')\n );\n};\n\nexport const isOwnFollowingsEqual = (\n currentState: FeedState,\n newState: FeedResponse,\n) => {\n return areFollowArraysEqual(\n currentState.own_followings,\n newState.own_followings,\n );\n};\n","import { FeedsApi } from '../gen/feeds/FeedsApi';\nimport type {\n ActivityAddedEvent,\n ActivityResponse,\n AddCommentReactionRequest,\n AddCommentReactionResponse,\n AddCommentRequest,\n AddCommentResponse,\n AddReactionRequest,\n DeleteActivityReactionResponse,\n DeleteCommentReactionResponse,\n DeleteCommentResponse,\n FeedResponse,\n FileUploadRequest,\n FollowBatchRequest,\n FollowRequest,\n FollowResponse,\n GetFollowSuggestionsResponse,\n GetOrCreateFeedRequest,\n ImageSize,\n ImageUploadRequest,\n OwnBatchRequest,\n PollResponse,\n PollVotesResponse,\n QueryFeedsRequest,\n QueryPollVotesRequest,\n UnfollowBatchRequest,\n UpdateActivityRequest,\n UpdateActivityResponse,\n UpdateCommentRequest,\n UpdateCommentResponse,\n UpdateFollowRequest,\n UserRequest,\n WSEvent,\n} from '../gen/models';\nimport type {\n ConnectedUser,\n FeedsEvent,\n StreamFile,\n TokenOrProvider,\n} from '../types';\nimport { StateStore } from '@stream-io/state-store';\nimport { TokenManager } from '../common/TokenManager';\nimport { ConnectionIdManager } from '../common/ConnectionIdManager';\nimport { StableWSConnection } from '../common/real-time/StableWSConnection';\nimport { EventDispatcher } from '../common/EventDispatcher';\nimport { ApiClient } from '../common/ApiClient';\nimport {\n addConnectionEventListeners,\n removeConnectionEventListeners,\n streamDevToken,\n} from '../common/utils';\nimport { decodeWSEvent } from '../gen/model-decoders/event-decoder-mapping';\nimport type {\n FeedsClientOptions,\n NetworkChangedEvent,\n StreamResponse,\n} from '../common/types';\nimport { ModerationClient } from '../moderation-client';\nimport { StreamPoll } from '../common/Poll';\nimport {\n Feed,\n type FeedState,\n handleActivityReactionAdded,\n handleActivityReactionDeleted,\n handleActivityReactionUpdated,\n handleActivityUpdated,\n handleCommentAdded,\n handleCommentDeleted,\n handleCommentReactionAdded,\n handleCommentReactionDeleted,\n handleCommentUpdated,\n handleFeedUpdated,\n handleFollowCreated,\n handleFollowDeleted,\n handleFollowUpdated,\n handleWatchStarted,\n handleWatchStopped,\n} from '../feed';\nimport { handleUserUpdated } from './event-handlers';\nimport {\n type SyncFailure,\n UnhandledErrorType,\n} from '../common/real-time/event-models';\nimport { updateCommentCount } from '../feed/event-handlers/comment/utils';\nimport { feedsLoggerSystem } from '../utils';\nimport { handleCommentReactionUpdated } from '../feed/event-handlers/comment/handle-comment-reaction-updated';\nimport {\n throttle,\n clearQueuedFeeds,\n type ThrottledGetBatchedOwnFields,\n type GetBatchedOwnFieldsThrottledCallback,\n DEFAULT_BATCH_OWN_FIELDS_THROTTLING_INTERVAL,\n} from '../utils/throttling';\nimport { ActivityWithStateUpdates } from '../activity-with-state-updates/activity-with-state-updates';\nimport { getFeed } from '../activity-with-state-updates/get-feed';\nimport {\n isOwnCapabilitiesEqual,\n isOwnFollowingsEqual,\n isOwnFollowsEqual,\n isOwnMembershipEqual,\n} from '../utils/check-own-fields-equality';\n\nexport type FeedsClientState = {\n connected_user: ConnectedUser | undefined;\n is_anonymous: boolean;\n is_ws_connection_healthy: boolean;\n};\n\ntype FID = string;\n\ntype ActivityId = string;\n\nexport class FeedsClient extends FeedsApi {\n readonly state: StateStore<FeedsClientState>;\n readonly moderation: ModerationClient;\n\n private readonly tokenManager: TokenManager;\n private wsConnection?: StableWSConnection;\n private readonly connectionIdManager: ConnectionIdManager;\n private readonly eventDispatcher = new EventDispatcher<\n FeedsEvent['type'],\n FeedsEvent & { fid?: string }\n >();\n\n private readonly polls_by_id: Map<string, StreamPoll>;\n\n protected activeActivities: ActivityWithStateUpdates[] = [];\n protected activeFeeds: Record<FID, Feed> = {};\n\n private healthyConnectionChangedEventCount = 0;\n\n protected throttledGetBatchOwnFields!: ThrottledGetBatchedOwnFields;\n private cancelGetBatchOwnFieldsTimer!: () => void;\n private query_batch_own_fields_throttling_interval!: number;\n\n constructor(apiKey: string, options?: FeedsClientOptions) {\n const tokenManager = new TokenManager();\n const connectionIdManager = new ConnectionIdManager();\n const apiClient = new ApiClient(\n apiKey,\n tokenManager,\n connectionIdManager,\n options,\n );\n super(apiClient);\n this.state = new StateStore<FeedsClientState>(this.initialState);\n this.moderation = new ModerationClient(apiClient);\n this.tokenManager = tokenManager;\n this.connectionIdManager = connectionIdManager;\n this.polls_by_id = new Map();\n\n this.query_batch_own_fields_throttling_interval =\n options?.query_batch_own_fields_throttling_interval ??\n DEFAULT_BATCH_OWN_FIELDS_THROTTLING_INTERVAL;\n\n feedsLoggerSystem.configureLoggers(options?.configure_loggers_options);\n\n this.on('all', (event) => {\n const fid = event.fid;\n\n const feeds = this.findAllActiveFeedsFromWSEvent(event);\n\n switch (event.type) {\n case 'connection.changed': {\n const { online } = event;\n this.state.partialNext({ is_ws_connection_healthy: online });\n\n if (online) {\n this.recoverOnReconnect();\n } else {\n for (const activeFeed of this.allActiveFeeds) {\n handleWatchStopped.bind(activeFeed)();\n }\n }\n break;\n }\n case 'feeds.feed.created': {\n if (this.activeFeeds[event.feed.id]) break;\n\n this.getOrCreateActiveFeed({\n group: event.feed.group_id,\n id: event.feed.id,\n data: event.feed,\n fieldsToUpdate: [],\n });\n\n break;\n }\n case 'feeds.feed.deleted': {\n feeds.forEach((f) => f.handleWSEvent(event as unknown as WSEvent));\n if (typeof fid === 'string') {\n delete this.activeFeeds[fid];\n this.activeActivities = this.activeActivities.filter(\n (activity) => getFeed.call(activity)?.feed !== fid,\n );\n }\n break;\n }\n case 'feeds.poll.closed': {\n if (event.poll?.id) {\n this.pollFromState(event.poll.id)?.handlePollClosed(event);\n }\n break;\n }\n case 'feeds.poll.deleted': {\n if (event.poll?.id) {\n this.polls_by_id.delete(event.poll.id);\n\n for (const activeFeed of this.allActiveFeeds) {\n const currentActivities = activeFeed.currentState.activities;\n if (currentActivities) {\n const newActivities: ActivityResponse[] = [];\n let changed = false;\n for (const activity of currentActivities) {\n if (activity.poll?.id === event.poll.id) {\n delete activity.poll;\n changed = true;\n }\n newActivities.push(activity);\n }\n if (changed) {\n activeFeed.state.partialNext({ activities: newActivities });\n }\n }\n }\n }\n break;\n }\n case 'feeds.poll.updated': {\n if (event.poll?.id) {\n this.pollFromState(event.poll.id)?.handlePollUpdated(event);\n }\n break;\n }\n case 'feeds.poll.vote_casted': {\n if (event.poll?.id) {\n this.pollFromState(event.poll.id)?.handleVoteCasted(event);\n }\n break;\n }\n case 'feeds.poll.vote_changed': {\n if (event.poll?.id) {\n this.pollFromState(event.poll.id)?.handleVoteChanged(event);\n }\n break;\n }\n case 'feeds.poll.vote_removed': {\n if (event.poll?.id) {\n this.pollFromState(event.poll.id)?.handleVoteRemoved(event);\n }\n break;\n }\n case 'feeds.bookmark.added':\n case 'feeds.bookmark.deleted':\n case 'feeds.bookmark.updated': {\n const activityId = event.bookmark.activity.id;\n const allFeeds = this.findAllActiveFeedsByActivityId(activityId);\n allFeeds.forEach((f) => f.handleWSEvent(event));\n\n break;\n }\n case 'feeds.activity.feedback': {\n const activityId = event.activity_feedback.activity_id;\n const allFeeds = this.findAllActiveFeedsByActivityId(activityId);\n allFeeds.forEach((f) => f.handleWSEvent(event));\n break;\n }\n case 'user.updated': {\n handleUserUpdated.call(this, event);\n break;\n }\n default: {\n feeds.forEach((f) => f.handleWSEvent(event as unknown as WSEvent));\n if (event.type === 'feeds.activity.deleted') {\n this.activeActivities = this.activeActivities.filter(\n (activity) => activity.id !== event.activity.id,\n );\n }\n }\n }\n });\n }\n\n private setGetBatchOwnFieldsThrottlingInterval = (throttlingMs: number) => {\n const { throttledFn: throttledGetBatchOwnFields, cancelTimer: cancel } =\n throttle<GetBatchedOwnFieldsThrottledCallback>(\n (feeds, callback) => {\n this.ownBatch({\n feeds,\n }).catch((error) => {\n this.eventDispatcher.dispatch({\n type: 'errors.unhandled',\n error_type:\n UnhandledErrorType.FetchingOwnCapabilitiesOnNewActivity,\n error,\n });\n });\n callback(feeds);\n },\n throttlingMs,\n { trailing: true },\n );\n this.throttledGetBatchOwnFields = throttledGetBatchOwnFields;\n this.cancelGetBatchOwnFieldsTimer = cancel;\n };\n\n private recoverOnReconnect = async () => {\n this.healthyConnectionChangedEventCount++;\n\n // we skip the first event as we could potentially be querying twice\n if (this.healthyConnectionChangedEventCount > 1) {\n const feedEntries = Object.entries(this.activeFeeds);\n\n const results = await Promise.allSettled([\n ...feedEntries.map(([, feed]) => feed.synchronize()),\n ...this.activeActivities.map((activity) => activity.synchronize()),\n ]);\n\n const failures: SyncFailure[] = results.flatMap((result, index) => {\n if (result.status === 'fulfilled') {\n return [];\n }\n const activity = this.activeActivities[index - feedEntries.length];\n const feed =\n feedEntries[index]?.[0] ?? (activity && getFeed.call(activity)?.feed);\n\n return [{ feed, reason: result.reason, activity_id: activity?.id }];\n });\n\n this.eventDispatcher.dispatch({\n type: 'errors.unhandled',\n error_type: UnhandledErrorType.ReconnectionReconciliation,\n failures,\n });\n }\n };\n\n private get allActiveFeeds() {\n return [\n ...Object.values(this.activeFeeds),\n ...Object.values(this.activeActivities)\n .filter((a) => !!getFeed.call(a))\n .map((a) => getFeed.call(a)!),\n ] as Feed[];\n }\n\n public pollFromState = (id: string) => this.polls_by_id.get(id);\n\n public hydratePollCache(activities: ActivityResponse[]) {\n for (const activity of activities) {\n if (!activity.poll) {\n continue;\n }\n const pollResponse = activity.poll;\n const pollFromCache = this.pollFromState(pollResponse.id);\n if (!pollFromCache) {\n const poll = new StreamPoll({ client: this, poll: pollResponse });\n this.polls_by_id.set(poll.id, poll);\n } else {\n pollFromCache.reinitializeState(pollResponse);\n }\n }\n }\n\n connectAnonymous = () => {\n this.checkIfUserIsConnected();\n\n this.connectionIdManager.resolveConnectionidPromise();\n this.tokenManager.setTokenOrProvider(undefined);\n this.setGetBatchOwnFieldsThrottlingInterval(\n this.query_batch_own_fields_throttling_interval,\n );\n this.state.partialNext({\n connected_user: undefined,\n is_anonymous: true,\n is_ws_connection_healthy: false,\n });\n\n return Promise.resolve();\n };\n\n connectUser = async (\n user: UserRequest | { id: '!anon' },\n tokenProvider?: TokenOrProvider,\n ) => {\n this.checkIfUserIsConnected();\n\n this.tokenManager.setTokenOrProvider(tokenProvider);\n\n this.setGetBatchOwnFieldsThrottlingInterval(\n this.query_batch_own_fields_throttling_interval,\n );\n\n try {\n addConnectionEventListeners(this.updateNetworkConnectionStatus);\n this.wsConnection = new StableWSConnection(\n {\n user,\n baseUrl: this.apiClient.webSocketBaseUrl,\n },\n this.tokenManager,\n this.connectionIdManager,\n [decodeWSEvent],\n );\n this.wsConnection.on('all', (event) =>\n this.eventDispatcher.dispatch(event),\n );\n const connectedEvent = await this.wsConnection.connect();\n this.state.partialNext({\n connected_user: connectedEvent?.me,\n is_ws_connection_healthy: !!this.wsConnection?.isHealthy,\n });\n } catch (err) {\n await this.disconnectUser();\n throw err;\n }\n };\n\n devToken = (userId: string) => {\n return streamDevToken(userId);\n };\n\n closePoll = async (request: {\n poll_id: string;\n }): Promise<StreamResponse<PollResponse>> => {\n return await this.updatePollPartial({\n poll_id: request.poll_id,\n set: {\n is_closed: true,\n },\n });\n };\n\n uploadFile = (\n request?: Omit<FileUploadRequest, 'file'> & { file?: StreamFile | string },\n ) => {\n return super.uploadFile({\n file: request?.file as string,\n });\n };\n\n uploadImage = (\n request?: Omit<ImageUploadRequest, 'file'> & { file?: StreamFile | string },\n ) => {\n return super.uploadImage({\n file: request?.file as string,\n upload_sizes: JSON.stringify(\n request?.upload_sizes,\n ) as unknown as ImageSize[],\n });\n };\n\n updateActivity = async (\n request: UpdateActivityRequest & {\n id: string;\n },\n ): Promise<StreamResponse<UpdateActivityResponse>> => {\n const response = await super.updateActivity(request);\n for (const feed of this.allActiveFeeds) {\n handleActivityUpdated.bind(feed)(response, false);\n }\n return response;\n };\n\n addComment = async (\n request: AddCommentRequest,\n ): Promise<StreamResponse<AddCommentResponse>> => {\n const response = await super.addComment(request);\n const { comment } = response;\n for (const feed of this.allActiveFeeds) {\n handleCommentAdded.bind(feed)(response, false);\n const parentActivityId = comment.object_id;\n if (feed.hasActivity(parentActivityId)) {\n const activityToUpdate = feed.currentState.activities?.find(\n (activity) => activity.id === parentActivityId,\n );\n if (activityToUpdate) {\n updateCommentCount.bind(feed)({\n activity: {\n ...activityToUpdate,\n comment_count: activityToUpdate.comment_count + 1,\n },\n comment,\n replyCountUpdater: (prevCount) => prevCount + 1,\n });\n }\n }\n }\n return response;\n };\n\n updateComment = async (\n request: UpdateCommentRequest & { id: string },\n ): Promise<StreamResponse<UpdateCommentResponse>> => {\n const response = await super.updateComment(request);\n for (const feed of this.allActiveFeeds) {\n handleCommentUpdated.bind(feed)(response, false);\n }\n return response;\n };\n\n deleteComment = async (request: {\n id: string;\n hard_delete?: boolean;\n }): Promise<StreamResponse<DeleteCommentResponse>> => {\n const response = await super.deleteComment(request);\n const { activity, comment } = response;\n for (const feed of this.allActiveFeeds) {\n handleCommentDeleted.bind(feed)({ comment }, false);\n updateCommentCount.bind(feed)({\n activity,\n comment,\n replyCountUpdater: (prevCount) => prevCount - 1,\n });\n }\n return response;\n };\n\n addActivityReaction = async (\n request: AddReactionRequest & {\n activity_id: string;\n },\n ) => {\n const shouldEnforceUnique = request.enforce_unique;\n const response = await super.addActivityReaction(request);\n for (const feed of this.allActiveFeeds) {\n if (shouldEnforceUnique) {\n handleActivityReactionUpdated.bind(feed)(response, false);\n } else {\n handleActivityReactionAdded.bind(feed)(response, false);\n }\n }\n return response;\n };\n\n /**\n * @deprecated Use addActivityReaction instead\n */\n addReaction = (\n request: AddReactionRequest & {\n activity_id: string;\n },\n ) => {\n return this.addActivityReaction(request);\n };\n\n deleteActivityReaction = async (request: {\n activity_id: string;\n type: string;\n }): Promise<StreamResponse<DeleteActivityReactionResponse>> => {\n const response = await super.deleteActivityReaction(request);\n for (const feed of this.allActiveFeeds) {\n handleActivityReactionDeleted.bind(feed)(response, false);\n }\n return response;\n };\n\n addCommentReaction = async (\n request: AddCommentReactionRequest & { id: string },\n ): Promise<StreamResponse<AddCommentReactionResponse>> => {\n const shouldEnforceUnique = request.enforce_unique;\n const response = await super.addCommentReaction(request);\n for (const feed of this.allActiveFeeds) {\n if (shouldEnforceUnique) {\n handleCommentReactionUpdated.bind(feed)(response, false);\n } else {\n handleCommentReactionAdded.bind(feed)(response, false);\n }\n }\n return response;\n };\n\n deleteCommentReaction = async (request: {\n id: string;\n type: string;\n }): Promise<StreamResponse<DeleteCommentReactionResponse>> => {\n const response = await super.deleteCommentReaction(request);\n for (const feed of this.allActiveFeeds) {\n handleCommentReactionDeleted.bind(feed)(response, false);\n }\n return response;\n };\n\n queryPollAnswers = async (\n request: QueryPollVotesRequest & { poll_id: string; user_id?: string },\n ): Promise<StreamResponse<PollVotesResponse>> => {\n const filter = request.filter ?? {};\n const queryPollAnswersFilter = {\n ...filter,\n is_answer: true,\n };\n\n const queryPollAnswersRequest = {\n ...request,\n filter: queryPollAnswersFilter,\n };\n\n return await this.queryPollVotes(queryPollAnswersRequest);\n };\n\n queryPollOptionVotes = async (\n request: QueryPollVotesRequest & {\n filter: QueryPollVotesRequest['filter'] & { option_id: string };\n poll_id: string;\n user_id?: string;\n },\n ): Promise<StreamResponse<PollVotesResponse>> => {\n return await this.queryPollVotes(request);\n };\n\n disconnectUser = async () => {\n if (this.wsConnection) {\n this.wsConnection?.offAll();\n await this.wsConnection?.disconnect();\n this.wsConnection = undefined;\n }\n\n removeConnectionEventListeners(this.updateNetworkConnectionStatus);\n\n this.connectionIdManager.reset();\n this.tokenManager.reset();\n\n // clear all caches\n this.polls_by_id.clear();\n\n this.activeActivities = [];\n this.activeFeeds = {};\n\n this.state.partialNext(this.initialState);\n\n this.cancelGetBatchOwnFieldsTimer();\n clearQueuedFeeds();\n };\n\n on = this.eventDispatcher.on;\n off = this.eventDispatcher.off;\n\n /**\n *\n * @param groupId for example `user`, `notification` or id of a custom feed group\n * @param id\n * @param options\n * @param options.addNewActivitiesTo - when a new activity is received from a WebSocket event by default it's added to the start of the list. You can change this to `end` to add it to the end of the list. Useful for story feeds.\n * @param options.activityAddedEventFilter - a callback that is called when a new activity is received from a WebSocket event. You can use this to prevent the activity from being added to the feed. Useful for feed filtering, or if you don't want new activities to be added to the feed.\n * @returns\n */\n feed = (\n groupId: string,\n id: string,\n options?: {\n addNewActivitiesTo?: 'start' | 'end';\n activityAddedEventFilter?: (event: ActivityAddedEvent) => boolean;\n },\n ) => {\n return this.getOrCreateActiveFeed({\n group: groupId,\n id,\n options,\n fieldsToUpdate: [],\n });\n };\n\n /**\n * If you want to get an activity with state updates outside of a feed, use this method.\n *\n * Usually it's used when you implement an activity details page.\n *\n * @param id - The id of the activity\n * @returns The activity with state updates\n */\n activityWithStateUpdates = (\n id: ActivityId,\n { fromResponse }: { fromResponse?: ActivityResponse } = {\n fromResponse: undefined,\n },\n ) => {\n const activity = new ActivityWithStateUpdates(id, this, { fromResponse });\n this.activeActivities.push(activity);\n return activity;\n };\n\n async queryFeeds(request?: QueryFeedsRequest) {\n const response = await this._queryFeeds(request);\n\n const feedResponses = response.feeds;\n\n const feeds = feedResponses.map((feedResponse) =>\n this.getOrCreateActiveFeed({\n group: feedResponse.group_id,\n id: feedResponse.id,\n data: feedResponse,\n watch: request?.watch,\n fieldsToUpdate: [\n 'own_capabilities',\n 'own_follows',\n 'own_membership',\n 'own_followings',\n ],\n }),\n );\n\n return {\n feeds,\n next: response.next,\n prev: response.prev,\n metadata: response.metadata,\n duration: response.duration,\n };\n }\n\n async ownBatch(request: OwnBatchRequest) {\n const response = await super.ownBatch(request);\n Object.entries(response.data).forEach(([fid, ownFields]) => {\n const feed = this.activeFeeds[fid];\n if (feed) {\n feed.state.partialNext(ownFields);\n }\n });\n return response;\n }\n\n updateNetworkConnectionStatus = (\n event: { type: 'online' | 'offline' } | Event,\n ) => {\n const networkEvent: NetworkChangedEvent = {\n type: 'network.changed',\n online: event.type === 'online',\n };\n this.eventDispatcher.dispatch(networkEvent);\n };\n\n async updateFollow(request: UpdateFollowRequest) {\n const response = await super.updateFollow(request);\n\n [\n response.follow.source_feed.feed,\n response.follow.target_feed.feed,\n ].forEach((fid) => {\n const feeds = this.findAllActiveFeedsByFid(fid);\n feeds.forEach((f) => handleFollowUpdated.bind(f)(response, false));\n });\n\n return response;\n }\n\n // For follow API endpoints we update the state after HTTP response to allow queryFeeds with watch: false\n async follow(request: FollowRequest) {\n const response = await super.follow(request);\n this.updateStateFromFollows([response.follow]);\n\n return response;\n }\n\n /**\n * @deprecated Use getOrCreateFollows instead\n * @param request\n * @returns\n */\n async followBatch(request: FollowBatchRequest) {\n const response = await super.followBatch(request);\n this.updateStateFromFollows(response.follows);\n\n return response;\n }\n\n async getOrCreateFollows(request: FollowBatchRequest) {\n const response = await super.getOrCreateFollows(request);\n\n this.updateStateFromFollows(response.created);\n\n return response;\n }\n\n async unfollow(request: { source: string; target: string }) {\n const response = await super.unfollow(request);\n this.updateStateFromUnfollows([response.follow]);\n\n return response;\n }\n\n async getOrCreateUnfollows(request: UnfollowBatchRequest) {\n const response = await super.getOrCreateUnfollows(request);\n this.updateStateFromUnfollows(response.follows);\n\n return response;\n }\n\n async stopWatchingFeed(request: { feed_group_id: string; feed_id: string }) {\n const connectionId = await this.connectionIdManager.getConnectionId();\n const response = await super.stopWatchingFeed({\n ...request,\n connection_id: connectionId,\n });\n\n const feeds = this.findAllActiveFeedsByFid(\n `${request.feed_group_id}:${request.feed_id}`,\n );\n feeds.forEach((f) => handleWatchStopped.bind(f)());\n\n return response;\n }\n\n async getOrCreateFeed(\n request: GetOrCreateFeedRequest & {\n feed_group_id: string;\n feed_id: string;\n connection_id?: string;\n },\n ) {\n const response = await super.getOrCreateFeed(request);\n\n if (request.watch) {\n const feeds = this.findAllActiveFeedsByFid(\n `${request.feed_group_id}:${request.feed_id}`,\n );\n feeds.forEach((f) => handleWatchStarted.bind(f)());\n }\n\n return response;\n }\n\n async getFollowSuggestions(\n ...params: Parameters<FeedsApi['getFollowSuggestions']>\n ): Promise<StreamResponse<GetFollowSuggestionsResponse & { feeds: Feed[] }>> {\n const response = await super.getFollowSuggestions(...params);\n\n const feeds = response.suggestions.map((suggestion) => {\n return this.getOrCreateActiveFeed({\n group: suggestion.group_id,\n id: suggestion.id,\n data: suggestion,\n fieldsToUpdate: [\n 'own_capabilities',\n 'own_follows',\n 'own_membership',\n 'own_followings',\n ],\n });\n });\n\n return { ...response, feeds };\n }\n\n protected readonly getOrCreateActiveFeed = ({\n group,\n id,\n data,\n watch,\n options,\n fieldsToUpdate,\n }: {\n group: string;\n id: string;\n data?: FeedResponse;\n watch?: boolean;\n options?: {\n addNewActivitiesTo?: 'start' | 'end';\n activityAddedEventFilter?: (event: ActivityAddedEvent) => boolean;\n };\n fieldsToUpdate: Array<\n 'own_capabilities' | 'own_follows' | 'own_followings' | 'own_membership'\n >;\n }) => {\n const fid = `${group}:${id}`;\n let isCreated = false;\n\n if (!this.activeFeeds[fid]) {\n isCreated = true;\n this.activeFeeds[fid] = new Feed(\n this,\n group,\n id,\n data,\n watch,\n options?.addNewActivitiesTo,\n options?.activityAddedEventFilter,\n );\n }\n\n const feed = this.activeFeeds[fid];\n\n if (!isCreated && options) {\n if (options?.addNewActivitiesTo) {\n feed.addNewActivitiesTo = options.addNewActivitiesTo;\n }\n if (options?.activityAddedEventFilter) {\n feed.activityAddedEventFilter = options.activityAddedEventFilter;\n }\n }\n\n if (!feed.currentState.watch) {\n if (!isCreated && data) {\n if (\n (feed.currentState.updated_at?.getTime() ?? 0) <\n data.updated_at.getTime()\n ) {\n handleFeedUpdated.call(feed, { feed: data });\n } else if (\n (feed.currentState.updated_at?.getTime() ?? 0) ===\n data.updated_at.getTime()\n ) {\n const fieldsToUpdateData: Array<keyof FeedResponse> = [];\n const fieldChecks: Array<\n [\n (\n | 'own_capabilities'\n | 'own_follows'\n | 'own_membership'\n | 'own_followings'\n ),\n (currentState: FeedState, newState: FeedResponse) => boolean,\n ]\n > = [\n ['own_capabilities', isOwnCapabilitiesEqual],\n ['own_follows', isOwnFollowsEqual],\n ['own_membership', isOwnMembershipEqual],\n ['own_followings', isOwnFollowingsEqual],\n ];\n fieldChecks.forEach(([field, isEqual]) => {\n if (\n fieldsToUpdate.includes(field) &&\n !isEqual(feed.currentState, data)\n ) {\n fieldsToUpdateData.push(field);\n }\n });\n if (fieldsToUpdateData.length > 0) {\n const fieldsToUpdatePayload = fieldsToUpdateData.reduce(\n (acc: Partial<FeedResponse>, field) => {\n // @ts-expect-error TODO: fix this\n acc[field] = data[field];\n return acc;\n },\n {},\n );\n feed.state.partialNext(fieldsToUpdatePayload);\n }\n }\n }\n if (watch) handleWatchStarted.call(feed);\n }\n\n return feed;\n };\n\n private findAllActiveFeedsByActivityId(activityId: string) {\n return [\n ...Object.values(this.activeFeeds),\n ...Object.values(this.activeActivities)\n .filter((a) => !!getFeed.call(a))\n .map((a) => getFeed.call(a)!),\n ].filter(\n (feed) =>\n feed.hasActivity(activityId) || feed.hasPinnedActivity(activityId),\n );\n }\n\n private findAllActiveFeedsByFid(fid: string | undefined) {\n if (!fid) return [];\n\n const activeFeed = this.activeFeeds[fid];\n\n return [\n ...(activeFeed ? [activeFeed] : []),\n ...Object.values(this.activeActivities)\n .filter((a) => getFeed.call(a)?.feed === fid)\n .map((a) => getFeed.call(a)!),\n ];\n }\n\n /**\n * When updating from WS events we need a special logic:\n * - Find active feeds that match a given fid.\n * - Find active feed from activities where fid matches any of the feeds the activity is posted to.\n *\n * This logic is different from `findAllActiveFeedsByFid` which only checks the first feed an activity is posted to.\n *\n * @param fid\n * @param activityId\n * @returns\n */\n private findAllActiveFeedsFromWSEvent(event: FeedsEvent) {\n const fid = 'fid' in event ? event.fid : undefined;\n\n if (!fid) return [];\n\n const activeFeed = fid ? this.activeFeeds[fid] : undefined;\n\n return [\n ...(activeFeed ? [activeFeed] : []),\n ...Object.values(this.activeActivities)\n .filter((a) => {\n const feed = getFeed.call(a);\n return (\n feed?.feed === fid ||\n a.currentState.activity?.feeds.some((f) => f === fid)\n );\n })\n .map((a) => getFeed.call(a)!),\n ];\n }\n\n private updateStateFromFollows(follows: FollowResponse[]) {\n follows.forEach((follow) => {\n const feeds = [\n ...this.findAllActiveFeedsByFid(follow.source_feed.feed),\n ...this.findAllActiveFeedsByFid(follow.target_feed.feed),\n ];\n feeds.forEach((f) => handleFollowCreated.bind(f)({ follow }, false));\n });\n }\n\n private updateStateFromUnfollows(follows: FollowResponse[]) {\n follows.forEach((follow) => {\n const feeds = [\n ...this.findAllActiveFeedsByFid(follow.source_feed.feed),\n ...this.findAllActiveFeedsByFid(follow.target_feed.feed),\n ];\n feeds.forEach((f) => handleFollowDeleted.bind(f)({ follow }, false));\n });\n }\n\n private get initialState() {\n return {\n connected_user: undefined,\n is_anonymous: false,\n is_ws_connection_healthy: false,\n };\n }\n\n private checkIfUserIsConnected() {\n if (\n this.state.getLatestValue().connected_user !== undefined ||\n this.wsConnection ||\n this.state.getLatestValue().is_anonymous\n ) {\n throw new Error(`Can't connect a new user, call \"disconnectUser\" first`);\n }\n }\n}\n"],"names":["loggerInternal","decoders","decode","poll","StateStore","index","sharedUpdateActivity","UnhandledErrorType","options"],"mappings":"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"}
|