stream-chat 9.45.5 → 9.46.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.
- package/dist/cjs/index.browser.js +214 -159
- package/dist/cjs/index.browser.js.map +3 -3
- package/dist/cjs/index.node.js +215 -159
- package/dist/cjs/index.node.js.map +3 -3
- package/dist/esm/index.mjs +214 -159
- package/dist/esm/index.mjs.map +3 -3
- package/dist/types/client.d.ts +2 -0
- package/dist/types/search/ChannelMemberSearchSource.d.ts +24 -0
- package/dist/types/search/index.d.ts +1 -0
- package/dist/types/utils/FixedSizeQueueCache.d.ts +4 -0
- package/package.json +1 -1
- package/src/client.ts +4 -0
- package/src/search/ChannelMemberSearchSource.ts +85 -0
- package/src/search/MessageSearchSource.ts +1 -1
- package/src/search/index.ts +1 -0
- package/src/utils/FixedSizeQueueCache.ts +11 -0
package/dist/types/client.d.ts
CHANGED
|
@@ -23,6 +23,7 @@ import { ReminderManager } from './reminders';
|
|
|
23
23
|
import { StateStore } from './store';
|
|
24
24
|
import type { MessageComposer } from './messageComposer';
|
|
25
25
|
import type { AbstractOfflineDB } from './offline-support';
|
|
26
|
+
import { FixedSizeQueueCache } from './utils/FixedSizeQueueCache';
|
|
26
27
|
type MessageComposerTearDownFunction = () => void;
|
|
27
28
|
export type QueryChannelsResponseWithChannels = Omit<QueryChannelsAPIResponse, 'channels'> & {
|
|
28
29
|
channels: Channel[];
|
|
@@ -110,6 +111,7 @@ export declare class StreamChat {
|
|
|
110
111
|
defaultWSTimeout: number;
|
|
111
112
|
sdkIdentifier?: SdkIdentifier;
|
|
112
113
|
deviceIdentifier?: DeviceIdentifier;
|
|
114
|
+
readonly messageComposerCache: FixedSizeQueueCache<string, MessageComposer>;
|
|
113
115
|
private nextRequestAbortController;
|
|
114
116
|
/**
|
|
115
117
|
* @private
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { BaseSearchSource } from './BaseSearchSource';
|
|
2
|
+
import { FilterBuilder, type FilterBuilderOptions } from '../pagination';
|
|
3
|
+
import type { Channel } from '../channel';
|
|
4
|
+
import type { ChannelMemberResponse, MemberFilters, MemberSort, QueryMembersOptions } from '../types';
|
|
5
|
+
import type { SearchSourceOptions } from './types';
|
|
6
|
+
type CustomContext = Record<string, unknown>;
|
|
7
|
+
export type ChannelMemberSearchSourceFilterBuilderContext<C extends CustomContext = CustomContext> = {
|
|
8
|
+
searchQuery?: string;
|
|
9
|
+
} & C;
|
|
10
|
+
export declare class ChannelMemberSearchSource<TFilterContext extends CustomContext = CustomContext> extends BaseSearchSource<ChannelMemberResponse> {
|
|
11
|
+
readonly type = "members";
|
|
12
|
+
channel: Channel;
|
|
13
|
+
filters: MemberFilters | undefined;
|
|
14
|
+
sort: MemberSort | undefined;
|
|
15
|
+
searchOptions: Omit<QueryMembersOptions, 'limit' | 'offset'> | undefined;
|
|
16
|
+
filterBuilder: FilterBuilder<MemberFilters, ChannelMemberSearchSourceFilterBuilderContext<TFilterContext>>;
|
|
17
|
+
constructor(channel: Channel, options?: SearchSourceOptions, filterBuilderOptions?: FilterBuilderOptions<MemberFilters, ChannelMemberSearchSourceFilterBuilderContext<TFilterContext>>);
|
|
18
|
+
canExecuteQuery: (newSearchString?: string) => boolean;
|
|
19
|
+
protected query(searchQuery: string): Promise<{
|
|
20
|
+
items: ChannelMemberResponse[];
|
|
21
|
+
}>;
|
|
22
|
+
protected filterQueryResults(items: ChannelMemberResponse[]): ChannelMemberResponse[];
|
|
23
|
+
}
|
|
24
|
+
export {};
|
package/package.json
CHANGED
package/src/client.ts
CHANGED
|
@@ -293,6 +293,7 @@ import { StateStore } from './store';
|
|
|
293
293
|
import type { MessageComposer } from './messageComposer';
|
|
294
294
|
import type { AbstractOfflineDB } from './offline-support';
|
|
295
295
|
import { getPendingTaskChannelData } from './offline-support/util';
|
|
296
|
+
import { FixedSizeQueueCache } from './utils/FixedSizeQueueCache';
|
|
296
297
|
|
|
297
298
|
function isString(x: unknown): x is string {
|
|
298
299
|
return typeof x === 'string' || x instanceof String;
|
|
@@ -393,6 +394,7 @@ export class StreamChat {
|
|
|
393
394
|
defaultWSTimeout: number;
|
|
394
395
|
sdkIdentifier?: SdkIdentifier;
|
|
395
396
|
deviceIdentifier?: DeviceIdentifier;
|
|
397
|
+
readonly messageComposerCache: FixedSizeQueueCache<string, MessageComposer>;
|
|
396
398
|
private nextRequestAbortController: AbortController | null = null;
|
|
397
399
|
/**
|
|
398
400
|
* @private
|
|
@@ -573,6 +575,7 @@ export class StreamChat {
|
|
|
573
575
|
this.polls = new PollManager({ client: this });
|
|
574
576
|
this.reminders = new ReminderManager({ client: this });
|
|
575
577
|
this.messageDeliveryReporter = new MessageDeliveryReporter({ client: this });
|
|
578
|
+
this.messageComposerCache = new FixedSizeQueueCache<string, MessageComposer>(64);
|
|
576
579
|
}
|
|
577
580
|
|
|
578
581
|
/**
|
|
@@ -1060,6 +1063,7 @@ export class StreamChat {
|
|
|
1060
1063
|
// reset thread manager
|
|
1061
1064
|
this.threads.resetState();
|
|
1062
1065
|
this.uploadManager.reset();
|
|
1066
|
+
this.messageComposerCache.clear();
|
|
1063
1067
|
|
|
1064
1068
|
// Since we wipe all user data already, we should reset token manager as well
|
|
1065
1069
|
closePromise
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { BaseSearchSource } from './BaseSearchSource';
|
|
2
|
+
import { FilterBuilder, type FilterBuilderOptions } from '../pagination';
|
|
3
|
+
import type { Channel } from '../channel';
|
|
4
|
+
import type {
|
|
5
|
+
ChannelMemberResponse,
|
|
6
|
+
MemberFilters,
|
|
7
|
+
MemberSort,
|
|
8
|
+
QueryMembersOptions,
|
|
9
|
+
} from '../types';
|
|
10
|
+
import type { SearchSourceOptions } from './types';
|
|
11
|
+
|
|
12
|
+
type CustomContext = Record<string, unknown>;
|
|
13
|
+
|
|
14
|
+
export type ChannelMemberSearchSourceFilterBuilderContext<
|
|
15
|
+
C extends CustomContext = CustomContext,
|
|
16
|
+
> = { searchQuery?: string } & C;
|
|
17
|
+
|
|
18
|
+
export class ChannelMemberSearchSource<
|
|
19
|
+
TFilterContext extends CustomContext = CustomContext,
|
|
20
|
+
> extends BaseSearchSource<ChannelMemberResponse> {
|
|
21
|
+
readonly type = 'members';
|
|
22
|
+
channel: Channel;
|
|
23
|
+
filters: MemberFilters | undefined;
|
|
24
|
+
sort: MemberSort | undefined;
|
|
25
|
+
searchOptions: Omit<QueryMembersOptions, 'limit' | 'offset'> | undefined;
|
|
26
|
+
filterBuilder: FilterBuilder<
|
|
27
|
+
MemberFilters,
|
|
28
|
+
ChannelMemberSearchSourceFilterBuilderContext<TFilterContext>
|
|
29
|
+
>;
|
|
30
|
+
|
|
31
|
+
constructor(
|
|
32
|
+
channel: Channel,
|
|
33
|
+
options?: SearchSourceOptions,
|
|
34
|
+
filterBuilderOptions: FilterBuilderOptions<
|
|
35
|
+
MemberFilters,
|
|
36
|
+
ChannelMemberSearchSourceFilterBuilderContext<TFilterContext>
|
|
37
|
+
> = {},
|
|
38
|
+
) {
|
|
39
|
+
super(options);
|
|
40
|
+
this.channel = channel;
|
|
41
|
+
this.filterBuilder = new FilterBuilder<
|
|
42
|
+
MemberFilters,
|
|
43
|
+
ChannelMemberSearchSourceFilterBuilderContext<TFilterContext>
|
|
44
|
+
>({
|
|
45
|
+
initialFilterConfig: {
|
|
46
|
+
default: {
|
|
47
|
+
enabled: true,
|
|
48
|
+
generate: ({ searchQuery }) =>
|
|
49
|
+
searchQuery
|
|
50
|
+
? {
|
|
51
|
+
$or: [
|
|
52
|
+
{ name: { $autocomplete: searchQuery } },
|
|
53
|
+
{ id: { $eq: searchQuery } },
|
|
54
|
+
],
|
|
55
|
+
}
|
|
56
|
+
: null,
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
...filterBuilderOptions,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
canExecuteQuery = (newSearchString?: string) => {
|
|
64
|
+
const hasNewSearchQuery = typeof newSearchString !== 'undefined';
|
|
65
|
+
|
|
66
|
+
return this.isActive && !this.isLoading && (this.hasNext || hasNewSearchQuery);
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
protected async query(searchQuery: string) {
|
|
70
|
+
const filters = this.filterBuilder.buildFilters({
|
|
71
|
+
baseFilters: this.filters,
|
|
72
|
+
context: {
|
|
73
|
+
searchQuery,
|
|
74
|
+
} as ChannelMemberSearchSourceFilterBuilderContext<TFilterContext>,
|
|
75
|
+
});
|
|
76
|
+
const sort = this.sort ?? [];
|
|
77
|
+
const options = { ...this.searchOptions, limit: this.pageSize, offset: this.offset };
|
|
78
|
+
const { members } = await this.channel.queryMembers(filters ?? {}, sort, options);
|
|
79
|
+
return { items: members };
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
protected filterQueryResults(items: ChannelMemberResponse[]) {
|
|
83
|
+
return items;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
@@ -130,7 +130,7 @@ export class MessageSearchSource<
|
|
|
130
130
|
}
|
|
131
131
|
|
|
132
132
|
protected async query(searchQuery: string) {
|
|
133
|
-
if (!this.client.userID ||
|
|
133
|
+
if (!this.client.userID || this.next === null) return { items: [] };
|
|
134
134
|
|
|
135
135
|
const channelFilters = this.messageSearchChannelFilterBuilder.buildFilters({
|
|
136
136
|
baseFilters: {
|
package/src/search/index.ts
CHANGED
|
@@ -71,4 +71,15 @@ export class FixedSizeQueueCache<K, T> {
|
|
|
71
71
|
|
|
72
72
|
return foundItem;
|
|
73
73
|
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Clears queue entirely and disposes of each item individually.
|
|
77
|
+
*/
|
|
78
|
+
clear() {
|
|
79
|
+
if (this.dispose) {
|
|
80
|
+
this.map.forEach((entry, key) => this.dispose?.(key, entry));
|
|
81
|
+
}
|
|
82
|
+
this.map.clear();
|
|
83
|
+
this.keys = [];
|
|
84
|
+
}
|
|
74
85
|
}
|