@amityco/ts-sdk 6.4.6-e12bdf9.0 → 6.5.0

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 (125) hide show
  1. package/dist/@types/core/events.d.ts +4 -4
  2. package/dist/@types/core/events.d.ts.map +1 -1
  3. package/dist/@types/core/model.d.ts +3 -1
  4. package/dist/@types/core/model.d.ts.map +1 -1
  5. package/dist/@types/core/payload.d.ts +1 -1
  6. package/dist/@types/core/payload.d.ts.map +1 -1
  7. package/dist/@types/domains/post.d.ts +1 -1
  8. package/dist/@types/domains/post.d.ts.map +1 -1
  9. package/dist/@types/domains/reaction.d.ts +4 -5
  10. package/dist/@types/domains/reaction.d.ts.map +1 -1
  11. package/dist/channelRepsitory/channelMembership/observers/getMembers.d.ts +1 -0
  12. package/dist/channelRepsitory/channelMembership/observers/getMembers.d.ts.map +1 -1
  13. package/dist/client/observers/getTotalUnreadCount.d.ts.map +1 -1
  14. package/dist/client/utils/markerSyncEngine.d.ts.map +1 -1
  15. package/dist/commentRepository/observers/getComment.d.ts +2 -2
  16. package/dist/communityRepository/api/getCommunity.d.ts +4 -4
  17. package/dist/communityRepository/api/getRecommendedCommunities.d.ts +4 -19
  18. package/dist/communityRepository/api/getRecommendedCommunities.d.ts.map +1 -1
  19. package/dist/communityRepository/api/getTopTrendingCommunities.d.ts +5 -2
  20. package/dist/communityRepository/api/getTopTrendingCommunities.d.ts.map +1 -1
  21. package/dist/communityRepository/api/getTrendingCommunities.d.ts +17 -0
  22. package/dist/communityRepository/api/getTrendingCommunities.d.ts.map +1 -0
  23. package/dist/communityRepository/api/index.d.ts +0 -1
  24. package/dist/communityRepository/api/index.d.ts.map +1 -1
  25. package/dist/communityRepository/api/test/getTrendingCommunities.test.d.ts +2 -0
  26. package/dist/communityRepository/api/test/getTrendingCommunities.test.d.ts.map +1 -0
  27. package/dist/communityRepository/communityMembership/observers/getMembers.d.ts +1 -0
  28. package/dist/communityRepository/communityMembership/observers/getMembers.d.ts.map +1 -1
  29. package/dist/communityRepository/observers/getCommunities.d.ts +2 -2
  30. package/dist/communityRepository/observers/getCommunity.d.ts +2 -2
  31. package/dist/communityRepository/observers/getRecommendedCommunities.d.ts +20 -0
  32. package/dist/communityRepository/observers/getRecommendedCommunities.d.ts.map +1 -0
  33. package/dist/communityRepository/observers/getTrendingCommunities.d.ts +20 -0
  34. package/dist/communityRepository/observers/getTrendingCommunities.d.ts.map +1 -0
  35. package/dist/communityRepository/observers/index.d.ts +2 -0
  36. package/dist/communityRepository/observers/index.d.ts.map +1 -1
  37. package/dist/communityRepository/utils/communityQueryFilter.d.ts +2 -0
  38. package/dist/communityRepository/utils/communityQueryFilter.d.ts.map +1 -0
  39. package/dist/core/model/idResolvers.d.ts.map +1 -1
  40. package/dist/core/model/identifyModel.d.ts.map +1 -1
  41. package/dist/index.cjs.js +554 -237
  42. package/dist/index.esm.js +554 -237
  43. package/dist/index.umd.js +4 -4
  44. package/dist/pollRepository/api/index.d.ts +0 -1
  45. package/dist/pollRepository/api/index.d.ts.map +1 -1
  46. package/dist/pollRepository/observers/getPoll.d.ts +21 -0
  47. package/dist/pollRepository/observers/getPoll.d.ts.map +1 -0
  48. package/dist/pollRepository/observers/index.d.ts +1 -0
  49. package/dist/pollRepository/observers/index.d.ts.map +1 -1
  50. package/dist/postRepository/observers/getPost.d.ts +2 -2
  51. package/dist/reactionRepository/api/addReaction.d.ts +2 -2
  52. package/dist/reactionRepository/api/addReaction.d.ts.map +1 -1
  53. package/dist/reactionRepository/api/queryReactions.d.ts +2 -2
  54. package/dist/reactionRepository/api/queryReactions.d.ts.map +1 -1
  55. package/dist/reactionRepository/api/queryReactor.d.ts +19 -0
  56. package/dist/reactionRepository/api/queryReactor.d.ts.map +1 -0
  57. package/dist/reactionRepository/api/removeReaction.d.ts +2 -2
  58. package/dist/reactionRepository/api/removeReaction.d.ts.map +1 -1
  59. package/dist/reactionRepository/observers/getReactions.d.ts +3 -3
  60. package/dist/reactionRepository/observers/getReactions.d.ts.map +1 -1
  61. package/dist/streamRepository/observers/getStreamById.d.ts +19 -2
  62. package/dist/streamRepository/observers/getStreamById.d.ts.map +1 -1
  63. package/dist/streamRepository/observers/getStreams.d.ts.map +1 -1
  64. package/dist/streamRepository/observers/tests/getStreamById.test.d.ts +2 -0
  65. package/dist/streamRepository/observers/tests/getStreamById.test.d.ts.map +1 -0
  66. package/dist/userRepository/observers/getUsers.d.ts +1 -0
  67. package/dist/userRepository/observers/getUsers.d.ts.map +1 -1
  68. package/dist/utils/tests/dummy/reaction.d.ts +1 -1
  69. package/dist/utils/tests/dummy/reaction.d.ts.map +1 -1
  70. package/dist/utils/tests/dummy/stream.d.ts +22 -0
  71. package/dist/utils/tests/dummy/stream.d.ts.map +1 -1
  72. package/package.json +1 -1
  73. package/src/@types/core/events.ts +4 -4
  74. package/src/@types/core/model.ts +3 -1
  75. package/src/@types/core/payload.ts +1 -1
  76. package/src/@types/domains/post.ts +1 -1
  77. package/src/@types/domains/reaction.ts +8 -9
  78. package/src/categoryRepository/api/queryCategories.ts +1 -1
  79. package/src/channelRepsitory/channelMembership/observers/getMembers.ts +47 -39
  80. package/src/channelRepsitory/channelMembership/observers/tests/getMembers.test.ts +82 -5
  81. package/src/client/observers/getTotalUnreadCount.ts +1 -7
  82. package/src/client/observers/tests/getTotalUnreadCount.test.ts +3 -10
  83. package/src/client/utils/markerSyncEngine.ts +13 -2
  84. package/src/commentRepository/events/onCommentReactionAdded.ts +1 -1
  85. package/src/commentRepository/events/onCommentReactionRemoved.ts +1 -1
  86. package/src/commentRepository/observers/getComment.ts +2 -2
  87. package/src/commentRepository/observers/tests/getComment.test.ts +1 -3
  88. package/src/communityRepository/api/getCommunity.ts +4 -4
  89. package/src/communityRepository/api/getRecommendedCommunities.ts +7 -48
  90. package/src/communityRepository/api/getTopTrendingCommunities.ts +5 -2
  91. package/src/communityRepository/api/getTrendingCommunities.ts +50 -0
  92. package/src/communityRepository/api/index.ts +1 -1
  93. package/src/communityRepository/api/test/getTrendingCommunities.test.ts +102 -0
  94. package/src/communityRepository/communityMembership/observers/getMembers.ts +31 -23
  95. package/src/communityRepository/communityMembership/observers/tests/getMembers.test.ts +80 -2
  96. package/src/communityRepository/observers/getCommunities.ts +2 -2
  97. package/src/communityRepository/observers/getCommunity.ts +2 -2
  98. package/src/communityRepository/observers/getRecommendedCommunities.ts +130 -0
  99. package/src/communityRepository/observers/getTrendingCommunities.ts +130 -0
  100. package/src/communityRepository/observers/index.ts +2 -0
  101. package/src/communityRepository/utils/communityQueryFilter.ts +55 -0
  102. package/src/core/model/idResolvers.ts +2 -1
  103. package/src/core/model/identifyModel.ts +5 -4
  104. package/src/pollRepository/api/index.ts +0 -2
  105. package/src/pollRepository/observers/getPoll.ts +33 -0
  106. package/src/pollRepository/observers/index.ts +1 -0
  107. package/src/pollRepository/observers/observePoll.ts +2 -2
  108. package/src/postRepository/events/tests/onPostReactionAdded.test.ts +6 -5
  109. package/src/postRepository/events/tests/onPostReactionRemoved.test.ts +5 -4
  110. package/src/postRepository/observers/getPost.ts +2 -2
  111. package/src/postRepository/observers/getPosts.ts +1 -1
  112. package/src/postRepository/observers/tests/getPost.test.ts +1 -3
  113. package/src/postRepository/observers/tests/getPosts.test.ts +1 -5
  114. package/src/reactionRepository/api/addReaction.ts +2 -2
  115. package/src/reactionRepository/api/queryReactions.ts +2 -2
  116. package/src/reactionRepository/api/queryReactor.ts +31 -0
  117. package/src/reactionRepository/api/removeReaction.ts +2 -2
  118. package/src/reactionRepository/observers/getReactions.ts +6 -8
  119. package/src/streamRepository/observers/getStreamById.ts +35 -1
  120. package/src/streamRepository/observers/getStreams.ts +6 -5
  121. package/src/streamRepository/observers/tests/getStreamById.test.ts +44 -0
  122. package/src/userRepository/observers/getUsers.ts +32 -24
  123. package/src/userRepository/observers/tests/getUsers.test.ts +46 -1
  124. package/src/utils/tests/dummy/reaction.ts +6 -10
  125. package/src/utils/tests/dummy/stream.ts +47 -0
