{"version":3,"file":"index.mjs","names":[],"sources":["../src/plugin/plugin.ts","../src/utils/uuid.utils.ts","../../../node_modules/events/events.js","../src/utils/emitter.utils.ts","../src/managers/app/app.manager.ts","../src/managers/app/app.manager.utils.ts","../src/managers/app/app.manager.events.ts","../src/managers/app/app.manager.constants.ts","../src/managers/request/request.manager.ts","../src/managers/request/request.manager.utils.ts","../src/managers/request/request.manager.events.ts","../src/managers/logger/logger.manager.ts","../src/managers/logger/logger.manager.utils.ts","../src/managers/logger/logger.manager.constants.ts","../src/adapter/adapter.utils.ts","../src/request/request.hooks.ts","../src/constants/http.constants.ts","../src/request/request.utils.ts","../src/constants/time.constants.ts","../src/request/request.ts","../src/adapter/adapter.bindings.ts","../src/mocker/mocker.ts","../src/adapter/adapter.ts","../src/http-adapter/http-adapter.utils.ts","../src/http-adapter/http-adapter.constants.ts","../src/http-adapter/http-adapter.fetch.ts","../src/http-adapter/http-adapter.ts","../src/cache/cache.ts","../src/cache/cache.utils.ts","../src/cache/cache.events.ts","../src/dispatcher/dispatcher.constants.ts","../src/dispatcher/dispatcher.events.ts","../src/dispatcher/dispatcher.ts","../src/dispatcher/dispatcher.utils.ts","../src/client/client.utils.ts","../src/client/client.ts","../src/client/client.constants.ts","../src/client/client.create.ts","../src/sdk/sdk.ts"],"sourcesContent":["import type { PluginMethodParameters, PluginMethods, PluginOptionsType } from \"plugin\";\nimport type { ClientInstance } from \"client\";\n\nexport class Plugin<Client extends ClientInstance = ClientInstance, PluginData = void> {\n  public name: string;\n  public data: PluginData;\n\n  public client: Client | undefined = undefined;\n\n  private pluginMethods: Partial<PluginMethods<Client>> = {};\n\n  constructor(public config: PluginOptionsType<PluginData>) {\n    this.name = config.name;\n    if (config.data) {\n      this.data = config.data;\n    }\n  }\n\n  initialize = (client: Client) => {\n    this.client = client;\n    return this;\n  };\n\n  trigger = <Key extends keyof PluginMethods<Client>>(method: Key, data: PluginMethodParameters<Key, Client>) => {\n    const callback = this.pluginMethods[method];\n    if (callback) {\n      callback(data as any);\n    }\n  };\n\n  /* -------------------------------------------------------------------------------------------------\n   * Plugin lifecycle\n   * -----------------------------------------------------------------------------------------------*/\n\n  /**\n   * Callback that will be executed when plugin is mounted\n   */\n  onMount = (callback: PluginMethods<Client>[\"onMount\"]) => {\n    this.pluginMethods.onMount = callback;\n    return this;\n  };\n\n  /**\n   * Callback that will be executed when plugin is unmounted\n   */\n  onUnmount = (callback: PluginMethods<Client>[\"onUnmount\"]) => {\n    this.pluginMethods.onUnmount = callback;\n    return this;\n  };\n\n  /* -------------------------------------------------------------------------------------------------\n   * Request lifecycle\n   * -----------------------------------------------------------------------------------------------*/\n\n  /**\n   * Callback that will be executed when request is created\n   */\n  onRequestCreate = (callback: PluginMethods<Client>[\"onRequestCreate\"]) => {\n    this.pluginMethods.onRequestCreate = callback;\n    return this;\n  };\n  /**\n   * Callback that will be executed when request gets triggered\n   */\n  onRequestTrigger = (callback: PluginMethods<Client>[\"onRequestTrigger\"]) => {\n    this.pluginMethods.onRequestTrigger = callback;\n    return this;\n  };\n  /**\n   * Callback that will be executed when request starts\n   */\n  onRequestStart = (callback: PluginMethods<Client>[\"onRequestStart\"]) => {\n    this.pluginMethods.onRequestStart = callback;\n    return this;\n  };\n  /**\n   * Callback that will be executed when response is successful\n   */\n  onRequestSuccess = (callback: PluginMethods<Client>[\"onRequestSuccess\"]) => {\n    this.pluginMethods.onRequestSuccess = callback;\n    return this;\n  };\n  /**\n   * Callback that will be executed when response is failed\n   */\n  onRequestError = (callback: PluginMethods<Client>[\"onRequestError\"]) => {\n    this.pluginMethods.onRequestError = callback;\n    return this;\n  };\n  /**\n   * Callback that will be executed when response is finished\n   */\n  onRequestFinished = (callback: PluginMethods<Client>[\"onRequestFinished\"]) => {\n    this.pluginMethods.onRequestFinished = callback;\n    return this;\n  };\n\n  /* -------------------------------------------------------------------------------------------------\n   * Dispatcher lifecycle\n   * -----------------------------------------------------------------------------------------------*/\n\n  onDispatcherCleared = (callback: PluginMethods<Client>[\"onDispatcherCleared\"]) => {\n    this.pluginMethods.onDispatcherCleared = callback;\n    return this;\n  };\n\n  onDispatcherQueueDrained = (callback: PluginMethods<Client>[\"onDispatcherQueueDrained\"]) => {\n    this.pluginMethods.onDispatcherQueueDrained = callback;\n    return this;\n  };\n\n  onDispatcherQueueRunning = (callback: PluginMethods<Client>[\"onDispatcherQueueRunning\"]) => {\n    this.pluginMethods.onDispatcherQueueRunning = callback;\n    return this;\n  };\n\n  onDispatcherItemAdded = (callback: PluginMethods<Client>[\"onDispatcherItemAdded\"]) => {\n    this.pluginMethods.onDispatcherItemAdded = callback;\n    return this;\n  };\n\n  onDispatcherItemDeleted = (callback: PluginMethods<Client>[\"onDispatcherItemDeleted\"]) => {\n    this.pluginMethods.onDispatcherItemDeleted = callback;\n    return this;\n  };\n\n  onDispatcherQueueCreated = (callback: PluginMethods<Client>[\"onDispatcherQueueCreated\"]) => {\n    this.pluginMethods.onDispatcherQueueCreated = callback;\n    return this;\n  };\n\n  onDispatcherQueueCleared = (callback: PluginMethods<Client>[\"onDispatcherQueueCleared\"]) => {\n    this.pluginMethods.onDispatcherQueueCleared = callback;\n    return this;\n  };\n\n  /* -------------------------------------------------------------------------------------------------\n   * Cache lifecycle\n   * -----------------------------------------------------------------------------------------------*/\n\n  onCacheItemChange = (callback: PluginMethods<Client>[\"onCacheItemChange\"]) => {\n    this.pluginMethods.onCacheItemChange = callback;\n    return this;\n  };\n\n  onCacheItemDelete = (callback: PluginMethods<Client>[\"onCacheItemDelete\"]) => {\n    this.pluginMethods.onCacheItemDelete = callback;\n    return this;\n  };\n\n  /* -------------------------------------------------------------------------------------------------\n   * Adapter lifecycle\n   * -----------------------------------------------------------------------------------------------*/\n\n  onAdapterFetch = (callback: PluginMethods<Client>[\"onAdapterFetch\"]) => {\n    this.pluginMethods.onAdapterFetch = callback;\n    return this;\n  };\n}\n","import type { RequestInstance } from \"request\";\n\nexport const getUniqueRequestId = (request: Pick<RequestInstance, \"queryKey\">) => {\n  return `${request.queryKey}_${Date.now().toString(36)}_${Math.random().toString(36).substring(2)}`;\n};\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n  ? R.apply\n  : function ReflectApply(target, receiver, args) {\n    return Function.prototype.apply.call(target, receiver, args);\n  }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n  ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n  ReflectOwnKeys = function ReflectOwnKeys(target) {\n    return Object.getOwnPropertyNames(target)\n      .concat(Object.getOwnPropertySymbols(target));\n  };\n} else {\n  ReflectOwnKeys = function ReflectOwnKeys(target) {\n    return Object.getOwnPropertyNames(target);\n  };\n}\n\nfunction ProcessEmitWarning(warning) {\n  if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n  return value !== value;\n}\n\nfunction EventEmitter() {\n  EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n  if (typeof listener !== 'function') {\n    throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n  }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n  enumerable: true,\n  get: function() {\n    return defaultMaxListeners;\n  },\n  set: function(arg) {\n    if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n      throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n    }\n    defaultMaxListeners = arg;\n  }\n});\n\nEventEmitter.init = function() {\n\n  if (this._events === undefined ||\n      this._events === Object.getPrototypeOf(this)._events) {\n    this._events = Object.create(null);\n    this._eventsCount = 0;\n  }\n\n  this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n  if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n    throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n  }\n  this._maxListeners = n;\n  return this;\n};\n\nfunction _getMaxListeners(that) {\n  if (that._maxListeners === undefined)\n    return EventEmitter.defaultMaxListeners;\n  return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n  return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n  var args = [];\n  for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n  var doError = (type === 'error');\n\n  var events = this._events;\n  if (events !== undefined)\n    doError = (doError && events.error === undefined);\n  else if (!doError)\n    return false;\n\n  // If there is no 'error' event listener then throw.\n  if (doError) {\n    var er;\n    if (args.length > 0)\n      er = args[0];\n    if (er instanceof Error) {\n      // Note: The comments on the `throw` lines are intentional, they show\n      // up in Node's output if this results in an unhandled exception.\n      throw er; // Unhandled 'error' event\n    }\n    // At least give some kind of context to the user\n    var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n    err.context = er;\n    throw err; // Unhandled 'error' event\n  }\n\n  var handler = events[type];\n\n  if (handler === undefined)\n    return false;\n\n  if (typeof handler === 'function') {\n    ReflectApply(handler, this, args);\n  } else {\n    var len = handler.length;\n    var listeners = arrayClone(handler, len);\n    for (var i = 0; i < len; ++i)\n      ReflectApply(listeners[i], this, args);\n  }\n\n  return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n  var m;\n  var events;\n  var existing;\n\n  checkListener(listener);\n\n  events = target._events;\n  if (events === undefined) {\n    events = target._events = Object.create(null);\n    target._eventsCount = 0;\n  } else {\n    // To avoid recursion in the case that type === \"newListener\"! Before\n    // adding it to the listeners, first emit \"newListener\".\n    if (events.newListener !== undefined) {\n      target.emit('newListener', type,\n                  listener.listener ? listener.listener : listener);\n\n      // Re-assign `events` because a newListener handler could have caused the\n      // this._events to be assigned to a new object\n      events = target._events;\n    }\n    existing = events[type];\n  }\n\n  if (existing === undefined) {\n    // Optimize the case of one listener. Don't need the extra array object.\n    existing = events[type] = listener;\n    ++target._eventsCount;\n  } else {\n    if (typeof existing === 'function') {\n      // Adding the second element, need to change to array.\n      existing = events[type] =\n        prepend ? [listener, existing] : [existing, listener];\n      // If we've already got an array, just append.\n    } else if (prepend) {\n      existing.unshift(listener);\n    } else {\n      existing.push(listener);\n    }\n\n    // Check for listener leak\n    m = _getMaxListeners(target);\n    if (m > 0 && existing.length > m && !existing.warned) {\n      existing.warned = true;\n      // No error code for this since it is a Warning\n      // eslint-disable-next-line no-restricted-syntax\n      var w = new Error('Possible EventEmitter memory leak detected. ' +\n                          existing.length + ' ' + String(type) + ' listeners ' +\n                          'added. Use emitter.setMaxListeners() to ' +\n                          'increase limit');\n      w.name = 'MaxListenersExceededWarning';\n      w.emitter = target;\n      w.type = type;\n      w.count = existing.length;\n      ProcessEmitWarning(w);\n    }\n  }\n\n  return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n  return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n    function prependListener(type, listener) {\n      return _addListener(this, type, listener, true);\n    };\n\nfunction onceWrapper() {\n  if (!this.fired) {\n    this.target.removeListener(this.type, this.wrapFn);\n    this.fired = true;\n    if (arguments.length === 0)\n      return this.listener.call(this.target);\n    return this.listener.apply(this.target, arguments);\n  }\n}\n\nfunction _onceWrap(target, type, listener) {\n  var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n  var wrapped = onceWrapper.bind(state);\n  wrapped.listener = listener;\n  state.wrapFn = wrapped;\n  return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n  checkListener(listener);\n  this.on(type, _onceWrap(this, type, listener));\n  return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n    function prependOnceListener(type, listener) {\n      checkListener(listener);\n      this.prependListener(type, _onceWrap(this, type, listener));\n      return this;\n    };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n    function removeListener(type, listener) {\n      var list, events, position, i, originalListener;\n\n      checkListener(listener);\n\n      events = this._events;\n      if (events === undefined)\n        return this;\n\n      list = events[type];\n      if (list === undefined)\n        return this;\n\n      if (list === listener || list.listener === listener) {\n        if (--this._eventsCount === 0)\n          this._events = Object.create(null);\n        else {\n          delete events[type];\n          if (events.removeListener)\n            this.emit('removeListener', type, list.listener || listener);\n        }\n      } else if (typeof list !== 'function') {\n        position = -1;\n\n        for (i = list.length - 1; i >= 0; i--) {\n          if (list[i] === listener || list[i].listener === listener) {\n            originalListener = list[i].listener;\n            position = i;\n            break;\n          }\n        }\n\n        if (position < 0)\n          return this;\n\n        if (position === 0)\n          list.shift();\n        else {\n          spliceOne(list, position);\n        }\n\n        if (list.length === 1)\n          events[type] = list[0];\n\n        if (events.removeListener !== undefined)\n          this.emit('removeListener', type, originalListener || listener);\n      }\n\n      return this;\n    };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n    function removeAllListeners(type) {\n      var listeners, events, i;\n\n      events = this._events;\n      if (events === undefined)\n        return this;\n\n      // not listening for removeListener, no need to emit\n      if (events.removeListener === undefined) {\n        if (arguments.length === 0) {\n          this._events = Object.create(null);\n          this._eventsCount = 0;\n        } else if (events[type] !== undefined) {\n          if (--this._eventsCount === 0)\n            this._events = Object.create(null);\n          else\n            delete events[type];\n        }\n        return this;\n      }\n\n      // emit removeListener for all listeners on all events\n      if (arguments.length === 0) {\n        var keys = Object.keys(events);\n        var key;\n        for (i = 0; i < keys.length; ++i) {\n          key = keys[i];\n          if (key === 'removeListener') continue;\n          this.removeAllListeners(key);\n        }\n        this.removeAllListeners('removeListener');\n        this._events = Object.create(null);\n        this._eventsCount = 0;\n        return this;\n      }\n\n      listeners = events[type];\n\n      if (typeof listeners === 'function') {\n        this.removeListener(type, listeners);\n      } else if (listeners !== undefined) {\n        // LIFO order\n        for (i = listeners.length - 1; i >= 0; i--) {\n          this.removeListener(type, listeners[i]);\n        }\n      }\n\n      return this;\n    };\n\nfunction _listeners(target, type, unwrap) {\n  var events = target._events;\n\n  if (events === undefined)\n    return [];\n\n  var evlistener = events[type];\n  if (evlistener === undefined)\n    return [];\n\n  if (typeof evlistener === 'function')\n    return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n  return unwrap ?\n    unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n  return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n  return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n  if (typeof emitter.listenerCount === 'function') {\n    return emitter.listenerCount(type);\n  } else {\n    return listenerCount.call(emitter, type);\n  }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n  var events = this._events;\n\n  if (events !== undefined) {\n    var evlistener = events[type];\n\n    if (typeof evlistener === 'function') {\n      return 1;\n    } else if (evlistener !== undefined) {\n      return evlistener.length;\n    }\n  }\n\n  return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n  return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n  var copy = new Array(n);\n  for (var i = 0; i < n; ++i)\n    copy[i] = arr[i];\n  return copy;\n}\n\nfunction spliceOne(list, index) {\n  for (; index + 1 < list.length; index++)\n    list[index] = list[index + 1];\n  list.pop();\n}\n\nfunction unwrapListeners(arr) {\n  var ret = new Array(arr.length);\n  for (var i = 0; i < ret.length; ++i) {\n    ret[i] = arr[i].listener || arr[i];\n  }\n  return ret;\n}\n\nfunction once(emitter, name) {\n  return new Promise(function (resolve, reject) {\n    function errorListener(err) {\n      emitter.removeListener(name, resolver);\n      reject(err);\n    }\n\n    function resolver() {\n      if (typeof emitter.removeListener === 'function') {\n        emitter.removeListener('error', errorListener);\n      }\n      resolve([].slice.call(arguments));\n    };\n\n    eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n    if (name !== 'error') {\n      addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n    }\n  });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n  if (typeof emitter.on === 'function') {\n    eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n  }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n  if (typeof emitter.on === 'function') {\n    if (flags.once) {\n      emitter.once(name, listener);\n    } else {\n      emitter.on(name, listener);\n    }\n  } else if (typeof emitter.addEventListener === 'function') {\n    // EventTarget does not have `error` event semantics like Node\n    // EventEmitters, we do not listen for `error` events here.\n    emitter.addEventListener(name, function wrapListener(arg) {\n      // IE does not have builtin `{ once: true }` support so we\n      // have to do it manually.\n      if (flags.once) {\n        emitter.removeEventListener(name, wrapListener);\n      }\n      listener(arg);\n    });\n  } else {\n    throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n  }\n}\n","import Emitter from \"events\";\n\nconst getListenName = (event: string | symbol) => `listen_${String(event)}`;\n\nexport class EventEmitter extends Emitter {\n  emitCallbacks: Array<(event: string, data: any, isTriggeredExternally?: true) => void> = [];\n\n  // eslint-disable-next-line @typescript-eslint/no-useless-constructor\n  constructor(options?: ConstructorParameters<typeof Emitter>[0]) {\n    super(options);\n  }\n\n  emit(type: string, data: any, isTriggeredExternally: boolean) {\n    const params: [string, any, true?] = [type, data];\n\n    if (isTriggeredExternally) {\n      params.push(isTriggeredExternally);\n    }\n\n    this.emitCallbacks?.forEach((callback) => callback(...params));\n    return super.emit(...params);\n  }\n\n  onEmit = (callback: (event: string, data: any, isTriggeredExternally?: true) => void) => {\n    this.emitCallbacks?.push(callback);\n    return () => {\n      this.emitCallbacks = this.emitCallbacks?.filter((cb) => cb !== callback);\n    };\n  };\n\n  onListener = (event: string, listener: (count: number) => void) => {\n    super.on(getListenName(event), listener);\n    return () => {\n      super.off(getListenName(event), listener);\n    };\n  };\n\n  on = (event: string | symbol, listener: (...args: any[]) => void) => {\n    super.on(event, listener);\n    super.emit(getListenName(event), super.listeners(event).length);\n    return this;\n  };\n\n  off = (event: string | symbol, listener: (...args: any[]) => void) => {\n    super.off(event, listener);\n    super.emit(getListenName(event), super.listeners(event).length);\n    return this;\n  };\n\n  addListener = this.on;\n  removeListener = this.off;\n}\n","import { EventEmitter } from \"utils\";\nimport type { AppManagerOptionsType } from \"managers\";\nimport { appManagerInitialOptions, getAppManagerEvents, hasDocument } from \"managers\";\n\n/**\n * App manager handles main application states - focus and online. Those two values can answer questions:\n * - Is the tab or current view instance focused and visible for user?\n * - Is our application online or offline?\n * With the app manager it is not a problem to get the valid answer for this question.\n *\n * @caution\n * Make sure to apply valid focus/online handlers for different environments like for example for native mobile applications.\n */\nexport class AppManager {\n  emitter = new EventEmitter();\n  events = getAppManagerEvents(this.emitter);\n\n  isBrowser: boolean;\n  isOnline: boolean;\n  isFocused: boolean;\n\n  constructor(public options?: AppManagerOptionsType) {\n    this.emitter?.setMaxListeners(1000);\n    const {\n      initiallyFocused = appManagerInitialOptions.initiallyFocused,\n      initiallyOnline = appManagerInitialOptions.initiallyOnline,\n    } = this.options || appManagerInitialOptions;\n\n    this.setInitialFocus(initiallyFocused);\n    this.setInitialOnline(initiallyOnline);\n\n    this.isBrowser = hasDocument();\n  }\n\n  initialize = () => {\n    const { focusEvent = appManagerInitialOptions.focusEvent, onlineEvent = appManagerInitialOptions.onlineEvent } =\n      this.options || appManagerInitialOptions;\n\n    focusEvent(this.setFocused);\n    onlineEvent(this.setOnline);\n  };\n\n  private setInitialFocus = async (initValue: Exclude<AppManagerOptionsType[\"initiallyFocused\"], undefined>) => {\n    if (typeof initValue === \"function\") {\n      this.isFocused = false;\n      this.isFocused = await initValue();\n    } else {\n      this.isFocused = initValue;\n    }\n  };\n\n  private setInitialOnline = async (initValue: Exclude<AppManagerOptionsType[\"initiallyOnline\"], undefined>) => {\n    if (typeof initValue === \"function\") {\n      this.isOnline = false;\n      this.isOnline = await initValue();\n    } else {\n      this.isOnline = initValue;\n    }\n  };\n\n  setFocused = (isFocused: boolean) => {\n    this.isFocused = isFocused;\n\n    if (isFocused) {\n      this.events.emitFocus();\n    } else {\n      this.events.emitBlur();\n    }\n  };\n\n  setOnline = (isOnline: boolean) => {\n    this.isOnline = isOnline;\n\n    if (isOnline) {\n      this.events.emitOnline();\n    } else {\n      this.events.emitOffline();\n    }\n  };\n}\n","export const hasWindow = () => {\n  try {\n    return Boolean(window && window.addEventListener);\n  } catch (err) {\n    /* istanbul ignore next */\n    return false;\n  }\n};\n\nexport const hasDocument = () => {\n  try {\n    return Boolean(hasWindow() && window.document && window.document.addEventListener);\n  } catch (err) {\n    /* istanbul ignore next */\n    return false;\n  }\n};\n\nexport const onWindowEvent = <K extends keyof WindowEventMap>(\n  key: K,\n  listener: (this: Window, ev: WindowEventMap[K]) => any,\n  options?: boolean | AddEventListenerOptions | undefined,\n): VoidFunction => {\n  /* istanbul ignore next */\n  if (hasWindow()) {\n    window.addEventListener(key, listener, options);\n    return () => window.removeEventListener(key, listener, options);\n  }\n  /* istanbul ignore next */\n  return () => null;\n};\n\nexport const onDocumentEvent = <K extends keyof DocumentEventMap>(\n  key: K,\n  listener: (this: Document, ev: DocumentEventMap[K]) => any,\n  options?: boolean | AddEventListenerOptions | undefined,\n): VoidFunction => {\n  /* istanbul ignore next */\n  if (hasDocument()) {\n    window.document.addEventListener(key, listener, options);\n    return () => window.document.removeEventListener(key, listener, options);\n  }\n  /* istanbul ignore next */\n  return () => null;\n};\n","import type EventEmitter from \"events\";\n\nimport { AppEvents } from \"managers\";\n\nexport const getAppManagerEvents = (emitter: EventEmitter) => ({\n  emitFocus: (): void => {\n    emitter.emit(AppEvents.FOCUS);\n  },\n  emitBlur: (): void => {\n    emitter.emit(AppEvents.BLUR);\n  },\n  emitOnline: (): void => {\n    emitter.emit(AppEvents.ONLINE);\n  },\n  emitOffline: (): void => {\n    emitter.emit(AppEvents.OFFLINE);\n  },\n  onFocus: (callback: () => void): VoidFunction => {\n    emitter.on(AppEvents.FOCUS, callback);\n    return () => emitter.removeListener(AppEvents.FOCUS, callback);\n  },\n  onBlur: (callback: () => void): VoidFunction => {\n    emitter.on(AppEvents.BLUR, callback);\n    return () => emitter.removeListener(AppEvents.BLUR, callback);\n  },\n  onOnline: (callback: () => void): VoidFunction => {\n    emitter.on(AppEvents.ONLINE, callback);\n    return () => emitter.removeListener(AppEvents.ONLINE, callback);\n  },\n  onOffline: (callback: () => void): VoidFunction => {\n    emitter.on(AppEvents.OFFLINE, callback);\n    return () => emitter.removeListener(AppEvents.OFFLINE, callback);\n  },\n});\n","import type { RequiredKeys } from \"types\";\nimport type { AppManagerOptionsType } from \"managers\";\nimport { onWindowEvent, onDocumentEvent } from \"./app.manager.utils\";\n\nexport enum AppEvents {\n  FOCUS = \"focus\",\n  BLUR = \"blur\",\n  ONLINE = \"online\",\n  OFFLINE = \"offline\",\n}\n\nexport const appManagerInitialOptions: RequiredKeys<AppManagerOptionsType> = {\n  initiallyFocused: true,\n  initiallyOnline: true,\n  focusEvent: (setFocused) => {\n    onDocumentEvent(\"visibilitychange\", () => setFocused(true));\n    onWindowEvent(\"focus\", () => setFocused(true));\n    onWindowEvent(\"blur\", () => setFocused(false));\n  },\n  onlineEvent: (setOnline) => {\n    onWindowEvent(\"online\", () => setOnline(true));\n    onWindowEvent(\"offline\", () => setOnline(false));\n  },\n};\n","import { EventEmitter } from \"utils\";\nimport { getRequestManagerEvents } from \"managers\";\n\n/**\n * **Request Manager** is used to emit `request lifecycle events` like - request start, request end, upload and download progress.\n * It is also the place of `request aborting` system, here we store all the keys and controllers that are isolated for each client instance.\n */\nexport class RequestManager {\n  emitter = new EventEmitter();\n  events = getRequestManagerEvents(this.emitter);\n\n  constructor() {\n    this.emitter?.setMaxListeners(1000);\n  }\n\n  abortControllers = new Map<string, Map<string, AbortController>>();\n\n  addAbortController = (abortKey: string, requestId: string) => {\n    let abortGroup = this.abortControllers.get(abortKey);\n    if (!abortGroup) {\n      const newAbortGroup = new Map();\n      abortGroup = newAbortGroup;\n      this.abortControllers.set(abortKey, newAbortGroup);\n    }\n\n    const abortController = abortGroup.get(requestId);\n    if (!abortController || abortController.signal.aborted) {\n      abortGroup.set(requestId, new AbortController());\n    }\n  };\n\n  getAbortController = (abortKey: string, requestId: string) => {\n    return this.abortControllers.get(abortKey)?.get(requestId);\n  };\n\n  removeAbortController = (abortKey: string, requestId: string) => {\n    this.abortControllers.get(abortKey)?.delete(requestId);\n  };\n\n  // Aborting\n\n  useAbortController = (abortKey: string, requestId: string) => {\n    const controller = this.abortControllers.get(abortKey)?.get(requestId);\n    controller?.abort();\n  };\n\n  abortByKey = (abortKey: string) => {\n    const controllers = this.abortControllers.get(abortKey);\n\n    if (controllers) {\n      const entries = Array.from(controllers.entries());\n      entries.forEach(([key]) => {\n        this.useAbortController(abortKey, key);\n      });\n    }\n  };\n\n  abortByRequestId = (abortKey: string, requestId: string) => {\n    this.useAbortController(abortKey, requestId);\n  };\n\n  abortAll = () => {\n    const entries = Array.from(this.abortControllers.entries());\n    entries.forEach(([abortKey, value]) => {\n      const controllers = Array.from(value.entries());\n      controllers.forEach(([requestId]) => {\n        this.useAbortController(abortKey, requestId);\n      });\n    });\n  };\n}\n","// Events\n\nexport const getLoadingKey = (): string => `loading-event-any`;\nexport const getLoadingByQueryKey = (queryKey: string): string => `${queryKey}-loading-event`;\nexport const getLoadingByCacheKey = (cacheKey: string): string => `${cacheKey}-loading-cache-event`;\nexport const getLoadingByIdKey = (id: string): string => `${id}-loading-event-by-id`;\nexport const getRemoveKey = (): string => `remove-event-any`;\nexport const getRemoveByQueryKey = (queryKey: string): string => `${queryKey}-remove-event`;\nexport const getRemoveByIdKey = (id: string): string => `${id}-remove-event-by-id`;\nexport const getAbortKey = () => `request-abort-any`;\nexport const getAbortByAbortKey = (abortKey: string) => `${abortKey}-request-abort`;\nexport const getAbortByIdKey = (id: string) => `${id}-request-abort-by-id`;\nexport const getResponseKey = () => `response-any`;\nexport const getResponseByCacheKey = (cacheKey: string) => `${cacheKey}-response`;\nexport const getResponseByIdKey = (id: string) => `${id}-response-by-id`;\nexport const getRequestStartKey = () => `request-start-any`;\nexport const getRequestStarByQueryKey = (queryKey: string) => `${queryKey}-request-start`;\nexport const getRequestStartByIdKey = (id: string) => `${id}-request-start-by-id`;\nexport const getResponseStartKey = () => `response-start-any`;\nexport const getResponseStartByQueryKey = (queryKey: string) => `${queryKey}-response-start`;\nexport const getResponseStartByIdKey = (id: string) => `${id}-response-start-by-id`;\nexport const getUploadProgressKey = () => `request-progress-any`;\nexport const getUploadProgressByQueryKey = (queryKey: string) => `${queryKey}-request-progress`;\nexport const getUploadProgressByIdKey = (id: string) => `${id}-request-progress-by-id`;\nexport const getDownloadProgressKey = () => `response-progress-any`;\nexport const getDownloadProgressByQueryKey = (queryKey: string) => `${queryKey}-response-progress`;\nexport const getDownloadProgressByIdKey = (id: string) => `${id}-response-progress-by-id`;\nexport const getRequestDeduplicatedKey = () => `request-deduplicated-any`;\nexport const getRequestDeduplicatedByQueryKey = (queryKey: string) => `${queryKey}-query-request-deduplicated`;\nexport const getRequestDeduplicatedByCacheKey = (cacheKey: string) => `${cacheKey}-cache-request-deduplicated`;\nexport const getRequestDeduplicatedByIdKey = (id: string) => `${id}-request-deduplicated-by-id`;\n","/* eslint-disable max-params */\nimport type EventEmitter from \"events\";\n\nimport type {\n  RequestEventType,\n  RequestLoadingEventType,\n  RequestProgressEventType,\n  RequestResponseEventType,\n  RequestRemovedEventType,\n  RequestDeduplicatedEventType,\n} from \"managers\";\nimport {\n  getRequestStarByQueryKey,\n  getResponseStartByQueryKey,\n  getDownloadProgressByQueryKey,\n  getUploadProgressByQueryKey,\n  getResponseByIdKey,\n  getAbortByAbortKey,\n  getAbortByIdKey,\n  getResponseByCacheKey,\n  getUploadProgressByIdKey,\n  getDownloadProgressByIdKey,\n  getResponseStartByIdKey,\n  getRequestStartByIdKey,\n  getLoadingByQueryKey,\n  getLoadingByIdKey,\n  getRemoveByQueryKey,\n  getRemoveByIdKey,\n  getLoadingKey,\n  getRequestStartKey,\n  getUploadProgressKey,\n  getDownloadProgressKey,\n  getResponseKey,\n  getAbortKey,\n  getRemoveKey,\n  getResponseStartKey,\n  getLoadingByCacheKey,\n  getRequestDeduplicatedKey,\n  getRequestDeduplicatedByIdKey,\n  getRequestDeduplicatedByCacheKey,\n  getRequestDeduplicatedByQueryKey,\n} from \"managers\";\nimport type { AdapterInstance } from \"adapter\";\nimport type { RequestInstance } from \"request\";\nimport type { Client } from \"client\";\nimport type { ExtendRequest } from \"types\";\n\nexport const getRequestManagerEvents = (emitter: EventEmitter) => ({\n  /**\n   * Emiter\n   */\n\n  // Deduplicated\n  emitDeduplicated: (data: RequestDeduplicatedEventType<RequestInstance>, isTriggeredExternally = false): void => {\n    emitter.emit(getRequestDeduplicatedKey(), data, isTriggeredExternally);\n    emitter.emit(getRequestDeduplicatedByIdKey(data.requestId), data, isTriggeredExternally);\n    emitter.emit(getRequestDeduplicatedByCacheKey(data.request.cacheKey), data, isTriggeredExternally);\n    emitter.emit(getRequestDeduplicatedByQueryKey(data.request.queryKey), data, isTriggeredExternally);\n  },\n\n  // Loading\n  emitLoading: (data: RequestLoadingEventType<RequestInstance>, isTriggeredExternally = false): void => {\n    emitter.emit(getLoadingKey(), data, isTriggeredExternally);\n    emitter.emit(getLoadingByIdKey(data.requestId), data, isTriggeredExternally);\n    emitter.emit(getLoadingByCacheKey(data.request.cacheKey), data, isTriggeredExternally);\n    emitter.emit(getLoadingByQueryKey(data.request.queryKey), data, isTriggeredExternally);\n  },\n\n  // Start\n  emitRequestStart: (data: RequestEventType<RequestInstance>, isTriggeredExternally = false): void => {\n    emitter.emit(getRequestStartKey(), data, isTriggeredExternally);\n    emitter.emit(getRequestStartByIdKey(data.requestId), data, isTriggeredExternally);\n    emitter.emit(getRequestStarByQueryKey(data.request.queryKey), data, isTriggeredExternally);\n  },\n  emitResponseStart: (data: RequestEventType<RequestInstance>, isTriggeredExternally = false): void => {\n    emitter.emit(getResponseStartKey(), data, isTriggeredExternally);\n    emitter.emit(getResponseStartByIdKey(data.requestId), data, isTriggeredExternally);\n    emitter.emit(getResponseStartByQueryKey(data.request.queryKey), data, isTriggeredExternally);\n  },\n\n  // Progress\n  emitUploadProgress: (data: RequestProgressEventType<RequestInstance>, isTriggeredExternally = false): void => {\n    emitter.emit(getUploadProgressKey(), data, isTriggeredExternally);\n    emitter.emit(getUploadProgressByIdKey(data.requestId), data, isTriggeredExternally);\n    emitter.emit(getUploadProgressByQueryKey(data.request.queryKey), data, isTriggeredExternally);\n  },\n  emitDownloadProgress: (data: RequestProgressEventType<RequestInstance>, isTriggeredExternally = false): void => {\n    emitter.emit(getDownloadProgressKey(), data, isTriggeredExternally);\n    emitter.emit(getDownloadProgressByIdKey(data.requestId), data, isTriggeredExternally);\n    emitter.emit(getDownloadProgressByQueryKey(data.request.queryKey), data, isTriggeredExternally);\n  },\n\n  // Response\n  emitResponse: <Adapter extends AdapterInstance>(\n    data: RequestResponseEventType<ExtendRequest<RequestInstance, { client: Client<any, Adapter> }>>,\n    isTriggeredExternally = false,\n  ): void => {\n    emitter.emit(getResponseKey(), data, isTriggeredExternally);\n    emitter.emit(getResponseByIdKey(data.requestId), data, isTriggeredExternally);\n    emitter.emit(getResponseByCacheKey(data.request.cacheKey), data, isTriggeredExternally);\n  },\n\n  // Abort\n  emitAbort: (data: RequestEventType<RequestInstance>, isTriggeredExternally = false): void => {\n    emitter.emit(getAbortKey(), data, isTriggeredExternally);\n    emitter.emit(getAbortByIdKey(data.requestId), data, isTriggeredExternally);\n    emitter.emit(getAbortByAbortKey(data.request.abortKey), data, isTriggeredExternally);\n  },\n\n  // Remove\n  emitRemove: (data: RequestRemovedEventType<RequestInstance>, isTriggeredExternally = false): void => {\n    emitter.emit(getRemoveKey(), data, isTriggeredExternally);\n    emitter.emit(getRemoveByIdKey(data.requestId), data, isTriggeredExternally);\n    emitter.emit(getRemoveByQueryKey(data.request.queryKey), data, isTriggeredExternally);\n  },\n\n  /**\n   * Listeners\n   */\n\n  // Deduplicated\n  onDeduplicated: <T extends RequestInstance>(\n    callback: (data: RequestDeduplicatedEventType<T>) => void,\n  ): VoidFunction => {\n    emitter.on(getRequestDeduplicatedKey(), callback);\n    return () => emitter.removeListener(getRequestDeduplicatedKey(), callback);\n  },\n  onDeduplicatedByQueue: <T extends RequestInstance>(\n    queryKey: string,\n    callback: (data: RequestDeduplicatedEventType<T>) => void,\n  ): VoidFunction => {\n    emitter.on(getRequestDeduplicatedByQueryKey(queryKey), callback);\n    return () => emitter.removeListener(getRequestDeduplicatedByQueryKey(queryKey), callback);\n  },\n  onDeduplicatedByCache: <T extends RequestInstance>(\n    cacheKey: string,\n    callback: (data: RequestDeduplicatedEventType<T>) => void,\n  ): VoidFunction => {\n    emitter.on(getRequestDeduplicatedByCacheKey(cacheKey), callback);\n    return () => emitter.removeListener(getRequestDeduplicatedByCacheKey(cacheKey), callback);\n  },\n  onDeduplicatedById: <T extends RequestInstance>(\n    requestId: string,\n    callback: (data: RequestDeduplicatedEventType<T>) => void,\n  ): VoidFunction => {\n    emitter.on(getRequestDeduplicatedByIdKey(requestId), callback);\n    return () => emitter.removeListener(getRequestDeduplicatedByIdKey(requestId), callback);\n  },\n\n  // Loading\n  onLoading: <T extends RequestInstance>(callback: (data: RequestLoadingEventType<T>) => void): VoidFunction => {\n    emitter.on(getLoadingKey(), callback);\n    return () => emitter.removeListener(getLoadingKey(), callback);\n  },\n  onLoadingByQueue: <T extends RequestInstance>(\n    queryKey: string,\n    callback: (data: RequestLoadingEventType<T>) => void,\n  ): VoidFunction => {\n    emitter.on(getLoadingByQueryKey(queryKey), callback);\n    return () => emitter.removeListener(getLoadingByQueryKey(queryKey), callback);\n  },\n  onLoadingByCache: <T extends RequestInstance>(\n    cacheKey: string,\n    callback: (data: RequestLoadingEventType<T>) => void,\n  ): VoidFunction => {\n    emitter.on(getLoadingByCacheKey(cacheKey), callback);\n    return () => emitter.removeListener(getLoadingByCacheKey(cacheKey), callback);\n  },\n  onLoadingById: <T extends RequestInstance>(\n    requestId: string,\n    callback: (data: RequestLoadingEventType<T>) => void,\n  ): VoidFunction => {\n    emitter.on(getLoadingByIdKey(requestId), callback);\n    return () => emitter.removeListener(getLoadingByIdKey(requestId), callback);\n  },\n\n  // Request Start\n  onRequestStart: <T extends RequestInstance>(callback: (details: RequestEventType<T>) => void): VoidFunction => {\n    emitter.on(getRequestStartKey(), callback);\n    return () => emitter.removeListener(getRequestStartKey(), callback);\n  },\n  onRequestStartByQueue: <T extends RequestInstance>(\n    queryKey: string,\n    callback: (details: RequestEventType<T>) => void,\n  ): VoidFunction => {\n    emitter.on(getRequestStarByQueryKey(queryKey), callback);\n    return () => emitter.removeListener(getRequestStarByQueryKey(queryKey), callback);\n  },\n  onRequestStartById: <T extends RequestInstance>(\n    requestId: string,\n    callback: (details: RequestEventType<T>) => void,\n  ): VoidFunction => {\n    emitter.on(getRequestStartByIdKey(requestId), callback);\n    return () => emitter.removeListener(getRequestStartByIdKey(requestId), callback);\n  },\n\n  // Response Start\n  onResponseStart: <T extends RequestInstance>(callback: (details: RequestEventType<T>) => void): VoidFunction => {\n    emitter.on(getResponseStartKey(), callback);\n    return () => emitter.removeListener(getResponseStartKey(), callback);\n  },\n  onResponseStartByQueue: <T extends RequestInstance>(\n    queryKey: string,\n    callback: (details: RequestEventType<T>) => void,\n  ): VoidFunction => {\n    emitter.on(getResponseStartByQueryKey(queryKey), callback);\n    return () => emitter.removeListener(getResponseStartByQueryKey(queryKey), callback);\n  },\n  onResponseStartById: <T extends RequestInstance>(\n    requestId: string,\n    callback: (details: RequestEventType<T>) => void,\n  ): VoidFunction => {\n    emitter.on(getResponseStartByIdKey(requestId), callback);\n    return () => emitter.removeListener(getResponseStartByIdKey(requestId), callback);\n  },\n\n  // Progress\n  onUploadProgress: <T extends RequestInstance = RequestInstance>(\n    callback: (data: RequestProgressEventType<T>) => void,\n  ): VoidFunction => {\n    emitter.on(getUploadProgressKey(), callback);\n    return () => emitter.removeListener(getUploadProgressKey(), callback);\n  },\n  onUploadProgressByQueue: <T extends RequestInstance = RequestInstance>(\n    queryKey: string,\n    callback: (data: RequestProgressEventType<T>) => void,\n  ): VoidFunction => {\n    emitter.on(getUploadProgressByQueryKey(queryKey), callback);\n    return () => emitter.removeListener(getUploadProgressByQueryKey(queryKey), callback);\n  },\n  onUploadProgressById: <T extends RequestInstance = RequestInstance>(\n    requestId: string,\n    callback: (data: RequestProgressEventType<T>) => void,\n  ): VoidFunction => {\n    emitter.on(getUploadProgressByIdKey(requestId), callback);\n    return () => emitter.removeListener(getUploadProgressByIdKey(requestId), callback);\n  },\n\n  onDownloadProgress: <T extends RequestInstance = RequestInstance>(\n    callback: (data: RequestProgressEventType<T>) => void,\n  ): VoidFunction => {\n    emitter.on(getDownloadProgressKey(), callback);\n    return () => emitter.removeListener(getDownloadProgressKey(), callback);\n  },\n  onDownloadProgressByQueue: <T extends RequestInstance = RequestInstance>(\n    queryKey: string,\n    callback: (data: RequestProgressEventType<T>) => void,\n  ): VoidFunction => {\n    emitter.on(getDownloadProgressByQueryKey(queryKey), callback);\n    return () => emitter.removeListener(getDownloadProgressByQueryKey(queryKey), callback);\n  },\n  onDownloadProgressById: <T extends RequestInstance = RequestInstance>(\n    requestId: string,\n    callback: (data: RequestProgressEventType<T>) => void,\n  ): VoidFunction => {\n    emitter.on(getDownloadProgressByIdKey(requestId), callback);\n    return () => emitter.removeListener(getDownloadProgressByIdKey(requestId), callback);\n  },\n\n  // Response\n  onResponse: <T extends RequestInstance>(callback: (data: RequestResponseEventType<T>) => void): VoidFunction => {\n    emitter.on(getResponseKey(), callback);\n    return () => emitter.removeListener(getResponseKey(), callback);\n  },\n  onResponseByCache: <T extends RequestInstance>(\n    cacheKey: string,\n    callback: (data: RequestResponseEventType<T>) => void,\n  ): VoidFunction => {\n    emitter.on(getResponseByCacheKey(cacheKey), callback);\n    return () => emitter.removeListener(getResponseByCacheKey(cacheKey), callback);\n  },\n  onResponseById: <T extends RequestInstance>(\n    requestId: string,\n    callback: (data: RequestResponseEventType<T>) => void,\n  ): VoidFunction => {\n    emitter.on(getResponseByIdKey(requestId), callback);\n    return () => emitter.removeListener(getResponseByIdKey(requestId), callback);\n  },\n\n  // Abort\n  onAbort: <T extends RequestInstance = RequestInstance>(\n    callback: (request: RequestEventType<T>) => void,\n  ): VoidFunction => {\n    emitter.on(getAbortKey(), callback);\n    return () => emitter.removeListener(getAbortKey(), callback);\n  },\n  onAbortByKey: <T extends RequestInstance = RequestInstance>(\n    abortKey: string,\n    callback: (request: RequestEventType<T>) => void,\n  ): VoidFunction => {\n    emitter.on(getAbortByAbortKey(abortKey), callback);\n    return () => emitter.removeListener(getAbortByAbortKey(abortKey), callback);\n  },\n  onAbortById: <T extends RequestInstance = RequestInstance>(\n    requestId: string,\n    callback: (data: RequestEventType<T>) => void,\n  ): VoidFunction => {\n    emitter.on(getAbortByIdKey(requestId), callback);\n    return () => emitter.removeListener(getAbortByIdKey(requestId), callback);\n  },\n\n  // Remove\n  onRemove: <T extends RequestInstance = RequestInstance>(\n    callback: (data: RequestRemovedEventType<T>) => void,\n  ): VoidFunction => {\n    emitter.on(getRemoveKey(), callback);\n    return () => emitter.removeListener(getRemoveKey(), callback);\n  },\n  onRemoveByQueue: <T extends RequestInstance = RequestInstance>(\n    queryKey: string,\n    callback: (data: RequestRemovedEventType<T>) => void,\n  ): VoidFunction => {\n    emitter.on(getRemoveByQueryKey(queryKey), callback);\n    return () => emitter.removeListener(getRemoveByQueryKey(queryKey), callback);\n  },\n  onRemoveById: <T extends RequestInstance = RequestInstance>(\n    requestId: string,\n    callback: (data: RequestRemovedEventType<T>) => void,\n  ): VoidFunction => {\n    emitter.on(getRemoveByIdKey(requestId), callback);\n    return () => emitter.removeListener(getRemoveByIdKey(requestId), callback);\n  },\n});\n","import EventEmitter from \"events\";\n\nimport type { ClientInstance } from \"client\";\nimport type { LogLevel, LoggerOptionsType, LoggerType, LoggerMethods } from \"managers\";\nimport { logger, logLevelOrder } from \"managers\";\n\n/**\n * This class is used across the Hyper Fetch library to provide unified logging system with necessary setup per each client.\n * We can set up the logging level based on available values. This manager enable to initialize the logging instance per individual module\n * like Client, Request etc. Which can give you better feedback on the logging itself.\n */\nexport class LoggerManager {\n  logger: LoggerType;\n  level: LogLevel;\n  modules: string[] | undefined;\n\n  public emitter = new EventEmitter();\n\n  private client: Pick<ClientInstance, \"debug\">;\n\n  constructor(private options?: LoggerOptionsType) {\n    this.emitter?.setMaxListeners(1000);\n    this.logger = this.options?.logger || logger;\n    this.level = this.options?.level || \"warning\";\n    this.modules = this.options?.modules;\n  }\n\n  setSeverity = (level: LogLevel) => {\n    this.level = level;\n  };\n\n  setModules = (modules: string[] | undefined) => {\n    this.modules = modules;\n  };\n\n  initialize = (client: Pick<ClientInstance, \"debug\">, module: string): LoggerMethods => {\n    this.client = client;\n\n    return {\n      error: (data) => this.log({ ...data, level: \"error\", module }),\n      warning: (data) => this.log({ ...data, level: \"warning\", module }),\n      info: (data) => this.log({ ...data, level: \"info\", module }),\n      debug: (data) => this.log({ ...data, level: \"debug\", module }),\n    };\n  };\n\n  private log: LoggerType = (data) => {\n    if (!this.client.debug) {\n      return;\n    }\n    if (logLevelOrder.indexOf(this.level) <= logLevelOrder.indexOf(data.level)) {\n      return;\n    }\n    if (this.modules && !this.modules.includes(data.module)) {\n      return;\n    }\n    this.logger(data);\n  };\n}\n","/* eslint-disable no-console */\nimport type { LoggerType } from \"managers\";\nimport { loggerColors, loggerStyles } from \"managers\";\n\nexport const getTime = () => {\n  const d = new Date();\n  return `${d.toLocaleTimeString()}`;\n};\n\nconst getModuleName = (data: Parameters<LoggerType>[0]) => {\n  if (data.type === \"request\" || data.type === \"response\") {\n    return `${data.extra.request.endpoint}`;\n  }\n  return `[${data.module}]`;\n};\n\n// Logger\nexport const logger: LoggerType = (log) => {\n  const styles = loggerStyles[log.level];\n  const color = loggerColors[log.level];\n  const message = `%c[${getTime()}]%c${log.title}%c${getModuleName(log)}`;\n\n  const style1 = `${styles}${color}font-weight:600;border-radius: 4px 0 0 4px;`;\n  const style2 = `${styles}${color}font-weight:600;`;\n  const style3 = `${styles}font-weight:normal;border-radius: 0 4px 4px 0;`;\n\n  if (log.extra ? Object.keys(log.extra)?.length : false) {\n    console.groupCollapsed(message, style1, style2, style3);\n    console.log(log.extra);\n    console.groupEnd();\n  } else {\n    console.log(message, styles);\n  }\n};\n","import type { LogLevel } from \"./logger.manager.types\";\n\nexport const logLevelOrder: LogLevel[] = [\"error\", \"warning\", \"info\", \"debug\"];\n\nconst defaultStyles = \"padding:2px 5px;\";\n\nexport const loggerStyles: Record<LogLevel, string> = {\n  error: `${defaultStyles};background:#db252520;`,\n  warning: `${defaultStyles};background:#e1941e20;`,\n  info: `${defaultStyles};background:#1e74e120;`,\n  debug: `${defaultStyles};background:#00000020;`,\n};\n\nexport const loggerColors: Record<LogLevel, string> = {\n  error: \"color:#ff3737;\",\n  warning: \"color:#ffc107;\",\n  info: \"color:#34a8ff;\",\n  debug: \"color:#cccccc;\",\n};\n","/* eslint-disable max-classes-per-file */\n// Utils\nimport { hasWindow } from \"managers\";\nimport type { RequestInstance } from \"request\";\n\nexport class TimeoutError extends Error {\n  constructor() {\n    super(\"Request timeout\");\n    this.name = \"TimeoutError\";\n  }\n}\n\nexport class AbortError extends Error {\n  constructor() {\n    super(\"Request aborted\");\n    this.name = \"AbortError\";\n  }\n}\n\nexport class DeletedError extends Error {\n  constructor() {\n    super(\"Request deleted\");\n    this.name = \"DeletedError\";\n  }\n}\n\nexport class RequestProcessingError extends Error {\n  description?: string;\n\n  constructor(description?: string) {\n    super(\"Request processing error\");\n    this.description = description;\n    this.name = \"RequestProcessingError\";\n  }\n}\n\nexport class UnexpectedError extends Error {\n  description?: string;\n\n  constructor(description?: string) {\n    super(\"Unexpected error\");\n    this.description = description;\n    this.name = \"UnexpectedError\";\n  }\n}\n\nexport const getErrorMessage = (errorCase?: \"timeout\" | \"abort\" | \"deleted\" | \"processing\" | \"unexpected\") => {\n  if (errorCase === \"timeout\") {\n    return new TimeoutError();\n  }\n  if (errorCase === \"abort\") {\n    return new AbortError();\n  }\n  if (errorCase === \"deleted\") {\n    return new DeletedError();\n  }\n  if (errorCase === \"processing\") {\n    return new RequestProcessingError();\n  }\n  return new UnexpectedError();\n};\n\n// Mappers\n\nexport const stringifyValue = (response: string | unknown): string => {\n  try {\n    return JSON.stringify(response as string);\n  } catch (err) {\n    return \"\";\n  }\n};\n\nexport const getAdapterHeaders = (request: RequestInstance) => {\n  const isFormData = hasWindow() && request.payload instanceof FormData;\n  const isObject = typeof request.payload === \"object\" && request.payload !== null;\n  const headers: HeadersInit = {};\n\n  if (!isFormData && isObject) headers[\"Content-Type\"] = \"application/json\";\n\n  Object.assign(headers, request.headers);\n  return headers as HeadersInit;\n};\n\nexport const getAdapterPayload = (data: unknown): string | FormData => {\n  const isFormData = hasWindow() && data instanceof FormData;\n  if (isFormData) return data;\n\n  return stringifyValue(data);\n};\n","import type { RequestEventType, RequestProgressEventType, RequestResponseEventType } from \"managers\";\nimport type { RequestInstance } from \"./request.types\";\n\ntype HookName =\n  | \"onBeforeSent\"\n  | \"onRequestStart\"\n  | \"onResponseStart\"\n  | \"onUploadProgress\"\n  | \"onDownloadProgress\"\n  | \"onResponse\"\n  | \"onRemove\";\n\nexport interface RequestHooks<R extends RequestInstance> {\n  onBeforeSent: (cb: (eventData: RequestEventType<R>) => void) => () => void;\n  onRequestStart: (cb: (eventData: RequestEventType<R>) => void) => () => void;\n  onResponseStart: (cb: (eventData: RequestEventType<R>) => void) => () => void;\n  onUploadProgress: (cb: (eventData: RequestProgressEventType<R>) => void) => () => void;\n  onDownloadProgress: (cb: (eventData: RequestProgressEventType<R>) => void) => () => void;\n  onResponse: (cb: (eventData: RequestResponseEventType<R>) => void) => () => void;\n  onRemove: (cb: (eventData: RequestEventType<R>) => void) => () => void;\n  /** @internal Invoke all registered listeners for a given hook */\n  __emit: (name: HookName, data: any) => void;\n  /** @internal Get a snapshot of all registered listeners (used by clone) */\n  __snapshot: () => Record<HookName, Array<(...args: any[]) => void>>;\n}\n\nconst HOOK_NAMES: HookName[] = [\n  \"onBeforeSent\",\n  \"onRequestStart\",\n  \"onResponseStart\",\n  \"onUploadProgress\",\n  \"onDownloadProgress\",\n  \"onResponse\",\n  \"onRemove\",\n];\n\nexport function createRequestHooks<R extends RequestInstance>(\n  initial?: Record<HookName, Array<(...args: any[]) => void>>,\n): RequestHooks<R> {\n  const listeners: Record<HookName, Array<(...args: any[]) => void>> = {\n    onBeforeSent: [],\n    onRequestStart: [],\n    onResponseStart: [],\n    onUploadProgress: [],\n    onDownloadProgress: [],\n    onResponse: [],\n    onRemove: [],\n  };\n\n  if (initial) {\n    HOOK_NAMES.forEach((name) => {\n      listeners[name] = [...initial[name]];\n    });\n  }\n\n  const subscribe = (name: HookName) => {\n    return (cb: (...args: any[]) => void) => {\n      listeners[name].push(cb);\n      return () => {\n        const idx = listeners[name].indexOf(cb);\n        if (idx !== -1) listeners[name].splice(idx, 1);\n      };\n    };\n  };\n\n  return {\n    onBeforeSent: subscribe(\"onBeforeSent\"),\n    onRequestStart: subscribe(\"onRequestStart\"),\n    onResponseStart: subscribe(\"onResponseStart\"),\n    onUploadProgress: subscribe(\"onUploadProgress\"),\n    onDownloadProgress: subscribe(\"onDownloadProgress\"),\n    onResponse: subscribe(\"onResponse\"),\n    onRemove: subscribe(\"onRemove\"),\n    __emit(name: HookName, data: any) {\n      listeners[name].forEach((cb) => {\n        cb(data);\n      });\n    },\n    __snapshot() {\n      const snap = {} as Record<HookName, Array<(...args: any[]) => void>>;\n      HOOK_NAMES.forEach((name) => {\n        snap[name] = [...listeners[name]];\n      });\n      return snap;\n    },\n  };\n}\n","export enum HttpMethods {\n  GET = \"GET\",\n  POST = \"POST\",\n  PUT = \"PUT\",\n  PATCH = \"PATCH\",\n  DELETE = \"DELETE\",\n}\n","import { getErrorMessage } from \"adapter\";\nimport { HttpMethods } from \"constants/http.constants\";\nimport type { AdapterInstance, ProgressType, RequestResponseType, ResponseType } from \"adapter\";\nimport type { Dispatcher } from \"dispatcher\";\nimport type { ExtractAdapterType, ExtractErrorType } from \"types\";\nimport type {\n  OptimisticCallbackResult,\n  ProgressEventType,\n  RequestInstance,\n  RequestJSON,\n  RequestSendOptionsType,\n} from \"./request.types\";\n\nexport const scopeKey = (key: string, scope: string | null): string => {\n  return scope ? `${scope}__${key}` : key;\n};\n\nexport const stringifyKey = (value: unknown): string => {\n  try {\n    if (typeof value === \"string\") return value;\n    if (value === undefined || value === null) return \"\";\n    const data = JSON.stringify(value);\n    if (typeof data !== \"string\") throw new Error();\n    return data;\n  } catch (_) {\n    return \"\";\n  }\n};\n\nexport const getProgressValue = ({ loaded, total }: ProgressEventType): number => {\n  if (!loaded || !total) return 0;\n  return Number(((loaded * 100) / total).toFixed(0));\n};\n\nexport const getRequestEta = (\n  startDate: Date,\n  progressDate: Date,\n  { total, loaded }: ProgressEventType,\n): { sizeLeft: number; timeLeft: number | null } => {\n  const timeElapsed = +progressDate - +startDate || 1;\n  const uploadSpeed = loaded / timeElapsed;\n  const totalValue = Math.max(total, loaded);\n  const sizeLeft = totalValue - loaded;\n  const estimatedTimeValue = uploadSpeed ? sizeLeft / uploadSpeed : null;\n  const timeLeft = totalValue === loaded ? 0 : estimatedTimeValue;\n\n  return { timeLeft, sizeLeft };\n};\n\nexport const getProgressData = (\n  requestStartTime: Date,\n  progressDate: Date,\n  progressEvent: ProgressEventType,\n): ProgressType => {\n  const { total, loaded } = progressEvent;\n  if (Number.isNaN(total) || Number.isNaN(loaded)) {\n    return {\n      progress: 0,\n      timeLeft: 0,\n      sizeLeft: 0,\n      total: 0,\n      loaded: 0,\n      startTimestamp: +requestStartTime,\n    };\n  }\n\n  const { timeLeft, sizeLeft } = getRequestEta(requestStartTime, progressDate, progressEvent);\n\n  return {\n    progress: getProgressValue(progressEvent),\n    timeLeft,\n    sizeLeft,\n    total,\n    loaded,\n    startTimestamp: +requestStartTime,\n  };\n};\n\n// Keys\nexport const getSimpleKey = (request: RequestInstance | RequestJSON<RequestInstance>): string => {\n  return `${request.method}_${request.requestOptions.endpoint}_${request.cancelable}`;\n};\n\n/**\n * Cache instance for individual request that collects individual requests responses from\n * the same endpoint (they may differ base on the custom key, endpoint params etc)\n * @param request\n * @param useInitialValues\n * @returns\n */\nexport const getRequestKey = (\n  request: RequestInstance | RequestJSON<RequestInstance>,\n  useInitialValues?: boolean,\n): string => {\n  /**\n   * Below stringified values allow to match the response by method, endpoint and query params.\n   * That's because we have shared endpoint, but data with queryParams '?user=1' will not match regular request without queries.\n   * We want both results to be cached in separate places to not override each other.\n   *\n   * Values to be stringified:\n   *\n   * endpoint: string;\n   * queryParams: string;\n   * params: string;\n   */\n  const methodKey = stringifyKey(request.method);\n  const endpointKey = useInitialValues ? request.requestOptions.endpoint : stringifyKey(request.endpoint);\n  const queryParamsKey = useInitialValues ? \"\" : stringifyKey(request.queryParams);\n\n  return `${methodKey}_${endpointKey}_${queryParamsKey}`;\n};\n\nexport const getRequestDispatcher = <Request extends RequestInstance>(\n  request: Request,\n  dispatcherType: \"auto\" | \"fetch\" | \"submit\" = \"auto\",\n): [Dispatcher<ExtractAdapterType<Request>>, isFetchDispatcher: boolean] => {\n  const { fetchDispatcher, submitDispatcher } = request.client;\n  const isGet = request.method === HttpMethods.GET;\n  const isFetchDispatcher = (dispatcherType === \"auto\" && isGet) || dispatcherType === \"fetch\";\n  const dispatcher = isFetchDispatcher ? fetchDispatcher : submitDispatcher;\n\n  return [dispatcher, isFetchDispatcher];\n};\n\nexport const mapResponseForSend = async <Request extends RequestInstance>(\n  request: Request,\n  response: ResponseType<any, any, AdapterInstance>,\n): Promise<RequestResponseType<Request>> => {\n  const mapping = request.unstable_responseMapper?.(response as ResponseType<any, any, ExtractAdapterType<Request>>);\n\n  if (mapping instanceof Promise) {\n    return (await mapping) as RequestResponseType<Request>;\n  }\n\n  return (mapping || response) as RequestResponseType<Request>;\n};\n\nexport const sendRequest = async <Request extends RequestInstance>(\n  request: Request,\n  options?: RequestSendOptionsType<Request>,\n): Promise<RequestResponseType<Request>> => {\n  const { client } = request;\n  const { requestManager } = client;\n  const [dispatcher] = getRequestDispatcher(request, options?.dispatcherType);\n\n  let mutationContext: OptimisticCallbackResult<any> | undefined;\n\n  if (request.optimistic) {\n    try {\n      mutationContext = await request.optimistic({\n        request,\n        client: request.client,\n        payload: request.payload,\n      });\n    } catch (err) {\n      return {\n        data: null,\n        error: new Error(\n          `Optimistic callback failed: ${err instanceof Error ? err.message : err}`,\n        ) as unknown as ExtractErrorType<Request>,\n        status: null,\n        success: false,\n        extra: client.adapter.defaultExtra,\n        requestTimestamp: +new Date(),\n        responseTimestamp: +new Date(),\n      };\n    }\n  }\n\n  return new Promise<RequestResponseType<Request>>((resolve) => {\n    let isResolved = false;\n    const requestId = dispatcher.add(request);\n    const { $hooks } = request;\n    const beforeSentData = { requestId, request, mutationContext };\n    options?.onBeforeSent?.(beforeSentData);\n    $hooks.__emit(\"onBeforeSent\", beforeSentData);\n\n    const unmountRequestStart = requestManager.events.onRequestStartById<Request>(requestId, (data) => {\n      const enriched = { ...data, mutationContext };\n      options?.onRequestStart?.(enriched);\n      $hooks.__emit(\"onRequestStart\", enriched);\n    });\n\n    const unmountResponseStart = requestManager.events.onResponseStartById<Request>(requestId, (data) => {\n      const enriched = { ...data, mutationContext };\n      options?.onResponseStart?.(enriched);\n      $hooks.__emit(\"onResponseStart\", enriched);\n    });\n\n    const unmountUpload = requestManager.events.onUploadProgressById<Request>(requestId, (data) => {\n      const enriched = { ...data, mutationContext };\n      options?.onUploadProgress?.(enriched);\n      $hooks.__emit(\"onUploadProgress\", enriched);\n    });\n\n    const unmountDownload = requestManager.events.onDownloadProgressById<Request>(requestId, (data) => {\n      const enriched = { ...data, mutationContext };\n      options?.onDownloadProgress?.(enriched);\n      $hooks.__emit(\"onDownloadProgress\", enriched);\n    });\n\n    // When resolved\n    const unmountResponse = requestManager.events.onResponseById<Request>(requestId, (values) => {\n      const { details, response } = values;\n      isResolved = true;\n      const enrichedValues = { ...values, mutationContext };\n\n      const mapping = request.unstable_responseMapper?.(\n        response as ResponseType<any, any, ExtractAdapterType<Request>>,\n      );\n\n      const isOfflineStatus = request.offline && details.isOffline;\n      const { willRetry } = details;\n\n      const handleResponse = (success: boolean, data: ResponseType<any, any, ExtractAdapterType<Request>>) => {\n        // When going offline we can't handle the request as it will be postponed to later resolve\n        if (!success && isOfflineStatus) return;\n\n        // When request is in retry mode we need to listen for retries end\n        if (!success && willRetry) return;\n\n        options?.onResponse?.(enrichedValues);\n        $hooks.__emit(\"onResponse\", enrichedValues);\n        resolve(data);\n\n        // Unmount Listeners\n        // eslint-disable-next-line @typescript-eslint/no-use-before-define, @typescript-eslint/no-use-before-define\n        umountAll();\n      };\n\n      // Create async await ONLY when we make a promise mapper\n      if (mapping instanceof Promise) {\n        (async () => {\n          const responseData = await mapping;\n\n          const { success } = responseData;\n          handleResponse(success, responseData as ResponseType<any, any, ExtractAdapterType<Request>>);\n        })();\n      }\n      // For sync mapping operations we should not use async actions\n      else {\n        const data = mapping || response;\n        const { success } = data;\n        handleResponse(success, data as ResponseType<any, any, ExtractAdapterType<Request>>);\n      }\n    });\n\n    // When removed from queue storage we need to clean event listeners and return proper error\n    const unmountRemoveQueueElement = requestManager.events.onRemoveById<Request>(requestId, (data) => {\n      if (!isResolved) {\n        const enriched = { ...data, mutationContext };\n        options?.onRemove?.(enriched);\n        $hooks.__emit(\"onRemove\", enriched);\n        resolve({\n          data: null,\n          status: null,\n          success: false,\n          error: getErrorMessage(\"deleted\") as unknown as ExtractErrorType<Request>,\n          extra: request.client.adapter.defaultExtra,\n          requestTimestamp: +new Date(),\n          responseTimestamp: +new Date(),\n        });\n\n        // Unmount Listeners\n        // eslint-disable-next-line @typescript-eslint/no-use-before-define\n        umountAll();\n      }\n    });\n\n    function umountAll() {\n      unmountRequestStart();\n      unmountResponseStart();\n      unmountUpload();\n      unmountDownload();\n      unmountResponse();\n      unmountRemoveQueueElement();\n    }\n  });\n};\n","export enum Time {\n  SEC = 1e3,\n  MIN = 6e4,\n  HOUR = 3.6e6,\n  DAY = 8.64e7,\n  WEEK = 6.048e8,\n  MONTH_30 = 2.592e9,\n  MONTH_31 = 2.6784e9,\n  YEAR = 3.1536e10,\n  YEAR_LEAP = 3.16224e10,\n}\n","/* eslint-disable max-lines */\nimport type {\n  RequestSendOptionsType,\n  ParamsType,\n  RequestSendType,\n  PayloadType,\n  RequestJSON,\n  RequestOptionsType,\n  RequestConfigurationType,\n  PayloadMapperType,\n  RequestInstance,\n  RequestMapper,\n  ResponseMapper,\n  ExtractUrlParams,\n  RetryOnErrorCallbackType,\n  OptimisticCallback,\n} from \"./request.types\";\nimport type { RequestHooks } from \"./request.hooks\";\nimport { createRequestHooks } from \"./request.hooks\";\nimport { mapResponseForSend, sendRequest, scopeKey } from \"./request.utils\";\nimport type { ClientInstance } from \"client\";\nimport type { ResponseErrorType, ResponseSuccessType, ResponseType } from \"adapter\";\nimport type {\n  ExtractAdapterType,\n  ExtractClientAdapterType,\n  ExtractClientGlobalError,\n  ExtractEndpointType,\n  ExtractParamsType,\n  ExtractPayloadType,\n  ExtractQueryParamsType,\n  EmptyTypes,\n  ExtractAdapterMethodType,\n  ExtractAdapterOptionsType,\n  HydrateDataType,\n  SyncOrAsync,\n} from \"types\";\nimport { Time } from \"constants/time.constants\";\nimport type { MockerConfigType, MockResponseType } from \"mocker\";\n\ntype ClientAdapterOptions<C extends ClientInstance> = ExtractAdapterOptionsType<ExtractClientAdapterType<C>>;\ntype ClientAdapterMethod<C extends ClientInstance> = ExtractAdapterMethodType<ExtractClientAdapterType<C>>;\ntype ClientRequestOptions<E, C extends ClientInstance> = RequestOptionsType<\n  E,\n  ClientAdapterOptions<C>,\n  ClientAdapterMethod<C>\n>;\n\n/**\n * Request is a class that represents a request sent to the server. It contains all the necessary information to make a request, like endpoint, method, headers, data, and much more.\n * It is executed at any time via methods like `send` or `exec`.\n *\n * We can set it up with options like endpoint, method, headers and more.\n * We can choose some of advanced settings like cache, invalidation patterns, concurrency, retries and much, much more.\n *\n * @info We should not use this class directly in the standard development flow.\n * We can initialize it using the `createRequest` method on the **Client** class.\n *\n * @attention The most important thing about the request is that it keeps data in the format that can be dumped.\n * This is necessary for the persistence and different dispatcher storage types.\n * This class doesn't have any callback methods by design and communicate with dispatcher and cache by events.\n *\n * It should be serializable to JSON and deserializable back to the class.\n * Serialization should not affect the result of the request, so it's methods and functional part should be only syntax sugar for given runtime.\n */\n\nexport class Request<\n  Response,\n  Payload,\n  QueryParams,\n  LocalError,\n  Endpoint extends string,\n  Client extends ClientInstance,\n  HasPayload extends true | false = false,\n  HasParams extends true | false = false,\n  HasQuery extends true | false = false,\n  MutationContext = undefined,\n> {\n  endpoint: Endpoint;\n  headers?: HeadersInit;\n  auth: boolean;\n  method: ClientAdapterMethod<Client>;\n  params: ExtractUrlParams<Endpoint> | EmptyTypes;\n  payload: PayloadType<Payload>;\n  queryParams: QueryParams | EmptyTypes;\n  options?: ClientAdapterOptions<Client> | undefined;\n  cancelable: boolean;\n  retry: number;\n  retryTime: number;\n  cacheTime: number;\n  cache: boolean;\n  staleTime: number;\n  queued: boolean;\n  offline: boolean;\n  abortKey: string;\n  cacheKey: string;\n  queryKey: string;\n  used: boolean;\n  deduplicate: boolean;\n  deduplicateTime: number | null;\n  scope: string | null;\n\n  /**\n   * Instance-level lifecycle hooks. These callbacks fire for every `send()` / `exec()` call\n   * made on this request instance (and its clones), without needing to pass them to `send()` each time.\n   * Useful for cross-cutting concerns like logging, analytics, or toast notifications.\n   *\n   * Each method registers a callback and returns an unsubscribe function.\n   * Multiple listeners per hook are supported.\n   */\n  $hooks: RequestHooks<RequestInstance> = createRequestHooks();\n\n  isMockerEnabled = false;\n\n  unstable_mock?: {\n    fn: (options: {\n      request: RequestInstance;\n      requestId: string;\n    }) => MockResponseType<Response, LocalError | ExtractClientGlobalError<Client>, ExtractClientAdapterType<Client>>;\n    config: MockerConfigType;\n  };\n  /** @internal */\n  unstable_payloadMapper?: PayloadMapperType<Payload>;\n  /** @internal */\n  unstable_requestMapper?: RequestMapper<any, any>;\n  /** @internal */\n  unstable_responseMapper?: ResponseMapper<this, ResponseSuccessType<any, any> | ResponseErrorType<any, any>>;\n  /** @internal */\n  retryOnError?: RetryOnErrorCallbackType<RequestInstance>;\n  /** @internal */\n  optimistic?: OptimisticCallback<RequestInstance, any>;\n\n  unstable_hasParams: HasParams = false as HasParams;\n  unstable_hasPayload: HasPayload = false as HasPayload;\n  unstable_hasQuery: HasQuery = false as HasQuery;\n  unstable_hasMutationContext: MutationContext = undefined as MutationContext;\n\n  private updatedAbortKey: boolean;\n  private updatedCacheKey: boolean;\n  private updatedQueryKey: boolean;\n\n  constructor(\n    readonly client: Client,\n    readonly requestOptions: ClientRequestOptions<Endpoint, Client>,\n    readonly initialRequestConfiguration?:\n      | RequestConfigurationType<\n          Payload,\n          Endpoint extends string ? ExtractUrlParams<Endpoint> : never,\n          QueryParams,\n          Endpoint,\n          ClientAdapterOptions<Client>,\n          ClientAdapterMethod<Client>\n        >\n      | undefined,\n  ) {\n    const configuration: ClientRequestOptions<Endpoint, Client> = {\n      ...(this.client.adapter.unstable_getRequestDefaults?.(requestOptions) as ClientRequestOptions<Endpoint, Client>),\n      ...requestOptions,\n    };\n    const {\n      endpoint,\n      headers,\n      auth = true,\n      method = client.adapter.defaultMethod,\n      options,\n      cancelable = false,\n      retry = 0,\n      retryTime = 500,\n      cacheTime = Time.MIN * 5,\n      cache = true,\n      staleTime = Time.MIN * 5,\n      queued = false,\n      offline = true,\n      abortKey,\n      cacheKey,\n      queryKey,\n      deduplicate = false,\n      deduplicateTime = null,\n    } = configuration;\n    this.endpoint = initialRequestConfiguration?.endpoint ?? endpoint;\n    this.headers = initialRequestConfiguration?.headers ?? headers;\n    this.auth = initialRequestConfiguration?.auth ?? auth;\n    this.method = method as ExtractAdapterMethodType<ExtractClientAdapterType<Client>>;\n    this.params = initialRequestConfiguration?.params;\n    this.payload = initialRequestConfiguration?.payload;\n    this.queryParams = initialRequestConfiguration?.queryParams;\n    this.options = initialRequestConfiguration?.options ?? options;\n    this.cancelable = initialRequestConfiguration?.cancelable ?? cancelable;\n    this.retry = initialRequestConfiguration?.retry ?? retry;\n    this.retryTime = initialRequestConfiguration?.retryTime ?? retryTime;\n    this.cacheTime = initialRequestConfiguration?.cacheTime ?? cacheTime;\n    this.cache = initialRequestConfiguration?.cache ?? cache;\n    this.staleTime = initialRequestConfiguration?.staleTime ?? staleTime;\n    this.queued = initialRequestConfiguration?.queued ?? queued;\n    this.offline = initialRequestConfiguration?.offline ?? offline;\n    this.abortKey = initialRequestConfiguration?.abortKey ?? abortKey ?? this.client.unstable_abortKeyMapper(this);\n    this.cacheKey = initialRequestConfiguration?.cacheKey ?? cacheKey ?? this.client.unstable_cacheKeyMapper(this);\n    this.queryKey = initialRequestConfiguration?.queryKey ?? queryKey ?? this.client.unstable_queryKeyMapper(this);\n    this.used = initialRequestConfiguration?.used ?? false;\n    this.deduplicate = initialRequestConfiguration?.deduplicate ?? deduplicate;\n    this.deduplicateTime = initialRequestConfiguration?.deduplicateTime ?? deduplicateTime;\n    this.scope = initialRequestConfiguration?.scope ?? null;\n    this.updatedAbortKey = initialRequestConfiguration?.updatedAbortKey ?? false;\n    this.updatedCacheKey = initialRequestConfiguration?.updatedCacheKey ?? false;\n    this.updatedQueryKey = initialRequestConfiguration?.updatedQueryKey ?? false;\n  }\n\n  public setHeaders = (headers: HeadersInit) => {\n    return this.clone({ headers });\n  };\n\n  public setAuth = (auth: boolean) => {\n    return this.clone({ auth });\n  };\n\n  public setParams = <P extends ExtractParamsType<this>>(params: P) => {\n    return this.clone<HasPayload, P extends null ? false : true, HasQuery>({ params });\n  };\n\n  public setPayload = <P extends Payload>(payload: P) => {\n    return this.clone<P extends null ? false : true, HasParams, HasQuery>({\n      payload,\n    });\n  };\n\n  public setQueryParams = (queryParams: QueryParams) => {\n    return this.clone<HasPayload, HasParams, true>({ queryParams });\n  };\n\n  public setOptions = (options: ClientAdapterOptions<Client>) => {\n    return this.clone<HasPayload, HasParams, true>({ options });\n  };\n\n  /**\n   * Set a scope identifier for this request.\n   * All keys (cache, queue, abort) are prefixed with this scope, isolating\n   * the request from other scopes. In \"server\" client mode, setting a scope\n   * also enables caching (which is otherwise disabled to prevent cross-request leaks).\n   */\n  public setScope = (scopeId: string) => {\n    const cloned = this.clone<HasPayload, HasParams, HasQuery>();\n    cloned.scope = scopeId;\n    return cloned;\n  };\n\n  public setCancelable = (cancelable: boolean) => {\n    return this.clone({ cancelable });\n  };\n\n  public setRetry = (retry: ClientRequestOptions<Endpoint, Client>[\"retry\"]) => {\n    return this.clone({ retry });\n  };\n\n  public setRetryTime = (retryTime: ClientRequestOptions<Endpoint, Client>[\"retryTime\"]) => {\n    return this.clone({ retryTime });\n  };\n\n  /**\n   * Set a callback that controls whether a failed request should be retried.\n   * Called on each failed attempt before scheduling the next retry.\n   * Return `true` to allow the retry, `false` to stop retrying immediately.\n   */\n  public setRetryOnError = (\n    callback: RetryOnErrorCallbackType<\n      Request<Response, Payload, QueryParams, LocalError, Endpoint, Client, HasPayload, HasParams, HasQuery>\n    >,\n  ) => {\n    const cloned = this.clone<HasPayload, HasParams, HasQuery>();\n    cloned.retryOnError = callback as RetryOnErrorCallbackType<RequestInstance>;\n    return cloned;\n  };\n\n  /**\n   * Configure optimistic update behavior for this request.\n   * The callback runs before the request is sent (in React's `useSubmit`) and receives\n   * the request, client, and payload. Return `context` (available in submit callbacks),\n   * `rollback` (called automatically on failure/abort), and `invalidate` (cache keys\n   * invalidated on success).\n   */\n  public setOptimistic = <Ctx>(callback: OptimisticCallback<this, Ctx>) => {\n    const cloned = this.clone<HasPayload, HasParams, HasQuery>();\n    cloned.optimistic = callback as OptimisticCallback<RequestInstance, any>;\n    return cloned as unknown as Request<\n      Response,\n      Payload,\n      QueryParams,\n      LocalError,\n      Endpoint,\n      Client,\n      HasPayload,\n      HasParams,\n      HasQuery,\n      Ctx\n    >;\n  };\n\n  public setCacheTime = (cacheTime: ClientRequestOptions<Endpoint, Client>[\"cacheTime\"]) => {\n    return this.clone({ cacheTime });\n  };\n\n  public setCache = (cache: ClientRequestOptions<Endpoint, Client>[\"cache\"]) => {\n    return this.clone({ cache });\n  };\n\n  public setStaleTime = (staleTime: ClientRequestOptions<Endpoint, Client>[\"staleTime\"]) => {\n    return this.clone({ staleTime });\n  };\n\n  public setQueued = (queued: boolean) => {\n    return this.clone({ queued });\n  };\n\n  public setAbortKey = (abortKey: string) => {\n    this.updatedAbortKey = true;\n    return this.clone({ abortKey });\n  };\n\n  public setCacheKey = (cacheKey: string) => {\n    this.updatedCacheKey = true;\n    return this.clone({ cacheKey });\n  };\n\n  public setQueryKey = (queryKey: string) => {\n    this.updatedQueryKey = true;\n    return this.clone({ queryKey });\n  };\n\n  public setDeduplicate = (deduplicate: boolean) => {\n    return this.clone({ deduplicate });\n  };\n\n  public setDeduplicateTime = (deduplicateTime: number) => {\n    return this.clone({ deduplicateTime });\n  };\n\n  public setUsed = (used: boolean) => {\n    return this.clone({ used });\n  };\n\n  public setOffline = (offline: boolean) => {\n    return this.clone({ offline });\n  };\n\n  public setMock = (\n    fn: (options: {\n      request: Request<Response, Payload, QueryParams, LocalError, Endpoint, Client, HasPayload, HasParams, HasQuery>;\n      requestId: string;\n    }) => SyncOrAsync<\n      MockResponseType<Response, LocalError | ExtractClientGlobalError<Client>, ExtractClientAdapterType<Client>>\n    >,\n    config: MockerConfigType = {},\n  ) => {\n    this.unstable_mock = { fn, config } as typeof this.unstable_mock;\n    this.isMockerEnabled = true;\n    return this;\n  };\n\n  public clearMock = () => {\n    this.unstable_mock = undefined;\n    this.isMockerEnabled = false;\n    return this;\n  };\n\n  public setMockingEnabled = (isMockerEnabled: boolean) => {\n    this.isMockerEnabled = isMockerEnabled;\n    return this;\n  };\n\n  /**\n   * Map data before it gets send to the server\n   * @param payloadMapper\n   * @returns\n   */\n  public setPayloadMapper = <MappedPayload extends any | Promise<any>>(\n    payloadMapper: (data: Payload) => MappedPayload,\n  ) => {\n    const cloned = this.clone<HasPayload, HasParams, HasQuery>(undefined);\n\n    cloned.unstable_payloadMapper = payloadMapper as typeof this.unstable_payloadMapper;\n\n    return cloned;\n  };\n\n  /**\n   * Map request before it gets send to the server\n   * @param requestMapper mapper of the request\n   * @returns new request\n   */\n  public setRequestMapper = <NewRequest extends RequestInstance>(requestMapper: RequestMapper<this, NewRequest>) => {\n    const cloned = this.clone<HasPayload, HasParams, HasQuery>(undefined);\n\n    cloned.unstable_requestMapper = requestMapper;\n\n    return cloned;\n  };\n\n  /**\n   * Map the response to the new interface\n   * @param responseMapper our mapping callback\n   * @returns new response\n   */\n  public setResponseMapper = <MappedResponse extends ResponseSuccessType<any, any> | ResponseErrorType<any, any>>(\n    responseMapper?: ResponseMapper<this, MappedResponse>,\n  ) => {\n    const cloned = this.clone<HasPayload, HasParams, HasQuery>();\n\n    cloned.unstable_responseMapper = responseMapper as typeof cloned.unstable_responseMapper;\n\n    return cloned as unknown as Request<\n      MappedResponse extends ResponseType<infer R, any, any> ? R : Response,\n      Payload,\n      QueryParams,\n      MappedResponse extends ResponseType<any, infer E, any> ? E : LocalError,\n      Endpoint,\n      Client,\n      HasPayload,\n      HasParams,\n      HasQuery,\n      MutationContext\n    >;\n  };\n\n  private paramsMapper = (params: ParamsType | null | undefined): Endpoint => {\n    const { endpoint } = this.requestOptions;\n\n    let stringEndpoint = String(endpoint);\n    if (params) {\n      Object.entries(params).forEach(([key, value]) => {\n        stringEndpoint = stringEndpoint.replace(new RegExp(`:${key}`, \"g\"), String(value));\n      });\n    }\n\n    return stringEndpoint as Endpoint;\n  };\n\n  public toJSON(): RequestJSON<this> {\n    return {\n      requestOptions: this.requestOptions as unknown as RequestOptionsType<\n        ExtractEndpointType<this>,\n        ExtractAdapterOptionsType<ExtractAdapterType<this>>,\n        ExtractAdapterMethodType<ExtractAdapterType<this>>\n      >,\n      endpoint: this.endpoint as ExtractEndpointType<this>,\n      headers: this.headers,\n      auth: this.auth,\n      // TODO: fix this type\n      method: this.method as any,\n      params: this.params as ExtractParamsType<this>,\n      payload: this.payload as ExtractPayloadType<this>,\n      queryParams: this.queryParams as ExtractQueryParamsType<this>,\n      options: this.options,\n      cancelable: this.cancelable,\n      retry: this.retry,\n      retryTime: this.retryTime,\n      cacheTime: this.cacheTime,\n      cache: this.cache,\n      staleTime: this.staleTime,\n      queued: this.queued,\n      offline: this.offline,\n      abortKey: this.abortKey,\n      cacheKey: this.cacheKey,\n      queryKey: this.queryKey,\n      used: this.used,\n      disableResponseInterceptors: this.requestOptions.disableResponseInterceptors,\n      disableRequestInterceptors: this.requestOptions.disableRequestInterceptors,\n      updatedAbortKey: this.updatedAbortKey,\n      updatedCacheKey: this.updatedCacheKey,\n      updatedQueryKey: this.updatedQueryKey,\n      deduplicate: this.deduplicate,\n      deduplicateTime: this.deduplicateTime,\n      scope: this.scope,\n      isMockerEnabled: this.isMockerEnabled,\n      hasMock: !!this.unstable_mock,\n    };\n  }\n\n  public clone<\n    NewData extends true | false = HasPayload,\n    NewParams extends true | false = HasParams,\n    NewQueryParams extends true | false = HasQuery,\n  >(\n    configuration?: RequestConfigurationType<\n      Payload,\n      (typeof this)[\"params\"],\n      QueryParams,\n      Endpoint,\n      ClientAdapterOptions<Client>,\n      ClientAdapterMethod<Client>\n    >,\n  ) {\n    const json = this.toJSON();\n    const initialRequestConfiguration: RequestConfigurationType<\n      Payload,\n      Endpoint extends string ? ExtractUrlParams<Endpoint> : never,\n      QueryParams,\n      Endpoint,\n      ClientAdapterOptions<Client>,\n      ClientAdapterMethod<Client>\n    > = {\n      ...json,\n      ...configuration,\n      options: configuration?.options || this.options,\n      abortKey: this.updatedAbortKey ? configuration?.abortKey || this.abortKey : undefined,\n      cacheKey: this.updatedCacheKey ? configuration?.cacheKey || this.cacheKey : undefined,\n      queryKey: this.updatedQueryKey ? configuration?.queryKey || this.queryKey : undefined,\n      endpoint: this.paramsMapper(configuration?.params || this.params),\n      queryParams: configuration?.queryParams || this.queryParams,\n      payload: configuration?.payload || this.payload,\n      params: (configuration?.params || this.params) as\n        | EmptyTypes\n        | (Endpoint extends string ? ExtractUrlParams<Endpoint> : never),\n    };\n\n    const cloned = new Request<\n      Response,\n      Payload,\n      QueryParams,\n      LocalError,\n      Endpoint,\n      Client,\n      NewData,\n      NewParams,\n      NewQueryParams,\n      MutationContext\n    >(this.client, this.requestOptions, initialRequestConfiguration);\n\n    // Inherit methods\n    cloned.unstable_payloadMapper = this.unstable_payloadMapper;\n    cloned.unstable_responseMapper = this.unstable_responseMapper as typeof cloned.unstable_responseMapper;\n    cloned.unstable_requestMapper = this.unstable_requestMapper;\n    cloned.retryOnError = this.retryOnError;\n\n    cloned.unstable_mock = this.unstable_mock;\n    cloned.isMockerEnabled = this.isMockerEnabled;\n    cloned.optimistic = this.optimistic;\n    cloned.$hooks = createRequestHooks(this.$hooks.__snapshot());\n\n    return cloned;\n  }\n\n  public abort = () => {\n    const { requestManager } = this.client;\n    requestManager.abortByKey(scopeKey(this.abortKey, this.scope));\n\n    return this.clone();\n  };\n\n  public dehydrate = (config?: {\n    /** in case of using adapter without cache we can provide response to dehydrate */\n    response?: ResponseType<Response, LocalError | ExtractClientGlobalError<Client>, ExtractClientAdapterType<Client>>;\n    /** override cache data */\n    override?: boolean;\n  }):\n    | HydrateDataType<Response, LocalError | ExtractClientGlobalError<Client>, ExtractClientAdapterType<Client>>\n    | undefined => {\n    const { response, override = true } = config || {};\n\n    if (response) {\n      return {\n        override,\n        cacheTime: this.cacheTime,\n        staleTime: this.staleTime,\n        cacheKey: this.cacheKey,\n        scope: this.scope,\n        timestamp: +new Date(),\n        hydrated: true,\n        cache: true,\n        response,\n      };\n    }\n\n    const cacheData = this.client.cache.get<Response, LocalError | ExtractClientGlobalError<Client>>(\n      scopeKey(this.cacheKey, this.scope),\n    );\n\n    if (!cacheData) {\n      return undefined;\n    }\n\n    return {\n      override,\n      cacheTime: this.cacheTime,\n      staleTime: this.staleTime,\n      cacheKey: this.cacheKey,\n      scope: this.scope,\n      timestamp: +new Date(),\n      hydrated: true,\n      cache: true,\n      response: {\n        data: cacheData.data,\n        error: cacheData.error,\n        status: cacheData.status,\n        success: cacheData.success,\n        extra: cacheData.extra,\n        requestTimestamp: cacheData.requestTimestamp,\n        responseTimestamp: cacheData.responseTimestamp,\n      },\n    };\n  };\n\n  /**\n   * Read the response from cache data\n   *\n   * If it returns error and data at the same time, it means that latest request was failed\n   * and we show previous data from cache together with error received from actual request\n   */\n  public read():\n    | ResponseType<Response, LocalError | ExtractClientGlobalError<Client>, ExtractClientAdapterType<Client>>\n    | undefined {\n    const cacheData = this.client.cache.get<Response, LocalError | ExtractClientGlobalError<Client>>(\n      scopeKey(this.cacheKey, this.scope),\n    );\n\n    if (cacheData) {\n      return {\n        data: cacheData.data,\n        error: cacheData.error,\n        status: cacheData.status,\n        success: cacheData.success,\n        extra: cacheData.extra,\n        requestTimestamp: cacheData.requestTimestamp,\n        responseTimestamp: cacheData.responseTimestamp,\n      };\n    }\n    return undefined;\n  }\n\n  /**\n   * Method to use the request WITHOUT adding it to cache and queues. This mean it will make simple request without queue side effects.\n   * @param options\n   * @disableReturns\n   * @returns\n   * ```tsx\n   * Promise<[Data | null, Error | null, HttpStatus]>\n   * ```\n   */\n  public exec: RequestSendType<this> = async (options?: RequestSendOptionsType<this>) => {\n    const { adapter, requestManager } = this.client;\n    const request = this.clone(options);\n\n    const requestId = this.client.unstable_requestIdMapper(this);\n\n    const scopedAbortKey = scopeKey(this.abortKey, this.scope);\n\n    // Listen for aborting\n    requestManager.addAbortController(scopedAbortKey, requestId);\n\n    const response = await adapter.fetch(request, requestId);\n\n    // Stop listening for aborting\n    requestManager.removeAbortController(scopedAbortKey, requestId);\n\n    if (request.unstable_responseMapper) {\n      return request.unstable_responseMapper(response);\n    }\n\n    return response;\n  };\n\n  /**\n   * Method used to perform requests with usage of cache and queues\n   * @param options\n   * @param requestCallback\n   * @disableReturns\n   * @returns\n   * ```tsx\n   * Promise<{ data: Data | null, error: Error | null, status: HttpStatus, ... }>\n   * ```\n   */\n  public send: RequestSendType<this> = async (options?: RequestSendOptionsType<this>) => {\n    const { dispatcherType, cachePolicy = \"network-only\", ...configuration } = options || {};\n\n    const request = this.clone(configuration) as unknown as this;\n\n    const sendRequestOptions = options === undefined ? undefined : { ...options, cachePolicy: undefined };\n\n    if (cachePolicy === \"network-only\") {\n      return sendRequest(request, sendRequestOptions);\n    }\n\n    const cached = request.read();\n\n    if (cachePolicy === \"cache-first\") {\n      if (cached) {\n        return mapResponseForSend(request, cached);\n      }\n      return sendRequest(request, sendRequestOptions);\n    }\n\n    // revalidate\n    if (cached) {\n      const resolved = await mapResponseForSend(request, cached);\n      // Background revalidation; promise from send() already resolved with cache snapshot\n      // eslint-disable-next-line @typescript-eslint/no-floating-promises\n      sendRequest(request, sendRequestOptions);\n      return resolved;\n    }\n\n    return sendRequest(request, sendRequestOptions);\n  };\n\n  static fromJSON = <\n    NewResponse,\n    NewPayload,\n    NewQueryParams,\n    NewLocalError,\n    NewEndpoint extends string,\n    NewClient extends ClientInstance,\n    NewHasPayload extends true | false = false,\n    NewHasParams extends true | false = false,\n    NewHasQuery extends true | false = false,\n  >(\n    client: NewClient,\n    json: RequestJSON<\n      Request<\n        NewResponse,\n        NewPayload,\n        NewQueryParams,\n        NewLocalError,\n        NewEndpoint,\n        NewClient,\n        NewHasPayload,\n        NewHasParams,\n        NewHasQuery\n      >\n    >,\n  ) => {\n    return new Request<\n      NewResponse,\n      NewPayload,\n      NewQueryParams,\n      NewLocalError,\n      NewEndpoint,\n      NewClient,\n      NewHasPayload,\n      NewHasParams,\n      NewHasQuery\n    >(client, json.requestOptions, json);\n  };\n}\n","import type { ResponseSuccessType, ResponseErrorType, ProgressDataType, AdapterInstance } from \"adapter\";\nimport { getErrorMessage, RequestProcessingError } from \"adapter\";\nimport type { LoggerMethods } from \"managers\";\nimport type { RequestInstance, ProgressEventType } from \"request\";\nimport { getProgressData, scopeKey } from \"request\";\nimport type {\n  ExtractResponseType,\n  ExtractErrorType,\n  ExtractPayloadType,\n  ExtractAdapterOptionsType,\n  ExtractAdapterStatusType,\n  ExtractAdapterExtraType,\n} from \"types\";\n\nexport const getAdapterBindings = async <T extends AdapterInstance>({\n  request: baseRequest,\n  requestId,\n  resolve,\n  onStartTime,\n  internalErrorMapping,\n}: {\n  request: RequestInstance;\n  requestId: string;\n  resolve: (value: ResponseSuccessType<any, T> | ResponseErrorType<any, T>) => void;\n  onStartTime: (timestamp: number) => void;\n  internalErrorMapping: (error: ReturnType<typeof getErrorMessage>) => any;\n}) => {\n  const { requestManager, loggerManager } = baseRequest.client;\n  // eslint-disable-next-line @typescript-eslint/naming-convention\n  const { unstable_payloadMapper } = baseRequest.client.adapter;\n\n  const logger = loggerManager.initialize(baseRequest.client, \"Adapter\");\n\n  let requestStartTimestamp: null | number = null;\n  let responseStartTimestamp: null | number = null;\n  let request = baseRequest;\n\n  // Progress\n  let requestTotal = 1;\n  let responseTotal = 1;\n  let previousRequestTotal = 0;\n  let previousResponseTotal = 0;\n\n  // Pre request modifications\n  logger.debug({\n    title: `Running middleware callbacks`,\n    type: \"request\",\n    extra: {\n      request,\n      requestId,\n    },\n  });\n\n  request = await request.client.unstable_modifyRequest(request);\n\n  if (request.auth) {\n    request = await request.client.unstable_modifyAuth(request);\n  }\n\n  if (request.unstable_requestMapper) {\n    request = await request.unstable_requestMapper(request, requestId);\n  }\n\n  // Request Setup\n  const { client, abortKey } = request;\n  const scopedAbortKey = scopeKey(abortKey, request.scope);\n\n  // eslint-disable-next-line prefer-destructuring\n  let payload = request.payload;\n\n  if (request.unstable_payloadMapper) {\n    payload = await request.unstable_payloadMapper<ExtractPayloadType<RequestInstance>>(request.payload);\n  } else if (unstable_payloadMapper) {\n    payload = await unstable_payloadMapper(payload);\n  }\n\n  const adapterOptions = request.options as ExtractAdapterOptionsType<T> | undefined;\n  const startTime = +new Date();\n  onStartTime(startTime);\n\n  const getRequestStartTimestamp = () => {\n    return requestStartTimestamp;\n  };\n\n  const getResponseStartTimestamp = () => {\n    return responseStartTimestamp;\n  };\n\n  // Progress\n\n  const getTotal = (previousTotal: number, progress?: ProgressDataType) => {\n    if (!progress) return previousTotal;\n    const total = Number(progress.total || 0);\n    const loaded = Number(progress.loaded || 0);\n    return Math.max(total, loaded, previousTotal);\n  };\n\n  const handleRequestProgress = (\n    startTimestamp: number,\n    progressTimestamp: number,\n    progressEvent: ProgressEventType,\n  ) => {\n    const progress = getProgressData(new Date(startTimestamp), new Date(progressTimestamp), progressEvent);\n\n    if (previousRequestTotal !== 100) {\n      previousRequestTotal = progress.total;\n      requestManager.events.emitUploadProgress({ ...progress, requestId, request });\n    }\n  };\n\n  const handleResponseProgress = (\n    startTimestamp: number,\n    progressTimestamp: number,\n    progressEvent: ProgressEventType,\n  ) => {\n    const progress = getProgressData(new Date(startTimestamp), new Date(progressTimestamp), progressEvent);\n\n    if (previousResponseTotal !== 100) {\n      previousResponseTotal = progress.total;\n      requestManager.events.emitDownloadProgress({ ...progress, requestId, request });\n    }\n  };\n\n  // Pre-request\n\n  const onBeforeRequest = () => {\n    logger.debug({\n      title: `Request about to be sent`,\n      type: \"request\",\n      extra: {\n        request,\n        requestId,\n      },\n    });\n    client.triggerPlugins(\"onRequestTrigger\", { request });\n  };\n\n  // Request\n\n  const onRequestStart = (progress?: ProgressDataType) => {\n    logger.info({\n      title: `Request start`,\n      type: \"request\",\n      extra: {\n        request,\n        requestId,\n      },\n    });\n    client.triggerPlugins(\"onRequestStart\", { request });\n\n    if (progress?.total) {\n      requestTotal = getTotal(requestTotal, progress);\n    }\n\n    const initialPayload = {\n      total: requestTotal,\n      loaded: progress?.loaded || 0,\n    };\n    requestStartTimestamp = +new Date();\n    handleRequestProgress(requestStartTimestamp, requestStartTimestamp, initialPayload);\n    requestManager.events.emitRequestStart({ requestId, request });\n    return requestStartTimestamp;\n  };\n\n  const onRequestProgress = (progress: ProgressDataType) => {\n    if (!requestStartTimestamp) {\n      requestStartTimestamp = +new Date();\n    }\n    requestTotal = getTotal(requestTotal, progress);\n\n    const progressTimestamp = +new Date();\n\n    handleRequestProgress(requestStartTimestamp, progressTimestamp, {\n      total: requestTotal,\n      loaded: progress.loaded || 0,\n    });\n    return progressTimestamp;\n  };\n\n  const onRequestEnd = () => {\n    if (!requestStartTimestamp) {\n      requestStartTimestamp = +new Date();\n    }\n\n    const progressTimestamp = +new Date();\n    handleRequestProgress(requestStartTimestamp, progressTimestamp, {\n      total: requestTotal,\n      loaded: requestTotal,\n    });\n    return progressTimestamp;\n  };\n\n  // Response\n\n  const onResponseStart = (progress?: ProgressDataType) => {\n    responseStartTimestamp = +new Date();\n\n    responseTotal = getTotal(responseTotal, progress);\n\n    const initialPayload = {\n      total: responseTotal,\n      loaded: progress?.loaded || 0,\n    };\n\n    handleResponseProgress(responseStartTimestamp, responseStartTimestamp, initialPayload);\n    requestManager.events.emitResponseStart({ requestId, request });\n    return responseStartTimestamp;\n  };\n\n  const onResponseProgress = (progress: ProgressDataType) => {\n    if (!responseStartTimestamp) {\n      responseStartTimestamp = +new Date();\n    }\n\n    const progressTimestamp = +new Date();\n    responseTotal = getTotal(responseTotal, progress);\n\n    handleResponseProgress(responseStartTimestamp, progressTimestamp, {\n      total: progress.total || responseTotal,\n      loaded: progress.loaded || 0,\n    });\n    return progressTimestamp;\n  };\n\n  const onResponseEnd = () => {\n    if (!responseStartTimestamp) {\n      responseStartTimestamp = +new Date();\n    }\n\n    const progressTimestamp = +new Date();\n    handleResponseProgress(responseStartTimestamp, progressTimestamp, {\n      total: responseTotal,\n      loaded: responseTotal,\n    });\n    return progressTimestamp;\n  };\n\n  // Success\n\n  const onSuccess = async ({\n    data,\n    error,\n    status,\n    extra,\n  }: {\n    data: any;\n    status: ExtractAdapterStatusType<T>;\n    extra: ExtractAdapterExtraType<T>;\n    error?: ExtractErrorType<T>;\n  }): Promise<ResponseSuccessType<ExtractResponseType<T>, T>> => {\n    let response: ResponseSuccessType<ExtractResponseType<T>, T> = {\n      data,\n      error: error ?? null,\n      success: true,\n      status,\n      extra,\n      requestTimestamp: startTime,\n      responseTimestamp: +new Date(),\n    };\n    response = (await request.client.unstable_modifyResponse?.(response, request)) as typeof data;\n    response = (await request.client.unstable_modifySuccessResponse?.(response, request)) as typeof data;\n\n    client.triggerPlugins(\"onRequestSuccess\", { response, request });\n    client.triggerPlugins(\"onRequestFinished\", { response, request });\n\n    resolve(response);\n\n    logger.info({\n      title: `Response success`,\n      type: \"response\",\n      extra: {\n        request,\n        requestId,\n        response,\n      },\n    });\n    return response;\n  };\n\n  // Errors\n\n  // eslint-disable-next-line @typescript-eslint/no-use-before-define\n  const onError = getAdapterOnError({\n    request,\n    requestId,\n    startTime,\n    logger,\n    resolve,\n  });\n\n  const onAbortError = ({\n    status,\n    extra,\n  }: {\n    status: ExtractAdapterStatusType<T>;\n    extra: ExtractAdapterExtraType<T>;\n  }) => {\n    logger.error({\n      title: `Abort error`,\n      type: \"request\",\n      extra: {\n        request,\n        requestId,\n      },\n    });\n    const error = internalErrorMapping(getErrorMessage(\"abort\"));\n    return onError({ error, status, extra });\n  };\n\n  const onTimeoutError = ({\n    status,\n    extra,\n  }: {\n    status: ExtractAdapterStatusType<T>;\n    extra: ExtractAdapterExtraType<T>;\n  }) => {\n    logger.error({\n      title: `Timeout error`,\n      type: \"request\",\n      extra: {\n        request,\n        requestId,\n      },\n    });\n    const error = getErrorMessage(\"timeout\");\n    return onError({ error, status, extra });\n  };\n\n  const onUnexpectedError = ({\n    status,\n    extra,\n  }: {\n    status: ExtractAdapterStatusType<T>;\n    extra: ExtractAdapterExtraType<T>;\n  }) => {\n    logger.error({\n      title: `Unexpected error`,\n      type: \"request\",\n      extra: {\n        request,\n        requestId,\n      },\n    });\n    const error = getErrorMessage();\n    return onError({ error, status, extra });\n  };\n\n  // Abort\n\n  const getAbortController = () => {\n    return requestManager.getAbortController(scopedAbortKey, requestId);\n  };\n\n  const createAbortListener = ({\n    status,\n    extra,\n    onAbort = () => {},\n  }: {\n    status: ExtractAdapterStatusType<T>;\n    extra: ExtractAdapterExtraType<T>;\n    onAbort?: () => void;\n  }) => {\n    const controller = getAbortController();\n    if (!controller) {\n      throw new RequestProcessingError(\"Controller is not found\");\n    }\n\n    const abort = () => {\n      onAbortError({ status, extra });\n      onAbort();\n      requestManager.events.emitAbort({ requestId, request });\n    };\n\n    // Instant abort when we stack many requests triggered at once, and we receive aborted controller\n    if (controller.signal.aborted) {\n      abort();\n    }\n\n    // Abort during the request\n    controller.signal.addEventListener(\"abort\", abort);\n\n    return () => controller.signal.removeEventListener(\"abort\", abort);\n  };\n\n  logger.debug({\n    title: `Mounted adapter bindings`,\n    type: \"request\",\n    extra: {\n      request,\n      requestId,\n      payload,\n      adapterOptions,\n    },\n  });\n\n  const queryParams = baseRequest.client.adapter.unstable_queryParamsMapper(request.queryParams);\n  const endpoint = baseRequest.client.adapter.unstable_endpointMapper(request.endpoint);\n  const headers = baseRequest.client.adapter.unstable_headerMapper(request);\n  const { url } = baseRequest.client;\n\n  return {\n    request,\n    requestId,\n    url,\n    endpoint,\n    queryParams,\n    payload,\n    headers,\n    adapter: baseRequest.client.adapter,\n    adapterOptions,\n    getAbortController,\n    getRequestStartTimestamp,\n    getResponseStartTimestamp,\n    createAbortListener,\n    onBeforeRequest,\n    onRequestStart,\n    onRequestProgress,\n    onRequestEnd,\n    onResponseStart,\n    onResponseProgress,\n    onResponseEnd,\n    onSuccess,\n    onAbortError,\n    onTimeoutError,\n    onUnexpectedError,\n    onError,\n  };\n};\n\nexport function getAdapterOnError<T extends AdapterInstance>({\n  request,\n  requestId,\n  startTime,\n  resolve,\n  logger,\n}: {\n  request: RequestInstance;\n  requestId: string;\n  startTime: number;\n  logger: LoggerMethods;\n  resolve: (value: ResponseSuccessType<any, T> | ResponseErrorType<any, T>) => void;\n}) {\n  const { client } = request;\n\n  return async ({\n    error,\n    status,\n    extra,\n  }: {\n    error: any;\n    status: ExtractAdapterStatusType<T>;\n    extra: ExtractAdapterExtraType<T>;\n  }): Promise<ResponseErrorType<any, T>> => {\n    let response: ResponseErrorType<any, T> = {\n      data: null,\n      status,\n      error,\n      success: false,\n      extra,\n      requestTimestamp: startTime,\n      responseTimestamp: +new Date(),\n    };\n\n    response = (await client.unstable_modifyResponse(response, request)) as typeof response;\n    response = (await client.unstable_modifyErrorResponse(response, request)) as typeof response;\n\n    client.triggerPlugins(\"onRequestError\", { response, request });\n    client.triggerPlugins(\"onRequestFinished\", { response, request });\n\n    resolve(response);\n\n    logger.error({\n      title: `Request error`,\n      type: \"request\",\n      extra: {\n        request,\n        requestId,\n        response,\n      },\n    });\n\n    return response;\n  };\n}\n","import type { getAdapterBindings, AdapterInstance } from \"adapter\";\nimport { RequestProcessingError } from \"adapter\";\nimport type { ExtractAdapterExtraType, ExtractAdapterStatusType } from \"types\";\n\nexport const mocker = async <T extends AdapterInstance>({\n  request,\n  requestId,\n  onError,\n  onResponseEnd,\n  onTimeoutError,\n  onRequestEnd,\n  createAbortListener,\n  onResponseProgress,\n  onRequestProgress,\n  onResponseStart,\n  onBeforeRequest,\n  onRequestStart,\n  onSuccess,\n  onAbortError,\n  adapter,\n}: Awaited<ReturnType<typeof getAdapterBindings<T>>>) => {\n  if (!request.unstable_mock) {\n    throw new RequestProcessingError(\"Mock should be defined when calling mocker\");\n  }\n\n  let thrown = false;\n\n  const {\n    requestTime = 20,\n    responseTime = 20,\n    totalUploaded = 1000,\n    totalDownloaded = 1000,\n    timeout,\n  } = request.unstable_mock.config;\n  const result = await request.unstable_mock.fn({ request, requestId });\n\n  const { data, error, status, success = true, extra = request.client.adapter.defaultExtra } = result;\n\n  createAbortListener({\n    status: adapter.systemErrorStatus,\n    extra: adapter.systemErrorExtra,\n    onAbort: () => {\n      thrown = true;\n    },\n  });\n\n  onBeforeRequest();\n  onRequestStart();\n\n  const progress = (\n    totalTime: number,\n    totalSize: number,\n    progressFunction: typeof onResponseProgress | typeof onRequestProgress,\n  ) =>\n    new Promise((resolveProgress) => {\n      if (thrown) {\n        resolveProgress(true);\n        return;\n      }\n\n      const interval = 20;\n      const dataStart = +new Date();\n      const intervals = Math.ceil(totalTime / interval);\n      const chunkSize = Math.ceil(totalSize / intervals);\n      let currentlyLoaded = 0;\n      const timer = setInterval(function handleProgressInterval() {\n        if (thrown) {\n          resolveProgress(true);\n          clearInterval(timer);\n        }\n\n        const currentTime = Math.min(totalTime, +new Date() - dataStart);\n        currentlyLoaded += currentlyLoaded + chunkSize >= totalSize ? totalSize - currentlyLoaded : chunkSize;\n        progressFunction({\n          total: totalSize,\n          loaded: currentTime >= totalTime ? totalSize : currentlyLoaded,\n        });\n\n        if (currentTime >= totalTime) {\n          resolveProgress(true);\n          clearInterval(timer);\n        }\n      }, interval);\n    });\n\n  if (typeof timeout === \"number\") {\n    setTimeout(() => {\n      thrown = true;\n      onTimeoutError({\n        status: 0 as ExtractAdapterStatusType<T>,\n        extra: extra as ExtractAdapterExtraType<T>,\n      });\n    }, timeout);\n  }\n  if (!thrown) {\n    await progress(requestTime, totalUploaded, onRequestProgress);\n  }\n  if (!thrown) {\n    onRequestEnd();\n    onResponseStart();\n  }\n  if (!thrown) {\n    await progress(responseTime, totalDownloaded, onResponseProgress);\n  }\n  if (thrown) {\n    onAbortError({\n      status: adapter.systemErrorStatus,\n      extra: adapter.systemErrorExtra,\n    });\n  } else if (success || (error && data)) {\n    onSuccess({\n      data,\n      error,\n      status: status as ExtractAdapterStatusType<T>,\n      extra: extra as ExtractAdapterExtraType<T>,\n    });\n  } else {\n    onError({\n      error,\n      status: status as ExtractAdapterStatusType<T>,\n      extra: extra as ExtractAdapterExtraType<T>,\n    });\n  }\n  if (!thrown) {\n    onResponseEnd();\n  }\n};\n","/* eslint-disable class-methods-use-this */\nimport type { EmptyTypes, ExtendRequest } from \"types\";\nimport { getAdapterOnError, getAdapterBindings } from \"./adapter.bindings\";\nimport type {\n  EndpointMapper,\n  AdapterFetcherType,\n  AdapterPayloadMappingType,\n  HeaderMappingType,\n  QueryParamsMapper,\n  QueryParamsType,\n  RequestResponseType,\n  ResponseType,\n} from \"./adapter.types\";\nimport type { RequestInstance, RequestOptionsType } from \"request\";\nimport type { Client, ClientInstance } from \"client\";\nimport { mocker } from \"mocker\";\nimport type { LoggerMethods } from \"managers\";\nimport type { getErrorMessage } from \"./adapter.utils\";\nimport { getAdapterHeaders, getAdapterPayload, RequestProcessingError } from \"./adapter.utils\";\n\nexport type DefaultMapperType = <V, C>(value: V, config: C) => V;\nexport const defaultMapper: DefaultMapperType = (value) => value;\n\nexport class Adapter<\n  AdapterOptions,\n  MethodType extends string,\n  StatusType extends number | string,\n  Extra extends Record<string, any>,\n  QueryParams = QueryParamsType | string | EmptyTypes,\n  DefaultQueryParams = undefined,\n  EndpointType = string,\n  EndpointMapperType extends EndpointMapper<EndpointType> | DefaultMapperType = DefaultMapperType,\n  QueryParamsMapperType extends QueryParamsMapper<QueryParams> | DefaultMapperType = DefaultMapperType,\n  HeaderMapperType extends HeaderMappingType | DefaultMapperType = DefaultMapperType,\n  PayloadMapperType extends AdapterPayloadMappingType | DefaultMapperType = DefaultMapperType,\n> {\n  /** Fetching function */\n  public unstable_fetcher: AdapterFetcherType<\n    Adapter<\n      AdapterOptions,\n      MethodType,\n      StatusType,\n      Extra,\n      QueryParams,\n      DefaultQueryParams,\n      EndpointType,\n      EndpointMapperType,\n      QueryParamsMapperType,\n      HeaderMapperType,\n      PayloadMapperType\n    >\n  >;\n\n  /**\n   * ********************\n   * Defaults\n   * ********************\n   */\n\n  public name: string;\n  public defaultMethod: MethodType;\n  public defaultExtra: Extra;\n  public systemErrorStatus: StatusType;\n  public systemErrorExtra: Extra;\n  public defaultRequestOptions?: RequestOptionsType<EndpointType, AdapterOptions, MethodType>;\n  public logger: LoggerMethods;\n  public initialized = false;\n  public client: ClientInstance;\n\n  public unstable_onInitializeCallback?: (options: { client: ClientInstance }) => void;\n\n  public unstable_queryParamsMapperConfig: Parameters<QueryParamsMapperType>[1];\n  public unstable_headerMapperConfig: Parameters<HeaderMapperType>[1];\n  public unstable_payloadMapperConfig: Parameters<PayloadMapperType>[1];\n  public unstable_endpointMapperConfig: Parameters<EndpointMapperType>[1];\n\n  constructor(\n    public options: {\n      name: string;\n      defaultMethod: MethodType;\n      defaultExtra: Extra;\n      systemErrorStatus: StatusType;\n      systemErrorExtra: Extra;\n      defaultRequestOptions?: RequestOptionsType<EndpointType, AdapterOptions, MethodType>;\n    },\n  ) {\n    this.name = options.name;\n    this.defaultMethod = options.defaultMethod;\n    this.defaultExtra = options.defaultExtra;\n    this.systemErrorStatus = options.systemErrorStatus;\n    this.systemErrorExtra = options.systemErrorExtra;\n    this.defaultRequestOptions = options.defaultRequestOptions;\n  }\n\n  initialize = (client: ClientInstance) => {\n    this.logger = client.loggerManager.initialize(client, \"Adapter\");\n    this.initialized = true;\n    this.client = client;\n\n    this.unstable_onInitializeCallback?.({ client });\n    return this;\n  };\n\n  onInitialize = (callback: (options: { client: ClientInstance }) => void) => {\n    this.unstable_onInitializeCallback = callback;\n    return this;\n  };\n\n  /**\n   * ********************\n   * Options Setters\n   * ********************\n   */\n\n  public unstable_internalErrorMapping: (error: ReturnType<typeof getErrorMessage>) => any = (error) => error;\n  /** Method to get default headers and to map them based on the data format exchange, by default it handles FormData / JSON formats. */\n  public unstable_headerMapper: HeaderMapperType = getAdapterHeaders as HeaderMapperType;\n  /** Method to get request data and transform them to the required format. It handles FormData and JSON by default. */\n  public unstable_payloadMapper: PayloadMapperType = getAdapterPayload as PayloadMapperType;\n  /** Method to get the endpoint for the adapter request. */\n  public unstable_endpointMapper: EndpointMapperType = defaultMapper as EndpointMapperType;\n  /** Method to get request data and transform them to the required format.  */\n  public unstable_queryParamsMapper: QueryParamsMapperType = defaultMapper as QueryParamsMapperType;\n  /** Get default adapter options for the request. */\n  public unstable_getAdapterDefaults?: (\n    request: ExtendRequest<\n      RequestInstance,\n      {\n        client: Client<\n          any,\n          Adapter<\n            AdapterOptions,\n            MethodType,\n            StatusType,\n            Extra,\n            QueryParams,\n            DefaultQueryParams,\n            EndpointType,\n            EndpointMapperType,\n            QueryParamsMapperType,\n            HeaderMapperType,\n            PayloadMapperType\n          >\n        >;\n      }\n    >,\n  ) => AdapterOptions;\n  /** Get default request options for the request. */\n  public unstable_getRequestDefaults?: (\n    options: RequestOptionsType<EndpointType, AdapterOptions, MethodType>,\n  ) => Partial<RequestOptionsType<EndpointType, AdapterOptions, MethodType>>;\n  /**\n   * Get formatted endpoint name of the request.\n   * Helpful in displaying long endpoints like in case of graphql schemas etc.\n   */\n  public unstable_devtoolsEndpointGetter: (endpoint: string) => string = (endpoint) => endpoint;\n\n  /**\n   * ********************\n   * Methods\n   * ********************\n   */\n\n  setDefaultMethod = (method: MethodType) => {\n    this.defaultMethod = method;\n    return this;\n  };\n\n  setDefaultExtra = (extra: Extra) => {\n    this.defaultExtra = extra;\n    return this;\n  };\n\n  setDevtoolsEndpointGetter = (callback: (endpoint: string) => string) => {\n    this.unstable_devtoolsEndpointGetter = callback;\n    return this;\n  };\n\n  /**\n   * This method allows to configure global defaults for the request configuration like method, auth, deduplication etc.\n   */\n  setRequestDefaults = (callback: typeof this.unstable_getRequestDefaults): this => {\n    this.unstable_getRequestDefaults = callback;\n    return this;\n  };\n\n  /**\n   * Set the adapter default options added to every sent request\n   */\n  setAdapterDefaults = (\n    callback: (\n      request: ExtendRequest<\n        RequestInstance,\n        {\n          // No need for global error type, because we haven't sent the request yet\n          client: Client<\n            any,\n            Adapter<\n              AdapterOptions,\n              MethodType,\n              StatusType,\n              Extra,\n              QueryParams,\n              DefaultQueryParams,\n              EndpointType,\n              EndpointMapperType,\n              QueryParamsMapperType,\n              HeaderMapperType,\n              PayloadMapperType\n            >\n          >;\n        }\n      >,\n    ) => AdapterOptions,\n  ): this => {\n    this.unstable_getAdapterDefaults = callback;\n    return this;\n  };\n\n  setInternalErrorMapping = (callback: (error: ReturnType<typeof getErrorMessage>) => any) => {\n    this.unstable_internalErrorMapping = callback;\n    return this;\n  };\n\n  /**\n   * Set the custom header mapping function\n   */\n  setHeaderMapper = <NewMapper extends HeaderMappingType>(headerMapper: NewMapper) => {\n    this.unstable_headerMapper = ((req: Parameters<NewMapper>[0]) =>\n      headerMapper(req, this.unstable_headerMapperConfig as Parameters<NewMapper>[1])) as unknown as HeaderMapperType;\n    return this as unknown as Adapter<\n      AdapterOptions,\n      MethodType,\n      StatusType,\n      Extra,\n      QueryParams,\n      DefaultQueryParams,\n      EndpointType,\n      EndpointMapperType,\n      QueryParamsMapperType,\n      NewMapper,\n      PayloadMapperType\n    >;\n  };\n\n  /**\n   * Set the request payload mapping function which gets triggered before request is send\n   */\n  setPayloadMapper = <NewMapper extends AdapterPayloadMappingType>(payloadMapper: NewMapper) => {\n    this.unstable_payloadMapper = ((req: Parameters<NewMapper>[0]) =>\n      payloadMapper(\n        req,\n        this.unstable_payloadMapperConfig as Parameters<NewMapper>[1],\n      )) as unknown as PayloadMapperType;\n    return this as unknown as Adapter<\n      AdapterOptions,\n      MethodType,\n      StatusType,\n      Extra,\n      QueryParams,\n      DefaultQueryParams,\n      EndpointType,\n      EndpointMapperType,\n      QueryParamsMapperType,\n      HeaderMapperType,\n      NewMapper\n    >;\n  };\n\n  /**\n   * Set the request payload mapping function which get triggered before request get sent\n   */\n  setEndpointMapper = <NewEndpointMapper extends EndpointMapper<EndpointType>>(endpointMapper: NewEndpointMapper) => {\n    this.unstable_endpointMapper = ((endpoint: Parameters<NewEndpointMapper>[0]) =>\n      endpointMapper(\n        endpoint,\n        this.unstable_endpointMapperConfig as Parameters<NewEndpointMapper>[1],\n      )) as unknown as EndpointMapperType;\n    return this as unknown as Adapter<\n      AdapterOptions,\n      MethodType,\n      StatusType,\n      Extra,\n      QueryParams,\n      DefaultQueryParams,\n      EndpointType,\n      NewEndpointMapper,\n      QueryParamsMapperType,\n      HeaderMapperType,\n      PayloadMapperType\n    >;\n  };\n\n  /**\n   * Set the query params mapping function which get triggered before request get sent\n   */\n  setQueryParamsMapper = <NewQueryParamsMapper extends QueryParamsMapper<QueryParams>>(\n    queryParamsMapper: NewQueryParamsMapper,\n  ) => {\n    this.unstable_queryParamsMapper = ((queryParams: Parameters<NewQueryParamsMapper>[0]) =>\n      queryParamsMapper(\n        queryParams,\n        this.unstable_queryParamsMapperConfig as Parameters<NewQueryParamsMapper>[1],\n      )) as unknown as QueryParamsMapperType;\n    return this as unknown as Adapter<\n      AdapterOptions,\n      MethodType,\n      StatusType,\n      Extra,\n      QueryParams,\n      DefaultQueryParams,\n      EndpointType,\n      EndpointMapperType,\n      NewQueryParamsMapper,\n      HeaderMapperType,\n      PayloadMapperType\n    >;\n  };\n\n  setQueryParamsMapperConfig = <NewQueryParamsMapperConfig extends Parameters<QueryParamsMapperType>[1]>(\n    config: NewQueryParamsMapperConfig,\n  ) => {\n    this.unstable_queryParamsMapperConfig = config;\n    return this;\n  };\n\n  setHeaderMapperConfig = <NewHeaderMapperConfig extends Parameters<HeaderMapperType>[1]>(\n    config: NewHeaderMapperConfig,\n  ) => {\n    this.unstable_headerMapperConfig = config;\n    return this;\n  };\n\n  setEndpointMapperConfig = <NewEndpointMapperConfig extends Parameters<EndpointMapperType>[1]>(\n    config: NewEndpointMapperConfig,\n  ) => {\n    this.unstable_endpointMapperConfig = config;\n    return this;\n  };\n\n  setPayloadMapperConfig = <NewPayloadMapperConfig extends Parameters<PayloadMapperType>[1]>(\n    config: NewPayloadMapperConfig,\n  ) => {\n    this.unstable_payloadMapperConfig = config;\n    return this;\n  };\n\n  /**\n   * ********************\n   * Fetching\n   * ********************\n   */\n\n  public setFetcher(\n    fetcher: AdapterFetcherType<\n      Adapter<\n        AdapterOptions,\n        MethodType,\n        StatusType,\n        Extra,\n        QueryParams,\n        DefaultQueryParams,\n        EndpointType,\n        EndpointMapperType,\n        QueryParamsMapperType,\n        HeaderMapperType,\n        PayloadMapperType\n      >\n    >,\n  ) {\n    this.unstable_fetcher = fetcher.bind(this);\n    return this;\n  }\n\n  public async fetch(\n    request: ExtendRequest<\n      RequestInstance,\n      {\n        // No need for global error type, it doesn't matter to the fetcher itself\n        client: Client<\n          any,\n          Adapter<\n            AdapterOptions,\n            MethodType,\n            StatusType,\n            Extra,\n            QueryParams,\n            DefaultQueryParams,\n            EndpointType,\n            EndpointMapperType,\n            QueryParamsMapperType,\n            HeaderMapperType,\n            PayloadMapperType\n          >\n        >;\n      }\n    >,\n    requestId: string,\n  ): Promise<RequestResponseType<RequestInstance>> {\n    let startTime: number | undefined;\n\n    const execute = async (resolve: (value: ResponseType<any, any, any>) => void) => {\n      try {\n        if (!this.initialized) {\n          throw new RequestProcessingError(`Adapter ${this.options.name} is not initialized`);\n        }\n\n        if (!this.unstable_fetcher) {\n          throw new RequestProcessingError(`Fetcher for ${this.options.name} adapter is not set`);\n        }\n\n        this.client.triggerPlugins(\"onAdapterFetch\", {\n          adapter: this,\n          request,\n          requestId,\n        });\n\n        const bindings = await getAdapterBindings<\n          Adapter<\n            AdapterOptions,\n            MethodType,\n            StatusType,\n            Extra,\n            QueryParams,\n            DefaultQueryParams,\n            EndpointType,\n            EndpointMapperType,\n            QueryParamsMapperType,\n            HeaderMapperType,\n            PayloadMapperType\n          >\n        >({\n          request,\n          requestId,\n          resolve,\n          internalErrorMapping: this.unstable_internalErrorMapping,\n          onStartTime: (time) => {\n            startTime = time;\n          },\n        });\n\n        if (request.unstable_mock && request.isMockerEnabled && request.client.isMockerEnabled) {\n          return await mocker<\n            Adapter<\n              AdapterOptions,\n              MethodType,\n              StatusType,\n              Extra,\n              QueryParams,\n              DefaultQueryParams,\n              EndpointType,\n              EndpointMapperType,\n              QueryParamsMapperType,\n              HeaderMapperType,\n              PayloadMapperType\n            >\n          >(bindings);\n        }\n\n        return this.unstable_fetcher(bindings);\n      } catch (error) {\n        const onError = getAdapterOnError({\n          request,\n          requestId,\n          startTime: startTime || Date.now(),\n          logger: this.logger,\n          resolve,\n        });\n\n        return onError({\n          error: this.unstable_internalErrorMapping(error as ReturnType<typeof getErrorMessage>),\n          status: this.options.systemErrorStatus,\n          extra: this.options.systemErrorExtra,\n        });\n      }\n    };\n\n    const promise = new Promise((resolve) => {\n      execute(resolve);\n    });\n\n    return promise as Promise<RequestResponseType<RequestInstance>>;\n  }\n}\n","import type { QueryParamsType, QueryParamType, QueryParamValuesType } from \"adapter\";\nimport { getErrorMessage } from \"adapter\";\nimport type { RequestInstance } from \"request\";\nimport type { ExtractErrorType, EmptyTypes } from \"types\";\nimport type { BufferEncoding, QueryStringifyOptionsType } from \"./http-adapter.types\";\nimport { stringifyDefaultOptions } from \"client\";\n\n// Utils\n\nexport const getResponseHeaders = (headersString: string): Record<string, string> => {\n  const arr = headersString.trim().split(/[\\r\\n]+/);\n\n  const headers: Record<string, string> = {};\n  arr.forEach((line) => {\n    const parts = line.split(\": \");\n    const header = parts.shift();\n    const value = parts.join(\": \");\n    if (header) {\n      headers[header] = value;\n    }\n  });\n\n  return headers;\n};\n\n// Responses\n\nexport const parseResponse = (response: string | unknown) => {\n  try {\n    return JSON.parse(response as string);\n  } catch (err) {\n    return response;\n  }\n};\n\nexport const handleResponse = (responseChunks: any[], responseType: string, responseEncoding: BufferEncoding) => {\n  const bufferedResponse = Buffer.concat(responseChunks);\n  switch (responseType) {\n    case \"arraybuffer\":\n      return bufferedResponse;\n    case \"json\":\n      return parseResponse(bufferedResponse.toString(responseEncoding));\n    default:\n      return bufferedResponse.toString(responseEncoding);\n  }\n};\n\nexport const parseErrorResponse = <T extends RequestInstance>(response: unknown): ExtractErrorType<T> => {\n  return response ? parseResponse(response) : (getErrorMessage() as ExtractErrorType<T>);\n};\n\n// Stringify\n\nconst isValidValue = (options: QueryStringifyOptionsType) => {\n  return (value: QueryParamType) => {\n    const { skipNull, skipEmptyString } = options;\n\n    if (skipEmptyString && value === undefined) {\n      return false;\n    }\n    if (skipEmptyString && value === \"\") {\n      return false;\n    }\n    if (skipNull && value === null) {\n      return false;\n    }\n    return true;\n  };\n};\n\nconst encodeValue = (\n  value: string,\n  { encode, strict }: Pick<QueryStringifyOptionsType, \"encode\" | \"strict\">,\n): string => {\n  if (encode && strict) {\n    return encodeURIComponent(value).replace(/[!'()*]/g, (s) => `%${s.charCodeAt(0).toString(16).toUpperCase()}`);\n  }\n  if (encode) {\n    return encodeURIComponent(value);\n  }\n  return value;\n};\n\nconst encodeParams = (key: string, value: QueryParamType, options: QueryStringifyOptionsType) => {\n  const shouldSkip = !isValidValue(options)(value);\n\n  if (!key || shouldSkip) {\n    return \"\";\n  }\n\n  const parsedValue = () => {\n    if (value instanceof Date) {\n      return options.dateParser?.(value) || value.toISOString();\n    }\n\n    if (typeof value === \"object\" && !Array.isArray(value)) {\n      return options.objectParser?.(value) || JSON.stringify(value);\n    }\n\n    return String(value);\n  };\n\n  return `${encodeValue(key, options)}=${encodeValue(parsedValue(), options)}`;\n};\n\nconst encodeArray = (key: string, array: Array<QueryParamValuesType>, options: QueryStringifyOptionsType): string => {\n  const { arrayFormat, arraySeparator } = options;\n\n  return array\n    .filter(isValidValue(options))\n    .reduce<string[]>((acc, value, index) => {\n      switch (arrayFormat) {\n        case \"index\": {\n          const keyValue = `${encodeValue(key, options)}[${encodeValue(String(index), options)}]=`;\n          acc.push(`${keyValue}${encodeValue(String(value), options)}`);\n          break;\n        }\n        case \"bracket\": {\n          const keyValue = `${encodeValue(key, options)}[]=`;\n          acc.push(`${keyValue}${encodeValue(String(value), options)}`);\n          break;\n        }\n        case \"comma\": {\n          const keyValue = (!acc.length && `${encodeValue(key, options)}=`) || \"\";\n          return [[...acc, `${keyValue}${encodeValue(String(value), options)}`].join(\",\")];\n        }\n        case \"separator\": {\n          const keyValue = (!acc.length && `${encodeValue(key, options)}=`) || \"\";\n          return [[...acc, `${keyValue}${encodeValue(String(value), options)}`].join(arraySeparator || \"|\")];\n        }\n        case \"bracket-separator\": {\n          const keyValue = (!acc.length && `${encodeValue(key, options)}[]=`) || \"\";\n          return [[...acc, `${keyValue}${encodeValue(String(value), options)}`].join(arraySeparator || \"|\")];\n        }\n        default: {\n          const keyValue = `${encodeValue(key, options)}=`;\n          acc.push(`${keyValue}${encodeValue(String(value), options)}`);\n        }\n      }\n\n      return acc;\n    }, [])\n    .join(\"&\");\n};\n\nexport const stringifyQueryParams = (\n  queryParams: QueryParamsType | string | EmptyTypes,\n  options: QueryStringifyOptionsType = stringifyDefaultOptions,\n): string => {\n  if (!queryParams || !Object.keys(queryParams).length) {\n    return \"\";\n  }\n\n  if (typeof queryParams === \"string\") {\n    const hasQuestionMark = queryParams[0] === \"?\";\n    return hasQuestionMark ? queryParams : `?${queryParams}`;\n  }\n\n  const stringified = Object.entries(queryParams)\n    .map(([key, value]): string => {\n      if (Array.isArray(value)) {\n        return encodeArray(key, value, options);\n      }\n\n      return encodeParams(key, value, options);\n    })\n    .filter(Boolean)\n    .join(\"&\");\n\n  if (stringified) {\n    return `?${stringified}`;\n  }\n  return \"\";\n};\n","import { Time } from \"constants/time.constants\";\nimport type { HttpAdapterExtraType } from \"./http-adapter.types\";\n\nexport const defaultTimeout = Time.SEC * 5;\n\nexport const xhrExtra: HttpAdapterExtraType = {\n  headers: {},\n};\n","import { Adapter } from \"../adapter/adapter\";\nimport { HttpMethods } from \"constants/http.constants\";\nimport type { HttpMethodsType, HttpStatusType } from \"types\";\nimport type { QueryParamsType } from \"adapter\";\nimport type { HttpAdapterExtraType, FetchAdapterOptionsType } from \"./http-adapter.types\";\nimport { parseErrorResponse, parseResponse, stringifyQueryParams } from \"./http-adapter.utils\";\nimport { defaultTimeout, xhrExtra } from \"./http-adapter.constants\";\n\nconst defaultExtra = xhrExtra;\n\nexport const getAdapter = () =>\n  new Adapter<\n    FetchAdapterOptionsType,\n    HttpMethodsType,\n    HttpStatusType,\n    HttpAdapterExtraType,\n    QueryParamsType | string | null,\n    undefined,\n    string\n  >({\n    name: \"http\",\n    defaultMethod: HttpMethods.GET,\n    defaultExtra,\n    systemErrorStatus: 0 as number,\n    systemErrorExtra: defaultExtra,\n  })\n    .setQueryParamsMapper(stringifyQueryParams)\n    .setFetcher(\n      async ({\n        request,\n        adapterOptions,\n        headers,\n        payload,\n        onError,\n        onResponseEnd,\n        onTimeoutError,\n        onRequestEnd,\n        createAbortListener,\n        getAbortController,\n        onResponseProgress,\n        onResponseStart,\n        onBeforeRequest,\n        onRequestStart,\n        onRequestProgress,\n        onSuccess,\n      }) => {\n        const { method, client, endpoint, queryParams } = request;\n        const queryString = queryParams ? stringifyQueryParams(queryParams) : \"\";\n        const fullUrl = `${client.url}${endpoint}${queryString}`;\n\n        const controller = getAbortController();\n        const { timeout: timeoutMs = defaultTimeout, streaming = false, ...restOptions } = adapterOptions || {};\n\n        let timedOut = false;\n        let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n        // Abort listener handles user-initiated aborts (e.g. request.abort())\n        // For fetch, onAbort is a no-op since the signal is already passed to fetch()\n        const unmountListener = createAbortListener({\n          status: 0,\n          extra: defaultExtra,\n        });\n\n        if (timeoutMs > 0 && controller) {\n          timeoutId = setTimeout(() => {\n            timedOut = true;\n            unmountListener();\n            controller.abort();\n          }, timeoutMs);\n        }\n\n        onBeforeRequest();\n        onRequestStart();\n\n        try {\n          const init: RequestInit = {\n            method,\n            headers: headers as Record<string, string>,\n            signal: controller?.signal,\n            ...restOptions,\n          };\n\n          if (payload && method !== \"GET\" && method !== \"HEAD\") {\n            init.body = payload as BodyInit;\n\n            if (typeof payload === \"string\") {\n              const total = new Blob([payload]).size;\n              onRequestProgress({ total, loaded: total } as ProgressEvent);\n            }\n          }\n\n          onRequestEnd();\n\n          const response = await fetch(fullUrl, init);\n\n          if (timeoutId) clearTimeout(timeoutId);\n\n          onResponseStart();\n\n          const responseHeaders: Record<string, string> = {};\n          response.headers.forEach((value, key) => {\n            responseHeaders[key] = value;\n          });\n          const extra: HttpAdapterExtraType = { headers: responseHeaders };\n          const { status } = response;\n\n          if (streaming && response.body) {\n            onResponseEnd();\n            unmountListener();\n\n            if (response.ok) {\n              onSuccess({ data: response.body as any, status, extra });\n            } else {\n              const errorBody = await response.text();\n              const error = parseErrorResponse(errorBody);\n              onError({ error, status, extra });\n            }\n          } else {\n            let body: string;\n\n            if (response.body && typeof response.body.getReader === \"function\") {\n              const reader = response.body.getReader();\n              const contentLength = parseInt(response.headers.get(\"content-length\") || \"0\", 10);\n              let receivedLength = 0;\n              const chunks: Uint8Array[] = [];\n\n              // eslint-disable-next-line no-constant-condition\n              while (true) {\n                // eslint-disable-next-line no-await-in-loop\n                const { done, value } = await reader.read();\n                if (done) break;\n                chunks.push(value);\n                receivedLength += value.length;\n                onResponseProgress({ total: contentLength || receivedLength, loaded: receivedLength } as ProgressEvent);\n              }\n\n              const allChunks = new Uint8Array(receivedLength);\n              let position = 0;\n              // eslint-disable-next-line no-restricted-syntax\n              for (const chunk of chunks) {\n                allChunks.set(chunk, position);\n                position += chunk.length;\n              }\n              body = new TextDecoder().decode(allChunks);\n            } else {\n              body = await response.text();\n            }\n\n            onResponseEnd();\n            unmountListener();\n\n            if (response.ok) {\n              const data = parseResponse(body);\n              onSuccess({ data, status, extra });\n            } else {\n              const error = parseErrorResponse(body);\n              onError({ error, status, extra });\n            }\n          }\n        } catch (err: any) {\n          if (timeoutId) clearTimeout(timeoutId);\n          unmountListener();\n\n          if (controller?.signal?.aborted) {\n            if (timedOut) {\n              onTimeoutError({ status: 0, extra: defaultExtra });\n            }\n            return;\n          }\n\n          onError({ error: err, status: 0, extra: defaultExtra });\n        }\n      },\n    );\n","import { getAdapter } from \"./http-adapter.fetch\";\nimport type { HttpAdapterType } from \"http-adapter/http-adapter.types\";\n\nexport const HttpAdapter = (): HttpAdapterType => {\n  return getAdapter();\n};\n","import type { AdapterInstance, ResponseType } from \"adapter\";\nimport type { ResponseDetailsType, LoggerMethods } from \"managers\";\nimport type { ClientInstance } from \"client\";\nimport type {\n  CacheOptionsType,\n  CacheAsyncStorageType,\n  CacheStorageType,\n  CacheValueType,\n  CacheSetState,\n  RequestCacheType,\n} from \"cache\";\nimport { getCacheData, getCacheEvents } from \"cache\";\nimport type { RequestInstance } from \"request\";\nimport { Request, scopeKey } from \"request\";\nimport type { ExtractAdapterType, ExtractErrorType, ExtractResponseType } from \"types\";\nimport { EventEmitter } from \"utils\";\n\n/**\n * Cache class handles the data exchange with the dispatchers.\n *\n * @note\n * Keys used to save the values are created dynamically on the Request class\n *\n */\nexport class Cache<Adapter extends AdapterInstance> {\n  public emitter = new EventEmitter();\n  public events: ReturnType<typeof getCacheEvents>;\n\n  public storage: CacheStorageType;\n  public lazyStorage?: CacheAsyncStorageType;\n  public version: string;\n  public garbageCollectors = new Map<string, ReturnType<typeof setTimeout>>();\n  private logger: LoggerMethods;\n  private client: ClientInstance<{ adapter: Adapter }>;\n\n  constructor(public options?: CacheOptionsType) {\n    const { storage = new Map<string, CacheValueType>(), lazyStorage, version = \"0.0.1\" } = options ?? {};\n\n    this.emitter?.setMaxListeners(1000);\n    this.events = getCacheEvents(this.emitter);\n\n    this.storage = storage;\n    this.version = version;\n    this.lazyStorage = lazyStorage;\n  }\n\n  initialize = (client: ClientInstance<{ adapter: Adapter }>) => {\n    this.client = client;\n    this.logger = client.loggerManager.initialize(client, \"Cache\");\n\n    // Going back from offline should re-trigger garbage collection\n    client.appManager.events.onOnline(() => {\n      [...this.storage.keys()].forEach(this.scheduleGarbageCollector);\n    });\n\n    [...this.storage.keys()].forEach(this.scheduleGarbageCollector);\n\n    return this;\n  };\n\n  /**\n   * Set the cache data to the storage\n   * @param request\n   * @param response\n   * @returns\n   */\n  set = <Request extends RequestCacheType<RequestInstance>>(\n    request: Request,\n    response: CacheSetState<\n      ResponseType<ExtractResponseType<Request>, ExtractErrorType<Request>, ExtractAdapterType<Request>> &\n        ResponseDetailsType\n    > & { hydrated?: boolean },\n  ): void => {\n    this.logger.debug({ title: \"Processing cache response\", type: \"system\", extra: { request, response } });\n    const { cacheKey, cache, staleTime, cacheTime, scope } = request;\n    const storageKey = scopeKey(cacheKey, scope);\n    const previousCacheData = this.storage.get<\n      ExtractResponseType<Request>,\n      ExtractErrorType<Request>,\n      ExtractAdapterType<Request>\n    >(storageKey);\n\n    // Once refresh error occurs we don't want to override already valid data in our cache with the thrown error\n    // We need to check it against cache and return last valid data we have\n    const processedResponse = typeof response === \"function\" ? response(previousCacheData || null) : response;\n    const data = getCacheData(previousCacheData, processedResponse);\n\n    const newCacheData: CacheValueType<any, any, ExtractAdapterType<Request>> = {\n      ...data,\n      scope,\n      staleTime,\n      version: this.version,\n      cacheKey,\n      cacheTime,\n      cached: !!request.cache,\n    };\n\n    const isServerMode = this.client.mode === \"server\";\n    const isCachingAllowed = cache && (!isServerMode || !!(request as any).scope);\n\n    // Only success data is valid for the cache store\n    if (processedResponse.success && isCachingAllowed) {\n      this.logger.debug({ title: \"Saving response to cache storage\", type: \"system\", extra: { request, data } });\n      this.storage.set<Response, Error, ExtractAdapterType<Request>>(storageKey, newCacheData);\n      this.lazyStorage?.set<Response, Error, ExtractAdapterType<Request>>(storageKey, newCacheData);\n      this.client.triggerPlugins(\"onCacheItemChange\", {\n        cache: this,\n        cacheKey,\n        prevData: (previousCacheData || null) as CacheValueType<any, any, AdapterInstance>,\n        newData: newCacheData as CacheValueType<any, any, AdapterInstance>,\n      });\n\n      this.scheduleGarbageCollector(storageKey);\n    } else {\n      // If request should not use cache - just emit response data\n      this.logger.debug({ title: \"Prevented saving response to cache\", type: \"system\", extra: { request, data } });\n    }\n\n    this.logger.debug({ title: \"Emitting cache response\", type: \"system\", extra: { request, data } });\n    this.events.emitCacheData<ExtractResponseType<Request>, ExtractErrorType<Request>, ExtractAdapterType<Request>>(\n      newCacheData,\n    );\n  };\n\n  /**\n   * Update the cache data with partial response data\n   * @param request\n   * @param partialResponse\n   * @param isTriggeredExtrenally - informs whether an update was triggered due to internal logic or externally, e.g.\n   * via plugin.\n   * @returns\n   */\n  update = <Request extends RequestCacheType<RequestInstance>>(\n    request: Request,\n    partialResponse: CacheSetState<\n      Partial<\n        ResponseType<ExtractResponseType<Request>, ExtractErrorType<Request>, ExtractAdapterType<Request>> &\n          ResponseDetailsType\n      >\n    >,\n  ): void => {\n    this.logger.debug({ title: \"Processing cache update\", type: \"system\", extra: { request, partialResponse } });\n    const { cacheKey, scope } = request;\n    const storageKey = scopeKey(cacheKey, scope);\n    const cachedData = this.storage.get<\n      ExtractResponseType<Request>,\n      ExtractErrorType<Request>,\n      ExtractAdapterType<Request>\n    >(storageKey);\n\n    const processedResponse =\n      typeof partialResponse === \"function\" ? partialResponse(cachedData || null) : partialResponse;\n    if (cachedData) {\n      this.set(request, { ...cachedData, ...processedResponse });\n    }\n  };\n\n  /**\n   * Get particular record from storage by cacheKey. It will trigger lazyStorage to emit lazy load event for reading it's data.\n   * @param cacheKey\n   * @returns\n   */\n  get = <Response, Error>(cacheKey: string): CacheValueType<Response, Error, Adapter> | undefined => {\n    this.getLazyResource<Response, Error>(cacheKey);\n    const cachedData = this.storage.get<Response, Error, Adapter>(cacheKey);\n    return cachedData;\n  };\n\n  /**\n   * Get sync storage keys, lazyStorage keys will not be included\n   * @returns\n   */\n  keys = (): string[] => {\n    const values = this.storage.keys();\n\n    return Array.from(values);\n  };\n\n  /**\n   * Delete record from storages and trigger invalidation event\n   * @param cacheKey\n   */\n  delete = (cacheKey: string): void => {\n    this.logger.debug({ title: \"Deleting cache element\", type: \"system\", extra: { cacheKey } });\n    this.storage.delete(cacheKey);\n    this.lazyStorage?.delete(cacheKey);\n\n    this.client.triggerPlugins(\"onCacheItemDelete\", {\n      cache: this,\n      cacheKey,\n    });\n\n    this.events.emitDelete(cacheKey);\n  };\n\n  /**\n   * Invalidate cache by cacheKey or partial matching with RegExp\n   * It emits invalidation event for each matching cacheKey and sets staleTime to 0 to indicate out of time cache\n   * @param key - cacheKey or Request instance or RegExp for partial matching\n   */\n  invalidate = (cacheKeys: string | RegExp | RequestInstance | Array<string | RegExp | RequestInstance>) => {\n    this.logger.debug({ title: \"Revalidating cache element\", type: \"system\", extra: { cacheKeys } });\n\n    const onInvalidate = (key: string | RegExp | RequestInstance) => {\n      const keys = Array.from(this.storage.keys());\n      const handleInvalidation = (invalidateStorageKey: string, notifyCacheKey: string = invalidateStorageKey) => {\n        const value = this.storage.get(invalidateStorageKey);\n        if (value) {\n          this.storage.set(invalidateStorageKey, { ...value, staleTime: 0 });\n        }\n\n        this.client.triggerPlugins(\"onCacheItemInvalidate\", {\n          cache: this,\n          cacheKey: notifyCacheKey,\n        });\n\n        this.events.emitInvalidation(notifyCacheKey);\n      };\n\n      if (key instanceof Request) {\n        handleInvalidation(scopeKey(key.cacheKey, key.scope), key.cacheKey);\n      } else if (typeof key === \"string\") {\n        handleInvalidation(key);\n      } else if (keys.length) {\n        keys.forEach((entityKey) => {\n          if (key.test(entityKey)) {\n            handleInvalidation(entityKey);\n          }\n        });\n      }\n    };\n\n    if (Array.isArray(cacheKeys)) {\n      cacheKeys.forEach(onInvalidate.bind(this));\n    } else {\n      onInvalidate.bind(this)(cacheKeys);\n    }\n  };\n\n  /**\n   * Used to receive data from lazy storage\n   * @param cacheKey\n   */\n  getLazyResource = async <Response, Error>(\n    cacheKey: string,\n  ): Promise<CacheValueType<Response, Error, Adapter> | undefined> => {\n    const data = await this.lazyStorage?.get<Response, Error, Adapter>(cacheKey);\n    const syncData = this.storage.get<Response, Error, Adapter>(cacheKey);\n\n    // No data in lazy storage\n    const hasLazyData = this.lazyStorage && data;\n    if (hasLazyData) {\n      const now = +new Date();\n      const isNewestData = syncData ? syncData.responseTimestamp < data.responseTimestamp : true;\n      const isStaleData = data.staleTime <= now - data.responseTimestamp;\n      const isValidLazyData = data.version === this.version;\n\n      if (!isValidLazyData) {\n        this.lazyStorage?.delete(cacheKey);\n      }\n      if (isNewestData && !isStaleData && isValidLazyData) {\n        this.storage.set<Response, Error, Adapter>(cacheKey, data);\n        this.events.emitCacheData<Response, Error, Adapter>({ ...data, cacheKey, cached: true });\n        return data;\n      }\n    }\n\n    const isValidData = syncData?.version === this.version;\n    if (syncData && !isValidData) {\n      this.delete(cacheKey);\n    }\n    return syncData;\n  };\n\n  /**\n   * Used to receive keys from sync storage and lazy storage\n   * @param cacheKey\n   */\n  getLazyKeys = async () => {\n    const keys = (await this.lazyStorage?.keys()) || [];\n\n    return [...new Set(keys)];\n  };\n\n  /**\n   * Used to receive keys from sync storage and lazy storage\n   * @param cacheKey\n   */\n  getAllKeys = async () => {\n    const keys = await this.lazyStorage?.keys();\n    const asyncKeys = Array.from(keys || []);\n    const syncKeys = Array.from(this.storage.keys());\n\n    return [...new Set([...asyncKeys, ...syncKeys])];\n  };\n\n  /**\n   * Schedule garbage collection for given key\n   * @param cacheKey\n   * @returns\n   */\n  scheduleGarbageCollector = (cacheKey: string) => {\n    // We need to make sure that all of the values will be removed, also that we have the proper data\n    const cacheData = this.storage.get(cacheKey);\n\n    // Clear running garbage collectors for given key\n    clearTimeout(this.garbageCollectors.get(cacheKey));\n\n    // Garbage collect\n    if (cacheData) {\n      const timeLeft = cacheData.cacheTime + cacheData.responseTimestamp - +new Date();\n      // null\n      if (cacheData.cacheTime === null) {\n        this.logger.debug({ title: \"Cache time is null\", type: \"system\", extra: { cacheKey } });\n      }\n      // Infinity\n      else if (\n        (cacheData.cacheTime !== null && JSON.stringify(cacheData.cacheTime) === \"null\") ||\n        cacheData.cacheTime === Infinity\n      ) {\n        this.logger.debug({ title: \"Cache time is Infinite\", type: \"system\", extra: { cacheKey } });\n      }\n      // Run garbage collector\n      else if (timeLeft >= 0) {\n        this.garbageCollectors.set(\n          cacheKey,\n          setTimeout(() => {\n            if (this.client.appManager.isOnline) {\n              this.logger.info({ title: \"Garbage collecting cache data\", type: \"system\", extra: { cacheKey } });\n              this.delete(cacheKey);\n            }\n          }, timeLeft),\n        );\n      }\n      // Delete if value is stale and we are online\n      else if (this.client.appManager.isOnline) {\n        this.logger.info({ title: \"Garbage collecting cache data\", type: \"system\", extra: { cacheKey } });\n        this.delete(cacheKey);\n      }\n    }\n  };\n\n  /**\n   * Clear cache storages\n   */\n  clear = async (): Promise<void> => {\n    this.garbageCollectors.forEach((timeout) => clearTimeout(timeout));\n    this.storage.clear();\n  };\n}\n","import type { ResponseDetailsType } from \"managers\";\nimport type { RequestInstance } from \"request\";\nimport type { ExtractAdapterResolvedType } from \"types\";\n\nexport const getCacheData = <T extends RequestInstance>(\n  previousResponse: ExtractAdapterResolvedType<T> | undefined,\n  response: ExtractAdapterResolvedType<T> & ResponseDetailsType,\n): ExtractAdapterResolvedType<T> & ResponseDetailsType => {\n  const { data, success } = response;\n\n  const previousData = !success && previousResponse ? previousResponse.data : null;\n  const computedData = data || previousData;\n\n  return { ...response, data: computedData };\n};\n\nexport const getInvalidateKey = (): string => {\n  return `invalidate`;\n};\nexport const getInvalidateByKey = (key: string): string => {\n  return `${key}_invalidate`;\n};\nexport const getDeleteKey = (): string => {\n  return `delete`;\n};\nexport const getDeleteByKey = (key: string): string => {\n  return `${key}_delete`;\n};\nexport const getCacheByKey = (key: string): string => {\n  return `${key}_cache`;\n};\nexport const getCacheKey = (): string => {\n  return `cache`;\n};\n","import type EventEmitter from \"events\";\n\nimport type { CacheValueType } from \"cache\";\nimport { getInvalidateByKey, getInvalidateKey, getCacheByKey, getCacheKey, getDeleteKey, getDeleteByKey } from \"cache\";\nimport type { AdapterInstance } from \"adapter\";\n\nexport const getCacheEvents = (emitter: EventEmitter) => ({\n  /**\n   * Set cache data\n   * @param data\n   */\n  emitCacheData: <Response, Error, Adapter extends AdapterInstance>(\n    data: CacheValueType<Response, Error, Adapter> & { cached: boolean },\n    isTriggeredExternally = false,\n  ): void => {\n    emitter.emit(getCacheKey(), data, isTriggeredExternally);\n    emitter.emit(getCacheByKey(data.cacheKey), data, isTriggeredExternally);\n  },\n  /**\n   * Invalidate cache values event\n   */\n  emitInvalidation: (cacheKey: string, isTriggeredExternally = false): void => {\n    emitter.emit(getInvalidateKey(), cacheKey, isTriggeredExternally);\n    emitter.emit(getInvalidateByKey(cacheKey), isTriggeredExternally);\n  },\n  /**\n   * Delete of cache values\n   */\n  emitDelete: (cacheKey: string, isTriggeredExternally = false): void => {\n    emitter.emit(getDeleteKey(), cacheKey, isTriggeredExternally);\n    emitter.emit(getDeleteByKey(cacheKey), isTriggeredExternally);\n  },\n  /**\n   * Cache data listener\n   * @param callback\n   * @returns\n   */\n  onData: <Response, Error, Adapter extends AdapterInstance>(\n    callback: (data: CacheValueType<Response, Error, Adapter> & { cached: boolean }) => void,\n  ): VoidFunction => {\n    emitter.on(getCacheKey(), callback);\n    return () => emitter.removeListener(getCacheKey(), callback);\n  },\n  /**\n   * Cache data listener\n   * @param cacheKey\n   * @param callback\n   * @returns\n   */\n  onDataByKey: <Response, Error, Adapter extends AdapterInstance>(\n    cacheKey: string,\n    callback: (data: CacheValueType<Response, Error, Adapter>) => void,\n  ): VoidFunction => {\n    emitter.on(getCacheByKey(cacheKey), callback);\n    return () => emitter.removeListener(getCacheByKey(cacheKey), callback);\n  },\n  /**\n   * Cache invalidation listener\n   * @param callback\n   * @returns\n   */\n  onInvalidate: (callback: (cacheKey: string) => void): VoidFunction => {\n    emitter.on(getInvalidateKey(), callback);\n    return () => emitter.removeListener(getInvalidateKey(), callback);\n  },\n  /**\n   * Cache invalidation listener\n   * @param cacheKey\n   * @param callback\n   * @returns\n   */\n  onInvalidateByKey: (cacheKey: string, callback: () => void): VoidFunction => {\n    emitter.on(getInvalidateByKey(cacheKey), callback);\n    return () => emitter.removeListener(getInvalidateByKey(cacheKey), callback);\n  },\n  onDelete: (callback: (cacheKey: string) => void): VoidFunction => {\n    emitter.on(getDeleteKey(), callback);\n    return () => emitter.removeListener(getDeleteKey(), callback);\n  },\n  onDeleteByKey: (cacheKey: string, callback: () => void): VoidFunction => {\n    emitter.on(getDeleteByKey(cacheKey), callback);\n    return () => emitter.removeListener(getDeleteByKey(cacheKey), callback);\n  },\n});\n","export enum DispatcherMode {\n  ONE_BY_ONE = \"one-by-one\",\n  ALL_AT_ONCE = \"all-at-once\",\n  PREVIOUS_CANCELED = \"previous-canceled\",\n  DEDUPLICATED = \"deduplicated\",\n}\n","import type EventEmitter from \"events\";\n\nimport type { QueueDataType } from \"dispatcher\";\nimport {\n  getDispatcherChangeKey,\n  getDispatcherChangeByKey,\n  getDispatcherStatusKey,\n  getDispatcherStatusByKey,\n  getDispatcherDrainedKey,\n  getDispatcherDrainedByKey,\n} from \"dispatcher\";\nimport type { RequestInstance } from \"request\";\n\nexport const getDispatcherEvents = (emitter: EventEmitter) => ({\n  emitDrained: <Request extends RequestInstance>(\n    values: QueueDataType<Request>,\n    isTriggeredExternally?: boolean,\n  ): void => {\n    emitter.emit(getDispatcherDrainedKey(), values, isTriggeredExternally);\n    emitter.emit(getDispatcherDrainedByKey(values.queryKey), values, isTriggeredExternally);\n  },\n  emitQueueStatusChanged: <Request extends RequestInstance>(\n    values: QueueDataType<Request>,\n    isTriggeredExternally?: boolean,\n  ): void => {\n    emitter.emit(getDispatcherStatusKey(), values, isTriggeredExternally);\n    emitter.emit(getDispatcherStatusByKey(values.queryKey), values, isTriggeredExternally);\n  },\n  emitQueueChanged: <Request extends RequestInstance>(\n    values: QueueDataType<Request>,\n    isTriggeredExternally?: boolean,\n  ): void => {\n    emitter.emit(getDispatcherChangeKey(), values, isTriggeredExternally);\n    emitter.emit(getDispatcherChangeByKey(values.queryKey), values, isTriggeredExternally);\n  },\n  /**\n   * When queue becomes empty\n   * @param callback\n   * @returns\n   */\n  onDrained: <Request extends RequestInstance>(callback: (values: QueueDataType<Request>) => void): VoidFunction => {\n    emitter.on(getDispatcherDrainedKey(), callback);\n    return () => emitter.removeListener(getDispatcherDrainedKey(), callback);\n  },\n  /**\n   * When queue becomes empty\n   * @param queryKey\n   * @param callback\n   * @returns\n   */\n  onDrainedByKey: <Request extends RequestInstance>(\n    queryKey: string,\n    callback: (values: QueueDataType<Request>) => void,\n  ): VoidFunction => {\n    emitter.on(getDispatcherDrainedByKey(queryKey), callback);\n    return () => emitter.removeListener(getDispatcherDrainedByKey(queryKey), callback);\n  },\n  /**\n   * When queue status change from enabled to paused or vice versa\n   * @param callback\n   * @returns\n   */\n  onQueueStatusChange: <Request extends RequestInstance>(\n    callback: (values: QueueDataType<Request>) => void,\n  ): VoidFunction => {\n    emitter.on(getDispatcherStatusKey(), callback);\n    return () => emitter.removeListener(getDispatcherStatusKey(), callback);\n  },\n  /**\n   * When queue status change from enabled to paused or vice versa\n   * @param queryKey\n   * @param callback\n   * @returns\n   */\n  onQueueStatusChangeByKey: <Request extends RequestInstance>(\n    queryKey: string,\n    callback: (values: QueueDataType<Request>) => void,\n  ): VoidFunction => {\n    emitter.on(getDispatcherStatusByKey(queryKey), callback);\n    return () => emitter.removeListener(getDispatcherStatusByKey(queryKey), callback);\n  },\n  /**\n   * When new elements are added or removed from the queue\n   * @param queryKey\n   * @param callback\n   * @returns\n   */\n  onQueueChange: <Request extends RequestInstance>(\n    callback: (values: QueueDataType<Request>) => void,\n  ): VoidFunction => {\n    emitter.on(getDispatcherChangeKey(), callback);\n    return () => emitter.removeListener(getDispatcherChangeKey(), callback);\n  },\n  /**\n   * When new elements are added or removed from the queue\n   * @param queryKey\n   * @param callback\n   * @returns\n   */\n  onQueueChangeByKey: <Request extends RequestInstance>(\n    queryKey: string,\n    callback: (values: QueueDataType<Request>) => void,\n  ): VoidFunction => {\n    emitter.on(getDispatcherChangeByKey(queryKey), callback);\n    return () => emitter.removeListener(getDispatcherChangeByKey(queryKey), callback);\n  },\n});\n","import type {\n  QueueDataType,\n  DispatcherOptionsType,\n  DispatcherStorageType,\n  ResolvedQueueDataType,\n  ResolvedQueueItemType,\n  RunningRequestValueType,\n} from \"dispatcher\";\nimport { getRequestType, canRetryRequest, getDispatcherEvents, DispatcherMode } from \"dispatcher\";\nimport type { ClientInstance } from \"client\";\nimport { EventEmitter } from \"utils\";\nimport type { ResponseDetailsType, LoggerMethods } from \"managers\";\nimport type { RequestInstance, RequestJSON } from \"request\";\nimport { Request, scopeKey } from \"request\";\nimport type { AdapterInstance, RequestResponseType } from \"adapter\";\nimport { getErrorMessage } from \"adapter\";\n\n/**\n * Dispatcher controls and manages the requests that are going to be executed with adapter. It manages them based on the options provided with request.\n * This class can also run them with different modes like deduplication, cancelation, queueing or run-all-at-once mode. With it's help we can pause,\n * stop, start and cancel requests.\n */\nexport class Dispatcher<Adapter extends AdapterInstance> {\n  public emitter = new EventEmitter();\n  public events = getDispatcherEvents(this.emitter);\n  public storage: DispatcherStorageType = new Map<string, QueueDataType<any>>();\n\n  private requestCount = new Map<string, number>();\n  private runningRequests = new Map<string, RunningRequestValueType[]>();\n\n  private logger: LoggerMethods;\n  private client: ClientInstance<{ adapter: Adapter }>;\n\n  constructor(public options?: DispatcherOptionsType) {\n    this.emitter?.setMaxListeners(1000);\n\n    if (this.options?.storage) {\n      this.storage = this.options.storage;\n    }\n  }\n\n  // eslint-disable-next-line class-methods-use-this\n  private isRequestJSON = (\n    request: RequestInstance | RequestJSON<RequestInstance>,\n  ): request is RequestJSON<RequestInstance> => {\n    return !(request instanceof Request);\n  };\n\n  initialize = (client: ClientInstance<{ adapter: Adapter }>) => {\n    this.client = client;\n    this.logger = client.loggerManager.initialize(client, \"Dispatcher\");\n\n    // Going back from offline should re-trigger all requests\n    this.client.appManager.events.onOnline(() => {\n      this.flush();\n    });\n\n    return this;\n  };\n\n  // *********************************************************************\n  // *********************************************************************\n  // Queue\n  // *********************************************************************\n  // *********************************************************************\n\n  /**\n   * Start request handling by queryKey\n   */\n  start = (queryKey: string) => {\n    // Change status to running\n    const queue = this.getQueue(queryKey);\n\n    // Start the queue when its stopped\n    queue.stopped = false;\n    this.setQueue(queryKey, queue);\n    this.flushQueue(queryKey);\n    this.client.triggerPlugins(\"onDispatcherQueueRunning\", { dispatcher: this, queue, status: \"running\" });\n    this.events.emitQueueStatusChanged(queue);\n  };\n\n  /**\n   * Pause request queue, but do not cancel already started requests\n   */\n  pause = (queryKey: string) => {\n    // Change state to stopped\n    const queue = this.getQueue(queryKey);\n\n    queue.stopped = true;\n    this.setQueue(queryKey, queue);\n    this.client.triggerPlugins(\"onDispatcherQueueRunning\", { dispatcher: this, queue, status: \"paused\" });\n    this.events.emitQueueStatusChanged(queue);\n  };\n\n  /**\n   * Stop request queue and cancel all started requests - those will be treated like not started\n   */\n  stop = (queryKey: string) => {\n    // Change state to stopped\n    const queue = this.getQueue(queryKey);\n\n    queue.stopped = true;\n    this.setQueue(queryKey, queue);\n\n    // Cancel running requests\n    this.cancelRunningRequests(queryKey);\n    this.client.triggerPlugins(\"onDispatcherQueueRunning\", { dispatcher: this, queue, status: \"stopped\" });\n    this.events.emitQueueStatusChanged(queue);\n  };\n\n  /**\n   * Return all\n   */\n  getQueuesKeys = () => {\n    return Array.from(this.storage.keys());\n  };\n\n  /**\n   * Return queue state object.\n   * Automatically reconstructs any serialized (JSON) requests back into\n   * proper Request class instances so the rest of the pipeline can rely on\n   * having a real `RequestInstance`.\n   */\n  getQueue = <R extends RequestInstance = RequestInstance>(queryKey: string): ResolvedQueueDataType<R> => {\n    const initialQueueState: ResolvedQueueDataType<R> = { queryKey, requests: [], stopped: false };\n    const storedEntity = this.storage.get<R>(queryKey);\n\n    if (!storedEntity) {\n      return initialQueueState;\n    }\n\n    const resolvedRequests: ResolvedQueueItemType<R>[] = storedEntity.requests.map((item) => {\n      if (this.isRequestJSON(item.request)) {\n        return { ...item, request: this.client.fromJSON(item.request as RequestJSON<RequestInstance>) as unknown as R };\n      }\n      return item as ResolvedQueueItemType<R>;\n    });\n\n    return { ...storedEntity, requests: resolvedRequests };\n  };\n\n  /**\n   * Return request from queue state\n   */\n  getRequest = <Request extends RequestInstance = RequestInstance>(queryKey: string, requestId: string) => {\n    const initialQueueState: QueueDataType<Request> = { queryKey, requests: [], stopped: false };\n    const storedEntity = this.storage.get<Request>(queryKey) || initialQueueState;\n\n    return storedEntity.requests.find((req) => req.requestId === requestId);\n  };\n\n  /**\n   * Get value of the active queue status based on the stopped status\n   */\n  getIsActiveQueue = (queryKey: string) => {\n    const queue = this.getQueue(queryKey);\n    const hasAvailableRequests = queue.requests.some((req) => !req.stopped);\n    const isRunningQueue = !queue.stopped;\n    return hasAvailableRequests && isRunningQueue;\n  };\n\n  /**\n   * Add new element to storage\n   */\n  addQueueItem = <Request extends RequestInstance = RequestInstance>(\n    queryKey: string,\n    element: ResolvedQueueItemType<Request>,\n  ) => {\n    const queue = this.getQueue<Request>(queryKey);\n    queue.requests.push(element);\n\n    this.client.triggerPlugins(\"onDispatcherItemAdded\", { dispatcher: this, queue, queueItem: element });\n\n    this.setQueue<Request>(queryKey, queue);\n  };\n\n  /**\n   * Set new queue storage value\n   */\n  setQueue = <Request extends RequestInstance = RequestInstance>(\n    queryKey: string,\n    queue: ResolvedQueueDataType<Request>,\n  ) => {\n    this.storage.set<Request>(queryKey, queue as QueueDataType<Request>);\n\n    // Emit Queue Changes\n    this.client.triggerPlugins(\"onDispatcherQueueCreated\", { dispatcher: this, queue });\n    this.events.emitQueueChanged(queue);\n\n    return queue;\n  };\n\n  /**\n   * Clear requests from queue cache\n   */\n  clearQueue = (queryKey: string) => {\n    const queue = this.getQueue(queryKey);\n    const newQueue = { queryKey, requests: [], stopped: queue.stopped };\n    this.storage.set(queryKey, newQueue);\n\n    // Emit Queue Changes\n    this.client.triggerPlugins(\"onDispatcherQueueCleared\", { dispatcher: this, queue: newQueue });\n    this.events.emitQueueChanged(newQueue);\n    this.events.emitDrained(newQueue);\n\n    return newQueue;\n  };\n\n  /**\n   * Method used to flush the queue requests\n   */\n  flushQueue = async (queryKey: string) => {\n    const queue = this.getQueue(queryKey);\n    const runningRequests = this.getRunningRequests(queryKey);\n    const queueItem = queue.requests.find((request) => !request.stopped);\n\n    const isStopped = queue && queue.stopped;\n    const isOffline = !this.client.appManager.isOnline;\n    const isConcurrent = !queueItem?.request.queued;\n    const isInactive = !runningRequests.length;\n    const isEmpty = !queueItem;\n\n    // When there are no requests to flush, when its stopped, there is running request\n    // or there is no request to trigger - we don't want to perform actions\n    if (isStopped || isOffline || isEmpty) {\n      this.logger.debug({ title: \"Skipping queue trigger\", type: \"system\", extra: { isStopped, isOffline, isEmpty } });\n    } else if (isConcurrent) {\n      queue.requests.forEach((element) => {\n        if (!this.hasRunningRequest(queryKey, element.requestId)) {\n          this.performRequest(element);\n        }\n      });\n    } else if (isInactive) {\n      await this.performRequest(queueItem);\n      this.flushQueue(queryKey);\n    }\n  };\n\n  /**\n   * Flush all available requests from all queues\n   */\n  flush = async () => {\n    const keys = this.getQueuesKeys();\n\n    // eslint-disable-next-line no-restricted-syntax\n    for (const key of keys) {\n      const storageItem = this.getQueue(key);\n\n      if (storageItem) {\n        this.flushQueue(key);\n      }\n    }\n  };\n\n  /**\n   * Clear all running requests and storage\n   */\n  clear = () => {\n    const keys = this.getQueuesKeys();\n    keys.forEach((queryKey) => this.cancelRunningRequests(queryKey));\n\n    this.runningRequests.clear();\n    this.storage.clear();\n    this.client.triggerPlugins(\"onDispatcherCleared\", { dispatcher: this });\n  };\n\n  // *********************************************************************\n  // *********************************************************************\n  // Requests\n  // *********************************************************************\n  // *********************************************************************\n\n  /**\n   * Start particular request\n   */\n  startRequest = (queryKey: string, requestId: string) => {\n    // Change status to running\n    const queue = this.getQueue(queryKey);\n    const request = queue.requests.find((element) => element.requestId === requestId);\n\n    // Start the queue when its stopped\n    if (request) {\n      request.stopped = false;\n      this.setQueue(queryKey, queue);\n      this.flushQueue(queryKey);\n      this.events.emitQueueStatusChanged(queue);\n    }\n  };\n\n  /**\n   * Stop particular request\n   */\n  stopRequest = (queryKey: string, requestId: string) => {\n    // Change state to stopped\n    const queue = this.getQueue(queryKey);\n    const request = queue.requests.find((element) => element.requestId === requestId);\n\n    if (request) {\n      request.stopped = true;\n      this.setQueue(queryKey, queue);\n\n      // Cancel running requests\n      this.cancelRunningRequest(queryKey, requestId);\n      this.events.emitQueueStatusChanged(queue);\n    }\n  };\n\n  /**\n   * Get currently running requests from all queryKeys\n   */\n  getAllRunningRequests = () => {\n    return Array.from(this.runningRequests.values()).flat();\n  };\n\n  /**\n   * Get currently running requests\n   */\n  getRunningRequests = (queryKey: string) => {\n    return this.runningRequests.get(queryKey) || [];\n  };\n\n  /**\n   * Get running request by id\n   */\n  getRunningRequest = (queryKey: string, requestId: string) => {\n    const runningRequests = this.getRunningRequests(queryKey);\n    return runningRequests.find((req) => req.requestId === requestId);\n  };\n\n  /**\n   * Add request to the running requests list\n   */\n  addRunningRequest = (queryKey: string, requestId: string, request: RequestInstance): RunningRequestValueType => {\n    const newRunningRequest = { requestId, request, timestamp: Date.now() };\n    const runningRequests = this.getRunningRequests(queryKey);\n    runningRequests.push(newRunningRequest);\n    this.runningRequests.set(queryKey, runningRequests);\n    return newRunningRequest;\n  };\n\n  /**\n   * Get the value based on the currently running requests\n   */\n  hasRunningRequests = (queryKey: string) => {\n    return !!this.getRunningRequests(queryKey).length;\n  };\n\n  /**\n   * Check if request is currently processing\n   */\n  hasRunningRequest = (queryKey: string, requestId: string) => {\n    const runningRequests = this.getRunningRequests(queryKey);\n    return !!runningRequests.find((req) => req.requestId === requestId);\n  };\n\n  /**\n   * Cancel all started requests, but do NOT remove it from main storage\n   */\n  cancelRunningRequests = (queryKey: string) => {\n    this.runningRequests.get(queryKey)?.forEach((req) => {\n      const ak = scopeKey(req.request.abortKey, req.request.scope);\n      this.client.requestManager.abortByRequestId(ak, req.requestId);\n    });\n    this.deleteRunningRequests(queryKey);\n  };\n  /**\n   * Cancel started request, but do NOT remove it from main storage\n   */\n  cancelRunningRequest = (queryKey: string, requestId: string) => {\n    const requests = this.getRunningRequests(queryKey).filter((request) => {\n      if (request.requestId === requestId) {\n        const ak = scopeKey(request.request.abortKey, request.request.scope);\n        this.client.requestManager.abortByRequestId(ak, request.requestId);\n        return false;\n      }\n      return true;\n    });\n\n    this.runningRequests.set(queryKey, requests);\n  };\n\n  /**\n   * Delete all started requests, but do NOT clear it from queue and do NOT cancel them\n   */\n  deleteRunningRequests = (queryKey: string) => {\n    this.runningRequests.set(queryKey, []);\n  };\n\n  /**\n   * Delete request by id, but do NOT clear it from queue and do NOT cancel them\n   */\n  deleteRunningRequest = (queryKey: string, requestId: string) => {\n    const runningRequests = this.getRunningRequests(queryKey);\n    this.runningRequests.set(\n      queryKey,\n      runningRequests.filter((req) => req.requestId !== requestId),\n    );\n  };\n\n  /**\n   * Get count of requests from the same queryKey\n   */\n  getQueueRequestCount = (queryKey: string) => {\n    return this.requestCount.get(queryKey) || 0;\n  };\n\n  /**\n   * Add request count to the queryKey\n   */\n  incrementQueueRequestCount = (queryKey: string) => {\n    const count = this.requestCount.get(queryKey) || 0;\n    this.requestCount.set(queryKey, count + 1);\n  };\n\n  /**\n   * Create storage element from request\n   */\n  // eslint-disable-next-line class-methods-use-this\n  createStorageItem = <R extends RequestInstance>(request: R): ResolvedQueueItemType<R> => {\n    const requestId = this.client.unstable_requestIdMapper(request);\n    return {\n      requestId,\n      timestamp: +new Date(),\n      request,\n      retries: 0,\n      stopped: false,\n      resolved: false,\n    };\n  };\n\n  // *********************************************************************\n  // *********************************************************************\n  // Dispatching\n  // *********************************************************************\n  // *********************************************************************\n\n  /**\n   * Add request to the dispatcher handler\n   */\n  add = (request: RequestInstance) => {\n    const queryKey = scopeKey(request.queryKey, request.scope);\n\n    // Create dump of the request to allow storing it in localStorage, AsyncStorage or any other\n    // This way we don't save the Class but the instruction of the request to be done\n    const storageItem = this.createStorageItem(request);\n    const { requestId } = storageItem;\n\n    const queue = this.getQueue(queryKey);\n    const [latestRequest] = queue.requests.slice(-1);\n    const requestType = getRequestType(request, latestRequest);\n\n    this.logger.debug({ title: \"Adding request to queue\", type: \"system\", extra: { requestType, request, requestId } });\n\n    switch (requestType) {\n      case DispatcherMode.ONE_BY_ONE: {\n        // Requests will go one by one\n        this.addQueueItem(queryKey, storageItem);\n        this.flushQueue(queryKey);\n        return requestId;\n      }\n      case DispatcherMode.PREVIOUS_CANCELED: {\n        // Cancel all previous on-going requests\n        this.cancelRunningRequests(queryKey);\n        this.clearQueue(queryKey);\n        this.addQueueItem(queryKey, storageItem);\n        this.flushQueue(queryKey);\n        return requestId;\n      }\n      case DispatcherMode.DEDUPLICATED: {\n        this.client.requestManager.events.emitDeduplicated({\n          request: latestRequest.request,\n          requestId,\n          deduplicatedRequest: request,\n        });\n        // Return the running requestId to fulfill the events\n        return latestRequest.requestId;\n      }\n      default: {\n        this.addQueueItem(queryKey, storageItem);\n        this.flushQueue(queryKey);\n        return requestId;\n      }\n    }\n  };\n\n  /**\n   * Delete from the storage and cancel request\n   */\n  delete = (queryKey: string, requestId: string, abortKey: string) => {\n    this.logger.debug({ title: \"Deleting request\", type: \"system\", extra: { queryKey, requestId, abortKey } });\n    const queue = this.getQueue(queryKey);\n    const queueItem = queue.requests.find((req) => req.requestId === requestId);\n\n    if (!queueItem) return;\n\n    queue.requests = queue.requests.filter((req) => req.requestId !== requestId);\n    this.storage.set(queryKey, queue);\n\n    // Clean controllers\n    if (this.hasRunningRequest(queryKey, requestId)) {\n      this.deleteRunningRequest(queryKey, requestId);\n      this.client.requestManager.abortByRequestId(abortKey, requestId);\n    }\n\n    // Emit Queue Changes\n    this.client.triggerPlugins(\"onDispatcherItemDeleted\", { queue, dispatcher: this, queueItem });\n\n    this.events.emitQueueChanged(queue);\n    this.client.requestManager.events.emitRemove({\n      requestId,\n      request: queueItem.request,\n      resolved: queueItem.resolved,\n    });\n\n    if (!queue.requests.length) {\n      this.client.triggerPlugins(\"onDispatcherQueueDrained\", { queue, dispatcher: this });\n      this.events.emitDrained(queue);\n    }\n\n    return queue;\n  };\n\n  /**\n   * Request can run for some time, once it's done, we have to check if it's successful or if it was aborted\n   * It can be different once the previous call was set as cancelled and removed from queue before this request got resolved\n   */\n  performRequest = async (storageItem: ResolvedQueueItemType) => {\n    const { request, requestId } = storageItem;\n    this.logger.debug({ title: \"Performing request\", type: \"system\", extra: { request, requestId } });\n\n    const { retry, retryTime, queryKey: rawQueryKey, abortKey: rawAbortKey, offline, scope } = request;\n    const queryKey = scopeKey(rawQueryKey, scope);\n    const abortKey = scopeKey(rawAbortKey, scope);\n    const { adapter, requestManager, cache, appManager } = this.client;\n\n    const canRetry = canRetryRequest(storageItem.retries, retry);\n    // When offline not perform any request\n    const isOffline = !appManager.isOnline && offline;\n    // When request with this id was triggered again\n    const isAlreadyRunning = this.hasRunningRequest(queryKey, requestId);\n    const isStopped = storageItem.stopped;\n\n    if (isOffline || isAlreadyRunning || isStopped) {\n      return this.logger.warning({\n        title: \"Unable to perform request\",\n        type: \"system\",\n        extra: { isOffline, isAlreadyRunning, isStopped },\n      });\n    }\n\n    // Additionally keep the running request to possibly abort it later\n    const runningRequest = this.addRunningRequest(queryKey, requestId, request);\n\n    // Propagate the loading to all connected hooks\n    requestManager.events.emitLoading({\n      request,\n      requestId,\n      loading: true,\n      isRetry: !!storageItem.retries,\n      isOffline,\n    });\n\n    // Trigger Request\n    this.incrementQueueRequestCount(queryKey);\n    // Listen for aborting\n    requestManager.addAbortController(abortKey, requestId);\n\n    const response: RequestResponseType<any> = await adapter.fetch(request, requestId);\n\n    // TODO: improve this\n    // eslint-disable-next-line no-param-reassign\n    storageItem.resolved = true;\n    // Stop listening for aborting\n    requestManager.removeAbortController(abortKey, requestId);\n    // Do not continue the request handling when it got stopped and request was unsuccessful\n    // Or when the request was aborted/canceled\n    const isOfflineResponseStatus = !appManager.isOnline;\n    // If there is no running request with this id, it means it was cancelled and removed during send\n    const isCancelMessage = getErrorMessage(\"abort\").message === response.error?.message;\n    const isCanceled = !this.hasRunningRequest(queryKey, requestId) || isCancelMessage;\n\n    // Remove running request, must be called after isCancelled\n    this.deleteRunningRequest(queryKey, requestId);\n\n    const shouldRetryOnError = response.success || !canRetry || !request.retryOnError || request.retryOnError(response);\n    const willRetry = !response.success && canRetry && shouldRetryOnError && !isCanceled && !isOfflineResponseStatus;\n\n    const requestDetails: ResponseDetailsType = {\n      isCanceled,\n      isOffline: isOfflineResponseStatus,\n      retries: storageItem.retries,\n      willRetry,\n      addedTimestamp: storageItem.timestamp,\n      triggerTimestamp: runningRequest.timestamp,\n      requestTimestamp: response.requestTimestamp,\n      responseTimestamp: response.responseTimestamp,\n    };\n\n    // Global response emitter to handle request execution\n    requestManager.events.emitResponse({ request, requestId, response, details: requestDetails });\n\n    // Turn off loading\n    requestManager.events.emitLoading({\n      request,\n      requestId,\n      loading: false,\n      isRetry: !!storageItem.retries,\n      isOffline,\n    });\n\n    // Cache event to emit the data inside and store it\n    cache.set(request, { ...response, ...requestDetails });\n    this.logger.debug({\n      title: \"Dispatcher processing response\",\n      type: \"system\",\n      extra: { requestId, request, response, details: requestDetails },\n    });\n\n    // On cancelled\n    if (isCanceled) {\n      const queue = this.getQueue(queryKey);\n      const queueItem = queue.requests.find((req) => req.requestId === requestId);\n\n      // do not remove cancelled request as it may be result of manual queue pause\n      // if abort was done without stop action we can remove request\n      if (!queue.stopped && !queueItem?.stopped) {\n        this.logger.debug({ title: \"Request paused\", type: \"system\", extra: { response, requestDetails, request } });\n        return this.delete(queryKey, requestId, abortKey);\n      }\n      return this.logger.debug({\n        title: \"Request canceled\",\n        type: \"system\",\n        extra: { response, requestDetails, request },\n      });\n    }\n    // On offline\n    if (!response.success && isOfflineResponseStatus) {\n      // if we don't want to keep offline request - just delete them\n      if (!offline) {\n        this.logger.warning({\n          title: \"Removing non-offline request\",\n          type: \"system\",\n          extra: { response, requestDetails, request },\n        });\n        return this.delete(queryKey, requestId, abortKey);\n      }\n      // do not remove request from store as we want to re-send it later\n      return this.logger.debug({\n        title: \"Awaiting for network restoration\",\n        type: \"system\",\n        extra: { response, requestDetails, request },\n      });\n    }\n    // On success\n    if (response.success) {\n      this.delete(queryKey, requestId, abortKey);\n      return this.logger.debug({\n        title: \"Successful response, removing request from queue.\",\n        type: \"system\",\n        extra: {\n          response,\n          requestDetails,\n          request,\n        },\n      });\n    }\n    // On retry\n    if (willRetry) {\n      this.logger.debug({ title: \"Waiting for retry\", type: \"system\", extra: { response, requestDetails, request } });\n      // Perform retry once request is failed\n      setTimeout(() => {\n        this.logger.warning({\n          title: \"Error response, performing retry\",\n          type: \"request\",\n          extra: { response, requestDetails, request, requestId },\n        });\n        this.performRequest({\n          ...storageItem,\n          retries: storageItem.retries + 1,\n        });\n      }, retryTime || 0);\n    } else {\n      if (request.retry) {\n        this.logger.error({\n          title: \"All retries have been used. Removing request from queue.\",\n          type: \"request\",\n          extra: { response, requestDetails, request, requestId },\n        });\n      }\n      this.delete(queryKey, requestId, abortKey);\n    }\n  };\n}\n","import type { RequestInstance } from \"request\";\nimport type { ResolvedQueueItemType } from \"dispatcher\";\nimport { DispatcherMode } from \"dispatcher\";\n\n// Events\n\nexport const getDispatcherDrainedKey = (): string => {\n  return `drained-event`;\n};\nexport const getDispatcherDrainedByKey = (key: string): string => {\n  return `${key}-drained-event`;\n};\nexport const getDispatcherStatusKey = (): string => {\n  return `status-event`;\n};\nexport const getDispatcherStatusByKey = (key: string): string => {\n  return `${key}-status-event`;\n};\nexport const getDispatcherChangeKey = (): string => {\n  return `change-event`;\n};\nexport const getDispatcherChangeByKey = (key: string): string => {\n  return `${key}-change-event`;\n};\n\n// Requesting\n\nexport const getIsEqualTimestamp = (currentTimestamp: number, threshold: number, queueTimestamp?: number): boolean => {\n  if (!queueTimestamp) {\n    return false;\n  }\n  return queueTimestamp - currentTimestamp <= threshold;\n};\n\nexport const canRetryRequest = (currentRetries: number, retry: number | undefined) => {\n  if (retry && currentRetries < retry) {\n    return true;\n  }\n  return false;\n};\n\nconst isInDeduplicateRange = (request: RequestInstance, latestRequest: ResolvedQueueItemType) => {\n  if (request.deduplicateTime) {\n    return +new Date() - latestRequest.timestamp <= request.deduplicateTime;\n  }\n  return true;\n};\n\nexport const getRequestType = (request: RequestInstance, latestRequest: ResolvedQueueItemType | undefined) => {\n  const { queued, cancelable, deduplicate } = request;\n  const canDeduplicate = latestRequest ? isInDeduplicateRange(request, latestRequest) : false;\n\n  if (queued) {\n    return DispatcherMode.ONE_BY_ONE;\n  }\n  if (cancelable) {\n    return DispatcherMode.PREVIOUS_CANCELED;\n  }\n  if (canDeduplicate && deduplicate) {\n    return DispatcherMode.DEDUPLICATED;\n  }\n  return DispatcherMode.ALL_AT_ONCE;\n};\n","import type { ResponseType } from \"adapter\";\nimport type { RequestInstance } from \"request\";\nimport type { ExtendRequest, ExtractClientAdapterType } from \"types\";\nimport type {\n  ClientInstance,\n  ClientMode,\n  ClientModeOption,\n  RequestInterceptorType,\n  ResponseInterceptorType,\n} from \"./client.types\";\n\n/** Picks effective {@link ClientMode}: explicit override, else environment detection. */\nexport function resolveClientMode(modeOption: ClientModeOption | undefined): ClientMode {\n  if (modeOption === \"client\" || modeOption === \"server\") {\n    return modeOption;\n  }\n\n  const inBrowser = typeof window !== \"undefined\" && typeof document !== \"undefined\";\n  if (inBrowser) {\n    return \"client\";\n  }\n\n  return \"server\";\n}\n\nexport const interceptRequest = async (interceptors: RequestInterceptorType[], request: RequestInstance) => {\n  let newRequest = request;\n  if (!request.requestOptions.disableRequestInterceptors) {\n    // eslint-disable-next-line no-restricted-syntax\n    for (const interceptor of interceptors) {\n      // eslint-disable-next-line no-await-in-loop\n      newRequest = (await interceptor(request)) as RequestInstance;\n      if (!newRequest) throw new Error(\"Request modifier must return request\");\n    }\n  }\n  return newRequest;\n};\n\nexport const interceptResponse = async <GlobalErrorType, Client extends ClientInstance>(\n  interceptors: ResponseInterceptorType<Client>[],\n  response: ResponseType<any, GlobalErrorType, ExtractClientAdapterType<Client>>,\n  request: ExtendRequest<RequestInstance, { client: Client }>,\n) => {\n  let newResponse = response;\n  if (!request.requestOptions.disableResponseInterceptors) {\n    // eslint-disable-next-line no-restricted-syntax\n    for (const interceptor of interceptors) {\n      // eslint-disable-next-line no-await-in-loop\n      newResponse = await interceptor(response, request);\n      if (!newResponse) throw new Error(\"Response modifier must return data\");\n    }\n  }\n  return newResponse;\n};\n","import type { AdapterInstance, ResponseType } from \"adapter\";\nimport type { HttpAdapterType } from \"http-adapter\";\nimport { parseResponse, HttpAdapter } from \"http-adapter\";\nimport type {\n  ClientErrorType,\n  ClientInstance,\n  ClientMode,\n  ClientOptionsType,\n  RequestGenericType,\n  RequestInterceptorType,\n  ResponseInterceptorType,\n} from \"client\";\nimport { Cache } from \"cache\";\nimport { Dispatcher } from \"dispatcher\";\nimport type { PluginInstance, PluginMethodParameters, PluginMethods } from \"plugin\";\nimport type { RequestInstance, RequestJSON, RequestOptionsType } from \"request\";\nimport { getRequestKey, getSimpleKey, Request, scopeKey } from \"request\";\nimport type { LogLevel } from \"managers\";\nimport { AppManager, LoggerManager, RequestManager } from \"managers\";\nimport { interceptRequest, interceptResponse, resolveClientMode } from \"./client.utils\";\nimport type {\n  EmptyTypes,\n  TypeWithDefaults,\n  ExtractAdapterMethodType,\n  ExtractAdapterOptionsType,\n  ExtractAdapterQueryParamsType,\n  ExtractAdapterEndpointType,\n  ExtractUnionAdapter,\n  HydrateDataType,\n  HydrationOptions,\n  ExtractAdapterDefaultQueryParamsType,\n} from \"types\";\nimport { getUniqueRequestId } from \"utils\";\n\n/**\n * **Client** is a class that allows you to configure the connection with the server and then use it to create\n * requests. It allows you to set global defaults for the requests configuration, query params configuration.\n * It is also orchestrator for all of the HyperFetch modules like Cache, Dispatcher, AppManager, LoggerManager,\n * RequestManager and more.\n */\nexport class Client<\n  GlobalErrorType extends ClientErrorType = Error,\n  Adapter extends AdapterInstance = HttpAdapterType,\n> {\n  readonly url: string;\n  readonly mode: ClientMode;\n  public debug: boolean;\n\n  // Private\n  unstable_onErrorCallbacks: ResponseInterceptorType<ClientInstance>[] = [];\n  unstable_onSuccessCallbacks: ResponseInterceptorType<ClientInstance>[] = [];\n  unstable_onResponseCallbacks: ResponseInterceptorType<ClientInstance>[] = [];\n  unstable_onAuthCallbacks: RequestInterceptorType[] = [];\n  unstable_onRequestCallbacks: RequestInterceptorType[] = [];\n\n  // Managers\n  loggerManager: LoggerManager = new LoggerManager();\n  requestManager: RequestManager = new RequestManager();\n  appManager: AppManager;\n\n  // Config\n  adapter: Adapter;\n  cache: Cache<Adapter>;\n  fetchDispatcher: Dispatcher<Adapter>;\n  submitDispatcher: Dispatcher<Adapter>;\n  isMockerEnabled = true;\n\n  // Registered requests effect\n  plugins: PluginInstance[] = [];\n\n  /** @internal */\n  unstable_abortKeyMapper: (request: RequestInstance) => string = getSimpleKey;\n\n  /** @internal */\n  unstable_cacheKeyMapper: (request: RequestInstance) => string = getRequestKey;\n\n  /** @internal */\n  unstable_queryKeyMapper: (request: RequestInstance) => string = getRequestKey;\n\n  /** @internal */\n  unstable_requestIdMapper: (request: RequestInstance) => string = getUniqueRequestId;\n\n  // Logger\n  logger = this.loggerManager.initialize(this, \"Client\");\n\n  constructor(public options: ClientOptionsType<Client<GlobalErrorType, Adapter>>) {\n    const { url, appManager, cache, fetchDispatcher, submitDispatcher, mode: modeOption } = this.options;\n    this.url = url;\n    this.mode = resolveClientMode(modeOption);\n    this.adapter = HttpAdapter() as Adapter;\n\n    this.appManager = appManager?.() || new AppManager();\n    this.cache = cache?.() || new Cache();\n    this.fetchDispatcher = fetchDispatcher?.() || new Dispatcher();\n    this.submitDispatcher = submitDispatcher?.() || new Dispatcher();\n\n    // IMPORTANT: Do not change initialization order as it's crucial for dependencies injection\n    this.adapter.initialize(this);\n    this.appManager.initialize();\n    this.cache.initialize(this as unknown as ClientInstance<{ adapter: Adapter }>);\n    this.fetchDispatcher.initialize(this as unknown as ClientInstance<{ adapter: Adapter }>);\n    this.submitDispatcher.initialize(this as unknown as ClientInstance<{ adapter: Adapter }>);\n  }\n\n  /**\n   * This method enables the logger usage and display the logs in console\n   */\n  setDebug = (enabled: boolean): Client<GlobalErrorType, Adapter> => {\n    this.debug = enabled;\n    return this;\n  };\n\n  /**\n   * Set the logger severity of the messages displayed to the console\n   */\n  setLogLevel = (severity: LogLevel): Client<GlobalErrorType, Adapter> => {\n    this.loggerManager.setSeverity(severity);\n    return this;\n  };\n\n  /**\n   * Set the new logger instance to the Client\n   */\n  setLogger = (callback: (Client: ClientInstance) => LoggerManager): Client<GlobalErrorType, Adapter> => {\n    this.loggerManager = callback(this);\n    this.loggerManager.initialize(this, \"Client\");\n    return this;\n  };\n\n  /**\n   * Set globally if mocking should be enabled or disabled for all client requests.\n   * @param isMockerEnabled\n   */\n  setEnableGlobalMocking = (isMockerEnabled: boolean) => {\n    this.isMockerEnabled = isMockerEnabled;\n    return this;\n  };\n\n  /**\n   * Set custom http adapter to handle graphql, rest, firebase or others\n   */\n  setAdapter = <NewAdapter extends AdapterInstance>(adapter: NewAdapter): Client<GlobalErrorType, NewAdapter> => {\n    this.adapter = adapter as unknown as Adapter;\n    this.adapter.initialize(this);\n    return this as unknown as Client<GlobalErrorType, NewAdapter>;\n  };\n\n  /**\n   * Method of manipulating requests before sending the request. We can for example add custom header with token to the request which request had the auth set to true.\n   */\n  onAuth = (callback: RequestInterceptorType): Client<GlobalErrorType, Adapter> => {\n    this.unstable_onAuthCallbacks.push(callback);\n    return this;\n  };\n\n  /**\n   * Method for removing listeners on auth.\n   * */\n  removeOnAuthInterceptors = (callbacks: RequestInterceptorType[]): Client<GlobalErrorType, Adapter> => {\n    this.unstable_onAuthCallbacks = this.unstable_onAuthCallbacks.filter((callback) => !callbacks.includes(callback));\n    return this;\n  };\n\n  /**\n   * Method for intercepting error responses. It can be used for example to refresh tokens.\n   */\n  onError = <ErrorType = null>(\n    callback: ResponseInterceptorType<ClientInstance, any, ErrorType | GlobalErrorType>,\n  ): Client<GlobalErrorType, Adapter> => {\n    this.unstable_onErrorCallbacks.push(callback);\n    return this;\n  };\n\n  /**\n   * Method for removing listeners on error.\n   * */\n  removeOnErrorInterceptors = (\n    callbacks: ResponseInterceptorType<ClientInstance, any, null | GlobalErrorType>[],\n  ): Client<GlobalErrorType, Adapter> => {\n    this.unstable_onErrorCallbacks = this.unstable_onErrorCallbacks.filter((callback) => !callbacks.includes(callback));\n    return this;\n  };\n\n  /**\n   * Method for intercepting success responses.\n   */\n  onSuccess = <ErrorType = null>(\n    callback: ResponseInterceptorType<ClientInstance, any, ErrorType | GlobalErrorType>,\n  ): Client<GlobalErrorType, Adapter> => {\n    this.unstable_onSuccessCallbacks.push(callback);\n    return this;\n  };\n\n  /**\n   * Method for removing listeners on success.\n   * */\n  removeOnSuccessInterceptors = (\n    callbacks: ResponseInterceptorType<ClientInstance, any, null | GlobalErrorType>[],\n  ): Client<GlobalErrorType, Adapter> => {\n    this.unstable_onSuccessCallbacks = this.unstable_onSuccessCallbacks.filter(\n      (callback) => !callbacks.includes(callback),\n    );\n    return this;\n  };\n\n  /**\n   * Method of manipulating requests before sending the request.\n   */\n  onRequest = (callback: RequestInterceptorType): Client<GlobalErrorType, Adapter> => {\n    this.unstable_onRequestCallbacks.push(callback);\n    return this;\n  };\n\n  /**\n   * Method for removing listeners on request.\n   * */\n  removeOnRequestInterceptors = (callbacks: RequestInterceptorType[]): Client<GlobalErrorType, Adapter> => {\n    this.unstable_onRequestCallbacks = this.unstable_onRequestCallbacks.filter(\n      (callback) => !callbacks.includes(callback),\n    );\n    return this;\n  };\n\n  /**\n   * Method for intercepting any responses.\n   */\n  onResponse = <ErrorType = null>(\n    callback: ResponseInterceptorType<ClientInstance, any, ErrorType | GlobalErrorType>,\n  ): Client<GlobalErrorType, Adapter> => {\n    this.unstable_onResponseCallbacks.push(callback);\n    return this;\n  };\n\n  /**\n   * Method for removing listeners on request.\n   * */\n  removeOnResponseInterceptors = (\n    callbacks: ResponseInterceptorType<ClientInstance, any, null | GlobalErrorType>[],\n  ): Client<GlobalErrorType, Adapter> => {\n    this.unstable_onResponseCallbacks = this.unstable_onResponseCallbacks.filter(\n      (callback) => !callbacks.includes(callback),\n    );\n    return this;\n  };\n\n  /**\n   * Add persistent plugins which trigger on the request lifecycle\n   */\n  addPlugin = (plugin: PluginInstance) => {\n    this.plugins.push(plugin);\n\n    plugin.initialize(this);\n    plugin.trigger(\"onMount\", { client: this });\n\n    return this;\n  };\n\n  /**\n   * Remove plugins from Client\n   */\n  removePlugin = (plugin: PluginInstance) => {\n    const pluginCount = this.plugins.length;\n    this.plugins = this.plugins.filter((p) => p !== plugin);\n\n    if (this.plugins.length !== pluginCount) {\n      plugin.trigger(\"onUnmount\", { client: this });\n    }\n\n    return this;\n  };\n\n  triggerPlugins = <Key extends keyof PluginMethods<Client>>(key: Key, data: PluginMethodParameters<Key, Client>) => {\n    if (!this.plugins.length) {\n      return this;\n    }\n\n    this.plugins.forEach((plugin) => {\n      plugin.trigger(key, data);\n    });\n\n    return this;\n  };\n\n  /**\n   * Key setters\n   */\n\n  setAbortKeyMapper = (callback: (request: RequestInstance) => string) => {\n    this.unstable_abortKeyMapper = callback;\n    return this;\n  };\n  setCacheKeyMapper = (callback: (request: RequestInstance) => string) => {\n    this.unstable_cacheKeyMapper = callback;\n    return this;\n  };\n  setQueryKeyMapper = (callback: (request: RequestInstance) => string) => {\n    this.unstable_queryKeyMapper = callback;\n    return this;\n  };\n  setRequestIdMapper = (callback: (request: RequestInstance) => string) => {\n    this.unstable_requestIdMapper = callback;\n    return this;\n  };\n\n  /**\n   * Helper used by http adapter to apply the modifications on response error\n   * @private\n   */\n  unstable_modifyAuth = async (request: RequestInstance) => interceptRequest(this.unstable_onAuthCallbacks, request);\n\n  /**\n   * Private helper to run async pre-request processing\n   * @private\n   */\n  unstable_modifyRequest = async (request: RequestInstance) =>\n    interceptRequest(this.unstable_onRequestCallbacks, request);\n\n  /**\n   * Private helper to run async on-error response processing\n   * @private\n   */\n  unstable_modifyErrorResponse = async (\n    response: ResponseType<any, GlobalErrorType, Adapter>,\n    request: RequestInstance,\n  ) => interceptResponse<GlobalErrorType, ClientInstance>(this.unstable_onErrorCallbacks, response, request);\n\n  /**\n   * Private helper to run async on-success response processing\n   * @private\n   */\n  unstable_modifySuccessResponse = async (\n    response: ResponseType<any, GlobalErrorType, Adapter>,\n    request: RequestInstance,\n  ) => interceptResponse<GlobalErrorType, ClientInstance>(this.unstable_onSuccessCallbacks, response, request);\n\n  /**\n   * Private helper to run async response processing\n   * @private\n   */\n  unstable_modifyResponse = async (response: ResponseType<any, GlobalErrorType, Adapter>, request: RequestInstance) =>\n    interceptResponse<GlobalErrorType, ClientInstance>(this.unstable_onResponseCallbacks, response, request);\n\n  /**\n   * Reconstruct a Request class instance from its serialized JSON form.\n   * Useful when dispatcher storage serializes queue data (e.g. MMKV, AsyncStorage)\n   * and the deserialized request loses its class identity.\n   */\n  fromJSON = <RequestProperties extends RequestGenericType<ExtractAdapterQueryParamsType<Adapter>> = {}>(\n    json: RequestJSON<RequestInstance>,\n  ) => {\n    type DefaultQueryParams = ExtractAdapterDefaultQueryParamsType<Adapter>;\n\n    type Response = TypeWithDefaults<RequestProperties, \"response\", undefined>;\n    type Payload = TypeWithDefaults<RequestProperties, \"payload\", undefined>;\n    type LocalError = TypeWithDefaults<RequestProperties, \"error\", GlobalErrorType>;\n    type QueryParams = TypeWithDefaults<RequestProperties, \"queryParams\", DefaultQueryParams, never>;\n    type Endpoint = TypeWithDefaults<RequestProperties, \"endpoint\", string>;\n\n    return Request.fromJSON(this as unknown as ClientInstance, json) as unknown as Request<\n      Response,\n      Payload,\n      QueryParams,\n      LocalError,\n      Endpoint extends string ? Endpoint : string,\n      Client<GlobalErrorType, Adapter>\n    >;\n  };\n\n  /**\n   * Clears the Client instance and remove all listeners on it's dependencies\n   */\n  clear = () => {\n    const { appManager, cache, fetchDispatcher, submitDispatcher } = this.options;\n\n    this.requestManager.abortControllers.clear();\n    this.fetchDispatcher.clear();\n    this.submitDispatcher.clear();\n    this.cache.clear();\n\n    this.requestManager.emitter.removeAllListeners();\n    this.fetchDispatcher.emitter.removeAllListeners();\n    this.submitDispatcher.emitter.removeAllListeners();\n    this.cache.emitter.removeAllListeners();\n\n    this.cache = cache?.() || new Cache();\n    this.appManager = appManager?.() || new AppManager();\n    this.fetchDispatcher = fetchDispatcher?.() || new Dispatcher();\n    this.submitDispatcher = submitDispatcher?.() || new Dispatcher();\n\n    // DO NOT CHANGE INITIALIZATION ORDER\n    this.appManager.initialize();\n    this.cache.initialize(this as unknown as ClientInstance<{ adapter: Adapter }>);\n    this.fetchDispatcher.initialize(this as unknown as ClientInstance<{ adapter: Adapter }>);\n    this.submitDispatcher.initialize(this as unknown as ClientInstance<{ adapter: Adapter }>);\n  };\n\n  /**\n   * Hydrate your SSR cache data\n   * @param hydrationData\n   * @param options\n   */\n  hydrate = (\n    hydrationData: (HydrateDataType | EmptyTypes)[],\n    options?: Partial<HydrationOptions> | ((item: HydrateDataType) => Partial<HydrationOptions>),\n  ) => {\n    hydrationData?.forEach((item) => {\n      if (!item) return;\n\n      const { cacheKey, scope, response, ...fallbackOptions } = item;\n      const defaults = {\n        cache: true,\n        override: true,\n      } satisfies Partial<HydrationOptions>;\n      const config =\n        typeof options === \"function\"\n          ? { ...defaults, ...fallbackOptions, ...options(item) }\n          : { ...defaults, ...fallbackOptions, ...options };\n\n      if (!config.override) {\n        const cachedData = this.cache.get(scopeKey(cacheKey, scope));\n        if (cachedData) {\n          return;\n        }\n      }\n\n      const parsedData = parseResponse(response);\n      this.cache.set({ ...config, cacheKey, scope }, parsedData);\n    });\n  };\n\n  /**\n   * Create requests based on the Client setup\n   *\n   * @template Response Your response\n   */\n  createRequest = <RequestProperties extends RequestGenericType<ExtractAdapterQueryParamsType<Adapter>> = {}>(\n    /**\n     * `createRequest` must be initialized twice(currying).\n     *\n     * ✅ Good:\n     * ```ts\n     * const request = createRequest<RequestProperties>()(params)\n     * ```\n     * ⛔ Bad:\n     * ```ts\n     * const request = createRequest<RequestProperties>(params)\n     * ```\n     *\n     * We are using currying to achieve auto generated types for the endpoint string.\n     *\n     * This solution will be removed once https://github.com/microsoft/TypeScript/issues/10571 get resolved.\n     */\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    _USE_DOUBLE_INITIALIZATION?: never,\n  ) => {\n    type DefaultQueryParams = ExtractAdapterDefaultQueryParamsType<Adapter>;\n\n    type Response = TypeWithDefaults<RequestProperties, \"response\", undefined>;\n    type Payload = TypeWithDefaults<RequestProperties, \"payload\", undefined>;\n    type LocalError = TypeWithDefaults<RequestProperties, \"error\", GlobalErrorType>;\n    /** we pass never to prevent the type from being empty, but we allow it to be undefined (optional) */\n    type QueryParams = TypeWithDefaults<RequestProperties, \"queryParams\", DefaultQueryParams, never>;\n\n    return <\n      EndpointType extends ExtractAdapterEndpointType<Adapter>,\n      AdapterOptions extends ExtractAdapterOptionsType<Adapter>,\n      MethodType extends ExtractAdapterMethodType<Adapter>,\n    >(\n      params: RequestOptionsType<EndpointType, AdapterOptions, MethodType>,\n    ) => {\n      type Endpoint = TypeWithDefaults<RequestProperties, \"endpoint\", EndpointType>;\n\n      const endpoint = this.adapter.unstable_endpointMapper(params.endpoint);\n\n      // Splitting this type prevents \"Type instantiation is excessively deep and possibly infinite\" error\n      type ExtractedAdapter = ExtractUnionAdapter<\n        Adapter,\n        {\n          method: MethodType;\n          options: AdapterOptions;\n          queryParams: QueryParams;\n        }\n      >;\n      type ExtractedAdapterType = ExtractedAdapter extends EmptyTypes ? Adapter : ExtractedAdapter;\n\n      const mappedParams: RequestOptionsType<\n        Endpoint extends string ? Endpoint : typeof endpoint,\n        AdapterOptions,\n        MethodType\n      > = {\n        ...params,\n        endpoint: String(endpoint) as Endpoint extends string ? Endpoint : typeof endpoint,\n      };\n\n      const request = new Request<\n        Response,\n        Payload,\n        QueryParams,\n        LocalError,\n        Endpoint extends string ? Endpoint : typeof endpoint,\n        Client<GlobalErrorType, ExtractedAdapterType>\n      >(this as unknown as Client<GlobalErrorType, ExtractedAdapterType>, mappedParams);\n\n      this.plugins.forEach((plugin) => plugin.trigger(\"onRequestCreate\", { request }));\n\n      return request;\n    };\n  };\n}\n","export const stringifyDefaultOptions = {\n  strict: true,\n  encode: true,\n  arrayFormat: \"bracket\",\n  arraySeparator: \"bracket\",\n  sort: false,\n  skipNull: true,\n  skipEmptyString: true,\n} as const;\n","import type { TypeWithDefaults } from \"types\";\nimport type { ClientErrorType, ClientOptionsType } from \"client\";\nimport { Client } from \"client\";\nimport type { HttpAdapterType } from \"http-adapter\";\n\nexport type ClientGenericType = {\n  error?: ClientErrorType;\n};\n\nexport function createClient<ClientProperties extends ClientGenericType = {}>(\n  options: ClientOptionsType<Client<NonNullable<TypeWithDefaults<ClientProperties, \"error\", Error>>>>,\n): Client<NonNullable<TypeWithDefaults<ClientProperties, \"error\", Error>>, HttpAdapterType> {\n  return new Client<NonNullable<TypeWithDefaults<ClientProperties, \"error\", Error>>, HttpAdapterType>(options);\n}\n","import type { ClientInstance } from \"client\";\nimport type { RequestInstance } from \"request\";\nimport type { ExtractEndpointType } from \"types\";\n\nexport type RecursiveSchemaType = Record<\n  string, // for example users / $userId / posts / $postId\n  any\n>;\n\n/**\n * Per-request defaults that can be applied via SDK configuration.\n * These mirror the chainable setters on Request (headers, cache, retry, etc.).\n */\nexport type SdkRequestDefaults = {\n  headers?: HeadersInit;\n  auth?: boolean;\n  cache?: boolean;\n  cacheTime?: number;\n  staleTime?: number;\n  retry?: number;\n  retryTime?: number;\n  cancelable?: boolean;\n  queued?: boolean;\n  offline?: boolean;\n  deduplicate?: boolean;\n  deduplicateTime?: number | null;\n};\n\n/**\n * Recursively extracts all endpoint strings from an SDK schema type.\n * Leaf nodes (keys starting with $) are RequestInstance — extract endpoint from those.\n * Other keys are nested schema segments to recurse into.\n */\ntype ExtractSdkEndpoints<T, Depth extends unknown[] = []> = Depth[\"length\"] extends 10\n  ? never\n  : {\n      [K in keyof T]: K extends `$${string}`\n        ? T[K] extends RequestInstance\n          ? ExtractEndpointType<T[K]>\n          : never\n        : T[K] extends Record<string, any>\n          ? ExtractSdkEndpoints<T[K], [...Depth, unknown]>\n          : never;\n    }[keyof T];\n\n/**\n * Builds the set of valid configuration keys from an SDK schema:\n * - \"*\" (global wildcard)\n * - exact endpoint paths extracted from RequestInstance nodes\n * - wildcard patterns like \"/users/*\"\n */\ntype SdkConfigurationKeys<Schema extends RecursiveSchemaType> =\n  | \"*\"\n  | ExtractSdkEndpoints<Schema>\n  | `${ExtractSdkEndpoints<Schema> & string}/*`;\n\n/**\n * Maps endpoint paths or wildcard patterns to request defaults.\n * Keys are validated against the SDK schema — only known endpoints, their wildcard\n * variants, and \"*\" are accepted.\n */\nexport type SdkConfigurationMap<Schema extends RecursiveSchemaType = RecursiveSchemaType> = Partial<\n  Record<SdkConfigurationKeys<Schema>, SdkRequestDefaults>\n>;\n\nexport type CreateSdkOptions<Schema extends RecursiveSchemaType = RecursiveSchemaType> = {\n  /** @default true */\n  camelCaseToKebabCase?: boolean;\n  /** @default (method) => method.toUpperCase() */\n  methodTransform?: (method: string) => string;\n  /** Per-endpoint request defaults */\n  defaults?: SdkConfigurationMap<Schema>;\n};\n\nconst getMethod = (key: string, options?: CreateSdkOptions<any>) => {\n  const { methodTransform = (method: string) => method.toUpperCase() } = options ?? {};\n  return methodTransform(key);\n};\n\nconst endpointMatchesPattern = (endpoint: string, pattern: string): boolean => {\n  if (pattern === \"*\") return true;\n  if (pattern === endpoint) return true;\n  // Simple wildcard: \"/users/*\" matches \"/users/:userId\", \"/users/:userId/posts\", etc.\n  if (pattern.endsWith(\"/*\")) {\n    const prefix = pattern.slice(0, -1);\n    return endpoint.startsWith(prefix) || endpoint === prefix.slice(0, -1);\n  }\n  return false;\n};\n\nconst applyDefaults = (\n  request: RequestInstance,\n  endpoint: string,\n  defaults?: Record<string, SdkRequestDefaults>,\n): RequestInstance => {\n  if (!defaults) return request;\n\n  let result = request;\n  const entries = Object.entries(defaults);\n\n  for (let i = 0; i < entries.length; i += 1) {\n    const [pattern, config] = entries[i];\n    if (endpointMatchesPattern(endpoint, pattern)) {\n      if (config.headers) result = result.setHeaders(config.headers);\n      if (config.auth !== undefined) result = result.setAuth(config.auth);\n      if (config.cache !== undefined) result = result.setCache(config.cache);\n      if (config.cacheTime !== undefined) result = result.setCacheTime(config.cacheTime);\n      if (config.staleTime !== undefined) result = result.setStaleTime(config.staleTime);\n      if (config.retry !== undefined) result = result.setRetry(config.retry);\n      if (config.retryTime !== undefined) result = result.setRetryTime(config.retryTime);\n      if (config.cancelable !== undefined) result = result.setCancelable(config.cancelable);\n      if (config.queued !== undefined) result = result.setQueued(config.queued);\n      if (config.offline !== undefined) result = result.setOffline(config.offline);\n      if (config.deduplicate !== undefined) result = result.setDeduplicate(config.deduplicate);\n      if (config.deduplicateTime !== undefined && config.deduplicateTime !== null) {\n        result = result.setDeduplicateTime(config.deduplicateTime);\n      }\n    }\n  }\n\n  return result;\n};\n\nconst createRecursiveProxy = (client: ClientInstance, path: string[], options?: CreateSdkOptions<any>): any => {\n  // eslint-disable-next-line @typescript-eslint/no-empty-function\n  return new Proxy(() => {}, {\n    get: (_target, key: string) => {\n      if (typeof key === \"symbol\" || key === \"inspect\") {\n        return undefined;\n      }\n\n      // Check if this is a method (starts with $) or a path segment\n      let isMethod = false;\n      let methodName = key;\n      let pathSegment = key;\n\n      if (key.startsWith(\"$\")) {\n        // This could be either a method or a parameter\n        // Try to determine by checking if it's a terminal access (method)\n        // For now, assume it's a method and strip the $ prefix\n        isMethod = true;\n        methodName = key.slice(1);\n        pathSegment = `:${key.slice(1)}`; // Convert to parameter format for path building\n      } else if (options?.camelCaseToKebabCase) {\n        // Convert camelCase to kebab-case for path segments if option is enabled\n        pathSegment = key.replace(/[A-Z]/g, (letter) => `-${letter.toLowerCase()}`);\n      }\n\n      // Always create a request assuming this is a method call\n      const endpoint = `/${path.join(\"/\")}`;\n      const method = getMethod(isMethod ? methodName : key, options);\n      let request: RequestInstance = client.createRequest()({ endpoint, method });\n      request = applyDefaults(request, endpoint, options?.defaults);\n\n      // But also, assume the key is a new path segment for a deeper call\n      const newPath = [...path, pathSegment];\n      const deeperProxy = createRecursiveProxy(client, newPath, options);\n\n      // Return a new proxy that wraps both the request and the deeper proxy\n      return new Proxy(request, {\n        get: (reqTarget, reqKey: string) => {\n          // If the property exists on the request instance (like .send(), .setParams()), return it.\n          if (reqKey in reqTarget) {\n            return reqTarget[reqKey as keyof typeof reqTarget];\n          }\n          // Otherwise, it's a deeper path, so delegate to the deeper proxy.\n          return deeperProxy[reqKey];\n        },\n      });\n    },\n  });\n};\n\nexport type SdkInstance<Schema extends RecursiveSchemaType> = Schema & {\n  /**\n   * Apply request defaults to the SDK. Returns a new SDK instance with the configuration applied.\n   * Use \"*\" to match all endpoints, or specific endpoint strings / wildcard patterns.\n   */\n  $configure: (defaults: SdkConfigurationMap<Schema>) => SdkInstance<Schema>;\n};\n\nexport const createSdk = <Client extends ClientInstance, RecursiveSchema extends RecursiveSchemaType>(\n  client: Client,\n  options?: CreateSdkOptions<RecursiveSchema>,\n): SdkInstance<RecursiveSchema> => {\n  const {\n    camelCaseToKebabCase = true,\n    methodTransform = (method: string) => method.toUpperCase(),\n    ...rest\n  } = options ?? {};\n\n  const mergedOptions: CreateSdkOptions<RecursiveSchema> = { camelCaseToKebabCase, methodTransform, ...rest };\n  // Break inference for TypeDoc / tsserver (TS2589) — runtime value is unchanged.\n  const proxy = createRecursiveProxy(client, [], mergedOptions as never);\n\n  return new Proxy(proxy, {\n    get: (target, key: string) => {\n      if (key === \"$configure\") {\n        return (defaults: SdkConfigurationMap<RecursiveSchema>) => {\n          const existingDefaults = mergedOptions.defaults || {};\n          return createSdk<Client, RecursiveSchema>(client, {\n            ...mergedOptions,\n            defaults: { ...existingDefaults, ...defaults } as SdkConfigurationMap<RecursiveSchema>,\n          });\n        };\n      }\n      return target[key];\n    },\n  }) as SdkInstance<RecursiveSchema>;\n};\n\n/**\n * Type-safe factory for creating SDK configuration maps.\n *\n * @example\n * const config = createConfiguration<MySdkSchema>()({ \"*\": { retry: 3 } })\n */\nexport const createConfiguration = <Schema extends RecursiveSchemaType>() => {\n  return (defaults: SdkConfigurationMap<Schema>): SdkConfigurationMap<Schema> => defaults;\n};\n"],"x_google_ignoreList":[2],"mappings":"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"}