@stream-io/feeds-client 0.1.11 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/index-react-bindings.browser.cjs +537 -331
  3. package/dist/index-react-bindings.browser.cjs.map +1 -1
  4. package/dist/index-react-bindings.browser.js +537 -331
  5. package/dist/index-react-bindings.browser.js.map +1 -1
  6. package/dist/index-react-bindings.node.cjs +537 -331
  7. package/dist/index-react-bindings.node.cjs.map +1 -1
  8. package/dist/index-react-bindings.node.js +537 -331
  9. package/dist/index-react-bindings.node.js.map +1 -1
  10. package/dist/index.browser.cjs +536 -329
  11. package/dist/index.browser.cjs.map +1 -1
  12. package/dist/index.browser.js +536 -330
  13. package/dist/index.browser.js.map +1 -1
  14. package/dist/index.d.ts +1 -1
  15. package/dist/index.node.cjs +536 -329
  16. package/dist/index.node.cjs.map +1 -1
  17. package/dist/index.node.js +536 -330
  18. package/dist/index.node.js.map +1 -1
  19. package/dist/src/feed/event-handlers/activity/handle-activity-deleted.d.ts +12 -3
  20. package/dist/src/feed/event-handlers/activity/handle-activity-pinned.d.ts +3 -0
  21. package/dist/src/feed/event-handlers/activity/handle-activity-reaction-added.d.ts +10 -6
  22. package/dist/src/feed/event-handlers/activity/handle-activity-reaction-deleted.d.ts +10 -6
  23. package/dist/src/feed/event-handlers/activity/handle-activity-unpinned.d.ts +3 -0
  24. package/dist/src/feed/event-handlers/activity/handle-activity-updated.d.ts +7 -3
  25. package/dist/src/feed/event-handlers/bookmark/handle-bookmark-added.d.ts +10 -6
  26. package/dist/src/feed/event-handlers/bookmark/handle-bookmark-deleted.d.ts +10 -6
  27. package/dist/src/feed/event-handlers/bookmark/handle-bookmark-updated.d.ts +10 -6
  28. package/dist/src/feed/event-handlers/index.d.ts +1 -0
  29. package/dist/src/feed/event-handlers/watch/handle-watch-started.d.ts +2 -0
  30. package/dist/src/feed/event-handlers/watch/handle-watch-stopped.d.ts +2 -0
  31. package/dist/src/feed/event-handlers/watch/index.d.ts +2 -0
  32. package/dist/src/feed/feed.d.ts +4 -12
  33. package/dist/src/feeds-client/event-handlers/index.d.ts +1 -0
  34. package/dist/src/feeds-client/event-handlers/user/handle-user-updated.d.ts +3 -0
  35. package/dist/src/{feeds-client.d.ts → feeds-client/feeds-client.d.ts} +16 -16
  36. package/dist/src/feeds-client/index.d.ts +2 -0
  37. package/dist/src/gen/feeds/FeedsApi.d.ts +27 -23
  38. package/dist/src/gen/models/index.d.ts +198 -23
  39. package/dist/src/test-utils/response-generators.d.ts +46 -1
  40. package/dist/src/utils/index.d.ts +1 -0
  41. package/dist/src/utils/update-entity-in-array.d.ts +27 -0
  42. package/dist/tsconfig.tsbuildinfo +1 -1
  43. package/index.ts +1 -1
  44. package/package.json +2 -2
  45. package/src/feed/event-handlers/activity/activity-reaction-utils.test.ts +108 -96
  46. package/src/feed/event-handlers/activity/activity-utils.test.ts +84 -122
  47. package/src/feed/event-handlers/activity/handle-activity-deleted.ts +43 -10
  48. package/src/feed/event-handlers/activity/handle-activity-pinned.test.ts +60 -0
  49. package/src/feed/event-handlers/activity/handle-activity-pinned.ts +30 -0
  50. package/src/feed/event-handlers/activity/handle-activity-reaction-added.test.ts +157 -0
  51. package/src/feed/event-handlers/activity/handle-activity-reaction-added.ts +82 -40
  52. package/src/feed/event-handlers/activity/handle-activity-reaction-deleted.test.ts +200 -0
  53. package/src/feed/event-handlers/activity/handle-activity-reaction-deleted.ts +89 -51
  54. package/src/feed/event-handlers/activity/handle-activity-unpinned.test.ts +94 -0
  55. package/src/feed/event-handlers/activity/handle-activity-unpinned.ts +30 -0
  56. package/src/feed/event-handlers/activity/handle-activity-updated.test.ts +115 -0
  57. package/src/feed/event-handlers/activity/handle-activity-updated.ts +73 -35
  58. package/src/feed/event-handlers/bookmark/bookmark-utils.test.ts +121 -109
  59. package/src/feed/event-handlers/bookmark/handle-bookmark-added.test.ts +178 -0
  60. package/src/feed/event-handlers/bookmark/handle-bookmark-added.ts +82 -39
  61. package/src/feed/event-handlers/bookmark/handle-bookmark-deleted.test.ts +188 -0
  62. package/src/feed/event-handlers/bookmark/handle-bookmark-deleted.ts +86 -48
  63. package/src/feed/event-handlers/bookmark/handle-bookmark-updated.test.ts +196 -0
  64. package/src/feed/event-handlers/bookmark/handle-bookmark-updated.ts +83 -44
  65. package/src/feed/event-handlers/follow/handle-follow-created.test.ts +16 -12
  66. package/src/feed/event-handlers/follow/handle-follow-created.ts +4 -7
  67. package/src/feed/event-handlers/follow/handle-follow-deleted.test.ts +19 -15
  68. package/src/feed/event-handlers/follow/handle-follow-deleted.ts +6 -6
  69. package/src/feed/event-handlers/follow/handle-follow-updated.ts +7 -10
  70. package/src/feed/event-handlers/index.ts +2 -1
  71. package/src/feed/event-handlers/watch/handle-watch-started.ts +5 -0
  72. package/src/feed/event-handlers/watch/handle-watch-stopped.ts +5 -0
  73. package/src/feed/event-handlers/watch/index.ts +2 -0
  74. package/src/feed/feed.ts +15 -33
  75. package/src/feeds-client/event-handlers/index.ts +1 -0
  76. package/src/feeds-client/event-handlers/user/handle-user-updated.test.ts +53 -0
  77. package/src/feeds-client/event-handlers/user/handle-user-updated.ts +28 -0
  78. package/src/{feeds-client.ts → feeds-client/feeds-client.ts} +48 -39
  79. package/src/feeds-client/index.ts +2 -0
  80. package/src/gen/feeds/FeedsApi.ts +164 -138
  81. package/src/gen/model-decoders/decoders.ts +28 -0
  82. package/src/gen/models/index.ts +349 -29
  83. package/src/gen/moderation/ModerationApi.ts +1 -0
  84. package/src/test-utils/response-generators.ts +270 -11
  85. package/src/utils/index.ts +1 -0
  86. package/src/utils/state-update-queue.ts +1 -1
  87. package/src/utils/update-entity-in-array.ts +51 -0