@@ -10,7 +10,7 @@ import {
10
10
  } from '~/utils/constants';
11
11
 
12
12
  import { onReactorAdded, onReactorRemoved } from '../events';
13
- import { queryReactions } from '../api/queryReactions';
13
+ import { queryReactor } from '../api/queryReactor';
14
14
 
15
15
  /* begin_public_function
16
16
  id: reaction.query
@@ -26,11 +26,11 @@ import { queryReactions } from '../api/queryReactions';
26
26
  * }, response => merge(reactions, response.data))
27
27
  * ```
28
28
  *
29
- * Observe all mutations on a list of {@link Amity.Reaction} for a given target object
29
+ * Observe all mutations on a list of {@link Amity.Reactor} for a given target object
30
30
  *
31
- * @param params.referenceType the type of the target
32
- * @param params.referenceId the ID of the target
31
+ * @param params for querying reactions
33
32
  * @param callback the function to call when new data are available
33
+ * @param config the live collection configuration
34
34
  * @returns An {@link Amity.Unsubscriber} function to run when willing to stop observing the messages
35
35
  *
36
36
  * @category Reactions Live Collection
@@ -98,7 +98,7 @@ export const getReactions = (
98
98
 
99
99
  if (!initial && reactions.length > 0 && !collection?.params?.page) return;
100
100
 
101
- const query = createQuery(queryReactions, {
101
+ const query = createQuery(queryReactor, {
102
102
  ...queryParams,
103
103
  page: (!initial ? collection?.params.page : undefined) ?? { limit },
104
104
  });
@@ -114,9 +114,7 @@ export const getReactions = (
114
114
  };
115
115
 
116
116
  if (result) {
117
- data.data = [
118
- ...new Set([...reactions, ...result[0].reactors.map(getResolver('reaction'))]),
119
- ];
117
+ data.data = [...new Set([...reactions, ...result.map(getResolver('reactor'))])];
120
118
  }
121
119
 
122
120
  pushToCache(cacheKey, data);
@@ -3,6 +3,8 @@
3
3
  import { onStreamRecorded, onStreamStarted, onStreamStopped } from '../events';
4
4
  import { getStream as _getStream } from '../api/getStream';
5
5
  import { liveObject } from '~/utils/liveObject';
6
+ import { getActiveClient } from '~/client';
7
+ import { pullFromCache } from '~/cache/api';
6
8
 
7
9
  /* begin_public_function
8
10
  id: stream.get
@@ -10,7 +12,8 @@ import { liveObject } from '~/utils/liveObject';
10
12
  /**
11
13
  * ```js
12
14
  * import { StreamRepository } from '@amityco/ts-sdk'
13
- * const stream = await StreamRepository.getStreamById('foobar')
15
+ * const unsub = StreamRepository.getStreamById('foobar')
16
+ * unsub()
14
17
  * ```
15
18
  *
16
19
  * Fetches a {@link Amity.Stream} object
@@ -32,3 +35,34 @@ export const getStreamById = (
32
35
  ]);
33
36
  };
34
37
  /* end_public_function */
