stream-chat 8.52.2 → 8.53.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/browser.es.js +832 -790
- package/dist/browser.es.js.map +1 -1
- package/dist/browser.full-bundle.min.js +1 -1
- package/dist/browser.full-bundle.min.js.map +1 -1
- package/dist/browser.js +832 -790
- package/dist/browser.js.map +1 -1
- package/dist/index.es.js +832 -790
- package/dist/index.es.js.map +1 -1
- package/dist/index.js +832 -790
- package/dist/index.js.map +1 -1
- package/dist/types/channel.d.ts +2 -1
- package/dist/types/channel.d.ts.map +1 -1
- package/dist/types/client.d.ts +9 -1
- package/dist/types/client.d.ts.map +1 -1
- package/dist/types/constants.d.ts.map +1 -1
- package/dist/types/types.d.ts +23 -1
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/utils.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/channel.ts +2 -0
- package/src/client.ts +14 -0
- package/src/constants.ts +1 -1
- package/src/types.ts +30 -1
- package/src/utils.ts +1 -0
package/dist/browser.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.es.js","sources":["../src/base64.ts","../src/campaign.ts","../https","../src/utils.ts","../src/constants.ts","../src/channel_state.ts","../src/channel.ts","../src/client_state.ts","../src/insights.ts","../src/connection.ts","../jsonwebtoken","../crypto","../src/signing.ts","../src/token_manager.ts","../src/errors.ts","../src/connection_fallback.ts","../src/segment.ts","../src/types.ts","../src/store.ts","../src/thread.ts","../src/moderation.ts","../src/thread_manager.ts","../src/poll.ts","../src/poll_manager.ts","../src/client.ts","../src/events.ts","../src/permissions.ts"],"sourcesContent":["import { fromByteArray } from 'base64-js';\n\nfunction isString<T>(arrayOrString: string | T[]): arrayOrString is string {\n return typeof (arrayOrString as string) === 'string';\n}\n\ntype MapGenericCallback<T, U> = (value: T, index: number, array: T[]) => U;\ntype MapStringCallback<U> = (value: string, index: number, string: string) => U;\n\nfunction isMapStringCallback<T, U>(\n arrayOrString: string | T[],\n callback: MapGenericCallback<T, U> | MapStringCallback<U>,\n): callback is MapStringCallback<U> {\n return !!callback && isString(arrayOrString);\n}\n\n// source - https://github.com/beatgammit/base64-js/blob/master/test/convert.js#L72\nfunction map<T, U>(array: T[], callback: MapGenericCallback<T, U>): U[];\nfunction map<U>(string: string, callback: MapStringCallback<U>): U[];\nfunction map<T, U>(arrayOrString: string | T[], callback: MapGenericCallback<T, U> | MapStringCallback<U>): U[] {\n const res = [];\n\n if (isString(arrayOrString) && isMapStringCallback(arrayOrString, callback)) {\n for (let k = 0, len = arrayOrString.length; k < len; k++) {\n if (arrayOrString.charAt(k)) {\n const kValue = arrayOrString.charAt(k);\n const mappedValue = callback(kValue, k, arrayOrString);\n res[k] = mappedValue;\n }\n }\n } else if (!isString(arrayOrString) && !isMapStringCallback(arrayOrString, callback)) {\n for (let k = 0, len = arrayOrString.length; k < len; k++) {\n if (k in arrayOrString) {\n const kValue = arrayOrString[k];\n const mappedValue = callback(kValue, k, arrayOrString);\n res[k] = mappedValue;\n }\n }\n }\n\n return res;\n}\n\nexport const encodeBase64 = (data: string): string =>\n fromByteArray(new Uint8Array(map(data, (char) => char.charCodeAt(0))));\n\n// base-64 decoder throws exception if encoded string is not padded by '=' to make string length\n// in multiples of 4. So gonna use our own method for this purpose to keep backwards compatibility\n// https://github.com/beatgammit/base64-js/blob/master/index.js#L26\nexport const decodeBase64 = (s: string): string => {\n const e = {} as { [key: string]: number },\n w = String.fromCharCode,\n L = s.length;\n let i,\n b = 0,\n c,\n x,\n l = 0,\n a,\n r = '';\n const A = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n for (i = 0; i < 64; i++) {\n e[A.charAt(i)] = i;\n }\n for (x = 0; x < L; x++) {\n c = e[s.charAt(x)];\n b = (b << 6) + c;\n l += 6;\n while (l >= 8) {\n ((a = (b >>> (l -= 8)) & 0xff) || x < L - 2) && (r += w(a));\n }\n }\n return r;\n};\n","import { StreamChat } from './client';\nimport { CampaignData, DefaultGenerics, ExtendableGenerics } from './types';\n\nexport class Campaign<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> {\n id: string | null;\n data?: CampaignData;\n client: StreamChat<StreamChatGenerics>;\n\n constructor(client: StreamChat<StreamChatGenerics>, id: string | null, data?: CampaignData) {\n this.client = client;\n this.id = id;\n this.data = data;\n }\n\n async create() {\n const body = {\n id: this.id,\n message_template: this.data?.message_template,\n segment_ids: this.data?.segment_ids,\n sender_id: this.data?.sender_id,\n sender_mode: this.data?.sender_mode,\n channel_template: this.data?.channel_template,\n create_channels: this.data?.create_channels,\n description: this.data?.description,\n name: this.data?.name,\n user_ids: this.data?.user_ids,\n };\n\n const result = await this.client.createCampaign(body);\n\n this.id = result.campaign.id;\n this.data = result.campaign;\n return result;\n }\n\n verifyCampaignId() {\n if (!this.id) {\n throw new Error(\n 'Campaign id is missing. Either create the campaign using campaign.create() or set the id during instantiation - const campaign = client.campaign(id)',\n );\n }\n }\n\n async start(options?: { scheduledFor?: string; stopAt?: string }) {\n this.verifyCampaignId();\n\n return await this.client.startCampaign(this.id as string, options);\n }\n\n async update(data: Partial<CampaignData>) {\n this.verifyCampaignId();\n\n return this.client.updateCampaign(this.id as string, data);\n }\n\n async delete() {\n this.verifyCampaignId();\n\n return await this.client.deleteCampaign(this.id as string);\n }\n\n async stop() {\n this.verifyCampaignId();\n\n return this.client.stopCampaign(this.id as string);\n }\n\n async get() {\n this.verifyCampaignId();\n\n return this.client.getCampaign(this.id as string);\n }\n}\n","export default null;","import FormData from 'form-data';\nimport {\n AscDesc,\n ExtendableGenerics,\n DefaultGenerics,\n Logger,\n OwnUserBase,\n OwnUserResponse,\n UserResponse,\n MessageResponse,\n FormatMessageResponse,\n ReactionGroupResponse,\n MessageSet,\n MessagePaginationOptions,\n} from './types';\nimport { AxiosRequestConfig } from 'axios';\n\n/**\n * logChatPromiseExecution - utility function for logging the execution of a promise..\n * use this when you want to run the promise and handle errors by logging a warning\n *\n * @param {Promise<T>} promise The promise you want to run and log\n * @param {string} name A descriptive name of what the promise does for log output\n *\n */\nexport function logChatPromiseExecution<T>(promise: Promise<T>, name: string) {\n promise.then().catch((error) => {\n console.warn(`failed to do ${name}, ran into error: `, error);\n });\n}\n\nexport const sleep = (m: number): Promise<void> => new Promise((r) => setTimeout(r, 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 'function' === typeof value ||\n value instanceof Function)\n );\n}\n\nexport const chatCodes = {\n TOKEN_EXPIRED: 40,\n WS_CLOSED_SUCCESS: 1000,\n};\n\nfunction isReadableStream(obj: unknown): obj is NodeJS.ReadStream {\n return (\n obj !== null &&\n typeof obj === 'object' &&\n ((obj as NodeJS.ReadStream).readable || typeof (obj as NodeJS.ReadStream)._read === 'function')\n );\n}\n\nfunction isBuffer(obj: unknown): obj is Buffer {\n return (\n obj != null &&\n (obj as Buffer).constructor != null &&\n // @ts-expect-error\n typeof obj.constructor.isBuffer === 'function' &&\n // @ts-expect-error\n obj.constructor.isBuffer(obj)\n );\n}\n\nfunction isFileWebAPI(uri: unknown): uri is File {\n return typeof window !== 'undefined' && 'File' in window && uri instanceof File;\n}\n\nexport function isOwnUser<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics>(\n user?: OwnUserResponse<StreamChatGenerics> | UserResponse<StreamChatGenerics>,\n): user is OwnUserResponse<StreamChatGenerics> {\n return (user as OwnUserResponse<StreamChatGenerics>)?.total_unread_count !== undefined;\n}\n\nfunction isBlobWebAPI(uri: unknown): uri is Blob {\n return typeof window !== 'undefined' && 'Blob' in window && uri instanceof Blob;\n}\n\nexport function isOwnUserBaseProperty(property: string) {\n const ownUserBaseProperties: {\n [Property in keyof Required<OwnUserBase>]: boolean;\n } = {\n channel_mutes: true,\n devices: true,\n mutes: true,\n total_unread_count: true,\n unread_channels: true,\n unread_count: true,\n unread_threads: true,\n invisible: true,\n privacy_settings: true,\n roles: true,\n };\n\n return ownUserBaseProperties[property as keyof OwnUserBase];\n}\n\nexport function addFileToFormData(\n uri: string | NodeJS.ReadableStream | Buffer | File,\n name?: string,\n contentType?: string,\n) {\n const data = new FormData();\n\n if (isReadableStream(uri) || isBuffer(uri) || isFileWebAPI(uri) || isBlobWebAPI(uri)) {\n if (name) data.append('file', uri, name);\n else data.append('file', uri);\n } else {\n data.append('file', {\n uri,\n name: name || (uri as string).split('/').reverse()[0],\n contentType: contentType || undefined,\n type: contentType || undefined,\n });\n }\n\n return data;\n}\nexport function normalizeQuerySort<T extends Record<string, AscDesc | undefined>>(sort: T | T[]) {\n const sortFields: Array<{ direction: AscDesc; field: keyof T }> = [];\n const sortArr = Array.isArray(sort) ? sort : [sort];\n for (const item of sortArr) {\n const entries = Object.entries(item) as [keyof T, AscDesc][];\n if (entries.length > 1) {\n console.warn(\n \"client._buildSort() - multiple fields in a single sort object detected. Object's field order is not guaranteed\",\n );\n }\n for (const [field, direction] of entries) {\n sortFields.push({ field, direction });\n }\n }\n return sortFields;\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-25 seconds (random to spread out the load from failures)\n const max = Math.min(500 + numberOfFailures * 2000, 25000);\n const min = Math.min(Math.max(250, (numberOfFailures - 1) * 2000), 25000);\n return Math.floor(Math.random() * (max - min) + min);\n}\n\nexport function randomId() {\n return generateUUIDv4();\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\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 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\nexport function convertErrorToJson(err: Error) {\n const jsonObj = {} as Record<string, unknown>;\n\n if (!err) return jsonObj;\n\n try {\n Object.getOwnPropertyNames(err).forEach((key) => {\n jsonObj[key] = Object.getOwnPropertyDescriptor(err, key);\n });\n } catch (_) {\n return {\n error: 'failed to serialize the error',\n };\n }\n\n return jsonObj;\n}\n\n/**\n * isOnline safely return the navigator.online value for browser env\n * if navigator is not in global object, it always return true\n */\nexport function isOnline() {\n const nav =\n typeof navigator !== 'undefined'\n ? navigator\n : typeof window !== 'undefined' && window.navigator\n ? window.navigator\n : undefined;\n\n if (!nav) {\n console.warn('isOnline failed to access window.navigator and assume browser is online');\n return true;\n }\n\n // RN navigator has undefined for onLine\n if (typeof nav.onLine !== 'boolean') {\n return true;\n }\n\n return nav.onLine;\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 axiosParamsSerializer: AxiosRequestConfig['paramsSerializer'] = (params) => {\n const newParams = [];\n for (const k in params) {\n // Stream backend doesn't treat \"undefined\" value same as value not being present.\n // So, we need to skip the undefined values.\n if (params[k] === undefined) continue;\n\n if (Array.isArray(params[k]) || typeof params[k] === 'object') {\n newParams.push(`${k}=${encodeURIComponent(JSON.stringify(params[k]))}`);\n } else {\n newParams.push(`${k}=${encodeURIComponent(params[k])}`);\n }\n }\n\n return newParams.join('&');\n};\n\n/**\n * Takes the message object, parses the dates, sets `__html`\n * and sets the status to `received` if missing; returns a new message object.\n *\n * @param {MessageResponse<StreamChatGenerics>} message `MessageResponse` object\n */\nexport function formatMessage<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics>(\n message: MessageResponse<StreamChatGenerics> | FormatMessageResponse<StreamChatGenerics>,\n): FormatMessageResponse<StreamChatGenerics> {\n return {\n ...message,\n /**\n * @deprecated please use `html`\n */\n __html: message.html,\n // parse the dates\n pinned_at: message.pinned_at ? new Date(message.pinned_at) : null,\n created_at: message.created_at ? new Date(message.created_at) : new Date(),\n updated_at: message.updated_at ? new Date(message.updated_at) : new Date(),\n deleted_at: message.deleted_at ? new Date(message.deleted_at) : null,\n status: message.status || 'received',\n reaction_groups: maybeGetReactionGroupsFallback(\n message.reaction_groups,\n message.reaction_counts,\n message.reaction_scores,\n ),\n };\n}\n\nexport const findIndexInSortedArray = <T, L>({\n needle,\n sortedArray,\n selectKey,\n selectValueToCompare = (e) => e,\n sortDirection = 'ascending',\n}: {\n needle: T;\n sortedArray: readonly T[];\n /**\n * In an array of objects (like messages), pick a unique property identifying\n * an element. It will be used to find a direct match for the needle element\n * in case compare values are not unique.\n *\n * @example\n * ```ts\n * selectKey: (message) => message.id\n * ```\n */\n selectKey?: (arrayElement: T) => string;\n /**\n * In an array of objects (like messages), pick a specific\n * property to compare the needle value to.\n *\n * @example\n * ```ts\n * selectValueToCompare: (message) => message.created_at.getTime()\n * ```\n */\n selectValueToCompare?: (arrayElement: T) => L | T;\n /**\n * @default ascending\n * @description\n * ```md\n * ascending - [1,2,3,4,5...]\n * descending - [...5,4,3,2,1]\n * ```\n */\n sortDirection?: 'ascending' | 'descending';\n}) => {\n if (!sortedArray.length) return 0;\n\n let left = 0;\n let right = sortedArray.length - 1;\n let middle = 0;\n\n const recalculateMiddle = () => {\n middle = Math.round((left + right) / 2);\n };\n\n const comparableNeedle = selectValueToCompare(needle);\n\n while (left <= right) {\n recalculateMiddle();\n\n const comparableMiddle = selectValueToCompare(sortedArray[middle]);\n\n if (\n (sortDirection === 'ascending' && comparableNeedle < comparableMiddle) ||\n (sortDirection === 'descending' && comparableNeedle >= comparableMiddle)\n ) {\n right = middle - 1;\n } else {\n left = middle + 1;\n }\n }\n\n // In case there are several array elements with the same comparable value, search around the insertion\n // point to possibly find an element with the same key. If found, prefer it.\n // This, for example, prevents duplication of messages with the same creation date.\n if (selectKey) {\n const needleKey = selectKey(needle);\n const step = sortDirection === 'ascending' ? -1 : +1;\n for (\n let i = left + step;\n 0 <= i && i < sortedArray.length && selectValueToCompare(sortedArray[i]) === comparableNeedle;\n i += step\n ) {\n if (selectKey(sortedArray[i]) === needleKey) {\n return i;\n }\n }\n }\n\n return left;\n};\n\nexport function addToMessageList<T extends FormatMessageResponse>(\n messages: readonly T[],\n newMessage: T,\n timestampChanged = false,\n sortBy: 'pinned_at' | 'created_at' = 'created_at',\n addIfDoesNotExist = true,\n) {\n const addMessageToList = addIfDoesNotExist || timestampChanged;\n let newMessages = [...messages];\n\n // if created_at has changed, message should be filtered and re-inserted in correct order\n // slow op but usually this only happens for a message inserted to state before actual response with correct timestamp\n if (timestampChanged) {\n newMessages = newMessages.filter((message) => !(message.id && newMessage.id === message.id));\n }\n\n // for empty list just concat and return unless it's an update or deletion\n if (newMessages.length === 0 && addMessageToList) {\n return newMessages.concat(newMessage);\n } else if (newMessages.length === 0) {\n return newMessages;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const messageTime = newMessage[sortBy]!.getTime();\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const messageIsNewest = newMessages.at(-1)![sortBy]!.getTime() < messageTime;\n\n // if message is newer than last item in the list concat and return unless it's an update or deletion\n if (messageIsNewest && addMessageToList) {\n return newMessages.concat(newMessage);\n } else if (messageIsNewest) {\n return newMessages;\n }\n\n // find the closest index to push the new message\n const insertionIndex = findIndexInSortedArray({\n needle: newMessage,\n sortedArray: newMessages,\n sortDirection: 'ascending',\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n selectValueToCompare: (m) => m[sortBy]!.getTime(),\n selectKey: (m) => m.id,\n });\n\n // message already exists and not filtered with timestampChanged, update and return\n if (\n !timestampChanged &&\n newMessage.id &&\n newMessages[insertionIndex] &&\n newMessage.id === newMessages[insertionIndex].id\n ) {\n newMessages[insertionIndex] = newMessage;\n return newMessages;\n }\n\n // do not add updated or deleted messages to the list if they already exist or come with a timestamp change\n if (addMessageToList) {\n newMessages.splice(insertionIndex, 0, newMessage);\n }\n\n return newMessages;\n}\n\nfunction maybeGetReactionGroupsFallback(\n groups: { [key: string]: ReactionGroupResponse } | null | undefined,\n counts: { [key: string]: number } | null | undefined,\n scores: { [key: string]: number } | null | undefined,\n): { [key: string]: ReactionGroupResponse } | null {\n if (groups) {\n return groups;\n }\n\n if (counts && scores) {\n const fallback: { [key: string]: ReactionGroupResponse } = {};\n\n for (const type of Object.keys(counts)) {\n fallback[type] = {\n count: counts[type],\n sum_scores: scores[type],\n };\n }\n\n return fallback;\n }\n\n return null;\n}\n\n// works exactly the same as lodash.throttle\nexport const throttle = <T extends (...args: unknown[]) => unknown>(\n fn: T,\n timeout = 200,\n { leading = true, trailing = false }: { leading?: boolean; trailing?: boolean } = {},\n) => {\n let runningTimeout: null | NodeJS.Timeout = null;\n let storedArgs: Parameters<T> | null = null;\n\n return (...args: Parameters<T>) => {\n if (runningTimeout) {\n if (trailing) storedArgs = args;\n return;\n }\n\n if (leading) fn(...args);\n\n const timeoutHandler = () => {\n if (storedArgs) {\n fn(...storedArgs);\n storedArgs = null;\n runningTimeout = setTimeout(timeoutHandler, timeout);\n\n return;\n }\n\n runningTimeout = null;\n };\n\n runningTimeout = setTimeout(timeoutHandler, timeout);\n };\n};\n\ntype MessagePaginationUpdatedParams<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n parentSet: MessageSet;\n requestedPageSize: number;\n returnedPage: MessageResponse<StreamChatGenerics>[];\n logger?: Logger;\n messagePaginationOptions?: MessagePaginationOptions;\n};\n\nexport function binarySearchByDateEqualOrNearestGreater(\n array: {\n created_at?: string;\n }[],\n targetDate: Date,\n): number {\n let left = 0;\n let right = array.length - 1;\n\n while (left <= right) {\n const mid = Math.floor((left + right) / 2);\n const midCreatedAt = array[mid].created_at;\n if (!midCreatedAt) {\n left += 1;\n continue;\n }\n const midDate = new Date(midCreatedAt);\n\n if (midDate.getTime() === targetDate.getTime()) {\n return mid;\n } else if (midDate.getTime() < targetDate.getTime()) {\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n }\n\n return left;\n}\n\nconst messagePaginationCreatedAtAround = <StreamChatGenerics extends ExtendableGenerics = DefaultGenerics>({\n parentSet,\n requestedPageSize,\n returnedPage,\n messagePaginationOptions,\n}: MessagePaginationUpdatedParams<StreamChatGenerics>) => {\n const newPagination = { ...parentSet.pagination };\n if (!messagePaginationOptions?.created_at_around) return newPagination;\n let hasPrev;\n let hasNext;\n let updateHasPrev;\n let updateHasNext;\n const createdAtAroundDate = new Date(messagePaginationOptions.created_at_around);\n const [firstPageMsg, lastPageMsg] = [returnedPage[0], returnedPage.slice(-1)[0]];\n\n // expect ASC order (from oldest to newest)\n const wholePageHasNewerMessages =\n !!firstPageMsg?.created_at && new Date(firstPageMsg.created_at) > createdAtAroundDate;\n const wholePageHasOlderMessages = !!lastPageMsg?.created_at && new Date(lastPageMsg.created_at) < createdAtAroundDate;\n\n const requestedPageSizeNotMet =\n requestedPageSize > parentSet.messages.length && requestedPageSize > returnedPage.length;\n const noMoreMessages =\n (requestedPageSize > parentSet.messages.length || parentSet.messages.length >= returnedPage.length) &&\n requestedPageSize > returnedPage.length;\n\n if (wholePageHasNewerMessages) {\n hasPrev = false;\n updateHasPrev = true;\n if (requestedPageSizeNotMet) {\n hasNext = false;\n updateHasNext = true;\n }\n } else if (wholePageHasOlderMessages) {\n hasNext = false;\n updateHasNext = true;\n if (requestedPageSizeNotMet) {\n hasPrev = false;\n updateHasPrev = true;\n }\n } else if (noMoreMessages) {\n hasNext = hasPrev = false;\n updateHasPrev = updateHasNext = true;\n } else {\n const [firstPageMsgIsFirstInSet, lastPageMsgIsLastInSet] = [\n firstPageMsg?.id && firstPageMsg.id === parentSet.messages[0]?.id,\n lastPageMsg?.id && lastPageMsg.id === parentSet.messages.slice(-1)[0]?.id,\n ];\n updateHasPrev = firstPageMsgIsFirstInSet;\n updateHasNext = lastPageMsgIsLastInSet;\n const midPointByCount = Math.floor(returnedPage.length / 2);\n const midPointByCreationDate = binarySearchByDateEqualOrNearestGreater(returnedPage, createdAtAroundDate);\n\n if (midPointByCreationDate !== -1) {\n hasPrev = midPointByCount <= midPointByCreationDate;\n hasNext = midPointByCount >= midPointByCreationDate;\n }\n }\n\n if (updateHasPrev && typeof hasPrev !== 'undefined') newPagination.hasPrev = hasPrev;\n if (updateHasNext && typeof hasNext !== 'undefined') newPagination.hasNext = hasNext;\n\n return newPagination;\n};\n\nconst messagePaginationIdAround = <StreamChatGenerics extends ExtendableGenerics = DefaultGenerics>({\n parentSet,\n requestedPageSize,\n returnedPage,\n messagePaginationOptions,\n}: MessagePaginationUpdatedParams<StreamChatGenerics>) => {\n const newPagination = { ...parentSet.pagination };\n const { id_around } = messagePaginationOptions || {};\n if (!id_around) return newPagination;\n let hasPrev;\n let hasNext;\n\n const [firstPageMsg, lastPageMsg] = [returnedPage[0], returnedPage.slice(-1)[0]];\n const [firstPageMsgIsFirstInSet, lastPageMsgIsLastInSet] = [\n firstPageMsg?.id === parentSet.messages[0]?.id,\n lastPageMsg?.id === parentSet.messages.slice(-1)[0]?.id,\n ];\n let updateHasPrev = firstPageMsgIsFirstInSet;\n let updateHasNext = lastPageMsgIsLastInSet;\n\n const midPoint = Math.floor(returnedPage.length / 2);\n const noMoreMessages =\n (requestedPageSize > parentSet.messages.length || parentSet.messages.length >= returnedPage.length) &&\n requestedPageSize > returnedPage.length;\n\n if (noMoreMessages) {\n hasNext = hasPrev = false;\n updateHasPrev = updateHasNext = true;\n } else if (!returnedPage[midPoint]) {\n return newPagination;\n } else if (returnedPage[midPoint].id === id_around) {\n hasPrev = hasNext = true;\n } else {\n let targetMsg;\n const halves = [returnedPage.slice(0, midPoint), returnedPage.slice(midPoint)];\n hasPrev = hasNext = true;\n for (let i = 0; i < halves.length; i++) {\n targetMsg = halves[i].find((message) => message.id === id_around);\n if (targetMsg && i === 0) {\n hasPrev = false;\n }\n if (targetMsg && i === 1) {\n hasNext = false;\n }\n }\n }\n\n if (updateHasPrev && typeof hasPrev !== 'undefined') newPagination.hasPrev = hasPrev;\n if (updateHasNext && typeof hasNext !== 'undefined') newPagination.hasNext = hasNext;\n\n return newPagination;\n};\n\nconst messagePaginationLinear = <StreamChatGenerics extends ExtendableGenerics = DefaultGenerics>({\n parentSet,\n requestedPageSize,\n returnedPage,\n messagePaginationOptions,\n}: MessagePaginationUpdatedParams<StreamChatGenerics>) => {\n const newPagination = { ...parentSet.pagination };\n\n let hasPrev;\n let hasNext;\n\n const [firstPageMsg, lastPageMsg] = [returnedPage[0], returnedPage.slice(-1)[0]];\n const [firstPageMsgIsFirstInSet, lastPageMsgIsLastInSet] = [\n firstPageMsg?.id && firstPageMsg.id === parentSet.messages[0]?.id,\n lastPageMsg?.id && lastPageMsg.id === parentSet.messages.slice(-1)[0]?.id,\n ];\n\n const queriedNextMessages =\n messagePaginationOptions &&\n (messagePaginationOptions.created_at_after_or_equal ||\n messagePaginationOptions.created_at_after ||\n messagePaginationOptions.id_gt ||\n messagePaginationOptions.id_gte);\n\n const queriedPrevMessages =\n typeof messagePaginationOptions === 'undefined'\n ? true\n : messagePaginationOptions.created_at_before_or_equal ||\n messagePaginationOptions.created_at_before ||\n messagePaginationOptions.id_lt ||\n messagePaginationOptions.id_lte ||\n messagePaginationOptions.offset;\n\n const containsUnrecognizedOptionsOnly =\n !queriedNextMessages &&\n !queriedPrevMessages &&\n !messagePaginationOptions?.id_around &&\n !messagePaginationOptions?.created_at_around;\n\n const hasMore = returnedPage.length >= requestedPageSize;\n\n if (typeof queriedPrevMessages !== 'undefined' || containsUnrecognizedOptionsOnly) {\n hasPrev = hasMore;\n }\n if (typeof queriedNextMessages !== 'undefined') {\n hasNext = hasMore;\n }\n const returnedPageIsEmpty = returnedPage.length === 0;\n\n if ((firstPageMsgIsFirstInSet || returnedPageIsEmpty) && typeof hasPrev !== 'undefined')\n newPagination.hasPrev = hasPrev;\n if ((lastPageMsgIsLastInSet || returnedPageIsEmpty) && typeof hasNext !== 'undefined')\n newPagination.hasNext = hasNext;\n\n return newPagination;\n};\n\nexport const messageSetPagination = <StreamChatGenerics extends ExtendableGenerics = DefaultGenerics>(\n params: MessagePaginationUpdatedParams<StreamChatGenerics>,\n) => {\n if (params.parentSet.messages.length < params.returnedPage.length) {\n params.logger?.('error', 'Corrupted message set state: parent set size < returned page size');\n return params.parentSet.pagination;\n }\n\n if (params.messagePaginationOptions?.created_at_around) {\n return messagePaginationCreatedAtAround(params);\n } else if (params.messagePaginationOptions?.id_around) {\n return messagePaginationIdAround(params);\n } else {\n return messagePaginationLinear(params);\n }\n};\n","export const DEFAULT_QUERY_CHANNELS_MESSAGE_LIST_PAGE_SIZE = 25;\nexport const DEFAULT_QUERY_CHANNEL_MESSAGE_LIST_PAGE_SIZE = 100;\n\nexport const DEFAULT_MESSAGE_SET_PAGINATION = { hasNext: true, hasPrev: true };\n","import { Channel } from './channel';\nimport {\n ChannelMemberResponse,\n DefaultGenerics,\n Event,\n ExtendableGenerics,\n FormatMessageResponse,\n MessageResponse,\n MessageSet,\n MessageSetType,\n PendingMessageResponse,\n ReactionResponse,\n UserResponse,\n} from './types';\nimport { addToMessageList, formatMessage } from './utils';\nimport { DEFAULT_MESSAGE_SET_PAGINATION } from './constants';\n\ntype ChannelReadStatus<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = Record<\n string,\n {\n last_read: Date;\n unread_messages: number;\n user: UserResponse<StreamChatGenerics>;\n first_unread_message_id?: string;\n last_read_message_id?: string;\n }\n>;\n\n/**\n * ChannelState - A container class for the channel state.\n */\nexport class ChannelState<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> {\n _channel: Channel<StreamChatGenerics>;\n watcher_count: number;\n typing: Record<string, Event<StreamChatGenerics>>;\n read: ChannelReadStatus<StreamChatGenerics>;\n pinnedMessages: Array<ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>>;\n pending_messages: Array<PendingMessageResponse<StreamChatGenerics>>;\n threads: Record<string, Array<ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>>>;\n mutedUsers: Array<UserResponse<StreamChatGenerics>>;\n watchers: Record<string, UserResponse<StreamChatGenerics>>;\n members: Record<string, ChannelMemberResponse<StreamChatGenerics>>;\n unreadCount: number;\n membership: ChannelMemberResponse<StreamChatGenerics>;\n last_message_at: Date | null;\n /**\n * Flag which indicates if channel state contain latest/recent messages or no.\n * This flag should be managed by UI sdks using a setter - setIsUpToDate.\n * When false, any new message (received by websocket event - message.new) will not\n * be pushed on to message list.\n */\n isUpToDate: boolean;\n /**\n * Disjoint lists of messages\n * Users can jump in the message list (with searching) and this can result in disjoint lists of messages\n * The state manages these lists and merges them when lists overlap\n * The messages array contains the currently active set\n */\n messageSets: MessageSet[] = [];\n\n constructor(channel: Channel<StreamChatGenerics>) {\n this._channel = channel;\n this.watcher_count = 0;\n this.typing = {};\n this.read = {};\n this.initMessages();\n this.pinnedMessages = [];\n this.pending_messages = [];\n this.threads = {};\n // a list of users to hide messages from\n this.mutedUsers = [];\n this.watchers = {};\n this.members = {};\n this.membership = {};\n this.unreadCount = 0;\n /**\n * Flag which indicates if channel state contain latest/recent messages or no.\n * This flag should be managed by UI sdks using a setter - setIsUpToDate.\n * When false, any new message (received by websocket event - message.new) will not\n * be pushed on to message list.\n */\n this.isUpToDate = true;\n this.last_message_at = channel?.state?.last_message_at != null ? new Date(channel.state.last_message_at) : null;\n }\n\n get messages() {\n return this.messageSets.find((s) => s.isCurrent)?.messages || [];\n }\n\n set messages(messages: Array<ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>>) {\n const index = this.messageSets.findIndex((s) => s.isCurrent);\n this.messageSets[index].messages = messages;\n }\n\n /**\n * The list of latest messages\n * The messages array not always contains the latest messages (for example if a user searched for an earlier message, that is in a different message set)\n */\n get latestMessages() {\n return this.messageSets.find((s) => s.isLatest)?.messages || [];\n }\n\n set latestMessages(messages: Array<ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>>) {\n const index = this.messageSets.findIndex((s) => s.isLatest);\n this.messageSets[index].messages = messages;\n }\n\n get messagePagination() {\n return this.messageSets.find((s) => s.isCurrent)?.pagination || DEFAULT_MESSAGE_SET_PAGINATION;\n }\n\n /**\n * addMessageSorted - Add a message to the state\n *\n * @param {MessageResponse<StreamChatGenerics>} newMessage A new message\n * @param {boolean} timestampChanged Whether updating a message with changed created_at value.\n * @param {boolean} addIfDoesNotExist Add message if it is not in the list, used to prevent out of order updated messages from being added.\n * @param {MessageSetType} messageSetToAddToIfDoesNotExist Which message set to add to if message is not in the list (only used if addIfDoesNotExist is true)\n */\n addMessageSorted(\n newMessage: MessageResponse<StreamChatGenerics>,\n timestampChanged = false,\n addIfDoesNotExist = true,\n messageSetToAddToIfDoesNotExist: MessageSetType = 'latest',\n ) {\n return this.addMessagesSorted(\n [newMessage],\n timestampChanged,\n false,\n addIfDoesNotExist,\n messageSetToAddToIfDoesNotExist,\n );\n }\n\n /**\n * Takes the message object, parses the dates, sets `__html`\n * and sets the status to `received` if missing; returns a new message object.\n *\n * @param {MessageResponse<StreamChatGenerics>} message `MessageResponse` object\n */\n formatMessage = (message: MessageResponse<StreamChatGenerics>) => formatMessage<StreamChatGenerics>(message);\n\n /**\n * addMessagesSorted - Add the list of messages to state and resorts the messages\n *\n * @param {Array<MessageResponse<StreamChatGenerics>>} newMessages A list of messages\n * @param {boolean} timestampChanged Whether updating messages with changed created_at value.\n * @param {boolean} initializing Whether channel is being initialized.\n * @param {boolean} addIfDoesNotExist Add message if it is not in the list, used to prevent out of order updated messages from being added.\n * @param {MessageSetType} messageSetToAddToIfDoesNotExist Which message set to add to if messages are not in the list (only used if addIfDoesNotExist is true)\n *\n */\n addMessagesSorted(\n newMessages: MessageResponse<StreamChatGenerics>[],\n timestampChanged = false,\n initializing = false,\n addIfDoesNotExist = true,\n messageSetToAddToIfDoesNotExist: MessageSetType = 'current',\n ) {\n const { messagesToAdd, targetMessageSetIndex } = this.findTargetMessageSet(\n newMessages,\n addIfDoesNotExist,\n messageSetToAddToIfDoesNotExist,\n );\n\n for (let i = 0; i < messagesToAdd.length; i += 1) {\n const isFromShadowBannedUser = messagesToAdd[i].shadowed;\n if (isFromShadowBannedUser) {\n continue;\n }\n // If message is already formatted we can skip the tasks below\n // This will be true for messages that are already present at the state -> this happens when we perform merging of message sets\n // This will be also true for message previews used by some SDKs\n const isMessageFormatted = messagesToAdd[i].created_at instanceof Date;\n let message: ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>;\n if (isMessageFormatted) {\n message = messagesToAdd[i] as ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>;\n } else {\n message = this.formatMessage(messagesToAdd[i] as MessageResponse<StreamChatGenerics>);\n\n if (message.user && this._channel?.cid) {\n /**\n * Store the reference to user for this channel, so that when we have to\n * handle updates to user, we can use the reference map, to determine which\n * channels need to be updated with updated user object.\n */\n this._channel.getClient().state.updateUserReference(message.user, this._channel.cid);\n }\n\n if (initializing && message.id && this.threads[message.id]) {\n // If we are initializing the state of channel (e.g., in case of connection recovery),\n // then in that case we remove thread related to this message from threads object.\n // This way we can ensure that we don't have any stale data in thread object\n // and consumer can refetch the replies.\n delete this.threads[message.id];\n }\n\n if (!this.last_message_at) {\n this.last_message_at = new Date(message.created_at.getTime());\n }\n\n if (message.created_at.getTime() > this.last_message_at.getTime()) {\n this.last_message_at = new Date(message.created_at.getTime());\n }\n }\n\n // update or append the messages...\n const parentID = message.parent_id;\n\n // add to the given message set\n if ((!parentID || message.show_in_channel) && targetMessageSetIndex !== -1) {\n this.messageSets[targetMessageSetIndex].messages = this._addToMessageList(\n this.messageSets[targetMessageSetIndex].messages,\n message,\n timestampChanged,\n 'created_at',\n addIfDoesNotExist,\n );\n }\n\n /**\n * Add message to thread if applicable and the message\n * was added when querying for replies, or the thread already exits.\n * This is to prevent the thread state from getting out of sync if\n * a thread message is shown in channel but older than the newest thread\n * message. This situation can result in a thread state where a random\n * message is \"oldest\" message, and newer messages are therefore not loaded.\n * This can also occur if an old thread message is updated.\n */\n if (parentID && !initializing) {\n const thread = this.threads[parentID] || [];\n this.threads[parentID] = this._addToMessageList(\n thread,\n message,\n timestampChanged,\n 'created_at',\n addIfDoesNotExist,\n );\n }\n }\n\n return {\n messageSet: this.messageSets[targetMessageSetIndex],\n };\n }\n\n /**\n * addPinnedMessages - adds messages in pinnedMessages property\n *\n * @param {Array<MessageResponse<StreamChatGenerics>>} pinnedMessages A list of pinned messages\n *\n */\n addPinnedMessages(pinnedMessages: MessageResponse<StreamChatGenerics>[]) {\n for (let i = 0; i < pinnedMessages.length; i += 1) {\n this.addPinnedMessage(pinnedMessages[i]);\n }\n }\n\n /**\n * addPinnedMessage - adds message in pinnedMessages\n *\n * @param {MessageResponse<StreamChatGenerics>} pinnedMessage message to update\n *\n */\n addPinnedMessage(pinnedMessage: MessageResponse<StreamChatGenerics>) {\n this.pinnedMessages = this._addToMessageList(\n this.pinnedMessages,\n this.formatMessage(pinnedMessage),\n false,\n 'pinned_at',\n );\n }\n\n /**\n * removePinnedMessage - removes pinned message from pinnedMessages\n *\n * @param {MessageResponse<StreamChatGenerics>} message message to remove\n *\n */\n removePinnedMessage(message: MessageResponse<StreamChatGenerics>) {\n const { result } = this.removeMessageFromArray(this.pinnedMessages, message);\n this.pinnedMessages = result;\n }\n\n addReaction(\n reaction: ReactionResponse<StreamChatGenerics>,\n message?: MessageResponse<StreamChatGenerics>,\n enforce_unique?: boolean,\n ) {\n if (!message) return;\n const messageWithReaction = message;\n this._updateMessage(message, (msg) => {\n messageWithReaction.own_reactions = this._addOwnReactionToMessage(msg.own_reactions, reaction, enforce_unique);\n return this.formatMessage(messageWithReaction);\n });\n return messageWithReaction;\n }\n\n _addOwnReactionToMessage(\n ownReactions: ReactionResponse<StreamChatGenerics>[] | null | undefined,\n reaction: ReactionResponse<StreamChatGenerics>,\n enforce_unique?: boolean,\n ) {\n if (enforce_unique) {\n ownReactions = [];\n } else {\n ownReactions = this._removeOwnReactionFromMessage(ownReactions, reaction);\n }\n\n ownReactions = ownReactions || [];\n if (this._channel.getClient().userID === reaction.user_id) {\n ownReactions.push(reaction);\n }\n\n return ownReactions;\n }\n\n _removeOwnReactionFromMessage(\n ownReactions: ReactionResponse<StreamChatGenerics>[] | null | undefined,\n reaction: ReactionResponse<StreamChatGenerics>,\n ) {\n if (ownReactions) {\n return ownReactions.filter((item) => item.user_id !== reaction.user_id || item.type !== reaction.type);\n }\n return ownReactions;\n }\n\n removeReaction(reaction: ReactionResponse<StreamChatGenerics>, message?: MessageResponse<StreamChatGenerics>) {\n if (!message) return;\n const messageWithReaction = message;\n this._updateMessage(message, (msg) => {\n messageWithReaction.own_reactions = this._removeOwnReactionFromMessage(msg.own_reactions, reaction);\n return this.formatMessage(messageWithReaction);\n });\n return messageWithReaction;\n }\n\n _updateQuotedMessageReferences({\n message,\n remove,\n }: {\n message: MessageResponse<StreamChatGenerics>;\n remove?: boolean;\n }) {\n const parseMessage = (m: ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>) =>\n (({\n ...m,\n created_at: m.created_at.toISOString(),\n pinned_at: m.pinned_at?.toISOString(),\n updated_at: m.updated_at?.toISOString(),\n } as unknown) as MessageResponse<StreamChatGenerics>);\n\n const update = (messages: FormatMessageResponse<StreamChatGenerics>[]) => {\n const updatedMessages = messages.reduce<MessageResponse<StreamChatGenerics>[]>((acc, msg) => {\n if (msg.quoted_message_id === message.id) {\n acc.push({ ...parseMessage(msg), quoted_message: remove ? { ...message, attachments: [] } : message });\n }\n return acc;\n }, []);\n this.addMessagesSorted(updatedMessages, true);\n };\n\n if (!message.parent_id) {\n this.messageSets.forEach((set) => update(set.messages));\n } else if (message.parent_id && this.threads[message.parent_id]) {\n // prevent going through all the threads even though it is possible to quote a message from another thread\n update(this.threads[message.parent_id]);\n }\n }\n\n removeQuotedMessageReferences(message: MessageResponse<StreamChatGenerics>) {\n this._updateQuotedMessageReferences({ message, remove: true });\n }\n\n /**\n * Updates all instances of given message in channel state\n * @param message\n * @param updateFunc\n */\n _updateMessage(\n message: {\n id?: string;\n parent_id?: string;\n pinned?: boolean;\n show_in_channel?: boolean;\n },\n updateFunc: (\n msg: ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>,\n ) => ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>,\n ) {\n const { parent_id, show_in_channel, pinned } = message;\n\n if (parent_id && this.threads[parent_id]) {\n const thread = this.threads[parent_id];\n const msgIndex = thread.findIndex((msg) => msg.id === message.id);\n if (msgIndex !== -1) {\n thread[msgIndex] = updateFunc(thread[msgIndex]);\n this.threads[parent_id] = thread;\n }\n }\n\n if ((!show_in_channel && !parent_id) || show_in_channel) {\n const messageSetIndex = this.findMessageSetIndex(message);\n if (messageSetIndex !== -1) {\n const msgIndex = this.messageSets[messageSetIndex].messages.findIndex((msg) => msg.id === message.id);\n if (msgIndex !== -1) {\n this.messageSets[messageSetIndex].messages[msgIndex] = updateFunc(\n this.messageSets[messageSetIndex].messages[msgIndex],\n );\n }\n }\n }\n\n if (pinned) {\n const msgIndex = this.pinnedMessages.findIndex((msg) => msg.id === message.id);\n if (msgIndex !== -1) {\n this.pinnedMessages[msgIndex] = updateFunc(this.pinnedMessages[msgIndex]);\n }\n }\n }\n\n /**\n * Setter for isUpToDate.\n *\n * @param isUpToDate Flag which indicates if channel state contain latest/recent messages or no.\n * This flag should be managed by UI sdks using a setter - setIsUpToDate.\n * When false, any new message (received by websocket event - message.new) will not\n * be pushed on to message list.\n */\n setIsUpToDate = (isUpToDate: boolean) => {\n this.isUpToDate = isUpToDate;\n };\n\n /**\n * _addToMessageList - Adds a message to a list of messages, tries to update first, appends if message isn't found\n *\n * @param {Array<ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>>} messages A list of messages\n * @param message\n * @param {boolean} timestampChanged Whether updating a message with changed created_at value.\n * @param {string} sortBy field name to use to sort the messages by\n * @param {boolean} addIfDoesNotExist Add message if it is not in the list, used to prevent out of order updated messages from being added.\n */\n _addToMessageList(\n messages: Array<ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>>,\n message: ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>,\n timestampChanged = false,\n sortBy: 'pinned_at' | 'created_at' = 'created_at',\n addIfDoesNotExist = true,\n ) {\n return addToMessageList(messages, message, timestampChanged, sortBy, addIfDoesNotExist);\n }\n\n /**\n * removeMessage - Description\n *\n * @param {{ id: string; parent_id?: string }} messageToRemove Object of the message to remove. Needs to have at id specified.\n *\n * @return {boolean} Returns if the message was removed\n */\n removeMessage(messageToRemove: { id: string; messageSetIndex?: number; parent_id?: string }) {\n let isRemoved = false;\n if (messageToRemove.parent_id && this.threads[messageToRemove.parent_id]) {\n const { removed, result: threadMessages } = this.removeMessageFromArray(\n this.threads[messageToRemove.parent_id],\n messageToRemove,\n );\n\n this.threads[messageToRemove.parent_id] = threadMessages;\n isRemoved = removed;\n } else {\n const messageSetIndex = messageToRemove.messageSetIndex ?? this.findMessageSetIndex(messageToRemove);\n if (messageSetIndex !== -1) {\n const { removed, result: messages } = this.removeMessageFromArray(\n this.messageSets[messageSetIndex].messages,\n messageToRemove,\n );\n this.messageSets[messageSetIndex].messages = messages;\n isRemoved = removed;\n }\n }\n\n return isRemoved;\n }\n\n removeMessageFromArray = (\n msgArray: Array<ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>>,\n msg: { id: string; parent_id?: string },\n ) => {\n const result = msgArray.filter((message) => !(!!message.id && !!msg.id && message.id === msg.id));\n\n return { removed: result.length < msgArray.length, result };\n };\n\n /**\n * Updates the message.user property with updated user object, for messages.\n *\n * @param {UserResponse<StreamChatGenerics>} user\n */\n updateUserMessages = (user: UserResponse<StreamChatGenerics>) => {\n const _updateUserMessages = (\n messages: Array<ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>>,\n user: UserResponse<StreamChatGenerics>,\n ) => {\n for (let i = 0; i < messages.length; i++) {\n const m = messages[i];\n if (m.user?.id === user.id) {\n messages[i] = { ...m, user };\n }\n }\n };\n\n this.messageSets.forEach((set) => _updateUserMessages(set.messages, user));\n\n for (const parentId in this.threads) {\n _updateUserMessages(this.threads[parentId], user);\n }\n\n _updateUserMessages(this.pinnedMessages, user);\n };\n\n /**\n * Marks the messages as deleted, from deleted user.\n *\n * @param {UserResponse<StreamChatGenerics>} user\n * @param {boolean} hardDelete\n */\n deleteUserMessages = (user: UserResponse<StreamChatGenerics>, hardDelete = false) => {\n const _deleteUserMessages = (\n messages: Array<ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>>,\n user: UserResponse<StreamChatGenerics>,\n hardDelete = false,\n ) => {\n for (let i = 0; i < messages.length; i++) {\n const m = messages[i];\n if (m.user?.id !== user.id) {\n continue;\n }\n\n if (hardDelete) {\n /**\n * In case of hard delete, we need to strip down all text, html,\n * attachments and all the custom properties on message\n */\n messages[i] = ({\n cid: m.cid,\n created_at: m.created_at,\n deleted_at: user.deleted_at,\n id: m.id,\n latest_reactions: [],\n mentioned_users: [],\n own_reactions: [],\n parent_id: m.parent_id,\n reply_count: m.reply_count,\n status: m.status,\n thread_participants: m.thread_participants,\n type: 'deleted',\n updated_at: m.updated_at,\n user: m.user,\n } as unknown) as ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>;\n } else {\n messages[i] = {\n ...m,\n type: 'deleted',\n deleted_at: user.deleted_at ? new Date(user.deleted_at) : null,\n };\n }\n }\n };\n\n this.messageSets.forEach((set) => _deleteUserMessages(set.messages, user, hardDelete));\n\n for (const parentId in this.threads) {\n _deleteUserMessages(this.threads[parentId], user, hardDelete);\n }\n\n _deleteUserMessages(this.pinnedMessages, user, hardDelete);\n };\n\n /**\n * filterErrorMessages - Removes error messages from the channel state.\n *\n */\n filterErrorMessages() {\n const filteredMessages = this.latestMessages.filter((message) => message.type !== 'error');\n\n this.latestMessages = filteredMessages;\n }\n\n /**\n * clean - Remove stale data such as users that stayed in typing state for more than 5 seconds\n */\n clean() {\n const now = new Date();\n // prevent old users from showing up as typing\n for (const [userID, lastEvent] of Object.entries(this.typing)) {\n const receivedAt =\n typeof lastEvent.received_at === 'string'\n ? new Date(lastEvent.received_at)\n : lastEvent.received_at || new Date();\n if (now.getTime() - receivedAt.getTime() > 7000) {\n delete this.typing[userID];\n this._channel.getClient().dispatchEvent({\n cid: this._channel.cid,\n type: 'typing.stop',\n user: { id: userID },\n } as Event<StreamChatGenerics>);\n }\n }\n }\n\n clearMessages() {\n this.initMessages();\n this.pinnedMessages = [];\n }\n\n initMessages() {\n this.messageSets = [{ messages: [], isLatest: true, isCurrent: true, pagination: DEFAULT_MESSAGE_SET_PAGINATION }];\n }\n\n /**\n * loadMessageIntoState - Loads a given message (and messages around it) into the state\n *\n * @param {string} messageId The id of the message, or 'latest' to indicate switching to the latest messages\n * @param {string} parentMessageId The id of the parent message, if we want load a thread reply\n * @param {number} limit The page size if the message has to be queried from the server\n */\n async loadMessageIntoState(messageId: string | 'latest', parentMessageId?: string, limit = 25) {\n let messageSetIndex: number;\n let switchedToMessageSet = false;\n let loadedMessageThread = false;\n const messageIdToFind = parentMessageId || messageId;\n if (messageId === 'latest') {\n if (this.messages === this.latestMessages) {\n return;\n }\n messageSetIndex = this.messageSets.findIndex((s) => s.isLatest);\n } else {\n messageSetIndex = this.findMessageSetIndex({ id: messageIdToFind });\n }\n if (messageSetIndex !== -1) {\n this.switchToMessageSet(messageSetIndex);\n switchedToMessageSet = true;\n }\n loadedMessageThread = !parentMessageId || !!this.threads[parentMessageId]?.find((m) => m.id === messageId);\n if (switchedToMessageSet && loadedMessageThread) {\n return;\n }\n if (!switchedToMessageSet) {\n await this._channel.query({ messages: { id_around: messageIdToFind, limit } }, 'new');\n }\n if (!loadedMessageThread && parentMessageId) {\n await this._channel.getReplies(parentMessageId, { id_around: messageId, limit });\n }\n messageSetIndex = this.findMessageSetIndex({ id: messageIdToFind });\n if (messageSetIndex !== -1) {\n this.switchToMessageSet(messageSetIndex);\n }\n }\n\n /**\n * findMessage - Finds a message inside the state\n *\n * @param {string} messageId The id of the message\n * @param {string} parentMessageId The id of the parent message, if we want load a thread reply\n *\n * @return {ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>} Returns the message, or undefined if the message wasn't found\n */\n findMessage(messageId: string, parentMessageId?: string) {\n if (parentMessageId) {\n const messages = this.threads[parentMessageId];\n if (!messages) {\n return undefined;\n }\n return messages.find((m) => m.id === messageId);\n }\n\n const messageSetIndex = this.findMessageSetIndex({ id: messageId });\n if (messageSetIndex === -1) {\n return undefined;\n }\n return this.messageSets[messageSetIndex].messages.find((m) => m.id === messageId);\n }\n\n private switchToMessageSet(index: number) {\n const currentMessages = this.messageSets.find((s) => s.isCurrent);\n if (!currentMessages) {\n return;\n }\n currentMessages.isCurrent = false;\n this.messageSets[index].isCurrent = true;\n }\n\n private areMessageSetsOverlap(messages1: Array<{ id: string }>, messages2: Array<{ id: string }>) {\n return messages1.some((m1) => messages2.find((m2) => m1.id === m2.id));\n }\n\n private findMessageSetIndex(message: { id?: string }) {\n return this.messageSets.findIndex((set) => !!set.messages.find((m) => m.id === message.id));\n }\n\n private findTargetMessageSet(\n newMessages: MessageResponse<StreamChatGenerics>[],\n addIfDoesNotExist = true,\n messageSetToAddToIfDoesNotExist: MessageSetType = 'current',\n ) {\n let messagesToAdd: (\n | MessageResponse<StreamChatGenerics>\n | ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>\n )[] = newMessages;\n let targetMessageSetIndex!: number;\n if (addIfDoesNotExist) {\n const overlappingMessageSetIndices = this.messageSets\n .map((_, i) => i)\n .filter((i) => this.areMessageSetsOverlap(this.messageSets[i].messages, newMessages));\n switch (messageSetToAddToIfDoesNotExist) {\n case 'new':\n if (overlappingMessageSetIndices.length > 0) {\n targetMessageSetIndex = overlappingMessageSetIndices[0];\n // No new message set is created if newMessages only contains thread replies\n } else if (newMessages.some((m) => !m.parent_id)) {\n this.messageSets.push({\n messages: [],\n isCurrent: false,\n isLatest: false,\n pagination: DEFAULT_MESSAGE_SET_PAGINATION,\n });\n targetMessageSetIndex = this.messageSets.length - 1;\n }\n break;\n case 'current':\n targetMessageSetIndex = this.messageSets.findIndex((s) => s.isCurrent);\n break;\n case 'latest':\n targetMessageSetIndex = this.messageSets.findIndex((s) => s.isLatest);\n break;\n default:\n targetMessageSetIndex = -1;\n }\n // when merging the target set will be the first one from the overlapping message sets\n const mergeTargetMessageSetIndex = overlappingMessageSetIndices.splice(0, 1)[0];\n const mergeSourceMessageSetIndices = [...overlappingMessageSetIndices];\n if (mergeTargetMessageSetIndex !== undefined && mergeTargetMessageSetIndex !== targetMessageSetIndex) {\n mergeSourceMessageSetIndices.push(targetMessageSetIndex);\n }\n // merge message sets\n if (mergeSourceMessageSetIndices.length > 0) {\n const target = this.messageSets[mergeTargetMessageSetIndex];\n const sources = this.messageSets.filter((_, i) => mergeSourceMessageSetIndices.indexOf(i) !== -1);\n sources.forEach((messageSet) => {\n target.isLatest = target.isLatest || messageSet.isLatest;\n target.isCurrent = target.isCurrent || messageSet.isCurrent;\n target.pagination.hasPrev =\n messageSet.messages[0].created_at < target.messages[0].created_at\n ? messageSet.pagination.hasPrev\n : target.pagination.hasPrev;\n target.pagination.hasNext =\n target.messages.slice(-1)[0].created_at < messageSet.messages.slice(-1)[0].created_at\n ? messageSet.pagination.hasNext\n : target.pagination.hasNext;\n messagesToAdd = [...messagesToAdd, ...messageSet.messages];\n });\n sources.forEach((s) => this.messageSets.splice(this.messageSets.indexOf(s), 1));\n const overlappingMessageSetIndex = this.messageSets.findIndex((s) =>\n this.areMessageSetsOverlap(s.messages, newMessages),\n );\n targetMessageSetIndex = overlappingMessageSetIndex;\n }\n } else {\n // assumes that all new messages belong to the same set\n targetMessageSetIndex = this.findMessageSetIndex(newMessages[0]);\n }\n\n return { targetMessageSetIndex, messagesToAdd };\n }\n}\n","import { ChannelState } from './channel_state';\nimport { logChatPromiseExecution, messageSetPagination, normalizeQuerySort } from './utils';\nimport { StreamChat } from './client';\nimport {\n APIResponse,\n BanUserOptions,\n ChannelAPIResponse,\n ChannelData,\n ChannelFilters,\n ChannelMemberAPIResponse,\n ChannelMemberResponse,\n ChannelQueryOptions,\n ChannelResponse,\n ChannelUpdateOptions,\n CreateCallOptions,\n CreateCallResponse,\n DefaultGenerics,\n DeleteChannelAPIResponse,\n Event,\n EventAPIResponse,\n EventHandler,\n EventTypes,\n ExtendableGenerics,\n FormatMessageResponse,\n GetMultipleMessagesAPIResponse,\n GetReactionsAPIResponse,\n GetRepliesAPIResponse,\n InviteOptions,\n MarkReadOptions,\n MarkUnreadOptions,\n MemberFilters,\n MemberSort,\n Message,\n MessageFilters,\n MessagePaginationOptions,\n MessageResponse,\n MessageSetType,\n MuteChannelAPIResponse,\n NewMemberPayload,\n PartialUpdateChannel,\n PartialUpdateChannelAPIResponse,\n PartialUpdateMember,\n PinnedMessagePaginationOptions,\n PinnedMessagesSort,\n QueryMembersOptions,\n Reaction,\n ReactionAPIResponse,\n SearchAPIResponse,\n SearchMessageSortBase,\n SearchOptions,\n SearchPayload,\n SendMessageAPIResponse,\n TruncateChannelAPIResponse,\n TruncateOptions,\n UpdateChannelAPIResponse,\n UserResponse,\n QueryChannelAPIResponse,\n PollVoteData,\n SendMessageOptions,\n AscDesc,\n PartialUpdateMemberAPIResponse,\n AIState,\n MessageOptions,\n} from './types';\nimport { Role } from './permissions';\nimport { DEFAULT_QUERY_CHANNEL_MESSAGE_LIST_PAGE_SIZE } from './constants';\n\n/**\n * Channel - The Channel class manages it's own state.\n */\nexport class Channel<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> {\n _client: StreamChat<StreamChatGenerics>;\n type: string;\n id: string | undefined;\n data: ChannelData<StreamChatGenerics> | ChannelResponse<StreamChatGenerics> | undefined;\n _data: ChannelData<StreamChatGenerics> | ChannelResponse<StreamChatGenerics>;\n cid: string;\n /** */\n listeners: { [key: string]: (string | EventHandler<StreamChatGenerics>)[] };\n state: ChannelState<StreamChatGenerics>;\n /**\n * This boolean is a vague indication of weather the channel exists on chat backend.\n *\n * If the value is true, then that means the channel has been initialized by either calling\n * channel.create() or channel.query() or channel.watch().\n *\n * If the value is false, then channel may or may not exist on the backend. The only way to ensure\n * is by calling channel.create() or channel.query() or channel.watch().\n */\n initialized: boolean;\n /**\n * Indicates weather channel has been initialized by manually populating the state with some messages, members etc.\n * Static state indicates that channel exists on backend, but is not being watched yet.\n */\n offlineMode: boolean;\n lastKeyStroke?: Date;\n lastTypingEvent: Date | null;\n isTyping: boolean;\n disconnected: boolean;\n\n /**\n * constructor - Create a channel\n *\n * @param {StreamChat<StreamChatGenerics>} client the chat client\n * @param {string} type the type of channel\n * @param {string} [id] the id of the chat\n * @param {ChannelData<StreamChatGenerics>} data any additional custom params\n *\n * @return {Channel<StreamChatGenerics>} Returns a new uninitialized channel\n */\n constructor(\n client: StreamChat<StreamChatGenerics>,\n type: string,\n id: string | undefined,\n data: ChannelData<StreamChatGenerics>,\n ) {\n const validTypeRe = /^[\\w_-]+$/;\n const validIDRe = /^[\\w!_-]+$/;\n\n if (!validTypeRe.test(type)) {\n throw new Error(`Invalid chat type ${type}, letters, numbers and \"_-\" are allowed`);\n }\n if (typeof id === 'string' && !validIDRe.test(id)) {\n throw new Error(`Invalid chat id ${id}, letters, numbers and \"!-_\" are allowed`);\n }\n\n this._client = client;\n this.type = type;\n this.id = id;\n // used by the frontend, gets updated:\n this.data = data;\n // this._data is used for the requests...\n this._data = { ...data };\n this.cid = `${type}:${id}`;\n this.listeners = {};\n // perhaps the state variable should be private\n this.state = new ChannelState<StreamChatGenerics>(this);\n this.initialized = false;\n this.offlineMode = false;\n this.lastTypingEvent = null;\n this.isTyping = false;\n this.disconnected = false;\n }\n\n /**\n * getClient - Get the chat client for this channel. If client.disconnect() was called, this function will error\n *\n * @return {StreamChat<StreamChatGenerics>}\n */\n getClient(): StreamChat<StreamChatGenerics> {\n if (this.disconnected === true) {\n throw Error(`You can't use a channel after client.disconnect() was called`);\n }\n return this._client;\n }\n\n /**\n * getConfig - Get the config for this channel id (cid)\n *\n * @return {Record<string, unknown>}\n */\n getConfig() {\n const client = this.getClient();\n return client.configs[this.cid];\n }\n\n /**\n * sendMessage - Send a message to this channel\n *\n * @param {Message<StreamChatGenerics>} message The Message object\n * @param {boolean} [options.skip_enrich_url] Do not try to enrich the URLs within message\n * @param {boolean} [options.skip_push] Skip sending push notifications\n * @param {boolean} [options.is_pending_message] DEPRECATED, please use `pending` instead.\n * @param {boolean} [options.pending] Make this message pending\n * @param {Record<string,string>} [options.pending_message_metadata] Metadata for the pending message\n * @param {boolean} [options.force_moderation] Apply force moderation for server-side requests\n *\n * @return {Promise<SendMessageAPIResponse<StreamChatGenerics>>} The Server Response\n */\n async sendMessage(message: Message<StreamChatGenerics>, options?: SendMessageOptions) {\n return await this.getClient().post<SendMessageAPIResponse<StreamChatGenerics>>(this._channelURL() + '/message', {\n message,\n ...options,\n });\n }\n\n sendFile(\n uri: string | NodeJS.ReadableStream | Buffer | File,\n name?: string,\n contentType?: string,\n user?: UserResponse<StreamChatGenerics>,\n ) {\n return this.getClient().sendFile(`${this._channelURL()}/file`, uri, name, contentType, user);\n }\n\n sendImage(\n uri: string | NodeJS.ReadableStream | File,\n name?: string,\n contentType?: string,\n user?: UserResponse<StreamChatGenerics>,\n ) {\n return this.getClient().sendFile(`${this._channelURL()}/image`, uri, name, contentType, user);\n }\n\n deleteFile(url: string) {\n return this.getClient().delete<APIResponse>(`${this._channelURL()}/file`, { url });\n }\n\n deleteImage(url: string) {\n return this.getClient().delete<APIResponse>(`${this._channelURL()}/image`, { url });\n }\n\n /**\n * sendEvent - Send an event on this channel\n *\n * @param {Event<StreamChatGenerics>} event for example {type: 'message.read'}\n *\n * @return {Promise<EventAPIResponse<StreamChatGenerics>>} The Server Response\n */\n async sendEvent(event: Event<StreamChatGenerics>) {\n this._checkInitialized();\n return await this.getClient().post<EventAPIResponse<StreamChatGenerics>>(this._channelURL() + '/event', {\n event,\n });\n }\n\n /**\n * search - Query messages\n *\n * @param {MessageFilters<StreamChatGenerics> | string} query search query or object MongoDB style filters\n * @param {{client_id?: string; connection_id?: string; query?: string; message_filter_conditions?: MessageFilters<StreamChatGenerics>}} options Option object, {user_id: 'tommaso'}\n *\n * @return {Promise<SearchAPIResponse<StreamChatGenerics>>} search messages response\n */\n async search(\n query: MessageFilters<StreamChatGenerics> | string,\n options: SearchOptions<StreamChatGenerics> & {\n client_id?: string;\n connection_id?: string;\n message_filter_conditions?: MessageFilters<StreamChatGenerics>;\n message_options?: MessageOptions;\n query?: string;\n } = {},\n ) {\n if (options.offset && options.next) {\n throw Error(`Cannot specify offset with next`);\n }\n // Return a list of channels\n const payload: SearchPayload<StreamChatGenerics> = {\n filter_conditions: { cid: this.cid } as ChannelFilters<StreamChatGenerics>,\n ...options,\n sort: options.sort ? normalizeQuerySort<SearchMessageSortBase<StreamChatGenerics>>(options.sort) : undefined,\n };\n if (typeof query === 'string') {\n payload.query = query;\n } else if (typeof query === 'object') {\n payload.message_filter_conditions = query;\n } else {\n throw Error(`Invalid type ${typeof query} for query parameter`);\n }\n // Make sure we wait for the connect promise if there is a pending one\n await this.getClient().wsPromise;\n\n return await this.getClient().get<SearchAPIResponse<StreamChatGenerics>>(this.getClient().baseURL + '/search', {\n payload,\n });\n }\n\n /**\n * queryMembers - Query Members\n *\n * @param {MemberFilters<StreamChatGenerics>} filterConditions object MongoDB style filters\n * @param {MemberSort<StreamChatGenerics>} [sort] Sort options, for instance [{created_at: -1}].\n * When using multiple fields, make sure you use array of objects to guarantee field order, for instance [{name: -1}, {created_at: 1}]\n * @param {{ limit?: number; offset?: number }} [options] Option object, {limit: 10, offset:10}\n *\n * @return {Promise<ChannelMemberAPIResponse<StreamChatGenerics>>} Query Members response\n */\n async queryMembers(\n filterConditions: MemberFilters<StreamChatGenerics>,\n sort: MemberSort<StreamChatGenerics> = [],\n options: QueryMembersOptions = {},\n ) {\n let id: string | undefined;\n const type = this.type;\n let members: string[] | ChannelMemberResponse<StreamChatGenerics>[] | undefined;\n if (this.id) {\n id = this.id;\n } else if (this.data?.members && Array.isArray(this.data.members)) {\n members = this.data.members;\n }\n // Return a list of members\n return await this.getClient().get<ChannelMemberAPIResponse<StreamChatGenerics>>(\n this.getClient().baseURL + '/members',\n {\n payload: {\n type,\n id,\n members,\n sort: normalizeQuerySort(sort),\n filter_conditions: filterConditions,\n ...options,\n },\n },\n );\n }\n\n /**\n * partialUpdateMember - Partial update a member\n *\n * @param {string} user_id member user id\n * @param {PartialUpdateMember<StreamChatGenerics>} updates\n *\n * @return {Promise<ChannelMemberResponse<StreamChatGenerics>>} Updated member\n */\n async partialUpdateMember(user_id: string, updates: PartialUpdateMember<StreamChatGenerics>) {\n if (!user_id) {\n throw Error('Please specify the user id');\n }\n\n return await this.getClient().patch<PartialUpdateMemberAPIResponse<StreamChatGenerics>>(\n this._channelURL() + `/member/${encodeURIComponent(user_id)}`,\n updates,\n );\n }\n\n /**\n * sendReaction - Send a reaction about a message\n *\n * @param {string} messageID the message id\n * @param {Reaction<StreamChatGenerics>} reaction the reaction object for instance {type: 'love'}\n * @param {{ enforce_unique?: boolean, skip_push?: boolean }} [options] Option object, {enforce_unique: true, skip_push: true} to override any existing reaction or skip sending push notifications\n *\n * @return {Promise<ReactionAPIResponse<StreamChatGenerics>>} The Server Response\n */\n async sendReaction(\n messageID: string,\n reaction: Reaction<StreamChatGenerics>,\n options?: { enforce_unique?: boolean; skip_push?: boolean },\n ) {\n if (!messageID) {\n throw Error(`Message id is missing`);\n }\n if (!reaction || Object.keys(reaction).length === 0) {\n throw Error(`Reaction object is missing`);\n }\n return await this.getClient().post<ReactionAPIResponse<StreamChatGenerics>>(\n this.getClient().baseURL + `/messages/${encodeURIComponent(messageID)}/reaction`,\n {\n reaction,\n ...options,\n },\n );\n }\n\n /**\n * deleteReaction - Delete a reaction by user and type\n *\n * @param {string} messageID the id of the message from which te remove the reaction\n * @param {string} reactionType the type of reaction that should be removed\n * @param {string} [user_id] the id of the user (used only for server side request) default null\n *\n * @return {Promise<ReactionAPIResponse<StreamChatGenerics>>} The Server Response\n */\n deleteReaction(messageID: string, reactionType: string, user_id?: string) {\n this._checkInitialized();\n if (!reactionType || !messageID) {\n throw Error('Deleting a reaction requires specifying both the message and reaction type');\n }\n\n const url =\n this.getClient().baseURL +\n `/messages/${encodeURIComponent(messageID)}/reaction/${encodeURIComponent(reactionType)}`;\n //provided when server side request\n if (user_id) {\n return this.getClient().delete<ReactionAPIResponse<StreamChatGenerics>>(url, { user_id });\n }\n\n return this.getClient().delete<ReactionAPIResponse<StreamChatGenerics>>(url, {});\n }\n\n /**\n * update - Edit the channel's custom properties\n *\n * @param {ChannelData<StreamChatGenerics>} channelData The object to update the custom properties of this channel with\n * @param {Message<StreamChatGenerics>} [updateMessage] Optional message object for channel members notification\n * @param {ChannelUpdateOptions} [options] Option object, configuration to control the behavior while updating\n * @return {Promise<UpdateChannelAPIResponse<StreamChatGenerics>>} The server response\n */\n async update(\n channelData: Partial<ChannelData<StreamChatGenerics>> | Partial<ChannelResponse<StreamChatGenerics>> = {},\n updateMessage?: Message<StreamChatGenerics>,\n options?: ChannelUpdateOptions,\n ) {\n // Strip out reserved names that will result in API errors.\n const reserved = [\n 'config',\n 'cid',\n 'created_by',\n 'id',\n 'member_count',\n 'type',\n 'created_at',\n 'updated_at',\n 'last_message_at',\n 'own_capabilities',\n ];\n reserved.forEach((key) => {\n delete channelData[key];\n });\n\n return await this._update({\n message: updateMessage,\n data: channelData,\n ...options,\n });\n }\n\n /**\n * updatePartial - partial update channel properties\n *\n * @param {PartialUpdateChannel<StreamChatGenerics>} partial update request\n *\n * @return {Promise<PartialUpdateChannelAPIResponse<StreamChatGenerics>>}\n */\n async updatePartial(update: PartialUpdateChannel<StreamChatGenerics>) {\n const data = await this.getClient().patch<PartialUpdateChannelAPIResponse<StreamChatGenerics>>(\n this._channelURL(),\n update,\n );\n\n const areCapabilitiesChanged =\n [...(data.channel.own_capabilities || [])].sort().join() !==\n [...(Array.isArray(this.data?.own_capabilities) ? (this.data?.own_capabilities as string[]) : [])].sort().join();\n this.data = data.channel;\n // If the capabiltities are changed, we trigger the `capabilities.changed` event.\n if (areCapabilitiesChanged) {\n this.getClient().dispatchEvent({\n type: 'capabilities.changed',\n cid: this.cid,\n own_capabilities: data.channel.own_capabilities,\n });\n }\n return data;\n }\n\n /**\n * enableSlowMode - enable slow mode\n *\n * @param {number} coolDownInterval the cooldown interval in seconds\n * @return {Promise<UpdateChannelAPIResponse<StreamChatGenerics>>} The server response\n */\n async enableSlowMode(coolDownInterval: number) {\n const data = await this.getClient().post<UpdateChannelAPIResponse<StreamChatGenerics>>(this._channelURL(), {\n cooldown: coolDownInterval,\n });\n this.data = data.channel;\n return data;\n }\n\n /**\n * disableSlowMode - disable slow mode\n *\n * @return {Promise<UpdateChannelAPIResponse<StreamChatGenerics>>} The server response\n */\n async disableSlowMode() {\n const data = await this.getClient().post<UpdateChannelAPIResponse<StreamChatGenerics>>(this._channelURL(), {\n cooldown: 0,\n });\n this.data = data.channel;\n return data;\n }\n\n /**\n * delete - Delete the channel. Messages are permanently removed.\n *\n * @param {boolean} [options.hard_delete] Defines if the channel is hard deleted or not\n *\n * @return {Promise<DeleteChannelAPIResponse<StreamChatGenerics>>} The server response\n */\n async delete(options: { hard_delete?: boolean } = {}) {\n return await this.getClient().delete<DeleteChannelAPIResponse<StreamChatGenerics>>(this._channelURL(), {\n ...options,\n });\n }\n\n /**\n * truncate - Removes all messages from the channel\n * @param {TruncateOptions<StreamChatGenerics>} [options] Defines truncation options\n * @return {Promise<TruncateChannelAPIResponse<StreamChatGenerics>>} The server response\n */\n async truncate(options: TruncateOptions<StreamChatGenerics> = {}) {\n return await this.getClient().post<TruncateChannelAPIResponse<StreamChatGenerics>>(\n this._channelURL() + '/truncate',\n options,\n );\n }\n\n /**\n * acceptInvite - accept invitation to the channel\n *\n * @param {InviteOptions<StreamChatGenerics>} [options] The object to update the custom properties of this channel with\n *\n * @return {Promise<UpdateChannelAPIResponse<StreamChatGenerics>>} The server response\n */\n async acceptInvite(options: InviteOptions<StreamChatGenerics> = {}) {\n return await this._update({ accept_invite: true, ...options });\n }\n\n /**\n * rejectInvite - reject invitation to the channel\n *\n * @param {InviteOptions<StreamChatGenerics>} [options] The object to update the custom properties of this channel with\n *\n * @return {Promise<UpdateChannelAPIResponse<StreamChatGenerics>>} The server response\n */\n async rejectInvite(options: InviteOptions<StreamChatGenerics> = {}) {\n return await this._update({ reject_invite: true, ...options });\n }\n\n /**\n * addMembers - add members to the channel\n *\n * @param {string[] | Array<NewMemberPayload<StreamChatGenerics>>} members An array of members to add to the channel\n * @param {Message<StreamChatGenerics>} [message] Optional message object for channel members notification\n * @param {ChannelUpdateOptions} [options] Option object, configuration to control the behavior while updating\n * @return {Promise<UpdateChannelAPIResponse<StreamChatGenerics>>} The server response\n */\n async addMembers(\n members: string[] | Array<NewMemberPayload<StreamChatGenerics>>,\n message?: Message<StreamChatGenerics>,\n options: ChannelUpdateOptions = {},\n ) {\n return await this._update({ add_members: members, message, ...options });\n }\n\n /**\n * addModerators - add moderators to the channel\n *\n * @param {string[]} members An array of member identifiers\n * @param {Message<StreamChatGenerics>} [message] Optional message object for channel members notification\n * @param {ChannelUpdateOptions} [options] Option object, configuration to control the behavior while updating\n * @return {Promise<UpdateChannelAPIResponse<StreamChatGenerics>>} The server response\n */\n async addModerators(members: string[], message?: Message<StreamChatGenerics>, options: ChannelUpdateOptions = {}) {\n return await this._update({ add_moderators: members, message, ...options });\n }\n\n /**\n * assignRoles - sets member roles in a channel\n *\n * @param {{channel_role: Role, user_id: string}[]} roles List of role assignments\n * @param {Message<StreamChatGenerics>} [message] Optional message object for channel members notification\n * @param {ChannelUpdateOptions} [options] Option object, configuration to control the behavior while updating\n * @return {Promise<UpdateChannelAPIResponse<StreamChatGenerics>>} The server response\n */\n async assignRoles(\n roles: { channel_role: Role; user_id: string }[],\n message?: Message<StreamChatGenerics>,\n options: ChannelUpdateOptions = {},\n ) {\n return await this._update({ assign_roles: roles, message, ...options });\n }\n\n /**\n * inviteMembers - invite members to the channel\n *\n * @param {string[] | Array<NewMemberPayload<StreamChatGenerics>>} members An array of members to invite to the channel\n * @param {Message<StreamChatGenerics>} [message] Optional message object for channel members notification\n * @param {ChannelUpdateOptions} [options] Option object, configuration to control the behavior while updating\n * @return {Promise<UpdateChannelAPIResponse<StreamChatGenerics>>} The server response\n */\n async inviteMembers(\n members: string[] | Array<NewMemberPayload<StreamChatGenerics>>,\n message?: Message<StreamChatGenerics>,\n options: ChannelUpdateOptions = {},\n ) {\n return await this._update({ invites: members, message, ...options });\n }\n\n /**\n * removeMembers - remove members from channel\n *\n * @param {string[]} members An array of member identifiers\n * @param {Message<StreamChatGenerics>} [message] Optional message object for channel members notification\n * @param {ChannelUpdateOptions} [options] Option object, configuration to control the behavior while updating\n * @return {Promise<UpdateChannelAPIResponse<StreamChatGenerics>>} The server response\n */\n async removeMembers(members: string[], message?: Message<StreamChatGenerics>, options: ChannelUpdateOptions = {}) {\n return await this._update({ remove_members: members, message, ...options });\n }\n\n /**\n * demoteModerators - remove moderator role from channel members\n *\n * @param {string[]} members An array of member identifiers\n * @param {Message<StreamChatGenerics>} [message] Optional message object for channel members notification\n * @param {ChannelUpdateOptions} [options] Option object, configuration to control the behavior while updating\n * @return {Promise<UpdateChannelAPIResponse<StreamChatGenerics>>} The server response\n */\n async demoteModerators(members: string[], message?: Message<StreamChatGenerics>, options: ChannelUpdateOptions = {}) {\n return await this._update({ demote_moderators: members, message, ...options });\n }\n\n /**\n * _update - executes channel update request\n * @param payload Object Update Channel payload\n * @return {Promise<UpdateChannelAPIResponse<StreamChatGenerics>>} The server response\n * TODO: introduce new type instead of Object in the next major update\n */\n async _update(payload: Object) {\n const data = await this.getClient().post<UpdateChannelAPIResponse<StreamChatGenerics>>(this._channelURL(), payload);\n this.data = data.channel;\n return data;\n }\n\n /**\n * mute - mutes the current channel\n * @param {{ user_id?: string, expiration?: string }} opts expiration in minutes or user_id\n * @return {Promise<MuteChannelAPIResponse<StreamChatGenerics>>} The server response\n *\n * example with expiration:\n * await channel.mute({expiration: moment.duration(2, 'weeks')});\n *\n * example server side:\n * await channel.mute({user_id: userId});\n *\n */\n async mute(opts: { expiration?: number; user_id?: string } = {}) {\n return await this.getClient().post<MuteChannelAPIResponse<StreamChatGenerics>>(\n this.getClient().baseURL + '/moderation/mute/channel',\n { channel_cid: this.cid, ...opts },\n );\n }\n\n /**\n * unmute - mutes the current channel\n * @param {{ user_id?: string}} opts user_id\n * @return {Promise<APIResponse>} The server response\n *\n * example server side:\n * await channel.unmute({user_id: userId});\n */\n async unmute(opts: { user_id?: string } = {}) {\n return await this.getClient().post<APIResponse>(this.getClient().baseURL + '/moderation/unmute/channel', {\n channel_cid: this.cid,\n ...opts,\n });\n }\n\n /**\n * archive - archives the current channel\n * @param {{ user_id?: string }} opts user_id if called server side\n * @return {Promise<ChannelMemberResponse<StreamChatGenerics>>} The server response\n *\n * example:\n * await channel.archives();\n *\n * example server side:\n * await channel.archive({user_id: userId});\n *\n */\n async archive(opts: { user_id?: string } = {}) {\n const cli = this.getClient();\n const uid = opts.user_id || cli.userID;\n if (!uid) {\n throw Error('A user_id is required for archiving a channel');\n }\n const resp = await this.partialUpdateMember(uid, { set: { archived: true } });\n return resp.channel_member;\n }\n\n /**\n * unarchive - unarchives the current channel\n * @param {{ user_id?: string }} opts user_id if called server side\n * @return {Promise<ChannelMemberResponse<StreamChatGenerics>>} The server response\n *\n * example:\n * await channel.unarchive();\n *\n * example server side:\n * await channel.unarchive({user_id: userId});\n *\n */\n async unarchive(opts: { user_id?: string } = {}) {\n const cli = this.getClient();\n const uid = opts.user_id || cli.userID;\n if (!uid) {\n throw Error('A user_id is required for unarchiving a channel');\n }\n const resp = await this.partialUpdateMember(uid, { set: { archived: false } });\n return resp.channel_member;\n }\n\n /**\n * pin - pins the current channel\n * @param {{ user_id?: string }} opts user_id if called server side\n * @return {Promise<ChannelMemberResponse<StreamChatGenerics>>} The server response\n *\n * example:\n * await channel.pin();\n *\n * example server side:\n * await channel.pin({user_id: userId});\n *\n */\n async pin(opts: { user_id?: string } = {}) {\n const cli = this.getClient();\n const uid = opts.user_id || cli.userID;\n if (!uid) {\n throw new Error('A user_id is required for pinning a channel');\n }\n const resp = await this.partialUpdateMember(uid, { set: { pinned: true } });\n return resp.channel_member;\n }\n\n /**\n * unpin - unpins the current channel\n * @param {{ user_id?: string }} opts user_id if called server side\n * @return {Promise<ChannelMemberResponse<StreamChatGenerics>>} The server response\n *\n * example:\n * await channel.unpin();\n *\n * example server side:\n * await channel.unpin({user_id: userId});\n *\n */\n async unpin(opts: { user_id?: string } = {}) {\n const cli = this.getClient();\n const uid = opts.user_id || cli.userID;\n if (!uid) {\n throw new Error('A user_id is required for unpinning a channel');\n }\n const resp = await this.partialUpdateMember(uid, { set: { pinned: false } });\n return resp.channel_member;\n }\n\n /**\n * muteStatus - returns the mute status for the current channel\n * @return {{ muted: boolean; createdAt: Date | null; expiresAt: Date | null }} { muted: true | false, createdAt: Date | null, expiresAt: Date | null}\n */\n muteStatus(): {\n createdAt: Date | null;\n expiresAt: Date | null;\n muted: boolean;\n } {\n this._checkInitialized();\n return this.getClient()._muteStatus(this.cid);\n }\n\n sendAction(messageID: string, formData: Record<string, string>) {\n this._checkInitialized();\n if (!messageID) {\n throw Error(`Message id is missing`);\n }\n return this.getClient().post<SendMessageAPIResponse<StreamChatGenerics>>(\n this.getClient().baseURL + `/messages/${encodeURIComponent(messageID)}/action`,\n {\n message_id: messageID,\n form_data: formData,\n id: this.id,\n type: this.type,\n },\n );\n }\n\n /**\n * keystroke - First of the typing.start and typing.stop events based on the users keystrokes.\n * Call this on every keystroke\n * @see {@link https://getstream.io/chat/docs/typing_indicators/?language=js|Docs}\n * @param {string} [parent_id] set this field to `message.id` to indicate that typing event is happening in a thread\n */\n async keystroke(parent_id?: string, options?: { user_id: string }) {\n if (!this._isTypingIndicatorsEnabled()) {\n return;\n }\n const now = new Date();\n const diff = this.lastTypingEvent && now.getTime() - this.lastTypingEvent.getTime();\n this.lastKeyStroke = now;\n this.isTyping = true;\n // send a typing.start every 2 seconds\n if (diff === null || diff > 2000) {\n this.lastTypingEvent = new Date();\n await this.sendEvent({\n type: 'typing.start',\n parent_id,\n ...(options || {}),\n } as Event<StreamChatGenerics>);\n }\n }\n\n /**\n * Sends an event to update the AI state for a specific message.\n * Typically used by the server connected to the AI service to notify clients of state changes.\n *\n * @param messageId - The ID of the message associated with the AI state.\n * @param state - The new state of the AI process (e.g., thinking, generating).\n * @param options - Optional parameters, such as `ai_message`, to include additional details in the event.\n */\n async updateAIState(messageId: string, state: AIState, options: { ai_message?: string } = {}) {\n await this.sendEvent({\n ...options,\n type: 'ai_indicator.update',\n message_id: messageId,\n ai_state: state,\n } as Event<StreamChatGenerics>);\n }\n\n /**\n * Sends an event to notify watchers to clear the typing/thinking UI when the AI response starts streaming.\n * Typically used by the server connected to the AI service to inform clients that the AI response has started.\n */\n async clearAIIndicator() {\n await this.sendEvent({\n type: 'ai_indicator.clear',\n } as Event<StreamChatGenerics>);\n }\n\n /**\n * Sends an event to stop AI response generation, leaving the message in its current state.\n * Triggered by the user to halt the AI response process.\n */\n async stopAIResponse() {\n await this.sendEvent({\n type: 'ai_indicator.stop',\n } as Event<StreamChatGenerics>);\n }\n\n /**\n * stopTyping - Sets last typing to null and sends the typing.stop event\n * @see {@link https://getstream.io/chat/docs/typing_indicators/?language=js|Docs}\n * @param {string} [parent_id] set this field to `message.id` to indicate that typing event is happening in a thread\n */\n async stopTyping(parent_id?: string, options?: { user_id: string }) {\n if (!this._isTypingIndicatorsEnabled()) {\n return;\n }\n this.lastTypingEvent = null;\n this.isTyping = false;\n await this.sendEvent({\n type: 'typing.stop',\n parent_id,\n ...(options || {}),\n } as Event<StreamChatGenerics>);\n }\n\n _isTypingIndicatorsEnabled(): boolean {\n if (!this.getConfig()?.typing_events) {\n return false;\n }\n return this.getClient().user?.privacy_settings?.typing_indicators?.enabled ?? true;\n }\n\n /**\n * lastMessage - return the last message, takes into account that last few messages might not be perfectly sorted\n *\n * @return {ReturnType<ChannelState<StreamChatGenerics>['formatMessage']> | undefined} Description\n */\n lastMessage(): FormatMessageResponse<StreamChatGenerics> | undefined {\n // get last 5 messages, sort, return the latest\n // get a slice of the last 5\n let min = this.state.latestMessages.length - 5;\n if (min < 0) {\n min = 0;\n }\n const max = this.state.latestMessages.length + 1;\n const messageSlice = this.state.latestMessages.slice(min, max);\n\n // sort by pk desc\n messageSlice.sort((a, b) => b.created_at.getTime() - a.created_at.getTime());\n\n return messageSlice[0];\n }\n\n /**\n * markRead - Send the mark read event for this user, only works if the `read_events` setting is enabled\n *\n * @param {MarkReadOptions<StreamChatGenerics>} data\n * @return {Promise<EventAPIResponse<StreamChatGenerics> | null>} Description\n */\n async markRead(data: MarkReadOptions<StreamChatGenerics> = {}) {\n this._checkInitialized();\n\n if (!this.getConfig()?.read_events && !this.getClient()._isUsingServerAuth()) {\n return Promise.resolve(null);\n }\n\n return await this.getClient().post<EventAPIResponse<StreamChatGenerics>>(this._channelURL() + '/read', {\n ...data,\n });\n }\n\n /**\n * markUnread - Mark the channel as unread from messageID, only works if the `read_events` setting is enabled\n *\n * @param {MarkUnreadOptions<StreamChatGenerics>} data\n * @return {APIResponse} An API response\n */\n async markUnread(data: MarkUnreadOptions<StreamChatGenerics>) {\n this._checkInitialized();\n\n if (!this.getConfig()?.read_events && !this.getClient()._isUsingServerAuth()) {\n return Promise.resolve(null);\n }\n\n return await this.getClient().post<APIResponse>(this._channelURL() + '/unread', {\n ...data,\n });\n }\n\n /**\n * clean - Cleans the channel state and fires stop typing if needed\n */\n clean() {\n if (this.lastKeyStroke) {\n const now = new Date();\n const diff = now.getTime() - this.lastKeyStroke.getTime();\n if (diff > 1000 && this.isTyping) {\n logChatPromiseExecution(this.stopTyping(), 'stop typing event');\n }\n }\n\n this.state.clean();\n }\n\n /**\n * watch - Loads the initial channel state and watches for changes\n *\n * @param {ChannelQueryOptions<StreamChatGenerics>} options additional options for the query endpoint\n *\n * @return {Promise<QueryChannelAPIResponse<StreamChatGenerics>>} The server response\n */\n async watch(options?: ChannelQueryOptions<StreamChatGenerics>) {\n const defaultOptions = {\n state: true,\n watch: true,\n presence: false,\n };\n\n // Make sure we wait for the connect promise if there is a pending one\n await this.getClient().wsPromise;\n\n if (!this.getClient()._hasConnectionID()) {\n defaultOptions.watch = false;\n }\n\n const combined = { ...defaultOptions, ...options };\n const state = await this.query(combined, 'latest');\n this.initialized = true;\n this.data = state.channel;\n\n this._client.logger('info', `channel:watch() - started watching channel ${this.cid}`, {\n tags: ['channel'],\n channel: this,\n });\n return state;\n }\n\n /**\n * stopWatching - Stops watching the channel\n *\n * @return {Promise<APIResponse>} The server response\n */\n async stopWatching() {\n const response = await this.getClient().post<APIResponse>(this._channelURL() + '/stop-watching', {});\n\n this._client.logger('info', `channel:watch() - stopped watching channel ${this.cid}`, {\n tags: ['channel'],\n channel: this,\n });\n\n return response;\n }\n\n /**\n * getReplies - List the message replies for a parent message.\n *\n * The recommended way of working with threads is to use the Thread class.\n *\n * @param {string} parent_id The message parent id, ie the top of the thread\n * @param {MessagePaginationOptions & { user?: UserResponse<StreamChatGenerics>; user_id?: string }} options Pagination params, ie {limit:10, id_lte: 10}\n *\n * @return {Promise<GetRepliesAPIResponse<StreamChatGenerics>>} A response with a list of messages\n */\n async getReplies(\n parent_id: string,\n options: MessagePaginationOptions & { user?: UserResponse<StreamChatGenerics>; user_id?: string },\n sort?: { created_at: AscDesc }[],\n ) {\n const normalizedSort = sort ? normalizeQuerySort(sort) : undefined;\n const data = await this.getClient().get<GetRepliesAPIResponse<StreamChatGenerics>>(\n this.getClient().baseURL + `/messages/${encodeURIComponent(parent_id)}/replies`,\n {\n sort: normalizedSort,\n ...options,\n },\n );\n\n // add any messages to our thread state\n if (data.messages) {\n this.state.addMessagesSorted(data.messages);\n }\n\n return data;\n }\n\n /**\n * getPinnedMessages - List list pinned messages of the channel\n *\n * @param {PinnedMessagePaginationOptions & { user?: UserResponse<StreamChatGenerics>; user_id?: string }} options Pagination params, ie {limit:10, id_lte: 10}\n * @param {PinnedMessagesSort} sort defines sorting direction of pinned messages\n *\n * @return {Promise<GetRepliesAPIResponse<StreamChatGenerics>>} A response with a list of messages\n */\n async getPinnedMessages(\n options: PinnedMessagePaginationOptions & { user?: UserResponse<StreamChatGenerics>; user_id?: string },\n sort: PinnedMessagesSort = [],\n ) {\n return await this.getClient().get<GetRepliesAPIResponse<StreamChatGenerics>>(\n this._channelURL() + '/pinned_messages',\n {\n payload: {\n ...options,\n sort: normalizeQuerySort(sort),\n },\n },\n );\n }\n\n /**\n * getReactions - List the reactions, supports pagination\n *\n * @param {string} message_id The message id\n * @param {{ limit?: number; offset?: number }} options The pagination options\n *\n * @return {Promise<GetReactionsAPIResponse<StreamChatGenerics>>} Server response\n */\n getReactions(message_id: string, options: { limit?: number; offset?: number }) {\n return this.getClient().get<GetReactionsAPIResponse<StreamChatGenerics>>(\n this.getClient().baseURL + `/messages/${encodeURIComponent(message_id)}/reactions`,\n {\n ...options,\n },\n );\n }\n\n /**\n * getMessagesById - Retrieves a list of messages by ID\n *\n * @param {string[]} messageIds The ids of the messages to retrieve from this channel\n *\n * @return {Promise<GetMultipleMessagesAPIResponse<StreamChatGenerics>>} Server response\n */\n getMessagesById(messageIds: string[]) {\n return this.getClient().get<GetMultipleMessagesAPIResponse<StreamChatGenerics>>(this._channelURL() + '/messages', {\n ids: messageIds.join(','),\n });\n }\n\n /**\n * lastRead - returns the last time the user marked the channel as read if the user never marked the channel as read, this will return null\n * @return {Date | null | undefined}\n */\n lastRead() {\n const { userID } = this.getClient();\n if (userID) {\n return this.state.read[userID] ? this.state.read[userID].last_read : null;\n }\n }\n\n _countMessageAsUnread(message: FormatMessageResponse<StreamChatGenerics> | MessageResponse<StreamChatGenerics>) {\n if (message.shadowed) return false;\n if (message.silent) return false;\n if (message.parent_id && !message.show_in_channel) return false;\n if (message.user?.id === this.getClient().userID) return false;\n if (message.user?.id && this.getClient().userMuteStatus(message.user.id)) return false;\n\n // Return false if channel doesn't allow read events.\n if (Array.isArray(this.data?.own_capabilities) && !this.data?.own_capabilities.includes('read-events'))\n return false;\n\n // FIXME: see #1265, adjust and count new messages even when the channel is muted\n if (this.muteStatus().muted) return false;\n\n return true;\n }\n\n /**\n * countUnread - Count of unread messages\n *\n * @param {Date | null} [lastRead] lastRead the time that the user read a message, defaults to current user's read state\n *\n * @return {number} Unread count\n */\n countUnread(lastRead?: Date | null) {\n if (!lastRead) return this.state.unreadCount;\n\n let count = 0;\n for (let i = 0; i < this.state.latestMessages.length; i += 1) {\n const message = this.state.latestMessages[i];\n if (message.created_at > lastRead && this._countMessageAsUnread(message)) {\n count++;\n }\n }\n return count;\n }\n\n /**\n * countUnreadMentions - Count the number of unread messages mentioning the current user\n *\n * @return {number} Unread mentions count\n */\n countUnreadMentions() {\n const lastRead = this.lastRead();\n const userID = this.getClient().userID;\n\n let count = 0;\n for (let i = 0; i < this.state.latestMessages.length; i += 1) {\n const message = this.state.latestMessages[i];\n if (\n this._countMessageAsUnread(message) &&\n (!lastRead || message.created_at > lastRead) &&\n message.mentioned_users?.some((user) => user.id === userID)\n ) {\n count++;\n }\n }\n return count;\n }\n\n /**\n * create - Creates a new channel\n *\n * @return {Promise<QueryChannelAPIResponse<StreamChatGenerics>>} The Server Response\n *\n */\n create = async (options?: ChannelQueryOptions<StreamChatGenerics>) => {\n const defaultOptions = {\n ...options,\n watch: false,\n state: false,\n presence: false,\n };\n return await this.query(defaultOptions, 'latest');\n };\n\n /**\n * query - Query the API, get messages, members or other channel fields\n *\n * @param {ChannelQueryOptions<StreamChatGenerics>} options The query options\n * @param {MessageSetType} messageSetToAddToIfDoesNotExist It's possible to load disjunct sets of a channel's messages into state, use `current` to load the initial channel state or if you want to extend the currently displayed messages, use `latest` if you want to load/extend the latest messages, `new` is used for loading a specific message and it's surroundings\n *\n * @return {Promise<QueryChannelAPIResponse<StreamChatGenerics>>} Returns a query response\n */\n async query(\n options?: ChannelQueryOptions<StreamChatGenerics>,\n messageSetToAddToIfDoesNotExist: MessageSetType = 'current',\n ) {\n // Make sure we wait for the connect promise if there is a pending one\n await this.getClient().wsPromise;\n\n let queryURL = `${this.getClient().baseURL}/channels/${encodeURIComponent(this.type)}`;\n if (this.id) {\n queryURL += `/${encodeURIComponent(this.id)}`;\n }\n\n const state = await this.getClient().post<QueryChannelAPIResponse<StreamChatGenerics>>(queryURL + '/query', {\n data: this._data,\n state: true,\n ...options,\n });\n\n // update the channel id if it was missing\n if (!this.id) {\n this.id = state.channel.id;\n this.cid = state.channel.cid;\n // set the channel as active...\n\n const membersStr = state.members\n .map((member) => member.user_id || member.user?.id)\n .sort()\n .join(',');\n const tempChannelCid = `${this.type}:!members-${membersStr}`;\n\n if (tempChannelCid in this.getClient().activeChannels) {\n // This gets set in `client.channel()` function, when channel is created\n // using members, not id.\n delete this.getClient().activeChannels[tempChannelCid];\n }\n\n if (!(this.cid in this.getClient().activeChannels) && this.getClient()._cacheEnabled()) {\n this.getClient().activeChannels[this.cid] = this;\n }\n }\n\n this.getClient()._addChannelConfig(state.channel);\n\n // add any messages to our channel state\n const { messageSet } = this._initializeState(state, messageSetToAddToIfDoesNotExist);\n messageSet.pagination = {\n ...messageSet.pagination,\n ...messageSetPagination({\n parentSet: messageSet,\n messagePaginationOptions: options?.messages,\n requestedPageSize: options?.messages?.limit ?? DEFAULT_QUERY_CHANNEL_MESSAGE_LIST_PAGE_SIZE,\n returnedPage: state.messages,\n logger: this.getClient().logger,\n }),\n };\n\n this.getClient().polls.hydratePollCache(messageSet.messages, true);\n\n const areCapabilitiesChanged =\n [...(state.channel.own_capabilities || [])].sort().join() !==\n [...(Array.isArray(this.data?.own_capabilities) ? (this.data?.own_capabilities as string[]) : [])].sort().join();\n this.data = state.channel;\n this.offlineMode = false;\n\n if (areCapabilitiesChanged) {\n this.getClient().dispatchEvent({\n type: 'capabilities.changed',\n cid: this.cid,\n own_capabilities: state.channel.own_capabilities,\n });\n }\n\n this.getClient().dispatchEvent({\n type: 'channels.queried',\n queriedChannels: {\n channels: [state],\n isLatestMessageSet: messageSet.isLatest,\n },\n });\n\n return state;\n }\n\n /**\n * banUser - Bans a user from a channel\n *\n * @param {string} targetUserID\n * @param {BanUserOptions<StreamChatGenerics>} options\n * @returns {Promise<APIResponse>}\n */\n async banUser(targetUserID: string, options: BanUserOptions<StreamChatGenerics>) {\n this._checkInitialized();\n return await this.getClient().banUser(targetUserID, {\n ...options,\n type: this.type,\n id: this.id,\n });\n }\n\n /**\n * hides the channel from queryChannels for the user until a message is added\n * If clearHistory is set to true - all messages will be removed for the user\n *\n * @param {string | null} userId\n * @param {boolean} clearHistory\n * @returns {Promise<APIResponse>}\n */\n async hide(userId: string | null = null, clearHistory = false) {\n this._checkInitialized();\n\n return await this.getClient().post<APIResponse>(`${this._channelURL()}/hide`, {\n user_id: userId,\n clear_history: clearHistory,\n });\n }\n\n /**\n * removes the hidden status for a channel\n *\n * @param {string | null} userId\n * @returns {Promise<APIResponse>}\n */\n async show(userId: string | null = null) {\n this._checkInitialized();\n return await this.getClient().post<APIResponse>(`${this._channelURL()}/show`, {\n user_id: userId,\n });\n }\n\n /**\n * unbanUser - Removes the bans for a user on a channel\n *\n * @param {string} targetUserID\n * @returns {Promise<APIResponse>}\n */\n async unbanUser(targetUserID: string) {\n this._checkInitialized();\n return await this.getClient().unbanUser(targetUserID, {\n type: this.type,\n id: this.id,\n });\n }\n\n /**\n * shadowBan - Shadow bans a user from a channel\n *\n * @param {string} targetUserID\n * @param {BanUserOptions<StreamChatGenerics>} options\n * @returns {Promise<APIResponse>}\n */\n async shadowBan(targetUserID: string, options: BanUserOptions<StreamChatGenerics>) {\n this._checkInitialized();\n return await this.getClient().shadowBan(targetUserID, {\n ...options,\n type: this.type,\n id: this.id,\n });\n }\n\n /**\n * removeShadowBan - Removes the shadow ban for a user on a channel\n *\n * @param {string} targetUserID\n * @returns {Promise<APIResponse>}\n */\n async removeShadowBan(targetUserID: string) {\n this._checkInitialized();\n return await this.getClient().removeShadowBan(targetUserID, {\n type: this.type,\n id: this.id,\n });\n }\n\n /**\n * createCall - creates a call for the current channel\n *\n * @param {CreateCallOptions} options\n * @returns {Promise<CreateCallResponse>}\n */\n async createCall(options: CreateCallOptions) {\n return await this.getClient().post<CreateCallResponse>(this._channelURL() + '/call', options);\n }\n\n /**\n * Cast or cancel one or more votes on a poll\n * @param pollId string The poll id\n * @param votes PollVoteData[] The votes that will be casted (or canceled in case of an empty array)\n * @returns {APIResponse & PollVoteResponse} The poll votes\n */\n async vote(messageId: string, pollId: string, vote: PollVoteData) {\n return await this.getClient().castPollVote(messageId, pollId, vote);\n }\n\n async removeVote(messageId: string, pollId: string, voteId: string) {\n return await this.getClient().removePollVote(messageId, pollId, voteId);\n }\n\n /**\n * on - Listen to events on this channel.\n *\n * channel.on('message.new', event => {console.log(\"my new message\", event, channel.state.messages)})\n * or\n * channel.on(event => {console.log(event.type)})\n *\n * @param {EventHandler<StreamChatGenerics> | EventTypes} callbackOrString The event type to listen for (optional)\n * @param {EventHandler<StreamChatGenerics>} [callbackOrNothing] The callback to call\n */\n on(eventType: EventTypes, callback: EventHandler<StreamChatGenerics>): { unsubscribe: () => void };\n on(callback: EventHandler<StreamChatGenerics>): { unsubscribe: () => void };\n on(\n callbackOrString: EventHandler<StreamChatGenerics> | EventTypes,\n callbackOrNothing?: EventHandler<StreamChatGenerics>,\n ): { unsubscribe: () => void } {\n const key = callbackOrNothing ? (callbackOrString as string) : 'all';\n const callback = callbackOrNothing ? callbackOrNothing : callbackOrString;\n if (!(key in this.listeners)) {\n this.listeners[key] = [];\n }\n this._client.logger('info', `Attaching listener for ${key} event on channel ${this.cid}`, {\n tags: ['event', 'channel'],\n channel: this,\n });\n\n this.listeners[key].push(callback);\n\n return {\n unsubscribe: () => {\n this._client.logger('info', `Removing listener for ${key} event from channel ${this.cid}`, {\n tags: ['event', 'channel'],\n channel: this,\n });\n\n this.listeners[key] = this.listeners[key].filter((el) => el !== callback);\n },\n };\n }\n\n /**\n * off - Remove the event handler\n *\n */\n off(eventType: EventTypes, callback: EventHandler<StreamChatGenerics>): void;\n off(callback: EventHandler<StreamChatGenerics>): void;\n off(\n callbackOrString: EventHandler<StreamChatGenerics> | EventTypes,\n callbackOrNothing?: EventHandler<StreamChatGenerics>,\n ): void {\n const key = callbackOrNothing ? (callbackOrString as string) : 'all';\n const callback = callbackOrNothing ? callbackOrNothing : callbackOrString;\n if (!(key in this.listeners)) {\n this.listeners[key] = [];\n }\n\n this._client.logger('info', `Removing listener for ${key} event from channel ${this.cid}`, {\n tags: ['event', 'channel'],\n channel: this,\n });\n this.listeners[key] = this.listeners[key].filter((value) => value !== callback);\n }\n\n // eslint-disable-next-line sonarjs/cognitive-complexity\n _handleChannelEvent(event: Event<StreamChatGenerics>) {\n const channel = this;\n this._client.logger(\n 'info',\n `channel:_handleChannelEvent - Received event of type { ${event.type} } on ${this.cid}`,\n {\n tags: ['event', 'channel'],\n channel: this,\n },\n );\n\n const channelState = channel.state;\n switch (event.type) {\n case 'typing.start':\n if (event.user?.id) {\n channelState.typing[event.user.id] = event;\n }\n break;\n case 'typing.stop':\n if (event.user?.id) {\n delete channelState.typing[event.user.id];\n }\n break;\n case 'message.read':\n if (event.user?.id && event.created_at) {\n channelState.read[event.user.id] = {\n last_read: new Date(event.created_at),\n last_read_message_id: event.last_read_message_id,\n user: event.user,\n unread_messages: 0,\n };\n\n if (event.user?.id === this.getClient().user?.id) {\n channelState.unreadCount = 0;\n }\n }\n break;\n case 'user.watching.start':\n case 'user.updated':\n if (event.user?.id) {\n channelState.watchers[event.user.id] = event.user;\n }\n break;\n case 'user.watching.stop':\n if (event.user?.id) {\n delete channelState.watchers[event.user.id];\n }\n break;\n case 'message.deleted':\n if (event.message) {\n this._extendEventWithOwnReactions(event);\n if (event.hard_delete) channelState.removeMessage(event.message);\n else channelState.addMessageSorted(event.message, false, false);\n\n channelState.removeQuotedMessageReferences(event.message);\n\n if (event.message.pinned) {\n channelState.removePinnedMessage(event.message);\n }\n }\n break;\n case 'message.new':\n if (event.message) {\n /* if message belongs to current user, always assume timestamp is changed to filter it out and add again to avoid duplication */\n const ownMessage = event.user?.id === this.getClient().user?.id;\n const isThreadMessage = event.message.parent_id && !event.message.show_in_channel;\n\n if (this.state.isUpToDate || isThreadMessage) {\n channelState.addMessageSorted(event.message, ownMessage);\n }\n if (event.message.pinned) {\n channelState.addPinnedMessage(event.message);\n }\n\n // do not increase the unread count - the back-end does not increase the count neither in the following cases:\n // 1. the message is mine\n // 2. the message is a thread reply from any user\n const preventUnreadCountUpdate = ownMessage || isThreadMessage;\n if (preventUnreadCountUpdate) break;\n\n if (event.user?.id) {\n for (const userId in channelState.read) {\n if (userId === event.user.id) {\n channelState.read[event.user.id] = {\n last_read: new Date(event.created_at as string),\n user: event.user,\n unread_messages: 0,\n };\n } else {\n channelState.read[userId].unread_messages += 1;\n }\n }\n }\n\n if (this._countMessageAsUnread(event.message)) {\n channelState.unreadCount = channelState.unreadCount + 1;\n }\n }\n break;\n case 'message.updated':\n case 'message.undeleted':\n if (event.message) {\n this._extendEventWithOwnReactions(event);\n channelState.addMessageSorted(event.message, false, false);\n channelState._updateQuotedMessageReferences({ message: event.message });\n if (event.message.pinned) {\n channelState.addPinnedMessage(event.message);\n } else {\n channelState.removePinnedMessage(event.message);\n }\n }\n break;\n case 'channel.truncated':\n if (event.channel?.truncated_at) {\n const truncatedAt = +new Date(event.channel.truncated_at);\n\n channelState.messageSets.forEach((messageSet, messageSetIndex) => {\n messageSet.messages.forEach(({ created_at: createdAt, id }) => {\n if (truncatedAt > +createdAt) channelState.removeMessage({ id, messageSetIndex });\n });\n });\n\n channelState.pinnedMessages.forEach(({ id, created_at: createdAt }) => {\n if (truncatedAt > +createdAt)\n channelState.removePinnedMessage({ id } as MessageResponse<StreamChatGenerics>);\n });\n } else {\n channelState.clearMessages();\n }\n\n channelState.unreadCount = 0;\n // system messages don't increment unread counts\n if (event.message) {\n channelState.addMessageSorted(event.message);\n if (event.message.pinned) {\n channelState.addPinnedMessage(event.message);\n }\n }\n break;\n case 'member.added':\n case 'member.updated':\n if (event.member?.user) {\n channelState.members = {\n ...channelState.members,\n [event.member.user.id]: event.member,\n };\n }\n\n if (\n typeof channelState.membership.user?.id === 'string' &&\n typeof event.member?.user?.id === 'string' &&\n event.member.user.id === channelState.membership.user.id\n ) {\n channelState.membership = event.member;\n }\n break;\n case 'member.removed':\n if (event.user?.id) {\n const newMembers = {\n ...channelState.members,\n };\n\n delete newMembers[event.user.id];\n\n channelState.members = newMembers;\n\n // TODO?: unset membership\n }\n break;\n case 'notification.mark_unread': {\n const ownMessage = event.user?.id === this.getClient().user?.id;\n if (!(ownMessage && event.user)) break;\n\n const unreadCount = event.unread_messages ?? 0;\n\n channelState.read[event.user.id] = {\n first_unread_message_id: event.first_unread_message_id,\n last_read: new Date(event.last_read_at as string),\n last_read_message_id: event.last_read_message_id,\n user: event.user,\n unread_messages: unreadCount,\n };\n\n channelState.unreadCount = unreadCount;\n break;\n }\n case 'channel.updated':\n if (event.channel) {\n const isFrozenChanged = event.channel?.frozen !== undefined && event.channel.frozen !== channel.data?.frozen;\n if (isFrozenChanged) {\n this.query({ state: false, messages: { limit: 0 }, watchers: { limit: 0 } });\n }\n channel.data = {\n ...event.channel,\n hidden: event.channel?.hidden ?? channel.data?.hidden,\n own_capabilities: event.channel?.own_capabilities ?? channel.data?.own_capabilities,\n };\n }\n break;\n case 'reaction.new':\n if (event.message && event.reaction) {\n event.message = channelState.addReaction(event.reaction, event.message);\n }\n break;\n case 'reaction.deleted':\n if (event.reaction) {\n event.message = channelState.removeReaction(event.reaction, event.message);\n }\n break;\n case 'reaction.updated':\n if (event.reaction) {\n // assuming reaction.updated is only called if enforce_unique is true\n event.message = channelState.addReaction(event.reaction, event.message, true);\n }\n break;\n case 'channel.hidden':\n channel.data = { ...channel.data, hidden: true };\n if (event.clear_history) {\n channelState.clearMessages();\n }\n break;\n case 'channel.visible':\n channel.data = { ...channel.data, hidden: false };\n break;\n case 'user.banned':\n if (!event.user?.id) break;\n channelState.members[event.user.id] = {\n ...(channelState.members[event.user.id] || {}),\n shadow_banned: !!event.shadow,\n banned: !event.shadow,\n user: { ...(channelState.members[event.user.id]?.user || {}), ...event.user },\n };\n break;\n case 'user.unbanned':\n if (!event.user?.id) break;\n channelState.members[event.user.id] = {\n ...(channelState.members[event.user.id] || {}),\n shadow_banned: false,\n banned: false,\n user: { ...(channelState.members[event.user.id]?.user || {}), ...event.user },\n };\n break;\n default:\n }\n\n // any event can send over the online count\n if (event.watcher_count !== undefined) {\n channel.state.watcher_count = event.watcher_count;\n }\n }\n\n _callChannelListeners = (event: Event<StreamChatGenerics>) => {\n const channel = this;\n // gather and call the listeners\n const listeners = [];\n if (channel.listeners.all) {\n listeners.push(...channel.listeners.all);\n }\n if (channel.listeners[event.type]) {\n listeners.push(...channel.listeners[event.type]);\n }\n\n // call the event and send it to the listeners\n for (const listener of listeners) {\n if (typeof listener !== 'string') {\n listener(event);\n }\n }\n };\n\n /**\n * _channelURL - Returns the channel url\n *\n * @return {string} The channel url\n */\n _channelURL = () => {\n if (!this.id) {\n throw new Error('channel id is not defined');\n }\n return `${this.getClient().baseURL}/channels/${encodeURIComponent(this.type)}/${encodeURIComponent(this.id)}`;\n };\n\n _checkInitialized() {\n if (!this.initialized && !this.offlineMode && !this.getClient()._isUsingServerAuth()) {\n throw Error(\n `Channel ${this.cid} hasn't been initialized yet. Make sure to call .watch() and wait for it to resolve`,\n );\n }\n }\n\n // eslint-disable-next-line sonarjs/cognitive-complexity\n _initializeState(\n state: ChannelAPIResponse<StreamChatGenerics>,\n messageSetToAddToIfDoesNotExist: MessageSetType = 'latest',\n ) {\n const { state: clientState, user, userID } = this.getClient();\n\n // add the members and users\n if (state.members) {\n this._hydrateMembers({ members: state.members });\n\n for (const member of state.members) {\n if (member.user) {\n clientState.updateUserReference(member.user, this.cid);\n }\n }\n }\n\n this.state.membership = state.membership || {};\n\n const messages = state.messages || [];\n if (!this.state.messages) {\n this.state.initMessages();\n }\n const { messageSet } = this.state.addMessagesSorted(messages, false, true, true, messageSetToAddToIfDoesNotExist);\n\n if (!this.state.pinnedMessages) {\n this.state.pinnedMessages = [];\n }\n this.state.addPinnedMessages(state.pinned_messages || []);\n if (state.pending_messages) {\n this.state.pending_messages = state.pending_messages;\n }\n if (state.watcher_count !== undefined) {\n this.state.watcher_count = state.watcher_count;\n }\n // convert the arrays into objects for easier syncing...\n if (state.watchers) {\n for (const watcher of state.watchers) {\n if (watcher) {\n clientState.updateUserReference(watcher, this.cid);\n this.state.watchers[watcher.id] = watcher;\n }\n }\n }\n\n // initialize read state to last message or current time if the channel is empty\n // if the user is a member, this value will be overwritten later on otherwise this ensures\n // that everything up to this point is not marked as unread\n if (userID != null) {\n const last_read = this.state.last_message_at || new Date();\n if (user) {\n this.state.read[user.id] = {\n user,\n last_read,\n unread_messages: 0,\n };\n }\n }\n\n // apply read state if part of the state\n if (state.read) {\n for (const read of state.read) {\n this.state.read[read.user.id] = {\n last_read: new Date(read.last_read),\n last_read_message_id: read.last_read_message_id,\n unread_messages: read.unread_messages ?? 0,\n user: read.user,\n };\n\n if (read.user.id === user?.id) {\n this.state.unreadCount = this.state.read[read.user.id].unread_messages;\n }\n }\n }\n\n return {\n messageSet,\n };\n }\n\n _extendEventWithOwnReactions(event: Event<StreamChatGenerics>) {\n if (!event.message) {\n return;\n }\n const message = this.state.findMessage(event.message.id, event.message.parent_id);\n if (message) {\n event.message.own_reactions = message.own_reactions;\n }\n }\n\n _hydrateMembers({\n members,\n overrideCurrentState = true,\n }: {\n members: ChannelMemberResponse<StreamChatGenerics>[];\n /**\n * If set to `true` then `ChannelState.members` will be overriden with the newly\n * provided `members`, setting this property to `false` will merge current `ChannelState.members`\n * object with the newly provided `members`\n * (new members with the same `userId` will replace the old ones).\n */\n overrideCurrentState?: boolean;\n }) {\n const newMembersById = members.reduce<ChannelState<StreamChatGenerics>['members']>((membersById, member) => {\n if (member.user) {\n membersById[member.user.id] = member;\n }\n return membersById;\n }, {});\n\n if (overrideCurrentState) {\n this.state.members = newMembersById;\n } else if (!overrideCurrentState && members.length) {\n this.state.members = {\n ...this.state.members,\n ...newMembersById,\n };\n }\n }\n\n _disconnect() {\n this._client.logger('info', `channel:disconnect() - Disconnecting the channel ${this.cid}`, {\n tags: ['connection', 'channel'],\n channel: this,\n });\n\n this.disconnected = true;\n this.state.setIsUpToDate(false);\n }\n}\n","import { UserResponse, ExtendableGenerics, DefaultGenerics } from './types';\nimport { StreamChat } from './client';\n\n/**\n * ClientState - A container class for the client state.\n */\nexport class ClientState<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> {\n private client: StreamChat<StreamChatGenerics>;\n users: {\n [key: string]: UserResponse<StreamChatGenerics>;\n };\n userChannelReferences: { [key: string]: { [key: string]: boolean } };\n constructor({ client }: { client: StreamChat<StreamChatGenerics> }) {\n // show the status for a certain user...\n // ie online, offline etc\n this.client = client;\n this.users = {};\n // store which channels contain references to the specified user...\n this.userChannelReferences = {};\n }\n\n updateUsers(users: UserResponse<StreamChatGenerics>[]) {\n for (const user of users) {\n this.updateUser(user);\n }\n }\n\n updateUser(user?: UserResponse<StreamChatGenerics>) {\n if (user != null && this.client._cacheEnabled()) {\n this.users[user.id] = user;\n }\n }\n\n updateUserReference(user: UserResponse<StreamChatGenerics>, channelID: string) {\n if (user == null || !this.client._cacheEnabled()) {\n return;\n }\n this.updateUser(user);\n if (!this.userChannelReferences[user.id]) {\n this.userChannelReferences[user.id] = {};\n }\n this.userChannelReferences[user.id][channelID] = true;\n }\n\n deleteAllChannelReference(channelID: string) {\n for (const userID in this.userChannelReferences) {\n delete this.userChannelReferences[userID][channelID];\n }\n }\n}\n","import axios from 'axios';\nimport { StableWSConnection } from './connection';\nimport { randomId, sleep } from './utils';\n\nexport type InsightTypes = 'ws_fatal' | 'ws_success_after_failure' | 'http_hi_failed';\nexport class InsightMetrics {\n connectionStartTimestamp: number | null;\n wsConsecutiveFailures: number;\n wsTotalFailures: number;\n instanceClientId: string;\n\n constructor() {\n this.connectionStartTimestamp = null;\n this.wsTotalFailures = 0;\n this.wsConsecutiveFailures = 0;\n this.instanceClientId = randomId();\n }\n}\n\n/**\n * postInsights is not supposed to be used by end users directly within chat application, and thus is kept isolated\n * from all the client/connection code/logic.\n *\n * @param insightType\n * @param insights\n */\nexport const postInsights = async (insightType: InsightTypes, insights: Record<string, unknown>) => {\n const maxAttempts = 3;\n for (let i = 0; i < maxAttempts; i++) {\n try {\n await axios.post(`https://chat-insights.getstream.io/insights/${insightType}`, insights);\n } catch (e) {\n await sleep((i + 1) * 3000);\n continue;\n }\n break;\n }\n};\n\nexport function buildWsFatalInsight(connection: StableWSConnection, event: Record<string, unknown>) {\n return {\n ...event,\n ...buildWsBaseInsight(connection),\n };\n}\n\nfunction buildWsBaseInsight(connection: StableWSConnection) {\n const { client } = connection;\n return {\n ready_state: connection.ws?.readyState,\n url: connection._buildUrl(),\n api_key: client.key,\n start_ts: client.insightMetrics.connectionStartTimestamp,\n end_ts: new Date().getTime(),\n auth_type: client.getAuthType(),\n token: client.tokenManager.token,\n user_id: client.userID,\n user_details: client._user,\n device: client.options.device,\n client_id: connection.connectionID,\n ws_details: connection.ws,\n ws_consecutive_failures: client.insightMetrics.wsConsecutiveFailures,\n ws_total_failures: client.insightMetrics.wsTotalFailures,\n request_id: connection.requestID,\n online: typeof navigator !== 'undefined' ? navigator?.onLine : null,\n user_agent: typeof navigator !== 'undefined' ? navigator?.userAgent : null,\n instance_client_id: client.insightMetrics.instanceClientId,\n };\n}\n\nexport function buildWsSuccessAfterFailureInsight(connection: StableWSConnection) {\n return buildWsBaseInsight(connection);\n}\n","import WebSocket from 'isomorphic-ws';\nimport {\n chatCodes,\n convertErrorToJson,\n sleep,\n retryInterval,\n randomId,\n removeConnectionEventListeners,\n addConnectionEventListeners,\n} from './utils';\nimport { buildWsFatalInsight, buildWsSuccessAfterFailureInsight, postInsights } from './insights';\nimport { ConnectAPIResponse, ConnectionOpen, ExtendableGenerics, DefaultGenerics, UR, LogLevel } from './types';\nimport { StreamChat } from './client';\n\n// Type guards to check WebSocket error type\nconst isCloseEvent = (res: WebSocket.CloseEvent | WebSocket.Data | WebSocket.ErrorEvent): res is WebSocket.CloseEvent =>\n (res as WebSocket.CloseEvent).code !== undefined;\n\nconst isErrorEvent = (res: WebSocket.CloseEvent | WebSocket.Data | WebSocket.ErrorEvent): res is WebSocket.ErrorEvent =>\n (res as WebSocket.ErrorEvent).error !== undefined;\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<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> {\n // global from constructor\n client: StreamChat<StreamChatGenerics>;\n\n // local vars\n connectionID?: string;\n connectionOpen?: ConnectAPIResponse<StreamChatGenerics>;\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?: (\n reason?: Error & { code?: string | number; isWSFailure?: boolean; StatusCode?: string | number },\n ) => void;\n requestID: string | undefined;\n resolvePromise?: (value: ConnectionOpen<StreamChatGenerics>) => void;\n totalFailures: number;\n ws?: WebSocket;\n wsID: number;\n\n constructor({ client }: { client: StreamChat<StreamChatGenerics> }) {\n /** StreamChat client */\n this.client = client;\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 /** 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\n addConnectionEventListeners(this.onlineStatusChanged);\n }\n\n _log(msg: string, extra: UR = {}, level: LogLevel = 'info') {\n this.client.logger(level, 'connection:' + msg, { tags: ['connection'], ...extra });\n }\n\n setClient(client: StreamChat<StreamChatGenerics>) {\n this.client = client;\n }\n\n /**\n * connect - Connect to the WS URL\n * the default 15s timeout allows between 2~3 tries\n * @return {ConnectAPIResponse<ChannelType, CommandType, UserType>} Promise that completes once the first health check message is received\n */\n async connect(timeout = 15000) {\n if (this.isConnecting) {\n throw Error(`You've called connect twice, can only attempt 1 connection at the time`);\n }\n\n this.isDisconnected = false;\n\n try {\n const healthCheck = await this._connect();\n this.consecutiveFailures = 0;\n\n this._log(`connect() - Established ws connection with healthcheck: ${healthCheck}`);\n } catch (error) {\n this.isHealthy = false;\n this.consecutiveFailures += 1;\n\n if (error.code === chatCodes.TOKEN_EXPIRED && !this.client.tokenManager.isStatic()) {\n this._log('connect() - WS failure due to expired token, so going to try to reload token and reconnect');\n this._reconnect({ refreshToken: true });\n } else 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\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 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) {\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 * Builds and returns the url for websocket.\n * @private\n * @returns url string\n */\n _buildUrl = () => {\n const qs = encodeURIComponent(this.client._buildWSPayload(this.requestID));\n const token = this.client.tokenManager.getToken();\n\n return `${this.client.wsBaseURL}/connect?json=${qs}&api_key=${\n this.client.key\n }&authorization=${token}&stream-auth-type=${this.client.getAuthType()}&X-Stream-Client=${this.client.getUserAgent()}`;\n };\n\n /**\n * disconnect - Disconnect the connection and doesn't recover...\n *\n */\n disconnect(timeout?: number) {\n this._log(`disconnect() - Closing the websocket 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 && this.ws.removeAllListeners) {\n this.ws.removeAllListeners();\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 && ws.close && ws.readyState === ws.OPEN) {\n isClosedPromise = new Promise((resolve) => {\n const onclose = (event: WebSocket.CloseEvent) => {\n this._log(`disconnect() - resolving isClosedPromise ${event ? 'with' : 'without'} close frame`, { event });\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 seconds.\n setTimeout(onclose, timeout != null ? timeout : 1000);\n });\n\n this._log(`disconnect() - Manually closed connection by calling client.disconnect()`);\n\n ws.close(chatCodes.WS_CLOSED_SUCCESS, 'Manually closed connection by calling client.disconnect()');\n } else {\n this._log(`disconnect() - 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<ChannelType, CommandType, UserType>} Promise that completes once the first health check message is received\n */\n async _connect() {\n if (this.isConnecting || (this.isDisconnected && this.client.options.enableWSFallback)) return; // simply ignore _connect if it's currently trying to connect\n this.isConnecting = true;\n this.requestID = randomId();\n this.client.insightMetrics.connectionStartTimestamp = new Date().getTime();\n let isTokenReady = false;\n try {\n this._log(`_connect() - waiting for token`);\n await this.client.tokenManager.tokenReady();\n isTokenReady = true;\n } catch (e) {\n // token provider has failed before, so try again\n }\n\n try {\n if (!isTokenReady) {\n this._log(`_connect() - tokenProvider failed before, so going to retry`);\n await this.client.tokenManager.loadToken();\n }\n\n this._setupConnectionPromise();\n const wsURL = this._buildUrl();\n this._log(`_connect() - Connecting to ${wsURL}`, { wsURL, requestID: this.requestID });\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 this.connectionID = response.connection_id;\n if (this.client.insightMetrics.wsConsecutiveFailures > 0 && this.client.options.enableInsights) {\n postInsights(\n 'ws_success_after_failure',\n buildWsSuccessAfterFailureInsight((this as unknown) as StableWSConnection),\n );\n this.client.insightMetrics.wsConsecutiveFailures = 0;\n }\n return response;\n }\n } catch (err) {\n this.isConnecting = false;\n this._log(`_connect() - Error - `, err);\n if (this.client.options.enableInsights) {\n this.client.insightMetrics.wsConsecutiveFailures++;\n this.client.insightMetrics.wsTotalFailures++;\n\n const insights = buildWsFatalInsight((this as unknown) as StableWSConnection, convertErrorToJson(err as Error));\n postInsights?.('ws_fatal', insights);\n }\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(options: { interval?: number; refreshToken?: boolean } = {}): Promise<void> {\n this._log('_reconnect() - Initiating the reconnect');\n\n // only allow 1 connection at the time\n if (this.isConnecting || this.isHealthy) {\n this._log('_reconnect() - 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 this._log('_reconnect() - Abort (2) since already connecting or healthy');\n return;\n }\n\n if (this.isDisconnected && this.client.options.enableWSFallback) {\n this._log('_reconnect() - Abort (3) since disconnect() is called');\n return;\n }\n\n this._log('_reconnect() - Destroying current WS connection');\n\n // cleanup the old connection\n this._destroyCurrentWSConnection();\n\n if (options.refreshToken) {\n await this.client.tokenManager.loadToken();\n }\n\n try {\n await this._connect();\n this._log('_reconnect() - Waiting for recoverCallBack');\n await this.client.recoverState();\n this._log('_reconnect() - Finished recoverCallBack');\n\n this.consecutiveFailures = 0;\n } catch (error) {\n this.isHealthy = false;\n this.consecutiveFailures += 1;\n if (error.code === chatCodes.TOKEN_EXPIRED && !this.client.tokenManager.isStatic()) {\n this._log('_reconnect() - WS failure due to expired token, so going to try to reload token and reconnect');\n\n return 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 this._log('_reconnect() - WS failure, so going to try to reconnect');\n\n this._reconnect();\n }\n }\n this._log('_reconnect() - == 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 if (event.type === 'offline') {\n // mark the connection as down\n this._log('onlineStatusChanged() - Status changing to offline');\n this._setHealth(false);\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 this._log(`onlineStatusChanged() - Status changing to online. isHealthy: ${this.isHealthy}`);\n if (!this.isHealthy) {\n this._reconnect({ interval: 10 });\n }\n }\n };\n\n onopen = (wsID: number) => {\n if (this.wsID !== wsID) return;\n\n this._log('onopen() - onopen callback', { wsID });\n };\n\n onmessage = (wsID: number, event: WebSocket.MessageEvent) => {\n if (this.wsID !== wsID) return;\n\n this._log('onmessage() - onmessage callback', { event, wsID });\n const data = typeof event.data === 'string' ? JSON.parse(event.data) : null;\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) {\n this.isResolved = true;\n if (data.error) {\n this.rejectPromise?.(this._errorFromWSEvent(data, false));\n return;\n }\n\n this.resolvePromise?.(data);\n this._setHealth(true);\n }\n\n // trigger the event..\n this.lastEvent = new Date();\n\n if (data && data.type === 'health.check') {\n this.scheduleNextPing();\n }\n\n this.client.handleEvent(event);\n this.scheduleConnectionCheck();\n };\n\n onclose = (wsID: number, event: WebSocket.CloseEvent) => {\n if (this.wsID !== wsID) return;\n\n this._log('onclose() - onclose callback - ' + event.code, { event, wsID });\n\n if (event.code === chatCodes.WS_CLOSED_SUCCESS) {\n // this is a permanent error raised by stream..\n // usually caused by invalid auth details\n const error = new Error(`WS connection reject with error ${event.reason}`) as Error & WebSocket.CloseEvent;\n\n error.reason = event.reason;\n error.code = event.code;\n error.wasClean = event.wasClean;\n error.target = event.target;\n\n this.rejectPromise?.(error);\n this._log(`onclose() - WS connection reject with error ${event.reason}`, { event });\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 this._log(`onclose() - WS connection closed. Calling reconnect ...`, { event });\n\n // reconnect if its an abnormal failure\n this._reconnect();\n }\n };\n\n onerror = (wsID: number, event: WebSocket.ErrorEvent) => {\n if (this.wsID !== wsID) return;\n\n this.consecutiveFailures += 1;\n this.totalFailures += 1;\n this._setHealth(false);\n this.isConnecting = false;\n\n this.rejectPromise?.(this._errorFromWSEvent(event));\n this._log(`onerror() - WS connection resulted into error`, { event });\n\n 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 *\n */\n _setHealth = (healthy: boolean) => {\n if (healthy === this.isHealthy) return;\n\n this.isHealthy = healthy;\n\n if (this.isHealthy) {\n this.client.dispatchEvent({ type: 'connection.changed', online: this.isHealthy });\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.client.dispatchEvent({ type: 'connection.changed', online: this.isHealthy });\n }, 5000);\n };\n\n /**\n * _errorFromWSEvent - Creates an error object for the WS event\n *\n */\n _errorFromWSEvent = (event: WebSocket.CloseEvent | WebSocket.Data | WebSocket.ErrorEvent, isWSFailure = true) => {\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._log(`_errorFromWSEvent() - WS failed with code ${code}`, { event }, 'warn');\n\n const error = new Error(`WS failed with code ${code} and reason - ${message}`) 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 this?.ws?.removeAllListeners();\n this?.ws?.close();\n } catch (e) {\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<ConnectionOpen<StreamChatGenerics>>((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.client.clientID }];\n // try to send on the connection\n try {\n this.ws?.send(JSON.stringify(data));\n } catch (e) {\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 (this.lastEvent && now.getTime() - this.lastEvent.getTime() > this.connectionCheckTimeout) {\n this._log('scheduleConnectionCheck - going to reconnect');\n this._setHealth(false);\n this._reconnect();\n }\n }, this.connectionCheckTimeout);\n };\n}\n","export default null;","export default null;","import jwt, { Secret, SignOptions } from 'jsonwebtoken';\nimport crypto from 'crypto';\nimport { encodeBase64, decodeBase64 } from './base64';\nimport { UR } from './types';\n\n/**\n * Creates the JWT token that can be used for a UserSession\n * @method JWTUserToken\n * @memberof signing\n * @private\n * @param {Secret} apiSecret - API Secret key\n * @param {string} userId - The user_id key in the JWT payload\n * @param {UR} [extraData] - Extra that should be part of the JWT token\n * @param {SignOptions} [jwtOptions] - Options that can be past to jwt.sign\n * @return {string} JWT Token\n */\nexport function JWTUserToken(apiSecret: Secret, userId: string, extraData: UR = {}, jwtOptions: SignOptions = {}) {\n if (typeof userId !== 'string') {\n throw new TypeError('userId should be a string');\n }\n\n const payload: { user_id: string } & UR = {\n user_id: userId,\n ...extraData,\n };\n\n // make sure we return a clear error when jwt is shimmed (ie. browser build)\n if (jwt == null || jwt.sign == null) {\n throw Error(\n `Unable to find jwt crypto, if you are getting this error is probably because you are trying to generate tokens on browser or React Native (or other environment where crypto functions are not available). Please Note: token should only be generated server-side.`,\n );\n }\n\n const opts: SignOptions = Object.assign({ algorithm: 'HS256', noTimestamp: true }, jwtOptions);\n\n if (payload.iat) {\n opts.noTimestamp = false;\n }\n return jwt.sign(payload, apiSecret, opts);\n}\n\nexport function JWTServerToken(apiSecret: Secret, jwtOptions: SignOptions = {}) {\n const payload = {\n server: true,\n };\n\n const opts: SignOptions = Object.assign({ algorithm: 'HS256', noTimestamp: true }, jwtOptions);\n return jwt.sign(payload, apiSecret, opts);\n}\n\nexport function UserFromToken(token: string) {\n const fragments = token.split('.');\n if (fragments.length !== 3) {\n return '';\n }\n const b64Payload = fragments[1];\n const payload = decodeBase64(b64Payload);\n const data = JSON.parse(payload);\n return data.user_id as string;\n}\n\n/**\n *\n * @param {string} userId the id of the user\n * @return {string}\n */\nexport function DevToken(userId: string) {\n return [\n 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9', //{\"alg\": \"HS256\", \"typ\": \"JWT\"}\n encodeBase64(JSON.stringify({ user_id: userId })),\n 'devtoken', // hardcoded signature\n ].join('.');\n}\n\n/**\n *\n * @param {string | Buffer} body the signed message\n * @param {string} secret the shared secret used to generate the signature (Stream API secret)\n * @param {string} signature the signature to validate\n * @return {boolean}\n */\nexport function CheckSignature(body: string | Buffer, secret: string, signature: string) {\n const key = Buffer.from(secret, 'utf8');\n const hash = crypto.createHmac('sha256', key).update(body).digest('hex');\n\n try {\n return crypto.timingSafeEqual(Buffer.from(hash), Buffer.from(signature));\n } catch {\n return false;\n }\n}\n","import { Secret } from 'jsonwebtoken';\nimport { UserFromToken, JWTServerToken, JWTUserToken } from './signing';\nimport { isFunction } from './utils';\nimport { TokenOrProvider, ExtendableGenerics, DefaultGenerics, UserResponse } from './types';\n\n/**\n * TokenManager\n *\n * Handles all the operations around user token.\n */\nexport class TokenManager<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> {\n loadTokenPromise: Promise<string> | null;\n type: 'static' | 'provider';\n secret?: Secret;\n token?: string;\n tokenProvider?: TokenOrProvider;\n user?: UserResponse<StreamChatGenerics>;\n /**\n * Constructor\n *\n * @param {Secret} secret\n */\n constructor(secret?: Secret) {\n this.loadTokenPromise = null;\n if (secret) {\n this.secret = secret;\n }\n\n this.type = 'static';\n\n if (this.secret) {\n this.token = JWTServerToken(this.secret);\n }\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\n * @param {UserResponse<StreamChatGenerics>} user\n */\n setTokenOrProvider = async (tokenOrProvider: TokenOrProvider, user: UserResponse<StreamChatGenerics>) => {\n this.validateToken(tokenOrProvider, user);\n this.user = user;\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 if (!tokenOrProvider && this.user && this.secret) {\n this.token = JWTUserToken(this.secret, user.id, {}, {});\n this.type = 'static';\n }\n\n await this.loadToken();\n };\n\n /**\n * Resets the token manager.\n * Useful for client disconnection or switching user.\n */\n reset = () => {\n this.token = undefined;\n this.tokenProvider = undefined;\n this.type = 'static';\n this.user = undefined;\n this.loadTokenPromise = null;\n };\n\n // Validates the user token.\n validateToken = (tokenOrProvider: TokenOrProvider, user: UserResponse<StreamChatGenerics>) => {\n // allow empty token for anon user\n if (user && user.anon && !tokenOrProvider) return;\n\n // Don't allow empty token for non-server side client.\n if (!this.secret && !tokenOrProvider) {\n throw new Error('User token can not be empty');\n }\n\n if (tokenOrProvider && typeof tokenOrProvider !== 'string' && !isFunction(tokenOrProvider)) {\n throw new Error('user token should either be a string or a function');\n }\n\n if (typeof tokenOrProvider === 'string') {\n // Allow empty token for anonymous users\n if (user.anon && tokenOrProvider === '') return;\n\n const tokenUserId = UserFromToken(tokenOrProvider);\n if (tokenOrProvider != null && (tokenUserId == null || tokenUserId === '' || tokenUserId !== user.id)) {\n throw new Error('userToken does not have a user_id or is not matching with user.id');\n }\n }\n };\n\n // Resolves when token is ready. This function is simply to check if loadToken is in progress, in which\n // case a function should wait.\n tokenReady = () => this.loadTokenPromise;\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 // eslint-disable-next-line no-async-promise-executor\n this.loadTokenPromise = new Promise(async (resolve, reject) => {\n if (this.type === 'static') {\n return resolve(this.token as string);\n }\n\n if (this.tokenProvider && typeof this.tokenProvider !== 'string') {\n try {\n this.token = await this.tokenProvider();\n } catch (e) {\n return reject(new Error(`Call to tokenProvider failed with message: ${e}`));\n }\n resolve(this.token);\n }\n });\n\n return this.loadTokenPromise;\n };\n\n // Returns a current token\n getToken = () => {\n if (this.token) {\n return this.token;\n }\n\n if (this.user && this.user.anon && !this.token) {\n return this.token;\n }\n\n if (this.secret) {\n return JWTServerToken(this.secret);\n }\n\n throw new Error(\n `Both secret and user tokens are not set. Either client.connectUser wasn't called or client.disconnect was called`,\n );\n };\n\n isStatic = () => this.type === 'static';\n}\n","import { AxiosResponse } from 'axios';\nimport { APIErrorResponse } from './types';\n\nexport const APIErrorCodes: Record<string, { name: string; retryable: boolean }> = {\n '-1': { name: 'InternalSystemError', retryable: true },\n '2': { name: 'AccessKeyError', retryable: false },\n '3': { name: 'AuthenticationFailedError', retryable: true },\n '4': { name: 'InputError', retryable: false },\n '6': { name: 'DuplicateUsernameError', retryable: false },\n '9': { name: 'RateLimitError', retryable: true },\n '16': { name: 'DoesNotExistError', retryable: false },\n '17': { name: 'NotAllowedError', retryable: false },\n '18': { name: 'EventNotSupportedError', retryable: false },\n '19': { name: 'ChannelFeatureNotSupportedError', retryable: false },\n '20': { name: 'MessageTooLongError', retryable: false },\n '21': { name: 'MultipleNestingLevelError', retryable: false },\n '22': { name: 'PayloadTooBigError', retryable: false },\n '23': { name: 'RequestTimeoutError', retryable: true },\n '24': { name: 'MaxHeaderSizeExceededError', retryable: false },\n '40': { name: 'AuthErrorTokenExpired', retryable: false },\n '41': { name: 'AuthErrorTokenNotValidYet', retryable: false },\n '42': { name: 'AuthErrorTokenUsedBeforeIssuedAt', retryable: false },\n '43': { name: 'AuthErrorTokenSignatureInvalid', retryable: false },\n '44': { name: 'CustomCommandEndpointMissingError', retryable: false },\n '45': { name: 'CustomCommandEndpointCallError', retryable: true },\n '46': { name: 'ConnectionIDNotFoundError', retryable: false },\n '60': { name: 'CoolDownError', retryable: true },\n '69': { name: 'ErrWrongRegion', retryable: false },\n '70': { name: 'ErrQueryChannelPermissions', retryable: false },\n '71': { name: 'ErrTooManyConnections', retryable: true },\n '99': { name: 'AppSuspendedError', retryable: false },\n};\n\ntype APIError = Error & { code: number; isWSFailure?: boolean };\n\nexport function isAPIError(error: Error): error is APIError {\n return (error as APIError).code !== undefined;\n}\n\nexport function isErrorRetryable(error: APIError) {\n if (!error.code) return false;\n const err = APIErrorCodes[`${error.code}`];\n if (!err) return false;\n return err.retryable;\n}\n\nexport function isConnectionIDError(error: APIError) {\n return error.code === 46; // ConnectionIDNotFoundError\n}\n\nexport function isWSFailure(err: APIError): boolean {\n if (typeof err.isWSFailure === 'boolean') {\n return err.isWSFailure;\n }\n\n try {\n return JSON.parse(err.message).isWSFailure;\n } catch (_) {\n return false;\n }\n}\n\nexport function isErrorResponse(res: AxiosResponse<unknown>): res is AxiosResponse<APIErrorResponse> {\n return !res.status || res.status < 200 || 300 <= res.status;\n}\n","import axios, { AxiosRequestConfig, CancelTokenSource } from 'axios';\nimport { StreamChat } from './client';\nimport { addConnectionEventListeners, removeConnectionEventListeners, retryInterval, sleep } from './utils';\nimport { isAPIError, isConnectionIDError, isErrorRetryable } from './errors';\nimport { ConnectionOpen, Event, UR, ExtendableGenerics, DefaultGenerics, LogLevel } from './types';\n\nexport enum ConnectionState {\n Closed = 'CLOSED',\n Connected = 'CONNECTED',\n Connecting = 'CONNECTING',\n Disconnected = 'DISCONNECTED',\n Init = 'INIT',\n}\n\nexport class WSConnectionFallback<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> {\n client: StreamChat<StreamChatGenerics>;\n state: ConnectionState;\n consecutiveFailures: number;\n connectionID?: string;\n cancelToken?: CancelTokenSource;\n\n constructor({ client }: { client: StreamChat<StreamChatGenerics> }) {\n this.client = client;\n this.state = ConnectionState.Init;\n this.consecutiveFailures = 0;\n\n addConnectionEventListeners(this._onlineStatusChanged);\n }\n\n _log(msg: string, extra: UR = {}, level: LogLevel = 'info') {\n this.client.logger(level, 'WSConnectionFallback:' + msg, { tags: ['connection_fallback', 'connection'], ...extra });\n }\n\n _setState(state: ConnectionState) {\n this._log(`_setState() - ${state}`);\n\n // transition from connecting => connected\n if (this.state === ConnectionState.Connecting && state === ConnectionState.Connected) {\n this.client.dispatchEvent({ type: 'connection.changed', online: true });\n }\n\n if (state === ConnectionState.Closed || state === ConnectionState.Disconnected) {\n this.client.dispatchEvent({ type: 'connection.changed', online: false });\n }\n\n this.state = state;\n }\n\n /** @private */\n _onlineStatusChanged = (event: { type: string }) => {\n this._log(`_onlineStatusChanged() - ${event.type}`);\n\n if (event.type === 'offline') {\n this._setState(ConnectionState.Closed);\n this.cancelToken?.cancel('disconnect() is called');\n this.cancelToken = undefined;\n return;\n }\n\n if (event.type === 'online' && this.state === ConnectionState.Closed) {\n this.connect(true);\n }\n };\n\n /** @private */\n _req = async <T = UR>(params: UR, config: AxiosRequestConfig, retry: boolean): Promise<T> => {\n if (!this.cancelToken && !params.close) {\n this.cancelToken = axios.CancelToken.source();\n }\n\n try {\n const res = await this.client.doAxiosRequest<T>(\n 'get',\n (this.client.baseURL as string).replace(':3030', ':8900') + '/longpoll', // replace port if present for testing with local API\n undefined,\n {\n config: { ...config, cancelToken: this.cancelToken?.token },\n params,\n },\n );\n\n this.consecutiveFailures = 0; // always reset in case of no error\n return res;\n } catch (err) {\n this.consecutiveFailures += 1;\n\n if (retry && isErrorRetryable(err)) {\n this._log(`_req() - Retryable error, retrying request`);\n await sleep(retryInterval(this.consecutiveFailures));\n return this._req<T>(params, config, retry);\n }\n\n throw err;\n }\n };\n\n /** @private */\n _poll = async () => {\n while (this.state === ConnectionState.Connected) {\n try {\n const data = await this._req<{\n events: Event<StreamChatGenerics>[];\n }>({}, { timeout: 30000 }, true); // 30s => API responds in 20s if there is no event\n\n if (data.events?.length) {\n for (let i = 0; i < data.events.length; i++) {\n this.client.dispatchEvent(data.events[i]);\n }\n }\n } catch (err) {\n if (axios.isCancel(err)) {\n this._log(`_poll() - axios canceled request`);\n return;\n }\n\n /** client.doAxiosRequest will take care of TOKEN_EXPIRED error */\n\n if (isConnectionIDError(err)) {\n this._log(`_poll() - ConnectionID error, connecting without ID...`);\n this._setState(ConnectionState.Disconnected);\n this.connect(true);\n return;\n }\n\n if (isAPIError(err) && !isErrorRetryable(err)) {\n this._setState(ConnectionState.Closed);\n return;\n }\n\n await sleep(retryInterval(this.consecutiveFailures));\n }\n }\n };\n\n /**\n * connect try to open a longpoll request\n * @param reconnect should be false for first call and true for subsequent calls to keep the connection alive and call recoverState\n */\n connect = async (reconnect = false) => {\n if (this.state === ConnectionState.Connecting) {\n this._log('connect() - connecting already in progress', { reconnect }, 'warn');\n return;\n }\n if (this.state === ConnectionState.Connected) {\n this._log('connect() - already connected and polling', { reconnect }, 'warn');\n return;\n }\n\n this._setState(ConnectionState.Connecting);\n this.connectionID = undefined; // connect should be sent with empty connection_id so API creates one\n try {\n const { event } = await this._req<{ event: ConnectionOpen<StreamChatGenerics> }>(\n { json: this.client._buildWSPayload() },\n { timeout: 8000 }, // 8s\n reconnect,\n );\n\n this._setState(ConnectionState.Connected);\n this.connectionID = event.connection_id;\n // @ts-expect-error\n this.client.dispatchEvent(event);\n this._poll();\n if (reconnect) {\n this.client.recoverState();\n }\n return event;\n } catch (err) {\n this._setState(ConnectionState.Closed);\n throw err;\n }\n };\n\n /**\n * isHealthy checks if there is a connectionID and connection is in Connected state\n */\n isHealthy = () => {\n return !!this.connectionID && this.state === ConnectionState.Connected;\n };\n\n disconnect = async (timeout = 2000) => {\n removeConnectionEventListeners(this._onlineStatusChanged);\n\n this._setState(ConnectionState.Disconnected);\n this.cancelToken?.cancel('disconnect() is called');\n this.cancelToken = undefined;\n\n const connection_id = this.connectionID;\n this.connectionID = undefined;\n\n try {\n await this._req({ close: true, connection_id }, { timeout }, false);\n this._log(`disconnect() - Closed connectionID`);\n } catch (err) {\n this._log(`disconnect() - Failed`, { err }, 'error');\n }\n };\n}\n","import { StreamChat } from './client';\nimport {\n DefaultGenerics,\n ExtendableGenerics,\n QuerySegmentTargetsFilter,\n SegmentData,\n SegmentResponse,\n SortParam,\n} from './types';\n\ntype SegmentType = 'user' | 'channel';\n\ntype SegmentUpdatableFields = {\n description?: string;\n filter?: {};\n name?: string;\n};\n\nexport class Segment<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> {\n type: SegmentType;\n id: string | null;\n client: StreamChat<StreamChatGenerics>;\n data?: SegmentData | SegmentResponse;\n\n constructor(client: StreamChat<StreamChatGenerics>, type: SegmentType, id: string | null, data?: SegmentData) {\n this.client = client;\n this.type = type;\n this.id = id;\n this.data = data;\n }\n\n async create() {\n const body = {\n name: this.data?.name,\n filter: this.data?.filter,\n description: this.data?.description,\n all_sender_channels: this.data?.all_sender_channels,\n all_users: this.data?.all_users,\n };\n\n return this.client.createSegment(this.type, this.id, body);\n }\n\n verifySegmentId() {\n if (!this.id) {\n throw new Error(\n 'Segment id is missing. Either create the segment using segment.create() or set the id during instantiation - const segment = client.segment(id)',\n );\n }\n }\n\n async get() {\n this.verifySegmentId();\n return this.client.getSegment(this.id as string);\n }\n\n async update(data: Partial<SegmentUpdatableFields>) {\n this.verifySegmentId();\n\n return this.client.updateSegment(this.id as string, data);\n }\n\n async addTargets(targets: string[]) {\n this.verifySegmentId();\n return this.client.addSegmentTargets(this.id as string, targets);\n }\n\n async removeTargets(targets: string[]) {\n this.verifySegmentId();\n return this.client.removeSegmentTargets(this.id as string, targets);\n }\n\n async delete() {\n this.verifySegmentId();\n return this.client.deleteSegment(this.id as string);\n }\n\n async targetExists(targetId: string) {\n this.verifySegmentId();\n return this.client.segmentTargetExists(this.id as string, targetId);\n }\n\n async queryTargets(filter: QuerySegmentTargetsFilter | null = {}, sort: SortParam[] | null | [] = [], options = {}) {\n this.verifySegmentId();\n\n return this.client.querySegmentTargets(this.id as string, filter, sort, options);\n }\n}\n","import { AxiosRequestConfig, AxiosResponse } from 'axios';\nimport { StableWSConnection } from './connection';\nimport { EVENT_MAP } from './events';\nimport { Role } from './permissions';\n\n/**\n * Utility Types\n */\n\nexport type ArrayOneOrMore<T> = {\n 0: T;\n} & Array<T>;\n\nexport type ArrayTwoOrMore<T> = {\n 0: T;\n 1: T;\n} & Array<T>;\n\nexport type KnownKeys<T> = {\n [K in keyof T]: string extends K ? never : number extends K ? never : K;\n} extends { [_ in keyof T]: infer U }\n ? U\n : never;\n\nexport type RequireAtLeastOne<T> = {\n [K in keyof T]-?: Required<Pick<T, K>> & Partial<Pick<T, Exclude<keyof T, K>>>;\n}[keyof T];\n\nexport type RequireOnlyOne<T, Keys extends keyof T = keyof T> = Pick<T, Exclude<keyof T, Keys>> &\n {\n [K in Keys]-?: Required<Pick<T, K>> & Partial<Record<Exclude<Keys, K>, undefined>>;\n }[Keys];\n\n/* Unknown Record */\nexport type UR = Record<string, unknown>;\nexport type UnknownType = UR; //alias to avoid breaking change\n\nexport type DefaultGenerics = {\n attachmentType: UR;\n channelType: UR;\n commandType: LiteralStringForUnion;\n eventType: UR;\n memberType: UR;\n messageType: UR;\n pollOptionType: UR;\n pollType: UR;\n reactionType: UR;\n userType: UR;\n};\n\nexport type ExtendableGenerics = {\n attachmentType: UR;\n channelType: UR;\n commandType: string;\n eventType: UR;\n memberType: UR;\n messageType: UR;\n pollOptionType: UR;\n pollType: UR;\n reactionType: UR;\n userType: UR;\n};\n\nexport type Unpacked<T> = T extends (infer U)[]\n ? U // eslint-disable-next-line @typescript-eslint/no-explicit-any\n : T extends (...args: any[]) => infer U\n ? U\n : T extends Promise<infer U>\n ? U\n : T;\n\n/**\n * Response Types\n */\n\nexport type APIResponse = {\n duration: string;\n};\n\nexport type TranslateResponse = {\n language: string;\n translated_text: string;\n};\n\nexport type AppSettingsAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n app?: {\n // TODO\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n call_types: any;\n channel_configs: Record<\n string,\n {\n reminders: boolean;\n automod?: ChannelConfigAutomod;\n automod_behavior?: ChannelConfigAutomodBehavior;\n automod_thresholds?: ChannelConfigAutomodThresholds;\n blocklist_behavior?: ChannelConfigAutomodBehavior;\n commands?: CommandVariants<StreamChatGenerics>[];\n connect_events?: boolean;\n created_at?: string;\n custom_events?: boolean;\n mark_messages_pending?: boolean;\n max_message_length?: number;\n message_retention?: string;\n mutes?: boolean;\n name?: string;\n polls?: boolean;\n push_notifications?: boolean;\n quotes?: boolean;\n reactions?: boolean;\n read_events?: boolean;\n replies?: boolean;\n search?: boolean;\n typing_events?: boolean;\n updated_at?: string;\n uploads?: boolean;\n url_enrichment?: boolean;\n }\n >;\n reminders_interval: number;\n agora_options?: AgoraOptions | null;\n async_moderation_config?: AsyncModerationOptions;\n async_url_enrich_enabled?: boolean;\n auto_translation_enabled?: boolean;\n before_message_send_hook_url?: string;\n campaign_enabled?: boolean;\n cdn_expiration_seconds?: number;\n custom_action_handler_url?: string;\n datadog_info?: {\n api_key: string;\n site: string;\n enabled?: boolean;\n };\n disable_auth_checks?: boolean;\n disable_permissions_checks?: boolean;\n enforce_unique_usernames?: 'no' | 'app' | 'team';\n file_upload_config?: FileUploadConfig;\n geofences?: Array<{\n country_codes: Array<string>;\n description: string;\n name: string;\n type: string;\n }>;\n grants?: Record<string, string[]>;\n hms_options?: HMSOptions | null;\n image_moderation_enabled?: boolean;\n image_upload_config?: FileUploadConfig;\n multi_tenant_enabled?: boolean;\n name?: string;\n organization?: string;\n permission_version?: string;\n policies?: Record<string, Policy[]>;\n poll_enabled?: boolean;\n push_notifications?: {\n offline_only: boolean;\n version: string;\n apn?: APNConfig;\n firebase?: FirebaseConfig;\n huawei?: HuaweiConfig;\n providers?: PushProviderConfig[];\n xiaomi?: XiaomiConfig;\n };\n revoke_tokens_issued_before?: string | null;\n search_backend?: 'disabled' | 'elasticsearch' | 'postgres';\n sns_key?: string;\n sns_secret?: string;\n sns_topic_arn?: string;\n sqs_key?: string;\n sqs_secret?: string;\n sqs_url?: string;\n suspended?: boolean;\n suspended_explanation?: string;\n user_search_disallowed_roles?: string[] | null;\n video_provider?: string;\n webhook_events?: Array<string>;\n webhook_url?: string;\n };\n};\n\nexport type ModerationResult = {\n action: string;\n created_at: string;\n message_id: string;\n updated_at: string;\n user_bad_karma: boolean;\n user_karma: number;\n blocked_word?: string;\n blocklist_name?: string;\n moderated_by?: string;\n};\n\nexport type AutomodDetails = {\n action?: string;\n image_labels?: Array<string>;\n original_message_type?: string;\n result?: ModerationResult;\n};\n\nexport type FlagDetails = {\n automod?: AutomodDetails;\n};\n\nexport type Flag<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n created_at: string;\n created_by_automod: boolean;\n updated_at: string;\n details?: FlagDetails;\n target_message?: MessageResponse<StreamChatGenerics>;\n target_user?: UserResponse<StreamChatGenerics>;\n user?: UserResponse<StreamChatGenerics>;\n};\n\nexport type FlagsResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n flags?: Array<Flag<StreamChatGenerics>>;\n};\n\nexport type MessageFlagsResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n flags?: Array<{\n message: MessageResponse<StreamChatGenerics>;\n user: UserResponse<StreamChatGenerics>;\n approved_at?: string;\n created_at?: string;\n created_by_automod?: boolean;\n moderation_result?: ModerationResult;\n rejected_at?: string;\n reviewed_at?: string;\n reviewed_by?: UserResponse<StreamChatGenerics>;\n updated_at?: string;\n }>;\n};\n\nexport type FlagReport<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n flags_count: number;\n id: string;\n message: MessageResponse<StreamChatGenerics>;\n user: UserResponse<StreamChatGenerics>;\n created_at?: string;\n details?: FlagDetails;\n first_reporter?: UserResponse<StreamChatGenerics>;\n review_result?: string;\n reviewed_at?: string;\n reviewed_by?: UserResponse<StreamChatGenerics>;\n updated_at?: string;\n};\n\nexport type FlagReportsResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n flag_reports: Array<FlagReport<StreamChatGenerics>>;\n};\n\nexport type ReviewFlagReportResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n flag_report: FlagReport<StreamChatGenerics>;\n};\n\nexport type BannedUsersResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n bans?: Array<{\n user: UserResponse<StreamChatGenerics>;\n banned_by?: UserResponse<StreamChatGenerics>;\n channel?: ChannelResponse<StreamChatGenerics>;\n expires?: string;\n ip_ban?: boolean;\n reason?: string;\n timeout?: number;\n }>;\n};\n\nexport type BlockListResponse = BlockList & {\n created_at?: string;\n type?: string;\n updated_at?: string;\n};\n\nexport type ChannelResponse<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = StreamChatGenerics['channelType'] & {\n cid: string;\n disabled: boolean;\n frozen: boolean;\n id: string;\n type: string;\n auto_translation_enabled?: boolean;\n auto_translation_language?: TranslationLanguages | '';\n config?: ChannelConfigWithInfo<StreamChatGenerics>;\n cooldown?: number;\n created_at?: string;\n created_by?: UserResponse<StreamChatGenerics> | null;\n created_by_id?: string;\n deleted_at?: string;\n hidden?: boolean;\n invites?: string[];\n joined?: boolean;\n last_message_at?: string;\n member_count?: number;\n members?: ChannelMemberResponse<StreamChatGenerics>[];\n muted?: boolean;\n name?: string;\n own_capabilities?: string[];\n team?: string;\n truncated_at?: string;\n truncated_by?: UserResponse<StreamChatGenerics>;\n truncated_by_id?: string;\n updated_at?: string;\n};\n\nexport type QueryReactionsOptions = Pager;\n\nexport type QueryReactionsAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n reactions: ReactionResponse<StreamChatGenerics>[];\n next?: string;\n};\n\nexport type QueryChannelsAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n channels: Omit<ChannelAPIResponse<StreamChatGenerics>, keyof APIResponse>[];\n};\n\nexport type QueryChannelAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse &\n ChannelAPIResponse<StreamChatGenerics>;\n\nexport type ChannelAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n channel: ChannelResponse<StreamChatGenerics>;\n members: ChannelMemberResponse<StreamChatGenerics>[];\n messages: MessageResponse<StreamChatGenerics>[];\n pinned_messages: MessageResponse<StreamChatGenerics>[];\n hidden?: boolean;\n membership?: ChannelMemberResponse<StreamChatGenerics> | null;\n pending_messages?: PendingMessageResponse<StreamChatGenerics>[];\n read?: ReadResponse<StreamChatGenerics>[];\n threads?: ThreadResponse[];\n watcher_count?: number;\n watchers?: UserResponse<StreamChatGenerics>[];\n};\n\nexport type ChannelUpdateOptions = {\n hide_history?: boolean;\n skip_push?: boolean;\n};\n\nexport type ChannelMemberAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n members: ChannelMemberResponse<StreamChatGenerics>[];\n};\n\nexport type ChannelMemberUpdates<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = StreamChatGenerics['memberType'] & {\n archived?: boolean;\n channel_role?: Role;\n pinned?: boolean;\n};\n\nexport type ChannelMemberResponse<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = StreamChatGenerics['memberType'] & {\n archived_at?: string;\n ban_expires?: string;\n banned?: boolean;\n channel_role?: Role;\n created_at?: string;\n invite_accepted_at?: string;\n invite_rejected_at?: string;\n invited?: boolean;\n is_moderator?: boolean;\n notifications_muted?: boolean;\n pinned_at?: string;\n role?: string;\n shadow_banned?: boolean;\n status?: InviteStatus;\n updated_at?: string;\n user?: UserResponse<StreamChatGenerics>;\n user_id?: string;\n};\n\nexport type PartialUpdateMemberAPIResponse<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = APIResponse & {\n channel_member: ChannelMemberResponse<StreamChatGenerics>;\n};\n\nexport type CheckPushResponse = APIResponse & {\n device_errors?: {\n [deviceID: string]: {\n error_message?: string;\n provider?: PushProvider;\n provider_name?: string;\n };\n };\n general_errors?: string[];\n rendered_apn_template?: string;\n rendered_firebase_template?: string;\n rendered_message?: {};\n skip_devices?: boolean;\n};\n\nexport type CheckSQSResponse = APIResponse & {\n status: string;\n data?: {};\n error?: string;\n};\n\nexport type CheckSNSResponse = APIResponse & {\n status: string;\n data?: {};\n error?: string;\n};\n\nexport type CommandResponse<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = Partial<CreatedAtUpdatedAt> & {\n args?: string;\n description?: string;\n name?: CommandVariants<StreamChatGenerics>;\n set?: CommandVariants<StreamChatGenerics>;\n};\n\nexport type ConnectAPIResponse<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = Promise<void | ConnectionOpen<StreamChatGenerics>>;\n\nexport type CreateChannelResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse &\n Omit<CreateChannelOptions<StreamChatGenerics>, 'client_id' | 'connection_id'> & {\n created_at: string;\n updated_at: string;\n grants?: Record<string, string[]>;\n };\n\nexport type CreateCommandResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n command: CreateCommandOptions<StreamChatGenerics> & CreatedAtUpdatedAt;\n};\n\nexport type DeleteChannelAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n channel: ChannelResponse<StreamChatGenerics>;\n};\n\nexport type DeleteCommandResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n name?: CommandVariants<StreamChatGenerics>;\n};\n\nexport type EventAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n event: Event<StreamChatGenerics>;\n};\n\nexport type ExportChannelResponse = {\n task_id: string;\n};\n\nexport type ExportUsersResponse = {\n task_id: string;\n};\n\nexport type ExportChannelStatusResponse = {\n created_at?: string;\n error?: {};\n result?: {};\n updated_at?: string;\n};\n\nexport type FlagMessageResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n flag: {\n created_at: string;\n created_by_automod: boolean;\n target_message_id: string;\n updated_at: string;\n user: UserResponse<StreamChatGenerics>;\n approved_at?: string;\n channel_cid?: string;\n details?: Object; // Any JSON\n message_user_id?: string;\n rejected_at?: string;\n reviewed_at?: string;\n reviewed_by?: string;\n };\n review_queue_item_id?: string;\n};\n\nexport type FlagUserResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n flag: {\n created_at: string;\n created_by_automod: boolean;\n target_user: UserResponse<StreamChatGenerics>;\n updated_at: string;\n user: UserResponse<StreamChatGenerics>;\n approved_at?: string;\n details?: Object; // Any JSON\n rejected_at?: string;\n reviewed_at?: string;\n reviewed_by?: string;\n };\n review_queue_item_id?: string;\n};\n\nexport type FormatMessageResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = Omit<\n MessageResponse<{\n attachmentType: StreamChatGenerics['attachmentType'];\n channelType: StreamChatGenerics['channelType'];\n commandType: StreamChatGenerics['commandType'];\n eventType: StreamChatGenerics['eventType'];\n memberType: StreamChatGenerics['memberType'];\n messageType: {};\n pollOptionType: StreamChatGenerics['pollOptionType'];\n pollType: StreamChatGenerics['pollType'];\n reactionType: StreamChatGenerics['reactionType'];\n userType: StreamChatGenerics['userType'];\n }>,\n 'created_at' | 'pinned_at' | 'updated_at' | 'deleted_at' | 'status'\n> &\n StreamChatGenerics['messageType'] & {\n created_at: Date;\n deleted_at: Date | null;\n pinned_at: Date | null;\n status: string;\n updated_at: Date;\n };\n\nexport type GetChannelTypeResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse &\n Omit<CreateChannelOptions<StreamChatGenerics>, 'client_id' | 'connection_id' | 'commands'> & {\n created_at: string;\n updated_at: string;\n commands?: CommandResponse<StreamChatGenerics>[];\n grants?: Record<string, string[]>;\n };\n\nexport type GetCommandResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse &\n CreateCommandOptions<StreamChatGenerics> &\n CreatedAtUpdatedAt;\n\nexport type GetMessageAPIResponse<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = SendMessageAPIResponse<StreamChatGenerics>;\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface ThreadResponseCustomData {}\n\nexport interface ThreadResponse<SCG extends ExtendableGenerics = DefaultGenerics> extends ThreadResponseCustomData {\n // FIXME: according to OpenAPI, `channel` could be undefined but since cid is provided I'll asume that it's wrong\n channel: ChannelResponse<SCG>;\n channel_cid: string;\n created_at: string;\n created_by_user_id: string;\n latest_replies: Array<MessageResponse<SCG>>;\n parent_message: MessageResponse<SCG>;\n parent_message_id: string;\n title: string;\n updated_at: string;\n active_participant_count?: number;\n created_by?: UserResponse<SCG>;\n deleted_at?: string;\n last_message_at?: string;\n participant_count?: number;\n read?: Array<ReadResponse<SCG>>;\n reply_count?: number;\n thread_participants?: Array<{\n channel_cid: string;\n created_at: string;\n last_read_at: string;\n last_thread_message_at?: string;\n left_thread_at?: string;\n thread_id?: string;\n user?: UserResponse<SCG>;\n user_id?: string;\n }>;\n // TODO: when moving to API v2 we should do this instead\n // custom: ThreadResponseCustomData;\n}\n\n// TODO: Figure out a way to strongly type set and unset.\nexport type PartialThreadUpdate = {\n set?: Partial<Record<string, unknown>>;\n unset?: Array<string>;\n};\n\nexport type QueryThreadsOptions = {\n limit?: number;\n member_limit?: number;\n next?: string;\n participant_limit?: number;\n reply_limit?: number;\n watch?: boolean;\n};\n\nexport type QueryThreadsAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n threads: ThreadResponse<StreamChatGenerics>[];\n next?: string;\n};\n\nexport type GetThreadOptions = {\n member_limit?: number;\n participant_limit?: number;\n reply_limit?: number;\n watch?: boolean;\n};\n\nexport type GetThreadAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n thread: ThreadResponse<StreamChatGenerics>;\n};\n\nexport type GetMultipleMessagesAPIResponse<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = APIResponse & {\n messages: MessageResponse<StreamChatGenerics>[];\n};\n\nexport type GetRateLimitsResponse = APIResponse & {\n android?: RateLimitsMap;\n ios?: RateLimitsMap;\n server_side?: RateLimitsMap;\n web?: RateLimitsMap;\n};\n\nexport type GetReactionsAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n reactions: ReactionResponse<StreamChatGenerics>[];\n};\n\nexport type GetRepliesAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n messages: MessageResponse<StreamChatGenerics>[];\n};\n\nexport type GetUnreadCountAPIResponse = APIResponse & {\n channel_type: {\n channel_count: number;\n channel_type: string;\n unread_count: number;\n }[];\n channels: {\n channel_id: string;\n last_read: string;\n unread_count: number;\n }[];\n threads: {\n last_read: string;\n last_read_message_id: string;\n parent_message_id: string;\n unread_count: number;\n }[];\n total_unread_count: number;\n total_unread_threads_count: number;\n};\n\nexport type GetUnreadCountBatchAPIResponse = APIResponse & {\n counts_by_user: { [userId: string]: GetUnreadCountAPIResponse };\n};\n\nexport type ListChannelResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n channel_types: Record<\n string,\n Omit<CreateChannelOptions<StreamChatGenerics>, 'client_id' | 'connection_id' | 'commands'> & {\n commands: CommandResponse<StreamChatGenerics>[];\n created_at: string;\n updated_at: string;\n grants?: Record<string, string[]>;\n }\n >;\n};\n\nexport type ListChannelTypesAPIResponse<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = ListChannelResponse<StreamChatGenerics>;\n\nexport type ListCommandsResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n commands: Array<CreateCommandOptions<StreamChatGenerics> & Partial<CreatedAtUpdatedAt>>;\n};\n\nexport type MuteChannelAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n channel_mute: ChannelMute<StreamChatGenerics>;\n own_user: OwnUserResponse<StreamChatGenerics>;\n channel_mutes?: ChannelMute<StreamChatGenerics>[];\n mute?: MuteResponse<StreamChatGenerics>;\n};\n\nexport type MessageResponse<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = MessageResponseBase<StreamChatGenerics> & {\n quoted_message?: MessageResponseBase<StreamChatGenerics>;\n};\n\nexport type MessageResponseBase<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = MessageBase<StreamChatGenerics> & {\n type: MessageLabel;\n args?: string;\n before_message_send_failed?: boolean;\n channel?: ChannelResponse<StreamChatGenerics>;\n cid?: string;\n command?: string;\n command_info?: { name?: string };\n created_at?: string;\n deleted_at?: string;\n deleted_reply_count?: number;\n i18n?: RequireAtLeastOne<Record<`${TranslationLanguages}_text`, string>> & {\n language: TranslationLanguages;\n };\n latest_reactions?: ReactionResponse<StreamChatGenerics>[];\n mentioned_users?: UserResponse<StreamChatGenerics>[];\n message_text_updated_at?: string;\n moderation?: ModerationResponse; // present only with Moderation v2\n moderation_details?: ModerationDetailsResponse; // present only with Moderation v1\n own_reactions?: ReactionResponse<StreamChatGenerics>[] | null;\n pin_expires?: string | null;\n pinned_at?: string | null;\n pinned_by?: UserResponse<StreamChatGenerics> | null;\n poll?: PollResponse<StreamChatGenerics>;\n reaction_counts?: { [key: string]: number } | null;\n reaction_groups?: { [key: string]: ReactionGroupResponse } | null;\n reaction_scores?: { [key: string]: number } | null;\n reply_count?: number;\n shadowed?: boolean;\n status?: string;\n thread_participants?: UserResponse<StreamChatGenerics>[];\n updated_at?: string;\n};\n\nexport type ReactionGroupResponse = {\n count: number;\n sum_scores: number;\n first_reaction_at?: string;\n last_reaction_at?: string;\n};\n\nexport type ModerationDetailsResponse = {\n action: 'MESSAGE_RESPONSE_ACTION_BOUNCE' | (string & {});\n error_msg: string;\n harms: ModerationHarmResponse[];\n original_text: string;\n};\n\nexport type ModerationHarmResponse = {\n name: string;\n phrase_list_ids: number[];\n};\n\nexport type ModerationAction = 'bounce' | 'flag' | 'remove' | 'shadow';\n\nexport type ModerationResponse = {\n action: ModerationAction;\n original_text: string;\n};\n\nexport type MuteResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n user: UserResponse<StreamChatGenerics>;\n created_at?: string;\n expires?: string;\n target?: UserResponse<StreamChatGenerics>;\n updated_at?: string;\n};\n\nexport type MuteUserResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n mute?: MuteResponse<StreamChatGenerics>;\n mutes?: Array<Mute<StreamChatGenerics>>;\n own_user?: OwnUserResponse<StreamChatGenerics>;\n};\n\nexport type BlockUserAPIResponse = APIResponse & {\n blocked_at: string;\n blocked_by_user_id: string;\n blocked_user_id: string;\n};\n\nexport type GetBlockedUsersAPIResponse = APIResponse & {\n blocks: BlockedUserDetails[];\n};\nexport type BlockedUserDetails = APIResponse & {\n blocked_user: UserResponse;\n blocked_user_id: string;\n created_at: string;\n user: UserResponse;\n user_id: string;\n};\n\nexport type OwnUserBase<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n channel_mutes: ChannelMute<StreamChatGenerics>[];\n devices: Device<StreamChatGenerics>[];\n mutes: Mute<StreamChatGenerics>[];\n total_unread_count: number;\n unread_channels: number;\n unread_count: number;\n unread_threads: number;\n invisible?: boolean;\n privacy_settings?: PrivacySettings;\n roles?: string[];\n};\n\nexport type OwnUserResponse<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = UserResponse<StreamChatGenerics> & OwnUserBase<StreamChatGenerics>;\n\nexport type PartialUpdateChannelAPIResponse<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = APIResponse & {\n channel: ChannelResponse<StreamChatGenerics>;\n members: ChannelMemberResponse<StreamChatGenerics>[];\n};\n\nexport type PermissionAPIResponse = APIResponse & {\n permission?: PermissionAPIObject;\n};\n\nexport type PermissionsAPIResponse = APIResponse & {\n permissions?: PermissionAPIObject[];\n};\n\nexport type ReactionAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n message: MessageResponse<StreamChatGenerics>;\n reaction: ReactionResponse<StreamChatGenerics>;\n};\n\nexport type ReactionResponse<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = Reaction<StreamChatGenerics> & {\n created_at: string;\n message_id: string;\n updated_at: string;\n};\n\nexport type ReadResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n last_read: string;\n user: UserResponse<StreamChatGenerics>;\n last_read_message_id?: string;\n unread_messages?: number;\n};\n\nexport type SearchAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n results: {\n message: MessageResponse<StreamChatGenerics>;\n }[];\n next?: string;\n previous?: string;\n results_warning?: SearchWarning | null;\n};\n\nexport type SearchWarning = {\n channel_search_cids: string[];\n channel_search_count: number;\n warning_code: number;\n warning_description: string;\n};\n\n// Thumb URL(thumb_url) is added considering video attachments as the backend will return the thumbnail in the response.\nexport type SendFileAPIResponse = APIResponse & { file: string; thumb_url?: string };\n\nexport type SendMessageAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n message: MessageResponse<StreamChatGenerics>;\n pending_message_metadata?: Record<string, string> | null;\n};\n\nexport type SyncResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n events: Event<StreamChatGenerics>[];\n inaccessible_cids?: string[];\n};\n\nexport type TruncateChannelAPIResponse<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = APIResponse & {\n channel: ChannelResponse<StreamChatGenerics>;\n message?: MessageResponse<StreamChatGenerics>;\n};\n\nexport type UpdateChannelAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n channel: ChannelResponse<StreamChatGenerics>;\n members: ChannelMemberResponse<StreamChatGenerics>[];\n message?: MessageResponse<StreamChatGenerics>;\n};\n\nexport type UpdateChannelResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse &\n Omit<CreateChannelOptions<StreamChatGenerics>, 'client_id' | 'connection_id'> & {\n created_at: string;\n updated_at: string;\n };\n\nexport type UpdateCommandResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n command: UpdateCommandOptions<StreamChatGenerics> &\n CreatedAtUpdatedAt & {\n name: CommandVariants<StreamChatGenerics>;\n };\n};\n\nexport type UpdateMessageAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n message: MessageResponse<StreamChatGenerics>;\n};\n\nexport type UsersAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n users: Array<UserResponse<StreamChatGenerics>>;\n};\n\nexport type UpdateUsersAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n users: { [key: string]: UserResponse<StreamChatGenerics> };\n};\n\nexport type UserResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = User<StreamChatGenerics> & {\n banned?: boolean;\n blocked_user_ids?: string[];\n created_at?: string;\n deactivated_at?: string;\n deleted_at?: string;\n language?: TranslationLanguages | '';\n last_active?: string;\n online?: boolean;\n privacy_settings?: PrivacySettings;\n push_notifications?: PushNotificationSettings;\n revoke_tokens_issued_before?: string;\n shadow_banned?: boolean;\n updated_at?: string;\n};\n\nexport type PrivacySettings = {\n read_receipts?: {\n enabled?: boolean;\n };\n typing_indicators?: {\n enabled?: boolean;\n };\n};\n\nexport type PushNotificationSettings = {\n disabled?: boolean;\n disabled_until?: string | null;\n};\n\n/**\n * Option Types\n */\n\nexport type MessageFlagsPaginationOptions = {\n limit?: number;\n offset?: number;\n};\n\nexport type FlagsPaginationOptions = {\n limit?: number;\n offset?: number;\n};\n\nexport type FlagReportsPaginationOptions = {\n limit?: number;\n offset?: number;\n};\n\nexport type ReviewFlagReportOptions = {\n review_details?: Object;\n user_id?: string;\n};\n\nexport type BannedUsersPaginationOptions = Omit<PaginationOptions, 'id_gt' | 'id_gte' | 'id_lt' | 'id_lte'> & {\n exclude_expired_bans?: boolean;\n};\n\nexport type BanUserOptions<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = UnBanUserOptions & {\n banned_by?: UserResponse<StreamChatGenerics>;\n banned_by_id?: string;\n ip_ban?: boolean;\n reason?: string;\n timeout?: number;\n};\n\nexport type ChannelOptions = {\n limit?: number;\n member_limit?: number;\n message_limit?: number;\n offset?: number;\n presence?: boolean;\n state?: boolean;\n user_id?: string;\n watch?: boolean;\n};\n\nexport type ChannelQueryOptions<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n client_id?: string;\n connection_id?: string;\n data?: ChannelResponse<StreamChatGenerics>;\n hide_for_creator?: boolean;\n members?: PaginationOptions;\n messages?: MessagePaginationOptions;\n presence?: boolean;\n state?: boolean;\n watch?: boolean;\n watchers?: PaginationOptions;\n};\n\nexport type ChannelStateOptions = {\n offlineMode?: boolean;\n skipInitialization?: string[];\n};\n\nexport type CreateChannelOptions<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n automod?: ChannelConfigAutomod;\n automod_behavior?: ChannelConfigAutomodBehavior;\n automod_thresholds?: ChannelConfigAutomodThresholds;\n blocklist?: string;\n blocklist_behavior?: ChannelConfigAutomodBehavior;\n client_id?: string;\n commands?: CommandVariants<StreamChatGenerics>[];\n connect_events?: boolean;\n connection_id?: string;\n custom_events?: boolean;\n grants?: Record<string, string[]>;\n mark_messages_pending?: boolean;\n max_message_length?: number;\n message_retention?: string;\n mutes?: boolean;\n name?: string;\n permissions?: PermissionObject[];\n polls?: boolean;\n push_notifications?: boolean;\n quotes?: boolean;\n reactions?: boolean;\n read_events?: boolean;\n reminders?: boolean;\n replies?: boolean;\n search?: boolean;\n skip_last_msg_update_for_system_msgs?: boolean;\n typing_events?: boolean;\n uploads?: boolean;\n url_enrichment?: boolean;\n};\n\nexport type CreateCommandOptions<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n description: string;\n name: CommandVariants<StreamChatGenerics>;\n args?: string;\n set?: CommandVariants<StreamChatGenerics>;\n};\n\nexport type CustomPermissionOptions = {\n action: string;\n condition: object;\n id: string;\n name: string;\n description?: string;\n owner?: boolean;\n same_team?: boolean;\n};\n\nexport type DeactivateUsersOptions = {\n created_by_id?: string;\n mark_messages_deleted?: boolean;\n};\n\nexport type NewMemberPayload<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = StreamChatGenerics['memberType'] & Pick<ChannelMemberResponse<StreamChatGenerics>, 'user_id' | 'channel_role'>;\n\n// TODO: rename to UpdateChannelOptions in the next major update and use it in channel._update and/or channel.update\nexport type InviteOptions<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n accept_invite?: boolean;\n add_members?: string[];\n add_moderators?: string[];\n client_id?: string;\n connection_id?: string;\n data?: Omit<ChannelResponse<StreamChatGenerics>, 'id' | 'cid'>;\n demote_moderators?: string[];\n invites?: string[];\n message?: MessageResponse<StreamChatGenerics>;\n reject_invite?: boolean;\n remove_members?: string[];\n user?: UserResponse<StreamChatGenerics>;\n user_id?: string;\n};\n\n/** @deprecated use MarkChannelsReadOptions instead */\nexport type MarkAllReadOptions<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = MarkChannelsReadOptions<StreamChatGenerics>;\n\nexport type MarkChannelsReadOptions<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n client_id?: string;\n connection_id?: string;\n read_by_channel?: Record<string, string>;\n user?: UserResponse<StreamChatGenerics>;\n user_id?: string;\n};\n\nexport type MarkReadOptions<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n client_id?: string;\n connection_id?: string;\n thread_id?: string;\n user?: UserResponse<StreamChatGenerics>;\n user_id?: string;\n};\n\nexport type MarkUnreadOptions<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n client_id?: string;\n connection_id?: string;\n message_id?: string;\n thread_id?: string;\n user?: UserResponse<StreamChatGenerics>;\n user_id?: string;\n};\n\nexport type MuteUserOptions<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n client_id?: string;\n connection_id?: string;\n id?: string;\n reason?: string;\n target_user_id?: string;\n timeout?: number;\n type?: string;\n user?: UserResponse<StreamChatGenerics>;\n user_id?: string;\n};\n\nexport type PaginationOptions = {\n created_at_after?: string | Date;\n created_at_after_or_equal?: string | Date;\n created_at_before?: string | Date;\n created_at_before_or_equal?: string | Date;\n id_gt?: string;\n id_gte?: string;\n id_lt?: string;\n id_lte?: string;\n limit?: number;\n offset?: number; // should be avoided with channel.query()\n};\n\nexport type MessagePaginationOptions = PaginationOptions & {\n created_at_around?: string | Date;\n id_around?: string;\n};\n\nexport type PinnedMessagePaginationOptions = {\n id_around?: string;\n id_gt?: string;\n id_gte?: string;\n id_lt?: string;\n id_lte?: string;\n limit?: number;\n offset?: number;\n pinned_at_after?: string | Date;\n pinned_at_after_or_equal?: string | Date;\n pinned_at_around?: string | Date;\n pinned_at_before?: string | Date;\n pinned_at_before_or_equal?: string | Date;\n};\n\nexport type QueryMembersOptions = {\n // Pagination option: select members created after the date (RFC399)\n created_at_after?: string;\n // Pagination option: select members created after or equal the date (RFC399)\n created_at_after_or_equal?: string;\n // Pagination option: select members created before the date (RFC399)\n created_at_before?: string;\n // Pagination option: select members created before or equal the date (RFC399)\n created_at_before_or_equal?: string;\n // Number of members to return, default 100\n limit?: number;\n // Offset (max is 1000)\n offset?: number;\n // \tPagination option: excludes members with ID less or equal the value\n user_id_gt?: string;\n // Pagination option: excludes members with ID less than the value\n user_id_gte?: string;\n // Pagination option: excludes members with ID greater or equal the value\n user_id_lt?: string;\n // \tPagination option: excludes members with ID greater than the value\n user_id_lte?: string;\n};\n\nexport type ReactivateUserOptions = {\n created_by_id?: string;\n name?: string;\n restore_messages?: boolean;\n};\n\nexport type ReactivateUsersOptions = {\n created_by_id?: string;\n restore_messages?: boolean;\n};\n\nexport type SearchOptions<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n limit?: number;\n next?: string;\n offset?: number;\n sort?: SearchMessageSort<StreamChatGenerics>;\n};\n\nexport type StreamChatOptions = AxiosRequestConfig & {\n /**\n * Used to disable warnings that are triggered by using connectUser or connectAnonymousUser server-side.\n */\n allowServerSideConnect?: boolean;\n axiosRequestConfig?: AxiosRequestConfig;\n /**\n * Base url to use for API\n * such as https://chat-proxy-dublin.stream-io-api.com\n */\n baseURL?: string;\n browser?: boolean;\n device?: BaseDeviceFields;\n /**\n * Disables the hydration of all caches within the JS Client. This includes this.activeChannels,\n * this.polls.pollCache and this.config.\n * It is mainly meant to be used for integrations where stream-chat is used as a server-side service\n * interacting with Stream's REST API, not depending on any state and purely serving as a wrapper\n * around HTTP requests. Using this property on either the client side or a backend implementation\n * that also relies on WS events will break these functionalities, so please use carefully.\n */\n disableCache?: boolean;\n enableInsights?: boolean;\n /** experimental feature, please contact support if you want this feature enabled for you */\n enableWSFallback?: boolean;\n logger?: Logger;\n /**\n * When true, user will be persisted on client. Otherwise if `connectUser` call fails, then you need to\n * call `connectUser` again to retry.\n * This is mainly useful for chat application working in offline mode, where you will need client.user to\n * persist even if connectUser call fails.\n */\n persistUserOnConnectionFailure?: boolean;\n /**\n * When network is recovered, we re-query the active channels on client. But in single query, you can recover\n * only 30 channels. So its not guaranteed that all the channels in activeChannels object have updated state.\n * Thus in UI sdks, state recovery is managed by components themselves, they don't rely on js client for this.\n *\n * `recoverStateOnReconnect` parameter can be used in such cases, to disable state recovery within js client.\n * When false, user/consumer of this client will need to make sure all the channels present on UI by\n * manually calling queryChannels endpoint.\n */\n recoverStateOnReconnect?: boolean;\n warmUp?: boolean;\n /**\n * Set the instance of StableWSConnection on chat client. Its purely for testing purpose and should\n * not be used in production apps.\n */\n wsConnection?: StableWSConnection;\n};\n\nexport type SyncOptions = {\n /**\n * This will behave as queryChannels option.\n */\n watch?: boolean;\n /**\n * Return channels from request that user does not have access to in a separate\n * field in the response called 'inaccessible_cids' instead of\n * adding them as 'notification.removed_from_channel' events.\n */\n with_inaccessible_cids?: boolean;\n};\n\nexport type UnBanUserOptions = {\n client_id?: string;\n connection_id?: string;\n id?: string;\n shadow?: boolean;\n target_user_id?: string;\n type?: string;\n};\n\n// TODO: rename to UpdateChannelTypeOptions in the next major update\nexport type UpdateChannelOptions<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = Omit<\n CreateChannelOptions<StreamChatGenerics>,\n 'name'\n> & {\n created_at?: string;\n updated_at?: string;\n};\n\nexport type UpdateCommandOptions<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n description: string;\n args?: string;\n set?: CommandVariants<StreamChatGenerics>;\n};\n\nexport type UserOptions = {\n include_deactivated_users?: boolean;\n limit?: number;\n offset?: number;\n presence?: boolean;\n};\n\n/**\n * Event Types\n */\n\nexport type ConnectionChangeEvent = {\n type: EventTypes;\n online?: boolean;\n};\n\nexport type Event<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = StreamChatGenerics['eventType'] & {\n type: EventTypes;\n ai_message?: string;\n ai_state?: AIState;\n channel?: ChannelResponse<StreamChatGenerics>;\n channel_id?: string;\n channel_type?: string;\n cid?: string;\n clear_history?: boolean;\n connection_id?: string;\n // event creation timestamp, format Date ISO string\n created_at?: string;\n // id of the message that was marked as unread - all the following messages are considered unread. (notification.mark_unread)\n first_unread_message_id?: string;\n hard_delete?: boolean;\n // creation date of a message with last_read_message_id, formatted as Date ISO string\n last_read_at?: string;\n last_read_message_id?: string;\n mark_messages_deleted?: boolean;\n me?: OwnUserResponse<StreamChatGenerics>;\n member?: ChannelMemberResponse<StreamChatGenerics>;\n message?: MessageResponse<StreamChatGenerics>;\n message_id?: string;\n mode?: string;\n online?: boolean;\n parent_id?: string;\n poll?: PollResponse<StreamChatGenerics>;\n poll_vote?: PollVote<StreamChatGenerics> | PollAnswer<StreamChatGenerics>;\n queriedChannels?: {\n channels: ChannelAPIResponse<StreamChatGenerics>[];\n isLatestMessageSet?: boolean;\n };\n reaction?: ReactionResponse<StreamChatGenerics>;\n received_at?: string | Date;\n team?: string;\n thread?: ThreadResponse<StreamChatGenerics>;\n // @deprecated number of all unread messages across all current user's unread channels, equals unread_count\n total_unread_count?: number;\n // number of all current user's channels with at least one unread message including the channel in this event\n unread_channels?: number;\n // number of all unread messages across all current user's unread channels\n unread_count?: number;\n // number of unread messages in the channel from this event (notification.mark_unread)\n unread_messages?: number;\n unread_thread_messages?: number;\n unread_threads?: number;\n user?: UserResponse<StreamChatGenerics>;\n user_id?: string;\n watcher_count?: number;\n};\n\nexport type UserCustomEvent<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = StreamChatGenerics['eventType'] & {\n type: string;\n};\n\nexport type EventHandler<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = (\n event: Event<StreamChatGenerics>,\n) => void;\n\nexport type EventTypes = 'all' | keyof typeof EVENT_MAP;\n\n/**\n * Filter Types\n */\n\nexport type AscDesc = 1 | -1;\n\nexport type MessageFlagsFiltersOptions = {\n channel_cid?: string;\n is_reviewed?: boolean;\n team?: string;\n user_id?: string;\n};\n\nexport type MessageFlagsFilters = QueryFilters<\n {\n channel_cid?:\n | RequireOnlyOne<Pick<QueryFilter<MessageFlagsFiltersOptions['channel_cid']>, '$eq' | '$in'>>\n | PrimitiveFilter<MessageFlagsFiltersOptions['channel_cid']>;\n } & {\n team?:\n | RequireOnlyOne<Pick<QueryFilter<MessageFlagsFiltersOptions['team']>, '$eq' | '$in'>>\n | PrimitiveFilter<MessageFlagsFiltersOptions['team']>;\n } & {\n user_id?:\n | RequireOnlyOne<Pick<QueryFilter<MessageFlagsFiltersOptions['user_id']>, '$eq' | '$in'>>\n | PrimitiveFilter<MessageFlagsFiltersOptions['user_id']>;\n } & {\n [Key in keyof Omit<MessageFlagsFiltersOptions, 'channel_cid' | 'user_id' | 'is_reviewed'>]:\n | RequireOnlyOne<QueryFilter<MessageFlagsFiltersOptions[Key]>>\n | PrimitiveFilter<MessageFlagsFiltersOptions[Key]>;\n }\n>;\n\nexport type FlagsFiltersOptions = {\n channel_cid?: string;\n message_id?: string;\n message_user_id?: string;\n reporter_id?: string;\n team?: string;\n user_id?: string;\n};\n\nexport type FlagsFilters = QueryFilters<\n {\n user_id?:\n | RequireOnlyOne<Pick<QueryFilter<FlagsFiltersOptions['user_id']>, '$eq' | '$in'>>\n | PrimitiveFilter<FlagsFiltersOptions['user_id']>;\n } & {\n message_id?:\n | RequireOnlyOne<Pick<QueryFilter<FlagsFiltersOptions['message_id']>, '$eq' | '$in'>>\n | PrimitiveFilter<FlagsFiltersOptions['message_id']>;\n } & {\n message_user_id?:\n | RequireOnlyOne<Pick<QueryFilter<FlagsFiltersOptions['message_user_id']>, '$eq' | '$in'>>\n | PrimitiveFilter<FlagsFiltersOptions['message_user_id']>;\n } & {\n channel_cid?:\n | RequireOnlyOne<Pick<QueryFilter<FlagsFiltersOptions['channel_cid']>, '$eq' | '$in'>>\n | PrimitiveFilter<FlagsFiltersOptions['channel_cid']>;\n } & {\n reporter_id?:\n | RequireOnlyOne<Pick<QueryFilter<FlagsFiltersOptions['reporter_id']>, '$eq' | '$in'>>\n | PrimitiveFilter<FlagsFiltersOptions['reporter_id']>;\n } & {\n team?:\n | RequireOnlyOne<Pick<QueryFilter<FlagsFiltersOptions['team']>, '$eq' | '$in'>>\n | PrimitiveFilter<FlagsFiltersOptions['team']>;\n }\n>;\n\nexport type FlagReportsFiltersOptions = {\n channel_cid?: string;\n is_reviewed?: boolean;\n message_id?: string;\n message_user_id?: string;\n report_id?: string;\n review_result?: string;\n reviewed_by?: string;\n team?: string;\n user_id?: string;\n};\n\nexport type FlagReportsFilters = QueryFilters<\n {\n report_id?:\n | RequireOnlyOne<Pick<QueryFilter<FlagReportsFiltersOptions['report_id']>, '$eq' | '$in'>>\n | PrimitiveFilter<FlagReportsFiltersOptions['report_id']>;\n } & {\n review_result?:\n | RequireOnlyOne<Pick<QueryFilter<FlagReportsFiltersOptions['review_result']>, '$eq' | '$in'>>\n | PrimitiveFilter<FlagReportsFiltersOptions['review_result']>;\n } & {\n reviewed_by?:\n | RequireOnlyOne<Pick<QueryFilter<FlagReportsFiltersOptions['reviewed_by']>, '$eq' | '$in'>>\n | PrimitiveFilter<FlagReportsFiltersOptions['reviewed_by']>;\n } & {\n user_id?:\n | RequireOnlyOne<Pick<QueryFilter<FlagReportsFiltersOptions['user_id']>, '$eq' | '$in'>>\n | PrimitiveFilter<FlagReportsFiltersOptions['user_id']>;\n } & {\n message_id?:\n | RequireOnlyOne<Pick<QueryFilter<FlagReportsFiltersOptions['message_id']>, '$eq' | '$in'>>\n | PrimitiveFilter<FlagReportsFiltersOptions['message_id']>;\n } & {\n message_user_id?:\n | RequireOnlyOne<Pick<QueryFilter<FlagReportsFiltersOptions['message_user_id']>, '$eq' | '$in'>>\n | PrimitiveFilter<FlagReportsFiltersOptions['message_user_id']>;\n } & {\n channel_cid?:\n | RequireOnlyOne<Pick<QueryFilter<FlagReportsFiltersOptions['channel_cid']>, '$eq' | '$in'>>\n | PrimitiveFilter<FlagReportsFiltersOptions['channel_cid']>;\n } & {\n team?:\n | RequireOnlyOne<Pick<QueryFilter<FlagReportsFiltersOptions['team']>, '$eq' | '$in'>>\n | PrimitiveFilter<FlagReportsFiltersOptions['team']>;\n } & {\n [Key in keyof Omit<\n FlagReportsFiltersOptions,\n 'report_id' | 'user_id' | 'message_id' | 'review_result' | 'reviewed_by'\n >]: RequireOnlyOne<QueryFilter<FlagReportsFiltersOptions[Key]>> | PrimitiveFilter<FlagReportsFiltersOptions[Key]>;\n }\n>;\n\nexport type BannedUsersFilterOptions = {\n banned_by_id?: string;\n channel_cid?: string;\n created_at?: string;\n reason?: string;\n user_id?: string;\n};\n\nexport type BannedUsersFilters = QueryFilters<\n {\n channel_cid?:\n | RequireOnlyOne<Pick<QueryFilter<BannedUsersFilterOptions['channel_cid']>, '$eq' | '$in'>>\n | PrimitiveFilter<BannedUsersFilterOptions['channel_cid']>;\n } & {\n reason?:\n | RequireOnlyOne<\n {\n $autocomplete?: BannedUsersFilterOptions['reason'];\n } & QueryFilter<BannedUsersFilterOptions['reason']>\n >\n | PrimitiveFilter<BannedUsersFilterOptions['reason']>;\n } & {\n [Key in keyof Omit<BannedUsersFilterOptions, 'channel_cid' | 'reason'>]:\n | RequireOnlyOne<QueryFilter<BannedUsersFilterOptions[Key]>>\n | PrimitiveFilter<BannedUsersFilterOptions[Key]>;\n }\n>;\n\nexport type ReactionFilters<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = QueryFilters<\n {\n user_id?:\n | RequireOnlyOne<Pick<QueryFilter<ReactionResponse<StreamChatGenerics>['user_id']>, '$eq' | '$in'>>\n | PrimitiveFilter<ReactionResponse<StreamChatGenerics>['user_id']>;\n } & {\n type?:\n | RequireOnlyOne<Pick<QueryFilter<ReactionResponse<StreamChatGenerics>['type']>, '$eq'>>\n | PrimitiveFilter<ReactionResponse<StreamChatGenerics>['type']>;\n } & {\n created_at?:\n | RequireOnlyOne<Pick<QueryFilter<PollResponse['created_at']>, '$eq' | '$gt' | '$lt' | '$gte' | '$lte'>>\n | PrimitiveFilter<PollResponse['created_at']>;\n }\n>;\n\nexport type ChannelFilters<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = QueryFilters<\n ContainsOperator<StreamChatGenerics['channelType']> & {\n members?:\n | RequireOnlyOne<Pick<QueryFilter<string>, '$in' | '$nin'>>\n | RequireOnlyOne<Pick<QueryFilter<string[]>, '$eq'>>\n | PrimitiveFilter<string[]>;\n } & {\n name?:\n | RequireOnlyOne<\n {\n $autocomplete?: ChannelResponse<StreamChatGenerics>['name'];\n } & QueryFilter<ChannelResponse<StreamChatGenerics>['name']>\n >\n | PrimitiveFilter<ChannelResponse<StreamChatGenerics>['name']>;\n } & {\n [Key in keyof Omit<\n ChannelResponse<{\n attachmentType: StreamChatGenerics['attachmentType'];\n channelType: {};\n commandType: StreamChatGenerics['commandType'];\n eventType: StreamChatGenerics['eventType'];\n memberType: StreamChatGenerics['memberType'];\n messageType: StreamChatGenerics['messageType'];\n pollOptionType: StreamChatGenerics['pollOptionType'];\n pollType: StreamChatGenerics['pollType'];\n reactionType: StreamChatGenerics['reactionType'];\n userType: StreamChatGenerics['userType'];\n }>,\n 'name' | 'members'\n >]:\n | RequireOnlyOne<\n QueryFilter<\n ChannelResponse<{\n attachmentType: StreamChatGenerics['attachmentType'];\n channelType: {};\n commandType: StreamChatGenerics['commandType'];\n eventType: StreamChatGenerics['eventType'];\n memberType: StreamChatGenerics['memberType'];\n messageType: StreamChatGenerics['messageType'];\n pollOptionType: StreamChatGenerics['pollOptionType'];\n pollType: StreamChatGenerics['pollType'];\n reactionType: StreamChatGenerics['reactionType'];\n userType: StreamChatGenerics['userType'];\n }>[Key]\n >\n >\n | PrimitiveFilter<\n ChannelResponse<{\n attachmentType: StreamChatGenerics['attachmentType'];\n channelType: {};\n commandType: StreamChatGenerics['commandType'];\n eventType: StreamChatGenerics['eventType'];\n memberType: StreamChatGenerics['memberType'];\n messageType: StreamChatGenerics['messageType'];\n pollOptionType: StreamChatGenerics['pollOptionType'];\n pollType: StreamChatGenerics['pollType'];\n reactionType: StreamChatGenerics['reactionType'];\n userType: StreamChatGenerics['userType'];\n }>[Key]\n >;\n } & {\n archived?: boolean;\n pinned?: boolean;\n }\n>;\n\nexport type QueryPollsParams = {\n filter?: QueryPollsFilters;\n options?: QueryPollsOptions;\n sort?: PollSort;\n};\n\nexport type QueryPollsOptions = Pager;\n\nexport type VotesFiltersOptions = {\n is_answer?: boolean;\n option_id?: string;\n user_id?: string;\n};\n\nexport type QueryVotesOptions = Pager;\n\nexport type QueryPollsFilters = QueryFilters<\n {\n id?: RequireOnlyOne<Pick<QueryFilter<PollResponse['id']>, '$eq' | '$in'>> | PrimitiveFilter<PollResponse['id']>;\n } & {\n user_id?:\n | RequireOnlyOne<Pick<QueryFilter<VotesFiltersOptions['user_id']>, '$eq' | '$in'>>\n | PrimitiveFilter<VotesFiltersOptions['user_id']>;\n } & {\n is_closed?:\n | RequireOnlyOne<Pick<QueryFilter<PollResponse['is_closed']>, '$eq'>>\n | PrimitiveFilter<PollResponse['is_closed']>;\n } & {\n max_votes_allowed?:\n | RequireOnlyOne<\n Pick<QueryFilter<PollResponse['max_votes_allowed']>, '$eq' | '$ne' | '$gt' | '$lt' | '$gte' | '$lte'>\n >\n | PrimitiveFilter<PollResponse['max_votes_allowed']>;\n } & {\n allow_answers?:\n | RequireOnlyOne<Pick<QueryFilter<PollResponse['allow_answers']>, '$eq'>>\n | PrimitiveFilter<PollResponse['allow_answers']>;\n } & {\n allow_user_suggested_options?:\n | RequireOnlyOne<Pick<QueryFilter<PollResponse['allow_user_suggested_options']>, '$eq'>>\n | PrimitiveFilter<PollResponse['allow_user_suggested_options']>;\n } & {\n voting_visibility?:\n | RequireOnlyOne<Pick<QueryFilter<PollResponse['voting_visibility']>, '$eq'>>\n | PrimitiveFilter<PollResponse['voting_visibility']>;\n } & {\n created_at?:\n | RequireOnlyOne<Pick<QueryFilter<PollResponse['created_at']>, '$eq' | '$gt' | '$lt' | '$gte' | '$lte'>>\n | PrimitiveFilter<PollResponse['created_at']>;\n } & {\n created_by_id?:\n | RequireOnlyOne<Pick<QueryFilter<PollResponse['created_by_id']>, '$eq' | '$in'>>\n | PrimitiveFilter<PollResponse['created_by_id']>;\n } & {\n updated_at?:\n | RequireOnlyOne<Pick<QueryFilter<PollResponse['updated_at']>, '$eq' | '$gt' | '$lt' | '$gte' | '$lte'>>\n | PrimitiveFilter<PollResponse['updated_at']>;\n } & {\n name?:\n | RequireOnlyOne<Pick<QueryFilter<PollResponse['name']>, '$eq' | '$in'>>\n | PrimitiveFilter<PollResponse['name']>;\n }\n>;\n\nexport type QueryVotesFilters = QueryFilters<\n {\n id?: RequireOnlyOne<Pick<QueryFilter<PollResponse['id']>, '$eq' | '$in'>> | PrimitiveFilter<PollResponse['id']>;\n } & {\n option_id?:\n | RequireOnlyOne<Pick<QueryFilter<VotesFiltersOptions['option_id']>, '$eq' | '$in'>>\n | PrimitiveFilter<VotesFiltersOptions['option_id']>;\n } & {\n is_answer?:\n | RequireOnlyOne<Pick<QueryFilter<VotesFiltersOptions['is_answer']>, '$eq'>>\n | PrimitiveFilter<VotesFiltersOptions['is_answer']>;\n } & {\n user_id?:\n | RequireOnlyOne<Pick<QueryFilter<VotesFiltersOptions['user_id']>, '$eq' | '$in'>>\n | PrimitiveFilter<VotesFiltersOptions['user_id']>;\n } & {\n created_at?:\n | RequireOnlyOne<Pick<QueryFilter<PollResponse['created_at']>, '$eq' | '$gt' | '$lt' | '$gte' | '$lte'>>\n | PrimitiveFilter<PollResponse['created_at']>;\n } & {\n created_by_id?:\n | RequireOnlyOne<Pick<QueryFilter<PollResponse['created_by_id']>, '$eq' | '$in'>>\n | PrimitiveFilter<PollResponse['created_by_id']>;\n } & {\n updated_at?:\n | RequireOnlyOne<Pick<QueryFilter<PollResponse['updated_at']>, '$eq' | '$gt' | '$lt' | '$gte' | '$lte'>>\n | PrimitiveFilter<PollResponse['updated_at']>;\n }\n>;\n\nexport type ContainsOperator<CustomType = {}> = {\n [Key in keyof CustomType]?: CustomType[Key] extends (infer ContainType)[]\n ?\n | RequireOnlyOne<\n {\n $contains?: ContainType extends object\n ? PrimitiveFilter<RequireAtLeastOne<ContainType>>\n : PrimitiveFilter<ContainType>;\n } & QueryFilter<PrimitiveFilter<ContainType>[]>\n >\n | PrimitiveFilter<PrimitiveFilter<ContainType>[]>\n : RequireOnlyOne<QueryFilter<CustomType[Key]>> | PrimitiveFilter<CustomType[Key]>;\n};\n\nexport type MessageFilters<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = QueryFilters<\n ContainsOperator<StreamChatGenerics['messageType']> & {\n text?:\n | RequireOnlyOne<\n {\n $autocomplete?: MessageResponse<StreamChatGenerics>['text'];\n $q?: MessageResponse<StreamChatGenerics>['text'];\n } & QueryFilter<MessageResponse<StreamChatGenerics>['text']>\n >\n | PrimitiveFilter<MessageResponse<StreamChatGenerics>['text']>;\n } & {\n [Key in keyof Omit<\n MessageResponse<{\n attachmentType: StreamChatGenerics['attachmentType'];\n channelType: StreamChatGenerics['channelType'];\n commandType: StreamChatGenerics['commandType'];\n eventType: StreamChatGenerics['eventType'];\n memberType: StreamChatGenerics['memberType'];\n messageType: {};\n pollOptionType: StreamChatGenerics['pollOptionType'];\n pollType: StreamChatGenerics['pollType'];\n reactionType: StreamChatGenerics['reactionType'];\n userType: StreamChatGenerics['userType'];\n }>,\n 'text'\n >]?:\n | RequireOnlyOne<\n QueryFilter<\n MessageResponse<{\n attachmentType: StreamChatGenerics['attachmentType'];\n channelType: StreamChatGenerics['channelType'];\n commandType: StreamChatGenerics['commandType'];\n eventType: StreamChatGenerics['eventType'];\n memberType: StreamChatGenerics['memberType'];\n messageType: {};\n pollOptionType: StreamChatGenerics['pollOptionType'];\n pollType: StreamChatGenerics['pollType'];\n reactionType: StreamChatGenerics['reactionType'];\n userType: StreamChatGenerics['userType'];\n }>[Key]\n >\n >\n | PrimitiveFilter<\n MessageResponse<{\n attachmentType: StreamChatGenerics['attachmentType'];\n channelType: StreamChatGenerics['channelType'];\n commandType: StreamChatGenerics['commandType'];\n eventType: StreamChatGenerics['eventType'];\n memberType: StreamChatGenerics['memberType'];\n messageType: {};\n pollOptionType: StreamChatGenerics['pollOptionType'];\n pollType: StreamChatGenerics['pollType'];\n reactionType: StreamChatGenerics['reactionType'];\n userType: StreamChatGenerics['userType'];\n }>[Key]\n >;\n }\n>;\n\nexport type MessageOptions = {\n include_thread_participants?: boolean;\n};\n\nexport type PrimitiveFilter<ObjectType> = ObjectType | null;\n\nexport type QueryFilter<ObjectType = string> = NonNullable<ObjectType> extends string | number | boolean\n ? {\n $eq?: PrimitiveFilter<ObjectType>;\n $exists?: boolean;\n $gt?: PrimitiveFilter<ObjectType>;\n $gte?: PrimitiveFilter<ObjectType>;\n $in?: PrimitiveFilter<ObjectType>[];\n $lt?: PrimitiveFilter<ObjectType>;\n $lte?: PrimitiveFilter<ObjectType>;\n /**\n * @deprecated and will be removed in a future release. Filtering shall be applied client-side.\n */\n $ne?: PrimitiveFilter<ObjectType>;\n /**\n * @deprecated and will be removed in a future release. Filtering shall be applied client-side.\n */\n $nin?: PrimitiveFilter<ObjectType>[];\n }\n : {\n $eq?: PrimitiveFilter<ObjectType>;\n $exists?: boolean;\n $in?: PrimitiveFilter<ObjectType>[];\n /**\n * @deprecated and will be removed in a future release. Filtering shall be applied client-side.\n */\n $ne?: PrimitiveFilter<ObjectType>;\n /**\n * @deprecated and will be removed in a future release. Filtering shall be applied client-side.\n */\n $nin?: PrimitiveFilter<ObjectType>[];\n };\n\nexport type QueryFilters<Operators = {}> = {\n [Key in keyof Operators]?: Operators[Key];\n} &\n QueryLogicalOperators<Operators>;\n\nexport type QueryLogicalOperators<Operators> = {\n $and?: ArrayOneOrMore<QueryFilters<Operators>>;\n $nor?: ArrayOneOrMore<QueryFilters<Operators>>;\n $or?: ArrayTwoOrMore<QueryFilters<Operators>>;\n};\n\nexport type UserFilters<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = QueryFilters<\n ContainsOperator<StreamChatGenerics['userType']> & {\n id?:\n | RequireOnlyOne<\n { $autocomplete?: UserResponse<StreamChatGenerics>['id'] } & QueryFilter<\n UserResponse<StreamChatGenerics>['id']\n >\n >\n | PrimitiveFilter<UserResponse<StreamChatGenerics>['id']>;\n name?:\n | RequireOnlyOne<\n { $autocomplete?: UserResponse<StreamChatGenerics>['name'] } & QueryFilter<\n UserResponse<StreamChatGenerics>['name']\n >\n >\n | PrimitiveFilter<UserResponse<StreamChatGenerics>['name']>;\n notifications_muted?:\n | RequireOnlyOne<{\n $eq?: PrimitiveFilter<UserResponse<StreamChatGenerics>['notifications_muted']>;\n }>\n | boolean;\n teams?:\n | RequireOnlyOne<{\n $contains?: PrimitiveFilter<string>;\n $eq?: PrimitiveFilter<UserResponse<StreamChatGenerics>['teams']>;\n $in?: PrimitiveFilter<UserResponse<StreamChatGenerics>['teams']>;\n }>\n | PrimitiveFilter<UserResponse<StreamChatGenerics>['teams']>;\n username?:\n | RequireOnlyOne<\n { $autocomplete?: UserResponse<StreamChatGenerics>['username'] } & QueryFilter<\n UserResponse<StreamChatGenerics>['username']\n >\n >\n | PrimitiveFilter<UserResponse<StreamChatGenerics>['username']>;\n } & {\n [Key in keyof Omit<\n UserResponse<{\n attachmentType: StreamChatGenerics['attachmentType'];\n channelType: StreamChatGenerics['channelType'];\n commandType: StreamChatGenerics['commandType'];\n eventType: StreamChatGenerics['eventType'];\n memberType: StreamChatGenerics['memberType'];\n messageType: StreamChatGenerics['messageType'];\n pollOptionType: StreamChatGenerics['pollOptionType'];\n pollType: StreamChatGenerics['pollType'];\n reactionType: StreamChatGenerics['reactionType'];\n userType: {};\n }>,\n 'id' | 'name' | 'teams' | 'username'\n >]?:\n | RequireOnlyOne<\n QueryFilter<\n UserResponse<{\n attachmentType: StreamChatGenerics['attachmentType'];\n channelType: StreamChatGenerics['channelType'];\n commandType: StreamChatGenerics['commandType'];\n eventType: StreamChatGenerics['eventType'];\n memberType: StreamChatGenerics['memberType'];\n messageType: StreamChatGenerics['messageType'];\n pollOptionType: StreamChatGenerics['pollOptionType'];\n pollType: StreamChatGenerics['pollType'];\n reactionType: StreamChatGenerics['reactionType'];\n userType: {};\n }>[Key]\n >\n >\n | PrimitiveFilter<\n UserResponse<{\n attachmentType: StreamChatGenerics['attachmentType'];\n channelType: StreamChatGenerics['channelType'];\n commandType: StreamChatGenerics['commandType'];\n eventType: StreamChatGenerics['eventType'];\n memberType: StreamChatGenerics['memberType'];\n messageType: StreamChatGenerics['messageType'];\n pollOptionType: StreamChatGenerics['pollOptionType'];\n pollType: StreamChatGenerics['pollType'];\n reactionType: StreamChatGenerics['reactionType'];\n userType: {};\n }>[Key]\n >;\n }\n>;\n\nexport type InviteStatus = 'pending' | 'accepted' | 'rejected';\n\n// https://getstream.io/chat/docs/react/channel_member/#update-channel-members\nexport type MemberFilters<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = QueryFilters<\n {\n banned?:\n | { $eq?: ChannelMemberResponse<StreamChatGenerics>['banned'] }\n | ChannelMemberResponse<StreamChatGenerics>['banned'];\n channel_role?:\n | { $eq?: ChannelMemberResponse<StreamChatGenerics>['channel_role'] }\n | ChannelMemberResponse<StreamChatGenerics>['channel_role'];\n cid?: { $eq?: ChannelResponse<StreamChatGenerics>['cid'] } | ChannelResponse<StreamChatGenerics>['cid'];\n created_at?:\n | {\n $eq?: ChannelMemberResponse<StreamChatGenerics>['created_at'];\n $gt?: ChannelMemberResponse<StreamChatGenerics>['created_at'];\n $gte?: ChannelMemberResponse<StreamChatGenerics>['created_at'];\n $lt?: ChannelMemberResponse<StreamChatGenerics>['created_at'];\n $lte?: ChannelMemberResponse<StreamChatGenerics>['created_at'];\n }\n | ChannelMemberResponse<StreamChatGenerics>['created_at'];\n id?:\n | RequireOnlyOne<{\n $eq?: UserResponse<StreamChatGenerics>['id'];\n $in?: UserResponse<StreamChatGenerics>['id'][];\n }>\n | UserResponse<StreamChatGenerics>['id'];\n invite?:\n | { $eq?: ChannelMemberResponse<StreamChatGenerics>['status'] }\n | ChannelMemberResponse<StreamChatGenerics>['status'];\n joined?: { $eq?: boolean } | boolean;\n last_active?:\n | {\n $eq?: UserResponse<StreamChatGenerics>['last_active'];\n $gt?: UserResponse<StreamChatGenerics>['last_active'];\n $gte?: UserResponse<StreamChatGenerics>['last_active'];\n $lt?: UserResponse<StreamChatGenerics>['last_active'];\n $lte?: UserResponse<StreamChatGenerics>['last_active'];\n }\n | UserResponse<StreamChatGenerics>['last_active'];\n name?:\n | RequireOnlyOne<{\n $autocomplete?: ChannelMemberResponse<StreamChatGenerics>['name'];\n $eq?: ChannelMemberResponse<StreamChatGenerics>['name'];\n $in?: ChannelMemberResponse<StreamChatGenerics>['name'][];\n $q?: ChannelMemberResponse<StreamChatGenerics>['name'];\n }>\n | PrimitiveFilter<ChannelMemberResponse<StreamChatGenerics>['name']>;\n updated_at?:\n | {\n $eq?: ChannelMemberResponse<StreamChatGenerics>['updated_at'];\n $gt?: ChannelMemberResponse<StreamChatGenerics>['updated_at'];\n $gte?: ChannelMemberResponse<StreamChatGenerics>['updated_at'];\n $lt?: ChannelMemberResponse<StreamChatGenerics>['updated_at'];\n $lte?: ChannelMemberResponse<StreamChatGenerics>['updated_at'];\n }\n | ChannelMemberResponse<StreamChatGenerics>['updated_at'];\n 'user.email'?:\n | RequireOnlyOne<{\n $autocomplete?: string;\n $eq?: string;\n $in?: string;\n }>\n | string;\n user_id?:\n | RequireOnlyOne<{\n $eq?: ChannelMemberResponse<StreamChatGenerics>['user_id'];\n $in?: ChannelMemberResponse<StreamChatGenerics>['user_id'][];\n }>\n | PrimitiveFilter<ChannelMemberResponse<StreamChatGenerics>['id']>;\n } & {\n [Key in keyof ContainsOperator<StreamChatGenerics['memberType']>]?:\n | RequireOnlyOne<QueryFilter<ContainsOperator<StreamChatGenerics['memberType']>[Key]>>\n | PrimitiveFilter<ContainsOperator<StreamChatGenerics['memberType']>[Key]>;\n }\n>;\n\n/**\n * Sort Types\n */\n\nexport type BannedUsersSort = BannedUsersSortBase | Array<BannedUsersSortBase>;\n\nexport type BannedUsersSortBase = { created_at?: AscDesc };\n\nexport type ReactionSort<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> =\n | ReactionSortBase<StreamChatGenerics>\n | Array<ReactionSortBase<StreamChatGenerics>>;\n\nexport type ReactionSortBase<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = Sort<\n StreamChatGenerics['reactionType']\n> & {\n created_at?: AscDesc;\n};\n\nexport type ChannelSort<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> =\n | ChannelSortBase<StreamChatGenerics>\n | Array<ChannelSortBase<StreamChatGenerics>>;\n\nexport type ChannelSortBase<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = Sort<\n StreamChatGenerics['channelType']\n> & {\n created_at?: AscDesc;\n has_unread?: AscDesc;\n last_message_at?: AscDesc;\n last_updated?: AscDesc;\n member_count?: AscDesc;\n pinned_at?: AscDesc;\n unread_count?: AscDesc;\n updated_at?: AscDesc;\n};\n\nexport type PinnedMessagesSort = PinnedMessagesSortBase | Array<PinnedMessagesSortBase>;\nexport type PinnedMessagesSortBase = { pinned_at?: AscDesc };\n\nexport type Sort<T> = {\n [P in keyof T]?: AscDesc;\n};\n\nexport type UserSort<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> =\n | Sort<UserResponse<StreamChatGenerics>>\n | Array<Sort<UserResponse<StreamChatGenerics>>>;\n\nexport type MemberSort<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> =\n | Sort<Pick<UserResponse<StreamChatGenerics>, 'id' | 'created_at' | 'last_active' | 'name' | 'updated_at'>>\n | Array<Sort<Pick<UserResponse<StreamChatGenerics>, 'id' | 'created_at' | 'last_active' | 'name' | 'updated_at'>>>;\n\nexport type SearchMessageSortBase<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = Sort<\n StreamChatGenerics['messageType']\n> & {\n attachments?: AscDesc;\n 'attachments.type'?: AscDesc;\n created_at?: AscDesc;\n id?: AscDesc;\n 'mentioned_users.id'?: AscDesc;\n parent_id?: AscDesc;\n pinned?: AscDesc;\n relevance?: AscDesc;\n reply_count?: AscDesc;\n text?: AscDesc;\n type?: AscDesc;\n updated_at?: AscDesc;\n 'user.id'?: AscDesc;\n};\n\nexport type SearchMessageSort<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> =\n | SearchMessageSortBase<StreamChatGenerics>\n | Array<SearchMessageSortBase<StreamChatGenerics>>;\n\nexport type QuerySort<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> =\n | BannedUsersSort\n | ChannelSort<StreamChatGenerics>\n | SearchMessageSort<StreamChatGenerics>\n | UserSort<StreamChatGenerics>;\n\nexport type PollSort = PollSortBase | Array<PollSortBase>;\n\nexport type PollSortBase = {\n created_at?: AscDesc;\n id?: AscDesc;\n is_closed?: AscDesc;\n name?: AscDesc;\n updated_at?: AscDesc;\n};\n\nexport type VoteSort = VoteSortBase | Array<VoteSortBase>;\n\nexport type VoteSortBase = {\n created_at?: AscDesc;\n id?: AscDesc;\n is_closed?: AscDesc;\n name?: AscDesc;\n updated_at?: AscDesc;\n};\n\n/**\n * Base Types\n */\n\nexport type Action = {\n name?: string;\n style?: string;\n text?: string;\n type?: string;\n value?: string;\n};\n\nexport type AnonUserType = {};\n\nexport type APNConfig = {\n auth_key?: string;\n auth_type?: string;\n bundle_id?: string;\n development?: boolean;\n enabled?: boolean;\n host?: string;\n key_id?: string;\n notification_template?: string;\n p12_cert?: string;\n team_id?: string;\n};\n\nexport type AgoraOptions = {\n app_certificate: string;\n app_id: string;\n role_map?: Record<string, string>;\n};\n\nexport type HMSOptions = {\n app_access_key: string;\n app_secret: string;\n default_role: string;\n default_room_template: string;\n default_region?: string;\n role_map?: Record<string, string>;\n};\n\nexport type AsyncModerationOptions = {\n callback?: {\n mode?: 'CALLBACK_MODE_NONE' | 'CALLBACK_MODE_REST' | 'CALLBACK_MODE_TWIRP';\n server_url?: string;\n };\n timeout_ms?: number;\n};\n\nexport type AppSettings = {\n agora_options?: AgoraOptions | null;\n allowed_flag_reasons?: string[];\n apn_config?: {\n auth_key?: string;\n auth_type?: string;\n bundle_id?: string;\n development?: boolean;\n host?: string;\n key_id?: string;\n notification_template?: string;\n p12_cert?: string;\n team_id?: string;\n };\n async_moderation_config?: AsyncModerationOptions;\n async_url_enrich_enabled?: boolean;\n auto_translation_enabled?: boolean;\n before_message_send_hook_url?: string;\n cdn_expiration_seconds?: number;\n custom_action_handler_url?: string;\n disable_auth_checks?: boolean;\n disable_permissions_checks?: boolean;\n enforce_unique_usernames?: 'no' | 'app' | 'team';\n // all possible file mime types are https://www.iana.org/assignments/media-types/media-types.xhtml\n file_upload_config?: FileUploadConfig;\n firebase_config?: {\n apn_template?: string;\n credentials_json?: string;\n data_template?: string;\n notification_template?: string;\n server_key?: string;\n };\n grants?: Record<string, string[]>;\n hms_options?: HMSOptions | null;\n huawei_config?: {\n id: string;\n secret: string;\n };\n image_moderation_enabled?: boolean;\n image_upload_config?: FileUploadConfig;\n migrate_permissions_to_v2?: boolean;\n multi_tenant_enabled?: boolean;\n permission_version?: 'v1' | 'v2';\n push_config?: {\n offline_only?: boolean;\n version?: string;\n };\n reminders_interval?: number;\n revoke_tokens_issued_before?: string | null;\n sns_key?: string;\n sns_secret?: string;\n sns_topic_arn?: string;\n sqs_key?: string;\n sqs_secret?: string;\n sqs_url?: string;\n video_provider?: string;\n webhook_events?: Array<string> | null;\n webhook_url?: string;\n xiaomi_config?: {\n package_name: string;\n secret: string;\n };\n};\n\nexport type Attachment<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = StreamChatGenerics['attachmentType'] & {\n actions?: Action[];\n asset_url?: string;\n author_icon?: string;\n author_link?: string;\n author_name?: string;\n color?: string;\n duration?: number;\n fallback?: string;\n fields?: Field[];\n file_size?: number | string;\n footer?: string;\n footer_icon?: string;\n giphy?: GiphyData;\n image_url?: string;\n latitude?: number;\n longitude?: number;\n mime_type?: string;\n og_scrape_url?: string;\n original_height?: number;\n original_width?: number;\n pretext?: string;\n text?: string;\n thumb_url?: string;\n title?: string;\n title_link?: string;\n type?: string;\n waveform_data?: Array<number>;\n};\n\nexport type OGAttachment = {\n og_scrape_url: string;\n asset_url?: string; // og:video | og:audio\n author_link?: string; // og:site\n author_name?: string; // og:site_name\n image_url?: string; // og:image\n text?: string; // og:description\n thumb_url?: string; // og:image\n title?: string; // og:title\n title_link?: string; // og:url\n type?: string | 'video' | 'audio' | 'image';\n};\n\nexport type BlockList = {\n name: string;\n words: string[];\n type?: string;\n validate?: boolean;\n};\n\nexport type ChannelConfig<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = ChannelConfigFields &\n CreatedAtUpdatedAt & {\n commands?: CommandVariants<StreamChatGenerics>[];\n };\n\nexport type ChannelConfigAutomod = '' | 'AI' | 'disabled' | 'simple';\n\nexport type ChannelConfigAutomodBehavior = '' | 'block' | 'flag';\n\nexport type ChannelConfigAutomodThresholds = null | {\n explicit?: { block?: number; flag?: number };\n spam?: { block?: number; flag?: number };\n toxic?: { block?: number; flag?: number };\n};\n\nexport type ChannelConfigFields = {\n reminders: boolean;\n automod?: ChannelConfigAutomod;\n automod_behavior?: ChannelConfigAutomodBehavior;\n automod_thresholds?: ChannelConfigAutomodThresholds;\n blocklist_behavior?: ChannelConfigAutomodBehavior;\n connect_events?: boolean;\n custom_events?: boolean;\n mark_messages_pending?: boolean;\n max_message_length?: number;\n message_retention?: string;\n mutes?: boolean;\n name?: string;\n polls?: boolean;\n push_notifications?: boolean;\n quotes?: boolean;\n reactions?: boolean;\n read_events?: boolean;\n replies?: boolean;\n search?: boolean;\n typing_events?: boolean;\n uploads?: boolean;\n url_enrichment?: boolean;\n};\n\nexport type ChannelConfigWithInfo<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = ChannelConfigFields &\n CreatedAtUpdatedAt & {\n commands?: CommandResponse<StreamChatGenerics>[];\n };\n\nexport type ChannelData<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = StreamChatGenerics['channelType'] & {\n blocked?: boolean;\n members?: string[] | Array<NewMemberPayload<StreamChatGenerics>>;\n name?: string;\n};\n\n/**\n * @deprecated Use ChannelMemberResponse instead\n */\nexport type ChannelMembership<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = ChannelMemberResponse<StreamChatGenerics>;\n\nexport type ChannelMute<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n user: UserResponse<StreamChatGenerics>;\n channel?: ChannelResponse<StreamChatGenerics>;\n created_at?: string;\n expires?: string;\n updated_at?: string;\n};\n\nexport type ChannelRole = {\n custom?: boolean;\n name?: string;\n owner?: boolean;\n resource?: string;\n same_team?: boolean;\n};\n\nexport type CheckPushInput<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n apn_template?: string;\n client_id?: string;\n connection_id?: string;\n firebase_data_template?: string;\n firebase_template?: string;\n message_id?: string;\n user?: UserResponse<StreamChatGenerics>;\n user_id?: string;\n};\n\nexport type PushProvider = 'apn' | 'firebase' | 'huawei' | 'xiaomi';\n\nexport type PushProviderConfig = PushProviderCommon &\n PushProviderID &\n PushProviderAPN &\n PushProviderFirebase &\n PushProviderHuawei &\n PushProviderXiaomi;\n\nexport type PushProviderID = {\n name: string;\n type: PushProvider;\n};\n\nexport type PushProviderCommon = {\n created_at: string;\n updated_at: string;\n description?: string;\n disabled_at?: string;\n disabled_reason?: string;\n};\n\nexport type PushProviderAPN = {\n apn_auth_key?: string;\n apn_auth_type?: 'token' | 'certificate';\n apn_development?: boolean;\n apn_host?: string;\n apn_key_id?: string;\n apn_notification_template?: string;\n apn_p12_cert?: string;\n apn_team_id?: string;\n apn_topic?: string;\n};\n\nexport type PushProviderFirebase = {\n firebase_apn_template?: string;\n firebase_credentials?: string;\n firebase_data_template?: string;\n firebase_notification_template?: string;\n firebase_server_key?: string;\n};\n\nexport type PushProviderHuawei = {\n huawei_app_id?: string;\n huawei_app_secret?: string;\n};\n\nexport type PushProviderXiaomi = {\n xiaomi_package_name?: string;\n xiaomi_secret?: string;\n};\n\nexport type CommandVariants<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> =\n | 'all'\n | 'ban'\n | 'fun_set'\n | 'giphy'\n | 'moderation_set'\n | 'mute'\n | 'unban'\n | 'unmute'\n | StreamChatGenerics['commandType'];\n\nexport type Configs<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = Record<\n string,\n ChannelConfigWithInfo<StreamChatGenerics> | undefined\n>;\n\nexport type ConnectionOpen<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n connection_id: string;\n cid?: string;\n created_at?: string;\n me?: OwnUserResponse<StreamChatGenerics>;\n type?: string;\n};\n\nexport type CreatedAtUpdatedAt = {\n created_at: string;\n updated_at: string;\n};\n\nexport type Device<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = DeviceFields & {\n provider?: string;\n user?: UserResponse<StreamChatGenerics>;\n user_id?: string;\n};\n\nexport type BaseDeviceFields = {\n id: string;\n push_provider: PushProvider;\n push_provider_name?: string;\n};\n\nexport type DeviceFields = BaseDeviceFields & {\n created_at: string;\n disabled?: boolean;\n disabled_reason?: string;\n};\n\nexport type EndpointName =\n | 'Connect'\n | 'LongPoll'\n | 'DeleteFile'\n | 'DeleteImage'\n | 'DeleteMessage'\n | 'DeleteUser'\n | 'DeleteUsers'\n | 'DeactivateUser'\n | 'ExportUser'\n | 'DeleteReaction'\n | 'UpdateChannel'\n | 'UpdateChannelPartial'\n | 'UpdateMessage'\n | 'UpdateMessagePartial'\n | 'GetMessage'\n | 'GetManyMessages'\n | 'UpdateUsers'\n | 'UpdateUsersPartial'\n | 'CreateGuest'\n | 'GetOrCreateChannel'\n | 'StopWatchingChannel'\n | 'QueryChannels'\n | 'Search'\n | 'QueryUsers'\n | 'QueryMembers'\n | 'QueryBannedUsers'\n | 'QueryFlags'\n | 'QueryMessageFlags'\n | 'GetReactions'\n | 'GetReplies'\n | 'GetPinnedMessages'\n | 'Ban'\n | 'Unban'\n | 'MuteUser'\n | 'MuteChannel'\n | 'UnmuteChannel'\n | 'UnmuteUser'\n | 'RunMessageAction'\n | 'SendEvent'\n | 'SendUserCustomEvent'\n | 'MarkRead'\n | 'MarkChannelsRead'\n | 'SendMessage'\n | 'ImportChannelMessages'\n | 'UploadFile'\n | 'UploadImage'\n | 'UpdateApp'\n | 'GetApp'\n | 'CreateDevice'\n | 'DeleteDevice'\n | 'SendReaction'\n | 'Flag'\n | 'Unflag'\n | 'Unblock'\n | 'QueryFlagReports'\n | 'FlagReportReview'\n | 'CreateChannelType'\n | 'DeleteChannel'\n | 'DeleteChannels'\n | 'DeleteChannelType'\n | 'GetChannelType'\n | 'ListChannelTypes'\n | 'ListDevices'\n | 'TruncateChannel'\n | 'UpdateChannelType'\n | 'CheckPush'\n | 'PrivateSubmitModeration'\n | 'ReactivateUser'\n | 'HideChannel'\n | 'ShowChannel'\n | 'CreatePermission'\n | 'UpdatePermission'\n | 'GetPermission'\n | 'DeletePermission'\n | 'ListPermissions'\n | 'CreateRole'\n | 'DeleteRole'\n | 'ListRoles'\n | 'ListCustomRoles'\n | 'Sync'\n | 'TranslateMessage'\n | 'CreateCommand'\n | 'GetCommand'\n | 'UpdateCommand'\n | 'DeleteCommand'\n | 'ListCommands'\n | 'CreateBlockList'\n | 'UpdateBlockList'\n | 'GetBlockList'\n | 'ListBlockLists'\n | 'DeleteBlockList'\n | 'ExportChannels'\n | 'GetExportChannelsStatus'\n | 'CheckSQS'\n | 'GetRateLimits'\n | 'CreateSegment'\n | 'GetSegment'\n | 'QuerySegments'\n | 'UpdateSegment'\n | 'DeleteSegment'\n | 'CreateCampaign'\n | 'GetCampaign'\n | 'ListCampaigns'\n | 'UpdateCampaign'\n | 'DeleteCampaign'\n | 'ScheduleCampaign'\n | 'StopCampaign'\n | 'ResumeCampaign'\n | 'TestCampaign'\n | 'GetOG'\n | 'GetTask'\n | 'ExportUsers'\n | 'CreateImport'\n | 'CreateImportURL'\n | 'GetImport'\n | 'ListImports'\n | 'UpsertPushProvider'\n | 'DeletePushProvider'\n | 'ListPushProviders'\n | 'CreatePoll';\n\nexport type ExportChannelRequest = {\n id: string;\n type: string;\n cid?: string;\n messages_since?: Date;\n messages_until?: Date;\n};\n\nexport type ExportChannelOptions = {\n clear_deleted_message_text?: boolean;\n export_users?: boolean;\n include_soft_deleted_channels?: boolean;\n include_truncated_messages?: boolean;\n version?: string;\n};\n\nexport type ExportUsersRequest = {\n user_ids: string[];\n};\n\nexport type Field = {\n short?: boolean;\n title?: string;\n value?: string;\n};\n\nexport type FileUploadConfig = {\n allowed_file_extensions?: string[] | null;\n allowed_mime_types?: string[] | null;\n blocked_file_extensions?: string[] | null;\n blocked_mime_types?: string[] | null;\n size_limit?: number | null;\n};\n\nexport type FirebaseConfig = {\n apn_template?: string;\n credentials_json?: string;\n data_template?: string;\n enabled?: boolean;\n notification_template?: string;\n server_key?: string;\n};\n\ntype GiphyVersionInfo = {\n height: string;\n url: string;\n width: string;\n frames?: string;\n size?: string;\n};\n\ntype GiphyVersions =\n | 'original'\n | 'fixed_height'\n | 'fixed_height_still'\n | 'fixed_height_downsampled'\n | 'fixed_width'\n | 'fixed_width_still'\n | 'fixed_width_downsampled';\n\ntype GiphyData = {\n [key in GiphyVersions]: GiphyVersionInfo;\n};\n\nexport type HuaweiConfig = {\n enabled?: boolean;\n id?: string;\n secret?: string;\n};\n\nexport type XiaomiConfig = {\n enabled?: boolean;\n package_name?: string;\n secret?: string;\n};\n\nexport type LiteralStringForUnion = string & {};\n\nexport type LogLevel = 'info' | 'error' | 'warn';\n\nexport type Logger = (logLevel: LogLevel, message: string, extraData?: Record<string, unknown>) => void;\n\nexport type Message<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = Partial<\n MessageBase<StreamChatGenerics>\n> & {\n mentioned_users?: string[];\n};\n\nexport type MessageBase<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = StreamChatGenerics['messageType'] & {\n id: string;\n attachments?: Attachment<StreamChatGenerics>[];\n html?: string;\n mml?: string;\n parent_id?: string;\n pin_expires?: string | null;\n pinned?: boolean;\n pinned_at?: string | null;\n poll_id?: string;\n quoted_message_id?: string;\n show_in_channel?: boolean;\n silent?: boolean;\n text?: string;\n user?: UserResponse<StreamChatGenerics> | null;\n user_id?: string;\n};\n\nexport type MessageLabel = 'deleted' | 'ephemeral' | 'error' | 'regular' | 'reply' | 'system';\n\nexport type SendMessageOptions = {\n force_moderation?: boolean;\n is_pending_message?: boolean;\n keep_channel_hidden?: boolean;\n pending?: boolean;\n pending_message_metadata?: Record<string, string>;\n skip_enrich_url?: boolean;\n skip_push?: boolean;\n};\n\nexport type UpdateMessageOptions = {\n skip_enrich_url?: boolean;\n};\n\nexport type GetMessageOptions = {\n show_deleted_message?: boolean;\n};\n\nexport type Mute<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n created_at: string;\n target: UserResponse<StreamChatGenerics>;\n updated_at: string;\n user: UserResponse<StreamChatGenerics>;\n};\n\nexport type PartialUpdateChannel<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n set?: Partial<ChannelResponse<StreamChatGenerics>>;\n unset?: Array<keyof ChannelResponse<StreamChatGenerics>>;\n};\n\nexport type PartialUpdateMember<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n set?: ChannelMemberUpdates<StreamChatGenerics>;\n unset?: Array<keyof ChannelMemberUpdates<StreamChatGenerics>>;\n};\n\nexport type PartialUserUpdate<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n id: string;\n set?: Partial<UserResponse<StreamChatGenerics>>;\n unset?: Array<keyof UserResponse<StreamChatGenerics>>;\n};\n\nexport type MessageUpdatableFields<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = Omit<\n MessageResponse<StreamChatGenerics>,\n 'cid' | 'created_at' | 'updated_at' | 'deleted_at' | 'user' | 'user_id'\n>;\n\nexport type PartialMessageUpdate<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n set?: Partial<MessageUpdatableFields<StreamChatGenerics>>;\n unset?: Array<keyof MessageUpdatableFields<StreamChatGenerics>>;\n};\n\nexport type PendingMessageResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n message: MessageResponse<StreamChatGenerics>;\n pending_message_metadata?: Record<string, string>;\n};\n\nexport type PermissionAPIObject = {\n action?: string;\n condition?: object;\n custom?: boolean;\n description?: string;\n id?: string;\n level?: string;\n name?: string;\n owner?: boolean;\n same_team?: boolean;\n tags?: string[];\n};\n\nexport type PermissionObject = {\n action?: 'Deny' | 'Allow';\n name?: string;\n owner?: boolean;\n priority?: number;\n resources?: string[];\n roles?: string[];\n};\n\nexport type Policy = {\n action?: 0 | 1;\n created_at?: string;\n name?: string;\n owner?: boolean;\n priority?: number;\n resources?: string[];\n roles?: string[] | null;\n updated_at?: string;\n};\n\nexport type RateLimitsInfo = {\n limit: number;\n remaining: number;\n reset: number;\n};\n\nexport type RateLimitsMap = Record<EndpointName, RateLimitsInfo>;\n\nexport type Reaction<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = StreamChatGenerics['reactionType'] & {\n type: string;\n message_id?: string;\n score?: number;\n user?: UserResponse<StreamChatGenerics> | null;\n user_id?: string;\n};\n\nexport type Resource =\n | 'AddLinks'\n | 'BanUser'\n | 'CreateChannel'\n | 'CreateMessage'\n | 'CreateReaction'\n | 'DeleteAttachment'\n | 'DeleteChannel'\n | 'DeleteMessage'\n | 'DeleteReaction'\n | 'EditUser'\n | 'MuteUser'\n | 'ReadChannel'\n | 'RunMessageAction'\n | 'UpdateChannel'\n | 'UpdateChannelMembers'\n | 'UpdateMessage'\n | 'UpdateUser'\n | 'UploadAttachment';\n\nexport type SearchPayload<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = Omit<\n SearchOptions<StreamChatGenerics>,\n 'sort'\n> & {\n client_id?: string;\n connection_id?: string;\n filter_conditions?: ChannelFilters<StreamChatGenerics>;\n message_filter_conditions?: MessageFilters<StreamChatGenerics>;\n message_options?: MessageOptions;\n query?: string;\n sort?: Array<{\n direction: AscDesc;\n field: keyof SearchMessageSortBase<StreamChatGenerics>;\n }>;\n};\n\nexport type TestPushDataInput = {\n apnTemplate?: string;\n firebaseDataTemplate?: string;\n firebaseTemplate?: string;\n messageID?: string;\n pushProviderName?: string;\n pushProviderType?: PushProvider;\n skipDevices?: boolean;\n};\n\nexport type TestSQSDataInput = {\n sqs_key?: string;\n sqs_secret?: string;\n sqs_url?: string;\n};\n\nexport type TestSNSDataInput = {\n sns_key?: string;\n sns_secret?: string;\n sns_topic_arn?: string;\n};\n\nexport type TokenOrProvider = null | string | TokenProvider | undefined;\n\nexport type TokenProvider = () => Promise<string>;\n\nexport type TranslationLanguages =\n | ''\n | 'af'\n | 'am'\n | 'ar'\n | 'az'\n | 'bg'\n | 'bn'\n | 'bs'\n | 'cs'\n | 'da'\n | 'de'\n | 'el'\n | 'en'\n | 'es'\n | 'es-MX'\n | 'et'\n | 'fa'\n | 'fa-AF'\n | 'fi'\n | 'fr'\n | 'fr-CA'\n | 'ha'\n | 'he'\n | 'hi'\n | 'hr'\n | 'hu'\n | 'id'\n | 'it'\n | 'ja'\n | 'ka'\n | 'ko'\n | 'lt'\n | 'lv'\n | 'ms'\n | 'nl'\n | 'no'\n | 'pl'\n | 'ps'\n | 'pt'\n | 'ro'\n | 'ru'\n | 'sk'\n | 'sl'\n | 'so'\n | 'sq'\n | 'sr'\n | 'sv'\n | 'sw'\n | 'ta'\n | 'th'\n | 'tl'\n | 'tr'\n | 'uk'\n | 'ur'\n | 'vi'\n | 'zh'\n | 'zh-TW';\n\nexport type TypingStartEvent = Event;\n\nexport type ReservedMessageFields =\n | 'command'\n | 'created_at'\n | 'html'\n | 'latest_reactions'\n | 'own_reactions'\n | 'quoted_message'\n | 'reaction_counts'\n | 'reply_count'\n | 'type'\n | 'updated_at'\n | 'user'\n | '__html';\n\nexport type UpdatedMessage<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = Omit<\n MessageResponse<StreamChatGenerics>,\n 'mentioned_users'\n> & { mentioned_users?: string[] };\n\nexport type User<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = StreamChatGenerics['userType'] & {\n id: string;\n anon?: boolean;\n name?: string;\n role?: string;\n teams?: string[];\n username?: string;\n};\n\nexport type TaskResponse = {\n task_id: string;\n};\n\nexport type DeleteChannelsResponse = {\n result: Record<string, string>;\n} & Partial<TaskResponse>;\n\nexport type DeleteType = 'soft' | 'hard' | 'pruning';\n\n/*\n DeleteUserOptions specifies a collection of one or more `user_ids` to be deleted.\n\n `user`:\n - soft: marks user as deleted and retains all user data\n - pruning: marks user as deleted and nullifies user information\n - hard: deletes user completely - this requires hard option for messages and conversation as well\n `conversations`:\n - soft: marks all conversation channels as deleted (same effect as Delete Channels with 'hard' option disabled)\n - hard: deletes channel and all its data completely including messages (same effect as Delete Channels with 'hard' option enabled)\n `messages`:\n - soft: marks all user messages as deleted without removing any related message data\n - pruning: marks all user messages as deleted, nullifies message information and removes some message data such as reactions and flags\n - hard: deletes messages completely with all related information\n `new_channel_owner_id`: any channels owned by the hard-deleted user will be transferred to this user ID\n */\nexport type DeleteUserOptions = {\n conversations?: Exclude<DeleteType, 'pruning'>;\n messages?: DeleteType;\n new_channel_owner_id?: string;\n user?: DeleteType;\n};\n\nexport type SegmentType = 'channel' | 'user';\n\nexport type SegmentData = {\n all_sender_channels?: boolean;\n all_users?: boolean;\n description?: string;\n filter?: {};\n name?: string;\n};\n\nexport type SegmentResponse = {\n created_at: string;\n deleted_at: string;\n id: string;\n locked: boolean;\n size: number;\n task_id: string;\n type: SegmentType;\n updated_at: string;\n} & SegmentData;\n\nexport type UpdateSegmentData = {\n name: string;\n} & SegmentData;\n\nexport type SegmentTargetsResponse = {\n created_at: string;\n segment_id: string;\n target_id: string;\n};\n\nexport type SortParam = {\n field: string;\n direction?: AscDesc;\n};\n\nexport type Pager = {\n limit?: number;\n next?: string;\n prev?: string;\n};\n\nexport type QuerySegmentsOptions = Pager;\n\nexport type QuerySegmentTargetsFilter = {\n target_id?: {\n $eq?: string;\n $gte?: string;\n $in?: string[];\n $lte?: string;\n };\n};\nexport type QuerySegmentTargetsOptions = Pick<Pager, 'next' | 'limit'>;\n\nexport type CampaignSort = {\n field: string;\n direction?: number;\n}[];\n\nexport type CampaignQueryOptions = {\n limit?: number;\n next?: string;\n prev?: string;\n sort?: CampaignSort;\n};\n\nexport type SegmentQueryOptions = CampaignQueryOptions;\n\n// TODO: add better typing\nexport type CampaignFilters = {};\n\nexport type CampaignData = {\n channel_template?: {\n type: string;\n custom?: {};\n id?: string;\n members?: string[];\n team?: string;\n };\n create_channels?: boolean;\n deleted_at?: string;\n description?: string;\n id?: string | null;\n message_template?: {\n text: string;\n attachments?: Attachment[];\n custom?: {};\n poll_id?: string;\n };\n name?: string;\n segment_ids?: string[];\n sender_id?: string;\n sender_mode?: 'exclude' | 'include' | null;\n skip_push?: boolean;\n skip_webhook?: boolean;\n user_ids?: string[];\n};\n\nexport type CampaignStats = {\n progress?: number;\n stats_channels_created?: number;\n stats_completed_at?: string;\n stats_messages_sent?: number;\n stats_started_at?: string;\n};\nexport type CampaignResponse = {\n created_at: string;\n id: string;\n segments: SegmentResponse[];\n sender: UserResponse;\n stats: CampaignStats;\n status: 'draft' | 'scheduled' | 'in_progress' | 'completed' | 'stopped';\n updated_at: string;\n users: UserResponse[];\n scheduled_for?: string;\n} & CampaignData;\n\nexport type DeleteCampaignOptions = {};\n\nexport type TaskStatus = {\n created_at: string;\n status: string;\n task_id: string;\n updated_at: string;\n error?: {\n description: string;\n type: string;\n };\n result?: UR;\n};\n\nexport type TruncateOptions<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n hard_delete?: boolean;\n message?: Message<StreamChatGenerics>;\n skip_push?: boolean;\n truncated_at?: Date;\n user?: UserResponse<StreamChatGenerics>;\n user_id?: string;\n};\n\nexport type CreateImportURLResponse = {\n path: string;\n upload_url: string;\n};\n\nexport type CreateImportResponse = {\n import_task: ImportTask;\n};\n\nexport type GetImportResponse = {\n import_task: ImportTask;\n};\n\nexport type CreateImportOptions = {\n mode: 'insert' | 'upsert';\n};\n\nexport type ListImportsPaginationOptions = {\n limit?: number;\n offset?: number;\n};\n\nexport type ListImportsResponse = {\n import_tasks: ImportTask[];\n};\n\nexport type ImportTaskHistory = {\n created_at: string;\n next_state: string;\n prev_state: string;\n};\n\nexport type ImportTask = {\n created_at: string;\n history: ImportTaskHistory[];\n id: string;\n path: string;\n state: string;\n updated_at: string;\n result?: UR;\n size?: number;\n};\n\nexport type MessageSetType = 'latest' | 'current' | 'new';\nexport type MessageSet<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n isCurrent: boolean;\n isLatest: boolean;\n messages: FormatMessageResponse<StreamChatGenerics>[];\n pagination: { hasNext: boolean; hasPrev: boolean };\n};\n\nexport type PushProviderUpsertResponse = {\n push_provider: PushProvider;\n};\n\nexport type PushProviderListResponse = {\n push_providers: PushProvider[];\n};\n\nexport type CreateCallOptions<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n id: string;\n type: string;\n options?: UR;\n user?: UserResponse<StreamChatGenerics> | null;\n user_id?: string;\n};\n\nexport type HMSCall = {\n room: string;\n};\n\nexport type AgoraCall = {\n channel: string;\n};\n\nexport type Call = {\n id: string;\n provider: string;\n agora?: AgoraCall;\n hms?: HMSCall;\n};\n\nexport type CreateCallResponse = APIResponse & {\n call: Call;\n token: string;\n agora_app_id?: string;\n agora_uid?: number;\n};\n\nexport type GetCallTokenResponse = APIResponse & {\n token: string;\n agora_app_id?: string;\n agora_uid?: number;\n};\n\ntype ErrorResponseDetails = {\n code: number;\n messages: string[];\n};\n\nexport type APIErrorResponse = {\n code: number;\n duration: string;\n message: string;\n more_info: string;\n StatusCode: number;\n details?: ErrorResponseDetails;\n};\n\nexport class ErrorFromResponse<T> extends Error {\n code?: number;\n response?: AxiosResponse<T>;\n status?: number;\n}\n\nexport type QueryPollsResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n polls: PollResponse<StreamChatGenerics>[];\n next?: string;\n};\n\nexport type CreatePollAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n poll: PollResponse<StreamChatGenerics>;\n};\n\nexport type GetPollAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n poll: PollResponse<StreamChatGenerics>;\n};\n\nexport type UpdatePollAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n poll: PollResponse<StreamChatGenerics>;\n};\n\nexport type PollResponse<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = StreamChatGenerics['pollType'] &\n PollEnrichData<StreamChatGenerics> & {\n created_at: string;\n created_by: UserResponse<StreamChatGenerics> | null;\n created_by_id: string;\n enforce_unique_vote: boolean;\n id: string;\n max_votes_allowed: number;\n name: string;\n options: PollOption<StreamChatGenerics>[];\n updated_at: string;\n allow_answers?: boolean;\n allow_user_suggested_options?: boolean;\n description?: string;\n is_closed?: boolean;\n voting_visibility?: VotingVisibility;\n };\n\nexport type PollOption<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n created_at: string;\n id: string;\n poll_id: string;\n text: string;\n updated_at: string;\n vote_count: number;\n votes?: PollVote<StreamChatGenerics>[];\n};\n\nexport enum VotingVisibility {\n anonymous = 'anonymous',\n public = 'public',\n}\n\nexport type PollEnrichData<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n answers_count: number;\n latest_answers: PollAnswer<StreamChatGenerics>[]; // not updated with WS events, ordered DESC by created_at, seems like updated_at cannot be different from created_at\n latest_votes_by_option: Record<string, PollVote<StreamChatGenerics>[]>; // not updated with WS events; always null in anonymous polls\n vote_count: number;\n vote_counts_by_option: Record<string, number>;\n own_votes?: (PollVote<StreamChatGenerics> | PollAnswer<StreamChatGenerics>)[]; // not updated with WS events\n};\n\nexport type PollData<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = StreamChatGenerics['pollType'] & {\n id: string;\n name: string;\n allow_answers?: boolean;\n allow_user_suggested_options?: boolean;\n description?: string;\n enforce_unique_vote?: boolean;\n is_closed?: boolean;\n max_votes_allowed?: number;\n options?: PollOptionData<StreamChatGenerics>[];\n user_id?: string;\n voting_visibility?: VotingVisibility;\n};\n\nexport type CreatePollData<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = Partial<\n PollData<StreamChatGenerics>\n> &\n Pick<PollData<StreamChatGenerics>, 'name'>;\n\nexport type PartialPollUpdate<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n set?: Partial<PollData<StreamChatGenerics>>;\n unset?: Array<keyof PollData<StreamChatGenerics>>;\n};\n\nexport type PollOptionData<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = StreamChatGenerics['pollOptionType'] & {\n text: string;\n id?: string;\n position?: number;\n};\n\nexport type PartialPollOptionUpdate<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n set?: Partial<PollOptionResponse<StreamChatGenerics>>;\n unset?: Array<keyof PollOptionResponse<StreamChatGenerics>>;\n};\n\nexport type PollVoteData = {\n answer_text?: string;\n is_answer?: boolean;\n option_id?: string;\n};\n\nexport type PollPaginationOptions = {\n limit?: number;\n next?: string;\n};\n\nexport type CreatePollOptionAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n poll_option: PollOptionResponse<StreamChatGenerics>;\n};\n\nexport type GetPollOptionAPIResponse<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = CreatePollOptionAPIResponse<StreamChatGenerics>;\nexport type UpdatePollOptionAPIResponse<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = CreatePollOptionAPIResponse<StreamChatGenerics>;\n\nexport type PollOptionResponse<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = StreamChatGenerics['pollType'] & {\n created_at: string;\n id: string;\n poll_id: string;\n position: number;\n text: string;\n updated_at: string;\n vote_count: number;\n votes?: PollVote<StreamChatGenerics>[];\n};\n\nexport type PollVote<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n created_at: string;\n id: string;\n poll_id: string;\n updated_at: string;\n option_id?: string;\n user?: UserResponse<StreamChatGenerics>;\n user_id?: string;\n};\n\nexport type PollAnswer<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = Exclude<\n PollVote<StreamChatGenerics>,\n 'option_id'\n> & {\n answer_text: string;\n is_answer: boolean; // this is absolutely redundant prop as answer_text indicates that a vote is an answer\n};\n\nexport type PollVotesAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n votes: (PollVote<StreamChatGenerics> | PollAnswer<StreamChatGenerics>)[];\n next?: string;\n};\n\nexport type PollAnswersAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n votes: PollAnswer<StreamChatGenerics>[]; // todo: should be changes to answers?\n next?: string;\n};\n\nexport type CastVoteAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n vote: PollVote<StreamChatGenerics> | PollAnswer<StreamChatGenerics>;\n};\n\nexport type QueryMessageHistoryFilters = QueryFilters<\n {\n message_id?:\n | RequireOnlyOne<Pick<QueryFilter<MessageHistoryEntry['message_id']>, '$eq' | '$in'>>\n | PrimitiveFilter<MessageHistoryEntry['message_id']>;\n } & {\n user_id?:\n | RequireOnlyOne<Pick<QueryFilter<MessageHistoryEntry['message_updated_by_id']>, '$eq' | '$in'>>\n | PrimitiveFilter<MessageHistoryEntry['message_updated_by_id']>;\n } & {\n created_at?:\n | RequireOnlyOne<\n Pick<QueryFilter<MessageHistoryEntry['message_updated_at']>, '$eq' | '$gt' | '$lt' | '$gte' | '$lte'>\n >\n | PrimitiveFilter<MessageHistoryEntry['message_updated_at']>;\n }\n>;\n\nexport type QueryMessageHistorySort = QueryMessageHistorySortBase | Array<QueryMessageHistorySortBase>;\n\nexport type QueryMessageHistorySortBase = {\n message_updated_at?: AscDesc;\n message_updated_by_id?: AscDesc;\n};\n\nexport type QueryMessageHistoryOptions = Pager;\n\nexport type MessageHistoryEntry<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n message_id: string;\n message_updated_at: string;\n attachments?: Attachment<StreamChatGenerics>[];\n message_updated_by_id?: string;\n text?: string;\n};\n\nexport type QueryMessageHistoryResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n message_history: MessageHistoryEntry<StreamChatGenerics>[];\n next?: string;\n prev?: string;\n};\n\n// Moderation v2\nexport type ModerationPayload = {\n created_at: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n custom?: Record<string, any>;\n images?: string[];\n texts?: string[];\n videos?: string[];\n};\n\nexport type ModV2ReviewStatus = 'complete' | 'flagged' | 'partial';\n\nexport type ModerationFlag = {\n created_at: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n custom: Record<string, any>;\n entity_creator_id: string;\n entity_id: string;\n entity_type: string;\n id: string;\n reason: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n result: Record<string, any>[];\n review_queue_item_id: string;\n updated_at: string;\n user: UserResponse;\n moderation_payload?: ModerationPayload;\n moderation_payload_hash?: string;\n};\n\nexport type ReviewQueueItem = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n actions_taken: any[];\n appealed_by: string;\n assigned_to: string;\n completed_at: string;\n config_key: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n context: any[];\n created_at: string;\n created_by: string;\n entity_id: string;\n entity_type: string;\n flags: ModerationFlag[];\n has_image: boolean;\n has_text: boolean;\n has_video: boolean;\n id: string;\n moderation_payload: ModerationPayload;\n moderation_payload_hash: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n options: any;\n recommended_action: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n results: any;\n reviewed_at: string;\n status: string;\n updated_at: string;\n};\n\nexport type CustomCheckFlag = {\n type: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n custom?: Record<string, any>[];\n labels?: string[];\n reason?: string;\n};\n\nexport type SubmitActionOptions = {\n ban?: {\n channel_ban_only?: boolean;\n reason?: string;\n timeout?: number;\n };\n delete_message?: {\n hard_delete?: boolean;\n };\n delete_user?: {\n delete_conversation_channels?: boolean;\n hard_delete?: boolean;\n mark_messages_deleted?: boolean;\n };\n restore?: {};\n unban?: {\n channel_cid?: string;\n };\n user_id?: string;\n};\n\nexport type GetUserModerationReportResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n user: UserResponse<StreamChatGenerics>;\n user_blocks?: Array<{\n blocked_at: string;\n blocked_by_user_id: string;\n blocked_user_id: string;\n }>;\n user_mutes?: Mute<StreamChatGenerics>[];\n};\n\nexport type QueryModerationConfigsFilters = QueryFilters<\n {\n key?: string;\n } & {\n created_at?: PrimitiveFilter<string>;\n } & {\n updated_at?: PrimitiveFilter<string>;\n } & {\n team?: string;\n }\n>;\n\nexport type ReviewQueueFilters = QueryFilters<\n {\n assigned_to?:\n | RequireOnlyOne<Pick<QueryFilter<ReviewQueueItem['assigned_to']>, '$eq' | '$in'>>\n | PrimitiveFilter<ReviewQueueItem['assigned_to']>;\n } & {\n completed_at?:\n | RequireOnlyOne<Pick<QueryFilter<ReviewQueueItem['completed_at']>, '$eq' | '$gt' | '$lt' | '$gte' | '$lte'>>\n | PrimitiveFilter<ReviewQueueItem['completed_at']>;\n } & {\n config_key?:\n | RequireOnlyOne<Pick<QueryFilter<ReviewQueueItem['config_key']>, '$eq' | '$in'>>\n | PrimitiveFilter<ReviewQueueItem['config_key']>;\n } & {\n entity_type?:\n | RequireOnlyOne<Pick<QueryFilter<ReviewQueueItem['entity_type']>, '$eq' | '$in'>>\n | PrimitiveFilter<ReviewQueueItem['entity_type']>;\n } & {\n created_at?:\n | RequireOnlyOne<Pick<QueryFilter<ReviewQueueItem['created_at']>, '$eq' | '$gt' | '$lt' | '$gte' | '$lte'>>\n | PrimitiveFilter<ReviewQueueItem['created_at']>;\n } & {\n id?:\n | RequireOnlyOne<Pick<QueryFilter<ReviewQueueItem['id']>, '$eq' | '$in'>>\n | PrimitiveFilter<ReviewQueueItem['id']>;\n } & {\n entity_id?:\n | RequireOnlyOne<Pick<QueryFilter<ReviewQueueItem['entity_id']>, '$eq' | '$in'>>\n | PrimitiveFilter<ReviewQueueItem['entity_id']>;\n } & {\n reviewed?: boolean;\n } & {\n reviewed_at?:\n | RequireOnlyOne<Pick<QueryFilter<ReviewQueueItem['reviewed_at']>, '$eq' | '$gt' | '$lt' | '$gte' | '$lte'>>\n | PrimitiveFilter<ReviewQueueItem['reviewed_at']>;\n } & {\n status?:\n | RequireOnlyOne<Pick<QueryFilter<ReviewQueueItem['status']>, '$eq' | '$in'>>\n | PrimitiveFilter<ReviewQueueItem['status']>;\n } & {\n updated_at?:\n | RequireOnlyOne<Pick<QueryFilter<ReviewQueueItem['updated_at']>, '$eq' | '$gt' | '$lt' | '$gte' | '$lte'>>\n | PrimitiveFilter<ReviewQueueItem['updated_at']>;\n } & {\n has_image?: boolean;\n } & {\n has_text?: boolean;\n } & {\n has_video?: boolean;\n } & {\n team?: string;\n }\n>;\n\nexport type ReviewQueueSort =\n | Sort<Pick<ReviewQueueItem, 'id' | 'created_at' | 'updated_at'>>\n | Array<Sort<Pick<ReviewQueueItem, 'id' | 'created_at' | 'updated_at'>>>;\n\nexport type QueryModerationConfigsSort = Array<Sort<'key' | 'created_at' | 'updated_at'>>;\n\nexport type ReviewQueuePaginationOptions = Pager;\n\nexport type ReviewQueueResponse = {\n items: ReviewQueueItem[];\n next?: string;\n prev?: string;\n};\n\nexport type ModerationConfig = {\n key: string;\n ai_image_config?: AIImageConfig;\n ai_text_config?: AITextConfig;\n ai_video_config?: AIVideoConfig;\n automod_platform_circumvention_config?: AutomodPlatformCircumventionConfig;\n automod_semantic_filters_config?: AutomodSemanticFiltersConfig;\n automod_toxicity_config?: AutomodToxicityConfig;\n block_list_config?: BlockListConfig;\n team?: string;\n};\n\nexport type ModerationConfigResponse = ModerationConfig & {\n created_at: string;\n updated_at: string;\n};\n\nexport type GetConfigResponse = {\n config: ModerationConfigResponse;\n};\n\nexport type QueryConfigsResponse = {\n configs: ModerationConfigResponse[];\n next?: string;\n prev?: string;\n};\n\nexport type UpsertConfigResponse = {\n config: ModerationConfigResponse;\n};\n\nexport type ModerationFlagOptions = {\n custom?: Record<string, unknown>;\n moderation_payload?: ModerationPayload;\n user_id?: string;\n};\n\nexport type ModerationMuteOptions = {\n timeout?: number;\n user_id?: string;\n};\nexport type GetUserModerationReportOptions = {\n create_user_if_not_exists?: boolean;\n include_user_blocks?: boolean;\n include_user_mutes?: boolean;\n};\n\nexport type AIState =\n | 'AI_STATE_ERROR'\n | 'AI_STATE_CHECKING_SOURCES'\n | 'AI_STATE_THINKING'\n | 'AI_STATE_GENERATING'\n | (string & {});\n\nexport type ModerationActionType = 'flag' | 'shadow' | 'remove' | 'bounce' | 'bounce_flag' | 'bounce_remove';\n\nexport type AutomodRule = {\n action: ModerationActionType;\n label: string;\n threshold: number;\n};\n\nexport type BlockListRule = {\n action: ModerationActionType;\n name?: string;\n};\n\nexport type BlockListConfig = {\n enabled: boolean;\n rules: BlockListRule[];\n async?: boolean;\n};\n\nexport type AutomodToxicityConfig = {\n enabled: boolean;\n rules: AutomodRule[];\n async?: boolean;\n};\n\nexport type AutomodPlatformCircumventionConfig = {\n enabled: boolean;\n rules: AutomodRule[];\n async?: boolean;\n};\n\nexport type AutomodSemanticFiltersRule = {\n action: ModerationActionType;\n name: string;\n threshold: number;\n};\n\nexport type AutomodSemanticFiltersConfig = {\n enabled: boolean;\n rules: AutomodSemanticFiltersRule[];\n async?: boolean;\n};\n\nexport type AITextSeverityRule = {\n action: ModerationActionType;\n severity: 'low' | 'medium' | 'high' | 'critical';\n};\n\nexport type AITextRule = {\n label: string;\n action?: ModerationActionType;\n severity_rules?: AITextSeverityRule[];\n};\n\nexport type AITextConfig = {\n enabled: boolean;\n rules: AITextRule[];\n async?: boolean;\n profile?: string;\n severity_rules?: AITextSeverityRule[]; // Deprecated: use rules instead\n};\n\nexport type AIImageRule = {\n action: ModerationActionType;\n label: string;\n min_confidence?: number;\n};\n\nexport type AIImageConfig = {\n enabled: boolean;\n rules: AIImageRule[];\n async?: boolean;\n};\n\nexport type AIVideoRule = {\n action: ModerationActionType;\n label: string;\n min_confidence?: number;\n};\n\nexport type AIVideoConfig = {\n enabled: boolean;\n rules: AIVideoRule[];\n async?: boolean;\n};\n\nexport type VelocityFilterConfigRule = {\n action: 'flag' | 'shadow' | 'remove' | 'ban';\n ban_duration?: number;\n cascading_action?: 'flag' | 'shadow' | 'remove' | 'ban';\n cascading_threshold?: number;\n check_message_context?: boolean;\n fast_spam_threshold?: number;\n fast_spam_ttl?: number;\n ip_ban?: boolean;\n shadow_ban?: boolean;\n slow_spam_ban_duration?: number;\n slow_spam_threshold?: number;\n slow_spam_ttl?: number;\n};\n\nexport type VelocityFilterConfig = {\n cascading_actions: boolean;\n enabled: boolean;\n first_message_only: boolean;\n rules: VelocityFilterConfigRule[];\n async?: boolean;\n};\n","export type Patch<T> = (value: T) => T;\nexport type Handler<T> = (nextValue: T, previousValue: T | undefined) => void;\nexport type Unsubscribe = () => void;\n\nfunction isPatch<T>(value: T | Patch<T>): value is Patch<T> {\n return typeof value === 'function';\n}\n\nexport class StateStore<T extends Record<string, unknown>> {\n private handlerSet = new Set<Handler<T>>();\n\n private static logCount = 5;\n\n constructor(private value: T) {}\n\n public next = (newValueOrPatch: T | Patch<T>): void => {\n // newValue (or patch output) should never be mutated previous value\n const newValue = isPatch(newValueOrPatch) ? newValueOrPatch(this.value) : newValueOrPatch;\n\n // do not notify subscribers if the value hasn't changed\n if (newValue === this.value) return;\n\n const oldValue = this.value;\n this.value = newValue;\n\n this.handlerSet.forEach((handler) => handler(this.value, oldValue));\n };\n\n public partialNext = (partial: Partial<T>): void => this.next((current) => ({ ...current, ...partial }));\n\n public getLatestValue = (): T => this.value;\n\n public subscribe = (handler: Handler<T>): Unsubscribe => {\n handler(this.value, undefined);\n this.handlerSet.add(handler);\n return () => {\n this.handlerSet.delete(handler);\n };\n };\n\n public subscribeWithSelector = <O extends Readonly<Record<string, unknown>> | Readonly<unknown[]>>(\n selector: (nextValue: T) => O,\n handler: Handler<O>,\n ) => {\n // begin with undefined to reduce amount of selector calls\n let selectedValues: O | undefined;\n\n const wrappedHandler: Handler<T> = (nextValue) => {\n const newlySelectedValues = selector(nextValue);\n\n let hasUpdatedValues = !selectedValues;\n\n if (Array.isArray(newlySelectedValues) && StateStore.logCount > 0) {\n console.warn(\n '[StreamChat]: The API of our StateStore has changed. Instead of returning an array in the selector, please return a named object of properties.',\n );\n StateStore.logCount--;\n }\n\n for (const key in selectedValues) {\n // @ts-ignore TODO: remove array support (Readonly<unknown[]>)\n if (selectedValues[key] === newlySelectedValues[key]) continue;\n hasUpdatedValues = true;\n break;\n }\n\n if (!hasUpdatedValues) return;\n\n const oldSelectedValues = selectedValues;\n selectedValues = newlySelectedValues;\n\n handler(newlySelectedValues, oldSelectedValues);\n };\n\n return this.subscribe(wrappedHandler);\n };\n}\n","import type { Channel } from './channel';\nimport type { StreamChat } from './client';\nimport { StateStore } from './store';\nimport type {\n AscDesc,\n DefaultGenerics,\n EventTypes,\n ExtendableGenerics,\n FormatMessageResponse,\n MessagePaginationOptions,\n MessageResponse,\n ReadResponse,\n ThreadResponse,\n ThreadResponseCustomData,\n UserResponse,\n} from './types';\nimport { addToMessageList, findIndexInSortedArray, formatMessage, throttle } from './utils';\n\ntype QueryRepliesOptions<SCG extends ExtendableGenerics> = {\n sort?: { created_at: AscDesc }[];\n} & MessagePaginationOptions & { user?: UserResponse<SCG>; user_id?: string };\n\nexport type ThreadState<SCG extends ExtendableGenerics = DefaultGenerics> = {\n /**\n * Determines if the thread is currently opened and on-screen. When the thread is active,\n * all new messages are immediately marked as read.\n */\n active: boolean;\n channel: Channel<SCG>;\n createdAt: Date;\n custom: ThreadResponseCustomData;\n deletedAt: Date | null;\n isLoading: boolean;\n isStateStale: boolean;\n pagination: ThreadRepliesPagination;\n /**\n * Thread is identified by and has a one-to-one relation with its parent message.\n * We use parent message id as a thread id.\n */\n parentMessage: FormatMessageResponse<SCG>;\n participants: ThreadResponse<SCG>['thread_participants'];\n read: ThreadReadState;\n replies: Array<FormatMessageResponse<SCG>>;\n replyCount: number;\n title: string;\n updatedAt: Date | null;\n};\n\nexport type ThreadRepliesPagination = {\n isLoadingNext: boolean;\n isLoadingPrev: boolean;\n nextCursor: string | null;\n prevCursor: string | null;\n};\n\nexport type ThreadUserReadState<SCG extends ExtendableGenerics = DefaultGenerics> = {\n lastReadAt: Date;\n unreadMessageCount: number;\n user: UserResponse<SCG>;\n lastReadMessageId?: string;\n};\n\nexport type ThreadReadState<SCG extends ExtendableGenerics = DefaultGenerics> = Record<\n string,\n ThreadUserReadState<SCG> | undefined\n>;\n\nconst DEFAULT_PAGE_LIMIT = 50;\nconst DEFAULT_SORT: { created_at: AscDesc }[] = [{ created_at: -1 }];\nconst MARK_AS_READ_THROTTLE_TIMEOUT = 1000;\n// TODO: remove this once we move to API v2\nexport const THREAD_RESPONSE_RESERVED_KEYS: Record<keyof ThreadResponse, true> = {\n channel: true,\n channel_cid: true,\n created_at: true,\n created_by_user_id: true,\n parent_message_id: true,\n title: true,\n updated_at: true,\n latest_replies: true,\n active_participant_count: true,\n deleted_at: true,\n last_message_at: true,\n participant_count: true,\n reply_count: true,\n read: true,\n thread_participants: true,\n created_by: true,\n parent_message: true,\n};\n\n// TODO: remove this once we move to API v2\nconst constructCustomDataObject = <T extends ThreadResponse>(threadData: T) => {\n const custom: ThreadResponseCustomData = {};\n\n for (const key in threadData) {\n if (THREAD_RESPONSE_RESERVED_KEYS[key as keyof ThreadResponse]) {\n continue;\n }\n\n const customKey = key as keyof ThreadResponseCustomData;\n\n custom[customKey] = threadData[customKey];\n }\n\n return custom;\n};\n\nexport class Thread<SCG extends ExtendableGenerics = DefaultGenerics> {\n public readonly state: StateStore<ThreadState<SCG>>;\n public readonly id: string;\n\n private client: StreamChat<SCG>;\n private unsubscribeFunctions: Set<() => void> = new Set();\n private failedRepliesMap: Map<string, FormatMessageResponse<SCG>> = new Map();\n\n constructor({ client, threadData }: { client: StreamChat<SCG>; threadData: ThreadResponse<SCG> }) {\n const channel = client.channel(threadData.channel.type, threadData.channel.id, {\n name: threadData.channel.name,\n });\n channel._hydrateMembers({ members: threadData.channel.members ?? [], overrideCurrentState: false });\n\n // For when read object is undefined and due to that unreadMessageCount for\n // the current user isn't being incremented on message.new\n const placeholderReadResponse: ReadResponse[] = client.userID\n ? [{ user: { id: client.userID }, unread_messages: 0, last_read: new Date().toISOString() }]\n : [];\n\n this.state = new StateStore<ThreadState<SCG>>({\n // local only\n active: false,\n isLoading: false,\n isStateStale: false,\n // 99.9% should never change\n channel,\n createdAt: new Date(threadData.created_at),\n // rest\n deletedAt: threadData.deleted_at ? new Date(threadData.deleted_at) : null,\n pagination: repliesPaginationFromInitialThread(threadData),\n parentMessage: formatMessage(threadData.parent_message),\n participants: threadData.thread_participants,\n read: formatReadState(\n !threadData.read || threadData.read.length === 0 ? placeholderReadResponse : threadData.read,\n ),\n replies: threadData.latest_replies.map(formatMessage),\n replyCount: threadData.reply_count ?? 0,\n updatedAt: threadData.updated_at ? new Date(threadData.updated_at) : null,\n title: threadData.title,\n custom: constructCustomDataObject(threadData),\n });\n\n this.id = threadData.parent_message_id;\n this.client = client;\n }\n\n get channel() {\n return this.state.getLatestValue().channel;\n }\n\n get hasStaleState() {\n return this.state.getLatestValue().isStateStale;\n }\n\n get ownUnreadCount() {\n return ownUnreadCountSelector(this.client.userID)(this.state.getLatestValue());\n }\n\n public activate = () => {\n this.state.partialNext({ active: true });\n };\n\n public deactivate = () => {\n this.state.partialNext({ active: false });\n };\n\n public reload = async () => {\n if (this.state.getLatestValue().isLoading) {\n return;\n }\n\n this.state.partialNext({ isLoading: true });\n\n try {\n const thread = await this.client.getThread(this.id, { watch: true });\n this.hydrateState(thread);\n } finally {\n this.state.partialNext({ isLoading: false });\n }\n };\n\n public hydrateState = (thread: Thread<SCG>) => {\n if (thread === this) {\n // skip if the instances are the same\n return;\n }\n\n if (thread.id !== this.id) {\n throw new Error(\"Cannot hydrate thread state with using thread's state\");\n }\n\n const {\n read,\n replyCount,\n replies,\n parentMessage,\n participants,\n createdAt,\n deletedAt,\n updatedAt,\n } = thread.state.getLatestValue();\n\n // Preserve pending replies and append them to the updated list of replies\n const pendingReplies = Array.from(this.failedRepliesMap.values());\n\n this.state.partialNext({\n read,\n replyCount,\n replies: pendingReplies.length ? replies.concat(pendingReplies) : replies,\n parentMessage,\n participants,\n createdAt,\n deletedAt,\n updatedAt,\n isStateStale: false,\n });\n };\n\n public registerSubscriptions = () => {\n if (this.unsubscribeFunctions.size) {\n // Thread is already listening for events and changes\n return;\n }\n\n this.unsubscribeFunctions.add(this.subscribeThreadUpdated());\n this.unsubscribeFunctions.add(this.subscribeMarkActiveThreadRead());\n this.unsubscribeFunctions.add(this.subscribeReloadActiveStaleThread());\n this.unsubscribeFunctions.add(this.subscribeMarkThreadStale());\n this.unsubscribeFunctions.add(this.subscribeNewReplies());\n this.unsubscribeFunctions.add(this.subscribeRepliesRead());\n this.unsubscribeFunctions.add(this.subscribeMessageDeleted());\n this.unsubscribeFunctions.add(this.subscribeMessageUpdated());\n };\n\n private subscribeThreadUpdated = () => {\n return this.client.on('thread.updated', (event) => {\n if (!event.thread || event.thread.parent_message_id !== this.id) {\n return;\n }\n\n const threadData = event.thread;\n\n this.state.partialNext({\n title: threadData.title,\n updatedAt: new Date(threadData.updated_at),\n deletedAt: threadData.deleted_at ? new Date(threadData.deleted_at) : null,\n // TODO: use threadData.custom once we move to API v2\n custom: constructCustomDataObject(threadData),\n });\n }).unsubscribe;\n };\n\n private subscribeMarkActiveThreadRead = () => {\n return this.state.subscribeWithSelector(\n (nextValue) => ({\n active: nextValue.active,\n unreadMessageCount: ownUnreadCountSelector(this.client.userID)(nextValue),\n }),\n ({ active, unreadMessageCount }) => {\n if (!active || !unreadMessageCount) return;\n this.throttledMarkAsRead();\n },\n );\n };\n\n private subscribeReloadActiveStaleThread = () =>\n this.state.subscribeWithSelector(\n (nextValue) => ({ active: nextValue.active, isStateStale: nextValue.isStateStale }),\n ({ active, isStateStale }) => {\n if (active && isStateStale) {\n this.reload();\n }\n },\n );\n\n private subscribeMarkThreadStale = () =>\n this.client.on('user.watching.stop', (event) => {\n const { channel } = this.state.getLatestValue();\n\n if (!this.client.userID || this.client.userID !== event.user?.id || event.channel?.cid !== channel.cid) {\n return;\n }\n\n this.state.partialNext({ isStateStale: true });\n }).unsubscribe;\n\n private subscribeNewReplies = () =>\n this.client.on('message.new', (event) => {\n if (!this.client.userID || event.message?.parent_id !== this.id) {\n return;\n }\n\n const isOwnMessage = event.message.user?.id === this.client.userID;\n const { active, read } = this.state.getLatestValue();\n\n this.upsertReplyLocally({\n message: event.message,\n // Message from current user could have been added optimistically,\n // so the actual timestamp might differ in the event\n timestampChanged: isOwnMessage,\n });\n\n if (active) {\n this.throttledMarkAsRead();\n }\n\n const nextRead: ThreadReadState = {};\n\n for (const userId of Object.keys(read)) {\n const userRead = read[userId];\n\n if (userRead) {\n let nextUserRead: ThreadUserReadState = userRead;\n\n if (userId === event.user?.id) {\n // The user who just sent a message to the thread has no unread messages\n // in that thread\n nextUserRead = {\n ...nextUserRead,\n lastReadAt: event.created_at ? new Date(event.created_at) : new Date(),\n user: event.user,\n unreadMessageCount: 0,\n };\n } else if (active && userId === this.client.userID) {\n // Do not increment unread count for the current user in an active thread\n } else {\n // Increment unread count for all users except the author of the new message\n nextUserRead = {\n ...nextUserRead,\n unreadMessageCount: userRead.unreadMessageCount + 1,\n };\n }\n\n nextRead[userId] = nextUserRead;\n }\n }\n\n this.state.partialNext({ read: nextRead });\n }).unsubscribe;\n\n private subscribeRepliesRead = () =>\n this.client.on('message.read', (event) => {\n if (!event.user || !event.created_at || !event.thread) return;\n if (event.thread.parent_message_id !== this.id) return;\n\n const userId = event.user.id;\n const createdAt = event.created_at;\n const user = event.user;\n\n this.state.next((current) => ({\n ...current,\n read: {\n ...current.read,\n [userId]: {\n lastReadAt: new Date(createdAt),\n user,\n lastReadMessageId: event.last_read_message_id,\n unreadMessageCount: 0,\n },\n },\n }));\n }).unsubscribe;\n\n private subscribeMessageDeleted = () =>\n this.client.on('message.deleted', (event) => {\n if (!event.message) return;\n\n // Deleted message is a reply of this thread\n if (event.message.parent_id === this.id) {\n if (event.hard_delete) {\n this.deleteReplyLocally({ message: event.message });\n } else {\n // Handle soft delete (updates deleted_at timestamp)\n this.upsertReplyLocally({ message: event.message });\n }\n }\n\n // Deleted message is parent message of this thread\n if (event.message.id === this.id) {\n this.updateParentMessageLocally({ message: event.message });\n }\n }).unsubscribe;\n\n private subscribeMessageUpdated = () => {\n const eventTypes: EventTypes[] = ['message.updated', 'reaction.new', 'reaction.deleted', 'reaction.updated'];\n\n const unsubscribeFunctions = eventTypes.map(\n (eventType) =>\n this.client.on(eventType, (event) => {\n if (event.message) {\n this.updateParentMessageOrReplyLocally(event.message);\n }\n }).unsubscribe,\n );\n\n return () => unsubscribeFunctions.forEach((unsubscribe) => unsubscribe());\n };\n\n public unregisterSubscriptions = () => {\n this.unsubscribeFunctions.forEach((cleanupFunction) => cleanupFunction());\n this.unsubscribeFunctions.clear();\n };\n\n public deleteReplyLocally = ({ message }: { message: MessageResponse<SCG> }) => {\n const { replies } = this.state.getLatestValue();\n\n const index = findIndexInSortedArray({\n needle: formatMessage(message),\n sortedArray: replies,\n sortDirection: 'ascending',\n selectValueToCompare: (reply) => reply.created_at.getTime(),\n selectKey: (reply) => reply.id,\n });\n\n if (replies[index]?.id !== message.id) {\n return;\n }\n\n const updatedReplies = [...replies];\n updatedReplies.splice(index, 1);\n\n this.state.partialNext({\n replies: updatedReplies,\n });\n };\n\n public upsertReplyLocally = ({\n message,\n timestampChanged = false,\n }: {\n message: MessageResponse<SCG>;\n timestampChanged?: boolean;\n }) => {\n if (message.parent_id !== this.id) {\n throw new Error('Reply does not belong to this thread');\n }\n\n const formattedMessage = formatMessage(message);\n\n if (message.status === 'failed') {\n // store failed reply so that it's not lost when reloading or hydrating\n this.failedRepliesMap.set(formattedMessage.id, formattedMessage);\n } else if (this.failedRepliesMap.has(message.id)) {\n this.failedRepliesMap.delete(message.id);\n }\n\n this.state.next((current) => ({\n ...current,\n replies: addToMessageList(current.replies, formattedMessage, timestampChanged),\n }));\n };\n\n public updateParentMessageLocally = ({ message }: { message: MessageResponse<SCG> }) => {\n if (message.id !== this.id) {\n throw new Error('Message does not belong to this thread');\n }\n\n this.state.next((current) => {\n const formattedMessage = formatMessage(message);\n\n return {\n ...current,\n deletedAt: formattedMessage.deleted_at,\n parentMessage: formattedMessage,\n replyCount: message.reply_count ?? current.replyCount,\n };\n });\n };\n\n public updateParentMessageOrReplyLocally = (message: MessageResponse<SCG>) => {\n if (message.parent_id === this.id) {\n this.upsertReplyLocally({ message });\n }\n\n if (!message.parent_id && message.id === this.id) {\n this.updateParentMessageLocally({ message });\n }\n };\n\n public markAsRead = async ({ force = false }: { force?: boolean } = {}) => {\n if (this.ownUnreadCount === 0 && !force) {\n return null;\n }\n\n return await this.channel.markRead({ thread_id: this.id });\n };\n\n private throttledMarkAsRead = throttle(() => this.markAsRead(), MARK_AS_READ_THROTTLE_TIMEOUT, { trailing: true });\n\n public queryReplies = ({\n limit = DEFAULT_PAGE_LIMIT,\n sort = DEFAULT_SORT,\n ...otherOptions\n }: QueryRepliesOptions<SCG> = {}) => {\n return this.channel.getReplies(this.id, { limit, ...otherOptions }, sort);\n };\n\n public loadNextPage = ({ limit = DEFAULT_PAGE_LIMIT }: { limit?: number } = {}) => {\n return this.loadPage(limit);\n };\n\n public loadPrevPage = ({ limit = DEFAULT_PAGE_LIMIT }: { limit?: number } = {}) => {\n return this.loadPage(-limit);\n };\n\n private loadPage = async (count: number) => {\n const { pagination } = this.state.getLatestValue();\n const [loadingKey, cursorKey, insertionMethodKey] =\n count > 0\n ? (['isLoadingNext', 'nextCursor', 'push'] as const)\n : (['isLoadingPrev', 'prevCursor', 'unshift'] as const);\n\n if (pagination[loadingKey] || pagination[cursorKey] === null) return;\n\n const queryOptions = { [count > 0 ? 'id_gt' : 'id_lt']: pagination[cursorKey] };\n const limit = Math.abs(count);\n\n this.state.partialNext({ pagination: { ...pagination, [loadingKey]: true } });\n\n try {\n const data = await this.queryReplies({ ...queryOptions, limit });\n const replies = data.messages.map(formatMessage);\n const maybeNextCursor = replies.at(count > 0 ? -1 : 0)?.id ?? null;\n\n this.state.next((current) => {\n let nextReplies = current.replies;\n\n // prevent re-creating array if there's nothing to add to the current one\n if (replies.length > 0) {\n nextReplies = [...current.replies];\n nextReplies[insertionMethodKey](...replies);\n }\n\n return {\n ...current,\n replies: nextReplies,\n pagination: {\n ...current.pagination,\n [cursorKey]: data.messages.length < limit ? null : maybeNextCursor,\n [loadingKey]: false,\n },\n };\n });\n } catch (error) {\n this.client.logger('error', (error as Error).message);\n this.state.next((current) => ({\n ...current,\n pagination: {\n ...current.pagination,\n [loadingKey]: false,\n },\n }));\n }\n };\n}\n\nconst formatReadState = (read: ReadResponse[]): ThreadReadState =>\n read.reduce<ThreadReadState>((state, userRead) => {\n state[userRead.user.id] = {\n user: userRead.user,\n lastReadMessageId: userRead.last_read_message_id,\n unreadMessageCount: userRead.unread_messages ?? 0,\n lastReadAt: new Date(userRead.last_read),\n };\n return state;\n }, {});\n\nconst repliesPaginationFromInitialThread = (thread: ThreadResponse): ThreadRepliesPagination => {\n const latestRepliesContainsAllReplies = thread.latest_replies.length === thread.reply_count;\n\n return {\n nextCursor: null,\n prevCursor: latestRepliesContainsAllReplies ? null : thread.latest_replies.at(0)?.id ?? null,\n isLoadingNext: false,\n isLoadingPrev: false,\n };\n};\n\nconst ownUnreadCountSelector = (currentUserId: string | undefined) => <\n SCG extends ExtendableGenerics = DefaultGenerics\n>(\n state: ThreadState<SCG>,\n) => (currentUserId && state.read[currentUserId]?.unreadMessageCount) || 0;\n","import {\n APIResponse,\n ModerationConfig,\n DefaultGenerics,\n ExtendableGenerics,\n GetConfigResponse,\n GetUserModerationReportResponse,\n MuteUserResponse,\n ReviewQueueFilters,\n ReviewQueuePaginationOptions,\n ReviewQueueResponse,\n ReviewQueueSort,\n UpsertConfigResponse,\n ModerationFlagOptions,\n ModerationMuteOptions,\n GetUserModerationReportOptions,\n SubmitActionOptions,\n QueryModerationConfigsFilters,\n QueryModerationConfigsSort,\n Pager,\n CustomCheckFlag,\n ReviewQueueItem,\n QueryConfigsResponse,\n} from './types';\nimport { StreamChat } from './client';\nimport { normalizeQuerySort } from './utils';\n\nexport const MODERATION_ENTITY_TYPES = {\n user: 'stream:user',\n message: 'stream:chat:v1:message',\n};\n\n// Moderation class provides all the endpoints related to moderation v2.\nexport class Moderation<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> {\n client: StreamChat<StreamChatGenerics>;\n\n constructor(client: StreamChat<StreamChatGenerics>) {\n this.client = client;\n }\n\n /**\n * Flag a user\n *\n * @param {string} flaggedUserID User ID to be flagged\n * @param {string} reason Reason for flagging the user\n * @param {Object} options Additional options for flagging the user\n * @param {string} options.user_id (For server side usage) User ID of the user who is flagging the target user\n * @param {Object} options.custom Additional data to be stored with the flag\n * @returns\n */\n async flagUser(flaggedUserID: string, reason: string, options: ModerationFlagOptions = {}) {\n return this.flag(MODERATION_ENTITY_TYPES.user, flaggedUserID, '', reason, options);\n }\n\n /**\n * Flag a message\n *\n * @param {string} messageID Message ID to be flagged\n * @param {string} reason Reason for flagging the message\n * @param {Object} options Additional options for flagging the message\n * @param {string} options.user_id (For server side usage) User ID of the user who is flagging the target message\n * @param {Object} options.custom Additional data to be stored with the flag\n * @returns\n */\n async flagMessage(messageID: string, reason: string, options: ModerationFlagOptions = {}) {\n return this.flag(MODERATION_ENTITY_TYPES.message, messageID, '', reason, options);\n }\n\n /**\n * Flag a user\n *\n * @param {string} entityType Entity type to be flagged\n * @param {string} entityId Entity ID to be flagged\n * @param {string} entityCreatorID User ID of the entity creator\n * @param {string} reason Reason for flagging the entity\n * @param {Object} options Additional options for flagging the entity\n * @param {string} options.user_id (For server side usage) User ID of the user who is flagging the target entity\n * @param {Object} options.moderation_payload Content to be flagged e.g., { texts: ['text1', 'text2'], images: ['image1', 'image2']}\n * @param {Object} options.custom Additional data to be stored with the flag\n * @returns\n */\n async flag(\n entityType: string,\n entityId: string,\n entityCreatorID: string,\n reason: string,\n options: ModerationFlagOptions = {},\n ) {\n return await this.client.post<{ item_id: string } & APIResponse>(this.client.baseURL + '/api/v2/moderation/flag', {\n entity_type: entityType,\n entity_id: entityId,\n entity_creator_id: entityCreatorID,\n reason,\n ...options,\n });\n }\n\n /**\n * Mute a user\n * @param {string} targetID User ID to be muted\n * @param {Object} options Additional options for muting the user\n * @param {string} options.user_id (For server side usage) User ID of the user who is muting the target user\n * @param {number} options.timeout Timeout for the mute in minutes\n * @returns\n */\n async muteUser(targetID: string, options: ModerationMuteOptions = {}) {\n return await this.client.post<MuteUserResponse<StreamChatGenerics> & APIResponse>(\n this.client.baseURL + '/api/v2/moderation/mute',\n {\n target_ids: [targetID],\n ...options,\n },\n );\n }\n\n /**\n * Unmute a user\n * @param {string} targetID User ID to be unmuted\n * @param {Object} options Additional options for unmuting the user\n * @param {string} options.user_id (For server side usage) User ID of the user who is unmuting the target user\n * @returns\n */\n async unmuteUser(\n targetID: string,\n options: {\n user_id?: string;\n },\n ) {\n return await this.client.post<{ item_id: string } & APIResponse>(\n this.client.baseURL + '/api/v2/moderation/unmute',\n {\n target_ids: [targetID],\n ...options,\n },\n );\n }\n\n /**\n * Get moderation report for a user\n * @param {string} userID User ID for which moderation report is to be fetched\n * @param {Object} options Additional options for fetching the moderation report\n * @param {boolean} options.create_user_if_not_exists Create user if not exists\n * @param {boolean} options.include_user_blocks Include user blocks\n * @param {boolean} options.include_user_mutes Include user mutes\n */\n async getUserModerationReport(userID: string, options: GetUserModerationReportOptions = {}) {\n return await this.client.get<GetUserModerationReportResponse<StreamChatGenerics>>(\n this.client.baseURL + `/api/v2/moderation/user_report`,\n {\n user_id: userID,\n ...options,\n },\n );\n }\n\n /**\n * Query review queue\n * @param {Object} filterConditions Filter conditions for querying review queue\n * @param {Object} sort Sort conditions for querying review queue\n * @param {Object} options Pagination options for querying review queue\n */\n async queryReviewQueue(\n filterConditions: ReviewQueueFilters = {},\n sort: ReviewQueueSort = [],\n options: ReviewQueuePaginationOptions = {},\n ) {\n return await this.client.post<ReviewQueueResponse>(this.client.baseURL + '/api/v2/moderation/review_queue', {\n filter: filterConditions,\n sort: normalizeQuerySort(sort),\n ...options,\n });\n }\n\n /**\n * Upsert moderation config\n * @param {Object} config Moderation config to be upserted\n */\n async upsertConfig(config: ModerationConfig) {\n return await this.client.post<UpsertConfigResponse>(this.client.baseURL + '/api/v2/moderation/config', config);\n }\n\n /**\n * Get moderation config\n * @param {string} key Key for which moderation config is to be fetched\n */\n async getConfig(key: string, data?: { team?: string }) {\n return await this.client.get<GetConfigResponse>(this.client.baseURL + '/api/v2/moderation/config/' + key, data);\n }\n\n async deleteConfig(key: string, data?: { team?: string }) {\n return await this.client.delete(this.client.baseURL + '/api/v2/moderation/config/' + key, data);\n }\n\n /**\n * Query moderation configs\n * @param {Object} filterConditions Filter conditions for querying moderation configs\n * @param {Object} sort Sort conditions for querying moderation configs\n * @param {Object} options Additional options for querying moderation configs\n */\n async queryConfigs(\n filterConditions: QueryModerationConfigsFilters,\n sort: QueryModerationConfigsSort,\n options: Pager = {},\n ) {\n return await this.client.post<QueryConfigsResponse>(this.client.baseURL + '/api/v2/moderation/configs', {\n filter: filterConditions,\n sort,\n ...options,\n });\n }\n\n async submitAction(actionType: string, itemID: string, options: SubmitActionOptions = {}) {\n return await this.client.post<{ item_id: string } & APIResponse>(\n this.client.baseURL + '/api/v2/moderation/submit_action',\n {\n action_type: actionType,\n item_id: itemID,\n ...options,\n },\n );\n }\n\n /**\n *\n * @param {string} entityType string Type of entity to be checked E.g., stream:user, stream:chat:v1:message, or any custom string\n * @param {string} entityID string ID of the entity to be checked. This is mainly for tracking purposes\n * @param {string} entityCreatorID string ID of the entity creator\n * @param {object} moderationPayload object Content to be checked for moderation. E.g., { texts: ['text1', 'text2'], images: ['image1', 'image2']}\n * @param {Array} moderationPayload.texts array Array of texts to be checked for moderation\n * @param {Array} moderationPayload.images array Array of images to be checked for moderation\n * @param {Array} moderationPayload.videos array Array of videos to be checked for moderation\n * @param configKey\n * @param options\n * @returns\n */\n async check(\n entityType: string,\n entityID: string,\n entityCreatorID: string,\n moderationPayload: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n custom?: Record<string, any>;\n images?: string[];\n texts?: string[];\n videos?: string[];\n },\n configKey: string,\n options?: {\n force_sync?: boolean;\n },\n ) {\n return await this.client.post(this.client.baseURL + `/api/v2/moderation/check`, {\n entity_type: entityType,\n entity_id: entityID,\n entity_creator_id: entityCreatorID,\n moderation_payload: moderationPayload,\n config_key: configKey,\n options,\n });\n }\n\n /**\n *\n * @param {string} entityType string Type of entity to be checked E.g., stream:user, stream:chat:v1:message, or any custom string\n * @param {string} entityID string ID of the entity to be checked. This is mainly for tracking purposes\n * @param {string} entityCreatorID string ID of the entity creator\n * @param {object} moderationPayload object Content to be checked for moderation. E.g., { texts: ['text1', 'text2'], images: ['image1', 'image2']}\n * @param {Array} moderationPayload.texts array Array of texts to be checked for moderation\n * @param {Array} moderationPayload.images array Array of images to be checked for moderation\n * @param {Array} moderationPayload.videos array Array of videos to be checked for moderation\n * @param {Array<CustomCheckFlag>} flags Array of CustomCheckFlag to be passed to flag the entity\n * @returns\n */\n async addCustomFlags(\n entityType: string,\n entityID: string,\n entityCreatorID: string,\n moderationPayload: {\n images?: string[];\n texts?: string[];\n videos?: string[];\n },\n flags: CustomCheckFlag[],\n ) {\n return await this.client.post<{ id: string; item: ReviewQueueItem; status: string } & APIResponse>(\n this.client.baseURL + `/api/v2/moderation/custom_check`,\n {\n entity_type: entityType,\n entity_id: entityID,\n entity_creator_id: entityCreatorID,\n moderation_payload: moderationPayload,\n flags,\n },\n );\n }\n\n /**\n * Add custom flags to a message\n * @param {string} messageID Message ID to be flagged\n * @param {Array<CustomCheckFlag>} flags Array of CustomCheckFlag to be passed to flag the message\n * @returns\n */\n async addCustomMessageFlags(messageID: string, flags: CustomCheckFlag[]) {\n return await this.addCustomFlags(MODERATION_ENTITY_TYPES.message, messageID, '', {}, flags);\n }\n}\n","import { StateStore } from './store';\nimport { throttle } from './utils';\n\nimport type { StreamChat } from './client';\nimport type { Thread } from './thread';\nimport type { DefaultGenerics, Event, ExtendableGenerics, OwnUserResponse, QueryThreadsOptions } from './types';\n\nconst DEFAULT_CONNECTION_RECOVERY_THROTTLE_DURATION = 1000;\nconst MAX_QUERY_THREADS_LIMIT = 25;\nexport const THREAD_MANAGER_INITIAL_STATE = {\n active: false,\n isThreadOrderStale: false,\n threads: [],\n unreadThreadCount: 0,\n unseenThreadIds: [],\n lastConnectionDropAt: null,\n pagination: {\n isLoading: false,\n isLoadingNext: false,\n nextCursor: null,\n },\n ready: false,\n};\n\nexport type ThreadManagerState<SCG extends ExtendableGenerics = DefaultGenerics> = {\n active: boolean;\n isThreadOrderStale: boolean;\n lastConnectionDropAt: Date | null;\n pagination: ThreadManagerPagination;\n ready: boolean;\n threads: Thread<SCG>[];\n unreadThreadCount: number;\n /**\n * List of threads that haven't been loaded in the list, but have received new messages\n * since the latest reload. Useful to display a banner prompting to reload the thread list.\n */\n unseenThreadIds: string[];\n};\n\nexport type ThreadManagerPagination = {\n isLoading: boolean;\n isLoadingNext: boolean;\n nextCursor: string | null;\n};\n\nexport class ThreadManager<SCG extends ExtendableGenerics = DefaultGenerics> {\n public readonly state: StateStore<ThreadManagerState<SCG>>;\n private client: StreamChat<SCG>;\n private unsubscribeFunctions: Set<() => void> = new Set();\n private threadsByIdGetterCache: {\n threads: ThreadManagerState<SCG>['threads'];\n threadsById: Record<string, Thread<SCG> | undefined>;\n };\n\n constructor({ client }: { client: StreamChat<SCG> }) {\n this.client = client;\n this.state = new StateStore<ThreadManagerState<SCG>>(THREAD_MANAGER_INITIAL_STATE);\n\n this.threadsByIdGetterCache = { threads: [], threadsById: {} };\n }\n\n public get threadsById() {\n const { threads } = this.state.getLatestValue();\n\n if (threads === this.threadsByIdGetterCache.threads) {\n return this.threadsByIdGetterCache.threadsById;\n }\n\n const threadsById = threads.reduce<Record<string, Thread<SCG>>>((newThreadsById, thread) => {\n newThreadsById[thread.id] = thread;\n return newThreadsById;\n }, {});\n\n this.threadsByIdGetterCache.threads = threads;\n this.threadsByIdGetterCache.threadsById = threadsById;\n\n return threadsById;\n }\n\n public resetState = () => {\n this.state.next(THREAD_MANAGER_INITIAL_STATE);\n };\n\n public activate = () => {\n this.state.partialNext({ active: true });\n };\n\n public deactivate = () => {\n this.state.partialNext({ active: false });\n };\n\n public registerSubscriptions = () => {\n if (this.unsubscribeFunctions.size) return;\n\n this.unsubscribeFunctions.add(this.subscribeUnreadThreadsCountChange());\n this.unsubscribeFunctions.add(this.subscribeManageThreadSubscriptions());\n this.unsubscribeFunctions.add(this.subscribeReloadOnActivation());\n this.unsubscribeFunctions.add(this.subscribeNewReplies());\n this.unsubscribeFunctions.add(this.subscribeRecoverAfterConnectionDrop());\n this.unsubscribeFunctions.add(this.subscribeChannelDeleted());\n };\n\n private subscribeUnreadThreadsCountChange = () => {\n // initiate\n const { unread_threads: unreadThreadCount = 0 } = (this.client.user as OwnUserResponse<SCG>) ?? {};\n this.state.partialNext({ unreadThreadCount });\n\n const unsubscribeFunctions = [\n 'health.check',\n 'notification.mark_read',\n 'notification.thread_message_new',\n 'notification.channel_deleted',\n ].map(\n (eventType) =>\n this.client.on(eventType, (event) => {\n const { unread_threads: unreadThreadCount } = event.me ?? event;\n if (typeof unreadThreadCount === 'number') {\n this.state.partialNext({ unreadThreadCount });\n }\n }).unsubscribe,\n );\n\n return () => unsubscribeFunctions.forEach((unsubscribe) => unsubscribe());\n };\n\n private subscribeChannelDeleted = () =>\n this.client.on('notification.channel_deleted', (event) => {\n const { cid } = event;\n const { threads } = this.state.getLatestValue();\n\n const newThreads = threads.filter((thread) => thread.channel.cid !== cid);\n this.state.partialNext({ threads: newThreads });\n }).unsubscribe;\n\n private subscribeManageThreadSubscriptions = () =>\n this.state.subscribeWithSelector(\n (nextValue) => ({ threads: nextValue.threads }),\n ({ threads: nextThreads }, prev) => {\n const { threads: prevThreads = [] } = prev ?? {};\n // Thread instance was removed if there's no thread with the given id at all,\n // or it was replaced with a new instance\n const removedThreads = prevThreads.filter((thread) => thread !== this.threadsById[thread.id]);\n\n nextThreads.forEach((thread) => thread.registerSubscriptions());\n removedThreads.forEach((thread) => thread.unregisterSubscriptions());\n },\n );\n\n private subscribeReloadOnActivation = () =>\n this.state.subscribeWithSelector(\n (nextValue) => ({ active: nextValue.active }),\n ({ active }) => {\n if (active) this.reload();\n },\n );\n\n private subscribeNewReplies = () =>\n this.client.on('notification.thread_message_new', (event: Event<SCG>) => {\n const parentId = event.message?.parent_id;\n if (!parentId) return;\n\n const { unseenThreadIds, ready } = this.state.getLatestValue();\n if (!ready) return;\n\n if (this.threadsById[parentId]) {\n this.state.partialNext({ isThreadOrderStale: true });\n } else if (!unseenThreadIds.includes(parentId)) {\n this.state.partialNext({ unseenThreadIds: unseenThreadIds.concat(parentId) });\n }\n }).unsubscribe;\n\n private subscribeRecoverAfterConnectionDrop = () => {\n const unsubscribeConnectionDropped = this.client.on('connection.changed', (event) => {\n if (event.online === false) {\n this.state.next((current) =>\n current.lastConnectionDropAt\n ? current\n : {\n ...current,\n lastConnectionDropAt: new Date(),\n },\n );\n }\n }).unsubscribe;\n\n const throttledHandleConnectionRecovered = throttle(\n () => {\n const { lastConnectionDropAt } = this.state.getLatestValue();\n if (!lastConnectionDropAt) return;\n this.reload({ force: true });\n },\n DEFAULT_CONNECTION_RECOVERY_THROTTLE_DURATION,\n { trailing: true },\n );\n\n const unsubscribeConnectionRecovered = this.client.on('connection.recovered', throttledHandleConnectionRecovered)\n .unsubscribe;\n\n return () => {\n unsubscribeConnectionDropped();\n unsubscribeConnectionRecovered();\n };\n };\n\n public unregisterSubscriptions = () => {\n this.state.getLatestValue().threads.forEach((thread) => thread.unregisterSubscriptions());\n this.unsubscribeFunctions.forEach((cleanupFunction) => cleanupFunction());\n this.unsubscribeFunctions.clear();\n };\n\n public reload = async ({ force = false } = {}) => {\n const { threads, unseenThreadIds, isThreadOrderStale, pagination, ready } = this.state.getLatestValue();\n if (pagination.isLoading) return;\n if (!force && ready && !unseenThreadIds.length && !isThreadOrderStale) return;\n const limit = threads.length + unseenThreadIds.length;\n\n try {\n this.state.next((current) => ({\n ...current,\n pagination: {\n ...current.pagination,\n isLoading: true,\n },\n }));\n\n const response = await this.queryThreads({\n limit: Math.min(limit, MAX_QUERY_THREADS_LIMIT) || MAX_QUERY_THREADS_LIMIT,\n });\n\n const currentThreads = this.threadsById;\n const nextThreads: Thread<SCG>[] = [];\n\n for (const incomingThread of response.threads) {\n const existingThread = currentThreads[incomingThread.id];\n\n if (existingThread) {\n // Reuse thread instances if possible\n nextThreads.push(existingThread);\n if (existingThread.hasStaleState) {\n existingThread.hydrateState(incomingThread);\n }\n } else {\n nextThreads.push(incomingThread);\n }\n }\n\n this.state.next((current) => ({\n ...current,\n threads: nextThreads,\n unseenThreadIds: [],\n isThreadOrderStale: false,\n pagination: {\n ...current.pagination,\n isLoading: false,\n nextCursor: response.next ?? null,\n },\n ready: true,\n }));\n } catch (error) {\n this.client.logger('error', (error as Error).message);\n this.state.next((current) => ({\n ...current,\n pagination: {\n ...current.pagination,\n isLoading: false,\n },\n }));\n }\n };\n\n public queryThreads = (options: QueryThreadsOptions = {}) => {\n return this.client.queryThreads({\n limit: 25,\n participant_limit: 10,\n reply_limit: 10,\n watch: true,\n ...options,\n });\n };\n\n public loadNextPage = async (options: Omit<QueryThreadsOptions, 'next'> = {}) => {\n const { pagination } = this.state.getLatestValue();\n\n if (pagination.isLoadingNext || !pagination.nextCursor) return;\n\n try {\n this.state.partialNext({ pagination: { ...pagination, isLoadingNext: true } });\n\n const response = await this.queryThreads({\n ...options,\n next: pagination.nextCursor,\n });\n\n this.state.next((current) => ({\n ...current,\n threads: response.threads.length ? current.threads.concat(response.threads) : current.threads,\n pagination: {\n ...current.pagination,\n nextCursor: response.next ?? null,\n isLoadingNext: false,\n },\n }));\n } catch (error) {\n this.client.logger('error', (error as Error).message);\n this.state.next((current) => ({\n ...current,\n pagination: {\n ...current.pagination,\n isLoadingNext: false,\n },\n }));\n }\n };\n}\n","import { StateStore } from './store';\nimport type { StreamChat } from './client';\nimport type {\n DefaultGenerics,\n Event,\n ExtendableGenerics,\n PartialPollUpdate,\n PollAnswer,\n PollData,\n PollEnrichData,\n PollOptionData,\n PollResponse,\n PollVote,\n QueryVotesFilters,\n QueryVotesOptions,\n VoteSort,\n} from './types';\n\ntype PollEvent<SCG extends ExtendableGenerics = DefaultGenerics> = {\n cid: string;\n created_at: string;\n poll: PollResponse<SCG>;\n};\n\ntype PollUpdatedEvent<SCG extends ExtendableGenerics = DefaultGenerics> = PollEvent<SCG> & {\n type: 'poll.updated';\n};\n\ntype PollClosedEvent<SCG extends ExtendableGenerics = DefaultGenerics> = PollEvent<SCG> & {\n type: 'poll.closed';\n};\n\ntype PollVoteEvent<SCG extends ExtendableGenerics = DefaultGenerics> = {\n cid: string;\n created_at: string;\n poll: PollResponse<SCG>;\n poll_vote: PollVote<SCG> | PollAnswer<SCG>;\n};\n\ntype PollVoteCastedEvent<SCG extends ExtendableGenerics = DefaultGenerics> = PollVoteEvent<SCG> & {\n type: 'poll.vote_casted';\n};\n\ntype PollVoteCastedChanged<SCG extends ExtendableGenerics = DefaultGenerics> = PollVoteEvent<SCG> & {\n type: 'poll.vote_removed';\n};\n\ntype PollVoteCastedRemoved<SCG extends ExtendableGenerics = DefaultGenerics> = PollVoteEvent<SCG> & {\n type: 'poll.vote_removed';\n};\n\nconst isPollUpdatedEvent = <SCG extends ExtendableGenerics = DefaultGenerics>(\n e: Event<SCG>,\n): e is PollUpdatedEvent<SCG> => e.type === 'poll.updated';\nconst isPollClosedEventEvent = <SCG extends ExtendableGenerics = DefaultGenerics>(\n e: Event<SCG>,\n): e is PollClosedEvent<SCG> => e.type === 'poll.closed';\nconst isPollVoteCastedEvent = <SCG extends ExtendableGenerics = DefaultGenerics>(\n e: Event<SCG>,\n): e is PollVoteCastedEvent<SCG> => e.type === 'poll.vote_casted';\nconst isPollVoteChangedEvent = <SCG extends ExtendableGenerics = DefaultGenerics>(\n e: Event<SCG>,\n): e is PollVoteCastedChanged<SCG> => e.type === 'poll.vote_changed';\nconst isPollVoteRemovedEvent = <SCG extends ExtendableGenerics = DefaultGenerics>(\n e: Event<SCG>,\n): e is PollVoteCastedRemoved<SCG> => e.type === 'poll.vote_removed';\n\nexport const isVoteAnswer = <SCG extends ExtendableGenerics = DefaultGenerics>(\n vote: PollVote<SCG> | PollAnswer<SCG>,\n): vote is PollAnswer<SCG> => !!(vote as PollAnswer<SCG>)?.answer_text;\n\nexport type PollAnswersQueryParams = {\n filter?: QueryVotesFilters;\n options?: QueryVotesOptions;\n sort?: VoteSort;\n};\n\nexport type PollOptionVotesQueryParams = {\n filter: { option_id: string } & QueryVotesFilters;\n options?: QueryVotesOptions;\n sort?: VoteSort;\n};\n\ntype OptionId = string;\n\nexport type PollState<SCG extends ExtendableGenerics = DefaultGenerics> = SCG['pollType'] &\n Omit<PollResponse<SCG>, 'own_votes' | 'id'> & {\n lastActivityAt: Date; // todo: would be ideal to get this from the BE\n maxVotedOptionIds: OptionId[];\n ownVotesByOptionId: Record<OptionId, PollVote<SCG>>;\n ownAnswer?: PollAnswer; // each user can have only one answer\n };\n\ntype PollInitOptions<SCG extends ExtendableGenerics = DefaultGenerics> = {\n client: StreamChat<SCG>;\n poll: PollResponse<SCG>;\n};\n\nexport class Poll<SCG extends ExtendableGenerics = DefaultGenerics> {\n public readonly state: StateStore<PollState<SCG>>;\n public id: string;\n private client: StreamChat<SCG>;\n private unsubscribeFunctions: Set<() => void> = new Set();\n\n constructor({ client, poll }: PollInitOptions<SCG>) {\n this.client = client;\n this.id = poll.id;\n\n this.state = new StateStore<PollState<SCG>>(this.getInitialStateFromPollResponse(poll));\n }\n\n private getInitialStateFromPollResponse = (poll: PollInitOptions<SCG>['poll']) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { own_votes, id, ...pollResponseForState } = poll;\n const { ownAnswer, ownVotes } = own_votes?.reduce<{ ownVotes: PollVote<SCG>[]; ownAnswer?: PollAnswer }>(\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 lastActivityAt: new Date(),\n maxVotedOptionIds: getMaxVotedOptionIds(\n pollResponseForState.vote_counts_by_option as PollResponse<SCG>['vote_counts_by_option'],\n ),\n ownAnswer,\n ownVotesByOptionId: getOwnVotesByOptionId(ownVotes),\n };\n };\n\n public reinitializeState = (poll: PollInitOptions<SCG>['poll']) => {\n this.state.partialNext(this.getInitialStateFromPollResponse(poll));\n };\n\n get data(): PollState<SCG> {\n return this.state.getLatestValue();\n }\n\n public handlePollUpdated = (event: Event<SCG>) => {\n if (event.poll?.id && event.poll.id !== this.id) return;\n if (!isPollUpdatedEvent(event)) return;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { id, ...pollData } = extractPollData(event.poll);\n // @ts-ignore\n this.state.partialNext({ ...pollData, lastActivityAt: new Date(event.created_at) });\n };\n\n public handlePollClosed = (event: Event<SCG>) => {\n if (event.poll?.id && event.poll.id !== this.id) return;\n if (!isPollClosedEventEvent(event)) return;\n // @ts-ignore\n this.state.partialNext({ is_closed: true, lastActivityAt: new Date(event.created_at) });\n };\n\n public handleVoteCasted = (event: Event<SCG>) => {\n if (event.poll?.id && event.poll.id !== this.id) return;\n if (!isPollVoteCastedEvent(event)) return;\n const currentState = this.data;\n const isOwnVote = event.poll_vote.user_id === this.client.userID;\n let latestAnswers = [...(currentState.latest_answers as PollAnswer[])];\n let ownAnswer = currentState.ownAnswer;\n const ownVotesByOptionId = currentState.ownVotesByOptionId;\n let maxVotedOptionIds = currentState.maxVotedOptionIds;\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(event.poll.vote_counts_by_option);\n }\n\n const pollEnrichData = extractPollEnrichedData(event.poll);\n // @ts-ignore\n this.state.partialNext({\n ...pollEnrichData,\n latest_answers: latestAnswers,\n lastActivityAt: new Date(event.created_at),\n ownAnswer,\n ownVotesByOptionId,\n maxVotedOptionIds,\n });\n };\n\n public handleVoteChanged = (event: Event<SCG>) => {\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)) return;\n const currentState = this.data;\n const isOwnVote = event.poll_vote.user_id === this.client.userID;\n let latestAnswers = [...(currentState.latest_answers as PollAnswer[])];\n let ownAnswer = currentState.ownAnswer;\n let ownVotesByOptionId = currentState.ownVotesByOptionId;\n let maxVotedOptionIds = currentState.maxVotedOptionIds;\n\n if (isOwnVote) {\n if (isVoteAnswer(event.poll_vote)) {\n latestAnswers = [event.poll_vote, ...latestAnswers.filter((answer) => answer.id !== event.poll_vote.id)];\n ownAnswer = event.poll_vote;\n } else if (event.poll_vote.option_id) {\n if (event.poll.enforce_unique_votes) {\n ownVotesByOptionId = { [event.poll_vote.option_id]: event.poll_vote };\n } else {\n ownVotesByOptionId = Object.entries(ownVotesByOptionId).reduce<Record<OptionId, PollVote<SCG>>>(\n (acc, [optionId, vote]) => {\n if (optionId !== event.poll_vote.option_id && vote.id === event.poll_vote.id) {\n return acc;\n }\n acc[optionId] = vote;\n return acc;\n },\n {},\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(event.poll.vote_counts_by_option);\n }\n } else if (isVoteAnswer(event.poll_vote)) {\n latestAnswers = [event.poll_vote, ...latestAnswers];\n } else {\n maxVotedOptionIds = getMaxVotedOptionIds(event.poll.vote_counts_by_option);\n }\n\n const pollEnrichData = extractPollEnrichedData(event.poll);\n // @ts-ignore\n this.state.partialNext({\n ...pollEnrichData,\n latest_answers: latestAnswers,\n lastActivityAt: new Date(event.created_at),\n ownAnswer,\n ownVotesByOptionId,\n maxVotedOptionIds,\n });\n };\n\n public handleVoteRemoved = (event: Event<SCG>) => {\n if (event.poll?.id && event.poll.id !== this.id) return;\n if (!isPollVoteRemovedEvent(event)) return;\n const currentState = this.data;\n const isOwnVote = event.poll_vote.user_id === this.client.userID;\n let latestAnswers = [...(currentState.latest_answers as PollAnswer[])];\n let ownAnswer = currentState.ownAnswer;\n const ownVotesByOptionId = { ...currentState.ownVotesByOptionId };\n let maxVotedOptionIds = currentState.maxVotedOptionIds;\n\n if (isVoteAnswer(event.poll_vote)) {\n latestAnswers = latestAnswers.filter((answer) => answer.id !== event.poll_vote.id);\n if (isOwnVote) {\n ownAnswer = undefined;\n }\n } else {\n maxVotedOptionIds = getMaxVotedOptionIds(event.poll.vote_counts_by_option);\n if (isOwnVote && event.poll_vote.option_id) {\n delete ownVotesByOptionId[event.poll_vote.option_id];\n }\n }\n\n const pollEnrichData = extractPollEnrichedData(event.poll);\n // @ts-ignore\n this.state.partialNext({\n ...pollEnrichData,\n latest_answers: latestAnswers,\n lastActivityAt: new Date(event.created_at),\n ownAnswer,\n ownVotesByOptionId,\n maxVotedOptionIds,\n });\n };\n\n query = async (id: string) => {\n const { poll } = await this.client.getPoll(id);\n // @ts-ignore\n this.state.partialNext({ ...poll, lastActivityAt: new Date() });\n return poll;\n };\n\n update = async (data: Exclude<PollData<SCG>, 'id'>) => {\n return await this.client.updatePoll({ ...data, id: this.id });\n };\n\n partialUpdate = async (partialPollObject: PartialPollUpdate<SCG>) => {\n return await this.client.partialUpdatePoll(this.id as string, partialPollObject);\n };\n\n close = async () => {\n return await this.client.closePoll(this.id as string);\n };\n\n delete = async () => {\n return await this.client.deletePoll(this.id as string);\n };\n\n createOption = async (option: PollOptionData) => {\n return await this.client.createPollOption(this.id as string, option);\n };\n\n updateOption = async (option: PollOptionData) => {\n return await this.client.updatePollOption(this.id as string, option);\n };\n\n deleteOption = async (optionId: string) => {\n return await this.client.deletePollOption(this.id as string, optionId);\n };\n\n castVote = async (optionId: string, messageId: string) => {\n const { max_votes_allowed, ownVotesByOptionId } = this.data;\n\n const reachedVoteLimit = max_votes_allowed && max_votes_allowed === Object.keys(ownVotesByOptionId).length;\n\n if (reachedVoteLimit) {\n let oldestVote = Object.values(ownVotesByOptionId)[0];\n Object.values(ownVotesByOptionId)\n .slice(1)\n .forEach((vote) => {\n if (!oldestVote?.created_at || new Date(vote.created_at) < new Date(oldestVote.created_at)) {\n oldestVote = vote;\n }\n });\n if (oldestVote?.id) {\n await this.removeVote(oldestVote.id, messageId);\n }\n }\n return await this.client.castPollVote(messageId, this.id as string, { option_id: optionId });\n };\n\n removeVote = async (voteId: string, messageId: string) => {\n return await this.client.removePollVote(messageId, this.id as string, voteId);\n };\n\n addAnswer = async (answerText: string, messageId: string) => {\n return await this.client.addPollAnswer(messageId, this.id as string, answerText);\n };\n\n removeAnswer = async (answerId: string, messageId: string) => {\n return await this.client.removePollVote(messageId, this.id as string, answerId);\n };\n\n queryAnswers = async (params: PollAnswersQueryParams) => {\n return await this.client.queryPollAnswers(this.id as string, params.filter, params.sort, params.options);\n };\n\n queryOptionVotes = async (params: PollOptionVotesQueryParams) => {\n return await this.client.queryPollVotes(this.id as string, params.filter, params.sort, params.options);\n };\n}\n\nfunction getMaxVotedOptionIds(voteCountsByOption: PollResponse['vote_counts_by_option']) {\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<SCG extends ExtendableGenerics = DefaultGenerics>(ownVotes: PollVote<SCG>[]) {\n return !ownVotes\n ? ({} as Record<OptionId, PollVote<SCG>>)\n : ownVotes.reduce<Record<OptionId, PollVote<SCG>>>((acc, vote) => {\n if (isVoteAnswer(vote) || !vote.option_id) return acc;\n acc[vote.option_id] = vote;\n return acc;\n }, {});\n}\n\nexport function extractPollData<SCG extends ExtendableGenerics = DefaultGenerics>(\n pollResponse: PollResponse<SCG>,\n): PollData<SCG> {\n return {\n allow_answers: pollResponse.allow_answers,\n allow_user_suggested_options: pollResponse.allow_user_suggested_options,\n description: pollResponse.description,\n enforce_unique_vote: pollResponse.enforce_unique_vote,\n id: pollResponse.id,\n is_closed: pollResponse.is_closed,\n max_votes_allowed: pollResponse.max_votes_allowed,\n name: pollResponse.name,\n options: pollResponse.options,\n voting_visibility: pollResponse.voting_visibility,\n };\n}\n\nexport function extractPollEnrichedData<SCG extends ExtendableGenerics = DefaultGenerics>(\n pollResponse: PollResponse<SCG>,\n): Omit<PollEnrichData<SCG>, 'own_votes' | 'latest_answers'> {\n return {\n answers_count: pollResponse.answers_count,\n latest_votes_by_option: pollResponse.latest_votes_by_option,\n vote_count: pollResponse.vote_count,\n vote_counts_by_option: pollResponse.vote_counts_by_option,\n };\n}\n","import type { StreamChat } from './client';\nimport type {\n CreatePollData,\n DefaultGenerics,\n ExtendableGenerics,\n PollResponse,\n PollSort,\n QueryPollsFilters,\n QueryPollsOptions,\n} from './types';\nimport { Poll } from './poll';\nimport { FormatMessageResponse } from './types';\nimport { formatMessage } from './utils';\n\nexport class PollManager<SCG extends ExtendableGenerics = DefaultGenerics> {\n private client: StreamChat<SCG>;\n // The pollCache contains only polls that have been created and sent as messages\n // (i.e only polls that are coupled with a message, can be voted on and require a\n // reactive state). It shall work as a basic look-up table for our SDK to be able\n // to quickly consume poll state that will be reactive even without the polls being\n // rendered within the UI.\n private pollCache = new Map<string, Poll<SCG>>();\n private unsubscribeFunctions: Set<() => void> = new Set();\n\n constructor({ client }: { client: StreamChat<SCG> }) {\n this.client = client;\n }\n\n get data(): Map<string, Poll<SCG>> {\n return this.pollCache;\n }\n\n public fromState = (id: string) => {\n return this.pollCache.get(id);\n };\n\n public registerSubscriptions = () => {\n if (this.unsubscribeFunctions.size) {\n // Already listening for events and changes\n return;\n }\n\n this.unsubscribeFunctions.add(this.subscribeMessageNew());\n this.unsubscribeFunctions.add(this.subscribePollUpdated());\n this.unsubscribeFunctions.add(this.subscribePollClosed());\n this.unsubscribeFunctions.add(this.subscribeVoteCasted());\n this.unsubscribeFunctions.add(this.subscribeVoteChanged());\n this.unsubscribeFunctions.add(this.subscribeVoteRemoved());\n };\n\n public unregisterSubscriptions = () => {\n this.unsubscribeFunctions.forEach((cleanupFunction) => cleanupFunction());\n this.unsubscribeFunctions.clear();\n };\n\n public createPoll = async (poll: CreatePollData<SCG>) => {\n const { poll: createdPoll } = await this.client.createPoll(poll);\n\n return new Poll({ client: this.client, poll: createdPoll });\n };\n\n public getPoll = async (id: string) => {\n const cachedPoll = this.fromState(id);\n\n // optimistically return the cached poll if it exists and update in the background\n if (cachedPoll) {\n this.client.getPoll(id).then(({ poll }) => this.setOrOverwriteInCache(poll, true));\n return cachedPoll;\n }\n // fetch it, write to the cache and return otherwise\n const { poll } = await this.client.getPoll(id);\n\n this.setOrOverwriteInCache(poll);\n\n return this.fromState(id);\n };\n\n public queryPolls = async (filter: QueryPollsFilters, sort: PollSort = [], options: QueryPollsOptions = {}) => {\n const { polls, next } = await this.client.queryPolls(filter, sort, options);\n\n const pollInstances = polls.map((poll) => {\n this.setOrOverwriteInCache(poll, true);\n\n return this.fromState(poll.id);\n });\n\n return {\n polls: pollInstances,\n next,\n };\n };\n\n public hydratePollCache = (messages: FormatMessageResponse<SCG>[], overwriteState?: boolean) => {\n for (const message of messages) {\n if (!message.poll) {\n continue;\n }\n const pollResponse = message.poll as PollResponse<SCG>;\n this.setOrOverwriteInCache(pollResponse, overwriteState);\n }\n };\n\n private setOrOverwriteInCache = (pollResponse: PollResponse<SCG>, overwriteState?: boolean) => {\n if (!this.client._cacheEnabled()) {\n return;\n }\n const pollFromCache = this.fromState(pollResponse.id);\n if (!pollFromCache) {\n const poll = new Poll<SCG>({ client: this.client, poll: pollResponse });\n this.pollCache.set(poll.id, poll);\n } else if (overwriteState) {\n pollFromCache.reinitializeState(pollResponse);\n }\n };\n\n private subscribePollUpdated = () => {\n return this.client.on('poll.updated', (event) => {\n if (event.poll?.id) {\n this.fromState(event.poll.id)?.handlePollUpdated(event);\n }\n }).unsubscribe;\n };\n\n private subscribePollClosed = () => {\n return this.client.on('poll.closed', (event) => {\n if (event.poll?.id) {\n this.fromState(event.poll.id)?.handlePollClosed(event);\n }\n }).unsubscribe;\n };\n\n private subscribeVoteCasted = () => {\n return this.client.on('poll.vote_casted', (event) => {\n if (event.poll?.id) {\n this.fromState(event.poll.id)?.handleVoteCasted(event);\n }\n }).unsubscribe;\n };\n\n private subscribeVoteChanged = () => {\n return this.client.on('poll.vote_changed', (event) => {\n if (event.poll?.id) {\n this.fromState(event.poll.id)?.handleVoteChanged(event);\n }\n }).unsubscribe;\n };\n\n private subscribeVoteRemoved = () => {\n return this.client.on('poll.vote_removed', (event) => {\n if (event.poll?.id) {\n this.fromState(event.poll.id)?.handleVoteRemoved(event);\n }\n }).unsubscribe;\n };\n\n private subscribeMessageNew = () => {\n return this.client.on('message.new', (event) => {\n const { message } = event;\n if (message) {\n const formattedMessage = formatMessage(message);\n this.hydratePollCache([formattedMessage]);\n }\n }).unsubscribe;\n };\n}\n","/* eslint no-unused-vars: \"off\" */\n/* global process */\n\nimport axios, { AxiosError, AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';\nimport https from 'https';\nimport WebSocket from 'isomorphic-ws';\n\nimport { Channel } from './channel';\nimport { ClientState } from './client_state';\nimport { StableWSConnection } from './connection';\nimport { CheckSignature, DevToken, JWTUserToken } from './signing';\nimport { TokenManager } from './token_manager';\nimport { WSConnectionFallback } from './connection_fallback';\nimport { Campaign } from './campaign';\nimport { Segment } from './segment';\nimport { isErrorResponse, isWSFailure } from './errors';\nimport {\n addFileToFormData,\n axiosParamsSerializer,\n chatCodes,\n isFunction,\n isOnline,\n isOwnUserBaseProperty,\n messageSetPagination,\n normalizeQuerySort,\n randomId,\n retryInterval,\n sleep,\n} from './utils';\n\nimport {\n APIErrorResponse,\n APIResponse,\n AppSettings,\n AppSettingsAPIResponse,\n BannedUsersFilters,\n BannedUsersPaginationOptions,\n BannedUsersResponse,\n BannedUsersSort,\n BanUserOptions,\n BaseDeviceFields,\n BlockList,\n BlockListResponse,\n BlockUserAPIResponse,\n CampaignData,\n CampaignFilters,\n CampaignQueryOptions,\n CampaignResponse,\n CampaignSort,\n CastVoteAPIResponse,\n ChannelAPIResponse,\n ChannelData,\n ChannelFilters,\n ChannelMute,\n ChannelOptions,\n ChannelResponse,\n ChannelSort,\n ChannelStateOptions,\n CheckPushResponse,\n CheckSNSResponse,\n CheckSQSResponse,\n Configs,\n ConnectAPIResponse,\n CreateChannelOptions,\n CreateChannelResponse,\n CreateCommandOptions,\n CreateCommandResponse,\n CreateImportOptions,\n CreateImportResponse,\n CreateImportURLResponse,\n CreatePollAPIResponse,\n CreatePollData,\n CreatePollOptionAPIResponse,\n CustomPermissionOptions,\n DeactivateUsersOptions,\n DefaultGenerics,\n DeleteChannelsResponse,\n DeleteCommandResponse,\n DeleteUserOptions,\n Device,\n EndpointName,\n ErrorFromResponse,\n Event,\n EventHandler,\n ExportChannelOptions,\n ExportChannelRequest,\n ExportChannelResponse,\n ExportChannelStatusResponse,\n ExportUsersRequest,\n ExportUsersResponse,\n ExtendableGenerics,\n FlagMessageResponse,\n FlagReportsFilters,\n FlagReportsPaginationOptions,\n FlagReportsResponse,\n FlagsFilters,\n FlagsPaginationOptions,\n FlagsResponse,\n FlagUserResponse,\n GetBlockedUsersAPIResponse,\n GetCallTokenResponse,\n GetChannelTypeResponse,\n GetCommandResponse,\n GetImportResponse,\n GetMessageAPIResponse,\n GetMessageOptions,\n GetPollAPIResponse,\n GetPollOptionAPIResponse,\n GetRateLimitsResponse,\n GetThreadAPIResponse,\n GetThreadOptions,\n GetUnreadCountAPIResponse,\n GetUnreadCountBatchAPIResponse,\n ListChannelResponse,\n ListCommandsResponse,\n ListImportsPaginationOptions,\n ListImportsResponse,\n Logger,\n MarkChannelsReadOptions,\n Message,\n MessageFilters,\n MessageFlagsFilters,\n MessageFlagsPaginationOptions,\n MessageFlagsResponse,\n MessageResponse,\n Mute,\n MuteUserOptions,\n MuteUserResponse,\n OGAttachment,\n OwnUserResponse,\n PartialMessageUpdate,\n PartialPollUpdate,\n PartialThreadUpdate,\n PartialUserUpdate,\n PermissionAPIResponse,\n PermissionsAPIResponse,\n PollAnswersAPIResponse,\n PollData,\n PollOptionData,\n PollSort,\n PollVote,\n PollVoteData,\n PollVotesAPIResponse,\n PushProvider,\n PushProviderConfig,\n PushProviderID,\n PushProviderListResponse,\n PushProviderUpsertResponse,\n QueryChannelsAPIResponse,\n QueryMessageHistoryFilters,\n QueryMessageHistoryOptions,\n QueryMessageHistoryResponse,\n QueryMessageHistorySort,\n QueryPollsFilters,\n QueryPollsOptions,\n QueryPollsResponse,\n QueryReactionsAPIResponse,\n QueryReactionsOptions,\n QuerySegmentsOptions,\n QuerySegmentTargetsFilter,\n QueryThreadsAPIResponse,\n QueryThreadsOptions,\n QueryVotesFilters,\n QueryVotesOptions,\n ReactionFilters,\n ReactionResponse,\n ReactionSort,\n ReactivateUserOptions,\n ReactivateUsersOptions,\n ReservedMessageFields,\n ReviewFlagReportOptions,\n ReviewFlagReportResponse,\n SearchAPIResponse,\n SearchMessageSortBase,\n SearchOptions,\n SearchPayload,\n SegmentData,\n SegmentResponse,\n SegmentTargetsResponse,\n SegmentType,\n SendFileAPIResponse,\n SortParam,\n StreamChatOptions,\n SyncOptions,\n SyncResponse,\n TaskResponse,\n TaskStatus,\n TestPushDataInput,\n TestSNSDataInput,\n TestSQSDataInput,\n TokenOrProvider,\n TranslateResponse,\n UnBanUserOptions,\n UpdateChannelOptions,\n UpdateChannelResponse,\n UpdateCommandOptions,\n UpdateCommandResponse,\n UpdatedMessage,\n UpdateMessageAPIResponse,\n UpdateMessageOptions,\n UpdatePollAPIResponse,\n UpdatePollOptionAPIResponse,\n UpdateSegmentData,\n UserCustomEvent,\n UserFilters,\n UserOptions,\n UserResponse,\n UserSort,\n VoteSort,\n} from './types';\nimport { InsightMetrics, postInsights } from './insights';\nimport { Thread } from './thread';\nimport { Moderation } from './moderation';\nimport { ThreadManager } from './thread_manager';\nimport { DEFAULT_QUERY_CHANNELS_MESSAGE_LIST_PAGE_SIZE } from './constants';\nimport { PollManager } from './poll_manager';\n\nfunction isString(x: unknown): x is string {\n return typeof x === 'string' || x instanceof String;\n}\n\nexport class StreamChat<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> {\n private static _instance?: unknown | StreamChat; // type is undefined|StreamChat, unknown is due to TS limitations with statics\n\n _user?: OwnUserResponse<StreamChatGenerics> | UserResponse<StreamChatGenerics>;\n activeChannels: {\n [key: string]: Channel<StreamChatGenerics>;\n };\n threads: ThreadManager<StreamChatGenerics>;\n polls: PollManager<StreamChatGenerics>;\n anonymous: boolean;\n persistUserOnConnectionFailure?: boolean;\n axiosInstance: AxiosInstance;\n baseURL?: string;\n browser: boolean;\n cleaningIntervalRef?: NodeJS.Timeout;\n clientID?: string;\n configs: Configs<StreamChatGenerics>;\n key: string;\n listeners: Record<string, Array<(event: Event<StreamChatGenerics>) => void>>;\n logger: Logger;\n /**\n * When network is recovered, we re-query the active channels on client. But in single query, you can recover\n * only 30 channels. So its not guaranteed that all the channels in activeChannels object have updated state.\n * Thus in UI sdks, state recovery is managed by components themselves, they don't rely on js client for this.\n *\n * `recoverStateOnReconnect` parameter can be used in such cases, to disable state recovery within js client.\n * When false, user/consumer of this client will need to make sure all the channels present on UI by\n * manually calling queryChannels endpoint.\n */\n recoverStateOnReconnect?: boolean;\n moderation: Moderation<StreamChatGenerics>;\n mutedChannels: ChannelMute<StreamChatGenerics>[];\n mutedUsers: Mute<StreamChatGenerics>[];\n node: boolean;\n options: StreamChatOptions;\n secret?: string;\n setUserPromise: ConnectAPIResponse<StreamChatGenerics> | null;\n state: ClientState<StreamChatGenerics>;\n tokenManager: TokenManager<StreamChatGenerics>;\n user?: OwnUserResponse<StreamChatGenerics> | UserResponse<StreamChatGenerics>;\n userAgent?: string;\n userID?: string;\n wsBaseURL?: string;\n wsConnection: StableWSConnection<StreamChatGenerics> | null;\n wsFallback?: WSConnectionFallback<StreamChatGenerics>;\n wsPromise: ConnectAPIResponse<StreamChatGenerics> | null;\n consecutiveFailures: number;\n insightMetrics: InsightMetrics;\n defaultWSTimeoutWithFallback: number;\n defaultWSTimeout: number;\n private nextRequestAbortController: AbortController | null = null;\n\n /**\n * Initialize a client\n *\n * **Only use constructor for advanced usages. It is strongly advised to use `StreamChat.getInstance()` instead of `new StreamChat()` to reduce integration issues due to multiple WebSocket connections**\n * @param {string} key - the api key\n * @param {string} [secret] - the api secret\n * @param {StreamChatOptions} [options] - additional options, here you can pass custom options to axios instance\n * @param {boolean} [options.browser] - enforce the client to be in browser mode\n * @param {boolean} [options.warmUp] - default to false, if true, client will open a connection as soon as possible to speed up following requests\n * @param {Logger} [options.Logger] - custom logger\n * @param {number} [options.timeout] - default to 3000\n * @param {httpsAgent} [options.httpsAgent] - custom httpsAgent, in node it's default to https.agent()\n * @example <caption>initialize the client in user mode</caption>\n * new StreamChat('api_key')\n * @example <caption>initialize the client in user mode with options</caption>\n * new StreamChat('api_key', { warmUp:true, timeout:5000 })\n * @example <caption>secret is optional and only used in server side mode</caption>\n * new StreamChat('api_key', \"secret\", { httpsAgent: customAgent })\n */\n constructor(key: string, options?: StreamChatOptions);\n constructor(key: string, secret?: string, options?: StreamChatOptions);\n constructor(key: string, secretOrOptions?: StreamChatOptions | string, options?: StreamChatOptions) {\n // set the key\n this.key = key;\n this.listeners = {};\n this.state = new ClientState<StreamChatGenerics>({ client: this });\n // a list of channels to hide ws events from\n this.mutedChannels = [];\n this.mutedUsers = [];\n\n this.moderation = new Moderation(this);\n\n // set the secret\n if (secretOrOptions && isString(secretOrOptions)) {\n this.secret = secretOrOptions;\n }\n\n // set the options... and figure out defaults...\n const inputOptions = options ? options : secretOrOptions && !isString(secretOrOptions) ? secretOrOptions : {};\n\n this.browser = typeof inputOptions.browser !== 'undefined' ? inputOptions.browser : typeof window !== 'undefined';\n this.node = !this.browser;\n\n this.options = {\n timeout: 3000,\n withCredentials: false, // making sure cookies are not sent\n warmUp: false,\n recoverStateOnReconnect: true,\n disableCache: false,\n ...inputOptions,\n };\n\n if (this.node && !this.options.httpsAgent) {\n this.options.httpsAgent = new https.Agent({\n keepAlive: true,\n keepAliveMsecs: 3000,\n });\n }\n\n this.axiosInstance = axios.create(this.options);\n\n this.setBaseURL(this.options.baseURL || 'https://chat.stream-io-api.com');\n\n if (typeof process !== 'undefined' && 'env' in process && process.env.STREAM_LOCAL_TEST_RUN) {\n this.setBaseURL('http://localhost:3030');\n }\n\n if (typeof process !== 'undefined' && 'env' in process && process.env.STREAM_LOCAL_TEST_HOST) {\n this.setBaseURL('http://' + process.env.STREAM_LOCAL_TEST_HOST);\n }\n\n // WS connection is initialized when setUser is called\n this.wsConnection = null;\n this.wsPromise = null;\n this.setUserPromise = null;\n // keeps a reference to all the channels that are in use\n this.activeChannels = {};\n\n // mapping between channel groups and configs\n this.configs = {};\n this.anonymous = false;\n this.persistUserOnConnectionFailure = this.options?.persistUserOnConnectionFailure;\n\n // If its a server-side client, then lets initialize the tokenManager, since token will be\n // generated from secret.\n this.tokenManager = new TokenManager(this.secret);\n this.consecutiveFailures = 0;\n this.insightMetrics = new InsightMetrics();\n\n this.defaultWSTimeoutWithFallback = 6 * 1000;\n this.defaultWSTimeout = 15 * 1000;\n\n this.axiosInstance.defaults.paramsSerializer = axiosParamsSerializer;\n\n /**\n * logger function should accept 3 parameters:\n * @param logLevel string\n * @param message string\n * @param extraData object\n *\n * e.g.,\n * const client = new StreamChat('api_key', {}, {\n * \t\tlogger = (logLevel, message, extraData) => {\n * \t\t\tconsole.log(message);\n * \t\t}\n * })\n *\n * extraData contains tags array attached to log message. Tags can have one/many of following values:\n * 1. api\n * 2. api_request\n * 3. api_response\n * 4. client\n * 5. channel\n * 6. connection\n * 7. event\n *\n * It may also contains some extra data, some examples have been mentioned below:\n * 1. {\n * \t\ttags: ['api', 'api_request', 'client'],\n * \t\turl: string,\n * \t\tpayload: object,\n * \t\tconfig: object\n * }\n * 2. {\n * \t\ttags: ['api', 'api_response', 'client'],\n * \t\turl: string,\n * \t\tresponse: object\n * }\n * 3. {\n * \t\ttags: ['api', 'api_response', 'client'],\n * \t\turl: string,\n * \t\terror: object\n * }\n * 4. {\n * \t\ttags: ['event', 'client'],\n * \t\tevent: object\n * }\n * 5. {\n * \t\ttags: ['channel'],\n * \t\tchannel: object\n * }\n */\n this.logger = isFunction(inputOptions.logger) ? inputOptions.logger : () => null;\n this.recoverStateOnReconnect = this.options.recoverStateOnReconnect;\n this.threads = new ThreadManager({ client: this });\n this.polls = new PollManager({ client: this });\n }\n\n /**\n * Get a client instance\n *\n * This function always returns the same Client instance to avoid issues raised by multiple Client and WS connections\n *\n * **After the first call, the client configuration will not change if the key or options parameters change**\n *\n * @param {string} key - the api key\n * @param {string} [secret] - the api secret\n * @param {StreamChatOptions} [options] - additional options, here you can pass custom options to axios instance\n * @param {boolean} [options.browser] - enforce the client to be in browser mode\n * @param {boolean} [options.warmUp] - default to false, if true, client will open a connection as soon as possible to speed up following requests\n * @param {Logger} [options.Logger] - custom logger\n * @param {number} [options.timeout] - default to 3000\n * @param {httpsAgent} [options.httpsAgent] - custom httpsAgent, in node it's default to https.agent()\n * @example <caption>initialize the client in user mode</caption>\n * StreamChat.getInstance('api_key')\n * @example <caption>initialize the client in user mode with options</caption>\n * StreamChat.getInstance('api_key', { timeout:5000 })\n * @example <caption>secret is optional and only used in server side mode</caption>\n * StreamChat.getInstance('api_key', \"secret\", { httpsAgent: customAgent })\n */\n public static getInstance<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics>(\n key: string,\n options?: StreamChatOptions,\n ): StreamChat<StreamChatGenerics>;\n public static getInstance<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics>(\n key: string,\n secret?: string,\n options?: StreamChatOptions,\n ): StreamChat<StreamChatGenerics>;\n public static getInstance<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics>(\n key: string,\n secretOrOptions?: StreamChatOptions | string,\n options?: StreamChatOptions,\n ): StreamChat<StreamChatGenerics> {\n if (!StreamChat._instance) {\n if (typeof secretOrOptions === 'string') {\n StreamChat._instance = new StreamChat<StreamChatGenerics>(key, secretOrOptions, options);\n } else {\n StreamChat._instance = new StreamChat<StreamChatGenerics>(key, secretOrOptions);\n }\n }\n\n return StreamChat._instance as StreamChat<StreamChatGenerics>;\n }\n\n devToken(userID: string) {\n return DevToken(userID);\n }\n\n getAuthType() {\n return this.anonymous ? 'anonymous' : 'jwt';\n }\n\n setBaseURL(baseURL: string) {\n this.baseURL = baseURL;\n this.wsBaseURL = this.baseURL.replace('http', 'ws').replace(':3030', ':8800');\n }\n\n _getConnectionID = () => this.wsConnection?.connectionID || this.wsFallback?.connectionID;\n\n _hasConnectionID = () => Boolean(this._getConnectionID());\n\n /**\n * connectUser - Set the current user and open a WebSocket connection\n *\n * @param {OwnUserResponse<StreamChatGenerics> | UserResponse<StreamChatGenerics>} user Data about this user. IE {name: \"john\"}\n * @param {TokenOrProvider} userTokenOrProvider Token or provider\n *\n * @return {ConnectAPIResponse<StreamChatGenerics>} Returns a promise that resolves when the connection is setup\n */\n connectUser = async (\n user: OwnUserResponse<StreamChatGenerics> | UserResponse<StreamChatGenerics>,\n userTokenOrProvider: TokenOrProvider,\n ) => {\n if (!user.id) {\n throw new Error('The \"id\" field on the user is missing');\n }\n\n /**\n * Calling connectUser multiple times is potentially the result of a bad integration, however,\n * If the user id remains the same we don't throw error\n */\n if (this.userID === user.id && this.setUserPromise) {\n console.warn(\n 'Consecutive calls to connectUser is detected, ideally you should only call this function once in your app.',\n );\n return this.setUserPromise;\n }\n\n if (this.userID) {\n throw new Error(\n 'Use client.disconnect() before trying to connect as a different user. connectUser was called twice.',\n );\n }\n\n if ((this._isUsingServerAuth() || this.node) && !this.options.allowServerSideConnect) {\n console.warn(\n 'Please do not use connectUser server side. connectUser impacts MAU and concurrent connection usage and thus your bill. If you have a valid use-case, add \"allowServerSideConnect: true\" to the client options to disable this warning.',\n );\n }\n\n // we generate the client id client side\n this.userID = user.id;\n this.anonymous = false;\n\n const setTokenPromise = this._setToken(user, userTokenOrProvider);\n this._setUser(user);\n\n const wsPromise = this.openConnection();\n\n this.setUserPromise = Promise.all([setTokenPromise, wsPromise]).then(\n (result) => result[1], // We only return connection promise;\n );\n\n try {\n return await this.setUserPromise;\n } catch (err) {\n if (this.persistUserOnConnectionFailure) {\n // cleanup client to allow the user to retry connectUser again\n this.closeConnection();\n } else {\n this.disconnectUser();\n }\n throw err;\n }\n };\n\n /**\n * @deprecated Please use connectUser() function instead. Its naming is more consistent with its functionality.\n *\n * setUser - Set the current user and open a WebSocket connection\n *\n * @param {OwnUserResponse<StreamChatGenerics> | UserResponse<StreamChatGenerics>} user Data about this user. IE {name: \"john\"}\n * @param {TokenOrProvider} userTokenOrProvider Token or provider\n *\n * @return {ConnectAPIResponse<StreamChatGenerics>} Returns a promise that resolves when the connection is setup\n */\n setUser = this.connectUser;\n\n _setToken = (user: UserResponse<StreamChatGenerics>, userTokenOrProvider: TokenOrProvider) =>\n this.tokenManager.setTokenOrProvider(userTokenOrProvider, user);\n\n _setUser(user: OwnUserResponse<StreamChatGenerics> | UserResponse<StreamChatGenerics>) {\n /**\n * This one is used by the frontend. This is a copy of the current user object stored on backend.\n * It contains reserved properties and own user properties which are not present in `this._user`.\n */\n this.user = user;\n this.userID = user.id;\n // this one is actually used for requests. This is a copy of current user provided to `connectUser` function.\n this._user = { ...user };\n }\n\n /**\n * Disconnects the websocket connection, without removing the user set on client.\n * client.closeConnection will not trigger default auto-retry mechanism for reconnection. You need\n * to call client.openConnection to reconnect to websocket.\n *\n * This is mainly useful on mobile side. You can only receive push notifications\n * if you don't have active websocket connection.\n * So when your app goes to background, you can call `client.closeConnection`.\n * And when app comes back to foreground, call `client.openConnection`.\n *\n * @param timeout Max number of ms, to wait for close event of websocket, before forcefully assuming succesful disconnection.\n * https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent\n */\n closeConnection = async (timeout?: number) => {\n if (this.cleaningIntervalRef != null) {\n clearInterval(this.cleaningIntervalRef);\n this.cleaningIntervalRef = undefined;\n }\n\n await Promise.all([this.wsConnection?.disconnect(timeout), this.wsFallback?.disconnect(timeout)]);\n return Promise.resolve();\n };\n\n /**\n * Creates a new WebSocket connection with the current user. Returns empty promise, if there is an active connection\n */\n openConnection = async () => {\n if (!this.userID) {\n throw Error('User is not set on client, use client.connectUser or client.connectAnonymousUser instead');\n }\n\n if (this.wsConnection?.isConnecting && this.wsPromise) {\n this.logger('info', 'client:openConnection() - connection already in progress', {\n tags: ['connection', 'client'],\n });\n return this.wsPromise;\n }\n\n if ((this.wsConnection?.isHealthy || this.wsFallback?.isHealthy()) && this._hasConnectionID()) {\n this.logger('info', 'client:openConnection() - openConnection called twice, healthy connection already exists', {\n tags: ['connection', 'client'],\n });\n\n return;\n }\n\n this.clientID = `${this.userID}--${randomId()}`;\n this.wsPromise = this.connect();\n this._startCleaning();\n return this.wsPromise;\n };\n\n /**\n * @deprecated Please use client.openConnction instead.\n * @private\n *\n * Creates a new websocket connection with current user.\n */\n _setupConnection = this.openConnection;\n\n /**\n * updateAppSettings - updates application settings\n *\n * @param {AppSettings} options App settings.\n * IE: {\n 'apn_config': {\n 'auth_type': 'token',\n 'auth_key\": fs.readFileSync(\n './apn-push-auth-key.p8',\n 'utf-8',\n ),\n 'key_id': 'keyid',\n 'team_id': 'teamid',\n 'notification_template\": 'notification handlebars template',\n 'bundle_id': 'com.apple.your.app',\n 'development': true\n },\n 'firebase_config': {\n 'server_key': 'server key from fcm',\n 'notification_template': 'notification handlebars template',\n 'data_template': 'data handlebars template',\n 'apn_template': 'apn notification handlebars template under v2'\n },\n 'webhook_url': 'https://acme.com/my/awesome/webhook/'\n }\n */\n async updateAppSettings(options: AppSettings) {\n const apn_config = options.apn_config;\n if (apn_config?.p12_cert) {\n options = {\n ...options,\n apn_config: {\n ...apn_config,\n p12_cert: Buffer.from(apn_config.p12_cert).toString('base64'),\n },\n };\n }\n return await this.patch<APIResponse>(this.baseURL + '/app', options);\n }\n\n _normalizeDate = (before: Date | string | null): string | null => {\n if (before instanceof Date) {\n before = before.toISOString();\n }\n\n if (before === '') {\n throw new Error(\"Don't pass blank string for since, use null instead if resetting the token revoke\");\n }\n\n return before;\n };\n\n /**\n * Revokes all tokens on application level issued before given time\n */\n async revokeTokens(before: Date | string | null) {\n return await this.updateAppSettings({\n revoke_tokens_issued_before: this._normalizeDate(before),\n });\n }\n\n /**\n * Revokes token for a user issued before given time\n */\n async revokeUserToken(userID: string, before?: Date | string | null) {\n return await this.revokeUsersToken([userID], before);\n }\n\n /**\n * Revokes tokens for a list of users issued before given time\n */\n async revokeUsersToken(userIDs: string[], before?: Date | string | null) {\n if (before === undefined) {\n before = new Date().toISOString();\n } else {\n before = this._normalizeDate(before);\n }\n\n const users: PartialUserUpdate<StreamChatGenerics>[] = [];\n for (const userID of userIDs) {\n users.push({\n id: userID,\n set: <Partial<UserResponse<StreamChatGenerics>>>{\n revoke_tokens_issued_before: before,\n },\n });\n }\n\n return await this.partialUpdateUsers(users);\n }\n\n /**\n * getAppSettings - retrieves application settings\n */\n async getAppSettings() {\n return await this.get<AppSettingsAPIResponse<StreamChatGenerics>>(this.baseURL + '/app');\n }\n\n /**\n * testPushSettings - Tests the push settings for a user with a random chat message and the configured push templates\n *\n * @param {string} userID User ID. If user has no devices, it will error\n * @param {TestPushDataInput} [data] Overrides for push templates/message used\n * IE: {\n messageID: 'id-of-message', // will error if message does not exist\n apnTemplate: '{}', // if app doesn't have apn configured it will error\n firebaseTemplate: '{}', // if app doesn't have firebase configured it will error\n firebaseDataTemplate: '{}', // if app doesn't have firebase configured it will error\n skipDevices: true, // skip config/device checks and sending to real devices\n pushProviderName: 'staging' // one of your configured push providers\n pushProviderType: 'apn' // one of supported provider types\n }\n */\n async testPushSettings(userID: string, data: TestPushDataInput = {}) {\n return await this.post<CheckPushResponse>(this.baseURL + '/check_push', {\n user_id: userID,\n ...(data.messageID ? { message_id: data.messageID } : {}),\n ...(data.apnTemplate ? { apn_template: data.apnTemplate } : {}),\n ...(data.firebaseTemplate ? { firebase_template: data.firebaseTemplate } : {}),\n ...(data.firebaseDataTemplate ? { firebase_data_template: data.firebaseDataTemplate } : {}),\n ...(data.skipDevices ? { skip_devices: true } : {}),\n ...(data.pushProviderName ? { push_provider_name: data.pushProviderName } : {}),\n ...(data.pushProviderType ? { push_provider_type: data.pushProviderType } : {}),\n });\n }\n\n /**\n * testSQSSettings - Tests that the given or configured SQS configuration is valid\n *\n * @param {TestSQSDataInput} [data] Overrides SQS settings for testing if needed\n * IE: {\n sqs_key: 'auth_key',\n sqs_secret: 'auth_secret',\n sqs_url: 'url_to_queue',\n }\n */\n async testSQSSettings(data: TestSQSDataInput = {}) {\n return await this.post<CheckSQSResponse>(this.baseURL + '/check_sqs', data);\n }\n\n /**\n * testSNSSettings - Tests that the given or configured SNS configuration is valid\n *\n * @param {TestSNSDataInput} [data] Overrides SNS settings for testing if needed\n * IE: {\n sns_key: 'auth_key',\n sns_secret: 'auth_secret',\n sns_topic_arn: 'topic_to_publish_to',\n }\n */\n async testSNSSettings(data: TestSNSDataInput = {}) {\n return await this.post<CheckSNSResponse>(this.baseURL + '/check_sns', data);\n }\n\n /**\n * Disconnects the websocket and removes the user from client.\n *\n * @param timeout Max number of ms, to wait for close event of websocket, before forcefully assuming successful disconnection.\n * https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent\n */\n disconnectUser = async (timeout?: number) => {\n this.logger('info', 'client:disconnect() - Disconnecting the client', {\n tags: ['connection', 'client'],\n });\n\n // remove the user specific fields\n delete this.user;\n delete this._user;\n delete this.userID;\n\n this.anonymous = false;\n\n const closePromise = this.closeConnection(timeout);\n\n for (const channel of Object.values(this.activeChannels)) {\n channel._disconnect();\n }\n // ensure we no longer return inactive channels\n this.activeChannels = {};\n // reset client state\n this.state = new ClientState({ client: this });\n // reset thread manager\n this.threads.resetState();\n // reset token manager\n setTimeout(this.tokenManager.reset); // delay reseting to use token for disconnect calls\n\n // close the WS connection\n return closePromise;\n };\n\n /**\n *\n * @deprecated Please use client.disconnectUser instead.\n *\n * Disconnects the websocket and removes the user from client.\n */\n disconnect = this.disconnectUser;\n\n /**\n * connectAnonymousUser - Set an anonymous user and open a WebSocket connection\n */\n connectAnonymousUser = () => {\n if ((this._isUsingServerAuth() || this.node) && !this.options.allowServerSideConnect) {\n console.warn(\n 'Please do not use connectUser server side. connectUser impacts MAU and concurrent connection usage and thus your bill. If you have a valid use-case, add \"allowServerSideConnect: true\" to the client options to disable this warning.',\n );\n }\n\n this.anonymous = true;\n this.userID = randomId();\n const anonymousUser = {\n id: this.userID,\n anon: true,\n } as UserResponse<StreamChatGenerics>;\n\n this._setToken(anonymousUser, '');\n this._setUser(anonymousUser);\n\n return this._setupConnection();\n };\n\n /**\n * @deprecated Please use connectAnonymousUser. Its naming is more consistent with its functionality.\n */\n setAnonymousUser = this.connectAnonymousUser;\n\n /**\n * setGuestUser - Setup a temporary guest user\n *\n * @param {UserResponse<StreamChatGenerics>} user Data about this user. IE {name: \"john\"}\n *\n * @return {ConnectAPIResponse<StreamChatGenerics>} Returns a promise that resolves when the connection is setup\n */\n async setGuestUser(user: UserResponse<StreamChatGenerics>) {\n let response: { access_token: string; user: UserResponse<StreamChatGenerics> } | undefined;\n this.anonymous = true;\n try {\n response = await this.post<\n APIResponse & {\n access_token: string;\n user: UserResponse<StreamChatGenerics>;\n }\n >(this.baseURL + '/guest', { user });\n } catch (e) {\n this.anonymous = false;\n throw e;\n }\n this.anonymous = false;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { created_at, updated_at, last_active, online, ...guestUser } = response.user;\n return await this.connectUser(guestUser as UserResponse<StreamChatGenerics>, response.access_token);\n }\n\n /**\n * createToken - Creates a token to authenticate this user. This function is used server side.\n * The resulting token should be passed to the client side when the users registers or logs in.\n *\n * @param {string} userID The User ID\n * @param {number} [exp] The expiration time for the token expressed in the number of seconds since the epoch\n *\n * @return {string} Returns a token\n */\n createToken(userID: string, exp?: number, iat?: number) {\n if (this.secret == null) {\n throw Error(`tokens can only be created server-side using the API Secret`);\n }\n const extra: { exp?: number; iat?: number } = {};\n\n if (exp) {\n extra.exp = exp;\n }\n\n if (iat) {\n extra.iat = iat;\n }\n\n return JWTUserToken(this.secret, userID, extra, {});\n }\n\n /**\n * on - Listen to events on all channels and users your watching\n *\n * client.on('message.new', event => {console.log(\"my new message\", event, channel.state.messages)})\n * or\n * client.on(event => {console.log(event.type)})\n *\n * @param {EventHandler<StreamChatGenerics> | string} callbackOrString The event type to listen for (optional)\n * @param {EventHandler<StreamChatGenerics>} [callbackOrNothing] The callback to call\n *\n * @return {{ unsubscribe: () => void }} Description\n */\n on(callback: EventHandler<StreamChatGenerics>): { unsubscribe: () => void };\n on(eventType: string, callback: EventHandler<StreamChatGenerics>): { unsubscribe: () => void };\n on(\n callbackOrString: EventHandler<StreamChatGenerics> | string,\n callbackOrNothing?: EventHandler<StreamChatGenerics>,\n ): { unsubscribe: () => void } {\n const key = callbackOrNothing ? (callbackOrString as string) : 'all';\n const callback = callbackOrNothing ? callbackOrNothing : (callbackOrString as EventHandler<StreamChatGenerics>);\n if (!(key in this.listeners)) {\n this.listeners[key] = [];\n }\n this.logger('info', `Attaching listener for ${key} event`, {\n tags: ['event', 'client'],\n });\n this.listeners[key].push(callback);\n return {\n unsubscribe: () => {\n this.logger('info', `Removing listener for ${key} event`, {\n tags: ['event', 'client'],\n });\n this.listeners[key] = this.listeners[key].filter((el) => el !== callback);\n },\n };\n }\n\n /**\n * off - Remove the event handler\n *\n */\n off(callback: EventHandler<StreamChatGenerics>): void;\n off(eventType: string, callback: EventHandler<StreamChatGenerics>): void;\n off(\n callbackOrString: EventHandler<StreamChatGenerics> | string,\n callbackOrNothing?: EventHandler<StreamChatGenerics>,\n ) {\n const key = callbackOrNothing ? (callbackOrString as string) : 'all';\n const callback = callbackOrNothing ? callbackOrNothing : (callbackOrString as EventHandler<StreamChatGenerics>);\n if (!(key in this.listeners)) {\n this.listeners[key] = [];\n }\n\n this.logger('info', `Removing listener for ${key} event`, {\n tags: ['event', 'client'],\n });\n this.listeners[key] = this.listeners[key].filter((value) => value !== callback);\n }\n\n _logApiRequest(\n type: string,\n url: string,\n data: unknown,\n config: AxiosRequestConfig & {\n config?: AxiosRequestConfig & { maxBodyLength?: number };\n },\n ) {\n this.logger('info', `client: ${type} - Request - ${url}`, {\n tags: ['api', 'api_request', 'client'],\n url,\n payload: data,\n config,\n });\n }\n\n _logApiResponse<T>(type: string, url: string, response: AxiosResponse<T>) {\n this.logger('info', `client:${type} - Response - url: ${url} > status ${response.status}`, {\n tags: ['api', 'api_response', 'client'],\n url,\n response,\n });\n }\n\n _logApiError(type: string, url: string, error: unknown) {\n this.logger('error', `client:${type} - Error - url: ${url}`, {\n tags: ['api', 'api_response', 'client'],\n url,\n error,\n });\n }\n\n doAxiosRequest = async <T>(\n type: string,\n url: string,\n data?: unknown,\n options: AxiosRequestConfig & {\n config?: AxiosRequestConfig & { maxBodyLength?: number };\n } = {},\n ): Promise<T> => {\n await this.tokenManager.tokenReady();\n const requestConfig = this._enrichAxiosOptions(options);\n try {\n let response: AxiosResponse<T>;\n this._logApiRequest(type, url, data, requestConfig);\n switch (type) {\n case 'get':\n response = await this.axiosInstance.get(url, requestConfig);\n break;\n case 'delete':\n response = await this.axiosInstance.delete(url, requestConfig);\n break;\n case 'post':\n response = await this.axiosInstance.post(url, data, requestConfig);\n break;\n case 'postForm':\n response = await this.axiosInstance.postForm(url, data, requestConfig);\n break;\n case 'put':\n response = await this.axiosInstance.put(url, data, requestConfig);\n break;\n case 'patch':\n response = await this.axiosInstance.patch(url, data, requestConfig);\n break;\n case 'options':\n response = await this.axiosInstance.options(url, requestConfig);\n break;\n default:\n throw new Error('Invalid request type');\n }\n this._logApiResponse<T>(type, url, response);\n this.consecutiveFailures = 0;\n return this.handleResponse(response);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any /**TODO: generalize error types */) {\n e.client_request_id = requestConfig.headers?.['x-client-request-id'];\n this._logApiError(type, url, e);\n this.consecutiveFailures += 1;\n if (e.response) {\n /** connection_fallback depends on this token expiration logic */\n if (e.response.data.code === chatCodes.TOKEN_EXPIRED && !this.tokenManager.isStatic()) {\n if (this.consecutiveFailures > 1) {\n await sleep(retryInterval(this.consecutiveFailures));\n }\n this.tokenManager.loadToken();\n return await this.doAxiosRequest<T>(type, url, data, options);\n }\n return this.handleResponse(e.response);\n } else {\n throw e as AxiosError<APIErrorResponse>;\n }\n }\n };\n\n get<T>(url: string, params?: AxiosRequestConfig['params']) {\n return this.doAxiosRequest<T>('get', url, null, { params });\n }\n\n put<T>(url: string, data?: unknown) {\n return this.doAxiosRequest<T>('put', url, data);\n }\n\n post<T>(url: string, data?: unknown) {\n return this.doAxiosRequest<T>('post', url, data);\n }\n\n patch<T>(url: string, data?: unknown) {\n return this.doAxiosRequest<T>('patch', url, data);\n }\n\n delete<T>(url: string, params?: AxiosRequestConfig['params']) {\n return this.doAxiosRequest<T>('delete', url, null, { params });\n }\n\n sendFile(\n url: string,\n uri: string | NodeJS.ReadableStream | Buffer | File,\n name?: string,\n contentType?: string,\n user?: UserResponse<StreamChatGenerics>,\n ) {\n const data = addFileToFormData(uri, name, contentType || 'multipart/form-data');\n if (user != null) data.append('user', JSON.stringify(user));\n\n return this.doAxiosRequest<SendFileAPIResponse>('postForm', url, data, {\n headers: data.getHeaders ? data.getHeaders() : {}, // node vs browser\n config: {\n timeout: 0,\n maxContentLength: Infinity,\n maxBodyLength: Infinity,\n },\n });\n }\n\n errorFromResponse(response: AxiosResponse<APIErrorResponse>): ErrorFromResponse<APIErrorResponse> {\n let err: ErrorFromResponse<APIErrorResponse>;\n err = new ErrorFromResponse(`StreamChat error HTTP code: ${response.status}`);\n if (response.data && response.data.code) {\n err = new Error(`StreamChat error code ${response.data.code}: ${response.data.message}`);\n err.code = response.data.code;\n }\n err.response = response;\n err.status = response.status;\n return err;\n }\n\n handleResponse<T>(response: AxiosResponse<T>) {\n const data = response.data;\n if (isErrorResponse(response)) {\n throw this.errorFromResponse(response);\n }\n return data;\n }\n\n dispatchEvent = (event: Event<StreamChatGenerics>) => {\n if (!event.received_at) event.received_at = new Date();\n\n // client event handlers\n const postListenerCallbacks = this._handleClientEvent(event);\n\n // channel event handlers\n const cid = event.cid;\n const channel = cid ? this.activeChannels[cid] : undefined;\n if (channel) {\n channel._handleChannelEvent(event);\n }\n\n this._callClientListeners(event);\n\n if (channel) {\n channel._callChannelListeners(event);\n }\n\n postListenerCallbacks.forEach((c) => c());\n };\n\n handleEvent = (messageEvent: WebSocket.MessageEvent) => {\n // dispatch the event to the channel listeners\n const jsonString = messageEvent.data as string;\n const event = JSON.parse(jsonString) as Event<StreamChatGenerics>;\n this.dispatchEvent(event);\n };\n\n /**\n * Updates the members, watchers and read references of the currently active channels that contain this user\n *\n * @param {UserResponse<StreamChatGenerics>} user\n */\n _updateMemberWatcherReferences = (user: UserResponse<StreamChatGenerics>) => {\n const refMap = this.state.userChannelReferences[user.id] || {};\n for (const channelID in refMap) {\n const channel = this.activeChannels[channelID];\n if (channel?.state) {\n if (channel.state.members[user.id]) {\n channel.state.members[user.id].user = user;\n }\n if (channel.state.watchers[user.id]) {\n channel.state.watchers[user.id] = user;\n }\n if (channel.state.read[user.id]) {\n channel.state.read[user.id].user = user;\n }\n }\n }\n };\n\n /**\n * @deprecated Please _updateMemberWatcherReferences instead.\n * @private\n */\n _updateUserReferences = this._updateMemberWatcherReferences;\n\n /**\n * @private\n *\n * Updates the messages from the currently active channels that contain this user,\n * with updated user object.\n *\n * @param {UserResponse<StreamChatGenerics>} user\n */\n _updateUserMessageReferences = (user: UserResponse<StreamChatGenerics>) => {\n const refMap = this.state.userChannelReferences[user.id] || {};\n\n for (const channelID in refMap) {\n const channel = this.activeChannels[channelID];\n\n if (!channel) continue;\n\n const state = channel.state;\n\n /** update the messages from this user. */\n state?.updateUserMessages(user);\n }\n };\n\n /**\n * @private\n *\n * Deletes the messages from the currently active channels that contain this user\n *\n * If hardDelete is true, all the content of message will be stripped down.\n * Otherwise, only 'message.type' will be set as 'deleted'.\n *\n * @param {UserResponse<StreamChatGenerics>} user\n * @param {boolean} hardDelete\n */\n _deleteUserMessageReference = (user: UserResponse<StreamChatGenerics>, hardDelete = false) => {\n const refMap = this.state.userChannelReferences[user.id] || {};\n\n for (const channelID in refMap) {\n const channel = this.activeChannels[channelID];\n if (channel) {\n const state = channel.state;\n\n /** deleted the messages from this user. */\n state?.deleteUserMessages(user, hardDelete);\n }\n }\n };\n\n /**\n * @private\n *\n * Handle following user related events:\n * - user.presence.changed\n * - user.updated\n * - user.deleted\n *\n * @param {Event} event\n */\n _handleUserEvent = (event: Event<StreamChatGenerics>) => {\n if (!event.user) {\n return;\n }\n\n /** update the client.state with any changes to users */\n if (event.type === 'user.presence.changed' || event.type === 'user.updated') {\n if (event.user.id === this.userID) {\n const user = { ...(this.user || {}) };\n const _user = { ...(this._user || {}) };\n\n // Remove deleted properties from user objects.\n for (const key in this.user) {\n if (key in event.user || isOwnUserBaseProperty(key)) {\n continue;\n }\n\n delete user[key];\n delete _user[key];\n }\n\n /** Updating only available properties in _user object. */\n for (const key in event.user) {\n if (_user && key in _user) {\n _user[key] = event.user[key];\n }\n }\n\n // @ts-expect-error\n this._user = { ..._user };\n this.user = { ...user, ...event.user };\n }\n\n this.state.updateUser(event.user);\n this._updateMemberWatcherReferences(event.user);\n }\n\n if (event.type === 'user.updated') {\n this._updateUserMessageReferences(event.user);\n }\n\n if (event.type === 'user.deleted' && event.user.deleted_at && (event.mark_messages_deleted || event.hard_delete)) {\n this._deleteUserMessageReference(event.user, event.hard_delete);\n }\n };\n\n _handleClientEvent(event: Event<StreamChatGenerics>) {\n const client = this;\n const postListenerCallbacks = [];\n this.logger('info', `client:_handleClientEvent - Received event of type { ${event.type} }`, {\n tags: ['event', 'client'],\n event,\n });\n\n if (event.type === 'user.presence.changed' || event.type === 'user.updated' || event.type === 'user.deleted') {\n this._handleUserEvent(event);\n }\n\n if (event.type === 'health.check' && event.me) {\n client.user = event.me;\n client.state.updateUser(event.me);\n client.mutedChannels = event.me.channel_mutes;\n client.mutedUsers = event.me.mutes;\n }\n\n if (event.channel && event.type === 'notification.message_new') {\n this._addChannelConfig(event.channel);\n }\n\n if (event.type === 'notification.channel_mutes_updated' && event.me?.channel_mutes) {\n this.mutedChannels = event.me.channel_mutes;\n }\n\n if (event.type === 'notification.mutes_updated' && event.me?.mutes) {\n this.mutedUsers = event.me.mutes;\n }\n\n if (event.type === 'notification.mark_read' && event.unread_channels === 0) {\n const activeChannelKeys = Object.keys(this.activeChannels);\n activeChannelKeys.forEach((activeChannelKey) => (this.activeChannels[activeChannelKey].state.unreadCount = 0));\n }\n\n if ((event.type === 'channel.deleted' || event.type === 'notification.channel_deleted') && event.cid) {\n client.state.deleteAllChannelReference(event.cid);\n this.activeChannels[event.cid]?._disconnect();\n\n postListenerCallbacks.push(() => {\n if (!event.cid) return;\n\n delete this.activeChannels[event.cid];\n });\n }\n\n return postListenerCallbacks;\n }\n\n _muteStatus(cid: string) {\n let muteStatus;\n for (let i = 0; i < this.mutedChannels.length; i++) {\n const mute = this.mutedChannels[i];\n if (mute.channel?.cid === cid) {\n muteStatus = {\n muted: mute.expires ? new Date(mute.expires).getTime() > new Date().getTime() : true,\n createdAt: mute.created_at ? new Date(mute.created_at) : new Date(),\n expiresAt: mute.expires ? new Date(mute.expires) : null,\n };\n break;\n }\n }\n\n if (muteStatus) {\n return muteStatus;\n }\n\n return {\n muted: false,\n createdAt: null,\n expiresAt: null,\n };\n }\n\n _callClientListeners = (event: Event<StreamChatGenerics>) => {\n const client = this;\n // gather and call the listeners\n const listeners: Array<(event: Event<StreamChatGenerics>) => void> = [];\n if (client.listeners.all) {\n listeners.push(...client.listeners.all);\n }\n if (client.listeners[event.type]) {\n listeners.push(...client.listeners[event.type]);\n }\n\n // call the event and send it to the listeners\n for (const listener of listeners) {\n listener(event);\n }\n };\n\n recoverState = async () => {\n this.logger('info', `client:recoverState() - Start of recoverState with connectionID ${this._getConnectionID()}`, {\n tags: ['connection'],\n });\n\n const cids = Object.keys(this.activeChannels);\n if (cids.length && this.recoverStateOnReconnect) {\n this.logger('info', `client:recoverState() - Start the querying of ${cids.length} channels`, {\n tags: ['connection', 'client'],\n });\n\n await this.queryChannels(\n { cid: { $in: cids } } as ChannelFilters<StreamChatGenerics>,\n { last_message_at: -1 },\n { limit: 30 },\n );\n\n this.logger('info', 'client:recoverState() - Querying channels finished', { tags: ['connection', 'client'] });\n this.dispatchEvent({\n type: 'connection.recovered',\n } as Event<StreamChatGenerics>);\n } else {\n this.dispatchEvent({\n type: 'connection.recovered',\n } as Event<StreamChatGenerics>);\n }\n\n this.wsPromise = Promise.resolve();\n this.setUserPromise = Promise.resolve();\n };\n\n /**\n * @private\n */\n async connect() {\n if (!this.userID || !this._user) {\n throw Error('Call connectUser or connectAnonymousUser before starting the connection');\n }\n if (!this.wsBaseURL) {\n throw Error('Websocket base url not set');\n }\n if (!this.clientID) {\n throw Error('clientID is not set');\n }\n\n if (!this.wsConnection && (this.options.warmUp || this.options.enableInsights)) {\n this._sayHi();\n }\n // The StableWSConnection handles all the reconnection logic.\n if (this.options.wsConnection && this.node) {\n // Intentionally avoiding adding ts generics on wsConnection in options since its only useful for unit test purpose.\n ((this.options.wsConnection as unknown) as StableWSConnection<StreamChatGenerics>).setClient(this);\n this.wsConnection = (this.options.wsConnection as unknown) as StableWSConnection<StreamChatGenerics>;\n } else {\n this.wsConnection = new StableWSConnection<StreamChatGenerics>({\n client: this,\n });\n }\n\n try {\n // if fallback is used before, continue using it instead of waiting for WS to fail\n if (this.wsFallback) {\n return await this.wsFallback.connect();\n }\n\n // if WSFallback is enabled, ws connect should timeout faster so fallback can try\n return await this.wsConnection.connect(\n this.options.enableWSFallback ? this.defaultWSTimeoutWithFallback : this.defaultWSTimeout,\n );\n } catch (err) {\n // run fallback only if it's WS/Network error and not a normal API error\n // make sure browser is online before even trying the longpoll\n if (this.options.enableWSFallback && isWSFailure(err) && isOnline()) {\n this.logger('info', 'client:connect() - WS failed, fallback to longpoll', { tags: ['connection', 'client'] });\n this.dispatchEvent({ type: 'transport.changed', mode: 'longpoll' });\n\n this.wsConnection._destroyCurrentWSConnection();\n this.wsConnection.disconnect().then(); // close WS so no retry\n this.wsFallback = new WSConnectionFallback<StreamChatGenerics>({\n client: this,\n });\n return await this.wsFallback.connect();\n }\n\n throw err;\n }\n }\n\n /**\n * Check the connectivity with server for warmup purpose.\n *\n * @private\n */\n _sayHi() {\n const client_request_id = randomId();\n const opts = { headers: { 'x-client-request-id': client_request_id } };\n this.doAxiosRequest('get', this.baseURL + '/hi', null, opts).catch((e) => {\n if (this.options.enableInsights) {\n postInsights('http_hi_failed', {\n api_key: this.key,\n err: e,\n client_request_id,\n });\n }\n });\n }\n\n /**\n * queryUsers - Query users and watch user presence\n *\n * @param {UserFilters<StreamChatGenerics>} filterConditions MongoDB style filter conditions\n * @param {UserSort<StreamChatGenerics>} sort Sort options, for instance [{last_active: -1}].\n * When using multiple fields, make sure you use array of objects to guarantee field order, for instance [{last_active: -1}, {created_at: 1}]\n * @param {UserOptions} options Option object, {presence: true}\n *\n * @return {Promise<{ users: Array<UserResponse<StreamChatGenerics>> }>} User Query Response\n */\n async queryUsers(\n filterConditions: UserFilters<StreamChatGenerics>,\n sort: UserSort<StreamChatGenerics> = [],\n options: UserOptions = {},\n ) {\n const defaultOptions = {\n presence: false,\n };\n\n // Make sure we wait for the connect promise if there is a pending one\n await this.wsPromise;\n\n if (!this._hasConnectionID()) {\n defaultOptions.presence = false;\n }\n\n // Return a list of users\n const data = await this.get<APIResponse & { users: Array<UserResponse<StreamChatGenerics>> }>(\n this.baseURL + '/users',\n {\n payload: {\n filter_conditions: filterConditions,\n sort: normalizeQuerySort(sort),\n ...defaultOptions,\n ...options,\n },\n },\n );\n\n this.state.updateUsers(data.users);\n\n return data;\n }\n\n /**\n * queryBannedUsers - Query user bans\n *\n * @param {BannedUsersFilters} filterConditions MongoDB style filter conditions\n * @param {BannedUsersSort} sort Sort options [{created_at: 1}].\n * @param {BannedUsersPaginationOptions} options Option object, {limit: 10, offset:0, exclude_expired_bans: true}\n *\n * @return {Promise<BannedUsersResponse<StreamChatGenerics>>} Ban Query Response\n */\n async queryBannedUsers(\n filterConditions: BannedUsersFilters = {},\n sort: BannedUsersSort = [],\n options: BannedUsersPaginationOptions = {},\n ) {\n // Return a list of user bans\n return await this.get<BannedUsersResponse<StreamChatGenerics>>(this.baseURL + '/query_banned_users', {\n payload: {\n filter_conditions: filterConditions,\n sort: normalizeQuerySort(sort),\n ...options,\n },\n });\n }\n\n /**\n * queryMessageFlags - Query message flags\n *\n * @param {MessageFlagsFilters} filterConditions MongoDB style filter conditions\n * @param {MessageFlagsPaginationOptions} options Option object, {limit: 10, offset:0}\n *\n * @return {Promise<MessageFlagsResponse<StreamChatGenerics>>} Message Flags Response\n */\n async queryMessageFlags(filterConditions: MessageFlagsFilters = {}, options: MessageFlagsPaginationOptions = {}) {\n // Return a list of message flags\n return await this.get<MessageFlagsResponse<StreamChatGenerics>>(this.baseURL + '/moderation/flags/message', {\n payload: { filter_conditions: filterConditions, ...options },\n });\n }\n\n /**\n * queryChannels - Query channels\n *\n * @param {ChannelFilters<StreamChatGenerics>} filterConditions object MongoDB style filters\n * @param {ChannelSort<StreamChatGenerics>} [sort] Sort options, for instance {created_at: -1}.\n * When using multiple fields, make sure you use array of objects to guarantee field order, for instance [{last_updated: -1}, {created_at: 1}]\n * @param {ChannelOptions} [options] Options object\n * @param {ChannelStateOptions} [stateOptions] State options object. These options will only be used for state management and won't be sent in the request.\n * - stateOptions.skipInitialization - Skips the initialization of the state for the channels matching the ids in the list.\n *\n * @return {Promise<{ channels: Array<ChannelAPIResponse<AStreamChatGenerics>>}> } search channels response\n */\n async queryChannels(\n filterConditions: ChannelFilters<StreamChatGenerics>,\n sort: ChannelSort<StreamChatGenerics> = [],\n options: ChannelOptions = {},\n stateOptions: ChannelStateOptions = {},\n ) {\n const defaultOptions: ChannelOptions = {\n state: true,\n watch: true,\n presence: false,\n };\n\n // Make sure we wait for the connect promise if there is a pending one\n await this.wsPromise;\n if (!this._hasConnectionID()) {\n defaultOptions.watch = false;\n }\n\n // Return a list of channels\n const payload = {\n filter_conditions: filterConditions,\n sort: normalizeQuerySort(sort),\n ...defaultOptions,\n ...options,\n };\n\n const data = await this.post<QueryChannelsAPIResponse<StreamChatGenerics>>(this.baseURL + '/channels', payload);\n\n this.dispatchEvent({\n type: 'channels.queried',\n queriedChannels: {\n channels: data.channels,\n isLatestMessageSet: true,\n },\n });\n\n return this.hydrateActiveChannels(data.channels, stateOptions, options);\n }\n\n /**\n * queryReactions - Query reactions\n *\n * @param {ReactionFilters<StreamChatGenerics>} filter object MongoDB style filters\n * @param {ReactionSort<StreamChatGenerics>} [sort] Sort options, for instance {created_at: -1}.\n * @param {QueryReactionsOptions} [options] Pagination object\n *\n * @return {Promise<{ QueryReactionsAPIResponse } search channels response\n */\n async queryReactions(\n messageID: string,\n filter: ReactionFilters<StreamChatGenerics>,\n sort: ReactionSort<StreamChatGenerics> = [],\n options: QueryReactionsOptions = {},\n ) {\n // Make sure we wait for the connect promise if there is a pending one\n await this.wsPromise;\n\n // Return a list of channels\n const payload = {\n filter,\n sort: normalizeQuerySort(sort),\n ...options,\n };\n\n return await this.post<QueryReactionsAPIResponse<StreamChatGenerics>>(\n this.baseURL + '/messages/' + encodeURIComponent(messageID) + '/reactions',\n payload,\n );\n }\n\n hydrateActiveChannels(\n channelsFromApi: ChannelAPIResponse<StreamChatGenerics>[] = [],\n stateOptions: ChannelStateOptions = {},\n queryChannelsOptions?: ChannelOptions,\n ) {\n const { skipInitialization, offlineMode = false } = stateOptions;\n const channels: Channel<StreamChatGenerics>[] = [];\n\n for (const channelState of channelsFromApi) {\n this._addChannelConfig(channelState.channel);\n const c = this.channel(channelState.channel.type, channelState.channel.id);\n c.data = channelState.channel;\n c.offlineMode = offlineMode;\n c.initialized = !offlineMode;\n\n let updatedMessagesSet;\n if (skipInitialization === undefined) {\n const { messageSet } = c._initializeState(channelState, 'latest');\n updatedMessagesSet = messageSet;\n } else if (!skipInitialization.includes(channelState.channel.id)) {\n c.state.clearMessages();\n const { messageSet } = c._initializeState(channelState, 'latest');\n updatedMessagesSet = messageSet;\n }\n\n if (updatedMessagesSet) {\n updatedMessagesSet.pagination = {\n ...updatedMessagesSet.pagination,\n ...messageSetPagination({\n parentSet: updatedMessagesSet,\n requestedPageSize: queryChannelsOptions?.message_limit || DEFAULT_QUERY_CHANNELS_MESSAGE_LIST_PAGE_SIZE,\n returnedPage: channelState.messages,\n logger: this.logger,\n }),\n };\n this.polls.hydratePollCache(updatedMessagesSet.messages, true);\n }\n\n channels.push(c);\n }\n\n return channels;\n }\n\n /**\n * search - Query messages\n *\n * @param {ChannelFilters<StreamChatGenerics>} filterConditions MongoDB style filter conditions\n * @param {MessageFilters<StreamChatGenerics> | string} query search query or object MongoDB style filters\n * @param {SearchOptions<StreamChatGenerics>} [options] Option object, {user_id: 'tommaso'}\n *\n * @return {Promise<SearchAPIResponse<StreamChatGenerics>>} search messages response\n */\n async search(\n filterConditions: ChannelFilters<StreamChatGenerics>,\n query: string | MessageFilters<StreamChatGenerics>,\n options: SearchOptions<StreamChatGenerics> = {},\n ) {\n if (options.offset && options.next) {\n throw Error(`Cannot specify offset with next`);\n }\n const payload: SearchPayload<StreamChatGenerics> = {\n filter_conditions: filterConditions,\n ...options,\n sort: options.sort ? normalizeQuerySort<SearchMessageSortBase<StreamChatGenerics>>(options.sort) : undefined,\n };\n if (typeof query === 'string') {\n payload.query = query;\n } else if (typeof query === 'object') {\n payload.message_filter_conditions = query;\n } else {\n throw Error(`Invalid type ${typeof query} for query parameter`);\n }\n\n // Make sure we wait for the connect promise if there is a pending one\n await this.wsPromise;\n\n return await this.get<SearchAPIResponse<StreamChatGenerics>>(this.baseURL + '/search', { payload });\n }\n\n /**\n * setLocalDevice - Set the device info for the current client(device) that will be sent via WS connection automatically\n *\n * @param {BaseDeviceFields} device the device object\n * @param {string} device.id device id\n * @param {string} device.push_provider the push provider\n *\n */\n setLocalDevice(device: BaseDeviceFields) {\n if (\n (this.wsConnection?.isConnecting && this.wsPromise) ||\n ((this.wsConnection?.isHealthy || this.wsFallback?.isHealthy()) && this._hasConnectionID())\n ) {\n throw new Error('you can only set device before opening a websocket connection');\n }\n\n this.options.device = device;\n }\n\n /**\n * addDevice - Adds a push device for a user.\n *\n * @param {string} id the device id\n * @param {PushProvider} push_provider the push provider\n * @param {string} [userID] the user id (defaults to current user)\n * @param {string} [push_provider_name] user provided push provider name for multi bundle support\n *\n */\n async addDevice(id: string, push_provider: PushProvider, userID?: string, push_provider_name?: string) {\n return await this.post<APIResponse>(this.baseURL + '/devices', {\n id,\n push_provider,\n ...(userID != null ? { user_id: userID } : {}),\n ...(push_provider_name != null ? { push_provider_name } : {}),\n });\n }\n\n /**\n * getDevices - Returns the devices associated with a current user\n *\n * @param {string} [userID] User ID. Only works on serverside\n *\n * @return {Device<StreamChatGenerics>[]} Array of devices\n */\n async getDevices(userID?: string) {\n return await this.get<APIResponse & { devices?: Device<StreamChatGenerics>[] }>(\n this.baseURL + '/devices',\n userID ? { user_id: userID } : {},\n );\n }\n\n /**\n * getUnreadCount - Returns unread counts for a single user\n *\n * @param {string} [userID] User ID.\n *\n * @return {<GetUnreadCountAPIResponse>}\n */\n async getUnreadCount(userID?: string) {\n return await this.get<GetUnreadCountAPIResponse>(this.baseURL + '/unread', userID ? { user_id: userID } : {});\n }\n\n /**\n * getUnreadCountBatch - Returns unread counts for multiple users at once. Only works server side.\n *\n * @param {string[]} [userIDs] List of user IDs to fetch unread counts for.\n *\n * @return {<GetUnreadCountBatchAPIResponse>}\n */\n async getUnreadCountBatch(userIDs: string[]) {\n return await this.post<GetUnreadCountBatchAPIResponse>(this.baseURL + '/unread_batch', { user_ids: userIDs });\n }\n\n /**\n * removeDevice - Removes the device with the given id. Clientside users can only delete their own devices\n *\n * @param {string} id The device id\n * @param {string} [userID] The user id. Only specify this for serverside requests\n *\n */\n async removeDevice(id: string, userID?: string) {\n return await this.delete<APIResponse>(this.baseURL + '/devices', {\n id,\n ...(userID ? { user_id: userID } : {}),\n });\n }\n\n /**\n * getRateLimits - Returns the rate limits quota and usage for the current app, possibly filter for a specific platform and/or endpoints.\n * Only available server-side.\n *\n * @param {object} [params] The params for the call. If none of the params are set, all limits for all platforms are returned.\n * @returns {Promise<GetRateLimitsResponse>}\n */\n async getRateLimits(params?: {\n android?: boolean;\n endpoints?: EndpointName[];\n ios?: boolean;\n serverSide?: boolean;\n web?: boolean;\n }) {\n const { serverSide, web, android, ios, endpoints } = params || {};\n return this.get<GetRateLimitsResponse>(this.baseURL + '/rate_limits', {\n server_side: serverSide,\n web,\n android,\n ios,\n endpoints: endpoints ? endpoints.join(',') : undefined,\n });\n }\n\n _addChannelConfig({ cid, config }: ChannelResponse<StreamChatGenerics>) {\n if (this._cacheEnabled()) {\n this.configs[cid] = config;\n }\n }\n\n /**\n * channel - Returns a new channel with the given type, id and custom data\n *\n * If you want to create a unique conversation between 2 or more users; you can leave out the ID parameter and provide the list of members.\n * Make sure to await channel.create() or channel.watch() before accessing channel functions:\n * ie. channel = client.channel(\"messaging\", {members: [\"tommaso\", \"thierry\"]})\n * await channel.create() to assign an ID to channel\n *\n * @param {string} channelType The channel type\n * @param {string | ChannelData<StreamChatGenerics> | null} [channelIDOrCustom] The channel ID, you can leave this out if you want to create a conversation channel\n * @param {object} [custom] Custom data to attach to the channel\n *\n * @return {channel} The channel object, initialize it using channel.watch()\n */\n channel(\n channelType: string,\n channelID?: string | null,\n custom?: ChannelData<StreamChatGenerics>,\n ): Channel<StreamChatGenerics>;\n channel(channelType: string, custom?: ChannelData<StreamChatGenerics>): Channel<StreamChatGenerics>;\n channel(\n channelType: string,\n channelIDOrCustom?: string | ChannelData<StreamChatGenerics> | null,\n custom: ChannelData<StreamChatGenerics> = {} as ChannelData<StreamChatGenerics>,\n ) {\n if (!this.userID && !this._isUsingServerAuth()) {\n throw Error('Call connectUser or connectAnonymousUser before creating a channel');\n }\n\n if (~channelType.indexOf(':')) {\n throw Error(`Invalid channel group ${channelType}, can't contain the : character`);\n }\n\n // support channel(\"messaging\", {options})\n if (channelIDOrCustom && typeof channelIDOrCustom === 'object') {\n return this.getChannelByMembers(channelType, channelIDOrCustom);\n }\n\n // // support channel(\"messaging\", undefined, {options})\n if (!channelIDOrCustom && typeof custom === 'object' && custom.members?.length) {\n return this.getChannelByMembers(channelType, custom);\n }\n\n // support channel(\"messaging\", null, {options})\n // support channel(\"messaging\", undefined, {options})\n // support channel(\"messaging\", \"\", {options})\n if (!channelIDOrCustom) {\n return new Channel<StreamChatGenerics>(this, channelType, undefined, custom);\n }\n\n return this.getChannelById(channelType, channelIDOrCustom, custom);\n }\n\n /**\n * It's a helper method for `client.channel()` method, used to create unique conversation or\n * channel based on member list instead of id.\n *\n * If the channel already exists in `activeChannels` list, then we simply return it, since that\n * means the same channel was already requested or created.\n *\n * Otherwise we create a new instance of Channel class and return it.\n *\n * @private\n *\n * @param {string} channelType The channel type\n * @param {object} [custom] Custom data to attach to the channel\n *\n * @return {channel} The channel object, initialize it using channel.watch()\n */\n getChannelByMembers = (channelType: string, custom: ChannelData<StreamChatGenerics>) => {\n // Check if the channel already exists.\n // Only allow 1 channel object per cid\n const membersStr = [...(custom.members || [])].sort().join(',');\n const tempCid = `${channelType}:!members-${membersStr}`;\n\n if (!membersStr) {\n throw Error('Please specify atleast one member when creating unique conversation');\n }\n\n // channel could exist in `activeChannels` list with either one of the following two keys:\n // 1. cid - Which gets set on channel only after calling channel.query or channel.watch or channel.create\n // 2. Sorted membersStr - E.g., \"messaging:amin,vishal\" OR \"messaging:amin,jaap,tom\"\n // This is set when you create a channel, but haven't queried yet. After query,\n // we will replace it with `cid`\n for (const key in this.activeChannels) {\n const channel = this.activeChannels[key];\n if (channel.disconnected) {\n continue;\n }\n\n if (key === tempCid) {\n return channel;\n }\n\n if (key.indexOf(`${channelType}:!members-`) === 0) {\n const membersStrInExistingChannel = Object.keys(channel.state.members).sort().join(',');\n if (membersStrInExistingChannel === membersStr) {\n return channel;\n }\n }\n }\n\n const channel = new Channel<StreamChatGenerics>(this, channelType, undefined, custom);\n\n // For the time being set the key as membersStr, since we don't know the cid yet.\n // In channel.query, we will replace it with 'cid'.\n if (this._cacheEnabled()) {\n this.activeChannels[tempCid] = channel;\n }\n\n return channel;\n };\n\n /**\n * Its a helper method for `client.channel()` method, used to channel given the id of channel.\n *\n * If the channel already exists in `activeChannels` list, then we simply return it, since that\n * means the same channel was already requested or created.\n *\n * Otherwise we create a new instance of Channel class and return it.\n *\n * @private\n *\n * @param {string} channelType The channel type\n * @param {string} [channelID] The channel ID\n * @param {object} [custom] Custom data to attach to the channel\n *\n * @return {channel} The channel object, initialize it using channel.watch()\n */\n getChannelById = (channelType: string, channelID: string, custom: ChannelData<StreamChatGenerics>) => {\n if (typeof channelID === 'string' && ~channelID.indexOf(':')) {\n throw Error(`Invalid channel id ${channelID}, can't contain the : character`);\n }\n\n // only allow 1 channel object per cid\n const cid = `${channelType}:${channelID}`;\n if (cid in this.activeChannels && this.activeChannels[cid] && !this.activeChannels[cid].disconnected) {\n const channel = this.activeChannels[cid];\n if (Object.keys(custom).length > 0) {\n channel.data = { ...channel.data, ...custom };\n channel._data = { ...channel._data, ...custom };\n }\n return channel;\n }\n const channel = new Channel<StreamChatGenerics>(this, channelType, channelID, custom);\n if (this._cacheEnabled()) {\n this.activeChannels[channel.cid] = channel;\n }\n\n return channel;\n };\n\n /**\n * partialUpdateUser - Update the given user object\n *\n * @param {PartialUserUpdate<StreamChatGenerics>} partialUserObject which should contain id and any of \"set\" or \"unset\" params;\n * example: {id: \"user1\", set:{field: value}, unset:[\"field2\"]}\n *\n * @return {Promise<{ users: { [key: string]: UserResponse<StreamChatGenerics> } }>} list of updated users\n */\n async partialUpdateUser(partialUserObject: PartialUserUpdate<StreamChatGenerics>) {\n return await this.partialUpdateUsers([partialUserObject]);\n }\n\n /**\n * upsertUsers - Batch upsert the list of users\n *\n * @param {UserResponse<StreamChatGenerics>[]} users list of users\n *\n * @return {Promise<{ users: { [key: string]: UserResponse<StreamChatGenerics> } }>}\n */\n async upsertUsers(users: UserResponse<StreamChatGenerics>[]) {\n const userMap: { [key: string]: UserResponse<StreamChatGenerics> } = {};\n for (const userObject of users) {\n if (!userObject.id) {\n throw Error('User ID is required when updating a user');\n }\n userMap[userObject.id] = userObject;\n }\n\n return await this.post<\n APIResponse & {\n users: { [key: string]: UserResponse<StreamChatGenerics> };\n }\n >(this.baseURL + '/users', { users: userMap });\n }\n\n /**\n * @deprecated Please use upsertUsers() function instead.\n *\n * updateUsers - Batch update the list of users\n *\n * @param {UserResponse<StreamChatGenerics>[]} users list of users\n * @return {Promise<{ users: { [key: string]: UserResponse<StreamChatGenerics> } }>}\n */\n updateUsers = this.upsertUsers;\n\n /**\n * upsertUser - Update or Create the given user object\n *\n * @param {UserResponse<StreamChatGenerics>} userObject user object, the only required field is the user id. IE {id: \"myuser\"} is valid\n *\n * @return {Promise<{ users: { [key: string]: UserResponse<StreamChatGenerics> } }>}\n */\n upsertUser(userObject: UserResponse<StreamChatGenerics>) {\n return this.upsertUsers([userObject]);\n }\n\n /**\n * @deprecated Please use upsertUser() function instead.\n *\n * updateUser - Update or Create the given user object\n *\n * @param {UserResponse<StreamChatGenerics>} userObject user object, the only required field is the user id. IE {id: \"myuser\"} is valid\n * @return {Promise<{ users: { [key: string]: UserResponse<StreamChatGenerics> } }>}\n */\n updateUser = this.upsertUser;\n\n /**\n * partialUpdateUsers - Batch partial update of users\n *\n * @param {PartialUserUpdate<StreamChatGenerics>[]} users list of partial update requests\n *\n * @return {Promise<{ users: { [key: string]: UserResponse<StreamChatGenerics> } }>}\n */\n async partialUpdateUsers(users: PartialUserUpdate<StreamChatGenerics>[]) {\n for (const userObject of users) {\n if (!userObject.id) {\n throw Error('User ID is required when updating a user');\n }\n }\n\n return await this.patch<\n APIResponse & {\n users: { [key: string]: UserResponse<StreamChatGenerics> };\n }\n >(this.baseURL + '/users', { users });\n }\n\n async deleteUser(\n userID: string,\n params?: {\n delete_conversation_channels?: boolean;\n hard_delete?: boolean;\n mark_messages_deleted?: boolean;\n },\n ) {\n return await this.delete<\n APIResponse & { user: UserResponse<StreamChatGenerics> } & {\n task_id?: string;\n }\n >(this.baseURL + `/users/${encodeURIComponent(userID)}`, params);\n }\n\n /**\n * restoreUsers - Restore soft deleted users\n *\n * @param {string[]} user_ids which users to restore\n *\n * @return {APIResponse} An API response\n */\n async restoreUsers(user_ids: string[]) {\n return await this.post<APIResponse>(this.baseURL + `/users/restore`, {\n user_ids,\n });\n }\n\n /**\n * reactivateUser - Reactivate one user\n *\n * @param {string} userID which user to reactivate\n * @param {ReactivateUserOptions} [options]\n *\n * @return {UserResponse} Reactivated user\n */\n async reactivateUser(userID: string, options?: ReactivateUserOptions) {\n return await this.post<APIResponse & { user: UserResponse<StreamChatGenerics> }>(\n this.baseURL + `/users/${encodeURIComponent(userID)}/reactivate`,\n { ...options },\n );\n }\n\n /**\n * reactivateUsers - Reactivate many users asynchronously\n *\n * @param {string[]} user_ids which users to reactivate\n * @param {ReactivateUsersOptions} [options]\n *\n * @return {TaskResponse} A task ID\n */\n async reactivateUsers(user_ids: string[], options?: ReactivateUsersOptions) {\n return await this.post<APIResponse & TaskResponse>(this.baseURL + `/users/reactivate`, { user_ids, ...options });\n }\n\n /**\n * deactivateUser - Deactivate one user\n *\n * @param {string} userID which user to deactivate\n * @param {DeactivateUsersOptions} [options]\n *\n * @return {UserResponse} Deactivated user\n */\n async deactivateUser(userID: string, options?: DeactivateUsersOptions) {\n return await this.post<APIResponse & { user: UserResponse<StreamChatGenerics> }>(\n this.baseURL + `/users/${encodeURIComponent(userID)}/deactivate`,\n { ...options },\n );\n }\n\n /**\n * deactivateUsers - Deactivate many users asynchronously\n *\n * @param {string[]} user_ids which users to deactivate\n * @param {DeactivateUsersOptions} [options]\n *\n * @return {TaskResponse} A task ID\n */\n async deactivateUsers(user_ids: string[], options?: DeactivateUsersOptions) {\n return await this.post<APIResponse & TaskResponse>(this.baseURL + `/users/deactivate`, { user_ids, ...options });\n }\n\n async exportUser(userID: string, options?: Record<string, string>) {\n return await this.get<\n APIResponse & {\n messages: MessageResponse<StreamChatGenerics>[];\n reactions: ReactionResponse<StreamChatGenerics>[];\n user: UserResponse<StreamChatGenerics>;\n }\n >(this.baseURL + `/users/${encodeURIComponent(userID)}/export`, { ...options });\n }\n\n /** banUser - bans a user from all channels\n *\n * @param {string} targetUserID\n * @param {BanUserOptions<StreamChatGenerics>} [options]\n * @returns {Promise<APIResponse>}\n */\n async banUser(targetUserID: string, options?: BanUserOptions<StreamChatGenerics>) {\n return await this.post<APIResponse>(this.baseURL + '/moderation/ban', {\n target_user_id: targetUserID,\n ...options,\n });\n }\n\n /** unbanUser - revoke global ban for a user\n *\n * @param {string} targetUserID\n * @param {UnBanUserOptions} [options]\n * @returns {Promise<APIResponse>}\n */\n async unbanUser(targetUserID: string, options?: UnBanUserOptions) {\n return await this.delete<APIResponse>(this.baseURL + '/moderation/ban', {\n target_user_id: targetUserID,\n ...options,\n });\n }\n\n /** shadowBan - shadow bans a user from all channels\n *\n * @param {string} targetUserID\n * @param {BanUserOptions<StreamChatGenerics>} [options]\n * @returns {Promise<APIResponse>}\n */\n async shadowBan(targetUserID: string, options?: BanUserOptions<StreamChatGenerics>) {\n return await this.banUser(targetUserID, {\n shadow: true,\n ...options,\n });\n }\n\n /** removeShadowBan - revoke global shadow ban for a user\n *\n * @param {string} targetUserID\n * @param {UnBanUserOptions} [options]\n * @returns {Promise<APIResponse>}\n */\n async removeShadowBan(targetUserID: string, options?: UnBanUserOptions) {\n return await this.unbanUser(targetUserID, {\n shadow: true,\n ...options,\n });\n }\n async blockUser(blockedUserID: string, user_id?: string) {\n return await this.post<BlockUserAPIResponse>(this.baseURL + '/users/block', {\n blocked_user_id: blockedUserID,\n ...(user_id ? { user_id } : {}),\n });\n }\n\n async getBlockedUsers(user_id?: string) {\n return await this.get<GetBlockedUsersAPIResponse>(this.baseURL + '/users/block', {\n ...(user_id ? { user_id } : {}),\n });\n }\n async unBlockUser(blockedUserID: string, userID?: string) {\n return await this.post<APIResponse>(this.baseURL + '/users/unblock', {\n blocked_user_id: blockedUserID,\n ...(userID ? { user_id: userID } : {}),\n });\n }\n /** muteUser - mutes a user\n *\n * @param {string} targetID\n * @param {string} [userID] Only used with serverside auth\n * @param {MuteUserOptions<StreamChatGenerics>} [options]\n * @returns {Promise<MuteUserResponse<StreamChatGenerics>>}\n */\n async muteUser(targetID: string, userID?: string, options: MuteUserOptions<StreamChatGenerics> = {}) {\n return await this.post<MuteUserResponse<StreamChatGenerics>>(this.baseURL + '/moderation/mute', {\n target_id: targetID,\n ...(userID ? { user_id: userID } : {}),\n ...options,\n });\n }\n\n /** unmuteUser - unmutes a user\n *\n * @param {string} targetID\n * @param {string} [currentUserID] Only used with serverside auth\n * @returns {Promise<APIResponse>}\n */\n async unmuteUser(targetID: string, currentUserID?: string) {\n return await this.post<APIResponse>(this.baseURL + '/moderation/unmute', {\n target_id: targetID,\n ...(currentUserID ? { user_id: currentUserID } : {}),\n });\n }\n\n /** userMuteStatus - check if a user is muted or not, can be used after connectUser() is called\n *\n * @param {string} targetID\n * @returns {boolean}\n */\n userMuteStatus(targetID: string) {\n if (!this.user || !this.wsPromise) {\n throw new Error('Make sure to await connectUser() first.');\n }\n\n for (let i = 0; i < this.mutedUsers.length; i += 1) {\n if (this.mutedUsers[i].target.id === targetID) return true;\n }\n return false;\n }\n\n /**\n * flagMessage - flag a message\n * @param {string} targetMessageID\n * @param {string} [options.user_id] currentUserID, only used with serverside auth\n * @returns {Promise<APIResponse>}\n */\n async flagMessage(targetMessageID: string, options: { reason?: string; user_id?: string } = {}) {\n return await this.post<FlagMessageResponse<StreamChatGenerics>>(this.baseURL + '/moderation/flag', {\n target_message_id: targetMessageID,\n ...options,\n });\n }\n\n /**\n * flagUser - flag a user\n * @param {string} targetID\n * @param {string} [options.user_id] currentUserID, only used with serverside auth\n * @returns {Promise<APIResponse>}\n */\n async flagUser(targetID: string, options: { reason?: string; user_id?: string } = {}) {\n return await this.post<FlagUserResponse<StreamChatGenerics>>(this.baseURL + '/moderation/flag', {\n target_user_id: targetID,\n ...options,\n });\n }\n\n /**\n * unflagMessage - unflag a message\n * @param {string} targetMessageID\n * @param {string} [options.user_id] currentUserID, only used with serverside auth\n * @returns {Promise<APIResponse>}\n */\n async unflagMessage(targetMessageID: string, options: { user_id?: string } = {}) {\n return await this.post<FlagMessageResponse<StreamChatGenerics>>(this.baseURL + '/moderation/unflag', {\n target_message_id: targetMessageID,\n ...options,\n });\n }\n\n /**\n * unflagUser - unflag a user\n * @param {string} targetID\n * @param {string} [options.user_id] currentUserID, only used with serverside auth\n * @returns {Promise<APIResponse>}\n */\n async unflagUser(targetID: string, options: { user_id?: string } = {}) {\n return await this.post<FlagUserResponse<StreamChatGenerics>>(this.baseURL + '/moderation/unflag', {\n target_user_id: targetID,\n ...options,\n });\n }\n\n /**\n * getCallToken - retrieves the auth token needed to join a call\n *\n * @param {string} callID\n * @param {object} options\n * @returns {Promise<GetCallTokenResponse>}\n */\n async getCallToken(callID: string, options: { user_id?: string } = {}) {\n return await this.post<GetCallTokenResponse>(this.baseURL + `/calls/${encodeURIComponent(callID)}`, { ...options });\n }\n\n /**\n * _queryFlags - Query flags.\n *\n * Note: Do not use this.\n * It is present for internal usage only.\n * This function can, and will, break and/or be removed at any point in time.\n *\n * @private\n * @param {FlagsFilters} filterConditions MongoDB style filter conditions\n * @param {FlagsPaginationOptions} options Option object, {limit: 10, offset:0}\n *\n * @return {Promise<FlagsResponse<StreamChatGenerics>>} Flags Response\n */\n async _queryFlags(filterConditions: FlagsFilters = {}, options: FlagsPaginationOptions = {}) {\n // Return a list of flags\n return await this.post<FlagsResponse<StreamChatGenerics>>(this.baseURL + '/moderation/flags', {\n filter_conditions: filterConditions,\n ...options,\n });\n }\n\n /**\n * _queryFlagReports - Query flag reports.\n *\n * Note: Do not use this.\n * It is present for internal usage only.\n * This function can, and will, break and/or be removed at any point in time.\n *\n * @private\n * @param {FlagReportsFilters} filterConditions MongoDB style filter conditions\n * @param {FlagReportsPaginationOptions} options Option object, {limit: 10, offset:0}\n *\n * @return {Promise<FlagReportsResponse<StreamChatGenerics>>} Flag Reports Response\n */\n async _queryFlagReports(filterConditions: FlagReportsFilters = {}, options: FlagReportsPaginationOptions = {}) {\n // Return a list of message flags\n return await this.post<FlagReportsResponse<StreamChatGenerics>>(this.baseURL + '/moderation/reports', {\n filter_conditions: filterConditions,\n ...options,\n });\n }\n\n /**\n * _reviewFlagReport - review flag report\n *\n * Note: Do not use this.\n * It is present for internal usage only.\n * This function can, and will, break and/or be removed at any point in time.\n *\n * @private\n * @param {string} [id] flag report to review\n * @param {string} [reviewResult] flag report review result\n * @param {string} [options.user_id] currentUserID, only used with serverside auth\n * @param {string} [options.review_details] custom information about review result\n * @returns {Promise<ReviewFlagReportResponse>>}\n */\n async _reviewFlagReport(id: string, reviewResult: string, options: ReviewFlagReportOptions = {}) {\n return await this.patch<ReviewFlagReportResponse<StreamChatGenerics>>(\n this.baseURL + `/moderation/reports/${encodeURIComponent(id)}`,\n {\n review_result: reviewResult,\n ...options,\n },\n );\n }\n\n /**\n * unblockMessage - unblocks message blocked by automod\n *\n *\n * @param {string} targetMessageID\n * @param {string} [options.user_id] currentUserID, only used with serverside auth\n * @returns {Promise<APIResponse>}\n */\n async unblockMessage(targetMessageID: string, options: { user_id?: string } = {}) {\n return await this.post<APIResponse>(this.baseURL + '/moderation/unblock_message', {\n target_message_id: targetMessageID,\n ...options,\n });\n }\n // alias for backwards compatibility\n _unblockMessage = this.unblockMessage;\n\n /**\n * @deprecated use markChannelsRead instead\n *\n * markAllRead - marks all channels for this user as read\n * @param {MarkAllReadOptions<StreamChatGenerics>} [data]\n *\n * @return {Promise<APIResponse>}\n */\n markAllRead = this.markChannelsRead;\n\n /**\n * markChannelsRead - marks channels read -\n * it accepts a map of cid:messageid pairs, if messageid is empty, the whole channel will be marked as read\n *\n * @param {MarkChannelsReadOptions <StreamChatGenerics>} [data]\n *\n * @return {Promise<APIResponse>}\n */\n async markChannelsRead(data: MarkChannelsReadOptions<StreamChatGenerics> = {}) {\n await this.post<APIResponse>(this.baseURL + '/channels/read', { ...data });\n }\n\n createCommand(data: CreateCommandOptions<StreamChatGenerics>) {\n return this.post<CreateCommandResponse<StreamChatGenerics>>(this.baseURL + '/commands', data);\n }\n\n getCommand(name: string) {\n return this.get<GetCommandResponse<StreamChatGenerics>>(this.baseURL + `/commands/${encodeURIComponent(name)}`);\n }\n\n updateCommand(name: string, data: UpdateCommandOptions<StreamChatGenerics>) {\n return this.put<UpdateCommandResponse<StreamChatGenerics>>(\n this.baseURL + `/commands/${encodeURIComponent(name)}`,\n data,\n );\n }\n\n deleteCommand(name: string) {\n return this.delete<DeleteCommandResponse<StreamChatGenerics>>(\n this.baseURL + `/commands/${encodeURIComponent(name)}`,\n );\n }\n\n listCommands() {\n return this.get<ListCommandsResponse<StreamChatGenerics>>(this.baseURL + `/commands`);\n }\n\n createChannelType(data: CreateChannelOptions<StreamChatGenerics>) {\n const channelData = Object.assign({}, { commands: ['all'] }, data);\n return this.post<CreateChannelResponse<StreamChatGenerics>>(this.baseURL + '/channeltypes', channelData);\n }\n\n getChannelType(channelType: string) {\n return this.get<GetChannelTypeResponse<StreamChatGenerics>>(\n this.baseURL + `/channeltypes/${encodeURIComponent(channelType)}`,\n );\n }\n\n updateChannelType(channelType: string, data: UpdateChannelOptions<StreamChatGenerics>) {\n return this.put<UpdateChannelResponse<StreamChatGenerics>>(\n this.baseURL + `/channeltypes/${encodeURIComponent(channelType)}`,\n data,\n );\n }\n\n deleteChannelType(channelType: string) {\n return this.delete<APIResponse>(this.baseURL + `/channeltypes/${encodeURIComponent(channelType)}`);\n }\n\n listChannelTypes() {\n return this.get<ListChannelResponse<StreamChatGenerics>>(this.baseURL + `/channeltypes`);\n }\n\n /**\n * translateMessage - adds the translation to the message\n *\n * @param {string} messageId\n * @param {string} language\n *\n * @return {MessageResponse<StreamChatGenerics>} Response that includes the message\n */\n async translateMessage(messageId: string, language: string) {\n return await this.post<APIResponse & MessageResponse<StreamChatGenerics>>(\n this.baseURL + `/messages/${encodeURIComponent(messageId)}/translate`,\n { language },\n );\n }\n\n /**\n * translate - translates the given text to provided language\n *\n * @param {string} text\n * @param {string} destination_language\n * @param {string} source_language\n *\n * @return {TranslateResponse} Response that includes the message\n */\n async translate(text: string, destination_language: string, source_language: string) {\n return await this.post<APIResponse & TranslateResponse>(this.baseURL + `/translate`, {\n text,\n source_language,\n destination_language,\n });\n }\n\n /**\n * _normalizeExpiration - transforms expiration value into ISO string\n * @param {undefined|null|number|string|Date} timeoutOrExpirationDate expiration date or timeout. Use number type to set timeout in seconds, string or Date to set exact expiration date\n */\n _normalizeExpiration(timeoutOrExpirationDate?: null | number | string | Date) {\n let pinExpires: null | string = null;\n if (typeof timeoutOrExpirationDate === 'number') {\n const now = new Date();\n now.setSeconds(now.getSeconds() + timeoutOrExpirationDate);\n pinExpires = now.toISOString();\n } else if (isString(timeoutOrExpirationDate)) {\n pinExpires = timeoutOrExpirationDate;\n } else if (timeoutOrExpirationDate instanceof Date) {\n pinExpires = timeoutOrExpirationDate.toISOString();\n }\n return pinExpires;\n }\n\n /**\n * _messageId - extracts string message id from either message object or message id\n * @param {string | { id: string }} messageOrMessageId message object or message id\n * @param {string} errorText error message to report in case of message id absence\n */\n _validateAndGetMessageId(messageOrMessageId: string | { id: string }, errorText: string) {\n let messageId: string;\n if (typeof messageOrMessageId === 'string') {\n messageId = messageOrMessageId;\n } else {\n if (!messageOrMessageId.id) {\n throw Error(errorText);\n }\n messageId = messageOrMessageId.id;\n }\n return messageId;\n }\n\n /**\n * pinMessage - pins the message\n * @param {string | { id: string }} messageOrMessageId message object or message id\n * @param {undefined|null|number|string|Date} timeoutOrExpirationDate expiration date or timeout. Use number type to set timeout in seconds, string or Date to set exact expiration date\n * @param {undefined|string | { id: string }} [pinnedBy] who will appear as a user who pinned a message. Only for server-side use. Provide `undefined` when pinning message client-side\n * @param {undefined|number|string|Date} pinnedAt date when message should be pinned. It affects the order of pinned messages. Use negative number to set relative time in the past, string or Date to set exact date of pin\n */\n pinMessage(\n messageOrMessageId: string | { id: string },\n timeoutOrExpirationDate?: null | number | string | Date,\n pinnedBy?: string | { id: string },\n pinnedAt?: number | string | Date,\n ) {\n const messageId = this._validateAndGetMessageId(\n messageOrMessageId,\n 'Please specify the message id when calling unpinMessage',\n );\n return this.partialUpdateMessage(\n messageId,\n ({\n set: {\n pinned: true,\n pin_expires: this._normalizeExpiration(timeoutOrExpirationDate),\n pinned_at: this._normalizeExpiration(pinnedAt),\n },\n } as unknown) as PartialMessageUpdate<StreamChatGenerics>,\n pinnedBy,\n );\n }\n\n /**\n * unpinMessage - unpins the message that was previously pinned\n * @param {string | { id: string }} messageOrMessageId message object or message id\n * @param {string | { id: string }} [userId]\n */\n unpinMessage(messageOrMessageId: string | { id: string }, userId?: string | { id: string }) {\n const messageId = this._validateAndGetMessageId(\n messageOrMessageId,\n 'Please specify the message id when calling unpinMessage',\n );\n return this.partialUpdateMessage(\n messageId,\n ({\n set: { pinned: false },\n } as unknown) as PartialMessageUpdate<StreamChatGenerics>,\n userId,\n );\n }\n\n /**\n * updateMessage - Update the given message\n *\n * @param {Omit<MessageResponse<StreamChatGenerics>, 'mentioned_users'> & { mentioned_users?: string[] }} message object, id needs to be specified\n * @param {string | { id: string }} [userId]\n * @param {boolean} [options.skip_enrich_url] Do not try to enrich the URLs within message\n *\n * @return {{ message: MessageResponse<StreamChatGenerics> }} Response that includes the message\n */\n async updateMessage(\n message: UpdatedMessage<StreamChatGenerics>,\n userId?: string | { id: string },\n options?: UpdateMessageOptions,\n ) {\n if (!message.id) {\n throw Error('Please specify the message id when calling updateMessage');\n }\n\n const clonedMessage: Message = Object.assign({}, message);\n delete clonedMessage.id;\n\n const reservedMessageFields: Array<ReservedMessageFields> = [\n 'command',\n 'created_at',\n 'html',\n 'latest_reactions',\n 'own_reactions',\n 'quoted_message',\n 'reaction_counts',\n 'reply_count',\n 'type',\n 'updated_at',\n 'user',\n '__html',\n ];\n\n reservedMessageFields.forEach(function (item) {\n if (clonedMessage[item] != null) {\n delete clonedMessage[item];\n }\n });\n\n if (userId != null) {\n if (isString(userId)) {\n clonedMessage.user_id = userId;\n } else {\n clonedMessage.user = {\n id: userId.id,\n } as UserResponse<StreamChatGenerics>;\n }\n }\n\n /**\n * Server always expects mentioned_users to be array of string. We are adding extra check, just in case\n * SDK missed this conversion.\n */\n if (Array.isArray(clonedMessage.mentioned_users) && !isString(clonedMessage.mentioned_users[0])) {\n clonedMessage.mentioned_users = clonedMessage.mentioned_users.map((mu) => ((mu as unknown) as UserResponse).id);\n }\n\n return await this.post<UpdateMessageAPIResponse<StreamChatGenerics>>(\n this.baseURL + `/messages/${encodeURIComponent(message.id as string)}`,\n {\n message: clonedMessage,\n ...options,\n },\n );\n }\n\n /**\n * partialUpdateMessage - Update the given message id while retaining additional properties\n *\n * @param {string} id the message id\n *\n * @param {PartialUpdateMessage<StreamChatGenerics>} partialMessageObject which should contain id and any of \"set\" or \"unset\" params;\n * example: {id: \"user1\", set:{text: \"hi\"}, unset:[\"color\"]}\n * @param {string | { id: string }} [userId]\n *\n * @param {boolean} [options.skip_enrich_url] Do not try to enrich the URLs within message\n *\n * @return {{ message: MessageResponse<StreamChatGenerics> }} Response that includes the updated message\n */\n async partialUpdateMessage(\n id: string,\n partialMessageObject: PartialMessageUpdate<StreamChatGenerics>,\n userId?: string | { id: string },\n options?: UpdateMessageOptions,\n ) {\n if (!id) {\n throw Error('Please specify the message id when calling partialUpdateMessage');\n }\n let user = userId;\n if (userId != null && isString(userId)) {\n user = { id: userId };\n }\n return await this.put<UpdateMessageAPIResponse<StreamChatGenerics>>(\n this.baseURL + `/messages/${encodeURIComponent(id)}`,\n {\n ...partialMessageObject,\n ...options,\n user,\n },\n );\n }\n\n async deleteMessage(messageID: string, hardDelete?: boolean) {\n let params = {};\n if (hardDelete) {\n params = { hard: true };\n }\n return await this.delete<APIResponse & { message: MessageResponse<StreamChatGenerics> }>(\n this.baseURL + `/messages/${encodeURIComponent(messageID)}`,\n params,\n );\n }\n\n /**\n * undeleteMessage - Undelete a message\n *\n * undeletes a message that was previous soft deleted. Hard deleted messages\n * cannot be undeleted. This is only allowed to be called from server-side\n * clients.\n *\n * @param {string} messageID The id of the message to undelete\n * @param {string} userID The id of the user who undeleted the message\n *\n * @return {{ message: MessageResponse<StreamChatGenerics> }} Response that includes the message\n */\n async undeleteMessage(messageID: string, userID: string) {\n return await this.post<APIResponse & { message: MessageResponse<StreamChatGenerics> }>(\n this.baseURL + `/messages/${encodeURIComponent(messageID)}/undelete`,\n { undeleted_by: userID },\n );\n }\n\n async getMessage(messageID: string, options?: GetMessageOptions) {\n return await this.get<GetMessageAPIResponse<StreamChatGenerics>>(\n this.baseURL + `/messages/${encodeURIComponent(messageID)}`,\n { ...options },\n );\n }\n\n /**\n * queryThreads - returns the list of threads of current user.\n *\n * @param {QueryThreadsOptions} options Options object for pagination and limiting the participants and replies.\n * @param {number} options.limit Limits the number of threads to be returned.\n * @param {boolean} options.watch Subscribes the user to the channels of the threads.\n * @param {number} options.participant_limit Limits the number of participants returned per threads.\n * @param {number} options.reply_limit Limits the number of replies returned per threads.\n *\n * @returns {{ threads: Thread<StreamChatGenerics>[], next: string }} Returns the list of threads and the next cursor.\n */\n async queryThreads(options: QueryThreadsOptions = {}) {\n const optionsWithDefaults = {\n limit: 10,\n participant_limit: 10,\n reply_limit: 3,\n watch: true,\n ...options,\n };\n\n const response = await this.post<QueryThreadsAPIResponse<StreamChatGenerics>>(\n `${this.baseURL}/threads`,\n optionsWithDefaults,\n );\n\n return {\n threads: response.threads.map(\n (thread) => new Thread<StreamChatGenerics>({ client: this, threadData: thread }),\n ),\n next: response.next,\n };\n }\n\n /**\n * getThread - returns the thread of a message by its id.\n *\n * @param {string} messageId The message id\n * @param {GetThreadOptions} options Options object for pagination and limiting the participants and replies.\n * @param {boolean} options.watch Subscribes the user to the channel of the thread.\n * @param {number} options.participant_limit Limits the number of participants returned per threads.\n * @param {number} options.reply_limit Limits the number of replies returned per threads.\n *\n * @returns {Thread<StreamChatGenerics>} Returns the thread.\n */\n async getThread(messageId: string, options: GetThreadOptions = {}) {\n if (!messageId) {\n throw Error('Please specify the messageId when calling getThread');\n }\n\n const optionsWithDefaults = {\n participant_limit: 100,\n reply_limit: 3,\n watch: true,\n ...options,\n };\n\n const response = await this.get<GetThreadAPIResponse<StreamChatGenerics>>(\n `${this.baseURL}/threads/${encodeURIComponent(messageId)}`,\n optionsWithDefaults,\n );\n\n return new Thread<StreamChatGenerics>({ client: this, threadData: response.thread });\n }\n\n /**\n * partialUpdateThread - updates the given thread\n *\n * @param {string} messageId The id of the thread message which needs to be updated.\n * @param {PartialThreadUpdate} partialThreadObject should contain \"set\" or \"unset\" params for any of the thread's non-reserved fields.\n *\n * @returns {GetThreadAPIResponse<StreamChatGenerics>} Returns the updated thread.\n */\n async partialUpdateThread(messageId: string, partialThreadObject: PartialThreadUpdate) {\n if (!messageId) {\n throw Error('Please specify the message id when calling partialUpdateThread');\n }\n\n // check for reserved fields from ThreadResponse type within partialThreadObject's set and unset.\n // Throw error if any of the reserved field is found.\n const reservedThreadFields = [\n 'created_at',\n 'id',\n 'last_message_at',\n 'type',\n 'updated_at',\n 'user',\n 'reply_count',\n 'participants',\n 'channel',\n 'custom',\n ];\n\n for (const key in { ...partialThreadObject.set, ...partialThreadObject.unset }) {\n if (reservedThreadFields.includes(key)) {\n throw Error(\n `You cannot set ${key} field on Thread object. ${key} is reserved for server-side use. Please omit ${key} from your set object.`,\n );\n }\n }\n\n return await this.patch<GetThreadAPIResponse<StreamChatGenerics>>(\n `${this.baseURL}/threads/${encodeURIComponent(messageId)}`,\n partialThreadObject,\n );\n }\n\n getUserAgent() {\n return (\n this.userAgent || `stream-chat-javascript-client-${this.node ? 'node' : 'browser'}-${process.env.PKG_VERSION}`\n );\n }\n\n setUserAgent(userAgent: string) {\n this.userAgent = userAgent;\n }\n\n /**\n * _isUsingServerAuth - Returns true if we're using server side auth\n */\n _isUsingServerAuth = () => !!this.secret;\n\n _cacheEnabled = () => !this._isUsingServerAuth() || !this.options.disableCache;\n\n _enrichAxiosOptions(\n options: AxiosRequestConfig & { config?: AxiosRequestConfig } = {\n params: {},\n headers: {},\n config: {},\n },\n ): AxiosRequestConfig {\n const token = this._getToken();\n const authorization = token ? { Authorization: token } : undefined;\n let signal: AbortSignal | null = null;\n if (this.nextRequestAbortController !== null) {\n signal = this.nextRequestAbortController.signal;\n this.nextRequestAbortController = null;\n }\n\n if (!options.headers?.['x-client-request-id']) {\n options.headers = {\n ...options.headers,\n 'x-client-request-id': randomId(),\n };\n }\n\n const { params: axiosRequestConfigParams, headers: axiosRequestConfigHeaders, ...axiosRequestConfigRest } =\n this.options.axiosRequestConfig || {};\n\n return {\n params: {\n user_id: this.userID,\n connection_id: this._getConnectionID(),\n api_key: this.key,\n ...options.params,\n ...(axiosRequestConfigParams || {}),\n },\n headers: {\n ...authorization,\n 'stream-auth-type': this.getAuthType(),\n 'X-Stream-Client': this.getUserAgent(),\n ...options.headers,\n ...(axiosRequestConfigHeaders || {}),\n },\n ...(signal ? { signal } : {}),\n ...options.config,\n ...(axiosRequestConfigRest || {}),\n };\n }\n\n _getToken() {\n if (!this.tokenManager || this.anonymous) return null;\n\n return this.tokenManager.getToken();\n }\n\n _startCleaning() {\n const that = this;\n if (this.cleaningIntervalRef != null) {\n return;\n }\n this.cleaningIntervalRef = setInterval(() => {\n // call clean on the channel, used for calling the stop.typing event etc.\n for (const channel of Object.values(that.activeChannels)) {\n channel.clean();\n }\n }, 500);\n }\n\n /**\n * encode ws url payload\n * @private\n * @returns json string\n */\n _buildWSPayload = (client_request_id?: string) => {\n return JSON.stringify({\n user_id: this.userID,\n user_details: this._user,\n device: this.options.device,\n client_request_id,\n });\n };\n\n /**\n * checks signature of a request\n * @param {string | Buffer} rawBody\n * @param {string} signature from HTTP header\n * @returns {boolean}\n */\n verifyWebhook(requestBody: string | Buffer, xSignature: string) {\n return !!this.secret && CheckSignature(requestBody, this.secret, xSignature);\n }\n\n /** getPermission - gets the definition for a permission\n *\n * @param {string} name\n * @returns {Promise<PermissionAPIResponse>}\n */\n getPermission(name: string) {\n return this.get<PermissionAPIResponse>(`${this.baseURL}/permissions/${encodeURIComponent(name)}`);\n }\n\n /** createPermission - creates a custom permission\n *\n * @param {CustomPermissionOptions} permissionData the permission data\n * @returns {Promise<APIResponse>}\n */\n createPermission(permissionData: CustomPermissionOptions) {\n return this.post<APIResponse>(`${this.baseURL}/permissions`, {\n ...permissionData,\n });\n }\n\n /** updatePermission - updates an existing custom permission\n *\n * @param {string} id\n * @param {Omit<CustomPermissionOptions, 'id'>} permissionData the permission data\n * @returns {Promise<APIResponse>}\n */\n updatePermission(id: string, permissionData: Omit<CustomPermissionOptions, 'id'>) {\n return this.put<APIResponse>(`${this.baseURL}/permissions/${encodeURIComponent(id)}`, {\n ...permissionData,\n });\n }\n\n /** deletePermission - deletes a custom permission\n *\n * @param {string} name\n * @returns {Promise<APIResponse>}\n */\n deletePermission(name: string) {\n return this.delete<APIResponse>(`${this.baseURL}/permissions/${encodeURIComponent(name)}`);\n }\n\n /** listPermissions - returns the list of all permissions for this application\n *\n * @returns {Promise<APIResponse>}\n */\n listPermissions() {\n return this.get<PermissionsAPIResponse>(`${this.baseURL}/permissions`);\n }\n\n /** createRole - creates a custom role\n *\n * @param {string} name the new role name\n * @returns {Promise<APIResponse>}\n */\n createRole(name: string) {\n return this.post<APIResponse>(`${this.baseURL}/roles`, { name });\n }\n\n /** listRoles - returns the list of all roles for this application\n *\n * @returns {Promise<APIResponse>}\n */\n listRoles() {\n return this.get<APIResponse>(`${this.baseURL}/roles`);\n }\n\n /** deleteRole - deletes a custom role\n *\n * @param {string} name the role name\n * @returns {Promise<APIResponse>}\n */\n deleteRole(name: string) {\n return this.delete<APIResponse>(`${this.baseURL}/roles/${encodeURIComponent(name)}`);\n }\n\n /** sync - returns all events that happened for a list of channels since last sync\n * @param {string[]} channel_cids list of channel CIDs\n * @param {string} last_sync_at last time the user was online and in sync. RFC3339 ie. \"2020-05-06T15:05:01.207Z\"\n * @param {SyncOptions} options See JSDoc in the type fields for more info\n *\n * @returns {Promise<SyncResponse>}\n */\n sync(channel_cids: string[], last_sync_at: string, options: SyncOptions = {}) {\n return this.post<SyncResponse>(`${this.baseURL}/sync`, {\n channel_cids,\n last_sync_at,\n ...options,\n });\n }\n\n /**\n * sendUserCustomEvent - Send a custom event to a user\n *\n * @param {string} targetUserID target user id\n * @param {UserCustomEvent} event for example {type: 'friendship-request'}\n *\n * @return {Promise<APIResponse>} The Server Response\n */\n async sendUserCustomEvent(targetUserID: string, event: UserCustomEvent) {\n return await this.post<APIResponse>(`${this.baseURL}/users/${encodeURIComponent(targetUserID)}/event`, {\n event,\n });\n }\n\n createBlockList(blockList: BlockList) {\n return this.post<APIResponse>(`${this.baseURL}/blocklists`, blockList);\n }\n\n listBlockLists() {\n return this.get<APIResponse & { blocklists: BlockListResponse[] }>(`${this.baseURL}/blocklists`);\n }\n\n getBlockList(name: string) {\n return this.get<APIResponse & { blocklist: BlockListResponse }>(\n `${this.baseURL}/blocklists/${encodeURIComponent(name)}`,\n );\n }\n\n updateBlockList(name: string, data: { words: string[] }) {\n return this.put<APIResponse>(`${this.baseURL}/blocklists/${encodeURIComponent(name)}`, data);\n }\n\n deleteBlockList(name: string) {\n return this.delete<APIResponse>(`${this.baseURL}/blocklists/${encodeURIComponent(name)}`);\n }\n\n exportChannels(request: Array<ExportChannelRequest>, options: ExportChannelOptions = {}) {\n const payload = { channels: request, ...options };\n return this.post<APIResponse & ExportChannelResponse>(`${this.baseURL}/export_channels`, payload);\n }\n\n exportUsers(request: ExportUsersRequest) {\n return this.post<APIResponse & ExportUsersResponse>(`${this.baseURL}/export/users`, request);\n }\n\n exportChannel(request: ExportChannelRequest, options?: ExportChannelOptions) {\n return this.exportChannels([request], options);\n }\n\n getExportChannelStatus(id: string) {\n return this.get<APIResponse & ExportChannelStatusResponse>(\n `${this.baseURL}/export_channels/${encodeURIComponent(id)}`,\n );\n }\n\n campaign(idOrData: string | CampaignData, data?: CampaignData) {\n if (idOrData && typeof idOrData === 'object') {\n return new Campaign(this, null, idOrData);\n }\n\n return new Campaign(this, idOrData, data);\n }\n\n segment(type: SegmentType, idOrData: string | SegmentData, data?: SegmentData) {\n if (typeof idOrData === 'string') {\n return new Segment(this, type, idOrData, data);\n }\n\n return new Segment(this, type, null, idOrData);\n }\n\n validateServerSideAuth() {\n if (!this.secret) {\n throw new Error(\n 'Campaigns is a server-side only feature. Please initialize the client with a secret to use this feature.',\n );\n }\n }\n\n /**\n * createSegment - Creates a segment\n *\n * @private\n * @param {SegmentType} type Segment type\n * @param {string} id Segment ID\n * @param {string} name Segment name\n * @param {SegmentData} params Segment data\n *\n * @return {{segment: SegmentResponse} & APIResponse} The created Segment\n */\n async createSegment(type: SegmentType, id: string | null, data?: SegmentData) {\n this.validateServerSideAuth();\n const body = {\n id,\n type,\n ...data,\n };\n return this.post<{ segment: SegmentResponse }>(this.baseURL + `/segments`, body);\n }\n\n /**\n * createUserSegment - Creates a user segment\n *\n * @param {string} id Segment ID\n * @param {string} name Segment name\n * @param {SegmentData} data Segment data\n *\n * @return {Segment} The created Segment\n */\n async createUserSegment(id: string | null, data?: SegmentData) {\n this.validateServerSideAuth();\n return this.createSegment('user', id, data);\n }\n\n /**\n * createChannelSegment - Creates a channel segment\n *\n * @param {string} id Segment ID\n * @param {string} name Segment name\n * @param {SegmentData} data Segment data\n *\n * @return {Segment} The created Segment\n */\n async createChannelSegment(id: string | null, data?: SegmentData) {\n this.validateServerSideAuth();\n return this.createSegment('channel', id, data);\n }\n\n async getSegment(id: string) {\n this.validateServerSideAuth();\n return this.get<{ segment: SegmentResponse } & APIResponse>(this.baseURL + `/segments/${encodeURIComponent(id)}`);\n }\n\n /**\n * updateSegment - Update a segment\n *\n * @param {string} id Segment ID\n * @param {Partial<UpdateSegmentData>} data Data to update\n *\n * @return {Segment} Updated Segment\n */\n async updateSegment(id: string, data: Partial<UpdateSegmentData>) {\n this.validateServerSideAuth();\n return this.put<{ segment: SegmentResponse }>(this.baseURL + `/segments/${encodeURIComponent(id)}`, data);\n }\n\n /**\n * addSegmentTargets - Add targets to a segment\n *\n * @param {string} id Segment ID\n * @param {string[]} targets Targets to add to the segment\n *\n * @return {APIResponse} API response\n */\n async addSegmentTargets(id: string, targets: string[]) {\n this.validateServerSideAuth();\n const body = { target_ids: targets };\n return this.post<APIResponse>(this.baseURL + `/segments/${encodeURIComponent(id)}/addtargets`, body);\n }\n\n async querySegmentTargets(\n id: string,\n filter: QuerySegmentTargetsFilter | null = {},\n sort: SortParam[] | null | [] = [],\n options = {},\n ) {\n this.validateServerSideAuth();\n return this.post<{ targets: SegmentTargetsResponse[]; next?: string } & APIResponse>(\n this.baseURL + `/segments/${encodeURIComponent(id)}/targets/query`,\n {\n filter: filter || {},\n sort: sort || [],\n ...options,\n },\n );\n }\n /**\n * removeSegmentTargets - Remove targets from a segment\n *\n * @param {string} id Segment ID\n * @param {string[]} targets Targets to add to the segment\n *\n * @return {APIResponse} API response\n */\n async removeSegmentTargets(id: string, targets: string[]) {\n this.validateServerSideAuth();\n const body = { target_ids: targets };\n return this.post<APIResponse>(this.baseURL + `/segments/${encodeURIComponent(id)}/deletetargets`, body);\n }\n\n /**\n * querySegments - Query Segments\n *\n * @param {filter} filter MongoDB style filter conditions\n * @param {QuerySegmentsOptions} options Options for sorting/paginating the results\n *\n * @return {Segment[]} Segments\n */\n async querySegments(filter: {}, sort?: SortParam[], options: QuerySegmentsOptions = {}) {\n this.validateServerSideAuth();\n return this.post<\n {\n segments: SegmentResponse[];\n next?: string;\n prev?: string;\n } & APIResponse\n >(this.baseURL + `/segments/query`, {\n filter,\n sort,\n ...options,\n });\n }\n\n /**\n * deleteSegment - Delete a Campaign Segment\n *\n * @param {string} id Segment ID\n *\n * @return {Promise<APIResponse>} The Server Response\n */\n async deleteSegment(id: string) {\n this.validateServerSideAuth();\n return this.delete<APIResponse>(this.baseURL + `/segments/${encodeURIComponent(id)}`);\n }\n\n /**\n * segmentTargetExists - Check if a target exists in a segment\n *\n * @param {string} segmentId Segment ID\n * @param {string} targetId Target ID\n *\n * @return {Promise<APIResponse>} The Server Response\n */\n async segmentTargetExists(segmentId: string, targetId: string) {\n this.validateServerSideAuth();\n return this.get<APIResponse>(\n this.baseURL + `/segments/${encodeURIComponent(segmentId)}/target/${encodeURIComponent(targetId)}`,\n );\n }\n\n /**\n * createCampaign - Creates a Campaign\n *\n * @param {CampaignData} params Campaign data\n *\n * @return {Campaign} The Created Campaign\n */\n async createCampaign(params: CampaignData) {\n this.validateServerSideAuth();\n return this.post<{ campaign: CampaignResponse } & APIResponse>(this.baseURL + `/campaigns`, { ...params });\n }\n\n async getCampaign(id: string) {\n this.validateServerSideAuth();\n return this.get<{ campaign: CampaignResponse } & APIResponse>(\n this.baseURL + `/campaigns/${encodeURIComponent(id)}`,\n );\n }\n\n async startCampaign(id: string, options?: { scheduledFor?: string; stopAt?: string }) {\n this.validateServerSideAuth();\n return this.post<{ campaign: CampaignResponse } & APIResponse>(\n this.baseURL + `/campaigns/${encodeURIComponent(id)}/start`,\n {\n scheduled_for: options?.scheduledFor,\n stop_at: options?.stopAt,\n },\n );\n }\n /**\n * queryCampaigns - Query Campaigns\n *\n *\n * @return {Campaign[]} Campaigns\n */\n async queryCampaigns(filter: CampaignFilters, sort?: CampaignSort, options?: CampaignQueryOptions) {\n this.validateServerSideAuth();\n return await this.post<\n {\n campaigns: CampaignResponse[];\n next?: string;\n prev?: string;\n } & APIResponse\n >(this.baseURL + `/campaigns/query`, {\n filter,\n sort,\n ...(options || {}),\n });\n }\n\n /**\n * updateCampaign - Update a Campaign\n *\n * @param {string} id Campaign ID\n * @param {Partial<CampaignData>} params Campaign data\n *\n * @return {Campaign} Updated Campaign\n */\n async updateCampaign(id: string, params: Partial<CampaignData>) {\n this.validateServerSideAuth();\n return this.put<{ campaign: CampaignResponse }>(this.baseURL + `/campaigns/${encodeURIComponent(id)}`, params);\n }\n\n /**\n * deleteCampaign - Delete a Campaign\n *\n * @param {string} id Campaign ID\n *\n * @return {Promise<APIResponse>} The Server Response\n */\n async deleteCampaign(id: string) {\n this.validateServerSideAuth();\n return this.delete<APIResponse>(this.baseURL + `/campaigns/${encodeURIComponent(id)}`);\n }\n\n /**\n * stopCampaign - Stop a Campaign\n *\n * @param {string} id Campaign ID\n *\n * @return {Campaign} Stopped Campaign\n */\n async stopCampaign(id: string) {\n this.validateServerSideAuth();\n return this.post<{ campaign: CampaignResponse }>(this.baseURL + `/campaigns/${encodeURIComponent(id)}/stop`);\n }\n\n /**\n * enrichURL - Get OpenGraph data of the given link\n *\n * @param {string} url link\n * @return {OGAttachment} OG Attachment\n */\n async enrichURL(url: string) {\n return this.get<APIResponse & OGAttachment>(this.baseURL + `/og`, { url });\n }\n\n /**\n * getTask - Gets status of a long running task\n *\n * @param {string} id Task ID\n *\n * @return {TaskStatus} The task status\n */\n async getTask(id: string) {\n return this.get<APIResponse & TaskStatus>(`${this.baseURL}/tasks/${encodeURIComponent(id)}`);\n }\n\n /**\n * deleteChannels - Deletes a list of channel\n *\n * @param {string[]} cids Channel CIDs\n * @param {boolean} [options.hard_delete] Defines if the channel is hard deleted or not\n *\n * @return {DeleteChannelsResponse} Result of the soft deletion, if server-side, it holds the task ID as well\n */\n async deleteChannels(cids: string[], options: { hard_delete?: boolean } = {}) {\n return await this.post<APIResponse & DeleteChannelsResponse>(this.baseURL + `/channels/delete`, {\n cids,\n ...options,\n });\n }\n\n /**\n * deleteUsers - Batch Delete Users\n *\n * @param {string[]} user_ids which users to delete\n * @param {DeleteUserOptions} options Configuration how to delete users\n *\n * @return {TaskResponse} A task ID\n */\n async deleteUsers(user_ids: string[], options: DeleteUserOptions = {}) {\n if (typeof options.user !== 'undefined' && !['soft', 'hard', 'pruning'].includes(options.user)) {\n throw new Error('Invalid delete user options. user must be one of [soft hard pruning]');\n }\n if (typeof options.conversations !== 'undefined' && !['soft', 'hard'].includes(options.conversations)) {\n throw new Error('Invalid delete user options. conversations must be one of [soft hard]');\n }\n if (typeof options.messages !== 'undefined' && !['soft', 'hard', 'pruning'].includes(options.messages)) {\n throw new Error('Invalid delete user options. messages must be one of [soft hard pruning]');\n }\n return await this.post<APIResponse & TaskResponse>(this.baseURL + `/users/delete`, {\n user_ids,\n ...options,\n });\n }\n\n /**\n * _createImportURL - Create an Import upload url.\n *\n * Note: Do not use this.\n * It is present for internal usage only.\n * This function can, and will, break and/or be removed at any point in time.\n *\n * @private\n * @param {string} filename filename of uploaded data\n * @return {APIResponse & CreateImportResponse} An ImportTask\n */\n async _createImportURL(filename: string) {\n return await this.post<APIResponse & CreateImportURLResponse>(this.baseURL + `/import_urls`, {\n filename,\n });\n }\n\n /**\n * _createImport - Create an Import Task.\n *\n * Note: Do not use this.\n * It is present for internal usage only.\n * This function can, and will, break and/or be removed at any point in time.\n *\n * @private\n * @param {string} path path of uploaded data\n * @param {CreateImportOptions} options import options\n * @return {APIResponse & CreateImportResponse} An ImportTask\n */\n async _createImport(path: string, options: CreateImportOptions = { mode: 'upsert' }) {\n return await this.post<APIResponse & CreateImportResponse>(this.baseURL + `/imports`, {\n path,\n ...options,\n });\n }\n\n /**\n * _getImport - Get an Import Task.\n *\n * Note: Do not use this.\n * It is present for internal usage only.\n * This function can, and will, break and/or be removed at any point in time.\n *\n * @private\n * @param {string} id id of Import Task\n *\n * @return {APIResponse & GetImportResponse} An ImportTask\n */\n async _getImport(id: string) {\n return await this.get<APIResponse & GetImportResponse>(this.baseURL + `/imports/${encodeURIComponent(id)}`);\n }\n\n /**\n * _listImports - Lists Import Tasks.\n *\n * Note: Do not use this.\n * It is present for internal usage only.\n * This function can, and will, break and/or be removed at any point in time.\n *\n * @private\n * @param {ListImportsPaginationOptions} options pagination options\n *\n * @return {APIResponse & ListImportsResponse} An ImportTask\n */\n async _listImports(options: ListImportsPaginationOptions) {\n return await this.get<APIResponse & ListImportsResponse>(this.baseURL + `/imports`, options);\n }\n\n /**\n * upsertPushProvider - Create or Update a push provider\n *\n * Note: Works only for v2 push version is enabled on app settings.\n *\n * @param {PushProviderConfig} configuration of the provider you want to create or update\n *\n * @return {APIResponse & PushProviderUpsertResponse} A push provider\n */\n async upsertPushProvider(pushProvider: PushProviderConfig) {\n return await this.post<APIResponse & PushProviderUpsertResponse>(this.baseURL + `/push_providers`, {\n push_provider: pushProvider,\n });\n }\n\n /**\n * deletePushProvider - Delete a push provider\n *\n * Note: Works only for v2 push version is enabled on app settings.\n *\n * @param {PushProviderID} type and foreign id of the push provider to be deleted\n *\n * @return {APIResponse} An API response\n */\n async deletePushProvider({ type, name }: PushProviderID) {\n return await this.delete<APIResponse>(\n this.baseURL + `/push_providers/${encodeURIComponent(type)}/${encodeURIComponent(name)}`,\n );\n }\n\n /**\n * listPushProviders - Get all push providers in the app\n *\n * Note: Works only for v2 push version is enabled on app settings.\n *\n * @return {APIResponse & PushProviderListResponse} A push provider\n */\n async listPushProviders() {\n return await this.get<APIResponse & PushProviderListResponse>(this.baseURL + `/push_providers`);\n }\n\n /**\n * creates an abort controller that will be used by the next HTTP Request.\n */\n createAbortControllerForNextRequest() {\n return (this.nextRequestAbortController = new AbortController());\n }\n\n /**\n * commits a pending message, making it visible in the channel and for other users\n * @param id the message id\n *\n * @return {APIResponse & MessageResponse} The message\n */\n async commitMessage(id: string) {\n return await this.post<APIResponse & MessageResponse>(this.baseURL + `/messages/${encodeURIComponent(id)}/commit`);\n }\n\n /**\n * Creates a poll\n * @param poll PollData The poll that will be created\n * @param userId string The user id (only serverside)\n * @returns {APIResponse & CreatePollAPIResponse} The poll\n */\n async createPoll(poll: CreatePollData<StreamChatGenerics>, userId?: string) {\n return await this.post<APIResponse & CreatePollAPIResponse<StreamChatGenerics>>(this.baseURL + `/polls`, {\n ...poll,\n ...(userId ? { user_id: userId } : {}),\n });\n }\n\n /**\n * Retrieves a poll\n * @param id string The poll id\n * @param userId string The user id (only serverside)\n * @returns {APIResponse & GetPollAPIResponse} The poll\n */\n async getPoll(id: string, userId?: string): Promise<APIResponse & GetPollAPIResponse<StreamChatGenerics>> {\n return await this.get<APIResponse & GetPollAPIResponse<StreamChatGenerics>>(\n this.baseURL + `/polls/${encodeURIComponent(id)}`,\n userId ? { user_id: userId } : {},\n );\n }\n\n /**\n * Updates a poll\n * @param poll PollData The poll that will be updated\n * @param userId string The user id (only serverside)\n * @returns {APIResponse & PollResponse} The poll\n */\n async updatePoll(poll: PollData<StreamChatGenerics>, userId?: string) {\n return await this.put<APIResponse & UpdatePollAPIResponse<StreamChatGenerics>>(this.baseURL + `/polls`, {\n ...poll,\n ...(userId ? { user_id: userId } : {}),\n });\n }\n\n /**\n * Partially updates a poll\n * @param id string The poll id\n * @param {PartialPollUpdate<StreamChatGenerics>} partialPollObject which should contain id and any of \"set\" or \"unset\" params;\n * @param userId string The user id (only serverside)\n * example: {id: \"44f26af5-f2be-4fa7-9dac-71cf893781de\", set:{field: value}, unset:[\"field2\"]}\n * @returns {APIResponse & UpdatePollAPIResponse} The poll\n */\n async partialUpdatePoll(\n id: string,\n partialPollObject: PartialPollUpdate<StreamChatGenerics>,\n userId?: string,\n ): Promise<APIResponse & UpdatePollAPIResponse<StreamChatGenerics>> {\n return await this.patch<APIResponse & UpdatePollAPIResponse<StreamChatGenerics>>(\n this.baseURL + `/polls/${encodeURIComponent(id)}`,\n {\n ...partialPollObject,\n ...(userId ? { user_id: userId } : {}),\n },\n );\n }\n\n /**\n * Delete a poll\n * @param id string The poll id\n * @param userId string The user id (only serverside)\n * @returns\n */\n async deletePoll(id: string, userId?: string): Promise<APIResponse> {\n return await this.delete<APIResponse>(this.baseURL + `/polls/${encodeURIComponent(id)}`, {\n ...(userId ? { user_id: userId } : {}),\n });\n }\n\n /**\n * Close a poll\n * @param id string The poll id\n * @param userId string The user id (only serverside)\n * @returns {APIResponse & UpdatePollAPIResponse} The poll\n */\n async closePoll(id: string, userId?: string): Promise<APIResponse & UpdatePollAPIResponse<StreamChatGenerics>> {\n return this.partialUpdatePoll(\n id,\n {\n set: {\n is_closed: true,\n } as PartialPollUpdate<StreamChatGenerics>['set'],\n },\n userId,\n );\n }\n\n /**\n * Creates a poll option\n * @param pollId string The poll id\n * @param option PollOptionData The poll option that will be created\n * @param userId string The user id (only serverside)\n * @returns {APIResponse & PollOptionResponse} The poll option\n */\n async createPollOption(pollId: string, option: PollOptionData<StreamChatGenerics>, userId?: string) {\n return await this.post<APIResponse & CreatePollOptionAPIResponse<StreamChatGenerics>>(\n this.baseURL + `/polls/${encodeURIComponent(pollId)}/options`,\n {\n ...option,\n ...(userId ? { user_id: userId } : {}),\n },\n );\n }\n\n /**\n * Retrieves a poll option\n * @param pollId string The poll id\n * @param optionId string The poll option id\n * @param userId string The user id (only serverside)\n * @returns {APIResponse & PollOptionResponse} The poll option\n */\n async getPollOption(pollId: string, optionId: string, userId?: string) {\n return await this.get<APIResponse & GetPollOptionAPIResponse<StreamChatGenerics>>(\n this.baseURL + `/polls/${encodeURIComponent(pollId)}/options/${encodeURIComponent(optionId)}`,\n userId ? { user_id: userId } : {},\n );\n }\n\n /**\n * Updates a poll option\n * @param pollId string The poll id\n * @param option PollOptionData The poll option that will be updated\n * @param userId string The user id (only serverside)\n * @returns\n */\n async updatePollOption(pollId: string, option: PollOptionData<StreamChatGenerics>, userId?: string) {\n return await this.put<APIResponse & UpdatePollOptionAPIResponse<StreamChatGenerics>>(\n this.baseURL + `/polls/${encodeURIComponent(pollId)}/options`,\n {\n ...option,\n ...(userId ? { user_id: userId } : {}),\n },\n );\n }\n\n /**\n * Delete a poll option\n * @param pollId string The poll id\n * @param optionId string The poll option id\n * @param userId string The user id (only serverside)\n * @returns {APIResponse} The poll option\n */\n async deletePollOption(pollId: string, optionId: string, userId?: string) {\n return await this.delete<APIResponse>(\n this.baseURL + `/polls/${encodeURIComponent(pollId)}/options/${encodeURIComponent(optionId)}`,\n userId ? { user_id: userId } : {},\n );\n }\n\n /**\n * Cast vote on a poll\n * @param messageId string The message id\n * @param pollId string The poll id\n * @param vote PollVoteData The vote that will be casted\n * @param userId string The user id (only serverside)\n * @returns {APIResponse & CastVoteAPIResponse} The poll vote\n */\n async castPollVote(messageId: string, pollId: string, vote: PollVoteData, userId?: string) {\n return await this.post<APIResponse & CastVoteAPIResponse<StreamChatGenerics>>(\n this.baseURL + `/messages/${encodeURIComponent(messageId)}/polls/${encodeURIComponent(pollId)}/vote`,\n {\n vote,\n ...(userId ? { user_id: userId } : {}),\n },\n );\n }\n\n /**\n * Add a poll answer\n * @param messageId string The message id\n * @param pollId string The poll id\n * @param answerText string The answer text\n * @param userId string The user id (only serverside)\n */\n async addPollAnswer(messageId: string, pollId: string, answerText: string, userId?: string) {\n return this.castPollVote(\n messageId,\n pollId,\n {\n answer_text: answerText,\n },\n userId,\n );\n }\n\n async removePollVote(messageId: string, pollId: string, voteId: string, userId?: string) {\n return await this.delete<APIResponse & { vote: PollVote }>(\n this.baseURL +\n `/messages/${encodeURIComponent(messageId)}/polls/${encodeURIComponent(pollId)}/vote/${encodeURIComponent(\n voteId,\n )}`,\n {\n ...(userId ? { user_id: userId } : {}),\n },\n );\n }\n\n /**\n * Queries polls\n * @param filter\n * @param sort\n * @param options Option object, {limit: 10, offset:0}\n * @param userId string The user id (only serverside)\n * @returns {APIResponse & QueryPollsResponse} The polls\n */\n async queryPolls(\n filter: QueryPollsFilters = {},\n sort: PollSort = [],\n options: QueryPollsOptions = {},\n userId?: string,\n ): Promise<APIResponse & QueryPollsResponse<StreamChatGenerics>> {\n const q = userId ? `?user_id=${userId}` : '';\n return await this.post<APIResponse & QueryPollsResponse<StreamChatGenerics>>(this.baseURL + `/polls/query${q}`, {\n filter,\n sort: normalizeQuerySort(sort),\n ...options,\n });\n }\n\n /**\n * Queries poll votes\n * @param pollId\n * @param filter\n * @param sort\n * @param options Option object, {limit: 10, offset:0}\n * @param userId string The user id (only serverside)\n * @returns {APIResponse & PollVotesAPIResponse} The poll votes\n */\n async queryPollVotes(\n pollId: string,\n filter: QueryVotesFilters = {},\n sort: VoteSort = [],\n options: QueryVotesOptions = {},\n userId?: string,\n ): Promise<APIResponse & PollVotesAPIResponse<StreamChatGenerics>> {\n const q = userId ? `?user_id=${userId}` : '';\n return await this.post<APIResponse & PollVotesAPIResponse<StreamChatGenerics>>(\n this.baseURL + `/polls/${encodeURIComponent(pollId)}/votes${q}`,\n {\n filter,\n sort: normalizeQuerySort(sort),\n ...options,\n },\n );\n }\n\n /**\n * Queries poll answers\n * @param pollId\n * @param filter\n * @param sort\n * @param options Option object, {limit: 10, offset:0}\n * @param userId string The user id (only serverside)\n * @returns {APIResponse & PollAnswersAPIResponse} The poll votes\n */\n async queryPollAnswers(\n pollId: string,\n filter: QueryVotesFilters = {},\n sort: VoteSort = [],\n options: QueryVotesOptions = {},\n userId?: string,\n ): Promise<APIResponse & PollAnswersAPIResponse<StreamChatGenerics>> {\n const q = userId ? `?user_id=${userId}` : '';\n return await this.post<APIResponse & PollAnswersAPIResponse<StreamChatGenerics>>(\n this.baseURL + `/polls/${encodeURIComponent(pollId)}/votes${q}`,\n {\n filter: { ...filter, is_answer: true },\n sort: normalizeQuerySort(sort),\n ...options,\n },\n );\n }\n\n /**\n * Query message history\n * @param filter\n * @param sort\n * @param options Option object, {limit: 10}\n * @returns {APIResponse & QueryMessageHistoryResponse} The message histories\n */\n async queryMessageHistory(\n filter: QueryMessageHistoryFilters = {},\n sort: QueryMessageHistorySort = [],\n options: QueryMessageHistoryOptions = {},\n ): Promise<APIResponse & QueryMessageHistoryResponse<StreamChatGenerics>> {\n return await this.post<APIResponse & QueryMessageHistoryResponse<StreamChatGenerics>>(\n this.baseURL + '/messages/history',\n {\n filter,\n sort: normalizeQuerySort(sort),\n ...options,\n },\n );\n }\n\n /**\n * updateFlags - reviews/unflags flagged message\n *\n * @param {string[]} message_ids list of message IDs\n * @param {string} options Option object in case user ID is set to review all the flagged messages by the user\n * @param {string} reviewed_by user ID who reviewed the flagged message\n * @returns {APIResponse}\n */\n async updateFlags(message_ids: string[], reviewed_by: string, options: { user_id?: string } = {}) {\n return await this.post<APIResponse>(this.baseURL + '/automod/v1/moderation/update_flags', {\n message_ids,\n reviewed_by,\n ...options,\n });\n }\n}\n","export const EVENT_MAP = {\n 'channel.created': true,\n 'channel.deleted': true,\n 'channel.hidden': true,\n 'channel.kicked': true,\n 'channel.muted': true,\n 'channel.truncated': true,\n 'channel.unmuted': true,\n 'channel.updated': true,\n 'channel.visible': true,\n 'health.check': true,\n 'member.added': true,\n 'member.removed': true,\n 'member.updated': true,\n 'message.deleted': true,\n 'message.new': true,\n 'message.read': true,\n 'message.updated': true,\n 'message.undeleted': true,\n 'notification.added_to_channel': true,\n 'notification.channel_deleted': true,\n 'notification.channel_mutes_updated': true,\n 'notification.channel_truncated': true,\n 'notification.invite_accepted': true,\n 'notification.invite_rejected': true,\n 'notification.invited': true,\n 'notification.mark_read': true,\n 'notification.mark_unread': true,\n 'notification.message_new': true,\n 'notification.mutes_updated': true,\n 'notification.removed_from_channel': true,\n 'notification.thread_message_new': true,\n 'poll.closed': true,\n 'poll.updated': true,\n 'poll.vote_casted': true,\n 'poll.vote_changed': true,\n 'poll.vote_removed': true,\n 'reaction.deleted': true,\n 'reaction.new': true,\n 'reaction.updated': true,\n 'thread.updated': true,\n 'typing.start': true,\n 'typing.stop': true,\n 'user.banned': true,\n 'user.deleted': true,\n 'user.presence.changed': true,\n 'user.unbanned': true,\n 'user.unread_message_reminder': true,\n 'user.updated': true,\n 'user.watching.start': true,\n 'user.watching.stop': true,\n // AI events\n 'ai_indicator.update': true,\n 'ai_indicator.stop': true,\n 'ai_indicator.clear': true,\n\n // local events\n 'channels.queried': true,\n 'connection.changed': true,\n 'connection.recovered': true,\n 'transport.changed': true,\n 'capabilities.changed': true,\n};\n","import { PermissionObject } from './types';\n\ntype RequiredPermissionObject = Required<PermissionObject>;\n\nexport const Allow = 'Allow';\nexport const Deny = 'Deny';\nexport const AnyResource = ['*'];\nexport const AnyRole = ['*'];\nexport const MaxPriority = 999;\nexport const MinPriority = 1;\n\n// deprecated permission object class, you should use the new permission system v2 and use permissions\n// defined in BuiltinPermissions to configure your channel types\n\nexport class Permission {\n name: RequiredPermissionObject['name'];\n action: RequiredPermissionObject['action'];\n owner: RequiredPermissionObject['owner'];\n priority: RequiredPermissionObject['priority'];\n resources: RequiredPermissionObject['resources'];\n roles: RequiredPermissionObject['roles'];\n constructor(\n name: string,\n priority: number,\n resources = AnyResource,\n roles = AnyRole,\n owner = false,\n action: RequiredPermissionObject['action'] = Allow,\n ) {\n this.name = name;\n this.action = action;\n this.owner = owner;\n this.priority = priority;\n this.resources = resources;\n this.roles = roles;\n }\n}\n\n// deprecated\nexport const AllowAll = new Permission('Allow all', MaxPriority, AnyResource, AnyRole, false, Allow);\n\n// deprecated\nexport const DenyAll = new Permission('Deny all', MinPriority, AnyResource, AnyRole, false, Deny);\n\nexport type Role = 'admin' | 'user' | 'guest' | 'anonymous' | 'channel_member' | 'channel_moderator' | string;\n\nexport const BuiltinRoles = {\n Admin: 'admin',\n Anonymous: 'anonymous',\n ChannelMember: 'channel_member',\n ChannelModerator: 'channel_moderator',\n Guest: 'guest',\n User: 'user',\n};\n\nexport const BuiltinPermissions = {\n AddLinks: 'Add Links',\n BanUser: 'Ban User',\n CreateChannel: 'Create Channel',\n CreateMessage: 'Create Message',\n CreateReaction: 'Create Reaction',\n DeleteAnyAttachment: 'Delete Any Attachment',\n DeleteAnyChannel: 'Delete Any Channel',\n DeleteAnyMessage: 'Delete Any Message',\n DeleteAnyReaction: 'Delete Any Reaction',\n DeleteOwnAttachment: 'Delete Own Attachment',\n DeleteOwnChannel: 'Delete Own Channel',\n DeleteOwnMessage: 'Delete Own Message',\n DeleteOwnReaction: 'Delete Own Reaction',\n ReadAnyChannel: 'Read Any Channel',\n ReadOwnChannel: 'Read Own Channel',\n RunMessageAction: 'Run Message Action',\n UpdateAnyChannel: 'Update Any Channel',\n UpdateAnyMessage: 'Update Any Message',\n UpdateMembersAnyChannel: 'Update Members Any Channel',\n UpdateMembersOwnChannel: 'Update Members Own Channel',\n UpdateOwnChannel: 'Update Own Channel',\n UpdateOwnMessage: 'Update Own Message',\n UploadAttachment: 'Upload Attachment',\n UseFrozenChannel: 'Send messages and reactions to frozen channels',\n};\n"],"names":["isString","arrayOrString","isMapStringCallback","callback","map","res","k","len","length","charAt","kValue","mappedValue","encodeBase64","data","fromByteArray","Uint8Array","char","charCodeAt","decodeBase64","s","e","w","String","fromCharCode","L","i","b","c","x","l","a","r","A","Campaign","client","id","body","message_template","segment_ids","sender_id","sender_mode","channel_template","create_channels","description","name","user_ids","createCampaign","result","campaign","Error","options","verifyCampaignId","startCampaign","updateCampaign","deleteCampaign","stopCampaign","getCampaign","logChatPromiseExecution","promise","then","catch","error","console","warn","sleep","m","Promise","setTimeout","isFunction","value","Object","prototype","toString","call","Function","chatCodes","TOKEN_EXPIRED","WS_CLOSED_SUCCESS","isReadableStream","obj","readable","_read","isBuffer","constructor","isFileWebAPI","uri","window","File","isOwnUser","user","total_unread_count","undefined","isBlobWebAPI","Blob","isOwnUserBaseProperty","property","ownUserBaseProperties","channel_mutes","devices","mutes","unread_channels","unread_count","unread_threads","invisible","privacy_settings","roles","addFileToFormData","contentType","FormData","append","split","reverse","type","normalizeQuerySort","sort","sortFields","sortArr","Array","isArray","item","entries","field","direction","push","retryInterval","numberOfFailures","max","Math","min","floor","random","randomId","generateUUIDv4","hex","bytes","padStart","getRandomBytes","subarray","getRandomValuesWithMathRandom","pow","byteLength","getRandomValues","crypto","bind","msCrypto","convertErrorToJson","err","jsonObj","getOwnPropertyNames","forEach","key","getOwnPropertyDescriptor","_","isOnline","nav","navigator","onLine","addConnectionEventListeners","cb","addEventListener","removeConnectionEventListeners","removeEventListener","axiosParamsSerializer","params","newParams","encodeURIComponent","JSON","stringify","join","formatMessage","message","__html","html","pinned_at","Date","created_at","updated_at","deleted_at","status","reaction_groups","maybeGetReactionGroupsFallback","reaction_counts","reaction_scores","findIndexInSortedArray","needle","sortedArray","selectKey","selectValueToCompare","sortDirection","left","right","middle","recalculateMiddle","round","comparableNeedle","comparableMiddle","needleKey","step","addToMessageList","messages","newMessage","timestampChanged","sortBy","addIfDoesNotExist","addMessageToList","newMessages","filter","concat","messageTime","getTime","messageIsNewest","at","insertionIndex","splice","groups","counts","scores","fallback","keys","count","sum_scores","throttle","fn","timeout","leading","trailing","runningTimeout","storedArgs","args","timeoutHandler","binarySearchByDateEqualOrNearestGreater","array","targetDate","mid","midCreatedAt","midDate","messagePaginationCreatedAtAround","parentSet","requestedPageSize","returnedPage","messagePaginationOptions","newPagination","pagination","created_at_around","hasPrev","hasNext","updateHasPrev","updateHasNext","createdAtAroundDate","slice","firstPageMsg","lastPageMsg","wholePageHasNewerMessages","wholePageHasOlderMessages","requestedPageSizeNotMet","noMoreMessages","firstPageMsgIsFirstInSet","lastPageMsgIsLastInSet","midPointByCount","midPointByCreationDate","messagePaginationIdAround","id_around","midPoint","targetMsg","halves","find","messagePaginationLinear","queriedNextMessages","created_at_after_or_equal","created_at_after","id_gt","id_gte","queriedPrevMessages","created_at_before_or_equal","created_at_before","id_lt","id_lte","offset","containsUnrecognizedOptionsOnly","hasMore","returnedPageIsEmpty","messageSetPagination","logger","DEFAULT_QUERY_CHANNELS_MESSAGE_LIST_PAGE_SIZE","DEFAULT_QUERY_CHANNEL_MESSAGE_LIST_PAGE_SIZE","DEFAULT_MESSAGE_SET_PAGINATION","ChannelState","channel","isUpToDate","msgArray","msg","removed","_updateUserMessages","messageSets","set","parentId","threads","pinnedMessages","hardDelete","_deleteUserMessages","cid","latest_reactions","mentioned_users","own_reactions","parent_id","reply_count","thread_participants","_channel","watcher_count","typing","read","initMessages","pending_messages","mutedUsers","watchers","members","membership","unreadCount","last_message_at","state","isCurrent","index","findIndex","isLatest","messageSetToAddToIfDoesNotExist","addMessagesSorted","initializing","findTargetMessageSet","messagesToAdd","targetMessageSetIndex","isFromShadowBannedUser","shadowed","isMessageFormatted","getClient","updateUserReference","parentID","show_in_channel","_addToMessageList","thread","messageSet","addPinnedMessage","pinnedMessage","removeMessageFromArray","reaction","enforce_unique","messageWithReaction","_updateMessage","_addOwnReactionToMessage","ownReactions","_removeOwnReactionFromMessage","userID","user_id","remove","parseMessage","toISOString","update","updatedMessages","reduce","acc","quoted_message_id","quoted_message","attachments","_updateQuotedMessageReferences","updateFunc","pinned","msgIndex","messageSetIndex","findMessageSetIndex","messageToRemove","isRemoved","threadMessages","filteredMessages","latestMessages","now","lastEvent","receivedAt","received_at","dispatchEvent","messageId","parentMessageId","limit","switchedToMessageSet","loadedMessageThread","messageIdToFind","switchToMessageSet","query","getReplies","currentMessages","messages1","messages2","some","m1","m2","overlappingMessageSetIndices","areMessageSetsOverlap","mergeTargetMessageSetIndex","mergeSourceMessageSetIndices","target","sources","indexOf","overlappingMessageSetIndex","Channel","defaultOptions","watch","presence","event","listeners","all","listener","baseURL","validTypeRe","validIDRe","test","_client","_data","initialized","offlineMode","lastTypingEvent","isTyping","disconnected","configs","post","_channelURL","sendFile","url","delete","_checkInitialized","next","payload","filter_conditions","message_filter_conditions","wsPromise","get","filterConditions","updates","patch","messageID","reactionType","channelData","updateMessage","reserved","_update","areCapabilitiesChanged","own_capabilities","coolDownInterval","cooldown","accept_invite","reject_invite","add_members","add_moderators","assign_roles","invites","remove_members","demote_moderators","opts","channel_cid","cli","uid","partialUpdateMember","archived","resp","channel_member","_muteStatus","formData","message_id","form_data","_isTypingIndicatorsEnabled","diff","lastKeyStroke","sendEvent","ai_state","getConfig","typing_events","typing_indicators","enabled","messageSlice","read_events","_isUsingServerAuth","resolve","stopTyping","clean","_hasConnectionID","combined","tags","response","normalizedSort","messageIds","ids","last_read","silent","userMuteStatus","includes","muteStatus","muted","lastRead","_countMessageAsUnread","queryURL","membersStr","member","tempChannelCid","activeChannels","_cacheEnabled","_addChannelConfig","_initializeState","polls","hydratePollCache","queriedChannels","channels","isLatestMessageSet","targetUserID","banUser","userId","clearHistory","clear_history","unbanUser","shadowBan","removeShadowBan","pollId","vote","castPollVote","voteId","removePollVote","callbackOrString","callbackOrNothing","unsubscribe","el","channelState","last_read_message_id","unread_messages","_extendEventWithOwnReactions","hard_delete","removeMessage","addMessageSorted","removeQuotedMessageReferences","removePinnedMessage","ownMessage","isThreadMessage","preventUnreadCountUpdate","truncated_at","truncatedAt","createdAt","clearMessages","newMembers","first_unread_message_id","last_read_at","isFrozenChanged","frozen","hidden","addReaction","removeReaction","shadow_banned","shadow","banned","clientState","_hydrateMembers","addPinnedMessages","pinned_messages","watcher","findMessage","overrideCurrentState","newMembersById","membersById","setIsUpToDate","ClientState","users","userChannelReferences","updateUser","channelID","InsightMetrics","connectionStartTimestamp","wsTotalFailures","wsConsecutiveFailures","instanceClientId","postInsights","insightType","insights","maxAttempts","axios","buildWsFatalInsight","connection","buildWsBaseInsight","ready_state","ws","readyState","_buildUrl","api_key","start_ts","insightMetrics","end_ts","auth_type","getAuthType","token","tokenManager","user_details","_user","device","client_id","connectionID","ws_details","ws_consecutive_failures","ws_total_failures","request_id","requestID","online","user_agent","userAgent","instance_client_id","buildWsSuccessAfterFailureInsight","isCloseEvent","code","isErrorEvent","StableWSConnection","qs","_buildWSPayload","getToken","wsBaseURL","getUserAgent","_log","_setHealth","isHealthy","_reconnect","interval","wsID","parse","isResolved","rejectPromise","_errorFromWSEvent","resolvePromise","scheduleNextPing","handleEvent","scheduleConnectionCheck","reason","wasClean","consecutiveFailures","totalFailures","isConnecting","healthy","isWSFailure","statusCode","StatusCode","connectionOpen","reject","healthCheckTimeoutRef","clearTimeout","clientID","send","pingInterval","connectionCheckTimeoutRef","connectionCheckTimeout","isDisconnected","onlineStatusChanged","extra","level","_connect","healthCheck","isStatic","refreshToken","_waitForHealthy","race","clearInterval","removeAllListeners","isClosedPromise","close","OPEN","onclose","enableWSFallback","isTokenReady","tokenReady","loadToken","_setupConnectionPromise","wsURL","WebSocket","onopen","onerror","onmessage","connection_id","enableInsights","_destroyCurrentWSConnection","recoverState","JWTUserToken","apiSecret","extraData","jwtOptions","TypeError","algorithm","noTimestamp","JWTServerToken","server","jwt","sign","UserFromToken","fragments","b64Payload","DevToken","CheckSignature","secret","signature","Buffer","from","hash","createHmac","digest","timingSafeEqual","TokenManager","tokenOrProvider","validateToken","tokenProvider","loadTokenPromise","anon","tokenUserId","APIErrorCodes","retryable","isAPIError","isErrorRetryable","isConnectionIDError","isErrorResponse","ConnectionState","WSConnectionFallback","_setState","Closed","cancelToken","cancel","connect","config","retry","CancelToken","source","doAxiosRequest","replace","_req","Connected","events","isCancel","Disconnected","reconnect","Connecting","json","_poll","_onlineStatusChanged","Init","Segment","all_sender_channels","all_users","createSegment","verifySegmentId","getSegment","updateSegment","targets","addSegmentTargets","removeSegmentTargets","deleteSegment","targetId","segmentTargetExists","querySegmentTargets","ErrorFromResponse","VotingVisibility","isPatch","StateStore","Set","newValueOrPatch","newValue","oldValue","handlerSet","handler","partial","current","add","selector","selectedValues","wrappedHandler","nextValue","newlySelectedValues","hasUpdatedValues","logCount","oldSelectedValues","subscribe","DEFAULT_PAGE_LIMIT","DEFAULT_SORT","MARK_AS_READ_THROTTLE_TIMEOUT","THREAD_RESPONSE_RESERVED_KEYS","created_by_user_id","parent_message_id","title","latest_replies","active_participant_count","participant_count","created_by","parent_message","constructCustomDataObject","threadData","custom","customKey","Thread","Map","partialNext","active","getLatestValue","isLoading","getThread","hydrateState","replyCount","replies","parentMessage","participants","deletedAt","updatedAt","pendingReplies","failedRepliesMap","values","isStateStale","unsubscribeFunctions","size","subscribeThreadUpdated","subscribeMarkActiveThreadRead","subscribeReloadActiveStaleThread","subscribeMarkThreadStale","subscribeNewReplies","subscribeRepliesRead","subscribeMessageDeleted","subscribeMessageUpdated","on","subscribeWithSelector","unreadMessageCount","ownUnreadCountSelector","throttledMarkAsRead","reload","isOwnMessage","upsertReplyLocally","nextRead","userRead","nextUserRead","lastReadAt","lastReadMessageId","deleteReplyLocally","updateParentMessageLocally","eventTypes","eventType","updateParentMessageOrReplyLocally","cleanupFunction","clear","reply","updatedReplies","formattedMessage","has","force","ownUnreadCount","markRead","thread_id","markAsRead","otherOptions","loadPage","loadingKey","cursorKey","insertionMethodKey","queryOptions","abs","queryReplies","maybeNextCursor","nextReplies","placeholderReadResponse","repliesPaginationFromInitialThread","formatReadState","latestRepliesContainsAllReplies","nextCursor","prevCursor","isLoadingNext","isLoadingPrev","currentUserId","MODERATION_ENTITY_TYPES","Moderation","flaggedUserID","flag","entityType","entityId","entityCreatorID","entity_type","entity_id","entity_creator_id","targetID","target_ids","actionType","itemID","action_type","item_id","entityID","moderationPayload","configKey","moderation_payload","config_key","flags","addCustomFlags","DEFAULT_CONNECTION_RECOVERY_THROTTLE_DURATION","MAX_QUERY_THREADS_LIMIT","THREAD_MANAGER_INITIAL_STATE","isThreadOrderStale","unreadThreadCount","unseenThreadIds","lastConnectionDropAt","ready","ThreadManager","subscribeUnreadThreadsCountChange","subscribeManageThreadSubscriptions","subscribeReloadOnActivation","subscribeRecoverAfterConnectionDrop","subscribeChannelDeleted","me","newThreads","prev","nextThreads","prevThreads","removedThreads","threadsById","registerSubscriptions","unregisterSubscriptions","unsubscribeConnectionDropped","throttledHandleConnectionRecovered","unsubscribeConnectionRecovered","queryThreads","currentThreads","incomingThread","existingThread","hasStaleState","participant_limit","reply_limit","threadsByIdGetterCache","newThreadsById","isPollUpdatedEvent","isPollClosedEventEvent","isPollVoteCastedEvent","isPollVoteChangedEvent","isPollVoteRemovedEvent","isVoteAnswer","answer_text","Poll","poll","own_votes","pollResponseForState","voteOrAnswer","ownAnswer","ownVotes","lastActivityAt","maxVotedOptionIds","getMaxVotedOptionIds","vote_counts_by_option","ownVotesByOptionId","getOwnVotesByOptionId","getInitialStateFromPollResponse","extractPollData","pollData","is_closed","currentState","isOwnVote","poll_vote","latestAnswers","latest_answers","option_id","pollEnrichData","extractPollEnrichedData","answer","enforce_unique_votes","optionId","getPoll","updatePoll","partialPollObject","partialUpdatePoll","closePoll","deletePoll","option","createPollOption","updatePollOption","deletePollOption","max_votes_allowed","reachedVoteLimit","oldestVote","removeVote","answerText","addPollAnswer","answerId","queryPollAnswers","queryPollVotes","voteCountsByOption","maxVotes","winningOptions","pollResponse","allow_answers","allow_user_suggested_options","enforce_unique_vote","voting_visibility","answers_count","latest_votes_by_option","vote_count","PollManager","pollCache","subscribeMessageNew","subscribePollUpdated","subscribePollClosed","subscribeVoteCasted","subscribeVoteChanged","subscribeVoteRemoved","createPoll","createdPoll","cachedPoll","fromState","setOrOverwriteInCache","queryPolls","pollInstances","overwriteState","pollFromCache","reinitializeState","handlePollUpdated","handlePollClosed","handleVoteCasted","handleVoteChanged","handleVoteRemoved","StreamChat","secretOrOptions","wsConnection","wsFallback","Boolean","_getConnectionID","userTokenOrProvider","setUserPromise","node","allowServerSideConnect","anonymous","setTokenPromise","_setToken","_setUser","openConnection","persistUserOnConnectionFailure","closeConnection","disconnectUser","connectUser","setTokenOrProvider","cleaningIntervalRef","disconnect","_startCleaning","before","closePromise","_disconnect","resetState","reset","anonymousUser","_setupConnection","connectAnonymousUser","requestConfig","_enrichAxiosOptions","_logApiRequest","axiosInstance","postForm","put","_logApiResponse","handleResponse","client_request_id","headers","_logApiError","postListenerCallbacks","_handleClientEvent","_handleChannelEvent","_callClientListeners","_callChannelListeners","messageEvent","jsonString","refMap","_updateMemberWatcherReferences","updateUserMessages","deleteUserMessages","_updateUserMessageReferences","mark_messages_deleted","_deleteUserMessageReference","cids","recoverStateOnReconnect","queryChannels","$in","channelType","tempCid","membersStrInExistingChannel","upsertUsers","upsertUser","unblockMessage","markChannelsRead","disableCache","mutedChannels","moderation","inputOptions","browser","withCredentials","warmUp","httpsAgent","https","Agent","keepAlive","keepAliveMsecs","create","setBaseURL","process","env","STREAM_LOCAL_TEST_RUN","STREAM_LOCAL_TEST_HOST","defaultWSTimeoutWithFallback","defaultWSTimeout","defaults","paramsSerializer","apn_config","p12_cert","updateAppSettings","revoke_tokens_issued_before","_normalizeDate","revokeUsersToken","userIDs","partialUpdateUsers","apnTemplate","apn_template","firebaseTemplate","firebase_template","firebaseDataTemplate","firebase_data_template","skipDevices","skip_devices","pushProviderName","push_provider_name","pushProviderType","push_provider_type","last_active","guestUser","access_token","exp","iat","getHeaders","maxContentLength","Infinity","maxBodyLength","errorFromResponse","_handleUserEvent","activeChannelKeys","activeChannelKey","deleteAllChannelReference","mute","expires","expiresAt","_sayHi","setClient","mode","updateUsers","stateOptions","hydrateActiveChannels","channelsFromApi","queryChannelsOptions","skipInitialization","updatedMessagesSet","message_limit","push_provider","serverSide","web","android","ios","endpoints","server_side","channelIDOrCustom","getChannelByMembers","getChannelById","partialUserObject","userMap","userObject","target_user_id","blockedUserID","blocked_user_id","target_id","currentUserID","targetMessageID","target_message_id","callID","reviewResult","review_result","commands","language","text","destination_language","source_language","timeoutOrExpirationDate","pinExpires","setSeconds","getSeconds","messageOrMessageId","errorText","pinnedBy","pinnedAt","_validateAndGetMessageId","partialUpdateMessage","pin_expires","_normalizeExpiration","clonedMessage","reservedMessageFields","mu","partialMessageObject","hard","undeleted_by","optionsWithDefaults","partialThreadObject","reservedThreadFields","unset","_getToken","authorization","Authorization","signal","nextRequestAbortController","axiosRequestConfig","axiosRequestConfigParams","axiosRequestConfigHeaders","axiosRequestConfigRest","that","setInterval","requestBody","xSignature","permissionData","channel_cids","last_sync_at","blockList","request","exportChannels","idOrData","validateServerSideAuth","segmentId","scheduled_for","scheduledFor","stop_at","stopAt","conversations","filename","path","pushProvider","AbortController","q","is_answer","message_ids","reviewed_by","_instance","EVENT_MAP","Allow","Deny","AnyResource","AnyRole","MaxPriority","MinPriority","Permission","priority","resources","owner","action","AllowAll","DenyAll","BuiltinRoles","Admin","Anonymous","ChannelMember","ChannelModerator","Guest","User","BuiltinPermissions","AddLinks","BanUser","CreateChannel","CreateMessage","CreateReaction","DeleteAnyAttachment","DeleteAnyChannel","DeleteAnyMessage","DeleteAnyReaction","DeleteOwnAttachment","DeleteOwnChannel","DeleteOwnMessage","DeleteOwnReaction","ReadAnyChannel","ReadOwnChannel","RunMessageAction","UpdateAnyChannel","UpdateAnyMessage","UpdateMembersAnyChannel","UpdateMembersOwnChannel","UpdateOwnChannel","UpdateOwnMessage","UploadAttachment","UseFrozenChannel"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"browser.es.js","sources":["../src/base64.ts","../src/campaign.ts","../https","../src/utils.ts","../src/constants.ts","../src/channel_state.ts","../src/channel.ts","../src/client_state.ts","../src/insights.ts","../src/connection.ts","../jsonwebtoken","../crypto","../src/signing.ts","../src/token_manager.ts","../src/errors.ts","../src/connection_fallback.ts","../src/segment.ts","../src/types.ts","../src/store.ts","../src/thread.ts","../src/moderation.ts","../src/thread_manager.ts","../src/poll.ts","../src/poll_manager.ts","../src/client.ts","../src/events.ts","../src/permissions.ts"],"sourcesContent":["import { fromByteArray } from 'base64-js';\n\nfunction isString<T>(arrayOrString: string | T[]): arrayOrString is string {\n return typeof (arrayOrString as string) === 'string';\n}\n\ntype MapGenericCallback<T, U> = (value: T, index: number, array: T[]) => U;\ntype MapStringCallback<U> = (value: string, index: number, string: string) => U;\n\nfunction isMapStringCallback<T, U>(\n arrayOrString: string | T[],\n callback: MapGenericCallback<T, U> | MapStringCallback<U>,\n): callback is MapStringCallback<U> {\n return !!callback && isString(arrayOrString);\n}\n\n// source - https://github.com/beatgammit/base64-js/blob/master/test/convert.js#L72\nfunction map<T, U>(array: T[], callback: MapGenericCallback<T, U>): U[];\nfunction map<U>(string: string, callback: MapStringCallback<U>): U[];\nfunction map<T, U>(arrayOrString: string | T[], callback: MapGenericCallback<T, U> | MapStringCallback<U>): U[] {\n const res = [];\n\n if (isString(arrayOrString) && isMapStringCallback(arrayOrString, callback)) {\n for (let k = 0, len = arrayOrString.length; k < len; k++) {\n if (arrayOrString.charAt(k)) {\n const kValue = arrayOrString.charAt(k);\n const mappedValue = callback(kValue, k, arrayOrString);\n res[k] = mappedValue;\n }\n }\n } else if (!isString(arrayOrString) && !isMapStringCallback(arrayOrString, callback)) {\n for (let k = 0, len = arrayOrString.length; k < len; k++) {\n if (k in arrayOrString) {\n const kValue = arrayOrString[k];\n const mappedValue = callback(kValue, k, arrayOrString);\n res[k] = mappedValue;\n }\n }\n }\n\n return res;\n}\n\nexport const encodeBase64 = (data: string): string =>\n fromByteArray(new Uint8Array(map(data, (char) => char.charCodeAt(0))));\n\n// base-64 decoder throws exception if encoded string is not padded by '=' to make string length\n// in multiples of 4. So gonna use our own method for this purpose to keep backwards compatibility\n// https://github.com/beatgammit/base64-js/blob/master/index.js#L26\nexport const decodeBase64 = (s: string): string => {\n const e = {} as { [key: string]: number },\n w = String.fromCharCode,\n L = s.length;\n let i,\n b = 0,\n c,\n x,\n l = 0,\n a,\n r = '';\n const A = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n for (i = 0; i < 64; i++) {\n e[A.charAt(i)] = i;\n }\n for (x = 0; x < L; x++) {\n c = e[s.charAt(x)];\n b = (b << 6) + c;\n l += 6;\n while (l >= 8) {\n ((a = (b >>> (l -= 8)) & 0xff) || x < L - 2) && (r += w(a));\n }\n }\n return r;\n};\n","import { StreamChat } from './client';\nimport { CampaignData, DefaultGenerics, ExtendableGenerics } from './types';\n\nexport class Campaign<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> {\n id: string | null;\n data?: CampaignData;\n client: StreamChat<StreamChatGenerics>;\n\n constructor(client: StreamChat<StreamChatGenerics>, id: string | null, data?: CampaignData) {\n this.client = client;\n this.id = id;\n this.data = data;\n }\n\n async create() {\n const body = {\n id: this.id,\n message_template: this.data?.message_template,\n segment_ids: this.data?.segment_ids,\n sender_id: this.data?.sender_id,\n sender_mode: this.data?.sender_mode,\n channel_template: this.data?.channel_template,\n create_channels: this.data?.create_channels,\n description: this.data?.description,\n name: this.data?.name,\n user_ids: this.data?.user_ids,\n };\n\n const result = await this.client.createCampaign(body);\n\n this.id = result.campaign.id;\n this.data = result.campaign;\n return result;\n }\n\n verifyCampaignId() {\n if (!this.id) {\n throw new Error(\n 'Campaign id is missing. Either create the campaign using campaign.create() or set the id during instantiation - const campaign = client.campaign(id)',\n );\n }\n }\n\n async start(options?: { scheduledFor?: string; stopAt?: string }) {\n this.verifyCampaignId();\n\n return await this.client.startCampaign(this.id as string, options);\n }\n\n async update(data: Partial<CampaignData>) {\n this.verifyCampaignId();\n\n return this.client.updateCampaign(this.id as string, data);\n }\n\n async delete() {\n this.verifyCampaignId();\n\n return await this.client.deleteCampaign(this.id as string);\n }\n\n async stop() {\n this.verifyCampaignId();\n\n return this.client.stopCampaign(this.id as string);\n }\n\n async get() {\n this.verifyCampaignId();\n\n return this.client.getCampaign(this.id as string);\n }\n}\n","export default null;","import FormData from 'form-data';\nimport {\n AscDesc,\n ExtendableGenerics,\n DefaultGenerics,\n Logger,\n OwnUserBase,\n OwnUserResponse,\n UserResponse,\n MessageResponse,\n FormatMessageResponse,\n ReactionGroupResponse,\n MessageSet,\n MessagePaginationOptions,\n} from './types';\nimport { AxiosRequestConfig } from 'axios';\n\n/**\n * logChatPromiseExecution - utility function for logging the execution of a promise..\n * use this when you want to run the promise and handle errors by logging a warning\n *\n * @param {Promise<T>} promise The promise you want to run and log\n * @param {string} name A descriptive name of what the promise does for log output\n *\n */\nexport function logChatPromiseExecution<T>(promise: Promise<T>, name: string) {\n promise.then().catch((error) => {\n console.warn(`failed to do ${name}, ran into error: `, error);\n });\n}\n\nexport const sleep = (m: number): Promise<void> => new Promise((r) => setTimeout(r, 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 'function' === typeof value ||\n value instanceof Function)\n );\n}\n\nexport const chatCodes = {\n TOKEN_EXPIRED: 40,\n WS_CLOSED_SUCCESS: 1000,\n};\n\nfunction isReadableStream(obj: unknown): obj is NodeJS.ReadStream {\n return (\n obj !== null &&\n typeof obj === 'object' &&\n ((obj as NodeJS.ReadStream).readable || typeof (obj as NodeJS.ReadStream)._read === 'function')\n );\n}\n\nfunction isBuffer(obj: unknown): obj is Buffer {\n return (\n obj != null &&\n (obj as Buffer).constructor != null &&\n // @ts-expect-error\n typeof obj.constructor.isBuffer === 'function' &&\n // @ts-expect-error\n obj.constructor.isBuffer(obj)\n );\n}\n\nfunction isFileWebAPI(uri: unknown): uri is File {\n return typeof window !== 'undefined' && 'File' in window && uri instanceof File;\n}\n\nexport function isOwnUser<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics>(\n user?: OwnUserResponse<StreamChatGenerics> | UserResponse<StreamChatGenerics>,\n): user is OwnUserResponse<StreamChatGenerics> {\n return (user as OwnUserResponse<StreamChatGenerics>)?.total_unread_count !== undefined;\n}\n\nfunction isBlobWebAPI(uri: unknown): uri is Blob {\n return typeof window !== 'undefined' && 'Blob' in window && uri instanceof Blob;\n}\n\nexport function isOwnUserBaseProperty(property: string) {\n const ownUserBaseProperties: {\n [Property in keyof Required<OwnUserBase>]: boolean;\n } = {\n channel_mutes: true,\n devices: true,\n mutes: true,\n total_unread_count: true,\n unread_channels: true,\n unread_count: true,\n unread_threads: true,\n invisible: true,\n privacy_settings: true,\n roles: true,\n push_preferences: true,\n };\n\n return ownUserBaseProperties[property as keyof OwnUserBase];\n}\n\nexport function addFileToFormData(\n uri: string | NodeJS.ReadableStream | Buffer | File,\n name?: string,\n contentType?: string,\n) {\n const data = new FormData();\n\n if (isReadableStream(uri) || isBuffer(uri) || isFileWebAPI(uri) || isBlobWebAPI(uri)) {\n if (name) data.append('file', uri, name);\n else data.append('file', uri);\n } else {\n data.append('file', {\n uri,\n name: name || (uri as string).split('/').reverse()[0],\n contentType: contentType || undefined,\n type: contentType || undefined,\n });\n }\n\n return data;\n}\nexport function normalizeQuerySort<T extends Record<string, AscDesc | undefined>>(sort: T | T[]) {\n const sortFields: Array<{ direction: AscDesc; field: keyof T }> = [];\n const sortArr = Array.isArray(sort) ? sort : [sort];\n for (const item of sortArr) {\n const entries = Object.entries(item) as [keyof T, AscDesc][];\n if (entries.length > 1) {\n console.warn(\n \"client._buildSort() - multiple fields in a single sort object detected. Object's field order is not guaranteed\",\n );\n }\n for (const [field, direction] of entries) {\n sortFields.push({ field, direction });\n }\n }\n return sortFields;\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-25 seconds (random to spread out the load from failures)\n const max = Math.min(500 + numberOfFailures * 2000, 25000);\n const min = Math.min(Math.max(250, (numberOfFailures - 1) * 2000), 25000);\n return Math.floor(Math.random() * (max - min) + min);\n}\n\nexport function randomId() {\n return generateUUIDv4();\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\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 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\nexport function convertErrorToJson(err: Error) {\n const jsonObj = {} as Record<string, unknown>;\n\n if (!err) return jsonObj;\n\n try {\n Object.getOwnPropertyNames(err).forEach((key) => {\n jsonObj[key] = Object.getOwnPropertyDescriptor(err, key);\n });\n } catch (_) {\n return {\n error: 'failed to serialize the error',\n };\n }\n\n return jsonObj;\n}\n\n/**\n * isOnline safely return the navigator.online value for browser env\n * if navigator is not in global object, it always return true\n */\nexport function isOnline() {\n const nav =\n typeof navigator !== 'undefined'\n ? navigator\n : typeof window !== 'undefined' && window.navigator\n ? window.navigator\n : undefined;\n\n if (!nav) {\n console.warn('isOnline failed to access window.navigator and assume browser is online');\n return true;\n }\n\n // RN navigator has undefined for onLine\n if (typeof nav.onLine !== 'boolean') {\n return true;\n }\n\n return nav.onLine;\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 axiosParamsSerializer: AxiosRequestConfig['paramsSerializer'] = (params) => {\n const newParams = [];\n for (const k in params) {\n // Stream backend doesn't treat \"undefined\" value same as value not being present.\n // So, we need to skip the undefined values.\n if (params[k] === undefined) continue;\n\n if (Array.isArray(params[k]) || typeof params[k] === 'object') {\n newParams.push(`${k}=${encodeURIComponent(JSON.stringify(params[k]))}`);\n } else {\n newParams.push(`${k}=${encodeURIComponent(params[k])}`);\n }\n }\n\n return newParams.join('&');\n};\n\n/**\n * Takes the message object, parses the dates, sets `__html`\n * and sets the status to `received` if missing; returns a new message object.\n *\n * @param {MessageResponse<StreamChatGenerics>} message `MessageResponse` object\n */\nexport function formatMessage<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics>(\n message: MessageResponse<StreamChatGenerics> | FormatMessageResponse<StreamChatGenerics>,\n): FormatMessageResponse<StreamChatGenerics> {\n return {\n ...message,\n /**\n * @deprecated please use `html`\n */\n __html: message.html,\n // parse the dates\n pinned_at: message.pinned_at ? new Date(message.pinned_at) : null,\n created_at: message.created_at ? new Date(message.created_at) : new Date(),\n updated_at: message.updated_at ? new Date(message.updated_at) : new Date(),\n deleted_at: message.deleted_at ? new Date(message.deleted_at) : null,\n status: message.status || 'received',\n reaction_groups: maybeGetReactionGroupsFallback(\n message.reaction_groups,\n message.reaction_counts,\n message.reaction_scores,\n ),\n };\n}\n\nexport const findIndexInSortedArray = <T, L>({\n needle,\n sortedArray,\n selectKey,\n selectValueToCompare = (e) => e,\n sortDirection = 'ascending',\n}: {\n needle: T;\n sortedArray: readonly T[];\n /**\n * In an array of objects (like messages), pick a unique property identifying\n * an element. It will be used to find a direct match for the needle element\n * in case compare values are not unique.\n *\n * @example\n * ```ts\n * selectKey: (message) => message.id\n * ```\n */\n selectKey?: (arrayElement: T) => string;\n /**\n * In an array of objects (like messages), pick a specific\n * property to compare the needle value to.\n *\n * @example\n * ```ts\n * selectValueToCompare: (message) => message.created_at.getTime()\n * ```\n */\n selectValueToCompare?: (arrayElement: T) => L | T;\n /**\n * @default ascending\n * @description\n * ```md\n * ascending - [1,2,3,4,5...]\n * descending - [...5,4,3,2,1]\n * ```\n */\n sortDirection?: 'ascending' | 'descending';\n}) => {\n if (!sortedArray.length) return 0;\n\n let left = 0;\n let right = sortedArray.length - 1;\n let middle = 0;\n\n const recalculateMiddle = () => {\n middle = Math.round((left + right) / 2);\n };\n\n const comparableNeedle = selectValueToCompare(needle);\n\n while (left <= right) {\n recalculateMiddle();\n\n const comparableMiddle = selectValueToCompare(sortedArray[middle]);\n\n if (\n (sortDirection === 'ascending' && comparableNeedle < comparableMiddle) ||\n (sortDirection === 'descending' && comparableNeedle >= comparableMiddle)\n ) {\n right = middle - 1;\n } else {\n left = middle + 1;\n }\n }\n\n // In case there are several array elements with the same comparable value, search around the insertion\n // point to possibly find an element with the same key. If found, prefer it.\n // This, for example, prevents duplication of messages with the same creation date.\n if (selectKey) {\n const needleKey = selectKey(needle);\n const step = sortDirection === 'ascending' ? -1 : +1;\n for (\n let i = left + step;\n 0 <= i && i < sortedArray.length && selectValueToCompare(sortedArray[i]) === comparableNeedle;\n i += step\n ) {\n if (selectKey(sortedArray[i]) === needleKey) {\n return i;\n }\n }\n }\n\n return left;\n};\n\nexport function addToMessageList<T extends FormatMessageResponse>(\n messages: readonly T[],\n newMessage: T,\n timestampChanged = false,\n sortBy: 'pinned_at' | 'created_at' = 'created_at',\n addIfDoesNotExist = true,\n) {\n const addMessageToList = addIfDoesNotExist || timestampChanged;\n let newMessages = [...messages];\n\n // if created_at has changed, message should be filtered and re-inserted in correct order\n // slow op but usually this only happens for a message inserted to state before actual response with correct timestamp\n if (timestampChanged) {\n newMessages = newMessages.filter((message) => !(message.id && newMessage.id === message.id));\n }\n\n // for empty list just concat and return unless it's an update or deletion\n if (newMessages.length === 0 && addMessageToList) {\n return newMessages.concat(newMessage);\n } else if (newMessages.length === 0) {\n return newMessages;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const messageTime = newMessage[sortBy]!.getTime();\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const messageIsNewest = newMessages.at(-1)![sortBy]!.getTime() < messageTime;\n\n // if message is newer than last item in the list concat and return unless it's an update or deletion\n if (messageIsNewest && addMessageToList) {\n return newMessages.concat(newMessage);\n } else if (messageIsNewest) {\n return newMessages;\n }\n\n // find the closest index to push the new message\n const insertionIndex = findIndexInSortedArray({\n needle: newMessage,\n sortedArray: newMessages,\n sortDirection: 'ascending',\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n selectValueToCompare: (m) => m[sortBy]!.getTime(),\n selectKey: (m) => m.id,\n });\n\n // message already exists and not filtered with timestampChanged, update and return\n if (\n !timestampChanged &&\n newMessage.id &&\n newMessages[insertionIndex] &&\n newMessage.id === newMessages[insertionIndex].id\n ) {\n newMessages[insertionIndex] = newMessage;\n return newMessages;\n }\n\n // do not add updated or deleted messages to the list if they already exist or come with a timestamp change\n if (addMessageToList) {\n newMessages.splice(insertionIndex, 0, newMessage);\n }\n\n return newMessages;\n}\n\nfunction maybeGetReactionGroupsFallback(\n groups: { [key: string]: ReactionGroupResponse } | null | undefined,\n counts: { [key: string]: number } | null | undefined,\n scores: { [key: string]: number } | null | undefined,\n): { [key: string]: ReactionGroupResponse } | null {\n if (groups) {\n return groups;\n }\n\n if (counts && scores) {\n const fallback: { [key: string]: ReactionGroupResponse } = {};\n\n for (const type of Object.keys(counts)) {\n fallback[type] = {\n count: counts[type],\n sum_scores: scores[type],\n };\n }\n\n return fallback;\n }\n\n return null;\n}\n\n// works exactly the same as lodash.throttle\nexport const throttle = <T extends (...args: unknown[]) => unknown>(\n fn: T,\n timeout = 200,\n { leading = true, trailing = false }: { leading?: boolean; trailing?: boolean } = {},\n) => {\n let runningTimeout: null | NodeJS.Timeout = null;\n let storedArgs: Parameters<T> | null = null;\n\n return (...args: Parameters<T>) => {\n if (runningTimeout) {\n if (trailing) storedArgs = args;\n return;\n }\n\n if (leading) fn(...args);\n\n const timeoutHandler = () => {\n if (storedArgs) {\n fn(...storedArgs);\n storedArgs = null;\n runningTimeout = setTimeout(timeoutHandler, timeout);\n\n return;\n }\n\n runningTimeout = null;\n };\n\n runningTimeout = setTimeout(timeoutHandler, timeout);\n };\n};\n\ntype MessagePaginationUpdatedParams<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n parentSet: MessageSet;\n requestedPageSize: number;\n returnedPage: MessageResponse<StreamChatGenerics>[];\n logger?: Logger;\n messagePaginationOptions?: MessagePaginationOptions;\n};\n\nexport function binarySearchByDateEqualOrNearestGreater(\n array: {\n created_at?: string;\n }[],\n targetDate: Date,\n): number {\n let left = 0;\n let right = array.length - 1;\n\n while (left <= right) {\n const mid = Math.floor((left + right) / 2);\n const midCreatedAt = array[mid].created_at;\n if (!midCreatedAt) {\n left += 1;\n continue;\n }\n const midDate = new Date(midCreatedAt);\n\n if (midDate.getTime() === targetDate.getTime()) {\n return mid;\n } else if (midDate.getTime() < targetDate.getTime()) {\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n }\n\n return left;\n}\n\nconst messagePaginationCreatedAtAround = <StreamChatGenerics extends ExtendableGenerics = DefaultGenerics>({\n parentSet,\n requestedPageSize,\n returnedPage,\n messagePaginationOptions,\n}: MessagePaginationUpdatedParams<StreamChatGenerics>) => {\n const newPagination = { ...parentSet.pagination };\n if (!messagePaginationOptions?.created_at_around) return newPagination;\n let hasPrev;\n let hasNext;\n let updateHasPrev;\n let updateHasNext;\n const createdAtAroundDate = new Date(messagePaginationOptions.created_at_around);\n const [firstPageMsg, lastPageMsg] = [returnedPage[0], returnedPage.slice(-1)[0]];\n\n // expect ASC order (from oldest to newest)\n const wholePageHasNewerMessages =\n !!firstPageMsg?.created_at && new Date(firstPageMsg.created_at) > createdAtAroundDate;\n const wholePageHasOlderMessages = !!lastPageMsg?.created_at && new Date(lastPageMsg.created_at) < createdAtAroundDate;\n\n const requestedPageSizeNotMet =\n requestedPageSize > parentSet.messages.length && requestedPageSize > returnedPage.length;\n const noMoreMessages =\n (requestedPageSize > parentSet.messages.length || parentSet.messages.length >= returnedPage.length) &&\n requestedPageSize > returnedPage.length;\n\n if (wholePageHasNewerMessages) {\n hasPrev = false;\n updateHasPrev = true;\n if (requestedPageSizeNotMet) {\n hasNext = false;\n updateHasNext = true;\n }\n } else if (wholePageHasOlderMessages) {\n hasNext = false;\n updateHasNext = true;\n if (requestedPageSizeNotMet) {\n hasPrev = false;\n updateHasPrev = true;\n }\n } else if (noMoreMessages) {\n hasNext = hasPrev = false;\n updateHasPrev = updateHasNext = true;\n } else {\n const [firstPageMsgIsFirstInSet, lastPageMsgIsLastInSet] = [\n firstPageMsg?.id && firstPageMsg.id === parentSet.messages[0]?.id,\n lastPageMsg?.id && lastPageMsg.id === parentSet.messages.slice(-1)[0]?.id,\n ];\n updateHasPrev = firstPageMsgIsFirstInSet;\n updateHasNext = lastPageMsgIsLastInSet;\n const midPointByCount = Math.floor(returnedPage.length / 2);\n const midPointByCreationDate = binarySearchByDateEqualOrNearestGreater(returnedPage, createdAtAroundDate);\n\n if (midPointByCreationDate !== -1) {\n hasPrev = midPointByCount <= midPointByCreationDate;\n hasNext = midPointByCount >= midPointByCreationDate;\n }\n }\n\n if (updateHasPrev && typeof hasPrev !== 'undefined') newPagination.hasPrev = hasPrev;\n if (updateHasNext && typeof hasNext !== 'undefined') newPagination.hasNext = hasNext;\n\n return newPagination;\n};\n\nconst messagePaginationIdAround = <StreamChatGenerics extends ExtendableGenerics = DefaultGenerics>({\n parentSet,\n requestedPageSize,\n returnedPage,\n messagePaginationOptions,\n}: MessagePaginationUpdatedParams<StreamChatGenerics>) => {\n const newPagination = { ...parentSet.pagination };\n const { id_around } = messagePaginationOptions || {};\n if (!id_around) return newPagination;\n let hasPrev;\n let hasNext;\n\n const [firstPageMsg, lastPageMsg] = [returnedPage[0], returnedPage.slice(-1)[0]];\n const [firstPageMsgIsFirstInSet, lastPageMsgIsLastInSet] = [\n firstPageMsg?.id === parentSet.messages[0]?.id,\n lastPageMsg?.id === parentSet.messages.slice(-1)[0]?.id,\n ];\n let updateHasPrev = firstPageMsgIsFirstInSet;\n let updateHasNext = lastPageMsgIsLastInSet;\n\n const midPoint = Math.floor(returnedPage.length / 2);\n const noMoreMessages =\n (requestedPageSize > parentSet.messages.length || parentSet.messages.length >= returnedPage.length) &&\n requestedPageSize > returnedPage.length;\n\n if (noMoreMessages) {\n hasNext = hasPrev = false;\n updateHasPrev = updateHasNext = true;\n } else if (!returnedPage[midPoint]) {\n return newPagination;\n } else if (returnedPage[midPoint].id === id_around) {\n hasPrev = hasNext = true;\n } else {\n let targetMsg;\n const halves = [returnedPage.slice(0, midPoint), returnedPage.slice(midPoint)];\n hasPrev = hasNext = true;\n for (let i = 0; i < halves.length; i++) {\n targetMsg = halves[i].find((message) => message.id === id_around);\n if (targetMsg && i === 0) {\n hasPrev = false;\n }\n if (targetMsg && i === 1) {\n hasNext = false;\n }\n }\n }\n\n if (updateHasPrev && typeof hasPrev !== 'undefined') newPagination.hasPrev = hasPrev;\n if (updateHasNext && typeof hasNext !== 'undefined') newPagination.hasNext = hasNext;\n\n return newPagination;\n};\n\nconst messagePaginationLinear = <StreamChatGenerics extends ExtendableGenerics = DefaultGenerics>({\n parentSet,\n requestedPageSize,\n returnedPage,\n messagePaginationOptions,\n}: MessagePaginationUpdatedParams<StreamChatGenerics>) => {\n const newPagination = { ...parentSet.pagination };\n\n let hasPrev;\n let hasNext;\n\n const [firstPageMsg, lastPageMsg] = [returnedPage[0], returnedPage.slice(-1)[0]];\n const [firstPageMsgIsFirstInSet, lastPageMsgIsLastInSet] = [\n firstPageMsg?.id && firstPageMsg.id === parentSet.messages[0]?.id,\n lastPageMsg?.id && lastPageMsg.id === parentSet.messages.slice(-1)[0]?.id,\n ];\n\n const queriedNextMessages =\n messagePaginationOptions &&\n (messagePaginationOptions.created_at_after_or_equal ||\n messagePaginationOptions.created_at_after ||\n messagePaginationOptions.id_gt ||\n messagePaginationOptions.id_gte);\n\n const queriedPrevMessages =\n typeof messagePaginationOptions === 'undefined'\n ? true\n : messagePaginationOptions.created_at_before_or_equal ||\n messagePaginationOptions.created_at_before ||\n messagePaginationOptions.id_lt ||\n messagePaginationOptions.id_lte ||\n messagePaginationOptions.offset;\n\n const containsUnrecognizedOptionsOnly =\n !queriedNextMessages &&\n !queriedPrevMessages &&\n !messagePaginationOptions?.id_around &&\n !messagePaginationOptions?.created_at_around;\n\n const hasMore = returnedPage.length >= requestedPageSize;\n\n if (typeof queriedPrevMessages !== 'undefined' || containsUnrecognizedOptionsOnly) {\n hasPrev = hasMore;\n }\n if (typeof queriedNextMessages !== 'undefined') {\n hasNext = hasMore;\n }\n const returnedPageIsEmpty = returnedPage.length === 0;\n\n if ((firstPageMsgIsFirstInSet || returnedPageIsEmpty) && typeof hasPrev !== 'undefined')\n newPagination.hasPrev = hasPrev;\n if ((lastPageMsgIsLastInSet || returnedPageIsEmpty) && typeof hasNext !== 'undefined')\n newPagination.hasNext = hasNext;\n\n return newPagination;\n};\n\nexport const messageSetPagination = <StreamChatGenerics extends ExtendableGenerics = DefaultGenerics>(\n params: MessagePaginationUpdatedParams<StreamChatGenerics>,\n) => {\n if (params.parentSet.messages.length < params.returnedPage.length) {\n params.logger?.('error', 'Corrupted message set state: parent set size < returned page size');\n return params.parentSet.pagination;\n }\n\n if (params.messagePaginationOptions?.created_at_around) {\n return messagePaginationCreatedAtAround(params);\n } else if (params.messagePaginationOptions?.id_around) {\n return messagePaginationIdAround(params);\n } else {\n return messagePaginationLinear(params);\n }\n};\n","export const DEFAULT_QUERY_CHANNELS_MESSAGE_LIST_PAGE_SIZE = 25;\nexport const DEFAULT_QUERY_CHANNEL_MESSAGE_LIST_PAGE_SIZE = 100;\n\nexport const DEFAULT_MESSAGE_SET_PAGINATION = { hasNext: false, hasPrev: false };\n","import { Channel } from './channel';\nimport {\n ChannelMemberResponse,\n DefaultGenerics,\n Event,\n ExtendableGenerics,\n FormatMessageResponse,\n MessageResponse,\n MessageSet,\n MessageSetType,\n PendingMessageResponse,\n ReactionResponse,\n UserResponse,\n} from './types';\nimport { addToMessageList, formatMessage } from './utils';\nimport { DEFAULT_MESSAGE_SET_PAGINATION } from './constants';\n\ntype ChannelReadStatus<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = Record<\n string,\n {\n last_read: Date;\n unread_messages: number;\n user: UserResponse<StreamChatGenerics>;\n first_unread_message_id?: string;\n last_read_message_id?: string;\n }\n>;\n\n/**\n * ChannelState - A container class for the channel state.\n */\nexport class ChannelState<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> {\n _channel: Channel<StreamChatGenerics>;\n watcher_count: number;\n typing: Record<string, Event<StreamChatGenerics>>;\n read: ChannelReadStatus<StreamChatGenerics>;\n pinnedMessages: Array<ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>>;\n pending_messages: Array<PendingMessageResponse<StreamChatGenerics>>;\n threads: Record<string, Array<ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>>>;\n mutedUsers: Array<UserResponse<StreamChatGenerics>>;\n watchers: Record<string, UserResponse<StreamChatGenerics>>;\n members: Record<string, ChannelMemberResponse<StreamChatGenerics>>;\n unreadCount: number;\n membership: ChannelMemberResponse<StreamChatGenerics>;\n last_message_at: Date | null;\n /**\n * Flag which indicates if channel state contain latest/recent messages or no.\n * This flag should be managed by UI sdks using a setter - setIsUpToDate.\n * When false, any new message (received by websocket event - message.new) will not\n * be pushed on to message list.\n */\n isUpToDate: boolean;\n /**\n * Disjoint lists of messages\n * Users can jump in the message list (with searching) and this can result in disjoint lists of messages\n * The state manages these lists and merges them when lists overlap\n * The messages array contains the currently active set\n */\n messageSets: MessageSet[] = [];\n\n constructor(channel: Channel<StreamChatGenerics>) {\n this._channel = channel;\n this.watcher_count = 0;\n this.typing = {};\n this.read = {};\n this.initMessages();\n this.pinnedMessages = [];\n this.pending_messages = [];\n this.threads = {};\n // a list of users to hide messages from\n this.mutedUsers = [];\n this.watchers = {};\n this.members = {};\n this.membership = {};\n this.unreadCount = 0;\n /**\n * Flag which indicates if channel state contain latest/recent messages or no.\n * This flag should be managed by UI sdks using a setter - setIsUpToDate.\n * When false, any new message (received by websocket event - message.new) will not\n * be pushed on to message list.\n */\n this.isUpToDate = true;\n this.last_message_at = channel?.state?.last_message_at != null ? new Date(channel.state.last_message_at) : null;\n }\n\n get messages() {\n return this.messageSets.find((s) => s.isCurrent)?.messages || [];\n }\n\n set messages(messages: Array<ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>>) {\n const index = this.messageSets.findIndex((s) => s.isCurrent);\n this.messageSets[index].messages = messages;\n }\n\n /**\n * The list of latest messages\n * The messages array not always contains the latest messages (for example if a user searched for an earlier message, that is in a different message set)\n */\n get latestMessages() {\n return this.messageSets.find((s) => s.isLatest)?.messages || [];\n }\n\n set latestMessages(messages: Array<ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>>) {\n const index = this.messageSets.findIndex((s) => s.isLatest);\n this.messageSets[index].messages = messages;\n }\n\n get messagePagination() {\n return this.messageSets.find((s) => s.isCurrent)?.pagination || DEFAULT_MESSAGE_SET_PAGINATION;\n }\n\n /**\n * addMessageSorted - Add a message to the state\n *\n * @param {MessageResponse<StreamChatGenerics>} newMessage A new message\n * @param {boolean} timestampChanged Whether updating a message with changed created_at value.\n * @param {boolean} addIfDoesNotExist Add message if it is not in the list, used to prevent out of order updated messages from being added.\n * @param {MessageSetType} messageSetToAddToIfDoesNotExist Which message set to add to if message is not in the list (only used if addIfDoesNotExist is true)\n */\n addMessageSorted(\n newMessage: MessageResponse<StreamChatGenerics>,\n timestampChanged = false,\n addIfDoesNotExist = true,\n messageSetToAddToIfDoesNotExist: MessageSetType = 'latest',\n ) {\n return this.addMessagesSorted(\n [newMessage],\n timestampChanged,\n false,\n addIfDoesNotExist,\n messageSetToAddToIfDoesNotExist,\n );\n }\n\n /**\n * Takes the message object, parses the dates, sets `__html`\n * and sets the status to `received` if missing; returns a new message object.\n *\n * @param {MessageResponse<StreamChatGenerics>} message `MessageResponse` object\n */\n formatMessage = (message: MessageResponse<StreamChatGenerics>) => formatMessage<StreamChatGenerics>(message);\n\n /**\n * addMessagesSorted - Add the list of messages to state and resorts the messages\n *\n * @param {Array<MessageResponse<StreamChatGenerics>>} newMessages A list of messages\n * @param {boolean} timestampChanged Whether updating messages with changed created_at value.\n * @param {boolean} initializing Whether channel is being initialized.\n * @param {boolean} addIfDoesNotExist Add message if it is not in the list, used to prevent out of order updated messages from being added.\n * @param {MessageSetType} messageSetToAddToIfDoesNotExist Which message set to add to if messages are not in the list (only used if addIfDoesNotExist is true)\n *\n */\n addMessagesSorted(\n newMessages: MessageResponse<StreamChatGenerics>[],\n timestampChanged = false,\n initializing = false,\n addIfDoesNotExist = true,\n messageSetToAddToIfDoesNotExist: MessageSetType = 'current',\n ) {\n const { messagesToAdd, targetMessageSetIndex } = this.findTargetMessageSet(\n newMessages,\n addIfDoesNotExist,\n messageSetToAddToIfDoesNotExist,\n );\n\n for (let i = 0; i < messagesToAdd.length; i += 1) {\n const isFromShadowBannedUser = messagesToAdd[i].shadowed;\n if (isFromShadowBannedUser) {\n continue;\n }\n // If message is already formatted we can skip the tasks below\n // This will be true for messages that are already present at the state -> this happens when we perform merging of message sets\n // This will be also true for message previews used by some SDKs\n const isMessageFormatted = messagesToAdd[i].created_at instanceof Date;\n let message: ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>;\n if (isMessageFormatted) {\n message = messagesToAdd[i] as ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>;\n } else {\n message = this.formatMessage(messagesToAdd[i] as MessageResponse<StreamChatGenerics>);\n\n if (message.user && this._channel?.cid) {\n /**\n * Store the reference to user for this channel, so that when we have to\n * handle updates to user, we can use the reference map, to determine which\n * channels need to be updated with updated user object.\n */\n this._channel.getClient().state.updateUserReference(message.user, this._channel.cid);\n }\n\n if (initializing && message.id && this.threads[message.id]) {\n // If we are initializing the state of channel (e.g., in case of connection recovery),\n // then in that case we remove thread related to this message from threads object.\n // This way we can ensure that we don't have any stale data in thread object\n // and consumer can refetch the replies.\n delete this.threads[message.id];\n }\n\n if (!this.last_message_at) {\n this.last_message_at = new Date(message.created_at.getTime());\n }\n\n if (message.created_at.getTime() > this.last_message_at.getTime()) {\n this.last_message_at = new Date(message.created_at.getTime());\n }\n }\n\n // update or append the messages...\n const parentID = message.parent_id;\n\n // add to the given message set\n if ((!parentID || message.show_in_channel) && targetMessageSetIndex !== -1) {\n this.messageSets[targetMessageSetIndex].messages = this._addToMessageList(\n this.messageSets[targetMessageSetIndex].messages,\n message,\n timestampChanged,\n 'created_at',\n addIfDoesNotExist,\n );\n }\n\n /**\n * Add message to thread if applicable and the message\n * was added when querying for replies, or the thread already exits.\n * This is to prevent the thread state from getting out of sync if\n * a thread message is shown in channel but older than the newest thread\n * message. This situation can result in a thread state where a random\n * message is \"oldest\" message, and newer messages are therefore not loaded.\n * This can also occur if an old thread message is updated.\n */\n if (parentID && !initializing) {\n const thread = this.threads[parentID] || [];\n this.threads[parentID] = this._addToMessageList(\n thread,\n message,\n timestampChanged,\n 'created_at',\n addIfDoesNotExist,\n );\n }\n }\n\n return {\n messageSet: this.messageSets[targetMessageSetIndex],\n };\n }\n\n /**\n * addPinnedMessages - adds messages in pinnedMessages property\n *\n * @param {Array<MessageResponse<StreamChatGenerics>>} pinnedMessages A list of pinned messages\n *\n */\n addPinnedMessages(pinnedMessages: MessageResponse<StreamChatGenerics>[]) {\n for (let i = 0; i < pinnedMessages.length; i += 1) {\n this.addPinnedMessage(pinnedMessages[i]);\n }\n }\n\n /**\n * addPinnedMessage - adds message in pinnedMessages\n *\n * @param {MessageResponse<StreamChatGenerics>} pinnedMessage message to update\n *\n */\n addPinnedMessage(pinnedMessage: MessageResponse<StreamChatGenerics>) {\n this.pinnedMessages = this._addToMessageList(\n this.pinnedMessages,\n this.formatMessage(pinnedMessage),\n false,\n 'pinned_at',\n );\n }\n\n /**\n * removePinnedMessage - removes pinned message from pinnedMessages\n *\n * @param {MessageResponse<StreamChatGenerics>} message message to remove\n *\n */\n removePinnedMessage(message: MessageResponse<StreamChatGenerics>) {\n const { result } = this.removeMessageFromArray(this.pinnedMessages, message);\n this.pinnedMessages = result;\n }\n\n addReaction(\n reaction: ReactionResponse<StreamChatGenerics>,\n message?: MessageResponse<StreamChatGenerics>,\n enforce_unique?: boolean,\n ) {\n if (!message) return;\n const messageWithReaction = message;\n this._updateMessage(message, (msg) => {\n messageWithReaction.own_reactions = this._addOwnReactionToMessage(msg.own_reactions, reaction, enforce_unique);\n return this.formatMessage(messageWithReaction);\n });\n return messageWithReaction;\n }\n\n _addOwnReactionToMessage(\n ownReactions: ReactionResponse<StreamChatGenerics>[] | null | undefined,\n reaction: ReactionResponse<StreamChatGenerics>,\n enforce_unique?: boolean,\n ) {\n if (enforce_unique) {\n ownReactions = [];\n } else {\n ownReactions = this._removeOwnReactionFromMessage(ownReactions, reaction);\n }\n\n ownReactions = ownReactions || [];\n if (this._channel.getClient().userID === reaction.user_id) {\n ownReactions.push(reaction);\n }\n\n return ownReactions;\n }\n\n _removeOwnReactionFromMessage(\n ownReactions: ReactionResponse<StreamChatGenerics>[] | null | undefined,\n reaction: ReactionResponse<StreamChatGenerics>,\n ) {\n if (ownReactions) {\n return ownReactions.filter((item) => item.user_id !== reaction.user_id || item.type !== reaction.type);\n }\n return ownReactions;\n }\n\n removeReaction(reaction: ReactionResponse<StreamChatGenerics>, message?: MessageResponse<StreamChatGenerics>) {\n if (!message) return;\n const messageWithReaction = message;\n this._updateMessage(message, (msg) => {\n messageWithReaction.own_reactions = this._removeOwnReactionFromMessage(msg.own_reactions, reaction);\n return this.formatMessage(messageWithReaction);\n });\n return messageWithReaction;\n }\n\n _updateQuotedMessageReferences({\n message,\n remove,\n }: {\n message: MessageResponse<StreamChatGenerics>;\n remove?: boolean;\n }) {\n const parseMessage = (m: ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>) =>\n (({\n ...m,\n created_at: m.created_at.toISOString(),\n pinned_at: m.pinned_at?.toISOString(),\n updated_at: m.updated_at?.toISOString(),\n } as unknown) as MessageResponse<StreamChatGenerics>);\n\n const update = (messages: FormatMessageResponse<StreamChatGenerics>[]) => {\n const updatedMessages = messages.reduce<MessageResponse<StreamChatGenerics>[]>((acc, msg) => {\n if (msg.quoted_message_id === message.id) {\n acc.push({ ...parseMessage(msg), quoted_message: remove ? { ...message, attachments: [] } : message });\n }\n return acc;\n }, []);\n this.addMessagesSorted(updatedMessages, true);\n };\n\n if (!message.parent_id) {\n this.messageSets.forEach((set) => update(set.messages));\n } else if (message.parent_id && this.threads[message.parent_id]) {\n // prevent going through all the threads even though it is possible to quote a message from another thread\n update(this.threads[message.parent_id]);\n }\n }\n\n removeQuotedMessageReferences(message: MessageResponse<StreamChatGenerics>) {\n this._updateQuotedMessageReferences({ message, remove: true });\n }\n\n /**\n * Updates all instances of given message in channel state\n * @param message\n * @param updateFunc\n */\n _updateMessage(\n message: {\n id?: string;\n parent_id?: string;\n pinned?: boolean;\n show_in_channel?: boolean;\n },\n updateFunc: (\n msg: ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>,\n ) => ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>,\n ) {\n const { parent_id, show_in_channel, pinned } = message;\n\n if (parent_id && this.threads[parent_id]) {\n const thread = this.threads[parent_id];\n const msgIndex = thread.findIndex((msg) => msg.id === message.id);\n if (msgIndex !== -1) {\n thread[msgIndex] = updateFunc(thread[msgIndex]);\n this.threads[parent_id] = thread;\n }\n }\n\n if ((!show_in_channel && !parent_id) || show_in_channel) {\n const messageSetIndex = this.findMessageSetIndex(message);\n if (messageSetIndex !== -1) {\n const msgIndex = this.messageSets[messageSetIndex].messages.findIndex((msg) => msg.id === message.id);\n if (msgIndex !== -1) {\n this.messageSets[messageSetIndex].messages[msgIndex] = updateFunc(\n this.messageSets[messageSetIndex].messages[msgIndex],\n );\n }\n }\n }\n\n if (pinned) {\n const msgIndex = this.pinnedMessages.findIndex((msg) => msg.id === message.id);\n if (msgIndex !== -1) {\n this.pinnedMessages[msgIndex] = updateFunc(this.pinnedMessages[msgIndex]);\n }\n }\n }\n\n /**\n * Setter for isUpToDate.\n *\n * @param isUpToDate Flag which indicates if channel state contain latest/recent messages or no.\n * This flag should be managed by UI sdks using a setter - setIsUpToDate.\n * When false, any new message (received by websocket event - message.new) will not\n * be pushed on to message list.\n */\n setIsUpToDate = (isUpToDate: boolean) => {\n this.isUpToDate = isUpToDate;\n };\n\n /**\n * _addToMessageList - Adds a message to a list of messages, tries to update first, appends if message isn't found\n *\n * @param {Array<ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>>} messages A list of messages\n * @param message\n * @param {boolean} timestampChanged Whether updating a message with changed created_at value.\n * @param {string} sortBy field name to use to sort the messages by\n * @param {boolean} addIfDoesNotExist Add message if it is not in the list, used to prevent out of order updated messages from being added.\n */\n _addToMessageList(\n messages: Array<ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>>,\n message: ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>,\n timestampChanged = false,\n sortBy: 'pinned_at' | 'created_at' = 'created_at',\n addIfDoesNotExist = true,\n ) {\n return addToMessageList(messages, message, timestampChanged, sortBy, addIfDoesNotExist);\n }\n\n /**\n * removeMessage - Description\n *\n * @param {{ id: string; parent_id?: string }} messageToRemove Object of the message to remove. Needs to have at id specified.\n *\n * @return {boolean} Returns if the message was removed\n */\n removeMessage(messageToRemove: { id: string; messageSetIndex?: number; parent_id?: string }) {\n let isRemoved = false;\n if (messageToRemove.parent_id && this.threads[messageToRemove.parent_id]) {\n const { removed, result: threadMessages } = this.removeMessageFromArray(\n this.threads[messageToRemove.parent_id],\n messageToRemove,\n );\n\n this.threads[messageToRemove.parent_id] = threadMessages;\n isRemoved = removed;\n } else {\n const messageSetIndex = messageToRemove.messageSetIndex ?? this.findMessageSetIndex(messageToRemove);\n if (messageSetIndex !== -1) {\n const { removed, result: messages } = this.removeMessageFromArray(\n this.messageSets[messageSetIndex].messages,\n messageToRemove,\n );\n this.messageSets[messageSetIndex].messages = messages;\n isRemoved = removed;\n }\n }\n\n return isRemoved;\n }\n\n removeMessageFromArray = (\n msgArray: Array<ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>>,\n msg: { id: string; parent_id?: string },\n ) => {\n const result = msgArray.filter((message) => !(!!message.id && !!msg.id && message.id === msg.id));\n\n return { removed: result.length < msgArray.length, result };\n };\n\n /**\n * Updates the message.user property with updated user object, for messages.\n *\n * @param {UserResponse<StreamChatGenerics>} user\n */\n updateUserMessages = (user: UserResponse<StreamChatGenerics>) => {\n const _updateUserMessages = (\n messages: Array<ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>>,\n user: UserResponse<StreamChatGenerics>,\n ) => {\n for (let i = 0; i < messages.length; i++) {\n const m = messages[i];\n if (m.user?.id === user.id) {\n messages[i] = { ...m, user };\n }\n }\n };\n\n this.messageSets.forEach((set) => _updateUserMessages(set.messages, user));\n\n for (const parentId in this.threads) {\n _updateUserMessages(this.threads[parentId], user);\n }\n\n _updateUserMessages(this.pinnedMessages, user);\n };\n\n /**\n * Marks the messages as deleted, from deleted user.\n *\n * @param {UserResponse<StreamChatGenerics>} user\n * @param {boolean} hardDelete\n */\n deleteUserMessages = (user: UserResponse<StreamChatGenerics>, hardDelete = false) => {\n const _deleteUserMessages = (\n messages: Array<ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>>,\n user: UserResponse<StreamChatGenerics>,\n hardDelete = false,\n ) => {\n for (let i = 0; i < messages.length; i++) {\n const m = messages[i];\n if (m.user?.id !== user.id) {\n continue;\n }\n\n if (hardDelete) {\n /**\n * In case of hard delete, we need to strip down all text, html,\n * attachments and all the custom properties on message\n */\n messages[i] = ({\n cid: m.cid,\n created_at: m.created_at,\n deleted_at: user.deleted_at,\n id: m.id,\n latest_reactions: [],\n mentioned_users: [],\n own_reactions: [],\n parent_id: m.parent_id,\n reply_count: m.reply_count,\n status: m.status,\n thread_participants: m.thread_participants,\n type: 'deleted',\n updated_at: m.updated_at,\n user: m.user,\n } as unknown) as ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>;\n } else {\n messages[i] = {\n ...m,\n type: 'deleted',\n deleted_at: user.deleted_at ? new Date(user.deleted_at) : null,\n };\n }\n }\n };\n\n this.messageSets.forEach((set) => _deleteUserMessages(set.messages, user, hardDelete));\n\n for (const parentId in this.threads) {\n _deleteUserMessages(this.threads[parentId], user, hardDelete);\n }\n\n _deleteUserMessages(this.pinnedMessages, user, hardDelete);\n };\n\n /**\n * filterErrorMessages - Removes error messages from the channel state.\n *\n */\n filterErrorMessages() {\n const filteredMessages = this.latestMessages.filter((message) => message.type !== 'error');\n\n this.latestMessages = filteredMessages;\n }\n\n /**\n * clean - Remove stale data such as users that stayed in typing state for more than 5 seconds\n */\n clean() {\n const now = new Date();\n // prevent old users from showing up as typing\n for (const [userID, lastEvent] of Object.entries(this.typing)) {\n const receivedAt =\n typeof lastEvent.received_at === 'string'\n ? new Date(lastEvent.received_at)\n : lastEvent.received_at || new Date();\n if (now.getTime() - receivedAt.getTime() > 7000) {\n delete this.typing[userID];\n this._channel.getClient().dispatchEvent({\n cid: this._channel.cid,\n type: 'typing.stop',\n user: { id: userID },\n } as Event<StreamChatGenerics>);\n }\n }\n }\n\n clearMessages() {\n this.initMessages();\n this.pinnedMessages = [];\n }\n\n initMessages() {\n this.messageSets = [{ messages: [], isLatest: true, isCurrent: true, pagination: DEFAULT_MESSAGE_SET_PAGINATION }];\n }\n\n /**\n * loadMessageIntoState - Loads a given message (and messages around it) into the state\n *\n * @param {string} messageId The id of the message, or 'latest' to indicate switching to the latest messages\n * @param {string} parentMessageId The id of the parent message, if we want load a thread reply\n * @param {number} limit The page size if the message has to be queried from the server\n */\n async loadMessageIntoState(messageId: string | 'latest', parentMessageId?: string, limit = 25) {\n let messageSetIndex: number;\n let switchedToMessageSet = false;\n let loadedMessageThread = false;\n const messageIdToFind = parentMessageId || messageId;\n if (messageId === 'latest') {\n if (this.messages === this.latestMessages) {\n return;\n }\n messageSetIndex = this.messageSets.findIndex((s) => s.isLatest);\n } else {\n messageSetIndex = this.findMessageSetIndex({ id: messageIdToFind });\n }\n if (messageSetIndex !== -1) {\n this.switchToMessageSet(messageSetIndex);\n switchedToMessageSet = true;\n }\n loadedMessageThread = !parentMessageId || !!this.threads[parentMessageId]?.find((m) => m.id === messageId);\n if (switchedToMessageSet && loadedMessageThread) {\n return;\n }\n if (!switchedToMessageSet) {\n await this._channel.query({ messages: { id_around: messageIdToFind, limit } }, 'new');\n }\n if (!loadedMessageThread && parentMessageId) {\n await this._channel.getReplies(parentMessageId, { id_around: messageId, limit });\n }\n messageSetIndex = this.findMessageSetIndex({ id: messageIdToFind });\n if (messageSetIndex !== -1) {\n this.switchToMessageSet(messageSetIndex);\n }\n }\n\n /**\n * findMessage - Finds a message inside the state\n *\n * @param {string} messageId The id of the message\n * @param {string} parentMessageId The id of the parent message, if we want load a thread reply\n *\n * @return {ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>} Returns the message, or undefined if the message wasn't found\n */\n findMessage(messageId: string, parentMessageId?: string) {\n if (parentMessageId) {\n const messages = this.threads[parentMessageId];\n if (!messages) {\n return undefined;\n }\n return messages.find((m) => m.id === messageId);\n }\n\n const messageSetIndex = this.findMessageSetIndex({ id: messageId });\n if (messageSetIndex === -1) {\n return undefined;\n }\n return this.messageSets[messageSetIndex].messages.find((m) => m.id === messageId);\n }\n\n private switchToMessageSet(index: number) {\n const currentMessages = this.messageSets.find((s) => s.isCurrent);\n if (!currentMessages) {\n return;\n }\n currentMessages.isCurrent = false;\n this.messageSets[index].isCurrent = true;\n }\n\n private areMessageSetsOverlap(messages1: Array<{ id: string }>, messages2: Array<{ id: string }>) {\n return messages1.some((m1) => messages2.find((m2) => m1.id === m2.id));\n }\n\n private findMessageSetIndex(message: { id?: string }) {\n return this.messageSets.findIndex((set) => !!set.messages.find((m) => m.id === message.id));\n }\n\n private findTargetMessageSet(\n newMessages: MessageResponse<StreamChatGenerics>[],\n addIfDoesNotExist = true,\n messageSetToAddToIfDoesNotExist: MessageSetType = 'current',\n ) {\n let messagesToAdd: (\n | MessageResponse<StreamChatGenerics>\n | ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>\n )[] = newMessages;\n let targetMessageSetIndex!: number;\n if (addIfDoesNotExist) {\n const overlappingMessageSetIndices = this.messageSets\n .map((_, i) => i)\n .filter((i) => this.areMessageSetsOverlap(this.messageSets[i].messages, newMessages));\n switch (messageSetToAddToIfDoesNotExist) {\n case 'new':\n if (overlappingMessageSetIndices.length > 0) {\n targetMessageSetIndex = overlappingMessageSetIndices[0];\n // No new message set is created if newMessages only contains thread replies\n } else if (newMessages.some((m) => !m.parent_id)) {\n this.messageSets.push({\n messages: [],\n isCurrent: false,\n isLatest: false,\n pagination: DEFAULT_MESSAGE_SET_PAGINATION,\n });\n targetMessageSetIndex = this.messageSets.length - 1;\n }\n break;\n case 'current':\n targetMessageSetIndex = this.messageSets.findIndex((s) => s.isCurrent);\n break;\n case 'latest':\n targetMessageSetIndex = this.messageSets.findIndex((s) => s.isLatest);\n break;\n default:\n targetMessageSetIndex = -1;\n }\n // when merging the target set will be the first one from the overlapping message sets\n const mergeTargetMessageSetIndex = overlappingMessageSetIndices.splice(0, 1)[0];\n const mergeSourceMessageSetIndices = [...overlappingMessageSetIndices];\n if (mergeTargetMessageSetIndex !== undefined && mergeTargetMessageSetIndex !== targetMessageSetIndex) {\n mergeSourceMessageSetIndices.push(targetMessageSetIndex);\n }\n // merge message sets\n if (mergeSourceMessageSetIndices.length > 0) {\n const target = this.messageSets[mergeTargetMessageSetIndex];\n const sources = this.messageSets.filter((_, i) => mergeSourceMessageSetIndices.indexOf(i) !== -1);\n sources.forEach((messageSet) => {\n target.isLatest = target.isLatest || messageSet.isLatest;\n target.isCurrent = target.isCurrent || messageSet.isCurrent;\n target.pagination.hasPrev =\n messageSet.messages[0].created_at < target.messages[0].created_at\n ? messageSet.pagination.hasPrev\n : target.pagination.hasPrev;\n target.pagination.hasNext =\n target.messages.slice(-1)[0].created_at < messageSet.messages.slice(-1)[0].created_at\n ? messageSet.pagination.hasNext\n : target.pagination.hasNext;\n messagesToAdd = [...messagesToAdd, ...messageSet.messages];\n });\n sources.forEach((s) => this.messageSets.splice(this.messageSets.indexOf(s), 1));\n const overlappingMessageSetIndex = this.messageSets.findIndex((s) =>\n this.areMessageSetsOverlap(s.messages, newMessages),\n );\n targetMessageSetIndex = overlappingMessageSetIndex;\n }\n } else {\n // assumes that all new messages belong to the same set\n targetMessageSetIndex = this.findMessageSetIndex(newMessages[0]);\n }\n\n return { targetMessageSetIndex, messagesToAdd };\n }\n}\n","import { ChannelState } from './channel_state';\nimport { logChatPromiseExecution, messageSetPagination, normalizeQuerySort } from './utils';\nimport { StreamChat } from './client';\nimport {\n APIResponse,\n BanUserOptions,\n ChannelAPIResponse,\n ChannelData,\n ChannelFilters,\n ChannelMemberAPIResponse,\n ChannelMemberResponse,\n ChannelQueryOptions,\n ChannelResponse,\n ChannelUpdateOptions,\n CreateCallOptions,\n CreateCallResponse,\n DefaultGenerics,\n DeleteChannelAPIResponse,\n Event,\n EventAPIResponse,\n EventHandler,\n EventTypes,\n ExtendableGenerics,\n FormatMessageResponse,\n GetMultipleMessagesAPIResponse,\n GetReactionsAPIResponse,\n GetRepliesAPIResponse,\n InviteOptions,\n MarkReadOptions,\n MarkUnreadOptions,\n MemberFilters,\n MemberSort,\n Message,\n MessageFilters,\n MessagePaginationOptions,\n MessageResponse,\n MessageSetType,\n MuteChannelAPIResponse,\n NewMemberPayload,\n PartialUpdateChannel,\n PartialUpdateChannelAPIResponse,\n PartialUpdateMember,\n PinnedMessagePaginationOptions,\n PinnedMessagesSort,\n QueryMembersOptions,\n Reaction,\n ReactionAPIResponse,\n SearchAPIResponse,\n SearchMessageSortBase,\n SearchOptions,\n SearchPayload,\n SendMessageAPIResponse,\n TruncateChannelAPIResponse,\n TruncateOptions,\n UpdateChannelAPIResponse,\n UserResponse,\n QueryChannelAPIResponse,\n PollVoteData,\n SendMessageOptions,\n AscDesc,\n PartialUpdateMemberAPIResponse,\n AIState,\n MessageOptions,\n PushPreference,\n} from './types';\nimport { Role } from './permissions';\nimport { DEFAULT_QUERY_CHANNEL_MESSAGE_LIST_PAGE_SIZE } from './constants';\n\n/**\n * Channel - The Channel class manages it's own state.\n */\nexport class Channel<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> {\n _client: StreamChat<StreamChatGenerics>;\n type: string;\n id: string | undefined;\n data: ChannelData<StreamChatGenerics> | ChannelResponse<StreamChatGenerics> | undefined;\n _data: ChannelData<StreamChatGenerics> | ChannelResponse<StreamChatGenerics>;\n cid: string;\n /** */\n listeners: { [key: string]: (string | EventHandler<StreamChatGenerics>)[] };\n state: ChannelState<StreamChatGenerics>;\n /**\n * This boolean is a vague indication of weather the channel exists on chat backend.\n *\n * If the value is true, then that means the channel has been initialized by either calling\n * channel.create() or channel.query() or channel.watch().\n *\n * If the value is false, then channel may or may not exist on the backend. The only way to ensure\n * is by calling channel.create() or channel.query() or channel.watch().\n */\n initialized: boolean;\n /**\n * Indicates weather channel has been initialized by manually populating the state with some messages, members etc.\n * Static state indicates that channel exists on backend, but is not being watched yet.\n */\n offlineMode: boolean;\n lastKeyStroke?: Date;\n lastTypingEvent: Date | null;\n isTyping: boolean;\n disconnected: boolean;\n push_preferences?: PushPreference;\n\n /**\n * constructor - Create a channel\n *\n * @param {StreamChat<StreamChatGenerics>} client the chat client\n * @param {string} type the type of channel\n * @param {string} [id] the id of the chat\n * @param {ChannelData<StreamChatGenerics>} data any additional custom params\n *\n * @return {Channel<StreamChatGenerics>} Returns a new uninitialized channel\n */\n constructor(\n client: StreamChat<StreamChatGenerics>,\n type: string,\n id: string | undefined,\n data: ChannelData<StreamChatGenerics>,\n ) {\n const validTypeRe = /^[\\w_-]+$/;\n const validIDRe = /^[\\w!_-]+$/;\n\n if (!validTypeRe.test(type)) {\n throw new Error(`Invalid chat type ${type}, letters, numbers and \"_-\" are allowed`);\n }\n if (typeof id === 'string' && !validIDRe.test(id)) {\n throw new Error(`Invalid chat id ${id}, letters, numbers and \"!-_\" are allowed`);\n }\n\n this._client = client;\n this.type = type;\n this.id = id;\n // used by the frontend, gets updated:\n this.data = data;\n // this._data is used for the requests...\n this._data = { ...data };\n this.cid = `${type}:${id}`;\n this.listeners = {};\n // perhaps the state variable should be private\n this.state = new ChannelState<StreamChatGenerics>(this);\n this.initialized = false;\n this.offlineMode = false;\n this.lastTypingEvent = null;\n this.isTyping = false;\n this.disconnected = false;\n }\n\n /**\n * getClient - Get the chat client for this channel. If client.disconnect() was called, this function will error\n *\n * @return {StreamChat<StreamChatGenerics>}\n */\n getClient(): StreamChat<StreamChatGenerics> {\n if (this.disconnected === true) {\n throw Error(`You can't use a channel after client.disconnect() was called`);\n }\n return this._client;\n }\n\n /**\n * getConfig - Get the config for this channel id (cid)\n *\n * @return {Record<string, unknown>}\n */\n getConfig() {\n const client = this.getClient();\n return client.configs[this.cid];\n }\n\n /**\n * sendMessage - Send a message to this channel\n *\n * @param {Message<StreamChatGenerics>} message The Message object\n * @param {boolean} [options.skip_enrich_url] Do not try to enrich the URLs within message\n * @param {boolean} [options.skip_push] Skip sending push notifications\n * @param {boolean} [options.is_pending_message] DEPRECATED, please use `pending` instead.\n * @param {boolean} [options.pending] Make this message pending\n * @param {Record<string,string>} [options.pending_message_metadata] Metadata for the pending message\n * @param {boolean} [options.force_moderation] Apply force moderation for server-side requests\n *\n * @return {Promise<SendMessageAPIResponse<StreamChatGenerics>>} The Server Response\n */\n async sendMessage(message: Message<StreamChatGenerics>, options?: SendMessageOptions) {\n return await this.getClient().post<SendMessageAPIResponse<StreamChatGenerics>>(this._channelURL() + '/message', {\n message,\n ...options,\n });\n }\n\n sendFile(\n uri: string | NodeJS.ReadableStream | Buffer | File,\n name?: string,\n contentType?: string,\n user?: UserResponse<StreamChatGenerics>,\n ) {\n return this.getClient().sendFile(`${this._channelURL()}/file`, uri, name, contentType, user);\n }\n\n sendImage(\n uri: string | NodeJS.ReadableStream | File,\n name?: string,\n contentType?: string,\n user?: UserResponse<StreamChatGenerics>,\n ) {\n return this.getClient().sendFile(`${this._channelURL()}/image`, uri, name, contentType, user);\n }\n\n deleteFile(url: string) {\n return this.getClient().delete<APIResponse>(`${this._channelURL()}/file`, { url });\n }\n\n deleteImage(url: string) {\n return this.getClient().delete<APIResponse>(`${this._channelURL()}/image`, { url });\n }\n\n /**\n * sendEvent - Send an event on this channel\n *\n * @param {Event<StreamChatGenerics>} event for example {type: 'message.read'}\n *\n * @return {Promise<EventAPIResponse<StreamChatGenerics>>} The Server Response\n */\n async sendEvent(event: Event<StreamChatGenerics>) {\n this._checkInitialized();\n return await this.getClient().post<EventAPIResponse<StreamChatGenerics>>(this._channelURL() + '/event', {\n event,\n });\n }\n\n /**\n * search - Query messages\n *\n * @param {MessageFilters<StreamChatGenerics> | string} query search query or object MongoDB style filters\n * @param {{client_id?: string; connection_id?: string; query?: string; message_filter_conditions?: MessageFilters<StreamChatGenerics>}} options Option object, {user_id: 'tommaso'}\n *\n * @return {Promise<SearchAPIResponse<StreamChatGenerics>>} search messages response\n */\n async search(\n query: MessageFilters<StreamChatGenerics> | string,\n options: SearchOptions<StreamChatGenerics> & {\n client_id?: string;\n connection_id?: string;\n message_filter_conditions?: MessageFilters<StreamChatGenerics>;\n message_options?: MessageOptions;\n query?: string;\n } = {},\n ) {\n if (options.offset && options.next) {\n throw Error(`Cannot specify offset with next`);\n }\n // Return a list of channels\n const payload: SearchPayload<StreamChatGenerics> = {\n filter_conditions: { cid: this.cid } as ChannelFilters<StreamChatGenerics>,\n ...options,\n sort: options.sort ? normalizeQuerySort<SearchMessageSortBase<StreamChatGenerics>>(options.sort) : undefined,\n };\n if (typeof query === 'string') {\n payload.query = query;\n } else if (typeof query === 'object') {\n payload.message_filter_conditions = query;\n } else {\n throw Error(`Invalid type ${typeof query} for query parameter`);\n }\n // Make sure we wait for the connect promise if there is a pending one\n await this.getClient().wsPromise;\n\n return await this.getClient().get<SearchAPIResponse<StreamChatGenerics>>(this.getClient().baseURL + '/search', {\n payload,\n });\n }\n\n /**\n * queryMembers - Query Members\n *\n * @param {MemberFilters<StreamChatGenerics>} filterConditions object MongoDB style filters\n * @param {MemberSort<StreamChatGenerics>} [sort] Sort options, for instance [{created_at: -1}].\n * When using multiple fields, make sure you use array of objects to guarantee field order, for instance [{name: -1}, {created_at: 1}]\n * @param {{ limit?: number; offset?: number }} [options] Option object, {limit: 10, offset:10}\n *\n * @return {Promise<ChannelMemberAPIResponse<StreamChatGenerics>>} Query Members response\n */\n async queryMembers(\n filterConditions: MemberFilters<StreamChatGenerics>,\n sort: MemberSort<StreamChatGenerics> = [],\n options: QueryMembersOptions = {},\n ) {\n let id: string | undefined;\n const type = this.type;\n let members: string[] | ChannelMemberResponse<StreamChatGenerics>[] | undefined;\n if (this.id) {\n id = this.id;\n } else if (this.data?.members && Array.isArray(this.data.members)) {\n members = this.data.members;\n }\n // Return a list of members\n return await this.getClient().get<ChannelMemberAPIResponse<StreamChatGenerics>>(\n this.getClient().baseURL + '/members',\n {\n payload: {\n type,\n id,\n members,\n sort: normalizeQuerySort(sort),\n filter_conditions: filterConditions,\n ...options,\n },\n },\n );\n }\n\n /**\n * partialUpdateMember - Partial update a member\n *\n * @param {string} user_id member user id\n * @param {PartialUpdateMember<StreamChatGenerics>} updates\n *\n * @return {Promise<ChannelMemberResponse<StreamChatGenerics>>} Updated member\n */\n async partialUpdateMember(user_id: string, updates: PartialUpdateMember<StreamChatGenerics>) {\n if (!user_id) {\n throw Error('Please specify the user id');\n }\n\n return await this.getClient().patch<PartialUpdateMemberAPIResponse<StreamChatGenerics>>(\n this._channelURL() + `/member/${encodeURIComponent(user_id)}`,\n updates,\n );\n }\n\n /**\n * sendReaction - Send a reaction about a message\n *\n * @param {string} messageID the message id\n * @param {Reaction<StreamChatGenerics>} reaction the reaction object for instance {type: 'love'}\n * @param {{ enforce_unique?: boolean, skip_push?: boolean }} [options] Option object, {enforce_unique: true, skip_push: true} to override any existing reaction or skip sending push notifications\n *\n * @return {Promise<ReactionAPIResponse<StreamChatGenerics>>} The Server Response\n */\n async sendReaction(\n messageID: string,\n reaction: Reaction<StreamChatGenerics>,\n options?: { enforce_unique?: boolean; skip_push?: boolean },\n ) {\n if (!messageID) {\n throw Error(`Message id is missing`);\n }\n if (!reaction || Object.keys(reaction).length === 0) {\n throw Error(`Reaction object is missing`);\n }\n return await this.getClient().post<ReactionAPIResponse<StreamChatGenerics>>(\n this.getClient().baseURL + `/messages/${encodeURIComponent(messageID)}/reaction`,\n {\n reaction,\n ...options,\n },\n );\n }\n\n /**\n * deleteReaction - Delete a reaction by user and type\n *\n * @param {string} messageID the id of the message from which te remove the reaction\n * @param {string} reactionType the type of reaction that should be removed\n * @param {string} [user_id] the id of the user (used only for server side request) default null\n *\n * @return {Promise<ReactionAPIResponse<StreamChatGenerics>>} The Server Response\n */\n deleteReaction(messageID: string, reactionType: string, user_id?: string) {\n this._checkInitialized();\n if (!reactionType || !messageID) {\n throw Error('Deleting a reaction requires specifying both the message and reaction type');\n }\n\n const url =\n this.getClient().baseURL +\n `/messages/${encodeURIComponent(messageID)}/reaction/${encodeURIComponent(reactionType)}`;\n //provided when server side request\n if (user_id) {\n return this.getClient().delete<ReactionAPIResponse<StreamChatGenerics>>(url, { user_id });\n }\n\n return this.getClient().delete<ReactionAPIResponse<StreamChatGenerics>>(url, {});\n }\n\n /**\n * update - Edit the channel's custom properties\n *\n * @param {ChannelData<StreamChatGenerics>} channelData The object to update the custom properties of this channel with\n * @param {Message<StreamChatGenerics>} [updateMessage] Optional message object for channel members notification\n * @param {ChannelUpdateOptions} [options] Option object, configuration to control the behavior while updating\n * @return {Promise<UpdateChannelAPIResponse<StreamChatGenerics>>} The server response\n */\n async update(\n channelData: Partial<ChannelData<StreamChatGenerics>> | Partial<ChannelResponse<StreamChatGenerics>> = {},\n updateMessage?: Message<StreamChatGenerics>,\n options?: ChannelUpdateOptions,\n ) {\n // Strip out reserved names that will result in API errors.\n const reserved = [\n 'config',\n 'cid',\n 'created_by',\n 'id',\n 'member_count',\n 'type',\n 'created_at',\n 'updated_at',\n 'last_message_at',\n 'own_capabilities',\n ];\n reserved.forEach((key) => {\n delete channelData[key];\n });\n\n return await this._update({\n message: updateMessage,\n data: channelData,\n ...options,\n });\n }\n\n /**\n * updatePartial - partial update channel properties\n *\n * @param {PartialUpdateChannel<StreamChatGenerics>} partial update request\n *\n * @return {Promise<PartialUpdateChannelAPIResponse<StreamChatGenerics>>}\n */\n async updatePartial(update: PartialUpdateChannel<StreamChatGenerics>) {\n const data = await this.getClient().patch<PartialUpdateChannelAPIResponse<StreamChatGenerics>>(\n this._channelURL(),\n update,\n );\n\n const areCapabilitiesChanged =\n [...(data.channel.own_capabilities || [])].sort().join() !==\n [...(Array.isArray(this.data?.own_capabilities) ? (this.data?.own_capabilities as string[]) : [])].sort().join();\n this.data = data.channel;\n // If the capabiltities are changed, we trigger the `capabilities.changed` event.\n if (areCapabilitiesChanged) {\n this.getClient().dispatchEvent({\n type: 'capabilities.changed',\n cid: this.cid,\n own_capabilities: data.channel.own_capabilities,\n });\n }\n return data;\n }\n\n /**\n * enableSlowMode - enable slow mode\n *\n * @param {number} coolDownInterval the cooldown interval in seconds\n * @return {Promise<UpdateChannelAPIResponse<StreamChatGenerics>>} The server response\n */\n async enableSlowMode(coolDownInterval: number) {\n const data = await this.getClient().post<UpdateChannelAPIResponse<StreamChatGenerics>>(this._channelURL(), {\n cooldown: coolDownInterval,\n });\n this.data = data.channel;\n return data;\n }\n\n /**\n * disableSlowMode - disable slow mode\n *\n * @return {Promise<UpdateChannelAPIResponse<StreamChatGenerics>>} The server response\n */\n async disableSlowMode() {\n const data = await this.getClient().post<UpdateChannelAPIResponse<StreamChatGenerics>>(this._channelURL(), {\n cooldown: 0,\n });\n this.data = data.channel;\n return data;\n }\n\n /**\n * delete - Delete the channel. Messages are permanently removed.\n *\n * @param {boolean} [options.hard_delete] Defines if the channel is hard deleted or not\n *\n * @return {Promise<DeleteChannelAPIResponse<StreamChatGenerics>>} The server response\n */\n async delete(options: { hard_delete?: boolean } = {}) {\n return await this.getClient().delete<DeleteChannelAPIResponse<StreamChatGenerics>>(this._channelURL(), {\n ...options,\n });\n }\n\n /**\n * truncate - Removes all messages from the channel\n * @param {TruncateOptions<StreamChatGenerics>} [options] Defines truncation options\n * @return {Promise<TruncateChannelAPIResponse<StreamChatGenerics>>} The server response\n */\n async truncate(options: TruncateOptions<StreamChatGenerics> = {}) {\n return await this.getClient().post<TruncateChannelAPIResponse<StreamChatGenerics>>(\n this._channelURL() + '/truncate',\n options,\n );\n }\n\n /**\n * acceptInvite - accept invitation to the channel\n *\n * @param {InviteOptions<StreamChatGenerics>} [options] The object to update the custom properties of this channel with\n *\n * @return {Promise<UpdateChannelAPIResponse<StreamChatGenerics>>} The server response\n */\n async acceptInvite(options: InviteOptions<StreamChatGenerics> = {}) {\n return await this._update({ accept_invite: true, ...options });\n }\n\n /**\n * rejectInvite - reject invitation to the channel\n *\n * @param {InviteOptions<StreamChatGenerics>} [options] The object to update the custom properties of this channel with\n *\n * @return {Promise<UpdateChannelAPIResponse<StreamChatGenerics>>} The server response\n */\n async rejectInvite(options: InviteOptions<StreamChatGenerics> = {}) {\n return await this._update({ reject_invite: true, ...options });\n }\n\n /**\n * addMembers - add members to the channel\n *\n * @param {string[] | Array<NewMemberPayload<StreamChatGenerics>>} members An array of members to add to the channel\n * @param {Message<StreamChatGenerics>} [message] Optional message object for channel members notification\n * @param {ChannelUpdateOptions} [options] Option object, configuration to control the behavior while updating\n * @return {Promise<UpdateChannelAPIResponse<StreamChatGenerics>>} The server response\n */\n async addMembers(\n members: string[] | Array<NewMemberPayload<StreamChatGenerics>>,\n message?: Message<StreamChatGenerics>,\n options: ChannelUpdateOptions = {},\n ) {\n return await this._update({ add_members: members, message, ...options });\n }\n\n /**\n * addModerators - add moderators to the channel\n *\n * @param {string[]} members An array of member identifiers\n * @param {Message<StreamChatGenerics>} [message] Optional message object for channel members notification\n * @param {ChannelUpdateOptions} [options] Option object, configuration to control the behavior while updating\n * @return {Promise<UpdateChannelAPIResponse<StreamChatGenerics>>} The server response\n */\n async addModerators(members: string[], message?: Message<StreamChatGenerics>, options: ChannelUpdateOptions = {}) {\n return await this._update({ add_moderators: members, message, ...options });\n }\n\n /**\n * assignRoles - sets member roles in a channel\n *\n * @param {{channel_role: Role, user_id: string}[]} roles List of role assignments\n * @param {Message<StreamChatGenerics>} [message] Optional message object for channel members notification\n * @param {ChannelUpdateOptions} [options] Option object, configuration to control the behavior while updating\n * @return {Promise<UpdateChannelAPIResponse<StreamChatGenerics>>} The server response\n */\n async assignRoles(\n roles: { channel_role: Role; user_id: string }[],\n message?: Message<StreamChatGenerics>,\n options: ChannelUpdateOptions = {},\n ) {\n return await this._update({ assign_roles: roles, message, ...options });\n }\n\n /**\n * inviteMembers - invite members to the channel\n *\n * @param {string[] | Array<NewMemberPayload<StreamChatGenerics>>} members An array of members to invite to the channel\n * @param {Message<StreamChatGenerics>} [message] Optional message object for channel members notification\n * @param {ChannelUpdateOptions} [options] Option object, configuration to control the behavior while updating\n * @return {Promise<UpdateChannelAPIResponse<StreamChatGenerics>>} The server response\n */\n async inviteMembers(\n members: string[] | Array<NewMemberPayload<StreamChatGenerics>>,\n message?: Message<StreamChatGenerics>,\n options: ChannelUpdateOptions = {},\n ) {\n return await this._update({ invites: members, message, ...options });\n }\n\n /**\n * removeMembers - remove members from channel\n *\n * @param {string[]} members An array of member identifiers\n * @param {Message<StreamChatGenerics>} [message] Optional message object for channel members notification\n * @param {ChannelUpdateOptions} [options] Option object, configuration to control the behavior while updating\n * @return {Promise<UpdateChannelAPIResponse<StreamChatGenerics>>} The server response\n */\n async removeMembers(members: string[], message?: Message<StreamChatGenerics>, options: ChannelUpdateOptions = {}) {\n return await this._update({ remove_members: members, message, ...options });\n }\n\n /**\n * demoteModerators - remove moderator role from channel members\n *\n * @param {string[]} members An array of member identifiers\n * @param {Message<StreamChatGenerics>} [message] Optional message object for channel members notification\n * @param {ChannelUpdateOptions} [options] Option object, configuration to control the behavior while updating\n * @return {Promise<UpdateChannelAPIResponse<StreamChatGenerics>>} The server response\n */\n async demoteModerators(members: string[], message?: Message<StreamChatGenerics>, options: ChannelUpdateOptions = {}) {\n return await this._update({ demote_moderators: members, message, ...options });\n }\n\n /**\n * _update - executes channel update request\n * @param payload Object Update Channel payload\n * @return {Promise<UpdateChannelAPIResponse<StreamChatGenerics>>} The server response\n * TODO: introduce new type instead of Object in the next major update\n */\n async _update(payload: Object) {\n const data = await this.getClient().post<UpdateChannelAPIResponse<StreamChatGenerics>>(this._channelURL(), payload);\n this.data = data.channel;\n return data;\n }\n\n /**\n * mute - mutes the current channel\n * @param {{ user_id?: string, expiration?: string }} opts expiration in minutes or user_id\n * @return {Promise<MuteChannelAPIResponse<StreamChatGenerics>>} The server response\n *\n * example with expiration:\n * await channel.mute({expiration: moment.duration(2, 'weeks')});\n *\n * example server side:\n * await channel.mute({user_id: userId});\n *\n */\n async mute(opts: { expiration?: number; user_id?: string } = {}) {\n return await this.getClient().post<MuteChannelAPIResponse<StreamChatGenerics>>(\n this.getClient().baseURL + '/moderation/mute/channel',\n { channel_cid: this.cid, ...opts },\n );\n }\n\n /**\n * unmute - mutes the current channel\n * @param {{ user_id?: string}} opts user_id\n * @return {Promise<APIResponse>} The server response\n *\n * example server side:\n * await channel.unmute({user_id: userId});\n */\n async unmute(opts: { user_id?: string } = {}) {\n return await this.getClient().post<APIResponse>(this.getClient().baseURL + '/moderation/unmute/channel', {\n channel_cid: this.cid,\n ...opts,\n });\n }\n\n /**\n * archive - archives the current channel\n * @param {{ user_id?: string }} opts user_id if called server side\n * @return {Promise<ChannelMemberResponse<StreamChatGenerics>>} The server response\n *\n * example:\n * await channel.archives();\n *\n * example server side:\n * await channel.archive({user_id: userId});\n *\n */\n async archive(opts: { user_id?: string } = {}) {\n const cli = this.getClient();\n const uid = opts.user_id || cli.userID;\n if (!uid) {\n throw Error('A user_id is required for archiving a channel');\n }\n const resp = await this.partialUpdateMember(uid, { set: { archived: true } });\n return resp.channel_member;\n }\n\n /**\n * unarchive - unarchives the current channel\n * @param {{ user_id?: string }} opts user_id if called server side\n * @return {Promise<ChannelMemberResponse<StreamChatGenerics>>} The server response\n *\n * example:\n * await channel.unarchive();\n *\n * example server side:\n * await channel.unarchive({user_id: userId});\n *\n */\n async unarchive(opts: { user_id?: string } = {}) {\n const cli = this.getClient();\n const uid = opts.user_id || cli.userID;\n if (!uid) {\n throw Error('A user_id is required for unarchiving a channel');\n }\n const resp = await this.partialUpdateMember(uid, { set: { archived: false } });\n return resp.channel_member;\n }\n\n /**\n * pin - pins the current channel\n * @param {{ user_id?: string }} opts user_id if called server side\n * @return {Promise<ChannelMemberResponse<StreamChatGenerics>>} The server response\n *\n * example:\n * await channel.pin();\n *\n * example server side:\n * await channel.pin({user_id: userId});\n *\n */\n async pin(opts: { user_id?: string } = {}) {\n const cli = this.getClient();\n const uid = opts.user_id || cli.userID;\n if (!uid) {\n throw new Error('A user_id is required for pinning a channel');\n }\n const resp = await this.partialUpdateMember(uid, { set: { pinned: true } });\n return resp.channel_member;\n }\n\n /**\n * unpin - unpins the current channel\n * @param {{ user_id?: string }} opts user_id if called server side\n * @return {Promise<ChannelMemberResponse<StreamChatGenerics>>} The server response\n *\n * example:\n * await channel.unpin();\n *\n * example server side:\n * await channel.unpin({user_id: userId});\n *\n */\n async unpin(opts: { user_id?: string } = {}) {\n const cli = this.getClient();\n const uid = opts.user_id || cli.userID;\n if (!uid) {\n throw new Error('A user_id is required for unpinning a channel');\n }\n const resp = await this.partialUpdateMember(uid, { set: { pinned: false } });\n return resp.channel_member;\n }\n\n /**\n * muteStatus - returns the mute status for the current channel\n * @return {{ muted: boolean; createdAt: Date | null; expiresAt: Date | null }} { muted: true | false, createdAt: Date | null, expiresAt: Date | null}\n */\n muteStatus(): {\n createdAt: Date | null;\n expiresAt: Date | null;\n muted: boolean;\n } {\n this._checkInitialized();\n return this.getClient()._muteStatus(this.cid);\n }\n\n sendAction(messageID: string, formData: Record<string, string>) {\n this._checkInitialized();\n if (!messageID) {\n throw Error(`Message id is missing`);\n }\n return this.getClient().post<SendMessageAPIResponse<StreamChatGenerics>>(\n this.getClient().baseURL + `/messages/${encodeURIComponent(messageID)}/action`,\n {\n message_id: messageID,\n form_data: formData,\n id: this.id,\n type: this.type,\n },\n );\n }\n\n /**\n * keystroke - First of the typing.start and typing.stop events based on the users keystrokes.\n * Call this on every keystroke\n * @see {@link https://getstream.io/chat/docs/typing_indicators/?language=js|Docs}\n * @param {string} [parent_id] set this field to `message.id` to indicate that typing event is happening in a thread\n */\n async keystroke(parent_id?: string, options?: { user_id: string }) {\n if (!this._isTypingIndicatorsEnabled()) {\n return;\n }\n const now = new Date();\n const diff = this.lastTypingEvent && now.getTime() - this.lastTypingEvent.getTime();\n this.lastKeyStroke = now;\n this.isTyping = true;\n // send a typing.start every 2 seconds\n if (diff === null || diff > 2000) {\n this.lastTypingEvent = new Date();\n await this.sendEvent({\n type: 'typing.start',\n parent_id,\n ...(options || {}),\n } as Event<StreamChatGenerics>);\n }\n }\n\n /**\n * Sends an event to update the AI state for a specific message.\n * Typically used by the server connected to the AI service to notify clients of state changes.\n *\n * @param messageId - The ID of the message associated with the AI state.\n * @param state - The new state of the AI process (e.g., thinking, generating).\n * @param options - Optional parameters, such as `ai_message`, to include additional details in the event.\n */\n async updateAIState(messageId: string, state: AIState, options: { ai_message?: string } = {}) {\n await this.sendEvent({\n ...options,\n type: 'ai_indicator.update',\n message_id: messageId,\n ai_state: state,\n } as Event<StreamChatGenerics>);\n }\n\n /**\n * Sends an event to notify watchers to clear the typing/thinking UI when the AI response starts streaming.\n * Typically used by the server connected to the AI service to inform clients that the AI response has started.\n */\n async clearAIIndicator() {\n await this.sendEvent({\n type: 'ai_indicator.clear',\n } as Event<StreamChatGenerics>);\n }\n\n /**\n * Sends an event to stop AI response generation, leaving the message in its current state.\n * Triggered by the user to halt the AI response process.\n */\n async stopAIResponse() {\n await this.sendEvent({\n type: 'ai_indicator.stop',\n } as Event<StreamChatGenerics>);\n }\n\n /**\n * stopTyping - Sets last typing to null and sends the typing.stop event\n * @see {@link https://getstream.io/chat/docs/typing_indicators/?language=js|Docs}\n * @param {string} [parent_id] set this field to `message.id` to indicate that typing event is happening in a thread\n */\n async stopTyping(parent_id?: string, options?: { user_id: string }) {\n if (!this._isTypingIndicatorsEnabled()) {\n return;\n }\n this.lastTypingEvent = null;\n this.isTyping = false;\n await this.sendEvent({\n type: 'typing.stop',\n parent_id,\n ...(options || {}),\n } as Event<StreamChatGenerics>);\n }\n\n _isTypingIndicatorsEnabled(): boolean {\n if (!this.getConfig()?.typing_events) {\n return false;\n }\n return this.getClient().user?.privacy_settings?.typing_indicators?.enabled ?? true;\n }\n\n /**\n * lastMessage - return the last message, takes into account that last few messages might not be perfectly sorted\n *\n * @return {ReturnType<ChannelState<StreamChatGenerics>['formatMessage']> | undefined} Description\n */\n lastMessage(): FormatMessageResponse<StreamChatGenerics> | undefined {\n // get last 5 messages, sort, return the latest\n // get a slice of the last 5\n let min = this.state.latestMessages.length - 5;\n if (min < 0) {\n min = 0;\n }\n const max = this.state.latestMessages.length + 1;\n const messageSlice = this.state.latestMessages.slice(min, max);\n\n // sort by pk desc\n messageSlice.sort((a, b) => b.created_at.getTime() - a.created_at.getTime());\n\n return messageSlice[0];\n }\n\n /**\n * markRead - Send the mark read event for this user, only works if the `read_events` setting is enabled\n *\n * @param {MarkReadOptions<StreamChatGenerics>} data\n * @return {Promise<EventAPIResponse<StreamChatGenerics> | null>} Description\n */\n async markRead(data: MarkReadOptions<StreamChatGenerics> = {}) {\n this._checkInitialized();\n\n if (!this.getConfig()?.read_events && !this.getClient()._isUsingServerAuth()) {\n return Promise.resolve(null);\n }\n\n return await this.getClient().post<EventAPIResponse<StreamChatGenerics>>(this._channelURL() + '/read', {\n ...data,\n });\n }\n\n /**\n * markUnread - Mark the channel as unread from messageID, only works if the `read_events` setting is enabled\n *\n * @param {MarkUnreadOptions<StreamChatGenerics>} data\n * @return {APIResponse} An API response\n */\n async markUnread(data: MarkUnreadOptions<StreamChatGenerics>) {\n this._checkInitialized();\n\n if (!this.getConfig()?.read_events && !this.getClient()._isUsingServerAuth()) {\n return Promise.resolve(null);\n }\n\n return await this.getClient().post<APIResponse>(this._channelURL() + '/unread', {\n ...data,\n });\n }\n\n /**\n * clean - Cleans the channel state and fires stop typing if needed\n */\n clean() {\n if (this.lastKeyStroke) {\n const now = new Date();\n const diff = now.getTime() - this.lastKeyStroke.getTime();\n if (diff > 1000 && this.isTyping) {\n logChatPromiseExecution(this.stopTyping(), 'stop typing event');\n }\n }\n\n this.state.clean();\n }\n\n /**\n * watch - Loads the initial channel state and watches for changes\n *\n * @param {ChannelQueryOptions<StreamChatGenerics>} options additional options for the query endpoint\n *\n * @return {Promise<QueryChannelAPIResponse<StreamChatGenerics>>} The server response\n */\n async watch(options?: ChannelQueryOptions<StreamChatGenerics>) {\n const defaultOptions = {\n state: true,\n watch: true,\n presence: false,\n };\n\n // Make sure we wait for the connect promise if there is a pending one\n await this.getClient().wsPromise;\n\n if (!this.getClient()._hasConnectionID()) {\n defaultOptions.watch = false;\n }\n\n const combined = { ...defaultOptions, ...options };\n const state = await this.query(combined, 'latest');\n this.initialized = true;\n this.data = state.channel;\n\n this._client.logger('info', `channel:watch() - started watching channel ${this.cid}`, {\n tags: ['channel'],\n channel: this,\n });\n return state;\n }\n\n /**\n * stopWatching - Stops watching the channel\n *\n * @return {Promise<APIResponse>} The server response\n */\n async stopWatching() {\n const response = await this.getClient().post<APIResponse>(this._channelURL() + '/stop-watching', {});\n\n this._client.logger('info', `channel:watch() - stopped watching channel ${this.cid}`, {\n tags: ['channel'],\n channel: this,\n });\n\n return response;\n }\n\n /**\n * getReplies - List the message replies for a parent message.\n *\n * The recommended way of working with threads is to use the Thread class.\n *\n * @param {string} parent_id The message parent id, ie the top of the thread\n * @param {MessagePaginationOptions & { user?: UserResponse<StreamChatGenerics>; user_id?: string }} options Pagination params, ie {limit:10, id_lte: 10}\n *\n * @return {Promise<GetRepliesAPIResponse<StreamChatGenerics>>} A response with a list of messages\n */\n async getReplies(\n parent_id: string,\n options: MessagePaginationOptions & { user?: UserResponse<StreamChatGenerics>; user_id?: string },\n sort?: { created_at: AscDesc }[],\n ) {\n const normalizedSort = sort ? normalizeQuerySort(sort) : undefined;\n const data = await this.getClient().get<GetRepliesAPIResponse<StreamChatGenerics>>(\n this.getClient().baseURL + `/messages/${encodeURIComponent(parent_id)}/replies`,\n {\n sort: normalizedSort,\n ...options,\n },\n );\n\n // add any messages to our thread state\n if (data.messages) {\n this.state.addMessagesSorted(data.messages);\n }\n\n return data;\n }\n\n /**\n * getPinnedMessages - List list pinned messages of the channel\n *\n * @param {PinnedMessagePaginationOptions & { user?: UserResponse<StreamChatGenerics>; user_id?: string }} options Pagination params, ie {limit:10, id_lte: 10}\n * @param {PinnedMessagesSort} sort defines sorting direction of pinned messages\n *\n * @return {Promise<GetRepliesAPIResponse<StreamChatGenerics>>} A response with a list of messages\n */\n async getPinnedMessages(\n options: PinnedMessagePaginationOptions & { user?: UserResponse<StreamChatGenerics>; user_id?: string },\n sort: PinnedMessagesSort = [],\n ) {\n return await this.getClient().get<GetRepliesAPIResponse<StreamChatGenerics>>(\n this._channelURL() + '/pinned_messages',\n {\n payload: {\n ...options,\n sort: normalizeQuerySort(sort),\n },\n },\n );\n }\n\n /**\n * getReactions - List the reactions, supports pagination\n *\n * @param {string} message_id The message id\n * @param {{ limit?: number; offset?: number }} options The pagination options\n *\n * @return {Promise<GetReactionsAPIResponse<StreamChatGenerics>>} Server response\n */\n getReactions(message_id: string, options: { limit?: number; offset?: number }) {\n return this.getClient().get<GetReactionsAPIResponse<StreamChatGenerics>>(\n this.getClient().baseURL + `/messages/${encodeURIComponent(message_id)}/reactions`,\n {\n ...options,\n },\n );\n }\n\n /**\n * getMessagesById - Retrieves a list of messages by ID\n *\n * @param {string[]} messageIds The ids of the messages to retrieve from this channel\n *\n * @return {Promise<GetMultipleMessagesAPIResponse<StreamChatGenerics>>} Server response\n */\n getMessagesById(messageIds: string[]) {\n return this.getClient().get<GetMultipleMessagesAPIResponse<StreamChatGenerics>>(this._channelURL() + '/messages', {\n ids: messageIds.join(','),\n });\n }\n\n /**\n * lastRead - returns the last time the user marked the channel as read if the user never marked the channel as read, this will return null\n * @return {Date | null | undefined}\n */\n lastRead() {\n const { userID } = this.getClient();\n if (userID) {\n return this.state.read[userID] ? this.state.read[userID].last_read : null;\n }\n }\n\n _countMessageAsUnread(message: FormatMessageResponse<StreamChatGenerics> | MessageResponse<StreamChatGenerics>) {\n if (message.shadowed) return false;\n if (message.silent) return false;\n if (message.parent_id && !message.show_in_channel) return false;\n if (message.user?.id === this.getClient().userID) return false;\n if (message.user?.id && this.getClient().userMuteStatus(message.user.id)) return false;\n\n // Return false if channel doesn't allow read events.\n if (Array.isArray(this.data?.own_capabilities) && !this.data?.own_capabilities.includes('read-events'))\n return false;\n\n // FIXME: see #1265, adjust and count new messages even when the channel is muted\n if (this.muteStatus().muted) return false;\n\n return true;\n }\n\n /**\n * countUnread - Count of unread messages\n *\n * @param {Date | null} [lastRead] lastRead the time that the user read a message, defaults to current user's read state\n *\n * @return {number} Unread count\n */\n countUnread(lastRead?: Date | null) {\n if (!lastRead) return this.state.unreadCount;\n\n let count = 0;\n for (let i = 0; i < this.state.latestMessages.length; i += 1) {\n const message = this.state.latestMessages[i];\n if (message.created_at > lastRead && this._countMessageAsUnread(message)) {\n count++;\n }\n }\n return count;\n }\n\n /**\n * countUnreadMentions - Count the number of unread messages mentioning the current user\n *\n * @return {number} Unread mentions count\n */\n countUnreadMentions() {\n const lastRead = this.lastRead();\n const userID = this.getClient().userID;\n\n let count = 0;\n for (let i = 0; i < this.state.latestMessages.length; i += 1) {\n const message = this.state.latestMessages[i];\n if (\n this._countMessageAsUnread(message) &&\n (!lastRead || message.created_at > lastRead) &&\n message.mentioned_users?.some((user) => user.id === userID)\n ) {\n count++;\n }\n }\n return count;\n }\n\n /**\n * create - Creates a new channel\n *\n * @return {Promise<QueryChannelAPIResponse<StreamChatGenerics>>} The Server Response\n *\n */\n create = async (options?: ChannelQueryOptions<StreamChatGenerics>) => {\n const defaultOptions = {\n ...options,\n watch: false,\n state: false,\n presence: false,\n };\n return await this.query(defaultOptions, 'latest');\n };\n\n /**\n * query - Query the API, get messages, members or other channel fields\n *\n * @param {ChannelQueryOptions<StreamChatGenerics>} options The query options\n * @param {MessageSetType} messageSetToAddToIfDoesNotExist It's possible to load disjunct sets of a channel's messages into state, use `current` to load the initial channel state or if you want to extend the currently displayed messages, use `latest` if you want to load/extend the latest messages, `new` is used for loading a specific message and it's surroundings\n *\n * @return {Promise<QueryChannelAPIResponse<StreamChatGenerics>>} Returns a query response\n */\n async query(\n options?: ChannelQueryOptions<StreamChatGenerics>,\n messageSetToAddToIfDoesNotExist: MessageSetType = 'current',\n ) {\n // Make sure we wait for the connect promise if there is a pending one\n await this.getClient().wsPromise;\n\n let queryURL = `${this.getClient().baseURL}/channels/${encodeURIComponent(this.type)}`;\n if (this.id) {\n queryURL += `/${encodeURIComponent(this.id)}`;\n }\n\n const state = await this.getClient().post<QueryChannelAPIResponse<StreamChatGenerics>>(queryURL + '/query', {\n data: this._data,\n state: true,\n ...options,\n });\n\n // update the channel id if it was missing\n if (!this.id) {\n this.id = state.channel.id;\n this.cid = state.channel.cid;\n // set the channel as active...\n\n const membersStr = state.members\n .map((member) => member.user_id || member.user?.id)\n .sort()\n .join(',');\n const tempChannelCid = `${this.type}:!members-${membersStr}`;\n\n if (tempChannelCid in this.getClient().activeChannels) {\n // This gets set in `client.channel()` function, when channel is created\n // using members, not id.\n delete this.getClient().activeChannels[tempChannelCid];\n }\n\n if (!(this.cid in this.getClient().activeChannels) && this.getClient()._cacheEnabled()) {\n this.getClient().activeChannels[this.cid] = this;\n }\n }\n\n this.getClient()._addChannelConfig(state.channel);\n\n // add any messages to our channel state\n const { messageSet } = this._initializeState(state, messageSetToAddToIfDoesNotExist);\n messageSet.pagination = {\n ...messageSet.pagination,\n ...messageSetPagination({\n parentSet: messageSet,\n messagePaginationOptions: options?.messages,\n requestedPageSize: options?.messages?.limit ?? DEFAULT_QUERY_CHANNEL_MESSAGE_LIST_PAGE_SIZE,\n returnedPage: state.messages,\n logger: this.getClient().logger,\n }),\n };\n\n this.getClient().polls.hydratePollCache(messageSet.messages, true);\n\n const areCapabilitiesChanged =\n [...(state.channel.own_capabilities || [])].sort().join() !==\n [...(Array.isArray(this.data?.own_capabilities) ? (this.data?.own_capabilities as string[]) : [])].sort().join();\n this.data = state.channel;\n this.offlineMode = false;\n\n if (areCapabilitiesChanged) {\n this.getClient().dispatchEvent({\n type: 'capabilities.changed',\n cid: this.cid,\n own_capabilities: state.channel.own_capabilities,\n });\n }\n\n this.getClient().dispatchEvent({\n type: 'channels.queried',\n queriedChannels: {\n channels: [state],\n isLatestMessageSet: messageSet.isLatest,\n },\n });\n\n return state;\n }\n\n /**\n * banUser - Bans a user from a channel\n *\n * @param {string} targetUserID\n * @param {BanUserOptions<StreamChatGenerics>} options\n * @returns {Promise<APIResponse>}\n */\n async banUser(targetUserID: string, options: BanUserOptions<StreamChatGenerics>) {\n this._checkInitialized();\n return await this.getClient().banUser(targetUserID, {\n ...options,\n type: this.type,\n id: this.id,\n });\n }\n\n /**\n * hides the channel from queryChannels for the user until a message is added\n * If clearHistory is set to true - all messages will be removed for the user\n *\n * @param {string | null} userId\n * @param {boolean} clearHistory\n * @returns {Promise<APIResponse>}\n */\n async hide(userId: string | null = null, clearHistory = false) {\n this._checkInitialized();\n\n return await this.getClient().post<APIResponse>(`${this._channelURL()}/hide`, {\n user_id: userId,\n clear_history: clearHistory,\n });\n }\n\n /**\n * removes the hidden status for a channel\n *\n * @param {string | null} userId\n * @returns {Promise<APIResponse>}\n */\n async show(userId: string | null = null) {\n this._checkInitialized();\n return await this.getClient().post<APIResponse>(`${this._channelURL()}/show`, {\n user_id: userId,\n });\n }\n\n /**\n * unbanUser - Removes the bans for a user on a channel\n *\n * @param {string} targetUserID\n * @returns {Promise<APIResponse>}\n */\n async unbanUser(targetUserID: string) {\n this._checkInitialized();\n return await this.getClient().unbanUser(targetUserID, {\n type: this.type,\n id: this.id,\n });\n }\n\n /**\n * shadowBan - Shadow bans a user from a channel\n *\n * @param {string} targetUserID\n * @param {BanUserOptions<StreamChatGenerics>} options\n * @returns {Promise<APIResponse>}\n */\n async shadowBan(targetUserID: string, options: BanUserOptions<StreamChatGenerics>) {\n this._checkInitialized();\n return await this.getClient().shadowBan(targetUserID, {\n ...options,\n type: this.type,\n id: this.id,\n });\n }\n\n /**\n * removeShadowBan - Removes the shadow ban for a user on a channel\n *\n * @param {string} targetUserID\n * @returns {Promise<APIResponse>}\n */\n async removeShadowBan(targetUserID: string) {\n this._checkInitialized();\n return await this.getClient().removeShadowBan(targetUserID, {\n type: this.type,\n id: this.id,\n });\n }\n\n /**\n * createCall - creates a call for the current channel\n *\n * @param {CreateCallOptions} options\n * @returns {Promise<CreateCallResponse>}\n */\n async createCall(options: CreateCallOptions) {\n return await this.getClient().post<CreateCallResponse>(this._channelURL() + '/call', options);\n }\n\n /**\n * Cast or cancel one or more votes on a poll\n * @param pollId string The poll id\n * @param votes PollVoteData[] The votes that will be casted (or canceled in case of an empty array)\n * @returns {APIResponse & PollVoteResponse} The poll votes\n */\n async vote(messageId: string, pollId: string, vote: PollVoteData) {\n return await this.getClient().castPollVote(messageId, pollId, vote);\n }\n\n async removeVote(messageId: string, pollId: string, voteId: string) {\n return await this.getClient().removePollVote(messageId, pollId, voteId);\n }\n\n /**\n * on - Listen to events on this channel.\n *\n * channel.on('message.new', event => {console.log(\"my new message\", event, channel.state.messages)})\n * or\n * channel.on(event => {console.log(event.type)})\n *\n * @param {EventHandler<StreamChatGenerics> | EventTypes} callbackOrString The event type to listen for (optional)\n * @param {EventHandler<StreamChatGenerics>} [callbackOrNothing] The callback to call\n */\n on(eventType: EventTypes, callback: EventHandler<StreamChatGenerics>): { unsubscribe: () => void };\n on(callback: EventHandler<StreamChatGenerics>): { unsubscribe: () => void };\n on(\n callbackOrString: EventHandler<StreamChatGenerics> | EventTypes,\n callbackOrNothing?: EventHandler<StreamChatGenerics>,\n ): { unsubscribe: () => void } {\n const key = callbackOrNothing ? (callbackOrString as string) : 'all';\n const callback = callbackOrNothing ? callbackOrNothing : callbackOrString;\n if (!(key in this.listeners)) {\n this.listeners[key] = [];\n }\n this._client.logger('info', `Attaching listener for ${key} event on channel ${this.cid}`, {\n tags: ['event', 'channel'],\n channel: this,\n });\n\n this.listeners[key].push(callback);\n\n return {\n unsubscribe: () => {\n this._client.logger('info', `Removing listener for ${key} event from channel ${this.cid}`, {\n tags: ['event', 'channel'],\n channel: this,\n });\n\n this.listeners[key] = this.listeners[key].filter((el) => el !== callback);\n },\n };\n }\n\n /**\n * off - Remove the event handler\n *\n */\n off(eventType: EventTypes, callback: EventHandler<StreamChatGenerics>): void;\n off(callback: EventHandler<StreamChatGenerics>): void;\n off(\n callbackOrString: EventHandler<StreamChatGenerics> | EventTypes,\n callbackOrNothing?: EventHandler<StreamChatGenerics>,\n ): void {\n const key = callbackOrNothing ? (callbackOrString as string) : 'all';\n const callback = callbackOrNothing ? callbackOrNothing : callbackOrString;\n if (!(key in this.listeners)) {\n this.listeners[key] = [];\n }\n\n this._client.logger('info', `Removing listener for ${key} event from channel ${this.cid}`, {\n tags: ['event', 'channel'],\n channel: this,\n });\n this.listeners[key] = this.listeners[key].filter((value) => value !== callback);\n }\n\n // eslint-disable-next-line sonarjs/cognitive-complexity\n _handleChannelEvent(event: Event<StreamChatGenerics>) {\n const channel = this;\n this._client.logger(\n 'info',\n `channel:_handleChannelEvent - Received event of type { ${event.type} } on ${this.cid}`,\n {\n tags: ['event', 'channel'],\n channel: this,\n },\n );\n\n const channelState = channel.state;\n switch (event.type) {\n case 'typing.start':\n if (event.user?.id) {\n channelState.typing[event.user.id] = event;\n }\n break;\n case 'typing.stop':\n if (event.user?.id) {\n delete channelState.typing[event.user.id];\n }\n break;\n case 'message.read':\n if (event.user?.id && event.created_at) {\n channelState.read[event.user.id] = {\n last_read: new Date(event.created_at),\n last_read_message_id: event.last_read_message_id,\n user: event.user,\n unread_messages: 0,\n };\n\n if (event.user?.id === this.getClient().user?.id) {\n channelState.unreadCount = 0;\n }\n }\n break;\n case 'user.watching.start':\n case 'user.updated':\n if (event.user?.id) {\n channelState.watchers[event.user.id] = event.user;\n }\n break;\n case 'user.watching.stop':\n if (event.user?.id) {\n delete channelState.watchers[event.user.id];\n }\n break;\n case 'message.deleted':\n if (event.message) {\n this._extendEventWithOwnReactions(event);\n if (event.hard_delete) channelState.removeMessage(event.message);\n else channelState.addMessageSorted(event.message, false, false);\n\n channelState.removeQuotedMessageReferences(event.message);\n\n if (event.message.pinned) {\n channelState.removePinnedMessage(event.message);\n }\n }\n break;\n case 'message.new':\n if (event.message) {\n /* if message belongs to current user, always assume timestamp is changed to filter it out and add again to avoid duplication */\n const ownMessage = event.user?.id === this.getClient().user?.id;\n const isThreadMessage = event.message.parent_id && !event.message.show_in_channel;\n\n if (this.state.isUpToDate || isThreadMessage) {\n channelState.addMessageSorted(event.message, ownMessage);\n }\n if (event.message.pinned) {\n channelState.addPinnedMessage(event.message);\n }\n\n // do not increase the unread count - the back-end does not increase the count neither in the following cases:\n // 1. the message is mine\n // 2. the message is a thread reply from any user\n const preventUnreadCountUpdate = ownMessage || isThreadMessage;\n if (preventUnreadCountUpdate) break;\n\n if (event.user?.id) {\n for (const userId in channelState.read) {\n if (userId === event.user.id) {\n channelState.read[event.user.id] = {\n last_read: new Date(event.created_at as string),\n user: event.user,\n unread_messages: 0,\n };\n } else {\n channelState.read[userId].unread_messages += 1;\n }\n }\n }\n\n if (this._countMessageAsUnread(event.message)) {\n channelState.unreadCount = channelState.unreadCount + 1;\n }\n }\n break;\n case 'message.updated':\n case 'message.undeleted':\n if (event.message) {\n this._extendEventWithOwnReactions(event);\n channelState.addMessageSorted(event.message, false, false);\n channelState._updateQuotedMessageReferences({ message: event.message });\n if (event.message.pinned) {\n channelState.addPinnedMessage(event.message);\n } else {\n channelState.removePinnedMessage(event.message);\n }\n }\n break;\n case 'channel.truncated':\n if (event.channel?.truncated_at) {\n const truncatedAt = +new Date(event.channel.truncated_at);\n\n channelState.messageSets.forEach((messageSet, messageSetIndex) => {\n messageSet.messages.forEach(({ created_at: createdAt, id }) => {\n if (truncatedAt > +createdAt) channelState.removeMessage({ id, messageSetIndex });\n });\n });\n\n channelState.pinnedMessages.forEach(({ id, created_at: createdAt }) => {\n if (truncatedAt > +createdAt)\n channelState.removePinnedMessage({ id } as MessageResponse<StreamChatGenerics>);\n });\n } else {\n channelState.clearMessages();\n }\n\n channelState.unreadCount = 0;\n // system messages don't increment unread counts\n if (event.message) {\n channelState.addMessageSorted(event.message);\n if (event.message.pinned) {\n channelState.addPinnedMessage(event.message);\n }\n }\n break;\n case 'member.added':\n case 'member.updated':\n if (event.member?.user) {\n channelState.members = {\n ...channelState.members,\n [event.member.user.id]: event.member,\n };\n }\n\n if (\n typeof channelState.membership.user?.id === 'string' &&\n typeof event.member?.user?.id === 'string' &&\n event.member.user.id === channelState.membership.user.id\n ) {\n channelState.membership = event.member;\n }\n break;\n case 'member.removed':\n if (event.user?.id) {\n const newMembers = {\n ...channelState.members,\n };\n\n delete newMembers[event.user.id];\n\n channelState.members = newMembers;\n\n // TODO?: unset membership\n }\n break;\n case 'notification.mark_unread': {\n const ownMessage = event.user?.id === this.getClient().user?.id;\n if (!(ownMessage && event.user)) break;\n\n const unreadCount = event.unread_messages ?? 0;\n\n channelState.read[event.user.id] = {\n first_unread_message_id: event.first_unread_message_id,\n last_read: new Date(event.last_read_at as string),\n last_read_message_id: event.last_read_message_id,\n user: event.user,\n unread_messages: unreadCount,\n };\n\n channelState.unreadCount = unreadCount;\n break;\n }\n case 'channel.updated':\n if (event.channel) {\n const isFrozenChanged = event.channel?.frozen !== undefined && event.channel.frozen !== channel.data?.frozen;\n if (isFrozenChanged) {\n this.query({ state: false, messages: { limit: 0 }, watchers: { limit: 0 } });\n }\n channel.data = {\n ...event.channel,\n hidden: event.channel?.hidden ?? channel.data?.hidden,\n own_capabilities: event.channel?.own_capabilities ?? channel.data?.own_capabilities,\n };\n }\n break;\n case 'reaction.new':\n if (event.message && event.reaction) {\n event.message = channelState.addReaction(event.reaction, event.message);\n }\n break;\n case 'reaction.deleted':\n if (event.reaction) {\n event.message = channelState.removeReaction(event.reaction, event.message);\n }\n break;\n case 'reaction.updated':\n if (event.reaction) {\n // assuming reaction.updated is only called if enforce_unique is true\n event.message = channelState.addReaction(event.reaction, event.message, true);\n }\n break;\n case 'channel.hidden':\n channel.data = { ...channel.data, hidden: true };\n if (event.clear_history) {\n channelState.clearMessages();\n }\n break;\n case 'channel.visible':\n channel.data = { ...channel.data, hidden: false };\n break;\n case 'user.banned':\n if (!event.user?.id) break;\n channelState.members[event.user.id] = {\n ...(channelState.members[event.user.id] || {}),\n shadow_banned: !!event.shadow,\n banned: !event.shadow,\n user: { ...(channelState.members[event.user.id]?.user || {}), ...event.user },\n };\n break;\n case 'user.unbanned':\n if (!event.user?.id) break;\n channelState.members[event.user.id] = {\n ...(channelState.members[event.user.id] || {}),\n shadow_banned: false,\n banned: false,\n user: { ...(channelState.members[event.user.id]?.user || {}), ...event.user },\n };\n break;\n default:\n }\n\n // any event can send over the online count\n if (event.watcher_count !== undefined) {\n channel.state.watcher_count = event.watcher_count;\n }\n }\n\n _callChannelListeners = (event: Event<StreamChatGenerics>) => {\n const channel = this;\n // gather and call the listeners\n const listeners = [];\n if (channel.listeners.all) {\n listeners.push(...channel.listeners.all);\n }\n if (channel.listeners[event.type]) {\n listeners.push(...channel.listeners[event.type]);\n }\n\n // call the event and send it to the listeners\n for (const listener of listeners) {\n if (typeof listener !== 'string') {\n listener(event);\n }\n }\n };\n\n /**\n * _channelURL - Returns the channel url\n *\n * @return {string} The channel url\n */\n _channelURL = () => {\n if (!this.id) {\n throw new Error('channel id is not defined');\n }\n return `${this.getClient().baseURL}/channels/${encodeURIComponent(this.type)}/${encodeURIComponent(this.id)}`;\n };\n\n _checkInitialized() {\n if (!this.initialized && !this.offlineMode && !this.getClient()._isUsingServerAuth()) {\n throw Error(\n `Channel ${this.cid} hasn't been initialized yet. Make sure to call .watch() and wait for it to resolve`,\n );\n }\n }\n\n // eslint-disable-next-line sonarjs/cognitive-complexity\n _initializeState(\n state: ChannelAPIResponse<StreamChatGenerics>,\n messageSetToAddToIfDoesNotExist: MessageSetType = 'latest',\n ) {\n const { state: clientState, user, userID } = this.getClient();\n\n // add the members and users\n if (state.members) {\n this._hydrateMembers({ members: state.members });\n\n for (const member of state.members) {\n if (member.user) {\n clientState.updateUserReference(member.user, this.cid);\n }\n }\n }\n\n this.state.membership = state.membership || {};\n\n const messages = state.messages || [];\n if (!this.state.messages) {\n this.state.initMessages();\n }\n const { messageSet } = this.state.addMessagesSorted(messages, false, true, true, messageSetToAddToIfDoesNotExist);\n\n if (!this.state.pinnedMessages) {\n this.state.pinnedMessages = [];\n }\n this.state.addPinnedMessages(state.pinned_messages || []);\n if (state.pending_messages) {\n this.state.pending_messages = state.pending_messages;\n }\n if (state.watcher_count !== undefined) {\n this.state.watcher_count = state.watcher_count;\n }\n // convert the arrays into objects for easier syncing...\n if (state.watchers) {\n for (const watcher of state.watchers) {\n if (watcher) {\n clientState.updateUserReference(watcher, this.cid);\n this.state.watchers[watcher.id] = watcher;\n }\n }\n }\n\n // initialize read state to last message or current time if the channel is empty\n // if the user is a member, this value will be overwritten later on otherwise this ensures\n // that everything up to this point is not marked as unread\n if (userID != null) {\n const last_read = this.state.last_message_at || new Date();\n if (user) {\n this.state.read[user.id] = {\n user,\n last_read,\n unread_messages: 0,\n };\n }\n }\n\n // apply read state if part of the state\n if (state.read) {\n for (const read of state.read) {\n this.state.read[read.user.id] = {\n last_read: new Date(read.last_read),\n last_read_message_id: read.last_read_message_id,\n unread_messages: read.unread_messages ?? 0,\n user: read.user,\n };\n\n if (read.user.id === user?.id) {\n this.state.unreadCount = this.state.read[read.user.id].unread_messages;\n }\n }\n }\n\n return {\n messageSet,\n };\n }\n\n _extendEventWithOwnReactions(event: Event<StreamChatGenerics>) {\n if (!event.message) {\n return;\n }\n const message = this.state.findMessage(event.message.id, event.message.parent_id);\n if (message) {\n event.message.own_reactions = message.own_reactions;\n }\n }\n\n _hydrateMembers({\n members,\n overrideCurrentState = true,\n }: {\n members: ChannelMemberResponse<StreamChatGenerics>[];\n /**\n * If set to `true` then `ChannelState.members` will be overriden with the newly\n * provided `members`, setting this property to `false` will merge current `ChannelState.members`\n * object with the newly provided `members`\n * (new members with the same `userId` will replace the old ones).\n */\n overrideCurrentState?: boolean;\n }) {\n const newMembersById = members.reduce<ChannelState<StreamChatGenerics>['members']>((membersById, member) => {\n if (member.user) {\n membersById[member.user.id] = member;\n }\n return membersById;\n }, {});\n\n if (overrideCurrentState) {\n this.state.members = newMembersById;\n } else if (!overrideCurrentState && members.length) {\n this.state.members = {\n ...this.state.members,\n ...newMembersById,\n };\n }\n }\n\n _disconnect() {\n this._client.logger('info', `channel:disconnect() - Disconnecting the channel ${this.cid}`, {\n tags: ['connection', 'channel'],\n channel: this,\n });\n\n this.disconnected = true;\n this.state.setIsUpToDate(false);\n }\n}\n","import { UserResponse, ExtendableGenerics, DefaultGenerics } from './types';\nimport { StreamChat } from './client';\n\n/**\n * ClientState - A container class for the client state.\n */\nexport class ClientState<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> {\n private client: StreamChat<StreamChatGenerics>;\n users: {\n [key: string]: UserResponse<StreamChatGenerics>;\n };\n userChannelReferences: { [key: string]: { [key: string]: boolean } };\n constructor({ client }: { client: StreamChat<StreamChatGenerics> }) {\n // show the status for a certain user...\n // ie online, offline etc\n this.client = client;\n this.users = {};\n // store which channels contain references to the specified user...\n this.userChannelReferences = {};\n }\n\n updateUsers(users: UserResponse<StreamChatGenerics>[]) {\n for (const user of users) {\n this.updateUser(user);\n }\n }\n\n updateUser(user?: UserResponse<StreamChatGenerics>) {\n if (user != null && this.client._cacheEnabled()) {\n this.users[user.id] = user;\n }\n }\n\n updateUserReference(user: UserResponse<StreamChatGenerics>, channelID: string) {\n if (user == null || !this.client._cacheEnabled()) {\n return;\n }\n this.updateUser(user);\n if (!this.userChannelReferences[user.id]) {\n this.userChannelReferences[user.id] = {};\n }\n this.userChannelReferences[user.id][channelID] = true;\n }\n\n deleteAllChannelReference(channelID: string) {\n for (const userID in this.userChannelReferences) {\n delete this.userChannelReferences[userID][channelID];\n }\n }\n}\n","import axios from 'axios';\nimport { StableWSConnection } from './connection';\nimport { randomId, sleep } from './utils';\n\nexport type InsightTypes = 'ws_fatal' | 'ws_success_after_failure' | 'http_hi_failed';\nexport class InsightMetrics {\n connectionStartTimestamp: number | null;\n wsConsecutiveFailures: number;\n wsTotalFailures: number;\n instanceClientId: string;\n\n constructor() {\n this.connectionStartTimestamp = null;\n this.wsTotalFailures = 0;\n this.wsConsecutiveFailures = 0;\n this.instanceClientId = randomId();\n }\n}\n\n/**\n * postInsights is not supposed to be used by end users directly within chat application, and thus is kept isolated\n * from all the client/connection code/logic.\n *\n * @param insightType\n * @param insights\n */\nexport const postInsights = async (insightType: InsightTypes, insights: Record<string, unknown>) => {\n const maxAttempts = 3;\n for (let i = 0; i < maxAttempts; i++) {\n try {\n await axios.post(`https://chat-insights.getstream.io/insights/${insightType}`, insights);\n } catch (e) {\n await sleep((i + 1) * 3000);\n continue;\n }\n break;\n }\n};\n\nexport function buildWsFatalInsight(connection: StableWSConnection, event: Record<string, unknown>) {\n return {\n ...event,\n ...buildWsBaseInsight(connection),\n };\n}\n\nfunction buildWsBaseInsight(connection: StableWSConnection) {\n const { client } = connection;\n return {\n ready_state: connection.ws?.readyState,\n url: connection._buildUrl(),\n api_key: client.key,\n start_ts: client.insightMetrics.connectionStartTimestamp,\n end_ts: new Date().getTime(),\n auth_type: client.getAuthType(),\n token: client.tokenManager.token,\n user_id: client.userID,\n user_details: client._user,\n device: client.options.device,\n client_id: connection.connectionID,\n ws_details: connection.ws,\n ws_consecutive_failures: client.insightMetrics.wsConsecutiveFailures,\n ws_total_failures: client.insightMetrics.wsTotalFailures,\n request_id: connection.requestID,\n online: typeof navigator !== 'undefined' ? navigator?.onLine : null,\n user_agent: typeof navigator !== 'undefined' ? navigator?.userAgent : null,\n instance_client_id: client.insightMetrics.instanceClientId,\n };\n}\n\nexport function buildWsSuccessAfterFailureInsight(connection: StableWSConnection) {\n return buildWsBaseInsight(connection);\n}\n","import WebSocket from 'isomorphic-ws';\nimport {\n chatCodes,\n convertErrorToJson,\n sleep,\n retryInterval,\n randomId,\n removeConnectionEventListeners,\n addConnectionEventListeners,\n} from './utils';\nimport { buildWsFatalInsight, buildWsSuccessAfterFailureInsight, postInsights } from './insights';\nimport { ConnectAPIResponse, ConnectionOpen, ExtendableGenerics, DefaultGenerics, UR, LogLevel } from './types';\nimport { StreamChat } from './client';\n\n// Type guards to check WebSocket error type\nconst isCloseEvent = (res: WebSocket.CloseEvent | WebSocket.Data | WebSocket.ErrorEvent): res is WebSocket.CloseEvent =>\n (res as WebSocket.CloseEvent).code !== undefined;\n\nconst isErrorEvent = (res: WebSocket.CloseEvent | WebSocket.Data | WebSocket.ErrorEvent): res is WebSocket.ErrorEvent =>\n (res as WebSocket.ErrorEvent).error !== undefined;\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<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> {\n // global from constructor\n client: StreamChat<StreamChatGenerics>;\n\n // local vars\n connectionID?: string;\n connectionOpen?: ConnectAPIResponse<StreamChatGenerics>;\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?: (\n reason?: Error & { code?: string | number; isWSFailure?: boolean; StatusCode?: string | number },\n ) => void;\n requestID: string | undefined;\n resolvePromise?: (value: ConnectionOpen<StreamChatGenerics>) => void;\n totalFailures: number;\n ws?: WebSocket;\n wsID: number;\n\n constructor({ client }: { client: StreamChat<StreamChatGenerics> }) {\n /** StreamChat client */\n this.client = client;\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 /** 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\n addConnectionEventListeners(this.onlineStatusChanged);\n }\n\n _log(msg: string, extra: UR = {}, level: LogLevel = 'info') {\n this.client.logger(level, 'connection:' + msg, { tags: ['connection'], ...extra });\n }\n\n setClient(client: StreamChat<StreamChatGenerics>) {\n this.client = client;\n }\n\n /**\n * connect - Connect to the WS URL\n * the default 15s timeout allows between 2~3 tries\n * @return {ConnectAPIResponse<ChannelType, CommandType, UserType>} Promise that completes once the first health check message is received\n */\n async connect(timeout = 15000) {\n if (this.isConnecting) {\n throw Error(`You've called connect twice, can only attempt 1 connection at the time`);\n }\n\n this.isDisconnected = false;\n\n try {\n const healthCheck = await this._connect();\n this.consecutiveFailures = 0;\n\n this._log(`connect() - Established ws connection with healthcheck: ${healthCheck}`);\n } catch (error) {\n this.isHealthy = false;\n this.consecutiveFailures += 1;\n\n if (error.code === chatCodes.TOKEN_EXPIRED && !this.client.tokenManager.isStatic()) {\n this._log('connect() - WS failure due to expired token, so going to try to reload token and reconnect');\n this._reconnect({ refreshToken: true });\n } else 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\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 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) {\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 * Builds and returns the url for websocket.\n * @private\n * @returns url string\n */\n _buildUrl = () => {\n const qs = encodeURIComponent(this.client._buildWSPayload(this.requestID));\n const token = this.client.tokenManager.getToken();\n\n return `${this.client.wsBaseURL}/connect?json=${qs}&api_key=${\n this.client.key\n }&authorization=${token}&stream-auth-type=${this.client.getAuthType()}&X-Stream-Client=${this.client.getUserAgent()}`;\n };\n\n /**\n * disconnect - Disconnect the connection and doesn't recover...\n *\n */\n disconnect(timeout?: number) {\n this._log(`disconnect() - Closing the websocket 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 && this.ws.removeAllListeners) {\n this.ws.removeAllListeners();\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 && ws.close && ws.readyState === ws.OPEN) {\n isClosedPromise = new Promise((resolve) => {\n const onclose = (event: WebSocket.CloseEvent) => {\n this._log(`disconnect() - resolving isClosedPromise ${event ? 'with' : 'without'} close frame`, { event });\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 seconds.\n setTimeout(onclose, timeout != null ? timeout : 1000);\n });\n\n this._log(`disconnect() - Manually closed connection by calling client.disconnect()`);\n\n ws.close(chatCodes.WS_CLOSED_SUCCESS, 'Manually closed connection by calling client.disconnect()');\n } else {\n this._log(`disconnect() - 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<ChannelType, CommandType, UserType>} Promise that completes once the first health check message is received\n */\n async _connect() {\n if (this.isConnecting || (this.isDisconnected && this.client.options.enableWSFallback)) return; // simply ignore _connect if it's currently trying to connect\n this.isConnecting = true;\n this.requestID = randomId();\n this.client.insightMetrics.connectionStartTimestamp = new Date().getTime();\n let isTokenReady = false;\n try {\n this._log(`_connect() - waiting for token`);\n await this.client.tokenManager.tokenReady();\n isTokenReady = true;\n } catch (e) {\n // token provider has failed before, so try again\n }\n\n try {\n if (!isTokenReady) {\n this._log(`_connect() - tokenProvider failed before, so going to retry`);\n await this.client.tokenManager.loadToken();\n }\n\n this._setupConnectionPromise();\n const wsURL = this._buildUrl();\n this._log(`_connect() - Connecting to ${wsURL}`, { wsURL, requestID: this.requestID });\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 this.connectionID = response.connection_id;\n if (this.client.insightMetrics.wsConsecutiveFailures > 0 && this.client.options.enableInsights) {\n postInsights(\n 'ws_success_after_failure',\n buildWsSuccessAfterFailureInsight((this as unknown) as StableWSConnection),\n );\n this.client.insightMetrics.wsConsecutiveFailures = 0;\n }\n return response;\n }\n } catch (err) {\n this.isConnecting = false;\n this._log(`_connect() - Error - `, err);\n if (this.client.options.enableInsights) {\n this.client.insightMetrics.wsConsecutiveFailures++;\n this.client.insightMetrics.wsTotalFailures++;\n\n const insights = buildWsFatalInsight((this as unknown) as StableWSConnection, convertErrorToJson(err as Error));\n postInsights?.('ws_fatal', insights);\n }\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(options: { interval?: number; refreshToken?: boolean } = {}): Promise<void> {\n this._log('_reconnect() - Initiating the reconnect');\n\n // only allow 1 connection at the time\n if (this.isConnecting || this.isHealthy) {\n this._log('_reconnect() - 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 this._log('_reconnect() - Abort (2) since already connecting or healthy');\n return;\n }\n\n if (this.isDisconnected && this.client.options.enableWSFallback) {\n this._log('_reconnect() - Abort (3) since disconnect() is called');\n return;\n }\n\n this._log('_reconnect() - Destroying current WS connection');\n\n // cleanup the old connection\n this._destroyCurrentWSConnection();\n\n if (options.refreshToken) {\n await this.client.tokenManager.loadToken();\n }\n\n try {\n await this._connect();\n this._log('_reconnect() - Waiting for recoverCallBack');\n await this.client.recoverState();\n this._log('_reconnect() - Finished recoverCallBack');\n\n this.consecutiveFailures = 0;\n } catch (error) {\n this.isHealthy = false;\n this.consecutiveFailures += 1;\n if (error.code === chatCodes.TOKEN_EXPIRED && !this.client.tokenManager.isStatic()) {\n this._log('_reconnect() - WS failure due to expired token, so going to try to reload token and reconnect');\n\n return 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 this._log('_reconnect() - WS failure, so going to try to reconnect');\n\n this._reconnect();\n }\n }\n this._log('_reconnect() - == 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 if (event.type === 'offline') {\n // mark the connection as down\n this._log('onlineStatusChanged() - Status changing to offline');\n this._setHealth(false);\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 this._log(`onlineStatusChanged() - Status changing to online. isHealthy: ${this.isHealthy}`);\n if (!this.isHealthy) {\n this._reconnect({ interval: 10 });\n }\n }\n };\n\n onopen = (wsID: number) => {\n if (this.wsID !== wsID) return;\n\n this._log('onopen() - onopen callback', { wsID });\n };\n\n onmessage = (wsID: number, event: WebSocket.MessageEvent) => {\n if (this.wsID !== wsID) return;\n\n this._log('onmessage() - onmessage callback', { event, wsID });\n const data = typeof event.data === 'string' ? JSON.parse(event.data) : null;\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) {\n this.isResolved = true;\n if (data.error) {\n this.rejectPromise?.(this._errorFromWSEvent(data, false));\n return;\n }\n\n this.resolvePromise?.(data);\n this._setHealth(true);\n }\n\n // trigger the event..\n this.lastEvent = new Date();\n\n if (data && data.type === 'health.check') {\n this.scheduleNextPing();\n }\n\n this.client.handleEvent(event);\n this.scheduleConnectionCheck();\n };\n\n onclose = (wsID: number, event: WebSocket.CloseEvent) => {\n if (this.wsID !== wsID) return;\n\n this._log('onclose() - onclose callback - ' + event.code, { event, wsID });\n\n if (event.code === chatCodes.WS_CLOSED_SUCCESS) {\n // this is a permanent error raised by stream..\n // usually caused by invalid auth details\n const error = new Error(`WS connection reject with error ${event.reason}`) as Error & WebSocket.CloseEvent;\n\n error.reason = event.reason;\n error.code = event.code;\n error.wasClean = event.wasClean;\n error.target = event.target;\n\n this.rejectPromise?.(error);\n this._log(`onclose() - WS connection reject with error ${event.reason}`, { event });\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 this._log(`onclose() - WS connection closed. Calling reconnect ...`, { event });\n\n // reconnect if its an abnormal failure\n this._reconnect();\n }\n };\n\n onerror = (wsID: number, event: WebSocket.ErrorEvent) => {\n if (this.wsID !== wsID) return;\n\n this.consecutiveFailures += 1;\n this.totalFailures += 1;\n this._setHealth(false);\n this.isConnecting = false;\n\n this.rejectPromise?.(this._errorFromWSEvent(event));\n this._log(`onerror() - WS connection resulted into error`, { event });\n\n 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 *\n */\n _setHealth = (healthy: boolean) => {\n if (healthy === this.isHealthy) return;\n\n this.isHealthy = healthy;\n\n if (this.isHealthy) {\n this.client.dispatchEvent({ type: 'connection.changed', online: this.isHealthy });\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.client.dispatchEvent({ type: 'connection.changed', online: this.isHealthy });\n }, 5000);\n };\n\n /**\n * _errorFromWSEvent - Creates an error object for the WS event\n *\n */\n _errorFromWSEvent = (event: WebSocket.CloseEvent | WebSocket.Data | WebSocket.ErrorEvent, isWSFailure = true) => {\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._log(`_errorFromWSEvent() - WS failed with code ${code}`, { event }, 'warn');\n\n const error = new Error(`WS failed with code ${code} and reason - ${message}`) 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 this?.ws?.removeAllListeners();\n this?.ws?.close();\n } catch (e) {\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<ConnectionOpen<StreamChatGenerics>>((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.client.clientID }];\n // try to send on the connection\n try {\n this.ws?.send(JSON.stringify(data));\n } catch (e) {\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 (this.lastEvent && now.getTime() - this.lastEvent.getTime() > this.connectionCheckTimeout) {\n this._log('scheduleConnectionCheck - going to reconnect');\n this._setHealth(false);\n this._reconnect();\n }\n }, this.connectionCheckTimeout);\n };\n}\n","export default null;","export default null;","import jwt, { Secret, SignOptions } from 'jsonwebtoken';\nimport crypto from 'crypto';\nimport { encodeBase64, decodeBase64 } from './base64';\nimport { UR } from './types';\n\n/**\n * Creates the JWT token that can be used for a UserSession\n * @method JWTUserToken\n * @memberof signing\n * @private\n * @param {Secret} apiSecret - API Secret key\n * @param {string} userId - The user_id key in the JWT payload\n * @param {UR} [extraData] - Extra that should be part of the JWT token\n * @param {SignOptions} [jwtOptions] - Options that can be past to jwt.sign\n * @return {string} JWT Token\n */\nexport function JWTUserToken(apiSecret: Secret, userId: string, extraData: UR = {}, jwtOptions: SignOptions = {}) {\n if (typeof userId !== 'string') {\n throw new TypeError('userId should be a string');\n }\n\n const payload: { user_id: string } & UR = {\n user_id: userId,\n ...extraData,\n };\n\n // make sure we return a clear error when jwt is shimmed (ie. browser build)\n if (jwt == null || jwt.sign == null) {\n throw Error(\n `Unable to find jwt crypto, if you are getting this error is probably because you are trying to generate tokens on browser or React Native (or other environment where crypto functions are not available). Please Note: token should only be generated server-side.`,\n );\n }\n\n const opts: SignOptions = Object.assign({ algorithm: 'HS256', noTimestamp: true }, jwtOptions);\n\n if (payload.iat) {\n opts.noTimestamp = false;\n }\n return jwt.sign(payload, apiSecret, opts);\n}\n\nexport function JWTServerToken(apiSecret: Secret, jwtOptions: SignOptions = {}) {\n const payload = {\n server: true,\n };\n\n const opts: SignOptions = Object.assign({ algorithm: 'HS256', noTimestamp: true }, jwtOptions);\n return jwt.sign(payload, apiSecret, opts);\n}\n\nexport function UserFromToken(token: string) {\n const fragments = token.split('.');\n if (fragments.length !== 3) {\n return '';\n }\n const b64Payload = fragments[1];\n const payload = decodeBase64(b64Payload);\n const data = JSON.parse(payload);\n return data.user_id as string;\n}\n\n/**\n *\n * @param {string} userId the id of the user\n * @return {string}\n */\nexport function DevToken(userId: string) {\n return [\n 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9', //{\"alg\": \"HS256\", \"typ\": \"JWT\"}\n encodeBase64(JSON.stringify({ user_id: userId })),\n 'devtoken', // hardcoded signature\n ].join('.');\n}\n\n/**\n *\n * @param {string | Buffer} body the signed message\n * @param {string} secret the shared secret used to generate the signature (Stream API secret)\n * @param {string} signature the signature to validate\n * @return {boolean}\n */\nexport function CheckSignature(body: string | Buffer, secret: string, signature: string) {\n const key = Buffer.from(secret, 'utf8');\n const hash = crypto.createHmac('sha256', key).update(body).digest('hex');\n\n try {\n return crypto.timingSafeEqual(Buffer.from(hash), Buffer.from(signature));\n } catch {\n return false;\n }\n}\n","import { Secret } from 'jsonwebtoken';\nimport { UserFromToken, JWTServerToken, JWTUserToken } from './signing';\nimport { isFunction } from './utils';\nimport { TokenOrProvider, ExtendableGenerics, DefaultGenerics, UserResponse } from './types';\n\n/**\n * TokenManager\n *\n * Handles all the operations around user token.\n */\nexport class TokenManager<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> {\n loadTokenPromise: Promise<string> | null;\n type: 'static' | 'provider';\n secret?: Secret;\n token?: string;\n tokenProvider?: TokenOrProvider;\n user?: UserResponse<StreamChatGenerics>;\n /**\n * Constructor\n *\n * @param {Secret} secret\n */\n constructor(secret?: Secret) {\n this.loadTokenPromise = null;\n if (secret) {\n this.secret = secret;\n }\n\n this.type = 'static';\n\n if (this.secret) {\n this.token = JWTServerToken(this.secret);\n }\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\n * @param {UserResponse<StreamChatGenerics>} user\n */\n setTokenOrProvider = async (tokenOrProvider: TokenOrProvider, user: UserResponse<StreamChatGenerics>) => {\n this.validateToken(tokenOrProvider, user);\n this.user = user;\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 if (!tokenOrProvider && this.user && this.secret) {\n this.token = JWTUserToken(this.secret, user.id, {}, {});\n this.type = 'static';\n }\n\n await this.loadToken();\n };\n\n /**\n * Resets the token manager.\n * Useful for client disconnection or switching user.\n */\n reset = () => {\n this.token = undefined;\n this.tokenProvider = undefined;\n this.type = 'static';\n this.user = undefined;\n this.loadTokenPromise = null;\n };\n\n // Validates the user token.\n validateToken = (tokenOrProvider: TokenOrProvider, user: UserResponse<StreamChatGenerics>) => {\n // allow empty token for anon user\n if (user && user.anon && !tokenOrProvider) return;\n\n // Don't allow empty token for non-server side client.\n if (!this.secret && !tokenOrProvider) {\n throw new Error('User token can not be empty');\n }\n\n if (tokenOrProvider && typeof tokenOrProvider !== 'string' && !isFunction(tokenOrProvider)) {\n throw new Error('user token should either be a string or a function');\n }\n\n if (typeof tokenOrProvider === 'string') {\n // Allow empty token for anonymous users\n if (user.anon && tokenOrProvider === '') return;\n\n const tokenUserId = UserFromToken(tokenOrProvider);\n if (tokenOrProvider != null && (tokenUserId == null || tokenUserId === '' || tokenUserId !== user.id)) {\n throw new Error('userToken does not have a user_id or is not matching with user.id');\n }\n }\n };\n\n // Resolves when token is ready. This function is simply to check if loadToken is in progress, in which\n // case a function should wait.\n tokenReady = () => this.loadTokenPromise;\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 // eslint-disable-next-line no-async-promise-executor\n this.loadTokenPromise = new Promise(async (resolve, reject) => {\n if (this.type === 'static') {\n return resolve(this.token as string);\n }\n\n if (this.tokenProvider && typeof this.tokenProvider !== 'string') {\n try {\n this.token = await this.tokenProvider();\n } catch (e) {\n return reject(new Error(`Call to tokenProvider failed with message: ${e}`));\n }\n resolve(this.token);\n }\n });\n\n return this.loadTokenPromise;\n };\n\n // Returns a current token\n getToken = () => {\n if (this.token) {\n return this.token;\n }\n\n if (this.user && this.user.anon && !this.token) {\n return this.token;\n }\n\n if (this.secret) {\n return JWTServerToken(this.secret);\n }\n\n throw new Error(\n `Both secret and user tokens are not set. Either client.connectUser wasn't called or client.disconnect was called`,\n );\n };\n\n isStatic = () => this.type === 'static';\n}\n","import { AxiosResponse } from 'axios';\nimport { APIErrorResponse } from './types';\n\nexport const APIErrorCodes: Record<string, { name: string; retryable: boolean }> = {\n '-1': { name: 'InternalSystemError', retryable: true },\n '2': { name: 'AccessKeyError', retryable: false },\n '3': { name: 'AuthenticationFailedError', retryable: true },\n '4': { name: 'InputError', retryable: false },\n '6': { name: 'DuplicateUsernameError', retryable: false },\n '9': { name: 'RateLimitError', retryable: true },\n '16': { name: 'DoesNotExistError', retryable: false },\n '17': { name: 'NotAllowedError', retryable: false },\n '18': { name: 'EventNotSupportedError', retryable: false },\n '19': { name: 'ChannelFeatureNotSupportedError', retryable: false },\n '20': { name: 'MessageTooLongError', retryable: false },\n '21': { name: 'MultipleNestingLevelError', retryable: false },\n '22': { name: 'PayloadTooBigError', retryable: false },\n '23': { name: 'RequestTimeoutError', retryable: true },\n '24': { name: 'MaxHeaderSizeExceededError', retryable: false },\n '40': { name: 'AuthErrorTokenExpired', retryable: false },\n '41': { name: 'AuthErrorTokenNotValidYet', retryable: false },\n '42': { name: 'AuthErrorTokenUsedBeforeIssuedAt', retryable: false },\n '43': { name: 'AuthErrorTokenSignatureInvalid', retryable: false },\n '44': { name: 'CustomCommandEndpointMissingError', retryable: false },\n '45': { name: 'CustomCommandEndpointCallError', retryable: true },\n '46': { name: 'ConnectionIDNotFoundError', retryable: false },\n '60': { name: 'CoolDownError', retryable: true },\n '69': { name: 'ErrWrongRegion', retryable: false },\n '70': { name: 'ErrQueryChannelPermissions', retryable: false },\n '71': { name: 'ErrTooManyConnections', retryable: true },\n '99': { name: 'AppSuspendedError', retryable: false },\n};\n\ntype APIError = Error & { code: number; isWSFailure?: boolean };\n\nexport function isAPIError(error: Error): error is APIError {\n return (error as APIError).code !== undefined;\n}\n\nexport function isErrorRetryable(error: APIError) {\n if (!error.code) return false;\n const err = APIErrorCodes[`${error.code}`];\n if (!err) return false;\n return err.retryable;\n}\n\nexport function isConnectionIDError(error: APIError) {\n return error.code === 46; // ConnectionIDNotFoundError\n}\n\nexport function isWSFailure(err: APIError): boolean {\n if (typeof err.isWSFailure === 'boolean') {\n return err.isWSFailure;\n }\n\n try {\n return JSON.parse(err.message).isWSFailure;\n } catch (_) {\n return false;\n }\n}\n\nexport function isErrorResponse(res: AxiosResponse<unknown>): res is AxiosResponse<APIErrorResponse> {\n return !res.status || res.status < 200 || 300 <= res.status;\n}\n","import axios, { AxiosRequestConfig, CancelTokenSource } from 'axios';\nimport { StreamChat } from './client';\nimport { addConnectionEventListeners, removeConnectionEventListeners, retryInterval, sleep } from './utils';\nimport { isAPIError, isConnectionIDError, isErrorRetryable } from './errors';\nimport { ConnectionOpen, Event, UR, ExtendableGenerics, DefaultGenerics, LogLevel } from './types';\n\nexport enum ConnectionState {\n Closed = 'CLOSED',\n Connected = 'CONNECTED',\n Connecting = 'CONNECTING',\n Disconnected = 'DISCONNECTED',\n Init = 'INIT',\n}\n\nexport class WSConnectionFallback<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> {\n client: StreamChat<StreamChatGenerics>;\n state: ConnectionState;\n consecutiveFailures: number;\n connectionID?: string;\n cancelToken?: CancelTokenSource;\n\n constructor({ client }: { client: StreamChat<StreamChatGenerics> }) {\n this.client = client;\n this.state = ConnectionState.Init;\n this.consecutiveFailures = 0;\n\n addConnectionEventListeners(this._onlineStatusChanged);\n }\n\n _log(msg: string, extra: UR = {}, level: LogLevel = 'info') {\n this.client.logger(level, 'WSConnectionFallback:' + msg, { tags: ['connection_fallback', 'connection'], ...extra });\n }\n\n _setState(state: ConnectionState) {\n this._log(`_setState() - ${state}`);\n\n // transition from connecting => connected\n if (this.state === ConnectionState.Connecting && state === ConnectionState.Connected) {\n this.client.dispatchEvent({ type: 'connection.changed', online: true });\n }\n\n if (state === ConnectionState.Closed || state === ConnectionState.Disconnected) {\n this.client.dispatchEvent({ type: 'connection.changed', online: false });\n }\n\n this.state = state;\n }\n\n /** @private */\n _onlineStatusChanged = (event: { type: string }) => {\n this._log(`_onlineStatusChanged() - ${event.type}`);\n\n if (event.type === 'offline') {\n this._setState(ConnectionState.Closed);\n this.cancelToken?.cancel('disconnect() is called');\n this.cancelToken = undefined;\n return;\n }\n\n if (event.type === 'online' && this.state === ConnectionState.Closed) {\n this.connect(true);\n }\n };\n\n /** @private */\n _req = async <T = UR>(params: UR, config: AxiosRequestConfig, retry: boolean): Promise<T> => {\n if (!this.cancelToken && !params.close) {\n this.cancelToken = axios.CancelToken.source();\n }\n\n try {\n const res = await this.client.doAxiosRequest<T>(\n 'get',\n (this.client.baseURL as string).replace(':3030', ':8900') + '/longpoll', // replace port if present for testing with local API\n undefined,\n {\n config: { ...config, cancelToken: this.cancelToken?.token },\n params,\n },\n );\n\n this.consecutiveFailures = 0; // always reset in case of no error\n return res;\n } catch (err) {\n this.consecutiveFailures += 1;\n\n if (retry && isErrorRetryable(err)) {\n this._log(`_req() - Retryable error, retrying request`);\n await sleep(retryInterval(this.consecutiveFailures));\n return this._req<T>(params, config, retry);\n }\n\n throw err;\n }\n };\n\n /** @private */\n _poll = async () => {\n while (this.state === ConnectionState.Connected) {\n try {\n const data = await this._req<{\n events: Event<StreamChatGenerics>[];\n }>({}, { timeout: 30000 }, true); // 30s => API responds in 20s if there is no event\n\n if (data.events?.length) {\n for (let i = 0; i < data.events.length; i++) {\n this.client.dispatchEvent(data.events[i]);\n }\n }\n } catch (err) {\n if (axios.isCancel(err)) {\n this._log(`_poll() - axios canceled request`);\n return;\n }\n\n /** client.doAxiosRequest will take care of TOKEN_EXPIRED error */\n\n if (isConnectionIDError(err)) {\n this._log(`_poll() - ConnectionID error, connecting without ID...`);\n this._setState(ConnectionState.Disconnected);\n this.connect(true);\n return;\n }\n\n if (isAPIError(err) && !isErrorRetryable(err)) {\n this._setState(ConnectionState.Closed);\n return;\n }\n\n await sleep(retryInterval(this.consecutiveFailures));\n }\n }\n };\n\n /**\n * connect try to open a longpoll request\n * @param reconnect should be false for first call and true for subsequent calls to keep the connection alive and call recoverState\n */\n connect = async (reconnect = false) => {\n if (this.state === ConnectionState.Connecting) {\n this._log('connect() - connecting already in progress', { reconnect }, 'warn');\n return;\n }\n if (this.state === ConnectionState.Connected) {\n this._log('connect() - already connected and polling', { reconnect }, 'warn');\n return;\n }\n\n this._setState(ConnectionState.Connecting);\n this.connectionID = undefined; // connect should be sent with empty connection_id so API creates one\n try {\n const { event } = await this._req<{ event: ConnectionOpen<StreamChatGenerics> }>(\n { json: this.client._buildWSPayload() },\n { timeout: 8000 }, // 8s\n reconnect,\n );\n\n this._setState(ConnectionState.Connected);\n this.connectionID = event.connection_id;\n // @ts-expect-error\n this.client.dispatchEvent(event);\n this._poll();\n if (reconnect) {\n this.client.recoverState();\n }\n return event;\n } catch (err) {\n this._setState(ConnectionState.Closed);\n throw err;\n }\n };\n\n /**\n * isHealthy checks if there is a connectionID and connection is in Connected state\n */\n isHealthy = () => {\n return !!this.connectionID && this.state === ConnectionState.Connected;\n };\n\n disconnect = async (timeout = 2000) => {\n removeConnectionEventListeners(this._onlineStatusChanged);\n\n this._setState(ConnectionState.Disconnected);\n this.cancelToken?.cancel('disconnect() is called');\n this.cancelToken = undefined;\n\n const connection_id = this.connectionID;\n this.connectionID = undefined;\n\n try {\n await this._req({ close: true, connection_id }, { timeout }, false);\n this._log(`disconnect() - Closed connectionID`);\n } catch (err) {\n this._log(`disconnect() - Failed`, { err }, 'error');\n }\n };\n}\n","import { StreamChat } from './client';\nimport {\n DefaultGenerics,\n ExtendableGenerics,\n QuerySegmentTargetsFilter,\n SegmentData,\n SegmentResponse,\n SortParam,\n} from './types';\n\ntype SegmentType = 'user' | 'channel';\n\ntype SegmentUpdatableFields = {\n description?: string;\n filter?: {};\n name?: string;\n};\n\nexport class Segment<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> {\n type: SegmentType;\n id: string | null;\n client: StreamChat<StreamChatGenerics>;\n data?: SegmentData | SegmentResponse;\n\n constructor(client: StreamChat<StreamChatGenerics>, type: SegmentType, id: string | null, data?: SegmentData) {\n this.client = client;\n this.type = type;\n this.id = id;\n this.data = data;\n }\n\n async create() {\n const body = {\n name: this.data?.name,\n filter: this.data?.filter,\n description: this.data?.description,\n all_sender_channels: this.data?.all_sender_channels,\n all_users: this.data?.all_users,\n };\n\n return this.client.createSegment(this.type, this.id, body);\n }\n\n verifySegmentId() {\n if (!this.id) {\n throw new Error(\n 'Segment id is missing. Either create the segment using segment.create() or set the id during instantiation - const segment = client.segment(id)',\n );\n }\n }\n\n async get() {\n this.verifySegmentId();\n return this.client.getSegment(this.id as string);\n }\n\n async update(data: Partial<SegmentUpdatableFields>) {\n this.verifySegmentId();\n\n return this.client.updateSegment(this.id as string, data);\n }\n\n async addTargets(targets: string[]) {\n this.verifySegmentId();\n return this.client.addSegmentTargets(this.id as string, targets);\n }\n\n async removeTargets(targets: string[]) {\n this.verifySegmentId();\n return this.client.removeSegmentTargets(this.id as string, targets);\n }\n\n async delete() {\n this.verifySegmentId();\n return this.client.deleteSegment(this.id as string);\n }\n\n async targetExists(targetId: string) {\n this.verifySegmentId();\n return this.client.segmentTargetExists(this.id as string, targetId);\n }\n\n async queryTargets(filter: QuerySegmentTargetsFilter | null = {}, sort: SortParam[] | null | [] = [], options = {}) {\n this.verifySegmentId();\n\n return this.client.querySegmentTargets(this.id as string, filter, sort, options);\n }\n}\n","import { AxiosRequestConfig, AxiosResponse } from 'axios';\nimport { StableWSConnection } from './connection';\nimport { EVENT_MAP } from './events';\nimport { Role } from './permissions';\n\n/**\n * Utility Types\n */\n\nexport type ArrayOneOrMore<T> = {\n 0: T;\n} & Array<T>;\n\nexport type ArrayTwoOrMore<T> = {\n 0: T;\n 1: T;\n} & Array<T>;\n\nexport type KnownKeys<T> = {\n [K in keyof T]: string extends K ? never : number extends K ? never : K;\n} extends { [_ in keyof T]: infer U }\n ? U\n : never;\n\nexport type RequireAtLeastOne<T> = {\n [K in keyof T]-?: Required<Pick<T, K>> & Partial<Pick<T, Exclude<keyof T, K>>>;\n}[keyof T];\n\nexport type RequireOnlyOne<T, Keys extends keyof T = keyof T> = Pick<T, Exclude<keyof T, Keys>> &\n {\n [K in Keys]-?: Required<Pick<T, K>> & Partial<Record<Exclude<Keys, K>, undefined>>;\n }[Keys];\n\n/* Unknown Record */\nexport type UR = Record<string, unknown>;\nexport type UnknownType = UR; //alias to avoid breaking change\n\nexport type DefaultGenerics = {\n attachmentType: UR;\n channelType: UR;\n commandType: LiteralStringForUnion;\n eventType: UR;\n memberType: UR;\n messageType: UR;\n pollOptionType: UR;\n pollType: UR;\n reactionType: UR;\n userType: UR;\n};\n\nexport type ExtendableGenerics = {\n attachmentType: UR;\n channelType: UR;\n commandType: string;\n eventType: UR;\n memberType: UR;\n messageType: UR;\n pollOptionType: UR;\n pollType: UR;\n reactionType: UR;\n userType: UR;\n};\n\nexport type Unpacked<T> = T extends (infer U)[]\n ? U // eslint-disable-next-line @typescript-eslint/no-explicit-any\n : T extends (...args: any[]) => infer U\n ? U\n : T extends Promise<infer U>\n ? U\n : T;\n\n/**\n * Response Types\n */\n\nexport type APIResponse = {\n duration: string;\n};\n\nexport type TranslateResponse = {\n language: string;\n translated_text: string;\n};\n\nexport type AppSettingsAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n app?: {\n // TODO\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n call_types: any;\n channel_configs: Record<\n string,\n {\n reminders: boolean;\n automod?: ChannelConfigAutomod;\n automod_behavior?: ChannelConfigAutomodBehavior;\n automod_thresholds?: ChannelConfigAutomodThresholds;\n blocklist_behavior?: ChannelConfigAutomodBehavior;\n commands?: CommandVariants<StreamChatGenerics>[];\n connect_events?: boolean;\n created_at?: string;\n custom_events?: boolean;\n mark_messages_pending?: boolean;\n max_message_length?: number;\n message_retention?: string;\n mutes?: boolean;\n name?: string;\n polls?: boolean;\n push_notifications?: boolean;\n quotes?: boolean;\n reactions?: boolean;\n read_events?: boolean;\n replies?: boolean;\n search?: boolean;\n typing_events?: boolean;\n updated_at?: string;\n uploads?: boolean;\n url_enrichment?: boolean;\n }\n >;\n reminders_interval: number;\n agora_options?: AgoraOptions | null;\n async_moderation_config?: AsyncModerationOptions;\n async_url_enrich_enabled?: boolean;\n auto_translation_enabled?: boolean;\n before_message_send_hook_url?: string;\n campaign_enabled?: boolean;\n cdn_expiration_seconds?: number;\n custom_action_handler_url?: string;\n datadog_info?: {\n api_key: string;\n site: string;\n enabled?: boolean;\n };\n disable_auth_checks?: boolean;\n disable_permissions_checks?: boolean;\n enforce_unique_usernames?: 'no' | 'app' | 'team';\n file_upload_config?: FileUploadConfig;\n geofences?: Array<{\n country_codes: Array<string>;\n description: string;\n name: string;\n type: string;\n }>;\n grants?: Record<string, string[]>;\n hms_options?: HMSOptions | null;\n image_moderation_enabled?: boolean;\n image_upload_config?: FileUploadConfig;\n multi_tenant_enabled?: boolean;\n name?: string;\n organization?: string;\n permission_version?: string;\n policies?: Record<string, Policy[]>;\n poll_enabled?: boolean;\n push_notifications?: {\n offline_only: boolean;\n version: string;\n apn?: APNConfig;\n firebase?: FirebaseConfig;\n huawei?: HuaweiConfig;\n providers?: PushProviderConfig[];\n xiaomi?: XiaomiConfig;\n };\n revoke_tokens_issued_before?: string | null;\n search_backend?: 'disabled' | 'elasticsearch' | 'postgres';\n sns_key?: string;\n sns_secret?: string;\n sns_topic_arn?: string;\n sqs_key?: string;\n sqs_secret?: string;\n sqs_url?: string;\n suspended?: boolean;\n suspended_explanation?: string;\n user_search_disallowed_roles?: string[] | null;\n video_provider?: string;\n webhook_events?: Array<string>;\n webhook_url?: string;\n };\n};\n\nexport type ModerationResult = {\n action: string;\n created_at: string;\n message_id: string;\n updated_at: string;\n user_bad_karma: boolean;\n user_karma: number;\n blocked_word?: string;\n blocklist_name?: string;\n moderated_by?: string;\n};\n\nexport type AutomodDetails = {\n action?: string;\n image_labels?: Array<string>;\n original_message_type?: string;\n result?: ModerationResult;\n};\n\nexport type FlagDetails = {\n automod?: AutomodDetails;\n};\n\nexport type Flag<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n created_at: string;\n created_by_automod: boolean;\n updated_at: string;\n details?: FlagDetails;\n target_message?: MessageResponse<StreamChatGenerics>;\n target_user?: UserResponse<StreamChatGenerics>;\n user?: UserResponse<StreamChatGenerics>;\n};\n\nexport type FlagsResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n flags?: Array<Flag<StreamChatGenerics>>;\n};\n\nexport type MessageFlagsResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n flags?: Array<{\n message: MessageResponse<StreamChatGenerics>;\n user: UserResponse<StreamChatGenerics>;\n approved_at?: string;\n created_at?: string;\n created_by_automod?: boolean;\n moderation_result?: ModerationResult;\n rejected_at?: string;\n reviewed_at?: string;\n reviewed_by?: UserResponse<StreamChatGenerics>;\n updated_at?: string;\n }>;\n};\n\nexport type FlagReport<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n flags_count: number;\n id: string;\n message: MessageResponse<StreamChatGenerics>;\n user: UserResponse<StreamChatGenerics>;\n created_at?: string;\n details?: FlagDetails;\n first_reporter?: UserResponse<StreamChatGenerics>;\n review_result?: string;\n reviewed_at?: string;\n reviewed_by?: UserResponse<StreamChatGenerics>;\n updated_at?: string;\n};\n\nexport type FlagReportsResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n flag_reports: Array<FlagReport<StreamChatGenerics>>;\n};\n\nexport type ReviewFlagReportResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n flag_report: FlagReport<StreamChatGenerics>;\n};\n\nexport type BannedUsersResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n bans?: Array<{\n user: UserResponse<StreamChatGenerics>;\n banned_by?: UserResponse<StreamChatGenerics>;\n channel?: ChannelResponse<StreamChatGenerics>;\n expires?: string;\n ip_ban?: boolean;\n reason?: string;\n timeout?: number;\n }>;\n};\n\nexport type BlockListResponse = BlockList & {\n created_at?: string;\n type?: string;\n updated_at?: string;\n};\n\nexport type ChannelResponse<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = StreamChatGenerics['channelType'] & {\n cid: string;\n disabled: boolean;\n frozen: boolean;\n id: string;\n type: string;\n auto_translation_enabled?: boolean;\n auto_translation_language?: TranslationLanguages | '';\n config?: ChannelConfigWithInfo<StreamChatGenerics>;\n cooldown?: number;\n created_at?: string;\n created_by?: UserResponse<StreamChatGenerics> | null;\n created_by_id?: string;\n deleted_at?: string;\n hidden?: boolean;\n invites?: string[];\n joined?: boolean;\n last_message_at?: string;\n member_count?: number;\n members?: ChannelMemberResponse<StreamChatGenerics>[];\n muted?: boolean;\n name?: string;\n own_capabilities?: string[];\n team?: string;\n truncated_at?: string;\n truncated_by?: UserResponse<StreamChatGenerics>;\n truncated_by_id?: string;\n updated_at?: string;\n};\n\nexport type QueryReactionsOptions = Pager;\n\nexport type QueryReactionsAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n reactions: ReactionResponse<StreamChatGenerics>[];\n next?: string;\n};\n\nexport type QueryChannelsAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n channels: Omit<ChannelAPIResponse<StreamChatGenerics>, keyof APIResponse>[];\n};\n\nexport type QueryChannelAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse &\n ChannelAPIResponse<StreamChatGenerics>;\n\nexport type ChannelAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n channel: ChannelResponse<StreamChatGenerics>;\n members: ChannelMemberResponse<StreamChatGenerics>[];\n messages: MessageResponse<StreamChatGenerics>[];\n pinned_messages: MessageResponse<StreamChatGenerics>[];\n hidden?: boolean;\n membership?: ChannelMemberResponse<StreamChatGenerics> | null;\n pending_messages?: PendingMessageResponse<StreamChatGenerics>[];\n push_preferences?: PushPreference;\n read?: ReadResponse<StreamChatGenerics>[];\n threads?: ThreadResponse[];\n watcher_count?: number;\n watchers?: UserResponse<StreamChatGenerics>[];\n};\n\nexport type ChannelUpdateOptions = {\n hide_history?: boolean;\n skip_push?: boolean;\n};\n\nexport type ChannelMemberAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n members: ChannelMemberResponse<StreamChatGenerics>[];\n};\n\nexport type ChannelMemberUpdates<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = StreamChatGenerics['memberType'] & {\n archived?: boolean;\n channel_role?: Role;\n pinned?: boolean;\n};\n\nexport type ChannelMemberResponse<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = StreamChatGenerics['memberType'] & {\n archived_at?: string;\n ban_expires?: string;\n banned?: boolean;\n channel_role?: Role;\n created_at?: string;\n invite_accepted_at?: string;\n invite_rejected_at?: string;\n invited?: boolean;\n is_moderator?: boolean;\n notifications_muted?: boolean;\n pinned_at?: string;\n role?: string;\n shadow_banned?: boolean;\n status?: InviteStatus;\n updated_at?: string;\n user?: UserResponse<StreamChatGenerics>;\n user_id?: string;\n};\n\nexport type PartialUpdateMemberAPIResponse<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = APIResponse & {\n channel_member: ChannelMemberResponse<StreamChatGenerics>;\n};\n\nexport type CheckPushResponse = APIResponse & {\n device_errors?: {\n [deviceID: string]: {\n error_message?: string;\n provider?: PushProvider;\n provider_name?: string;\n };\n };\n general_errors?: string[];\n rendered_apn_template?: string;\n rendered_firebase_template?: string;\n rendered_message?: {};\n skip_devices?: boolean;\n};\n\nexport type CheckSQSResponse = APIResponse & {\n status: string;\n data?: {};\n error?: string;\n};\n\nexport type CheckSNSResponse = APIResponse & {\n status: string;\n data?: {};\n error?: string;\n};\n\nexport type CommandResponse<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = Partial<CreatedAtUpdatedAt> & {\n args?: string;\n description?: string;\n name?: CommandVariants<StreamChatGenerics>;\n set?: CommandVariants<StreamChatGenerics>;\n};\n\nexport type ConnectAPIResponse<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = Promise<void | ConnectionOpen<StreamChatGenerics>>;\n\nexport type CreateChannelResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse &\n Omit<CreateChannelOptions<StreamChatGenerics>, 'client_id' | 'connection_id'> & {\n created_at: string;\n updated_at: string;\n grants?: Record<string, string[]>;\n };\n\nexport type CreateCommandResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n command: CreateCommandOptions<StreamChatGenerics> & CreatedAtUpdatedAt;\n};\n\nexport type DeleteChannelAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n channel: ChannelResponse<StreamChatGenerics>;\n};\n\nexport type DeleteCommandResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n name?: CommandVariants<StreamChatGenerics>;\n};\n\nexport type EventAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n event: Event<StreamChatGenerics>;\n};\n\nexport type ExportChannelResponse = {\n task_id: string;\n};\n\nexport type ExportUsersResponse = {\n task_id: string;\n};\n\nexport type ExportChannelStatusResponse = {\n created_at?: string;\n error?: {};\n result?: {};\n updated_at?: string;\n};\n\nexport type FlagMessageResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n flag: {\n created_at: string;\n created_by_automod: boolean;\n target_message_id: string;\n updated_at: string;\n user: UserResponse<StreamChatGenerics>;\n approved_at?: string;\n channel_cid?: string;\n details?: Object; // Any JSON\n message_user_id?: string;\n rejected_at?: string;\n reviewed_at?: string;\n reviewed_by?: string;\n };\n review_queue_item_id?: string;\n};\n\nexport type FlagUserResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n flag: {\n created_at: string;\n created_by_automod: boolean;\n target_user: UserResponse<StreamChatGenerics>;\n updated_at: string;\n user: UserResponse<StreamChatGenerics>;\n approved_at?: string;\n details?: Object; // Any JSON\n rejected_at?: string;\n reviewed_at?: string;\n reviewed_by?: string;\n };\n review_queue_item_id?: string;\n};\n\nexport type FormatMessageResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = Omit<\n MessageResponse<{\n attachmentType: StreamChatGenerics['attachmentType'];\n channelType: StreamChatGenerics['channelType'];\n commandType: StreamChatGenerics['commandType'];\n eventType: StreamChatGenerics['eventType'];\n memberType: StreamChatGenerics['memberType'];\n messageType: {};\n pollOptionType: StreamChatGenerics['pollOptionType'];\n pollType: StreamChatGenerics['pollType'];\n reactionType: StreamChatGenerics['reactionType'];\n userType: StreamChatGenerics['userType'];\n }>,\n 'created_at' | 'pinned_at' | 'updated_at' | 'deleted_at' | 'status'\n> &\n StreamChatGenerics['messageType'] & {\n created_at: Date;\n deleted_at: Date | null;\n pinned_at: Date | null;\n status: string;\n updated_at: Date;\n };\n\nexport type GetChannelTypeResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse &\n Omit<CreateChannelOptions<StreamChatGenerics>, 'client_id' | 'connection_id' | 'commands'> & {\n created_at: string;\n updated_at: string;\n commands?: CommandResponse<StreamChatGenerics>[];\n grants?: Record<string, string[]>;\n };\n\nexport type GetCommandResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse &\n CreateCommandOptions<StreamChatGenerics> &\n CreatedAtUpdatedAt;\n\nexport type GetMessageAPIResponse<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = SendMessageAPIResponse<StreamChatGenerics>;\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface ThreadResponseCustomData {}\n\nexport interface ThreadResponse<SCG extends ExtendableGenerics = DefaultGenerics> extends ThreadResponseCustomData {\n // FIXME: according to OpenAPI, `channel` could be undefined but since cid is provided I'll asume that it's wrong\n channel: ChannelResponse<SCG>;\n channel_cid: string;\n created_at: string;\n created_by_user_id: string;\n latest_replies: Array<MessageResponse<SCG>>;\n parent_message: MessageResponse<SCG>;\n parent_message_id: string;\n title: string;\n updated_at: string;\n active_participant_count?: number;\n created_by?: UserResponse<SCG>;\n deleted_at?: string;\n last_message_at?: string;\n participant_count?: number;\n read?: Array<ReadResponse<SCG>>;\n reply_count?: number;\n thread_participants?: Array<{\n channel_cid: string;\n created_at: string;\n last_read_at: string;\n last_thread_message_at?: string;\n left_thread_at?: string;\n thread_id?: string;\n user?: UserResponse<SCG>;\n user_id?: string;\n }>;\n // TODO: when moving to API v2 we should do this instead\n // custom: ThreadResponseCustomData;\n}\n\n// TODO: Figure out a way to strongly type set and unset.\nexport type PartialThreadUpdate = {\n set?: Partial<Record<string, unknown>>;\n unset?: Array<string>;\n};\n\nexport type QueryThreadsOptions = {\n limit?: number;\n member_limit?: number;\n next?: string;\n participant_limit?: number;\n reply_limit?: number;\n watch?: boolean;\n};\n\nexport type QueryThreadsAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n threads: ThreadResponse<StreamChatGenerics>[];\n next?: string;\n};\n\nexport type GetThreadOptions = {\n member_limit?: number;\n participant_limit?: number;\n reply_limit?: number;\n watch?: boolean;\n};\n\nexport type GetThreadAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n thread: ThreadResponse<StreamChatGenerics>;\n};\n\nexport type GetMultipleMessagesAPIResponse<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = APIResponse & {\n messages: MessageResponse<StreamChatGenerics>[];\n};\n\nexport type GetRateLimitsResponse = APIResponse & {\n android?: RateLimitsMap;\n ios?: RateLimitsMap;\n server_side?: RateLimitsMap;\n web?: RateLimitsMap;\n};\n\nexport type GetReactionsAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n reactions: ReactionResponse<StreamChatGenerics>[];\n};\n\nexport type GetRepliesAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n messages: MessageResponse<StreamChatGenerics>[];\n};\n\nexport type GetUnreadCountAPIResponse = APIResponse & {\n channel_type: {\n channel_count: number;\n channel_type: string;\n unread_count: number;\n }[];\n channels: {\n channel_id: string;\n last_read: string;\n unread_count: number;\n }[];\n threads: {\n last_read: string;\n last_read_message_id: string;\n parent_message_id: string;\n unread_count: number;\n }[];\n total_unread_count: number;\n total_unread_threads_count: number;\n};\n\nexport type ChatLevelPushPreference = 'all' | 'none' | 'mentions' | (string & {});\n\nexport type PushPreference = {\n callLevel?: 'all' | 'none' | (string & {});\n chatLevel?: ChatLevelPushPreference;\n disabledUntil?: string; // snooze till this time\n removeDisable?: boolean; // Temporary flag for resetting disabledUntil\n};\n\nexport type ChannelPushPreference = {\n chatLevel?: ChatLevelPushPreference; // \"all\", \"none\", \"mentions\", or other custom strings\n disabledUntil?: string;\n removeDisable?: boolean; // Temporary flag for resetting disabledUntil\n};\n\nexport type UpsertPushPreferencesResponse = APIResponse & {\n // Mapping of user IDs to their push preferences\n userChannelPreferences: Record<string, Record<string, ChannelPushPreference>>;\n userPreferences: Record<string, PushPreference>; // Mapping of user -> channel id -> push preferences\n};\n\nexport type GetUnreadCountBatchAPIResponse = APIResponse & {\n counts_by_user: { [userId: string]: GetUnreadCountAPIResponse };\n};\n\nexport type ListChannelResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n channel_types: Record<\n string,\n Omit<CreateChannelOptions<StreamChatGenerics>, 'client_id' | 'connection_id' | 'commands'> & {\n commands: CommandResponse<StreamChatGenerics>[];\n created_at: string;\n updated_at: string;\n grants?: Record<string, string[]>;\n }\n >;\n};\n\nexport type ListChannelTypesAPIResponse<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = ListChannelResponse<StreamChatGenerics>;\n\nexport type ListCommandsResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n commands: Array<CreateCommandOptions<StreamChatGenerics> & Partial<CreatedAtUpdatedAt>>;\n};\n\nexport type MuteChannelAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n channel_mute: ChannelMute<StreamChatGenerics>;\n own_user: OwnUserResponse<StreamChatGenerics>;\n channel_mutes?: ChannelMute<StreamChatGenerics>[];\n mute?: MuteResponse<StreamChatGenerics>;\n};\n\nexport type MessageResponse<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = MessageResponseBase<StreamChatGenerics> & {\n quoted_message?: MessageResponseBase<StreamChatGenerics>;\n};\n\nexport type MessageResponseBase<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = MessageBase<StreamChatGenerics> & {\n type: MessageLabel;\n args?: string;\n before_message_send_failed?: boolean;\n channel?: ChannelResponse<StreamChatGenerics>;\n cid?: string;\n command?: string;\n command_info?: { name?: string };\n created_at?: string;\n deleted_at?: string;\n deleted_reply_count?: number;\n i18n?: RequireAtLeastOne<Record<`${TranslationLanguages}_text`, string>> & {\n language: TranslationLanguages;\n };\n latest_reactions?: ReactionResponse<StreamChatGenerics>[];\n mentioned_users?: UserResponse<StreamChatGenerics>[];\n message_text_updated_at?: string;\n moderation?: ModerationResponse; // present only with Moderation v2\n moderation_details?: ModerationDetailsResponse; // present only with Moderation v1\n own_reactions?: ReactionResponse<StreamChatGenerics>[] | null;\n pin_expires?: string | null;\n pinned_at?: string | null;\n pinned_by?: UserResponse<StreamChatGenerics> | null;\n poll?: PollResponse<StreamChatGenerics>;\n reaction_counts?: { [key: string]: number } | null;\n reaction_groups?: { [key: string]: ReactionGroupResponse } | null;\n reaction_scores?: { [key: string]: number } | null;\n reply_count?: number;\n shadowed?: boolean;\n status?: string;\n thread_participants?: UserResponse<StreamChatGenerics>[];\n updated_at?: string;\n};\n\nexport type ReactionGroupResponse = {\n count: number;\n sum_scores: number;\n first_reaction_at?: string;\n last_reaction_at?: string;\n};\n\nexport type ModerationDetailsResponse = {\n action: 'MESSAGE_RESPONSE_ACTION_BOUNCE' | (string & {});\n error_msg: string;\n harms: ModerationHarmResponse[];\n original_text: string;\n};\n\nexport type ModerationHarmResponse = {\n name: string;\n phrase_list_ids: number[];\n};\n\nexport type ModerationAction = 'bounce' | 'flag' | 'remove' | 'shadow';\n\nexport type ModerationResponse = {\n action: ModerationAction;\n original_text: string;\n};\n\nexport type MuteResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n user: UserResponse<StreamChatGenerics>;\n created_at?: string;\n expires?: string;\n target?: UserResponse<StreamChatGenerics>;\n updated_at?: string;\n};\n\nexport type MuteUserResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n mute?: MuteResponse<StreamChatGenerics>;\n mutes?: Array<Mute<StreamChatGenerics>>;\n own_user?: OwnUserResponse<StreamChatGenerics>;\n};\n\nexport type BlockUserAPIResponse = APIResponse & {\n blocked_at: string;\n blocked_by_user_id: string;\n blocked_user_id: string;\n};\n\nexport type GetBlockedUsersAPIResponse = APIResponse & {\n blocks: BlockedUserDetails[];\n};\nexport type BlockedUserDetails = APIResponse & {\n blocked_user: UserResponse;\n blocked_user_id: string;\n created_at: string;\n user: UserResponse;\n user_id: string;\n};\n\nexport type OwnUserBase<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n channel_mutes: ChannelMute<StreamChatGenerics>[];\n devices: Device<StreamChatGenerics>[];\n mutes: Mute<StreamChatGenerics>[];\n total_unread_count: number;\n unread_channels: number;\n unread_count: number;\n unread_threads: number;\n invisible?: boolean;\n privacy_settings?: PrivacySettings;\n push_preferences?: PushPreference;\n roles?: string[];\n};\n\nexport type OwnUserResponse<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = UserResponse<StreamChatGenerics> & OwnUserBase<StreamChatGenerics>;\n\nexport type PartialUpdateChannelAPIResponse<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = APIResponse & {\n channel: ChannelResponse<StreamChatGenerics>;\n members: ChannelMemberResponse<StreamChatGenerics>[];\n};\n\nexport type PermissionAPIResponse = APIResponse & {\n permission?: PermissionAPIObject;\n};\n\nexport type PermissionsAPIResponse = APIResponse & {\n permissions?: PermissionAPIObject[];\n};\n\nexport type ReactionAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n message: MessageResponse<StreamChatGenerics>;\n reaction: ReactionResponse<StreamChatGenerics>;\n};\n\nexport type ReactionResponse<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = Reaction<StreamChatGenerics> & {\n created_at: string;\n message_id: string;\n updated_at: string;\n};\n\nexport type ReadResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n last_read: string;\n user: UserResponse<StreamChatGenerics>;\n last_read_message_id?: string;\n unread_messages?: number;\n};\n\nexport type SearchAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n results: {\n message: MessageResponse<StreamChatGenerics>;\n }[];\n next?: string;\n previous?: string;\n results_warning?: SearchWarning | null;\n};\n\nexport type SearchWarning = {\n channel_search_cids: string[];\n channel_search_count: number;\n warning_code: number;\n warning_description: string;\n};\n\n// Thumb URL(thumb_url) is added considering video attachments as the backend will return the thumbnail in the response.\nexport type SendFileAPIResponse = APIResponse & { file: string; thumb_url?: string };\n\nexport type SendMessageAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n message: MessageResponse<StreamChatGenerics>;\n pending_message_metadata?: Record<string, string> | null;\n};\n\nexport type SyncResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n events: Event<StreamChatGenerics>[];\n inaccessible_cids?: string[];\n};\n\nexport type TruncateChannelAPIResponse<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = APIResponse & {\n channel: ChannelResponse<StreamChatGenerics>;\n message?: MessageResponse<StreamChatGenerics>;\n};\n\nexport type UpdateChannelAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n channel: ChannelResponse<StreamChatGenerics>;\n members: ChannelMemberResponse<StreamChatGenerics>[];\n message?: MessageResponse<StreamChatGenerics>;\n};\n\nexport type UpdateChannelResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse &\n Omit<CreateChannelOptions<StreamChatGenerics>, 'client_id' | 'connection_id'> & {\n created_at: string;\n updated_at: string;\n };\n\nexport type UpdateCommandResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n command: UpdateCommandOptions<StreamChatGenerics> &\n CreatedAtUpdatedAt & {\n name: CommandVariants<StreamChatGenerics>;\n };\n};\n\nexport type UpdateMessageAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n message: MessageResponse<StreamChatGenerics>;\n};\n\nexport type UsersAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n users: Array<UserResponse<StreamChatGenerics>>;\n};\n\nexport type UpdateUsersAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n users: { [key: string]: UserResponse<StreamChatGenerics> };\n};\n\nexport type UserResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = User<StreamChatGenerics> & {\n banned?: boolean;\n blocked_user_ids?: string[];\n created_at?: string;\n deactivated_at?: string;\n deleted_at?: string;\n language?: TranslationLanguages | '';\n last_active?: string;\n online?: boolean;\n privacy_settings?: PrivacySettings;\n push_notifications?: PushNotificationSettings;\n revoke_tokens_issued_before?: string;\n shadow_banned?: boolean;\n updated_at?: string;\n};\n\nexport type PrivacySettings = {\n read_receipts?: {\n enabled?: boolean;\n };\n typing_indicators?: {\n enabled?: boolean;\n };\n};\n\nexport type PushNotificationSettings = {\n disabled?: boolean;\n disabled_until?: string | null;\n};\n\n/**\n * Option Types\n */\n\nexport type MessageFlagsPaginationOptions = {\n limit?: number;\n offset?: number;\n};\n\nexport type FlagsPaginationOptions = {\n limit?: number;\n offset?: number;\n};\n\nexport type FlagReportsPaginationOptions = {\n limit?: number;\n offset?: number;\n};\n\nexport type ReviewFlagReportOptions = {\n review_details?: Object;\n user_id?: string;\n};\n\nexport type BannedUsersPaginationOptions = Omit<PaginationOptions, 'id_gt' | 'id_gte' | 'id_lt' | 'id_lte'> & {\n exclude_expired_bans?: boolean;\n};\n\nexport type BanUserOptions<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = UnBanUserOptions & {\n banned_by?: UserResponse<StreamChatGenerics>;\n banned_by_id?: string;\n ip_ban?: boolean;\n reason?: string;\n timeout?: number;\n};\n\nexport type ChannelOptions = {\n limit?: number;\n member_limit?: number;\n message_limit?: number;\n offset?: number;\n presence?: boolean;\n state?: boolean;\n user_id?: string;\n watch?: boolean;\n};\n\nexport type ChannelQueryOptions<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n client_id?: string;\n connection_id?: string;\n data?: ChannelResponse<StreamChatGenerics>;\n hide_for_creator?: boolean;\n members?: PaginationOptions;\n messages?: MessagePaginationOptions;\n presence?: boolean;\n state?: boolean;\n watch?: boolean;\n watchers?: PaginationOptions;\n};\n\nexport type ChannelStateOptions = {\n offlineMode?: boolean;\n skipInitialization?: string[];\n};\n\nexport type CreateChannelOptions<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n automod?: ChannelConfigAutomod;\n automod_behavior?: ChannelConfigAutomodBehavior;\n automod_thresholds?: ChannelConfigAutomodThresholds;\n blocklist?: string;\n blocklist_behavior?: ChannelConfigAutomodBehavior;\n client_id?: string;\n commands?: CommandVariants<StreamChatGenerics>[];\n connect_events?: boolean;\n connection_id?: string;\n custom_events?: boolean;\n grants?: Record<string, string[]>;\n mark_messages_pending?: boolean;\n max_message_length?: number;\n message_retention?: string;\n mutes?: boolean;\n name?: string;\n permissions?: PermissionObject[];\n polls?: boolean;\n push_notifications?: boolean;\n quotes?: boolean;\n reactions?: boolean;\n read_events?: boolean;\n reminders?: boolean;\n replies?: boolean;\n search?: boolean;\n skip_last_msg_update_for_system_msgs?: boolean;\n typing_events?: boolean;\n uploads?: boolean;\n url_enrichment?: boolean;\n};\n\nexport type CreateCommandOptions<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n description: string;\n name: CommandVariants<StreamChatGenerics>;\n args?: string;\n set?: CommandVariants<StreamChatGenerics>;\n};\n\nexport type CustomPermissionOptions = {\n action: string;\n condition: object;\n id: string;\n name: string;\n description?: string;\n owner?: boolean;\n same_team?: boolean;\n};\n\nexport type DeactivateUsersOptions = {\n created_by_id?: string;\n mark_messages_deleted?: boolean;\n};\n\nexport type NewMemberPayload<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = StreamChatGenerics['memberType'] & Pick<ChannelMemberResponse<StreamChatGenerics>, 'user_id' | 'channel_role'>;\n\n// TODO: rename to UpdateChannelOptions in the next major update and use it in channel._update and/or channel.update\nexport type InviteOptions<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n accept_invite?: boolean;\n add_members?: string[];\n add_moderators?: string[];\n client_id?: string;\n connection_id?: string;\n data?: Omit<ChannelResponse<StreamChatGenerics>, 'id' | 'cid'>;\n demote_moderators?: string[];\n invites?: string[];\n message?: MessageResponse<StreamChatGenerics>;\n reject_invite?: boolean;\n remove_members?: string[];\n user?: UserResponse<StreamChatGenerics>;\n user_id?: string;\n};\n\n/** @deprecated use MarkChannelsReadOptions instead */\nexport type MarkAllReadOptions<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = MarkChannelsReadOptions<StreamChatGenerics>;\n\nexport type MarkChannelsReadOptions<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n client_id?: string;\n connection_id?: string;\n read_by_channel?: Record<string, string>;\n user?: UserResponse<StreamChatGenerics>;\n user_id?: string;\n};\n\nexport type MarkReadOptions<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n client_id?: string;\n connection_id?: string;\n thread_id?: string;\n user?: UserResponse<StreamChatGenerics>;\n user_id?: string;\n};\n\nexport type MarkUnreadOptions<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n client_id?: string;\n connection_id?: string;\n message_id?: string;\n thread_id?: string;\n user?: UserResponse<StreamChatGenerics>;\n user_id?: string;\n};\n\nexport type MuteUserOptions<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n client_id?: string;\n connection_id?: string;\n id?: string;\n reason?: string;\n target_user_id?: string;\n timeout?: number;\n type?: string;\n user?: UserResponse<StreamChatGenerics>;\n user_id?: string;\n};\n\nexport type PaginationOptions = {\n created_at_after?: string | Date;\n created_at_after_or_equal?: string | Date;\n created_at_before?: string | Date;\n created_at_before_or_equal?: string | Date;\n id_gt?: string;\n id_gte?: string;\n id_lt?: string;\n id_lte?: string;\n limit?: number;\n offset?: number; // should be avoided with channel.query()\n};\n\nexport type MessagePaginationOptions = PaginationOptions & {\n created_at_around?: string | Date;\n id_around?: string;\n};\n\nexport type PinnedMessagePaginationOptions = {\n id_around?: string;\n id_gt?: string;\n id_gte?: string;\n id_lt?: string;\n id_lte?: string;\n limit?: number;\n offset?: number;\n pinned_at_after?: string | Date;\n pinned_at_after_or_equal?: string | Date;\n pinned_at_around?: string | Date;\n pinned_at_before?: string | Date;\n pinned_at_before_or_equal?: string | Date;\n};\n\nexport type QueryMembersOptions = {\n // Pagination option: select members created after the date (RFC399)\n created_at_after?: string;\n // Pagination option: select members created after or equal the date (RFC399)\n created_at_after_or_equal?: string;\n // Pagination option: select members created before the date (RFC399)\n created_at_before?: string;\n // Pagination option: select members created before or equal the date (RFC399)\n created_at_before_or_equal?: string;\n // Number of members to return, default 100\n limit?: number;\n // Offset (max is 1000)\n offset?: number;\n // \tPagination option: excludes members with ID less or equal the value\n user_id_gt?: string;\n // Pagination option: excludes members with ID less than the value\n user_id_gte?: string;\n // Pagination option: excludes members with ID greater or equal the value\n user_id_lt?: string;\n // \tPagination option: excludes members with ID greater than the value\n user_id_lte?: string;\n};\n\nexport type ReactivateUserOptions = {\n created_by_id?: string;\n name?: string;\n restore_messages?: boolean;\n};\n\nexport type ReactivateUsersOptions = {\n created_by_id?: string;\n restore_messages?: boolean;\n};\n\nexport type SearchOptions<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n limit?: number;\n next?: string;\n offset?: number;\n sort?: SearchMessageSort<StreamChatGenerics>;\n};\n\nexport type StreamChatOptions = AxiosRequestConfig & {\n /**\n * Used to disable warnings that are triggered by using connectUser or connectAnonymousUser server-side.\n */\n allowServerSideConnect?: boolean;\n axiosRequestConfig?: AxiosRequestConfig;\n /**\n * Base url to use for API\n * such as https://chat-proxy-dublin.stream-io-api.com\n */\n baseURL?: string;\n browser?: boolean;\n device?: BaseDeviceFields;\n /**\n * Disables the hydration of all caches within the JS Client. This includes this.activeChannels,\n * this.polls.pollCache and this.config.\n * It is mainly meant to be used for integrations where stream-chat is used as a server-side service\n * interacting with Stream's REST API, not depending on any state and purely serving as a wrapper\n * around HTTP requests. Using this property on either the client side or a backend implementation\n * that also relies on WS events will break these functionalities, so please use carefully.\n */\n disableCache?: boolean;\n enableInsights?: boolean;\n /** experimental feature, please contact support if you want this feature enabled for you */\n enableWSFallback?: boolean;\n logger?: Logger;\n /**\n * When true, user will be persisted on client. Otherwise if `connectUser` call fails, then you need to\n * call `connectUser` again to retry.\n * This is mainly useful for chat application working in offline mode, where you will need client.user to\n * persist even if connectUser call fails.\n */\n persistUserOnConnectionFailure?: boolean;\n /**\n * When network is recovered, we re-query the active channels on client. But in single query, you can recover\n * only 30 channels. So its not guaranteed that all the channels in activeChannels object have updated state.\n * Thus in UI sdks, state recovery is managed by components themselves, they don't rely on js client for this.\n *\n * `recoverStateOnReconnect` parameter can be used in such cases, to disable state recovery within js client.\n * When false, user/consumer of this client will need to make sure all the channels present on UI by\n * manually calling queryChannels endpoint.\n */\n recoverStateOnReconnect?: boolean;\n warmUp?: boolean;\n /**\n * Set the instance of StableWSConnection on chat client. Its purely for testing purpose and should\n * not be used in production apps.\n */\n wsConnection?: StableWSConnection;\n};\n\nexport type SyncOptions = {\n /**\n * This will behave as queryChannels option.\n */\n watch?: boolean;\n /**\n * Return channels from request that user does not have access to in a separate\n * field in the response called 'inaccessible_cids' instead of\n * adding them as 'notification.removed_from_channel' events.\n */\n with_inaccessible_cids?: boolean;\n};\n\nexport type UnBanUserOptions = {\n client_id?: string;\n connection_id?: string;\n id?: string;\n shadow?: boolean;\n target_user_id?: string;\n type?: string;\n};\n\n// TODO: rename to UpdateChannelTypeOptions in the next major update\nexport type UpdateChannelOptions<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = Omit<\n CreateChannelOptions<StreamChatGenerics>,\n 'name'\n> & {\n created_at?: string;\n updated_at?: string;\n};\n\nexport type UpdateCommandOptions<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n description: string;\n args?: string;\n set?: CommandVariants<StreamChatGenerics>;\n};\n\nexport type UserOptions = {\n include_deactivated_users?: boolean;\n limit?: number;\n offset?: number;\n presence?: boolean;\n};\n\n/**\n * Event Types\n */\n\nexport type ConnectionChangeEvent = {\n type: EventTypes;\n online?: boolean;\n};\n\nexport type Event<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = StreamChatGenerics['eventType'] & {\n type: EventTypes;\n ai_message?: string;\n ai_state?: AIState;\n channel?: ChannelResponse<StreamChatGenerics>;\n channel_id?: string;\n channel_type?: string;\n cid?: string;\n clear_history?: boolean;\n connection_id?: string;\n // event creation timestamp, format Date ISO string\n created_at?: string;\n // id of the message that was marked as unread - all the following messages are considered unread. (notification.mark_unread)\n first_unread_message_id?: string;\n hard_delete?: boolean;\n // creation date of a message with last_read_message_id, formatted as Date ISO string\n last_read_at?: string;\n last_read_message_id?: string;\n mark_messages_deleted?: boolean;\n me?: OwnUserResponse<StreamChatGenerics>;\n member?: ChannelMemberResponse<StreamChatGenerics>;\n message?: MessageResponse<StreamChatGenerics>;\n message_id?: string;\n mode?: string;\n online?: boolean;\n parent_id?: string;\n poll?: PollResponse<StreamChatGenerics>;\n poll_vote?: PollVote<StreamChatGenerics> | PollAnswer<StreamChatGenerics>;\n queriedChannels?: {\n channels: ChannelAPIResponse<StreamChatGenerics>[];\n isLatestMessageSet?: boolean;\n };\n reaction?: ReactionResponse<StreamChatGenerics>;\n received_at?: string | Date;\n team?: string;\n thread?: ThreadResponse<StreamChatGenerics>;\n // @deprecated number of all unread messages across all current user's unread channels, equals unread_count\n total_unread_count?: number;\n // number of all current user's channels with at least one unread message including the channel in this event\n unread_channels?: number;\n // number of all unread messages across all current user's unread channels\n unread_count?: number;\n // number of unread messages in the channel from this event (notification.mark_unread)\n unread_messages?: number;\n unread_thread_messages?: number;\n unread_threads?: number;\n user?: UserResponse<StreamChatGenerics>;\n user_id?: string;\n watcher_count?: number;\n};\n\nexport type UserCustomEvent<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = StreamChatGenerics['eventType'] & {\n type: string;\n};\n\nexport type EventHandler<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = (\n event: Event<StreamChatGenerics>,\n) => void;\n\nexport type EventTypes = 'all' | keyof typeof EVENT_MAP;\n\n/**\n * Filter Types\n */\n\nexport type AscDesc = 1 | -1;\n\nexport type MessageFlagsFiltersOptions = {\n channel_cid?: string;\n is_reviewed?: boolean;\n team?: string;\n user_id?: string;\n};\n\nexport type MessageFlagsFilters = QueryFilters<\n {\n channel_cid?:\n | RequireOnlyOne<Pick<QueryFilter<MessageFlagsFiltersOptions['channel_cid']>, '$eq' | '$in'>>\n | PrimitiveFilter<MessageFlagsFiltersOptions['channel_cid']>;\n } & {\n team?:\n | RequireOnlyOne<Pick<QueryFilter<MessageFlagsFiltersOptions['team']>, '$eq' | '$in'>>\n | PrimitiveFilter<MessageFlagsFiltersOptions['team']>;\n } & {\n user_id?:\n | RequireOnlyOne<Pick<QueryFilter<MessageFlagsFiltersOptions['user_id']>, '$eq' | '$in'>>\n | PrimitiveFilter<MessageFlagsFiltersOptions['user_id']>;\n } & {\n [Key in keyof Omit<MessageFlagsFiltersOptions, 'channel_cid' | 'user_id' | 'is_reviewed'>]:\n | RequireOnlyOne<QueryFilter<MessageFlagsFiltersOptions[Key]>>\n | PrimitiveFilter<MessageFlagsFiltersOptions[Key]>;\n }\n>;\n\nexport type FlagsFiltersOptions = {\n channel_cid?: string;\n message_id?: string;\n message_user_id?: string;\n reporter_id?: string;\n team?: string;\n user_id?: string;\n};\n\nexport type FlagsFilters = QueryFilters<\n {\n user_id?:\n | RequireOnlyOne<Pick<QueryFilter<FlagsFiltersOptions['user_id']>, '$eq' | '$in'>>\n | PrimitiveFilter<FlagsFiltersOptions['user_id']>;\n } & {\n message_id?:\n | RequireOnlyOne<Pick<QueryFilter<FlagsFiltersOptions['message_id']>, '$eq' | '$in'>>\n | PrimitiveFilter<FlagsFiltersOptions['message_id']>;\n } & {\n message_user_id?:\n | RequireOnlyOne<Pick<QueryFilter<FlagsFiltersOptions['message_user_id']>, '$eq' | '$in'>>\n | PrimitiveFilter<FlagsFiltersOptions['message_user_id']>;\n } & {\n channel_cid?:\n | RequireOnlyOne<Pick<QueryFilter<FlagsFiltersOptions['channel_cid']>, '$eq' | '$in'>>\n | PrimitiveFilter<FlagsFiltersOptions['channel_cid']>;\n } & {\n reporter_id?:\n | RequireOnlyOne<Pick<QueryFilter<FlagsFiltersOptions['reporter_id']>, '$eq' | '$in'>>\n | PrimitiveFilter<FlagsFiltersOptions['reporter_id']>;\n } & {\n team?:\n | RequireOnlyOne<Pick<QueryFilter<FlagsFiltersOptions['team']>, '$eq' | '$in'>>\n | PrimitiveFilter<FlagsFiltersOptions['team']>;\n }\n>;\n\nexport type FlagReportsFiltersOptions = {\n channel_cid?: string;\n is_reviewed?: boolean;\n message_id?: string;\n message_user_id?: string;\n report_id?: string;\n review_result?: string;\n reviewed_by?: string;\n team?: string;\n user_id?: string;\n};\n\nexport type FlagReportsFilters = QueryFilters<\n {\n report_id?:\n | RequireOnlyOne<Pick<QueryFilter<FlagReportsFiltersOptions['report_id']>, '$eq' | '$in'>>\n | PrimitiveFilter<FlagReportsFiltersOptions['report_id']>;\n } & {\n review_result?:\n | RequireOnlyOne<Pick<QueryFilter<FlagReportsFiltersOptions['review_result']>, '$eq' | '$in'>>\n | PrimitiveFilter<FlagReportsFiltersOptions['review_result']>;\n } & {\n reviewed_by?:\n | RequireOnlyOne<Pick<QueryFilter<FlagReportsFiltersOptions['reviewed_by']>, '$eq' | '$in'>>\n | PrimitiveFilter<FlagReportsFiltersOptions['reviewed_by']>;\n } & {\n user_id?:\n | RequireOnlyOne<Pick<QueryFilter<FlagReportsFiltersOptions['user_id']>, '$eq' | '$in'>>\n | PrimitiveFilter<FlagReportsFiltersOptions['user_id']>;\n } & {\n message_id?:\n | RequireOnlyOne<Pick<QueryFilter<FlagReportsFiltersOptions['message_id']>, '$eq' | '$in'>>\n | PrimitiveFilter<FlagReportsFiltersOptions['message_id']>;\n } & {\n message_user_id?:\n | RequireOnlyOne<Pick<QueryFilter<FlagReportsFiltersOptions['message_user_id']>, '$eq' | '$in'>>\n | PrimitiveFilter<FlagReportsFiltersOptions['message_user_id']>;\n } & {\n channel_cid?:\n | RequireOnlyOne<Pick<QueryFilter<FlagReportsFiltersOptions['channel_cid']>, '$eq' | '$in'>>\n | PrimitiveFilter<FlagReportsFiltersOptions['channel_cid']>;\n } & {\n team?:\n | RequireOnlyOne<Pick<QueryFilter<FlagReportsFiltersOptions['team']>, '$eq' | '$in'>>\n | PrimitiveFilter<FlagReportsFiltersOptions['team']>;\n } & {\n [Key in keyof Omit<\n FlagReportsFiltersOptions,\n 'report_id' | 'user_id' | 'message_id' | 'review_result' | 'reviewed_by'\n >]: RequireOnlyOne<QueryFilter<FlagReportsFiltersOptions[Key]>> | PrimitiveFilter<FlagReportsFiltersOptions[Key]>;\n }\n>;\n\nexport type BannedUsersFilterOptions = {\n banned_by_id?: string;\n channel_cid?: string;\n created_at?: string;\n reason?: string;\n user_id?: string;\n};\n\nexport type BannedUsersFilters = QueryFilters<\n {\n channel_cid?:\n | RequireOnlyOne<Pick<QueryFilter<BannedUsersFilterOptions['channel_cid']>, '$eq' | '$in'>>\n | PrimitiveFilter<BannedUsersFilterOptions['channel_cid']>;\n } & {\n reason?:\n | RequireOnlyOne<\n {\n $autocomplete?: BannedUsersFilterOptions['reason'];\n } & QueryFilter<BannedUsersFilterOptions['reason']>\n >\n | PrimitiveFilter<BannedUsersFilterOptions['reason']>;\n } & {\n [Key in keyof Omit<BannedUsersFilterOptions, 'channel_cid' | 'reason'>]:\n | RequireOnlyOne<QueryFilter<BannedUsersFilterOptions[Key]>>\n | PrimitiveFilter<BannedUsersFilterOptions[Key]>;\n }\n>;\n\nexport type ReactionFilters<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = QueryFilters<\n {\n user_id?:\n | RequireOnlyOne<Pick<QueryFilter<ReactionResponse<StreamChatGenerics>['user_id']>, '$eq' | '$in'>>\n | PrimitiveFilter<ReactionResponse<StreamChatGenerics>['user_id']>;\n } & {\n type?:\n | RequireOnlyOne<Pick<QueryFilter<ReactionResponse<StreamChatGenerics>['type']>, '$eq'>>\n | PrimitiveFilter<ReactionResponse<StreamChatGenerics>['type']>;\n } & {\n created_at?:\n | RequireOnlyOne<Pick<QueryFilter<PollResponse['created_at']>, '$eq' | '$gt' | '$lt' | '$gte' | '$lte'>>\n | PrimitiveFilter<PollResponse['created_at']>;\n }\n>;\n\nexport type ChannelFilters<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = QueryFilters<\n ContainsOperator<StreamChatGenerics['channelType']> & {\n members?:\n | RequireOnlyOne<Pick<QueryFilter<string>, '$in' | '$nin'>>\n | RequireOnlyOne<Pick<QueryFilter<string[]>, '$eq'>>\n | PrimitiveFilter<string[]>;\n } & {\n name?:\n | RequireOnlyOne<\n {\n $autocomplete?: ChannelResponse<StreamChatGenerics>['name'];\n } & QueryFilter<ChannelResponse<StreamChatGenerics>['name']>\n >\n | PrimitiveFilter<ChannelResponse<StreamChatGenerics>['name']>;\n } & {\n [Key in keyof Omit<\n ChannelResponse<{\n attachmentType: StreamChatGenerics['attachmentType'];\n channelType: {};\n commandType: StreamChatGenerics['commandType'];\n eventType: StreamChatGenerics['eventType'];\n memberType: StreamChatGenerics['memberType'];\n messageType: StreamChatGenerics['messageType'];\n pollOptionType: StreamChatGenerics['pollOptionType'];\n pollType: StreamChatGenerics['pollType'];\n reactionType: StreamChatGenerics['reactionType'];\n userType: StreamChatGenerics['userType'];\n }>,\n 'name' | 'members'\n >]:\n | RequireOnlyOne<\n QueryFilter<\n ChannelResponse<{\n attachmentType: StreamChatGenerics['attachmentType'];\n channelType: {};\n commandType: StreamChatGenerics['commandType'];\n eventType: StreamChatGenerics['eventType'];\n memberType: StreamChatGenerics['memberType'];\n messageType: StreamChatGenerics['messageType'];\n pollOptionType: StreamChatGenerics['pollOptionType'];\n pollType: StreamChatGenerics['pollType'];\n reactionType: StreamChatGenerics['reactionType'];\n userType: StreamChatGenerics['userType'];\n }>[Key]\n >\n >\n | PrimitiveFilter<\n ChannelResponse<{\n attachmentType: StreamChatGenerics['attachmentType'];\n channelType: {};\n commandType: StreamChatGenerics['commandType'];\n eventType: StreamChatGenerics['eventType'];\n memberType: StreamChatGenerics['memberType'];\n messageType: StreamChatGenerics['messageType'];\n pollOptionType: StreamChatGenerics['pollOptionType'];\n pollType: StreamChatGenerics['pollType'];\n reactionType: StreamChatGenerics['reactionType'];\n userType: StreamChatGenerics['userType'];\n }>[Key]\n >;\n } & {\n archived?: boolean;\n pinned?: boolean;\n }\n>;\n\nexport type QueryPollsParams = {\n filter?: QueryPollsFilters;\n options?: QueryPollsOptions;\n sort?: PollSort;\n};\n\nexport type QueryPollsOptions = Pager;\n\nexport type VotesFiltersOptions = {\n is_answer?: boolean;\n option_id?: string;\n user_id?: string;\n};\n\nexport type QueryVotesOptions = Pager;\n\nexport type QueryPollsFilters = QueryFilters<\n {\n id?: RequireOnlyOne<Pick<QueryFilter<PollResponse['id']>, '$eq' | '$in'>> | PrimitiveFilter<PollResponse['id']>;\n } & {\n user_id?:\n | RequireOnlyOne<Pick<QueryFilter<VotesFiltersOptions['user_id']>, '$eq' | '$in'>>\n | PrimitiveFilter<VotesFiltersOptions['user_id']>;\n } & {\n is_closed?:\n | RequireOnlyOne<Pick<QueryFilter<PollResponse['is_closed']>, '$eq'>>\n | PrimitiveFilter<PollResponse['is_closed']>;\n } & {\n max_votes_allowed?:\n | RequireOnlyOne<\n Pick<QueryFilter<PollResponse['max_votes_allowed']>, '$eq' | '$ne' | '$gt' | '$lt' | '$gte' | '$lte'>\n >\n | PrimitiveFilter<PollResponse['max_votes_allowed']>;\n } & {\n allow_answers?:\n | RequireOnlyOne<Pick<QueryFilter<PollResponse['allow_answers']>, '$eq'>>\n | PrimitiveFilter<PollResponse['allow_answers']>;\n } & {\n allow_user_suggested_options?:\n | RequireOnlyOne<Pick<QueryFilter<PollResponse['allow_user_suggested_options']>, '$eq'>>\n | PrimitiveFilter<PollResponse['allow_user_suggested_options']>;\n } & {\n voting_visibility?:\n | RequireOnlyOne<Pick<QueryFilter<PollResponse['voting_visibility']>, '$eq'>>\n | PrimitiveFilter<PollResponse['voting_visibility']>;\n } & {\n created_at?:\n | RequireOnlyOne<Pick<QueryFilter<PollResponse['created_at']>, '$eq' | '$gt' | '$lt' | '$gte' | '$lte'>>\n | PrimitiveFilter<PollResponse['created_at']>;\n } & {\n created_by_id?:\n | RequireOnlyOne<Pick<QueryFilter<PollResponse['created_by_id']>, '$eq' | '$in'>>\n | PrimitiveFilter<PollResponse['created_by_id']>;\n } & {\n updated_at?:\n | RequireOnlyOne<Pick<QueryFilter<PollResponse['updated_at']>, '$eq' | '$gt' | '$lt' | '$gte' | '$lte'>>\n | PrimitiveFilter<PollResponse['updated_at']>;\n } & {\n name?:\n | RequireOnlyOne<Pick<QueryFilter<PollResponse['name']>, '$eq' | '$in'>>\n | PrimitiveFilter<PollResponse['name']>;\n }\n>;\n\nexport type QueryVotesFilters = QueryFilters<\n {\n id?: RequireOnlyOne<Pick<QueryFilter<PollResponse['id']>, '$eq' | '$in'>> | PrimitiveFilter<PollResponse['id']>;\n } & {\n option_id?:\n | RequireOnlyOne<Pick<QueryFilter<VotesFiltersOptions['option_id']>, '$eq' | '$in'>>\n | PrimitiveFilter<VotesFiltersOptions['option_id']>;\n } & {\n is_answer?:\n | RequireOnlyOne<Pick<QueryFilter<VotesFiltersOptions['is_answer']>, '$eq'>>\n | PrimitiveFilter<VotesFiltersOptions['is_answer']>;\n } & {\n user_id?:\n | RequireOnlyOne<Pick<QueryFilter<VotesFiltersOptions['user_id']>, '$eq' | '$in'>>\n | PrimitiveFilter<VotesFiltersOptions['user_id']>;\n } & {\n created_at?:\n | RequireOnlyOne<Pick<QueryFilter<PollResponse['created_at']>, '$eq' | '$gt' | '$lt' | '$gte' | '$lte'>>\n | PrimitiveFilter<PollResponse['created_at']>;\n } & {\n created_by_id?:\n | RequireOnlyOne<Pick<QueryFilter<PollResponse['created_by_id']>, '$eq' | '$in'>>\n | PrimitiveFilter<PollResponse['created_by_id']>;\n } & {\n updated_at?:\n | RequireOnlyOne<Pick<QueryFilter<PollResponse['updated_at']>, '$eq' | '$gt' | '$lt' | '$gte' | '$lte'>>\n | PrimitiveFilter<PollResponse['updated_at']>;\n }\n>;\n\nexport type ContainsOperator<CustomType = {}> = {\n [Key in keyof CustomType]?: CustomType[Key] extends (infer ContainType)[]\n ?\n | RequireOnlyOne<\n {\n $contains?: ContainType extends object\n ? PrimitiveFilter<RequireAtLeastOne<ContainType>>\n : PrimitiveFilter<ContainType>;\n } & QueryFilter<PrimitiveFilter<ContainType>[]>\n >\n | PrimitiveFilter<PrimitiveFilter<ContainType>[]>\n : RequireOnlyOne<QueryFilter<CustomType[Key]>> | PrimitiveFilter<CustomType[Key]>;\n};\n\nexport type MessageFilters<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = QueryFilters<\n ContainsOperator<StreamChatGenerics['messageType']> & {\n text?:\n | RequireOnlyOne<\n {\n $autocomplete?: MessageResponse<StreamChatGenerics>['text'];\n $q?: MessageResponse<StreamChatGenerics>['text'];\n } & QueryFilter<MessageResponse<StreamChatGenerics>['text']>\n >\n | PrimitiveFilter<MessageResponse<StreamChatGenerics>['text']>;\n } & {\n [Key in keyof Omit<\n MessageResponse<{\n attachmentType: StreamChatGenerics['attachmentType'];\n channelType: StreamChatGenerics['channelType'];\n commandType: StreamChatGenerics['commandType'];\n eventType: StreamChatGenerics['eventType'];\n memberType: StreamChatGenerics['memberType'];\n messageType: {};\n pollOptionType: StreamChatGenerics['pollOptionType'];\n pollType: StreamChatGenerics['pollType'];\n reactionType: StreamChatGenerics['reactionType'];\n userType: StreamChatGenerics['userType'];\n }>,\n 'text'\n >]?:\n | RequireOnlyOne<\n QueryFilter<\n MessageResponse<{\n attachmentType: StreamChatGenerics['attachmentType'];\n channelType: StreamChatGenerics['channelType'];\n commandType: StreamChatGenerics['commandType'];\n eventType: StreamChatGenerics['eventType'];\n memberType: StreamChatGenerics['memberType'];\n messageType: {};\n pollOptionType: StreamChatGenerics['pollOptionType'];\n pollType: StreamChatGenerics['pollType'];\n reactionType: StreamChatGenerics['reactionType'];\n userType: StreamChatGenerics['userType'];\n }>[Key]\n >\n >\n | PrimitiveFilter<\n MessageResponse<{\n attachmentType: StreamChatGenerics['attachmentType'];\n channelType: StreamChatGenerics['channelType'];\n commandType: StreamChatGenerics['commandType'];\n eventType: StreamChatGenerics['eventType'];\n memberType: StreamChatGenerics['memberType'];\n messageType: {};\n pollOptionType: StreamChatGenerics['pollOptionType'];\n pollType: StreamChatGenerics['pollType'];\n reactionType: StreamChatGenerics['reactionType'];\n userType: StreamChatGenerics['userType'];\n }>[Key]\n >;\n }\n>;\n\nexport type MessageOptions = {\n include_thread_participants?: boolean;\n};\n\nexport type PrimitiveFilter<ObjectType> = ObjectType | null;\n\nexport type QueryFilter<ObjectType = string> = NonNullable<ObjectType> extends string | number | boolean\n ? {\n $eq?: PrimitiveFilter<ObjectType>;\n $exists?: boolean;\n $gt?: PrimitiveFilter<ObjectType>;\n $gte?: PrimitiveFilter<ObjectType>;\n $in?: PrimitiveFilter<ObjectType>[];\n $lt?: PrimitiveFilter<ObjectType>;\n $lte?: PrimitiveFilter<ObjectType>;\n /**\n * @deprecated and will be removed in a future release. Filtering shall be applied client-side.\n */\n $ne?: PrimitiveFilter<ObjectType>;\n /**\n * @deprecated and will be removed in a future release. Filtering shall be applied client-side.\n */\n $nin?: PrimitiveFilter<ObjectType>[];\n }\n : {\n $eq?: PrimitiveFilter<ObjectType>;\n $exists?: boolean;\n $in?: PrimitiveFilter<ObjectType>[];\n /**\n * @deprecated and will be removed in a future release. Filtering shall be applied client-side.\n */\n $ne?: PrimitiveFilter<ObjectType>;\n /**\n * @deprecated and will be removed in a future release. Filtering shall be applied client-side.\n */\n $nin?: PrimitiveFilter<ObjectType>[];\n };\n\nexport type QueryFilters<Operators = {}> = {\n [Key in keyof Operators]?: Operators[Key];\n} &\n QueryLogicalOperators<Operators>;\n\nexport type QueryLogicalOperators<Operators> = {\n $and?: ArrayOneOrMore<QueryFilters<Operators>>;\n $nor?: ArrayOneOrMore<QueryFilters<Operators>>;\n $or?: ArrayTwoOrMore<QueryFilters<Operators>>;\n};\n\nexport type UserFilters<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = QueryFilters<\n ContainsOperator<StreamChatGenerics['userType']> & {\n id?:\n | RequireOnlyOne<\n { $autocomplete?: UserResponse<StreamChatGenerics>['id'] } & QueryFilter<\n UserResponse<StreamChatGenerics>['id']\n >\n >\n | PrimitiveFilter<UserResponse<StreamChatGenerics>['id']>;\n name?:\n | RequireOnlyOne<\n { $autocomplete?: UserResponse<StreamChatGenerics>['name'] } & QueryFilter<\n UserResponse<StreamChatGenerics>['name']\n >\n >\n | PrimitiveFilter<UserResponse<StreamChatGenerics>['name']>;\n notifications_muted?:\n | RequireOnlyOne<{\n $eq?: PrimitiveFilter<UserResponse<StreamChatGenerics>['notifications_muted']>;\n }>\n | boolean;\n teams?:\n | RequireOnlyOne<{\n $contains?: PrimitiveFilter<string>;\n $eq?: PrimitiveFilter<UserResponse<StreamChatGenerics>['teams']>;\n $in?: PrimitiveFilter<UserResponse<StreamChatGenerics>['teams']>;\n }>\n | PrimitiveFilter<UserResponse<StreamChatGenerics>['teams']>;\n username?:\n | RequireOnlyOne<\n { $autocomplete?: UserResponse<StreamChatGenerics>['username'] } & QueryFilter<\n UserResponse<StreamChatGenerics>['username']\n >\n >\n | PrimitiveFilter<UserResponse<StreamChatGenerics>['username']>;\n } & {\n [Key in keyof Omit<\n UserResponse<{\n attachmentType: StreamChatGenerics['attachmentType'];\n channelType: StreamChatGenerics['channelType'];\n commandType: StreamChatGenerics['commandType'];\n eventType: StreamChatGenerics['eventType'];\n memberType: StreamChatGenerics['memberType'];\n messageType: StreamChatGenerics['messageType'];\n pollOptionType: StreamChatGenerics['pollOptionType'];\n pollType: StreamChatGenerics['pollType'];\n reactionType: StreamChatGenerics['reactionType'];\n userType: {};\n }>,\n 'id' | 'name' | 'teams' | 'username'\n >]?:\n | RequireOnlyOne<\n QueryFilter<\n UserResponse<{\n attachmentType: StreamChatGenerics['attachmentType'];\n channelType: StreamChatGenerics['channelType'];\n commandType: StreamChatGenerics['commandType'];\n eventType: StreamChatGenerics['eventType'];\n memberType: StreamChatGenerics['memberType'];\n messageType: StreamChatGenerics['messageType'];\n pollOptionType: StreamChatGenerics['pollOptionType'];\n pollType: StreamChatGenerics['pollType'];\n reactionType: StreamChatGenerics['reactionType'];\n userType: {};\n }>[Key]\n >\n >\n | PrimitiveFilter<\n UserResponse<{\n attachmentType: StreamChatGenerics['attachmentType'];\n channelType: StreamChatGenerics['channelType'];\n commandType: StreamChatGenerics['commandType'];\n eventType: StreamChatGenerics['eventType'];\n memberType: StreamChatGenerics['memberType'];\n messageType: StreamChatGenerics['messageType'];\n pollOptionType: StreamChatGenerics['pollOptionType'];\n pollType: StreamChatGenerics['pollType'];\n reactionType: StreamChatGenerics['reactionType'];\n userType: {};\n }>[Key]\n >;\n }\n>;\n\nexport type InviteStatus = 'pending' | 'accepted' | 'rejected';\n\n// https://getstream.io/chat/docs/react/channel_member/#update-channel-members\nexport type MemberFilters<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = QueryFilters<\n {\n banned?:\n | { $eq?: ChannelMemberResponse<StreamChatGenerics>['banned'] }\n | ChannelMemberResponse<StreamChatGenerics>['banned'];\n channel_role?:\n | { $eq?: ChannelMemberResponse<StreamChatGenerics>['channel_role'] }\n | ChannelMemberResponse<StreamChatGenerics>['channel_role'];\n cid?: { $eq?: ChannelResponse<StreamChatGenerics>['cid'] } | ChannelResponse<StreamChatGenerics>['cid'];\n created_at?:\n | {\n $eq?: ChannelMemberResponse<StreamChatGenerics>['created_at'];\n $gt?: ChannelMemberResponse<StreamChatGenerics>['created_at'];\n $gte?: ChannelMemberResponse<StreamChatGenerics>['created_at'];\n $lt?: ChannelMemberResponse<StreamChatGenerics>['created_at'];\n $lte?: ChannelMemberResponse<StreamChatGenerics>['created_at'];\n }\n | ChannelMemberResponse<StreamChatGenerics>['created_at'];\n id?:\n | RequireOnlyOne<{\n $eq?: UserResponse<StreamChatGenerics>['id'];\n $in?: UserResponse<StreamChatGenerics>['id'][];\n }>\n | UserResponse<StreamChatGenerics>['id'];\n invite?:\n | { $eq?: ChannelMemberResponse<StreamChatGenerics>['status'] }\n | ChannelMemberResponse<StreamChatGenerics>['status'];\n joined?: { $eq?: boolean } | boolean;\n last_active?:\n | {\n $eq?: UserResponse<StreamChatGenerics>['last_active'];\n $gt?: UserResponse<StreamChatGenerics>['last_active'];\n $gte?: UserResponse<StreamChatGenerics>['last_active'];\n $lt?: UserResponse<StreamChatGenerics>['last_active'];\n $lte?: UserResponse<StreamChatGenerics>['last_active'];\n }\n | UserResponse<StreamChatGenerics>['last_active'];\n name?:\n | RequireOnlyOne<{\n $autocomplete?: ChannelMemberResponse<StreamChatGenerics>['name'];\n $eq?: ChannelMemberResponse<StreamChatGenerics>['name'];\n $in?: ChannelMemberResponse<StreamChatGenerics>['name'][];\n $q?: ChannelMemberResponse<StreamChatGenerics>['name'];\n }>\n | PrimitiveFilter<ChannelMemberResponse<StreamChatGenerics>['name']>;\n updated_at?:\n | {\n $eq?: ChannelMemberResponse<StreamChatGenerics>['updated_at'];\n $gt?: ChannelMemberResponse<StreamChatGenerics>['updated_at'];\n $gte?: ChannelMemberResponse<StreamChatGenerics>['updated_at'];\n $lt?: ChannelMemberResponse<StreamChatGenerics>['updated_at'];\n $lte?: ChannelMemberResponse<StreamChatGenerics>['updated_at'];\n }\n | ChannelMemberResponse<StreamChatGenerics>['updated_at'];\n 'user.email'?:\n | RequireOnlyOne<{\n $autocomplete?: string;\n $eq?: string;\n $in?: string;\n }>\n | string;\n user_id?:\n | RequireOnlyOne<{\n $eq?: ChannelMemberResponse<StreamChatGenerics>['user_id'];\n $in?: ChannelMemberResponse<StreamChatGenerics>['user_id'][];\n }>\n | PrimitiveFilter<ChannelMemberResponse<StreamChatGenerics>['id']>;\n } & {\n [Key in keyof ContainsOperator<StreamChatGenerics['memberType']>]?:\n | RequireOnlyOne<QueryFilter<ContainsOperator<StreamChatGenerics['memberType']>[Key]>>\n | PrimitiveFilter<ContainsOperator<StreamChatGenerics['memberType']>[Key]>;\n }\n>;\n\n/**\n * Sort Types\n */\n\nexport type BannedUsersSort = BannedUsersSortBase | Array<BannedUsersSortBase>;\n\nexport type BannedUsersSortBase = { created_at?: AscDesc };\n\nexport type ReactionSort<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> =\n | ReactionSortBase<StreamChatGenerics>\n | Array<ReactionSortBase<StreamChatGenerics>>;\n\nexport type ReactionSortBase<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = Sort<\n StreamChatGenerics['reactionType']\n> & {\n created_at?: AscDesc;\n};\n\nexport type ChannelSort<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> =\n | ChannelSortBase<StreamChatGenerics>\n | Array<ChannelSortBase<StreamChatGenerics>>;\n\nexport type ChannelSortBase<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = Sort<\n StreamChatGenerics['channelType']\n> & {\n created_at?: AscDesc;\n has_unread?: AscDesc;\n last_message_at?: AscDesc;\n last_updated?: AscDesc;\n member_count?: AscDesc;\n pinned_at?: AscDesc;\n unread_count?: AscDesc;\n updated_at?: AscDesc;\n};\n\nexport type PinnedMessagesSort = PinnedMessagesSortBase | Array<PinnedMessagesSortBase>;\nexport type PinnedMessagesSortBase = { pinned_at?: AscDesc };\n\nexport type Sort<T> = {\n [P in keyof T]?: AscDesc;\n};\n\nexport type UserSort<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> =\n | Sort<UserResponse<StreamChatGenerics>>\n | Array<Sort<UserResponse<StreamChatGenerics>>>;\n\nexport type MemberSort<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> =\n | Sort<Pick<UserResponse<StreamChatGenerics>, 'id' | 'created_at' | 'last_active' | 'name' | 'updated_at'>>\n | Array<Sort<Pick<UserResponse<StreamChatGenerics>, 'id' | 'created_at' | 'last_active' | 'name' | 'updated_at'>>>;\n\nexport type SearchMessageSortBase<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = Sort<\n StreamChatGenerics['messageType']\n> & {\n attachments?: AscDesc;\n 'attachments.type'?: AscDesc;\n created_at?: AscDesc;\n id?: AscDesc;\n 'mentioned_users.id'?: AscDesc;\n parent_id?: AscDesc;\n pinned?: AscDesc;\n relevance?: AscDesc;\n reply_count?: AscDesc;\n text?: AscDesc;\n type?: AscDesc;\n updated_at?: AscDesc;\n 'user.id'?: AscDesc;\n};\n\nexport type SearchMessageSort<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> =\n | SearchMessageSortBase<StreamChatGenerics>\n | Array<SearchMessageSortBase<StreamChatGenerics>>;\n\nexport type QuerySort<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> =\n | BannedUsersSort\n | ChannelSort<StreamChatGenerics>\n | SearchMessageSort<StreamChatGenerics>\n | UserSort<StreamChatGenerics>;\n\nexport type PollSort = PollSortBase | Array<PollSortBase>;\n\nexport type PollSortBase = {\n created_at?: AscDesc;\n id?: AscDesc;\n is_closed?: AscDesc;\n name?: AscDesc;\n updated_at?: AscDesc;\n};\n\nexport type VoteSort = VoteSortBase | Array<VoteSortBase>;\n\nexport type VoteSortBase = {\n created_at?: AscDesc;\n id?: AscDesc;\n is_closed?: AscDesc;\n name?: AscDesc;\n updated_at?: AscDesc;\n};\n\n/**\n * Base Types\n */\n\nexport type Action = {\n name?: string;\n style?: string;\n text?: string;\n type?: string;\n value?: string;\n};\n\nexport type AnonUserType = {};\n\nexport type APNConfig = {\n auth_key?: string;\n auth_type?: string;\n bundle_id?: string;\n development?: boolean;\n enabled?: boolean;\n host?: string;\n key_id?: string;\n notification_template?: string;\n p12_cert?: string;\n team_id?: string;\n};\n\nexport type AgoraOptions = {\n app_certificate: string;\n app_id: string;\n role_map?: Record<string, string>;\n};\n\nexport type HMSOptions = {\n app_access_key: string;\n app_secret: string;\n default_role: string;\n default_room_template: string;\n default_region?: string;\n role_map?: Record<string, string>;\n};\n\nexport type AsyncModerationOptions = {\n callback?: {\n mode?: 'CALLBACK_MODE_NONE' | 'CALLBACK_MODE_REST' | 'CALLBACK_MODE_TWIRP';\n server_url?: string;\n };\n timeout_ms?: number;\n};\n\nexport type AppSettings = {\n agora_options?: AgoraOptions | null;\n allowed_flag_reasons?: string[];\n apn_config?: {\n auth_key?: string;\n auth_type?: string;\n bundle_id?: string;\n development?: boolean;\n host?: string;\n key_id?: string;\n notification_template?: string;\n p12_cert?: string;\n team_id?: string;\n };\n async_moderation_config?: AsyncModerationOptions;\n async_url_enrich_enabled?: boolean;\n auto_translation_enabled?: boolean;\n before_message_send_hook_url?: string;\n cdn_expiration_seconds?: number;\n custom_action_handler_url?: string;\n disable_auth_checks?: boolean;\n disable_permissions_checks?: boolean;\n enforce_unique_usernames?: 'no' | 'app' | 'team';\n // all possible file mime types are https://www.iana.org/assignments/media-types/media-types.xhtml\n file_upload_config?: FileUploadConfig;\n firebase_config?: {\n apn_template?: string;\n credentials_json?: string;\n data_template?: string;\n notification_template?: string;\n server_key?: string;\n };\n grants?: Record<string, string[]>;\n hms_options?: HMSOptions | null;\n huawei_config?: {\n id: string;\n secret: string;\n };\n image_moderation_enabled?: boolean;\n image_upload_config?: FileUploadConfig;\n migrate_permissions_to_v2?: boolean;\n multi_tenant_enabled?: boolean;\n permission_version?: 'v1' | 'v2';\n push_config?: {\n offline_only?: boolean;\n version?: string;\n };\n reminders_interval?: number;\n revoke_tokens_issued_before?: string | null;\n sns_key?: string;\n sns_secret?: string;\n sns_topic_arn?: string;\n sqs_key?: string;\n sqs_secret?: string;\n sqs_url?: string;\n video_provider?: string;\n webhook_events?: Array<string> | null;\n webhook_url?: string;\n xiaomi_config?: {\n package_name: string;\n secret: string;\n };\n};\n\nexport type Attachment<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = StreamChatGenerics['attachmentType'] & {\n actions?: Action[];\n asset_url?: string;\n author_icon?: string;\n author_link?: string;\n author_name?: string;\n color?: string;\n duration?: number;\n fallback?: string;\n fields?: Field[];\n file_size?: number | string;\n footer?: string;\n footer_icon?: string;\n giphy?: GiphyData;\n image_url?: string;\n latitude?: number;\n longitude?: number;\n mime_type?: string;\n og_scrape_url?: string;\n original_height?: number;\n original_width?: number;\n pretext?: string;\n text?: string;\n thumb_url?: string;\n title?: string;\n title_link?: string;\n type?: string;\n waveform_data?: Array<number>;\n};\n\nexport type OGAttachment = {\n og_scrape_url: string;\n asset_url?: string; // og:video | og:audio\n author_link?: string; // og:site\n author_name?: string; // og:site_name\n image_url?: string; // og:image\n text?: string; // og:description\n thumb_url?: string; // og:image\n title?: string; // og:title\n title_link?: string; // og:url\n type?: string | 'video' | 'audio' | 'image';\n};\n\nexport type BlockList = {\n name: string;\n words: string[];\n type?: string;\n validate?: boolean;\n};\n\nexport type ChannelConfig<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = ChannelConfigFields &\n CreatedAtUpdatedAt & {\n commands?: CommandVariants<StreamChatGenerics>[];\n };\n\nexport type ChannelConfigAutomod = '' | 'AI' | 'disabled' | 'simple';\n\nexport type ChannelConfigAutomodBehavior = '' | 'block' | 'flag';\n\nexport type ChannelConfigAutomodThresholds = null | {\n explicit?: { block?: number; flag?: number };\n spam?: { block?: number; flag?: number };\n toxic?: { block?: number; flag?: number };\n};\n\nexport type ChannelConfigFields = {\n reminders: boolean;\n automod?: ChannelConfigAutomod;\n automod_behavior?: ChannelConfigAutomodBehavior;\n automod_thresholds?: ChannelConfigAutomodThresholds;\n blocklist_behavior?: ChannelConfigAutomodBehavior;\n connect_events?: boolean;\n custom_events?: boolean;\n mark_messages_pending?: boolean;\n max_message_length?: number;\n message_retention?: string;\n mutes?: boolean;\n name?: string;\n polls?: boolean;\n push_notifications?: boolean;\n quotes?: boolean;\n reactions?: boolean;\n read_events?: boolean;\n replies?: boolean;\n search?: boolean;\n typing_events?: boolean;\n uploads?: boolean;\n url_enrichment?: boolean;\n};\n\nexport type ChannelConfigWithInfo<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = ChannelConfigFields &\n CreatedAtUpdatedAt & {\n commands?: CommandResponse<StreamChatGenerics>[];\n };\n\nexport type ChannelData<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = StreamChatGenerics['channelType'] & {\n blocked?: boolean;\n members?: string[] | Array<NewMemberPayload<StreamChatGenerics>>;\n name?: string;\n};\n\n/**\n * @deprecated Use ChannelMemberResponse instead\n */\nexport type ChannelMembership<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = ChannelMemberResponse<StreamChatGenerics>;\n\nexport type ChannelMute<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n user: UserResponse<StreamChatGenerics>;\n channel?: ChannelResponse<StreamChatGenerics>;\n created_at?: string;\n expires?: string;\n updated_at?: string;\n};\n\nexport type ChannelRole = {\n custom?: boolean;\n name?: string;\n owner?: boolean;\n resource?: string;\n same_team?: boolean;\n};\n\nexport type CheckPushInput<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n apn_template?: string;\n client_id?: string;\n connection_id?: string;\n firebase_data_template?: string;\n firebase_template?: string;\n message_id?: string;\n user?: UserResponse<StreamChatGenerics>;\n user_id?: string;\n};\n\nexport type PushProvider = 'apn' | 'firebase' | 'huawei' | 'xiaomi';\n\nexport type PushProviderConfig = PushProviderCommon &\n PushProviderID &\n PushProviderAPN &\n PushProviderFirebase &\n PushProviderHuawei &\n PushProviderXiaomi;\n\nexport type PushProviderID = {\n name: string;\n type: PushProvider;\n};\n\nexport type PushProviderCommon = {\n created_at: string;\n updated_at: string;\n description?: string;\n disabled_at?: string;\n disabled_reason?: string;\n};\n\nexport type PushProviderAPN = {\n apn_auth_key?: string;\n apn_auth_type?: 'token' | 'certificate';\n apn_development?: boolean;\n apn_host?: string;\n apn_key_id?: string;\n apn_notification_template?: string;\n apn_p12_cert?: string;\n apn_team_id?: string;\n apn_topic?: string;\n};\n\nexport type PushProviderFirebase = {\n firebase_apn_template?: string;\n firebase_credentials?: string;\n firebase_data_template?: string;\n firebase_notification_template?: string;\n firebase_server_key?: string;\n};\n\nexport type PushProviderHuawei = {\n huawei_app_id?: string;\n huawei_app_secret?: string;\n};\n\nexport type PushProviderXiaomi = {\n xiaomi_package_name?: string;\n xiaomi_secret?: string;\n};\n\nexport type CommandVariants<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> =\n | 'all'\n | 'ban'\n | 'fun_set'\n | 'giphy'\n | 'moderation_set'\n | 'mute'\n | 'unban'\n | 'unmute'\n | StreamChatGenerics['commandType'];\n\nexport type Configs<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = Record<\n string,\n ChannelConfigWithInfo<StreamChatGenerics> | undefined\n>;\n\nexport type ConnectionOpen<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n connection_id: string;\n cid?: string;\n created_at?: string;\n me?: OwnUserResponse<StreamChatGenerics>;\n type?: string;\n};\n\nexport type CreatedAtUpdatedAt = {\n created_at: string;\n updated_at: string;\n};\n\nexport type Device<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = DeviceFields & {\n provider?: string;\n user?: UserResponse<StreamChatGenerics>;\n user_id?: string;\n};\n\nexport type BaseDeviceFields = {\n id: string;\n push_provider: PushProvider;\n push_provider_name?: string;\n};\n\nexport type DeviceFields = BaseDeviceFields & {\n created_at: string;\n disabled?: boolean;\n disabled_reason?: string;\n};\n\nexport type EndpointName =\n | 'Connect'\n | 'LongPoll'\n | 'DeleteFile'\n | 'DeleteImage'\n | 'DeleteMessage'\n | 'DeleteUser'\n | 'DeleteUsers'\n | 'DeactivateUser'\n | 'ExportUser'\n | 'DeleteReaction'\n | 'UpdateChannel'\n | 'UpdateChannelPartial'\n | 'UpdateMessage'\n | 'UpdateMessagePartial'\n | 'GetMessage'\n | 'GetManyMessages'\n | 'UpdateUsers'\n | 'UpdateUsersPartial'\n | 'CreateGuest'\n | 'GetOrCreateChannel'\n | 'StopWatchingChannel'\n | 'QueryChannels'\n | 'Search'\n | 'QueryUsers'\n | 'QueryMembers'\n | 'QueryBannedUsers'\n | 'QueryFlags'\n | 'QueryMessageFlags'\n | 'GetReactions'\n | 'GetReplies'\n | 'GetPinnedMessages'\n | 'Ban'\n | 'Unban'\n | 'MuteUser'\n | 'MuteChannel'\n | 'UnmuteChannel'\n | 'UnmuteUser'\n | 'RunMessageAction'\n | 'SendEvent'\n | 'SendUserCustomEvent'\n | 'MarkRead'\n | 'MarkChannelsRead'\n | 'SendMessage'\n | 'ImportChannelMessages'\n | 'UploadFile'\n | 'UploadImage'\n | 'UpdateApp'\n | 'GetApp'\n | 'CreateDevice'\n | 'DeleteDevice'\n | 'SendReaction'\n | 'Flag'\n | 'Unflag'\n | 'Unblock'\n | 'QueryFlagReports'\n | 'FlagReportReview'\n | 'CreateChannelType'\n | 'DeleteChannel'\n | 'DeleteChannels'\n | 'DeleteChannelType'\n | 'GetChannelType'\n | 'ListChannelTypes'\n | 'ListDevices'\n | 'TruncateChannel'\n | 'UpdateChannelType'\n | 'CheckPush'\n | 'PrivateSubmitModeration'\n | 'ReactivateUser'\n | 'HideChannel'\n | 'ShowChannel'\n | 'CreatePermission'\n | 'UpdatePermission'\n | 'GetPermission'\n | 'DeletePermission'\n | 'ListPermissions'\n | 'CreateRole'\n | 'DeleteRole'\n | 'ListRoles'\n | 'ListCustomRoles'\n | 'Sync'\n | 'TranslateMessage'\n | 'CreateCommand'\n | 'GetCommand'\n | 'UpdateCommand'\n | 'DeleteCommand'\n | 'ListCommands'\n | 'CreateBlockList'\n | 'UpdateBlockList'\n | 'GetBlockList'\n | 'ListBlockLists'\n | 'DeleteBlockList'\n | 'ExportChannels'\n | 'GetExportChannelsStatus'\n | 'CheckSQS'\n | 'GetRateLimits'\n | 'CreateSegment'\n | 'GetSegment'\n | 'QuerySegments'\n | 'UpdateSegment'\n | 'DeleteSegment'\n | 'CreateCampaign'\n | 'GetCampaign'\n | 'ListCampaigns'\n | 'UpdateCampaign'\n | 'DeleteCampaign'\n | 'ScheduleCampaign'\n | 'StopCampaign'\n | 'ResumeCampaign'\n | 'TestCampaign'\n | 'GetOG'\n | 'GetTask'\n | 'ExportUsers'\n | 'CreateImport'\n | 'CreateImportURL'\n | 'GetImport'\n | 'ListImports'\n | 'UpsertPushProvider'\n | 'DeletePushProvider'\n | 'ListPushProviders'\n | 'CreatePoll';\n\nexport type ExportChannelRequest = {\n id: string;\n type: string;\n cid?: string;\n messages_since?: Date;\n messages_until?: Date;\n};\n\nexport type ExportChannelOptions = {\n clear_deleted_message_text?: boolean;\n export_users?: boolean;\n include_soft_deleted_channels?: boolean;\n include_truncated_messages?: boolean;\n version?: string;\n};\n\nexport type ExportUsersRequest = {\n user_ids: string[];\n};\n\nexport type Field = {\n short?: boolean;\n title?: string;\n value?: string;\n};\n\nexport type FileUploadConfig = {\n allowed_file_extensions?: string[] | null;\n allowed_mime_types?: string[] | null;\n blocked_file_extensions?: string[] | null;\n blocked_mime_types?: string[] | null;\n size_limit?: number | null;\n};\n\nexport type FirebaseConfig = {\n apn_template?: string;\n credentials_json?: string;\n data_template?: string;\n enabled?: boolean;\n notification_template?: string;\n server_key?: string;\n};\n\ntype GiphyVersionInfo = {\n height: string;\n url: string;\n width: string;\n frames?: string;\n size?: string;\n};\n\ntype GiphyVersions =\n | 'original'\n | 'fixed_height'\n | 'fixed_height_still'\n | 'fixed_height_downsampled'\n | 'fixed_width'\n | 'fixed_width_still'\n | 'fixed_width_downsampled';\n\ntype GiphyData = {\n [key in GiphyVersions]: GiphyVersionInfo;\n};\n\nexport type HuaweiConfig = {\n enabled?: boolean;\n id?: string;\n secret?: string;\n};\n\nexport type XiaomiConfig = {\n enabled?: boolean;\n package_name?: string;\n secret?: string;\n};\n\nexport type LiteralStringForUnion = string & {};\n\nexport type LogLevel = 'info' | 'error' | 'warn';\n\nexport type Logger = (logLevel: LogLevel, message: string, extraData?: Record<string, unknown>) => void;\n\nexport type Message<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = Partial<\n MessageBase<StreamChatGenerics>\n> & {\n mentioned_users?: string[];\n};\n\nexport type MessageBase<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = StreamChatGenerics['messageType'] & {\n id: string;\n attachments?: Attachment<StreamChatGenerics>[];\n html?: string;\n mml?: string;\n parent_id?: string;\n pin_expires?: string | null;\n pinned?: boolean;\n pinned_at?: string | null;\n poll_id?: string;\n quoted_message_id?: string;\n show_in_channel?: boolean;\n silent?: boolean;\n text?: string;\n user?: UserResponse<StreamChatGenerics> | null;\n user_id?: string;\n};\n\nexport type MessageLabel = 'deleted' | 'ephemeral' | 'error' | 'regular' | 'reply' | 'system';\n\nexport type SendMessageOptions = {\n force_moderation?: boolean;\n is_pending_message?: boolean;\n keep_channel_hidden?: boolean;\n pending?: boolean;\n pending_message_metadata?: Record<string, string>;\n skip_enrich_url?: boolean;\n skip_push?: boolean;\n};\n\nexport type UpdateMessageOptions = {\n skip_enrich_url?: boolean;\n};\n\nexport type GetMessageOptions = {\n show_deleted_message?: boolean;\n};\n\nexport type Mute<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n created_at: string;\n target: UserResponse<StreamChatGenerics>;\n updated_at: string;\n user: UserResponse<StreamChatGenerics>;\n};\n\nexport type PartialUpdateChannel<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n set?: Partial<ChannelResponse<StreamChatGenerics>>;\n unset?: Array<keyof ChannelResponse<StreamChatGenerics>>;\n};\n\nexport type PartialUpdateMember<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n set?: ChannelMemberUpdates<StreamChatGenerics>;\n unset?: Array<keyof ChannelMemberUpdates<StreamChatGenerics>>;\n};\n\nexport type PartialUserUpdate<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n id: string;\n set?: Partial<UserResponse<StreamChatGenerics>>;\n unset?: Array<keyof UserResponse<StreamChatGenerics>>;\n};\n\nexport type MessageUpdatableFields<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = Omit<\n MessageResponse<StreamChatGenerics>,\n 'cid' | 'created_at' | 'updated_at' | 'deleted_at' | 'user' | 'user_id'\n>;\n\nexport type PartialMessageUpdate<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n set?: Partial<MessageUpdatableFields<StreamChatGenerics>>;\n unset?: Array<keyof MessageUpdatableFields<StreamChatGenerics>>;\n};\n\nexport type PendingMessageResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n message: MessageResponse<StreamChatGenerics>;\n pending_message_metadata?: Record<string, string>;\n};\n\nexport type PermissionAPIObject = {\n action?: string;\n condition?: object;\n custom?: boolean;\n description?: string;\n id?: string;\n level?: string;\n name?: string;\n owner?: boolean;\n same_team?: boolean;\n tags?: string[];\n};\n\nexport type PermissionObject = {\n action?: 'Deny' | 'Allow';\n name?: string;\n owner?: boolean;\n priority?: number;\n resources?: string[];\n roles?: string[];\n};\n\nexport type Policy = {\n action?: 0 | 1;\n created_at?: string;\n name?: string;\n owner?: boolean;\n priority?: number;\n resources?: string[];\n roles?: string[] | null;\n updated_at?: string;\n};\n\nexport type RateLimitsInfo = {\n limit: number;\n remaining: number;\n reset: number;\n};\n\nexport type RateLimitsMap = Record<EndpointName, RateLimitsInfo>;\n\nexport type Reaction<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = StreamChatGenerics['reactionType'] & {\n type: string;\n message_id?: string;\n score?: number;\n user?: UserResponse<StreamChatGenerics> | null;\n user_id?: string;\n};\n\nexport type Resource =\n | 'AddLinks'\n | 'BanUser'\n | 'CreateChannel'\n | 'CreateMessage'\n | 'CreateReaction'\n | 'DeleteAttachment'\n | 'DeleteChannel'\n | 'DeleteMessage'\n | 'DeleteReaction'\n | 'EditUser'\n | 'MuteUser'\n | 'ReadChannel'\n | 'RunMessageAction'\n | 'UpdateChannel'\n | 'UpdateChannelMembers'\n | 'UpdateMessage'\n | 'UpdateUser'\n | 'UploadAttachment';\n\nexport type SearchPayload<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = Omit<\n SearchOptions<StreamChatGenerics>,\n 'sort'\n> & {\n client_id?: string;\n connection_id?: string;\n filter_conditions?: ChannelFilters<StreamChatGenerics>;\n message_filter_conditions?: MessageFilters<StreamChatGenerics>;\n message_options?: MessageOptions;\n query?: string;\n sort?: Array<{\n direction: AscDesc;\n field: keyof SearchMessageSortBase<StreamChatGenerics>;\n }>;\n};\n\nexport type TestPushDataInput = {\n apnTemplate?: string;\n firebaseDataTemplate?: string;\n firebaseTemplate?: string;\n messageID?: string;\n pushProviderName?: string;\n pushProviderType?: PushProvider;\n skipDevices?: boolean;\n};\n\nexport type TestSQSDataInput = {\n sqs_key?: string;\n sqs_secret?: string;\n sqs_url?: string;\n};\n\nexport type TestSNSDataInput = {\n sns_key?: string;\n sns_secret?: string;\n sns_topic_arn?: string;\n};\n\nexport type TokenOrProvider = null | string | TokenProvider | undefined;\n\nexport type TokenProvider = () => Promise<string>;\n\nexport type TranslationLanguages =\n | ''\n | 'af'\n | 'am'\n | 'ar'\n | 'az'\n | 'bg'\n | 'bn'\n | 'bs'\n | 'cs'\n | 'da'\n | 'de'\n | 'el'\n | 'en'\n | 'es'\n | 'es-MX'\n | 'et'\n | 'fa'\n | 'fa-AF'\n | 'fi'\n | 'fr'\n | 'fr-CA'\n | 'ha'\n | 'he'\n | 'hi'\n | 'hr'\n | 'hu'\n | 'id'\n | 'it'\n | 'ja'\n | 'ka'\n | 'ko'\n | 'lt'\n | 'lv'\n | 'ms'\n | 'nl'\n | 'no'\n | 'pl'\n | 'ps'\n | 'pt'\n | 'ro'\n | 'ru'\n | 'sk'\n | 'sl'\n | 'so'\n | 'sq'\n | 'sr'\n | 'sv'\n | 'sw'\n | 'ta'\n | 'th'\n | 'tl'\n | 'tr'\n | 'uk'\n | 'ur'\n | 'vi'\n | 'zh'\n | 'zh-TW';\n\nexport type TypingStartEvent = Event;\n\nexport type ReservedMessageFields =\n | 'command'\n | 'created_at'\n | 'html'\n | 'latest_reactions'\n | 'own_reactions'\n | 'quoted_message'\n | 'reaction_counts'\n | 'reply_count'\n | 'type'\n | 'updated_at'\n | 'user'\n | '__html';\n\nexport type UpdatedMessage<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = Omit<\n MessageResponse<StreamChatGenerics>,\n 'mentioned_users'\n> & { mentioned_users?: string[] };\n\nexport type User<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = StreamChatGenerics['userType'] & {\n id: string;\n anon?: boolean;\n name?: string;\n role?: string;\n teams?: string[];\n username?: string;\n};\n\nexport type TaskResponse = {\n task_id: string;\n};\n\nexport type DeleteChannelsResponse = {\n result: Record<string, string>;\n} & Partial<TaskResponse>;\n\nexport type DeleteType = 'soft' | 'hard' | 'pruning';\n\n/*\n DeleteUserOptions specifies a collection of one or more `user_ids` to be deleted.\n\n `user`:\n - soft: marks user as deleted and retains all user data\n - pruning: marks user as deleted and nullifies user information\n - hard: deletes user completely - this requires hard option for messages and conversation as well\n `conversations`:\n - soft: marks all conversation channels as deleted (same effect as Delete Channels with 'hard' option disabled)\n - hard: deletes channel and all its data completely including messages (same effect as Delete Channels with 'hard' option enabled)\n `messages`:\n - soft: marks all user messages as deleted without removing any related message data\n - pruning: marks all user messages as deleted, nullifies message information and removes some message data such as reactions and flags\n - hard: deletes messages completely with all related information\n `new_channel_owner_id`: any channels owned by the hard-deleted user will be transferred to this user ID\n */\nexport type DeleteUserOptions = {\n conversations?: Exclude<DeleteType, 'pruning'>;\n messages?: DeleteType;\n new_channel_owner_id?: string;\n user?: DeleteType;\n};\n\nexport type SegmentType = 'channel' | 'user';\n\nexport type SegmentData = {\n all_sender_channels?: boolean;\n all_users?: boolean;\n description?: string;\n filter?: {};\n name?: string;\n};\n\nexport type SegmentResponse = {\n created_at: string;\n deleted_at: string;\n id: string;\n locked: boolean;\n size: number;\n task_id: string;\n type: SegmentType;\n updated_at: string;\n} & SegmentData;\n\nexport type UpdateSegmentData = {\n name: string;\n} & SegmentData;\n\nexport type SegmentTargetsResponse = {\n created_at: string;\n segment_id: string;\n target_id: string;\n};\n\nexport type SortParam = {\n field: string;\n direction?: AscDesc;\n};\n\nexport type Pager = {\n limit?: number;\n next?: string;\n prev?: string;\n};\n\nexport type QuerySegmentsOptions = Pager;\n\nexport type QuerySegmentTargetsFilter = {\n target_id?: {\n $eq?: string;\n $gte?: string;\n $in?: string[];\n $lte?: string;\n };\n};\nexport type QuerySegmentTargetsOptions = Pick<Pager, 'next' | 'limit'>;\n\nexport type CampaignSort = {\n field: string;\n direction?: number;\n}[];\n\nexport type CampaignQueryOptions = {\n limit?: number;\n next?: string;\n prev?: string;\n sort?: CampaignSort;\n};\n\nexport type SegmentQueryOptions = CampaignQueryOptions;\n\n// TODO: add better typing\nexport type CampaignFilters = {};\n\nexport type CampaignData = {\n channel_template?: {\n type: string;\n custom?: {};\n id?: string;\n members?: string[];\n team?: string;\n };\n create_channels?: boolean;\n deleted_at?: string;\n description?: string;\n id?: string | null;\n message_template?: {\n text: string;\n attachments?: Attachment[];\n custom?: {};\n poll_id?: string;\n };\n name?: string;\n segment_ids?: string[];\n sender_id?: string;\n sender_mode?: 'exclude' | 'include' | null;\n skip_push?: boolean;\n skip_webhook?: boolean;\n user_ids?: string[];\n};\n\nexport type CampaignStats = {\n progress?: number;\n stats_channels_created?: number;\n stats_completed_at?: string;\n stats_messages_sent?: number;\n stats_started_at?: string;\n};\nexport type CampaignResponse = {\n created_at: string;\n id: string;\n segments: SegmentResponse[];\n sender: UserResponse;\n stats: CampaignStats;\n status: 'draft' | 'scheduled' | 'in_progress' | 'completed' | 'stopped';\n updated_at: string;\n users: UserResponse[];\n scheduled_for?: string;\n} & CampaignData;\n\nexport type DeleteCampaignOptions = {};\n\nexport type TaskStatus = {\n created_at: string;\n status: string;\n task_id: string;\n updated_at: string;\n error?: {\n description: string;\n type: string;\n };\n result?: UR;\n};\n\nexport type TruncateOptions<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n hard_delete?: boolean;\n message?: Message<StreamChatGenerics>;\n skip_push?: boolean;\n truncated_at?: Date;\n user?: UserResponse<StreamChatGenerics>;\n user_id?: string;\n};\n\nexport type CreateImportURLResponse = {\n path: string;\n upload_url: string;\n};\n\nexport type CreateImportResponse = {\n import_task: ImportTask;\n};\n\nexport type GetImportResponse = {\n import_task: ImportTask;\n};\n\nexport type CreateImportOptions = {\n mode: 'insert' | 'upsert';\n};\n\nexport type ListImportsPaginationOptions = {\n limit?: number;\n offset?: number;\n};\n\nexport type ListImportsResponse = {\n import_tasks: ImportTask[];\n};\n\nexport type ImportTaskHistory = {\n created_at: string;\n next_state: string;\n prev_state: string;\n};\n\nexport type ImportTask = {\n created_at: string;\n history: ImportTaskHistory[];\n id: string;\n path: string;\n state: string;\n updated_at: string;\n result?: UR;\n size?: number;\n};\n\nexport type MessageSetType = 'latest' | 'current' | 'new';\nexport type MessageSet<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n isCurrent: boolean;\n isLatest: boolean;\n messages: FormatMessageResponse<StreamChatGenerics>[];\n pagination: { hasNext: boolean; hasPrev: boolean };\n};\n\nexport type PushProviderUpsertResponse = {\n push_provider: PushProvider;\n};\n\nexport type PushProviderListResponse = {\n push_providers: PushProvider[];\n};\n\nexport type CreateCallOptions<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n id: string;\n type: string;\n options?: UR;\n user?: UserResponse<StreamChatGenerics> | null;\n user_id?: string;\n};\n\nexport type HMSCall = {\n room: string;\n};\n\nexport type AgoraCall = {\n channel: string;\n};\n\nexport type Call = {\n id: string;\n provider: string;\n agora?: AgoraCall;\n hms?: HMSCall;\n};\n\nexport type CreateCallResponse = APIResponse & {\n call: Call;\n token: string;\n agora_app_id?: string;\n agora_uid?: number;\n};\n\nexport type GetCallTokenResponse = APIResponse & {\n token: string;\n agora_app_id?: string;\n agora_uid?: number;\n};\n\ntype ErrorResponseDetails = {\n code: number;\n messages: string[];\n};\n\nexport type APIErrorResponse = {\n code: number;\n duration: string;\n message: string;\n more_info: string;\n StatusCode: number;\n details?: ErrorResponseDetails;\n};\n\nexport class ErrorFromResponse<T> extends Error {\n code?: number;\n response?: AxiosResponse<T>;\n status?: number;\n}\n\nexport type QueryPollsResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n polls: PollResponse<StreamChatGenerics>[];\n next?: string;\n};\n\nexport type CreatePollAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n poll: PollResponse<StreamChatGenerics>;\n};\n\nexport type GetPollAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n poll: PollResponse<StreamChatGenerics>;\n};\n\nexport type UpdatePollAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n poll: PollResponse<StreamChatGenerics>;\n};\n\nexport type PollResponse<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = StreamChatGenerics['pollType'] &\n PollEnrichData<StreamChatGenerics> & {\n created_at: string;\n created_by: UserResponse<StreamChatGenerics> | null;\n created_by_id: string;\n enforce_unique_vote: boolean;\n id: string;\n max_votes_allowed: number;\n name: string;\n options: PollOption<StreamChatGenerics>[];\n updated_at: string;\n allow_answers?: boolean;\n allow_user_suggested_options?: boolean;\n description?: string;\n is_closed?: boolean;\n voting_visibility?: VotingVisibility;\n };\n\nexport type PollOption<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n created_at: string;\n id: string;\n poll_id: string;\n text: string;\n updated_at: string;\n vote_count: number;\n votes?: PollVote<StreamChatGenerics>[];\n};\n\nexport enum VotingVisibility {\n anonymous = 'anonymous',\n public = 'public',\n}\n\nexport type PollEnrichData<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n answers_count: number;\n latest_answers: PollAnswer<StreamChatGenerics>[]; // not updated with WS events, ordered DESC by created_at, seems like updated_at cannot be different from created_at\n latest_votes_by_option: Record<string, PollVote<StreamChatGenerics>[]>; // not updated with WS events; always null in anonymous polls\n vote_count: number;\n vote_counts_by_option: Record<string, number>;\n own_votes?: (PollVote<StreamChatGenerics> | PollAnswer<StreamChatGenerics>)[]; // not updated with WS events\n};\n\nexport type PollData<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = StreamChatGenerics['pollType'] & {\n id: string;\n name: string;\n allow_answers?: boolean;\n allow_user_suggested_options?: boolean;\n description?: string;\n enforce_unique_vote?: boolean;\n is_closed?: boolean;\n max_votes_allowed?: number;\n options?: PollOptionData<StreamChatGenerics>[];\n user_id?: string;\n voting_visibility?: VotingVisibility;\n};\n\nexport type CreatePollData<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = Partial<\n PollData<StreamChatGenerics>\n> &\n Pick<PollData<StreamChatGenerics>, 'name'>;\n\nexport type PartialPollUpdate<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n set?: Partial<PollData<StreamChatGenerics>>;\n unset?: Array<keyof PollData<StreamChatGenerics>>;\n};\n\nexport type PollOptionData<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = StreamChatGenerics['pollOptionType'] & {\n text: string;\n id?: string;\n position?: number;\n};\n\nexport type PartialPollOptionUpdate<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n set?: Partial<PollOptionResponse<StreamChatGenerics>>;\n unset?: Array<keyof PollOptionResponse<StreamChatGenerics>>;\n};\n\nexport type PollVoteData = {\n answer_text?: string;\n is_answer?: boolean;\n option_id?: string;\n};\n\nexport type PollPaginationOptions = {\n limit?: number;\n next?: string;\n};\n\nexport type CreatePollOptionAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n poll_option: PollOptionResponse<StreamChatGenerics>;\n};\n\nexport type GetPollOptionAPIResponse<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = CreatePollOptionAPIResponse<StreamChatGenerics>;\nexport type UpdatePollOptionAPIResponse<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = CreatePollOptionAPIResponse<StreamChatGenerics>;\n\nexport type PollOptionResponse<\n StreamChatGenerics extends ExtendableGenerics = DefaultGenerics\n> = StreamChatGenerics['pollType'] & {\n created_at: string;\n id: string;\n poll_id: string;\n position: number;\n text: string;\n updated_at: string;\n vote_count: number;\n votes?: PollVote<StreamChatGenerics>[];\n};\n\nexport type PollVote<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n created_at: string;\n id: string;\n poll_id: string;\n updated_at: string;\n option_id?: string;\n user?: UserResponse<StreamChatGenerics>;\n user_id?: string;\n};\n\nexport type PollAnswer<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = Exclude<\n PollVote<StreamChatGenerics>,\n 'option_id'\n> & {\n answer_text: string;\n is_answer: boolean; // this is absolutely redundant prop as answer_text indicates that a vote is an answer\n};\n\nexport type PollVotesAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n votes: (PollVote<StreamChatGenerics> | PollAnswer<StreamChatGenerics>)[];\n next?: string;\n};\n\nexport type PollAnswersAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n votes: PollAnswer<StreamChatGenerics>[]; // todo: should be changes to answers?\n next?: string;\n};\n\nexport type CastVoteAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n vote: PollVote<StreamChatGenerics> | PollAnswer<StreamChatGenerics>;\n};\n\nexport type QueryMessageHistoryFilters = QueryFilters<\n {\n message_id?:\n | RequireOnlyOne<Pick<QueryFilter<MessageHistoryEntry['message_id']>, '$eq' | '$in'>>\n | PrimitiveFilter<MessageHistoryEntry['message_id']>;\n } & {\n user_id?:\n | RequireOnlyOne<Pick<QueryFilter<MessageHistoryEntry['message_updated_by_id']>, '$eq' | '$in'>>\n | PrimitiveFilter<MessageHistoryEntry['message_updated_by_id']>;\n } & {\n created_at?:\n | RequireOnlyOne<\n Pick<QueryFilter<MessageHistoryEntry['message_updated_at']>, '$eq' | '$gt' | '$lt' | '$gte' | '$lte'>\n >\n | PrimitiveFilter<MessageHistoryEntry['message_updated_at']>;\n }\n>;\n\nexport type QueryMessageHistorySort = QueryMessageHistorySortBase | Array<QueryMessageHistorySortBase>;\n\nexport type QueryMessageHistorySortBase = {\n message_updated_at?: AscDesc;\n message_updated_by_id?: AscDesc;\n};\n\nexport type QueryMessageHistoryOptions = Pager;\n\nexport type MessageHistoryEntry<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n message_id: string;\n message_updated_at: string;\n attachments?: Attachment<StreamChatGenerics>[];\n message_updated_by_id?: string;\n text?: string;\n};\n\nexport type QueryMessageHistoryResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n message_history: MessageHistoryEntry<StreamChatGenerics>[];\n next?: string;\n prev?: string;\n};\n\n// Moderation v2\nexport type ModerationPayload = {\n created_at: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n custom?: Record<string, any>;\n images?: string[];\n texts?: string[];\n videos?: string[];\n};\n\nexport type ModV2ReviewStatus = 'complete' | 'flagged' | 'partial';\n\nexport type ModerationFlag = {\n created_at: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n custom: Record<string, any>;\n entity_creator_id: string;\n entity_id: string;\n entity_type: string;\n id: string;\n reason: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n result: Record<string, any>[];\n review_queue_item_id: string;\n updated_at: string;\n user: UserResponse;\n moderation_payload?: ModerationPayload;\n moderation_payload_hash?: string;\n};\n\nexport type ReviewQueueItem = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n actions_taken: any[];\n appealed_by: string;\n assigned_to: string;\n completed_at: string;\n config_key: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n context: any[];\n created_at: string;\n created_by: string;\n entity_id: string;\n entity_type: string;\n flags: ModerationFlag[];\n has_image: boolean;\n has_text: boolean;\n has_video: boolean;\n id: string;\n moderation_payload: ModerationPayload;\n moderation_payload_hash: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n options: any;\n recommended_action: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n results: any;\n reviewed_at: string;\n status: string;\n updated_at: string;\n};\n\nexport type CustomCheckFlag = {\n type: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n custom?: Record<string, any>[];\n labels?: string[];\n reason?: string;\n};\n\nexport type SubmitActionOptions = {\n ban?: {\n channel_ban_only?: boolean;\n reason?: string;\n timeout?: number;\n };\n delete_message?: {\n hard_delete?: boolean;\n };\n delete_user?: {\n delete_conversation_channels?: boolean;\n hard_delete?: boolean;\n mark_messages_deleted?: boolean;\n };\n restore?: {};\n unban?: {\n channel_cid?: string;\n };\n user_id?: string;\n};\n\nexport type GetUserModerationReportResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n user: UserResponse<StreamChatGenerics>;\n user_blocks?: Array<{\n blocked_at: string;\n blocked_by_user_id: string;\n blocked_user_id: string;\n }>;\n user_mutes?: Mute<StreamChatGenerics>[];\n};\n\nexport type QueryModerationConfigsFilters = QueryFilters<\n {\n key?: string;\n } & {\n created_at?: PrimitiveFilter<string>;\n } & {\n updated_at?: PrimitiveFilter<string>;\n } & {\n team?: string;\n }\n>;\n\nexport type ReviewQueueFilters = QueryFilters<\n {\n assigned_to?:\n | RequireOnlyOne<Pick<QueryFilter<ReviewQueueItem['assigned_to']>, '$eq' | '$in'>>\n | PrimitiveFilter<ReviewQueueItem['assigned_to']>;\n } & {\n completed_at?:\n | RequireOnlyOne<Pick<QueryFilter<ReviewQueueItem['completed_at']>, '$eq' | '$gt' | '$lt' | '$gte' | '$lte'>>\n | PrimitiveFilter<ReviewQueueItem['completed_at']>;\n } & {\n config_key?:\n | RequireOnlyOne<Pick<QueryFilter<ReviewQueueItem['config_key']>, '$eq' | '$in'>>\n | PrimitiveFilter<ReviewQueueItem['config_key']>;\n } & {\n entity_type?:\n | RequireOnlyOne<Pick<QueryFilter<ReviewQueueItem['entity_type']>, '$eq' | '$in'>>\n | PrimitiveFilter<ReviewQueueItem['entity_type']>;\n } & {\n created_at?:\n | RequireOnlyOne<Pick<QueryFilter<ReviewQueueItem['created_at']>, '$eq' | '$gt' | '$lt' | '$gte' | '$lte'>>\n | PrimitiveFilter<ReviewQueueItem['created_at']>;\n } & {\n id?:\n | RequireOnlyOne<Pick<QueryFilter<ReviewQueueItem['id']>, '$eq' | '$in'>>\n | PrimitiveFilter<ReviewQueueItem['id']>;\n } & {\n entity_id?:\n | RequireOnlyOne<Pick<QueryFilter<ReviewQueueItem['entity_id']>, '$eq' | '$in'>>\n | PrimitiveFilter<ReviewQueueItem['entity_id']>;\n } & {\n reviewed?: boolean;\n } & {\n reviewed_at?:\n | RequireOnlyOne<Pick<QueryFilter<ReviewQueueItem['reviewed_at']>, '$eq' | '$gt' | '$lt' | '$gte' | '$lte'>>\n | PrimitiveFilter<ReviewQueueItem['reviewed_at']>;\n } & {\n status?:\n | RequireOnlyOne<Pick<QueryFilter<ReviewQueueItem['status']>, '$eq' | '$in'>>\n | PrimitiveFilter<ReviewQueueItem['status']>;\n } & {\n updated_at?:\n | RequireOnlyOne<Pick<QueryFilter<ReviewQueueItem['updated_at']>, '$eq' | '$gt' | '$lt' | '$gte' | '$lte'>>\n | PrimitiveFilter<ReviewQueueItem['updated_at']>;\n } & {\n has_image?: boolean;\n } & {\n has_text?: boolean;\n } & {\n has_video?: boolean;\n } & {\n teams?:\n | RequireOnlyOne<{\n $contains?: PrimitiveFilter<string>;\n $eq?: PrimitiveFilter<string>;\n $in?: PrimitiveFilter<string>;\n }>\n | PrimitiveFilter<string>;\n }\n>;\n\nexport type ReviewQueueSort =\n | Sort<Pick<ReviewQueueItem, 'id' | 'created_at' | 'updated_at'>>\n | Array<Sort<Pick<ReviewQueueItem, 'id' | 'created_at' | 'updated_at'>>>;\n\nexport type QueryModerationConfigsSort = Array<Sort<'key' | 'created_at' | 'updated_at'>>;\n\nexport type ReviewQueuePaginationOptions = Pager;\n\nexport type ReviewQueueResponse = {\n items: ReviewQueueItem[];\n next?: string;\n prev?: string;\n};\n\nexport type ModerationConfig = {\n key: string;\n ai_image_config?: AIImageConfig;\n ai_text_config?: AITextConfig;\n ai_video_config?: AIVideoConfig;\n automod_platform_circumvention_config?: AutomodPlatformCircumventionConfig;\n automod_semantic_filters_config?: AutomodSemanticFiltersConfig;\n automod_toxicity_config?: AutomodToxicityConfig;\n block_list_config?: BlockListConfig;\n team?: string;\n};\n\nexport type ModerationConfigResponse = ModerationConfig & {\n created_at: string;\n updated_at: string;\n};\n\nexport type GetConfigResponse = {\n config: ModerationConfigResponse;\n};\n\nexport type QueryConfigsResponse = {\n configs: ModerationConfigResponse[];\n next?: string;\n prev?: string;\n};\n\nexport type UpsertConfigResponse = {\n config: ModerationConfigResponse;\n};\n\nexport type ModerationFlagOptions = {\n custom?: Record<string, unknown>;\n moderation_payload?: ModerationPayload;\n user_id?: string;\n};\n\nexport type ModerationMuteOptions = {\n timeout?: number;\n user_id?: string;\n};\nexport type GetUserModerationReportOptions = {\n create_user_if_not_exists?: boolean;\n include_user_blocks?: boolean;\n include_user_mutes?: boolean;\n};\n\nexport type AIState =\n | 'AI_STATE_ERROR'\n | 'AI_STATE_CHECKING_SOURCES'\n | 'AI_STATE_THINKING'\n | 'AI_STATE_GENERATING'\n | (string & {});\n\nexport type ModerationActionType = 'flag' | 'shadow' | 'remove' | 'bounce' | 'bounce_flag' | 'bounce_remove';\n\nexport type AutomodRule = {\n action: ModerationActionType;\n label: string;\n threshold: number;\n};\n\nexport type BlockListRule = {\n action: ModerationActionType;\n name?: string;\n};\n\nexport type BlockListConfig = {\n enabled: boolean;\n rules: BlockListRule[];\n async?: boolean;\n};\n\nexport type AutomodToxicityConfig = {\n enabled: boolean;\n rules: AutomodRule[];\n async?: boolean;\n};\n\nexport type AutomodPlatformCircumventionConfig = {\n enabled: boolean;\n rules: AutomodRule[];\n async?: boolean;\n};\n\nexport type AutomodSemanticFiltersRule = {\n action: ModerationActionType;\n name: string;\n threshold: number;\n};\n\nexport type AutomodSemanticFiltersConfig = {\n enabled: boolean;\n rules: AutomodSemanticFiltersRule[];\n async?: boolean;\n};\n\nexport type AITextSeverityRule = {\n action: ModerationActionType;\n severity: 'low' | 'medium' | 'high' | 'critical';\n};\n\nexport type AITextRule = {\n label: string;\n action?: ModerationActionType;\n severity_rules?: AITextSeverityRule[];\n};\n\nexport type AITextConfig = {\n enabled: boolean;\n rules: AITextRule[];\n async?: boolean;\n profile?: string;\n severity_rules?: AITextSeverityRule[]; // Deprecated: use rules instead\n};\n\nexport type AIImageRule = {\n action: ModerationActionType;\n label: string;\n min_confidence?: number;\n};\n\nexport type AIImageConfig = {\n enabled: boolean;\n rules: AIImageRule[];\n async?: boolean;\n};\n\nexport type AIVideoRule = {\n action: ModerationActionType;\n label: string;\n min_confidence?: number;\n};\n\nexport type AIVideoConfig = {\n enabled: boolean;\n rules: AIVideoRule[];\n async?: boolean;\n};\n\nexport type VelocityFilterConfigRule = {\n action: 'flag' | 'shadow' | 'remove' | 'ban';\n ban_duration?: number;\n cascading_action?: 'flag' | 'shadow' | 'remove' | 'ban';\n cascading_threshold?: number;\n check_message_context?: boolean;\n fast_spam_threshold?: number;\n fast_spam_ttl?: number;\n ip_ban?: boolean;\n shadow_ban?: boolean;\n slow_spam_ban_duration?: number;\n slow_spam_threshold?: number;\n slow_spam_ttl?: number;\n};\n\nexport type VelocityFilterConfig = {\n cascading_actions: boolean;\n enabled: boolean;\n first_message_only: boolean;\n rules: VelocityFilterConfigRule[];\n async?: boolean;\n};\n","export type Patch<T> = (value: T) => T;\nexport type Handler<T> = (nextValue: T, previousValue: T | undefined) => void;\nexport type Unsubscribe = () => void;\n\nfunction isPatch<T>(value: T | Patch<T>): value is Patch<T> {\n return typeof value === 'function';\n}\n\nexport class StateStore<T extends Record<string, unknown>> {\n private handlerSet = new Set<Handler<T>>();\n\n private static logCount = 5;\n\n constructor(private value: T) {}\n\n public next = (newValueOrPatch: T | Patch<T>): void => {\n // newValue (or patch output) should never be mutated previous value\n const newValue = isPatch(newValueOrPatch) ? newValueOrPatch(this.value) : newValueOrPatch;\n\n // do not notify subscribers if the value hasn't changed\n if (newValue === this.value) return;\n\n const oldValue = this.value;\n this.value = newValue;\n\n this.handlerSet.forEach((handler) => handler(this.value, oldValue));\n };\n\n public partialNext = (partial: Partial<T>): void => this.next((current) => ({ ...current, ...partial }));\n\n public getLatestValue = (): T => this.value;\n\n public subscribe = (handler: Handler<T>): Unsubscribe => {\n handler(this.value, undefined);\n this.handlerSet.add(handler);\n return () => {\n this.handlerSet.delete(handler);\n };\n };\n\n public subscribeWithSelector = <O extends Readonly<Record<string, unknown>> | Readonly<unknown[]>>(\n selector: (nextValue: T) => O,\n handler: Handler<O>,\n ) => {\n // begin with undefined to reduce amount of selector calls\n let selectedValues: O | undefined;\n\n const wrappedHandler: Handler<T> = (nextValue) => {\n const newlySelectedValues = selector(nextValue);\n\n let hasUpdatedValues = !selectedValues;\n\n if (Array.isArray(newlySelectedValues) && StateStore.logCount > 0) {\n console.warn(\n '[StreamChat]: The API of our StateStore has changed. Instead of returning an array in the selector, please return a named object of properties.',\n );\n StateStore.logCount--;\n }\n\n for (const key in selectedValues) {\n // @ts-ignore TODO: remove array support (Readonly<unknown[]>)\n if (selectedValues[key] === newlySelectedValues[key]) continue;\n hasUpdatedValues = true;\n break;\n }\n\n if (!hasUpdatedValues) return;\n\n const oldSelectedValues = selectedValues;\n selectedValues = newlySelectedValues;\n\n handler(newlySelectedValues, oldSelectedValues);\n };\n\n return this.subscribe(wrappedHandler);\n };\n}\n","import type { Channel } from './channel';\nimport type { StreamChat } from './client';\nimport { StateStore } from './store';\nimport type {\n AscDesc,\n DefaultGenerics,\n EventTypes,\n ExtendableGenerics,\n FormatMessageResponse,\n MessagePaginationOptions,\n MessageResponse,\n ReadResponse,\n ThreadResponse,\n ThreadResponseCustomData,\n UserResponse,\n} from './types';\nimport { addToMessageList, findIndexInSortedArray, formatMessage, throttle } from './utils';\n\ntype QueryRepliesOptions<SCG extends ExtendableGenerics> = {\n sort?: { created_at: AscDesc }[];\n} & MessagePaginationOptions & { user?: UserResponse<SCG>; user_id?: string };\n\nexport type ThreadState<SCG extends ExtendableGenerics = DefaultGenerics> = {\n /**\n * Determines if the thread is currently opened and on-screen. When the thread is active,\n * all new messages are immediately marked as read.\n */\n active: boolean;\n channel: Channel<SCG>;\n createdAt: Date;\n custom: ThreadResponseCustomData;\n deletedAt: Date | null;\n isLoading: boolean;\n isStateStale: boolean;\n pagination: ThreadRepliesPagination;\n /**\n * Thread is identified by and has a one-to-one relation with its parent message.\n * We use parent message id as a thread id.\n */\n parentMessage: FormatMessageResponse<SCG>;\n participants: ThreadResponse<SCG>['thread_participants'];\n read: ThreadReadState;\n replies: Array<FormatMessageResponse<SCG>>;\n replyCount: number;\n title: string;\n updatedAt: Date | null;\n};\n\nexport type ThreadRepliesPagination = {\n isLoadingNext: boolean;\n isLoadingPrev: boolean;\n nextCursor: string | null;\n prevCursor: string | null;\n};\n\nexport type ThreadUserReadState<SCG extends ExtendableGenerics = DefaultGenerics> = {\n lastReadAt: Date;\n unreadMessageCount: number;\n user: UserResponse<SCG>;\n lastReadMessageId?: string;\n};\n\nexport type ThreadReadState<SCG extends ExtendableGenerics = DefaultGenerics> = Record<\n string,\n ThreadUserReadState<SCG> | undefined\n>;\n\nconst DEFAULT_PAGE_LIMIT = 50;\nconst DEFAULT_SORT: { created_at: AscDesc }[] = [{ created_at: -1 }];\nconst MARK_AS_READ_THROTTLE_TIMEOUT = 1000;\n// TODO: remove this once we move to API v2\nexport const THREAD_RESPONSE_RESERVED_KEYS: Record<keyof ThreadResponse, true> = {\n channel: true,\n channel_cid: true,\n created_at: true,\n created_by_user_id: true,\n parent_message_id: true,\n title: true,\n updated_at: true,\n latest_replies: true,\n active_participant_count: true,\n deleted_at: true,\n last_message_at: true,\n participant_count: true,\n reply_count: true,\n read: true,\n thread_participants: true,\n created_by: true,\n parent_message: true,\n};\n\n// TODO: remove this once we move to API v2\nconst constructCustomDataObject = <T extends ThreadResponse>(threadData: T) => {\n const custom: ThreadResponseCustomData = {};\n\n for (const key in threadData) {\n if (THREAD_RESPONSE_RESERVED_KEYS[key as keyof ThreadResponse]) {\n continue;\n }\n\n const customKey = key as keyof ThreadResponseCustomData;\n\n custom[customKey] = threadData[customKey];\n }\n\n return custom;\n};\n\nexport class Thread<SCG extends ExtendableGenerics = DefaultGenerics> {\n public readonly state: StateStore<ThreadState<SCG>>;\n public readonly id: string;\n\n private client: StreamChat<SCG>;\n private unsubscribeFunctions: Set<() => void> = new Set();\n private failedRepliesMap: Map<string, FormatMessageResponse<SCG>> = new Map();\n\n constructor({ client, threadData }: { client: StreamChat<SCG>; threadData: ThreadResponse<SCG> }) {\n const channel = client.channel(threadData.channel.type, threadData.channel.id, {\n name: threadData.channel.name,\n });\n channel._hydrateMembers({ members: threadData.channel.members ?? [], overrideCurrentState: false });\n\n // For when read object is undefined and due to that unreadMessageCount for\n // the current user isn't being incremented on message.new\n const placeholderReadResponse: ReadResponse[] = client.userID\n ? [{ user: { id: client.userID }, unread_messages: 0, last_read: new Date().toISOString() }]\n : [];\n\n this.state = new StateStore<ThreadState<SCG>>({\n // local only\n active: false,\n isLoading: false,\n isStateStale: false,\n // 99.9% should never change\n channel,\n createdAt: new Date(threadData.created_at),\n // rest\n deletedAt: threadData.deleted_at ? new Date(threadData.deleted_at) : null,\n pagination: repliesPaginationFromInitialThread(threadData),\n parentMessage: formatMessage(threadData.parent_message),\n participants: threadData.thread_participants,\n read: formatReadState(\n !threadData.read || threadData.read.length === 0 ? placeholderReadResponse : threadData.read,\n ),\n replies: threadData.latest_replies.map(formatMessage),\n replyCount: threadData.reply_count ?? 0,\n updatedAt: threadData.updated_at ? new Date(threadData.updated_at) : null,\n title: threadData.title,\n custom: constructCustomDataObject(threadData),\n });\n\n this.id = threadData.parent_message_id;\n this.client = client;\n }\n\n get channel() {\n return this.state.getLatestValue().channel;\n }\n\n get hasStaleState() {\n return this.state.getLatestValue().isStateStale;\n }\n\n get ownUnreadCount() {\n return ownUnreadCountSelector(this.client.userID)(this.state.getLatestValue());\n }\n\n public activate = () => {\n this.state.partialNext({ active: true });\n };\n\n public deactivate = () => {\n this.state.partialNext({ active: false });\n };\n\n public reload = async () => {\n if (this.state.getLatestValue().isLoading) {\n return;\n }\n\n this.state.partialNext({ isLoading: true });\n\n try {\n const thread = await this.client.getThread(this.id, { watch: true });\n this.hydrateState(thread);\n } finally {\n this.state.partialNext({ isLoading: false });\n }\n };\n\n public hydrateState = (thread: Thread<SCG>) => {\n if (thread === this) {\n // skip if the instances are the same\n return;\n }\n\n if (thread.id !== this.id) {\n throw new Error(\"Cannot hydrate thread state with using thread's state\");\n }\n\n const {\n read,\n replyCount,\n replies,\n parentMessage,\n participants,\n createdAt,\n deletedAt,\n updatedAt,\n } = thread.state.getLatestValue();\n\n // Preserve pending replies and append them to the updated list of replies\n const pendingReplies = Array.from(this.failedRepliesMap.values());\n\n this.state.partialNext({\n read,\n replyCount,\n replies: pendingReplies.length ? replies.concat(pendingReplies) : replies,\n parentMessage,\n participants,\n createdAt,\n deletedAt,\n updatedAt,\n isStateStale: false,\n });\n };\n\n public registerSubscriptions = () => {\n if (this.unsubscribeFunctions.size) {\n // Thread is already listening for events and changes\n return;\n }\n\n this.unsubscribeFunctions.add(this.subscribeThreadUpdated());\n this.unsubscribeFunctions.add(this.subscribeMarkActiveThreadRead());\n this.unsubscribeFunctions.add(this.subscribeReloadActiveStaleThread());\n this.unsubscribeFunctions.add(this.subscribeMarkThreadStale());\n this.unsubscribeFunctions.add(this.subscribeNewReplies());\n this.unsubscribeFunctions.add(this.subscribeRepliesRead());\n this.unsubscribeFunctions.add(this.subscribeMessageDeleted());\n this.unsubscribeFunctions.add(this.subscribeMessageUpdated());\n };\n\n private subscribeThreadUpdated = () => {\n return this.client.on('thread.updated', (event) => {\n if (!event.thread || event.thread.parent_message_id !== this.id) {\n return;\n }\n\n const threadData = event.thread;\n\n this.state.partialNext({\n title: threadData.title,\n updatedAt: new Date(threadData.updated_at),\n deletedAt: threadData.deleted_at ? new Date(threadData.deleted_at) : null,\n // TODO: use threadData.custom once we move to API v2\n custom: constructCustomDataObject(threadData),\n });\n }).unsubscribe;\n };\n\n private subscribeMarkActiveThreadRead = () => {\n return this.state.subscribeWithSelector(\n (nextValue) => ({\n active: nextValue.active,\n unreadMessageCount: ownUnreadCountSelector(this.client.userID)(nextValue),\n }),\n ({ active, unreadMessageCount }) => {\n if (!active || !unreadMessageCount) return;\n this.throttledMarkAsRead();\n },\n );\n };\n\n private subscribeReloadActiveStaleThread = () =>\n this.state.subscribeWithSelector(\n (nextValue) => ({ active: nextValue.active, isStateStale: nextValue.isStateStale }),\n ({ active, isStateStale }) => {\n if (active && isStateStale) {\n this.reload();\n }\n },\n );\n\n private subscribeMarkThreadStale = () =>\n this.client.on('user.watching.stop', (event) => {\n const { channel } = this.state.getLatestValue();\n\n if (!this.client.userID || this.client.userID !== event.user?.id || event.channel?.cid !== channel.cid) {\n return;\n }\n\n this.state.partialNext({ isStateStale: true });\n }).unsubscribe;\n\n private subscribeNewReplies = () =>\n this.client.on('message.new', (event) => {\n if (!this.client.userID || event.message?.parent_id !== this.id) {\n return;\n }\n\n const isOwnMessage = event.message.user?.id === this.client.userID;\n const { active, read } = this.state.getLatestValue();\n\n this.upsertReplyLocally({\n message: event.message,\n // Message from current user could have been added optimistically,\n // so the actual timestamp might differ in the event\n timestampChanged: isOwnMessage,\n });\n\n if (active) {\n this.throttledMarkAsRead();\n }\n\n const nextRead: ThreadReadState = {};\n\n for (const userId of Object.keys(read)) {\n const userRead = read[userId];\n\n if (userRead) {\n let nextUserRead: ThreadUserReadState = userRead;\n\n if (userId === event.user?.id) {\n // The user who just sent a message to the thread has no unread messages\n // in that thread\n nextUserRead = {\n ...nextUserRead,\n lastReadAt: event.created_at ? new Date(event.created_at) : new Date(),\n user: event.user,\n unreadMessageCount: 0,\n };\n } else if (active && userId === this.client.userID) {\n // Do not increment unread count for the current user in an active thread\n } else {\n // Increment unread count for all users except the author of the new message\n nextUserRead = {\n ...nextUserRead,\n unreadMessageCount: userRead.unreadMessageCount + 1,\n };\n }\n\n nextRead[userId] = nextUserRead;\n }\n }\n\n this.state.partialNext({ read: nextRead });\n }).unsubscribe;\n\n private subscribeRepliesRead = () =>\n this.client.on('message.read', (event) => {\n if (!event.user || !event.created_at || !event.thread) return;\n if (event.thread.parent_message_id !== this.id) return;\n\n const userId = event.user.id;\n const createdAt = event.created_at;\n const user = event.user;\n\n this.state.next((current) => ({\n ...current,\n read: {\n ...current.read,\n [userId]: {\n lastReadAt: new Date(createdAt),\n user,\n lastReadMessageId: event.last_read_message_id,\n unreadMessageCount: 0,\n },\n },\n }));\n }).unsubscribe;\n\n private subscribeMessageDeleted = () =>\n this.client.on('message.deleted', (event) => {\n if (!event.message) return;\n\n // Deleted message is a reply of this thread\n if (event.message.parent_id === this.id) {\n if (event.hard_delete) {\n this.deleteReplyLocally({ message: event.message });\n } else {\n // Handle soft delete (updates deleted_at timestamp)\n this.upsertReplyLocally({ message: event.message });\n }\n }\n\n // Deleted message is parent message of this thread\n if (event.message.id === this.id) {\n this.updateParentMessageLocally({ message: event.message });\n }\n }).unsubscribe;\n\n private subscribeMessageUpdated = () => {\n const eventTypes: EventTypes[] = ['message.updated', 'reaction.new', 'reaction.deleted', 'reaction.updated'];\n\n const unsubscribeFunctions = eventTypes.map(\n (eventType) =>\n this.client.on(eventType, (event) => {\n if (event.message) {\n this.updateParentMessageOrReplyLocally(event.message);\n }\n }).unsubscribe,\n );\n\n return () => unsubscribeFunctions.forEach((unsubscribe) => unsubscribe());\n };\n\n public unregisterSubscriptions = () => {\n this.unsubscribeFunctions.forEach((cleanupFunction) => cleanupFunction());\n this.unsubscribeFunctions.clear();\n };\n\n public deleteReplyLocally = ({ message }: { message: MessageResponse<SCG> }) => {\n const { replies } = this.state.getLatestValue();\n\n const index = findIndexInSortedArray({\n needle: formatMessage(message),\n sortedArray: replies,\n sortDirection: 'ascending',\n selectValueToCompare: (reply) => reply.created_at.getTime(),\n selectKey: (reply) => reply.id,\n });\n\n if (replies[index]?.id !== message.id) {\n return;\n }\n\n const updatedReplies = [...replies];\n updatedReplies.splice(index, 1);\n\n this.state.partialNext({\n replies: updatedReplies,\n });\n };\n\n public upsertReplyLocally = ({\n message,\n timestampChanged = false,\n }: {\n message: MessageResponse<SCG>;\n timestampChanged?: boolean;\n }) => {\n if (message.parent_id !== this.id) {\n throw new Error('Reply does not belong to this thread');\n }\n\n const formattedMessage = formatMessage(message);\n\n if (message.status === 'failed') {\n // store failed reply so that it's not lost when reloading or hydrating\n this.failedRepliesMap.set(formattedMessage.id, formattedMessage);\n } else if (this.failedRepliesMap.has(message.id)) {\n this.failedRepliesMap.delete(message.id);\n }\n\n this.state.next((current) => ({\n ...current,\n replies: addToMessageList(current.replies, formattedMessage, timestampChanged),\n }));\n };\n\n public updateParentMessageLocally = ({ message }: { message: MessageResponse<SCG> }) => {\n if (message.id !== this.id) {\n throw new Error('Message does not belong to this thread');\n }\n\n this.state.next((current) => {\n const formattedMessage = formatMessage(message);\n\n return {\n ...current,\n deletedAt: formattedMessage.deleted_at,\n parentMessage: formattedMessage,\n replyCount: message.reply_count ?? current.replyCount,\n };\n });\n };\n\n public updateParentMessageOrReplyLocally = (message: MessageResponse<SCG>) => {\n if (message.parent_id === this.id) {\n this.upsertReplyLocally({ message });\n }\n\n if (!message.parent_id && message.id === this.id) {\n this.updateParentMessageLocally({ message });\n }\n };\n\n public markAsRead = async ({ force = false }: { force?: boolean } = {}) => {\n if (this.ownUnreadCount === 0 && !force) {\n return null;\n }\n\n return await this.channel.markRead({ thread_id: this.id });\n };\n\n private throttledMarkAsRead = throttle(() => this.markAsRead(), MARK_AS_READ_THROTTLE_TIMEOUT, { trailing: true });\n\n public queryReplies = ({\n limit = DEFAULT_PAGE_LIMIT,\n sort = DEFAULT_SORT,\n ...otherOptions\n }: QueryRepliesOptions<SCG> = {}) => {\n return this.channel.getReplies(this.id, { limit, ...otherOptions }, sort);\n };\n\n public loadNextPage = ({ limit = DEFAULT_PAGE_LIMIT }: { limit?: number } = {}) => {\n return this.loadPage(limit);\n };\n\n public loadPrevPage = ({ limit = DEFAULT_PAGE_LIMIT }: { limit?: number } = {}) => {\n return this.loadPage(-limit);\n };\n\n private loadPage = async (count: number) => {\n const { pagination } = this.state.getLatestValue();\n const [loadingKey, cursorKey, insertionMethodKey] =\n count > 0\n ? (['isLoadingNext', 'nextCursor', 'push'] as const)\n : (['isLoadingPrev', 'prevCursor', 'unshift'] as const);\n\n if (pagination[loadingKey] || pagination[cursorKey] === null) return;\n\n const queryOptions = { [count > 0 ? 'id_gt' : 'id_lt']: pagination[cursorKey] };\n const limit = Math.abs(count);\n\n this.state.partialNext({ pagination: { ...pagination, [loadingKey]: true } });\n\n try {\n const data = await this.queryReplies({ ...queryOptions, limit });\n const replies = data.messages.map(formatMessage);\n const maybeNextCursor = replies.at(count > 0 ? -1 : 0)?.id ?? null;\n\n this.state.next((current) => {\n let nextReplies = current.replies;\n\n // prevent re-creating array if there's nothing to add to the current one\n if (replies.length > 0) {\n nextReplies = [...current.replies];\n nextReplies[insertionMethodKey](...replies);\n }\n\n return {\n ...current,\n replies: nextReplies,\n pagination: {\n ...current.pagination,\n [cursorKey]: data.messages.length < limit ? null : maybeNextCursor,\n [loadingKey]: false,\n },\n };\n });\n } catch (error) {\n this.client.logger('error', (error as Error).message);\n this.state.next((current) => ({\n ...current,\n pagination: {\n ...current.pagination,\n [loadingKey]: false,\n },\n }));\n }\n };\n}\n\nconst formatReadState = (read: ReadResponse[]): ThreadReadState =>\n read.reduce<ThreadReadState>((state, userRead) => {\n state[userRead.user.id] = {\n user: userRead.user,\n lastReadMessageId: userRead.last_read_message_id,\n unreadMessageCount: userRead.unread_messages ?? 0,\n lastReadAt: new Date(userRead.last_read),\n };\n return state;\n }, {});\n\nconst repliesPaginationFromInitialThread = (thread: ThreadResponse): ThreadRepliesPagination => {\n const latestRepliesContainsAllReplies = thread.latest_replies.length === thread.reply_count;\n\n return {\n nextCursor: null,\n prevCursor: latestRepliesContainsAllReplies ? null : thread.latest_replies.at(0)?.id ?? null,\n isLoadingNext: false,\n isLoadingPrev: false,\n };\n};\n\nconst ownUnreadCountSelector = (currentUserId: string | undefined) => <\n SCG extends ExtendableGenerics = DefaultGenerics\n>(\n state: ThreadState<SCG>,\n) => (currentUserId && state.read[currentUserId]?.unreadMessageCount) || 0;\n","import {\n APIResponse,\n ModerationConfig,\n DefaultGenerics,\n ExtendableGenerics,\n GetConfigResponse,\n GetUserModerationReportResponse,\n MuteUserResponse,\n ReviewQueueFilters,\n ReviewQueuePaginationOptions,\n ReviewQueueResponse,\n ReviewQueueSort,\n UpsertConfigResponse,\n ModerationFlagOptions,\n ModerationMuteOptions,\n GetUserModerationReportOptions,\n SubmitActionOptions,\n QueryModerationConfigsFilters,\n QueryModerationConfigsSort,\n Pager,\n CustomCheckFlag,\n ReviewQueueItem,\n QueryConfigsResponse,\n} from './types';\nimport { StreamChat } from './client';\nimport { normalizeQuerySort } from './utils';\n\nexport const MODERATION_ENTITY_TYPES = {\n user: 'stream:user',\n message: 'stream:chat:v1:message',\n};\n\n// Moderation class provides all the endpoints related to moderation v2.\nexport class Moderation<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> {\n client: StreamChat<StreamChatGenerics>;\n\n constructor(client: StreamChat<StreamChatGenerics>) {\n this.client = client;\n }\n\n /**\n * Flag a user\n *\n * @param {string} flaggedUserID User ID to be flagged\n * @param {string} reason Reason for flagging the user\n * @param {Object} options Additional options for flagging the user\n * @param {string} options.user_id (For server side usage) User ID of the user who is flagging the target user\n * @param {Object} options.custom Additional data to be stored with the flag\n * @returns\n */\n async flagUser(flaggedUserID: string, reason: string, options: ModerationFlagOptions = {}) {\n return this.flag(MODERATION_ENTITY_TYPES.user, flaggedUserID, '', reason, options);\n }\n\n /**\n * Flag a message\n *\n * @param {string} messageID Message ID to be flagged\n * @param {string} reason Reason for flagging the message\n * @param {Object} options Additional options for flagging the message\n * @param {string} options.user_id (For server side usage) User ID of the user who is flagging the target message\n * @param {Object} options.custom Additional data to be stored with the flag\n * @returns\n */\n async flagMessage(messageID: string, reason: string, options: ModerationFlagOptions = {}) {\n return this.flag(MODERATION_ENTITY_TYPES.message, messageID, '', reason, options);\n }\n\n /**\n * Flag a user\n *\n * @param {string} entityType Entity type to be flagged\n * @param {string} entityId Entity ID to be flagged\n * @param {string} entityCreatorID User ID of the entity creator\n * @param {string} reason Reason for flagging the entity\n * @param {Object} options Additional options for flagging the entity\n * @param {string} options.user_id (For server side usage) User ID of the user who is flagging the target entity\n * @param {Object} options.moderation_payload Content to be flagged e.g., { texts: ['text1', 'text2'], images: ['image1', 'image2']}\n * @param {Object} options.custom Additional data to be stored with the flag\n * @returns\n */\n async flag(\n entityType: string,\n entityId: string,\n entityCreatorID: string,\n reason: string,\n options: ModerationFlagOptions = {},\n ) {\n return await this.client.post<{ item_id: string } & APIResponse>(this.client.baseURL + '/api/v2/moderation/flag', {\n entity_type: entityType,\n entity_id: entityId,\n entity_creator_id: entityCreatorID,\n reason,\n ...options,\n });\n }\n\n /**\n * Mute a user\n * @param {string} targetID User ID to be muted\n * @param {Object} options Additional options for muting the user\n * @param {string} options.user_id (For server side usage) User ID of the user who is muting the target user\n * @param {number} options.timeout Timeout for the mute in minutes\n * @returns\n */\n async muteUser(targetID: string, options: ModerationMuteOptions = {}) {\n return await this.client.post<MuteUserResponse<StreamChatGenerics> & APIResponse>(\n this.client.baseURL + '/api/v2/moderation/mute',\n {\n target_ids: [targetID],\n ...options,\n },\n );\n }\n\n /**\n * Unmute a user\n * @param {string} targetID User ID to be unmuted\n * @param {Object} options Additional options for unmuting the user\n * @param {string} options.user_id (For server side usage) User ID of the user who is unmuting the target user\n * @returns\n */\n async unmuteUser(\n targetID: string,\n options: {\n user_id?: string;\n },\n ) {\n return await this.client.post<{ item_id: string } & APIResponse>(\n this.client.baseURL + '/api/v2/moderation/unmute',\n {\n target_ids: [targetID],\n ...options,\n },\n );\n }\n\n /**\n * Get moderation report for a user\n * @param {string} userID User ID for which moderation report is to be fetched\n * @param {Object} options Additional options for fetching the moderation report\n * @param {boolean} options.create_user_if_not_exists Create user if not exists\n * @param {boolean} options.include_user_blocks Include user blocks\n * @param {boolean} options.include_user_mutes Include user mutes\n */\n async getUserModerationReport(userID: string, options: GetUserModerationReportOptions = {}) {\n return await this.client.get<GetUserModerationReportResponse<StreamChatGenerics>>(\n this.client.baseURL + `/api/v2/moderation/user_report`,\n {\n user_id: userID,\n ...options,\n },\n );\n }\n\n /**\n * Query review queue\n * @param {Object} filterConditions Filter conditions for querying review queue\n * @param {Object} sort Sort conditions for querying review queue\n * @param {Object} options Pagination options for querying review queue\n */\n async queryReviewQueue(\n filterConditions: ReviewQueueFilters = {},\n sort: ReviewQueueSort = [],\n options: ReviewQueuePaginationOptions = {},\n ) {\n return await this.client.post<ReviewQueueResponse>(this.client.baseURL + '/api/v2/moderation/review_queue', {\n filter: filterConditions,\n sort: normalizeQuerySort(sort),\n ...options,\n });\n }\n\n /**\n * Upsert moderation config\n * @param {Object} config Moderation config to be upserted\n */\n async upsertConfig(config: ModerationConfig) {\n return await this.client.post<UpsertConfigResponse>(this.client.baseURL + '/api/v2/moderation/config', config);\n }\n\n /**\n * Get moderation config\n * @param {string} key Key for which moderation config is to be fetched\n */\n async getConfig(key: string, data?: { team?: string }) {\n return await this.client.get<GetConfigResponse>(this.client.baseURL + '/api/v2/moderation/config/' + key, data);\n }\n\n async deleteConfig(key: string, data?: { team?: string }) {\n return await this.client.delete(this.client.baseURL + '/api/v2/moderation/config/' + key, data);\n }\n\n /**\n * Query moderation configs\n * @param {Object} filterConditions Filter conditions for querying moderation configs\n * @param {Object} sort Sort conditions for querying moderation configs\n * @param {Object} options Additional options for querying moderation configs\n */\n async queryConfigs(\n filterConditions: QueryModerationConfigsFilters,\n sort: QueryModerationConfigsSort,\n options: Pager = {},\n ) {\n return await this.client.post<QueryConfigsResponse>(this.client.baseURL + '/api/v2/moderation/configs', {\n filter: filterConditions,\n sort,\n ...options,\n });\n }\n\n async submitAction(actionType: string, itemID: string, options: SubmitActionOptions = {}) {\n return await this.client.post<{ item_id: string } & APIResponse>(\n this.client.baseURL + '/api/v2/moderation/submit_action',\n {\n action_type: actionType,\n item_id: itemID,\n ...options,\n },\n );\n }\n\n /**\n *\n * @param {string} entityType string Type of entity to be checked E.g., stream:user, stream:chat:v1:message, or any custom string\n * @param {string} entityID string ID of the entity to be checked. This is mainly for tracking purposes\n * @param {string} entityCreatorID string ID of the entity creator\n * @param {object} moderationPayload object Content to be checked for moderation. E.g., { texts: ['text1', 'text2'], images: ['image1', 'image2']}\n * @param {Array} moderationPayload.texts array Array of texts to be checked for moderation\n * @param {Array} moderationPayload.images array Array of images to be checked for moderation\n * @param {Array} moderationPayload.videos array Array of videos to be checked for moderation\n * @param configKey\n * @param options\n * @returns\n */\n async check(\n entityType: string,\n entityID: string,\n entityCreatorID: string,\n moderationPayload: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n custom?: Record<string, any>;\n images?: string[];\n texts?: string[];\n videos?: string[];\n },\n configKey: string,\n options?: {\n force_sync?: boolean;\n },\n ) {\n return await this.client.post(this.client.baseURL + `/api/v2/moderation/check`, {\n entity_type: entityType,\n entity_id: entityID,\n entity_creator_id: entityCreatorID,\n moderation_payload: moderationPayload,\n config_key: configKey,\n options,\n });\n }\n\n /**\n *\n * @param {string} entityType string Type of entity to be checked E.g., stream:user, stream:chat:v1:message, or any custom string\n * @param {string} entityID string ID of the entity to be checked. This is mainly for tracking purposes\n * @param {string} entityCreatorID string ID of the entity creator\n * @param {object} moderationPayload object Content to be checked for moderation. E.g., { texts: ['text1', 'text2'], images: ['image1', 'image2']}\n * @param {Array} moderationPayload.texts array Array of texts to be checked for moderation\n * @param {Array} moderationPayload.images array Array of images to be checked for moderation\n * @param {Array} moderationPayload.videos array Array of videos to be checked for moderation\n * @param {Array<CustomCheckFlag>} flags Array of CustomCheckFlag to be passed to flag the entity\n * @returns\n */\n async addCustomFlags(\n entityType: string,\n entityID: string,\n entityCreatorID: string,\n moderationPayload: {\n images?: string[];\n texts?: string[];\n videos?: string[];\n },\n flags: CustomCheckFlag[],\n ) {\n return await this.client.post<{ id: string; item: ReviewQueueItem; status: string } & APIResponse>(\n this.client.baseURL + `/api/v2/moderation/custom_check`,\n {\n entity_type: entityType,\n entity_id: entityID,\n entity_creator_id: entityCreatorID,\n moderation_payload: moderationPayload,\n flags,\n },\n );\n }\n\n /**\n * Add custom flags to a message\n * @param {string} messageID Message ID to be flagged\n * @param {Array<CustomCheckFlag>} flags Array of CustomCheckFlag to be passed to flag the message\n * @returns\n */\n async addCustomMessageFlags(messageID: string, flags: CustomCheckFlag[]) {\n return await this.addCustomFlags(MODERATION_ENTITY_TYPES.message, messageID, '', {}, flags);\n }\n}\n","import { StateStore } from './store';\nimport { throttle } from './utils';\n\nimport type { StreamChat } from './client';\nimport type { Thread } from './thread';\nimport type { DefaultGenerics, Event, ExtendableGenerics, OwnUserResponse, QueryThreadsOptions } from './types';\n\nconst DEFAULT_CONNECTION_RECOVERY_THROTTLE_DURATION = 1000;\nconst MAX_QUERY_THREADS_LIMIT = 25;\nexport const THREAD_MANAGER_INITIAL_STATE = {\n active: false,\n isThreadOrderStale: false,\n threads: [],\n unreadThreadCount: 0,\n unseenThreadIds: [],\n lastConnectionDropAt: null,\n pagination: {\n isLoading: false,\n isLoadingNext: false,\n nextCursor: null,\n },\n ready: false,\n};\n\nexport type ThreadManagerState<SCG extends ExtendableGenerics = DefaultGenerics> = {\n active: boolean;\n isThreadOrderStale: boolean;\n lastConnectionDropAt: Date | null;\n pagination: ThreadManagerPagination;\n ready: boolean;\n threads: Thread<SCG>[];\n unreadThreadCount: number;\n /**\n * List of threads that haven't been loaded in the list, but have received new messages\n * since the latest reload. Useful to display a banner prompting to reload the thread list.\n */\n unseenThreadIds: string[];\n};\n\nexport type ThreadManagerPagination = {\n isLoading: boolean;\n isLoadingNext: boolean;\n nextCursor: string | null;\n};\n\nexport class ThreadManager<SCG extends ExtendableGenerics = DefaultGenerics> {\n public readonly state: StateStore<ThreadManagerState<SCG>>;\n private client: StreamChat<SCG>;\n private unsubscribeFunctions: Set<() => void> = new Set();\n private threadsByIdGetterCache: {\n threads: ThreadManagerState<SCG>['threads'];\n threadsById: Record<string, Thread<SCG> | undefined>;\n };\n\n constructor({ client }: { client: StreamChat<SCG> }) {\n this.client = client;\n this.state = new StateStore<ThreadManagerState<SCG>>(THREAD_MANAGER_INITIAL_STATE);\n\n this.threadsByIdGetterCache = { threads: [], threadsById: {} };\n }\n\n public get threadsById() {\n const { threads } = this.state.getLatestValue();\n\n if (threads === this.threadsByIdGetterCache.threads) {\n return this.threadsByIdGetterCache.threadsById;\n }\n\n const threadsById = threads.reduce<Record<string, Thread<SCG>>>((newThreadsById, thread) => {\n newThreadsById[thread.id] = thread;\n return newThreadsById;\n }, {});\n\n this.threadsByIdGetterCache.threads = threads;\n this.threadsByIdGetterCache.threadsById = threadsById;\n\n return threadsById;\n }\n\n public resetState = () => {\n this.state.next(THREAD_MANAGER_INITIAL_STATE);\n };\n\n public activate = () => {\n this.state.partialNext({ active: true });\n };\n\n public deactivate = () => {\n this.state.partialNext({ active: false });\n };\n\n public registerSubscriptions = () => {\n if (this.unsubscribeFunctions.size) return;\n\n this.unsubscribeFunctions.add(this.subscribeUnreadThreadsCountChange());\n this.unsubscribeFunctions.add(this.subscribeManageThreadSubscriptions());\n this.unsubscribeFunctions.add(this.subscribeReloadOnActivation());\n this.unsubscribeFunctions.add(this.subscribeNewReplies());\n this.unsubscribeFunctions.add(this.subscribeRecoverAfterConnectionDrop());\n this.unsubscribeFunctions.add(this.subscribeChannelDeleted());\n };\n\n private subscribeUnreadThreadsCountChange = () => {\n // initiate\n const { unread_threads: unreadThreadCount = 0 } = (this.client.user as OwnUserResponse<SCG>) ?? {};\n this.state.partialNext({ unreadThreadCount });\n\n const unsubscribeFunctions = [\n 'health.check',\n 'notification.mark_read',\n 'notification.thread_message_new',\n 'notification.channel_deleted',\n ].map(\n (eventType) =>\n this.client.on(eventType, (event) => {\n const { unread_threads: unreadThreadCount } = event.me ?? event;\n if (typeof unreadThreadCount === 'number') {\n this.state.partialNext({ unreadThreadCount });\n }\n }).unsubscribe,\n );\n\n return () => unsubscribeFunctions.forEach((unsubscribe) => unsubscribe());\n };\n\n private subscribeChannelDeleted = () =>\n this.client.on('notification.channel_deleted', (event) => {\n const { cid } = event;\n const { threads } = this.state.getLatestValue();\n\n const newThreads = threads.filter((thread) => thread.channel.cid !== cid);\n this.state.partialNext({ threads: newThreads });\n }).unsubscribe;\n\n private subscribeManageThreadSubscriptions = () =>\n this.state.subscribeWithSelector(\n (nextValue) => ({ threads: nextValue.threads }),\n ({ threads: nextThreads }, prev) => {\n const { threads: prevThreads = [] } = prev ?? {};\n // Thread instance was removed if there's no thread with the given id at all,\n // or it was replaced with a new instance\n const removedThreads = prevThreads.filter((thread) => thread !== this.threadsById[thread.id]);\n\n nextThreads.forEach((thread) => thread.registerSubscriptions());\n removedThreads.forEach((thread) => thread.unregisterSubscriptions());\n },\n );\n\n private subscribeReloadOnActivation = () =>\n this.state.subscribeWithSelector(\n (nextValue) => ({ active: nextValue.active }),\n ({ active }) => {\n if (active) this.reload();\n },\n );\n\n private subscribeNewReplies = () =>\n this.client.on('notification.thread_message_new', (event: Event<SCG>) => {\n const parentId = event.message?.parent_id;\n if (!parentId) return;\n\n const { unseenThreadIds, ready } = this.state.getLatestValue();\n if (!ready) return;\n\n if (this.threadsById[parentId]) {\n this.state.partialNext({ isThreadOrderStale: true });\n } else if (!unseenThreadIds.includes(parentId)) {\n this.state.partialNext({ unseenThreadIds: unseenThreadIds.concat(parentId) });\n }\n }).unsubscribe;\n\n private subscribeRecoverAfterConnectionDrop = () => {\n const unsubscribeConnectionDropped = this.client.on('connection.changed', (event) => {\n if (event.online === false) {\n this.state.next((current) =>\n current.lastConnectionDropAt\n ? current\n : {\n ...current,\n lastConnectionDropAt: new Date(),\n },\n );\n }\n }).unsubscribe;\n\n const throttledHandleConnectionRecovered = throttle(\n () => {\n const { lastConnectionDropAt } = this.state.getLatestValue();\n if (!lastConnectionDropAt) return;\n this.reload({ force: true });\n },\n DEFAULT_CONNECTION_RECOVERY_THROTTLE_DURATION,\n { trailing: true },\n );\n\n const unsubscribeConnectionRecovered = this.client.on('connection.recovered', throttledHandleConnectionRecovered)\n .unsubscribe;\n\n return () => {\n unsubscribeConnectionDropped();\n unsubscribeConnectionRecovered();\n };\n };\n\n public unregisterSubscriptions = () => {\n this.state.getLatestValue().threads.forEach((thread) => thread.unregisterSubscriptions());\n this.unsubscribeFunctions.forEach((cleanupFunction) => cleanupFunction());\n this.unsubscribeFunctions.clear();\n };\n\n public reload = async ({ force = false } = {}) => {\n const { threads, unseenThreadIds, isThreadOrderStale, pagination, ready } = this.state.getLatestValue();\n if (pagination.isLoading) return;\n if (!force && ready && !unseenThreadIds.length && !isThreadOrderStale) return;\n const limit = threads.length + unseenThreadIds.length;\n\n try {\n this.state.next((current) => ({\n ...current,\n pagination: {\n ...current.pagination,\n isLoading: true,\n },\n }));\n\n const response = await this.queryThreads({\n limit: Math.min(limit, MAX_QUERY_THREADS_LIMIT) || MAX_QUERY_THREADS_LIMIT,\n });\n\n const currentThreads = this.threadsById;\n const nextThreads: Thread<SCG>[] = [];\n\n for (const incomingThread of response.threads) {\n const existingThread = currentThreads[incomingThread.id];\n\n if (existingThread) {\n // Reuse thread instances if possible\n nextThreads.push(existingThread);\n if (existingThread.hasStaleState) {\n existingThread.hydrateState(incomingThread);\n }\n } else {\n nextThreads.push(incomingThread);\n }\n }\n\n this.state.next((current) => ({\n ...current,\n threads: nextThreads,\n unseenThreadIds: [],\n isThreadOrderStale: false,\n pagination: {\n ...current.pagination,\n isLoading: false,\n nextCursor: response.next ?? null,\n },\n ready: true,\n }));\n } catch (error) {\n this.client.logger('error', (error as Error).message);\n this.state.next((current) => ({\n ...current,\n pagination: {\n ...current.pagination,\n isLoading: false,\n },\n }));\n }\n };\n\n public queryThreads = (options: QueryThreadsOptions = {}) => {\n return this.client.queryThreads({\n limit: 25,\n participant_limit: 10,\n reply_limit: 10,\n watch: true,\n ...options,\n });\n };\n\n public loadNextPage = async (options: Omit<QueryThreadsOptions, 'next'> = {}) => {\n const { pagination } = this.state.getLatestValue();\n\n if (pagination.isLoadingNext || !pagination.nextCursor) return;\n\n try {\n this.state.partialNext({ pagination: { ...pagination, isLoadingNext: true } });\n\n const response = await this.queryThreads({\n ...options,\n next: pagination.nextCursor,\n });\n\n this.state.next((current) => ({\n ...current,\n threads: response.threads.length ? current.threads.concat(response.threads) : current.threads,\n pagination: {\n ...current.pagination,\n nextCursor: response.next ?? null,\n isLoadingNext: false,\n },\n }));\n } catch (error) {\n this.client.logger('error', (error as Error).message);\n this.state.next((current) => ({\n ...current,\n pagination: {\n ...current.pagination,\n isLoadingNext: false,\n },\n }));\n }\n };\n}\n","import { StateStore } from './store';\nimport type { StreamChat } from './client';\nimport type {\n DefaultGenerics,\n Event,\n ExtendableGenerics,\n PartialPollUpdate,\n PollAnswer,\n PollData,\n PollEnrichData,\n PollOptionData,\n PollResponse,\n PollVote,\n QueryVotesFilters,\n QueryVotesOptions,\n VoteSort,\n} from './types';\n\ntype PollEvent<SCG extends ExtendableGenerics = DefaultGenerics> = {\n cid: string;\n created_at: string;\n poll: PollResponse<SCG>;\n};\n\ntype PollUpdatedEvent<SCG extends ExtendableGenerics = DefaultGenerics> = PollEvent<SCG> & {\n type: 'poll.updated';\n};\n\ntype PollClosedEvent<SCG extends ExtendableGenerics = DefaultGenerics> = PollEvent<SCG> & {\n type: 'poll.closed';\n};\n\ntype PollVoteEvent<SCG extends ExtendableGenerics = DefaultGenerics> = {\n cid: string;\n created_at: string;\n poll: PollResponse<SCG>;\n poll_vote: PollVote<SCG> | PollAnswer<SCG>;\n};\n\ntype PollVoteCastedEvent<SCG extends ExtendableGenerics = DefaultGenerics> = PollVoteEvent<SCG> & {\n type: 'poll.vote_casted';\n};\n\ntype PollVoteCastedChanged<SCG extends ExtendableGenerics = DefaultGenerics> = PollVoteEvent<SCG> & {\n type: 'poll.vote_removed';\n};\n\ntype PollVoteCastedRemoved<SCG extends ExtendableGenerics = DefaultGenerics> = PollVoteEvent<SCG> & {\n type: 'poll.vote_removed';\n};\n\nconst isPollUpdatedEvent = <SCG extends ExtendableGenerics = DefaultGenerics>(\n e: Event<SCG>,\n): e is PollUpdatedEvent<SCG> => e.type === 'poll.updated';\nconst isPollClosedEventEvent = <SCG extends ExtendableGenerics = DefaultGenerics>(\n e: Event<SCG>,\n): e is PollClosedEvent<SCG> => e.type === 'poll.closed';\nconst isPollVoteCastedEvent = <SCG extends ExtendableGenerics = DefaultGenerics>(\n e: Event<SCG>,\n): e is PollVoteCastedEvent<SCG> => e.type === 'poll.vote_casted';\nconst isPollVoteChangedEvent = <SCG extends ExtendableGenerics = DefaultGenerics>(\n e: Event<SCG>,\n): e is PollVoteCastedChanged<SCG> => e.type === 'poll.vote_changed';\nconst isPollVoteRemovedEvent = <SCG extends ExtendableGenerics = DefaultGenerics>(\n e: Event<SCG>,\n): e is PollVoteCastedRemoved<SCG> => e.type === 'poll.vote_removed';\n\nexport const isVoteAnswer = <SCG extends ExtendableGenerics = DefaultGenerics>(\n vote: PollVote<SCG> | PollAnswer<SCG>,\n): vote is PollAnswer<SCG> => !!(vote as PollAnswer<SCG>)?.answer_text;\n\nexport type PollAnswersQueryParams = {\n filter?: QueryVotesFilters;\n options?: QueryVotesOptions;\n sort?: VoteSort;\n};\n\nexport type PollOptionVotesQueryParams = {\n filter: { option_id: string } & QueryVotesFilters;\n options?: QueryVotesOptions;\n sort?: VoteSort;\n};\n\ntype OptionId = string;\n\nexport type PollState<SCG extends ExtendableGenerics = DefaultGenerics> = SCG['pollType'] &\n Omit<PollResponse<SCG>, 'own_votes' | 'id'> & {\n lastActivityAt: Date; // todo: would be ideal to get this from the BE\n maxVotedOptionIds: OptionId[];\n ownVotesByOptionId: Record<OptionId, PollVote<SCG>>;\n ownAnswer?: PollAnswer; // each user can have only one answer\n };\n\ntype PollInitOptions<SCG extends ExtendableGenerics = DefaultGenerics> = {\n client: StreamChat<SCG>;\n poll: PollResponse<SCG>;\n};\n\nexport class Poll<SCG extends ExtendableGenerics = DefaultGenerics> {\n public readonly state: StateStore<PollState<SCG>>;\n public id: string;\n private client: StreamChat<SCG>;\n private unsubscribeFunctions: Set<() => void> = new Set();\n\n constructor({ client, poll }: PollInitOptions<SCG>) {\n this.client = client;\n this.id = poll.id;\n\n this.state = new StateStore<PollState<SCG>>(this.getInitialStateFromPollResponse(poll));\n }\n\n private getInitialStateFromPollResponse = (poll: PollInitOptions<SCG>['poll']) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { own_votes, id, ...pollResponseForState } = poll;\n const { ownAnswer, ownVotes } = own_votes?.reduce<{ ownVotes: PollVote<SCG>[]; ownAnswer?: PollAnswer }>(\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 lastActivityAt: new Date(),\n maxVotedOptionIds: getMaxVotedOptionIds(\n pollResponseForState.vote_counts_by_option as PollResponse<SCG>['vote_counts_by_option'],\n ),\n ownAnswer,\n ownVotesByOptionId: getOwnVotesByOptionId(ownVotes),\n };\n };\n\n public reinitializeState = (poll: PollInitOptions<SCG>['poll']) => {\n this.state.partialNext(this.getInitialStateFromPollResponse(poll));\n };\n\n get data(): PollState<SCG> {\n return this.state.getLatestValue();\n }\n\n public handlePollUpdated = (event: Event<SCG>) => {\n if (event.poll?.id && event.poll.id !== this.id) return;\n if (!isPollUpdatedEvent(event)) return;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { id, ...pollData } = extractPollData(event.poll);\n // @ts-ignore\n this.state.partialNext({ ...pollData, lastActivityAt: new Date(event.created_at) });\n };\n\n public handlePollClosed = (event: Event<SCG>) => {\n if (event.poll?.id && event.poll.id !== this.id) return;\n if (!isPollClosedEventEvent(event)) return;\n // @ts-ignore\n this.state.partialNext({ is_closed: true, lastActivityAt: new Date(event.created_at) });\n };\n\n public handleVoteCasted = (event: Event<SCG>) => {\n if (event.poll?.id && event.poll.id !== this.id) return;\n if (!isPollVoteCastedEvent(event)) return;\n const currentState = this.data;\n const isOwnVote = event.poll_vote.user_id === this.client.userID;\n let latestAnswers = [...(currentState.latest_answers as PollAnswer[])];\n let ownAnswer = currentState.ownAnswer;\n const ownVotesByOptionId = currentState.ownVotesByOptionId;\n let maxVotedOptionIds = currentState.maxVotedOptionIds;\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(event.poll.vote_counts_by_option);\n }\n\n const pollEnrichData = extractPollEnrichedData(event.poll);\n // @ts-ignore\n this.state.partialNext({\n ...pollEnrichData,\n latest_answers: latestAnswers,\n lastActivityAt: new Date(event.created_at),\n ownAnswer,\n ownVotesByOptionId,\n maxVotedOptionIds,\n });\n };\n\n public handleVoteChanged = (event: Event<SCG>) => {\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)) return;\n const currentState = this.data;\n const isOwnVote = event.poll_vote.user_id === this.client.userID;\n let latestAnswers = [...(currentState.latest_answers as PollAnswer[])];\n let ownAnswer = currentState.ownAnswer;\n let ownVotesByOptionId = currentState.ownVotesByOptionId;\n let maxVotedOptionIds = currentState.maxVotedOptionIds;\n\n if (isOwnVote) {\n if (isVoteAnswer(event.poll_vote)) {\n latestAnswers = [event.poll_vote, ...latestAnswers.filter((answer) => answer.id !== event.poll_vote.id)];\n ownAnswer = event.poll_vote;\n } else if (event.poll_vote.option_id) {\n if (event.poll.enforce_unique_votes) {\n ownVotesByOptionId = { [event.poll_vote.option_id]: event.poll_vote };\n } else {\n ownVotesByOptionId = Object.entries(ownVotesByOptionId).reduce<Record<OptionId, PollVote<SCG>>>(\n (acc, [optionId, vote]) => {\n if (optionId !== event.poll_vote.option_id && vote.id === event.poll_vote.id) {\n return acc;\n }\n acc[optionId] = vote;\n return acc;\n },\n {},\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(event.poll.vote_counts_by_option);\n }\n } else if (isVoteAnswer(event.poll_vote)) {\n latestAnswers = [event.poll_vote, ...latestAnswers];\n } else {\n maxVotedOptionIds = getMaxVotedOptionIds(event.poll.vote_counts_by_option);\n }\n\n const pollEnrichData = extractPollEnrichedData(event.poll);\n // @ts-ignore\n this.state.partialNext({\n ...pollEnrichData,\n latest_answers: latestAnswers,\n lastActivityAt: new Date(event.created_at),\n ownAnswer,\n ownVotesByOptionId,\n maxVotedOptionIds,\n });\n };\n\n public handleVoteRemoved = (event: Event<SCG>) => {\n if (event.poll?.id && event.poll.id !== this.id) return;\n if (!isPollVoteRemovedEvent(event)) return;\n const currentState = this.data;\n const isOwnVote = event.poll_vote.user_id === this.client.userID;\n let latestAnswers = [...(currentState.latest_answers as PollAnswer[])];\n let ownAnswer = currentState.ownAnswer;\n const ownVotesByOptionId = { ...currentState.ownVotesByOptionId };\n let maxVotedOptionIds = currentState.maxVotedOptionIds;\n\n if (isVoteAnswer(event.poll_vote)) {\n latestAnswers = latestAnswers.filter((answer) => answer.id !== event.poll_vote.id);\n if (isOwnVote) {\n ownAnswer = undefined;\n }\n } else {\n maxVotedOptionIds = getMaxVotedOptionIds(event.poll.vote_counts_by_option);\n if (isOwnVote && event.poll_vote.option_id) {\n delete ownVotesByOptionId[event.poll_vote.option_id];\n }\n }\n\n const pollEnrichData = extractPollEnrichedData(event.poll);\n // @ts-ignore\n this.state.partialNext({\n ...pollEnrichData,\n latest_answers: latestAnswers,\n lastActivityAt: new Date(event.created_at),\n ownAnswer,\n ownVotesByOptionId,\n maxVotedOptionIds,\n });\n };\n\n query = async (id: string) => {\n const { poll } = await this.client.getPoll(id);\n // @ts-ignore\n this.state.partialNext({ ...poll, lastActivityAt: new Date() });\n return poll;\n };\n\n update = async (data: Exclude<PollData<SCG>, 'id'>) => {\n return await this.client.updatePoll({ ...data, id: this.id });\n };\n\n partialUpdate = async (partialPollObject: PartialPollUpdate<SCG>) => {\n return await this.client.partialUpdatePoll(this.id as string, partialPollObject);\n };\n\n close = async () => {\n return await this.client.closePoll(this.id as string);\n };\n\n delete = async () => {\n return await this.client.deletePoll(this.id as string);\n };\n\n createOption = async (option: PollOptionData) => {\n return await this.client.createPollOption(this.id as string, option);\n };\n\n updateOption = async (option: PollOptionData) => {\n return await this.client.updatePollOption(this.id as string, option);\n };\n\n deleteOption = async (optionId: string) => {\n return await this.client.deletePollOption(this.id as string, optionId);\n };\n\n castVote = async (optionId: string, messageId: string) => {\n const { max_votes_allowed, ownVotesByOptionId } = this.data;\n\n const reachedVoteLimit = max_votes_allowed && max_votes_allowed === Object.keys(ownVotesByOptionId).length;\n\n if (reachedVoteLimit) {\n let oldestVote = Object.values(ownVotesByOptionId)[0];\n Object.values(ownVotesByOptionId)\n .slice(1)\n .forEach((vote) => {\n if (!oldestVote?.created_at || new Date(vote.created_at) < new Date(oldestVote.created_at)) {\n oldestVote = vote;\n }\n });\n if (oldestVote?.id) {\n await this.removeVote(oldestVote.id, messageId);\n }\n }\n return await this.client.castPollVote(messageId, this.id as string, { option_id: optionId });\n };\n\n removeVote = async (voteId: string, messageId: string) => {\n return await this.client.removePollVote(messageId, this.id as string, voteId);\n };\n\n addAnswer = async (answerText: string, messageId: string) => {\n return await this.client.addPollAnswer(messageId, this.id as string, answerText);\n };\n\n removeAnswer = async (answerId: string, messageId: string) => {\n return await this.client.removePollVote(messageId, this.id as string, answerId);\n };\n\n queryAnswers = async (params: PollAnswersQueryParams) => {\n return await this.client.queryPollAnswers(this.id as string, params.filter, params.sort, params.options);\n };\n\n queryOptionVotes = async (params: PollOptionVotesQueryParams) => {\n return await this.client.queryPollVotes(this.id as string, params.filter, params.sort, params.options);\n };\n}\n\nfunction getMaxVotedOptionIds(voteCountsByOption: PollResponse['vote_counts_by_option']) {\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<SCG extends ExtendableGenerics = DefaultGenerics>(ownVotes: PollVote<SCG>[]) {\n return !ownVotes\n ? ({} as Record<OptionId, PollVote<SCG>>)\n : ownVotes.reduce<Record<OptionId, PollVote<SCG>>>((acc, vote) => {\n if (isVoteAnswer(vote) || !vote.option_id) return acc;\n acc[vote.option_id] = vote;\n return acc;\n }, {});\n}\n\nexport function extractPollData<SCG extends ExtendableGenerics = DefaultGenerics>(\n pollResponse: PollResponse<SCG>,\n): PollData<SCG> {\n return {\n allow_answers: pollResponse.allow_answers,\n allow_user_suggested_options: pollResponse.allow_user_suggested_options,\n description: pollResponse.description,\n enforce_unique_vote: pollResponse.enforce_unique_vote,\n id: pollResponse.id,\n is_closed: pollResponse.is_closed,\n max_votes_allowed: pollResponse.max_votes_allowed,\n name: pollResponse.name,\n options: pollResponse.options,\n voting_visibility: pollResponse.voting_visibility,\n };\n}\n\nexport function extractPollEnrichedData<SCG extends ExtendableGenerics = DefaultGenerics>(\n pollResponse: PollResponse<SCG>,\n): Omit<PollEnrichData<SCG>, 'own_votes' | 'latest_answers'> {\n return {\n answers_count: pollResponse.answers_count,\n latest_votes_by_option: pollResponse.latest_votes_by_option,\n vote_count: pollResponse.vote_count,\n vote_counts_by_option: pollResponse.vote_counts_by_option,\n };\n}\n","import type { StreamChat } from './client';\nimport type {\n CreatePollData,\n DefaultGenerics,\n ExtendableGenerics,\n PollResponse,\n PollSort,\n QueryPollsFilters,\n QueryPollsOptions,\n} from './types';\nimport { Poll } from './poll';\nimport { FormatMessageResponse } from './types';\nimport { formatMessage } from './utils';\n\nexport class PollManager<SCG extends ExtendableGenerics = DefaultGenerics> {\n private client: StreamChat<SCG>;\n // The pollCache contains only polls that have been created and sent as messages\n // (i.e only polls that are coupled with a message, can be voted on and require a\n // reactive state). It shall work as a basic look-up table for our SDK to be able\n // to quickly consume poll state that will be reactive even without the polls being\n // rendered within the UI.\n private pollCache = new Map<string, Poll<SCG>>();\n private unsubscribeFunctions: Set<() => void> = new Set();\n\n constructor({ client }: { client: StreamChat<SCG> }) {\n this.client = client;\n }\n\n get data(): Map<string, Poll<SCG>> {\n return this.pollCache;\n }\n\n public fromState = (id: string) => {\n return this.pollCache.get(id);\n };\n\n public registerSubscriptions = () => {\n if (this.unsubscribeFunctions.size) {\n // Already listening for events and changes\n return;\n }\n\n this.unsubscribeFunctions.add(this.subscribeMessageNew());\n this.unsubscribeFunctions.add(this.subscribePollUpdated());\n this.unsubscribeFunctions.add(this.subscribePollClosed());\n this.unsubscribeFunctions.add(this.subscribeVoteCasted());\n this.unsubscribeFunctions.add(this.subscribeVoteChanged());\n this.unsubscribeFunctions.add(this.subscribeVoteRemoved());\n };\n\n public unregisterSubscriptions = () => {\n this.unsubscribeFunctions.forEach((cleanupFunction) => cleanupFunction());\n this.unsubscribeFunctions.clear();\n };\n\n public createPoll = async (poll: CreatePollData<SCG>) => {\n const { poll: createdPoll } = await this.client.createPoll(poll);\n\n return new Poll({ client: this.client, poll: createdPoll });\n };\n\n public getPoll = async (id: string) => {\n const cachedPoll = this.fromState(id);\n\n // optimistically return the cached poll if it exists and update in the background\n if (cachedPoll) {\n this.client.getPoll(id).then(({ poll }) => this.setOrOverwriteInCache(poll, true));\n return cachedPoll;\n }\n // fetch it, write to the cache and return otherwise\n const { poll } = await this.client.getPoll(id);\n\n this.setOrOverwriteInCache(poll);\n\n return this.fromState(id);\n };\n\n public queryPolls = async (filter: QueryPollsFilters, sort: PollSort = [], options: QueryPollsOptions = {}) => {\n const { polls, next } = await this.client.queryPolls(filter, sort, options);\n\n const pollInstances = polls.map((poll) => {\n this.setOrOverwriteInCache(poll, true);\n\n return this.fromState(poll.id);\n });\n\n return {\n polls: pollInstances,\n next,\n };\n };\n\n public hydratePollCache = (messages: FormatMessageResponse<SCG>[], overwriteState?: boolean) => {\n for (const message of messages) {\n if (!message.poll) {\n continue;\n }\n const pollResponse = message.poll as PollResponse<SCG>;\n this.setOrOverwriteInCache(pollResponse, overwriteState);\n }\n };\n\n private setOrOverwriteInCache = (pollResponse: PollResponse<SCG>, overwriteState?: boolean) => {\n if (!this.client._cacheEnabled()) {\n return;\n }\n const pollFromCache = this.fromState(pollResponse.id);\n if (!pollFromCache) {\n const poll = new Poll<SCG>({ client: this.client, poll: pollResponse });\n this.pollCache.set(poll.id, poll);\n } else if (overwriteState) {\n pollFromCache.reinitializeState(pollResponse);\n }\n };\n\n private subscribePollUpdated = () => {\n return this.client.on('poll.updated', (event) => {\n if (event.poll?.id) {\n this.fromState(event.poll.id)?.handlePollUpdated(event);\n }\n }).unsubscribe;\n };\n\n private subscribePollClosed = () => {\n return this.client.on('poll.closed', (event) => {\n if (event.poll?.id) {\n this.fromState(event.poll.id)?.handlePollClosed(event);\n }\n }).unsubscribe;\n };\n\n private subscribeVoteCasted = () => {\n return this.client.on('poll.vote_casted', (event) => {\n if (event.poll?.id) {\n this.fromState(event.poll.id)?.handleVoteCasted(event);\n }\n }).unsubscribe;\n };\n\n private subscribeVoteChanged = () => {\n return this.client.on('poll.vote_changed', (event) => {\n if (event.poll?.id) {\n this.fromState(event.poll.id)?.handleVoteChanged(event);\n }\n }).unsubscribe;\n };\n\n private subscribeVoteRemoved = () => {\n return this.client.on('poll.vote_removed', (event) => {\n if (event.poll?.id) {\n this.fromState(event.poll.id)?.handleVoteRemoved(event);\n }\n }).unsubscribe;\n };\n\n private subscribeMessageNew = () => {\n return this.client.on('message.new', (event) => {\n const { message } = event;\n if (message) {\n const formattedMessage = formatMessage(message);\n this.hydratePollCache([formattedMessage]);\n }\n }).unsubscribe;\n };\n}\n","/* eslint no-unused-vars: \"off\" */\n/* global process */\n\nimport axios, { AxiosError, AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';\nimport https from 'https';\nimport WebSocket from 'isomorphic-ws';\n\nimport { Channel } from './channel';\nimport { ClientState } from './client_state';\nimport { StableWSConnection } from './connection';\nimport { CheckSignature, DevToken, JWTUserToken } from './signing';\nimport { TokenManager } from './token_manager';\nimport { WSConnectionFallback } from './connection_fallback';\nimport { Campaign } from './campaign';\nimport { Segment } from './segment';\nimport { isErrorResponse, isWSFailure } from './errors';\nimport {\n addFileToFormData,\n axiosParamsSerializer,\n chatCodes,\n isFunction,\n isOnline,\n isOwnUserBaseProperty,\n messageSetPagination,\n normalizeQuerySort,\n randomId,\n retryInterval,\n sleep,\n} from './utils';\n\nimport {\n APIErrorResponse,\n APIResponse,\n AppSettings,\n AppSettingsAPIResponse,\n BannedUsersFilters,\n BannedUsersPaginationOptions,\n BannedUsersResponse,\n BannedUsersSort,\n BanUserOptions,\n BaseDeviceFields,\n BlockList,\n BlockListResponse,\n BlockUserAPIResponse,\n CampaignData,\n CampaignFilters,\n CampaignQueryOptions,\n CampaignResponse,\n CampaignSort,\n CastVoteAPIResponse,\n ChannelAPIResponse,\n ChannelData,\n ChannelFilters,\n ChannelMute,\n ChannelOptions,\n ChannelResponse,\n ChannelSort,\n ChannelStateOptions,\n CheckPushResponse,\n CheckSNSResponse,\n CheckSQSResponse,\n Configs,\n ConnectAPIResponse,\n CreateChannelOptions,\n CreateChannelResponse,\n CreateCommandOptions,\n CreateCommandResponse,\n CreateImportOptions,\n CreateImportResponse,\n CreateImportURLResponse,\n CreatePollAPIResponse,\n CreatePollData,\n CreatePollOptionAPIResponse,\n CustomPermissionOptions,\n DeactivateUsersOptions,\n DefaultGenerics,\n DeleteChannelsResponse,\n DeleteCommandResponse,\n DeleteUserOptions,\n Device,\n EndpointName,\n ErrorFromResponse,\n Event,\n EventHandler,\n ExportChannelOptions,\n ExportChannelRequest,\n ExportChannelResponse,\n ExportChannelStatusResponse,\n ExportUsersRequest,\n ExportUsersResponse,\n ExtendableGenerics,\n FlagMessageResponse,\n FlagReportsFilters,\n FlagReportsPaginationOptions,\n FlagReportsResponse,\n FlagsFilters,\n FlagsPaginationOptions,\n FlagsResponse,\n FlagUserResponse,\n GetBlockedUsersAPIResponse,\n GetCallTokenResponse,\n GetChannelTypeResponse,\n GetCommandResponse,\n GetImportResponse,\n GetMessageAPIResponse,\n GetMessageOptions,\n GetPollAPIResponse,\n GetPollOptionAPIResponse,\n GetRateLimitsResponse,\n GetThreadAPIResponse,\n GetThreadOptions,\n GetUnreadCountAPIResponse,\n GetUnreadCountBatchAPIResponse,\n ListChannelResponse,\n ListCommandsResponse,\n ListImportsPaginationOptions,\n ListImportsResponse,\n Logger,\n MarkChannelsReadOptions,\n Message,\n MessageFilters,\n MessageFlagsFilters,\n MessageFlagsPaginationOptions,\n MessageFlagsResponse,\n MessageResponse,\n Mute,\n MuteUserOptions,\n MuteUserResponse,\n OGAttachment,\n OwnUserResponse,\n PartialMessageUpdate,\n PartialPollUpdate,\n PartialThreadUpdate,\n PartialUserUpdate,\n PermissionAPIResponse,\n PermissionsAPIResponse,\n PollAnswersAPIResponse,\n PollData,\n PollOptionData,\n PollSort,\n PollVote,\n PollVoteData,\n PollVotesAPIResponse,\n PushPreference,\n PushProvider,\n PushProviderConfig,\n PushProviderID,\n PushProviderListResponse,\n PushProviderUpsertResponse,\n QueryChannelsAPIResponse,\n QueryMessageHistoryFilters,\n QueryMessageHistoryOptions,\n QueryMessageHistoryResponse,\n QueryMessageHistorySort,\n QueryPollsFilters,\n QueryPollsOptions,\n QueryPollsResponse,\n QueryReactionsAPIResponse,\n QueryReactionsOptions,\n QuerySegmentsOptions,\n QuerySegmentTargetsFilter,\n QueryThreadsAPIResponse,\n QueryThreadsOptions,\n QueryVotesFilters,\n QueryVotesOptions,\n ReactionFilters,\n ReactionResponse,\n ReactionSort,\n ReactivateUserOptions,\n ReactivateUsersOptions,\n ReservedMessageFields,\n ReviewFlagReportOptions,\n ReviewFlagReportResponse,\n SearchAPIResponse,\n SearchMessageSortBase,\n SearchOptions,\n SearchPayload,\n SegmentData,\n SegmentResponse,\n SegmentTargetsResponse,\n SegmentType,\n SendFileAPIResponse,\n SortParam,\n StreamChatOptions,\n SyncOptions,\n SyncResponse,\n TaskResponse,\n TaskStatus,\n TestPushDataInput,\n TestSNSDataInput,\n TestSQSDataInput,\n TokenOrProvider,\n TranslateResponse,\n UnBanUserOptions,\n UpdateChannelOptions,\n UpdateChannelResponse,\n UpdateCommandOptions,\n UpdateCommandResponse,\n UpdatedMessage,\n UpdateMessageAPIResponse,\n UpdateMessageOptions,\n UpdatePollAPIResponse,\n UpdatePollOptionAPIResponse,\n UpdateSegmentData,\n UpsertPushPreferencesResponse,\n UserCustomEvent,\n UserFilters,\n UserOptions,\n UserResponse,\n UserSort,\n VoteSort,\n} from './types';\nimport { InsightMetrics, postInsights } from './insights';\nimport { Thread } from './thread';\nimport { Moderation } from './moderation';\nimport { ThreadManager } from './thread_manager';\nimport { DEFAULT_QUERY_CHANNELS_MESSAGE_LIST_PAGE_SIZE } from './constants';\nimport { PollManager } from './poll_manager';\n\nfunction isString(x: unknown): x is string {\n return typeof x === 'string' || x instanceof String;\n}\n\nexport class StreamChat<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> {\n private static _instance?: unknown | StreamChat; // type is undefined|StreamChat, unknown is due to TS limitations with statics\n\n _user?: OwnUserResponse<StreamChatGenerics> | UserResponse<StreamChatGenerics>;\n activeChannels: {\n [key: string]: Channel<StreamChatGenerics>;\n };\n threads: ThreadManager<StreamChatGenerics>;\n polls: PollManager<StreamChatGenerics>;\n anonymous: boolean;\n persistUserOnConnectionFailure?: boolean;\n axiosInstance: AxiosInstance;\n baseURL?: string;\n browser: boolean;\n cleaningIntervalRef?: NodeJS.Timeout;\n clientID?: string;\n configs: Configs<StreamChatGenerics>;\n key: string;\n listeners: Record<string, Array<(event: Event<StreamChatGenerics>) => void>>;\n logger: Logger;\n /**\n * When network is recovered, we re-query the active channels on client. But in single query, you can recover\n * only 30 channels. So its not guaranteed that all the channels in activeChannels object have updated state.\n * Thus in UI sdks, state recovery is managed by components themselves, they don't rely on js client for this.\n *\n * `recoverStateOnReconnect` parameter can be used in such cases, to disable state recovery within js client.\n * When false, user/consumer of this client will need to make sure all the channels present on UI by\n * manually calling queryChannels endpoint.\n */\n recoverStateOnReconnect?: boolean;\n moderation: Moderation<StreamChatGenerics>;\n mutedChannels: ChannelMute<StreamChatGenerics>[];\n mutedUsers: Mute<StreamChatGenerics>[];\n node: boolean;\n options: StreamChatOptions;\n secret?: string;\n setUserPromise: ConnectAPIResponse<StreamChatGenerics> | null;\n state: ClientState<StreamChatGenerics>;\n tokenManager: TokenManager<StreamChatGenerics>;\n user?: OwnUserResponse<StreamChatGenerics> | UserResponse<StreamChatGenerics>;\n userAgent?: string;\n userID?: string;\n wsBaseURL?: string;\n wsConnection: StableWSConnection<StreamChatGenerics> | null;\n wsFallback?: WSConnectionFallback<StreamChatGenerics>;\n wsPromise: ConnectAPIResponse<StreamChatGenerics> | null;\n consecutiveFailures: number;\n insightMetrics: InsightMetrics;\n defaultWSTimeoutWithFallback: number;\n defaultWSTimeout: number;\n private nextRequestAbortController: AbortController | null = null;\n\n /**\n * Initialize a client\n *\n * **Only use constructor for advanced usages. It is strongly advised to use `StreamChat.getInstance()` instead of `new StreamChat()` to reduce integration issues due to multiple WebSocket connections**\n * @param {string} key - the api key\n * @param {string} [secret] - the api secret\n * @param {StreamChatOptions} [options] - additional options, here you can pass custom options to axios instance\n * @param {boolean} [options.browser] - enforce the client to be in browser mode\n * @param {boolean} [options.warmUp] - default to false, if true, client will open a connection as soon as possible to speed up following requests\n * @param {Logger} [options.Logger] - custom logger\n * @param {number} [options.timeout] - default to 3000\n * @param {httpsAgent} [options.httpsAgent] - custom httpsAgent, in node it's default to https.agent()\n * @example <caption>initialize the client in user mode</caption>\n * new StreamChat('api_key')\n * @example <caption>initialize the client in user mode with options</caption>\n * new StreamChat('api_key', { warmUp:true, timeout:5000 })\n * @example <caption>secret is optional and only used in server side mode</caption>\n * new StreamChat('api_key', \"secret\", { httpsAgent: customAgent })\n */\n constructor(key: string, options?: StreamChatOptions);\n constructor(key: string, secret?: string, options?: StreamChatOptions);\n constructor(key: string, secretOrOptions?: StreamChatOptions | string, options?: StreamChatOptions) {\n // set the key\n this.key = key;\n this.listeners = {};\n this.state = new ClientState<StreamChatGenerics>({ client: this });\n // a list of channels to hide ws events from\n this.mutedChannels = [];\n this.mutedUsers = [];\n\n this.moderation = new Moderation(this);\n\n // set the secret\n if (secretOrOptions && isString(secretOrOptions)) {\n this.secret = secretOrOptions;\n }\n\n // set the options... and figure out defaults...\n const inputOptions = options ? options : secretOrOptions && !isString(secretOrOptions) ? secretOrOptions : {};\n\n this.browser = typeof inputOptions.browser !== 'undefined' ? inputOptions.browser : typeof window !== 'undefined';\n this.node = !this.browser;\n\n this.options = {\n timeout: 3000,\n withCredentials: false, // making sure cookies are not sent\n warmUp: false,\n recoverStateOnReconnect: true,\n disableCache: false,\n ...inputOptions,\n };\n\n if (this.node && !this.options.httpsAgent) {\n this.options.httpsAgent = new https.Agent({\n keepAlive: true,\n keepAliveMsecs: 3000,\n });\n }\n\n this.axiosInstance = axios.create(this.options);\n\n this.setBaseURL(this.options.baseURL || 'https://chat.stream-io-api.com');\n\n if (typeof process !== 'undefined' && 'env' in process && process.env.STREAM_LOCAL_TEST_RUN) {\n this.setBaseURL('http://localhost:3030');\n }\n\n if (typeof process !== 'undefined' && 'env' in process && process.env.STREAM_LOCAL_TEST_HOST) {\n this.setBaseURL('http://' + process.env.STREAM_LOCAL_TEST_HOST);\n }\n\n // WS connection is initialized when setUser is called\n this.wsConnection = null;\n this.wsPromise = null;\n this.setUserPromise = null;\n // keeps a reference to all the channels that are in use\n this.activeChannels = {};\n\n // mapping between channel groups and configs\n this.configs = {};\n this.anonymous = false;\n this.persistUserOnConnectionFailure = this.options?.persistUserOnConnectionFailure;\n\n // If its a server-side client, then lets initialize the tokenManager, since token will be\n // generated from secret.\n this.tokenManager = new TokenManager(this.secret);\n this.consecutiveFailures = 0;\n this.insightMetrics = new InsightMetrics();\n\n this.defaultWSTimeoutWithFallback = 6 * 1000;\n this.defaultWSTimeout = 15 * 1000;\n\n this.axiosInstance.defaults.paramsSerializer = axiosParamsSerializer;\n\n /**\n * logger function should accept 3 parameters:\n * @param logLevel string\n * @param message string\n * @param extraData object\n *\n * e.g.,\n * const client = new StreamChat('api_key', {}, {\n * \t\tlogger = (logLevel, message, extraData) => {\n * \t\t\tconsole.log(message);\n * \t\t}\n * })\n *\n * extraData contains tags array attached to log message. Tags can have one/many of following values:\n * 1. api\n * 2. api_request\n * 3. api_response\n * 4. client\n * 5. channel\n * 6. connection\n * 7. event\n *\n * It may also contains some extra data, some examples have been mentioned below:\n * 1. {\n * \t\ttags: ['api', 'api_request', 'client'],\n * \t\turl: string,\n * \t\tpayload: object,\n * \t\tconfig: object\n * }\n * 2. {\n * \t\ttags: ['api', 'api_response', 'client'],\n * \t\turl: string,\n * \t\tresponse: object\n * }\n * 3. {\n * \t\ttags: ['api', 'api_response', 'client'],\n * \t\turl: string,\n * \t\terror: object\n * }\n * 4. {\n * \t\ttags: ['event', 'client'],\n * \t\tevent: object\n * }\n * 5. {\n * \t\ttags: ['channel'],\n * \t\tchannel: object\n * }\n */\n this.logger = isFunction(inputOptions.logger) ? inputOptions.logger : () => null;\n this.recoverStateOnReconnect = this.options.recoverStateOnReconnect;\n this.threads = new ThreadManager({ client: this });\n this.polls = new PollManager({ client: this });\n }\n\n /**\n * Get a client instance\n *\n * This function always returns the same Client instance to avoid issues raised by multiple Client and WS connections\n *\n * **After the first call, the client configuration will not change if the key or options parameters change**\n *\n * @param {string} key - the api key\n * @param {string} [secret] - the api secret\n * @param {StreamChatOptions} [options] - additional options, here you can pass custom options to axios instance\n * @param {boolean} [options.browser] - enforce the client to be in browser mode\n * @param {boolean} [options.warmUp] - default to false, if true, client will open a connection as soon as possible to speed up following requests\n * @param {Logger} [options.Logger] - custom logger\n * @param {number} [options.timeout] - default to 3000\n * @param {httpsAgent} [options.httpsAgent] - custom httpsAgent, in node it's default to https.agent()\n * @example <caption>initialize the client in user mode</caption>\n * StreamChat.getInstance('api_key')\n * @example <caption>initialize the client in user mode with options</caption>\n * StreamChat.getInstance('api_key', { timeout:5000 })\n * @example <caption>secret is optional and only used in server side mode</caption>\n * StreamChat.getInstance('api_key', \"secret\", { httpsAgent: customAgent })\n */\n public static getInstance<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics>(\n key: string,\n options?: StreamChatOptions,\n ): StreamChat<StreamChatGenerics>;\n public static getInstance<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics>(\n key: string,\n secret?: string,\n options?: StreamChatOptions,\n ): StreamChat<StreamChatGenerics>;\n public static getInstance<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics>(\n key: string,\n secretOrOptions?: StreamChatOptions | string,\n options?: StreamChatOptions,\n ): StreamChat<StreamChatGenerics> {\n if (!StreamChat._instance) {\n if (typeof secretOrOptions === 'string') {\n StreamChat._instance = new StreamChat<StreamChatGenerics>(key, secretOrOptions, options);\n } else {\n StreamChat._instance = new StreamChat<StreamChatGenerics>(key, secretOrOptions);\n }\n }\n\n return StreamChat._instance as StreamChat<StreamChatGenerics>;\n }\n\n devToken(userID: string) {\n return DevToken(userID);\n }\n\n getAuthType() {\n return this.anonymous ? 'anonymous' : 'jwt';\n }\n\n setBaseURL(baseURL: string) {\n this.baseURL = baseURL;\n this.wsBaseURL = this.baseURL.replace('http', 'ws').replace(':3030', ':8800');\n }\n\n _getConnectionID = () => this.wsConnection?.connectionID || this.wsFallback?.connectionID;\n\n _hasConnectionID = () => Boolean(this._getConnectionID());\n\n /**\n * connectUser - Set the current user and open a WebSocket connection\n *\n * @param {OwnUserResponse<StreamChatGenerics> | UserResponse<StreamChatGenerics>} user Data about this user. IE {name: \"john\"}\n * @param {TokenOrProvider} userTokenOrProvider Token or provider\n *\n * @return {ConnectAPIResponse<StreamChatGenerics>} Returns a promise that resolves when the connection is setup\n */\n connectUser = async (\n user: OwnUserResponse<StreamChatGenerics> | UserResponse<StreamChatGenerics>,\n userTokenOrProvider: TokenOrProvider,\n ) => {\n if (!user.id) {\n throw new Error('The \"id\" field on the user is missing');\n }\n\n /**\n * Calling connectUser multiple times is potentially the result of a bad integration, however,\n * If the user id remains the same we don't throw error\n */\n if (this.userID === user.id && this.setUserPromise) {\n console.warn(\n 'Consecutive calls to connectUser is detected, ideally you should only call this function once in your app.',\n );\n return this.setUserPromise;\n }\n\n if (this.userID) {\n throw new Error(\n 'Use client.disconnect() before trying to connect as a different user. connectUser was called twice.',\n );\n }\n\n if ((this._isUsingServerAuth() || this.node) && !this.options.allowServerSideConnect) {\n console.warn(\n 'Please do not use connectUser server side. connectUser impacts MAU and concurrent connection usage and thus your bill. If you have a valid use-case, add \"allowServerSideConnect: true\" to the client options to disable this warning.',\n );\n }\n\n // we generate the client id client side\n this.userID = user.id;\n this.anonymous = false;\n\n const setTokenPromise = this._setToken(user, userTokenOrProvider);\n this._setUser(user);\n\n const wsPromise = this.openConnection();\n\n this.setUserPromise = Promise.all([setTokenPromise, wsPromise]).then(\n (result) => result[1], // We only return connection promise;\n );\n\n try {\n return await this.setUserPromise;\n } catch (err) {\n if (this.persistUserOnConnectionFailure) {\n // cleanup client to allow the user to retry connectUser again\n this.closeConnection();\n } else {\n this.disconnectUser();\n }\n throw err;\n }\n };\n\n /**\n * @deprecated Please use connectUser() function instead. Its naming is more consistent with its functionality.\n *\n * setUser - Set the current user and open a WebSocket connection\n *\n * @param {OwnUserResponse<StreamChatGenerics> | UserResponse<StreamChatGenerics>} user Data about this user. IE {name: \"john\"}\n * @param {TokenOrProvider} userTokenOrProvider Token or provider\n *\n * @return {ConnectAPIResponse<StreamChatGenerics>} Returns a promise that resolves when the connection is setup\n */\n setUser = this.connectUser;\n\n _setToken = (user: UserResponse<StreamChatGenerics>, userTokenOrProvider: TokenOrProvider) =>\n this.tokenManager.setTokenOrProvider(userTokenOrProvider, user);\n\n _setUser(user: OwnUserResponse<StreamChatGenerics> | UserResponse<StreamChatGenerics>) {\n /**\n * This one is used by the frontend. This is a copy of the current user object stored on backend.\n * It contains reserved properties and own user properties which are not present in `this._user`.\n */\n this.user = user;\n this.userID = user.id;\n // this one is actually used for requests. This is a copy of current user provided to `connectUser` function.\n this._user = { ...user };\n }\n\n /**\n * Disconnects the websocket connection, without removing the user set on client.\n * client.closeConnection will not trigger default auto-retry mechanism for reconnection. You need\n * to call client.openConnection to reconnect to websocket.\n *\n * This is mainly useful on mobile side. You can only receive push notifications\n * if you don't have active websocket connection.\n * So when your app goes to background, you can call `client.closeConnection`.\n * And when app comes back to foreground, call `client.openConnection`.\n *\n * @param timeout Max number of ms, to wait for close event of websocket, before forcefully assuming succesful disconnection.\n * https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent\n */\n closeConnection = async (timeout?: number) => {\n if (this.cleaningIntervalRef != null) {\n clearInterval(this.cleaningIntervalRef);\n this.cleaningIntervalRef = undefined;\n }\n\n await Promise.all([this.wsConnection?.disconnect(timeout), this.wsFallback?.disconnect(timeout)]);\n return Promise.resolve();\n };\n\n /**\n * Creates a new WebSocket connection with the current user. Returns empty promise, if there is an active connection\n */\n openConnection = async () => {\n if (!this.userID) {\n throw Error('User is not set on client, use client.connectUser or client.connectAnonymousUser instead');\n }\n\n if (this.wsConnection?.isConnecting && this.wsPromise) {\n this.logger('info', 'client:openConnection() - connection already in progress', {\n tags: ['connection', 'client'],\n });\n return this.wsPromise;\n }\n\n if ((this.wsConnection?.isHealthy || this.wsFallback?.isHealthy()) && this._hasConnectionID()) {\n this.logger('info', 'client:openConnection() - openConnection called twice, healthy connection already exists', {\n tags: ['connection', 'client'],\n });\n\n return;\n }\n\n this.clientID = `${this.userID}--${randomId()}`;\n this.wsPromise = this.connect();\n this._startCleaning();\n return this.wsPromise;\n };\n\n /**\n * @deprecated Please use client.openConnction instead.\n * @private\n *\n * Creates a new websocket connection with current user.\n */\n _setupConnection = this.openConnection;\n\n /**\n * updateAppSettings - updates application settings\n *\n * @param {AppSettings} options App settings.\n * IE: {\n 'apn_config': {\n 'auth_type': 'token',\n 'auth_key\": fs.readFileSync(\n './apn-push-auth-key.p8',\n 'utf-8',\n ),\n 'key_id': 'keyid',\n 'team_id': 'teamid',\n 'notification_template\": 'notification handlebars template',\n 'bundle_id': 'com.apple.your.app',\n 'development': true\n },\n 'firebase_config': {\n 'server_key': 'server key from fcm',\n 'notification_template': 'notification handlebars template',\n 'data_template': 'data handlebars template',\n 'apn_template': 'apn notification handlebars template under v2'\n },\n 'webhook_url': 'https://acme.com/my/awesome/webhook/'\n }\n */\n async updateAppSettings(options: AppSettings) {\n const apn_config = options.apn_config;\n if (apn_config?.p12_cert) {\n options = {\n ...options,\n apn_config: {\n ...apn_config,\n p12_cert: Buffer.from(apn_config.p12_cert).toString('base64'),\n },\n };\n }\n return await this.patch<APIResponse>(this.baseURL + '/app', options);\n }\n\n _normalizeDate = (before: Date | string | null): string | null => {\n if (before instanceof Date) {\n before = before.toISOString();\n }\n\n if (before === '') {\n throw new Error(\"Don't pass blank string for since, use null instead if resetting the token revoke\");\n }\n\n return before;\n };\n\n /**\n * Revokes all tokens on application level issued before given time\n */\n async revokeTokens(before: Date | string | null) {\n return await this.updateAppSettings({\n revoke_tokens_issued_before: this._normalizeDate(before),\n });\n }\n\n /**\n * Revokes token for a user issued before given time\n */\n async revokeUserToken(userID: string, before?: Date | string | null) {\n return await this.revokeUsersToken([userID], before);\n }\n\n /**\n * Revokes tokens for a list of users issued before given time\n */\n async revokeUsersToken(userIDs: string[], before?: Date | string | null) {\n if (before === undefined) {\n before = new Date().toISOString();\n } else {\n before = this._normalizeDate(before);\n }\n\n const users: PartialUserUpdate<StreamChatGenerics>[] = [];\n for (const userID of userIDs) {\n users.push({\n id: userID,\n set: <Partial<UserResponse<StreamChatGenerics>>>{\n revoke_tokens_issued_before: before,\n },\n });\n }\n\n return await this.partialUpdateUsers(users);\n }\n\n /**\n * getAppSettings - retrieves application settings\n */\n async getAppSettings() {\n return await this.get<AppSettingsAPIResponse<StreamChatGenerics>>(this.baseURL + '/app');\n }\n\n /**\n * testPushSettings - Tests the push settings for a user with a random chat message and the configured push templates\n *\n * @param {string} userID User ID. If user has no devices, it will error\n * @param {TestPushDataInput} [data] Overrides for push templates/message used\n * IE: {\n messageID: 'id-of-message', // will error if message does not exist\n apnTemplate: '{}', // if app doesn't have apn configured it will error\n firebaseTemplate: '{}', // if app doesn't have firebase configured it will error\n firebaseDataTemplate: '{}', // if app doesn't have firebase configured it will error\n skipDevices: true, // skip config/device checks and sending to real devices\n pushProviderName: 'staging' // one of your configured push providers\n pushProviderType: 'apn' // one of supported provider types\n }\n */\n async testPushSettings(userID: string, data: TestPushDataInput = {}) {\n return await this.post<CheckPushResponse>(this.baseURL + '/check_push', {\n user_id: userID,\n ...(data.messageID ? { message_id: data.messageID } : {}),\n ...(data.apnTemplate ? { apn_template: data.apnTemplate } : {}),\n ...(data.firebaseTemplate ? { firebase_template: data.firebaseTemplate } : {}),\n ...(data.firebaseDataTemplate ? { firebase_data_template: data.firebaseDataTemplate } : {}),\n ...(data.skipDevices ? { skip_devices: true } : {}),\n ...(data.pushProviderName ? { push_provider_name: data.pushProviderName } : {}),\n ...(data.pushProviderType ? { push_provider_type: data.pushProviderType } : {}),\n });\n }\n\n /**\n * testSQSSettings - Tests that the given or configured SQS configuration is valid\n *\n * @param {TestSQSDataInput} [data] Overrides SQS settings for testing if needed\n * IE: {\n sqs_key: 'auth_key',\n sqs_secret: 'auth_secret',\n sqs_url: 'url_to_queue',\n }\n */\n async testSQSSettings(data: TestSQSDataInput = {}) {\n return await this.post<CheckSQSResponse>(this.baseURL + '/check_sqs', data);\n }\n\n /**\n * testSNSSettings - Tests that the given or configured SNS configuration is valid\n *\n * @param {TestSNSDataInput} [data] Overrides SNS settings for testing if needed\n * IE: {\n sns_key: 'auth_key',\n sns_secret: 'auth_secret',\n sns_topic_arn: 'topic_to_publish_to',\n }\n */\n async testSNSSettings(data: TestSNSDataInput = {}) {\n return await this.post<CheckSNSResponse>(this.baseURL + '/check_sns', data);\n }\n\n /**\n * Disconnects the websocket and removes the user from client.\n *\n * @param timeout Max number of ms, to wait for close event of websocket, before forcefully assuming successful disconnection.\n * https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent\n */\n disconnectUser = async (timeout?: number) => {\n this.logger('info', 'client:disconnect() - Disconnecting the client', {\n tags: ['connection', 'client'],\n });\n\n // remove the user specific fields\n delete this.user;\n delete this._user;\n delete this.userID;\n\n this.anonymous = false;\n\n const closePromise = this.closeConnection(timeout);\n\n for (const channel of Object.values(this.activeChannels)) {\n channel._disconnect();\n }\n // ensure we no longer return inactive channels\n this.activeChannels = {};\n // reset client state\n this.state = new ClientState({ client: this });\n // reset thread manager\n this.threads.resetState();\n // reset token manager\n setTimeout(this.tokenManager.reset); // delay reseting to use token for disconnect calls\n\n // close the WS connection\n return closePromise;\n };\n\n /**\n *\n * @deprecated Please use client.disconnectUser instead.\n *\n * Disconnects the websocket and removes the user from client.\n */\n disconnect = this.disconnectUser;\n\n /**\n * connectAnonymousUser - Set an anonymous user and open a WebSocket connection\n */\n connectAnonymousUser = () => {\n if ((this._isUsingServerAuth() || this.node) && !this.options.allowServerSideConnect) {\n console.warn(\n 'Please do not use connectUser server side. connectUser impacts MAU and concurrent connection usage and thus your bill. If you have a valid use-case, add \"allowServerSideConnect: true\" to the client options to disable this warning.',\n );\n }\n\n this.anonymous = true;\n this.userID = randomId();\n const anonymousUser = {\n id: this.userID,\n anon: true,\n } as UserResponse<StreamChatGenerics>;\n\n this._setToken(anonymousUser, '');\n this._setUser(anonymousUser);\n\n return this._setupConnection();\n };\n\n /**\n * @deprecated Please use connectAnonymousUser. Its naming is more consistent with its functionality.\n */\n setAnonymousUser = this.connectAnonymousUser;\n\n /**\n * setGuestUser - Setup a temporary guest user\n *\n * @param {UserResponse<StreamChatGenerics>} user Data about this user. IE {name: \"john\"}\n *\n * @return {ConnectAPIResponse<StreamChatGenerics>} Returns a promise that resolves when the connection is setup\n */\n async setGuestUser(user: UserResponse<StreamChatGenerics>) {\n let response: { access_token: string; user: UserResponse<StreamChatGenerics> } | undefined;\n this.anonymous = true;\n try {\n response = await this.post<\n APIResponse & {\n access_token: string;\n user: UserResponse<StreamChatGenerics>;\n }\n >(this.baseURL + '/guest', { user });\n } catch (e) {\n this.anonymous = false;\n throw e;\n }\n this.anonymous = false;\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { created_at, updated_at, last_active, online, ...guestUser } = response.user;\n return await this.connectUser(guestUser as UserResponse<StreamChatGenerics>, response.access_token);\n }\n\n /**\n * createToken - Creates a token to authenticate this user. This function is used server side.\n * The resulting token should be passed to the client side when the users registers or logs in.\n *\n * @param {string} userID The User ID\n * @param {number} [exp] The expiration time for the token expressed in the number of seconds since the epoch\n *\n * @return {string} Returns a token\n */\n createToken(userID: string, exp?: number, iat?: number) {\n if (this.secret == null) {\n throw Error(`tokens can only be created server-side using the API Secret`);\n }\n const extra: { exp?: number; iat?: number } = {};\n\n if (exp) {\n extra.exp = exp;\n }\n\n if (iat) {\n extra.iat = iat;\n }\n\n return JWTUserToken(this.secret, userID, extra, {});\n }\n\n /**\n * on - Listen to events on all channels and users your watching\n *\n * client.on('message.new', event => {console.log(\"my new message\", event, channel.state.messages)})\n * or\n * client.on(event => {console.log(event.type)})\n *\n * @param {EventHandler<StreamChatGenerics> | string} callbackOrString The event type to listen for (optional)\n * @param {EventHandler<StreamChatGenerics>} [callbackOrNothing] The callback to call\n *\n * @return {{ unsubscribe: () => void }} Description\n */\n on(callback: EventHandler<StreamChatGenerics>): { unsubscribe: () => void };\n on(eventType: string, callback: EventHandler<StreamChatGenerics>): { unsubscribe: () => void };\n on(\n callbackOrString: EventHandler<StreamChatGenerics> | string,\n callbackOrNothing?: EventHandler<StreamChatGenerics>,\n ): { unsubscribe: () => void } {\n const key = callbackOrNothing ? (callbackOrString as string) : 'all';\n const callback = callbackOrNothing ? callbackOrNothing : (callbackOrString as EventHandler<StreamChatGenerics>);\n if (!(key in this.listeners)) {\n this.listeners[key] = [];\n }\n this.logger('info', `Attaching listener for ${key} event`, {\n tags: ['event', 'client'],\n });\n this.listeners[key].push(callback);\n return {\n unsubscribe: () => {\n this.logger('info', `Removing listener for ${key} event`, {\n tags: ['event', 'client'],\n });\n this.listeners[key] = this.listeners[key].filter((el) => el !== callback);\n },\n };\n }\n\n /**\n * off - Remove the event handler\n *\n */\n off(callback: EventHandler<StreamChatGenerics>): void;\n off(eventType: string, callback: EventHandler<StreamChatGenerics>): void;\n off(\n callbackOrString: EventHandler<StreamChatGenerics> | string,\n callbackOrNothing?: EventHandler<StreamChatGenerics>,\n ) {\n const key = callbackOrNothing ? (callbackOrString as string) : 'all';\n const callback = callbackOrNothing ? callbackOrNothing : (callbackOrString as EventHandler<StreamChatGenerics>);\n if (!(key in this.listeners)) {\n this.listeners[key] = [];\n }\n\n this.logger('info', `Removing listener for ${key} event`, {\n tags: ['event', 'client'],\n });\n this.listeners[key] = this.listeners[key].filter((value) => value !== callback);\n }\n\n _logApiRequest(\n type: string,\n url: string,\n data: unknown,\n config: AxiosRequestConfig & {\n config?: AxiosRequestConfig & { maxBodyLength?: number };\n },\n ) {\n this.logger('info', `client: ${type} - Request - ${url}`, {\n tags: ['api', 'api_request', 'client'],\n url,\n payload: data,\n config,\n });\n }\n\n _logApiResponse<T>(type: string, url: string, response: AxiosResponse<T>) {\n this.logger('info', `client:${type} - Response - url: ${url} > status ${response.status}`, {\n tags: ['api', 'api_response', 'client'],\n url,\n response,\n });\n }\n\n _logApiError(type: string, url: string, error: unknown) {\n this.logger('error', `client:${type} - Error - url: ${url}`, {\n tags: ['api', 'api_response', 'client'],\n url,\n error,\n });\n }\n\n doAxiosRequest = async <T>(\n type: string,\n url: string,\n data?: unknown,\n options: AxiosRequestConfig & {\n config?: AxiosRequestConfig & { maxBodyLength?: number };\n } = {},\n ): Promise<T> => {\n await this.tokenManager.tokenReady();\n const requestConfig = this._enrichAxiosOptions(options);\n try {\n let response: AxiosResponse<T>;\n this._logApiRequest(type, url, data, requestConfig);\n switch (type) {\n case 'get':\n response = await this.axiosInstance.get(url, requestConfig);\n break;\n case 'delete':\n response = await this.axiosInstance.delete(url, requestConfig);\n break;\n case 'post':\n response = await this.axiosInstance.post(url, data, requestConfig);\n break;\n case 'postForm':\n response = await this.axiosInstance.postForm(url, data, requestConfig);\n break;\n case 'put':\n response = await this.axiosInstance.put(url, data, requestConfig);\n break;\n case 'patch':\n response = await this.axiosInstance.patch(url, data, requestConfig);\n break;\n case 'options':\n response = await this.axiosInstance.options(url, requestConfig);\n break;\n default:\n throw new Error('Invalid request type');\n }\n this._logApiResponse<T>(type, url, response);\n this.consecutiveFailures = 0;\n return this.handleResponse(response);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (e: any /**TODO: generalize error types */) {\n e.client_request_id = requestConfig.headers?.['x-client-request-id'];\n this._logApiError(type, url, e);\n this.consecutiveFailures += 1;\n if (e.response) {\n /** connection_fallback depends on this token expiration logic */\n if (e.response.data.code === chatCodes.TOKEN_EXPIRED && !this.tokenManager.isStatic()) {\n if (this.consecutiveFailures > 1) {\n await sleep(retryInterval(this.consecutiveFailures));\n }\n this.tokenManager.loadToken();\n return await this.doAxiosRequest<T>(type, url, data, options);\n }\n return this.handleResponse(e.response);\n } else {\n throw e as AxiosError<APIErrorResponse>;\n }\n }\n };\n\n get<T>(url: string, params?: AxiosRequestConfig['params']) {\n return this.doAxiosRequest<T>('get', url, null, { params });\n }\n\n put<T>(url: string, data?: unknown) {\n return this.doAxiosRequest<T>('put', url, data);\n }\n\n post<T>(url: string, data?: unknown) {\n return this.doAxiosRequest<T>('post', url, data);\n }\n\n patch<T>(url: string, data?: unknown) {\n return this.doAxiosRequest<T>('patch', url, data);\n }\n\n delete<T>(url: string, params?: AxiosRequestConfig['params']) {\n return this.doAxiosRequest<T>('delete', url, null, { params });\n }\n\n sendFile(\n url: string,\n uri: string | NodeJS.ReadableStream | Buffer | File,\n name?: string,\n contentType?: string,\n user?: UserResponse<StreamChatGenerics>,\n ) {\n const data = addFileToFormData(uri, name, contentType || 'multipart/form-data');\n if (user != null) data.append('user', JSON.stringify(user));\n\n return this.doAxiosRequest<SendFileAPIResponse>('postForm', url, data, {\n headers: data.getHeaders ? data.getHeaders() : {}, // node vs browser\n config: {\n timeout: 0,\n maxContentLength: Infinity,\n maxBodyLength: Infinity,\n },\n });\n }\n\n errorFromResponse(response: AxiosResponse<APIErrorResponse>): ErrorFromResponse<APIErrorResponse> {\n let err: ErrorFromResponse<APIErrorResponse>;\n err = new ErrorFromResponse(`StreamChat error HTTP code: ${response.status}`);\n if (response.data && response.data.code) {\n err = new Error(`StreamChat error code ${response.data.code}: ${response.data.message}`);\n err.code = response.data.code;\n }\n err.response = response;\n err.status = response.status;\n return err;\n }\n\n handleResponse<T>(response: AxiosResponse<T>) {\n const data = response.data;\n if (isErrorResponse(response)) {\n throw this.errorFromResponse(response);\n }\n return data;\n }\n\n dispatchEvent = (event: Event<StreamChatGenerics>) => {\n if (!event.received_at) event.received_at = new Date();\n\n // client event handlers\n const postListenerCallbacks = this._handleClientEvent(event);\n\n // channel event handlers\n const cid = event.cid;\n const channel = cid ? this.activeChannels[cid] : undefined;\n if (channel) {\n channel._handleChannelEvent(event);\n }\n\n this._callClientListeners(event);\n\n if (channel) {\n channel._callChannelListeners(event);\n }\n\n postListenerCallbacks.forEach((c) => c());\n };\n\n handleEvent = (messageEvent: WebSocket.MessageEvent) => {\n // dispatch the event to the channel listeners\n const jsonString = messageEvent.data as string;\n const event = JSON.parse(jsonString) as Event<StreamChatGenerics>;\n this.dispatchEvent(event);\n };\n\n /**\n * Updates the members, watchers and read references of the currently active channels that contain this user\n *\n * @param {UserResponse<StreamChatGenerics>} user\n */\n _updateMemberWatcherReferences = (user: UserResponse<StreamChatGenerics>) => {\n const refMap = this.state.userChannelReferences[user.id] || {};\n for (const channelID in refMap) {\n const channel = this.activeChannels[channelID];\n if (channel?.state) {\n if (channel.state.members[user.id]) {\n channel.state.members[user.id].user = user;\n }\n if (channel.state.watchers[user.id]) {\n channel.state.watchers[user.id] = user;\n }\n if (channel.state.read[user.id]) {\n channel.state.read[user.id].user = user;\n }\n }\n }\n };\n\n /**\n * @deprecated Please _updateMemberWatcherReferences instead.\n * @private\n */\n _updateUserReferences = this._updateMemberWatcherReferences;\n\n /**\n * @private\n *\n * Updates the messages from the currently active channels that contain this user,\n * with updated user object.\n *\n * @param {UserResponse<StreamChatGenerics>} user\n */\n _updateUserMessageReferences = (user: UserResponse<StreamChatGenerics>) => {\n const refMap = this.state.userChannelReferences[user.id] || {};\n\n for (const channelID in refMap) {\n const channel = this.activeChannels[channelID];\n\n if (!channel) continue;\n\n const state = channel.state;\n\n /** update the messages from this user. */\n state?.updateUserMessages(user);\n }\n };\n\n /**\n * @private\n *\n * Deletes the messages from the currently active channels that contain this user\n *\n * If hardDelete is true, all the content of message will be stripped down.\n * Otherwise, only 'message.type' will be set as 'deleted'.\n *\n * @param {UserResponse<StreamChatGenerics>} user\n * @param {boolean} hardDelete\n */\n _deleteUserMessageReference = (user: UserResponse<StreamChatGenerics>, hardDelete = false) => {\n const refMap = this.state.userChannelReferences[user.id] || {};\n\n for (const channelID in refMap) {\n const channel = this.activeChannels[channelID];\n if (channel) {\n const state = channel.state;\n\n /** deleted the messages from this user. */\n state?.deleteUserMessages(user, hardDelete);\n }\n }\n };\n\n /**\n * @private\n *\n * Handle following user related events:\n * - user.presence.changed\n * - user.updated\n * - user.deleted\n *\n * @param {Event} event\n */\n _handleUserEvent = (event: Event<StreamChatGenerics>) => {\n if (!event.user) {\n return;\n }\n\n /** update the client.state with any changes to users */\n if (event.type === 'user.presence.changed' || event.type === 'user.updated') {\n if (event.user.id === this.userID) {\n const user = { ...(this.user || {}) };\n const _user = { ...(this._user || {}) };\n\n // Remove deleted properties from user objects.\n for (const key in this.user) {\n if (key in event.user || isOwnUserBaseProperty(key)) {\n continue;\n }\n\n delete user[key];\n delete _user[key];\n }\n\n /** Updating only available properties in _user object. */\n for (const key in event.user) {\n if (_user && key in _user) {\n _user[key] = event.user[key];\n }\n }\n\n // @ts-expect-error\n this._user = { ..._user };\n this.user = { ...user, ...event.user };\n }\n\n this.state.updateUser(event.user);\n this._updateMemberWatcherReferences(event.user);\n }\n\n if (event.type === 'user.updated') {\n this._updateUserMessageReferences(event.user);\n }\n\n if (event.type === 'user.deleted' && event.user.deleted_at && (event.mark_messages_deleted || event.hard_delete)) {\n this._deleteUserMessageReference(event.user, event.hard_delete);\n }\n };\n\n _handleClientEvent(event: Event<StreamChatGenerics>) {\n const client = this;\n const postListenerCallbacks = [];\n this.logger('info', `client:_handleClientEvent - Received event of type { ${event.type} }`, {\n tags: ['event', 'client'],\n event,\n });\n\n if (event.type === 'user.presence.changed' || event.type === 'user.updated' || event.type === 'user.deleted') {\n this._handleUserEvent(event);\n }\n\n if (event.type === 'health.check' && event.me) {\n client.user = event.me;\n client.state.updateUser(event.me);\n client.mutedChannels = event.me.channel_mutes;\n client.mutedUsers = event.me.mutes;\n }\n\n if (event.channel && event.type === 'notification.message_new') {\n this._addChannelConfig(event.channel);\n }\n\n if (event.type === 'notification.channel_mutes_updated' && event.me?.channel_mutes) {\n this.mutedChannels = event.me.channel_mutes;\n }\n\n if (event.type === 'notification.mutes_updated' && event.me?.mutes) {\n this.mutedUsers = event.me.mutes;\n }\n\n if (event.type === 'notification.mark_read' && event.unread_channels === 0) {\n const activeChannelKeys = Object.keys(this.activeChannels);\n activeChannelKeys.forEach((activeChannelKey) => (this.activeChannels[activeChannelKey].state.unreadCount = 0));\n }\n\n if ((event.type === 'channel.deleted' || event.type === 'notification.channel_deleted') && event.cid) {\n client.state.deleteAllChannelReference(event.cid);\n this.activeChannels[event.cid]?._disconnect();\n\n postListenerCallbacks.push(() => {\n if (!event.cid) return;\n\n delete this.activeChannels[event.cid];\n });\n }\n\n return postListenerCallbacks;\n }\n\n _muteStatus(cid: string) {\n let muteStatus;\n for (let i = 0; i < this.mutedChannels.length; i++) {\n const mute = this.mutedChannels[i];\n if (mute.channel?.cid === cid) {\n muteStatus = {\n muted: mute.expires ? new Date(mute.expires).getTime() > new Date().getTime() : true,\n createdAt: mute.created_at ? new Date(mute.created_at) : new Date(),\n expiresAt: mute.expires ? new Date(mute.expires) : null,\n };\n break;\n }\n }\n\n if (muteStatus) {\n return muteStatus;\n }\n\n return {\n muted: false,\n createdAt: null,\n expiresAt: null,\n };\n }\n\n _callClientListeners = (event: Event<StreamChatGenerics>) => {\n const client = this;\n // gather and call the listeners\n const listeners: Array<(event: Event<StreamChatGenerics>) => void> = [];\n if (client.listeners.all) {\n listeners.push(...client.listeners.all);\n }\n if (client.listeners[event.type]) {\n listeners.push(...client.listeners[event.type]);\n }\n\n // call the event and send it to the listeners\n for (const listener of listeners) {\n listener(event);\n }\n };\n\n recoverState = async () => {\n this.logger('info', `client:recoverState() - Start of recoverState with connectionID ${this._getConnectionID()}`, {\n tags: ['connection'],\n });\n\n const cids = Object.keys(this.activeChannels);\n if (cids.length && this.recoverStateOnReconnect) {\n this.logger('info', `client:recoverState() - Start the querying of ${cids.length} channels`, {\n tags: ['connection', 'client'],\n });\n\n await this.queryChannels(\n { cid: { $in: cids } } as ChannelFilters<StreamChatGenerics>,\n { last_message_at: -1 },\n { limit: 30 },\n );\n\n this.logger('info', 'client:recoverState() - Querying channels finished', { tags: ['connection', 'client'] });\n this.dispatchEvent({\n type: 'connection.recovered',\n } as Event<StreamChatGenerics>);\n } else {\n this.dispatchEvent({\n type: 'connection.recovered',\n } as Event<StreamChatGenerics>);\n }\n\n this.wsPromise = Promise.resolve();\n this.setUserPromise = Promise.resolve();\n };\n\n /**\n * @private\n */\n async connect() {\n if (!this.userID || !this._user) {\n throw Error('Call connectUser or connectAnonymousUser before starting the connection');\n }\n if (!this.wsBaseURL) {\n throw Error('Websocket base url not set');\n }\n if (!this.clientID) {\n throw Error('clientID is not set');\n }\n\n if (!this.wsConnection && (this.options.warmUp || this.options.enableInsights)) {\n this._sayHi();\n }\n // The StableWSConnection handles all the reconnection logic.\n if (this.options.wsConnection && this.node) {\n // Intentionally avoiding adding ts generics on wsConnection in options since its only useful for unit test purpose.\n ((this.options.wsConnection as unknown) as StableWSConnection<StreamChatGenerics>).setClient(this);\n this.wsConnection = (this.options.wsConnection as unknown) as StableWSConnection<StreamChatGenerics>;\n } else {\n this.wsConnection = new StableWSConnection<StreamChatGenerics>({\n client: this,\n });\n }\n\n try {\n // if fallback is used before, continue using it instead of waiting for WS to fail\n if (this.wsFallback) {\n return await this.wsFallback.connect();\n }\n\n // if WSFallback is enabled, ws connect should timeout faster so fallback can try\n return await this.wsConnection.connect(\n this.options.enableWSFallback ? this.defaultWSTimeoutWithFallback : this.defaultWSTimeout,\n );\n } catch (err) {\n // run fallback only if it's WS/Network error and not a normal API error\n // make sure browser is online before even trying the longpoll\n if (this.options.enableWSFallback && isWSFailure(err) && isOnline()) {\n this.logger('info', 'client:connect() - WS failed, fallback to longpoll', { tags: ['connection', 'client'] });\n this.dispatchEvent({ type: 'transport.changed', mode: 'longpoll' });\n\n this.wsConnection._destroyCurrentWSConnection();\n this.wsConnection.disconnect().then(); // close WS so no retry\n this.wsFallback = new WSConnectionFallback<StreamChatGenerics>({\n client: this,\n });\n return await this.wsFallback.connect();\n }\n\n throw err;\n }\n }\n\n /**\n * Check the connectivity with server for warmup purpose.\n *\n * @private\n */\n _sayHi() {\n const client_request_id = randomId();\n const opts = { headers: { 'x-client-request-id': client_request_id } };\n this.doAxiosRequest('get', this.baseURL + '/hi', null, opts).catch((e) => {\n if (this.options.enableInsights) {\n postInsights('http_hi_failed', {\n api_key: this.key,\n err: e,\n client_request_id,\n });\n }\n });\n }\n\n /**\n * queryUsers - Query users and watch user presence\n *\n * @param {UserFilters<StreamChatGenerics>} filterConditions MongoDB style filter conditions\n * @param {UserSort<StreamChatGenerics>} sort Sort options, for instance [{last_active: -1}].\n * When using multiple fields, make sure you use array of objects to guarantee field order, for instance [{last_active: -1}, {created_at: 1}]\n * @param {UserOptions} options Option object, {presence: true}\n *\n * @return {Promise<{ users: Array<UserResponse<StreamChatGenerics>> }>} User Query Response\n */\n async queryUsers(\n filterConditions: UserFilters<StreamChatGenerics>,\n sort: UserSort<StreamChatGenerics> = [],\n options: UserOptions = {},\n ) {\n const defaultOptions = {\n presence: false,\n };\n\n // Make sure we wait for the connect promise if there is a pending one\n await this.wsPromise;\n\n if (!this._hasConnectionID()) {\n defaultOptions.presence = false;\n }\n\n // Return a list of users\n const data = await this.get<APIResponse & { users: Array<UserResponse<StreamChatGenerics>> }>(\n this.baseURL + '/users',\n {\n payload: {\n filter_conditions: filterConditions,\n sort: normalizeQuerySort(sort),\n ...defaultOptions,\n ...options,\n },\n },\n );\n\n this.state.updateUsers(data.users);\n\n return data;\n }\n\n /**\n * queryBannedUsers - Query user bans\n *\n * @param {BannedUsersFilters} filterConditions MongoDB style filter conditions\n * @param {BannedUsersSort} sort Sort options [{created_at: 1}].\n * @param {BannedUsersPaginationOptions} options Option object, {limit: 10, offset:0, exclude_expired_bans: true}\n *\n * @return {Promise<BannedUsersResponse<StreamChatGenerics>>} Ban Query Response\n */\n async queryBannedUsers(\n filterConditions: BannedUsersFilters = {},\n sort: BannedUsersSort = [],\n options: BannedUsersPaginationOptions = {},\n ) {\n // Return a list of user bans\n return await this.get<BannedUsersResponse<StreamChatGenerics>>(this.baseURL + '/query_banned_users', {\n payload: {\n filter_conditions: filterConditions,\n sort: normalizeQuerySort(sort),\n ...options,\n },\n });\n }\n\n /**\n * queryMessageFlags - Query message flags\n *\n * @param {MessageFlagsFilters} filterConditions MongoDB style filter conditions\n * @param {MessageFlagsPaginationOptions} options Option object, {limit: 10, offset:0}\n *\n * @return {Promise<MessageFlagsResponse<StreamChatGenerics>>} Message Flags Response\n */\n async queryMessageFlags(filterConditions: MessageFlagsFilters = {}, options: MessageFlagsPaginationOptions = {}) {\n // Return a list of message flags\n return await this.get<MessageFlagsResponse<StreamChatGenerics>>(this.baseURL + '/moderation/flags/message', {\n payload: { filter_conditions: filterConditions, ...options },\n });\n }\n\n /**\n * queryChannels - Query channels\n *\n * @param {ChannelFilters<StreamChatGenerics>} filterConditions object MongoDB style filters\n * @param {ChannelSort<StreamChatGenerics>} [sort] Sort options, for instance {created_at: -1}.\n * When using multiple fields, make sure you use array of objects to guarantee field order, for instance [{last_updated: -1}, {created_at: 1}]\n * @param {ChannelOptions} [options] Options object\n * @param {ChannelStateOptions} [stateOptions] State options object. These options will only be used for state management and won't be sent in the request.\n * - stateOptions.skipInitialization - Skips the initialization of the state for the channels matching the ids in the list.\n *\n * @return {Promise<{ channels: Array<ChannelAPIResponse<AStreamChatGenerics>>}> } search channels response\n */\n async queryChannels(\n filterConditions: ChannelFilters<StreamChatGenerics>,\n sort: ChannelSort<StreamChatGenerics> = [],\n options: ChannelOptions = {},\n stateOptions: ChannelStateOptions = {},\n ) {\n const defaultOptions: ChannelOptions = {\n state: true,\n watch: true,\n presence: false,\n };\n\n // Make sure we wait for the connect promise if there is a pending one\n await this.wsPromise;\n if (!this._hasConnectionID()) {\n defaultOptions.watch = false;\n }\n\n // Return a list of channels\n const payload = {\n filter_conditions: filterConditions,\n sort: normalizeQuerySort(sort),\n ...defaultOptions,\n ...options,\n };\n\n const data = await this.post<QueryChannelsAPIResponse<StreamChatGenerics>>(this.baseURL + '/channels', payload);\n\n this.dispatchEvent({\n type: 'channels.queried',\n queriedChannels: {\n channels: data.channels,\n isLatestMessageSet: true,\n },\n });\n\n return this.hydrateActiveChannels(data.channels, stateOptions, options);\n }\n\n /**\n * queryReactions - Query reactions\n *\n * @param {ReactionFilters<StreamChatGenerics>} filter object MongoDB style filters\n * @param {ReactionSort<StreamChatGenerics>} [sort] Sort options, for instance {created_at: -1}.\n * @param {QueryReactionsOptions} [options] Pagination object\n *\n * @return {Promise<{ QueryReactionsAPIResponse } search channels response\n */\n async queryReactions(\n messageID: string,\n filter: ReactionFilters<StreamChatGenerics>,\n sort: ReactionSort<StreamChatGenerics> = [],\n options: QueryReactionsOptions = {},\n ) {\n // Make sure we wait for the connect promise if there is a pending one\n await this.wsPromise;\n\n // Return a list of channels\n const payload = {\n filter,\n sort: normalizeQuerySort(sort),\n ...options,\n };\n\n return await this.post<QueryReactionsAPIResponse<StreamChatGenerics>>(\n this.baseURL + '/messages/' + encodeURIComponent(messageID) + '/reactions',\n payload,\n );\n }\n\n hydrateActiveChannels(\n channelsFromApi: ChannelAPIResponse<StreamChatGenerics>[] = [],\n stateOptions: ChannelStateOptions = {},\n queryChannelsOptions?: ChannelOptions,\n ) {\n const { skipInitialization, offlineMode = false } = stateOptions;\n const channels: Channel<StreamChatGenerics>[] = [];\n\n for (const channelState of channelsFromApi) {\n this._addChannelConfig(channelState.channel);\n const c = this.channel(channelState.channel.type, channelState.channel.id);\n c.data = channelState.channel;\n c.offlineMode = offlineMode;\n c.initialized = !offlineMode;\n c.push_preferences = channelState.push_preferences;\n\n let updatedMessagesSet;\n if (skipInitialization === undefined) {\n const { messageSet } = c._initializeState(channelState, 'latest');\n updatedMessagesSet = messageSet;\n } else if (!skipInitialization.includes(channelState.channel.id)) {\n c.state.clearMessages();\n const { messageSet } = c._initializeState(channelState, 'latest');\n updatedMessagesSet = messageSet;\n }\n\n if (updatedMessagesSet) {\n updatedMessagesSet.pagination = {\n ...updatedMessagesSet.pagination,\n ...messageSetPagination({\n parentSet: updatedMessagesSet,\n requestedPageSize: queryChannelsOptions?.message_limit || DEFAULT_QUERY_CHANNELS_MESSAGE_LIST_PAGE_SIZE,\n returnedPage: channelState.messages,\n logger: this.logger,\n }),\n };\n this.polls.hydratePollCache(updatedMessagesSet.messages, true);\n }\n\n channels.push(c);\n }\n\n return channels;\n }\n\n /**\n * search - Query messages\n *\n * @param {ChannelFilters<StreamChatGenerics>} filterConditions MongoDB style filter conditions\n * @param {MessageFilters<StreamChatGenerics> | string} query search query or object MongoDB style filters\n * @param {SearchOptions<StreamChatGenerics>} [options] Option object, {user_id: 'tommaso'}\n *\n * @return {Promise<SearchAPIResponse<StreamChatGenerics>>} search messages response\n */\n async search(\n filterConditions: ChannelFilters<StreamChatGenerics>,\n query: string | MessageFilters<StreamChatGenerics>,\n options: SearchOptions<StreamChatGenerics> = {},\n ) {\n if (options.offset && options.next) {\n throw Error(`Cannot specify offset with next`);\n }\n const payload: SearchPayload<StreamChatGenerics> = {\n filter_conditions: filterConditions,\n ...options,\n sort: options.sort ? normalizeQuerySort<SearchMessageSortBase<StreamChatGenerics>>(options.sort) : undefined,\n };\n if (typeof query === 'string') {\n payload.query = query;\n } else if (typeof query === 'object') {\n payload.message_filter_conditions = query;\n } else {\n throw Error(`Invalid type ${typeof query} for query parameter`);\n }\n\n // Make sure we wait for the connect promise if there is a pending one\n await this.wsPromise;\n\n return await this.get<SearchAPIResponse<StreamChatGenerics>>(this.baseURL + '/search', { payload });\n }\n\n /**\n * setLocalDevice - Set the device info for the current client(device) that will be sent via WS connection automatically\n *\n * @param {BaseDeviceFields} device the device object\n * @param {string} device.id device id\n * @param {string} device.push_provider the push provider\n *\n */\n setLocalDevice(device: BaseDeviceFields) {\n if (\n (this.wsConnection?.isConnecting && this.wsPromise) ||\n ((this.wsConnection?.isHealthy || this.wsFallback?.isHealthy()) && this._hasConnectionID())\n ) {\n throw new Error('you can only set device before opening a websocket connection');\n }\n\n this.options.device = device;\n }\n\n /**\n * addDevice - Adds a push device for a user.\n *\n * @param {string} id the device id\n * @param {PushProvider} push_provider the push provider\n * @param {string} [userID] the user id (defaults to current user)\n * @param {string} [push_provider_name] user provided push provider name for multi bundle support\n *\n */\n async addDevice(id: string, push_provider: PushProvider, userID?: string, push_provider_name?: string) {\n return await this.post<APIResponse>(this.baseURL + '/devices', {\n id,\n push_provider,\n ...(userID != null ? { user_id: userID } : {}),\n ...(push_provider_name != null ? { push_provider_name } : {}),\n });\n }\n\n /**\n * getDevices - Returns the devices associated with a current user\n *\n * @param {string} [userID] User ID. Only works on serverside\n *\n * @return {Device<StreamChatGenerics>[]} Array of devices\n */\n async getDevices(userID?: string) {\n return await this.get<APIResponse & { devices?: Device<StreamChatGenerics>[] }>(\n this.baseURL + '/devices',\n userID ? { user_id: userID } : {},\n );\n }\n\n /**\n * getUnreadCount - Returns unread counts for a single user\n *\n * @param {string} [userID] User ID.\n *\n * @return {<GetUnreadCountAPIResponse>}\n */\n async getUnreadCount(userID?: string) {\n return await this.get<GetUnreadCountAPIResponse>(this.baseURL + '/unread', userID ? { user_id: userID } : {});\n }\n\n /**\n * getUnreadCountBatch - Returns unread counts for multiple users at once. Only works server side.\n *\n * @param {string[]} [userIDs] List of user IDs to fetch unread counts for.\n *\n * @return {<GetUnreadCountBatchAPIResponse>}\n */\n async getUnreadCountBatch(userIDs: string[]) {\n return await this.post<GetUnreadCountBatchAPIResponse>(this.baseURL + '/unread_batch', { user_ids: userIDs });\n }\n\n /**\n * setPushPreferences - Applies the list of push preferences.\n *\n * @param {PushPreference[]} A list of push preferences.\n *\n * @return {<UpsertPushPreferencesResponse>}\n */\n async setPushPreferences(preferences: PushPreference[]) {\n return await this.post<UpsertPushPreferencesResponse>(this.baseURL + '/push_preferences', { preferences });\n }\n\n /**\n * removeDevice - Removes the device with the given id. Clientside users can only delete their own devices\n *\n * @param {string} id The device id\n * @param {string} [userID] The user id. Only specify this for serverside requests\n *\n */\n async removeDevice(id: string, userID?: string) {\n return await this.delete<APIResponse>(this.baseURL + '/devices', {\n id,\n ...(userID ? { user_id: userID } : {}),\n });\n }\n\n /**\n * getRateLimits - Returns the rate limits quota and usage for the current app, possibly filter for a specific platform and/or endpoints.\n * Only available server-side.\n *\n * @param {object} [params] The params for the call. If none of the params are set, all limits for all platforms are returned.\n * @returns {Promise<GetRateLimitsResponse>}\n */\n async getRateLimits(params?: {\n android?: boolean;\n endpoints?: EndpointName[];\n ios?: boolean;\n serverSide?: boolean;\n web?: boolean;\n }) {\n const { serverSide, web, android, ios, endpoints } = params || {};\n return this.get<GetRateLimitsResponse>(this.baseURL + '/rate_limits', {\n server_side: serverSide,\n web,\n android,\n ios,\n endpoints: endpoints ? endpoints.join(',') : undefined,\n });\n }\n\n _addChannelConfig({ cid, config }: ChannelResponse<StreamChatGenerics>) {\n if (this._cacheEnabled()) {\n this.configs[cid] = config;\n }\n }\n\n /**\n * channel - Returns a new channel with the given type, id and custom data\n *\n * If you want to create a unique conversation between 2 or more users; you can leave out the ID parameter and provide the list of members.\n * Make sure to await channel.create() or channel.watch() before accessing channel functions:\n * ie. channel = client.channel(\"messaging\", {members: [\"tommaso\", \"thierry\"]})\n * await channel.create() to assign an ID to channel\n *\n * @param {string} channelType The channel type\n * @param {string | ChannelData<StreamChatGenerics> | null} [channelIDOrCustom] The channel ID, you can leave this out if you want to create a conversation channel\n * @param {object} [custom] Custom data to attach to the channel\n *\n * @return {channel} The channel object, initialize it using channel.watch()\n */\n channel(\n channelType: string,\n channelID?: string | null,\n custom?: ChannelData<StreamChatGenerics>,\n ): Channel<StreamChatGenerics>;\n channel(channelType: string, custom?: ChannelData<StreamChatGenerics>): Channel<StreamChatGenerics>;\n channel(\n channelType: string,\n channelIDOrCustom?: string | ChannelData<StreamChatGenerics> | null,\n custom: ChannelData<StreamChatGenerics> = {} as ChannelData<StreamChatGenerics>,\n ) {\n if (!this.userID && !this._isUsingServerAuth()) {\n throw Error('Call connectUser or connectAnonymousUser before creating a channel');\n }\n\n if (~channelType.indexOf(':')) {\n throw Error(`Invalid channel group ${channelType}, can't contain the : character`);\n }\n\n // support channel(\"messaging\", {options})\n if (channelIDOrCustom && typeof channelIDOrCustom === 'object') {\n return this.getChannelByMembers(channelType, channelIDOrCustom);\n }\n\n // // support channel(\"messaging\", undefined, {options})\n if (!channelIDOrCustom && typeof custom === 'object' && custom.members?.length) {\n return this.getChannelByMembers(channelType, custom);\n }\n\n // support channel(\"messaging\", null, {options})\n // support channel(\"messaging\", undefined, {options})\n // support channel(\"messaging\", \"\", {options})\n if (!channelIDOrCustom) {\n return new Channel<StreamChatGenerics>(this, channelType, undefined, custom);\n }\n\n return this.getChannelById(channelType, channelIDOrCustom, custom);\n }\n\n /**\n * It's a helper method for `client.channel()` method, used to create unique conversation or\n * channel based on member list instead of id.\n *\n * If the channel already exists in `activeChannels` list, then we simply return it, since that\n * means the same channel was already requested or created.\n *\n * Otherwise we create a new instance of Channel class and return it.\n *\n * @private\n *\n * @param {string} channelType The channel type\n * @param {object} [custom] Custom data to attach to the channel\n *\n * @return {channel} The channel object, initialize it using channel.watch()\n */\n getChannelByMembers = (channelType: string, custom: ChannelData<StreamChatGenerics>) => {\n // Check if the channel already exists.\n // Only allow 1 channel object per cid\n const membersStr = [...(custom.members || [])].sort().join(',');\n const tempCid = `${channelType}:!members-${membersStr}`;\n\n if (!membersStr) {\n throw Error('Please specify atleast one member when creating unique conversation');\n }\n\n // channel could exist in `activeChannels` list with either one of the following two keys:\n // 1. cid - Which gets set on channel only after calling channel.query or channel.watch or channel.create\n // 2. Sorted membersStr - E.g., \"messaging:amin,vishal\" OR \"messaging:amin,jaap,tom\"\n // This is set when you create a channel, but haven't queried yet. After query,\n // we will replace it with `cid`\n for (const key in this.activeChannels) {\n const channel = this.activeChannels[key];\n if (channel.disconnected) {\n continue;\n }\n\n if (key === tempCid) {\n return channel;\n }\n\n if (key.indexOf(`${channelType}:!members-`) === 0) {\n const membersStrInExistingChannel = Object.keys(channel.state.members).sort().join(',');\n if (membersStrInExistingChannel === membersStr) {\n return channel;\n }\n }\n }\n\n const channel = new Channel<StreamChatGenerics>(this, channelType, undefined, custom);\n\n // For the time being set the key as membersStr, since we don't know the cid yet.\n // In channel.query, we will replace it with 'cid'.\n if (this._cacheEnabled()) {\n this.activeChannels[tempCid] = channel;\n }\n\n return channel;\n };\n\n /**\n * Its a helper method for `client.channel()` method, used to channel given the id of channel.\n *\n * If the channel already exists in `activeChannels` list, then we simply return it, since that\n * means the same channel was already requested or created.\n *\n * Otherwise we create a new instance of Channel class and return it.\n *\n * @private\n *\n * @param {string} channelType The channel type\n * @param {string} [channelID] The channel ID\n * @param {object} [custom] Custom data to attach to the channel\n *\n * @return {channel} The channel object, initialize it using channel.watch()\n */\n getChannelById = (channelType: string, channelID: string, custom: ChannelData<StreamChatGenerics>) => {\n if (typeof channelID === 'string' && ~channelID.indexOf(':')) {\n throw Error(`Invalid channel id ${channelID}, can't contain the : character`);\n }\n\n // only allow 1 channel object per cid\n const cid = `${channelType}:${channelID}`;\n if (cid in this.activeChannels && this.activeChannels[cid] && !this.activeChannels[cid].disconnected) {\n const channel = this.activeChannels[cid];\n if (Object.keys(custom).length > 0) {\n channel.data = { ...channel.data, ...custom };\n channel._data = { ...channel._data, ...custom };\n }\n return channel;\n }\n const channel = new Channel<StreamChatGenerics>(this, channelType, channelID, custom);\n if (this._cacheEnabled()) {\n this.activeChannels[channel.cid] = channel;\n }\n\n return channel;\n };\n\n /**\n * partialUpdateUser - Update the given user object\n *\n * @param {PartialUserUpdate<StreamChatGenerics>} partialUserObject which should contain id and any of \"set\" or \"unset\" params;\n * example: {id: \"user1\", set:{field: value}, unset:[\"field2\"]}\n *\n * @return {Promise<{ users: { [key: string]: UserResponse<StreamChatGenerics> } }>} list of updated users\n */\n async partialUpdateUser(partialUserObject: PartialUserUpdate<StreamChatGenerics>) {\n return await this.partialUpdateUsers([partialUserObject]);\n }\n\n /**\n * upsertUsers - Batch upsert the list of users\n *\n * @param {UserResponse<StreamChatGenerics>[]} users list of users\n *\n * @return {Promise<{ users: { [key: string]: UserResponse<StreamChatGenerics> } }>}\n */\n async upsertUsers(users: UserResponse<StreamChatGenerics>[]) {\n const userMap: { [key: string]: UserResponse<StreamChatGenerics> } = {};\n for (const userObject of users) {\n if (!userObject.id) {\n throw Error('User ID is required when updating a user');\n }\n userMap[userObject.id] = userObject;\n }\n\n return await this.post<\n APIResponse & {\n users: { [key: string]: UserResponse<StreamChatGenerics> };\n }\n >(this.baseURL + '/users', { users: userMap });\n }\n\n /**\n * @deprecated Please use upsertUsers() function instead.\n *\n * updateUsers - Batch update the list of users\n *\n * @param {UserResponse<StreamChatGenerics>[]} users list of users\n * @return {Promise<{ users: { [key: string]: UserResponse<StreamChatGenerics> } }>}\n */\n updateUsers = this.upsertUsers;\n\n /**\n * upsertUser - Update or Create the given user object\n *\n * @param {UserResponse<StreamChatGenerics>} userObject user object, the only required field is the user id. IE {id: \"myuser\"} is valid\n *\n * @return {Promise<{ users: { [key: string]: UserResponse<StreamChatGenerics> } }>}\n */\n upsertUser(userObject: UserResponse<StreamChatGenerics>) {\n return this.upsertUsers([userObject]);\n }\n\n /**\n * @deprecated Please use upsertUser() function instead.\n *\n * updateUser - Update or Create the given user object\n *\n * @param {UserResponse<StreamChatGenerics>} userObject user object, the only required field is the user id. IE {id: \"myuser\"} is valid\n * @return {Promise<{ users: { [key: string]: UserResponse<StreamChatGenerics> } }>}\n */\n updateUser = this.upsertUser;\n\n /**\n * partialUpdateUsers - Batch partial update of users\n *\n * @param {PartialUserUpdate<StreamChatGenerics>[]} users list of partial update requests\n *\n * @return {Promise<{ users: { [key: string]: UserResponse<StreamChatGenerics> } }>}\n */\n async partialUpdateUsers(users: PartialUserUpdate<StreamChatGenerics>[]) {\n for (const userObject of users) {\n if (!userObject.id) {\n throw Error('User ID is required when updating a user');\n }\n }\n\n return await this.patch<\n APIResponse & {\n users: { [key: string]: UserResponse<StreamChatGenerics> };\n }\n >(this.baseURL + '/users', { users });\n }\n\n async deleteUser(\n userID: string,\n params?: {\n delete_conversation_channels?: boolean;\n hard_delete?: boolean;\n mark_messages_deleted?: boolean;\n },\n ) {\n return await this.delete<\n APIResponse & { user: UserResponse<StreamChatGenerics> } & {\n task_id?: string;\n }\n >(this.baseURL + `/users/${encodeURIComponent(userID)}`, params);\n }\n\n /**\n * restoreUsers - Restore soft deleted users\n *\n * @param {string[]} user_ids which users to restore\n *\n * @return {APIResponse} An API response\n */\n async restoreUsers(user_ids: string[]) {\n return await this.post<APIResponse>(this.baseURL + `/users/restore`, {\n user_ids,\n });\n }\n\n /**\n * reactivateUser - Reactivate one user\n *\n * @param {string} userID which user to reactivate\n * @param {ReactivateUserOptions} [options]\n *\n * @return {UserResponse} Reactivated user\n */\n async reactivateUser(userID: string, options?: ReactivateUserOptions) {\n return await this.post<APIResponse & { user: UserResponse<StreamChatGenerics> }>(\n this.baseURL + `/users/${encodeURIComponent(userID)}/reactivate`,\n { ...options },\n );\n }\n\n /**\n * reactivateUsers - Reactivate many users asynchronously\n *\n * @param {string[]} user_ids which users to reactivate\n * @param {ReactivateUsersOptions} [options]\n *\n * @return {TaskResponse} A task ID\n */\n async reactivateUsers(user_ids: string[], options?: ReactivateUsersOptions) {\n return await this.post<APIResponse & TaskResponse>(this.baseURL + `/users/reactivate`, { user_ids, ...options });\n }\n\n /**\n * deactivateUser - Deactivate one user\n *\n * @param {string} userID which user to deactivate\n * @param {DeactivateUsersOptions} [options]\n *\n * @return {UserResponse} Deactivated user\n */\n async deactivateUser(userID: string, options?: DeactivateUsersOptions) {\n return await this.post<APIResponse & { user: UserResponse<StreamChatGenerics> }>(\n this.baseURL + `/users/${encodeURIComponent(userID)}/deactivate`,\n { ...options },\n );\n }\n\n /**\n * deactivateUsers - Deactivate many users asynchronously\n *\n * @param {string[]} user_ids which users to deactivate\n * @param {DeactivateUsersOptions} [options]\n *\n * @return {TaskResponse} A task ID\n */\n async deactivateUsers(user_ids: string[], options?: DeactivateUsersOptions) {\n return await this.post<APIResponse & TaskResponse>(this.baseURL + `/users/deactivate`, { user_ids, ...options });\n }\n\n async exportUser(userID: string, options?: Record<string, string>) {\n return await this.get<\n APIResponse & {\n messages: MessageResponse<StreamChatGenerics>[];\n reactions: ReactionResponse<StreamChatGenerics>[];\n user: UserResponse<StreamChatGenerics>;\n }\n >(this.baseURL + `/users/${encodeURIComponent(userID)}/export`, { ...options });\n }\n\n /** banUser - bans a user from all channels\n *\n * @param {string} targetUserID\n * @param {BanUserOptions<StreamChatGenerics>} [options]\n * @returns {Promise<APIResponse>}\n */\n async banUser(targetUserID: string, options?: BanUserOptions<StreamChatGenerics>) {\n return await this.post<APIResponse>(this.baseURL + '/moderation/ban', {\n target_user_id: targetUserID,\n ...options,\n });\n }\n\n /** unbanUser - revoke global ban for a user\n *\n * @param {string} targetUserID\n * @param {UnBanUserOptions} [options]\n * @returns {Promise<APIResponse>}\n */\n async unbanUser(targetUserID: string, options?: UnBanUserOptions) {\n return await this.delete<APIResponse>(this.baseURL + '/moderation/ban', {\n target_user_id: targetUserID,\n ...options,\n });\n }\n\n /** shadowBan - shadow bans a user from all channels\n *\n * @param {string} targetUserID\n * @param {BanUserOptions<StreamChatGenerics>} [options]\n * @returns {Promise<APIResponse>}\n */\n async shadowBan(targetUserID: string, options?: BanUserOptions<StreamChatGenerics>) {\n return await this.banUser(targetUserID, {\n shadow: true,\n ...options,\n });\n }\n\n /** removeShadowBan - revoke global shadow ban for a user\n *\n * @param {string} targetUserID\n * @param {UnBanUserOptions} [options]\n * @returns {Promise<APIResponse>}\n */\n async removeShadowBan(targetUserID: string, options?: UnBanUserOptions) {\n return await this.unbanUser(targetUserID, {\n shadow: true,\n ...options,\n });\n }\n async blockUser(blockedUserID: string, user_id?: string) {\n return await this.post<BlockUserAPIResponse>(this.baseURL + '/users/block', {\n blocked_user_id: blockedUserID,\n ...(user_id ? { user_id } : {}),\n });\n }\n\n async getBlockedUsers(user_id?: string) {\n return await this.get<GetBlockedUsersAPIResponse>(this.baseURL + '/users/block', {\n ...(user_id ? { user_id } : {}),\n });\n }\n async unBlockUser(blockedUserID: string, userID?: string) {\n return await this.post<APIResponse>(this.baseURL + '/users/unblock', {\n blocked_user_id: blockedUserID,\n ...(userID ? { user_id: userID } : {}),\n });\n }\n /** muteUser - mutes a user\n *\n * @param {string} targetID\n * @param {string} [userID] Only used with serverside auth\n * @param {MuteUserOptions<StreamChatGenerics>} [options]\n * @returns {Promise<MuteUserResponse<StreamChatGenerics>>}\n */\n async muteUser(targetID: string, userID?: string, options: MuteUserOptions<StreamChatGenerics> = {}) {\n return await this.post<MuteUserResponse<StreamChatGenerics>>(this.baseURL + '/moderation/mute', {\n target_id: targetID,\n ...(userID ? { user_id: userID } : {}),\n ...options,\n });\n }\n\n /** unmuteUser - unmutes a user\n *\n * @param {string} targetID\n * @param {string} [currentUserID] Only used with serverside auth\n * @returns {Promise<APIResponse>}\n */\n async unmuteUser(targetID: string, currentUserID?: string) {\n return await this.post<APIResponse>(this.baseURL + '/moderation/unmute', {\n target_id: targetID,\n ...(currentUserID ? { user_id: currentUserID } : {}),\n });\n }\n\n /** userMuteStatus - check if a user is muted or not, can be used after connectUser() is called\n *\n * @param {string} targetID\n * @returns {boolean}\n */\n userMuteStatus(targetID: string) {\n if (!this.user || !this.wsPromise) {\n throw new Error('Make sure to await connectUser() first.');\n }\n\n for (let i = 0; i < this.mutedUsers.length; i += 1) {\n if (this.mutedUsers[i].target.id === targetID) return true;\n }\n return false;\n }\n\n /**\n * flagMessage - flag a message\n * @param {string} targetMessageID\n * @param {string} [options.user_id] currentUserID, only used with serverside auth\n * @returns {Promise<APIResponse>}\n */\n async flagMessage(targetMessageID: string, options: { reason?: string; user_id?: string } = {}) {\n return await this.post<FlagMessageResponse<StreamChatGenerics>>(this.baseURL + '/moderation/flag', {\n target_message_id: targetMessageID,\n ...options,\n });\n }\n\n /**\n * flagUser - flag a user\n * @param {string} targetID\n * @param {string} [options.user_id] currentUserID, only used with serverside auth\n * @returns {Promise<APIResponse>}\n */\n async flagUser(targetID: string, options: { reason?: string; user_id?: string } = {}) {\n return await this.post<FlagUserResponse<StreamChatGenerics>>(this.baseURL + '/moderation/flag', {\n target_user_id: targetID,\n ...options,\n });\n }\n\n /**\n * unflagMessage - unflag a message\n * @param {string} targetMessageID\n * @param {string} [options.user_id] currentUserID, only used with serverside auth\n * @returns {Promise<APIResponse>}\n */\n async unflagMessage(targetMessageID: string, options: { user_id?: string } = {}) {\n return await this.post<FlagMessageResponse<StreamChatGenerics>>(this.baseURL + '/moderation/unflag', {\n target_message_id: targetMessageID,\n ...options,\n });\n }\n\n /**\n * unflagUser - unflag a user\n * @param {string} targetID\n * @param {string} [options.user_id] currentUserID, only used with serverside auth\n * @returns {Promise<APIResponse>}\n */\n async unflagUser(targetID: string, options: { user_id?: string } = {}) {\n return await this.post<FlagUserResponse<StreamChatGenerics>>(this.baseURL + '/moderation/unflag', {\n target_user_id: targetID,\n ...options,\n });\n }\n\n /**\n * getCallToken - retrieves the auth token needed to join a call\n *\n * @param {string} callID\n * @param {object} options\n * @returns {Promise<GetCallTokenResponse>}\n */\n async getCallToken(callID: string, options: { user_id?: string } = {}) {\n return await this.post<GetCallTokenResponse>(this.baseURL + `/calls/${encodeURIComponent(callID)}`, { ...options });\n }\n\n /**\n * _queryFlags - Query flags.\n *\n * Note: Do not use this.\n * It is present for internal usage only.\n * This function can, and will, break and/or be removed at any point in time.\n *\n * @private\n * @param {FlagsFilters} filterConditions MongoDB style filter conditions\n * @param {FlagsPaginationOptions} options Option object, {limit: 10, offset:0}\n *\n * @return {Promise<FlagsResponse<StreamChatGenerics>>} Flags Response\n */\n async _queryFlags(filterConditions: FlagsFilters = {}, options: FlagsPaginationOptions = {}) {\n // Return a list of flags\n return await this.post<FlagsResponse<StreamChatGenerics>>(this.baseURL + '/moderation/flags', {\n filter_conditions: filterConditions,\n ...options,\n });\n }\n\n /**\n * _queryFlagReports - Query flag reports.\n *\n * Note: Do not use this.\n * It is present for internal usage only.\n * This function can, and will, break and/or be removed at any point in time.\n *\n * @private\n * @param {FlagReportsFilters} filterConditions MongoDB style filter conditions\n * @param {FlagReportsPaginationOptions} options Option object, {limit: 10, offset:0}\n *\n * @return {Promise<FlagReportsResponse<StreamChatGenerics>>} Flag Reports Response\n */\n async _queryFlagReports(filterConditions: FlagReportsFilters = {}, options: FlagReportsPaginationOptions = {}) {\n // Return a list of message flags\n return await this.post<FlagReportsResponse<StreamChatGenerics>>(this.baseURL + '/moderation/reports', {\n filter_conditions: filterConditions,\n ...options,\n });\n }\n\n /**\n * _reviewFlagReport - review flag report\n *\n * Note: Do not use this.\n * It is present for internal usage only.\n * This function can, and will, break and/or be removed at any point in time.\n *\n * @private\n * @param {string} [id] flag report to review\n * @param {string} [reviewResult] flag report review result\n * @param {string} [options.user_id] currentUserID, only used with serverside auth\n * @param {string} [options.review_details] custom information about review result\n * @returns {Promise<ReviewFlagReportResponse>>}\n */\n async _reviewFlagReport(id: string, reviewResult: string, options: ReviewFlagReportOptions = {}) {\n return await this.patch<ReviewFlagReportResponse<StreamChatGenerics>>(\n this.baseURL + `/moderation/reports/${encodeURIComponent(id)}`,\n {\n review_result: reviewResult,\n ...options,\n },\n );\n }\n\n /**\n * unblockMessage - unblocks message blocked by automod\n *\n *\n * @param {string} targetMessageID\n * @param {string} [options.user_id] currentUserID, only used with serverside auth\n * @returns {Promise<APIResponse>}\n */\n async unblockMessage(targetMessageID: string, options: { user_id?: string } = {}) {\n return await this.post<APIResponse>(this.baseURL + '/moderation/unblock_message', {\n target_message_id: targetMessageID,\n ...options,\n });\n }\n // alias for backwards compatibility\n _unblockMessage = this.unblockMessage;\n\n /**\n * @deprecated use markChannelsRead instead\n *\n * markAllRead - marks all channels for this user as read\n * @param {MarkAllReadOptions<StreamChatGenerics>} [data]\n *\n * @return {Promise<APIResponse>}\n */\n markAllRead = this.markChannelsRead;\n\n /**\n * markChannelsRead - marks channels read -\n * it accepts a map of cid:messageid pairs, if messageid is empty, the whole channel will be marked as read\n *\n * @param {MarkChannelsReadOptions <StreamChatGenerics>} [data]\n *\n * @return {Promise<APIResponse>}\n */\n async markChannelsRead(data: MarkChannelsReadOptions<StreamChatGenerics> = {}) {\n await this.post<APIResponse>(this.baseURL + '/channels/read', { ...data });\n }\n\n createCommand(data: CreateCommandOptions<StreamChatGenerics>) {\n return this.post<CreateCommandResponse<StreamChatGenerics>>(this.baseURL + '/commands', data);\n }\n\n getCommand(name: string) {\n return this.get<GetCommandResponse<StreamChatGenerics>>(this.baseURL + `/commands/${encodeURIComponent(name)}`);\n }\n\n updateCommand(name: string, data: UpdateCommandOptions<StreamChatGenerics>) {\n return this.put<UpdateCommandResponse<StreamChatGenerics>>(\n this.baseURL + `/commands/${encodeURIComponent(name)}`,\n data,\n );\n }\n\n deleteCommand(name: string) {\n return this.delete<DeleteCommandResponse<StreamChatGenerics>>(\n this.baseURL + `/commands/${encodeURIComponent(name)}`,\n );\n }\n\n listCommands() {\n return this.get<ListCommandsResponse<StreamChatGenerics>>(this.baseURL + `/commands`);\n }\n\n createChannelType(data: CreateChannelOptions<StreamChatGenerics>) {\n const channelData = Object.assign({}, { commands: ['all'] }, data);\n return this.post<CreateChannelResponse<StreamChatGenerics>>(this.baseURL + '/channeltypes', channelData);\n }\n\n getChannelType(channelType: string) {\n return this.get<GetChannelTypeResponse<StreamChatGenerics>>(\n this.baseURL + `/channeltypes/${encodeURIComponent(channelType)}`,\n );\n }\n\n updateChannelType(channelType: string, data: UpdateChannelOptions<StreamChatGenerics>) {\n return this.put<UpdateChannelResponse<StreamChatGenerics>>(\n this.baseURL + `/channeltypes/${encodeURIComponent(channelType)}`,\n data,\n );\n }\n\n deleteChannelType(channelType: string) {\n return this.delete<APIResponse>(this.baseURL + `/channeltypes/${encodeURIComponent(channelType)}`);\n }\n\n listChannelTypes() {\n return this.get<ListChannelResponse<StreamChatGenerics>>(this.baseURL + `/channeltypes`);\n }\n\n /**\n * translateMessage - adds the translation to the message\n *\n * @param {string} messageId\n * @param {string} language\n *\n * @return {MessageResponse<StreamChatGenerics>} Response that includes the message\n */\n async translateMessage(messageId: string, language: string) {\n return await this.post<APIResponse & MessageResponse<StreamChatGenerics>>(\n this.baseURL + `/messages/${encodeURIComponent(messageId)}/translate`,\n { language },\n );\n }\n\n /**\n * translate - translates the given text to provided language\n *\n * @param {string} text\n * @param {string} destination_language\n * @param {string} source_language\n *\n * @return {TranslateResponse} Response that includes the message\n */\n async translate(text: string, destination_language: string, source_language: string) {\n return await this.post<APIResponse & TranslateResponse>(this.baseURL + `/translate`, {\n text,\n source_language,\n destination_language,\n });\n }\n\n /**\n * _normalizeExpiration - transforms expiration value into ISO string\n * @param {undefined|null|number|string|Date} timeoutOrExpirationDate expiration date or timeout. Use number type to set timeout in seconds, string or Date to set exact expiration date\n */\n _normalizeExpiration(timeoutOrExpirationDate?: null | number | string | Date) {\n let pinExpires: null | string = null;\n if (typeof timeoutOrExpirationDate === 'number') {\n const now = new Date();\n now.setSeconds(now.getSeconds() + timeoutOrExpirationDate);\n pinExpires = now.toISOString();\n } else if (isString(timeoutOrExpirationDate)) {\n pinExpires = timeoutOrExpirationDate;\n } else if (timeoutOrExpirationDate instanceof Date) {\n pinExpires = timeoutOrExpirationDate.toISOString();\n }\n return pinExpires;\n }\n\n /**\n * _messageId - extracts string message id from either message object or message id\n * @param {string | { id: string }} messageOrMessageId message object or message id\n * @param {string} errorText error message to report in case of message id absence\n */\n _validateAndGetMessageId(messageOrMessageId: string | { id: string }, errorText: string) {\n let messageId: string;\n if (typeof messageOrMessageId === 'string') {\n messageId = messageOrMessageId;\n } else {\n if (!messageOrMessageId.id) {\n throw Error(errorText);\n }\n messageId = messageOrMessageId.id;\n }\n return messageId;\n }\n\n /**\n * pinMessage - pins the message\n * @param {string | { id: string }} messageOrMessageId message object or message id\n * @param {undefined|null|number|string|Date} timeoutOrExpirationDate expiration date or timeout. Use number type to set timeout in seconds, string or Date to set exact expiration date\n * @param {undefined|string | { id: string }} [pinnedBy] who will appear as a user who pinned a message. Only for server-side use. Provide `undefined` when pinning message client-side\n * @param {undefined|number|string|Date} pinnedAt date when message should be pinned. It affects the order of pinned messages. Use negative number to set relative time in the past, string or Date to set exact date of pin\n */\n pinMessage(\n messageOrMessageId: string | { id: string },\n timeoutOrExpirationDate?: null | number | string | Date,\n pinnedBy?: string | { id: string },\n pinnedAt?: number | string | Date,\n ) {\n const messageId = this._validateAndGetMessageId(\n messageOrMessageId,\n 'Please specify the message id when calling unpinMessage',\n );\n return this.partialUpdateMessage(\n messageId,\n ({\n set: {\n pinned: true,\n pin_expires: this._normalizeExpiration(timeoutOrExpirationDate),\n pinned_at: this._normalizeExpiration(pinnedAt),\n },\n } as unknown) as PartialMessageUpdate<StreamChatGenerics>,\n pinnedBy,\n );\n }\n\n /**\n * unpinMessage - unpins the message that was previously pinned\n * @param {string | { id: string }} messageOrMessageId message object or message id\n * @param {string | { id: string }} [userId]\n */\n unpinMessage(messageOrMessageId: string | { id: string }, userId?: string | { id: string }) {\n const messageId = this._validateAndGetMessageId(\n messageOrMessageId,\n 'Please specify the message id when calling unpinMessage',\n );\n return this.partialUpdateMessage(\n messageId,\n ({\n set: { pinned: false },\n } as unknown) as PartialMessageUpdate<StreamChatGenerics>,\n userId,\n );\n }\n\n /**\n * updateMessage - Update the given message\n *\n * @param {Omit<MessageResponse<StreamChatGenerics>, 'mentioned_users'> & { mentioned_users?: string[] }} message object, id needs to be specified\n * @param {string | { id: string }} [userId]\n * @param {boolean} [options.skip_enrich_url] Do not try to enrich the URLs within message\n *\n * @return {{ message: MessageResponse<StreamChatGenerics> }} Response that includes the message\n */\n async updateMessage(\n message: UpdatedMessage<StreamChatGenerics>,\n userId?: string | { id: string },\n options?: UpdateMessageOptions,\n ) {\n if (!message.id) {\n throw Error('Please specify the message id when calling updateMessage');\n }\n\n const clonedMessage: Message = Object.assign({}, message);\n delete clonedMessage.id;\n\n const reservedMessageFields: Array<ReservedMessageFields> = [\n 'command',\n 'created_at',\n 'html',\n 'latest_reactions',\n 'own_reactions',\n 'quoted_message',\n 'reaction_counts',\n 'reply_count',\n 'type',\n 'updated_at',\n 'user',\n '__html',\n ];\n\n reservedMessageFields.forEach(function (item) {\n if (clonedMessage[item] != null) {\n delete clonedMessage[item];\n }\n });\n\n if (userId != null) {\n if (isString(userId)) {\n clonedMessage.user_id = userId;\n } else {\n clonedMessage.user = {\n id: userId.id,\n } as UserResponse<StreamChatGenerics>;\n }\n }\n\n /**\n * Server always expects mentioned_users to be array of string. We are adding extra check, just in case\n * SDK missed this conversion.\n */\n if (Array.isArray(clonedMessage.mentioned_users) && !isString(clonedMessage.mentioned_users[0])) {\n clonedMessage.mentioned_users = clonedMessage.mentioned_users.map((mu) => ((mu as unknown) as UserResponse).id);\n }\n\n return await this.post<UpdateMessageAPIResponse<StreamChatGenerics>>(\n this.baseURL + `/messages/${encodeURIComponent(message.id as string)}`,\n {\n message: clonedMessage,\n ...options,\n },\n );\n }\n\n /**\n * partialUpdateMessage - Update the given message id while retaining additional properties\n *\n * @param {string} id the message id\n *\n * @param {PartialUpdateMessage<StreamChatGenerics>} partialMessageObject which should contain id and any of \"set\" or \"unset\" params;\n * example: {id: \"user1\", set:{text: \"hi\"}, unset:[\"color\"]}\n * @param {string | { id: string }} [userId]\n *\n * @param {boolean} [options.skip_enrich_url] Do not try to enrich the URLs within message\n *\n * @return {{ message: MessageResponse<StreamChatGenerics> }} Response that includes the updated message\n */\n async partialUpdateMessage(\n id: string,\n partialMessageObject: PartialMessageUpdate<StreamChatGenerics>,\n userId?: string | { id: string },\n options?: UpdateMessageOptions,\n ) {\n if (!id) {\n throw Error('Please specify the message id when calling partialUpdateMessage');\n }\n let user = userId;\n if (userId != null && isString(userId)) {\n user = { id: userId };\n }\n return await this.put<UpdateMessageAPIResponse<StreamChatGenerics>>(\n this.baseURL + `/messages/${encodeURIComponent(id)}`,\n {\n ...partialMessageObject,\n ...options,\n user,\n },\n );\n }\n\n async deleteMessage(messageID: string, hardDelete?: boolean) {\n let params = {};\n if (hardDelete) {\n params = { hard: true };\n }\n return await this.delete<APIResponse & { message: MessageResponse<StreamChatGenerics> }>(\n this.baseURL + `/messages/${encodeURIComponent(messageID)}`,\n params,\n );\n }\n\n /**\n * undeleteMessage - Undelete a message\n *\n * undeletes a message that was previous soft deleted. Hard deleted messages\n * cannot be undeleted. This is only allowed to be called from server-side\n * clients.\n *\n * @param {string} messageID The id of the message to undelete\n * @param {string} userID The id of the user who undeleted the message\n *\n * @return {{ message: MessageResponse<StreamChatGenerics> }} Response that includes the message\n */\n async undeleteMessage(messageID: string, userID: string) {\n return await this.post<APIResponse & { message: MessageResponse<StreamChatGenerics> }>(\n this.baseURL + `/messages/${encodeURIComponent(messageID)}/undelete`,\n { undeleted_by: userID },\n );\n }\n\n async getMessage(messageID: string, options?: GetMessageOptions) {\n return await this.get<GetMessageAPIResponse<StreamChatGenerics>>(\n this.baseURL + `/messages/${encodeURIComponent(messageID)}`,\n { ...options },\n );\n }\n\n /**\n * queryThreads - returns the list of threads of current user.\n *\n * @param {QueryThreadsOptions} options Options object for pagination and limiting the participants and replies.\n * @param {number} options.limit Limits the number of threads to be returned.\n * @param {boolean} options.watch Subscribes the user to the channels of the threads.\n * @param {number} options.participant_limit Limits the number of participants returned per threads.\n * @param {number} options.reply_limit Limits the number of replies returned per threads.\n *\n * @returns {{ threads: Thread<StreamChatGenerics>[], next: string }} Returns the list of threads and the next cursor.\n */\n async queryThreads(options: QueryThreadsOptions = {}) {\n const optionsWithDefaults = {\n limit: 10,\n participant_limit: 10,\n reply_limit: 3,\n watch: true,\n ...options,\n };\n\n const response = await this.post<QueryThreadsAPIResponse<StreamChatGenerics>>(\n `${this.baseURL}/threads`,\n optionsWithDefaults,\n );\n\n return {\n threads: response.threads.map(\n (thread) => new Thread<StreamChatGenerics>({ client: this, threadData: thread }),\n ),\n next: response.next,\n };\n }\n\n /**\n * getThread - returns the thread of a message by its id.\n *\n * @param {string} messageId The message id\n * @param {GetThreadOptions} options Options object for pagination and limiting the participants and replies.\n * @param {boolean} options.watch Subscribes the user to the channel of the thread.\n * @param {number} options.participant_limit Limits the number of participants returned per threads.\n * @param {number} options.reply_limit Limits the number of replies returned per threads.\n *\n * @returns {Thread<StreamChatGenerics>} Returns the thread.\n */\n async getThread(messageId: string, options: GetThreadOptions = {}) {\n if (!messageId) {\n throw Error('Please specify the messageId when calling getThread');\n }\n\n const optionsWithDefaults = {\n participant_limit: 100,\n reply_limit: 3,\n watch: true,\n ...options,\n };\n\n const response = await this.get<GetThreadAPIResponse<StreamChatGenerics>>(\n `${this.baseURL}/threads/${encodeURIComponent(messageId)}`,\n optionsWithDefaults,\n );\n\n return new Thread<StreamChatGenerics>({ client: this, threadData: response.thread });\n }\n\n /**\n * partialUpdateThread - updates the given thread\n *\n * @param {string} messageId The id of the thread message which needs to be updated.\n * @param {PartialThreadUpdate} partialThreadObject should contain \"set\" or \"unset\" params for any of the thread's non-reserved fields.\n *\n * @returns {GetThreadAPIResponse<StreamChatGenerics>} Returns the updated thread.\n */\n async partialUpdateThread(messageId: string, partialThreadObject: PartialThreadUpdate) {\n if (!messageId) {\n throw Error('Please specify the message id when calling partialUpdateThread');\n }\n\n // check for reserved fields from ThreadResponse type within partialThreadObject's set and unset.\n // Throw error if any of the reserved field is found.\n const reservedThreadFields = [\n 'created_at',\n 'id',\n 'last_message_at',\n 'type',\n 'updated_at',\n 'user',\n 'reply_count',\n 'participants',\n 'channel',\n 'custom',\n ];\n\n for (const key in { ...partialThreadObject.set, ...partialThreadObject.unset }) {\n if (reservedThreadFields.includes(key)) {\n throw Error(\n `You cannot set ${key} field on Thread object. ${key} is reserved for server-side use. Please omit ${key} from your set object.`,\n );\n }\n }\n\n return await this.patch<GetThreadAPIResponse<StreamChatGenerics>>(\n `${this.baseURL}/threads/${encodeURIComponent(messageId)}`,\n partialThreadObject,\n );\n }\n\n getUserAgent() {\n return (\n this.userAgent || `stream-chat-javascript-client-${this.node ? 'node' : 'browser'}-${process.env.PKG_VERSION}`\n );\n }\n\n setUserAgent(userAgent: string) {\n this.userAgent = userAgent;\n }\n\n /**\n * _isUsingServerAuth - Returns true if we're using server side auth\n */\n _isUsingServerAuth = () => !!this.secret;\n\n _cacheEnabled = () => !this._isUsingServerAuth() || !this.options.disableCache;\n\n _enrichAxiosOptions(\n options: AxiosRequestConfig & { config?: AxiosRequestConfig } = {\n params: {},\n headers: {},\n config: {},\n },\n ): AxiosRequestConfig {\n const token = this._getToken();\n const authorization = token ? { Authorization: token } : undefined;\n let signal: AbortSignal | null = null;\n if (this.nextRequestAbortController !== null) {\n signal = this.nextRequestAbortController.signal;\n this.nextRequestAbortController = null;\n }\n\n if (!options.headers?.['x-client-request-id']) {\n options.headers = {\n ...options.headers,\n 'x-client-request-id': randomId(),\n };\n }\n\n const { params: axiosRequestConfigParams, headers: axiosRequestConfigHeaders, ...axiosRequestConfigRest } =\n this.options.axiosRequestConfig || {};\n\n return {\n params: {\n user_id: this.userID,\n connection_id: this._getConnectionID(),\n api_key: this.key,\n ...options.params,\n ...(axiosRequestConfigParams || {}),\n },\n headers: {\n ...authorization,\n 'stream-auth-type': this.getAuthType(),\n 'X-Stream-Client': this.getUserAgent(),\n ...options.headers,\n ...(axiosRequestConfigHeaders || {}),\n },\n ...(signal ? { signal } : {}),\n ...options.config,\n ...(axiosRequestConfigRest || {}),\n };\n }\n\n _getToken() {\n if (!this.tokenManager || this.anonymous) return null;\n\n return this.tokenManager.getToken();\n }\n\n _startCleaning() {\n const that = this;\n if (this.cleaningIntervalRef != null) {\n return;\n }\n this.cleaningIntervalRef = setInterval(() => {\n // call clean on the channel, used for calling the stop.typing event etc.\n for (const channel of Object.values(that.activeChannels)) {\n channel.clean();\n }\n }, 500);\n }\n\n /**\n * encode ws url payload\n * @private\n * @returns json string\n */\n _buildWSPayload = (client_request_id?: string) => {\n return JSON.stringify({\n user_id: this.userID,\n user_details: this._user,\n device: this.options.device,\n client_request_id,\n });\n };\n\n /**\n * checks signature of a request\n * @param {string | Buffer} rawBody\n * @param {string} signature from HTTP header\n * @returns {boolean}\n */\n verifyWebhook(requestBody: string | Buffer, xSignature: string) {\n return !!this.secret && CheckSignature(requestBody, this.secret, xSignature);\n }\n\n /** getPermission - gets the definition for a permission\n *\n * @param {string} name\n * @returns {Promise<PermissionAPIResponse>}\n */\n getPermission(name: string) {\n return this.get<PermissionAPIResponse>(`${this.baseURL}/permissions/${encodeURIComponent(name)}`);\n }\n\n /** createPermission - creates a custom permission\n *\n * @param {CustomPermissionOptions} permissionData the permission data\n * @returns {Promise<APIResponse>}\n */\n createPermission(permissionData: CustomPermissionOptions) {\n return this.post<APIResponse>(`${this.baseURL}/permissions`, {\n ...permissionData,\n });\n }\n\n /** updatePermission - updates an existing custom permission\n *\n * @param {string} id\n * @param {Omit<CustomPermissionOptions, 'id'>} permissionData the permission data\n * @returns {Promise<APIResponse>}\n */\n updatePermission(id: string, permissionData: Omit<CustomPermissionOptions, 'id'>) {\n return this.put<APIResponse>(`${this.baseURL}/permissions/${encodeURIComponent(id)}`, {\n ...permissionData,\n });\n }\n\n /** deletePermission - deletes a custom permission\n *\n * @param {string} name\n * @returns {Promise<APIResponse>}\n */\n deletePermission(name: string) {\n return this.delete<APIResponse>(`${this.baseURL}/permissions/${encodeURIComponent(name)}`);\n }\n\n /** listPermissions - returns the list of all permissions for this application\n *\n * @returns {Promise<APIResponse>}\n */\n listPermissions() {\n return this.get<PermissionsAPIResponse>(`${this.baseURL}/permissions`);\n }\n\n /** createRole - creates a custom role\n *\n * @param {string} name the new role name\n * @returns {Promise<APIResponse>}\n */\n createRole(name: string) {\n return this.post<APIResponse>(`${this.baseURL}/roles`, { name });\n }\n\n /** listRoles - returns the list of all roles for this application\n *\n * @returns {Promise<APIResponse>}\n */\n listRoles() {\n return this.get<APIResponse>(`${this.baseURL}/roles`);\n }\n\n /** deleteRole - deletes a custom role\n *\n * @param {string} name the role name\n * @returns {Promise<APIResponse>}\n */\n deleteRole(name: string) {\n return this.delete<APIResponse>(`${this.baseURL}/roles/${encodeURIComponent(name)}`);\n }\n\n /** sync - returns all events that happened for a list of channels since last sync\n * @param {string[]} channel_cids list of channel CIDs\n * @param {string} last_sync_at last time the user was online and in sync. RFC3339 ie. \"2020-05-06T15:05:01.207Z\"\n * @param {SyncOptions} options See JSDoc in the type fields for more info\n *\n * @returns {Promise<SyncResponse>}\n */\n sync(channel_cids: string[], last_sync_at: string, options: SyncOptions = {}) {\n return this.post<SyncResponse>(`${this.baseURL}/sync`, {\n channel_cids,\n last_sync_at,\n ...options,\n });\n }\n\n /**\n * sendUserCustomEvent - Send a custom event to a user\n *\n * @param {string} targetUserID target user id\n * @param {UserCustomEvent} event for example {type: 'friendship-request'}\n *\n * @return {Promise<APIResponse>} The Server Response\n */\n async sendUserCustomEvent(targetUserID: string, event: UserCustomEvent) {\n return await this.post<APIResponse>(`${this.baseURL}/users/${encodeURIComponent(targetUserID)}/event`, {\n event,\n });\n }\n\n createBlockList(blockList: BlockList) {\n return this.post<APIResponse>(`${this.baseURL}/blocklists`, blockList);\n }\n\n listBlockLists() {\n return this.get<APIResponse & { blocklists: BlockListResponse[] }>(`${this.baseURL}/blocklists`);\n }\n\n getBlockList(name: string) {\n return this.get<APIResponse & { blocklist: BlockListResponse }>(\n `${this.baseURL}/blocklists/${encodeURIComponent(name)}`,\n );\n }\n\n updateBlockList(name: string, data: { words: string[] }) {\n return this.put<APIResponse>(`${this.baseURL}/blocklists/${encodeURIComponent(name)}`, data);\n }\n\n deleteBlockList(name: string) {\n return this.delete<APIResponse>(`${this.baseURL}/blocklists/${encodeURIComponent(name)}`);\n }\n\n exportChannels(request: Array<ExportChannelRequest>, options: ExportChannelOptions = {}) {\n const payload = { channels: request, ...options };\n return this.post<APIResponse & ExportChannelResponse>(`${this.baseURL}/export_channels`, payload);\n }\n\n exportUsers(request: ExportUsersRequest) {\n return this.post<APIResponse & ExportUsersResponse>(`${this.baseURL}/export/users`, request);\n }\n\n exportChannel(request: ExportChannelRequest, options?: ExportChannelOptions) {\n return this.exportChannels([request], options);\n }\n\n getExportChannelStatus(id: string) {\n return this.get<APIResponse & ExportChannelStatusResponse>(\n `${this.baseURL}/export_channels/${encodeURIComponent(id)}`,\n );\n }\n\n campaign(idOrData: string | CampaignData, data?: CampaignData) {\n if (idOrData && typeof idOrData === 'object') {\n return new Campaign(this, null, idOrData);\n }\n\n return new Campaign(this, idOrData, data);\n }\n\n segment(type: SegmentType, idOrData: string | SegmentData, data?: SegmentData) {\n if (typeof idOrData === 'string') {\n return new Segment(this, type, idOrData, data);\n }\n\n return new Segment(this, type, null, idOrData);\n }\n\n validateServerSideAuth() {\n if (!this.secret) {\n throw new Error(\n 'Campaigns is a server-side only feature. Please initialize the client with a secret to use this feature.',\n );\n }\n }\n\n /**\n * createSegment - Creates a segment\n *\n * @private\n * @param {SegmentType} type Segment type\n * @param {string} id Segment ID\n * @param {string} name Segment name\n * @param {SegmentData} params Segment data\n *\n * @return {{segment: SegmentResponse} & APIResponse} The created Segment\n */\n async createSegment(type: SegmentType, id: string | null, data?: SegmentData) {\n this.validateServerSideAuth();\n const body = {\n id,\n type,\n ...data,\n };\n return this.post<{ segment: SegmentResponse }>(this.baseURL + `/segments`, body);\n }\n\n /**\n * createUserSegment - Creates a user segment\n *\n * @param {string} id Segment ID\n * @param {string} name Segment name\n * @param {SegmentData} data Segment data\n *\n * @return {Segment} The created Segment\n */\n async createUserSegment(id: string | null, data?: SegmentData) {\n this.validateServerSideAuth();\n return this.createSegment('user', id, data);\n }\n\n /**\n * createChannelSegment - Creates a channel segment\n *\n * @param {string} id Segment ID\n * @param {string} name Segment name\n * @param {SegmentData} data Segment data\n *\n * @return {Segment} The created Segment\n */\n async createChannelSegment(id: string | null, data?: SegmentData) {\n this.validateServerSideAuth();\n return this.createSegment('channel', id, data);\n }\n\n async getSegment(id: string) {\n this.validateServerSideAuth();\n return this.get<{ segment: SegmentResponse } & APIResponse>(this.baseURL + `/segments/${encodeURIComponent(id)}`);\n }\n\n /**\n * updateSegment - Update a segment\n *\n * @param {string} id Segment ID\n * @param {Partial<UpdateSegmentData>} data Data to update\n *\n * @return {Segment} Updated Segment\n */\n async updateSegment(id: string, data: Partial<UpdateSegmentData>) {\n this.validateServerSideAuth();\n return this.put<{ segment: SegmentResponse }>(this.baseURL + `/segments/${encodeURIComponent(id)}`, data);\n }\n\n /**\n * addSegmentTargets - Add targets to a segment\n *\n * @param {string} id Segment ID\n * @param {string[]} targets Targets to add to the segment\n *\n * @return {APIResponse} API response\n */\n async addSegmentTargets(id: string, targets: string[]) {\n this.validateServerSideAuth();\n const body = { target_ids: targets };\n return this.post<APIResponse>(this.baseURL + `/segments/${encodeURIComponent(id)}/addtargets`, body);\n }\n\n async querySegmentTargets(\n id: string,\n filter: QuerySegmentTargetsFilter | null = {},\n sort: SortParam[] | null | [] = [],\n options = {},\n ) {\n this.validateServerSideAuth();\n return this.post<{ targets: SegmentTargetsResponse[]; next?: string } & APIResponse>(\n this.baseURL + `/segments/${encodeURIComponent(id)}/targets/query`,\n {\n filter: filter || {},\n sort: sort || [],\n ...options,\n },\n );\n }\n /**\n * removeSegmentTargets - Remove targets from a segment\n *\n * @param {string} id Segment ID\n * @param {string[]} targets Targets to add to the segment\n *\n * @return {APIResponse} API response\n */\n async removeSegmentTargets(id: string, targets: string[]) {\n this.validateServerSideAuth();\n const body = { target_ids: targets };\n return this.post<APIResponse>(this.baseURL + `/segments/${encodeURIComponent(id)}/deletetargets`, body);\n }\n\n /**\n * querySegments - Query Segments\n *\n * @param {filter} filter MongoDB style filter conditions\n * @param {QuerySegmentsOptions} options Options for sorting/paginating the results\n *\n * @return {Segment[]} Segments\n */\n async querySegments(filter: {}, sort?: SortParam[], options: QuerySegmentsOptions = {}) {\n this.validateServerSideAuth();\n return this.post<\n {\n segments: SegmentResponse[];\n next?: string;\n prev?: string;\n } & APIResponse\n >(this.baseURL + `/segments/query`, {\n filter,\n sort,\n ...options,\n });\n }\n\n /**\n * deleteSegment - Delete a Campaign Segment\n *\n * @param {string} id Segment ID\n *\n * @return {Promise<APIResponse>} The Server Response\n */\n async deleteSegment(id: string) {\n this.validateServerSideAuth();\n return this.delete<APIResponse>(this.baseURL + `/segments/${encodeURIComponent(id)}`);\n }\n\n /**\n * segmentTargetExists - Check if a target exists in a segment\n *\n * @param {string} segmentId Segment ID\n * @param {string} targetId Target ID\n *\n * @return {Promise<APIResponse>} The Server Response\n */\n async segmentTargetExists(segmentId: string, targetId: string) {\n this.validateServerSideAuth();\n return this.get<APIResponse>(\n this.baseURL + `/segments/${encodeURIComponent(segmentId)}/target/${encodeURIComponent(targetId)}`,\n );\n }\n\n /**\n * createCampaign - Creates a Campaign\n *\n * @param {CampaignData} params Campaign data\n *\n * @return {Campaign} The Created Campaign\n */\n async createCampaign(params: CampaignData) {\n this.validateServerSideAuth();\n return this.post<{ campaign: CampaignResponse } & APIResponse>(this.baseURL + `/campaigns`, { ...params });\n }\n\n async getCampaign(id: string) {\n this.validateServerSideAuth();\n return this.get<{ campaign: CampaignResponse } & APIResponse>(\n this.baseURL + `/campaigns/${encodeURIComponent(id)}`,\n );\n }\n\n async startCampaign(id: string, options?: { scheduledFor?: string; stopAt?: string }) {\n this.validateServerSideAuth();\n return this.post<{ campaign: CampaignResponse } & APIResponse>(\n this.baseURL + `/campaigns/${encodeURIComponent(id)}/start`,\n {\n scheduled_for: options?.scheduledFor,\n stop_at: options?.stopAt,\n },\n );\n }\n /**\n * queryCampaigns - Query Campaigns\n *\n *\n * @return {Campaign[]} Campaigns\n */\n async queryCampaigns(filter: CampaignFilters, sort?: CampaignSort, options?: CampaignQueryOptions) {\n this.validateServerSideAuth();\n return await this.post<\n {\n campaigns: CampaignResponse[];\n next?: string;\n prev?: string;\n } & APIResponse\n >(this.baseURL + `/campaigns/query`, {\n filter,\n sort,\n ...(options || {}),\n });\n }\n\n /**\n * updateCampaign - Update a Campaign\n *\n * @param {string} id Campaign ID\n * @param {Partial<CampaignData>} params Campaign data\n *\n * @return {Campaign} Updated Campaign\n */\n async updateCampaign(id: string, params: Partial<CampaignData>) {\n this.validateServerSideAuth();\n return this.put<{ campaign: CampaignResponse }>(this.baseURL + `/campaigns/${encodeURIComponent(id)}`, params);\n }\n\n /**\n * deleteCampaign - Delete a Campaign\n *\n * @param {string} id Campaign ID\n *\n * @return {Promise<APIResponse>} The Server Response\n */\n async deleteCampaign(id: string) {\n this.validateServerSideAuth();\n return this.delete<APIResponse>(this.baseURL + `/campaigns/${encodeURIComponent(id)}`);\n }\n\n /**\n * stopCampaign - Stop a Campaign\n *\n * @param {string} id Campaign ID\n *\n * @return {Campaign} Stopped Campaign\n */\n async stopCampaign(id: string) {\n this.validateServerSideAuth();\n return this.post<{ campaign: CampaignResponse }>(this.baseURL + `/campaigns/${encodeURIComponent(id)}/stop`);\n }\n\n /**\n * enrichURL - Get OpenGraph data of the given link\n *\n * @param {string} url link\n * @return {OGAttachment} OG Attachment\n */\n async enrichURL(url: string) {\n return this.get<APIResponse & OGAttachment>(this.baseURL + `/og`, { url });\n }\n\n /**\n * getTask - Gets status of a long running task\n *\n * @param {string} id Task ID\n *\n * @return {TaskStatus} The task status\n */\n async getTask(id: string) {\n return this.get<APIResponse & TaskStatus>(`${this.baseURL}/tasks/${encodeURIComponent(id)}`);\n }\n\n /**\n * deleteChannels - Deletes a list of channel\n *\n * @param {string[]} cids Channel CIDs\n * @param {boolean} [options.hard_delete] Defines if the channel is hard deleted or not\n *\n * @return {DeleteChannelsResponse} Result of the soft deletion, if server-side, it holds the task ID as well\n */\n async deleteChannels(cids: string[], options: { hard_delete?: boolean } = {}) {\n return await this.post<APIResponse & DeleteChannelsResponse>(this.baseURL + `/channels/delete`, {\n cids,\n ...options,\n });\n }\n\n /**\n * deleteUsers - Batch Delete Users\n *\n * @param {string[]} user_ids which users to delete\n * @param {DeleteUserOptions} options Configuration how to delete users\n *\n * @return {TaskResponse} A task ID\n */\n async deleteUsers(user_ids: string[], options: DeleteUserOptions = {}) {\n if (typeof options.user !== 'undefined' && !['soft', 'hard', 'pruning'].includes(options.user)) {\n throw new Error('Invalid delete user options. user must be one of [soft hard pruning]');\n }\n if (typeof options.conversations !== 'undefined' && !['soft', 'hard'].includes(options.conversations)) {\n throw new Error('Invalid delete user options. conversations must be one of [soft hard]');\n }\n if (typeof options.messages !== 'undefined' && !['soft', 'hard', 'pruning'].includes(options.messages)) {\n throw new Error('Invalid delete user options. messages must be one of [soft hard pruning]');\n }\n return await this.post<APIResponse & TaskResponse>(this.baseURL + `/users/delete`, {\n user_ids,\n ...options,\n });\n }\n\n /**\n * _createImportURL - Create an Import upload url.\n *\n * Note: Do not use this.\n * It is present for internal usage only.\n * This function can, and will, break and/or be removed at any point in time.\n *\n * @private\n * @param {string} filename filename of uploaded data\n * @return {APIResponse & CreateImportResponse} An ImportTask\n */\n async _createImportURL(filename: string) {\n return await this.post<APIResponse & CreateImportURLResponse>(this.baseURL + `/import_urls`, {\n filename,\n });\n }\n\n /**\n * _createImport - Create an Import Task.\n *\n * Note: Do not use this.\n * It is present for internal usage only.\n * This function can, and will, break and/or be removed at any point in time.\n *\n * @private\n * @param {string} path path of uploaded data\n * @param {CreateImportOptions} options import options\n * @return {APIResponse & CreateImportResponse} An ImportTask\n */\n async _createImport(path: string, options: CreateImportOptions = { mode: 'upsert' }) {\n return await this.post<APIResponse & CreateImportResponse>(this.baseURL + `/imports`, {\n path,\n ...options,\n });\n }\n\n /**\n * _getImport - Get an Import Task.\n *\n * Note: Do not use this.\n * It is present for internal usage only.\n * This function can, and will, break and/or be removed at any point in time.\n *\n * @private\n * @param {string} id id of Import Task\n *\n * @return {APIResponse & GetImportResponse} An ImportTask\n */\n async _getImport(id: string) {\n return await this.get<APIResponse & GetImportResponse>(this.baseURL + `/imports/${encodeURIComponent(id)}`);\n }\n\n /**\n * _listImports - Lists Import Tasks.\n *\n * Note: Do not use this.\n * It is present for internal usage only.\n * This function can, and will, break and/or be removed at any point in time.\n *\n * @private\n * @param {ListImportsPaginationOptions} options pagination options\n *\n * @return {APIResponse & ListImportsResponse} An ImportTask\n */\n async _listImports(options: ListImportsPaginationOptions) {\n return await this.get<APIResponse & ListImportsResponse>(this.baseURL + `/imports`, options);\n }\n\n /**\n * upsertPushProvider - Create or Update a push provider\n *\n * Note: Works only for v2 push version is enabled on app settings.\n *\n * @param {PushProviderConfig} configuration of the provider you want to create or update\n *\n * @return {APIResponse & PushProviderUpsertResponse} A push provider\n */\n async upsertPushProvider(pushProvider: PushProviderConfig) {\n return await this.post<APIResponse & PushProviderUpsertResponse>(this.baseURL + `/push_providers`, {\n push_provider: pushProvider,\n });\n }\n\n /**\n * deletePushProvider - Delete a push provider\n *\n * Note: Works only for v2 push version is enabled on app settings.\n *\n * @param {PushProviderID} type and foreign id of the push provider to be deleted\n *\n * @return {APIResponse} An API response\n */\n async deletePushProvider({ type, name }: PushProviderID) {\n return await this.delete<APIResponse>(\n this.baseURL + `/push_providers/${encodeURIComponent(type)}/${encodeURIComponent(name)}`,\n );\n }\n\n /**\n * listPushProviders - Get all push providers in the app\n *\n * Note: Works only for v2 push version is enabled on app settings.\n *\n * @return {APIResponse & PushProviderListResponse} A push provider\n */\n async listPushProviders() {\n return await this.get<APIResponse & PushProviderListResponse>(this.baseURL + `/push_providers`);\n }\n\n /**\n * creates an abort controller that will be used by the next HTTP Request.\n */\n createAbortControllerForNextRequest() {\n return (this.nextRequestAbortController = new AbortController());\n }\n\n /**\n * commits a pending message, making it visible in the channel and for other users\n * @param id the message id\n *\n * @return {APIResponse & MessageResponse} The message\n */\n async commitMessage(id: string) {\n return await this.post<APIResponse & MessageResponse>(this.baseURL + `/messages/${encodeURIComponent(id)}/commit`);\n }\n\n /**\n * Creates a poll\n * @param poll PollData The poll that will be created\n * @param userId string The user id (only serverside)\n * @returns {APIResponse & CreatePollAPIResponse} The poll\n */\n async createPoll(poll: CreatePollData<StreamChatGenerics>, userId?: string) {\n return await this.post<APIResponse & CreatePollAPIResponse<StreamChatGenerics>>(this.baseURL + `/polls`, {\n ...poll,\n ...(userId ? { user_id: userId } : {}),\n });\n }\n\n /**\n * Retrieves a poll\n * @param id string The poll id\n * @param userId string The user id (only serverside)\n * @returns {APIResponse & GetPollAPIResponse} The poll\n */\n async getPoll(id: string, userId?: string): Promise<APIResponse & GetPollAPIResponse<StreamChatGenerics>> {\n return await this.get<APIResponse & GetPollAPIResponse<StreamChatGenerics>>(\n this.baseURL + `/polls/${encodeURIComponent(id)}`,\n userId ? { user_id: userId } : {},\n );\n }\n\n /**\n * Updates a poll\n * @param poll PollData The poll that will be updated\n * @param userId string The user id (only serverside)\n * @returns {APIResponse & PollResponse} The poll\n */\n async updatePoll(poll: PollData<StreamChatGenerics>, userId?: string) {\n return await this.put<APIResponse & UpdatePollAPIResponse<StreamChatGenerics>>(this.baseURL + `/polls`, {\n ...poll,\n ...(userId ? { user_id: userId } : {}),\n });\n }\n\n /**\n * Partially updates a poll\n * @param id string The poll id\n * @param {PartialPollUpdate<StreamChatGenerics>} partialPollObject which should contain id and any of \"set\" or \"unset\" params;\n * @param userId string The user id (only serverside)\n * example: {id: \"44f26af5-f2be-4fa7-9dac-71cf893781de\", set:{field: value}, unset:[\"field2\"]}\n * @returns {APIResponse & UpdatePollAPIResponse} The poll\n */\n async partialUpdatePoll(\n id: string,\n partialPollObject: PartialPollUpdate<StreamChatGenerics>,\n userId?: string,\n ): Promise<APIResponse & UpdatePollAPIResponse<StreamChatGenerics>> {\n return await this.patch<APIResponse & UpdatePollAPIResponse<StreamChatGenerics>>(\n this.baseURL + `/polls/${encodeURIComponent(id)}`,\n {\n ...partialPollObject,\n ...(userId ? { user_id: userId } : {}),\n },\n );\n }\n\n /**\n * Delete a poll\n * @param id string The poll id\n * @param userId string The user id (only serverside)\n * @returns\n */\n async deletePoll(id: string, userId?: string): Promise<APIResponse> {\n return await this.delete<APIResponse>(this.baseURL + `/polls/${encodeURIComponent(id)}`, {\n ...(userId ? { user_id: userId } : {}),\n });\n }\n\n /**\n * Close a poll\n * @param id string The poll id\n * @param userId string The user id (only serverside)\n * @returns {APIResponse & UpdatePollAPIResponse} The poll\n */\n async closePoll(id: string, userId?: string): Promise<APIResponse & UpdatePollAPIResponse<StreamChatGenerics>> {\n return this.partialUpdatePoll(\n id,\n {\n set: {\n is_closed: true,\n } as PartialPollUpdate<StreamChatGenerics>['set'],\n },\n userId,\n );\n }\n\n /**\n * Creates a poll option\n * @param pollId string The poll id\n * @param option PollOptionData The poll option that will be created\n * @param userId string The user id (only serverside)\n * @returns {APIResponse & PollOptionResponse} The poll option\n */\n async createPollOption(pollId: string, option: PollOptionData<StreamChatGenerics>, userId?: string) {\n return await this.post<APIResponse & CreatePollOptionAPIResponse<StreamChatGenerics>>(\n this.baseURL + `/polls/${encodeURIComponent(pollId)}/options`,\n {\n ...option,\n ...(userId ? { user_id: userId } : {}),\n },\n );\n }\n\n /**\n * Retrieves a poll option\n * @param pollId string The poll id\n * @param optionId string The poll option id\n * @param userId string The user id (only serverside)\n * @returns {APIResponse & PollOptionResponse} The poll option\n */\n async getPollOption(pollId: string, optionId: string, userId?: string) {\n return await this.get<APIResponse & GetPollOptionAPIResponse<StreamChatGenerics>>(\n this.baseURL + `/polls/${encodeURIComponent(pollId)}/options/${encodeURIComponent(optionId)}`,\n userId ? { user_id: userId } : {},\n );\n }\n\n /**\n * Updates a poll option\n * @param pollId string The poll id\n * @param option PollOptionData The poll option that will be updated\n * @param userId string The user id (only serverside)\n * @returns\n */\n async updatePollOption(pollId: string, option: PollOptionData<StreamChatGenerics>, userId?: string) {\n return await this.put<APIResponse & UpdatePollOptionAPIResponse<StreamChatGenerics>>(\n this.baseURL + `/polls/${encodeURIComponent(pollId)}/options`,\n {\n ...option,\n ...(userId ? { user_id: userId } : {}),\n },\n );\n }\n\n /**\n * Delete a poll option\n * @param pollId string The poll id\n * @param optionId string The poll option id\n * @param userId string The user id (only serverside)\n * @returns {APIResponse} The poll option\n */\n async deletePollOption(pollId: string, optionId: string, userId?: string) {\n return await this.delete<APIResponse>(\n this.baseURL + `/polls/${encodeURIComponent(pollId)}/options/${encodeURIComponent(optionId)}`,\n userId ? { user_id: userId } : {},\n );\n }\n\n /**\n * Cast vote on a poll\n * @param messageId string The message id\n * @param pollId string The poll id\n * @param vote PollVoteData The vote that will be casted\n * @param userId string The user id (only serverside)\n * @returns {APIResponse & CastVoteAPIResponse} The poll vote\n */\n async castPollVote(messageId: string, pollId: string, vote: PollVoteData, userId?: string) {\n return await this.post<APIResponse & CastVoteAPIResponse<StreamChatGenerics>>(\n this.baseURL + `/messages/${encodeURIComponent(messageId)}/polls/${encodeURIComponent(pollId)}/vote`,\n {\n vote,\n ...(userId ? { user_id: userId } : {}),\n },\n );\n }\n\n /**\n * Add a poll answer\n * @param messageId string The message id\n * @param pollId string The poll id\n * @param answerText string The answer text\n * @param userId string The user id (only serverside)\n */\n async addPollAnswer(messageId: string, pollId: string, answerText: string, userId?: string) {\n return this.castPollVote(\n messageId,\n pollId,\n {\n answer_text: answerText,\n },\n userId,\n );\n }\n\n async removePollVote(messageId: string, pollId: string, voteId: string, userId?: string) {\n return await this.delete<APIResponse & { vote: PollVote }>(\n this.baseURL +\n `/messages/${encodeURIComponent(messageId)}/polls/${encodeURIComponent(pollId)}/vote/${encodeURIComponent(\n voteId,\n )}`,\n {\n ...(userId ? { user_id: userId } : {}),\n },\n );\n }\n\n /**\n * Queries polls\n * @param filter\n * @param sort\n * @param options Option object, {limit: 10, offset:0}\n * @param userId string The user id (only serverside)\n * @returns {APIResponse & QueryPollsResponse} The polls\n */\n async queryPolls(\n filter: QueryPollsFilters = {},\n sort: PollSort = [],\n options: QueryPollsOptions = {},\n userId?: string,\n ): Promise<APIResponse & QueryPollsResponse<StreamChatGenerics>> {\n const q = userId ? `?user_id=${userId}` : '';\n return await this.post<APIResponse & QueryPollsResponse<StreamChatGenerics>>(this.baseURL + `/polls/query${q}`, {\n filter,\n sort: normalizeQuerySort(sort),\n ...options,\n });\n }\n\n /**\n * Queries poll votes\n * @param pollId\n * @param filter\n * @param sort\n * @param options Option object, {limit: 10, offset:0}\n * @param userId string The user id (only serverside)\n * @returns {APIResponse & PollVotesAPIResponse} The poll votes\n */\n async queryPollVotes(\n pollId: string,\n filter: QueryVotesFilters = {},\n sort: VoteSort = [],\n options: QueryVotesOptions = {},\n userId?: string,\n ): Promise<APIResponse & PollVotesAPIResponse<StreamChatGenerics>> {\n const q = userId ? `?user_id=${userId}` : '';\n return await this.post<APIResponse & PollVotesAPIResponse<StreamChatGenerics>>(\n this.baseURL + `/polls/${encodeURIComponent(pollId)}/votes${q}`,\n {\n filter,\n sort: normalizeQuerySort(sort),\n ...options,\n },\n );\n }\n\n /**\n * Queries poll answers\n * @param pollId\n * @param filter\n * @param sort\n * @param options Option object, {limit: 10, offset:0}\n * @param userId string The user id (only serverside)\n * @returns {APIResponse & PollAnswersAPIResponse} The poll votes\n */\n async queryPollAnswers(\n pollId: string,\n filter: QueryVotesFilters = {},\n sort: VoteSort = [],\n options: QueryVotesOptions = {},\n userId?: string,\n ): Promise<APIResponse & PollAnswersAPIResponse<StreamChatGenerics>> {\n const q = userId ? `?user_id=${userId}` : '';\n return await this.post<APIResponse & PollAnswersAPIResponse<StreamChatGenerics>>(\n this.baseURL + `/polls/${encodeURIComponent(pollId)}/votes${q}`,\n {\n filter: { ...filter, is_answer: true },\n sort: normalizeQuerySort(sort),\n ...options,\n },\n );\n }\n\n /**\n * Query message history\n * @param filter\n * @param sort\n * @param options Option object, {limit: 10}\n * @returns {APIResponse & QueryMessageHistoryResponse} The message histories\n */\n async queryMessageHistory(\n filter: QueryMessageHistoryFilters = {},\n sort: QueryMessageHistorySort = [],\n options: QueryMessageHistoryOptions = {},\n ): Promise<APIResponse & QueryMessageHistoryResponse<StreamChatGenerics>> {\n return await this.post<APIResponse & QueryMessageHistoryResponse<StreamChatGenerics>>(\n this.baseURL + '/messages/history',\n {\n filter,\n sort: normalizeQuerySort(sort),\n ...options,\n },\n );\n }\n\n /**\n * updateFlags - reviews/unflags flagged message\n *\n * @param {string[]} message_ids list of message IDs\n * @param {string} options Option object in case user ID is set to review all the flagged messages by the user\n * @param {string} reviewed_by user ID who reviewed the flagged message\n * @returns {APIResponse}\n */\n async updateFlags(message_ids: string[], reviewed_by: string, options: { user_id?: string } = {}) {\n return await this.post<APIResponse>(this.baseURL + '/automod/v1/moderation/update_flags', {\n message_ids,\n reviewed_by,\n ...options,\n });\n }\n}\n","export const EVENT_MAP = {\n 'channel.created': true,\n 'channel.deleted': true,\n 'channel.hidden': true,\n 'channel.kicked': true,\n 'channel.muted': true,\n 'channel.truncated': true,\n 'channel.unmuted': true,\n 'channel.updated': true,\n 'channel.visible': true,\n 'health.check': true,\n 'member.added': true,\n 'member.removed': true,\n 'member.updated': true,\n 'message.deleted': true,\n 'message.new': true,\n 'message.read': true,\n 'message.updated': true,\n 'message.undeleted': true,\n 'notification.added_to_channel': true,\n 'notification.channel_deleted': true,\n 'notification.channel_mutes_updated': true,\n 'notification.channel_truncated': true,\n 'notification.invite_accepted': true,\n 'notification.invite_rejected': true,\n 'notification.invited': true,\n 'notification.mark_read': true,\n 'notification.mark_unread': true,\n 'notification.message_new': true,\n 'notification.mutes_updated': true,\n 'notification.removed_from_channel': true,\n 'notification.thread_message_new': true,\n 'poll.closed': true,\n 'poll.updated': true,\n 'poll.vote_casted': true,\n 'poll.vote_changed': true,\n 'poll.vote_removed': true,\n 'reaction.deleted': true,\n 'reaction.new': true,\n 'reaction.updated': true,\n 'thread.updated': true,\n 'typing.start': true,\n 'typing.stop': true,\n 'user.banned': true,\n 'user.deleted': true,\n 'user.presence.changed': true,\n 'user.unbanned': true,\n 'user.unread_message_reminder': true,\n 'user.updated': true,\n 'user.watching.start': true,\n 'user.watching.stop': true,\n // AI events\n 'ai_indicator.update': true,\n 'ai_indicator.stop': true,\n 'ai_indicator.clear': true,\n\n // local events\n 'channels.queried': true,\n 'connection.changed': true,\n 'connection.recovered': true,\n 'transport.changed': true,\n 'capabilities.changed': true,\n};\n","import { PermissionObject } from './types';\n\ntype RequiredPermissionObject = Required<PermissionObject>;\n\nexport const Allow = 'Allow';\nexport const Deny = 'Deny';\nexport const AnyResource = ['*'];\nexport const AnyRole = ['*'];\nexport const MaxPriority = 999;\nexport const MinPriority = 1;\n\n// deprecated permission object class, you should use the new permission system v2 and use permissions\n// defined in BuiltinPermissions to configure your channel types\n\nexport class Permission {\n name: RequiredPermissionObject['name'];\n action: RequiredPermissionObject['action'];\n owner: RequiredPermissionObject['owner'];\n priority: RequiredPermissionObject['priority'];\n resources: RequiredPermissionObject['resources'];\n roles: RequiredPermissionObject['roles'];\n constructor(\n name: string,\n priority: number,\n resources = AnyResource,\n roles = AnyRole,\n owner = false,\n action: RequiredPermissionObject['action'] = Allow,\n ) {\n this.name = name;\n this.action = action;\n this.owner = owner;\n this.priority = priority;\n this.resources = resources;\n this.roles = roles;\n }\n}\n\n// deprecated\nexport const AllowAll = new Permission('Allow all', MaxPriority, AnyResource, AnyRole, false, Allow);\n\n// deprecated\nexport const DenyAll = new Permission('Deny all', MinPriority, AnyResource, AnyRole, false, Deny);\n\nexport type Role = 'admin' | 'user' | 'guest' | 'anonymous' | 'channel_member' | 'channel_moderator' | string;\n\nexport const BuiltinRoles = {\n Admin: 'admin',\n Anonymous: 'anonymous',\n ChannelMember: 'channel_member',\n ChannelModerator: 'channel_moderator',\n Guest: 'guest',\n User: 'user',\n};\n\nexport const BuiltinPermissions = {\n AddLinks: 'Add Links',\n BanUser: 'Ban User',\n CreateChannel: 'Create Channel',\n CreateMessage: 'Create Message',\n CreateReaction: 'Create Reaction',\n DeleteAnyAttachment: 'Delete Any Attachment',\n DeleteAnyChannel: 'Delete Any Channel',\n DeleteAnyMessage: 'Delete Any Message',\n DeleteAnyReaction: 'Delete Any Reaction',\n DeleteOwnAttachment: 'Delete Own Attachment',\n DeleteOwnChannel: 'Delete Own Channel',\n DeleteOwnMessage: 'Delete Own Message',\n DeleteOwnReaction: 'Delete Own Reaction',\n ReadAnyChannel: 'Read Any Channel',\n ReadOwnChannel: 'Read Own Channel',\n RunMessageAction: 'Run Message Action',\n UpdateAnyChannel: 'Update Any Channel',\n UpdateAnyMessage: 'Update Any Message',\n UpdateMembersAnyChannel: 'Update Members Any Channel',\n UpdateMembersOwnChannel: 'Update Members Own Channel',\n UpdateOwnChannel: 'Update Own Channel',\n UpdateOwnMessage: 'Update Own Message',\n UploadAttachment: 'Upload Attachment',\n UseFrozenChannel: 'Send messages and reactions to frozen channels',\n};\n"],"names":["isString","arrayOrString","isMapStringCallback","callback","map","res","k","len","length","charAt","kValue","mappedValue","encodeBase64","data","fromByteArray","Uint8Array","char","charCodeAt","decodeBase64","s","e","w","String","fromCharCode","L","i","b","c","x","l","a","r","A","Campaign","client","id","body","message_template","segment_ids","sender_id","sender_mode","channel_template","create_channels","description","name","user_ids","createCampaign","result","campaign","Error","options","verifyCampaignId","startCampaign","updateCampaign","deleteCampaign","stopCampaign","getCampaign","logChatPromiseExecution","promise","then","catch","error","console","warn","sleep","m","Promise","setTimeout","isFunction","value","Object","prototype","toString","call","Function","chatCodes","TOKEN_EXPIRED","WS_CLOSED_SUCCESS","isReadableStream","obj","readable","_read","isBuffer","constructor","isFileWebAPI","uri","window","File","isOwnUser","user","total_unread_count","undefined","isBlobWebAPI","Blob","isOwnUserBaseProperty","property","ownUserBaseProperties","channel_mutes","devices","mutes","unread_channels","unread_count","unread_threads","invisible","privacy_settings","roles","push_preferences","addFileToFormData","contentType","FormData","append","split","reverse","type","normalizeQuerySort","sort","sortFields","sortArr","Array","isArray","item","entries","field","direction","push","retryInterval","numberOfFailures","max","Math","min","floor","random","randomId","generateUUIDv4","hex","bytes","padStart","getRandomBytes","subarray","getRandomValuesWithMathRandom","pow","byteLength","getRandomValues","crypto","bind","msCrypto","convertErrorToJson","err","jsonObj","getOwnPropertyNames","forEach","key","getOwnPropertyDescriptor","_","isOnline","nav","navigator","onLine","addConnectionEventListeners","cb","addEventListener","removeConnectionEventListeners","removeEventListener","axiosParamsSerializer","params","newParams","encodeURIComponent","JSON","stringify","join","formatMessage","message","__html","html","pinned_at","Date","created_at","updated_at","deleted_at","status","reaction_groups","maybeGetReactionGroupsFallback","reaction_counts","reaction_scores","findIndexInSortedArray","needle","sortedArray","selectKey","selectValueToCompare","sortDirection","left","right","middle","recalculateMiddle","round","comparableNeedle","comparableMiddle","needleKey","step","addToMessageList","messages","newMessage","timestampChanged","sortBy","addIfDoesNotExist","addMessageToList","newMessages","filter","concat","messageTime","getTime","messageIsNewest","at","insertionIndex","splice","groups","counts","scores","fallback","keys","count","sum_scores","throttle","fn","timeout","leading","trailing","runningTimeout","storedArgs","args","timeoutHandler","binarySearchByDateEqualOrNearestGreater","array","targetDate","mid","midCreatedAt","midDate","messagePaginationCreatedAtAround","parentSet","requestedPageSize","returnedPage","messagePaginationOptions","newPagination","pagination","created_at_around","hasPrev","hasNext","updateHasPrev","updateHasNext","createdAtAroundDate","slice","firstPageMsg","lastPageMsg","wholePageHasNewerMessages","wholePageHasOlderMessages","requestedPageSizeNotMet","noMoreMessages","firstPageMsgIsFirstInSet","lastPageMsgIsLastInSet","midPointByCount","midPointByCreationDate","messagePaginationIdAround","id_around","midPoint","targetMsg","halves","find","messagePaginationLinear","queriedNextMessages","created_at_after_or_equal","created_at_after","id_gt","id_gte","queriedPrevMessages","created_at_before_or_equal","created_at_before","id_lt","id_lte","offset","containsUnrecognizedOptionsOnly","hasMore","returnedPageIsEmpty","messageSetPagination","logger","DEFAULT_QUERY_CHANNELS_MESSAGE_LIST_PAGE_SIZE","DEFAULT_QUERY_CHANNEL_MESSAGE_LIST_PAGE_SIZE","DEFAULT_MESSAGE_SET_PAGINATION","ChannelState","channel","isUpToDate","msgArray","msg","removed","_updateUserMessages","messageSets","set","parentId","threads","pinnedMessages","hardDelete","_deleteUserMessages","cid","latest_reactions","mentioned_users","own_reactions","parent_id","reply_count","thread_participants","_channel","watcher_count","typing","read","initMessages","pending_messages","mutedUsers","watchers","members","membership","unreadCount","last_message_at","state","isCurrent","index","findIndex","isLatest","messageSetToAddToIfDoesNotExist","addMessagesSorted","initializing","findTargetMessageSet","messagesToAdd","targetMessageSetIndex","isFromShadowBannedUser","shadowed","isMessageFormatted","getClient","updateUserReference","parentID","show_in_channel","_addToMessageList","thread","messageSet","addPinnedMessage","pinnedMessage","removeMessageFromArray","reaction","enforce_unique","messageWithReaction","_updateMessage","_addOwnReactionToMessage","ownReactions","_removeOwnReactionFromMessage","userID","user_id","remove","parseMessage","toISOString","update","updatedMessages","reduce","acc","quoted_message_id","quoted_message","attachments","_updateQuotedMessageReferences","updateFunc","pinned","msgIndex","messageSetIndex","findMessageSetIndex","messageToRemove","isRemoved","threadMessages","filteredMessages","latestMessages","now","lastEvent","receivedAt","received_at","dispatchEvent","messageId","parentMessageId","limit","switchedToMessageSet","loadedMessageThread","messageIdToFind","switchToMessageSet","query","getReplies","currentMessages","messages1","messages2","some","m1","m2","overlappingMessageSetIndices","areMessageSetsOverlap","mergeTargetMessageSetIndex","mergeSourceMessageSetIndices","target","sources","indexOf","overlappingMessageSetIndex","Channel","defaultOptions","watch","presence","event","listeners","all","listener","baseURL","validTypeRe","validIDRe","test","_client","_data","initialized","offlineMode","lastTypingEvent","isTyping","disconnected","configs","post","_channelURL","sendFile","url","delete","_checkInitialized","next","payload","filter_conditions","message_filter_conditions","wsPromise","get","filterConditions","updates","patch","messageID","reactionType","channelData","updateMessage","reserved","_update","areCapabilitiesChanged","own_capabilities","coolDownInterval","cooldown","accept_invite","reject_invite","add_members","add_moderators","assign_roles","invites","remove_members","demote_moderators","opts","channel_cid","cli","uid","partialUpdateMember","archived","resp","channel_member","_muteStatus","formData","message_id","form_data","_isTypingIndicatorsEnabled","diff","lastKeyStroke","sendEvent","ai_state","getConfig","typing_events","typing_indicators","enabled","messageSlice","read_events","_isUsingServerAuth","resolve","stopTyping","clean","_hasConnectionID","combined","tags","response","normalizedSort","messageIds","ids","last_read","silent","userMuteStatus","includes","muteStatus","muted","lastRead","_countMessageAsUnread","queryURL","membersStr","member","tempChannelCid","activeChannels","_cacheEnabled","_addChannelConfig","_initializeState","polls","hydratePollCache","queriedChannels","channels","isLatestMessageSet","targetUserID","banUser","userId","clearHistory","clear_history","unbanUser","shadowBan","removeShadowBan","pollId","vote","castPollVote","voteId","removePollVote","callbackOrString","callbackOrNothing","unsubscribe","el","channelState","last_read_message_id","unread_messages","_extendEventWithOwnReactions","hard_delete","removeMessage","addMessageSorted","removeQuotedMessageReferences","removePinnedMessage","ownMessage","isThreadMessage","preventUnreadCountUpdate","truncated_at","truncatedAt","createdAt","clearMessages","newMembers","first_unread_message_id","last_read_at","isFrozenChanged","frozen","hidden","addReaction","removeReaction","shadow_banned","shadow","banned","clientState","_hydrateMembers","addPinnedMessages","pinned_messages","watcher","findMessage","overrideCurrentState","newMembersById","membersById","setIsUpToDate","ClientState","users","userChannelReferences","updateUser","channelID","InsightMetrics","connectionStartTimestamp","wsTotalFailures","wsConsecutiveFailures","instanceClientId","postInsights","insightType","insights","maxAttempts","axios","buildWsFatalInsight","connection","buildWsBaseInsight","ready_state","ws","readyState","_buildUrl","api_key","start_ts","insightMetrics","end_ts","auth_type","getAuthType","token","tokenManager","user_details","_user","device","client_id","connectionID","ws_details","ws_consecutive_failures","ws_total_failures","request_id","requestID","online","user_agent","userAgent","instance_client_id","buildWsSuccessAfterFailureInsight","isCloseEvent","code","isErrorEvent","StableWSConnection","qs","_buildWSPayload","getToken","wsBaseURL","getUserAgent","_log","_setHealth","isHealthy","_reconnect","interval","wsID","parse","isResolved","rejectPromise","_errorFromWSEvent","resolvePromise","scheduleNextPing","handleEvent","scheduleConnectionCheck","reason","wasClean","consecutiveFailures","totalFailures","isConnecting","healthy","isWSFailure","statusCode","StatusCode","connectionOpen","reject","healthCheckTimeoutRef","clearTimeout","clientID","send","pingInterval","connectionCheckTimeoutRef","connectionCheckTimeout","isDisconnected","onlineStatusChanged","extra","level","_connect","healthCheck","isStatic","refreshToken","_waitForHealthy","race","clearInterval","removeAllListeners","isClosedPromise","close","OPEN","onclose","enableWSFallback","isTokenReady","tokenReady","loadToken","_setupConnectionPromise","wsURL","WebSocket","onopen","onerror","onmessage","connection_id","enableInsights","_destroyCurrentWSConnection","recoverState","JWTUserToken","apiSecret","extraData","jwtOptions","TypeError","algorithm","noTimestamp","JWTServerToken","server","jwt","sign","UserFromToken","fragments","b64Payload","DevToken","CheckSignature","secret","signature","Buffer","from","hash","createHmac","digest","timingSafeEqual","TokenManager","tokenOrProvider","validateToken","tokenProvider","loadTokenPromise","anon","tokenUserId","APIErrorCodes","retryable","isAPIError","isErrorRetryable","isConnectionIDError","isErrorResponse","ConnectionState","WSConnectionFallback","_setState","Closed","cancelToken","cancel","connect","config","retry","CancelToken","source","doAxiosRequest","replace","_req","Connected","events","isCancel","Disconnected","reconnect","Connecting","json","_poll","_onlineStatusChanged","Init","Segment","all_sender_channels","all_users","createSegment","verifySegmentId","getSegment","updateSegment","targets","addSegmentTargets","removeSegmentTargets","deleteSegment","targetId","segmentTargetExists","querySegmentTargets","ErrorFromResponse","VotingVisibility","isPatch","StateStore","Set","newValueOrPatch","newValue","oldValue","handlerSet","handler","partial","current","add","selector","selectedValues","wrappedHandler","nextValue","newlySelectedValues","hasUpdatedValues","logCount","oldSelectedValues","subscribe","DEFAULT_PAGE_LIMIT","DEFAULT_SORT","MARK_AS_READ_THROTTLE_TIMEOUT","THREAD_RESPONSE_RESERVED_KEYS","created_by_user_id","parent_message_id","title","latest_replies","active_participant_count","participant_count","created_by","parent_message","constructCustomDataObject","threadData","custom","customKey","Thread","Map","partialNext","active","getLatestValue","isLoading","getThread","hydrateState","replyCount","replies","parentMessage","participants","deletedAt","updatedAt","pendingReplies","failedRepliesMap","values","isStateStale","unsubscribeFunctions","size","subscribeThreadUpdated","subscribeMarkActiveThreadRead","subscribeReloadActiveStaleThread","subscribeMarkThreadStale","subscribeNewReplies","subscribeRepliesRead","subscribeMessageDeleted","subscribeMessageUpdated","on","subscribeWithSelector","unreadMessageCount","ownUnreadCountSelector","throttledMarkAsRead","reload","isOwnMessage","upsertReplyLocally","nextRead","userRead","nextUserRead","lastReadAt","lastReadMessageId","deleteReplyLocally","updateParentMessageLocally","eventTypes","eventType","updateParentMessageOrReplyLocally","cleanupFunction","clear","reply","updatedReplies","formattedMessage","has","force","ownUnreadCount","markRead","thread_id","markAsRead","otherOptions","loadPage","loadingKey","cursorKey","insertionMethodKey","queryOptions","abs","queryReplies","maybeNextCursor","nextReplies","placeholderReadResponse","repliesPaginationFromInitialThread","formatReadState","latestRepliesContainsAllReplies","nextCursor","prevCursor","isLoadingNext","isLoadingPrev","currentUserId","MODERATION_ENTITY_TYPES","Moderation","flaggedUserID","flag","entityType","entityId","entityCreatorID","entity_type","entity_id","entity_creator_id","targetID","target_ids","actionType","itemID","action_type","item_id","entityID","moderationPayload","configKey","moderation_payload","config_key","flags","addCustomFlags","DEFAULT_CONNECTION_RECOVERY_THROTTLE_DURATION","MAX_QUERY_THREADS_LIMIT","THREAD_MANAGER_INITIAL_STATE","isThreadOrderStale","unreadThreadCount","unseenThreadIds","lastConnectionDropAt","ready","ThreadManager","subscribeUnreadThreadsCountChange","subscribeManageThreadSubscriptions","subscribeReloadOnActivation","subscribeRecoverAfterConnectionDrop","subscribeChannelDeleted","me","newThreads","prev","nextThreads","prevThreads","removedThreads","threadsById","registerSubscriptions","unregisterSubscriptions","unsubscribeConnectionDropped","throttledHandleConnectionRecovered","unsubscribeConnectionRecovered","queryThreads","currentThreads","incomingThread","existingThread","hasStaleState","participant_limit","reply_limit","threadsByIdGetterCache","newThreadsById","isPollUpdatedEvent","isPollClosedEventEvent","isPollVoteCastedEvent","isPollVoteChangedEvent","isPollVoteRemovedEvent","isVoteAnswer","answer_text","Poll","poll","own_votes","pollResponseForState","voteOrAnswer","ownAnswer","ownVotes","lastActivityAt","maxVotedOptionIds","getMaxVotedOptionIds","vote_counts_by_option","ownVotesByOptionId","getOwnVotesByOptionId","getInitialStateFromPollResponse","extractPollData","pollData","is_closed","currentState","isOwnVote","poll_vote","latestAnswers","latest_answers","option_id","pollEnrichData","extractPollEnrichedData","answer","enforce_unique_votes","optionId","getPoll","updatePoll","partialPollObject","partialUpdatePoll","closePoll","deletePoll","option","createPollOption","updatePollOption","deletePollOption","max_votes_allowed","reachedVoteLimit","oldestVote","removeVote","answerText","addPollAnswer","answerId","queryPollAnswers","queryPollVotes","voteCountsByOption","maxVotes","winningOptions","pollResponse","allow_answers","allow_user_suggested_options","enforce_unique_vote","voting_visibility","answers_count","latest_votes_by_option","vote_count","PollManager","pollCache","subscribeMessageNew","subscribePollUpdated","subscribePollClosed","subscribeVoteCasted","subscribeVoteChanged","subscribeVoteRemoved","createPoll","createdPoll","cachedPoll","fromState","setOrOverwriteInCache","queryPolls","pollInstances","overwriteState","pollFromCache","reinitializeState","handlePollUpdated","handlePollClosed","handleVoteCasted","handleVoteChanged","handleVoteRemoved","StreamChat","secretOrOptions","wsConnection","wsFallback","Boolean","_getConnectionID","userTokenOrProvider","setUserPromise","node","allowServerSideConnect","anonymous","setTokenPromise","_setToken","_setUser","openConnection","persistUserOnConnectionFailure","closeConnection","disconnectUser","connectUser","setTokenOrProvider","cleaningIntervalRef","disconnect","_startCleaning","before","closePromise","_disconnect","resetState","reset","anonymousUser","_setupConnection","connectAnonymousUser","requestConfig","_enrichAxiosOptions","_logApiRequest","axiosInstance","postForm","put","_logApiResponse","handleResponse","client_request_id","headers","_logApiError","postListenerCallbacks","_handleClientEvent","_handleChannelEvent","_callClientListeners","_callChannelListeners","messageEvent","jsonString","refMap","_updateMemberWatcherReferences","updateUserMessages","deleteUserMessages","_updateUserMessageReferences","mark_messages_deleted","_deleteUserMessageReference","cids","recoverStateOnReconnect","queryChannels","$in","channelType","tempCid","membersStrInExistingChannel","upsertUsers","upsertUser","unblockMessage","markChannelsRead","disableCache","mutedChannels","moderation","inputOptions","browser","withCredentials","warmUp","httpsAgent","https","Agent","keepAlive","keepAliveMsecs","create","setBaseURL","process","env","STREAM_LOCAL_TEST_RUN","STREAM_LOCAL_TEST_HOST","defaultWSTimeoutWithFallback","defaultWSTimeout","defaults","paramsSerializer","apn_config","p12_cert","updateAppSettings","revoke_tokens_issued_before","_normalizeDate","revokeUsersToken","userIDs","partialUpdateUsers","apnTemplate","apn_template","firebaseTemplate","firebase_template","firebaseDataTemplate","firebase_data_template","skipDevices","skip_devices","pushProviderName","push_provider_name","pushProviderType","push_provider_type","last_active","guestUser","access_token","exp","iat","getHeaders","maxContentLength","Infinity","maxBodyLength","errorFromResponse","_handleUserEvent","activeChannelKeys","activeChannelKey","deleteAllChannelReference","mute","expires","expiresAt","_sayHi","setClient","mode","updateUsers","stateOptions","hydrateActiveChannels","channelsFromApi","queryChannelsOptions","skipInitialization","updatedMessagesSet","message_limit","push_provider","preferences","serverSide","web","android","ios","endpoints","server_side","channelIDOrCustom","getChannelByMembers","getChannelById","partialUserObject","userMap","userObject","target_user_id","blockedUserID","blocked_user_id","target_id","currentUserID","targetMessageID","target_message_id","callID","reviewResult","review_result","commands","language","text","destination_language","source_language","timeoutOrExpirationDate","pinExpires","setSeconds","getSeconds","messageOrMessageId","errorText","pinnedBy","pinnedAt","_validateAndGetMessageId","partialUpdateMessage","pin_expires","_normalizeExpiration","clonedMessage","reservedMessageFields","mu","partialMessageObject","hard","undeleted_by","optionsWithDefaults","partialThreadObject","reservedThreadFields","unset","_getToken","authorization","Authorization","signal","nextRequestAbortController","axiosRequestConfig","axiosRequestConfigParams","axiosRequestConfigHeaders","axiosRequestConfigRest","that","setInterval","requestBody","xSignature","permissionData","channel_cids","last_sync_at","blockList","request","exportChannels","idOrData","validateServerSideAuth","segmentId","scheduled_for","scheduledFor","stop_at","stopAt","conversations","filename","path","pushProvider","AbortController","q","is_answer","message_ids","reviewed_by","_instance","EVENT_MAP","Allow","Deny","AnyResource","AnyRole","MaxPriority","MinPriority","Permission","priority","resources","owner","action","AllowAll","DenyAll","BuiltinRoles","Admin","Anonymous","ChannelMember","ChannelModerator","Guest","User","BuiltinPermissions","AddLinks","BanUser","CreateChannel","CreateMessage","CreateReaction","DeleteAnyAttachment","DeleteAnyChannel","DeleteAnyMessage","DeleteAnyReaction","DeleteOwnAttachment","DeleteOwnChannel","DeleteOwnMessage","DeleteOwnReaction","ReadAnyChannel","ReadOwnChannel","RunMessageAction","UpdateAnyChannel","UpdateAnyMessage","UpdateMembersAnyChannel","UpdateMembersOwnChannel","UpdateOwnChannel","UpdateOwnMessage","UploadAttachment","UseFrozenChannel"],"mappings":"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"}
|