stream-chat 8.0.0-dev.0 → 8.0.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 +1 -1
- 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 +1 -1
- package/dist/browser.js.map +1 -1
- package/dist/index.es.js +1 -1
- package/dist/index.es.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/base64.ts","../src/channel_state.ts","../src/utils.ts","../src/channel.ts","../src/client_state.ts","../src/insights.ts","../src/connection.ts","../src/signing.ts","../src/token_manager.ts","../src/errors.ts","../src/connection_fallback.ts","../src/types.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 { Channel } from './channel';\nimport {\n ChannelMemberResponse,\n ChannelMembership,\n FormatMessageResponse,\n Event,\n ExtendableGenerics,\n DefaultGenerics,\n MessageSetType,\n MessageResponse,\n ReactionResponse,\n UserResponse,\n PendingMessageResponse,\n} from './types';\n\ntype ChannelReadStatus<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = Record<\n string,\n { last_read: Date; unread_messages: number; user: UserResponse<StreamChatGenerics> }\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: ChannelMembership<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: {\n isCurrent: boolean;\n isLatest: boolean;\n messages: Array<ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>>;\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 /**\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 * formatMessage - Takes the message object. Parses the dates, sets __html\n * and sets the status to received if missing. Returns a message object\n *\n * @param {MessageResponse<StreamChatGenerics>} message a message object\n *\n */\n formatMessage(message: MessageResponse<StreamChatGenerics>): FormatMessageResponse<StreamChatGenerics> {\n return {\n ...message,\n /**\n * @deprecated please use `html`\n */\n __html: message.html,\n // parse the date..\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 status: message.status || 'received',\n };\n }\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 const threadMessages = this._addToMessageList(\n thread,\n message,\n timestampChanged,\n 'created_at',\n addIfDoesNotExist,\n );\n this.threads[parentID] = threadMessages;\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 removeQuotedMessageReferences(message: MessageResponse<StreamChatGenerics>) {\n const parseMessage = (m: ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>) =>\n (({\n ...m,\n created_at: m.created_at.toString(),\n pinned_at: m.pinned_at?.toString(),\n updated_at: m.updated_at?.toString(),\n } as unknown) as MessageResponse<StreamChatGenerics>);\n\n this.messageSets.forEach((set) => {\n const updatedMessages = set.messages\n .filter((msg) => msg.quoted_message_id === message.id)\n .map(parseMessage)\n .map((msg) => ({ ...msg, quoted_message: { ...message, attachments: [] } }));\n\n this.addMessagesSorted(updatedMessages, true);\n });\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 const addMessageToList = addIfDoesNotExist || timestampChanged;\n let messageArr = 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 messageArr = messageArr.filter((msg) => !(msg.id && message.id === msg.id));\n }\n\n // Get array length after filtering\n const messageArrayLength = messageArr.length;\n\n // for empty list just concat and return unless it's an update or deletion\n if (messageArrayLength === 0 && addMessageToList) {\n return messageArr.concat(message);\n } else if (messageArrayLength === 0) {\n return [...messageArr];\n }\n\n const messageTime = (message[sortBy] as Date).getTime();\n const messageIsNewest = (messageArr[messageArrayLength - 1][sortBy] as Date).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 messageArr.concat(message);\n } else if (messageIsNewest) {\n return [...messageArr];\n }\n\n // find the closest index to push the new message\n let left = 0;\n let middle = 0;\n let right = messageArrayLength - 1;\n while (left <= right) {\n middle = Math.floor((right + left) / 2);\n if ((messageArr[middle][sortBy] as Date).getTime() <= messageTime) left = middle + 1;\n else right = middle - 1;\n }\n\n // message already exists and not filtered due to timestampChanged, update and return\n if (!timestampChanged && message.id) {\n if (messageArr[left] && message.id === messageArr[left].id) {\n messageArr[left] = message;\n return [...messageArr];\n }\n\n if (messageArr[left - 1] && message.id === messageArr[left - 1].id) {\n messageArr[left - 1] = message;\n return [...messageArr];\n }\n }\n\n // Do not add updated or deleted messages to the list if they do not already exist\n // or have a timestamp change.\n if (addMessageToList) {\n messageArr.splice(left, 0, message);\n }\n return [...messageArr];\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,\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 }];\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 */\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({ messages: [], isCurrent: false, isLatest: false });\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 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 FormData from 'form-data';\nimport { AscDesc, ExtendableGenerics, DefaultGenerics, OwnUserBase, OwnUserResponse, UserResponse } from './types';\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 invisible: 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","import { ChannelState } from './channel_state';\nimport { logChatPromiseExecution, 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 MemberSort,\n Message,\n MessageFilters,\n MessagePaginationOptions,\n MessageResponse,\n MessageSetType,\n MuteChannelAPIResponse,\n PartialUpdateChannel,\n PartialUpdateChannelAPIResponse,\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 UserFilters,\n UserResponse,\n QueryChannelAPIResponse,\n} from './types';\nimport { Role } from './permissions';\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] Make this message pending\n * @param {Record<string,string>} [options.pending_message_metadata] Metadata for the pending message\n *\n * @return {Promise<SendMessageAPIResponse<StreamChatGenerics>>} The Server Response\n */\n async sendMessage(\n message: Message<StreamChatGenerics>,\n options?: {\n is_pending_message?: boolean;\n pending_message_metadata?: Record<string, string>;\n skip_enrich_url?: boolean;\n skip_push?: boolean;\n },\n ) {\n const sendMessageResponse = await this.getClient().post<SendMessageAPIResponse<StreamChatGenerics>>(\n this._channelURL() + '/message',\n {\n message,\n ...options,\n },\n );\n\n // Reset unreadCount to 0.\n this.state.unreadCount = 0;\n\n return sendMessageResponse;\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 query?: string;\n } = {},\n ) {\n if (options.offset && (options.sort || options.next)) {\n throw Error(`Cannot specify offset with sort or next parameters`);\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 {UserFilters<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: UserFilters<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 * 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/${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 = this.getClient().baseURL + `/messages/${messageID}/reaction/${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 this.data = data.channel;\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 {{user_id: string, channel_role?: Role}[]} 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[] | { user_id: string; channel_role?: Role }[],\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 {{user_id: string, channel_role?: Role}[]} 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: { user_id: string; channel_role?: Role }[] | string[],\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 * 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/${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) {\n if (!this.getConfig()?.typing_events) {\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 } as Event<StreamChatGenerics>);\n }\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) {\n if (!this.getConfig()?.typing_events) {\n return;\n }\n this.lastTypingEvent = null;\n this.isTyping = false;\n await this.sendEvent({\n type: 'typing.stop',\n parent_id,\n } as Event<StreamChatGenerics>);\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() {\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) {\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 * 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 * @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 ) {\n const data = await this.getClient().get<GetRepliesAPIResponse<StreamChatGenerics>>(\n this.getClient().baseURL + `/messages/${parent_id}/replies`,\n {\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.getClient().baseURL + `/channels/${this.type}/${this.id}/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/${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 this._checkInitialized();\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 if (message.type === 'system') 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 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 create = async () => {\n const options = {\n watch: false,\n state: false,\n presence: false,\n };\n return await this.query(options, '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/${this.type}`;\n if (this.id) {\n queryURL += `/${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)) {\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\n this.data = state.channel;\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 * 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) {\n channelState.read[event.user.id] = {\n // because in client.ts the handleEvent call that flows to this sets this `event.received_at = new Date();`\n last_read: event.received_at as Date,\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 if (ownMessage && event.user?.id) {\n channelState.unreadCount = 0;\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 if (this._countMessageAsUnread(event.message)) {\n channelState.unreadCount = channelState.unreadCount + 1;\n }\n }\n break;\n case 'message.updated':\n if (event.message) {\n this._extendEventWithOwnReactions(event);\n channelState.addMessageSorted(event.message, false, false);\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_id) {\n channelState.members[event.member.user_id] = event.member;\n }\n break;\n case 'member.removed':\n if (event.user?.id) {\n delete channelState.members[event.user.id];\n }\n break;\n case 'channel.updated':\n if (event.channel) {\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 if (event.clear_history) {\n channelState.clearMessages();\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/${this.type}/${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 Users\n if (state.members) {\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 this.state.watcher_count = state.watcher_count || 0;\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 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 if (state.members) {\n this.state.members = state.members.reduce((acc, member) => {\n if (member.user) {\n acc[member.user.id] = member;\n }\n return acc;\n }, {} as ChannelState<StreamChatGenerics>['members']);\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 _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';\n\n/**\n * ClientState - A container class for the client state.\n */\nexport class ClientState<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> {\n users: {\n [key: string]: UserResponse<StreamChatGenerics>;\n };\n userChannelReferences: { [key: string]: { [key: string]: boolean } };\n constructor() {\n // show the status for a certain user...\n // ie online, offline etc\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) {\n this.users[user.id] = user;\n }\n }\n\n updateUserReference(user: UserResponse<StreamChatGenerics>, channelID: string) {\n if (user == null) {\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","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} 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, secret: string, signature: string) {\n const key = Buffer.from(secret, 'ascii');\n const hash = crypto.createHmac('sha256', key).update(body).digest('hex');\n return hash === signature;\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.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 { 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 messageType: 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 messageType: 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 AppSettingsAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n app?: {\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 max_message_length?: number;\n message_retention?: string;\n mutes?: boolean;\n name?: string;\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 disable_auth_checks?: boolean;\n disable_permissions_checks?: boolean;\n enforce_unique_usernames?: 'no' | 'app' | 'team';\n file_upload_config?: FileUploadConfig;\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 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 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 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 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 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?: ChannelMembership<StreamChatGenerics> | null;\n pending_messages?: PendingMessageResponse<StreamChatGenerics>[];\n read?: ReadResponse<StreamChatGenerics>[];\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 ChannelMemberResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\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 role?: string;\n shadow_banned?: boolean;\n updated_at?: string;\n user?: UserResponse<StreamChatGenerics>;\n user_id?: string;\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 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};\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};\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 messageType: {};\n reactionType: StreamChatGenerics['reactionType'];\n userType: StreamChatGenerics['userType'];\n }>,\n 'created_at' | 'pinned_at' | 'updated_at' | 'status'\n> &\n StreamChatGenerics['messageType'] & {\n created_at: Date;\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\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 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 channel?: ChannelResponse<StreamChatGenerics>;\n cid?: string;\n command?: string;\n command_info?: { name?: string };\n created_at?: string;\n deleted_at?: string;\n i18n?: RequireAtLeastOne<Record<`${TranslationLanguages}_text`, string>> & {\n language: TranslationLanguages;\n };\n latest_reactions?: ReactionResponse<StreamChatGenerics>[];\n mentioned_users?: UserResponse<StreamChatGenerics>[];\n own_reactions?: ReactionResponse<StreamChatGenerics>[] | null;\n pin_expires?: string | null;\n pinned_at?: string | null;\n pinned_by?: UserResponse<StreamChatGenerics> | null;\n reaction_counts?: { [key: string]: number } | null;\n reaction_scores?: { [key: string]: number } | null;\n reply_count?: number;\n shadowed?: boolean;\n silent?: boolean;\n status?: string;\n thread_participants?: UserResponse<StreamChatGenerics>[];\n updated_at?: 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 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 invisible?: boolean;\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 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 created_at?: string;\n deactivated_at?: string;\n deleted_at?: string;\n language?: TranslationLanguages | '';\n last_active?: string;\n online?: boolean;\n push_notifications?: PushNotificationSettings;\n revoke_tokens_issued_before?: string;\n shadow_banned?: boolean;\n updated_at?: string;\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\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 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 max_message_length?: number;\n message_retention?: string;\n mutes?: boolean;\n name?: string;\n permissions?: PermissionObject[];\n push_notifications?: boolean;\n quotes?: boolean;\n reactions?: boolean;\n read_events?: boolean;\n reminders?: boolean;\n replies?: boolean;\n search?: 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\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 message_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;\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 limit?: number;\n offset?: number;\n user_id_gt?: string;\n user_id_gte?: string;\n user_id_lt?: string;\n user_id_lte?: string;\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 /**\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 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 // Set the instance of StableWSConnection on chat client. Its purely for testing purpose and should\n // not be used in production apps.\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 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 channel?: ChannelResponse<StreamChatGenerics>;\n channel_id?: string;\n channel_type?: string;\n cid?: string;\n clear_history?: boolean;\n connection_id?: string;\n created_at?: string;\n hard_delete?: boolean;\n mark_messages_deleted?: boolean;\n me?: OwnUserResponse<StreamChatGenerics>;\n member?: ChannelMemberResponse<StreamChatGenerics>;\n message?: MessageResponse<StreamChatGenerics>;\n mode?: string;\n online?: boolean;\n parent_id?: string;\n queriedChannels?: {\n channels: ChannelAPIResponse<StreamChatGenerics>[];\n isLatestMessageSet?: boolean;\n };\n reaction?: ReactionResponse<StreamChatGenerics>;\n received_at?: string | Date;\n team?: string;\n total_unread_count?: number;\n unread_channels?: number;\n unread_count?: 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 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 messageType: StreamChatGenerics['messageType'];\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 messageType: StreamChatGenerics['messageType'];\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 messageType: StreamChatGenerics['messageType'];\n reactionType: StreamChatGenerics['reactionType'];\n userType: StreamChatGenerics['userType'];\n }>[Key]\n >;\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 messageType: {};\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 messageType: {};\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 messageType: {};\n reactionType: StreamChatGenerics['reactionType'];\n userType: StreamChatGenerics['userType'];\n }>[Key]\n >;\n }\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 $ne?: PrimitiveFilter<ObjectType>;\n $nin?: PrimitiveFilter<ObjectType>[];\n }\n : {\n $eq?: PrimitiveFilter<ObjectType>;\n $exists?: boolean;\n $in?: PrimitiveFilter<ObjectType>[];\n $ne?: PrimitiveFilter<ObjectType>;\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 teams?:\n | RequireOnlyOne<{\n $contains?: PrimitiveFilter<string>;\n $eq?: 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 messageType: StreamChatGenerics['messageType'];\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 messageType: StreamChatGenerics['messageType'];\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 messageType: StreamChatGenerics['messageType'];\n reactionType: StreamChatGenerics['reactionType'];\n userType: {};\n }>[Key]\n >;\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 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 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' | 'name'>>\n | Array<Sort<Pick<UserResponse<StreamChatGenerics>, 'id' | 'created_at' | 'name'>>>;\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\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 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 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 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 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};\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};\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 max_message_length?: number;\n message_retention?: string;\n mutes?: boolean;\n name?: string;\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 members?: string[];\n name?: string;\n};\n\nexport type ChannelMembership<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n banned?: boolean;\n channel_role?: Role;\n created_at?: string;\n is_moderator?: boolean;\n role?: string;\n shadow_banned?: boolean;\n updated_at?: string;\n user?: UserResponse<StreamChatGenerics>;\n};\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\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_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};\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};\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 quoted_message_id?: string;\n show_in_channel?: 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 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 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 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 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 | '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';\n\n/*\n DeleteUserOptions specifies a collection of one or more `user_ids` to be deleted.\n\n `user` soft|hard determines if the user needs to be hard- or soft-deleted, where hard-delete\n implies that all related objects (messages, flags, etc) will be hard-deleted as well.\n `conversations` soft|hard will delete any 1to1 channels that the user was a member of.\n `messages` soft-hard will delete any messages that the user has sent.\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 user: DeleteType;\n conversations?: DeleteType;\n messages?: DeleteType;\n new_channel_owner_id?: string;\n};\n\nexport type SegmentData = {\n description: string;\n filter: {};\n name: string;\n type: 'channel' | 'user';\n};\n\nexport type Segment = {\n created_at: string;\n id: string;\n in_use: boolean;\n size: number;\n status: 'computing' | 'ready';\n updated_at: string;\n} & SegmentData;\n\nexport type CampaignSortField = {\n field: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value: any;\n};\n\nexport type CampaignSort = {\n fields: CampaignSortField[];\n direction?: 'asc' | 'desc';\n};\n\nexport type CampaignQueryOptions = {\n limit?: number;\n sort?: CampaignSort;\n};\n\nexport type SegmentQueryOptions = CampaignQueryOptions;\nexport type RecipientQueryOptions = CampaignQueryOptions;\n\n// TODO: add better typing\nexport type SegmentFilters = {};\nexport type CampaignFilters = {};\nexport type RecipientFilters = {};\n\nexport type CampaignData = {\n attachments: Attachment[];\n channel_type: string;\n defaults: Record<string, string>;\n name: string;\n segment_id: string;\n text: string;\n description?: string;\n sender_id?: string;\n};\n\nexport type CampaignStatusName = 'draft' | 'stopped' | 'scheduled' | 'completed' | 'failed' | 'in_progress';\n\nexport type CampaignStatus = {\n status: CampaignStatusName;\n completed_at?: string;\n errored_messages?: number;\n failed_at?: string;\n resumed_at?: string;\n scheduled_at?: string;\n scheduled_for?: string;\n sent_messages?: number;\n stopped_at?: string;\n task_id?: string;\n};\n\nexport type Campaign = {\n created_at: string;\n id: string;\n updated_at: string;\n} & CampaignData &\n CampaignStatus;\n\nexport type TestCampaignResponse = {\n status: CampaignStatusName;\n details?: string;\n results?: Record<string, string>;\n};\n\nexport type DeleteCampaignOptions = {\n recipients?: boolean;\n};\n\nexport type Recipient = {\n campaign_id: string;\n channel_cid: string;\n created_at: string;\n status: 'pending' | 'sent' | 'failed';\n updated_at: string;\n details?: string;\n message_id?: string;\n receiver_id?: string;\n};\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';\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","/* 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 { isErrorResponse, isWSFailure } from './errors';\nimport {\n addFileToFormData,\n chatCodes,\n isFunction,\n isOnline,\n isOwnUserBaseProperty,\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 Campaign,\n CampaignData,\n CampaignFilters,\n CampaignQueryOptions,\n ChannelAPIResponse,\n ChannelData,\n ChannelFilters,\n ChannelMute,\n ChannelOptions,\n ChannelResponse,\n ChannelSort,\n ChannelStateOptions,\n CheckPushResponse,\n CheckSQSResponse,\n Configs,\n ConnectAPIResponse,\n CreateChannelOptions,\n CreateChannelResponse,\n CreateCommandOptions,\n CreateCommandResponse,\n CreateImportOptions,\n CreateImportResponse,\n CreateImportURLResponse,\n CustomPermissionOptions,\n DefaultGenerics,\n DeleteCampaignOptions,\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 GetCallTokenResponse,\n GetChannelTypeResponse,\n GetCommandResponse,\n GetImportResponse,\n GetMessageAPIResponse,\n GetRateLimitsResponse,\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 PartialUserUpdate,\n PermissionAPIResponse,\n PermissionsAPIResponse,\n PushProvider,\n PushProviderConfig,\n PushProviderID,\n PushProviderListResponse,\n PushProviderUpsertResponse,\n QueryChannelsAPIResponse,\n ReactionResponse,\n Recipient,\n RecipientFilters,\n RecipientQueryOptions,\n ReservedMessageFields,\n ReviewFlagReportOptions,\n ReviewFlagReportResponse,\n SearchAPIResponse,\n SearchMessageSortBase,\n SearchOptions,\n SearchPayload,\n Segment,\n SegmentData,\n SegmentFilters,\n SegmentQueryOptions,\n SendFileAPIResponse,\n StreamChatOptions,\n SyncOptions,\n SyncResponse,\n TaskResponse,\n TaskStatus,\n TestCampaignResponse,\n TestPushDataInput,\n TestSQSDataInput,\n TokenOrProvider,\n UnBanUserOptions,\n UpdateChannelOptions,\n UpdateChannelResponse,\n UpdateCommandOptions,\n UpdateCommandResponse,\n UpdatedMessage,\n UpdateMessageAPIResponse,\n UserCustomEvent,\n UserFilters,\n UserOptions,\n UserResponse,\n UserSort,\n} from './types';\nimport { InsightMetrics, postInsights } from './insights';\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 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 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>();\n // a list of channels to hide ws events from\n this.mutedChannels = [];\n this.mutedUsers = [];\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 ...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' && process.env.STREAM_LOCAL_TEST_RUN) {\n this.setBaseURL('http://localhost:3030');\n }\n\n if (typeof process !== 'undefined' && 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 // 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 = 6000;\n this.defaultWSTimeout = 15000;\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 }\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 Promise.resolve();\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: { ...apn_config, p12_cert: Buffer.from(apn_config.p12_cert).toString('base64') },\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({ revoke_tokens_issued_before: this._normalizeDate(before) });\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>>>{ revoke_tokens_issued_before: before },\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 * 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();\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 = { id: this.userID, anon: true } 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<APIResponse & { access_token: string; user: UserResponse<StreamChatGenerics> }>(\n this.baseURL + '/guest',\n { user },\n );\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`, { tags: ['event', 'client'] });\n this.listeners[key].push(callback);\n return {\n unsubscribe: () => {\n this.logger('info', `Removing listener for ${key} event`, { tags: ['event', 'client'] });\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`, { tags: ['event', 'client'] });\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 & { config?: AxiosRequestConfig & { maxBodyLength?: number } } = {},\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 '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);\n if (user != null) data.append('user', JSON.stringify(user));\n\n return this.doAxiosRequest<SendFileAPIResponse>('post', 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 and watchers 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 /** search the members and watchers and update as needed... */\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 }\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 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 const state = channel.state;\n\n /** deleted the messages from this user. */\n state?.deleteUserMessages(user, hardDelete);\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 const currentMutedChannelIds: string[] = [];\n const nextMutedChannelIds: string[] = [];\n\n this.mutedChannels.forEach((mute) => mute.channel && currentMutedChannelIds.push(mute.channel.cid));\n event.me.channel_mutes.forEach((mute) => mute.channel && nextMutedChannelIds.push(mute.channel.cid));\n\n /** Set the unread count of un-muted channels to 0, which is the behaviour of backend */\n currentMutedChannelIds.forEach((cid) => {\n if (!nextMutedChannelIds.includes(cid) && this.activeChannels[cid]) {\n this.activeChannels[cid].state.unreadCount = 0;\n }\n });\n\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({ type: 'connection.recovered' } as Event<StreamChatGenerics>);\n } else {\n this.dispatchEvent({ type: 'connection.recovered' } 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>({ client: this });\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>({ client: this });\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', { api_key: this.key, err: e, client_request_id });\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}\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 = { state: true, watch: true, presence: false };\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);\n }\n\n hydrateActiveChannels(\n channelsFromApi: ChannelAPIResponse<StreamChatGenerics>[] = [],\n stateOptions: ChannelStateOptions = {},\n ) {\n const { skipInitialization, offlineMode = false } = stateOptions;\n\n for (const channelState of channelsFromApi) {\n this._addChannelConfig(channelState.channel);\n }\n\n const channels: Channel<StreamChatGenerics>[] = [];\n\n for (const channelState of channelsFromApi) {\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 if (skipInitialization === undefined) {\n c._initializeState(channelState, 'latest');\n } else if (!skipInitialization.includes(channelState.channel.id)) {\n c.state.clearMessages();\n c._initializeState(channelState, 'latest');\n }\n\n channels.push(c);\n }\n\n if (!offlineMode) {\n // If the channels are coming from server, then clear out the\n // previously help offline channels.\n for (const key in this.activeChannels) {\n const channel = this.activeChannels[key];\n if (channel.offlineMode) {\n delete this.activeChannels[key];\n }\n }\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.sort || options.next)) {\n throw Error(`Cannot specify offset with sort or next parameters`);\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 (this.wsConnection || this.wsFallback) {\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 * 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 this.configs[cid] = config;\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\", null, {options})\n // support channel(\"messaging\", undefined, {options})\n // support channel(\"messaging\", \"\", {options})\n if (channelIDOrCustom == null || channelIDOrCustom === '') {\n return new Channel<StreamChatGenerics>(this, channelType, undefined, custom);\n }\n\n // support channel(\"messaging\", {options})\n if (typeof channelIDOrCustom === 'object') {\n return this.getChannelByMembers(channelType, channelIDOrCustom);\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 this.activeChannels[tempCid] = channel;\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].disconnected) {\n const channel = this.activeChannels[cid];\n if (Object.keys(custom).length > 0) {\n channel.data = custom;\n channel._data = custom;\n }\n return channel;\n }\n const channel = new Channel<StreamChatGenerics>(this, channelType, channelID, custom);\n this.activeChannels[channel.cid] = channel;\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<APIResponse & { users: { [key: string]: UserResponse<StreamChatGenerics> } }>(\n this.baseURL + '/users',\n { users: userMap },\n );\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<APIResponse & { users: { [key: string]: UserResponse<StreamChatGenerics> } }>(\n this.baseURL + '/users',\n { users },\n );\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<APIResponse & { user: UserResponse<StreamChatGenerics> } & { task_id?: string }>(\n this.baseURL + `/users/${userID}`,\n params,\n );\n }\n\n async reactivateUser(\n userID: string,\n options?: { created_by_id?: string; name?: string; restore_messages?: boolean },\n ) {\n return await this.post<APIResponse & { user: UserResponse<StreamChatGenerics> }>(\n this.baseURL + `/users/${userID}/reactivate`,\n { ...options },\n );\n }\n\n async deactivateUser(userID: string, options?: { created_by_id?: string; mark_messages_deleted?: boolean }) {\n return await this.post<APIResponse & { user: UserResponse<StreamChatGenerics> }>(\n this.baseURL + `/users/${userID}/deactivate`,\n { ...options },\n );\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/${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\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: { 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: { 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/${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>>(this.baseURL + `/moderation/reports/${id}`, {\n review_result: reviewResult,\n ...options,\n });\n }\n\n /**\n * _unblockMessage - unblocks message blocked by automod\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} 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\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/${name}`);\n }\n\n updateCommand(name: string, data: UpdateCommandOptions<StreamChatGenerics>) {\n return this.put<UpdateCommandResponse<StreamChatGenerics>>(this.baseURL + `/commands/${name}`, data);\n }\n\n deleteCommand(name: string) {\n return this.delete<DeleteCommandResponse<StreamChatGenerics>>(this.baseURL + `/commands/${name}`);\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>>(this.baseURL + `/channeltypes/${channelType}`);\n }\n\n updateChannelType(channelType: string, data: UpdateChannelOptions<StreamChatGenerics>) {\n return this.put<UpdateChannelResponse<StreamChatGenerics>>(this.baseURL + `/channeltypes/${channelType}`, data);\n }\n\n deleteChannelType(channelType: string) {\n return this.delete<APIResponse>(this.baseURL + `/channeltypes/${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/${messageId}/translate`,\n { 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 ({ set: { pinned: false } } 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?: { skip_enrich_url?: boolean },\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 = { id: userId.id } 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>>(this.baseURL + `/messages/${message.id}`, {\n message: clonedMessage,\n ...options,\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?: { skip_enrich_url?: boolean },\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>>(this.baseURL + `/messages/${id}`, {\n ...partialMessageObject,\n ...options,\n user,\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/${messageID}`,\n params,\n );\n }\n\n async getMessage(messageID: string) {\n return await this.get<GetMessageAPIResponse<StreamChatGenerics>>(this.baseURL + `/messages/${messageID}`);\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 _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 return {\n params: {\n user_id: this.userID,\n connection_id: this._getConnectionID(),\n api_key: this.key,\n ...options.params,\n },\n headers: {\n ...authorization,\n 'stream-auth-type': this.getAuthType(),\n 'X-Stream-Client': this.getUserAgent(),\n ...options.headers,\n },\n ...(signal ? { signal } : {}),\n ...options.config,\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 verifyWebhook(requestBody: string, 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/${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`, { ...permissionData });\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/${id}`, { ...permissionData });\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/${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/${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/${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 }>(`${this.baseURL}/blocklists/${name}`);\n }\n\n updateBlockList(name: string, data: { words: string[] }) {\n return this.put<APIResponse>(`${this.baseURL}/blocklists/${name}`, data);\n }\n\n deleteBlockList(name: string) {\n return this.delete<APIResponse>(`${this.baseURL}/blocklists/${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>(`${this.baseURL}/export_channels/${id}`);\n }\n\n /**\n * createSegment - Creates a Campaign Segment\n *\n * @param {SegmentData} params Segment data\n *\n * @return {Segment} The Created Segment\n */\n async createSegment(params: SegmentData) {\n const { segment } = await this.post<{ segment: Segment }>(this.baseURL + `/segments`, { segment: params });\n return segment;\n }\n\n /**\n * querySegments - Query Campaign Segments\n *\n *\n * @return {Segment[]} Segments\n */\n async querySegments(filters: SegmentFilters, options: SegmentQueryOptions = {}) {\n return await this.get<{\n segments: Segment[];\n }>(this.baseURL + `/segments`, {\n payload: {\n filter_conditions: filters,\n ...options,\n },\n });\n }\n\n /**\n * updateSegment - Update a Campaign Segment\n *\n * @param {string} id Segment ID\n * @param {Partial<SegmentData>} params Segment data\n *\n * @return {Segment} Updated Segment\n */\n async updateSegment(id: string, params: Partial<SegmentData>) {\n const { segment } = await this.put<{ segment: Segment }>(this.baseURL + `/segments/${id}`, { segment: params });\n return segment;\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 return this.delete<APIResponse>(this.baseURL + `/segments/${id}`);\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 const { campaign } = await this.post<{ campaign: Campaign }>(this.baseURL + `/campaigns`, { campaign: params });\n return campaign;\n }\n\n /**\n * queryCampaigns - Query Campaigns\n *\n *\n * @return {Campaign[]} Campaigns\n */\n async queryCampaigns(filters: CampaignFilters, options: CampaignQueryOptions = {}) {\n return await this.get<{\n campaigns: Campaign[];\n segments: Record<string, Segment>;\n channels?: Record<string, ChannelResponse<StreamChatGenerics>>;\n users?: Record<string, UserResponse<StreamChatGenerics>>;\n }>(this.baseURL + `/campaigns`, {\n payload: {\n filter_conditions: filters,\n ...options,\n },\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 const { campaign } = await this.put<{ campaign: Campaign }>(this.baseURL + `/campaigns/${id}`, {\n campaign: params,\n });\n return campaign;\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, params: DeleteCampaignOptions = {}) {\n return this.delete<APIResponse>(this.baseURL + `/campaigns/${id}`, params);\n }\n\n /**\n * scheduleCampaign - Schedule a Campaign\n *\n * @param {string} id Campaign ID\n * @param {{scheduledFor: number}} params Schedule params\n *\n * @return {Campaign} Scheduled Campaign\n */\n async scheduleCampaign(id: string, params: { scheduledFor: number }) {\n const { scheduledFor } = params;\n const { campaign } = await this.patch<{ campaign: Campaign }>(this.baseURL + `/campaigns/${id}/schedule`, {\n scheduled_for: scheduledFor,\n });\n return campaign;\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 const { campaign } = await this.patch<{ campaign: Campaign }>(this.baseURL + `/campaigns/${id}/stop`);\n return campaign;\n }\n\n /**\n * resumeCampaign - Resume a Campaign\n *\n * @param {string} id Campaign ID\n *\n * @return {Campaign} Resumed Campaign\n */\n async resumeCampaign(id: string) {\n const { campaign } = await this.patch<{ campaign: Campaign }>(this.baseURL + `/campaigns/${id}/resume`);\n return campaign;\n }\n\n /**\n * testCampaign - Test a Campaign\n *\n * @param {string} id Campaign ID\n * @param {{users: string[]}} params Test params\n *\n * @return {TestCampaignResponse} Test campaign response\n */\n async testCampaign(id: string, params: { users: string[] }) {\n const { users } = params;\n return await this.post<APIResponse & TestCampaignResponse>(this.baseURL + `/campaigns/${id}/test`, { users });\n }\n\n /**\n * queryRecipients - Query Campaign Recipient Results\n *\n *\n * @return {Recipient[]} Recipients\n */\n async queryRecipients(filters: RecipientFilters, options: RecipientQueryOptions = {}) {\n return await this.get<{\n campaigns: Record<string, Campaign>;\n recipients: Recipient[];\n segments: Record<string, Segment>;\n channels?: Record<string, ChannelResponse<StreamChatGenerics>>;\n users?: Record<string, UserResponse<StreamChatGenerics>>;\n }>(this.baseURL + `/recipients`, {\n payload: {\n filter_conditions: filters,\n ...options,\n },\n });\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/${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 {APIResponse} A task ID\n */\n async deleteUsers(user_ids: string[], options: DeleteUserOptions) {\n if (options?.user !== 'soft' && options?.user !== 'hard') {\n throw new Error('Invalid delete user options. user must be one of [soft hard]');\n }\n if (options.messages !== undefined && options.messages !== 'soft' && options.messages !== 'hard') {\n throw new Error('Invalid delete user options. messages must be one of [soft hard]');\n }\n if (options.conversations !== undefined && options.conversations !== 'soft' && options.conversations !== 'hard') {\n throw new Error('Invalid delete user options. conversations must be one of [soft hard]');\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/${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>(this.baseURL + `/push_providers/${type}/${name}`);\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","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 '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.message_new': true,\n 'notification.mutes_updated': true,\n 'notification.removed_from_channel': true,\n 'reaction.deleted': true,\n 'reaction.new': true,\n 'reaction.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\n // local events\n 'channels.queried': true,\n 'connection.changed': true,\n 'connection.recovered': true,\n 'transport.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","ChannelState","channel","isUpToDate","msgArray","msg","result","filter","message","id","removed","user","_updateUserMessages","messages","m","messageSets","forEach","set","parentId","threads","pinnedMessages","hardDelete","_deleteUserMessages","cid","created_at","deleted_at","latest_reactions","mentioned_users","own_reactions","parent_id","reply_count","status","thread_participants","type","updated_at","_channel","watcher_count","typing","read","initMessages","pending_messages","mutedUsers","watchers","members","membership","unreadCount","last_message_at","state","Date","find","isCurrent","index","findIndex","isLatest","newMessage","timestampChanged","addIfDoesNotExist","messageSetToAddToIfDoesNotExist","addMessagesSorted","__html","html","pinned_at","newMessages","initializing","findTargetMessageSet","messagesToAdd","targetMessageSetIndex","isFromShadowBannedUser","shadowed","isMessageFormatted","formatMessage","getClient","updateUserReference","getTime","parentID","show_in_channel","_addToMessageList","thread","threadMessages","messageSet","addPinnedMessage","pinnedMessage","removeMessageFromArray","reaction","enforce_unique","messageWithReaction","_updateMessage","_addOwnReactionToMessage","ownReactions","_removeOwnReactionFromMessage","userID","user_id","push","item","parseMessage","toString","updatedMessages","quoted_message_id","quoted_message","attachments","updateFunc","pinned","msgIndex","messageSetIndex","findMessageSetIndex","sortBy","addMessageToList","messageArr","messageArrayLength","concat","messageTime","messageIsNewest","left","middle","right","Math","floor","splice","messageToRemove","isRemoved","filteredMessages","latestMessages","now","Object","entries","lastEvent","receivedAt","received_at","dispatchEvent","messageId","parentMessageId","limit","switchedToMessageSet","loadedMessageThread","messageIdToFind","switchToMessageSet","query","id_around","getReplies","undefined","currentMessages","messages1","messages2","some","m1","m2","overlappingMessageSetIndices","_","areMessageSetsOverlap","mergeTargetMessageSetIndex","mergeSourceMessageSetIndices","target","sources","indexOf","overlappingMessageSetIndex","logChatPromiseExecution","promise","name","then","catch","error","console","warn","sleep","Promise","setTimeout","isFunction","value","prototype","call","Function","chatCodes","TOKEN_EXPIRED","WS_CLOSED_SUCCESS","isReadableStream","obj","_typeof","readable","_read","isBuffer","constructor","isFileWebAPI","uri","window","File","isOwnUser","total_unread_count","isBlobWebAPI","Blob","isOwnUserBaseProperty","property","ownUserBaseProperties","channel_mutes","devices","mutes","unread_channels","unread_count","invisible","roles","addFileToFormData","contentType","FormData","append","split","reverse","normalizeQuerySort","sort","sortFields","sortArr","Array","isArray","field","direction","retryInterval","numberOfFailures","max","min","random","randomId","generateUUIDv4","hex","bytes","padStart","getRandomBytes","subarray","getRandomValuesWithMathRandom","pow","byteLength","getRandomValues","crypto","bind","msCrypto","convertErrorToJson","err","jsonObj","getOwnPropertyNames","key","getOwnPropertyDescriptor","isOnline","nav","navigator","onLine","addConnectionEventListeners","cb","addEventListener","removeConnectionEventListeners","removeEventListener","Channel","client","options","watch","presence","event","listeners","all","listener","Error","baseURL","validTypeRe","validIDRe","test","_client","_data","initialized","offlineMode","lastTypingEvent","isTyping","disconnected","configs","post","_channelURL","sendMessageResponse","sendFile","url","delete","_checkInitialized","offset","next","payload","filter_conditions","message_filter_conditions","wsPromise","get","filterConditions","messageID","keys","reactionType","channelData","updateMessage","reserved","_update","update","patch","coolDownInterval","cooldown","accept_invite","reject_invite","add_members","add_moderators","assign_roles","invites","remove_members","demote_moderators","opts","channel_cid","_muteStatus","formData","message_id","form_data","getConfig","typing_events","diff","lastKeyStroke","sendEvent","messageSlice","slice","read_events","resolve","stopTyping","clean","defaultOptions","_hasConnectionID","combined","logger","tags","response","messageIds","ids","join","last_read","silent","userMuteStatus","own_capabilities","includes","muteStatus","muted","lastRead","count","_countMessageAsUnread","queryURL","membersStr","member","tempChannelCid","activeChannels","_addChannelConfig","_initializeState","queriedChannels","channels","isLatestMessageSet","targetUserID","banUser","userId","clearHistory","clear_history","unbanUser","shadowBan","removeShadowBan","callbackOrString","callbackOrNothing","unsubscribe","el","channelState","unread_messages","_extendEventWithOwnReactions","hard_delete","removeMessage","addMessageSorted","removeQuotedMessageReferences","removePinnedMessage","ownMessage","isThreadMessage","truncated_at","truncatedAt","createdAt","clearMessages","hidden","addReaction","removeReaction","_isUsingServerAuth","clientState","addPinnedMessages","pinned_messages","watcher","reduce","acc","findMessage","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","encodeURIComponent","_buildWSPayload","getToken","wsBaseURL","getUserAgent","_log","_setHealth","isHealthy","_reconnect","interval","wsID","JSON","parse","isResolved","rejectPromise","_errorFromWSEvent","resolvePromise","scheduleNextPing","handleEvent","scheduleConnectionCheck","reason","wasClean","consecutiveFailures","totalFailures","isConnecting","healthy","isWSFailure","statusCode","StatusCode","connectionOpen","reject","healthCheckTimeoutRef","clearTimeout","clientID","send","stringify","pingInterval","connectionCheckTimeoutRef","connectionCheckTimeout","isDisconnected","onlineStatusChanged","extra","level","timeout","_connect","healthCheck","isStatic","refreshToken","_waitForHealthy","race","_asyncToGenerator","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","jwt","sign","_extends","algorithm","noTimestamp","iat","JWTServerToken","server","UserFromToken","fragments","b64Payload","DevToken","CheckSignature","body","secret","signature","Buffer","from","hash","createHmac","digest","TokenManager","tokenOrProvider","validateToken","tokenProvider","loadTokenPromise","anon","tokenUserId","APIErrorCodes","retryable","isAPIError","isErrorRetryable","isConnectionIDError","isErrorResponse","ConnectionState","WSConnectionFallback","_setState","Closed","cancelToken","cancel","connect","params","config","retry","CancelToken","source","doAxiosRequest","replace","_req","Connected","events","isCancel","Disconnected","reconnect","Connecting","json","_poll","_onlineStatusChanged","Init","ErrorFromResponse","StreamChat","secretOrOptions","wsConnection","wsFallback","Boolean","_getConnectionID","userTokenOrProvider","setUserPromise","node","allowServerSideConnect","anonymous","setTokenPromise","_setToken","_setUser","openConnection","persistUserOnConnectionFailure","closeConnection","disconnectUser","connectUser","setTokenOrProvider","cleaningIntervalRef","disconnect","_startCleaning","before","toISOString","closePromise","values","_disconnect","reset","anonymousUser","_setupConnection","connectAnonymousUser","requestConfig","_enrichAxiosOptions","_logApiRequest","axiosInstance","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","custom","_toConsumableArray","tempCid","membersStrInExistingChannel","upsertUsers","upsertUser","markChannelsRead","mutedChannels","inputOptions","browser","withCredentials","warmUp","httpsAgent","https","Agent","keepAlive","keepAliveMsecs","create","setBaseURL","process","env","STREAM_LOCAL_TEST_RUN","STREAM_LOCAL_TEST_HOST","defaultWSTimeoutWithFallback","defaultWSTimeout","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","getHeaders","maxContentLength","Infinity","maxBodyLength","errorFromResponse","_handleUserEvent","me","currentMutedChannelIds","nextMutedChannelIds","mute","activeChannelKeys","activeChannelKey","deleteAllChannelReference","expires","expiresAt","_sayHi","setClient","mode","updateUsers","stateOptions","hydrateActiveChannels","channelsFromApi","skipInitialization","push_provider","serverSide","web","android","ios","endpoints","server_side","channelIDOrCustom","getChannelByMembers","getChannelById","partialUserObject","userMap","userObject","target_user_id","shadow","targetID","target_id","currentUserID","targetMessageID","target_message_id","callID","reviewResult","review_result","commands","language","timeoutOrExpirationDate","pinExpires","setSeconds","getSeconds","messageOrMessageId","errorText","pinnedBy","pinnedAt","_validateAndGetMessageId","partialUpdateMessage","pin_expires","_normalizeExpiration","clonedMessage","reservedMessageFields","mu","partialMessageObject","hard","_getToken","authorization","Authorization","signal","nextRequestAbortController","that","setInterval","requestBody","xSignature","permissionData","channel_cids","last_sync_at","blockList","request","exportChannels","segment","filters","campaign","scheduledFor","scheduled_for","user_ids","conversations","filename","path","pushProvider","AbortController","_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":"index.js","sources":["../src/base64.ts","../src/channel_state.ts","../src/utils.ts","../src/channel.ts","../src/client_state.ts","../src/insights.ts","../src/connection.ts","../src/signing.ts","../src/token_manager.ts","../src/errors.ts","../src/connection_fallback.ts","../src/types.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 { Channel } from './channel';\nimport {\n ChannelMemberResponse,\n ChannelMembership,\n FormatMessageResponse,\n Event,\n ExtendableGenerics,\n DefaultGenerics,\n MessageSetType,\n MessageResponse,\n ReactionResponse,\n UserResponse,\n PendingMessageResponse,\n} from './types';\n\ntype ChannelReadStatus<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = Record<\n string,\n { last_read: Date; unread_messages: number; user: UserResponse<StreamChatGenerics> }\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: ChannelMembership<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: {\n isCurrent: boolean;\n isLatest: boolean;\n messages: Array<ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>>;\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 /**\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 * formatMessage - Takes the message object. Parses the dates, sets __html\n * and sets the status to received if missing. Returns a message object\n *\n * @param {MessageResponse<StreamChatGenerics>} message a message object\n *\n */\n formatMessage(message: MessageResponse<StreamChatGenerics>): FormatMessageResponse<StreamChatGenerics> {\n return {\n ...message,\n /**\n * @deprecated please use `html`\n */\n __html: message.html,\n // parse the date..\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 status: message.status || 'received',\n };\n }\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 const threadMessages = this._addToMessageList(\n thread,\n message,\n timestampChanged,\n 'created_at',\n addIfDoesNotExist,\n );\n this.threads[parentID] = threadMessages;\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 removeQuotedMessageReferences(message: MessageResponse<StreamChatGenerics>) {\n const parseMessage = (m: ReturnType<ChannelState<StreamChatGenerics>['formatMessage']>) =>\n (({\n ...m,\n created_at: m.created_at.toString(),\n pinned_at: m.pinned_at?.toString(),\n updated_at: m.updated_at?.toString(),\n } as unknown) as MessageResponse<StreamChatGenerics>);\n\n this.messageSets.forEach((set) => {\n const updatedMessages = set.messages\n .filter((msg) => msg.quoted_message_id === message.id)\n .map(parseMessage)\n .map((msg) => ({ ...msg, quoted_message: { ...message, attachments: [] } }));\n\n this.addMessagesSorted(updatedMessages, true);\n });\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 const addMessageToList = addIfDoesNotExist || timestampChanged;\n let messageArr = 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 messageArr = messageArr.filter((msg) => !(msg.id && message.id === msg.id));\n }\n\n // Get array length after filtering\n const messageArrayLength = messageArr.length;\n\n // for empty list just concat and return unless it's an update or deletion\n if (messageArrayLength === 0 && addMessageToList) {\n return messageArr.concat(message);\n } else if (messageArrayLength === 0) {\n return [...messageArr];\n }\n\n const messageTime = (message[sortBy] as Date).getTime();\n const messageIsNewest = (messageArr[messageArrayLength - 1][sortBy] as Date).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 messageArr.concat(message);\n } else if (messageIsNewest) {\n return [...messageArr];\n }\n\n // find the closest index to push the new message\n let left = 0;\n let middle = 0;\n let right = messageArrayLength - 1;\n while (left <= right) {\n middle = Math.floor((right + left) / 2);\n if ((messageArr[middle][sortBy] as Date).getTime() <= messageTime) left = middle + 1;\n else right = middle - 1;\n }\n\n // message already exists and not filtered due to timestampChanged, update and return\n if (!timestampChanged && message.id) {\n if (messageArr[left] && message.id === messageArr[left].id) {\n messageArr[left] = message;\n return [...messageArr];\n }\n\n if (messageArr[left - 1] && message.id === messageArr[left - 1].id) {\n messageArr[left - 1] = message;\n return [...messageArr];\n }\n }\n\n // Do not add updated or deleted messages to the list if they do not already exist\n // or have a timestamp change.\n if (addMessageToList) {\n messageArr.splice(left, 0, message);\n }\n return [...messageArr];\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,\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 }];\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 */\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({ messages: [], isCurrent: false, isLatest: false });\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 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 FormData from 'form-data';\nimport { AscDesc, ExtendableGenerics, DefaultGenerics, OwnUserBase, OwnUserResponse, UserResponse } from './types';\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 invisible: 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","import { ChannelState } from './channel_state';\nimport { logChatPromiseExecution, 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 MemberSort,\n Message,\n MessageFilters,\n MessagePaginationOptions,\n MessageResponse,\n MessageSetType,\n MuteChannelAPIResponse,\n PartialUpdateChannel,\n PartialUpdateChannelAPIResponse,\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 UserFilters,\n UserResponse,\n QueryChannelAPIResponse,\n} from './types';\nimport { Role } from './permissions';\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] Make this message pending\n * @param {Record<string,string>} [options.pending_message_metadata] Metadata for the pending message\n *\n * @return {Promise<SendMessageAPIResponse<StreamChatGenerics>>} The Server Response\n */\n async sendMessage(\n message: Message<StreamChatGenerics>,\n options?: {\n is_pending_message?: boolean;\n pending_message_metadata?: Record<string, string>;\n skip_enrich_url?: boolean;\n skip_push?: boolean;\n },\n ) {\n const sendMessageResponse = await this.getClient().post<SendMessageAPIResponse<StreamChatGenerics>>(\n this._channelURL() + '/message',\n {\n message,\n ...options,\n },\n );\n\n // Reset unreadCount to 0.\n this.state.unreadCount = 0;\n\n return sendMessageResponse;\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 query?: string;\n } = {},\n ) {\n if (options.offset && (options.sort || options.next)) {\n throw Error(`Cannot specify offset with sort or next parameters`);\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 {UserFilters<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: UserFilters<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 * 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/${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 = this.getClient().baseURL + `/messages/${messageID}/reaction/${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 this.data = data.channel;\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 {{user_id: string, channel_role?: Role}[]} 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[] | { user_id: string; channel_role?: Role }[],\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 {{user_id: string, channel_role?: Role}[]} 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: { user_id: string; channel_role?: Role }[] | string[],\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 * 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/${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) {\n if (!this.getConfig()?.typing_events) {\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 } as Event<StreamChatGenerics>);\n }\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) {\n if (!this.getConfig()?.typing_events) {\n return;\n }\n this.lastTypingEvent = null;\n this.isTyping = false;\n await this.sendEvent({\n type: 'typing.stop',\n parent_id,\n } as Event<StreamChatGenerics>);\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() {\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) {\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 * 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 * @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 ) {\n const data = await this.getClient().get<GetRepliesAPIResponse<StreamChatGenerics>>(\n this.getClient().baseURL + `/messages/${parent_id}/replies`,\n {\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.getClient().baseURL + `/channels/${this.type}/${this.id}/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/${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 this._checkInitialized();\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 if (message.type === 'system') 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 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 create = async () => {\n const options = {\n watch: false,\n state: false,\n presence: false,\n };\n return await this.query(options, '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/${this.type}`;\n if (this.id) {\n queryURL += `/${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)) {\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\n this.data = state.channel;\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 * 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) {\n channelState.read[event.user.id] = {\n // because in client.ts the handleEvent call that flows to this sets this `event.received_at = new Date();`\n last_read: event.received_at as Date,\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 if (ownMessage && event.user?.id) {\n channelState.unreadCount = 0;\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 if (this._countMessageAsUnread(event.message)) {\n channelState.unreadCount = channelState.unreadCount + 1;\n }\n }\n break;\n case 'message.updated':\n if (event.message) {\n this._extendEventWithOwnReactions(event);\n channelState.addMessageSorted(event.message, false, false);\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_id) {\n channelState.members[event.member.user_id] = event.member;\n }\n break;\n case 'member.removed':\n if (event.user?.id) {\n delete channelState.members[event.user.id];\n }\n break;\n case 'channel.updated':\n if (event.channel) {\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 if (event.clear_history) {\n channelState.clearMessages();\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/${this.type}/${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 Users\n if (state.members) {\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 this.state.watcher_count = state.watcher_count || 0;\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 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 if (state.members) {\n this.state.members = state.members.reduce((acc, member) => {\n if (member.user) {\n acc[member.user.id] = member;\n }\n return acc;\n }, {} as ChannelState<StreamChatGenerics>['members']);\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 _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';\n\n/**\n * ClientState - A container class for the client state.\n */\nexport class ClientState<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> {\n users: {\n [key: string]: UserResponse<StreamChatGenerics>;\n };\n userChannelReferences: { [key: string]: { [key: string]: boolean } };\n constructor() {\n // show the status for a certain user...\n // ie online, offline etc\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) {\n this.users[user.id] = user;\n }\n }\n\n updateUserReference(user: UserResponse<StreamChatGenerics>, channelID: string) {\n if (user == null) {\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","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} 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, secret: string, signature: string) {\n const key = Buffer.from(secret, 'ascii');\n const hash = crypto.createHmac('sha256', key).update(body).digest('hex');\n return hash === signature;\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.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 { 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 messageType: 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 messageType: 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 AppSettingsAPIResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = APIResponse & {\n app?: {\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 max_message_length?: number;\n message_retention?: string;\n mutes?: boolean;\n name?: string;\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 disable_auth_checks?: boolean;\n disable_permissions_checks?: boolean;\n enforce_unique_usernames?: 'no' | 'app' | 'team';\n file_upload_config?: FileUploadConfig;\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 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 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 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 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 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?: ChannelMembership<StreamChatGenerics> | null;\n pending_messages?: PendingMessageResponse<StreamChatGenerics>[];\n read?: ReadResponse<StreamChatGenerics>[];\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 ChannelMemberResponse<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\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 role?: string;\n shadow_banned?: boolean;\n updated_at?: string;\n user?: UserResponse<StreamChatGenerics>;\n user_id?: string;\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 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};\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};\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 messageType: {};\n reactionType: StreamChatGenerics['reactionType'];\n userType: StreamChatGenerics['userType'];\n }>,\n 'created_at' | 'pinned_at' | 'updated_at' | 'status'\n> &\n StreamChatGenerics['messageType'] & {\n created_at: Date;\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\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 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 channel?: ChannelResponse<StreamChatGenerics>;\n cid?: string;\n command?: string;\n command_info?: { name?: string };\n created_at?: string;\n deleted_at?: string;\n i18n?: RequireAtLeastOne<Record<`${TranslationLanguages}_text`, string>> & {\n language: TranslationLanguages;\n };\n latest_reactions?: ReactionResponse<StreamChatGenerics>[];\n mentioned_users?: UserResponse<StreamChatGenerics>[];\n own_reactions?: ReactionResponse<StreamChatGenerics>[] | null;\n pin_expires?: string | null;\n pinned_at?: string | null;\n pinned_by?: UserResponse<StreamChatGenerics> | null;\n reaction_counts?: { [key: string]: number } | null;\n reaction_scores?: { [key: string]: number } | null;\n reply_count?: number;\n shadowed?: boolean;\n silent?: boolean;\n status?: string;\n thread_participants?: UserResponse<StreamChatGenerics>[];\n updated_at?: 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 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 invisible?: boolean;\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 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 created_at?: string;\n deactivated_at?: string;\n deleted_at?: string;\n language?: TranslationLanguages | '';\n last_active?: string;\n online?: boolean;\n push_notifications?: PushNotificationSettings;\n revoke_tokens_issued_before?: string;\n shadow_banned?: boolean;\n updated_at?: string;\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\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 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 max_message_length?: number;\n message_retention?: string;\n mutes?: boolean;\n name?: string;\n permissions?: PermissionObject[];\n push_notifications?: boolean;\n quotes?: boolean;\n reactions?: boolean;\n read_events?: boolean;\n reminders?: boolean;\n replies?: boolean;\n search?: 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\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 message_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;\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 limit?: number;\n offset?: number;\n user_id_gt?: string;\n user_id_gte?: string;\n user_id_lt?: string;\n user_id_lte?: string;\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 /**\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 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 // Set the instance of StableWSConnection on chat client. Its purely for testing purpose and should\n // not be used in production apps.\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 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 channel?: ChannelResponse<StreamChatGenerics>;\n channel_id?: string;\n channel_type?: string;\n cid?: string;\n clear_history?: boolean;\n connection_id?: string;\n created_at?: string;\n hard_delete?: boolean;\n mark_messages_deleted?: boolean;\n me?: OwnUserResponse<StreamChatGenerics>;\n member?: ChannelMemberResponse<StreamChatGenerics>;\n message?: MessageResponse<StreamChatGenerics>;\n mode?: string;\n online?: boolean;\n parent_id?: string;\n queriedChannels?: {\n channels: ChannelAPIResponse<StreamChatGenerics>[];\n isLatestMessageSet?: boolean;\n };\n reaction?: ReactionResponse<StreamChatGenerics>;\n received_at?: string | Date;\n team?: string;\n total_unread_count?: number;\n unread_channels?: number;\n unread_count?: 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 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 messageType: StreamChatGenerics['messageType'];\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 messageType: StreamChatGenerics['messageType'];\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 messageType: StreamChatGenerics['messageType'];\n reactionType: StreamChatGenerics['reactionType'];\n userType: StreamChatGenerics['userType'];\n }>[Key]\n >;\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 messageType: {};\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 messageType: {};\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 messageType: {};\n reactionType: StreamChatGenerics['reactionType'];\n userType: StreamChatGenerics['userType'];\n }>[Key]\n >;\n }\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 $ne?: PrimitiveFilter<ObjectType>;\n $nin?: PrimitiveFilter<ObjectType>[];\n }\n : {\n $eq?: PrimitiveFilter<ObjectType>;\n $exists?: boolean;\n $in?: PrimitiveFilter<ObjectType>[];\n $ne?: PrimitiveFilter<ObjectType>;\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 teams?:\n | RequireOnlyOne<{\n $contains?: PrimitiveFilter<string>;\n $eq?: 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 messageType: StreamChatGenerics['messageType'];\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 messageType: StreamChatGenerics['messageType'];\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 messageType: StreamChatGenerics['messageType'];\n reactionType: StreamChatGenerics['reactionType'];\n userType: {};\n }>[Key]\n >;\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 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 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' | 'name'>>\n | Array<Sort<Pick<UserResponse<StreamChatGenerics>, 'id' | 'created_at' | 'name'>>>;\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\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 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 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 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 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};\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};\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 max_message_length?: number;\n message_retention?: string;\n mutes?: boolean;\n name?: string;\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 members?: string[];\n name?: string;\n};\n\nexport type ChannelMembership<StreamChatGenerics extends ExtendableGenerics = DefaultGenerics> = {\n banned?: boolean;\n channel_role?: Role;\n created_at?: string;\n is_moderator?: boolean;\n role?: string;\n shadow_banned?: boolean;\n updated_at?: string;\n user?: UserResponse<StreamChatGenerics>;\n};\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\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_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};\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};\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 quoted_message_id?: string;\n show_in_channel?: 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 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 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 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 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 | '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';\n\n/*\n DeleteUserOptions specifies a collection of one or more `user_ids` to be deleted.\n\n `user` soft|hard determines if the user needs to be hard- or soft-deleted, where hard-delete\n implies that all related objects (messages, flags, etc) will be hard-deleted as well.\n `conversations` soft|hard will delete any 1to1 channels that the user was a member of.\n `messages` soft-hard will delete any messages that the user has sent.\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 user: DeleteType;\n conversations?: DeleteType;\n messages?: DeleteType;\n new_channel_owner_id?: string;\n};\n\nexport type SegmentData = {\n description: string;\n filter: {};\n name: string;\n type: 'channel' | 'user';\n};\n\nexport type Segment = {\n created_at: string;\n id: string;\n in_use: boolean;\n size: number;\n status: 'computing' | 'ready';\n updated_at: string;\n} & SegmentData;\n\nexport type CampaignSortField = {\n field: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value: any;\n};\n\nexport type CampaignSort = {\n fields: CampaignSortField[];\n direction?: 'asc' | 'desc';\n};\n\nexport type CampaignQueryOptions = {\n limit?: number;\n sort?: CampaignSort;\n};\n\nexport type SegmentQueryOptions = CampaignQueryOptions;\nexport type RecipientQueryOptions = CampaignQueryOptions;\n\n// TODO: add better typing\nexport type SegmentFilters = {};\nexport type CampaignFilters = {};\nexport type RecipientFilters = {};\n\nexport type CampaignData = {\n attachments: Attachment[];\n channel_type: string;\n defaults: Record<string, string>;\n name: string;\n segment_id: string;\n text: string;\n description?: string;\n sender_id?: string;\n};\n\nexport type CampaignStatusName = 'draft' | 'stopped' | 'scheduled' | 'completed' | 'failed' | 'in_progress';\n\nexport type CampaignStatus = {\n status: CampaignStatusName;\n completed_at?: string;\n errored_messages?: number;\n failed_at?: string;\n resumed_at?: string;\n scheduled_at?: string;\n scheduled_for?: string;\n sent_messages?: number;\n stopped_at?: string;\n task_id?: string;\n};\n\nexport type Campaign = {\n created_at: string;\n id: string;\n updated_at: string;\n} & CampaignData &\n CampaignStatus;\n\nexport type TestCampaignResponse = {\n status: CampaignStatusName;\n details?: string;\n results?: Record<string, string>;\n};\n\nexport type DeleteCampaignOptions = {\n recipients?: boolean;\n};\n\nexport type Recipient = {\n campaign_id: string;\n channel_cid: string;\n created_at: string;\n status: 'pending' | 'sent' | 'failed';\n updated_at: string;\n details?: string;\n message_id?: string;\n receiver_id?: string;\n};\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';\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","/* 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 { isErrorResponse, isWSFailure } from './errors';\nimport {\n addFileToFormData,\n chatCodes,\n isFunction,\n isOnline,\n isOwnUserBaseProperty,\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 Campaign,\n CampaignData,\n CampaignFilters,\n CampaignQueryOptions,\n ChannelAPIResponse,\n ChannelData,\n ChannelFilters,\n ChannelMute,\n ChannelOptions,\n ChannelResponse,\n ChannelSort,\n ChannelStateOptions,\n CheckPushResponse,\n CheckSQSResponse,\n Configs,\n ConnectAPIResponse,\n CreateChannelOptions,\n CreateChannelResponse,\n CreateCommandOptions,\n CreateCommandResponse,\n CreateImportOptions,\n CreateImportResponse,\n CreateImportURLResponse,\n CustomPermissionOptions,\n DefaultGenerics,\n DeleteCampaignOptions,\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 GetCallTokenResponse,\n GetChannelTypeResponse,\n GetCommandResponse,\n GetImportResponse,\n GetMessageAPIResponse,\n GetRateLimitsResponse,\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 PartialUserUpdate,\n PermissionAPIResponse,\n PermissionsAPIResponse,\n PushProvider,\n PushProviderConfig,\n PushProviderID,\n PushProviderListResponse,\n PushProviderUpsertResponse,\n QueryChannelsAPIResponse,\n ReactionResponse,\n Recipient,\n RecipientFilters,\n RecipientQueryOptions,\n ReservedMessageFields,\n ReviewFlagReportOptions,\n ReviewFlagReportResponse,\n SearchAPIResponse,\n SearchMessageSortBase,\n SearchOptions,\n SearchPayload,\n Segment,\n SegmentData,\n SegmentFilters,\n SegmentQueryOptions,\n SendFileAPIResponse,\n StreamChatOptions,\n SyncOptions,\n SyncResponse,\n TaskResponse,\n TaskStatus,\n TestCampaignResponse,\n TestPushDataInput,\n TestSQSDataInput,\n TokenOrProvider,\n UnBanUserOptions,\n UpdateChannelOptions,\n UpdateChannelResponse,\n UpdateCommandOptions,\n UpdateCommandResponse,\n UpdatedMessage,\n UpdateMessageAPIResponse,\n UserCustomEvent,\n UserFilters,\n UserOptions,\n UserResponse,\n UserSort,\n} from './types';\nimport { InsightMetrics, postInsights } from './insights';\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 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 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>();\n // a list of channels to hide ws events from\n this.mutedChannels = [];\n this.mutedUsers = [];\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 ...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' && process.env.STREAM_LOCAL_TEST_RUN) {\n this.setBaseURL('http://localhost:3030');\n }\n\n if (typeof process !== 'undefined' && 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 // 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 = 6000;\n this.defaultWSTimeout = 15000;\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 }\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 Promise.resolve();\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: { ...apn_config, p12_cert: Buffer.from(apn_config.p12_cert).toString('base64') },\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({ revoke_tokens_issued_before: this._normalizeDate(before) });\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>>>{ revoke_tokens_issued_before: before },\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 * 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();\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 = { id: this.userID, anon: true } 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<APIResponse & { access_token: string; user: UserResponse<StreamChatGenerics> }>(\n this.baseURL + '/guest',\n { user },\n );\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`, { tags: ['event', 'client'] });\n this.listeners[key].push(callback);\n return {\n unsubscribe: () => {\n this.logger('info', `Removing listener for ${key} event`, { tags: ['event', 'client'] });\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`, { tags: ['event', 'client'] });\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 & { config?: AxiosRequestConfig & { maxBodyLength?: number } } = {},\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 '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);\n if (user != null) data.append('user', JSON.stringify(user));\n\n return this.doAxiosRequest<SendFileAPIResponse>('post', 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 and watchers 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 /** search the members and watchers and update as needed... */\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 }\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 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 const state = channel.state;\n\n /** deleted the messages from this user. */\n state?.deleteUserMessages(user, hardDelete);\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 const currentMutedChannelIds: string[] = [];\n const nextMutedChannelIds: string[] = [];\n\n this.mutedChannels.forEach((mute) => mute.channel && currentMutedChannelIds.push(mute.channel.cid));\n event.me.channel_mutes.forEach((mute) => mute.channel && nextMutedChannelIds.push(mute.channel.cid));\n\n /** Set the unread count of un-muted channels to 0, which is the behaviour of backend */\n currentMutedChannelIds.forEach((cid) => {\n if (!nextMutedChannelIds.includes(cid) && this.activeChannels[cid]) {\n this.activeChannels[cid].state.unreadCount = 0;\n }\n });\n\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({ type: 'connection.recovered' } as Event<StreamChatGenerics>);\n } else {\n this.dispatchEvent({ type: 'connection.recovered' } 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>({ client: this });\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>({ client: this });\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', { api_key: this.key, err: e, client_request_id });\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}\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 = { state: true, watch: true, presence: false };\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);\n }\n\n hydrateActiveChannels(\n channelsFromApi: ChannelAPIResponse<StreamChatGenerics>[] = [],\n stateOptions: ChannelStateOptions = {},\n ) {\n const { skipInitialization, offlineMode = false } = stateOptions;\n\n for (const channelState of channelsFromApi) {\n this._addChannelConfig(channelState.channel);\n }\n\n const channels: Channel<StreamChatGenerics>[] = [];\n\n for (const channelState of channelsFromApi) {\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 if (skipInitialization === undefined) {\n c._initializeState(channelState, 'latest');\n } else if (!skipInitialization.includes(channelState.channel.id)) {\n c.state.clearMessages();\n c._initializeState(channelState, 'latest');\n }\n\n channels.push(c);\n }\n\n if (!offlineMode) {\n // If the channels are coming from server, then clear out the\n // previously help offline channels.\n for (const key in this.activeChannels) {\n const channel = this.activeChannels[key];\n if (channel.offlineMode) {\n delete this.activeChannels[key];\n }\n }\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.sort || options.next)) {\n throw Error(`Cannot specify offset with sort or next parameters`);\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 (this.wsConnection || this.wsFallback) {\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 * 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 this.configs[cid] = config;\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\", null, {options})\n // support channel(\"messaging\", undefined, {options})\n // support channel(\"messaging\", \"\", {options})\n if (channelIDOrCustom == null || channelIDOrCustom === '') {\n return new Channel<StreamChatGenerics>(this, channelType, undefined, custom);\n }\n\n // support channel(\"messaging\", {options})\n if (typeof channelIDOrCustom === 'object') {\n return this.getChannelByMembers(channelType, channelIDOrCustom);\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 this.activeChannels[tempCid] = channel;\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].disconnected) {\n const channel = this.activeChannels[cid];\n if (Object.keys(custom).length > 0) {\n channel.data = custom;\n channel._data = custom;\n }\n return channel;\n }\n const channel = new Channel<StreamChatGenerics>(this, channelType, channelID, custom);\n this.activeChannels[channel.cid] = channel;\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<APIResponse & { users: { [key: string]: UserResponse<StreamChatGenerics> } }>(\n this.baseURL + '/users',\n { users: userMap },\n );\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<APIResponse & { users: { [key: string]: UserResponse<StreamChatGenerics> } }>(\n this.baseURL + '/users',\n { users },\n );\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<APIResponse & { user: UserResponse<StreamChatGenerics> } & { task_id?: string }>(\n this.baseURL + `/users/${userID}`,\n params,\n );\n }\n\n async reactivateUser(\n userID: string,\n options?: { created_by_id?: string; name?: string; restore_messages?: boolean },\n ) {\n return await this.post<APIResponse & { user: UserResponse<StreamChatGenerics> }>(\n this.baseURL + `/users/${userID}/reactivate`,\n { ...options },\n );\n }\n\n async deactivateUser(userID: string, options?: { created_by_id?: string; mark_messages_deleted?: boolean }) {\n return await this.post<APIResponse & { user: UserResponse<StreamChatGenerics> }>(\n this.baseURL + `/users/${userID}/deactivate`,\n { ...options },\n );\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/${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\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: { 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: { 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/${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>>(this.baseURL + `/moderation/reports/${id}`, {\n review_result: reviewResult,\n ...options,\n });\n }\n\n /**\n * _unblockMessage - unblocks message blocked by automod\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} 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\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/${name}`);\n }\n\n updateCommand(name: string, data: UpdateCommandOptions<StreamChatGenerics>) {\n return this.put<UpdateCommandResponse<StreamChatGenerics>>(this.baseURL + `/commands/${name}`, data);\n }\n\n deleteCommand(name: string) {\n return this.delete<DeleteCommandResponse<StreamChatGenerics>>(this.baseURL + `/commands/${name}`);\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>>(this.baseURL + `/channeltypes/${channelType}`);\n }\n\n updateChannelType(channelType: string, data: UpdateChannelOptions<StreamChatGenerics>) {\n return this.put<UpdateChannelResponse<StreamChatGenerics>>(this.baseURL + `/channeltypes/${channelType}`, data);\n }\n\n deleteChannelType(channelType: string) {\n return this.delete<APIResponse>(this.baseURL + `/channeltypes/${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/${messageId}/translate`,\n { 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 ({ set: { pinned: false } } 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?: { skip_enrich_url?: boolean },\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 = { id: userId.id } 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>>(this.baseURL + `/messages/${message.id}`, {\n message: clonedMessage,\n ...options,\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?: { skip_enrich_url?: boolean },\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>>(this.baseURL + `/messages/${id}`, {\n ...partialMessageObject,\n ...options,\n user,\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/${messageID}`,\n params,\n );\n }\n\n async getMessage(messageID: string) {\n return await this.get<GetMessageAPIResponse<StreamChatGenerics>>(this.baseURL + `/messages/${messageID}`);\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 _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 return {\n params: {\n user_id: this.userID,\n connection_id: this._getConnectionID(),\n api_key: this.key,\n ...options.params,\n },\n headers: {\n ...authorization,\n 'stream-auth-type': this.getAuthType(),\n 'X-Stream-Client': this.getUserAgent(),\n ...options.headers,\n },\n ...(signal ? { signal } : {}),\n ...options.config,\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 verifyWebhook(requestBody: string, 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/${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`, { ...permissionData });\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/${id}`, { ...permissionData });\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/${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/${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/${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 }>(`${this.baseURL}/blocklists/${name}`);\n }\n\n updateBlockList(name: string, data: { words: string[] }) {\n return this.put<APIResponse>(`${this.baseURL}/blocklists/${name}`, data);\n }\n\n deleteBlockList(name: string) {\n return this.delete<APIResponse>(`${this.baseURL}/blocklists/${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>(`${this.baseURL}/export_channels/${id}`);\n }\n\n /**\n * createSegment - Creates a Campaign Segment\n *\n * @param {SegmentData} params Segment data\n *\n * @return {Segment} The Created Segment\n */\n async createSegment(params: SegmentData) {\n const { segment } = await this.post<{ segment: Segment }>(this.baseURL + `/segments`, { segment: params });\n return segment;\n }\n\n /**\n * querySegments - Query Campaign Segments\n *\n *\n * @return {Segment[]} Segments\n */\n async querySegments(filters: SegmentFilters, options: SegmentQueryOptions = {}) {\n return await this.get<{\n segments: Segment[];\n }>(this.baseURL + `/segments`, {\n payload: {\n filter_conditions: filters,\n ...options,\n },\n });\n }\n\n /**\n * updateSegment - Update a Campaign Segment\n *\n * @param {string} id Segment ID\n * @param {Partial<SegmentData>} params Segment data\n *\n * @return {Segment} Updated Segment\n */\n async updateSegment(id: string, params: Partial<SegmentData>) {\n const { segment } = await this.put<{ segment: Segment }>(this.baseURL + `/segments/${id}`, { segment: params });\n return segment;\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 return this.delete<APIResponse>(this.baseURL + `/segments/${id}`);\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 const { campaign } = await this.post<{ campaign: Campaign }>(this.baseURL + `/campaigns`, { campaign: params });\n return campaign;\n }\n\n /**\n * queryCampaigns - Query Campaigns\n *\n *\n * @return {Campaign[]} Campaigns\n */\n async queryCampaigns(filters: CampaignFilters, options: CampaignQueryOptions = {}) {\n return await this.get<{\n campaigns: Campaign[];\n segments: Record<string, Segment>;\n channels?: Record<string, ChannelResponse<StreamChatGenerics>>;\n users?: Record<string, UserResponse<StreamChatGenerics>>;\n }>(this.baseURL + `/campaigns`, {\n payload: {\n filter_conditions: filters,\n ...options,\n },\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 const { campaign } = await this.put<{ campaign: Campaign }>(this.baseURL + `/campaigns/${id}`, {\n campaign: params,\n });\n return campaign;\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, params: DeleteCampaignOptions = {}) {\n return this.delete<APIResponse>(this.baseURL + `/campaigns/${id}`, params);\n }\n\n /**\n * scheduleCampaign - Schedule a Campaign\n *\n * @param {string} id Campaign ID\n * @param {{scheduledFor: number}} params Schedule params\n *\n * @return {Campaign} Scheduled Campaign\n */\n async scheduleCampaign(id: string, params: { scheduledFor: number }) {\n const { scheduledFor } = params;\n const { campaign } = await this.patch<{ campaign: Campaign }>(this.baseURL + `/campaigns/${id}/schedule`, {\n scheduled_for: scheduledFor,\n });\n return campaign;\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 const { campaign } = await this.patch<{ campaign: Campaign }>(this.baseURL + `/campaigns/${id}/stop`);\n return campaign;\n }\n\n /**\n * resumeCampaign - Resume a Campaign\n *\n * @param {string} id Campaign ID\n *\n * @return {Campaign} Resumed Campaign\n */\n async resumeCampaign(id: string) {\n const { campaign } = await this.patch<{ campaign: Campaign }>(this.baseURL + `/campaigns/${id}/resume`);\n return campaign;\n }\n\n /**\n * testCampaign - Test a Campaign\n *\n * @param {string} id Campaign ID\n * @param {{users: string[]}} params Test params\n *\n * @return {TestCampaignResponse} Test campaign response\n */\n async testCampaign(id: string, params: { users: string[] }) {\n const { users } = params;\n return await this.post<APIResponse & TestCampaignResponse>(this.baseURL + `/campaigns/${id}/test`, { users });\n }\n\n /**\n * queryRecipients - Query Campaign Recipient Results\n *\n *\n * @return {Recipient[]} Recipients\n */\n async queryRecipients(filters: RecipientFilters, options: RecipientQueryOptions = {}) {\n return await this.get<{\n campaigns: Record<string, Campaign>;\n recipients: Recipient[];\n segments: Record<string, Segment>;\n channels?: Record<string, ChannelResponse<StreamChatGenerics>>;\n users?: Record<string, UserResponse<StreamChatGenerics>>;\n }>(this.baseURL + `/recipients`, {\n payload: {\n filter_conditions: filters,\n ...options,\n },\n });\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/${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 {APIResponse} A task ID\n */\n async deleteUsers(user_ids: string[], options: DeleteUserOptions) {\n if (options?.user !== 'soft' && options?.user !== 'hard') {\n throw new Error('Invalid delete user options. user must be one of [soft hard]');\n }\n if (options.messages !== undefined && options.messages !== 'soft' && options.messages !== 'hard') {\n throw new Error('Invalid delete user options. messages must be one of [soft hard]');\n }\n if (options.conversations !== undefined && options.conversations !== 'soft' && options.conversations !== 'hard') {\n throw new Error('Invalid delete user options. conversations must be one of [soft hard]');\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/${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>(this.baseURL + `/push_providers/${type}/${name}`);\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","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 '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.message_new': true,\n 'notification.mutes_updated': true,\n 'notification.removed_from_channel': true,\n 'reaction.deleted': true,\n 'reaction.new': true,\n 'reaction.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\n // local events\n 'channels.queried': true,\n 'connection.changed': true,\n 'connection.recovered': true,\n 'transport.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","ChannelState","channel","isUpToDate","msgArray","msg","result","filter","message","id","removed","user","_updateUserMessages","messages","m","messageSets","forEach","set","parentId","threads","pinnedMessages","hardDelete","_deleteUserMessages","cid","created_at","deleted_at","latest_reactions","mentioned_users","own_reactions","parent_id","reply_count","status","thread_participants","type","updated_at","_channel","watcher_count","typing","read","initMessages","pending_messages","mutedUsers","watchers","members","membership","unreadCount","last_message_at","state","Date","find","isCurrent","index","findIndex","isLatest","newMessage","timestampChanged","addIfDoesNotExist","messageSetToAddToIfDoesNotExist","addMessagesSorted","__html","html","pinned_at","newMessages","initializing","findTargetMessageSet","messagesToAdd","targetMessageSetIndex","isFromShadowBannedUser","shadowed","isMessageFormatted","formatMessage","getClient","updateUserReference","getTime","parentID","show_in_channel","_addToMessageList","thread","threadMessages","messageSet","addPinnedMessage","pinnedMessage","removeMessageFromArray","reaction","enforce_unique","messageWithReaction","_updateMessage","_addOwnReactionToMessage","ownReactions","_removeOwnReactionFromMessage","userID","user_id","push","item","parseMessage","toString","updatedMessages","quoted_message_id","quoted_message","attachments","updateFunc","pinned","msgIndex","messageSetIndex","findMessageSetIndex","sortBy","addMessageToList","messageArr","messageArrayLength","concat","messageTime","messageIsNewest","left","middle","right","Math","floor","splice","messageToRemove","isRemoved","filteredMessages","latestMessages","now","Object","entries","lastEvent","receivedAt","received_at","dispatchEvent","messageId","parentMessageId","limit","switchedToMessageSet","loadedMessageThread","messageIdToFind","switchToMessageSet","query","id_around","getReplies","undefined","currentMessages","messages1","messages2","some","m1","m2","overlappingMessageSetIndices","_","areMessageSetsOverlap","mergeTargetMessageSetIndex","mergeSourceMessageSetIndices","target","sources","indexOf","overlappingMessageSetIndex","logChatPromiseExecution","promise","name","then","catch","error","console","warn","sleep","Promise","setTimeout","isFunction","value","prototype","call","Function","chatCodes","TOKEN_EXPIRED","WS_CLOSED_SUCCESS","isReadableStream","obj","_typeof","readable","_read","isBuffer","constructor","isFileWebAPI","uri","window","File","isOwnUser","total_unread_count","isBlobWebAPI","Blob","isOwnUserBaseProperty","property","ownUserBaseProperties","channel_mutes","devices","mutes","unread_channels","unread_count","invisible","roles","addFileToFormData","contentType","FormData","append","split","reverse","normalizeQuerySort","sort","sortFields","sortArr","Array","isArray","field","direction","retryInterval","numberOfFailures","max","min","random","randomId","generateUUIDv4","hex","bytes","padStart","getRandomBytes","subarray","getRandomValuesWithMathRandom","pow","byteLength","getRandomValues","crypto","bind","msCrypto","convertErrorToJson","err","jsonObj","getOwnPropertyNames","key","getOwnPropertyDescriptor","isOnline","nav","navigator","onLine","addConnectionEventListeners","cb","addEventListener","removeConnectionEventListeners","removeEventListener","Channel","client","options","watch","presence","event","listeners","all","listener","Error","baseURL","validTypeRe","validIDRe","test","_client","_data","initialized","offlineMode","lastTypingEvent","isTyping","disconnected","configs","post","_channelURL","sendMessageResponse","sendFile","url","delete","_checkInitialized","offset","next","payload","filter_conditions","message_filter_conditions","wsPromise","get","filterConditions","messageID","keys","reactionType","channelData","updateMessage","reserved","_update","update","patch","coolDownInterval","cooldown","accept_invite","reject_invite","add_members","add_moderators","assign_roles","invites","remove_members","demote_moderators","opts","channel_cid","_muteStatus","formData","message_id","form_data","getConfig","typing_events","diff","lastKeyStroke","sendEvent","messageSlice","slice","read_events","resolve","stopTyping","clean","defaultOptions","_hasConnectionID","combined","logger","tags","response","messageIds","ids","join","last_read","silent","userMuteStatus","own_capabilities","includes","muteStatus","muted","lastRead","count","_countMessageAsUnread","queryURL","membersStr","member","tempChannelCid","activeChannels","_addChannelConfig","_initializeState","queriedChannels","channels","isLatestMessageSet","targetUserID","banUser","userId","clearHistory","clear_history","unbanUser","shadowBan","removeShadowBan","callbackOrString","callbackOrNothing","unsubscribe","el","channelState","unread_messages","_extendEventWithOwnReactions","hard_delete","removeMessage","addMessageSorted","removeQuotedMessageReferences","removePinnedMessage","ownMessage","isThreadMessage","truncated_at","truncatedAt","createdAt","clearMessages","hidden","addReaction","removeReaction","_isUsingServerAuth","clientState","addPinnedMessages","pinned_messages","watcher","reduce","acc","findMessage","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","encodeURIComponent","_buildWSPayload","getToken","wsBaseURL","getUserAgent","_log","_setHealth","isHealthy","_reconnect","interval","wsID","JSON","parse","isResolved","rejectPromise","_errorFromWSEvent","resolvePromise","scheduleNextPing","handleEvent","scheduleConnectionCheck","reason","wasClean","consecutiveFailures","totalFailures","isConnecting","healthy","isWSFailure","statusCode","StatusCode","connectionOpen","reject","healthCheckTimeoutRef","clearTimeout","clientID","send","stringify","pingInterval","connectionCheckTimeoutRef","connectionCheckTimeout","isDisconnected","onlineStatusChanged","extra","level","timeout","_connect","healthCheck","isStatic","refreshToken","_waitForHealthy","race","_asyncToGenerator","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","jwt","sign","_extends","algorithm","noTimestamp","iat","JWTServerToken","server","UserFromToken","fragments","b64Payload","DevToken","CheckSignature","body","secret","signature","Buffer","from","hash","createHmac","digest","TokenManager","tokenOrProvider","validateToken","tokenProvider","loadTokenPromise","anon","tokenUserId","APIErrorCodes","retryable","isAPIError","isErrorRetryable","isConnectionIDError","isErrorResponse","ConnectionState","WSConnectionFallback","_setState","Closed","cancelToken","cancel","connect","params","config","retry","CancelToken","source","doAxiosRequest","replace","_req","Connected","events","isCancel","Disconnected","reconnect","Connecting","json","_poll","_onlineStatusChanged","Init","ErrorFromResponse","StreamChat","secretOrOptions","wsConnection","wsFallback","Boolean","_getConnectionID","userTokenOrProvider","setUserPromise","node","allowServerSideConnect","anonymous","setTokenPromise","_setToken","_setUser","openConnection","persistUserOnConnectionFailure","closeConnection","disconnectUser","connectUser","setTokenOrProvider","cleaningIntervalRef","disconnect","_startCleaning","before","toISOString","closePromise","values","_disconnect","reset","anonymousUser","_setupConnection","connectAnonymousUser","requestConfig","_enrichAxiosOptions","_logApiRequest","axiosInstance","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","custom","_toConsumableArray","tempCid","membersStrInExistingChannel","upsertUsers","upsertUser","markChannelsRead","mutedChannels","inputOptions","browser","withCredentials","warmUp","httpsAgent","https","Agent","keepAlive","keepAliveMsecs","create","setBaseURL","process","env","STREAM_LOCAL_TEST_RUN","STREAM_LOCAL_TEST_HOST","defaultWSTimeoutWithFallback","defaultWSTimeout","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","getHeaders","maxContentLength","Infinity","maxBodyLength","errorFromResponse","_handleUserEvent","me","currentMutedChannelIds","nextMutedChannelIds","mute","activeChannelKeys","activeChannelKey","deleteAllChannelReference","expires","expiresAt","_sayHi","setClient","mode","updateUsers","stateOptions","hydrateActiveChannels","channelsFromApi","skipInitialization","push_provider","serverSide","web","android","ios","endpoints","server_side","channelIDOrCustom","getChannelByMembers","getChannelById","partialUserObject","userMap","userObject","target_user_id","shadow","targetID","target_id","currentUserID","targetMessageID","target_message_id","callID","reviewResult","review_result","commands","language","timeoutOrExpirationDate","pinExpires","setSeconds","getSeconds","messageOrMessageId","errorText","pinnedBy","pinnedAt","_validateAndGetMessageId","partialUpdateMessage","pin_expires","_normalizeExpiration","clonedMessage","reservedMessageFields","mu","partialMessageObject","hard","_getToken","authorization","Authorization","signal","nextRequestAbortController","that","setInterval","requestBody","xSignature","permissionData","channel_cids","last_sync_at","blockList","request","exportChannels","segment","filters","campaign","scheduledFor","scheduled_for","user_ids","conversations","filename","path","pushProvider","AbortController","_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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"}
|