38
+
39
+ /**
40
+ * ```js
41
+ * import { StreamRepository } from '@amityco/ts-sdk'
42
+ * const stream = StreamRepository.getStreamById.locally('foobar')
43
+ * ```
44
+ *
45
+ * Fetches a {@link Amity.Stream} live object
46
+ *
47
+ * @param streamId the ID of the {@link Amity.Stream} to fetch
48
+ * @returns the associated {@link Amity.Stream} live object
49
+ *
50
+ * @category Stream API
51
+ */
52
+ getStreamById.locally = (
53
+ streamId: Amity.Stream['streamId'],
54
+ ): Amity.Cached<Amity.Stream> | undefined => {
55
+ const client = getActiveClient();
56
+ client.log('stream/getStreamById', streamId);
57
+
58
+ if (!client.cache) return;
59
+
60
+ const cached = pullFromCache<Amity.Stream>(['stream', 'get', streamId]);
61
+
62
+ if (!cached) return;
63
+
64
+ return {
65
+ data: cached.data,
66
+ cachedAt: cached.cachedAt,
67
+ };
68
+ };
@@ -50,7 +50,7 @@ export const getStreams = (
50
50
  }
51
51
 
52
52
  const timestamp = Date.now();
53
- log(`queryStreams(tmpid: ${timestamp}) > listen`);
53
+ log(`getStreams(tmpid: ${timestamp}) > listen`);
54
54
 
