matrix-art-preview

Page to land previews on for matrix art
git clone git://archive.git.mtrnord.blog/MTRNord/matrix-art-preview.git
Log | Files | Refs

indexeddb.worker-d9606cee.js.map (176955B)


      1 {"version":3,"file":"indexeddb.worker-d9606cee.js","sources":["../node_modules/@babel/runtime/helpers/interopRequireDefault.js","../node_modules/@babel/runtime/helpers/esm/typeof.js","../node_modules/@babel/runtime/helpers/esm/toPrimitive.js","../node_modules/@babel/runtime/helpers/esm/toPropertyKey.js","../node_modules/@babel/runtime/helpers/esm/defineProperty.js","../node_modules/loglevel/lib/loglevel.js","../node_modules/matrix-js-sdk/lib/logger.js","../node_modules/unhomoglyph/index.js","../node_modules/retry/lib/retry_operation.js","../node_modules/retry/lib/retry.js","../node_modules/retry/index.js","../node_modules/p-retry/index.js","../node_modules/matrix-js-sdk/lib/NamespacedValue.js","../node_modules/matrix-js-sdk/lib/@types/extensible_events.js","../node_modules/matrix-js-sdk/lib/@types/location.js","../node_modules/matrix-js-sdk/lib/@types/read_receipts.js","../node_modules/matrix-js-sdk/lib/utils.js","../node_modules/matrix-js-sdk/lib/@types/event.js","../node_modules/matrix-js-sdk/lib/@types/sync.js","../node_modules/matrix-js-sdk/lib/sync-accumulator.js","../node_modules/matrix-js-sdk/lib/indexeddb-helpers.js","../node_modules/matrix-js-sdk/lib/store/indexeddb-local-backend.js","../node_modules/matrix-js-sdk/lib/store/indexeddb-store-worker.js","../node_modules/matrix-js-sdk/lib/indexeddb-worker.js","../src/matrix/workers/indexeddb.worker.ts"],"sourcesContent":["function _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : {\n    \"default\": obj\n  };\n}\nmodule.exports = _interopRequireDefault, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","export default function _typeof(obj) {\n  \"@babel/helpers - typeof\";\n\n  return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n    return typeof obj;\n  } : function (obj) {\n    return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n  }, _typeof(obj);\n}","import _typeof from \"./typeof.js\";\nexport default function _toPrimitive(input, hint) {\n  if (_typeof(input) !== \"object\" || input === null) return input;\n  var prim = input[Symbol.toPrimitive];\n  if (prim !== undefined) {\n    var res = prim.call(input, hint || \"default\");\n    if (_typeof(res) !== \"object\") return res;\n    throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n  }\n  return (hint === \"string\" ? String : Number)(input);\n}","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nexport default function _toPropertyKey(arg) {\n  var key = toPrimitive(arg, \"string\");\n  return _typeof(key) === \"symbol\" ? key : String(key);\n}","import toPropertyKey from \"./toPropertyKey.js\";\nexport default function _defineProperty(obj, key, value) {\n  key = toPropertyKey(key);\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  return obj;\n}","/*\n* loglevel - https://github.com/pimterry/loglevel\n*\n* Copyright (c) 2013 Tim Perry\n* Licensed under the MIT license.\n*/\n(function (root, definition) {\n    \"use strict\";\n    if (typeof define === 'function' && define.amd) {\n        define(definition);\n    } else if (typeof module === 'object' && module.exports) {\n        module.exports = definition();\n    } else {\n        root.log = definition();\n    }\n}(this, function () {\n    \"use strict\";\n\n    // Slightly dubious tricks to cut down minimized file size\n    var noop = function() {};\n    var undefinedType = \"undefined\";\n    var isIE = (typeof window !== undefinedType) && (typeof window.navigator !== undefinedType) && (\n        /Trident\\/|MSIE /.test(window.navigator.userAgent)\n    );\n\n    var logMethods = [\n        \"trace\",\n        \"debug\",\n        \"info\",\n        \"warn\",\n        \"error\"\n    ];\n\n    // Cross-browser bind equivalent that works at least back to IE6\n    function bindMethod(obj, methodName) {\n        var method = obj[methodName];\n        if (typeof method.bind === 'function') {\n            return method.bind(obj);\n        } else {\n            try {\n                return Function.prototype.bind.call(method, obj);\n            } catch (e) {\n                // Missing bind shim or IE8 + Modernizr, fallback to wrapping\n                return function() {\n                    return Function.prototype.apply.apply(method, [obj, arguments]);\n                };\n            }\n        }\n    }\n\n    // Trace() doesn't print the message in IE, so for that case we need to wrap it\n    function traceForIE() {\n        if (console.log) {\n            if (console.log.apply) {\n                console.log.apply(console, arguments);\n            } else {\n                // In old IE, native console methods themselves don't have apply().\n                Function.prototype.apply.apply(console.log, [console, arguments]);\n            }\n        }\n        if (console.trace) console.trace();\n    }\n\n    // Build the best logging method possible for this env\n    // Wherever possible we want to bind, not wrap, to preserve stack traces\n    function realMethod(methodName) {\n        if (methodName === 'debug') {\n            methodName = 'log';\n        }\n\n        if (typeof console === undefinedType) {\n            return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives\n        } else if (methodName === 'trace' && isIE) {\n            return traceForIE;\n        } else if (console[methodName] !== undefined) {\n            return bindMethod(console, methodName);\n        } else if (console.log !== undefined) {\n            return bindMethod(console, 'log');\n        } else {\n            return noop;\n        }\n    }\n\n    // These private functions always need `this` to be set properly\n\n    function replaceLoggingMethods(level, loggerName) {\n        /*jshint validthis:true */\n        for (var i = 0; i < logMethods.length; i++) {\n            var methodName = logMethods[i];\n            this[methodName] = (i < level) ?\n                noop :\n                this.methodFactory(methodName, level, loggerName);\n        }\n\n        // Define log.log as an alias for log.debug\n        this.log = this.debug;\n    }\n\n    // In old IE versions, the console isn't present until you first open it.\n    // We build realMethod() replacements here that regenerate logging methods\n    function enableLoggingWhenConsoleArrives(methodName, level, loggerName) {\n        return function () {\n            if (typeof console !== undefinedType) {\n                replaceLoggingMethods.call(this, level, loggerName);\n                this[methodName].apply(this, arguments);\n            }\n        };\n    }\n\n    // By default, we use closely bound real methods wherever possible, and\n    // otherwise we wait for a console to appear, and then try again.\n    function defaultMethodFactory(methodName, level, loggerName) {\n        /*jshint validthis:true */\n        return realMethod(methodName) ||\n               enableLoggingWhenConsoleArrives.apply(this, arguments);\n    }\n\n    function Logger(name, defaultLevel, factory) {\n      var self = this;\n      var currentLevel;\n      defaultLevel = defaultLevel == null ? \"WARN\" : defaultLevel;\n\n      var storageKey = \"loglevel\";\n      if (typeof name === \"string\") {\n        storageKey += \":\" + name;\n      } else if (typeof name === \"symbol\") {\n        storageKey = undefined;\n      }\n\n      function persistLevelIfPossible(levelNum) {\n          var levelName = (logMethods[levelNum] || 'silent').toUpperCase();\n\n          if (typeof window === undefinedType || !storageKey) return;\n\n          // Use localStorage if available\n          try {\n              window.localStorage[storageKey] = levelName;\n              return;\n          } catch (ignore) {}\n\n          // Use session cookie as fallback\n          try {\n              window.document.cookie =\n                encodeURIComponent(storageKey) + \"=\" + levelName + \";\";\n          } catch (ignore) {}\n      }\n\n      function getPersistedLevel() {\n          var storedLevel;\n\n          if (typeof window === undefinedType || !storageKey) return;\n\n          try {\n              storedLevel = window.localStorage[storageKey];\n          } catch (ignore) {}\n\n          // Fallback to cookies if local storage gives us nothing\n          if (typeof storedLevel === undefinedType) {\n              try {\n                  var cookie = window.document.cookie;\n                  var location = cookie.indexOf(\n                      encodeURIComponent(storageKey) + \"=\");\n                  if (location !== -1) {\n                      storedLevel = /^([^;]+)/.exec(cookie.slice(location))[1];\n                  }\n              } catch (ignore) {}\n          }\n\n          // If the stored level is not valid, treat it as if nothing was stored.\n          if (self.levels[storedLevel] === undefined) {\n              storedLevel = undefined;\n          }\n\n          return storedLevel;\n      }\n\n      function clearPersistedLevel() {\n          if (typeof window === undefinedType || !storageKey) return;\n\n          // Use localStorage if available\n          try {\n              window.localStorage.removeItem(storageKey);\n              return;\n          } catch (ignore) {}\n\n          // Use session cookie as fallback\n          try {\n              window.document.cookie =\n                encodeURIComponent(storageKey) + \"=; expires=Thu, 01 Jan 1970 00:00:00 UTC\";\n          } catch (ignore) {}\n      }\n\n      /*\n       *\n       * Public logger API - see https://github.com/pimterry/loglevel for details\n       *\n       */\n\n      self.name = name;\n\n      self.levels = { \"TRACE\": 0, \"DEBUG\": 1, \"INFO\": 2, \"WARN\": 3,\n          \"ERROR\": 4, \"SILENT\": 5};\n\n      self.methodFactory = factory || defaultMethodFactory;\n\n      self.getLevel = function () {\n          return currentLevel;\n      };\n\n      self.setLevel = function (level, persist) {\n          if (typeof level === \"string\" && self.levels[level.toUpperCase()] !== undefined) {\n              level = self.levels[level.toUpperCase()];\n          }\n          if (typeof level === \"number\" && level >= 0 && level <= self.levels.SILENT) {\n              currentLevel = level;\n              if (persist !== false) {  // defaults to true\n                  persistLevelIfPossible(level);\n              }\n              replaceLoggingMethods.call(self, level, name);\n              if (typeof console === undefinedType && level < self.levels.SILENT) {\n                  return \"No console available for logging\";\n              }\n          } else {\n              throw \"log.setLevel() called with invalid level: \" + level;\n          }\n      };\n\n      self.setDefaultLevel = function (level) {\n          defaultLevel = level;\n          if (!getPersistedLevel()) {\n              self.setLevel(level, false);\n          }\n      };\n\n      self.resetLevel = function () {\n          self.setLevel(defaultLevel, false);\n          clearPersistedLevel();\n      };\n\n      self.enableAll = function(persist) {\n          self.setLevel(self.levels.TRACE, persist);\n      };\n\n      self.disableAll = function(persist) {\n          self.setLevel(self.levels.SILENT, persist);\n      };\n\n      // Initialize with the right level\n      var initialLevel = getPersistedLevel();\n      if (initialLevel == null) {\n          initialLevel = defaultLevel;\n      }\n      self.setLevel(initialLevel, false);\n    }\n\n    /*\n     *\n     * Top-level API\n     *\n     */\n\n    var defaultLogger = new Logger();\n\n    var _loggersByName = {};\n    defaultLogger.getLogger = function getLogger(name) {\n        if ((typeof name !== \"symbol\" && typeof name !== \"string\") || name === \"\") {\n          throw new TypeError(\"You must supply a name when creating a logger.\");\n        }\n\n        var logger = _loggersByName[name];\n        if (!logger) {\n          logger = _loggersByName[name] = new Logger(\n            name, defaultLogger.getLevel(), defaultLogger.methodFactory);\n        }\n        return logger;\n    };\n\n    // Grab the current global log variable in case of overwrite\n    var _log = (typeof window !== undefinedType) ? window.log : undefined;\n    defaultLogger.noConflict = function() {\n        if (typeof window !== undefinedType &&\n               window.log === defaultLogger) {\n            window.log = _log;\n        }\n\n        return defaultLogger;\n    };\n\n    defaultLogger.getLoggers = function getLoggers() {\n        return _loggersByName;\n    };\n\n    // ES6 default export, for compatibility\n    defaultLogger['default'] = defaultLogger;\n\n    return defaultLogger;\n}));\n","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.logger = void 0;\nvar _loglevel = _interopRequireDefault(require(\"loglevel\"));\n/*\nCopyright 2018 André Jaenisch\nCopyright 2019, 2021 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n// This is to demonstrate, that you can use any namespace you want.\n// Namespaces allow you to turn on/off the logging for specific parts of the\n// application.\n// An idea would be to control this via an environment variable (on Node.js).\n// See https://www.npmjs.com/package/debug to see how this could be implemented\n// Part of #332 is introducing a logging library in the first place.\nconst DEFAULT_NAMESPACE = \"matrix\";\n\n// because rageshakes in react-sdk hijack the console log, also at module load time,\n// initializing the logger here races with the initialization of rageshakes.\n// to avoid the issue, we override the methodFactory of loglevel that binds to the\n// console methods at initialization time by a factory that looks up the console methods\n// when logging so we always get the current value of console methods.\n_loglevel.default.methodFactory = function (methodName, logLevel, loggerName) {\n  return function (...args) {\n    /* eslint-disable @typescript-eslint/no-invalid-this */\n    if (this.prefix) {\n      args.unshift(this.prefix);\n    }\n    /* eslint-enable @typescript-eslint/no-invalid-this */\n    const supportedByConsole = methodName === \"error\" || methodName === \"warn\" || methodName === \"trace\" || methodName === \"info\";\n    /* eslint-disable no-console */\n    if (supportedByConsole) {\n      return console[methodName](...args);\n    } else {\n      return console.log(...args);\n    }\n    /* eslint-enable no-console */\n  };\n};\n\n/**\n * Drop-in replacement for `console` using {@link https://www.npmjs.com/package/loglevel|loglevel}.\n * Can be tailored down to specific use cases if needed.\n */\nconst logger = _loglevel.default.getLogger(DEFAULT_NAMESPACE);\nexports.logger = logger;\nlogger.setLevel(_loglevel.default.levels.DEBUG, false);\nfunction extendLogger(logger) {\n  logger.withPrefix = function (prefix) {\n    const existingPrefix = this.prefix || \"\";\n    return getPrefixedLogger(existingPrefix + prefix);\n  };\n}\nextendLogger(logger);\nfunction getPrefixedLogger(prefix) {\n  const prefixLogger = _loglevel.default.getLogger(`${DEFAULT_NAMESPACE}-${prefix}`);\n  if (prefixLogger.prefix !== prefix) {\n    // Only do this setup work the first time through, as loggers are saved by name.\n    extendLogger(prefixLogger);\n    prefixLogger.prefix = prefix;\n    prefixLogger.setLevel(_loglevel.default.levels.DEBUG, false);\n  }\n  return prefixLogger;\n}\n//# sourceMappingURL=logger.js.map","'use strict';\n\n\nvar data = require('./data.json');\n\nfunction escapeRegexp(str) {\n  return str.replace(/([.?*+^$[\\]\\\\(){}|-])/g, '\\\\$1');\n}\n\nvar REPLACE_RE = RegExp(Object.keys(data).map(escapeRegexp).join('|'), 'g');\n\nfunction replace_fn(match) {\n  return data[match];\n}\n\nfunction unhomoglyph(str) {\n  return str.replace(REPLACE_RE, replace_fn);\n}\n\nmodule.exports = unhomoglyph;\n","function RetryOperation(timeouts, options) {\n  // Compatibility for the old (timeouts, retryForever) signature\n  if (typeof options === 'boolean') {\n    options = { forever: options };\n  }\n\n  this._originalTimeouts = JSON.parse(JSON.stringify(timeouts));\n  this._timeouts = timeouts;\n  this._options = options || {};\n  this._maxRetryTime = options && options.maxRetryTime || Infinity;\n  this._fn = null;\n  this._errors = [];\n  this._attempts = 1;\n  this._operationTimeout = null;\n  this._operationTimeoutCb = null;\n  this._timeout = null;\n  this._operationStart = null;\n  this._timer = null;\n\n  if (this._options.forever) {\n    this._cachedTimeouts = this._timeouts.slice(0);\n  }\n}\nmodule.exports = RetryOperation;\n\nRetryOperation.prototype.reset = function() {\n  this._attempts = 1;\n  this._timeouts = this._originalTimeouts.slice(0);\n}\n\nRetryOperation.prototype.stop = function() {\n  if (this._timeout) {\n    clearTimeout(this._timeout);\n  }\n  if (this._timer) {\n    clearTimeout(this._timer);\n  }\n\n  this._timeouts       = [];\n  this._cachedTimeouts = null;\n};\n\nRetryOperation.prototype.retry = function(err) {\n  if (this._timeout) {\n    clearTimeout(this._timeout);\n  }\n\n  if (!err) {\n    return false;\n  }\n  var currentTime = new Date().getTime();\n  if (err && currentTime - this._operationStart >= this._maxRetryTime) {\n    this._errors.push(err);\n    this._errors.unshift(new Error('RetryOperation timeout occurred'));\n    return false;\n  }\n\n  this._errors.push(err);\n\n  var timeout = this._timeouts.shift();\n  if (timeout === undefined) {\n    if (this._cachedTimeouts) {\n      // retry forever, only keep last error\n      this._errors.splice(0, this._errors.length - 1);\n      timeout = this._cachedTimeouts.slice(-1);\n    } else {\n      return false;\n    }\n  }\n\n  var self = this;\n  this._timer = setTimeout(function() {\n    self._attempts++;\n\n    if (self._operationTimeoutCb) {\n      self._timeout = setTimeout(function() {\n        self._operationTimeoutCb(self._attempts);\n      }, self._operationTimeout);\n\n      if (self._options.unref) {\n          self._timeout.unref();\n      }\n    }\n\n    self._fn(self._attempts);\n  }, timeout);\n\n  if (this._options.unref) {\n      this._timer.unref();\n  }\n\n  return true;\n};\n\nRetryOperation.prototype.attempt = function(fn, timeoutOps) {\n  this._fn = fn;\n\n  if (timeoutOps) {\n    if (timeoutOps.timeout) {\n      this._operationTimeout = timeoutOps.timeout;\n    }\n    if (timeoutOps.cb) {\n      this._operationTimeoutCb = timeoutOps.cb;\n    }\n  }\n\n  var self = this;\n  if (this._operationTimeoutCb) {\n    this._timeout = setTimeout(function() {\n      self._operationTimeoutCb();\n    }, self._operationTimeout);\n  }\n\n  this._operationStart = new Date().getTime();\n\n  this._fn(this._attempts);\n};\n\nRetryOperation.prototype.try = function(fn) {\n  console.log('Using RetryOperation.try() is deprecated');\n  this.attempt(fn);\n};\n\nRetryOperation.prototype.start = function(fn) {\n  console.log('Using RetryOperation.start() is deprecated');\n  this.attempt(fn);\n};\n\nRetryOperation.prototype.start = RetryOperation.prototype.try;\n\nRetryOperation.prototype.errors = function() {\n  return this._errors;\n};\n\nRetryOperation.prototype.attempts = function() {\n  return this._attempts;\n};\n\nRetryOperation.prototype.mainError = function() {\n  if (this._errors.length === 0) {\n    return null;\n  }\n\n  var counts = {};\n  var mainError = null;\n  var mainErrorCount = 0;\n\n  for (var i = 0; i < this._errors.length; i++) {\n    var error = this._errors[i];\n    var message = error.message;\n    var count = (counts[message] || 0) + 1;\n\n    counts[message] = count;\n\n    if (count >= mainErrorCount) {\n      mainError = error;\n      mainErrorCount = count;\n    }\n  }\n\n  return mainError;\n};\n","var RetryOperation = require('./retry_operation');\n\nexports.operation = function(options) {\n  var timeouts = exports.timeouts(options);\n  return new RetryOperation(timeouts, {\n      forever: options && (options.forever || options.retries === Infinity),\n      unref: options && options.unref,\n      maxRetryTime: options && options.maxRetryTime\n  });\n};\n\nexports.timeouts = function(options) {\n  if (options instanceof Array) {\n    return [].concat(options);\n  }\n\n  var opts = {\n    retries: 10,\n    factor: 2,\n    minTimeout: 1 * 1000,\n    maxTimeout: Infinity,\n    randomize: false\n  };\n  for (var key in options) {\n    opts[key] = options[key];\n  }\n\n  if (opts.minTimeout > opts.maxTimeout) {\n    throw new Error('minTimeout is greater than maxTimeout');\n  }\n\n  var timeouts = [];\n  for (var i = 0; i < opts.retries; i++) {\n    timeouts.push(this.createTimeout(i, opts));\n  }\n\n  if (options && options.forever && !timeouts.length) {\n    timeouts.push(this.createTimeout(i, opts));\n  }\n\n  // sort the array numerically ascending\n  timeouts.sort(function(a,b) {\n    return a - b;\n  });\n\n  return timeouts;\n};\n\nexports.createTimeout = function(attempt, opts) {\n  var random = (opts.randomize)\n    ? (Math.random() + 1)\n    : 1;\n\n  var timeout = Math.round(random * Math.max(opts.minTimeout, 1) * Math.pow(opts.factor, attempt));\n  timeout = Math.min(timeout, opts.maxTimeout);\n\n  return timeout;\n};\n\nexports.wrap = function(obj, options, methods) {\n  if (options instanceof Array) {\n    methods = options;\n    options = null;\n  }\n\n  if (!methods) {\n    methods = [];\n    for (var key in obj) {\n      if (typeof obj[key] === 'function') {\n        methods.push(key);\n      }\n    }\n  }\n\n  for (var i = 0; i < methods.length; i++) {\n    var method   = methods[i];\n    var original = obj[method];\n\n    obj[method] = function retryWrapper(original) {\n      var op       = exports.operation(options);\n      var args     = Array.prototype.slice.call(arguments, 1);\n      var callback = args.pop();\n\n      args.push(function(err) {\n        if (op.retry(err)) {\n          return;\n        }\n        if (err) {\n          arguments[0] = op.mainError();\n        }\n        callback.apply(this, arguments);\n      });\n\n      op.attempt(function() {\n        original.apply(obj, args);\n      });\n    }.bind(obj, original);\n    obj[method].options = options;\n  }\n};\n","module.exports = require('./lib/retry');","'use strict';\nconst retry = require('retry');\n\nconst networkErrorMsgs = [\n\t'Failed to fetch', // Chrome\n\t'NetworkError when attempting to fetch resource.', // Firefox\n\t'The Internet connection appears to be offline.', // Safari\n\t'Network request failed' // `cross-fetch`\n];\n\nclass AbortError extends Error {\n\tconstructor(message) {\n\t\tsuper();\n\n\t\tif (message instanceof Error) {\n\t\t\tthis.originalError = message;\n\t\t\t({message} = message);\n\t\t} else {\n\t\t\tthis.originalError = new Error(message);\n\t\t\tthis.originalError.stack = this.stack;\n\t\t}\n\n\t\tthis.name = 'AbortError';\n\t\tthis.message = message;\n\t}\n}\n\nconst decorateErrorWithCounts = (error, attemptNumber, options) => {\n\t// Minus 1 from attemptNumber because the first attempt does not count as a retry\n\tconst retriesLeft = options.retries - (attemptNumber - 1);\n\n\terror.attemptNumber = attemptNumber;\n\terror.retriesLeft = retriesLeft;\n\treturn error;\n};\n\nconst isNetworkError = errorMessage => networkErrorMsgs.includes(errorMessage);\n\nconst pRetry = (input, options) => new Promise((resolve, reject) => {\n\toptions = {\n\t\tonFailedAttempt: () => {},\n\t\tretries: 10,\n\t\t...options\n\t};\n\n\tconst operation = retry.operation(options);\n\n\toperation.attempt(async attemptNumber => {\n\t\ttry {\n\t\t\tresolve(await input(attemptNumber));\n\t\t} catch (error) {\n\t\t\tif (!(error instanceof Error)) {\n\t\t\t\treject(new TypeError(`Non-error was thrown: \"${error}\". You should only throw errors.`));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (error instanceof AbortError) {\n\t\t\t\toperation.stop();\n\t\t\t\treject(error.originalError);\n\t\t\t} else if (error instanceof TypeError && !isNetworkError(error.message)) {\n\t\t\t\toperation.stop();\n\t\t\t\treject(error);\n\t\t\t} else {\n\t\t\t\tdecorateErrorWithCounts(error, attemptNumber, options);\n\n\t\t\t\ttry {\n\t\t\t\t\tawait options.onFailedAttempt(error);\n\t\t\t\t} catch (error) {\n\t\t\t\t\treject(error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!operation.retry(error)) {\n\t\t\t\t\treject(operation.mainError());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n});\n\nmodule.exports = pRetry;\n// TODO: remove this in the next major version\nmodule.exports.default = pRetry;\n\nmodule.exports.AbortError = AbortError;\n","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.UnstableValue = exports.ServerControlledNamespacedValue = exports.NamespacedValue = void 0;\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\n/*\nCopyright 2021 - 2022 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n/**\n * Represents a simple Matrix namespaced value. This will assume that if a stable prefix\n * is provided that the stable prefix should be used when representing the identifier.\n */\nclass NamespacedValue {\n  // Stable is optional, but one of the two parameters is required, hence the weird-looking types.\n  // Goal is to to have developers explicitly say there is no stable value (if applicable).\n\n  constructor(stable, unstable) {\n    this.stable = stable;\n    this.unstable = unstable;\n    if (!this.unstable && !this.stable) {\n      throw new Error(\"One of stable or unstable values must be supplied\");\n    }\n  }\n  get name() {\n    if (this.stable) {\n      return this.stable;\n    }\n    return this.unstable;\n  }\n  get altName() {\n    if (!this.stable) {\n      return null;\n    }\n    return this.unstable;\n  }\n  get names() {\n    const names = [this.name];\n    const altName = this.altName;\n    if (altName) names.push(altName);\n    return names;\n  }\n  matches(val) {\n    return this.name === val || this.altName === val;\n  }\n\n  // this desperately wants https://github.com/microsoft/TypeScript/pull/26349 at the top level of the class\n  // so we can instantiate `NamespacedValue<string, _, _>` as a default type for that namespace.\n  findIn(obj) {\n    let val = undefined;\n    if (this.name) {\n      val = obj === null || obj === void 0 ? void 0 : obj[this.name];\n    }\n    if (!val && this.altName) {\n      val = obj === null || obj === void 0 ? void 0 : obj[this.altName];\n    }\n    return val;\n  }\n  includedIn(arr) {\n    let included = false;\n    if (this.name) {\n      included = arr.includes(this.name);\n    }\n    if (!included && this.altName) {\n      included = arr.includes(this.altName);\n    }\n    return included;\n  }\n}\nexports.NamespacedValue = NamespacedValue;\nclass ServerControlledNamespacedValue extends NamespacedValue {\n  constructor(...args) {\n    super(...args);\n    (0, _defineProperty2.default)(this, \"preferUnstable\", false);\n  }\n  setPreferUnstable(preferUnstable) {\n    this.preferUnstable = preferUnstable;\n  }\n  get name() {\n    if (this.stable && !this.preferUnstable) {\n      return this.stable;\n    }\n    return this.unstable;\n  }\n}\n\n/**\n * Represents a namespaced value which prioritizes the unstable value over the stable\n * value.\n */\nexports.ServerControlledNamespacedValue = ServerControlledNamespacedValue;\nclass UnstableValue extends NamespacedValue {\n  // Note: Constructor difference is that `unstable` is *required*.\n  constructor(stable, unstable) {\n    super(stable, unstable);\n    if (!this.unstable) {\n      throw new Error(\"Unstable value must be supplied\");\n    }\n  }\n  get name() {\n    return this.unstable;\n  }\n  get altName() {\n    return this.stable;\n  }\n}\nexports.UnstableValue = UnstableValue;\n//# sourceMappingURL=NamespacedValue.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.TEXT_NODE_TYPE = void 0;\nvar _NamespacedValue = require(\"../NamespacedValue\");\n/*\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n// Types for MSC1767: Extensible events in Matrix\n\nconst TEXT_NODE_TYPE = new _NamespacedValue.UnstableValue(\"m.text\", \"org.matrix.msc1767.text\");\nexports.TEXT_NODE_TYPE = TEXT_NODE_TYPE;\n//# sourceMappingURL=extensible_events.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.M_TIMESTAMP = exports.M_LOCATION = exports.M_ASSET = exports.LocationAssetType = void 0;\nvar _NamespacedValue = require(\"../NamespacedValue\");\nvar _extensible_events = require(\"./extensible_events\");\n/*\nCopyright 2021 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n// Types for MSC3488 - m.location: Extending events with location data\nlet LocationAssetType;\nexports.LocationAssetType = LocationAssetType;\n(function (LocationAssetType) {\n  LocationAssetType[\"Self\"] = \"m.self\";\n  LocationAssetType[\"Pin\"] = \"m.pin\";\n})(LocationAssetType || (exports.LocationAssetType = LocationAssetType = {}));\nconst M_ASSET = new _NamespacedValue.UnstableValue(\"m.asset\", \"org.matrix.msc3488.asset\");\nexports.M_ASSET = M_ASSET;\nconst M_TIMESTAMP = new _NamespacedValue.UnstableValue(\"m.ts\", \"org.matrix.msc3488.ts\");\n/**\n * The event definition for an m.ts event (in content)\n */\nexports.M_TIMESTAMP = M_TIMESTAMP;\nconst M_LOCATION = new _NamespacedValue.UnstableValue(\"m.location\", \"org.matrix.msc3488.location\");\nexports.M_LOCATION = M_LOCATION;\n//# sourceMappingURL=location.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.ReceiptType = exports.MAIN_ROOM_TIMELINE = void 0;\n/*\nCopyright 2022 Šimon Brandner <simon.bra.ag@gmail.com>\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\nlet ReceiptType;\nexports.ReceiptType = ReceiptType;\n(function (ReceiptType) {\n  ReceiptType[\"Read\"] = \"m.read\";\n  ReceiptType[\"FullyRead\"] = \"m.fully_read\";\n  ReceiptType[\"ReadPrivate\"] = \"m.read.private\";\n})(ReceiptType || (exports.ReceiptType = ReceiptType = {}));\nconst MAIN_ROOM_TIMELINE = \"main\";\nexports.MAIN_ROOM_TIMELINE = MAIN_ROOM_TIMELINE;\n//# sourceMappingURL=read_receipts.js.map","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.DEFAULT_ALPHABET = void 0;\nexports.alphabetPad = alphabetPad;\nexports.averageBetweenStrings = averageBetweenStrings;\nexports.baseToString = baseToString;\nexports.checkObjectHasKeys = checkObjectHasKeys;\nexports.chunkPromises = chunkPromises;\nexports.compare = compare;\nexports.decodeParams = decodeParams;\nexports.deepCompare = deepCompare;\nexports.deepCopy = deepCopy;\nexports.deepSortedObjectEntries = deepSortedObjectEntries;\nexports.defer = defer;\nexports.encodeParams = encodeParams;\nexports.encodeUri = encodeUri;\nexports.ensureNoTrailingSlash = ensureNoTrailingSlash;\nexports.escapeRegExp = escapeRegExp;\nexports.globToRegexp = globToRegexp;\nexports.internaliseString = internaliseString;\nexports.isFunction = isFunction;\nexports.isNullOrUndefined = isNullOrUndefined;\nexports.isNumber = isNumber;\nexports.isSupportedReceiptType = isSupportedReceiptType;\nexports.lexicographicCompare = lexicographicCompare;\nexports.mapsEqual = mapsEqual;\nexports.nextString = nextString;\nexports.normalize = normalize;\nexports.prevString = prevString;\nexports.promiseMapSeries = promiseMapSeries;\nexports.promiseTry = promiseTry;\nexports.recursivelyAssign = recursivelyAssign;\nexports.removeDirectionOverrideChars = removeDirectionOverrideChars;\nexports.removeElement = removeElement;\nexports.removeHiddenChars = removeHiddenChars;\nexports.replaceParam = replaceParam;\nexports.simpleRetryOperation = simpleRetryOperation;\nexports.sleep = sleep;\nexports.sortEventsByLatestContentTimestamp = sortEventsByLatestContentTimestamp;\nexports.stringToBase = stringToBase;\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\nvar _unhomoglyph = _interopRequireDefault(require(\"unhomoglyph\"));\nvar _pRetry = _interopRequireDefault(require(\"p-retry\"));\nvar _location = require(\"./@types/location\");\nvar _read_receipts = require(\"./@types/read_receipts\");\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\nconst interns = new Map();\n\n/**\n * Internalises a string, reusing a known pointer or storing the pointer\n * if needed for future strings.\n * @param str - The string to internalise.\n * @returns The internalised string.\n */\nfunction internaliseString(str) {\n  // Unwrap strings before entering the map, if we somehow got a wrapped\n  // string as our input. This should only happen from tests.\n  if (str instanceof String) {\n    str = str.toString();\n  }\n\n  // Check the map to see if we can store the value\n  if (!interns.has(str)) {\n    interns.set(str, str);\n  }\n\n  // Return any cached string reference\n  return interns.get(str);\n}\n\n/**\n * Encode a dictionary of query parameters.\n * Omits any undefined/null values.\n * @param params - A dict of key/values to encode e.g.\n * `{\"foo\": \"bar\", \"baz\": \"taz\"}`\n * @returns The encoded string e.g. foo=bar&baz=taz\n */\nfunction encodeParams(params, urlSearchParams) {\n  const searchParams = urlSearchParams !== null && urlSearchParams !== void 0 ? urlSearchParams : new URLSearchParams();\n  for (const [key, val] of Object.entries(params)) {\n    if (val !== undefined && val !== null) {\n      if (Array.isArray(val)) {\n        val.forEach(v => {\n          searchParams.append(key, String(v));\n        });\n      } else {\n        searchParams.append(key, String(val));\n      }\n    }\n  }\n  return searchParams;\n}\n/**\n * Replace a stable parameter with the unstable naming for params\n */\nfunction replaceParam(stable, unstable, dict) {\n  const result = _objectSpread(_objectSpread({}, dict), {}, {\n    [unstable]: dict[stable]\n  });\n  delete result[stable];\n  return result;\n}\n\n/**\n * Decode a query string in `application/x-www-form-urlencoded` format.\n * @param query - A query string to decode e.g.\n * foo=bar&via=server1&server2\n * @returns The decoded object, if any keys occurred multiple times\n * then the value will be an array of strings, else it will be an array.\n * This behaviour matches Node's qs.parse but is built on URLSearchParams\n * for native web compatibility\n */\nfunction decodeParams(query) {\n  const o = {};\n  const params = new URLSearchParams(query);\n  for (const key of params.keys()) {\n    const val = params.getAll(key);\n    o[key] = val.length === 1 ? val[0] : val;\n  }\n  return o;\n}\n\n/**\n * Encodes a URI according to a set of template variables. Variables will be\n * passed through encodeURIComponent.\n * @param pathTemplate - The path with template variables e.g. '/foo/$bar'.\n * @param variables - The key/value pairs to replace the template\n * variables with. E.g. `{ \"$bar\": \"baz\" }`.\n * @returns The result of replacing all template variables e.g. '/foo/baz'.\n */\nfunction encodeUri(pathTemplate, variables) {\n  for (const key in variables) {\n    if (!variables.hasOwnProperty(key)) {\n      continue;\n    }\n    const value = variables[key];\n    if (value === undefined || value === null) {\n      continue;\n    }\n    pathTemplate = pathTemplate.replace(key, encodeURIComponent(value));\n  }\n  return pathTemplate;\n}\n\n/**\n * The removeElement() method removes the first element in the array that\n * satisfies (returns true) the provided testing function.\n * @param array - The array.\n * @param fn - Function to execute on each value in the array, with the\n * function signature `fn(element, index, array)`. Return true to\n * remove this element and break.\n * @param reverse - True to search in reverse order.\n * @returns True if an element was removed.\n */\nfunction removeElement(array, fn, reverse) {\n  let i;\n  if (reverse) {\n    for (i = array.length - 1; i >= 0; i--) {\n      if (fn(array[i], i, array)) {\n        array.splice(i, 1);\n        return true;\n      }\n    }\n  } else {\n    for (i = 0; i < array.length; i++) {\n      if (fn(array[i], i, array)) {\n        array.splice(i, 1);\n        return true;\n      }\n    }\n  }\n  return false;\n}\n\n/**\n * Checks if the given thing is a function.\n * @param value - The thing to check.\n * @returns True if it is a function.\n */\nfunction isFunction(value) {\n  return Object.prototype.toString.call(value) === \"[object Function]\";\n}\n\n/**\n * Checks that the given object has the specified keys.\n * @param obj - The object to check.\n * @param keys - The list of keys that 'obj' must have.\n * @throws If the object is missing keys.\n */\n// note using 'keys' here would shadow the 'keys' function defined above\nfunction checkObjectHasKeys(obj, keys) {\n  for (const key of keys) {\n    if (!obj.hasOwnProperty(key)) {\n      throw new Error(\"Missing required key: \" + key);\n    }\n  }\n}\n\n/**\n * Deep copy the given object. The object MUST NOT have circular references and\n * MUST NOT have functions.\n * @param obj - The object to deep copy.\n * @returns A copy of the object without any references to the original.\n */\nfunction deepCopy(obj) {\n  return JSON.parse(JSON.stringify(obj));\n}\n\n/**\n * Compare two objects for equality. The objects MUST NOT have circular references.\n *\n * @param x - The first object to compare.\n * @param y - The second object to compare.\n *\n * @returns true if the two objects are equal\n */\nfunction deepCompare(x, y) {\n  // Inspired by\n  // http://stackoverflow.com/questions/1068834/object-comparison-in-javascript#1144249\n\n  // Compare primitives and functions.\n  // Also check if both arguments link to the same object.\n  if (x === y) {\n    return true;\n  }\n  if (typeof x !== typeof y) {\n    return false;\n  }\n\n  // special-case NaN (since NaN !== NaN)\n  if (typeof x === \"number\" && isNaN(x) && isNaN(y)) {\n    return true;\n  }\n\n  // special-case null (since typeof null == 'object', but null.constructor\n  // throws)\n  if (x === null || y === null) {\n    return x === y;\n  }\n\n  // everything else is either an unequal primitive, or an object\n  if (!(x instanceof Object)) {\n    return false;\n  }\n\n  // check they are the same type of object\n  if (x.constructor !== y.constructor || x.prototype !== y.prototype) {\n    return false;\n  }\n\n  // special-casing for some special types of object\n  if (x instanceof RegExp || x instanceof Date) {\n    return x.toString() === y.toString();\n  }\n\n  // the object algorithm works for Array, but it's sub-optimal.\n  if (Array.isArray(x)) {\n    if (x.length !== y.length) {\n      return false;\n    }\n    for (let i = 0; i < x.length; i++) {\n      if (!deepCompare(x[i], y[i])) {\n        return false;\n      }\n    }\n  } else {\n    // check that all of y's direct keys are in x\n    for (const p in y) {\n      if (y.hasOwnProperty(p) !== x.hasOwnProperty(p)) {\n        return false;\n      }\n    }\n\n    // finally, compare each of x's keys with y\n    for (const p in x) {\n      if (y.hasOwnProperty(p) !== x.hasOwnProperty(p) || !deepCompare(x[p], y[p])) {\n        return false;\n      }\n    }\n  }\n  return true;\n}\n\n// Dev note: This returns an array of tuples, but jsdoc doesn't like that. https://github.com/jsdoc/jsdoc/issues/1703\n/**\n * Creates an array of object properties/values (entries) then\n * sorts the result by key, recursively. The input object must\n * ensure it does not have loops. If the input is not an object\n * then it will be returned as-is.\n * @param obj - The object to get entries of\n * @returns The entries, sorted by key.\n */\nfunction deepSortedObjectEntries(obj) {\n  if (typeof obj !== \"object\") return obj;\n\n  // Apparently these are object types...\n  if (obj === null || obj === undefined || Array.isArray(obj)) return obj;\n  const pairs = [];\n  for (const [k, v] of Object.entries(obj)) {\n    pairs.push([k, deepSortedObjectEntries(v)]);\n  }\n\n  // lexicographicCompare is faster than localeCompare, so let's use that.\n  pairs.sort((a, b) => lexicographicCompare(a[0], b[0]));\n  return pairs;\n}\n\n/**\n * Returns whether the given value is a finite number without type-coercion\n *\n * @param value - the value to test\n * @returns whether or not value is a finite number without type-coercion\n */\nfunction isNumber(value) {\n  return typeof value === \"number\" && isFinite(value);\n}\n\n/**\n * Removes zero width chars, diacritics and whitespace from the string\n * Also applies an unhomoglyph on the string, to prevent similar looking chars\n * @param str - the string to remove hidden characters from\n * @returns a string with the hidden characters removed\n */\nfunction removeHiddenChars(str) {\n  if (typeof str === \"string\") {\n    return (0, _unhomoglyph.default)(str.normalize(\"NFD\").replace(removeHiddenCharsRegex, \"\"));\n  }\n  return \"\";\n}\n\n/**\n * Removes the direction override characters from a string\n * @returns string with chars removed\n */\nfunction removeDirectionOverrideChars(str) {\n  if (typeof str === \"string\") {\n    return str.replace(/[\\u202d-\\u202e]/g, \"\");\n  }\n  return \"\";\n}\nfunction normalize(str) {\n  // Note: we have to match the filter with the removeHiddenChars() because the\n  // function strips spaces and other characters (M becomes RN for example, in lowercase).\n  return removeHiddenChars(str.toLowerCase())\n  // Strip all punctuation\n  .replace(/[\\\\'!\"#$%&()*+,\\-./:;<=>?@[\\]^_`{|}~\\u2000-\\u206f\\u2e00-\\u2e7f]/g, \"\")\n  // We also doubly convert to lowercase to work around oddities of the library.\n  .toLowerCase();\n}\n\n// Regex matching bunch of unicode control characters and otherwise misleading/invisible characters.\n// Includes:\n// various width spaces U+2000 - U+200D\n// LTR and RTL marks U+200E and U+200F\n// LTR/RTL and other directional formatting marks U+202A - U+202F\n// Arabic Letter RTL mark U+061C\n// Combining characters U+0300 - U+036F\n// Zero width no-break space (BOM) U+FEFF\n// Blank/invisible characters (U2800, U2062-U2063)\n// eslint-disable-next-line no-misleading-character-class\nconst removeHiddenCharsRegex = /[\\u2000-\\u200F\\u202A-\\u202F\\u0300-\\u036F\\uFEFF\\u061C\\u2800\\u2062-\\u2063\\s]/g;\nfunction escapeRegExp(string) {\n  return string.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\nfunction globToRegexp(glob, extended = false) {\n  // From\n  // https://github.com/matrix-org/synapse/blob/abbee6b29be80a77e05730707602f3bbfc3f38cb/synapse/push/__init__.py#L132\n  // Because micromatch is about 130KB with dependencies,\n  // and minimatch is not much better.\n  const replacements = [[/\\\\\\*/g, \".*\"], [/\\?/g, \".\"]];\n  if (!extended) {\n    replacements.push([/\\\\\\[(!|)(.*)\\\\]/g, (_match, neg, pat) => [\"[\", neg ? \"^\" : \"\", pat.replace(/\\\\-/, \"-\"), \"]\"].join(\"\")]);\n  }\n  return replacements.reduce(\n  // https://github.com/microsoft/TypeScript/issues/30134\n  (pat, args) => args ? pat.replace(args[0], args[1]) : pat, escapeRegExp(glob));\n}\nfunction ensureNoTrailingSlash(url) {\n  if (url !== null && url !== void 0 && url.endsWith(\"/\")) {\n    return url.slice(0, -1);\n  } else {\n    return url;\n  }\n}\n\n// Returns a promise which resolves with a given value after the given number of ms\nfunction sleep(ms, value) {\n  return new Promise(resolve => {\n    setTimeout(resolve, ms, value);\n  });\n}\nfunction isNullOrUndefined(val) {\n  return val === null || val === undefined;\n}\n// Returns a Deferred\nfunction defer() {\n  let resolve;\n  let reject;\n  const promise = new Promise((_resolve, _reject) => {\n    resolve = _resolve;\n    reject = _reject;\n  });\n  return {\n    resolve,\n    reject,\n    promise\n  };\n}\nasync function promiseMapSeries(promises, fn // if async we don't care about the type as we only await resolution\n) {\n  for (const o of promises) {\n    await fn(await o);\n  }\n}\nfunction promiseTry(fn) {\n  return Promise.resolve(fn());\n}\n\n// Creates and awaits all promises, running no more than `chunkSize` at the same time\nasync function chunkPromises(fns, chunkSize) {\n  const results = [];\n  for (let i = 0; i < fns.length; i += chunkSize) {\n    results.push(...(await Promise.all(fns.slice(i, i + chunkSize).map(fn => fn()))));\n  }\n  return results;\n}\n\n/**\n * Retries the function until it succeeds or is interrupted. The given function must return\n * a promise which throws/rejects on error, otherwise the retry will assume the request\n * succeeded. The promise chain returned will contain the successful promise. The given function\n * should always return a new promise.\n * @param promiseFn - The function to call to get a fresh promise instance. Takes an\n * attempt count as an argument, for logging/debugging purposes.\n * @returns The promise for the retried operation.\n */\nfunction simpleRetryOperation(promiseFn) {\n  return (0, _pRetry.default)(attempt => {\n    return promiseFn(attempt);\n  }, {\n    forever: true,\n    factor: 2,\n    minTimeout: 3000,\n    // ms\n    maxTimeout: 15000 // ms\n  });\n}\n\n// String averaging inspired by https://stackoverflow.com/a/2510816\n// Dev note: We make the alphabet a string because it's easier to write syntactically\n// than arrays. Thankfully, strings implement the useful parts of the Array interface\n// anyhow.\n\n/**\n * The default alphabet used by string averaging in this SDK. This matches\n * all usefully printable ASCII characters (0x20-0x7E, inclusive).\n */\nconst DEFAULT_ALPHABET = (() => {\n  let str = \"\";\n  for (let c = 0x20; c <= 0x7e; c++) {\n    str += String.fromCharCode(c);\n  }\n  return str;\n})();\n\n/**\n * Pads a string using the given alphabet as a base. The returned string will be\n * padded at the end with the first character in the alphabet.\n *\n * This is intended for use with string averaging.\n * @param s - The string to pad.\n * @param n - The length to pad to.\n * @param alphabet - The alphabet to use as a single string.\n * @returns The padded string.\n */\nexports.DEFAULT_ALPHABET = DEFAULT_ALPHABET;\nfunction alphabetPad(s, n, alphabet = DEFAULT_ALPHABET) {\n  return s.padEnd(n, alphabet[0]);\n}\n\n/**\n * Converts a baseN number to a string, where N is the alphabet's length.\n *\n * This is intended for use with string averaging.\n * @param n - The baseN number.\n * @param alphabet - The alphabet to use as a single string.\n * @returns The baseN number encoded as a string from the alphabet.\n */\nfunction baseToString(n, alphabet = DEFAULT_ALPHABET) {\n  // Developer note: the stringToBase() function offsets the character set by 1 so that repeated\n  // characters (ie: \"aaaaaa\" in a..z) don't come out as zero. We have to reverse this here as\n  // otherwise we'll be wrong in our conversion. Undoing a +1 before an exponent isn't very fun\n  // though, so we rely on a lengthy amount of `x - 1` and integer division rules to reach a\n  // sane state. This also means we have to do rollover detection: see below.\n\n  const len = BigInt(alphabet.length);\n  if (n <= len) {\n    var _alphabet;\n    return (_alphabet = alphabet[Number(n) - 1]) !== null && _alphabet !== void 0 ? _alphabet : \"\";\n  }\n  let d = n / len;\n  let r = Number(n % len) - 1;\n\n  // Rollover detection: if the remainder is negative, it means that the string needs\n  // to roll over by 1 character downwards (ie: in a..z, the previous to \"aaa\" would be\n  // \"zz\").\n  if (r < 0) {\n    d -= BigInt(Math.abs(r)); // abs() is just to be clear what we're doing. Could also `+= r`.\n    r = Number(len) - 1;\n  }\n  return baseToString(d, alphabet) + alphabet[r];\n}\n\n/**\n * Converts a string to a baseN number, where N is the alphabet's length.\n *\n * This is intended for use with string averaging.\n * @param s - The string to convert to a number.\n * @param alphabet - The alphabet to use as a single string.\n * @returns The baseN number.\n */\nfunction stringToBase(s, alphabet = DEFAULT_ALPHABET) {\n  const len = BigInt(alphabet.length);\n\n  // In our conversion to baseN we do a couple performance optimizations to avoid using\n  // excess CPU and such. To create baseN numbers, the input string needs to be reversed\n  // so the exponents stack up appropriately, as the last character in the unreversed\n  // string has less impact than the first character (in \"abc\" the A is a lot more important\n  // for lexicographic sorts). We also do a trick with the character codes to optimize the\n  // alphabet lookup, avoiding an index scan of `alphabet.indexOf(reversedStr[i])` - we know\n  // that the alphabet and (theoretically) the input string are constrained on character sets\n  // and thus can do simple subtraction to end up with the same result.\n\n  // Developer caution: we carefully cast to BigInt here to avoid losing precision. We cannot\n  // rely on Math.pow() (for example) to be capable of handling our insane numbers.\n\n  let result = BigInt(0);\n  for (let i = s.length - 1, j = BigInt(0); i >= 0; i--, j++) {\n    const charIndex = s.charCodeAt(i) - alphabet.charCodeAt(0);\n\n    // We add 1 to the char index to offset the whole numbering scheme. We unpack this in\n    // the baseToString() function.\n    result += BigInt(1 + charIndex) * len ** j;\n  }\n  return result;\n}\n\n/**\n * Averages two strings, returning the midpoint between them. This is accomplished by\n * converting both to baseN numbers (where N is the alphabet's length) then averaging\n * those before re-encoding as a string.\n * @param a - The first string.\n * @param b - The second string.\n * @param alphabet - The alphabet to use as a single string.\n * @returns The midpoint between the strings, as a string.\n */\nfunction averageBetweenStrings(a, b, alphabet = DEFAULT_ALPHABET) {\n  const padN = Math.max(a.length, b.length);\n  const baseA = stringToBase(alphabetPad(a, padN, alphabet), alphabet);\n  const baseB = stringToBase(alphabetPad(b, padN, alphabet), alphabet);\n  const avg = (baseA + baseB) / BigInt(2);\n\n  // Detect integer division conflicts. This happens when two numbers are divided too close so\n  // we lose a .5 precision. We need to add a padding character in these cases.\n  if (avg === baseA || avg == baseB) {\n    return baseToString(avg, alphabet) + alphabet[0];\n  }\n  return baseToString(avg, alphabet);\n}\n\n/**\n * Finds the next string using the alphabet provided. This is done by converting the\n * string to a baseN number, where N is the alphabet's length, then adding 1 before\n * converting back to a string.\n * @param s - The string to start at.\n * @param alphabet - The alphabet to use as a single string.\n * @returns The string which follows the input string.\n */\nfunction nextString(s, alphabet = DEFAULT_ALPHABET) {\n  return baseToString(stringToBase(s, alphabet) + BigInt(1), alphabet);\n}\n\n/**\n * Finds the previous string using the alphabet provided. This is done by converting the\n * string to a baseN number, where N is the alphabet's length, then subtracting 1 before\n * converting back to a string.\n * @param s - The string to start at.\n * @param alphabet - The alphabet to use as a single string.\n * @returns The string which precedes the input string.\n */\nfunction prevString(s, alphabet = DEFAULT_ALPHABET) {\n  return baseToString(stringToBase(s, alphabet) - BigInt(1), alphabet);\n}\n\n/**\n * Compares strings lexicographically as a sort-safe function.\n * @param a - The first (reference) string.\n * @param b - The second (compare) string.\n * @returns Negative if the reference string is before the compare string;\n * positive if the reference string is after; and zero if equal.\n */\nfunction lexicographicCompare(a, b) {\n  // Dev note: this exists because I'm sad that you can use math operators on strings, so I've\n  // hidden the operation in this function.\n  if (a < b) {\n    return -1;\n  } else if (a > b) {\n    return 1;\n  } else {\n    return 0;\n  }\n}\nconst collator = new Intl.Collator();\n/**\n * Performant language-sensitive string comparison\n * @param a - the first string to compare\n * @param b - the second string to compare\n */\nfunction compare(a, b) {\n  return collator.compare(a, b);\n}\n\n/**\n * This function is similar to Object.assign() but it assigns recursively and\n * allows you to ignore nullish values from the source\n *\n * @returns the target object\n */\nfunction recursivelyAssign(target, source, ignoreNullish = false) {\n  for (const [sourceKey, sourceValue] of Object.entries(source)) {\n    if (target[sourceKey] instanceof Object && sourceValue) {\n      recursivelyAssign(target[sourceKey], sourceValue);\n      continue;\n    }\n    if (sourceValue !== null && sourceValue !== undefined || !ignoreNullish) {\n      target[sourceKey] = sourceValue;\n      continue;\n    }\n  }\n  return target;\n}\nfunction getContentTimestampWithFallback(event) {\n  var _M_TIMESTAMP$findIn;\n  return (_M_TIMESTAMP$findIn = _location.M_TIMESTAMP.findIn(event.getContent())) !== null && _M_TIMESTAMP$findIn !== void 0 ? _M_TIMESTAMP$findIn : -1;\n}\n\n/**\n * Sort events by their content m.ts property\n * Latest timestamp first\n */\nfunction sortEventsByLatestContentTimestamp(left, right) {\n  return getContentTimestampWithFallback(right) - getContentTimestampWithFallback(left);\n}\nfunction isSupportedReceiptType(receiptType) {\n  return [_read_receipts.ReceiptType.Read, _read_receipts.ReceiptType.ReadPrivate].includes(receiptType);\n}\n\n/**\n * Determines whether two maps are equal.\n * @param eq - The equivalence relation to compare values by. Defaults to strict equality.\n */\nfunction mapsEqual(x, y, eq = (v1, v2) => v1 === v2) {\n  if (x.size !== y.size) return false;\n  for (const [k, v1] of x) {\n    const v2 = y.get(k);\n    if (v2 === undefined || !eq(v1, v2)) return false;\n  }\n  return true;\n}\n//# sourceMappingURL=utils.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.UNSTABLE_MSC3089_TREE_SUBTYPE = exports.UNSTABLE_MSC3089_LEAF = exports.UNSTABLE_MSC3089_BRANCH = exports.UNSTABLE_MSC3088_PURPOSE = exports.UNSTABLE_MSC3088_ENABLED = exports.UNSTABLE_MSC2716_MARKER = exports.UNSTABLE_ELEMENT_FUNCTIONAL_USERS = exports.ToDeviceMessageId = exports.RoomType = exports.RoomCreateTypeField = exports.RelationType = exports.PUSHER_ENABLED = exports.PUSHER_DEVICE_ID = exports.MsgType = exports.LOCAL_NOTIFICATION_SETTINGS_PREFIX = exports.EventType = exports.EVENT_VISIBILITY_CHANGE_TYPE = void 0;\nvar _NamespacedValue = require(\"../NamespacedValue\");\n/*\nCopyright 2020 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\nlet EventType;\nexports.EventType = EventType;\n(function (EventType) {\n  EventType[\"RoomCanonicalAlias\"] = \"m.room.canonical_alias\";\n  EventType[\"RoomCreate\"] = \"m.room.create\";\n  EventType[\"RoomJoinRules\"] = \"m.room.join_rules\";\n  EventType[\"RoomMember\"] = \"m.room.member\";\n  EventType[\"RoomThirdPartyInvite\"] = \"m.room.third_party_invite\";\n  EventType[\"RoomPowerLevels\"] = \"m.room.power_levels\";\n  EventType[\"RoomName\"] = \"m.room.name\";\n  EventType[\"RoomTopic\"] = \"m.room.topic\";\n  EventType[\"RoomAvatar\"] = \"m.room.avatar\";\n  EventType[\"RoomPinnedEvents\"] = \"m.room.pinned_events\";\n  EventType[\"RoomEncryption\"] = \"m.room.encryption\";\n  EventType[\"RoomHistoryVisibility\"] = \"m.room.history_visibility\";\n  EventType[\"RoomGuestAccess\"] = \"m.room.guest_access\";\n  EventType[\"RoomServerAcl\"] = \"m.room.server_acl\";\n  EventType[\"RoomTombstone\"] = \"m.room.tombstone\";\n  EventType[\"SpaceChild\"] = \"m.space.child\";\n  EventType[\"SpaceParent\"] = \"m.space.parent\";\n  EventType[\"RoomRedaction\"] = \"m.room.redaction\";\n  EventType[\"RoomMessage\"] = \"m.room.message\";\n  EventType[\"RoomMessageEncrypted\"] = \"m.room.encrypted\";\n  EventType[\"Sticker\"] = \"m.sticker\";\n  EventType[\"CallInvite\"] = \"m.call.invite\";\n  EventType[\"CallCandidates\"] = \"m.call.candidates\";\n  EventType[\"CallAnswer\"] = \"m.call.answer\";\n  EventType[\"CallHangup\"] = \"m.call.hangup\";\n  EventType[\"CallReject\"] = \"m.call.reject\";\n  EventType[\"CallSelectAnswer\"] = \"m.call.select_answer\";\n  EventType[\"CallNegotiate\"] = \"m.call.negotiate\";\n  EventType[\"CallSDPStreamMetadataChanged\"] = \"m.call.sdp_stream_metadata_changed\";\n  EventType[\"CallSDPStreamMetadataChangedPrefix\"] = \"org.matrix.call.sdp_stream_metadata_changed\";\n  EventType[\"CallReplaces\"] = \"m.call.replaces\";\n  EventType[\"CallAssertedIdentity\"] = \"m.call.asserted_identity\";\n  EventType[\"CallAssertedIdentityPrefix\"] = \"org.matrix.call.asserted_identity\";\n  EventType[\"KeyVerificationRequest\"] = \"m.key.verification.request\";\n  EventType[\"KeyVerificationStart\"] = \"m.key.verification.start\";\n  EventType[\"KeyVerificationCancel\"] = \"m.key.verification.cancel\";\n  EventType[\"KeyVerificationMac\"] = \"m.key.verification.mac\";\n  EventType[\"KeyVerificationDone\"] = \"m.key.verification.done\";\n  EventType[\"KeyVerificationKey\"] = \"m.key.verification.key\";\n  EventType[\"KeyVerificationAccept\"] = \"m.key.verification.accept\";\n  EventType[\"KeyVerificationReady\"] = \"m.key.verification.ready\";\n  EventType[\"RoomMessageFeedback\"] = \"m.room.message.feedback\";\n  EventType[\"Reaction\"] = \"m.reaction\";\n  EventType[\"Typing\"] = \"m.typing\";\n  EventType[\"Receipt\"] = \"m.receipt\";\n  EventType[\"Presence\"] = \"m.presence\";\n  EventType[\"FullyRead\"] = \"m.fully_read\";\n  EventType[\"Tag\"] = \"m.tag\";\n  EventType[\"SpaceOrder\"] = \"org.matrix.msc3230.space_order\";\n  EventType[\"PushRules\"] = \"m.push_rules\";\n  EventType[\"Direct\"] = \"m.direct\";\n  EventType[\"IgnoredUserList\"] = \"m.ignored_user_list\";\n  EventType[\"RoomKey\"] = \"m.room_key\";\n  EventType[\"RoomKeyRequest\"] = \"m.room_key_request\";\n  EventType[\"ForwardedRoomKey\"] = \"m.forwarded_room_key\";\n  EventType[\"Dummy\"] = \"m.dummy\";\n  EventType[\"GroupCallPrefix\"] = \"org.matrix.msc3401.call\";\n  EventType[\"GroupCallMemberPrefix\"] = \"org.matrix.msc3401.call.member\";\n})(EventType || (exports.EventType = EventType = {}));\nlet RelationType;\nexports.RelationType = RelationType;\n(function (RelationType) {\n  RelationType[\"Annotation\"] = \"m.annotation\";\n  RelationType[\"Replace\"] = \"m.replace\";\n  RelationType[\"Reference\"] = \"m.reference\";\n  RelationType[\"Thread\"] = \"m.thread\";\n})(RelationType || (exports.RelationType = RelationType = {}));\nlet MsgType;\nexports.MsgType = MsgType;\n(function (MsgType) {\n  MsgType[\"Text\"] = \"m.text\";\n  MsgType[\"Emote\"] = \"m.emote\";\n  MsgType[\"Notice\"] = \"m.notice\";\n  MsgType[\"Image\"] = \"m.image\";\n  MsgType[\"File\"] = \"m.file\";\n  MsgType[\"Audio\"] = \"m.audio\";\n  MsgType[\"Location\"] = \"m.location\";\n  MsgType[\"Video\"] = \"m.video\";\n  MsgType[\"KeyVerificationRequest\"] = \"m.key.verification.request\";\n})(MsgType || (exports.MsgType = MsgType = {}));\nconst RoomCreateTypeField = \"type\";\nexports.RoomCreateTypeField = RoomCreateTypeField;\nlet RoomType;\nexports.RoomType = RoomType;\n(function (RoomType) {\n  RoomType[\"Space\"] = \"m.space\";\n  RoomType[\"UnstableCall\"] = \"org.matrix.msc3417.call\";\n  RoomType[\"ElementVideo\"] = \"io.element.video\";\n})(RoomType || (exports.RoomType = RoomType = {}));\nconst ToDeviceMessageId = \"org.matrix.msgid\";\n\n/**\n * Identifier for an [MSC3088](https://github.com/matrix-org/matrix-doc/pull/3088)\n * room purpose. Note that this reference is UNSTABLE and subject to breaking changes,\n * including its eventual removal.\n */\nexports.ToDeviceMessageId = ToDeviceMessageId;\nconst UNSTABLE_MSC3088_PURPOSE = new _NamespacedValue.UnstableValue(\"m.room.purpose\", \"org.matrix.msc3088.purpose\");\n\n/**\n * Enabled flag for an [MSC3088](https://github.com/matrix-org/matrix-doc/pull/3088)\n * room purpose. Note that this reference is UNSTABLE and subject to breaking changes,\n * including its eventual removal.\n */\nexports.UNSTABLE_MSC3088_PURPOSE = UNSTABLE_MSC3088_PURPOSE;\nconst UNSTABLE_MSC3088_ENABLED = new _NamespacedValue.UnstableValue(\"m.enabled\", \"org.matrix.msc3088.enabled\");\n\n/**\n * Subtype for an [MSC3089](https://github.com/matrix-org/matrix-doc/pull/3089) space-room.\n * Note that this reference is UNSTABLE and subject to breaking changes, including its\n * eventual removal.\n */\nexports.UNSTABLE_MSC3088_ENABLED = UNSTABLE_MSC3088_ENABLED;\nconst UNSTABLE_MSC3089_TREE_SUBTYPE = new _NamespacedValue.UnstableValue(\"m.data_tree\", \"org.matrix.msc3089.data_tree\");\n\n/**\n * Leaf type for an event in a [MSC3089](https://github.com/matrix-org/matrix-doc/pull/3089) space-room.\n * Note that this reference is UNSTABLE and subject to breaking changes, including its\n * eventual removal.\n */\nexports.UNSTABLE_MSC3089_TREE_SUBTYPE = UNSTABLE_MSC3089_TREE_SUBTYPE;\nconst UNSTABLE_MSC3089_LEAF = new _NamespacedValue.UnstableValue(\"m.leaf\", \"org.matrix.msc3089.leaf\");\n\n/**\n * Branch (Leaf Reference) type for the index approach in a\n * [MSC3089](https://github.com/matrix-org/matrix-doc/pull/3089) space-room. Note that this reference is\n * UNSTABLE and subject to breaking changes, including its eventual removal.\n */\nexports.UNSTABLE_MSC3089_LEAF = UNSTABLE_MSC3089_LEAF;\nconst UNSTABLE_MSC3089_BRANCH = new _NamespacedValue.UnstableValue(\"m.branch\", \"org.matrix.msc3089.branch\");\n\n/**\n * Marker event type to point back at imported historical content in a room. See\n * [MSC2716](https://github.com/matrix-org/matrix-spec-proposals/pull/2716).\n * Note that this reference is UNSTABLE and subject to breaking changes,\n * including its eventual removal.\n */\nexports.UNSTABLE_MSC3089_BRANCH = UNSTABLE_MSC3089_BRANCH;\nconst UNSTABLE_MSC2716_MARKER = new _NamespacedValue.UnstableValue(\"m.room.marker\", \"org.matrix.msc2716.marker\");\n\n/**\n * Functional members type for declaring a purpose of room members (e.g. helpful bots).\n * Note that this reference is UNSTABLE and subject to breaking changes, including its\n * eventual removal.\n *\n * Schema (TypeScript):\n * ```\n * {\n *   service_members?: string[]\n * }\n * ```\n *\n * @example\n * ```\n * {\n *   \"service_members\": [\n *     \"@helperbot:localhost\",\n *     \"@reminderbot:alice.tdl\"\n *   ]\n * }\n * ```\n */\nexports.UNSTABLE_MSC2716_MARKER = UNSTABLE_MSC2716_MARKER;\nconst UNSTABLE_ELEMENT_FUNCTIONAL_USERS = new _NamespacedValue.UnstableValue(\"io.element.functional_members\", \"io.element.functional_members\");\n\n/**\n * A type of message that affects visibility of a message,\n * as per https://github.com/matrix-org/matrix-doc/pull/3531\n *\n * @experimental\n */\nexports.UNSTABLE_ELEMENT_FUNCTIONAL_USERS = UNSTABLE_ELEMENT_FUNCTIONAL_USERS;\nconst EVENT_VISIBILITY_CHANGE_TYPE = new _NamespacedValue.UnstableValue(\"m.visibility\", \"org.matrix.msc3531.visibility\");\n\n/**\n * https://github.com/matrix-org/matrix-doc/pull/3881\n *\n * @experimental\n */\nexports.EVENT_VISIBILITY_CHANGE_TYPE = EVENT_VISIBILITY_CHANGE_TYPE;\nconst PUSHER_ENABLED = new _NamespacedValue.UnstableValue(\"enabled\", \"org.matrix.msc3881.enabled\");\n\n/**\n * https://github.com/matrix-org/matrix-doc/pull/3881\n *\n * @experimental\n */\nexports.PUSHER_ENABLED = PUSHER_ENABLED;\nconst PUSHER_DEVICE_ID = new _NamespacedValue.UnstableValue(\"device_id\", \"org.matrix.msc3881.device_id\");\n\n/**\n * https://github.com/matrix-org/matrix-doc/pull/3890\n *\n * @experimental\n */\nexports.PUSHER_DEVICE_ID = PUSHER_DEVICE_ID;\nconst LOCAL_NOTIFICATION_SETTINGS_PREFIX = new _NamespacedValue.UnstableValue(\"m.local_notification_settings\", \"org.matrix.msc3890.local_notification_settings\");\nexports.LOCAL_NOTIFICATION_SETTINGS_PREFIX = LOCAL_NOTIFICATION_SETTINGS_PREFIX;\n//# sourceMappingURL=event.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.UNREAD_THREAD_NOTIFICATIONS = void 0;\nvar _NamespacedValue = require(\"../NamespacedValue\");\n/*\nCopyright 2022 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n/**\n * https://github.com/matrix-org/matrix-doc/pull/3773\n *\n * @experimental\n */\nconst UNREAD_THREAD_NOTIFICATIONS = new _NamespacedValue.ServerControlledNamespacedValue(\"unread_thread_notifications\", \"org.matrix.msc3773.unread_thread_notifications\");\nexports.UNREAD_THREAD_NOTIFICATIONS = UNREAD_THREAD_NOTIFICATIONS;\n//# sourceMappingURL=sync.js.map","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.SyncAccumulator = exports.Category = void 0;\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\nvar _logger = require(\"./logger\");\nvar _utils = require(\"./utils\");\nvar _event = require(\"./@types/event\");\nvar _read_receipts = require(\"./@types/read_receipts\");\nvar _sync = require(\"./@types/sync\");\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }\n/* eslint-enable camelcase */\nlet Category;\nexports.Category = Category;\n(function (Category) {\n  Category[\"Invite\"] = \"invite\";\n  Category[\"Leave\"] = \"leave\";\n  Category[\"Join\"] = \"join\";\n})(Category || (exports.Category = Category = {}));\nfunction isTaggedEvent(event) {\n  return \"_localTs\" in event && event[\"_localTs\"] !== undefined;\n}\n\n/**\n * The purpose of this class is to accumulate /sync responses such that a\n * complete \"initial\" JSON response can be returned which accurately represents\n * the sum total of the /sync responses accumulated to date. It only handles\n * room data: that is, everything under the \"rooms\" top-level key.\n *\n * This class is used when persisting room data so a complete /sync response can\n * be loaded from disk and incremental syncs can be performed on the server,\n * rather than asking the server to do an initial sync on startup.\n */\nclass SyncAccumulator {\n  // $event_type: Object\n  // $roomId: { ... sync 'invite' json data ... }\n\n  // the /sync token which corresponds to the last time rooms were\n  // accumulated. We remember this so that any caller can obtain a\n  // coherent /sync response and know at what point they should be\n  // streaming from without losing events.\n\n  constructor(opts = {}) {\n    this.opts = opts;\n    (0, _defineProperty2.default)(this, \"accountData\", {});\n    (0, _defineProperty2.default)(this, \"inviteRooms\", {});\n    (0, _defineProperty2.default)(this, \"joinRooms\", {});\n    (0, _defineProperty2.default)(this, \"nextBatch\", null);\n    this.opts.maxTimelineEntries = this.opts.maxTimelineEntries || 50;\n  }\n  accumulate(syncResponse, fromDatabase = false) {\n    this.accumulateRooms(syncResponse, fromDatabase);\n    this.accumulateAccountData(syncResponse);\n    this.nextBatch = syncResponse.next_batch;\n  }\n  accumulateAccountData(syncResponse) {\n    if (!syncResponse.account_data || !syncResponse.account_data.events) {\n      return;\n    }\n    // Clobbers based on event type.\n    syncResponse.account_data.events.forEach(e => {\n      this.accountData[e.type] = e;\n    });\n  }\n\n  /**\n   * Accumulate incremental /sync room data.\n   * @param syncResponse - the complete /sync JSON\n   * @param fromDatabase - True if the sync response is one saved to the database\n   */\n  accumulateRooms(syncResponse, fromDatabase = false) {\n    if (!syncResponse.rooms) {\n      return;\n    }\n    if (syncResponse.rooms.invite) {\n      Object.keys(syncResponse.rooms.invite).forEach(roomId => {\n        this.accumulateRoom(roomId, Category.Invite, syncResponse.rooms.invite[roomId], fromDatabase);\n      });\n    }\n    if (syncResponse.rooms.join) {\n      Object.keys(syncResponse.rooms.join).forEach(roomId => {\n        this.accumulateRoom(roomId, Category.Join, syncResponse.rooms.join[roomId], fromDatabase);\n      });\n    }\n    if (syncResponse.rooms.leave) {\n      Object.keys(syncResponse.rooms.leave).forEach(roomId => {\n        this.accumulateRoom(roomId, Category.Leave, syncResponse.rooms.leave[roomId], fromDatabase);\n      });\n    }\n  }\n  accumulateRoom(roomId, category, data, fromDatabase = false) {\n    // Valid /sync state transitions\n    //       +--------+ <======+            1: Accept an invite\n    //   +== | INVITE |        | (5)        2: Leave a room\n    //   |   +--------+ =====+ |            3: Join a public room previously\n    //   |(1)            (4) | |               left (handle as if new room)\n    //   V         (2)       V |            4: Reject an invite\n    // +------+ ========> +--------+         5: Invite to a room previously\n    // | JOIN |    (3)    | LEAVE* |            left (handle as if new room)\n    // +------+ <======== +--------+\n    //\n    // * equivalent to \"no state\"\n    switch (category) {\n      case Category.Invite:\n        // (5)\n        this.accumulateInviteState(roomId, data);\n        break;\n      case Category.Join:\n        if (this.inviteRooms[roomId]) {\n          // (1)\n          // was previously invite, now join. We expect /sync to give\n          // the entire state and timeline on 'join', so delete previous\n          // invite state\n          delete this.inviteRooms[roomId];\n        }\n        // (3)\n        this.accumulateJoinState(roomId, data, fromDatabase);\n        break;\n      case Category.Leave:\n        if (this.inviteRooms[roomId]) {\n          // (4)\n          delete this.inviteRooms[roomId];\n        } else {\n          // (2)\n          delete this.joinRooms[roomId];\n        }\n        break;\n      default:\n        _logger.logger.error(\"Unknown cateogory: \", category);\n    }\n  }\n  accumulateInviteState(roomId, data) {\n    if (!data.invite_state || !data.invite_state.events) {\n      // no new data\n      return;\n    }\n    if (!this.inviteRooms[roomId]) {\n      this.inviteRooms[roomId] = {\n        invite_state: data.invite_state\n      };\n      return;\n    }\n    // accumulate extra keys for invite->invite transitions\n    // clobber based on event type / state key\n    // We expect invite_state to be small, so just loop over the events\n    const currentData = this.inviteRooms[roomId];\n    data.invite_state.events.forEach(e => {\n      let hasAdded = false;\n      for (let i = 0; i < currentData.invite_state.events.length; i++) {\n        const current = currentData.invite_state.events[i];\n        if (current.type === e.type && current.state_key == e.state_key) {\n          currentData.invite_state.events[i] = e; // update\n          hasAdded = true;\n        }\n      }\n      if (!hasAdded) {\n        currentData.invite_state.events.push(e);\n      }\n    });\n  }\n\n  // Accumulate timeline and state events in a room.\n  accumulateJoinState(roomId, data, fromDatabase = false) {\n    var _ref, _data, _data$ephemeral, _data$ephemeral$event, _data$state, _data$state$events, _data$timeline, _data$timeline$events;\n    // We expect this function to be called a lot (every /sync) so we want\n    // this to be fast. /sync stores events in an array but we often want\n    // to clobber based on type/state_key. Rather than convert arrays to\n    // maps all the time, just keep private maps which contain\n    // the actual current accumulated sync state, and array-ify it when\n    // getJSON() is called.\n\n    // State resolution:\n    // The 'state' key is the delta from the previous sync (or start of time\n    // if no token was supplied), to the START of the timeline. To obtain\n    // the current state, we need to \"roll forward\" state by reading the\n    // timeline. We want to store the current state so we can drop events\n    // out the end of the timeline based on opts.maxTimelineEntries.\n    //\n    //      'state'     'timeline'     current state\n    // |-------x<======================>x\n    //          T   I   M   E\n    //\n    // When getJSON() is called, we 'roll back' the current state by the\n    // number of entries in the timeline to work out what 'state' should be.\n\n    // Back-pagination:\n    // On an initial /sync, the server provides a back-pagination token for\n    // the start of the timeline. When /sync deltas come down, they also\n    // include back-pagination tokens for the start of the timeline. This\n    // means not all events in the timeline have back-pagination tokens, as\n    // it is only the ones at the START of the timeline which have them.\n    // In order for us to have a valid timeline (and back-pagination token\n    // to match), we need to make sure that when we remove old timeline\n    // events, that we roll forward to an event which has a back-pagination\n    // token. This means we can't keep a strict sliding-window based on\n    // opts.maxTimelineEntries, and we may have a few less. We should never\n    // have more though, provided that the /sync limit is less than or equal\n    // to opts.maxTimelineEntries.\n\n    if (!this.joinRooms[roomId]) {\n      // Create truly empty objects so event types of 'hasOwnProperty' and co\n      // don't cause this code to break.\n      this.joinRooms[roomId] = {\n        _currentState: Object.create(null),\n        _timeline: [],\n        _accountData: Object.create(null),\n        _unreadNotifications: {},\n        _unreadThreadNotifications: {},\n        _summary: {},\n        _readReceipts: {},\n        _threadReadReceipts: {}\n      };\n    }\n    const currentData = this.joinRooms[roomId];\n    if (data.account_data && data.account_data.events) {\n      // clobber based on type\n      data.account_data.events.forEach(e => {\n        currentData._accountData[e.type] = e;\n      });\n    }\n\n    // these probably clobber, spec is unclear.\n    if (data.unread_notifications) {\n      currentData._unreadNotifications = data.unread_notifications;\n    }\n    currentData._unreadThreadNotifications = (_ref = (_data = data[_sync.UNREAD_THREAD_NOTIFICATIONS.stable]) !== null && _data !== void 0 ? _data : data[_sync.UNREAD_THREAD_NOTIFICATIONS.unstable]) !== null && _ref !== void 0 ? _ref : undefined;\n    if (data.summary) {\n      const HEROES_KEY = \"m.heroes\";\n      const INVITED_COUNT_KEY = \"m.invited_member_count\";\n      const JOINED_COUNT_KEY = \"m.joined_member_count\";\n      const acc = currentData._summary;\n      const sum = data.summary;\n      acc[HEROES_KEY] = sum[HEROES_KEY] || acc[HEROES_KEY];\n      acc[JOINED_COUNT_KEY] = sum[JOINED_COUNT_KEY] || acc[JOINED_COUNT_KEY];\n      acc[INVITED_COUNT_KEY] = sum[INVITED_COUNT_KEY] || acc[INVITED_COUNT_KEY];\n    }\n    (_data$ephemeral = data.ephemeral) === null || _data$ephemeral === void 0 ? void 0 : (_data$ephemeral$event = _data$ephemeral.events) === null || _data$ephemeral$event === void 0 ? void 0 : _data$ephemeral$event.forEach(e => {\n      // We purposefully do not persist m.typing events.\n      // Technically you could refresh a browser before the timer on a\n      // typing event is up, so it'll look like you aren't typing when\n      // you really still are. However, the alternative is worse. If\n      // we do persist typing events, it will look like people are\n      // typing forever until someone really does start typing (which\n      // will prompt Synapse to send down an actual m.typing event to\n      // clobber the one we persisted).\n      if (e.type !== _event.EventType.Receipt || !e.content) {\n        // This means we'll drop unknown ephemeral events but that\n        // seems okay.\n        return;\n      }\n      // Handle m.receipt events. They clobber based on:\n      //   (user_id, receipt_type)\n      // but they are keyed in the event as:\n      //   content:{ $event_id: { $receipt_type: { $user_id: {json} }}}\n      // so store them in the former so we can accumulate receipt deltas\n      // quickly and efficiently (we expect a lot of them). Fold the\n      // receipt type into the key name since we only have 1 at the\n      // moment (m.read) and nested JSON objects are slower and more\n      // of a hassle to work with. We'll inflate this back out when\n      // getJSON() is called.\n      Object.keys(e.content).forEach(eventId => {\n        Object.entries(e.content[eventId]).forEach(([key, value]) => {\n          if (!(0, _utils.isSupportedReceiptType)(key)) return;\n          for (const userId of Object.keys(value)) {\n            const data = e.content[eventId][key][userId];\n            const receipt = {\n              data: e.content[eventId][key][userId],\n              type: key,\n              eventId: eventId\n            };\n            if (!data.thread_id || data.thread_id === _read_receipts.MAIN_ROOM_TIMELINE) {\n              currentData._readReceipts[userId] = receipt;\n            } else {\n              var _currentData$_threadR;\n              currentData._threadReadReceipts = _objectSpread(_objectSpread({}, currentData._threadReadReceipts), {}, {\n                [data.thread_id]: _objectSpread(_objectSpread({}, (_currentData$_threadR = currentData._threadReadReceipts[data.thread_id]) !== null && _currentData$_threadR !== void 0 ? _currentData$_threadR : {}), {}, {\n                  [userId]: receipt\n                })\n              });\n            }\n          }\n        });\n      });\n    });\n\n    // if we got a limited sync, we need to remove all timeline entries or else\n    // we will have gaps in the timeline.\n    if (data.timeline && data.timeline.limited) {\n      currentData._timeline = [];\n    }\n\n    // Work out the current state. The deltas need to be applied in the order:\n    // - existing state which didn't come down /sync.\n    // - State events under the 'state' key.\n    // - State events in the 'timeline'.\n    (_data$state = data.state) === null || _data$state === void 0 ? void 0 : (_data$state$events = _data$state.events) === null || _data$state$events === void 0 ? void 0 : _data$state$events.forEach(e => {\n      setState(currentData._currentState, e);\n    });\n    (_data$timeline = data.timeline) === null || _data$timeline === void 0 ? void 0 : (_data$timeline$events = _data$timeline.events) === null || _data$timeline$events === void 0 ? void 0 : _data$timeline$events.forEach((e, index) => {\n      var _data$timeline$prev_b;\n      // this nops if 'e' isn't a state event\n      setState(currentData._currentState, e);\n      // append the event to the timeline. The back-pagination token\n      // corresponds to the first event in the timeline\n      let transformedEvent;\n      if (!fromDatabase) {\n        transformedEvent = Object.assign({}, e);\n        if (transformedEvent.unsigned !== undefined) {\n          transformedEvent.unsigned = Object.assign({}, transformedEvent.unsigned);\n        }\n        const age = e.unsigned ? e.unsigned.age : e.age;\n        if (age !== undefined) transformedEvent._localTs = Date.now() - age;\n      } else {\n        transformedEvent = e;\n      }\n      currentData._timeline.push({\n        event: transformedEvent,\n        token: index === 0 ? (_data$timeline$prev_b = data.timeline.prev_batch) !== null && _data$timeline$prev_b !== void 0 ? _data$timeline$prev_b : null : null\n      });\n    });\n\n    // attempt to prune the timeline by jumping between events which have\n    // pagination tokens.\n    if (currentData._timeline.length > this.opts.maxTimelineEntries) {\n      const startIndex = currentData._timeline.length - this.opts.maxTimelineEntries;\n      for (let i = startIndex; i < currentData._timeline.length; i++) {\n        if (currentData._timeline[i].token) {\n          // keep all events after this, including this one\n          currentData._timeline = currentData._timeline.slice(i, currentData._timeline.length);\n          break;\n        }\n      }\n    }\n  }\n\n  /**\n   * Return everything under the 'rooms' key from a /sync response which\n   * represents all room data that should be stored. This should be paired\n   * with the sync token which represents the most recent /sync response\n   * provided to accumulate().\n   * @param forDatabase - True to generate a sync to be saved to storage\n   * @returns An object with a \"nextBatch\", \"roomsData\" and \"accountData\"\n   * keys.\n   * The \"nextBatch\" key is a string which represents at what point in the\n   * /sync stream the accumulator reached. This token should be used when\n   * restarting a /sync stream at startup. Failure to do so can lead to missing\n   * events. The \"roomsData\" key is an Object which represents the entire\n   * /sync response from the 'rooms' key onwards. The \"accountData\" key is\n   * a list of raw events which represent global account data.\n   */\n  getJSON(forDatabase = false) {\n    const data = {\n      join: {},\n      invite: {},\n      // always empty. This is set by /sync when a room was previously\n      // in 'invite' or 'join'. On fresh startup, the client won't know\n      // about any previous room being in 'invite' or 'join' so we can\n      // just omit mentioning it at all, even if it has previously come\n      // down /sync.\n      // The notable exception is when a client is kicked or banned:\n      // we may want to hold onto that room so the client can clearly see\n      // why their room has disappeared. We don't persist it though because\n      // it is unclear *when* we can safely remove the room from the DB.\n      // Instead, we assume that if you're loading from the DB, you've\n      // refreshed the page, which means you've seen the kick/ban already.\n      leave: {}\n    };\n    Object.keys(this.inviteRooms).forEach(roomId => {\n      data.invite[roomId] = this.inviteRooms[roomId];\n    });\n    Object.keys(this.joinRooms).forEach(roomId => {\n      const roomData = this.joinRooms[roomId];\n      const roomJson = {\n        ephemeral: {\n          events: []\n        },\n        account_data: {\n          events: []\n        },\n        state: {\n          events: []\n        },\n        timeline: {\n          events: [],\n          prev_batch: null\n        },\n        unread_notifications: roomData._unreadNotifications,\n        unread_thread_notifications: roomData._unreadThreadNotifications,\n        summary: roomData._summary\n      };\n      // Add account data\n      Object.keys(roomData._accountData).forEach(evType => {\n        roomJson.account_data.events.push(roomData._accountData[evType]);\n      });\n\n      // Add receipt data\n      const receiptEvent = {\n        type: _event.EventType.Receipt,\n        room_id: roomId,\n        content: {\n          // $event_id: { \"m.read\": { $user_id: $json } }\n        }\n      };\n      for (const [userId, receiptData] of Object.entries(roomData._readReceipts)) {\n        if (!receiptEvent.content[receiptData.eventId]) {\n          receiptEvent.content[receiptData.eventId] = {};\n        }\n        if (!receiptEvent.content[receiptData.eventId][receiptData.type]) {\n          receiptEvent.content[receiptData.eventId][receiptData.type] = {};\n        }\n        receiptEvent.content[receiptData.eventId][receiptData.type][userId] = receiptData.data;\n      }\n      for (const threadReceipts of Object.values(roomData._threadReadReceipts)) {\n        for (const [userId, receiptData] of Object.entries(threadReceipts)) {\n          if (!receiptEvent.content[receiptData.eventId]) {\n            receiptEvent.content[receiptData.eventId] = {};\n          }\n          if (!receiptEvent.content[receiptData.eventId][receiptData.type]) {\n            receiptEvent.content[receiptData.eventId][receiptData.type] = {};\n          }\n          receiptEvent.content[receiptData.eventId][receiptData.type][userId] = receiptData.data;\n        }\n      }\n      // add only if we have some receipt data\n      if (Object.keys(receiptEvent.content).length > 0) {\n        roomJson.ephemeral.events.push(receiptEvent);\n      }\n\n      // Add timeline data\n      roomData._timeline.forEach(msgData => {\n        if (!roomJson.timeline.prev_batch) {\n          // the first event we add to the timeline MUST match up to\n          // the prev_batch token.\n          if (!msgData.token) {\n            return; // this shouldn't happen as we prune constantly.\n          }\n\n          roomJson.timeline.prev_batch = msgData.token;\n        }\n        let transformedEvent;\n        if (!forDatabase && isTaggedEvent(msgData.event)) {\n          // This means we have to copy each event, so we can fix it up to\n          // set a correct 'age' parameter whilst keeping the local timestamp\n          // on our stored event. If this turns out to be a bottleneck, it could\n          // be optimised either by doing this in the main process after the data\n          // has been structured-cloned to go between the worker & main process,\n          // or special-casing data from saved syncs to read the local timestamp\n          // directly rather than turning it into age to then immediately be\n          // transformed back again into a local timestamp.\n          transformedEvent = Object.assign({}, msgData.event);\n          if (transformedEvent.unsigned !== undefined) {\n            transformedEvent.unsigned = Object.assign({}, transformedEvent.unsigned);\n          }\n          delete transformedEvent._localTs;\n          transformedEvent.unsigned = transformedEvent.unsigned || {};\n          transformedEvent.unsigned.age = Date.now() - msgData.event._localTs;\n        } else {\n          transformedEvent = msgData.event;\n        }\n        roomJson.timeline.events.push(transformedEvent);\n      });\n\n      // Add state data: roll back current state to the start of timeline,\n      // by \"reverse clobbering\" from the end of the timeline to the start.\n      // Convert maps back into arrays.\n      const rollBackState = Object.create(null);\n      for (let i = roomJson.timeline.events.length - 1; i >= 0; i--) {\n        const timelineEvent = roomJson.timeline.events[i];\n        if (timelineEvent.state_key === null || timelineEvent.state_key === undefined) {\n          continue; // not a state event\n        }\n        // since we're going back in time, we need to use the previous\n        // state value else we'll break causality. We don't have the\n        // complete previous state event, so we need to create one.\n        const prevStateEvent = (0, _utils.deepCopy)(timelineEvent);\n        if (prevStateEvent.unsigned) {\n          if (prevStateEvent.unsigned.prev_content) {\n            prevStateEvent.content = prevStateEvent.unsigned.prev_content;\n          }\n          if (prevStateEvent.unsigned.prev_sender) {\n            prevStateEvent.sender = prevStateEvent.unsigned.prev_sender;\n          }\n        }\n        setState(rollBackState, prevStateEvent);\n      }\n      Object.keys(roomData._currentState).forEach(evType => {\n        Object.keys(roomData._currentState[evType]).forEach(stateKey => {\n          let ev = roomData._currentState[evType][stateKey];\n          if (rollBackState[evType] && rollBackState[evType][stateKey]) {\n            // use the reverse clobbered event instead.\n            ev = rollBackState[evType][stateKey];\n          }\n          roomJson.state.events.push(ev);\n        });\n      });\n      data.join[roomId] = roomJson;\n    });\n\n    // Add account data\n    const accData = [];\n    Object.keys(this.accountData).forEach(evType => {\n      accData.push(this.accountData[evType]);\n    });\n    return {\n      nextBatch: this.nextBatch,\n      roomsData: data,\n      accountData: accData\n    };\n  }\n  getNextBatchToken() {\n    return this.nextBatch;\n  }\n}\nexports.SyncAccumulator = SyncAccumulator;\nfunction setState(eventMap, event) {\n  if (event.state_key === null || event.state_key === undefined || !event.type) {\n    return;\n  }\n  if (!eventMap[event.type]) {\n    eventMap[event.type] = Object.create(null);\n  }\n  eventMap[event.type][event.state_key] = event;\n}\n//# sourceMappingURL=sync-accumulator.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.exists = exists;\n/*\nCopyright 2019 New Vector Ltd\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n/**\n * Check if an IndexedDB database exists. The only way to do so is to try opening it, so\n * we do that and then delete it did not exist before.\n *\n * @param indexedDB - The `indexedDB` interface\n * @param dbName - The database name to test for\n * @returns Whether the database exists\n */\nfunction exists(indexedDB, dbName) {\n  return new Promise((resolve, reject) => {\n    let exists = true;\n    const req = indexedDB.open(dbName);\n    req.onupgradeneeded = () => {\n      // Since we did not provide an explicit version when opening, this event\n      // should only fire if the DB did not exist before at any version.\n      exists = false;\n    };\n    req.onblocked = () => reject(req.error);\n    req.onsuccess = () => {\n      const db = req.result;\n      db.close();\n      if (!exists) {\n        // The DB did not exist before, but has been created as part of this\n        // existence check. Delete it now to restore previous state. Delete can\n        // actually take a while to complete in some browsers, so don't wait for\n        // it. This won't block future open calls that a store might issue next to\n        // properly set up the DB.\n        indexedDB.deleteDatabase(dbName);\n      }\n      resolve(exists);\n    };\n    req.onerror = () => reject(req.error);\n  });\n}\n//# sourceMappingURL=indexeddb-helpers.js.map","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.LocalIndexedDBStoreBackend = void 0;\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\nvar _syncAccumulator = require(\"../sync-accumulator\");\nvar utils = _interopRequireWildcard(require(\"../utils\"));\nvar IndexedDBHelpers = _interopRequireWildcard(require(\"../indexeddb-helpers\"));\nvar _logger = require(\"../logger\");\nfunction _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== \"function\") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }\nfunction _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== \"object\" && typeof obj !== \"function\") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== \"default\" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }\n/*\nCopyright 2017 - 2021 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\nconst DB_MIGRATIONS = [db => {\n  // Make user store, clobber based on user ID. (userId property of User objects)\n  db.createObjectStore(\"users\", {\n    keyPath: [\"userId\"]\n  });\n\n  // Make account data store, clobber based on event type.\n  // (event.type property of MatrixEvent objects)\n  db.createObjectStore(\"accountData\", {\n    keyPath: [\"type\"]\n  });\n\n  // Make /sync store (sync tokens, room data, etc), always clobber (const key).\n  db.createObjectStore(\"sync\", {\n    keyPath: [\"clobber\"]\n  });\n}, db => {\n  const oobMembersStore = db.createObjectStore(\"oob_membership_events\", {\n    keyPath: [\"room_id\", \"state_key\"]\n  });\n  oobMembersStore.createIndex(\"room\", \"room_id\");\n}, db => {\n  db.createObjectStore(\"client_options\", {\n    keyPath: [\"clobber\"]\n  });\n}, db => {\n  db.createObjectStore(\"to_device_queue\", {\n    autoIncrement: true\n  });\n}\n// Expand as needed.\n];\n\nconst VERSION = DB_MIGRATIONS.length;\n\n/**\n * Helper method to collect results from a Cursor and promiseify it.\n * @param store - The store to perform openCursor on.\n * @param keyRange - Optional key range to apply on the cursor.\n * @param resultMapper - A function which is repeatedly called with a\n * Cursor.\n * Return the data you want to keep.\n * @returns Promise which resolves to an array of whatever you returned from\n * resultMapper.\n */\nfunction selectQuery(store, keyRange, resultMapper) {\n  const query = store.openCursor(keyRange);\n  return new Promise((resolve, reject) => {\n    const results = [];\n    query.onerror = () => {\n      reject(new Error(\"Query failed: \" + query.error));\n    };\n    // collect results\n    query.onsuccess = () => {\n      const cursor = query.result;\n      if (!cursor) {\n        resolve(results);\n        return; // end of results\n      }\n\n      results.push(resultMapper(cursor));\n      cursor.continue();\n    };\n  });\n}\nfunction txnAsPromise(txn) {\n  return new Promise((resolve, reject) => {\n    txn.oncomplete = function (event) {\n      resolve(event);\n    };\n    txn.onerror = function () {\n      reject(txn.error);\n    };\n  });\n}\nfunction reqAsEventPromise(req) {\n  return new Promise((resolve, reject) => {\n    req.onsuccess = function (event) {\n      resolve(event);\n    };\n    req.onerror = function () {\n      reject(req.error);\n    };\n  });\n}\nfunction reqAsPromise(req) {\n  return new Promise((resolve, reject) => {\n    req.onsuccess = () => resolve(req);\n    req.onerror = err => reject(err);\n  });\n}\nfunction reqAsCursorPromise(req) {\n  return reqAsEventPromise(req).then(event => req.result);\n}\nclass LocalIndexedDBStoreBackend {\n  static exists(indexedDB, dbName) {\n    dbName = \"matrix-js-sdk:\" + (dbName || \"default\");\n    return IndexedDBHelpers.exists(indexedDB, dbName);\n  }\n  /**\n   * Does the actual reading from and writing to the indexeddb\n   *\n   * Construct a new Indexed Database store backend. This requires a call to\n   * `connect()` before this store can be used.\n   * @param indexedDB - The Indexed DB interface e.g\n   * `window.indexedDB`\n   * @param dbName - Optional database name. The same name must be used\n   * to open the same database.\n   */\n  constructor(indexedDB, dbName = \"default\") {\n    this.indexedDB = indexedDB;\n    (0, _defineProperty2.default)(this, \"dbName\", void 0);\n    (0, _defineProperty2.default)(this, \"syncAccumulator\", void 0);\n    (0, _defineProperty2.default)(this, \"db\", void 0);\n    (0, _defineProperty2.default)(this, \"disconnected\", true);\n    (0, _defineProperty2.default)(this, \"_isNewlyCreated\", false);\n    (0, _defineProperty2.default)(this, \"isPersisting\", false);\n    (0, _defineProperty2.default)(this, \"pendingUserPresenceData\", []);\n    this.dbName = \"matrix-js-sdk:\" + dbName;\n    this.syncAccumulator = new _syncAccumulator.SyncAccumulator();\n  }\n\n  /**\n   * Attempt to connect to the database. This can fail if the user does not\n   * grant permission.\n   * @returns Promise which resolves if successfully connected.\n   */\n  connect() {\n    if (!this.disconnected) {\n      _logger.logger.log(`LocalIndexedDBStoreBackend.connect: already connected or connecting`);\n      return Promise.resolve();\n    }\n    this.disconnected = false;\n    _logger.logger.log(`LocalIndexedDBStoreBackend.connect: connecting...`);\n    const req = this.indexedDB.open(this.dbName, VERSION);\n    req.onupgradeneeded = ev => {\n      const db = req.result;\n      const oldVersion = ev.oldVersion;\n      _logger.logger.log(`LocalIndexedDBStoreBackend.connect: upgrading from ${oldVersion}`);\n      if (oldVersion < 1) {\n        // The database did not previously exist\n        this._isNewlyCreated = true;\n      }\n      DB_MIGRATIONS.forEach((migration, index) => {\n        if (oldVersion <= index) migration(db);\n      });\n    };\n    req.onblocked = () => {\n      _logger.logger.log(`can't yet open LocalIndexedDBStoreBackend because it is open elsewhere`);\n    };\n    _logger.logger.log(`LocalIndexedDBStoreBackend.connect: awaiting connection...`);\n    return reqAsEventPromise(req).then(async () => {\n      _logger.logger.log(`LocalIndexedDBStoreBackend.connect: connected`);\n      this.db = req.result;\n\n      // add a poorly-named listener for when deleteDatabase is called\n      // so we can close our db connections.\n      this.db.onversionchange = () => {\n        var _this$db;\n        (_this$db = this.db) === null || _this$db === void 0 ? void 0 : _this$db.close();\n      };\n      await this.init();\n    });\n  }\n\n  /** @returns whether or not the database was newly created in this session. */\n  isNewlyCreated() {\n    return Promise.resolve(this._isNewlyCreated);\n  }\n\n  /**\n   * Having connected, load initial data from the database and prepare for use\n   * @returns Promise which resolves on success\n   */\n  init() {\n    return Promise.all([this.loadAccountData(), this.loadSyncData()]).then(([accountData, syncData]) => {\n      _logger.logger.log(`LocalIndexedDBStoreBackend: loaded initial data`);\n      this.syncAccumulator.accumulate({\n        next_batch: syncData.nextBatch,\n        rooms: syncData.roomsData,\n        account_data: {\n          events: accountData\n        }\n      }, true);\n    });\n  }\n\n  /**\n   * Returns the out-of-band membership events for this room that\n   * were previously loaded.\n   * @returns the events, potentially an empty array if OOB loading didn't yield any new members\n   * @returns in case the members for this room haven't been stored yet\n   */\n  getOutOfBandMembers(roomId) {\n    return new Promise((resolve, reject) => {\n      const tx = this.db.transaction([\"oob_membership_events\"], \"readonly\");\n      const store = tx.objectStore(\"oob_membership_events\");\n      const roomIndex = store.index(\"room\");\n      const range = IDBKeyRange.only(roomId);\n      const request = roomIndex.openCursor(range);\n      const membershipEvents = [];\n      // did we encounter the oob_written marker object\n      // amongst the results? That means OOB member\n      // loading already happened for this room\n      // but there were no members to persist as they\n      // were all known already\n      let oobWritten = false;\n      request.onsuccess = () => {\n        const cursor = request.result;\n        if (!cursor) {\n          // Unknown room\n          if (!membershipEvents.length && !oobWritten) {\n            return resolve(null);\n          }\n          return resolve(membershipEvents);\n        }\n        const record = cursor.value;\n        if (record.oob_written) {\n          oobWritten = true;\n        } else {\n          membershipEvents.push(record);\n        }\n        cursor.continue();\n      };\n      request.onerror = err => {\n        reject(err);\n      };\n    }).then(events => {\n      _logger.logger.log(`LL: got ${events === null || events === void 0 ? void 0 : events.length} membershipEvents from storage for room ${roomId} ...`);\n      return events;\n    });\n  }\n\n  /**\n   * Stores the out-of-band membership events for this room. Note that\n   * it still makes sense to store an empty array as the OOB status for the room is\n   * marked as fetched, and getOutOfBandMembers will return an empty array instead of null\n   * @param membershipEvents - the membership events to store\n   */\n  async setOutOfBandMembers(roomId, membershipEvents) {\n    _logger.logger.log(`LL: backend about to store ${membershipEvents.length}` + ` members for ${roomId}`);\n    const tx = this.db.transaction([\"oob_membership_events\"], \"readwrite\");\n    const store = tx.objectStore(\"oob_membership_events\");\n    membershipEvents.forEach(e => {\n      store.put(e);\n    });\n    // aside from all the events, we also write a marker object to the store\n    // to mark the fact that OOB members have been written for this room.\n    // It's possible that 0 members need to be written as all where previously know\n    // but we still need to know whether to return null or [] from getOutOfBandMembers\n    // where null means out of band members haven't been stored yet for this room\n    const markerObject = {\n      room_id: roomId,\n      oob_written: true,\n      state_key: 0\n    };\n    store.put(markerObject);\n    await txnAsPromise(tx);\n    _logger.logger.log(`LL: backend done storing for ${roomId}!`);\n  }\n  async clearOutOfBandMembers(roomId) {\n    // the approach to delete all members for a room\n    // is to get the min and max state key from the index\n    // for that room, and then delete between those\n    // keys in the store.\n    // this should be way faster than deleting every member\n    // individually for a large room.\n    const readTx = this.db.transaction([\"oob_membership_events\"], \"readonly\");\n    const store = readTx.objectStore(\"oob_membership_events\");\n    const roomIndex = store.index(\"room\");\n    const roomRange = IDBKeyRange.only(roomId);\n    const minStateKeyProm = reqAsCursorPromise(roomIndex.openKeyCursor(roomRange, \"next\")).then(cursor => (cursor === null || cursor === void 0 ? void 0 : cursor.primaryKey)[1]);\n    const maxStateKeyProm = reqAsCursorPromise(roomIndex.openKeyCursor(roomRange, \"prev\")).then(cursor => (cursor === null || cursor === void 0 ? void 0 : cursor.primaryKey)[1]);\n    const [minStateKey, maxStateKey] = await Promise.all([minStateKeyProm, maxStateKeyProm]);\n    const writeTx = this.db.transaction([\"oob_membership_events\"], \"readwrite\");\n    const writeStore = writeTx.objectStore(\"oob_membership_events\");\n    const membersKeyRange = IDBKeyRange.bound([roomId, minStateKey], [roomId, maxStateKey]);\n    _logger.logger.log(`LL: Deleting all users + marker in storage for room ${roomId}, with key range:`, [roomId, minStateKey], [roomId, maxStateKey]);\n    await reqAsPromise(writeStore.delete(membersKeyRange));\n  }\n\n  /**\n   * Clear the entire database. This should be used when logging out of a client\n   * to prevent mixing data between accounts.\n   * @returns Resolved when the database is cleared.\n   */\n  clearDatabase() {\n    return new Promise(resolve => {\n      _logger.logger.log(`Removing indexeddb instance: ${this.dbName}`);\n      const req = this.indexedDB.deleteDatabase(this.dbName);\n      req.onblocked = () => {\n        _logger.logger.log(`can't yet delete indexeddb ${this.dbName} because it is open elsewhere`);\n      };\n      req.onerror = () => {\n        // in firefox, with indexedDB disabled, this fails with a\n        // DOMError. We treat this as non-fatal, so that we can still\n        // use the app.\n        _logger.logger.warn(`unable to delete js-sdk store indexeddb: ${req.error}`);\n        resolve();\n      };\n      req.onsuccess = () => {\n        _logger.logger.log(`Removed indexeddb instance: ${this.dbName}`);\n        resolve();\n      };\n    });\n  }\n\n  /**\n   * @param copy - If false, the data returned is from internal\n   * buffers and must not be mutated. Otherwise, a copy is made before\n   * returning such that the data can be safely mutated. Default: true.\n   *\n   * @returns Promise which resolves with a sync response to restore the\n   * client state to where it was at the last save, or null if there\n   * is no saved sync data.\n   */\n  getSavedSync(copy = true) {\n    const data = this.syncAccumulator.getJSON();\n    if (!data.nextBatch) return Promise.resolve(null);\n    if (copy) {\n      // We must deep copy the stored data so that the /sync processing code doesn't\n      // corrupt the internal state of the sync accumulator (it adds non-clonable keys)\n      return Promise.resolve(utils.deepCopy(data));\n    } else {\n      return Promise.resolve(data);\n    }\n  }\n  getNextBatchToken() {\n    return Promise.resolve(this.syncAccumulator.getNextBatchToken());\n  }\n  setSyncData(syncData) {\n    return Promise.resolve().then(() => {\n      this.syncAccumulator.accumulate(syncData);\n    });\n  }\n  async syncToDatabase(userTuples) {\n    if (this.isPersisting) {\n      _logger.logger.warn(\"Skipping syncToDatabase() as persist already in flight\");\n      this.pendingUserPresenceData.push(...userTuples);\n      return;\n    } else {\n      userTuples.unshift(...this.pendingUserPresenceData);\n      this.isPersisting = true;\n    }\n    try {\n      const syncData = this.syncAccumulator.getJSON(true);\n      await Promise.all([this.persistUserPresenceEvents(userTuples), this.persistAccountData(syncData.accountData), this.persistSyncData(syncData.nextBatch, syncData.roomsData)]);\n    } finally {\n      this.isPersisting = false;\n    }\n  }\n\n  /**\n   * Persist rooms /sync data along with the next batch token.\n   * @param nextBatch - The next_batch /sync value.\n   * @param roomsData - The 'rooms' /sync data from a SyncAccumulator\n   * @returns Promise which resolves if the data was persisted.\n   */\n  persistSyncData(nextBatch, roomsData) {\n    _logger.logger.log(\"Persisting sync data up to\", nextBatch);\n    return utils.promiseTry(() => {\n      const txn = this.db.transaction([\"sync\"], \"readwrite\");\n      const store = txn.objectStore(\"sync\");\n      store.put({\n        clobber: \"-\",\n        // constant key so will always clobber\n        nextBatch,\n        roomsData\n      }); // put == UPSERT\n      return txnAsPromise(txn).then(() => {\n        _logger.logger.log(\"Persisted sync data up to\", nextBatch);\n      });\n    });\n  }\n\n  /**\n   * Persist a list of account data events. Events with the same 'type' will\n   * be replaced.\n   * @param accountData - An array of raw user-scoped account data events\n   * @returns Promise which resolves if the events were persisted.\n   */\n  persistAccountData(accountData) {\n    return utils.promiseTry(() => {\n      const txn = this.db.transaction([\"accountData\"], \"readwrite\");\n      const store = txn.objectStore(\"accountData\");\n      for (const event of accountData) {\n        store.put(event); // put == UPSERT\n      }\n\n      return txnAsPromise(txn).then();\n    });\n  }\n\n  /**\n   * Persist a list of [user id, presence event] they are for.\n   * Users with the same 'userId' will be replaced.\n   * Presence events should be the event in its raw form (not the Event\n   * object)\n   * @param tuples - An array of [userid, event] tuples\n   * @returns Promise which resolves if the users were persisted.\n   */\n  persistUserPresenceEvents(tuples) {\n    return utils.promiseTry(() => {\n      const txn = this.db.transaction([\"users\"], \"readwrite\");\n      const store = txn.objectStore(\"users\");\n      for (const tuple of tuples) {\n        store.put({\n          userId: tuple[0],\n          event: tuple[1]\n        }); // put == UPSERT\n      }\n\n      return txnAsPromise(txn).then();\n    });\n  }\n\n  /**\n   * Load all user presence events from the database. This is not cached.\n   * FIXME: It would probably be more sensible to store the events in the\n   * sync.\n   * @returns A list of presence events in their raw form.\n   */\n  getUserPresenceEvents() {\n    return utils.promiseTry(() => {\n      const txn = this.db.transaction([\"users\"], \"readonly\");\n      const store = txn.objectStore(\"users\");\n      return selectQuery(store, undefined, cursor => {\n        return [cursor.value.userId, cursor.value.event];\n      });\n    });\n  }\n\n  /**\n   * Load all the account data events from the database. This is not cached.\n   * @returns A list of raw global account events.\n   */\n  loadAccountData() {\n    _logger.logger.log(`LocalIndexedDBStoreBackend: loading account data...`);\n    return utils.promiseTry(() => {\n      const txn = this.db.transaction([\"accountData\"], \"readonly\");\n      const store = txn.objectStore(\"accountData\");\n      return selectQuery(store, undefined, cursor => {\n        return cursor.value;\n      }).then(result => {\n        _logger.logger.log(`LocalIndexedDBStoreBackend: loaded account data`);\n        return result;\n      });\n    });\n  }\n\n  /**\n   * Load the sync data from the database.\n   * @returns An object with \"roomsData\" and \"nextBatch\" keys.\n   */\n  loadSyncData() {\n    _logger.logger.log(`LocalIndexedDBStoreBackend: loading sync data...`);\n    return utils.promiseTry(() => {\n      const txn = this.db.transaction([\"sync\"], \"readonly\");\n      const store = txn.objectStore(\"sync\");\n      return selectQuery(store, undefined, cursor => {\n        return cursor.value;\n      }).then(results => {\n        _logger.logger.log(`LocalIndexedDBStoreBackend: loaded sync data`);\n        if (results.length > 1) {\n          _logger.logger.warn(\"loadSyncData: More than 1 sync row found.\");\n        }\n        return results.length > 0 ? results[0] : {};\n      });\n    });\n  }\n  getClientOptions() {\n    return Promise.resolve().then(() => {\n      const txn = this.db.transaction([\"client_options\"], \"readonly\");\n      const store = txn.objectStore(\"client_options\");\n      return selectQuery(store, undefined, cursor => {\n        var _cursor$value;\n        return (_cursor$value = cursor.value) === null || _cursor$value === void 0 ? void 0 : _cursor$value.options;\n      }).then(results => results[0]);\n    });\n  }\n  async storeClientOptions(options) {\n    const txn = this.db.transaction([\"client_options\"], \"readwrite\");\n    const store = txn.objectStore(\"client_options\");\n    store.put({\n      clobber: \"-\",\n      // constant key so will always clobber\n      options: options\n    }); // put == UPSERT\n    await txnAsPromise(txn);\n  }\n  async saveToDeviceBatches(batches) {\n    const txn = this.db.transaction([\"to_device_queue\"], \"readwrite\");\n    const store = txn.objectStore(\"to_device_queue\");\n    for (const batch of batches) {\n      store.add(batch);\n    }\n    await txnAsPromise(txn);\n  }\n  async getOldestToDeviceBatch() {\n    const txn = this.db.transaction([\"to_device_queue\"], \"readonly\");\n    const store = txn.objectStore(\"to_device_queue\");\n    const cursor = await reqAsCursorPromise(store.openCursor());\n    if (!cursor) return null;\n    const resultBatch = cursor.value;\n    return {\n      id: cursor.key,\n      txnId: resultBatch.txnId,\n      eventType: resultBatch.eventType,\n      batch: resultBatch.batch\n    };\n  }\n  async removeToDeviceBatch(id) {\n    const txn = this.db.transaction([\"to_device_queue\"], \"readwrite\");\n    const store = txn.objectStore(\"to_device_queue\");\n    store.delete(id);\n    await txnAsPromise(txn);\n  }\n}\nexports.LocalIndexedDBStoreBackend = LocalIndexedDBStoreBackend;\n//# sourceMappingURL=indexeddb-local-backend.js.map","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.IndexedDBStoreWorker = void 0;\nvar _defineProperty2 = _interopRequireDefault(require(\"@babel/runtime/helpers/defineProperty\"));\nvar _indexeddbLocalBackend = require(\"./indexeddb-local-backend\");\nvar _logger = require(\"../logger\");\n/*\nCopyright 2017 - 2021 The Matrix.org Foundation C.I.C.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\n\n/**\n * This class lives in the webworker and drives a LocalIndexedDBStoreBackend\n * controlled by messages from the main process.\n *\n * @example\n * It should be instantiated by a web worker script provided by the application\n * in a script, for example:\n * ```\n * import {IndexedDBStoreWorker} from 'matrix-js-sdk/lib/indexeddb-worker.js';\n * const remoteWorker = new IndexedDBStoreWorker(postMessage);\n * onmessage = remoteWorker.onMessage;\n * ```\n *\n * Note that it is advisable to import this class by referencing the file directly to\n * avoid a dependency on the whole js-sdk.\n *\n */\nclass IndexedDBStoreWorker {\n  /**\n   * @param postMessage - The web worker postMessage function that\n   * should be used to communicate back to the main script.\n   */\n  constructor(postMessage) {\n    this.postMessage = postMessage;\n    (0, _defineProperty2.default)(this, \"backend\", void 0);\n    (0, _defineProperty2.default)(this, \"onMessage\", ev => {\n      var _this$backend, _this$backend2, _this$backend3, _this$backend4, _this$backend5, _this$backend6, _this$backend7, _this$backend8, _this$backend9, _this$backend10, _this$backend11, _this$backend12, _this$backend13, _this$backend14, _this$backend15, _this$backend16;\n      const msg = ev.data;\n      let prom;\n      switch (msg.command) {\n        case \"setupWorker\":\n          // this is the 'indexedDB' global (where global != window\n          // because it's a web worker and there is no window).\n          this.backend = new _indexeddbLocalBackend.LocalIndexedDBStoreBackend(indexedDB, msg.args[0]);\n          prom = Promise.resolve();\n          break;\n        case \"connect\":\n          prom = (_this$backend = this.backend) === null || _this$backend === void 0 ? void 0 : _this$backend.connect();\n          break;\n        case \"isNewlyCreated\":\n          prom = (_this$backend2 = this.backend) === null || _this$backend2 === void 0 ? void 0 : _this$backend2.isNewlyCreated();\n          break;\n        case \"clearDatabase\":\n          prom = (_this$backend3 = this.backend) === null || _this$backend3 === void 0 ? void 0 : _this$backend3.clearDatabase();\n          break;\n        case \"getSavedSync\":\n          prom = (_this$backend4 = this.backend) === null || _this$backend4 === void 0 ? void 0 : _this$backend4.getSavedSync(false);\n          break;\n        case \"setSyncData\":\n          prom = (_this$backend5 = this.backend) === null || _this$backend5 === void 0 ? void 0 : _this$backend5.setSyncData(msg.args[0]);\n          break;\n        case \"syncToDatabase\":\n          prom = (_this$backend6 = this.backend) === null || _this$backend6 === void 0 ? void 0 : _this$backend6.syncToDatabase(msg.args[0]);\n          break;\n        case \"getUserPresenceEvents\":\n          prom = (_this$backend7 = this.backend) === null || _this$backend7 === void 0 ? void 0 : _this$backend7.getUserPresenceEvents();\n          break;\n        case \"getNextBatchToken\":\n          prom = (_this$backend8 = this.backend) === null || _this$backend8 === void 0 ? void 0 : _this$backend8.getNextBatchToken();\n          break;\n        case \"getOutOfBandMembers\":\n          prom = (_this$backend9 = this.backend) === null || _this$backend9 === void 0 ? void 0 : _this$backend9.getOutOfBandMembers(msg.args[0]);\n          break;\n        case \"clearOutOfBandMembers\":\n          prom = (_this$backend10 = this.backend) === null || _this$backend10 === void 0 ? void 0 : _this$backend10.clearOutOfBandMembers(msg.args[0]);\n          break;\n        case \"setOutOfBandMembers\":\n          prom = (_this$backend11 = this.backend) === null || _this$backend11 === void 0 ? void 0 : _this$backend11.setOutOfBandMembers(msg.args[0], msg.args[1]);\n          break;\n        case \"getClientOptions\":\n          prom = (_this$backend12 = this.backend) === null || _this$backend12 === void 0 ? void 0 : _this$backend12.getClientOptions();\n          break;\n        case \"storeClientOptions\":\n          prom = (_this$backend13 = this.backend) === null || _this$backend13 === void 0 ? void 0 : _this$backend13.storeClientOptions(msg.args[0]);\n          break;\n        case \"saveToDeviceBatches\":\n          prom = (_this$backend14 = this.backend) === null || _this$backend14 === void 0 ? void 0 : _this$backend14.saveToDeviceBatches(msg.args[0]);\n          break;\n        case \"getOldestToDeviceBatch\":\n          prom = (_this$backend15 = this.backend) === null || _this$backend15 === void 0 ? void 0 : _this$backend15.getOldestToDeviceBatch();\n          break;\n        case \"removeToDeviceBatch\":\n          prom = (_this$backend16 = this.backend) === null || _this$backend16 === void 0 ? void 0 : _this$backend16.removeToDeviceBatch(msg.args[0]);\n          break;\n      }\n      if (prom === undefined) {\n        this.postMessage({\n          command: \"cmd_fail\",\n          seq: msg.seq,\n          // Can't be an Error because they're not structured cloneable\n          error: \"Unrecognised command\"\n        });\n        return;\n      }\n      prom.then(ret => {\n        this.postMessage.call(null, {\n          command: \"cmd_success\",\n          seq: msg.seq,\n          result: ret\n        });\n      }, err => {\n        _logger.logger.error(\"Error running command: \" + msg.command, err);\n        this.postMessage.call(null, {\n          command: \"cmd_fail\",\n          seq: msg.seq,\n          // Just send a string because Error objects aren't cloneable\n          error: {\n            message: err.message,\n            name: err.name\n          }\n        });\n      });\n    });\n  }\n\n  /**\n   * Passes a message event from the main script into the class. This method\n   * can be directly assigned to the web worker `onmessage` variable.\n   *\n   * @param ev - The message event\n   */\n}\nexports.IndexedDBStoreWorker = IndexedDBStoreWorker;\n//# sourceMappingURL=indexeddb-store-worker.js.map","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"IndexedDBStoreWorker\", {\n  enumerable: true,\n  get: function () {\n    return _indexeddbStoreWorker.IndexedDBStoreWorker;\n  }\n});\nvar _indexeddbStoreWorker = require(\"./store/indexeddb-store-worker\");\n//# sourceMappingURL=indexeddb-worker.js.map","/*\nCopyright 2017 Vector Creations Ltd\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n    http://www.apache.org/licenses/LICENSE-2.0\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n*/\nimport { IndexedDBStoreWorker } from \"matrix-js-sdk/lib/indexeddb-worker\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst ctx: Worker = self as any;\n\nconst remoteWorker = new IndexedDBStoreWorker(ctx.postMessage);\n\n// eslint-disable-next-line unicorn/prefer-add-event-listener\nctx.onmessage = remoteWorker.onMessage;"],"names":["_interopRequireDefault","obj","module","_typeof","_toPrimitive","input","hint","prim","res","_toPropertyKey","arg","key","toPrimitive","_defineProperty","value","toPropertyKey","root","definition","this","noop","undefinedType","isIE","logMethods","bindMethod","methodName","method","traceForIE","realMethod","replaceLoggingMethods","level","loggerName","i","enableLoggingWhenConsoleArrives","defaultMethodFactory","Logger","name","defaultLevel","factory","self","currentLevel","storageKey","persistLevelIfPossible","levelNum","levelName","getPersistedLevel","storedLevel","cookie","location","clearPersistedLevel","persist","initialLevel","defaultLogger","_loggersByName","logger","_log","require$$0","logger_1","_loglevel","require$$1","DEFAULT_NAMESPACE","logLevel","args","extendLogger","prefix","existingPrefix","getPrefixedLogger","prefixLogger","data","escapeRegexp","str","REPLACE_RE","replace_fn","match","unhomoglyph","unhomoglyph_1","RetryOperation","timeouts","options","retry_operation","err","currentTime","timeout","fn","timeoutOps","counts","mainError","mainErrorCount","error","message","count","exports","opts","a","b","attempt","random","methods","original","op","callback","retry","networkErrorMsgs","AbortError","decorateErrorWithCounts","attemptNumber","retriesLeft","isNetworkError","errorMessage","pRetry","resolve","reject","operation","pRetryModule","pRetry_1","NamespacedValue_1","_defineProperty2","NamespacedValue$1","stable","unstable","names","altName","val","arr","included","NamespacedValue","ServerControlledNamespacedValue","preferUnstable","UnstableValue","extensible_events","_NamespacedValue","TEXT_NODE_TYPE","LocationAssetType","M_ASSET","M_TIMESTAMP","M_LOCATION","read_receipts","ReceiptType","MAIN_ROOM_TIMELINE","utils","alphabetPad","averageBetweenStrings","baseToString","checkObjectHasKeys","chunkPromises","compare","decodeParams","deepCompare","deepCopy","deepSortedObjectEntries","defer","encodeParams","encodeUri","ensureNoTrailingSlash","escapeRegExp","globToRegexp","internaliseString","isFunction","isNullOrUndefined","isNumber","isSupportedReceiptType","lexicographicCompare","mapsEqual","nextString","normalize","prevString","promiseMapSeries","promiseTry","recursivelyAssign","removeDirectionOverrideChars","removeElement","removeHiddenChars","replaceParam","simpleRetryOperation","sleep","sortEventsByLatestContentTimestamp","stringToBase","_unhomoglyph","require$$2","_pRetry","require$$3","_location","require$$4","_read_receipts","require$$5","ownKeys","object","enumerableOnly","keys","symbols","sym","_objectSpread","target","source","interns","params","urlSearchParams","searchParams","v","dict","result","query","o","pathTemplate","variables","array","reverse","x","y","p","pairs","k","removeHiddenCharsRegex","string","glob","extended","replacements","_match","neg","pat","url","ms","promise","_resolve","_reject","promises","fns","chunkSize","results","promiseFn","DEFAULT_ALPHABET","s","n","alphabet","len","_alphabet","d","r","j","charIndex","padN","baseA","baseB","avg","collator","ignoreNullish","sourceKey","sourceValue","getContentTimestampWithFallback","event","_M_TIMESTAMP$findIn","left","right","receiptType","eq","v1","v2","EventType","RelationType","MsgType","RoomCreateTypeField","RoomType","ToDeviceMessageId","UNSTABLE_MSC3088_PURPOSE","UNSTABLE_MSC3088_ENABLED","UNSTABLE_MSC3089_TREE_SUBTYPE","UNSTABLE_MSC3089_LEAF","UNSTABLE_MSC3089_BRANCH","UNSTABLE_MSC2716_MARKER","UNSTABLE_ELEMENT_FUNCTIONAL_USERS","EVENT_VISIBILITY_CHANGE_TYPE","PUSHER_ENABLED","PUSHER_DEVICE_ID","LOCAL_NOTIFICATION_SETTINGS_PREFIX","sync","UNREAD_THREAD_NOTIFICATIONS","syncAccumulator","_logger","_utils","_event","_sync","require$$6","Category","isTaggedEvent","SyncAccumulator","syncResponse","fromDatabase","e","roomId","category","currentData","hasAdded","current","_ref","_data","_data$ephemeral","_data$ephemeral$event","_data$state","_data$state$events","_data$timeline","_data$timeline$events","HEROES_KEY","INVITED_COUNT_KEY","JOINED_COUNT_KEY","acc","sum","eventId","userId","receipt","_currentData$_threadR","setState","index","_data$timeline$prev_b","transformedEvent","age","startIndex","forDatabase","roomData","roomJson","evType","receiptEvent","receiptData","threadReceipts","msgData","rollBackState","timelineEvent","prevStateEvent","stateKey","ev","accData","eventMap","indexeddbHelpers","exists","indexedDB","dbName","req","indexeddbLocalBackend","_syncAccumulator","_interopRequireWildcard","IndexedDBHelpers","_getRequireWildcardCache","nodeInterop","cacheBabelInterop","cacheNodeInterop","cache","newObj","hasPropertyDescriptor","desc","DB_MIGRATIONS","db","VERSION","selectQuery","store","keyRange","resultMapper","cursor","txnAsPromise","txn","reqAsEventPromise","reqAsPromise","reqAsCursorPromise","LocalIndexedDBStoreBackend","oldVersion","migration","_this$db","accountData","syncData","roomIndex","range","request","membershipEvents","oobWritten","record","events","tx","markerObject","roomRange","minStateKeyProm","maxStateKeyProm","minStateKey","maxStateKey","writeStore","membersKeyRange","copy","userTuples","nextBatch","roomsData","tuples","tuple","_cursor$value","batches","batch","resultBatch","id","indexeddbStoreWorker","_indexeddbLocalBackend","IndexedDBStoreWorker","postMessage","_this$backend","_this$backend2","_this$backend3","_this$backend4","_this$backend5","_this$backend6","_this$backend7","_this$backend8","_this$backend9","_this$backend10","_this$backend11","_this$backend12","_this$backend13","_this$backend14","_this$backend15","_this$backend16","msg","prom","ret","_indexeddbStoreWorker","ctx","remoteWorker"],"mappings":"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"}