@stream-io/feeds-client 0.3.48 → 0.3.50
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 +20 -0
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/react-bindings.js +1 -1
- package/dist/es/index.mjs +2 -2
- package/dist/es/index.mjs.map +1 -1
- package/dist/es/react-bindings.mjs +1 -1
- package/dist/{feeds-client-D-EFo20w.mjs → feeds-client-BHpmg4_E.mjs} +270 -176
- package/dist/feeds-client-BHpmg4_E.mjs.map +1 -0
- package/dist/{feeds-client-DuJuJuEJ.js → feeds-client-CKxvuiKz.js} +270 -176
- package/dist/feeds-client-CKxvuiKz.js.map +1 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/dist/types/common/Poll.d.ts +7 -3
- package/dist/types/common/Poll.d.ts.map +1 -1
- 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/event-handlers/activity-updater.d.ts +3 -1
- package/dist/types/feed/event-handlers/activity-updater.d.ts.map +1 -1
- package/dist/types/feed/event-handlers/comment/handle-comment-added.d.ts.map +1 -1
- package/dist/types/feed/feed.d.ts +2 -2
- package/dist/types/feed/feed.d.ts.map +1 -1
- package/dist/types/feeds-client/feeds-client.d.ts +7 -3
- package/dist/types/feeds-client/feeds-client.d.ts.map +1 -1
- package/dist/types/gen/feeds/FeedsApi.d.ts +34 -3
- 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 +276 -422
- package/dist/types/gen/models/index.d.ts.map +1 -1
- package/dist/types/gen/moderation/ModerationApi.d.ts.map +1 -1
- package/dist/types/types.d.ts +2 -2
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/utils/constants.d.ts +1 -1
- package/package.json +1 -1
- package/src/common/Poll.ts +16 -15
- package/src/feed/event-handlers/comment/handle-comment-added.ts +14 -2
- package/src/feed/feed.ts +25 -9
- package/src/feeds-client/feeds-client.ts +28 -1
- package/src/gen/feeds/FeedsApi.ts +200 -2
- package/src/gen/model-decoders/decoders.ts +95 -230
- package/src/gen/model-decoders/event-decoder-mapping.ts +6 -2
- package/src/gen/models/index.ts +443 -746
- package/src/gen/moderation/ModerationApi.ts +1 -0
- package/src/test-utils/response-generators.ts +3 -2
- package/src/types.ts +2 -2
- package/src/utils/constants.ts +1 -1
- package/dist/feeds-client-D-EFo20w.mjs.map +0 -1
- package/dist/feeds-client-DuJuJuEJ.js.map +0 -1
|
@@ -36,11 +36,23 @@ export function handleCommentAdded(
|
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
const newComments = entityState?.comments ? [...entityState.comments] : [];
|
|
39
|
+
const sort = entityState.pagination?.sort;
|
|
40
|
+
const hasMorePages = entityState.pagination?.next !== undefined;
|
|
41
|
+
const isFromCurrentUser = eventTriggeredByConnectedUser.call(this, payload);
|
|
39
42
|
|
|
40
|
-
if (
|
|
43
|
+
if (sort === 'last') {
|
|
41
44
|
newComments.unshift(comment);
|
|
45
|
+
} else if (sort === 'first') {
|
|
46
|
+
if (isFromCurrentUser) {
|
|
47
|
+
newComments.push(comment);
|
|
48
|
+
} else {
|
|
49
|
+
if (!hasMorePages) {
|
|
50
|
+
newComments.push(comment);
|
|
51
|
+
} else {
|
|
52
|
+
return currentState;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
42
55
|
} else {
|
|
43
|
-
// 'first' and other sort options
|
|
44
56
|
newComments.push(comment);
|
|
45
57
|
}
|
|
46
58
|
|
package/src/feed/feed.ts
CHANGED
|
@@ -188,6 +188,7 @@ export class Feed extends FeedApi {
|
|
|
188
188
|
'feeds.feed.updated': handleFeedUpdated.bind(this),
|
|
189
189
|
'feeds.feed_group.changed': Feed.noop,
|
|
190
190
|
'feeds.feed_group.deleted': Feed.noop,
|
|
191
|
+
'feeds.feed_group.restored': Feed.noop,
|
|
191
192
|
'feeds.follow.created': handleFollowCreated.bind(this),
|
|
192
193
|
'feeds.follow.deleted': handleFollowDeleted.bind(this),
|
|
193
194
|
'feeds.follow.updated': handleFollowUpdated.bind(this),
|
|
@@ -216,11 +217,11 @@ export class Feed extends FeedApi {
|
|
|
216
217
|
'app.updated': Feed.noop,
|
|
217
218
|
'user.banned': Feed.noop,
|
|
218
219
|
'user.deactivated': Feed.noop,
|
|
219
|
-
'user.muted': Feed.noop,
|
|
220
220
|
'user.reactivated': Feed.noop,
|
|
221
221
|
'user.updated': Feed.noop,
|
|
222
222
|
'feeds.activity.feedback': handleActivityFeedback.bind(this),
|
|
223
223
|
'feeds.activity.restored': Feed.noop,
|
|
224
|
+
'user.unbanned': Feed.noop,
|
|
224
225
|
};
|
|
225
226
|
|
|
226
227
|
protected eventDispatcher: EventDispatcher<WSEvent['type'], WSEvent> =
|
|
@@ -295,7 +296,9 @@ export class Feed extends FeedApi {
|
|
|
295
296
|
const { last_get_or_create_request_config } = this.state.getLatestValue();
|
|
296
297
|
if (last_get_or_create_request_config?.watch) {
|
|
297
298
|
this.inProgressGetOrCreate = undefined;
|
|
298
|
-
await withRetry(() =>
|
|
299
|
+
await withRetry(() =>
|
|
300
|
+
this.getOrCreate(last_get_or_create_request_config),
|
|
301
|
+
);
|
|
299
302
|
}
|
|
300
303
|
}
|
|
301
304
|
|
|
@@ -509,6 +512,25 @@ export class Feed extends FeedApi {
|
|
|
509
512
|
);
|
|
510
513
|
|
|
511
514
|
const existingComments = newCommentsByEntityId[entityId]?.comments;
|
|
515
|
+
let comments: CommentResponse[] = existingComments
|
|
516
|
+
? uniqueArrayMerge(
|
|
517
|
+
existingComments,
|
|
518
|
+
newComments,
|
|
519
|
+
(comment) => comment.id,
|
|
520
|
+
)
|
|
521
|
+
: newComments;
|
|
522
|
+
// Only sort when merging pages (existing + new); initial load order comes from API
|
|
523
|
+
if (
|
|
524
|
+
data.sort === 'first' &&
|
|
525
|
+
existingComments &&
|
|
526
|
+
existingComments.length > 0
|
|
527
|
+
) {
|
|
528
|
+
comments = [...comments].sort(
|
|
529
|
+
(a, b) =>
|
|
530
|
+
new Date(a.created_at).getTime() -
|
|
531
|
+
new Date(b.created_at).getTime(),
|
|
532
|
+
);
|
|
533
|
+
}
|
|
512
534
|
|
|
513
535
|
newCommentsByEntityId[entityId] = {
|
|
514
536
|
...newCommentsByEntityId[entityId],
|
|
@@ -518,13 +540,7 @@ export class Feed extends FeedApi {
|
|
|
518
540
|
next: item.next,
|
|
519
541
|
sort: data.sort,
|
|
520
542
|
},
|
|
521
|
-
comments
|
|
522
|
-
? uniqueArrayMerge(
|
|
523
|
-
existingComments,
|
|
524
|
-
newComments,
|
|
525
|
-
(comment) => comment.id,
|
|
526
|
-
)
|
|
527
|
-
: newComments,
|
|
543
|
+
comments,
|
|
528
544
|
};
|
|
529
545
|
}
|
|
530
546
|
|
|
@@ -33,6 +33,8 @@ import type {
|
|
|
33
33
|
UpdateCommentRequest,
|
|
34
34
|
UpdateCommentResponse,
|
|
35
35
|
UpdateFollowRequest,
|
|
36
|
+
UpdatePollPartialRequest,
|
|
37
|
+
UpdatePollRequest,
|
|
36
38
|
UserRequest,
|
|
37
39
|
WSEvent,
|
|
38
40
|
} from '../gen/models';
|
|
@@ -452,15 +454,40 @@ export class FeedsClient extends FeedsApi {
|
|
|
452
454
|
return streamDevToken(userId);
|
|
453
455
|
};
|
|
454
456
|
|
|
457
|
+
updatePoll = async (request: UpdatePollRequest) => {
|
|
458
|
+
const poll = this.pollFromState(request.id);
|
|
459
|
+
const response = await super.updatePoll(request);
|
|
460
|
+
if (response.poll && poll) {
|
|
461
|
+
poll.handlePollUpdated({ poll: response.poll, created_at: new Date() });
|
|
462
|
+
}
|
|
463
|
+
return response;
|
|
464
|
+
};
|
|
465
|
+
|
|
466
|
+
updatePollPartial = async (
|
|
467
|
+
request: UpdatePollPartialRequest & { poll_id: string },
|
|
468
|
+
) => {
|
|
469
|
+
const poll = this.pollFromState(request.poll_id);
|
|
470
|
+
const response = await super.updatePollPartial(request);
|
|
471
|
+
if (response.poll && poll) {
|
|
472
|
+
poll.handlePollUpdated({ poll: response.poll, created_at: new Date() });
|
|
473
|
+
}
|
|
474
|
+
return response;
|
|
475
|
+
};
|
|
476
|
+
|
|
455
477
|
closePoll = async (request: {
|
|
456
478
|
poll_id: string;
|
|
457
479
|
}): Promise<StreamResponse<PollResponse>> => {
|
|
458
|
-
|
|
480
|
+
const poll = this.pollFromState(request.poll_id);
|
|
481
|
+
const response = await super.updatePollPartial({
|
|
459
482
|
poll_id: request.poll_id,
|
|
460
483
|
set: {
|
|
461
484
|
is_closed: true,
|
|
462
485
|
},
|
|
463
486
|
});
|
|
487
|
+
if (response.poll && poll) {
|
|
488
|
+
poll.handlePollClosed({ poll: response.poll, created_at: new Date() });
|
|
489
|
+
}
|
|
490
|
+
return response;
|
|
464
491
|
};
|
|
465
492
|
|
|
466
493
|
castPollVote = async (
|
|
@@ -18,6 +18,8 @@ import type {
|
|
|
18
18
|
AddCommentsBatchResponse,
|
|
19
19
|
AddReactionRequest,
|
|
20
20
|
AddReactionResponse,
|
|
21
|
+
AddUserGroupMembersRequest,
|
|
22
|
+
AddUserGroupMembersResponse,
|
|
21
23
|
BlockUsersRequest,
|
|
22
24
|
BlockUsersResponse,
|
|
23
25
|
CastPollVoteRequest,
|
|
@@ -32,6 +34,8 @@ import type {
|
|
|
32
34
|
CreateGuestResponse,
|
|
33
35
|
CreatePollOptionRequest,
|
|
34
36
|
CreatePollRequest,
|
|
37
|
+
CreateUserGroupRequest,
|
|
38
|
+
CreateUserGroupResponse,
|
|
35
39
|
DeleteActivitiesRequest,
|
|
36
40
|
DeleteActivitiesResponse,
|
|
37
41
|
DeleteActivityReactionResponse,
|
|
@@ -57,10 +61,12 @@ import type {
|
|
|
57
61
|
GetOGResponse,
|
|
58
62
|
GetOrCreateFeedRequest,
|
|
59
63
|
GetOrCreateFeedResponse,
|
|
64
|
+
GetUserGroupResponse,
|
|
60
65
|
ImageUploadRequest,
|
|
61
66
|
ImageUploadResponse,
|
|
62
67
|
ListBlockListResponse,
|
|
63
68
|
ListDevicesResponse,
|
|
69
|
+
ListUserGroupsResponse,
|
|
64
70
|
MarkActivityRequest,
|
|
65
71
|
OwnBatchRequest,
|
|
66
72
|
OwnBatchResponse,
|
|
@@ -100,9 +106,11 @@ import type {
|
|
|
100
106
|
RejectFeedMemberInviteResponse,
|
|
101
107
|
RejectFollowRequest,
|
|
102
108
|
RejectFollowResponse,
|
|
109
|
+
RemoveUserGroupMembersResponse,
|
|
103
110
|
Response,
|
|
104
111
|
RestoreActivityRequest,
|
|
105
112
|
RestoreActivityResponse,
|
|
113
|
+
SearchUserGroupsResponse,
|
|
106
114
|
SharedLocationResponse,
|
|
107
115
|
SharedLocationsResponse,
|
|
108
116
|
SingleFollowResponse,
|
|
@@ -136,6 +144,8 @@ import type {
|
|
|
136
144
|
UpdatePollOptionRequest,
|
|
137
145
|
UpdatePollPartialRequest,
|
|
138
146
|
UpdatePollRequest,
|
|
147
|
+
UpdateUserGroupRequest,
|
|
148
|
+
UpdateUserGroupResponse,
|
|
139
149
|
UpdateUsersPartialRequest,
|
|
140
150
|
UpdateUsersRequest,
|
|
141
151
|
UpdateUsersResponse,
|
|
@@ -775,6 +785,7 @@ export class FeedsApi {
|
|
|
775
785
|
mentioned_user_ids: request?.mentioned_user_ids,
|
|
776
786
|
custom: request?.custom,
|
|
777
787
|
location: request?.location,
|
|
788
|
+
search_data: request?.search_data,
|
|
778
789
|
};
|
|
779
790
|
|
|
780
791
|
const response = await this.apiClient.sendRequest<
|
|
@@ -935,8 +946,8 @@ export class FeedsApi {
|
|
|
935
946
|
return { ...response.body, metadata: response.metadata };
|
|
936
947
|
}
|
|
937
948
|
|
|
938
|
-
async readCollections(request
|
|
939
|
-
collection_refs
|
|
949
|
+
async readCollections(request?: {
|
|
950
|
+
collection_refs?: string[];
|
|
940
951
|
}): Promise<StreamResponse<ReadCollectionsResponse>> {
|
|
941
952
|
const queryParams = {
|
|
942
953
|
collection_refs: request?.collection_refs,
|
|
@@ -2465,6 +2476,193 @@ export class FeedsApi {
|
|
|
2465
2476
|
return { ...response.body, metadata: response.metadata };
|
|
2466
2477
|
}
|
|
2467
2478
|
|
|
2479
|
+
async listUserGroups(request?: {
|
|
2480
|
+
limit?: number;
|
|
2481
|
+
id_gt?: string;
|
|
2482
|
+
created_at_gt?: string;
|
|
2483
|
+
team_id?: string;
|
|
2484
|
+
}): Promise<StreamResponse<ListUserGroupsResponse>> {
|
|
2485
|
+
const queryParams = {
|
|
2486
|
+
limit: request?.limit,
|
|
2487
|
+
id_gt: request?.id_gt,
|
|
2488
|
+
created_at_gt: request?.created_at_gt,
|
|
2489
|
+
team_id: request?.team_id,
|
|
2490
|
+
};
|
|
2491
|
+
|
|
2492
|
+
const response = await this.apiClient.sendRequest<
|
|
2493
|
+
StreamResponse<ListUserGroupsResponse>
|
|
2494
|
+
>('GET', '/api/v2/usergroups', undefined, queryParams);
|
|
2495
|
+
|
|
2496
|
+
decoders.ListUserGroupsResponse?.(response.body);
|
|
2497
|
+
|
|
2498
|
+
return { ...response.body, metadata: response.metadata };
|
|
2499
|
+
}
|
|
2500
|
+
|
|
2501
|
+
async createUserGroup(
|
|
2502
|
+
request: CreateUserGroupRequest,
|
|
2503
|
+
): Promise<StreamResponse<CreateUserGroupResponse>> {
|
|
2504
|
+
const body = {
|
|
2505
|
+
name: request?.name,
|
|
2506
|
+
description: request?.description,
|
|
2507
|
+
id: request?.id,
|
|
2508
|
+
team_id: request?.team_id,
|
|
2509
|
+
member_ids: request?.member_ids,
|
|
2510
|
+
};
|
|
2511
|
+
|
|
2512
|
+
const response = await this.apiClient.sendRequest<
|
|
2513
|
+
StreamResponse<CreateUserGroupResponse>
|
|
2514
|
+
>(
|
|
2515
|
+
'POST',
|
|
2516
|
+
'/api/v2/usergroups',
|
|
2517
|
+
undefined,
|
|
2518
|
+
undefined,
|
|
2519
|
+
body,
|
|
2520
|
+
'application/json',
|
|
2521
|
+
);
|
|
2522
|
+
|
|
2523
|
+
decoders.CreateUserGroupResponse?.(response.body);
|
|
2524
|
+
|
|
2525
|
+
return { ...response.body, metadata: response.metadata };
|
|
2526
|
+
}
|
|
2527
|
+
|
|
2528
|
+
async searchUserGroups(request: {
|
|
2529
|
+
query: string;
|
|
2530
|
+
limit?: number;
|
|
2531
|
+
name_gt?: string;
|
|
2532
|
+
id_gt?: string;
|
|
2533
|
+
team_id?: string;
|
|
2534
|
+
}): Promise<StreamResponse<SearchUserGroupsResponse>> {
|
|
2535
|
+
const queryParams = {
|
|
2536
|
+
query: request?.query,
|
|
2537
|
+
limit: request?.limit,
|
|
2538
|
+
name_gt: request?.name_gt,
|
|
2539
|
+
id_gt: request?.id_gt,
|
|
2540
|
+
team_id: request?.team_id,
|
|
2541
|
+
};
|
|
2542
|
+
|
|
2543
|
+
const response = await this.apiClient.sendRequest<
|
|
2544
|
+
StreamResponse<SearchUserGroupsResponse>
|
|
2545
|
+
>('GET', '/api/v2/usergroups/search', undefined, queryParams);
|
|
2546
|
+
|
|
2547
|
+
decoders.SearchUserGroupsResponse?.(response.body);
|
|
2548
|
+
|
|
2549
|
+
return { ...response.body, metadata: response.metadata };
|
|
2550
|
+
}
|
|
2551
|
+
|
|
2552
|
+
async deleteUserGroup(request: {
|
|
2553
|
+
id: string;
|
|
2554
|
+
team_id?: string;
|
|
2555
|
+
}): Promise<StreamResponse<Response>> {
|
|
2556
|
+
const queryParams = {
|
|
2557
|
+
team_id: request?.team_id,
|
|
2558
|
+
};
|
|
2559
|
+
const pathParams = {
|
|
2560
|
+
id: request?.id,
|
|
2561
|
+
};
|
|
2562
|
+
|
|
2563
|
+
const response = await this.apiClient.sendRequest<StreamResponse<Response>>(
|
|
2564
|
+
'DELETE',
|
|
2565
|
+
'/api/v2/usergroups/{id}',
|
|
2566
|
+
pathParams,
|
|
2567
|
+
queryParams,
|
|
2568
|
+
);
|
|
2569
|
+
|
|
2570
|
+
decoders.Response?.(response.body);
|
|
2571
|
+
|
|
2572
|
+
return { ...response.body, metadata: response.metadata };
|
|
2573
|
+
}
|
|
2574
|
+
|
|
2575
|
+
async getUserGroup(request: {
|
|
2576
|
+
id: string;
|
|
2577
|
+
team_id?: string;
|
|
2578
|
+
}): Promise<StreamResponse<GetUserGroupResponse>> {
|
|
2579
|
+
const queryParams = {
|
|
2580
|
+
team_id: request?.team_id,
|
|
2581
|
+
};
|
|
2582
|
+
const pathParams = {
|
|
2583
|
+
id: request?.id,
|
|
2584
|
+
};
|
|
2585
|
+
|
|
2586
|
+
const response = await this.apiClient.sendRequest<
|
|
2587
|
+
StreamResponse<GetUserGroupResponse>
|
|
2588
|
+
>('GET', '/api/v2/usergroups/{id}', pathParams, queryParams);
|
|
2589
|
+
|
|
2590
|
+
decoders.GetUserGroupResponse?.(response.body);
|
|
2591
|
+
|
|
2592
|
+
return { ...response.body, metadata: response.metadata };
|
|
2593
|
+
}
|
|
2594
|
+
|
|
2595
|
+
async updateUserGroup(
|
|
2596
|
+
request: UpdateUserGroupRequest & { id: string },
|
|
2597
|
+
): Promise<StreamResponse<UpdateUserGroupResponse>> {
|
|
2598
|
+
const pathParams = {
|
|
2599
|
+
id: request?.id,
|
|
2600
|
+
};
|
|
2601
|
+
const body = {
|
|
2602
|
+
description: request?.description,
|
|
2603
|
+
name: request?.name,
|
|
2604
|
+
team_id: request?.team_id,
|
|
2605
|
+
};
|
|
2606
|
+
|
|
2607
|
+
const response = await this.apiClient.sendRequest<
|
|
2608
|
+
StreamResponse<UpdateUserGroupResponse>
|
|
2609
|
+
>(
|
|
2610
|
+
'PUT',
|
|
2611
|
+
'/api/v2/usergroups/{id}',
|
|
2612
|
+
pathParams,
|
|
2613
|
+
undefined,
|
|
2614
|
+
body,
|
|
2615
|
+
'application/json',
|
|
2616
|
+
);
|
|
2617
|
+
|
|
2618
|
+
decoders.UpdateUserGroupResponse?.(response.body);
|
|
2619
|
+
|
|
2620
|
+
return { ...response.body, metadata: response.metadata };
|
|
2621
|
+
}
|
|
2622
|
+
|
|
2623
|
+
async removeUserGroupMembers(request: {
|
|
2624
|
+
id: string;
|
|
2625
|
+
}): Promise<StreamResponse<RemoveUserGroupMembersResponse>> {
|
|
2626
|
+
const pathParams = {
|
|
2627
|
+
id: request?.id,
|
|
2628
|
+
};
|
|
2629
|
+
|
|
2630
|
+
const response = await this.apiClient.sendRequest<
|
|
2631
|
+
StreamResponse<RemoveUserGroupMembersResponse>
|
|
2632
|
+
>('DELETE', '/api/v2/usergroups/{id}/members', pathParams, undefined);
|
|
2633
|
+
|
|
2634
|
+
decoders.RemoveUserGroupMembersResponse?.(response.body);
|
|
2635
|
+
|
|
2636
|
+
return { ...response.body, metadata: response.metadata };
|
|
2637
|
+
}
|
|
2638
|
+
|
|
2639
|
+
async addUserGroupMembers(
|
|
2640
|
+
request: AddUserGroupMembersRequest & { id: string },
|
|
2641
|
+
): Promise<StreamResponse<AddUserGroupMembersResponse>> {
|
|
2642
|
+
const pathParams = {
|
|
2643
|
+
id: request?.id,
|
|
2644
|
+
};
|
|
2645
|
+
const body = {
|
|
2646
|
+
member_ids: request?.member_ids,
|
|
2647
|
+
team_id: request?.team_id,
|
|
2648
|
+
};
|
|
2649
|
+
|
|
2650
|
+
const response = await this.apiClient.sendRequest<
|
|
2651
|
+
StreamResponse<AddUserGroupMembersResponse>
|
|
2652
|
+
>(
|
|
2653
|
+
'POST',
|
|
2654
|
+
'/api/v2/usergroups/{id}/members',
|
|
2655
|
+
pathParams,
|
|
2656
|
+
undefined,
|
|
2657
|
+
body,
|
|
2658
|
+
'application/json',
|
|
2659
|
+
);
|
|
2660
|
+
|
|
2661
|
+
decoders.AddUserGroupMembersResponse?.(response.body);
|
|
2662
|
+
|
|
2663
|
+
return { ...response.body, metadata: response.metadata };
|
|
2664
|
+
}
|
|
2665
|
+
|
|
2468
2666
|
async queryUsers(request?: {
|
|
2469
2667
|
payload?: QueryUsersPayload;
|
|
2470
2668
|
}): Promise<StreamResponse<QueryUsersResponse>> {
|