55
55
  const { limit: queryLimit, ...queryParams } = params;
56
56
 
@@ -58,7 +58,7 @@ export const getStreams = (
58
58
  const { policy = COLLECTION_DEFAULT_CACHING_POLICY } = config ?? {};
59
59
 
60
60
  const disposers: Amity.Unsubscriber[] = [];
61
- const cacheKey = ['streams', 'collection', {}];
61
+ const cacheKey = ['streams', 'collection', params];
62
62
 
63
63
  const applyFilter = (data: Amity.Stream[]): Amity.Stream[] => {
64
64
  let streams = filterByPropEquality(data, 'isDeleted', params.isDeleted);
@@ -73,7 +73,9 @@ export const getStreams = (
73
73
  const responder = (data: Amity.UserLiveCollectionCache, isEventModel = false) => {
74
74
  const streams: Amity.Stream[] =
75
75
  data.data
76
- .map(streamId => pullFromCache<Amity.Stream>(['streams', 'get', streamId])!)
76
+ .map(streamId => {
77
+ return pullFromCache<Amity.Stream>(['stream', 'get', streamId])!;
78
+ })
77
79
  .filter(Boolean)
78
80
  .map(({ data }) => data) ?? [];
79
81
 
@@ -124,7 +126,6 @@ export const getStreams = (
124
126
  if (result) {
125
127
  data.data = [...new Set([...streams, ...result.map(getResolver('stream'))])];
126
128
  }
127
-
128
129
  pushToCache(cacheKey, data);
129
130
 
130
131
  responder(data);
@@ -142,7 +143,7 @@ export const getStreams = (
142
143
  onFetch(true);
143
144
 
144
145
  return () => {
145
- log(`queryStreams(tmpid: ${timestamp}) > dispose`);
146
+ log(`getStreams(tmpid: ${timestamp}) > dispose`);
146
147
  disposers.forEach(fn => fn());
147
148
  };
148
149
  };
@@ -0,0 +1,44 @@
1
+ import { enableCache } from '~/cache/api';
2
+ import { client, connectClient, disconnectClient, pause, streamResponse } from '~/utils/tests';
3
+ import { getStreamById } from '../getStreamById';
4
+
5
+ const STREAM_ID = streamResponse.data.videoStreamings[0].streamId;
6
+
7
+ const getSnapshot = (params?: Record<string, any>) => {
8
+ return {
9
+ data: undefined as undefined | Amity.Stream,
10
+ loading: true,
11
+ error: undefined as any,
12
+ ...params,
13
+ };
14
+ };
15
+
16
+ describe('getStreamById', () => {
17
+ beforeAll(async () => {
18
+ await connectClient();
19
+ });
20
+ afterAll(async () => {
21
+ await disconnectClient();
22
+ });
23
+
24
+ test('Should return the stream from backend', async () => {
25
+ enableCache();
26
+ const snapshot = getSnapshot();
27
+ const update = getSnapshot({ data: streamResponse.data.videoStreamings[0], loading: false });
28
+
29
+ const callback = jest.fn();
30
+ client.http.get = jest.fn().mockResolvedValue(streamResponse);
31
+
32
+ getStreamById(STREAM_ID, callback);
33
+ await pause();
34
+
35
+ expect(callback).toHaveBeenCalledTimes(2);
36
+ expect(callback).toHaveBeenNthCalledWith(1, expect.objectContaining(snapshot));
37
+ expect(callback).toHaveBeenNthCalledWith(2, expect.objectContaining(update));
38
+ });
39
+
40
+ test('Should return stream from locally', async () => {
41
+ const stream: ReturnType<typeof getStreamById.locally> = getStreamById.locally(STREAM_ID);
42
+ expect(stream?.data).toEqual(streamResponse.data.videoStreamings[0]);
43
+ });
44
+ });
@@ -28,6 +28,36 @@ import {
28
28
  onUserDeleted,
29
29
  } from '../events';
30
30
 
31
+ /*
32
+ * Exported for testing
33
+ * @hidden
34
+ */
35
+ export const applyFilter = <T extends Amity.User>(
36
+ data: T[],
37
+ params: Amity.UserLiveCollection,
38
+ ): T[] => {
39
+ let users = filterByPropEquality(data, 'displayName', params.displayName);
40
+
41
+ switch (params.sortBy) {
42
+ case 'firstCreated':
43
+ users = users.sort(sortByFirstCreated);
44
+ break;
45
+
46
+ case 'lastCreated':
47
+ users = users.sort(sortByLastCreated);
48
+ break;
49
+
50
+ default:
51
+ users = users
52
+ // this needs to be aligned with the backend data type
53
+ .map(u => (u.displayName ? u : { ...u, displayName: '' }))
54
+ // @ts-ignore
55
+ .sort(sortByDisplayName);
56
+ }
57
+
58
+ return users;
59
+ };
60
+
31
61
  /* begin_public_function
32
62
  id: user.query
33
63
  */
@@ -55,6 +85,7 @@ export const getUsers = (
55
85
  const { log, cache } = getActiveClient();
56
86
 
57
87
  if (!cache) {
88
+ // eslint-disable-next-line no-console
58
89
  console.log(ENABLE_CACHE_MESSAGE);
59
90
  }
60
91
 
@@ -69,29 +100,6 @@ export const getUsers = (
69
100
  const disposers: Amity.Unsubscriber[] = [];
70
101
  const cacheKey = ['user', 'collection', {}];
71
102
 
72
- const applyFilter = (data: Amity.User[]): Amity.User[] => {
73
- let users = filterByPropEquality(data, 'displayName', params.displayName);
74
-
75
- switch (params.sortBy) {
76
- case 'firstCreated':
77
- users = users.sort(sortByFirstCreated);
78
- break;
79
-
80
- case 'lastCreated':
81
- users = users.sort(sortByLastCreated);
82
- break;
83
-
84
- default:
85
- users = users
86
- // this needs to be aligned with the backend data type
87
- .map(u => (u.displayName ? u : { ...u, displayName: '' }))
88
- // @ts-ignore
89
- .sort(sortByDisplayName);
90
- }
91
-
92
- return users;
93
- };
94
-
95
103
  const responder = (data: Amity.UserLiveCollectionCache, isEventModel = false) => {
96
104
  const users: Amity.User[] =
97
105
  data.data
@@ -104,7 +112,7 @@ export const getUsers = (
104
112
  /*
105
113
  * Only apply filter to RTE Model
106
114
  */
107
- data: isEventModel ? applyFilter(users) : users,
115
+ data: isEventModel ? applyFilter(users, params) : users,
108
116
  hasNextPage: !!data.params?.page,
109
117
  loading: data.loading,
110
118
  error: data.error,
@@ -1,3 +1,4 @@
1
+ import { getPastDate } from '~/core/model';
1
2
  import { disableCache, enableCache } from '~/cache/api';
2
3
  import {
3
4
  client,
@@ -10,7 +11,10 @@ import {
10
11
  userQueryResponsePage2,
11
12
  } from '~/utils/tests';
12
13
 
13
- import { getUsers } from '../getUsers';
14
+ // makes it easier to spy on applyFilter
15
+ import * as getUsersModule from '../getUsers';
16
+
17
+ const { getUsers, applyFilter } = getUsersModule;
14
18
 
15
19
  const getSnapshot = (params?: Record<string, any>) => {
16
20
  return {
@@ -166,5 +170,46 @@ describe('getUsers', () => {
166
170
  ),
167
171
  );
168
172
  });
173
+
174
+ test('it should apply filters on RTE only', async () => {
175
+ const callback = jest.fn();
176
+ const applyFilterSpy = jest.spyOn(getUsersModule, 'applyFilter');
177
+ client.http.get = jest.fn().mockResolvedValue(userQueryResponse);
178
+
179
+ getUsers(params, callback);
180
+ await pause();
181
+
182
+ expect(applyFilterSpy).not.toHaveBeenCalled();
183
+
184
+ client.emitter.emit('user.updated', { users: [updatedUser], files: [] });
185
+ await pause();
186
+
187
+ expect(applyFilterSpy).toHaveBeenCalled();
188
+ });
189
+ });
190
+ });
191
+
192
+ describe('getUsers > applyFilter', () => {
193
+ const u1 = {
194
+ userId: 'test',
195
+ displayName: 'a',
196
+ createdAt: new Date().toISOString(),
197
+ } as Amity.User;
198
+
199
+ const u2 = {
200
+ userId: 'searchable',
201
+ displayName: 'b',
202
+ createdAt: getPastDate(),
203
+ } as Amity.User;
204
+
205
+ const filters: [string, Amity.UserLiveCollection, Amity.User[], Amity.User[]][] = [
206
+ ['it should filter by display name', { displayName: 'a' }, [u1, u2], [u1]],
207
+ ['it should sort by dispaly name', {}, [u1, u2], [u1, u2]],
208
+ ['it should sort by last created', { sortBy: 'lastCreated' }, [u1, u2], [u1, u2]],
209
+ ['it should sort by first created', { sortBy: 'firstCreated' }, [u1, u2], [u2, u1]],
210
+ ];
211
+
212
+ test.each(filters)('%s', (test, param, input, expected) => {
213
+ expect(applyFilter(input, param)).toStrictEqual(expected);
169
214
  });
170
215
  });
@@ -1,22 +1,18 @@
1
1
  import { post11, user11 } from '.';
2
2
 
3
- export const reaction11: Amity.Reaction = {
4
- reactionName: 'reaction11',
5
- reactionId: 'reaction11',
6
- referenceId: post11.postId,
7
- referenceType: 'post',
8
- userId: user11.userId,
9
- createdAt: '',
10
- };
11
-
12
3
  export const reactor11: Amity.Reactor = {
13
4
  reactionName: 'reaction11',
14
5
  reactionId: 'reaction11',
15
6
  userId: user11.userId,
16
7
  createdAt: '',
17
8
  };
9
+ export const reaction11: Amity.Reaction = {
10
+ referenceId: post11.postId,
11
+ referenceType: 'post',
12
+ reactors: [reactor11],
13
+ };
18
14
 
19
15
  export const reactionPayload: Amity.ReactionPayload = {
20
- reactions: [{ ...reaction11, reactors: [reactor11] }],
16
+ reactions: [reaction11],
21
17
  users: [user11],
22
18
  };
@@ -84,3 +84,50 @@ export const streamResponse = {
84
84
  ],
85
85
  },
86
86
  };
87
+
88
+ export const streamsResponse = [
89
+ {
90
+ title: 'Deleted',
91
+ description: 'Deleted',
92
+ metadata: {},
93
+ streamerUrl: {},
94
+ watcherUrl: {},
95
+ status: 'ended',
96
+ isLive: false,
97
+ isDeleted: true,
98
+ startedAt: '2023-06-06T05:43:31.540Z',
99
+ endedAt: '2023-06-06T07:21:54.298Z',
100
+ resolution: 'HD',
101
+ updatedAt: '2023-06-06T07:21:54.299Z',
102
+ createdAt: '2023-06-06T05:43:21.633Z',
103
+ streamId: '53d239a2d1b05f340ab0010d71e8b1a0',
104
+ userId: 'DFonV53',
105
+ thumbnailFileId: null,
106
+ platform: {
107
+ name: 'apsara',
108
+ version: '2016-11-01',
109
+ },
110
+ },
111
+ {
112
+ title: 'Deleted',
113
+ description: 'Deleted',
114
+ metadata: {},
115
+ streamerUrl: {},
116
+ watcherUrl: {},
117
+ status: 'ended',
118
+ isLive: false,
119
+ isDeleted: true,
120
+ startedAt: '2023-06-06T04:14:34.066Z',
121
+ endedAt: '2023-06-06T07:21:54.298Z',
122
+ resolution: 'HD',
123
+ updatedAt: '2023-06-06T07:21:54.299Z',
124
+ createdAt: '2023-06-06T04:14:26.166Z',
125
+ streamId: '9370a1f526389435946199e49428522d',
126
+ userId: 'DFonV53',
127
+ thumbnailFileId: null,
128
+ platform: {
129
+ name: 'apsara',
130
+ version: '2016-11-01',
131
+ },
132
+ },
133
+ ];