@@ -69,6 +69,7 @@ export class ModerationApi {
69
69
  block_list_config: request?.block_list_config,
70
70
  bodyguard_config: request?.bodyguard_config,
71
71
  google_vision_config: request?.google_vision_config,
72
+ llm_config: request?.llm_config,
72
73
  rule_builder_config: request?.rule_builder_config,
73
74
  velocity_filter_config: request?.velocity_filter_config,
74
75
  video_call_rule_config: request?.video_call_rule_config,
@@ -1,11 +1,18 @@
1
1
  import {
2
+ ActivityPinResponse,
3
+ ActivityResponse,
4
+ BookmarkFolderResponse,
5
+ BookmarkResponse,
2
6
  FeedResponse,
7
+ FeedsReactionResponse,
3
8
  FollowResponse,
4
9
  OwnUser,
5
10
  OwnUserResponse,
11
+ PinActivityResponse,
6
12
  UserResponse,
7
13
  } from '../gen/models';
8
14
  import { humanId } from 'human-id';
15
+ import { EventPayload } from '../types-internal';
9
16
 
10
17
  export const getHumanId = () => humanId({ capitalize: false, separator: '-' });
11
18
 
@@ -13,6 +20,7 @@ export const generateUserResponse = (
13
20
  overrides: Partial<UserResponse> = {},
14
21
  ): UserResponse => ({
15
22
  id: `user-${getHumanId()}`,
23
+ name: humanId({ separator: ' ' }),
16
24
  created_at: new Date(),
17
25
  updated_at: new Date(),
18
26
  banned: false,
@@ -57,29 +65,27 @@ export const generateFeedResponse = (
57
65
  ): FeedResponse => {
58
66
  const id = overrides.id || `feed-${getHumanId()}`;
59
67
  const groupId = overrides.group_id || 'user';
60
- const fid = `${groupId}:${id}`;
61
- const createdBy = generateUserResponse(overrides.created_by);
62
- const description = humanId({
63
- addAdverb: true,
64
- adjectiveCount: 4,
65
- });
66
- const name = humanId();
68
+ const feed = `${groupId}:${id}`;
67
69
 
68
70
  return {
69
71
  id,
70
72
  group_id: groupId,
71
73
  created_at: new Date(),
72
74
  updated_at: new Date(),
73
- description,
74
- fid,
75
+ description: humanId({
76
+ addAdverb: true,
77
+ adjectiveCount: 4,
78
+ separator: ' ',
79
+ }),
75
80
  follower_count: 0,
76
81
  following_count: 0,
77
82
  member_count: 0,
78
- name,
83
+ name: humanId({ separator: ' ' }),
79
84
  pin_count: 0,
80
85
  custom: {},
81
86
  ...overrides,
82
- created_by: createdBy,
87
+ feed,
88
+ created_by: generateUserResponse(overrides.created_by),
83
89
  };
84
90
  };
85
91
 
@@ -100,3 +106,256 @@ export const generateFollowResponse = (
100
106
  ...overrides,
101
107
  };
102
108
  };
109
+
110
+ export const generateActivityResponse = (
111
+ overrides: Omit<Partial<ActivityResponse>, 'user'> & {
112
+ user?: Partial<UserResponse>;
113
+ } = {},
114
+ ): ActivityResponse => {
115
+ return {
116
+ id: getHumanId(),
117
+ type: 'test',
118
+ created_at: new Date(),
119
+ updated_at: new Date(),
120
+ visibility: 'public',
121
+ bookmark_count: 0,
122
+ comment_count: 0,
123
+ reaction_count: 0,
124
+ share_count: 0,
125
+ attachments: [],
126
+ comments: [],
127
+ feeds: [],
128
+ filter_tags: [],
129
+ interest_tags: [],
130
+ latest_reactions: [],
131
+ mentioned_users: [],
132
+ own_bookmarks: [],
133
+ own_reactions: [],
134
+ custom: {},
135
+ reaction_groups: {},
136
+ search_data: {},
137
+ popularity: 0,
138
+ score: 0,
139
+ ...overrides,
140
+ user: generateUserResponse(overrides.user),
141
+ };
142
+ };
143
+
144
+ export const generateFeedReactionResponse = (
145
+ overrides: Omit<Partial<FeedsReactionResponse>, 'user'> & {
146
+ user?: Partial<UserResponse>;
147
+ } = {},
148
+ ): FeedsReactionResponse => {
149
+ const user = generateUserResponse(overrides.user);
150
+ return {
151
+ type: 'like',
152
+ activity_id: getHumanId(),
153
+ created_at: new Date(),
154
+ updated_at: new Date(),
155
+ ...overrides,
156
+ user,
157
+ };
158
+ };
159
+
160
+ export const generateActivityPinResponse = (
161
+ overrides: Omit<Partial<ActivityPinResponse>, 'activity' | 'user'> & {
162
+ activity?: Partial<ActivityResponse>;
163
+ user?: Partial<UserResponse>;
164
+ } = {},
165
+ ): ActivityPinResponse => {
166
+ return {
167
+ created_at: new Date(),
168
+ updated_at: new Date(),
169
+ feed: getHumanId(),
170
+ ...overrides,
171
+ activity: generateActivityResponse(overrides.activity),
172
+ user: generateUserResponse(overrides.user),
173
+ };
174
+ };
175
+
176
+ export const generateBookmarkFolderResponse = (
177
+ overrides: Partial<BookmarkFolderResponse> = {},
178
+ ): BookmarkFolderResponse => ({
179
+ id: `bookmark-folder-${getHumanId()}`,
180
+ name: humanId(),
181
+ created_at: new Date(),
182
+ updated_at: new Date(),
183
+ ...overrides,
184
+ });
185
+
186
+ export const generateBookmarkResponse = (
187
+ overrides: Omit<Partial<BookmarkResponse>, 'activity' | 'user'> & {
188
+ activity?: Partial<ActivityResponse>;
189
+ user?: Partial<UserResponse>;
190
+ } = {},
191
+ ): BookmarkResponse => ({
192
+ created_at: new Date(),
193
+ updated_at: new Date(),
194
+ ...overrides,
195
+ activity: generateActivityResponse(overrides.activity),
196
+ user: generateUserResponse(overrides.user),
197
+ });
198
+
199
+ // event generators
200
+ export function generateActivityReactionAddedEvent(
201
+ overrides: Omit<
202
+ Partial<EventPayload<'feeds.activity.reaction.added'>>,
203
+ 'activity' | 'type' | 'reaction' | 'user'
204
+ > & {
205
+ activity?: Parameters<typeof generateActivityResponse>[0];
206
+ reaction?: Parameters<typeof generateFeedReactionResponse>[0];
207
+ user?: Parameters<typeof generateUserResponse>[0];
208
+ } = {},
209
+ ): EventPayload<'feeds.activity.reaction.added'> {
210
+ const activity = generateActivityResponse(overrides.activity);
211
+ const reaction = generateFeedReactionResponse(overrides.reaction);
212
+ const user = generateUserResponse(overrides.user);
213
+
214
+ return {
215
+ type: 'feeds.activity.reaction.added',
216
+ created_at: new Date(),
217
+ fid: '',
218
+ custom: {},
219
+ ...overrides,
220
+ user,
221
+ reaction,
222
+ activity,
223
+ };
224
+ }
225
+
226
+ export function generateActivityReactionDeletedEvent(
227
+ overrides: Omit<
228
+ Partial<EventPayload<'feeds.activity.reaction.deleted'>>,
229
+ 'user' | 'activity' | 'reaction'
230
+ > & {
231
+ activity?: Parameters<typeof generateActivityResponse>[0];
232
+ reaction?: Parameters<typeof generateFeedReactionResponse>[0];
233
+ user?: Parameters<typeof generateUserResponse>[0];
234
+ } = {},
235
+ ): EventPayload<'feeds.activity.reaction.deleted'> {
236
+ const activity = generateActivityResponse(overrides.activity);
237
+ const reaction = generateFeedReactionResponse(overrides.reaction);
238
+ const user = generateUserResponse(overrides.user);
239
+ return {
240
+ type: 'feeds.activity.reaction.deleted',
241
+ created_at: new Date(),
242
+ fid: '',
243
+ custom: {},
244
+ ...overrides,
245
+ user,
246
+ reaction,
247
+ activity,
248
+ };
249
+ }
250
+
251
+ export function generateActivityUpdatedEvent(
252
+ overrides: Omit<
253
+ Partial<EventPayload<'feeds.activity.updated'>>,
254
+ 'activity' | 'type'
255
+ > & {
256
+ activity?: Parameters<typeof generateActivityResponse>[0];
257
+ } = {},
258
+ ): EventPayload<'feeds.activity.updated'> {
259
+ const activity = generateActivityResponse(overrides.activity);
260
+ return {
261
+ type: 'feeds.activity.updated',
262
+ created_at: new Date(),
263
+ fid: '',
264
+ custom: {},
265
+ ...overrides,
266
+ activity,
267
+ };
268
+ }
269
+
270
+ export function generateBookmarkAddedEvent(
271
+ overrides: Omit<
272
+ Partial<EventPayload<'feeds.bookmark.added'>>,
273
+ 'bookmark' | 'user'
274
+ > & {
275
+ bookmark?: Parameters<typeof generateBookmarkResponse>[0];
276
+ user?: Parameters<typeof generateUserResponse>[0];
277
+ } = {},
278
+ ): EventPayload<'feeds.bookmark.added'> {
279
+ const bookmark = generateBookmarkResponse(overrides.bookmark);
280
+ const user = generateUserResponse(overrides.user);
281
+ return {
282
+ type: 'feeds.bookmark.added',
283
+ created_at: new Date(),
284
+ custom: {},
285
+ ...overrides,
286
+ bookmark,
287
+ user,
288
+ };
289
+ }
290
+
291
+ export function generateBookmarkDeletedEvent(
292
+ overrides: Omit<
293
+ Partial<EventPayload<'feeds.bookmark.deleted'>>,
294
+ 'bookmark' | 'user'
295
+ > & {
296
+ bookmark?: Parameters<typeof generateBookmarkResponse>[0];
297
+ user?: Parameters<typeof generateUserResponse>[0];
298
+ } = {},
299
+ ): EventPayload<'feeds.bookmark.deleted'> {
300
+ const bookmark = generateBookmarkResponse(overrides.bookmark);
301
+ const user = generateUserResponse(overrides.user);
302
+ return {
303
+ type: 'feeds.bookmark.deleted',
304
+ created_at: new Date(),
305
+ custom: {},
306
+ ...overrides,
307
+ bookmark,
308
+ user,
309
+ };
310
+ }
311
+
312
+ export function generateBookmarkUpdatedEvent(
313
+ overrides: Omit<
314
+ Partial<EventPayload<'feeds.bookmark.updated'>>,
315
+ 'bookmark' | 'user'
316
+ > & {
317
+ bookmark?: Parameters<typeof generateBookmarkResponse>[0];
318
+ user?: Parameters<typeof generateUserResponse>[0];
319
+ } = {},
320
+ ): EventPayload<'feeds.bookmark.updated'> {
321
+ const bookmark = generateBookmarkResponse(overrides.bookmark);
322
+ const user = generateUserResponse(overrides.user);
323
+ return {
324
+ type: 'feeds.bookmark.updated',
325
+ created_at: new Date(),
326
+ custom: {},
327
+ ...overrides,
328
+ bookmark,
329
+ user,
330
+ };
331
+ }
332
+
333
+ export function generateActivityPinnedEvent(
334
+ overrides: Omit<
335
+ Partial<EventPayload<'feeds.activity.pinned'>>,
336
+ 'pinned_activity' | 'user'
337
+ > & {
338
+ pinned_activity?: Parameters<typeof generateActivityPinResponse>[0];
339
+ user?: Parameters<typeof generateUserResponse>[0];
340
+ } = {},
341
+ ): EventPayload<'feeds.activity.pinned'> {
342
+ const pinnedActivity = generateActivityPinResponse(overrides.pinned_activity);
343
+ const user = generateUserResponse(overrides.user);
344
+
345
+ // FIXME(TEMPORARY): re-map ActivityPinResponse to PinActivityResponse
346
+ const typeAdjustedPinnedActivity: PinActivityResponse = {
347
+ ...pinnedActivity,
348
+ user_id: pinnedActivity.user.id,
349
+ duration: '0',
350
+ };
351
+
352
+ return {
353
+ type: 'feeds.activity.pinned',
354
+ created_at: pinnedActivity.created_at,
355
+ fid: pinnedActivity.feed,
356
+ custom: {},
357
+ ...overrides,
358
+ pinned_activity: typeAdjustedPinnedActivity,
359
+ user,
360
+ };
361
+ }
@@ -3,3 +3,4 @@ export * from './unique-array-merge';
3
3
  export * from './constants';
4
4
  export * from './type-assertions';
5
5
  export * from './state-update-queue';
6
+ export * from './update-entity-in-array';
@@ -27,7 +27,7 @@ export function getStateUpdateQueueId(
27
27
  prefix?: 'deleted' | 'updated' | 'created' | (string & {}),
28
28
  ) {
29
29
  if (isFollowResponse(data)) {
30
- const toJoin = [data.source_feed.fid, data.target_feed.fid];
30
+ const toJoin = [data.source_feed.feed, data.target_feed.feed];
31
31
  if (prefix) {
32
32
  toJoin.unshift(prefix);
33
33
  }
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Utility function through which you can update an entity in an array;
3
+ *
4
+ * - if the entity is not found, it returns the original array unchanged
5
+ * - if the entity is found and updated, it returns a new array with the updated entity
6
+ * - if the entity is found but not updated (updater returns `matchedEntity`), it returns the original array unchanged
7
+ *
8
+ * - `changed: boolean` indicates whether the array has changed or not - this is QOL enhancement, you
9
+ * can compare returned array to the original one
10
+ *
11
+ */
12
+ export function updateEntityInArray<T>(_: {
13
+ matcher: (entity: T) => boolean;
14
+ entities: T[];
15
+ updater: (currentEntity: T) => T;
16
+ }): { changed: boolean; entities: T[] };
17
+ export function updateEntityInArray<T>(_: {
18
+ matcher: (entity: T) => boolean;
19
+ entities: T[] | undefined;
20
+ updater: (currentEntity: T) => T;
21
+ }): { changed: boolean; entities: T[] | undefined };
22
+ export function updateEntityInArray<T>({
23
+ matcher,
24
+ updater,
25
+ entities,
26
+ }: {
27
+ matcher: (entity: T) => boolean;
28
+ entities: T[] | undefined;
29
+ updater: (currentEntity: T) => T;
30
+ }) {
31
+ if (!entities || !entities.length) {
32
+ return { changed: false, entities };
33
+ }
34
+
35
+ const index = entities.findIndex(matcher);
36
+
37
+ if (index === -1) {
38
+ return { changed: false, entities };
39
+ }
40
+
41
+ const newEntity = updater(entities[index]);
42
+
43
+ if (newEntity === entities[index]) {
44
+ return { changed: false, entities };
45
+ }
46
+
47
+ const updatedEntities = [...entities];
48
+ updatedEntities[index] = newEntity;
49
+
50
+ return { changed: true, entities: updatedEntities };
51
+ }