stream-chat 7.2.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.
@@ -1 +1 @@
1
- {"version":3,"file":"browser.full-bundle.min.js","sources":["../node_modules/base64-js/index.js","../src/base64.ts","../node_modules/@babel/runtime/helpers/esm/extends.js","../node_modules/@babel/runtime/helpers/esm/typeof.js","../node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js","../node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","../node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","../node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","../node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","../node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","../node_modules/@babel/runtime/helpers/esm/iterableToArray.js","../node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","../node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js","../node_modules/@babel/runtime/helpers/esm/classCallCheck.js","../node_modules/@babel/runtime/helpers/esm/createClass.js","../node_modules/@babel/runtime/helpers/esm/defineProperty.js","../node_modules/regenerator-runtime/runtime.js","../node_modules/@babel/runtime/regenerator/index.js","../node_modules/axios/lib/helpers/bind.js","../node_modules/axios/lib/utils.js","../node_modules/axios/lib/helpers/buildURL.js","../node_modules/axios/lib/core/InterceptorManager.js","../node_modules/axios/lib/helpers/normalizeHeaderName.js","../node_modules/axios/lib/core/enhanceError.js","../node_modules/axios/lib/core/createError.js","../node_modules/axios/lib/helpers/cookies.js","../node_modules/axios/lib/helpers/parseHeaders.js","../node_modules/axios/lib/helpers/isURLSameOrigin.js","../node_modules/axios/lib/cancel/Cancel.js","../node_modules/axios/lib/adapters/xhr.js","../node_modules/axios/lib/core/buildFullPath.js","../node_modules/axios/lib/helpers/isAbsoluteURL.js","../node_modules/axios/lib/helpers/combineURLs.js","../node_modules/axios/lib/core/settle.js","../node_modules/axios/lib/defaults.js","../node_modules/axios/lib/core/transformData.js","../node_modules/axios/lib/cancel/isCancel.js","../node_modules/axios/lib/core/dispatchRequest.js","../node_modules/axios/lib/core/mergeConfig.js","../node_modules/axios/lib/env/data.js","../node_modules/axios/lib/helpers/validator.js","../node_modules/axios/lib/core/Axios.js","../node_modules/axios/lib/cancel/CancelToken.js","../node_modules/axios/lib/axios.js","../node_modules/axios/lib/helpers/spread.js","../node_modules/axios/lib/helpers/isAxiosError.js","../node_modules/axios/index.js","../node_modules/@babel/runtime/helpers/esm/slicedToArray.js","../node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","../node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","../node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","../src/channel_state.ts","../node_modules/form-data/lib/browser.js","../src/utils.ts","../src/channel.ts","../src/client_state.ts","../node_modules/isomorphic-ws/browser.js","../src/insights.ts","../src/connection.ts","../src/signing.ts","../jsonwebtoken","../crypto","../src/connection_fallback.ts","../src/token_manager.ts","../src/errors.ts","../node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","../node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","../node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js","../node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js","../node_modules/@babel/runtime/helpers/esm/isNativeReflectConstruct.js","../node_modules/@babel/runtime/helpers/esm/construct.js","../node_modules/@babel/runtime/helpers/esm/wrapNativeSuper.js","../node_modules/@babel/runtime/helpers/esm/isNativeFunction.js","../src/types.ts","../node_modules/@babel/runtime/helpers/esm/inherits.js","../src/client.ts","../https","../src/permissions.ts","../src/events.ts"],"sourcesContent":["'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n","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","export default function _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}","export default function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}","import objectWithoutPropertiesLoose from \"./objectWithoutPropertiesLoose.js\";\nexport default function _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n}","export default function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}","export default function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","import arrayWithoutHoles from \"./arrayWithoutHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableSpread from \"./nonIterableSpread.js\";\nexport default function _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}","export default function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}","export default function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\n\nexport default function _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n\n _next(undefined);\n });\n };\n}","export default function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}","function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nexport default function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}","export default function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n function define(obj, key, value) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n return obj[key];\n }\n try {\n // IE 8 has a broken Object.defineProperty that only works on DOM objects.\n define({}, \"\");\n } catch (err) {\n define = function(obj, key, value) {\n return obj[key] = value;\n };\n }\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n exports.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunction.displayName = define(\n GeneratorFunctionPrototype,\n toStringTagSymbol,\n \"GeneratorFunction\"\n );\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n define(prototype, method, function(arg) {\n return this._invoke(method, arg);\n });\n });\n }\n\n exports.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n exports.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n define(genFun, toStringTagSymbol, \"GeneratorFunction\");\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n exports.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator, PromiseImpl) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return PromiseImpl.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return PromiseImpl.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration.\n result.value = unwrapped;\n resolve(result);\n }, function(error) {\n // If a rejected Promise was yielded, throw the rejection back\n // into the async generator function so it can be handled there.\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n exports.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n if (PromiseImpl === void 0) PromiseImpl = Promise;\n\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList),\n PromiseImpl\n );\n\n return exports.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n // Note: [\"return\"] must be used for ES3 parsing compatibility.\n if (delegate.iterator[\"return\"]) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n define(Gp, toStringTagSymbol, \"Generator\");\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n exports.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n exports.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n\n // Regardless of whether this script is executing as a CommonJS module\n // or not, return the runtime object so that we can declare the variable\n // regeneratorRuntime in the outer scope, which allows this module to be\n // injected easily by `bin/regenerator --include-runtime script.js`.\n return exports;\n\n}(\n // If this script is executing as a CommonJS module, use module.exports\n // as the regeneratorRuntime namespace. Otherwise create a new empty\n // object. Either way, the resulting object will be used to initialize\n // the regeneratorRuntime variable at the top of this file.\n typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n // This module should not be running in strict mode, so the above\n // assignment should always work unless something is misconfigured. Just\n // in case runtime.js accidentally runs in strict mode, we can escape\n // strict mode using a global Function call. This could conceivably fail\n // if a Content Security Policy forbids using Function, but in that case\n // the proper solution is to fix the accidental strict mode problem. If\n // you've misconfigured your bundler to force strict mode and applied a\n // CSP to forbid Function, and you're not willing to fix either of those\n // problems, please detail your unique predicament in a GitHub issue.\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n}\n","module.exports = require(\"regenerator-runtime\");\n","'use strict';\n\nmodule.exports = function bind(fn, thisArg) {\n return function wrap() {\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i];\n }\n return fn.apply(thisArg, args);\n };\n};\n","'use strict';\n\nvar bind = require('./helpers/bind');\n\n// utils is a library of generic helper functions non-specific to axios\n\nvar toString = Object.prototype.toString;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Array, otherwise false\n */\nfunction isArray(val) {\n return toString.call(val) === '[object Array]';\n}\n\n/**\n * Determine if a value is undefined\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nfunction isUndefined(val) {\n return typeof val === 'undefined';\n}\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nfunction isArrayBuffer(val) {\n return toString.call(val) === '[object ArrayBuffer]';\n}\n\n/**\n * Determine if a value is a FormData\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nfunction isFormData(val) {\n return (typeof FormData !== 'undefined') && (val instanceof FormData);\n}\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n var result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer);\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a String, otherwise false\n */\nfunction isString(val) {\n return typeof val === 'string';\n}\n\n/**\n * Determine if a value is a Number\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Number, otherwise false\n */\nfunction isNumber(val) {\n return typeof val === 'number';\n}\n\n/**\n * Determine if a value is an Object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Object, otherwise false\n */\nfunction isObject(val) {\n return val !== null && typeof val === 'object';\n}\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {Object} val The value to test\n * @return {boolean} True if value is a plain Object, otherwise false\n */\nfunction isPlainObject(val) {\n if (toString.call(val) !== '[object Object]') {\n return false;\n }\n\n var prototype = Object.getPrototypeOf(val);\n return prototype === null || prototype === Object.prototype;\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Date, otherwise false\n */\nfunction isDate(val) {\n return toString.call(val) === '[object Date]';\n}\n\n/**\n * Determine if a value is a File\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a File, otherwise false\n */\nfunction isFile(val) {\n return toString.call(val) === '[object File]';\n}\n\n/**\n * Determine if a value is a Blob\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nfunction isBlob(val) {\n return toString.call(val) === '[object Blob]';\n}\n\n/**\n * Determine if a value is a Function\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nfunction isFunction(val) {\n return toString.call(val) === '[object Function]';\n}\n\n/**\n * Determine if a value is a Stream\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nfunction isStream(val) {\n return isObject(val) && isFunction(val.pipe);\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nfunction isURLSearchParams(val) {\n return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams;\n}\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n * @returns {String} The String freed of excess whitespace\n */\nfunction trim(str) {\n return str.trim ? str.trim() : str.replace(/^\\s+|\\s+$/g, '');\n}\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n */\nfunction isStandardBrowserEnv() {\n if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' ||\n navigator.product === 'NativeScript' ||\n navigator.product === 'NS')) {\n return false;\n }\n return (\n typeof window !== 'undefined' &&\n typeof document !== 'undefined'\n );\n}\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n */\nfunction forEach(obj, fn) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (var i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n fn.call(null, obj[key], key, obj);\n }\n }\n }\n}\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n var result = {};\n function assignValue(val, key) {\n if (isPlainObject(result[key]) && isPlainObject(val)) {\n result[key] = merge(result[key], val);\n } else if (isPlainObject(val)) {\n result[key] = merge({}, val);\n } else if (isArray(val)) {\n result[key] = val.slice();\n } else {\n result[key] = val;\n }\n }\n\n for (var i = 0, l = arguments.length; i < l; i++) {\n forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n * @return {Object} The resulting value of object a\n */\nfunction extend(a, b, thisArg) {\n forEach(b, function assignValue(val, key) {\n if (thisArg && typeof val === 'function') {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n });\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n * @return {string} content value without BOM\n */\nfunction stripBOM(content) {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\nmodule.exports = {\n isArray: isArray,\n isArrayBuffer: isArrayBuffer,\n isBuffer: isBuffer,\n isFormData: isFormData,\n isArrayBufferView: isArrayBufferView,\n isString: isString,\n isNumber: isNumber,\n isObject: isObject,\n isPlainObject: isPlainObject,\n isUndefined: isUndefined,\n isDate: isDate,\n isFile: isFile,\n isBlob: isBlob,\n isFunction: isFunction,\n isStream: isStream,\n isURLSearchParams: isURLSearchParams,\n isStandardBrowserEnv: isStandardBrowserEnv,\n forEach: forEach,\n merge: merge,\n extend: extend,\n trim: trim,\n stripBOM: stripBOM\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @returns {string} The formatted url\n */\nmodule.exports = function buildURL(url, params, paramsSerializer) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n\n var serializedParams;\n if (paramsSerializer) {\n serializedParams = paramsSerializer(params);\n } else if (utils.isURLSearchParams(params)) {\n serializedParams = params.toString();\n } else {\n var parts = [];\n\n utils.forEach(params, function serialize(val, key) {\n if (val === null || typeof val === 'undefined') {\n return;\n }\n\n if (utils.isArray(val)) {\n key = key + '[]';\n } else {\n val = [val];\n }\n\n utils.forEach(val, function parseValue(v) {\n if (utils.isDate(v)) {\n v = v.toISOString();\n } else if (utils.isObject(v)) {\n v = JSON.stringify(v);\n }\n parts.push(encode(key) + '=' + encode(v));\n });\n });\n\n serializedParams = parts.join('&');\n }\n\n if (serializedParams) {\n var hashmarkIndex = url.indexOf('#');\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nfunction InterceptorManager() {\n this.handlers = [];\n}\n\n/**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\nInterceptorManager.prototype.use = function use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled: fulfilled,\n rejected: rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n};\n\n/**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n */\nInterceptorManager.prototype.eject = function eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n};\n\n/**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n */\nInterceptorManager.prototype.forEach = function forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n};\n\nmodule.exports = InterceptorManager;\n","'use strict';\n\nvar utils = require('../utils');\n\nmodule.exports = function normalizeHeaderName(headers, normalizedName) {\n utils.forEach(headers, function processHeader(value, name) {\n if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {\n headers[normalizedName] = value;\n delete headers[name];\n }\n });\n};\n","'use strict';\n\n/**\n * Update an Error with the specified config, error code, and response.\n *\n * @param {Error} error The error to update.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The error.\n */\nmodule.exports = function enhanceError(error, config, code, request, response) {\n error.config = config;\n if (code) {\n error.code = code;\n }\n\n error.request = request;\n error.response = response;\n error.isAxiosError = true;\n\n error.toJSON = function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: this.config,\n code: this.code,\n status: this.response && this.response.status ? this.response.status : null\n };\n };\n return error;\n};\n","'use strict';\n\nvar enhanceError = require('./enhanceError');\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The created error.\n */\nmodule.exports = function createError(message, config, code, request, response) {\n var error = new Error(message);\n return enhanceError(error, config, code, request, response);\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs support document.cookie\n (function standardBrowserEnv() {\n return {\n write: function write(name, value, expires, path, domain, secure) {\n var cookie = [];\n cookie.push(name + '=' + encodeURIComponent(value));\n\n if (utils.isNumber(expires)) {\n cookie.push('expires=' + new Date(expires).toGMTString());\n }\n\n if (utils.isString(path)) {\n cookie.push('path=' + path);\n }\n\n if (utils.isString(domain)) {\n cookie.push('domain=' + domain);\n }\n\n if (secure === true) {\n cookie.push('secure');\n }\n\n document.cookie = cookie.join('; ');\n },\n\n read: function read(name) {\n var match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove: function remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n };\n })() :\n\n // Non standard browser env (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return {\n write: function write() {},\n read: function read() { return null; },\n remove: function remove() {}\n };\n })()\n);\n","'use strict';\n\nvar utils = require('./../utils');\n\n// Headers whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nvar ignoreDuplicateOf = [\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n];\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} headers Headers needing to be parsed\n * @returns {Object} Headers parsed into an object\n */\nmodule.exports = function parseHeaders(headers) {\n var parsed = {};\n var key;\n var val;\n var i;\n\n if (!headers) { return parsed; }\n\n utils.forEach(headers.split('\\n'), function parser(line) {\n i = line.indexOf(':');\n key = utils.trim(line.substr(0, i)).toLowerCase();\n val = utils.trim(line.substr(i + 1));\n\n if (key) {\n if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {\n return;\n }\n if (key === 'set-cookie') {\n parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n }\n });\n\n return parsed;\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs have full support of the APIs needed to test\n // whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n var msie = /(msie|trident)/i.test(navigator.userAgent);\n var urlParsingNode = document.createElement('a');\n var originURL;\n\n /**\n * Parse a URL to discover it's components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n var href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })()\n);\n","'use strict';\n\n/**\n * A `Cancel` is an object that is thrown when an operation is canceled.\n *\n * @class\n * @param {string=} message The message.\n */\nfunction Cancel(message) {\n this.message = message;\n}\n\nCancel.prototype.toString = function toString() {\n return 'Cancel' + (this.message ? ': ' + this.message : '');\n};\n\nCancel.prototype.__CANCEL__ = true;\n\nmodule.exports = Cancel;\n","'use strict';\n\nvar utils = require('./../utils');\nvar settle = require('./../core/settle');\nvar cookies = require('./../helpers/cookies');\nvar buildURL = require('./../helpers/buildURL');\nvar buildFullPath = require('../core/buildFullPath');\nvar parseHeaders = require('./../helpers/parseHeaders');\nvar isURLSameOrigin = require('./../helpers/isURLSameOrigin');\nvar createError = require('../core/createError');\nvar defaults = require('../defaults');\nvar Cancel = require('../cancel/Cancel');\n\nmodule.exports = function xhrAdapter(config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n var requestData = config.data;\n var requestHeaders = config.headers;\n var responseType = config.responseType;\n var onCanceled;\n function done() {\n if (config.cancelToken) {\n config.cancelToken.unsubscribe(onCanceled);\n }\n\n if (config.signal) {\n config.signal.removeEventListener('abort', onCanceled);\n }\n }\n\n if (utils.isFormData(requestData)) {\n delete requestHeaders['Content-Type']; // Let the browser set it\n }\n\n var request = new XMLHttpRequest();\n\n // HTTP basic authentication\n if (config.auth) {\n var username = config.auth.username || '';\n var password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';\n requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);\n }\n\n var fullPath = buildFullPath(config.baseURL, config.url);\n request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);\n\n // Set the request timeout in MS\n request.timeout = config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;\n var responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n var response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config: config,\n request: request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(createError('Request aborted', config, 'ECONNABORTED', request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(createError('Network Error', config, null, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n var timeoutErrorMessage = 'timeout of ' + config.timeout + 'ms exceeded';\n var transitional = config.transitional || defaults.transitional;\n if (config.timeoutErrorMessage) {\n timeoutErrorMessage = config.timeoutErrorMessage;\n }\n reject(createError(\n timeoutErrorMessage,\n config,\n transitional.clarifyTimeoutError ? 'ETIMEDOUT' : 'ECONNABORTED',\n request));\n\n // Clean up request\n request = null;\n };\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n if (utils.isStandardBrowserEnv()) {\n // Add xsrf header\n var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ?\n cookies.read(config.xsrfCookieName) :\n undefined;\n\n if (xsrfValue) {\n requestHeaders[config.xsrfHeaderName] = xsrfValue;\n }\n }\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders, function setRequestHeader(val, key) {\n if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {\n // Remove Content-Type if data is undefined\n delete requestHeaders[key];\n } else {\n // Otherwise add header to the request\n request.setRequestHeader(key, val);\n }\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(config.withCredentials)) {\n request.withCredentials = !!config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = config.responseType;\n }\n\n // Handle progress if needed\n if (typeof config.onDownloadProgress === 'function') {\n request.addEventListener('progress', config.onDownloadProgress);\n }\n\n // Not all browsers support upload events\n if (typeof config.onUploadProgress === 'function' && request.upload) {\n request.upload.addEventListener('progress', config.onUploadProgress);\n }\n\n if (config.cancelToken || config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = function(cancel) {\n if (!request) {\n return;\n }\n reject(!cancel || (cancel && cancel.type) ? new Cancel('canceled') : cancel);\n request.abort();\n request = null;\n };\n\n config.cancelToken && config.cancelToken.subscribe(onCanceled);\n if (config.signal) {\n config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n if (!requestData) {\n requestData = null;\n }\n\n // Send the request\n request.send(requestData);\n });\n};\n","'use strict';\n\nvar isAbsoluteURL = require('../helpers/isAbsoluteURL');\nvar combineURLs = require('../helpers/combineURLs');\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n * @returns {string} The combined full path\n */\nmodule.exports = function buildFullPath(baseURL, requestedURL) {\n if (baseURL && !isAbsoluteURL(requestedURL)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n};\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nmodule.exports = function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d\\+\\-\\.]*:)?\\/\\//i.test(url);\n};\n","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n * @returns {string} The combined URL\n */\nmodule.exports = function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/+$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n};\n","'use strict';\n\nvar createError = require('./createError');\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n */\nmodule.exports = function settle(resolve, reject, response) {\n var validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(createError(\n 'Request failed with status code ' + response.status,\n response.config,\n null,\n response.request,\n response\n ));\n }\n};\n","'use strict';\n\nvar utils = require('./utils');\nvar normalizeHeaderName = require('./helpers/normalizeHeaderName');\nvar enhanceError = require('./core/enhanceError');\n\nvar DEFAULT_CONTENT_TYPE = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n};\n\nfunction setContentTypeIfUnset(headers, value) {\n if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {\n headers['Content-Type'] = value;\n }\n}\n\nfunction getDefaultAdapter() {\n var adapter;\n if (typeof XMLHttpRequest !== 'undefined') {\n // For browsers use XHR adapter\n adapter = require('./adapters/xhr');\n } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {\n // For node use HTTP adapter\n adapter = require('./adapters/http');\n }\n return adapter;\n}\n\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nvar defaults = {\n\n transitional: {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n },\n\n adapter: getDefaultAdapter(),\n\n transformRequest: [function transformRequest(data, headers) {\n normalizeHeaderName(headers, 'Accept');\n normalizeHeaderName(headers, 'Content-Type');\n\n if (utils.isFormData(data) ||\n utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');\n return data.toString();\n }\n if (utils.isObject(data) || (headers && headers['Content-Type'] === 'application/json')) {\n setContentTypeIfUnset(headers, 'application/json');\n return stringifySafely(data);\n }\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n var transitional = this.transitional || defaults.transitional;\n var silentJSONParsing = transitional && transitional.silentJSONParsing;\n var forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n var strictJSONParsing = !silentJSONParsing && this.responseType === 'json';\n\n if (strictJSONParsing || (forcedJSONParsing && utils.isString(data) && data.length)) {\n try {\n return JSON.parse(data);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw enhanceError(e, this, 'E_JSON_PARSE');\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*'\n }\n }\n};\n\nutils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {\n defaults.headers[method] = {};\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);\n});\n\nmodule.exports = defaults;\n","'use strict';\n\nvar utils = require('./../utils');\nvar defaults = require('./../defaults');\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Object|String} data The data to be transformed\n * @param {Array} headers The headers for the request or response\n * @param {Array|Function} fns A single function or Array of functions\n * @returns {*} The resulting transformed data\n */\nmodule.exports = function transformData(data, headers, fns) {\n var context = this || defaults;\n /*eslint no-param-reassign:0*/\n utils.forEach(fns, function transform(fn) {\n data = fn.call(context, data, headers);\n });\n\n return data;\n};\n","'use strict';\n\nmodule.exports = function isCancel(value) {\n return !!(value && value.__CANCEL__);\n};\n","'use strict';\n\nvar utils = require('./../utils');\nvar transformData = require('./transformData');\nvar isCancel = require('../cancel/isCancel');\nvar defaults = require('../defaults');\nvar Cancel = require('../cancel/Cancel');\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new Cancel('canceled');\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n * @returns {Promise} The Promise to be fulfilled\n */\nmodule.exports = function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n // Ensure headers exist\n config.headers = config.headers || {};\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.data,\n config.headers,\n config.transformRequest\n );\n\n // Flatten headers\n config.headers = utils.merge(\n config.headers.common || {},\n config.headers[config.method] || {},\n config.headers\n );\n\n utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n function cleanHeaderConfig(method) {\n delete config.headers[method];\n }\n );\n\n var adapter = config.adapter || defaults.adapter;\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n response.data,\n response.headers,\n config.transformResponse\n );\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n reason.response.data,\n reason.response.headers,\n config.transformResponse\n );\n }\n }\n\n return Promise.reject(reason);\n });\n};\n","'use strict';\n\nvar utils = require('../utils');\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n * @returns {Object} New object resulting from merging config2 to config1\n */\nmodule.exports = function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n var config = {};\n\n function getMergedValue(target, source) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge(target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(prop) {\n if (!utils.isUndefined(config2[prop])) {\n return getMergedValue(config1[prop], config2[prop]);\n } else if (!utils.isUndefined(config1[prop])) {\n return getMergedValue(undefined, config1[prop]);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(prop) {\n if (!utils.isUndefined(config2[prop])) {\n return getMergedValue(undefined, config2[prop]);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(prop) {\n if (!utils.isUndefined(config2[prop])) {\n return getMergedValue(undefined, config2[prop]);\n } else if (!utils.isUndefined(config1[prop])) {\n return getMergedValue(undefined, config1[prop]);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(prop) {\n if (prop in config2) {\n return getMergedValue(config1[prop], config2[prop]);\n } else if (prop in config1) {\n return getMergedValue(undefined, config1[prop]);\n }\n }\n\n var mergeMap = {\n 'url': valueFromConfig2,\n 'method': valueFromConfig2,\n 'data': valueFromConfig2,\n 'baseURL': defaultToConfig2,\n 'transformRequest': defaultToConfig2,\n 'transformResponse': defaultToConfig2,\n 'paramsSerializer': defaultToConfig2,\n 'timeout': defaultToConfig2,\n 'timeoutMessage': defaultToConfig2,\n 'withCredentials': defaultToConfig2,\n 'adapter': defaultToConfig2,\n 'responseType': defaultToConfig2,\n 'xsrfCookieName': defaultToConfig2,\n 'xsrfHeaderName': defaultToConfig2,\n 'onUploadProgress': defaultToConfig2,\n 'onDownloadProgress': defaultToConfig2,\n 'decompress': defaultToConfig2,\n 'maxContentLength': defaultToConfig2,\n 'maxBodyLength': defaultToConfig2,\n 'transport': defaultToConfig2,\n 'httpAgent': defaultToConfig2,\n 'httpsAgent': defaultToConfig2,\n 'cancelToken': defaultToConfig2,\n 'socketPath': defaultToConfig2,\n 'responseEncoding': defaultToConfig2,\n 'validateStatus': mergeDirectKeys\n };\n\n utils.forEach(Object.keys(config1).concat(Object.keys(config2)), function computeConfigValue(prop) {\n var merge = mergeMap[prop] || mergeDeepProperties;\n var configValue = merge(prop);\n (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n};\n","module.exports = {\n \"version\": \"0.22.0\"\n};","'use strict';\n\nvar VERSION = require('../env/data').version;\n\nvar validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach(function(type, i) {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nvar deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return function(value, opt, opts) {\n if (validator === false) {\n throw new Error(formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')));\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\n/**\n * Assert object's properties type\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n var keys = Object.keys(options);\n var i = keys.length;\n while (i-- > 0) {\n var opt = keys[i];\n var validator = schema[opt];\n if (validator) {\n var value = options[opt];\n var result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new TypeError('option ' + opt + ' must be ' + result);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw Error('Unknown option ' + opt);\n }\n }\n}\n\nmodule.exports = {\n assertOptions: assertOptions,\n validators: validators\n};\n","'use strict';\n\nvar utils = require('./../utils');\nvar buildURL = require('../helpers/buildURL');\nvar InterceptorManager = require('./InterceptorManager');\nvar dispatchRequest = require('./dispatchRequest');\nvar mergeConfig = require('./mergeConfig');\nvar validator = require('../helpers/validator');\n\nvar validators = validator.validators;\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n */\nfunction Axios(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n}\n\n/**\n * Dispatch a request\n *\n * @param {Object} config The config specific for this request (merged with this.defaults)\n */\nAxios.prototype.request = function request(config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof config === 'string') {\n config = arguments[1] || {};\n config.url = arguments[0];\n } else {\n config = config || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n // Set config.method\n if (config.method) {\n config.method = config.method.toLowerCase();\n } else if (this.defaults.method) {\n config.method = this.defaults.method.toLowerCase();\n } else {\n config.method = 'get';\n }\n\n var transitional = config.transitional;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n // filter out skipped interceptors\n var requestInterceptorChain = [];\n var synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n var responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n var promise;\n\n if (!synchronousRequestInterceptors) {\n var chain = [dispatchRequest, undefined];\n\n Array.prototype.unshift.apply(chain, requestInterceptorChain);\n chain = chain.concat(responseInterceptorChain);\n\n promise = Promise.resolve(config);\n while (chain.length) {\n promise = promise.then(chain.shift(), chain.shift());\n }\n\n return promise;\n }\n\n\n var newConfig = config;\n while (requestInterceptorChain.length) {\n var onFulfilled = requestInterceptorChain.shift();\n var onRejected = requestInterceptorChain.shift();\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected(error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest(newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n while (responseInterceptorChain.length) {\n promise = promise.then(responseInterceptorChain.shift(), responseInterceptorChain.shift());\n }\n\n return promise;\n};\n\nAxios.prototype.getUri = function getUri(config) {\n config = mergeConfig(this.defaults, config);\n return buildURL(config.url, config.params, config.paramsSerializer).replace(/^\\?/, '');\n};\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method: method,\n url: url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method: method,\n url: url,\n data: data\n }));\n };\n});\n\nmodule.exports = Axios;\n","'use strict';\n\nvar Cancel = require('./Cancel');\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @class\n * @param {Function} executor The executor function.\n */\nfunction CancelToken(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n var resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n var token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(function(cancel) {\n if (!token._listeners) return;\n\n var i;\n var l = token._listeners.length;\n\n for (i = 0; i < l; i++) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = function(onfulfilled) {\n var _resolve;\n // eslint-disable-next-line func-names\n var promise = new Promise(function(resolve) {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new Cancel(message);\n resolvePromise(token.reason);\n });\n}\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nCancelToken.prototype.throwIfRequested = function throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n};\n\n/**\n * Subscribe to the cancel signal\n */\n\nCancelToken.prototype.subscribe = function subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n};\n\n/**\n * Unsubscribe from the cancel signal\n */\n\nCancelToken.prototype.unsubscribe = function unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n var index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n};\n\n/**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\nCancelToken.source = function source() {\n var cancel;\n var token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token: token,\n cancel: cancel\n };\n};\n\nmodule.exports = CancelToken;\n","'use strict';\n\nvar utils = require('./utils');\nvar bind = require('./helpers/bind');\nvar Axios = require('./core/Axios');\nvar mergeConfig = require('./core/mergeConfig');\nvar defaults = require('./defaults');\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n * @return {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n var context = new Axios(defaultConfig);\n var instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context);\n\n // Copy context to instance\n utils.extend(instance, context);\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nvar axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.Cancel = require('./cancel/Cancel');\naxios.CancelToken = require('./cancel/CancelToken');\naxios.isCancel = require('./cancel/isCancel');\naxios.VERSION = require('./env/data').version;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\naxios.spread = require('./helpers/spread');\n\n// Expose isAxiosError\naxios.isAxiosError = require('./helpers/isAxiosError');\n\nmodule.exports = axios;\n\n// Allow use of default import syntax in TypeScript\nmodule.exports.default = axios;\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n * @returns {Function}\n */\nmodule.exports = function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n};\n","'use strict';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nmodule.exports = function isAxiosError(payload) {\n return (typeof payload === 'object') && (payload.isAxiosError === true);\n};\n","module.exports = require('./lib/axios');","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nexport default function _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}","export default function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}","export default function _iterableToArrayLimit(arr, i) {\n var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"];\n\n if (_i == null) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n\n var _s, _e;\n\n try {\n for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}","export default function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\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","/* eslint-env browser */\nmodule.exports = typeof self == 'object' ? self.FormData : window.FormData;\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') {\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","// https://github.com/maxogden/websocket-stream/blob/48dc3ddf943e5ada668c31ccd94e9186f02fafbd/ws-fallback.js\n\nvar ws = null\n\nif (typeof WebSocket !== 'undefined') {\n ws = WebSocket\n} else if (typeof MozWebSocket !== 'undefined') {\n ws = MozWebSocket\n} else if (typeof global !== 'undefined') {\n ws = global.WebSocket || global.MozWebSocket\n} else if (typeof window !== 'undefined') {\n ws = window.WebSocket || window.MozWebSocket\n} else if (typeof self !== 'undefined') {\n ws = self.WebSocket || self.MozWebSocket\n}\n\nmodule.exports = ws\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","export default null;","export default null;","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 { 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","export default function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n}","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}","import _typeof from \"@babel/runtime/helpers/typeof\";\nimport assertThisInitialized from \"./assertThisInitialized.js\";\nexport default function _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n } else if (call !== void 0) {\n throw new TypeError(\"Derived constructors may only return object or undefined\");\n }\n\n return assertThisInitialized(self);\n}","export default function _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}","export default function _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}","import setPrototypeOf from \"./setPrototypeOf.js\";\nimport isNativeReflectConstruct from \"./isNativeReflectConstruct.js\";\nexport default function _construct(Parent, args, Class) {\n if (isNativeReflectConstruct()) {\n _construct = Reflect.construct;\n } else {\n _construct = function _construct(Parent, args, Class) {\n var a = [null];\n a.push.apply(a, args);\n var Constructor = Function.bind.apply(Parent, a);\n var instance = new Constructor();\n if (Class) setPrototypeOf(instance, Class.prototype);\n return instance;\n };\n }\n\n return _construct.apply(null, arguments);\n}","import getPrototypeOf from \"./getPrototypeOf.js\";\nimport setPrototypeOf from \"./setPrototypeOf.js\";\nimport isNativeFunction from \"./isNativeFunction.js\";\nimport construct from \"./construct.js\";\nexport default function _wrapNativeSuper(Class) {\n var _cache = typeof Map === \"function\" ? new Map() : undefined;\n\n _wrapNativeSuper = function _wrapNativeSuper(Class) {\n if (Class === null || !isNativeFunction(Class)) return Class;\n\n if (typeof Class !== \"function\") {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n if (typeof _cache !== \"undefined\") {\n if (_cache.has(Class)) return _cache.get(Class);\n\n _cache.set(Class, Wrapper);\n }\n\n function Wrapper() {\n return construct(Class, arguments, getPrototypeOf(this).constructor);\n }\n\n Wrapper.prototype = Object.create(Class.prototype, {\n constructor: {\n value: Wrapper,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n return setPrototypeOf(Wrapper, Class);\n };\n\n return _wrapNativeSuper(Class);\n}","export default function _isNativeFunction(fn) {\n return Function.toString.call(fn).indexOf(\"[native code]\") !== -1;\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","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) setPrototypeOf(subClass, superClass);\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 default null;","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","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"],"names":["uint8","tmp","len","length","extraBytes","parts","maxChunkLength","i","len2","push","encodeChunk","lookup","join","revLookup","code","charCodeAt","start","end","num","output","isString","arrayOrString","isMapStringCallback","callback","encodeBase64","data","fromByteArray","Uint8Array","res","k","charAt","mappedValue","map","char","decodeBase64","s","x","a","e","w","String","fromCharCode","L","b","l","r","_extends","Object","assign","target","arguments","source","key","prototype","hasOwnProperty","call","apply","this","_typeof","obj","Symbol","iterator","constructor","_objectWithoutProperties","excluded","sourceKeys","keys","indexOf","objectWithoutPropertiesLoose","getOwnPropertySymbols","sourceSymbolKeys","propertyIsEnumerable","_arrayLikeToArray","arr","arr2","Array","_unsupportedIterableToArray","o","minLen","arrayLikeToArray","n","toString","slice","name","from","test","_toConsumableArray","isArray","arrayWithoutHoles","iter","iterableToArray","unsupportedIterableToArray","TypeError","nonIterableSpread","asyncGeneratorStep","gen","resolve","reject","_next","_throw","arg","info","value","error","done","Promise","then","_asyncToGenerator","fn","self","args","err","undefined","_classCallCheck","instance","Constructor","_defineProperties","props","descriptor","enumerable","configurable","writable","defineProperty","_createClass","protoProps","staticProps","_defineProperty","runtime","exports","Op","hasOwn","$Symbol","iteratorSymbol","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","toStringTag","define","wrap","innerFn","outerFn","tryLocsList","protoGenerator","Generator","generator","create","context","Context","_invoke","state","GenStateSuspendedStart","method","GenStateExecuting","Error","GenStateCompleted","doneResult","delegate","delegateResult","maybeInvokeDelegate","ContinueSentinel","sent","_sent","dispatchException","abrupt","record","tryCatch","type","GenStateSuspendedYield","makeInvokeMethod","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","getProto","getPrototypeOf","NativeIteratorPrototype","values","Gp","defineIteratorMethods","forEach","AsyncIterator","PromiseImpl","invoke","result","__await","unwrapped","previousPromise","callInvokeWithMethodAndArg","resultName","next","nextLoc","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","reset","iterable","iteratorMethod","isNaN","displayName","isGeneratorFunction","genFun","ctor","mark","setPrototypeOf","__proto__","awrap","async","object","reverse","pop","skipTempReset","prev","stop","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","catch","thrown","delegateYield","module","regeneratorRuntime","accidentalStrictMode","Function","require$$0","thisArg","val","isUndefined","isObject","isPlainObject","isFunction","isArrayBuffer","isBuffer","isFormData","FormData","isArrayBufferView","ArrayBuffer","isView","buffer","isNumber","isDate","isFile","isBlob","isStream","pipe","isURLSearchParams","URLSearchParams","isStandardBrowserEnv","navigator","product","window","document","merge","assignValue","extend","bind","trim","str","replace","stripBOM","content","encode","encodeURIComponent","url","params","paramsSerializer","serializedParams","utils","v","toISOString","JSON","stringify","hashmarkIndex","InterceptorManager","handlers","use","fulfilled","rejected","options","synchronous","runWhen","eject","id","h","headers","normalizedName","toUpperCase","config","request","response","isAxiosError","toJSON","message","description","number","fileName","lineNumber","columnNumber","stack","status","enhanceError","write","expires","path","domain","secure","cookie","Date","toGMTString","read","match","RegExp","decodeURIComponent","remove","now","ignoreDuplicateOf","originURL","msie","userAgent","urlParsingNode","createElement","resolveURL","href","setAttribute","protocol","host","search","hash","hostname","port","pathname","location","requestURL","parsed","Cancel","__CANCEL__","onCanceled","requestData","requestHeaders","responseType","cancelToken","unsubscribe","signal","removeEventListener","XMLHttpRequest","auth","username","password","unescape","Authorization","btoa","baseURL","requestedURL","fullPath","relativeURL","combineURLs","onloadend","responseHeaders","split","line","substr","toLowerCase","concat","parseHeaders","getAllResponseHeaders","validateStatus","createError","settle","responseText","statusText","open","buildURL","timeout","onreadystatechange","readyState","responseURL","setTimeout","onabort","onerror","ontimeout","timeoutErrorMessage","transitional","defaults","clarifyTimeoutError","xsrfValue","withCredentials","isURLSameOrigin","xsrfCookieName","cookies","xsrfHeaderName","setRequestHeader","onDownloadProgress","addEventListener","onUploadProgress","upload","cancel","abort","subscribe","aborted","send","DEFAULT_CONTENT_TYPE","setContentTypeIfUnset","adapter","silentJSONParsing","forcedJSONParsing","process","transformRequest","normalizeHeaderName","rawValue","parser","encoder","parse","stringifySafely","transformResponse","strictJSONParsing","maxContentLength","maxBodyLength","common","Accept","fns","throwIfCancellationRequested","throwIfRequested","transformData","reason","isCancel","config1","config2","getMergedValue","mergeDeepProperties","prop","valueFromConfig2","defaultToConfig2","mergeDirectKeys","mergeMap","timeoutMessage","decompress","transport","httpAgent","httpsAgent","socketPath","responseEncoding","configValue","VERSION","validators","thing","deprecatedWarnings","validator","version","formatMessage","opt","desc","opts","console","warn","assertOptions","schema","allowUnknown","Axios","instanceConfig","interceptors","mergeConfig","boolean","requestInterceptorChain","synchronousRequestInterceptors","interceptor","unshift","promise","responseInterceptorChain","chain","dispatchRequest","shift","newConfig","onFulfilled","onRejected","getUri","CancelToken","executor","resolvePromise","token","_listeners","onfulfilled","_resolve","listener","index","splice","c","axios","createInstance","defaultConfig","require$$1","require$$2","require$$3","all","promises","spread","payload","_slicedToArray","arrayWithHoles","_i","_s","_e","_arr","_n","_d","iterableToArrayLimit","nonIterableRest","ChannelState","channel","isUpToDate","_this","msgArray","msg","filter","removed","user","_updateUserMessages","messages","m","parentId","messageSets","set","threads","pinnedMessages","hardDelete","_deleteUserMessages","cid","created_at","deleted_at","latest_reactions","mentioned_users","own_reactions","parent_id","reply_count","thread_participants","updated_at","_channel","watcher_count","typing","initMessages","pending_messages","mutedUsers","watchers","members","membership","unreadCount","last_message_at","find","isCurrent","findIndex","isLatest","newMessage","timestampChanged","addIfDoesNotExist","messageSetToAddToIfDoesNotExist","addMessagesSorted","__html","html","pinned_at","newMessages","initializing","findTargetMessageSet","messagesToAdd","targetMessageSetIndex","isFromShadowBannedUser","shadowed","isMessageFormatted","_this$_channel","getClient","updateUserReference","getTime","parentID","show_in_channel","_addToMessageList","thread","threadMessages","messageSet","addPinnedMessage","pinnedMessage","removeMessageFromArray","reaction","enforce_unique","messageWithReaction","_updateMessage","_this2","_addOwnReactionToMessage","ownReactions","_removeOwnReactionFromMessage","userID","user_id","item","_this3","parseMessage","_m$pinned_at","_m$updated_at","updatedMessages","quoted_message_id","quoted_message","attachments","_this4","updateFunc","pinned","msgIndex","messageSetIndex","findMessageSetIndex","sortBy","addMessageToList","messageArr","messageArrayLength","messageTime","messageIsNewest","left","middle","right","Math","floor","messageToRemove","isRemoved","filteredMessages","latestMessages","entries","lastEvent","receivedAt","received_at","dispatchEvent","messageId","parentMessageId","limit","switchedToMessageSet","loadedMessageThread","messageIdToFind","switchToMessageSet","_this$threads$parentM","query","id_around","getReplies","currentMessages","messages1","messages2","some","m1","m2","overlappingMessageSetIndices","_","_this5","areMessageSetsOverlap","mergeTargetMessageSetIndex","mergeSourceMessageSetIndices","sources","overlappingMessageSetIndex","logChatPromiseExecution","sleep","chatCodes","TOKEN_EXPIRED","WS_CLOSED_SUCCESS","addFileToFormData","uri","contentType","readable","_read","File","isFileWebAPI","Blob","isBlobWebAPI","append","normalizeQuerySort","sort","sortFields","field","direction","retryInterval","numberOfFailures","max","min","random","randomId","bytes","getRandomValues","getRandomBytes","hex","subarray","padStart","getRandomValuesWithMathRandom","pow","byteLength","crypto","msCrypto","convertErrorToJson","jsonObj","getOwnPropertyNames","getOwnPropertyDescriptor","addConnectionEventListeners","cb","removeConnectionEventListeners","Channel","client","watch","presence","event","listeners","_client","_data","initialized","offlineMode","lastTypingEvent","isTyping","disconnected","configs","post","_channelURL","sendMessageResponse","sendFile","delete","_checkInitialized","offset","filter_conditions","message_filter_conditions","wsPromise","get","filterConditions","messageID","reactionType","channelData","updateMessage","_update","update","patch","coolDownInterval","cooldown","accept_invite","reject_invite","add_members","add_moderators","roles","assign_roles","invites","remove_members","demote_moderators","channel_cid","_muteStatus","formData","message_id","form_data","getConfig","_this$getConfig","typing_events","diff","lastKeyStroke","sendEvent","_this$getConfig2","messageSlice","_this$getConfig3","read_events","stopTyping","clean","defaultOptions","_hasConnectionID","combined","logger","tags","messageIds","ids","last_read","silent","userMuteStatus","_this$data2","own_capabilities","_this$data3","includes","muteStatus","muted","lastRead","count","_countMessageAsUnread","_message$mentioned_us","queryURL","membersStr","member","_member$user","tempChannelCid","activeChannels","_addChannelConfig","_initializeState","queriedChannels","channels","isLatestMessageSet","targetUserID","banUser","userId","clearHistory","clear_history","unbanUser","shadowBan","removeShadowBan","callbackOrString","callbackOrNothing","el","channelState","_event$user","_event$user2","_event$user3","unread_messages","_this$getClient$user","_event$user5","_event$user6","_extendEventWithOwnReactions","hard_delete","removeMessage","addMessageSorted","removeQuotedMessageReferences","removePinnedMessage","ownMessage","_this$getClient$user2","isThreadMessage","_event$user8","_event$channel","truncated_at","truncatedAt","createdAt","clearMessages","_event$member","_event$user9","hidden","_event$channel2","_channel$data","_event$channel3","_channel$data2","addReaction","removeReaction","_isUsingServerAuth","clientState","addPinnedMessages","pinned_messages","watcher","reduce","acc","findMessage","setIsUpToDate","ClientState","users","userChannelReferences","updateUser","channelID","ws","WebSocket","MozWebSocket","global","InsightMetrics","connectionStartTimestamp","wsTotalFailures","wsConsecutiveFailures","instanceClientId","postInsights","insightType","insights","maxAttempts","buildWsFatalInsight","connection","buildWsBaseInsight","ready_state","_connection$ws","_buildUrl","api_key","start_ts","insightMetrics","end_ts","auth_type","getAuthType","tokenManager","user_details","_user","device","client_id","connectionID","ws_details","ws_consecutive_failures","ws_total_failures","request_id","requestID","online","_navigator","onLine","user_agent","_navigator2","instance_client_id","buildWsSuccessAfterFailureInsight","isCloseEvent","isErrorEvent","StableWSConnection","qs","_buildWSPayload","getToken","wsBaseURL","getUserAgent","_log","_setHealth","isHealthy","_reconnect","interval","wsID","isResolved","rejectPromise","_errorFromWSEvent","scheduleNextPing","handleEvent","scheduleConnectionCheck","wasClean","consecutiveFailures","totalFailures","isConnecting","healthy","statusCode","isWSFailure","StatusCode","connectionOpen","healthCheckTimeoutRef","clearTimeout","clientID","pingInterval","connectionCheckTimeoutRef","connectionCheckTimeout","isDisconnected","onlineStatusChanged","extra","level","_connect","healthCheck","_context","isStatic","refreshToken","_waitForHealthy","race","_context2","isClosedPromise","clearInterval","removeAllListeners","close","OPEN","onclose","enableWSFallback","isTokenReady","tokenReady","loadToken","_setupConnectionPromise","wsURL","onopen","onmessage","connection_id","enableInsights","_destroyCurrentWSConnection","recoverState","_context6","JWTUserToken","apiSecret","extraData","JWTServerToken","jwtOptions","server","algorithm","noTimestamp","sign","UserFromToken","fragments","b64Payload","DevToken","CheckSignature","body","secret","signature","Buffer","createHmac","digest","ConnectionState","TokenManager","tokenOrProvider","validateToken","tokenProvider","loadTokenPromise","anon","tokenUserId","APIErrorCodes","retryable","isAPIError","isErrorRetryable","WSConnectionFallback","_setState","Closed","connect","retry","doAxiosRequest","_this$cancelToken2","_req","Connected","events","_data$events","Disconnected","reconnect","Connecting","json","_poll","_onlineStatusChanged","Init","_assertThisInitialized","ReferenceError","_setPrototypeOf","p","_possibleConstructorReturn","assertThisInitialized","_getPrototypeOf","_isNativeReflectConstruct","Reflect","construct","sham","Proxy","Boolean","valueOf","_construct","Parent","Class","isNativeReflectConstruct","_wrapNativeSuper","_cache","Map","isNativeFunction","has","Wrapper","ErrorFromResponse","subClass","superClass","StreamChat","secretOrOptions","wsConnection","wsFallback","_this$wsFallback","_getConnectionID","userTokenOrProvider","setUserPromise","node","allowServerSideConnect","anonymous","setTokenPromise","_setToken","_setUser","openConnection","persistUserOnConnectionFailure","closeConnection","disconnectUser","connectUser","setTokenOrProvider","cleaningIntervalRef","_this$wsConnection2","disconnect","_this$wsFallback2","_this$wsFallback3","_startCleaning","before","closePromise","_disconnect","anonymousUser","_setupConnection","connectAnonymousUser","requestConfig","_enrichAxiosOptions","_logApiRequest","axiosInstance","put","_logApiResponse","handleResponse","client_request_id","_requestConfig$header","_logApiError","_context5","postListenerCallbacks","_handleClientEvent","_handleChannelEvent","_callClientListeners","_callChannelListeners","messageEvent","jsonString","refMap","_updateMemberWatcherReferences","updateUserMessages","deleteUserMessages","channel_mutes","devices","mutes","total_unread_count","unread_channels","unread_count","invisible","_updateUserMessageReferences","mark_messages_deleted","_deleteUserMessageReference","cids","recoverStateOnReconnect","queryChannels","$in","channelType","custom","tempCid","upsertUsers","upsertUser","markChannelsRead","mutedChannels","inputOptions","browser","warmUp","Agent","keepAlive","keepAliveMsecs","setBaseURL","env","STREAM_LOCAL_TEST_RUN","STREAM_LOCAL_TEST_HOST","_this$options","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","iat","getHeaders","Infinity","errorFromResponse","_handleUserEvent","me","_event$me","currentMutedChannelIds","nextMutedChannelIds","mute","_event$me2","activeChannelKey","deleteAllChannelReference","expiresAt","_sayHi","setClient","nav","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","mu","partialMessageObject","hard","_getToken","authorization","nextRequestAbortController","_options$headers","that","setInterval","requestBody","xSignature","permissionData","channel_cids","last_sync_at","blockList","exportChannels","segment","filters","campaign","scheduledFor","scheduled_for","user_ids","conversations","filename","pushProvider","AbortController","_instance","Allow","Deny","AnyResource","AnyRole","Permission","priority","resources","owner","action","AllowAll","DenyAll","AddLinks","BanUser","CreateChannel","CreateMessage","CreateReaction","DeleteAnyAttachment","DeleteAnyChannel","DeleteAnyMessage","DeleteAnyReaction","DeleteOwnAttachment","DeleteOwnChannel","DeleteOwnMessage","DeleteOwnReaction","ReadAnyChannel","ReadOwnChannel","RunMessageAction","UpdateAnyChannel","UpdateAnyMessage","UpdateMembersAnyChannel","UpdateMembersOwnChannel","UpdateOwnChannel","UpdateOwnMessage","UploadAttachment","UseFrozenChannel","Admin","Anonymous","ChannelMember","ChannelModerator","Guest","User"],"mappings":"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"}
1
+ {"version":3,"file":"browser.full-bundle.min.js","sources":["../node_modules/base64-js/index.js","../src/base64.ts","../node_modules/@babel/runtime/helpers/esm/extends.js","../node_modules/@babel/runtime/helpers/esm/typeof.js","../node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js","../node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","../node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","../node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","../node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","../node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","../node_modules/@babel/runtime/helpers/esm/iterableToArray.js","../node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","../node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js","../node_modules/@babel/runtime/helpers/esm/classCallCheck.js","../node_modules/@babel/runtime/helpers/esm/createClass.js","../node_modules/@babel/runtime/helpers/esm/defineProperty.js","../node_modules/regenerator-runtime/runtime.js","../node_modules/@babel/runtime/regenerator/index.js","../node_modules/axios/lib/helpers/bind.js","../node_modules/axios/lib/utils.js","../node_modules/axios/lib/helpers/buildURL.js","../node_modules/axios/lib/core/InterceptorManager.js","../node_modules/axios/lib/helpers/normalizeHeaderName.js","../node_modules/axios/lib/core/enhanceError.js","../node_modules/axios/lib/core/createError.js","../node_modules/axios/lib/helpers/cookies.js","../node_modules/axios/lib/helpers/parseHeaders.js","../node_modules/axios/lib/helpers/isURLSameOrigin.js","../node_modules/axios/lib/cancel/Cancel.js","../node_modules/axios/lib/adapters/xhr.js","../node_modules/axios/lib/core/buildFullPath.js","../node_modules/axios/lib/helpers/isAbsoluteURL.js","../node_modules/axios/lib/helpers/combineURLs.js","../node_modules/axios/lib/core/settle.js","../node_modules/axios/lib/defaults.js","../node_modules/axios/lib/core/transformData.js","../node_modules/axios/lib/cancel/isCancel.js","../node_modules/axios/lib/core/dispatchRequest.js","../node_modules/axios/lib/core/mergeConfig.js","../node_modules/axios/lib/env/data.js","../node_modules/axios/lib/helpers/validator.js","../node_modules/axios/lib/core/Axios.js","../node_modules/axios/lib/cancel/CancelToken.js","../node_modules/axios/lib/axios.js","../node_modules/axios/lib/helpers/spread.js","../node_modules/axios/lib/helpers/isAxiosError.js","../node_modules/axios/index.js","../node_modules/@babel/runtime/helpers/esm/slicedToArray.js","../node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","../node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","../node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","../src/channel_state.ts","../node_modules/form-data/lib/browser.js","../src/utils.ts","../src/channel.ts","../src/client_state.ts","../node_modules/isomorphic-ws/browser.js","../src/insights.ts","../src/connection.ts","../src/signing.ts","../jsonwebtoken","../crypto","../src/connection_fallback.ts","../src/token_manager.ts","../src/errors.ts","../node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","../node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","../node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js","../node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js","../node_modules/@babel/runtime/helpers/esm/isNativeReflectConstruct.js","../node_modules/@babel/runtime/helpers/esm/construct.js","../node_modules/@babel/runtime/helpers/esm/wrapNativeSuper.js","../node_modules/@babel/runtime/helpers/esm/isNativeFunction.js","../src/types.ts","../node_modules/@babel/runtime/helpers/esm/inherits.js","../src/client.ts","../https","../src/permissions.ts","../src/events.ts"],"sourcesContent":["'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n var i\n for (i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n","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","export default function _extends() {\n _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}","export default function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function _typeof(obj) {\n return typeof obj;\n };\n } else {\n _typeof = function _typeof(obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}","import objectWithoutPropertiesLoose from \"./objectWithoutPropertiesLoose.js\";\nexport default function _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n}","export default function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}","export default function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","import arrayWithoutHoles from \"./arrayWithoutHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableSpread from \"./nonIterableSpread.js\";\nexport default function _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}","export default function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}","export default function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\n\nexport default function _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n\n _next(undefined);\n });\n };\n}","export default function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}","function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nexport default function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}","export default function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n function define(obj, key, value) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n return obj[key];\n }\n try {\n // IE 8 has a broken Object.defineProperty that only works on DOM objects.\n define({}, \"\");\n } catch (err) {\n define = function(obj, key, value) {\n return obj[key] = value;\n };\n }\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n exports.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunction.displayName = define(\n GeneratorFunctionPrototype,\n toStringTagSymbol,\n \"GeneratorFunction\"\n );\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n define(prototype, method, function(arg) {\n return this._invoke(method, arg);\n });\n });\n }\n\n exports.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n exports.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n define(genFun, toStringTagSymbol, \"GeneratorFunction\");\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n exports.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator, PromiseImpl) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return PromiseImpl.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return PromiseImpl.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration.\n result.value = unwrapped;\n resolve(result);\n }, function(error) {\n // If a rejected Promise was yielded, throw the rejection back\n // into the async generator function so it can be handled there.\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n exports.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n if (PromiseImpl === void 0) PromiseImpl = Promise;\n\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList),\n PromiseImpl\n );\n\n return exports.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n // Note: [\"return\"] must be used for ES3 parsing compatibility.\n if (delegate.iterator[\"return\"]) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n define(Gp, toStringTagSymbol, \"Generator\");\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n exports.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n exports.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n\n // Regardless of whether this script is executing as a CommonJS module\n // or not, return the runtime object so that we can declare the variable\n // regeneratorRuntime in the outer scope, which allows this module to be\n // injected easily by `bin/regenerator --include-runtime script.js`.\n return exports;\n\n}(\n // If this script is executing as a CommonJS module, use module.exports\n // as the regeneratorRuntime namespace. Otherwise create a new empty\n // object. Either way, the resulting object will be used to initialize\n // the regeneratorRuntime variable at the top of this file.\n typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n // This module should not be running in strict mode, so the above\n // assignment should always work unless something is misconfigured. Just\n // in case runtime.js accidentally runs in strict mode, we can escape\n // strict mode using a global Function call. This could conceivably fail\n // if a Content Security Policy forbids using Function, but in that case\n // the proper solution is to fix the accidental strict mode problem. If\n // you've misconfigured your bundler to force strict mode and applied a\n // CSP to forbid Function, and you're not willing to fix either of those\n // problems, please detail your unique predicament in a GitHub issue.\n Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n}\n","module.exports = require(\"regenerator-runtime\");\n","'use strict';\n\nmodule.exports = function bind(fn, thisArg) {\n return function wrap() {\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i];\n }\n return fn.apply(thisArg, args);\n };\n};\n","'use strict';\n\nvar bind = require('./helpers/bind');\n\n// utils is a library of generic helper functions non-specific to axios\n\nvar toString = Object.prototype.toString;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Array, otherwise false\n */\nfunction isArray(val) {\n return toString.call(val) === '[object Array]';\n}\n\n/**\n * Determine if a value is undefined\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nfunction isUndefined(val) {\n return typeof val === 'undefined';\n}\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nfunction isArrayBuffer(val) {\n return toString.call(val) === '[object ArrayBuffer]';\n}\n\n/**\n * Determine if a value is a FormData\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nfunction isFormData(val) {\n return (typeof FormData !== 'undefined') && (val instanceof FormData);\n}\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n var result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer);\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a String, otherwise false\n */\nfunction isString(val) {\n return typeof val === 'string';\n}\n\n/**\n * Determine if a value is a Number\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Number, otherwise false\n */\nfunction isNumber(val) {\n return typeof val === 'number';\n}\n\n/**\n * Determine if a value is an Object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Object, otherwise false\n */\nfunction isObject(val) {\n return val !== null && typeof val === 'object';\n}\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {Object} val The value to test\n * @return {boolean} True if value is a plain Object, otherwise false\n */\nfunction isPlainObject(val) {\n if (toString.call(val) !== '[object Object]') {\n return false;\n }\n\n var prototype = Object.getPrototypeOf(val);\n return prototype === null || prototype === Object.prototype;\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Date, otherwise false\n */\nfunction isDate(val) {\n return toString.call(val) === '[object Date]';\n}\n\n/**\n * Determine if a value is a File\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a File, otherwise false\n */\nfunction isFile(val) {\n return toString.call(val) === '[object File]';\n}\n\n/**\n * Determine if a value is a Blob\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nfunction isBlob(val) {\n return toString.call(val) === '[object Blob]';\n}\n\n/**\n * Determine if a value is a Function\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nfunction isFunction(val) {\n return toString.call(val) === '[object Function]';\n}\n\n/**\n * Determine if a value is a Stream\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nfunction isStream(val) {\n return isObject(val) && isFunction(val.pipe);\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nfunction isURLSearchParams(val) {\n return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams;\n}\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n * @returns {String} The String freed of excess whitespace\n */\nfunction trim(str) {\n return str.trim ? str.trim() : str.replace(/^\\s+|\\s+$/g, '');\n}\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n */\nfunction isStandardBrowserEnv() {\n if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' ||\n navigator.product === 'NativeScript' ||\n navigator.product === 'NS')) {\n return false;\n }\n return (\n typeof window !== 'undefined' &&\n typeof document !== 'undefined'\n );\n}\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n */\nfunction forEach(obj, fn) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (var i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n fn.call(null, obj[key], key, obj);\n }\n }\n }\n}\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n var result = {};\n function assignValue(val, key) {\n if (isPlainObject(result[key]) && isPlainObject(val)) {\n result[key] = merge(result[key], val);\n } else if (isPlainObject(val)) {\n result[key] = merge({}, val);\n } else if (isArray(val)) {\n result[key] = val.slice();\n } else {\n result[key] = val;\n }\n }\n\n for (var i = 0, l = arguments.length; i < l; i++) {\n forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n * @return {Object} The resulting value of object a\n */\nfunction extend(a, b, thisArg) {\n forEach(b, function assignValue(val, key) {\n if (thisArg && typeof val === 'function') {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n });\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n * @return {string} content value without BOM\n */\nfunction stripBOM(content) {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\nmodule.exports = {\n isArray: isArray,\n isArrayBuffer: isArrayBuffer,\n isBuffer: isBuffer,\n isFormData: isFormData,\n isArrayBufferView: isArrayBufferView,\n isString: isString,\n isNumber: isNumber,\n isObject: isObject,\n isPlainObject: isPlainObject,\n isUndefined: isUndefined,\n isDate: isDate,\n isFile: isFile,\n isBlob: isBlob,\n isFunction: isFunction,\n isStream: isStream,\n isURLSearchParams: isURLSearchParams,\n isStandardBrowserEnv: isStandardBrowserEnv,\n forEach: forEach,\n merge: merge,\n extend: extend,\n trim: trim,\n stripBOM: stripBOM\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @returns {string} The formatted url\n */\nmodule.exports = function buildURL(url, params, paramsSerializer) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n\n var serializedParams;\n if (paramsSerializer) {\n serializedParams = paramsSerializer(params);\n } else if (utils.isURLSearchParams(params)) {\n serializedParams = params.toString();\n } else {\n var parts = [];\n\n utils.forEach(params, function serialize(val, key) {\n if (val === null || typeof val === 'undefined') {\n return;\n }\n\n if (utils.isArray(val)) {\n key = key + '[]';\n } else {\n val = [val];\n }\n\n utils.forEach(val, function parseValue(v) {\n if (utils.isDate(v)) {\n v = v.toISOString();\n } else if (utils.isObject(v)) {\n v = JSON.stringify(v);\n }\n parts.push(encode(key) + '=' + encode(v));\n });\n });\n\n serializedParams = parts.join('&');\n }\n\n if (serializedParams) {\n var hashmarkIndex = url.indexOf('#');\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nfunction InterceptorManager() {\n this.handlers = [];\n}\n\n/**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\nInterceptorManager.prototype.use = function use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled: fulfilled,\n rejected: rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n};\n\n/**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n */\nInterceptorManager.prototype.eject = function eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n};\n\n/**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n */\nInterceptorManager.prototype.forEach = function forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n};\n\nmodule.exports = InterceptorManager;\n","'use strict';\n\nvar utils = require('../utils');\n\nmodule.exports = function normalizeHeaderName(headers, normalizedName) {\n utils.forEach(headers, function processHeader(value, name) {\n if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {\n headers[normalizedName] = value;\n delete headers[name];\n }\n });\n};\n","'use strict';\n\n/**\n * Update an Error with the specified config, error code, and response.\n *\n * @param {Error} error The error to update.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The error.\n */\nmodule.exports = function enhanceError(error, config, code, request, response) {\n error.config = config;\n if (code) {\n error.code = code;\n }\n\n error.request = request;\n error.response = response;\n error.isAxiosError = true;\n\n error.toJSON = function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: this.config,\n code: this.code,\n status: this.response && this.response.status ? this.response.status : null\n };\n };\n return error;\n};\n","'use strict';\n\nvar enhanceError = require('./enhanceError');\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The created error.\n */\nmodule.exports = function createError(message, config, code, request, response) {\n var error = new Error(message);\n return enhanceError(error, config, code, request, response);\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs support document.cookie\n (function standardBrowserEnv() {\n return {\n write: function write(name, value, expires, path, domain, secure) {\n var cookie = [];\n cookie.push(name + '=' + encodeURIComponent(value));\n\n if (utils.isNumber(expires)) {\n cookie.push('expires=' + new Date(expires).toGMTString());\n }\n\n if (utils.isString(path)) {\n cookie.push('path=' + path);\n }\n\n if (utils.isString(domain)) {\n cookie.push('domain=' + domain);\n }\n\n if (secure === true) {\n cookie.push('secure');\n }\n\n document.cookie = cookie.join('; ');\n },\n\n read: function read(name) {\n var match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove: function remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n };\n })() :\n\n // Non standard browser env (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return {\n write: function write() {},\n read: function read() { return null; },\n remove: function remove() {}\n };\n })()\n);\n","'use strict';\n\nvar utils = require('./../utils');\n\n// Headers whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nvar ignoreDuplicateOf = [\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n];\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} headers Headers needing to be parsed\n * @returns {Object} Headers parsed into an object\n */\nmodule.exports = function parseHeaders(headers) {\n var parsed = {};\n var key;\n var val;\n var i;\n\n if (!headers) { return parsed; }\n\n utils.forEach(headers.split('\\n'), function parser(line) {\n i = line.indexOf(':');\n key = utils.trim(line.substr(0, i)).toLowerCase();\n val = utils.trim(line.substr(i + 1));\n\n if (key) {\n if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {\n return;\n }\n if (key === 'set-cookie') {\n parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n }\n });\n\n return parsed;\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs have full support of the APIs needed to test\n // whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n var msie = /(msie|trident)/i.test(navigator.userAgent);\n var urlParsingNode = document.createElement('a');\n var originURL;\n\n /**\n * Parse a URL to discover it's components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n var href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })()\n);\n","'use strict';\n\n/**\n * A `Cancel` is an object that is thrown when an operation is canceled.\n *\n * @class\n * @param {string=} message The message.\n */\nfunction Cancel(message) {\n this.message = message;\n}\n\nCancel.prototype.toString = function toString() {\n return 'Cancel' + (this.message ? ': ' + this.message : '');\n};\n\nCancel.prototype.__CANCEL__ = true;\n\nmodule.exports = Cancel;\n","'use strict';\n\nvar utils = require('./../utils');\nvar settle = require('./../core/settle');\nvar cookies = require('./../helpers/cookies');\nvar buildURL = require('./../helpers/buildURL');\nvar buildFullPath = require('../core/buildFullPath');\nvar parseHeaders = require('./../helpers/parseHeaders');\nvar isURLSameOrigin = require('./../helpers/isURLSameOrigin');\nvar createError = require('../core/createError');\nvar defaults = require('../defaults');\nvar Cancel = require('../cancel/Cancel');\n\nmodule.exports = function xhrAdapter(config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n var requestData = config.data;\n var requestHeaders = config.headers;\n var responseType = config.responseType;\n var onCanceled;\n function done() {\n if (config.cancelToken) {\n config.cancelToken.unsubscribe(onCanceled);\n }\n\n if (config.signal) {\n config.signal.removeEventListener('abort', onCanceled);\n }\n }\n\n if (utils.isFormData(requestData)) {\n delete requestHeaders['Content-Type']; // Let the browser set it\n }\n\n var request = new XMLHttpRequest();\n\n // HTTP basic authentication\n if (config.auth) {\n var username = config.auth.username || '';\n var password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';\n requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);\n }\n\n var fullPath = buildFullPath(config.baseURL, config.url);\n request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);\n\n // Set the request timeout in MS\n request.timeout = config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;\n var responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n var response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config: config,\n request: request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(createError('Request aborted', config, 'ECONNABORTED', request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(createError('Network Error', config, null, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n var timeoutErrorMessage = 'timeout of ' + config.timeout + 'ms exceeded';\n var transitional = config.transitional || defaults.transitional;\n if (config.timeoutErrorMessage) {\n timeoutErrorMessage = config.timeoutErrorMessage;\n }\n reject(createError(\n timeoutErrorMessage,\n config,\n transitional.clarifyTimeoutError ? 'ETIMEDOUT' : 'ECONNABORTED',\n request));\n\n // Clean up request\n request = null;\n };\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n if (utils.isStandardBrowserEnv()) {\n // Add xsrf header\n var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ?\n cookies.read(config.xsrfCookieName) :\n undefined;\n\n if (xsrfValue) {\n requestHeaders[config.xsrfHeaderName] = xsrfValue;\n }\n }\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders, function setRequestHeader(val, key) {\n if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {\n // Remove Content-Type if data is undefined\n delete requestHeaders[key];\n } else {\n // Otherwise add header to the request\n request.setRequestHeader(key, val);\n }\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(config.withCredentials)) {\n request.withCredentials = !!config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = config.responseType;\n }\n\n // Handle progress if needed\n if (typeof config.onDownloadProgress === 'function') {\n request.addEventListener('progress', config.onDownloadProgress);\n }\n\n // Not all browsers support upload events\n if (typeof config.onUploadProgress === 'function' && request.upload) {\n request.upload.addEventListener('progress', config.onUploadProgress);\n }\n\n if (config.cancelToken || config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = function(cancel) {\n if (!request) {\n return;\n }\n reject(!cancel || (cancel && cancel.type) ? new Cancel('canceled') : cancel);\n request.abort();\n request = null;\n };\n\n config.cancelToken && config.cancelToken.subscribe(onCanceled);\n if (config.signal) {\n config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n if (!requestData) {\n requestData = null;\n }\n\n // Send the request\n request.send(requestData);\n });\n};\n","'use strict';\n\nvar isAbsoluteURL = require('../helpers/isAbsoluteURL');\nvar combineURLs = require('../helpers/combineURLs');\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n * @returns {string} The combined full path\n */\nmodule.exports = function buildFullPath(baseURL, requestedURL) {\n if (baseURL && !isAbsoluteURL(requestedURL)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n};\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nmodule.exports = function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"<scheme>://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d\\+\\-\\.]*:)?\\/\\//i.test(url);\n};\n","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n * @returns {string} The combined URL\n */\nmodule.exports = function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/+$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n};\n","'use strict';\n\nvar createError = require('./createError');\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n */\nmodule.exports = function settle(resolve, reject, response) {\n var validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(createError(\n 'Request failed with status code ' + response.status,\n response.config,\n null,\n response.request,\n response\n ));\n }\n};\n","'use strict';\n\nvar utils = require('./utils');\nvar normalizeHeaderName = require('./helpers/normalizeHeaderName');\nvar enhanceError = require('./core/enhanceError');\n\nvar DEFAULT_CONTENT_TYPE = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n};\n\nfunction setContentTypeIfUnset(headers, value) {\n if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {\n headers['Content-Type'] = value;\n }\n}\n\nfunction getDefaultAdapter() {\n var adapter;\n if (typeof XMLHttpRequest !== 'undefined') {\n // For browsers use XHR adapter\n adapter = require('./adapters/xhr');\n } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {\n // For node use HTTP adapter\n adapter = require('./adapters/http');\n }\n return adapter;\n}\n\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nvar defaults = {\n\n transitional: {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n },\n\n adapter: getDefaultAdapter(),\n\n transformRequest: [function transformRequest(data, headers) {\n normalizeHeaderName(headers, 'Accept');\n normalizeHeaderName(headers, 'Content-Type');\n\n if (utils.isFormData(data) ||\n utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');\n return data.toString();\n }\n if (utils.isObject(data) || (headers && headers['Content-Type'] === 'application/json')) {\n setContentTypeIfUnset(headers, 'application/json');\n return stringifySafely(data);\n }\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n var transitional = this.transitional || defaults.transitional;\n var silentJSONParsing = transitional && transitional.silentJSONParsing;\n var forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n var strictJSONParsing = !silentJSONParsing && this.responseType === 'json';\n\n if (strictJSONParsing || (forcedJSONParsing && utils.isString(data) && data.length)) {\n try {\n return JSON.parse(data);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw enhanceError(e, this, 'E_JSON_PARSE');\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*'\n }\n }\n};\n\nutils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {\n defaults.headers[method] = {};\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);\n});\n\nmodule.exports = defaults;\n","'use strict';\n\nvar utils = require('./../utils');\nvar defaults = require('./../defaults');\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Object|String} data The data to be transformed\n * @param {Array} headers The headers for the request or response\n * @param {Array|Function} fns A single function or Array of functions\n * @returns {*} The resulting transformed data\n */\nmodule.exports = function transformData(data, headers, fns) {\n var context = this || defaults;\n /*eslint no-param-reassign:0*/\n utils.forEach(fns, function transform(fn) {\n data = fn.call(context, data, headers);\n });\n\n return data;\n};\n","'use strict';\n\nmodule.exports = function isCancel(value) {\n return !!(value && value.__CANCEL__);\n};\n","'use strict';\n\nvar utils = require('./../utils');\nvar transformData = require('./transformData');\nvar isCancel = require('../cancel/isCancel');\nvar defaults = require('../defaults');\nvar Cancel = require('../cancel/Cancel');\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new Cancel('canceled');\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n * @returns {Promise} The Promise to be fulfilled\n */\nmodule.exports = function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n // Ensure headers exist\n config.headers = config.headers || {};\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.data,\n config.headers,\n config.transformRequest\n );\n\n // Flatten headers\n config.headers = utils.merge(\n config.headers.common || {},\n config.headers[config.method] || {},\n config.headers\n );\n\n utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n function cleanHeaderConfig(method) {\n delete config.headers[method];\n }\n );\n\n var adapter = config.adapter || defaults.adapter;\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n response.data,\n response.headers,\n config.transformResponse\n );\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n reason.response.data,\n reason.response.headers,\n config.transformResponse\n );\n }\n }\n\n return Promise.reject(reason);\n });\n};\n","'use strict';\n\nvar utils = require('../utils');\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n * @returns {Object} New object resulting from merging config2 to config1\n */\nmodule.exports = function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n var config = {};\n\n function getMergedValue(target, source) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge(target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(prop) {\n if (!utils.isUndefined(config2[prop])) {\n return getMergedValue(config1[prop], config2[prop]);\n } else if (!utils.isUndefined(config1[prop])) {\n return getMergedValue(undefined, config1[prop]);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(prop) {\n if (!utils.isUndefined(config2[prop])) {\n return getMergedValue(undefined, config2[prop]);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(prop) {\n if (!utils.isUndefined(config2[prop])) {\n return getMergedValue(undefined, config2[prop]);\n } else if (!utils.isUndefined(config1[prop])) {\n return getMergedValue(undefined, config1[prop]);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(prop) {\n if (prop in config2) {\n return getMergedValue(config1[prop], config2[prop]);\n } else if (prop in config1) {\n return getMergedValue(undefined, config1[prop]);\n }\n }\n\n var mergeMap = {\n 'url': valueFromConfig2,\n 'method': valueFromConfig2,\n 'data': valueFromConfig2,\n 'baseURL': defaultToConfig2,\n 'transformRequest': defaultToConfig2,\n 'transformResponse': defaultToConfig2,\n 'paramsSerializer': defaultToConfig2,\n 'timeout': defaultToConfig2,\n 'timeoutMessage': defaultToConfig2,\n 'withCredentials': defaultToConfig2,\n 'adapter': defaultToConfig2,\n 'responseType': defaultToConfig2,\n 'xsrfCookieName': defaultToConfig2,\n 'xsrfHeaderName': defaultToConfig2,\n 'onUploadProgress': defaultToConfig2,\n 'onDownloadProgress': defaultToConfig2,\n 'decompress': defaultToConfig2,\n 'maxContentLength': defaultToConfig2,\n 'maxBodyLength': defaultToConfig2,\n 'transport': defaultToConfig2,\n 'httpAgent': defaultToConfig2,\n 'httpsAgent': defaultToConfig2,\n 'cancelToken': defaultToConfig2,\n 'socketPath': defaultToConfig2,\n 'responseEncoding': defaultToConfig2,\n 'validateStatus': mergeDirectKeys\n };\n\n utils.forEach(Object.keys(config1).concat(Object.keys(config2)), function computeConfigValue(prop) {\n var merge = mergeMap[prop] || mergeDeepProperties;\n var configValue = merge(prop);\n (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n};\n","module.exports = {\n \"version\": \"0.22.0\"\n};","'use strict';\n\nvar VERSION = require('../env/data').version;\n\nvar validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach(function(type, i) {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nvar deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return function(value, opt, opts) {\n if (validator === false) {\n throw new Error(formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')));\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\n/**\n * Assert object's properties type\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new TypeError('options must be an object');\n }\n var keys = Object.keys(options);\n var i = keys.length;\n while (i-- > 0) {\n var opt = keys[i];\n var validator = schema[opt];\n if (validator) {\n var value = options[opt];\n var result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new TypeError('option ' + opt + ' must be ' + result);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw Error('Unknown option ' + opt);\n }\n }\n}\n\nmodule.exports = {\n assertOptions: assertOptions,\n validators: validators\n};\n","'use strict';\n\nvar utils = require('./../utils');\nvar buildURL = require('../helpers/buildURL');\nvar InterceptorManager = require('./InterceptorManager');\nvar dispatchRequest = require('./dispatchRequest');\nvar mergeConfig = require('./mergeConfig');\nvar validator = require('../helpers/validator');\n\nvar validators = validator.validators;\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n */\nfunction Axios(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n}\n\n/**\n * Dispatch a request\n *\n * @param {Object} config The config specific for this request (merged with this.defaults)\n */\nAxios.prototype.request = function request(config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof config === 'string') {\n config = arguments[1] || {};\n config.url = arguments[0];\n } else {\n config = config || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n // Set config.method\n if (config.method) {\n config.method = config.method.toLowerCase();\n } else if (this.defaults.method) {\n config.method = this.defaults.method.toLowerCase();\n } else {\n config.method = 'get';\n }\n\n var transitional = config.transitional;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n // filter out skipped interceptors\n var requestInterceptorChain = [];\n var synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n var responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n var promise;\n\n if (!synchronousRequestInterceptors) {\n var chain = [dispatchRequest, undefined];\n\n Array.prototype.unshift.apply(chain, requestInterceptorChain);\n chain = chain.concat(responseInterceptorChain);\n\n promise = Promise.resolve(config);\n while (chain.length) {\n promise = promise.then(chain.shift(), chain.shift());\n }\n\n return promise;\n }\n\n\n var newConfig = config;\n while (requestInterceptorChain.length) {\n var onFulfilled = requestInterceptorChain.shift();\n var onRejected = requestInterceptorChain.shift();\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected(error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest(newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n while (responseInterceptorChain.length) {\n promise = promise.then(responseInterceptorChain.shift(), responseInterceptorChain.shift());\n }\n\n return promise;\n};\n\nAxios.prototype.getUri = function getUri(config) {\n config = mergeConfig(this.defaults, config);\n return buildURL(config.url, config.params, config.paramsSerializer).replace(/^\\?/, '');\n};\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method: method,\n url: url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method: method,\n url: url,\n data: data\n }));\n };\n});\n\nmodule.exports = Axios;\n","'use strict';\n\nvar Cancel = require('./Cancel');\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @class\n * @param {Function} executor The executor function.\n */\nfunction CancelToken(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n var resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n var token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(function(cancel) {\n if (!token._listeners) return;\n\n var i;\n var l = token._listeners.length;\n\n for (i = 0; i < l; i++) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = function(onfulfilled) {\n var _resolve;\n // eslint-disable-next-line func-names\n var promise = new Promise(function(resolve) {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new Cancel(message);\n resolvePromise(token.reason);\n });\n}\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nCancelToken.prototype.throwIfRequested = function throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n};\n\n/**\n * Subscribe to the cancel signal\n */\n\nCancelToken.prototype.subscribe = function subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n};\n\n/**\n * Unsubscribe from the cancel signal\n */\n\nCancelToken.prototype.unsubscribe = function unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n var index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n};\n\n/**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\nCancelToken.source = function source() {\n var cancel;\n var token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token: token,\n cancel: cancel\n };\n};\n\nmodule.exports = CancelToken;\n","'use strict';\n\nvar utils = require('./utils');\nvar bind = require('./helpers/bind');\nvar Axios = require('./core/Axios');\nvar mergeConfig = require('./core/mergeConfig');\nvar defaults = require('./defaults');\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n * @return {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n var context = new Axios(defaultConfig);\n var instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context);\n\n // Copy context to instance\n utils.extend(instance, context);\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nvar axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.Cancel = require('./cancel/Cancel');\naxios.CancelToken = require('./cancel/CancelToken');\naxios.isCancel = require('./cancel/isCancel');\naxios.VERSION = require('./env/data').version;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\naxios.spread = require('./helpers/spread');\n\n// Expose isAxiosError\naxios.isAxiosError = require('./helpers/isAxiosError');\n\nmodule.exports = axios;\n\n// Allow use of default import syntax in TypeScript\nmodule.exports.default = axios;\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n * @returns {Function}\n */\nmodule.exports = function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n};\n","'use strict';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nmodule.exports = function isAxiosError(payload) {\n return (typeof payload === 'object') && (payload.isAxiosError === true);\n};\n","module.exports = require('./lib/axios');","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nexport default function _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}","export default function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}","export default function _iterableToArrayLimit(arr, i) {\n var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"];\n\n if (_i == null) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n\n var _s, _e;\n\n try {\n for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}","export default function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\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","/* eslint-env browser */\nmodule.exports = typeof self == 'object' ? self.FormData : window.FormData;\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","// https://github.com/maxogden/websocket-stream/blob/48dc3ddf943e5ada668c31ccd94e9186f02fafbd/ws-fallback.js\n\nvar ws = null\n\nif (typeof WebSocket !== 'undefined') {\n ws = WebSocket\n} else if (typeof MozWebSocket !== 'undefined') {\n ws = MozWebSocket\n} else if (typeof global !== 'undefined') {\n ws = global.WebSocket || global.MozWebSocket\n} else if (typeof window !== 'undefined') {\n ws = window.WebSocket || window.MozWebSocket\n} else if (typeof self !== 'undefined') {\n ws = self.WebSocket || self.MozWebSocket\n}\n\nmodule.exports = ws\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","export default null;","export default null;","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 { 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","export default function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n\n return self;\n}","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n\n return _setPrototypeOf(o, p);\n}","import _typeof from \"@babel/runtime/helpers/typeof\";\nimport assertThisInitialized from \"./assertThisInitialized.js\";\nexport default function _possibleConstructorReturn(self, call) {\n if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n return call;\n } else if (call !== void 0) {\n throw new TypeError(\"Derived constructors may only return object or undefined\");\n }\n\n return assertThisInitialized(self);\n}","export default function _getPrototypeOf(o) {\n _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) {\n return o.__proto__ || Object.getPrototypeOf(o);\n };\n return _getPrototypeOf(o);\n}","export default function _isNativeReflectConstruct() {\n if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n if (Reflect.construct.sham) return false;\n if (typeof Proxy === \"function\") return true;\n\n try {\n Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n return true;\n } catch (e) {\n return false;\n }\n}","import setPrototypeOf from \"./setPrototypeOf.js\";\nimport isNativeReflectConstruct from \"./isNativeReflectConstruct.js\";\nexport default function _construct(Parent, args, Class) {\n if (isNativeReflectConstruct()) {\n _construct = Reflect.construct;\n } else {\n _construct = function _construct(Parent, args, Class) {\n var a = [null];\n a.push.apply(a, args);\n var Constructor = Function.bind.apply(Parent, a);\n var instance = new Constructor();\n if (Class) setPrototypeOf(instance, Class.prototype);\n return instance;\n };\n }\n\n return _construct.apply(null, arguments);\n}","import getPrototypeOf from \"./getPrototypeOf.js\";\nimport setPrototypeOf from \"./setPrototypeOf.js\";\nimport isNativeFunction from \"./isNativeFunction.js\";\nimport construct from \"./construct.js\";\nexport default function _wrapNativeSuper(Class) {\n var _cache = typeof Map === \"function\" ? new Map() : undefined;\n\n _wrapNativeSuper = function _wrapNativeSuper(Class) {\n if (Class === null || !isNativeFunction(Class)) return Class;\n\n if (typeof Class !== \"function\") {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n if (typeof _cache !== \"undefined\") {\n if (_cache.has(Class)) return _cache.get(Class);\n\n _cache.set(Class, Wrapper);\n }\n\n function Wrapper() {\n return construct(Class, arguments, getPrototypeOf(this).constructor);\n }\n\n Wrapper.prototype = Object.create(Class.prototype, {\n constructor: {\n value: Wrapper,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n return setPrototypeOf(Wrapper, Class);\n };\n\n return _wrapNativeSuper(Class);\n}","export default function _isNativeFunction(fn) {\n return Function.toString.call(fn).indexOf(\"[native code]\") !== -1;\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","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n writable: true,\n configurable: true\n }\n });\n if (superClass) setPrototypeOf(subClass, superClass);\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 default null;","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","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"],"names":["uint8","tmp","len","length","extraBytes","parts","maxChunkLength","i","len2","push","encodeChunk","lookup","join","revLookup","code","charCodeAt","start","end","num","output","isString","arrayOrString","isMapStringCallback","callback","encodeBase64","data","fromByteArray","Uint8Array","res","k","charAt","mappedValue","map","char","decodeBase64","s","x","a","e","w","String","fromCharCode","L","b","l","r","_extends","Object","assign","target","arguments","source","key","prototype","hasOwnProperty","call","apply","this","_typeof","obj","Symbol","iterator","constructor","_objectWithoutProperties","excluded","sourceKeys","keys","indexOf","objectWithoutPropertiesLoose","getOwnPropertySymbols","sourceSymbolKeys","propertyIsEnumerable","_arrayLikeToArray","arr","arr2","Array","_unsupportedIterableToArray","o","minLen","arrayLikeToArray","n","toString","slice","name","from","test","_toConsumableArray","isArray","arrayWithoutHoles","iter","iterableToArray","unsupportedIterableToArray","TypeError","nonIterableSpread","asyncGeneratorStep","gen","resolve","reject","_next","_throw","arg","info","value","error","done","Promise","then","_asyncToGenerator","fn","self","args","err","undefined","_classCallCheck","instance","Constructor","_defineProperties","props","descriptor","enumerable","configurable","writable","defineProperty","_createClass","protoProps","staticProps","_defineProperty","runtime","exports","Op","hasOwn","$Symbol","iteratorSymbol","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","toStringTag","define","wrap","innerFn","outerFn","tryLocsList","protoGenerator","Generator","generator","create","context","Context","_invoke","state","GenStateSuspendedStart","method","GenStateExecuting","Error","GenStateCompleted","doneResult","delegate","delegateResult","maybeInvokeDelegate","ContinueSentinel","sent","_sent","dispatchException","abrupt","record","tryCatch","type","GenStateSuspendedYield","makeInvokeMethod","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","getProto","getPrototypeOf","NativeIteratorPrototype","values","Gp","defineIteratorMethods","forEach","AsyncIterator","PromiseImpl","invoke","result","__await","unwrapped","previousPromise","callInvokeWithMethodAndArg","resultName","next","nextLoc","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","reset","iterable","iteratorMethod","isNaN","displayName","isGeneratorFunction","genFun","ctor","mark","setPrototypeOf","__proto__","awrap","async","object","reverse","pop","skipTempReset","prev","stop","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","catch","thrown","delegateYield","module","regeneratorRuntime","accidentalStrictMode","Function","require$$0","thisArg","val","isUndefined","isObject","isPlainObject","isFunction","isArrayBuffer","isBuffer","isFormData","FormData","isArrayBufferView","ArrayBuffer","isView","buffer","isNumber","isDate","isFile","isBlob","isStream","pipe","isURLSearchParams","URLSearchParams","isStandardBrowserEnv","navigator","product","window","document","merge","assignValue","extend","bind","trim","str","replace","stripBOM","content","encode","encodeURIComponent","url","params","paramsSerializer","serializedParams","utils","v","toISOString","JSON","stringify","hashmarkIndex","InterceptorManager","handlers","use","fulfilled","rejected","options","synchronous","runWhen","eject","id","h","headers","normalizedName","toUpperCase","config","request","response","isAxiosError","toJSON","message","description","number","fileName","lineNumber","columnNumber","stack","status","enhanceError","write","expires","path","domain","secure","cookie","Date","toGMTString","read","match","RegExp","decodeURIComponent","remove","now","ignoreDuplicateOf","originURL","msie","userAgent","urlParsingNode","createElement","resolveURL","href","setAttribute","protocol","host","search","hash","hostname","port","pathname","location","requestURL","parsed","Cancel","__CANCEL__","onCanceled","requestData","requestHeaders","responseType","cancelToken","unsubscribe","signal","removeEventListener","XMLHttpRequest","auth","username","password","unescape","Authorization","btoa","baseURL","requestedURL","fullPath","relativeURL","combineURLs","onloadend","responseHeaders","split","line","substr","toLowerCase","concat","parseHeaders","getAllResponseHeaders","validateStatus","createError","settle","responseText","statusText","open","buildURL","timeout","onreadystatechange","readyState","responseURL","setTimeout","onabort","onerror","ontimeout","timeoutErrorMessage","transitional","defaults","clarifyTimeoutError","xsrfValue","withCredentials","isURLSameOrigin","xsrfCookieName","cookies","xsrfHeaderName","setRequestHeader","onDownloadProgress","addEventListener","onUploadProgress","upload","cancel","abort","subscribe","aborted","send","DEFAULT_CONTENT_TYPE","setContentTypeIfUnset","adapter","silentJSONParsing","forcedJSONParsing","process","transformRequest","normalizeHeaderName","rawValue","parser","encoder","parse","stringifySafely","transformResponse","strictJSONParsing","maxContentLength","maxBodyLength","common","Accept","fns","throwIfCancellationRequested","throwIfRequested","transformData","reason","isCancel","config1","config2","getMergedValue","mergeDeepProperties","prop","valueFromConfig2","defaultToConfig2","mergeDirectKeys","mergeMap","timeoutMessage","decompress","transport","httpAgent","httpsAgent","socketPath","responseEncoding","configValue","VERSION","validators","thing","deprecatedWarnings","validator","version","formatMessage","opt","desc","opts","console","warn","assertOptions","schema","allowUnknown","Axios","instanceConfig","interceptors","mergeConfig","boolean","requestInterceptorChain","synchronousRequestInterceptors","interceptor","unshift","promise","responseInterceptorChain","chain","dispatchRequest","shift","newConfig","onFulfilled","onRejected","getUri","CancelToken","executor","resolvePromise","token","_listeners","onfulfilled","_resolve","listener","index","splice","c","axios","createInstance","defaultConfig","require$$1","require$$2","require$$3","all","promises","spread","payload","_slicedToArray","arrayWithHoles","_i","_s","_e","_arr","_n","_d","iterableToArrayLimit","nonIterableRest","ChannelState","channel","isUpToDate","_this","msgArray","msg","filter","removed","user","_updateUserMessages","messages","m","parentId","messageSets","set","threads","pinnedMessages","hardDelete","_deleteUserMessages","cid","created_at","deleted_at","latest_reactions","mentioned_users","own_reactions","parent_id","reply_count","thread_participants","updated_at","_channel","watcher_count","typing","initMessages","pending_messages","mutedUsers","watchers","members","membership","unreadCount","last_message_at","find","isCurrent","findIndex","isLatest","newMessage","timestampChanged","addIfDoesNotExist","messageSetToAddToIfDoesNotExist","addMessagesSorted","__html","html","pinned_at","newMessages","initializing","findTargetMessageSet","messagesToAdd","targetMessageSetIndex","isFromShadowBannedUser","shadowed","isMessageFormatted","_this$_channel","getClient","updateUserReference","getTime","parentID","show_in_channel","_addToMessageList","thread","threadMessages","messageSet","addPinnedMessage","pinnedMessage","removeMessageFromArray","reaction","enforce_unique","messageWithReaction","_updateMessage","_this2","_addOwnReactionToMessage","ownReactions","_removeOwnReactionFromMessage","userID","user_id","item","_this3","parseMessage","_m$pinned_at","_m$updated_at","updatedMessages","quoted_message_id","quoted_message","attachments","_this4","updateFunc","pinned","msgIndex","messageSetIndex","findMessageSetIndex","sortBy","addMessageToList","messageArr","messageArrayLength","messageTime","messageIsNewest","left","middle","right","Math","floor","messageToRemove","isRemoved","filteredMessages","latestMessages","entries","lastEvent","receivedAt","received_at","dispatchEvent","messageId","parentMessageId","limit","switchedToMessageSet","loadedMessageThread","messageIdToFind","switchToMessageSet","_this$threads$parentM","query","id_around","getReplies","currentMessages","messages1","messages2","some","m1","m2","overlappingMessageSetIndices","_","_this5","areMessageSetsOverlap","mergeTargetMessageSetIndex","mergeSourceMessageSetIndices","sources","overlappingMessageSetIndex","logChatPromiseExecution","sleep","chatCodes","TOKEN_EXPIRED","WS_CLOSED_SUCCESS","addFileToFormData","uri","contentType","readable","_read","File","isFileWebAPI","Blob","isBlobWebAPI","append","normalizeQuerySort","sort","sortFields","field","direction","retryInterval","numberOfFailures","max","min","random","randomId","bytes","getRandomValues","getRandomBytes","hex","subarray","padStart","getRandomValuesWithMathRandom","pow","byteLength","crypto","_crypto","msCrypto","convertErrorToJson","jsonObj","getOwnPropertyNames","getOwnPropertyDescriptor","addConnectionEventListeners","cb","removeConnectionEventListeners","Channel","client","watch","presence","event","listeners","_client","_data","initialized","offlineMode","lastTypingEvent","isTyping","disconnected","configs","post","_channelURL","sendMessageResponse","sendFile","delete","_checkInitialized","offset","filter_conditions","message_filter_conditions","wsPromise","get","filterConditions","messageID","reactionType","channelData","updateMessage","_update","update","patch","coolDownInterval","cooldown","accept_invite","reject_invite","add_members","add_moderators","roles","assign_roles","invites","remove_members","demote_moderators","channel_cid","_muteStatus","formData","message_id","form_data","getConfig","_this$getConfig","typing_events","diff","lastKeyStroke","sendEvent","_this$getConfig2","messageSlice","_this$getConfig3","read_events","stopTyping","clean","defaultOptions","_hasConnectionID","combined","logger","tags","messageIds","ids","last_read","silent","userMuteStatus","_this$data2","own_capabilities","_this$data3","includes","muteStatus","muted","lastRead","count","_countMessageAsUnread","_message$mentioned_us","queryURL","membersStr","member","_member$user","tempChannelCid","activeChannels","_addChannelConfig","_initializeState","queriedChannels","channels","isLatestMessageSet","targetUserID","banUser","userId","clearHistory","clear_history","unbanUser","shadowBan","removeShadowBan","callbackOrString","callbackOrNothing","el","channelState","_event$user","_event$user2","_event$user3","unread_messages","_this$getClient$user","_event$user5","_event$user6","_extendEventWithOwnReactions","hard_delete","removeMessage","addMessageSorted","removeQuotedMessageReferences","removePinnedMessage","ownMessage","_this$getClient$user2","isThreadMessage","_event$user8","_event$channel","truncated_at","truncatedAt","createdAt","clearMessages","_event$member","_event$user9","hidden","_event$channel2","_channel$data","_event$channel3","_channel$data2","addReaction","removeReaction","_isUsingServerAuth","clientState","addPinnedMessages","pinned_messages","watcher","reduce","acc","findMessage","setIsUpToDate","ClientState","users","userChannelReferences","updateUser","channelID","ws","WebSocket","MozWebSocket","global","InsightMetrics","connectionStartTimestamp","wsTotalFailures","wsConsecutiveFailures","instanceClientId","postInsights","insightType","insights","maxAttempts","buildWsFatalInsight","connection","buildWsBaseInsight","ready_state","_connection$ws","_buildUrl","api_key","start_ts","insightMetrics","end_ts","auth_type","getAuthType","tokenManager","user_details","_user","device","client_id","connectionID","ws_details","ws_consecutive_failures","ws_total_failures","request_id","requestID","online","_navigator","onLine","user_agent","_navigator2","instance_client_id","buildWsSuccessAfterFailureInsight","isCloseEvent","isErrorEvent","StableWSConnection","qs","_buildWSPayload","getToken","wsBaseURL","getUserAgent","_log","_setHealth","isHealthy","_reconnect","interval","wsID","isResolved","rejectPromise","_errorFromWSEvent","scheduleNextPing","handleEvent","scheduleConnectionCheck","wasClean","consecutiveFailures","totalFailures","isConnecting","healthy","statusCode","isWSFailure","StatusCode","connectionOpen","healthCheckTimeoutRef","clearTimeout","clientID","pingInterval","connectionCheckTimeoutRef","connectionCheckTimeout","isDisconnected","onlineStatusChanged","extra","level","_connect","healthCheck","_context","isStatic","refreshToken","_waitForHealthy","race","_context2","isClosedPromise","clearInterval","removeAllListeners","close","OPEN","onclose","enableWSFallback","isTokenReady","tokenReady","loadToken","_setupConnectionPromise","wsURL","onopen","onmessage","connection_id","enableInsights","_destroyCurrentWSConnection","recoverState","_context6","JWTUserToken","apiSecret","extraData","JWTServerToken","jwtOptions","server","algorithm","noTimestamp","sign","UserFromToken","fragments","b64Payload","DevToken","CheckSignature","body","secret","signature","Buffer","createHmac","digest","ConnectionState","TokenManager","tokenOrProvider","validateToken","tokenProvider","loadTokenPromise","anon","tokenUserId","APIErrorCodes","retryable","isAPIError","isErrorRetryable","WSConnectionFallback","_setState","Closed","connect","retry","doAxiosRequest","_this$cancelToken2","_req","Connected","events","_data$events","Disconnected","reconnect","Connecting","json","_poll","_onlineStatusChanged","Init","_assertThisInitialized","ReferenceError","_setPrototypeOf","p","_possibleConstructorReturn","assertThisInitialized","_getPrototypeOf","_isNativeReflectConstruct","Reflect","construct","sham","Proxy","Boolean","valueOf","_construct","Parent","Class","isNativeReflectConstruct","_wrapNativeSuper","_cache","Map","isNativeFunction","has","Wrapper","ErrorFromResponse","subClass","superClass","StreamChat","secretOrOptions","wsConnection","wsFallback","_this$wsFallback","_getConnectionID","userTokenOrProvider","setUserPromise","node","allowServerSideConnect","anonymous","setTokenPromise","_setToken","_setUser","openConnection","persistUserOnConnectionFailure","closeConnection","disconnectUser","connectUser","setTokenOrProvider","cleaningIntervalRef","_this$wsConnection2","disconnect","_this$wsFallback2","_this$wsFallback3","_startCleaning","before","closePromise","_disconnect","anonymousUser","_setupConnection","connectAnonymousUser","requestConfig","_enrichAxiosOptions","_logApiRequest","axiosInstance","put","_logApiResponse","handleResponse","client_request_id","_requestConfig$header","_logApiError","_context5","postListenerCallbacks","_handleClientEvent","_handleChannelEvent","_callClientListeners","_callChannelListeners","messageEvent","jsonString","refMap","_updateMemberWatcherReferences","updateUserMessages","deleteUserMessages","channel_mutes","devices","mutes","total_unread_count","unread_channels","unread_count","invisible","_updateUserMessageReferences","mark_messages_deleted","_deleteUserMessageReference","cids","recoverStateOnReconnect","queryChannels","$in","channelType","custom","tempCid","upsertUsers","upsertUser","markChannelsRead","mutedChannels","inputOptions","browser","warmUp","Agent","keepAlive","keepAliveMsecs","setBaseURL","env","STREAM_LOCAL_TEST_RUN","STREAM_LOCAL_TEST_HOST","_this$options","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","iat","getHeaders","Infinity","errorFromResponse","_handleUserEvent","me","_event$me","currentMutedChannelIds","nextMutedChannelIds","mute","_event$me2","activeChannelKey","deleteAllChannelReference","expiresAt","_sayHi","setClient","nav","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","mu","partialMessageObject","hard","_getToken","authorization","nextRequestAbortController","_options$headers","that","setInterval","requestBody","xSignature","permissionData","channel_cids","last_sync_at","blockList","exportChannels","segment","filters","campaign","scheduledFor","scheduled_for","user_ids","conversations","filename","pushProvider","AbortController","_instance","Allow","Deny","AnyResource","AnyRole","Permission","priority","resources","owner","action","AllowAll","DenyAll","AddLinks","BanUser","CreateChannel","CreateMessage","CreateReaction","DeleteAnyAttachment","DeleteAnyChannel","DeleteAnyMessage","DeleteAnyReaction","DeleteOwnAttachment","DeleteOwnChannel","DeleteOwnMessage","DeleteOwnReaction","ReadAnyChannel","ReadOwnChannel","RunMessageAction","UpdateAnyChannel","UpdateAnyMessage","UpdateMembersAnyChannel","UpdateMembersOwnChannel","UpdateOwnChannel","UpdateOwnMessage","UploadAttachment","UseFrozenChannel","Admin","Anonymous","ChannelMember","ChannelModerator","Guest","User"],"mappings":"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"}