[
  {
    "path": ".babelrc",
    "content": "{\n  \"presets\": [\"@babel/preset-env\"]\n}"
  },
  {
    "path": ".editorconfig",
    "content": "root = true\n\n[*]\nend_of_line = lf\ninsert_final_newline = true\n\n[*.js]\ncharset = utf-8\nindent_style = space\nindent_size = 2\n"
  },
  {
    "path": ".eslintrc.json",
    "content": "{\n  \"root\": true,\n  \"extends\": [\n    \"plugin:vue/recommended\"\n  ]\n}"
  },
  {
    "path": ".gitignore",
    "content": "node_modules\n/lib\n\n# SublimeText\n*.sublime-project\n*.sublime-workspace\n"
  },
  {
    "path": ".prettierrc",
    "content": "{\n  \"printWidth\": 120,\n  \"trailingComma\": \"all\",\n  \"singleQuote\": true\n}"
  },
  {
    "path": "LICENSE.md",
    "content": "MIT License\n\nCopyright (c) 2021 James Churchard\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# VueSSE\n[![GitHub issues](https://img.shields.io/github/issues/tserkov/vue-sse.svg)]()\n[![license](https://img.shields.io/github/license/tserkov/vue-sse.svg)]()\n\nVueSSE enables effortless use of [Server-Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events) by providing a high-level interface to an underlying [EventSource](https://developer.mozilla.org/en-US/docs/Web/API/EventSource).\n\n## Install\n```bash\n# npm\nnpm install --save vue-sse\n\n# OR yarn\nyarn add vue-sse\n```\n\n```javascript\n// in main.js\nimport VueSSE from 'vue-sse';\n\n// using defaults\nVue.use(VueSSE);\n\n// OR specify custom defaults (described below)\nVue.use(VueSSE, {\n  format: 'json',\n  polyfill: true,\n  url: '/my-events-server',\n  withCredentials: true,\n});\n```\n\n## Quickstart\n```js\nthis.$sse.create('/my-events-server')\n  .on('message', (msg) => console.info('Message:', msg))\n  .on('error', (err) => console.error('Failed to parse or lost connection:', err))\n  .connect()\n  .catch((err) => console.error('Failed make initial connection:', err));\n```\n\n## Usage\nClients can be created from the Vue object via `Vue.$sse.create(...)` or from within components via `this.$sse.create(...)`\n\nAll of the following are valid calls to create a client:\n- `this.$sse.create('/your-events-endpoint')` to connect to the specified URL without specifying any config\n- `this.$sse.create({ url: '/your-events-endpoint', format: 'json' })` will automatically parse incoming messages as JSON\n- `this.$sse.create({ url: '/your-events-endpoint', withCredentials: true })` will set CORS on the request\n\nOnce you've created a client, you can add handlers before or after calling `connect()`, which must be called.\n\n## Configuration\n`$sse.create` accepts the following config options when installing VueSSE via `Vue.use` and when calling `$sse.create`.\n\n| Option | Type | Description | Default |\n| --- | --- | --- | -- |\n| format | `\"plain\"` \\| `\"json\"` \\| `(event: MessageEvent) => any` | Specify pre-processing, if any, to perform on incoming messages. Messages that fail formatting will emit an error. | `\"plain\"` |\n| url | `string` | The location of the SSE server. | `\"\"` |\n| withCredentials | `boolean` | Indicates if CORS should be set to include credentials. | `false` |\n| polyfill | `boolean` | Include an [EventSource polyfill](https://github.com/Yaffle/EventSource) for older browsers. | `false` |\n| forcePolyfill | `boolean` | Forces the [EventSource polyfill](https://github.com/Yaffle/EventSource) to always be used over native. | `false` |\n| polyfillOptions | `object` | Custom options to provide to the [EventSource polyfill](https://github.com/Yaffle/EventSource#custom-headers). Only used if `forcePolyfill` is true. | `null` |\n\nIf `$sse.create` is called with a string, it must be the URL to the SSE server.\n\n## Methods\nOnce you've successfully connected to an events server, a client will be returned with the following methods:\n\n| Name | Description |\n| --- | --- |\n| __connect__(): _Promise<SSEClient>_ | Connects to the server. __Must be called.__ |\n| __on__(event: _string_, (data: _any_) => _void_): _SSEClient_ | Adds an event-specific listener to the event stream.  The handler function receives the message as its argument (formatted if a format was specified), and the original underlying Event. For non-event messages, specify `\"\"` or `\"message\"` as the event. |\n| __once__(event: _string_, (data: _any_) => _void_): _SSEClient_ | Same as `on(...)`, but only triggered once. |\n| __off__(event: _string_, (data: _any_ => _void_)): _SSEClient_ | Removes the given handler from the event stream. The function must be the same as provided to `on`/`once`. |\n| __on__('error', (err) => void): _SSEClient_ | Allows your application to handle any errors thrown, such as loss of server connection and pre-processing errors. |\n| __disconnect__(): _void_ | Closes the connection. The client can be re-used by calling `connect()`. __Must be called!__ (Usually, in the `beforeDestroy` of your component.) |\n\n## Properties\n| Name | Type | Description |\n| --- | --- | --- |\n| source | `EventSource` | Returns the underlying EventSource. |\n\n## Cleanup\nEvery connection must be disconnected when the component is destroyed. There are two ways to achieve this:\n1. Call `disconnect()` on the client during `beforeDestroy`, or\n2. Add the following option to your component to have them automatically closed for you during `beforeDestroy`:\n```js\nexport default {\n    name: 'my-component',\n    data() { /* ... */ },\n    // ...\n    sse: {\n        cleanup: true,\n    },\n    // ...\n}\n```\n\n## Vue 3\nThis plugin works the same in both Vue 2 and 3. The Composition API is not yet supported.\n\n## Example\nAn example project is provided at [tserkov/vue-sse-example](https://github.com/tserkov/vue-sse-example).\n\n### Kitchen Sink\n```html\n<template>\n  <div>\n    <p\n      v-for=\"(message, idx) in messages\"\n      :key=\"idx\"\n    >{{ message }}</p>\n  </div>\n</template>\n\n<script>\n// We store the reference to the SSE client out here\n// so we can access it from other methods\nlet sseClient;\n\nexport default {\n  name: 'sse-test',\n  data() {\n    return {\n      messages: [],\n    };\n  },\n  mounted() {\n    sseClient = this.$sse.create({\n      url: '/your-events-server',\n      format: 'json',\n      withCredentials: true,\n      polyfill: true,\n    });\n\n    // Catch any errors (ie. lost connections, etc.)\n    sseClient.on('error', (e) => {\n      console.error('lost connection or failed to parse!', e);\n\n      // If this error is due to an unexpected disconnection, EventSource will\n      // automatically attempt to reconnect indefinitely. You will _not_ need to\n      // re-add your handlers.\n    });\n\n    // Handle messages without a specific event\n    sseClient.on('message', this.handleMessage);\n\n    // Handle 'chat' messages\n    sseClient.on('chat', this.handleChat);\n\n    // Handle once for a ban message\n    sseClient.once('ban', this.handleBan);\n\n    sseClient.connect()\n      .then(sse => {\n        console.log('We\\'re connected!');\n\n        // Unsubscribes from event-less messages after 7 seconds\n        setTimeout(() => {\n          sseClient.off('message', this.handleMessage);\n          console.log('Stopped listening to event-less messages!');\n        }, 7000);\n\n        // Unsubscribes from chat messages after 14 seconds\n        setTimeout(() => {\n          sse.off('chat', this.handleChat);\n          console.log('Stopped listening to chat messages!');\n        }, 14000);\n      })\n      .catch((err) => {\n        // When this error is caught, it means the initial connection to the\n        // events server failed.  No automatic attempts to reconnect will be made.\n        console.error('Failed to connect to server', err);\n      });\n  },\n  methods: {\n    handleBan(banMessage) {\n      // Note that we can access properties of message, since our parser is set to JSON\n      // and the hypothetical object has a `reason` property.\n      this.messages.push(`You've been banned! Reason: ${banMessage.reason}`);\n    },\n    handleChat(message) {\n      // Note that we can access properties of message, since our parser is set to JSON\n      // and the hypothetical object has these properties.\n      this.messages.push(`${message.user} said: ${message.text}`);\n    },\n    handleMessage(message, lastEventId) {\n      console.warn('Received a message w/o an event!', message, lastEventId);\n    },\n  },\n  beforeDestroy() {\n    // Make sure to close the connection with the events server\n    // when the component is destroyed, or we'll have ghost connections!\n    sseClient.disconnect();\n\n    // Alternatively, we could have added the `sse: { cleanup: true }` option to our component,\n    // and the SSEManager would have automatically disconnected during beforeDestroy.\n  },\n};\n</script>\n```\n"
  },
  {
    "path": "dist/vue-sse.common.js",
    "content": "/*!\n * vue-sse v2.5.0\n * (c) 2021 James Churchard\n * @license MIT\n */\n'use strict';\n\nvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nfunction createCommonjsModule(fn) {\n  var module = { exports: {} };\n\treturn fn(module, module.exports), module.exports;\n}\n\n/** @license\r\n * eventsource.js\r\n * Available under MIT License (MIT)\r\n * https://github.com/Yaffle/EventSource/\r\n */\n\nvar eventsource = createCommonjsModule(function (module, exports) {\n/*jslint indent: 2, vars: true, plusplus: true */\r\n/*global setTimeout, clearTimeout */\r\n\r\n(function (global) {\r\n\r\n  var setTimeout = global.setTimeout;\r\n  var clearTimeout = global.clearTimeout;\r\n  var XMLHttpRequest = global.XMLHttpRequest;\r\n  var XDomainRequest = global.XDomainRequest;\r\n  var ActiveXObject = global.ActiveXObject;\r\n  var NativeEventSource = global.EventSource;\r\n\r\n  var document = global.document;\r\n  var Promise = global.Promise;\r\n  var fetch = global.fetch;\r\n  var Response = global.Response;\r\n  var TextDecoder = global.TextDecoder;\r\n  var TextEncoder = global.TextEncoder;\r\n  var AbortController = global.AbortController;\r\n\r\n  if (typeof window !== \"undefined\" && !(\"readyState\" in document) && document.body == null) { // Firefox 2\r\n    document.readyState = \"loading\";\r\n    window.addEventListener(\"load\", function (event) {\r\n      document.readyState = \"complete\";\r\n    }, false);\r\n  }\r\n\r\n  if (XMLHttpRequest == null && ActiveXObject != null) { // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest_in_IE6\r\n    XMLHttpRequest = function () {\r\n      return new ActiveXObject(\"Microsoft.XMLHTTP\");\r\n    };\r\n  }\r\n\r\n  if (Object.create == undefined) {\r\n    Object.create = function (C) {\r\n      function F(){}\r\n      F.prototype = C;\r\n      return new F();\r\n    };\r\n  }\r\n\r\n  if (!Date.now) {\r\n    Date.now = function now() {\r\n      return new Date().getTime();\r\n    };\r\n  }\r\n\r\n  // see #118 (Promise#finally with polyfilled Promise)\r\n  // see #123 (data URLs crash Edge)\r\n  // see #125 (CSP violations)\r\n  // see pull/#138\r\n  // => No way to polyfill Promise#finally\r\n\r\n  if (AbortController == undefined) {\r\n    var originalFetch2 = fetch;\r\n    fetch = function (url, options) {\r\n      var signal = options.signal;\r\n      return originalFetch2(url, {headers: options.headers, credentials: options.credentials, cache: options.cache}).then(function (response) {\r\n        var reader = response.body.getReader();\r\n        signal._reader = reader;\r\n        if (signal._aborted) {\r\n          signal._reader.cancel();\r\n        }\r\n        return {\r\n          status: response.status,\r\n          statusText: response.statusText,\r\n          headers: response.headers,\r\n          body: {\r\n            getReader: function () {\r\n              return reader;\r\n            }\r\n          }\r\n        };\r\n      });\r\n    };\r\n    AbortController = function () {\r\n      this.signal = {\r\n        _reader: null,\r\n        _aborted: false\r\n      };\r\n      this.abort = function () {\r\n        if (this.signal._reader != null) {\r\n          this.signal._reader.cancel();\r\n        }\r\n        this.signal._aborted = true;\r\n      };\r\n    };\r\n  }\r\n\r\n  function TextDecoderPolyfill() {\r\n    this.bitsNeeded = 0;\r\n    this.codePoint = 0;\r\n  }\r\n\r\n  TextDecoderPolyfill.prototype.decode = function (octets) {\r\n    function valid(codePoint, shift, octetsCount) {\r\n      if (octetsCount === 1) {\r\n        return codePoint >= 0x0080 >> shift && codePoint << shift <= 0x07FF;\r\n      }\r\n      if (octetsCount === 2) {\r\n        return codePoint >= 0x0800 >> shift && codePoint << shift <= 0xD7FF || codePoint >= 0xE000 >> shift && codePoint << shift <= 0xFFFF;\r\n      }\r\n      if (octetsCount === 3) {\r\n        return codePoint >= 0x010000 >> shift && codePoint << shift <= 0x10FFFF;\r\n      }\r\n      throw new Error();\r\n    }\r\n    function octetsCount(bitsNeeded, codePoint) {\r\n      if (bitsNeeded === 6 * 1) {\r\n        return codePoint >> 6 > 15 ? 3 : codePoint > 31 ? 2 : 1;\r\n      }\r\n      if (bitsNeeded === 6 * 2) {\r\n        return codePoint > 15 ? 3 : 2;\r\n      }\r\n      if (bitsNeeded === 6 * 3) {\r\n        return 3;\r\n      }\r\n      throw new Error();\r\n    }\r\n    var REPLACER = 0xFFFD;\r\n    var string = \"\";\r\n    var bitsNeeded = this.bitsNeeded;\r\n    var codePoint = this.codePoint;\r\n    for (var i = 0; i < octets.length; i += 1) {\r\n      var octet = octets[i];\r\n      if (bitsNeeded !== 0) {\r\n        if (octet < 128 || octet > 191 || !valid(codePoint << 6 | octet & 63, bitsNeeded - 6, octetsCount(bitsNeeded, codePoint))) {\r\n          bitsNeeded = 0;\r\n          codePoint = REPLACER;\r\n          string += String.fromCharCode(codePoint);\r\n        }\r\n      }\r\n      if (bitsNeeded === 0) {\r\n        if (octet >= 0 && octet <= 127) {\r\n          bitsNeeded = 0;\r\n          codePoint = octet;\r\n        } else if (octet >= 192 && octet <= 223) {\r\n          bitsNeeded = 6 * 1;\r\n          codePoint = octet & 31;\r\n        } else if (octet >= 224 && octet <= 239) {\r\n          bitsNeeded = 6 * 2;\r\n          codePoint = octet & 15;\r\n        } else if (octet >= 240 && octet <= 247) {\r\n          bitsNeeded = 6 * 3;\r\n          codePoint = octet & 7;\r\n        } else {\r\n          bitsNeeded = 0;\r\n          codePoint = REPLACER;\r\n        }\r\n        if (bitsNeeded !== 0 && !valid(codePoint, bitsNeeded, octetsCount(bitsNeeded, codePoint))) {\r\n          bitsNeeded = 0;\r\n          codePoint = REPLACER;\r\n        }\r\n      } else {\r\n        bitsNeeded -= 6;\r\n        codePoint = codePoint << 6 | octet & 63;\r\n      }\r\n      if (bitsNeeded === 0) {\r\n        if (codePoint <= 0xFFFF) {\r\n          string += String.fromCharCode(codePoint);\r\n        } else {\r\n          string += String.fromCharCode(0xD800 + (codePoint - 0xFFFF - 1 >> 10));\r\n          string += String.fromCharCode(0xDC00 + (codePoint - 0xFFFF - 1 & 0x3FF));\r\n        }\r\n      }\r\n    }\r\n    this.bitsNeeded = bitsNeeded;\r\n    this.codePoint = codePoint;\r\n    return string;\r\n  };\r\n\r\n  // Firefox < 38 throws an error with stream option\r\n  var supportsStreamOption = function () {\r\n    try {\r\n      return new TextDecoder().decode(new TextEncoder().encode(\"test\"), {stream: true}) === \"test\";\r\n    } catch (error) {\r\n      console.debug(\"TextDecoder does not support streaming option. Using polyfill instead: \" + error);\r\n    }\r\n    return false;\r\n  };\r\n\r\n  // IE, Edge\r\n  if (TextDecoder == undefined || TextEncoder == undefined || !supportsStreamOption()) {\r\n    TextDecoder = TextDecoderPolyfill;\r\n  }\r\n\r\n  var k = function () {\r\n  };\r\n\r\n  function XHRWrapper(xhr) {\r\n    this.withCredentials = false;\r\n    this.readyState = 0;\r\n    this.status = 0;\r\n    this.statusText = \"\";\r\n    this.responseText = \"\";\r\n    this.onprogress = k;\r\n    this.onload = k;\r\n    this.onerror = k;\r\n    this.onreadystatechange = k;\r\n    this._contentType = \"\";\r\n    this._xhr = xhr;\r\n    this._sendTimeout = 0;\r\n    this._abort = k;\r\n  }\r\n\r\n  XHRWrapper.prototype.open = function (method, url) {\r\n    this._abort(true);\r\n\r\n    var that = this;\r\n    var xhr = this._xhr;\r\n    var state = 1;\r\n    var timeout = 0;\r\n\r\n    this._abort = function (silent) {\r\n      if (that._sendTimeout !== 0) {\r\n        clearTimeout(that._sendTimeout);\r\n        that._sendTimeout = 0;\r\n      }\r\n      if (state === 1 || state === 2 || state === 3) {\r\n        state = 4;\r\n        xhr.onload = k;\r\n        xhr.onerror = k;\r\n        xhr.onabort = k;\r\n        xhr.onprogress = k;\r\n        xhr.onreadystatechange = k;\r\n        // IE 8 - 9: XDomainRequest#abort() does not fire any event\r\n        // Opera < 10: XMLHttpRequest#abort() does not fire any event\r\n        xhr.abort();\r\n        if (timeout !== 0) {\r\n          clearTimeout(timeout);\r\n          timeout = 0;\r\n        }\r\n        if (!silent) {\r\n          that.readyState = 4;\r\n          that.onabort(null);\r\n          that.onreadystatechange();\r\n        }\r\n      }\r\n      state = 0;\r\n    };\r\n\r\n    var onStart = function () {\r\n      if (state === 1) {\r\n        //state = 2;\r\n        var status = 0;\r\n        var statusText = \"\";\r\n        var contentType = undefined;\r\n        if (!(\"contentType\" in xhr)) {\r\n          try {\r\n            status = xhr.status;\r\n            statusText = xhr.statusText;\r\n            contentType = xhr.getResponseHeader(\"Content-Type\");\r\n          } catch (error) {\r\n            // IE < 10 throws exception for `xhr.status` when xhr.readyState === 2 || xhr.readyState === 3\r\n            // Opera < 11 throws exception for `xhr.status` when xhr.readyState === 2\r\n            // https://bugs.webkit.org/show_bug.cgi?id=29121\r\n            status = 0;\r\n            statusText = \"\";\r\n            contentType = undefined;\r\n            // Firefox < 14, Chrome ?, Safari ?\r\n            // https://bugs.webkit.org/show_bug.cgi?id=29658\r\n            // https://bugs.webkit.org/show_bug.cgi?id=77854\r\n          }\r\n        } else {\r\n          status = 200;\r\n          statusText = \"OK\";\r\n          contentType = xhr.contentType;\r\n        }\r\n        if (status !== 0) {\r\n          state = 2;\r\n          that.readyState = 2;\r\n          that.status = status;\r\n          that.statusText = statusText;\r\n          that._contentType = contentType;\r\n          that.onreadystatechange();\r\n        }\r\n      }\r\n    };\r\n    var onProgress = function () {\r\n      onStart();\r\n      if (state === 2 || state === 3) {\r\n        state = 3;\r\n        var responseText = \"\";\r\n        try {\r\n          responseText = xhr.responseText;\r\n        } catch (error) {\r\n          // IE 8 - 9 with XMLHttpRequest\r\n        }\r\n        that.readyState = 3;\r\n        that.responseText = responseText;\r\n        that.onprogress();\r\n      }\r\n    };\r\n    var onFinish = function (type, event) {\r\n      if (event == null || event.preventDefault == null) {\r\n        event = {\r\n          preventDefault: k\r\n        };\r\n      }\r\n      // Firefox 52 fires \"readystatechange\" (xhr.readyState === 4) without final \"readystatechange\" (xhr.readyState === 3)\r\n      // IE 8 fires \"onload\" without \"onprogress\"\r\n      onProgress();\r\n      if (state === 1 || state === 2 || state === 3) {\r\n        state = 4;\r\n        if (timeout !== 0) {\r\n          clearTimeout(timeout);\r\n          timeout = 0;\r\n        }\r\n        that.readyState = 4;\r\n        if (type === \"load\") {\r\n          that.onload(event);\r\n        } else if (type === \"error\") {\r\n          that.onerror(event);\r\n        } else if (type === \"abort\") {\r\n          that.onabort(event);\r\n        } else {\r\n          throw new TypeError();\r\n        }\r\n        that.onreadystatechange();\r\n      }\r\n    };\r\n    var onReadyStateChange = function (event) {\r\n      if (xhr != undefined) { // Opera 12\r\n        if (xhr.readyState === 4) {\r\n          if (!(\"onload\" in xhr) || !(\"onerror\" in xhr) || !(\"onabort\" in xhr)) {\r\n            onFinish(xhr.responseText === \"\" ? \"error\" : \"load\", event);\r\n          }\r\n        } else if (xhr.readyState === 3) {\r\n          if (!(\"onprogress\" in xhr)) { // testing XMLHttpRequest#responseText too many times is too slow in IE 11\r\n            // and in Firefox 3.6\r\n            onProgress();\r\n          }\r\n        } else if (xhr.readyState === 2) {\r\n          onStart();\r\n        }\r\n      }\r\n    };\r\n    var onTimeout = function () {\r\n      timeout = setTimeout(function () {\r\n        onTimeout();\r\n      }, 500);\r\n      if (xhr.readyState === 3) {\r\n        onProgress();\r\n      }\r\n    };\r\n\r\n    // XDomainRequest#abort removes onprogress, onerror, onload\r\n    if (\"onload\" in xhr) {\r\n      xhr.onload = function (event) {\r\n        onFinish(\"load\", event);\r\n      };\r\n    }\r\n    if (\"onerror\" in xhr) {\r\n      xhr.onerror = function (event) {\r\n        onFinish(\"error\", event);\r\n      };\r\n    }\r\n    // improper fix to match Firefox behaviour, but it is better than just ignore abort\r\n    // see https://bugzilla.mozilla.org/show_bug.cgi?id=768596\r\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=880200\r\n    // https://code.google.com/p/chromium/issues/detail?id=153570\r\n    // IE 8 fires \"onload\" without \"onprogress\r\n    if (\"onabort\" in xhr) {\r\n      xhr.onabort = function (event) {\r\n        onFinish(\"abort\", event);\r\n      };\r\n    }\r\n\r\n    if (\"onprogress\" in xhr) {\r\n      xhr.onprogress = onProgress;\r\n    }\r\n\r\n    // IE 8 - 9 (XMLHTTPRequest)\r\n    // Opera < 12\r\n    // Firefox < 3.5\r\n    // Firefox 3.5 - 3.6 - ? < 9.0\r\n    // onprogress is not fired sometimes or delayed\r\n    // see also #64 (significant lag in IE 11)\r\n    if (\"onreadystatechange\" in xhr) {\r\n      xhr.onreadystatechange = function (event) {\r\n        onReadyStateChange(event);\r\n      };\r\n    }\r\n\r\n    if (\"contentType\" in xhr || !(\"ontimeout\" in XMLHttpRequest.prototype)) {\r\n      url += (url.indexOf(\"?\") === -1 ? \"?\" : \"&\") + \"padding=true\";\r\n    }\r\n    xhr.open(method, url, true);\r\n\r\n    if (\"readyState\" in xhr) {\r\n      // workaround for Opera 12 issue with \"progress\" events\r\n      // #91 (XMLHttpRequest onprogress not fired for streaming response in Edge 14-15-?)\r\n      timeout = setTimeout(function () {\r\n        onTimeout();\r\n      }, 0);\r\n    }\r\n  };\r\n  XHRWrapper.prototype.abort = function () {\r\n    this._abort(false);\r\n  };\r\n  XHRWrapper.prototype.getResponseHeader = function (name) {\r\n    return this._contentType;\r\n  };\r\n  XHRWrapper.prototype.setRequestHeader = function (name, value) {\r\n    var xhr = this._xhr;\r\n    if (\"setRequestHeader\" in xhr) {\r\n      xhr.setRequestHeader(name, value);\r\n    }\r\n  };\r\n  XHRWrapper.prototype.getAllResponseHeaders = function () {\r\n    // XMLHttpRequest#getAllResponseHeaders returns null for CORS requests in Firefox 3.6.28\r\n    return this._xhr.getAllResponseHeaders != undefined ? this._xhr.getAllResponseHeaders() || \"\" : \"\";\r\n  };\r\n  XHRWrapper.prototype.send = function () {\r\n    // loading indicator in Safari < ? (6), Chrome < 14, Firefox\r\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=736723\r\n    if ((!(\"ontimeout\" in XMLHttpRequest.prototype) || (!(\"sendAsBinary\" in XMLHttpRequest.prototype) && !(\"mozAnon\" in XMLHttpRequest.prototype))) &&\r\n        document != undefined &&\r\n        document.readyState != undefined &&\r\n        document.readyState !== \"complete\") {\r\n      var that = this;\r\n      that._sendTimeout = setTimeout(function () {\r\n        that._sendTimeout = 0;\r\n        that.send();\r\n      }, 4);\r\n      return;\r\n    }\r\n\r\n    var xhr = this._xhr;\r\n    // withCredentials should be set after \"open\" for Safari and Chrome (< 19 ?)\r\n    if (\"withCredentials\" in xhr) {\r\n      xhr.withCredentials = this.withCredentials;\r\n    }\r\n    try {\r\n      // xhr.send(); throws \"Not enough arguments\" in Firefox 3.0\r\n      xhr.send(undefined);\r\n    } catch (error1) {\r\n      // Safari 5.1.7, Opera 12\r\n      throw error1;\r\n    }\r\n  };\r\n\r\n  function toLowerCase(name) {\r\n    return name.replace(/[A-Z]/g, function (c) {\r\n      return String.fromCharCode(c.charCodeAt(0) + 0x20);\r\n    });\r\n  }\r\n\r\n  function HeadersPolyfill(all) {\r\n    // Get headers: implemented according to mozilla's example code: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/getAllResponseHeaders#Example\r\n    var map = Object.create(null);\r\n    var array = all.split(\"\\r\\n\");\r\n    for (var i = 0; i < array.length; i += 1) {\r\n      var line = array[i];\r\n      var parts = line.split(\": \");\r\n      var name = parts.shift();\r\n      var value = parts.join(\": \");\r\n      map[toLowerCase(name)] = value;\r\n    }\r\n    this._map = map;\r\n  }\r\n  HeadersPolyfill.prototype.get = function (name) {\r\n    return this._map[toLowerCase(name)];\r\n  };\r\n\r\n  if (XMLHttpRequest != null && XMLHttpRequest.HEADERS_RECEIVED == null) { // IE < 9, Firefox 3.6\r\n    XMLHttpRequest.HEADERS_RECEIVED = 2;\r\n  }\r\n\r\n  function XHRTransport() {\r\n  }\r\n\r\n  XHRTransport.prototype.open = function (xhr, onStartCallback, onProgressCallback, onFinishCallback, url, withCredentials, headers) {\r\n    xhr.open(\"GET\", url);\r\n    var offset = 0;\r\n    xhr.onprogress = function () {\r\n      var responseText = xhr.responseText;\r\n      var chunk = responseText.slice(offset);\r\n      offset += chunk.length;\r\n      onProgressCallback(chunk);\r\n    };\r\n    xhr.onerror = function (event) {\r\n      event.preventDefault();\r\n      onFinishCallback(new Error(\"NetworkError\"));\r\n    };\r\n    xhr.onload = function () {\r\n      onFinishCallback(null);\r\n    };\r\n    xhr.onabort = function () {\r\n      onFinishCallback(null);\r\n    };\r\n    xhr.onreadystatechange = function () {\r\n      if (xhr.readyState === XMLHttpRequest.HEADERS_RECEIVED) {\r\n        var status = xhr.status;\r\n        var statusText = xhr.statusText;\r\n        var contentType = xhr.getResponseHeader(\"Content-Type\");\r\n        var headers = xhr.getAllResponseHeaders();\r\n        onStartCallback(status, statusText, contentType, new HeadersPolyfill(headers));\r\n      }\r\n    };\r\n    xhr.withCredentials = withCredentials;\r\n    for (var name in headers) {\r\n      if (Object.prototype.hasOwnProperty.call(headers, name)) {\r\n        xhr.setRequestHeader(name, headers[name]);\r\n      }\r\n    }\r\n    xhr.send();\r\n    return xhr;\r\n  };\r\n\r\n  function HeadersWrapper(headers) {\r\n    this._headers = headers;\r\n  }\r\n  HeadersWrapper.prototype.get = function (name) {\r\n    return this._headers.get(name);\r\n  };\r\n\r\n  function FetchTransport() {\r\n  }\r\n\r\n  FetchTransport.prototype.open = function (xhr, onStartCallback, onProgressCallback, onFinishCallback, url, withCredentials, headers) {\r\n    var reader = null;\r\n    var controller = new AbortController();\r\n    var signal = controller.signal;\r\n    var textDecoder = new TextDecoder();\r\n    fetch(url, {\r\n      headers: headers,\r\n      credentials: withCredentials ? \"include\" : \"same-origin\",\r\n      signal: signal,\r\n      cache: \"no-store\"\r\n    }).then(function (response) {\r\n      reader = response.body.getReader();\r\n      onStartCallback(response.status, response.statusText, response.headers.get(\"Content-Type\"), new HeadersWrapper(response.headers));\r\n      // see https://github.com/promises-aplus/promises-spec/issues/179\r\n      return new Promise(function (resolve, reject) {\r\n        var readNextChunk = function () {\r\n          reader.read().then(function (result) {\r\n            if (result.done) {\r\n              //Note: bytes in textDecoder are ignored\r\n              resolve(undefined);\r\n            } else {\r\n              var chunk = textDecoder.decode(result.value, {stream: true});\r\n              onProgressCallback(chunk);\r\n              readNextChunk();\r\n            }\r\n          })[\"catch\"](function (error) {\r\n            reject(error);\r\n          });\r\n        };\r\n        readNextChunk();\r\n      });\r\n    })[\"catch\"](function (error) {\r\n      if (error.name === \"AbortError\") {\r\n        return undefined;\r\n      } else {\r\n        return error;\r\n      }\r\n    }).then(function (error) {\r\n      onFinishCallback(error);\r\n    });\r\n    return {\r\n      abort: function () {\r\n        if (reader != null) {\r\n          reader.cancel(); // https://bugzilla.mozilla.org/show_bug.cgi?id=1583815\r\n        }\r\n        controller.abort();\r\n      }\r\n    };\r\n  };\r\n\r\n  function EventTarget() {\r\n    this._listeners = Object.create(null);\r\n  }\r\n\r\n  function throwError(e) {\r\n    setTimeout(function () {\r\n      throw e;\r\n    }, 0);\r\n  }\r\n\r\n  EventTarget.prototype.dispatchEvent = function (event) {\r\n    event.target = this;\r\n    var typeListeners = this._listeners[event.type];\r\n    if (typeListeners != undefined) {\r\n      var length = typeListeners.length;\r\n      for (var i = 0; i < length; i += 1) {\r\n        var listener = typeListeners[i];\r\n        try {\r\n          if (typeof listener.handleEvent === \"function\") {\r\n            listener.handleEvent(event);\r\n          } else {\r\n            listener.call(this, event);\r\n          }\r\n        } catch (e) {\r\n          throwError(e);\r\n        }\r\n      }\r\n    }\r\n  };\r\n  EventTarget.prototype.addEventListener = function (type, listener) {\r\n    type = String(type);\r\n    var listeners = this._listeners;\r\n    var typeListeners = listeners[type];\r\n    if (typeListeners == undefined) {\r\n      typeListeners = [];\r\n      listeners[type] = typeListeners;\r\n    }\r\n    var found = false;\r\n    for (var i = 0; i < typeListeners.length; i += 1) {\r\n      if (typeListeners[i] === listener) {\r\n        found = true;\r\n      }\r\n    }\r\n    if (!found) {\r\n      typeListeners.push(listener);\r\n    }\r\n  };\r\n  EventTarget.prototype.removeEventListener = function (type, listener) {\r\n    type = String(type);\r\n    var listeners = this._listeners;\r\n    var typeListeners = listeners[type];\r\n    if (typeListeners != undefined) {\r\n      var filtered = [];\r\n      for (var i = 0; i < typeListeners.length; i += 1) {\r\n        if (typeListeners[i] !== listener) {\r\n          filtered.push(typeListeners[i]);\r\n        }\r\n      }\r\n      if (filtered.length === 0) {\r\n        delete listeners[type];\r\n      } else {\r\n        listeners[type] = filtered;\r\n      }\r\n    }\r\n  };\r\n\r\n  function Event(type) {\r\n    this.type = type;\r\n    this.target = undefined;\r\n  }\r\n\r\n  function MessageEvent(type, options) {\r\n    Event.call(this, type);\r\n    this.data = options.data;\r\n    this.lastEventId = options.lastEventId;\r\n  }\r\n\r\n  MessageEvent.prototype = Object.create(Event.prototype);\r\n\r\n  function ConnectionEvent(type, options) {\r\n    Event.call(this, type);\r\n    this.status = options.status;\r\n    this.statusText = options.statusText;\r\n    this.headers = options.headers;\r\n  }\r\n\r\n  ConnectionEvent.prototype = Object.create(Event.prototype);\r\n\r\n  function ErrorEvent(type, options) {\r\n    Event.call(this, type);\r\n    this.error = options.error;\r\n  }\r\n\r\n  ErrorEvent.prototype = Object.create(Event.prototype);\r\n\r\n  var WAITING = -1;\r\n  var CONNECTING = 0;\r\n  var OPEN = 1;\r\n  var CLOSED = 2;\r\n\r\n  var AFTER_CR = -1;\r\n  var FIELD_START = 0;\r\n  var FIELD = 1;\r\n  var VALUE_START = 2;\r\n  var VALUE = 3;\r\n\r\n  var contentTypeRegExp = /^text\\/event\\-stream(;.*)?$/i;\r\n\r\n  var MINIMUM_DURATION = 1000;\r\n  var MAXIMUM_DURATION = 18000000;\r\n\r\n  var parseDuration = function (value, def) {\r\n    var n = value == null ? def : parseInt(value, 10);\r\n    if (n !== n) {\r\n      n = def;\r\n    }\r\n    return clampDuration(n);\r\n  };\r\n  var clampDuration = function (n) {\r\n    return Math.min(Math.max(n, MINIMUM_DURATION), MAXIMUM_DURATION);\r\n  };\r\n\r\n  var fire = function (that, f, event) {\r\n    try {\r\n      if (typeof f === \"function\") {\r\n        f.call(that, event);\r\n      }\r\n    } catch (e) {\r\n      throwError(e);\r\n    }\r\n  };\r\n\r\n  function EventSourcePolyfill(url, options) {\r\n    EventTarget.call(this);\r\n    options = options || {};\r\n\r\n    this.onopen = undefined;\r\n    this.onmessage = undefined;\r\n    this.onerror = undefined;\r\n\r\n    this.url = undefined;\r\n    this.readyState = undefined;\r\n    this.withCredentials = undefined;\r\n    this.headers = undefined;\r\n\r\n    this._close = undefined;\r\n\r\n    start(this, url, options);\r\n  }\r\n\r\n  function getBestXHRTransport() {\r\n    return (XMLHttpRequest != undefined && (\"withCredentials\" in XMLHttpRequest.prototype)) || XDomainRequest == undefined\r\n        ? new XMLHttpRequest()\r\n        : new XDomainRequest();\r\n  }\r\n\r\n  var isFetchSupported = fetch != undefined && Response != undefined && \"body\" in Response.prototype;\r\n\r\n  function start(es, url, options) {\r\n    url = String(url);\r\n    var withCredentials = Boolean(options.withCredentials);\r\n    var lastEventIdQueryParameterName = options.lastEventIdQueryParameterName || \"lastEventId\";\r\n\r\n    var initialRetry = clampDuration(1000);\r\n    var heartbeatTimeout = parseDuration(options.heartbeatTimeout, 45000);\r\n\r\n    var lastEventId = \"\";\r\n    var retry = initialRetry;\r\n    var wasActivity = false;\r\n    var textLength = 0;\r\n    var headers = options.headers || {};\r\n    var TransportOption = options.Transport;\r\n    var xhr = isFetchSupported && TransportOption == undefined ? undefined : new XHRWrapper(TransportOption != undefined ? new TransportOption() : getBestXHRTransport());\r\n    var transport = TransportOption != null && typeof TransportOption !== \"string\" ? new TransportOption() : (xhr == undefined ? new FetchTransport() : new XHRTransport());\r\n    var abortController = undefined;\r\n    var timeout = 0;\r\n    var currentState = WAITING;\r\n    var dataBuffer = \"\";\r\n    var lastEventIdBuffer = \"\";\r\n    var eventTypeBuffer = \"\";\r\n\r\n    var textBuffer = \"\";\r\n    var state = FIELD_START;\r\n    var fieldStart = 0;\r\n    var valueStart = 0;\r\n\r\n    var onStart = function (status, statusText, contentType, headers) {\r\n      if (currentState === CONNECTING) {\r\n        if (status === 200 && contentType != undefined && contentTypeRegExp.test(contentType)) {\r\n          currentState = OPEN;\r\n          wasActivity = Date.now();\r\n          retry = initialRetry;\r\n          es.readyState = OPEN;\r\n          var event = new ConnectionEvent(\"open\", {\r\n            status: status,\r\n            statusText: statusText,\r\n            headers: headers\r\n          });\r\n          es.dispatchEvent(event);\r\n          fire(es, es.onopen, event);\r\n        } else {\r\n          var message = \"\";\r\n          if (status !== 200) {\r\n            if (statusText) {\r\n              statusText = statusText.replace(/\\s+/g, \" \");\r\n            }\r\n            message = \"EventSource's response has a status \" + status + \" \" + statusText + \" that is not 200. Aborting the connection.\";\r\n          } else {\r\n            message = \"EventSource's response has a Content-Type specifying an unsupported type: \" + (contentType == undefined ? \"-\" : contentType.replace(/\\s+/g, \" \")) + \". Aborting the connection.\";\r\n          }\r\n          close();\r\n          var event = new ConnectionEvent(\"error\", {\r\n            status: status,\r\n            statusText: statusText,\r\n            headers: headers\r\n          });\r\n          es.dispatchEvent(event);\r\n          fire(es, es.onerror, event);\r\n          console.error(message);\r\n        }\r\n      }\r\n    };\r\n\r\n    var onProgress = function (textChunk) {\r\n      if (currentState === OPEN) {\r\n        var n = -1;\r\n        for (var i = 0; i < textChunk.length; i += 1) {\r\n          var c = textChunk.charCodeAt(i);\r\n          if (c === \"\\n\".charCodeAt(0) || c === \"\\r\".charCodeAt(0)) {\r\n            n = i;\r\n          }\r\n        }\r\n        var chunk = (n !== -1 ? textBuffer : \"\") + textChunk.slice(0, n + 1);\r\n        textBuffer = (n === -1 ? textBuffer : \"\") + textChunk.slice(n + 1);\r\n        if (textChunk !== \"\") {\r\n          wasActivity = Date.now();\r\n          textLength += textChunk.length;\r\n        }\r\n        for (var position = 0; position < chunk.length; position += 1) {\r\n          var c = chunk.charCodeAt(position);\r\n          if (state === AFTER_CR && c === \"\\n\".charCodeAt(0)) {\r\n            state = FIELD_START;\r\n          } else {\r\n            if (state === AFTER_CR) {\r\n              state = FIELD_START;\r\n            }\r\n            if (c === \"\\r\".charCodeAt(0) || c === \"\\n\".charCodeAt(0)) {\r\n              if (state !== FIELD_START) {\r\n                if (state === FIELD) {\r\n                  valueStart = position + 1;\r\n                }\r\n                var field = chunk.slice(fieldStart, valueStart - 1);\r\n                var value = chunk.slice(valueStart + (valueStart < position && chunk.charCodeAt(valueStart) === \" \".charCodeAt(0) ? 1 : 0), position);\r\n                if (field === \"data\") {\r\n                  dataBuffer += \"\\n\";\r\n                  dataBuffer += value;\r\n                } else if (field === \"id\") {\r\n                  lastEventIdBuffer = value;\r\n                } else if (field === \"event\") {\r\n                  eventTypeBuffer = value;\r\n                } else if (field === \"retry\") {\r\n                  initialRetry = parseDuration(value, initialRetry);\r\n                  retry = initialRetry;\r\n                } else if (field === \"heartbeatTimeout\") {\r\n                  heartbeatTimeout = parseDuration(value, heartbeatTimeout);\r\n                  if (timeout !== 0) {\r\n                    clearTimeout(timeout);\r\n                    timeout = setTimeout(function () {\r\n                      onTimeout();\r\n                    }, heartbeatTimeout);\r\n                  }\r\n                }\r\n              }\r\n              if (state === FIELD_START) {\r\n                if (dataBuffer !== \"\") {\r\n                  lastEventId = lastEventIdBuffer;\r\n                  if (eventTypeBuffer === \"\") {\r\n                    eventTypeBuffer = \"message\";\r\n                  }\r\n                  var event = new MessageEvent(eventTypeBuffer, {\r\n                    data: dataBuffer.slice(1),\r\n                    lastEventId: lastEventIdBuffer\r\n                  });\r\n                  es.dispatchEvent(event);\r\n                  if (eventTypeBuffer === \"open\") {\r\n                    fire(es, es.onopen, event);\r\n                  } else if (eventTypeBuffer === \"message\") {\r\n                    fire(es, es.onmessage, event);\r\n                  } else if (eventTypeBuffer === \"error\") {\r\n                    fire(es, es.onerror, event);\r\n                  }\r\n                  if (currentState === CLOSED) {\r\n                    return;\r\n                  }\r\n                }\r\n                dataBuffer = \"\";\r\n                eventTypeBuffer = \"\";\r\n              }\r\n              state = c === \"\\r\".charCodeAt(0) ? AFTER_CR : FIELD_START;\r\n            } else {\r\n              if (state === FIELD_START) {\r\n                fieldStart = position;\r\n                state = FIELD;\r\n              }\r\n              if (state === FIELD) {\r\n                if (c === \":\".charCodeAt(0)) {\r\n                  valueStart = position + 1;\r\n                  state = VALUE_START;\r\n                }\r\n              } else if (state === VALUE_START) {\r\n                state = VALUE;\r\n              }\r\n            }\r\n          }\r\n        }\r\n      }\r\n    };\r\n\r\n    var onFinish = function (error) {\r\n      if (currentState === OPEN || currentState === CONNECTING) {\r\n        currentState = WAITING;\r\n        if (timeout !== 0) {\r\n          clearTimeout(timeout);\r\n          timeout = 0;\r\n        }\r\n        timeout = setTimeout(function () {\r\n          onTimeout();\r\n        }, retry);\r\n        retry = clampDuration(Math.min(initialRetry * 16, retry * 2));\r\n\r\n        es.readyState = CONNECTING;\r\n        var event = new ErrorEvent(\"error\", {error: error});\r\n        es.dispatchEvent(event);\r\n        fire(es, es.onerror, event);\r\n        if (error != undefined) {\r\n          console.error(error);\r\n        }\r\n      }\r\n    };\r\n\r\n    var close = function () {\r\n      currentState = CLOSED;\r\n      if (abortController != undefined) {\r\n        abortController.abort();\r\n        abortController = undefined;\r\n      }\r\n      if (timeout !== 0) {\r\n        clearTimeout(timeout);\r\n        timeout = 0;\r\n      }\r\n      es.readyState = CLOSED;\r\n    };\r\n\r\n    var onTimeout = function () {\r\n      timeout = 0;\r\n\r\n      if (currentState !== WAITING) {\r\n        if (!wasActivity && abortController != undefined) {\r\n          onFinish(new Error(\"No activity within \" + heartbeatTimeout + \" milliseconds.\" + \" \" + (currentState === CONNECTING ? \"No response received.\" : textLength + \" chars received.\") + \" \" + \"Reconnecting.\"));\r\n          if (abortController != undefined) {\r\n            abortController.abort();\r\n            abortController = undefined;\r\n          }\r\n        } else {\r\n          var nextHeartbeat = Math.max((wasActivity || Date.now()) + heartbeatTimeout - Date.now(), 1);\r\n          wasActivity = false;\r\n          timeout = setTimeout(function () {\r\n            onTimeout();\r\n          }, nextHeartbeat);\r\n        }\r\n        return;\r\n      }\r\n\r\n      wasActivity = false;\r\n      textLength = 0;\r\n      timeout = setTimeout(function () {\r\n        onTimeout();\r\n      }, heartbeatTimeout);\r\n\r\n      currentState = CONNECTING;\r\n      dataBuffer = \"\";\r\n      eventTypeBuffer = \"\";\r\n      lastEventIdBuffer = lastEventId;\r\n      textBuffer = \"\";\r\n      fieldStart = 0;\r\n      valueStart = 0;\r\n      state = FIELD_START;\r\n\r\n      // https://bugzilla.mozilla.org/show_bug.cgi?id=428916\r\n      // Request header field Last-Event-ID is not allowed by Access-Control-Allow-Headers.\r\n      var requestURL = url;\r\n      if (url.slice(0, 5) !== \"data:\" && url.slice(0, 5) !== \"blob:\") {\r\n        if (lastEventId !== \"\") {\r\n          requestURL += (url.indexOf(\"?\") === -1 ? \"?\" : \"&\") + lastEventIdQueryParameterName +\"=\" + encodeURIComponent(lastEventId);\r\n        }\r\n      }\r\n      var withCredentials = es.withCredentials;\r\n      var requestHeaders = {};\r\n      requestHeaders[\"Accept\"] = \"text/event-stream\";\r\n      var headers = es.headers;\r\n      if (headers != undefined) {\r\n        for (var name in headers) {\r\n          if (Object.prototype.hasOwnProperty.call(headers, name)) {\r\n            requestHeaders[name] = headers[name];\r\n          }\r\n        }\r\n      }\r\n      try {\r\n        abortController = transport.open(xhr, onStart, onProgress, onFinish, requestURL, withCredentials, requestHeaders);\r\n      } catch (error) {\r\n        close();\r\n        throw error;\r\n      }\r\n    };\r\n\r\n    es.url = url;\r\n    es.readyState = CONNECTING;\r\n    es.withCredentials = withCredentials;\r\n    es.headers = headers;\r\n    es._close = close;\r\n\r\n    onTimeout();\r\n  }\r\n\r\n  EventSourcePolyfill.prototype = Object.create(EventTarget.prototype);\r\n  EventSourcePolyfill.prototype.CONNECTING = CONNECTING;\r\n  EventSourcePolyfill.prototype.OPEN = OPEN;\r\n  EventSourcePolyfill.prototype.CLOSED = CLOSED;\r\n  EventSourcePolyfill.prototype.close = function () {\r\n    this._close();\r\n  };\r\n\r\n  EventSourcePolyfill.CONNECTING = CONNECTING;\r\n  EventSourcePolyfill.OPEN = OPEN;\r\n  EventSourcePolyfill.CLOSED = CLOSED;\r\n  EventSourcePolyfill.prototype.withCredentials = undefined;\r\n\r\n  var R = NativeEventSource;\r\n  if (XMLHttpRequest != undefined && (NativeEventSource == undefined || !(\"withCredentials\" in NativeEventSource.prototype))) {\r\n    // Why replace a native EventSource ?\r\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=444328\r\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=831392\r\n    // https://code.google.com/p/chromium/issues/detail?id=260144\r\n    // https://code.google.com/p/chromium/issues/detail?id=225654\r\n    // ...\r\n    R = EventSourcePolyfill;\r\n  }\r\n\r\n  (function (factory) {\r\n    {\r\n      var v = factory(exports);\r\n      if (v !== undefined) { module.exports = v; }\r\n    }\r\n  })(function (exports) {\r\n    exports.EventSourcePolyfill = EventSourcePolyfill;\r\n    exports.NativeEventSource = NativeEventSource;\r\n    exports.EventSource = R;\r\n  });\r\n}(typeof globalThis === 'undefined' ? (typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : commonjsGlobal) : globalThis));\n});\n\nvar eventsource$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), eventsource, {\n\t'default': eventsource\n}));\n\nvar formatText = function (e) { return e.data; };\n\nvar formatJSON = function (e) { return JSON.parse(e.data); };\n\nvar SSEClient = function SSEClient(config) {\n  this._handlers = {};\n  this._listeners = {};\n  this._source = null;\n\n  if (config.format) {\n    if (typeof config.format === 'string') {\n      if (config.format === 'plain') {\n        this._format = formatText;\n      } else if (config.format === 'json') {\n        this._format = formatJSON;\n      } else {\n        this._format = formatText;\n      }\n    } else if (typeof config.format === 'function') {\n      this._format = config.format;\n    } else {\n      this._format = formatText;\n    }\n  } else {\n    this._format = formatText;\n  }\n\n  if (config.handlers) {\n    for (var event in config.handlers) {\n      this.on(event, config.handlers[event]);\n    }\n  }\n\n  this.url = config.url;\n  this.withCredentials = !!config.withCredentials;\n  this.polyfillOptions = config.polyfillOptions || {};\n  this.forcePolyfill = !!config.forcePolyfill;\n};\n\nvar prototypeAccessors = { source: { configurable: true } };\n\nprototypeAccessors.source.get = function () {\n  return this._source;\n};\n\nSSEClient.prototype.connect = function connect () {\n    var this$1 = this;\n\n  if (this.forcePolyfill) {\n    this._source = new eventsource.EventSourcePolyfill(\n      this.url,\n      Object.assign({}, this.polyfillOptions, {\n        withCredentials: this.withCredentials,\n      })\n    );\n  } else {\n    this._source = new window.EventSource(this.url, {\n      withCredentials: this.withCredentials,\n    });\n  }\n\n  return new Promise(function (resolve, reject) {\n    this$1._source.onopen = function () {\n      // Add event listeners that were added before we connected\n      for (var event in this$1._listeners) {\n        this$1._source.addEventListener(event, this$1._listeners[event]);\n      }\n\n      this$1._source.onerror = null;\n\n      resolve(this$1);\n    };\n\n    this$1._source.onerror = reject;\n  });\n};\n\nSSEClient.prototype.disconnect = function disconnect () {\n  if (this._source !== null) {\n    this._source.close();\n    this._source = null;\n  }\n};\n\nSSEClient.prototype.on = function on (event, handler) {\n  if (!event) {\n    // Default \"event-less\" event\n    event = 'message';\n  }\n\n  if (!this._listeners[event]) {\n    this._create(event);\n  }\n\n  this._handlers[event].push(handler);\n\n  return this;\n};\n\nSSEClient.prototype.once = function once (event, handler) {\n    var this$1 = this;\n\n  this.on(event, function (e) {\n    this$1.off(event, handler);\n\n    handler(e);\n  });\n\n  return this;\n};\n\nSSEClient.prototype.off = function off (event, handler) {\n  if (!this._handlers[event]) {\n    // no handlers registered for event\n    return this;\n  }\n\n  var idx = this._handlers[event].indexOf(handler);\n  if (idx === -1) {\n    // handler not registered for event\n    return this;\n  }\n\n  // remove handler from event\n  this._handlers[event].splice(idx, 1);\n\n  if (this._handlers[event].length === 0) {\n    // remove listener since no handlers exist\n    this._source.removeEventListener(event, this._listeners[event]);\n    delete this._handlers[event];\n    delete this._listeners[event];\n  }\n\n  return this;\n};\n\nSSEClient.prototype._create = function _create (event) {\n    var this$1 = this;\n\n  this._handlers[event] = [];\n\n  this._listeners[event] = function (message) {\n    var data;\n\n    try {\n      data = this$1._format(message);\n    } catch (err) {\n      if (typeof this$1._source.onerror === 'function') {\n        this$1._source.onerror(err);\n      }\n      return;\n    }\n\n    this$1._handlers[event].forEach(function (handler) { return handler(data, message.lastEventId); });\n  };\n\n  if (this._source) {\n    this._source.addEventListener(event, this._listeners[event]);\n  }\n};\n\nObject.defineProperties( SSEClient.prototype, prototypeAccessors );\n\nfunction install(Vue, config) {\n  if (Vue.config && Vue.config.globalProperties) {\n    // Vue3\n    Vue.config.globalProperties.$sse = new SSEManager(config);\n  } else {\n    // Vue2\n    // eslint-disable-next-line no-param-reassign, no-multi-assign\n    Vue.$sse = Vue.prototype.$sse = new SSEManager(config);\n  }\n\n  if (config && config.polyfill) {\n    Promise.resolve().then(function () { return eventsource$1; });\n  }\n\n  // This mixin allows components to specify that all clients that were\n  // created within it should be automatically disconnected (cleanup)\n  // when the component is destroyed.\n  Vue.mixin({\n    beforeCreate: function beforeCreate() {\n      if (this.$options.sse && this.$options.sse.cleanup) {\n        // We instantiate an SSEManager for this specific instance\n        // in order to track it (see discussions in #13 for rationale).\n        this.$sse = new SSEManager();\n\n        // We also set $clients to an empty array, as opposed to null,\n        // so that beforeDestroy and create know to use it.\n        this.$sse.$clients = [];\n      }\n    },\n    beforeDestroy: function beforeDestroy() {\n      if (this.$sse.$clients !== null) {\n        this.$sse.$clients.forEach(function (c) { return c.disconnect(); });\n        this.$sse.$clients = [];\n      }\n    },\n  });\n}\n\nvar SSEManager = function SSEManager(config) {\n  this.$defaultConfig = Object.assign(\n    {\n      format: formatText,\n      sendCredentials: false,\n    },\n    config\n  );\n\n  this.$clients = null;\n};\n\nSSEManager.prototype.create = function create (configOrURL) {\n  var config;\n  if (typeof configOrURL === 'object') {\n    config = configOrURL;\n  } else if (typeof configOrURL === 'string') {\n    config = {\n      url: configOrURL,\n    };\n  } else {\n    config = {};\n  }\n\n  var client = new SSEClient(Object.assign({}, this.$defaultConfig, config));\n\n  // If $clients is not null, then it's array that we should push this\n  // client into for later cleanup in our mixin's beforeDestroy.\n  if (this.$clients !== null) {\n    this.$clients.push(client);\n  }\n\n  return client;\n};\n\nvar index_cjs = {\n  SSEManager: SSEManager,\n  install: install,\n};\n\nmodule.exports = index_cjs;\n"
  },
  {
    "path": "dist/vue-sse.esm.browser.js",
    "content": "/*!\n * vue-sse v2.5.0\n * (c) 2021 James Churchard\n * @license MIT\n */\nvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nfunction createCommonjsModule(fn) {\n  var module = { exports: {} };\n\treturn fn(module, module.exports), module.exports;\n}\n\n/** @license\r\n * eventsource.js\r\n * Available under MIT License (MIT)\r\n * https://github.com/Yaffle/EventSource/\r\n */\n\nvar eventsource = createCommonjsModule(function (module, exports) {\n/*jslint indent: 2, vars: true, plusplus: true */\r\n/*global setTimeout, clearTimeout */\r\n\r\n(function (global) {\r\n\r\n  var setTimeout = global.setTimeout;\r\n  var clearTimeout = global.clearTimeout;\r\n  var XMLHttpRequest = global.XMLHttpRequest;\r\n  var XDomainRequest = global.XDomainRequest;\r\n  var ActiveXObject = global.ActiveXObject;\r\n  var NativeEventSource = global.EventSource;\r\n\r\n  var document = global.document;\r\n  var Promise = global.Promise;\r\n  var fetch = global.fetch;\r\n  var Response = global.Response;\r\n  var TextDecoder = global.TextDecoder;\r\n  var TextEncoder = global.TextEncoder;\r\n  var AbortController = global.AbortController;\r\n\r\n  if (typeof window !== \"undefined\" && !(\"readyState\" in document) && document.body == null) { // Firefox 2\r\n    document.readyState = \"loading\";\r\n    window.addEventListener(\"load\", function (event) {\r\n      document.readyState = \"complete\";\r\n    }, false);\r\n  }\r\n\r\n  if (XMLHttpRequest == null && ActiveXObject != null) { // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest_in_IE6\r\n    XMLHttpRequest = function () {\r\n      return new ActiveXObject(\"Microsoft.XMLHTTP\");\r\n    };\r\n  }\r\n\r\n  if (Object.create == undefined) {\r\n    Object.create = function (C) {\r\n      function F(){}\r\n      F.prototype = C;\r\n      return new F();\r\n    };\r\n  }\r\n\r\n  if (!Date.now) {\r\n    Date.now = function now() {\r\n      return new Date().getTime();\r\n    };\r\n  }\r\n\r\n  // see #118 (Promise#finally with polyfilled Promise)\r\n  // see #123 (data URLs crash Edge)\r\n  // see #125 (CSP violations)\r\n  // see pull/#138\r\n  // => No way to polyfill Promise#finally\r\n\r\n  if (AbortController == undefined) {\r\n    var originalFetch2 = fetch;\r\n    fetch = function (url, options) {\r\n      var signal = options.signal;\r\n      return originalFetch2(url, {headers: options.headers, credentials: options.credentials, cache: options.cache}).then(function (response) {\r\n        var reader = response.body.getReader();\r\n        signal._reader = reader;\r\n        if (signal._aborted) {\r\n          signal._reader.cancel();\r\n        }\r\n        return {\r\n          status: response.status,\r\n          statusText: response.statusText,\r\n          headers: response.headers,\r\n          body: {\r\n            getReader: function () {\r\n              return reader;\r\n            }\r\n          }\r\n        };\r\n      });\r\n    };\r\n    AbortController = function () {\r\n      this.signal = {\r\n        _reader: null,\r\n        _aborted: false\r\n      };\r\n      this.abort = function () {\r\n        if (this.signal._reader != null) {\r\n          this.signal._reader.cancel();\r\n        }\r\n        this.signal._aborted = true;\r\n      };\r\n    };\r\n  }\r\n\r\n  function TextDecoderPolyfill() {\r\n    this.bitsNeeded = 0;\r\n    this.codePoint = 0;\r\n  }\r\n\r\n  TextDecoderPolyfill.prototype.decode = function (octets) {\r\n    function valid(codePoint, shift, octetsCount) {\r\n      if (octetsCount === 1) {\r\n        return codePoint >= 0x0080 >> shift && codePoint << shift <= 0x07FF;\r\n      }\r\n      if (octetsCount === 2) {\r\n        return codePoint >= 0x0800 >> shift && codePoint << shift <= 0xD7FF || codePoint >= 0xE000 >> shift && codePoint << shift <= 0xFFFF;\r\n      }\r\n      if (octetsCount === 3) {\r\n        return codePoint >= 0x010000 >> shift && codePoint << shift <= 0x10FFFF;\r\n      }\r\n      throw new Error();\r\n    }\r\n    function octetsCount(bitsNeeded, codePoint) {\r\n      if (bitsNeeded === 6 * 1) {\r\n        return codePoint >> 6 > 15 ? 3 : codePoint > 31 ? 2 : 1;\r\n      }\r\n      if (bitsNeeded === 6 * 2) {\r\n        return codePoint > 15 ? 3 : 2;\r\n      }\r\n      if (bitsNeeded === 6 * 3) {\r\n        return 3;\r\n      }\r\n      throw new Error();\r\n    }\r\n    var REPLACER = 0xFFFD;\r\n    var string = \"\";\r\n    var bitsNeeded = this.bitsNeeded;\r\n    var codePoint = this.codePoint;\r\n    for (var i = 0; i < octets.length; i += 1) {\r\n      var octet = octets[i];\r\n      if (bitsNeeded !== 0) {\r\n        if (octet < 128 || octet > 191 || !valid(codePoint << 6 | octet & 63, bitsNeeded - 6, octetsCount(bitsNeeded, codePoint))) {\r\n          bitsNeeded = 0;\r\n          codePoint = REPLACER;\r\n          string += String.fromCharCode(codePoint);\r\n        }\r\n      }\r\n      if (bitsNeeded === 0) {\r\n        if (octet >= 0 && octet <= 127) {\r\n          bitsNeeded = 0;\r\n          codePoint = octet;\r\n        } else if (octet >= 192 && octet <= 223) {\r\n          bitsNeeded = 6 * 1;\r\n          codePoint = octet & 31;\r\n        } else if (octet >= 224 && octet <= 239) {\r\n          bitsNeeded = 6 * 2;\r\n          codePoint = octet & 15;\r\n        } else if (octet >= 240 && octet <= 247) {\r\n          bitsNeeded = 6 * 3;\r\n          codePoint = octet & 7;\r\n        } else {\r\n          bitsNeeded = 0;\r\n          codePoint = REPLACER;\r\n        }\r\n        if (bitsNeeded !== 0 && !valid(codePoint, bitsNeeded, octetsCount(bitsNeeded, codePoint))) {\r\n          bitsNeeded = 0;\r\n          codePoint = REPLACER;\r\n        }\r\n      } else {\r\n        bitsNeeded -= 6;\r\n        codePoint = codePoint << 6 | octet & 63;\r\n      }\r\n      if (bitsNeeded === 0) {\r\n        if (codePoint <= 0xFFFF) {\r\n          string += String.fromCharCode(codePoint);\r\n        } else {\r\n          string += String.fromCharCode(0xD800 + (codePoint - 0xFFFF - 1 >> 10));\r\n          string += String.fromCharCode(0xDC00 + (codePoint - 0xFFFF - 1 & 0x3FF));\r\n        }\r\n      }\r\n    }\r\n    this.bitsNeeded = bitsNeeded;\r\n    this.codePoint = codePoint;\r\n    return string;\r\n  };\r\n\r\n  // Firefox < 38 throws an error with stream option\r\n  var supportsStreamOption = function () {\r\n    try {\r\n      return new TextDecoder().decode(new TextEncoder().encode(\"test\"), {stream: true}) === \"test\";\r\n    } catch (error) {\r\n      console.debug(\"TextDecoder does not support streaming option. Using polyfill instead: \" + error);\r\n    }\r\n    return false;\r\n  };\r\n\r\n  // IE, Edge\r\n  if (TextDecoder == undefined || TextEncoder == undefined || !supportsStreamOption()) {\r\n    TextDecoder = TextDecoderPolyfill;\r\n  }\r\n\r\n  var k = function () {\r\n  };\r\n\r\n  function XHRWrapper(xhr) {\r\n    this.withCredentials = false;\r\n    this.readyState = 0;\r\n    this.status = 0;\r\n    this.statusText = \"\";\r\n    this.responseText = \"\";\r\n    this.onprogress = k;\r\n    this.onload = k;\r\n    this.onerror = k;\r\n    this.onreadystatechange = k;\r\n    this._contentType = \"\";\r\n    this._xhr = xhr;\r\n    this._sendTimeout = 0;\r\n    this._abort = k;\r\n  }\r\n\r\n  XHRWrapper.prototype.open = function (method, url) {\r\n    this._abort(true);\r\n\r\n    var that = this;\r\n    var xhr = this._xhr;\r\n    var state = 1;\r\n    var timeout = 0;\r\n\r\n    this._abort = function (silent) {\r\n      if (that._sendTimeout !== 0) {\r\n        clearTimeout(that._sendTimeout);\r\n        that._sendTimeout = 0;\r\n      }\r\n      if (state === 1 || state === 2 || state === 3) {\r\n        state = 4;\r\n        xhr.onload = k;\r\n        xhr.onerror = k;\r\n        xhr.onabort = k;\r\n        xhr.onprogress = k;\r\n        xhr.onreadystatechange = k;\r\n        // IE 8 - 9: XDomainRequest#abort() does not fire any event\r\n        // Opera < 10: XMLHttpRequest#abort() does not fire any event\r\n        xhr.abort();\r\n        if (timeout !== 0) {\r\n          clearTimeout(timeout);\r\n          timeout = 0;\r\n        }\r\n        if (!silent) {\r\n          that.readyState = 4;\r\n          that.onabort(null);\r\n          that.onreadystatechange();\r\n        }\r\n      }\r\n      state = 0;\r\n    };\r\n\r\n    var onStart = function () {\r\n      if (state === 1) {\r\n        //state = 2;\r\n        var status = 0;\r\n        var statusText = \"\";\r\n        var contentType = undefined;\r\n        if (!(\"contentType\" in xhr)) {\r\n          try {\r\n            status = xhr.status;\r\n            statusText = xhr.statusText;\r\n            contentType = xhr.getResponseHeader(\"Content-Type\");\r\n          } catch (error) {\r\n            // IE < 10 throws exception for `xhr.status` when xhr.readyState === 2 || xhr.readyState === 3\r\n            // Opera < 11 throws exception for `xhr.status` when xhr.readyState === 2\r\n            // https://bugs.webkit.org/show_bug.cgi?id=29121\r\n            status = 0;\r\n            statusText = \"\";\r\n            contentType = undefined;\r\n            // Firefox < 14, Chrome ?, Safari ?\r\n            // https://bugs.webkit.org/show_bug.cgi?id=29658\r\n            // https://bugs.webkit.org/show_bug.cgi?id=77854\r\n          }\r\n        } else {\r\n          status = 200;\r\n          statusText = \"OK\";\r\n          contentType = xhr.contentType;\r\n        }\r\n        if (status !== 0) {\r\n          state = 2;\r\n          that.readyState = 2;\r\n          that.status = status;\r\n          that.statusText = statusText;\r\n          that._contentType = contentType;\r\n          that.onreadystatechange();\r\n        }\r\n      }\r\n    };\r\n    var onProgress = function () {\r\n      onStart();\r\n      if (state === 2 || state === 3) {\r\n        state = 3;\r\n        var responseText = \"\";\r\n        try {\r\n          responseText = xhr.responseText;\r\n        } catch (error) {\r\n          // IE 8 - 9 with XMLHttpRequest\r\n        }\r\n        that.readyState = 3;\r\n        that.responseText = responseText;\r\n        that.onprogress();\r\n      }\r\n    };\r\n    var onFinish = function (type, event) {\r\n      if (event == null || event.preventDefault == null) {\r\n        event = {\r\n          preventDefault: k\r\n        };\r\n      }\r\n      // Firefox 52 fires \"readystatechange\" (xhr.readyState === 4) without final \"readystatechange\" (xhr.readyState === 3)\r\n      // IE 8 fires \"onload\" without \"onprogress\"\r\n      onProgress();\r\n      if (state === 1 || state === 2 || state === 3) {\r\n        state = 4;\r\n        if (timeout !== 0) {\r\n          clearTimeout(timeout);\r\n          timeout = 0;\r\n        }\r\n        that.readyState = 4;\r\n        if (type === \"load\") {\r\n          that.onload(event);\r\n        } else if (type === \"error\") {\r\n          that.onerror(event);\r\n        } else if (type === \"abort\") {\r\n          that.onabort(event);\r\n        } else {\r\n          throw new TypeError();\r\n        }\r\n        that.onreadystatechange();\r\n      }\r\n    };\r\n    var onReadyStateChange = function (event) {\r\n      if (xhr != undefined) { // Opera 12\r\n        if (xhr.readyState === 4) {\r\n          if (!(\"onload\" in xhr) || !(\"onerror\" in xhr) || !(\"onabort\" in xhr)) {\r\n            onFinish(xhr.responseText === \"\" ? \"error\" : \"load\", event);\r\n          }\r\n        } else if (xhr.readyState === 3) {\r\n          if (!(\"onprogress\" in xhr)) { // testing XMLHttpRequest#responseText too many times is too slow in IE 11\r\n            // and in Firefox 3.6\r\n            onProgress();\r\n          }\r\n        } else if (xhr.readyState === 2) {\r\n          onStart();\r\n        }\r\n      }\r\n    };\r\n    var onTimeout = function () {\r\n      timeout = setTimeout(function () {\r\n        onTimeout();\r\n      }, 500);\r\n      if (xhr.readyState === 3) {\r\n        onProgress();\r\n      }\r\n    };\r\n\r\n    // XDomainRequest#abort removes onprogress, onerror, onload\r\n    if (\"onload\" in xhr) {\r\n      xhr.onload = function (event) {\r\n        onFinish(\"load\", event);\r\n      };\r\n    }\r\n    if (\"onerror\" in xhr) {\r\n      xhr.onerror = function (event) {\r\n        onFinish(\"error\", event);\r\n      };\r\n    }\r\n    // improper fix to match Firefox behaviour, but it is better than just ignore abort\r\n    // see https://bugzilla.mozilla.org/show_bug.cgi?id=768596\r\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=880200\r\n    // https://code.google.com/p/chromium/issues/detail?id=153570\r\n    // IE 8 fires \"onload\" without \"onprogress\r\n    if (\"onabort\" in xhr) {\r\n      xhr.onabort = function (event) {\r\n        onFinish(\"abort\", event);\r\n      };\r\n    }\r\n\r\n    if (\"onprogress\" in xhr) {\r\n      xhr.onprogress = onProgress;\r\n    }\r\n\r\n    // IE 8 - 9 (XMLHTTPRequest)\r\n    // Opera < 12\r\n    // Firefox < 3.5\r\n    // Firefox 3.5 - 3.6 - ? < 9.0\r\n    // onprogress is not fired sometimes or delayed\r\n    // see also #64 (significant lag in IE 11)\r\n    if (\"onreadystatechange\" in xhr) {\r\n      xhr.onreadystatechange = function (event) {\r\n        onReadyStateChange(event);\r\n      };\r\n    }\r\n\r\n    if (\"contentType\" in xhr || !(\"ontimeout\" in XMLHttpRequest.prototype)) {\r\n      url += (url.indexOf(\"?\") === -1 ? \"?\" : \"&\") + \"padding=true\";\r\n    }\r\n    xhr.open(method, url, true);\r\n\r\n    if (\"readyState\" in xhr) {\r\n      // workaround for Opera 12 issue with \"progress\" events\r\n      // #91 (XMLHttpRequest onprogress not fired for streaming response in Edge 14-15-?)\r\n      timeout = setTimeout(function () {\r\n        onTimeout();\r\n      }, 0);\r\n    }\r\n  };\r\n  XHRWrapper.prototype.abort = function () {\r\n    this._abort(false);\r\n  };\r\n  XHRWrapper.prototype.getResponseHeader = function (name) {\r\n    return this._contentType;\r\n  };\r\n  XHRWrapper.prototype.setRequestHeader = function (name, value) {\r\n    var xhr = this._xhr;\r\n    if (\"setRequestHeader\" in xhr) {\r\n      xhr.setRequestHeader(name, value);\r\n    }\r\n  };\r\n  XHRWrapper.prototype.getAllResponseHeaders = function () {\r\n    // XMLHttpRequest#getAllResponseHeaders returns null for CORS requests in Firefox 3.6.28\r\n    return this._xhr.getAllResponseHeaders != undefined ? this._xhr.getAllResponseHeaders() || \"\" : \"\";\r\n  };\r\n  XHRWrapper.prototype.send = function () {\r\n    // loading indicator in Safari < ? (6), Chrome < 14, Firefox\r\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=736723\r\n    if ((!(\"ontimeout\" in XMLHttpRequest.prototype) || (!(\"sendAsBinary\" in XMLHttpRequest.prototype) && !(\"mozAnon\" in XMLHttpRequest.prototype))) &&\r\n        document != undefined &&\r\n        document.readyState != undefined &&\r\n        document.readyState !== \"complete\") {\r\n      var that = this;\r\n      that._sendTimeout = setTimeout(function () {\r\n        that._sendTimeout = 0;\r\n        that.send();\r\n      }, 4);\r\n      return;\r\n    }\r\n\r\n    var xhr = this._xhr;\r\n    // withCredentials should be set after \"open\" for Safari and Chrome (< 19 ?)\r\n    if (\"withCredentials\" in xhr) {\r\n      xhr.withCredentials = this.withCredentials;\r\n    }\r\n    try {\r\n      // xhr.send(); throws \"Not enough arguments\" in Firefox 3.0\r\n      xhr.send(undefined);\r\n    } catch (error1) {\r\n      // Safari 5.1.7, Opera 12\r\n      throw error1;\r\n    }\r\n  };\r\n\r\n  function toLowerCase(name) {\r\n    return name.replace(/[A-Z]/g, function (c) {\r\n      return String.fromCharCode(c.charCodeAt(0) + 0x20);\r\n    });\r\n  }\r\n\r\n  function HeadersPolyfill(all) {\r\n    // Get headers: implemented according to mozilla's example code: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/getAllResponseHeaders#Example\r\n    var map = Object.create(null);\r\n    var array = all.split(\"\\r\\n\");\r\n    for (var i = 0; i < array.length; i += 1) {\r\n      var line = array[i];\r\n      var parts = line.split(\": \");\r\n      var name = parts.shift();\r\n      var value = parts.join(\": \");\r\n      map[toLowerCase(name)] = value;\r\n    }\r\n    this._map = map;\r\n  }\r\n  HeadersPolyfill.prototype.get = function (name) {\r\n    return this._map[toLowerCase(name)];\r\n  };\r\n\r\n  if (XMLHttpRequest != null && XMLHttpRequest.HEADERS_RECEIVED == null) { // IE < 9, Firefox 3.6\r\n    XMLHttpRequest.HEADERS_RECEIVED = 2;\r\n  }\r\n\r\n  function XHRTransport() {\r\n  }\r\n\r\n  XHRTransport.prototype.open = function (xhr, onStartCallback, onProgressCallback, onFinishCallback, url, withCredentials, headers) {\r\n    xhr.open(\"GET\", url);\r\n    var offset = 0;\r\n    xhr.onprogress = function () {\r\n      var responseText = xhr.responseText;\r\n      var chunk = responseText.slice(offset);\r\n      offset += chunk.length;\r\n      onProgressCallback(chunk);\r\n    };\r\n    xhr.onerror = function (event) {\r\n      event.preventDefault();\r\n      onFinishCallback(new Error(\"NetworkError\"));\r\n    };\r\n    xhr.onload = function () {\r\n      onFinishCallback(null);\r\n    };\r\n    xhr.onabort = function () {\r\n      onFinishCallback(null);\r\n    };\r\n    xhr.onreadystatechange = function () {\r\n      if (xhr.readyState === XMLHttpRequest.HEADERS_RECEIVED) {\r\n        var status = xhr.status;\r\n        var statusText = xhr.statusText;\r\n        var contentType = xhr.getResponseHeader(\"Content-Type\");\r\n        var headers = xhr.getAllResponseHeaders();\r\n        onStartCallback(status, statusText, contentType, new HeadersPolyfill(headers));\r\n      }\r\n    };\r\n    xhr.withCredentials = withCredentials;\r\n    for (var name in headers) {\r\n      if (Object.prototype.hasOwnProperty.call(headers, name)) {\r\n        xhr.setRequestHeader(name, headers[name]);\r\n      }\r\n    }\r\n    xhr.send();\r\n    return xhr;\r\n  };\r\n\r\n  function HeadersWrapper(headers) {\r\n    this._headers = headers;\r\n  }\r\n  HeadersWrapper.prototype.get = function (name) {\r\n    return this._headers.get(name);\r\n  };\r\n\r\n  function FetchTransport() {\r\n  }\r\n\r\n  FetchTransport.prototype.open = function (xhr, onStartCallback, onProgressCallback, onFinishCallback, url, withCredentials, headers) {\r\n    var reader = null;\r\n    var controller = new AbortController();\r\n    var signal = controller.signal;\r\n    var textDecoder = new TextDecoder();\r\n    fetch(url, {\r\n      headers: headers,\r\n      credentials: withCredentials ? \"include\" : \"same-origin\",\r\n      signal: signal,\r\n      cache: \"no-store\"\r\n    }).then(function (response) {\r\n      reader = response.body.getReader();\r\n      onStartCallback(response.status, response.statusText, response.headers.get(\"Content-Type\"), new HeadersWrapper(response.headers));\r\n      // see https://github.com/promises-aplus/promises-spec/issues/179\r\n      return new Promise(function (resolve, reject) {\r\n        var readNextChunk = function () {\r\n          reader.read().then(function (result) {\r\n            if (result.done) {\r\n              //Note: bytes in textDecoder are ignored\r\n              resolve(undefined);\r\n            } else {\r\n              var chunk = textDecoder.decode(result.value, {stream: true});\r\n              onProgressCallback(chunk);\r\n              readNextChunk();\r\n            }\r\n          })[\"catch\"](function (error) {\r\n            reject(error);\r\n          });\r\n        };\r\n        readNextChunk();\r\n      });\r\n    })[\"catch\"](function (error) {\r\n      if (error.name === \"AbortError\") {\r\n        return undefined;\r\n      } else {\r\n        return error;\r\n      }\r\n    }).then(function (error) {\r\n      onFinishCallback(error);\r\n    });\r\n    return {\r\n      abort: function () {\r\n        if (reader != null) {\r\n          reader.cancel(); // https://bugzilla.mozilla.org/show_bug.cgi?id=1583815\r\n        }\r\n        controller.abort();\r\n      }\r\n    };\r\n  };\r\n\r\n  function EventTarget() {\r\n    this._listeners = Object.create(null);\r\n  }\r\n\r\n  function throwError(e) {\r\n    setTimeout(function () {\r\n      throw e;\r\n    }, 0);\r\n  }\r\n\r\n  EventTarget.prototype.dispatchEvent = function (event) {\r\n    event.target = this;\r\n    var typeListeners = this._listeners[event.type];\r\n    if (typeListeners != undefined) {\r\n      var length = typeListeners.length;\r\n      for (var i = 0; i < length; i += 1) {\r\n        var listener = typeListeners[i];\r\n        try {\r\n          if (typeof listener.handleEvent === \"function\") {\r\n            listener.handleEvent(event);\r\n          } else {\r\n            listener.call(this, event);\r\n          }\r\n        } catch (e) {\r\n          throwError(e);\r\n        }\r\n      }\r\n    }\r\n  };\r\n  EventTarget.prototype.addEventListener = function (type, listener) {\r\n    type = String(type);\r\n    var listeners = this._listeners;\r\n    var typeListeners = listeners[type];\r\n    if (typeListeners == undefined) {\r\n      typeListeners = [];\r\n      listeners[type] = typeListeners;\r\n    }\r\n    var found = false;\r\n    for (var i = 0; i < typeListeners.length; i += 1) {\r\n      if (typeListeners[i] === listener) {\r\n        found = true;\r\n      }\r\n    }\r\n    if (!found) {\r\n      typeListeners.push(listener);\r\n    }\r\n  };\r\n  EventTarget.prototype.removeEventListener = function (type, listener) {\r\n    type = String(type);\r\n    var listeners = this._listeners;\r\n    var typeListeners = listeners[type];\r\n    if (typeListeners != undefined) {\r\n      var filtered = [];\r\n      for (var i = 0; i < typeListeners.length; i += 1) {\r\n        if (typeListeners[i] !== listener) {\r\n          filtered.push(typeListeners[i]);\r\n        }\r\n      }\r\n      if (filtered.length === 0) {\r\n        delete listeners[type];\r\n      } else {\r\n        listeners[type] = filtered;\r\n      }\r\n    }\r\n  };\r\n\r\n  function Event(type) {\r\n    this.type = type;\r\n    this.target = undefined;\r\n  }\r\n\r\n  function MessageEvent(type, options) {\r\n    Event.call(this, type);\r\n    this.data = options.data;\r\n    this.lastEventId = options.lastEventId;\r\n  }\r\n\r\n  MessageEvent.prototype = Object.create(Event.prototype);\r\n\r\n  function ConnectionEvent(type, options) {\r\n    Event.call(this, type);\r\n    this.status = options.status;\r\n    this.statusText = options.statusText;\r\n    this.headers = options.headers;\r\n  }\r\n\r\n  ConnectionEvent.prototype = Object.create(Event.prototype);\r\n\r\n  function ErrorEvent(type, options) {\r\n    Event.call(this, type);\r\n    this.error = options.error;\r\n  }\r\n\r\n  ErrorEvent.prototype = Object.create(Event.prototype);\r\n\r\n  var WAITING = -1;\r\n  var CONNECTING = 0;\r\n  var OPEN = 1;\r\n  var CLOSED = 2;\r\n\r\n  var AFTER_CR = -1;\r\n  var FIELD_START = 0;\r\n  var FIELD = 1;\r\n  var VALUE_START = 2;\r\n  var VALUE = 3;\r\n\r\n  var contentTypeRegExp = /^text\\/event\\-stream(;.*)?$/i;\r\n\r\n  var MINIMUM_DURATION = 1000;\r\n  var MAXIMUM_DURATION = 18000000;\r\n\r\n  var parseDuration = function (value, def) {\r\n    var n = value == null ? def : parseInt(value, 10);\r\n    if (n !== n) {\r\n      n = def;\r\n    }\r\n    return clampDuration(n);\r\n  };\r\n  var clampDuration = function (n) {\r\n    return Math.min(Math.max(n, MINIMUM_DURATION), MAXIMUM_DURATION);\r\n  };\r\n\r\n  var fire = function (that, f, event) {\r\n    try {\r\n      if (typeof f === \"function\") {\r\n        f.call(that, event);\r\n      }\r\n    } catch (e) {\r\n      throwError(e);\r\n    }\r\n  };\r\n\r\n  function EventSourcePolyfill(url, options) {\r\n    EventTarget.call(this);\r\n    options = options || {};\r\n\r\n    this.onopen = undefined;\r\n    this.onmessage = undefined;\r\n    this.onerror = undefined;\r\n\r\n    this.url = undefined;\r\n    this.readyState = undefined;\r\n    this.withCredentials = undefined;\r\n    this.headers = undefined;\r\n\r\n    this._close = undefined;\r\n\r\n    start(this, url, options);\r\n  }\r\n\r\n  function getBestXHRTransport() {\r\n    return (XMLHttpRequest != undefined && (\"withCredentials\" in XMLHttpRequest.prototype)) || XDomainRequest == undefined\r\n        ? new XMLHttpRequest()\r\n        : new XDomainRequest();\r\n  }\r\n\r\n  var isFetchSupported = fetch != undefined && Response != undefined && \"body\" in Response.prototype;\r\n\r\n  function start(es, url, options) {\r\n    url = String(url);\r\n    var withCredentials = Boolean(options.withCredentials);\r\n    var lastEventIdQueryParameterName = options.lastEventIdQueryParameterName || \"lastEventId\";\r\n\r\n    var initialRetry = clampDuration(1000);\r\n    var heartbeatTimeout = parseDuration(options.heartbeatTimeout, 45000);\r\n\r\n    var lastEventId = \"\";\r\n    var retry = initialRetry;\r\n    var wasActivity = false;\r\n    var textLength = 0;\r\n    var headers = options.headers || {};\r\n    var TransportOption = options.Transport;\r\n    var xhr = isFetchSupported && TransportOption == undefined ? undefined : new XHRWrapper(TransportOption != undefined ? new TransportOption() : getBestXHRTransport());\r\n    var transport = TransportOption != null && typeof TransportOption !== \"string\" ? new TransportOption() : (xhr == undefined ? new FetchTransport() : new XHRTransport());\r\n    var abortController = undefined;\r\n    var timeout = 0;\r\n    var currentState = WAITING;\r\n    var dataBuffer = \"\";\r\n    var lastEventIdBuffer = \"\";\r\n    var eventTypeBuffer = \"\";\r\n\r\n    var textBuffer = \"\";\r\n    var state = FIELD_START;\r\n    var fieldStart = 0;\r\n    var valueStart = 0;\r\n\r\n    var onStart = function (status, statusText, contentType, headers) {\r\n      if (currentState === CONNECTING) {\r\n        if (status === 200 && contentType != undefined && contentTypeRegExp.test(contentType)) {\r\n          currentState = OPEN;\r\n          wasActivity = Date.now();\r\n          retry = initialRetry;\r\n          es.readyState = OPEN;\r\n          var event = new ConnectionEvent(\"open\", {\r\n            status: status,\r\n            statusText: statusText,\r\n            headers: headers\r\n          });\r\n          es.dispatchEvent(event);\r\n          fire(es, es.onopen, event);\r\n        } else {\r\n          var message = \"\";\r\n          if (status !== 200) {\r\n            if (statusText) {\r\n              statusText = statusText.replace(/\\s+/g, \" \");\r\n            }\r\n            message = \"EventSource's response has a status \" + status + \" \" + statusText + \" that is not 200. Aborting the connection.\";\r\n          } else {\r\n            message = \"EventSource's response has a Content-Type specifying an unsupported type: \" + (contentType == undefined ? \"-\" : contentType.replace(/\\s+/g, \" \")) + \". Aborting the connection.\";\r\n          }\r\n          close();\r\n          var event = new ConnectionEvent(\"error\", {\r\n            status: status,\r\n            statusText: statusText,\r\n            headers: headers\r\n          });\r\n          es.dispatchEvent(event);\r\n          fire(es, es.onerror, event);\r\n          console.error(message);\r\n        }\r\n      }\r\n    };\r\n\r\n    var onProgress = function (textChunk) {\r\n      if (currentState === OPEN) {\r\n        var n = -1;\r\n        for (var i = 0; i < textChunk.length; i += 1) {\r\n          var c = textChunk.charCodeAt(i);\r\n          if (c === \"\\n\".charCodeAt(0) || c === \"\\r\".charCodeAt(0)) {\r\n            n = i;\r\n          }\r\n        }\r\n        var chunk = (n !== -1 ? textBuffer : \"\") + textChunk.slice(0, n + 1);\r\n        textBuffer = (n === -1 ? textBuffer : \"\") + textChunk.slice(n + 1);\r\n        if (textChunk !== \"\") {\r\n          wasActivity = Date.now();\r\n          textLength += textChunk.length;\r\n        }\r\n        for (var position = 0; position < chunk.length; position += 1) {\r\n          var c = chunk.charCodeAt(position);\r\n          if (state === AFTER_CR && c === \"\\n\".charCodeAt(0)) {\r\n            state = FIELD_START;\r\n          } else {\r\n            if (state === AFTER_CR) {\r\n              state = FIELD_START;\r\n            }\r\n            if (c === \"\\r\".charCodeAt(0) || c === \"\\n\".charCodeAt(0)) {\r\n              if (state !== FIELD_START) {\r\n                if (state === FIELD) {\r\n                  valueStart = position + 1;\r\n                }\r\n                var field = chunk.slice(fieldStart, valueStart - 1);\r\n                var value = chunk.slice(valueStart + (valueStart < position && chunk.charCodeAt(valueStart) === \" \".charCodeAt(0) ? 1 : 0), position);\r\n                if (field === \"data\") {\r\n                  dataBuffer += \"\\n\";\r\n                  dataBuffer += value;\r\n                } else if (field === \"id\") {\r\n                  lastEventIdBuffer = value;\r\n                } else if (field === \"event\") {\r\n                  eventTypeBuffer = value;\r\n                } else if (field === \"retry\") {\r\n                  initialRetry = parseDuration(value, initialRetry);\r\n                  retry = initialRetry;\r\n                } else if (field === \"heartbeatTimeout\") {\r\n                  heartbeatTimeout = parseDuration(value, heartbeatTimeout);\r\n                  if (timeout !== 0) {\r\n                    clearTimeout(timeout);\r\n                    timeout = setTimeout(function () {\r\n                      onTimeout();\r\n                    }, heartbeatTimeout);\r\n                  }\r\n                }\r\n              }\r\n              if (state === FIELD_START) {\r\n                if (dataBuffer !== \"\") {\r\n                  lastEventId = lastEventIdBuffer;\r\n                  if (eventTypeBuffer === \"\") {\r\n                    eventTypeBuffer = \"message\";\r\n                  }\r\n                  var event = new MessageEvent(eventTypeBuffer, {\r\n                    data: dataBuffer.slice(1),\r\n                    lastEventId: lastEventIdBuffer\r\n                  });\r\n                  es.dispatchEvent(event);\r\n                  if (eventTypeBuffer === \"open\") {\r\n                    fire(es, es.onopen, event);\r\n                  } else if (eventTypeBuffer === \"message\") {\r\n                    fire(es, es.onmessage, event);\r\n                  } else if (eventTypeBuffer === \"error\") {\r\n                    fire(es, es.onerror, event);\r\n                  }\r\n                  if (currentState === CLOSED) {\r\n                    return;\r\n                  }\r\n                }\r\n                dataBuffer = \"\";\r\n                eventTypeBuffer = \"\";\r\n              }\r\n              state = c === \"\\r\".charCodeAt(0) ? AFTER_CR : FIELD_START;\r\n            } else {\r\n              if (state === FIELD_START) {\r\n                fieldStart = position;\r\n                state = FIELD;\r\n              }\r\n              if (state === FIELD) {\r\n                if (c === \":\".charCodeAt(0)) {\r\n                  valueStart = position + 1;\r\n                  state = VALUE_START;\r\n                }\r\n              } else if (state === VALUE_START) {\r\n                state = VALUE;\r\n              }\r\n            }\r\n          }\r\n        }\r\n      }\r\n    };\r\n\r\n    var onFinish = function (error) {\r\n      if (currentState === OPEN || currentState === CONNECTING) {\r\n        currentState = WAITING;\r\n        if (timeout !== 0) {\r\n          clearTimeout(timeout);\r\n          timeout = 0;\r\n        }\r\n        timeout = setTimeout(function () {\r\n          onTimeout();\r\n        }, retry);\r\n        retry = clampDuration(Math.min(initialRetry * 16, retry * 2));\r\n\r\n        es.readyState = CONNECTING;\r\n        var event = new ErrorEvent(\"error\", {error: error});\r\n        es.dispatchEvent(event);\r\n        fire(es, es.onerror, event);\r\n        if (error != undefined) {\r\n          console.error(error);\r\n        }\r\n      }\r\n    };\r\n\r\n    var close = function () {\r\n      currentState = CLOSED;\r\n      if (abortController != undefined) {\r\n        abortController.abort();\r\n        abortController = undefined;\r\n      }\r\n      if (timeout !== 0) {\r\n        clearTimeout(timeout);\r\n        timeout = 0;\r\n      }\r\n      es.readyState = CLOSED;\r\n    };\r\n\r\n    var onTimeout = function () {\r\n      timeout = 0;\r\n\r\n      if (currentState !== WAITING) {\r\n        if (!wasActivity && abortController != undefined) {\r\n          onFinish(new Error(\"No activity within \" + heartbeatTimeout + \" milliseconds.\" + \" \" + (currentState === CONNECTING ? \"No response received.\" : textLength + \" chars received.\") + \" \" + \"Reconnecting.\"));\r\n          if (abortController != undefined) {\r\n            abortController.abort();\r\n            abortController = undefined;\r\n          }\r\n        } else {\r\n          var nextHeartbeat = Math.max((wasActivity || Date.now()) + heartbeatTimeout - Date.now(), 1);\r\n          wasActivity = false;\r\n          timeout = setTimeout(function () {\r\n            onTimeout();\r\n          }, nextHeartbeat);\r\n        }\r\n        return;\r\n      }\r\n\r\n      wasActivity = false;\r\n      textLength = 0;\r\n      timeout = setTimeout(function () {\r\n        onTimeout();\r\n      }, heartbeatTimeout);\r\n\r\n      currentState = CONNECTING;\r\n      dataBuffer = \"\";\r\n      eventTypeBuffer = \"\";\r\n      lastEventIdBuffer = lastEventId;\r\n      textBuffer = \"\";\r\n      fieldStart = 0;\r\n      valueStart = 0;\r\n      state = FIELD_START;\r\n\r\n      // https://bugzilla.mozilla.org/show_bug.cgi?id=428916\r\n      // Request header field Last-Event-ID is not allowed by Access-Control-Allow-Headers.\r\n      var requestURL = url;\r\n      if (url.slice(0, 5) !== \"data:\" && url.slice(0, 5) !== \"blob:\") {\r\n        if (lastEventId !== \"\") {\r\n          requestURL += (url.indexOf(\"?\") === -1 ? \"?\" : \"&\") + lastEventIdQueryParameterName +\"=\" + encodeURIComponent(lastEventId);\r\n        }\r\n      }\r\n      var withCredentials = es.withCredentials;\r\n      var requestHeaders = {};\r\n      requestHeaders[\"Accept\"] = \"text/event-stream\";\r\n      var headers = es.headers;\r\n      if (headers != undefined) {\r\n        for (var name in headers) {\r\n          if (Object.prototype.hasOwnProperty.call(headers, name)) {\r\n            requestHeaders[name] = headers[name];\r\n          }\r\n        }\r\n      }\r\n      try {\r\n        abortController = transport.open(xhr, onStart, onProgress, onFinish, requestURL, withCredentials, requestHeaders);\r\n      } catch (error) {\r\n        close();\r\n        throw error;\r\n      }\r\n    };\r\n\r\n    es.url = url;\r\n    es.readyState = CONNECTING;\r\n    es.withCredentials = withCredentials;\r\n    es.headers = headers;\r\n    es._close = close;\r\n\r\n    onTimeout();\r\n  }\r\n\r\n  EventSourcePolyfill.prototype = Object.create(EventTarget.prototype);\r\n  EventSourcePolyfill.prototype.CONNECTING = CONNECTING;\r\n  EventSourcePolyfill.prototype.OPEN = OPEN;\r\n  EventSourcePolyfill.prototype.CLOSED = CLOSED;\r\n  EventSourcePolyfill.prototype.close = function () {\r\n    this._close();\r\n  };\r\n\r\n  EventSourcePolyfill.CONNECTING = CONNECTING;\r\n  EventSourcePolyfill.OPEN = OPEN;\r\n  EventSourcePolyfill.CLOSED = CLOSED;\r\n  EventSourcePolyfill.prototype.withCredentials = undefined;\r\n\r\n  var R = NativeEventSource;\r\n  if (XMLHttpRequest != undefined && (NativeEventSource == undefined || !(\"withCredentials\" in NativeEventSource.prototype))) {\r\n    // Why replace a native EventSource ?\r\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=444328\r\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=831392\r\n    // https://code.google.com/p/chromium/issues/detail?id=260144\r\n    // https://code.google.com/p/chromium/issues/detail?id=225654\r\n    // ...\r\n    R = EventSourcePolyfill;\r\n  }\r\n\r\n  (function (factory) {\r\n    {\r\n      var v = factory(exports);\r\n      if (v !== undefined) module.exports = v;\r\n    }\r\n  })(function (exports) {\r\n    exports.EventSourcePolyfill = EventSourcePolyfill;\r\n    exports.NativeEventSource = NativeEventSource;\r\n    exports.EventSource = R;\r\n  });\r\n}(typeof globalThis === 'undefined' ? (typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : commonjsGlobal) : globalThis));\n});\n\nvar eventsource$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), eventsource, {\n\t'default': eventsource\n}));\n\nconst formatText = (e) => e.data;\n\nconst formatJSON = (e) => JSON.parse(e.data);\n\nclass SSEClient {\n  constructor(config) {\n    this._handlers = {};\n    this._listeners = {};\n    this._source = null;\n\n    if (config.format) {\n      if (typeof config.format === 'string') {\n        if (config.format === 'plain') {\n          this._format = formatText;\n        } else if (config.format === 'json') {\n          this._format = formatJSON;\n        } else {\n          this._format = formatText;\n        }\n      } else if (typeof config.format === 'function') {\n        this._format = config.format;\n      } else {\n        this._format = formatText;\n      }\n    } else {\n      this._format = formatText;\n    }\n\n    if (config.handlers) {\n      for (const event in config.handlers) {\n        this.on(event, config.handlers[event]);\n      }\n    }\n\n    this.url = config.url;\n    this.withCredentials = !!config.withCredentials;\n    this.polyfillOptions = config.polyfillOptions || {};\n    this.forcePolyfill = !!config.forcePolyfill;\n  }\n\n  get source() {\n    return this._source;\n  }\n\n  connect() {\n    if (this.forcePolyfill) {\n      this._source = new eventsource.EventSourcePolyfill(\n        this.url,\n        Object.assign({}, this.polyfillOptions, {\n          withCredentials: this.withCredentials,\n        }),\n      );\n    } else {\n      this._source = new window.EventSource(this.url, {\n        withCredentials: this.withCredentials,\n      });\n    }\n\n    return new Promise((resolve, reject) => {\n      this._source.onopen = () => {\n        // Add event listeners that were added before we connected\n        for (let event in this._listeners) {\n          this._source.addEventListener(event, this._listeners[event]);\n        }\n\n        this._source.onerror = null;\n\n        resolve(this);\n      };\n\n      this._source.onerror = reject;\n    });\n  }\n\n  disconnect() {\n    if (this._source !== null) {\n      this._source.close();\n      this._source = null;\n    }\n  }\n\n  on(event, handler) {\n    if (!event) {\n      // Default \"event-less\" event\n      event = 'message';\n    }\n\n    if (!this._listeners[event]) {\n      this._create(event);\n    }\n\n    this._handlers[event].push(handler);\n\n    return this;\n  }\n\n  once(event, handler) {\n    this.on(event, (e) => {\n      this.off(event, handler);\n\n      handler(e);\n    });\n\n    return this;\n  }\n\n  off(event, handler) {\n    if (!this._handlers[event]) {\n      // no handlers registered for event\n      return this;\n    }\n\n    const idx = this._handlers[event].indexOf(handler);\n    if (idx === -1) {\n      // handler not registered for event\n      return this;\n    }\n\n    // remove handler from event\n    this._handlers[event].splice(idx, 1);\n\n    if (this._handlers[event].length === 0) {\n      // remove listener since no handlers exist\n      this._source.removeEventListener(event, this._listeners[event]);\n      delete this._handlers[event];\n      delete this._listeners[event];\n    }\n\n    return this;\n  }\n\n  _create(event) {\n    this._handlers[event] = [];\n\n    this._listeners[event] = (message) => {\n      let data;\n\n      try {\n        data = this._format(message);\n      } catch (err) {\n        if (typeof this._source.onerror === 'function') {\n          this._source.onerror(err);\n        }\n        return;\n      }\n\n      this._handlers[event].forEach((handler) => handler(data, message.lastEventId));\n    };\n\n    if (this._source) {\n      this._source.addEventListener(event, this._listeners[event]);\n    }\n  }\n}\n\nfunction install(Vue, config) {\n  if (Vue.config && Vue.config.globalProperties) {\n    // Vue3\n    Vue.config.globalProperties.$sse = new SSEManager(config);\n  } else {\n    // Vue2\n    // eslint-disable-next-line no-param-reassign, no-multi-assign\n    Vue.$sse = Vue.prototype.$sse = new SSEManager(config);\n  }\n\n  if (config && config.polyfill) {\n    Promise.resolve().then(function () { return eventsource$1; });\n  }\n\n  // This mixin allows components to specify that all clients that were\n  // created within it should be automatically disconnected (cleanup)\n  // when the component is destroyed.\n  Vue.mixin({\n    beforeCreate() {\n      if (this.$options.sse && this.$options.sse.cleanup) {\n        // We instantiate an SSEManager for this specific instance\n        // in order to track it (see discussions in #13 for rationale).\n        this.$sse = new SSEManager();\n\n        // We also set $clients to an empty array, as opposed to null,\n        // so that beforeDestroy and create know to use it.\n        this.$sse.$clients = [];\n      }\n    },\n    beforeDestroy() {\n      if (this.$sse.$clients !== null) {\n        this.$sse.$clients.forEach((c) => c.disconnect());\n        this.$sse.$clients = [];\n      }\n    },\n  });\n}\n\nclass SSEManager {\n  constructor(config) {\n    this.$defaultConfig = Object.assign(\n      {\n        format: formatText,\n        sendCredentials: false,\n      },\n      config,\n    );\n\n    this.$clients = null;\n  }\n\n  create(configOrURL) {\n    let config;\n    if (typeof configOrURL === 'object') {\n      config = configOrURL;\n    } else if (typeof configOrURL === 'string') {\n      config = {\n        url: configOrURL,\n      };\n    } else {\n      config = {};\n    }\n\n    const client = new SSEClient(Object.assign({}, this.$defaultConfig, config));\n\n    // If $clients is not null, then it's array that we should push this\n    // client into for later cleanup in our mixin's beforeDestroy.\n    if (this.$clients !== null) {\n      this.$clients.push(client);\n    }\n\n    return client;\n  }\n}\n\nvar index = {\n  install,\n};\n\nexport default index;\nexport { SSEManager, install };\n"
  },
  {
    "path": "dist/vue-sse.esm.js",
    "content": "/*!\n * vue-sse v2.5.0\n * (c) 2021 James Churchard\n * @license MIT\n */\nvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nfunction createCommonjsModule(fn) {\n  var module = { exports: {} };\n\treturn fn(module, module.exports), module.exports;\n}\n\n/** @license\r\n * eventsource.js\r\n * Available under MIT License (MIT)\r\n * https://github.com/Yaffle/EventSource/\r\n */\n\nvar eventsource = createCommonjsModule(function (module, exports) {\n/*jslint indent: 2, vars: true, plusplus: true */\r\n/*global setTimeout, clearTimeout */\r\n\r\n(function (global) {\r\n\r\n  var setTimeout = global.setTimeout;\r\n  var clearTimeout = global.clearTimeout;\r\n  var XMLHttpRequest = global.XMLHttpRequest;\r\n  var XDomainRequest = global.XDomainRequest;\r\n  var ActiveXObject = global.ActiveXObject;\r\n  var NativeEventSource = global.EventSource;\r\n\r\n  var document = global.document;\r\n  var Promise = global.Promise;\r\n  var fetch = global.fetch;\r\n  var Response = global.Response;\r\n  var TextDecoder = global.TextDecoder;\r\n  var TextEncoder = global.TextEncoder;\r\n  var AbortController = global.AbortController;\r\n\r\n  if (typeof window !== \"undefined\" && !(\"readyState\" in document) && document.body == null) { // Firefox 2\r\n    document.readyState = \"loading\";\r\n    window.addEventListener(\"load\", function (event) {\r\n      document.readyState = \"complete\";\r\n    }, false);\r\n  }\r\n\r\n  if (XMLHttpRequest == null && ActiveXObject != null) { // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest_in_IE6\r\n    XMLHttpRequest = function () {\r\n      return new ActiveXObject(\"Microsoft.XMLHTTP\");\r\n    };\r\n  }\r\n\r\n  if (Object.create == undefined) {\r\n    Object.create = function (C) {\r\n      function F(){}\r\n      F.prototype = C;\r\n      return new F();\r\n    };\r\n  }\r\n\r\n  if (!Date.now) {\r\n    Date.now = function now() {\r\n      return new Date().getTime();\r\n    };\r\n  }\r\n\r\n  // see #118 (Promise#finally with polyfilled Promise)\r\n  // see #123 (data URLs crash Edge)\r\n  // see #125 (CSP violations)\r\n  // see pull/#138\r\n  // => No way to polyfill Promise#finally\r\n\r\n  if (AbortController == undefined) {\r\n    var originalFetch2 = fetch;\r\n    fetch = function (url, options) {\r\n      var signal = options.signal;\r\n      return originalFetch2(url, {headers: options.headers, credentials: options.credentials, cache: options.cache}).then(function (response) {\r\n        var reader = response.body.getReader();\r\n        signal._reader = reader;\r\n        if (signal._aborted) {\r\n          signal._reader.cancel();\r\n        }\r\n        return {\r\n          status: response.status,\r\n          statusText: response.statusText,\r\n          headers: response.headers,\r\n          body: {\r\n            getReader: function () {\r\n              return reader;\r\n            }\r\n          }\r\n        };\r\n      });\r\n    };\r\n    AbortController = function () {\r\n      this.signal = {\r\n        _reader: null,\r\n        _aborted: false\r\n      };\r\n      this.abort = function () {\r\n        if (this.signal._reader != null) {\r\n          this.signal._reader.cancel();\r\n        }\r\n        this.signal._aborted = true;\r\n      };\r\n    };\r\n  }\r\n\r\n  function TextDecoderPolyfill() {\r\n    this.bitsNeeded = 0;\r\n    this.codePoint = 0;\r\n  }\r\n\r\n  TextDecoderPolyfill.prototype.decode = function (octets) {\r\n    function valid(codePoint, shift, octetsCount) {\r\n      if (octetsCount === 1) {\r\n        return codePoint >= 0x0080 >> shift && codePoint << shift <= 0x07FF;\r\n      }\r\n      if (octetsCount === 2) {\r\n        return codePoint >= 0x0800 >> shift && codePoint << shift <= 0xD7FF || codePoint >= 0xE000 >> shift && codePoint << shift <= 0xFFFF;\r\n      }\r\n      if (octetsCount === 3) {\r\n        return codePoint >= 0x010000 >> shift && codePoint << shift <= 0x10FFFF;\r\n      }\r\n      throw new Error();\r\n    }\r\n    function octetsCount(bitsNeeded, codePoint) {\r\n      if (bitsNeeded === 6 * 1) {\r\n        return codePoint >> 6 > 15 ? 3 : codePoint > 31 ? 2 : 1;\r\n      }\r\n      if (bitsNeeded === 6 * 2) {\r\n        return codePoint > 15 ? 3 : 2;\r\n      }\r\n      if (bitsNeeded === 6 * 3) {\r\n        return 3;\r\n      }\r\n      throw new Error();\r\n    }\r\n    var REPLACER = 0xFFFD;\r\n    var string = \"\";\r\n    var bitsNeeded = this.bitsNeeded;\r\n    var codePoint = this.codePoint;\r\n    for (var i = 0; i < octets.length; i += 1) {\r\n      var octet = octets[i];\r\n      if (bitsNeeded !== 0) {\r\n        if (octet < 128 || octet > 191 || !valid(codePoint << 6 | octet & 63, bitsNeeded - 6, octetsCount(bitsNeeded, codePoint))) {\r\n          bitsNeeded = 0;\r\n          codePoint = REPLACER;\r\n          string += String.fromCharCode(codePoint);\r\n        }\r\n      }\r\n      if (bitsNeeded === 0) {\r\n        if (octet >= 0 && octet <= 127) {\r\n          bitsNeeded = 0;\r\n          codePoint = octet;\r\n        } else if (octet >= 192 && octet <= 223) {\r\n          bitsNeeded = 6 * 1;\r\n          codePoint = octet & 31;\r\n        } else if (octet >= 224 && octet <= 239) {\r\n          bitsNeeded = 6 * 2;\r\n          codePoint = octet & 15;\r\n        } else if (octet >= 240 && octet <= 247) {\r\n          bitsNeeded = 6 * 3;\r\n          codePoint = octet & 7;\r\n        } else {\r\n          bitsNeeded = 0;\r\n          codePoint = REPLACER;\r\n        }\r\n        if (bitsNeeded !== 0 && !valid(codePoint, bitsNeeded, octetsCount(bitsNeeded, codePoint))) {\r\n          bitsNeeded = 0;\r\n          codePoint = REPLACER;\r\n        }\r\n      } else {\r\n        bitsNeeded -= 6;\r\n        codePoint = codePoint << 6 | octet & 63;\r\n      }\r\n      if (bitsNeeded === 0) {\r\n        if (codePoint <= 0xFFFF) {\r\n          string += String.fromCharCode(codePoint);\r\n        } else {\r\n          string += String.fromCharCode(0xD800 + (codePoint - 0xFFFF - 1 >> 10));\r\n          string += String.fromCharCode(0xDC00 + (codePoint - 0xFFFF - 1 & 0x3FF));\r\n        }\r\n      }\r\n    }\r\n    this.bitsNeeded = bitsNeeded;\r\n    this.codePoint = codePoint;\r\n    return string;\r\n  };\r\n\r\n  // Firefox < 38 throws an error with stream option\r\n  var supportsStreamOption = function () {\r\n    try {\r\n      return new TextDecoder().decode(new TextEncoder().encode(\"test\"), {stream: true}) === \"test\";\r\n    } catch (error) {\r\n      console.debug(\"TextDecoder does not support streaming option. Using polyfill instead: \" + error);\r\n    }\r\n    return false;\r\n  };\r\n\r\n  // IE, Edge\r\n  if (TextDecoder == undefined || TextEncoder == undefined || !supportsStreamOption()) {\r\n    TextDecoder = TextDecoderPolyfill;\r\n  }\r\n\r\n  var k = function () {\r\n  };\r\n\r\n  function XHRWrapper(xhr) {\r\n    this.withCredentials = false;\r\n    this.readyState = 0;\r\n    this.status = 0;\r\n    this.statusText = \"\";\r\n    this.responseText = \"\";\r\n    this.onprogress = k;\r\n    this.onload = k;\r\n    this.onerror = k;\r\n    this.onreadystatechange = k;\r\n    this._contentType = \"\";\r\n    this._xhr = xhr;\r\n    this._sendTimeout = 0;\r\n    this._abort = k;\r\n  }\r\n\r\n  XHRWrapper.prototype.open = function (method, url) {\r\n    this._abort(true);\r\n\r\n    var that = this;\r\n    var xhr = this._xhr;\r\n    var state = 1;\r\n    var timeout = 0;\r\n\r\n    this._abort = function (silent) {\r\n      if (that._sendTimeout !== 0) {\r\n        clearTimeout(that._sendTimeout);\r\n        that._sendTimeout = 0;\r\n      }\r\n      if (state === 1 || state === 2 || state === 3) {\r\n        state = 4;\r\n        xhr.onload = k;\r\n        xhr.onerror = k;\r\n        xhr.onabort = k;\r\n        xhr.onprogress = k;\r\n        xhr.onreadystatechange = k;\r\n        // IE 8 - 9: XDomainRequest#abort() does not fire any event\r\n        // Opera < 10: XMLHttpRequest#abort() does not fire any event\r\n        xhr.abort();\r\n        if (timeout !== 0) {\r\n          clearTimeout(timeout);\r\n          timeout = 0;\r\n        }\r\n        if (!silent) {\r\n          that.readyState = 4;\r\n          that.onabort(null);\r\n          that.onreadystatechange();\r\n        }\r\n      }\r\n      state = 0;\r\n    };\r\n\r\n    var onStart = function () {\r\n      if (state === 1) {\r\n        //state = 2;\r\n        var status = 0;\r\n        var statusText = \"\";\r\n        var contentType = undefined;\r\n        if (!(\"contentType\" in xhr)) {\r\n          try {\r\n            status = xhr.status;\r\n            statusText = xhr.statusText;\r\n            contentType = xhr.getResponseHeader(\"Content-Type\");\r\n          } catch (error) {\r\n            // IE < 10 throws exception for `xhr.status` when xhr.readyState === 2 || xhr.readyState === 3\r\n            // Opera < 11 throws exception for `xhr.status` when xhr.readyState === 2\r\n            // https://bugs.webkit.org/show_bug.cgi?id=29121\r\n            status = 0;\r\n            statusText = \"\";\r\n            contentType = undefined;\r\n            // Firefox < 14, Chrome ?, Safari ?\r\n            // https://bugs.webkit.org/show_bug.cgi?id=29658\r\n            // https://bugs.webkit.org/show_bug.cgi?id=77854\r\n          }\r\n        } else {\r\n          status = 200;\r\n          statusText = \"OK\";\r\n          contentType = xhr.contentType;\r\n        }\r\n        if (status !== 0) {\r\n          state = 2;\r\n          that.readyState = 2;\r\n          that.status = status;\r\n          that.statusText = statusText;\r\n          that._contentType = contentType;\r\n          that.onreadystatechange();\r\n        }\r\n      }\r\n    };\r\n    var onProgress = function () {\r\n      onStart();\r\n      if (state === 2 || state === 3) {\r\n        state = 3;\r\n        var responseText = \"\";\r\n        try {\r\n          responseText = xhr.responseText;\r\n        } catch (error) {\r\n          // IE 8 - 9 with XMLHttpRequest\r\n        }\r\n        that.readyState = 3;\r\n        that.responseText = responseText;\r\n        that.onprogress();\r\n      }\r\n    };\r\n    var onFinish = function (type, event) {\r\n      if (event == null || event.preventDefault == null) {\r\n        event = {\r\n          preventDefault: k\r\n        };\r\n      }\r\n      // Firefox 52 fires \"readystatechange\" (xhr.readyState === 4) without final \"readystatechange\" (xhr.readyState === 3)\r\n      // IE 8 fires \"onload\" without \"onprogress\"\r\n      onProgress();\r\n      if (state === 1 || state === 2 || state === 3) {\r\n        state = 4;\r\n        if (timeout !== 0) {\r\n          clearTimeout(timeout);\r\n          timeout = 0;\r\n        }\r\n        that.readyState = 4;\r\n        if (type === \"load\") {\r\n          that.onload(event);\r\n        } else if (type === \"error\") {\r\n          that.onerror(event);\r\n        } else if (type === \"abort\") {\r\n          that.onabort(event);\r\n        } else {\r\n          throw new TypeError();\r\n        }\r\n        that.onreadystatechange();\r\n      }\r\n    };\r\n    var onReadyStateChange = function (event) {\r\n      if (xhr != undefined) { // Opera 12\r\n        if (xhr.readyState === 4) {\r\n          if (!(\"onload\" in xhr) || !(\"onerror\" in xhr) || !(\"onabort\" in xhr)) {\r\n            onFinish(xhr.responseText === \"\" ? \"error\" : \"load\", event);\r\n          }\r\n        } else if (xhr.readyState === 3) {\r\n          if (!(\"onprogress\" in xhr)) { // testing XMLHttpRequest#responseText too many times is too slow in IE 11\r\n            // and in Firefox 3.6\r\n            onProgress();\r\n          }\r\n        } else if (xhr.readyState === 2) {\r\n          onStart();\r\n        }\r\n      }\r\n    };\r\n    var onTimeout = function () {\r\n      timeout = setTimeout(function () {\r\n        onTimeout();\r\n      }, 500);\r\n      if (xhr.readyState === 3) {\r\n        onProgress();\r\n      }\r\n    };\r\n\r\n    // XDomainRequest#abort removes onprogress, onerror, onload\r\n    if (\"onload\" in xhr) {\r\n      xhr.onload = function (event) {\r\n        onFinish(\"load\", event);\r\n      };\r\n    }\r\n    if (\"onerror\" in xhr) {\r\n      xhr.onerror = function (event) {\r\n        onFinish(\"error\", event);\r\n      };\r\n    }\r\n    // improper fix to match Firefox behaviour, but it is better than just ignore abort\r\n    // see https://bugzilla.mozilla.org/show_bug.cgi?id=768596\r\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=880200\r\n    // https://code.google.com/p/chromium/issues/detail?id=153570\r\n    // IE 8 fires \"onload\" without \"onprogress\r\n    if (\"onabort\" in xhr) {\r\n      xhr.onabort = function (event) {\r\n        onFinish(\"abort\", event);\r\n      };\r\n    }\r\n\r\n    if (\"onprogress\" in xhr) {\r\n      xhr.onprogress = onProgress;\r\n    }\r\n\r\n    // IE 8 - 9 (XMLHTTPRequest)\r\n    // Opera < 12\r\n    // Firefox < 3.5\r\n    // Firefox 3.5 - 3.6 - ? < 9.0\r\n    // onprogress is not fired sometimes or delayed\r\n    // see also #64 (significant lag in IE 11)\r\n    if (\"onreadystatechange\" in xhr) {\r\n      xhr.onreadystatechange = function (event) {\r\n        onReadyStateChange(event);\r\n      };\r\n    }\r\n\r\n    if (\"contentType\" in xhr || !(\"ontimeout\" in XMLHttpRequest.prototype)) {\r\n      url += (url.indexOf(\"?\") === -1 ? \"?\" : \"&\") + \"padding=true\";\r\n    }\r\n    xhr.open(method, url, true);\r\n\r\n    if (\"readyState\" in xhr) {\r\n      // workaround for Opera 12 issue with \"progress\" events\r\n      // #91 (XMLHttpRequest onprogress not fired for streaming response in Edge 14-15-?)\r\n      timeout = setTimeout(function () {\r\n        onTimeout();\r\n      }, 0);\r\n    }\r\n  };\r\n  XHRWrapper.prototype.abort = function () {\r\n    this._abort(false);\r\n  };\r\n  XHRWrapper.prototype.getResponseHeader = function (name) {\r\n    return this._contentType;\r\n  };\r\n  XHRWrapper.prototype.setRequestHeader = function (name, value) {\r\n    var xhr = this._xhr;\r\n    if (\"setRequestHeader\" in xhr) {\r\n      xhr.setRequestHeader(name, value);\r\n    }\r\n  };\r\n  XHRWrapper.prototype.getAllResponseHeaders = function () {\r\n    // XMLHttpRequest#getAllResponseHeaders returns null for CORS requests in Firefox 3.6.28\r\n    return this._xhr.getAllResponseHeaders != undefined ? this._xhr.getAllResponseHeaders() || \"\" : \"\";\r\n  };\r\n  XHRWrapper.prototype.send = function () {\r\n    // loading indicator in Safari < ? (6), Chrome < 14, Firefox\r\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=736723\r\n    if ((!(\"ontimeout\" in XMLHttpRequest.prototype) || (!(\"sendAsBinary\" in XMLHttpRequest.prototype) && !(\"mozAnon\" in XMLHttpRequest.prototype))) &&\r\n        document != undefined &&\r\n        document.readyState != undefined &&\r\n        document.readyState !== \"complete\") {\r\n      var that = this;\r\n      that._sendTimeout = setTimeout(function () {\r\n        that._sendTimeout = 0;\r\n        that.send();\r\n      }, 4);\r\n      return;\r\n    }\r\n\r\n    var xhr = this._xhr;\r\n    // withCredentials should be set after \"open\" for Safari and Chrome (< 19 ?)\r\n    if (\"withCredentials\" in xhr) {\r\n      xhr.withCredentials = this.withCredentials;\r\n    }\r\n    try {\r\n      // xhr.send(); throws \"Not enough arguments\" in Firefox 3.0\r\n      xhr.send(undefined);\r\n    } catch (error1) {\r\n      // Safari 5.1.7, Opera 12\r\n      throw error1;\r\n    }\r\n  };\r\n\r\n  function toLowerCase(name) {\r\n    return name.replace(/[A-Z]/g, function (c) {\r\n      return String.fromCharCode(c.charCodeAt(0) + 0x20);\r\n    });\r\n  }\r\n\r\n  function HeadersPolyfill(all) {\r\n    // Get headers: implemented according to mozilla's example code: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/getAllResponseHeaders#Example\r\n    var map = Object.create(null);\r\n    var array = all.split(\"\\r\\n\");\r\n    for (var i = 0; i < array.length; i += 1) {\r\n      var line = array[i];\r\n      var parts = line.split(\": \");\r\n      var name = parts.shift();\r\n      var value = parts.join(\": \");\r\n      map[toLowerCase(name)] = value;\r\n    }\r\n    this._map = map;\r\n  }\r\n  HeadersPolyfill.prototype.get = function (name) {\r\n    return this._map[toLowerCase(name)];\r\n  };\r\n\r\n  if (XMLHttpRequest != null && XMLHttpRequest.HEADERS_RECEIVED == null) { // IE < 9, Firefox 3.6\r\n    XMLHttpRequest.HEADERS_RECEIVED = 2;\r\n  }\r\n\r\n  function XHRTransport() {\r\n  }\r\n\r\n  XHRTransport.prototype.open = function (xhr, onStartCallback, onProgressCallback, onFinishCallback, url, withCredentials, headers) {\r\n    xhr.open(\"GET\", url);\r\n    var offset = 0;\r\n    xhr.onprogress = function () {\r\n      var responseText = xhr.responseText;\r\n      var chunk = responseText.slice(offset);\r\n      offset += chunk.length;\r\n      onProgressCallback(chunk);\r\n    };\r\n    xhr.onerror = function (event) {\r\n      event.preventDefault();\r\n      onFinishCallback(new Error(\"NetworkError\"));\r\n    };\r\n    xhr.onload = function () {\r\n      onFinishCallback(null);\r\n    };\r\n    xhr.onabort = function () {\r\n      onFinishCallback(null);\r\n    };\r\n    xhr.onreadystatechange = function () {\r\n      if (xhr.readyState === XMLHttpRequest.HEADERS_RECEIVED) {\r\n        var status = xhr.status;\r\n        var statusText = xhr.statusText;\r\n        var contentType = xhr.getResponseHeader(\"Content-Type\");\r\n        var headers = xhr.getAllResponseHeaders();\r\n        onStartCallback(status, statusText, contentType, new HeadersPolyfill(headers));\r\n      }\r\n    };\r\n    xhr.withCredentials = withCredentials;\r\n    for (var name in headers) {\r\n      if (Object.prototype.hasOwnProperty.call(headers, name)) {\r\n        xhr.setRequestHeader(name, headers[name]);\r\n      }\r\n    }\r\n    xhr.send();\r\n    return xhr;\r\n  };\r\n\r\n  function HeadersWrapper(headers) {\r\n    this._headers = headers;\r\n  }\r\n  HeadersWrapper.prototype.get = function (name) {\r\n    return this._headers.get(name);\r\n  };\r\n\r\n  function FetchTransport() {\r\n  }\r\n\r\n  FetchTransport.prototype.open = function (xhr, onStartCallback, onProgressCallback, onFinishCallback, url, withCredentials, headers) {\r\n    var reader = null;\r\n    var controller = new AbortController();\r\n    var signal = controller.signal;\r\n    var textDecoder = new TextDecoder();\r\n    fetch(url, {\r\n      headers: headers,\r\n      credentials: withCredentials ? \"include\" : \"same-origin\",\r\n      signal: signal,\r\n      cache: \"no-store\"\r\n    }).then(function (response) {\r\n      reader = response.body.getReader();\r\n      onStartCallback(response.status, response.statusText, response.headers.get(\"Content-Type\"), new HeadersWrapper(response.headers));\r\n      // see https://github.com/promises-aplus/promises-spec/issues/179\r\n      return new Promise(function (resolve, reject) {\r\n        var readNextChunk = function () {\r\n          reader.read().then(function (result) {\r\n            if (result.done) {\r\n              //Note: bytes in textDecoder are ignored\r\n              resolve(undefined);\r\n            } else {\r\n              var chunk = textDecoder.decode(result.value, {stream: true});\r\n              onProgressCallback(chunk);\r\n              readNextChunk();\r\n            }\r\n          })[\"catch\"](function (error) {\r\n            reject(error);\r\n          });\r\n        };\r\n        readNextChunk();\r\n      });\r\n    })[\"catch\"](function (error) {\r\n      if (error.name === \"AbortError\") {\r\n        return undefined;\r\n      } else {\r\n        return error;\r\n      }\r\n    }).then(function (error) {\r\n      onFinishCallback(error);\r\n    });\r\n    return {\r\n      abort: function () {\r\n        if (reader != null) {\r\n          reader.cancel(); // https://bugzilla.mozilla.org/show_bug.cgi?id=1583815\r\n        }\r\n        controller.abort();\r\n      }\r\n    };\r\n  };\r\n\r\n  function EventTarget() {\r\n    this._listeners = Object.create(null);\r\n  }\r\n\r\n  function throwError(e) {\r\n    setTimeout(function () {\r\n      throw e;\r\n    }, 0);\r\n  }\r\n\r\n  EventTarget.prototype.dispatchEvent = function (event) {\r\n    event.target = this;\r\n    var typeListeners = this._listeners[event.type];\r\n    if (typeListeners != undefined) {\r\n      var length = typeListeners.length;\r\n      for (var i = 0; i < length; i += 1) {\r\n        var listener = typeListeners[i];\r\n        try {\r\n          if (typeof listener.handleEvent === \"function\") {\r\n            listener.handleEvent(event);\r\n          } else {\r\n            listener.call(this, event);\r\n          }\r\n        } catch (e) {\r\n          throwError(e);\r\n        }\r\n      }\r\n    }\r\n  };\r\n  EventTarget.prototype.addEventListener = function (type, listener) {\r\n    type = String(type);\r\n    var listeners = this._listeners;\r\n    var typeListeners = listeners[type];\r\n    if (typeListeners == undefined) {\r\n      typeListeners = [];\r\n      listeners[type] = typeListeners;\r\n    }\r\n    var found = false;\r\n    for (var i = 0; i < typeListeners.length; i += 1) {\r\n      if (typeListeners[i] === listener) {\r\n        found = true;\r\n      }\r\n    }\r\n    if (!found) {\r\n      typeListeners.push(listener);\r\n    }\r\n  };\r\n  EventTarget.prototype.removeEventListener = function (type, listener) {\r\n    type = String(type);\r\n    var listeners = this._listeners;\r\n    var typeListeners = listeners[type];\r\n    if (typeListeners != undefined) {\r\n      var filtered = [];\r\n      for (var i = 0; i < typeListeners.length; i += 1) {\r\n        if (typeListeners[i] !== listener) {\r\n          filtered.push(typeListeners[i]);\r\n        }\r\n      }\r\n      if (filtered.length === 0) {\r\n        delete listeners[type];\r\n      } else {\r\n        listeners[type] = filtered;\r\n      }\r\n    }\r\n  };\r\n\r\n  function Event(type) {\r\n    this.type = type;\r\n    this.target = undefined;\r\n  }\r\n\r\n  function MessageEvent(type, options) {\r\n    Event.call(this, type);\r\n    this.data = options.data;\r\n    this.lastEventId = options.lastEventId;\r\n  }\r\n\r\n  MessageEvent.prototype = Object.create(Event.prototype);\r\n\r\n  function ConnectionEvent(type, options) {\r\n    Event.call(this, type);\r\n    this.status = options.status;\r\n    this.statusText = options.statusText;\r\n    this.headers = options.headers;\r\n  }\r\n\r\n  ConnectionEvent.prototype = Object.create(Event.prototype);\r\n\r\n  function ErrorEvent(type, options) {\r\n    Event.call(this, type);\r\n    this.error = options.error;\r\n  }\r\n\r\n  ErrorEvent.prototype = Object.create(Event.prototype);\r\n\r\n  var WAITING = -1;\r\n  var CONNECTING = 0;\r\n  var OPEN = 1;\r\n  var CLOSED = 2;\r\n\r\n  var AFTER_CR = -1;\r\n  var FIELD_START = 0;\r\n  var FIELD = 1;\r\n  var VALUE_START = 2;\r\n  var VALUE = 3;\r\n\r\n  var contentTypeRegExp = /^text\\/event\\-stream(;.*)?$/i;\r\n\r\n  var MINIMUM_DURATION = 1000;\r\n  var MAXIMUM_DURATION = 18000000;\r\n\r\n  var parseDuration = function (value, def) {\r\n    var n = value == null ? def : parseInt(value, 10);\r\n    if (n !== n) {\r\n      n = def;\r\n    }\r\n    return clampDuration(n);\r\n  };\r\n  var clampDuration = function (n) {\r\n    return Math.min(Math.max(n, MINIMUM_DURATION), MAXIMUM_DURATION);\r\n  };\r\n\r\n  var fire = function (that, f, event) {\r\n    try {\r\n      if (typeof f === \"function\") {\r\n        f.call(that, event);\r\n      }\r\n    } catch (e) {\r\n      throwError(e);\r\n    }\r\n  };\r\n\r\n  function EventSourcePolyfill(url, options) {\r\n    EventTarget.call(this);\r\n    options = options || {};\r\n\r\n    this.onopen = undefined;\r\n    this.onmessage = undefined;\r\n    this.onerror = undefined;\r\n\r\n    this.url = undefined;\r\n    this.readyState = undefined;\r\n    this.withCredentials = undefined;\r\n    this.headers = undefined;\r\n\r\n    this._close = undefined;\r\n\r\n    start(this, url, options);\r\n  }\r\n\r\n  function getBestXHRTransport() {\r\n    return (XMLHttpRequest != undefined && (\"withCredentials\" in XMLHttpRequest.prototype)) || XDomainRequest == undefined\r\n        ? new XMLHttpRequest()\r\n        : new XDomainRequest();\r\n  }\r\n\r\n  var isFetchSupported = fetch != undefined && Response != undefined && \"body\" in Response.prototype;\r\n\r\n  function start(es, url, options) {\r\n    url = String(url);\r\n    var withCredentials = Boolean(options.withCredentials);\r\n    var lastEventIdQueryParameterName = options.lastEventIdQueryParameterName || \"lastEventId\";\r\n\r\n    var initialRetry = clampDuration(1000);\r\n    var heartbeatTimeout = parseDuration(options.heartbeatTimeout, 45000);\r\n\r\n    var lastEventId = \"\";\r\n    var retry = initialRetry;\r\n    var wasActivity = false;\r\n    var textLength = 0;\r\n    var headers = options.headers || {};\r\n    var TransportOption = options.Transport;\r\n    var xhr = isFetchSupported && TransportOption == undefined ? undefined : new XHRWrapper(TransportOption != undefined ? new TransportOption() : getBestXHRTransport());\r\n    var transport = TransportOption != null && typeof TransportOption !== \"string\" ? new TransportOption() : (xhr == undefined ? new FetchTransport() : new XHRTransport());\r\n    var abortController = undefined;\r\n    var timeout = 0;\r\n    var currentState = WAITING;\r\n    var dataBuffer = \"\";\r\n    var lastEventIdBuffer = \"\";\r\n    var eventTypeBuffer = \"\";\r\n\r\n    var textBuffer = \"\";\r\n    var state = FIELD_START;\r\n    var fieldStart = 0;\r\n    var valueStart = 0;\r\n\r\n    var onStart = function (status, statusText, contentType, headers) {\r\n      if (currentState === CONNECTING) {\r\n        if (status === 200 && contentType != undefined && contentTypeRegExp.test(contentType)) {\r\n          currentState = OPEN;\r\n          wasActivity = Date.now();\r\n          retry = initialRetry;\r\n          es.readyState = OPEN;\r\n          var event = new ConnectionEvent(\"open\", {\r\n            status: status,\r\n            statusText: statusText,\r\n            headers: headers\r\n          });\r\n          es.dispatchEvent(event);\r\n          fire(es, es.onopen, event);\r\n        } else {\r\n          var message = \"\";\r\n          if (status !== 200) {\r\n            if (statusText) {\r\n              statusText = statusText.replace(/\\s+/g, \" \");\r\n            }\r\n            message = \"EventSource's response has a status \" + status + \" \" + statusText + \" that is not 200. Aborting the connection.\";\r\n          } else {\r\n            message = \"EventSource's response has a Content-Type specifying an unsupported type: \" + (contentType == undefined ? \"-\" : contentType.replace(/\\s+/g, \" \")) + \". Aborting the connection.\";\r\n          }\r\n          close();\r\n          var event = new ConnectionEvent(\"error\", {\r\n            status: status,\r\n            statusText: statusText,\r\n            headers: headers\r\n          });\r\n          es.dispatchEvent(event);\r\n          fire(es, es.onerror, event);\r\n          console.error(message);\r\n        }\r\n      }\r\n    };\r\n\r\n    var onProgress = function (textChunk) {\r\n      if (currentState === OPEN) {\r\n        var n = -1;\r\n        for (var i = 0; i < textChunk.length; i += 1) {\r\n          var c = textChunk.charCodeAt(i);\r\n          if (c === \"\\n\".charCodeAt(0) || c === \"\\r\".charCodeAt(0)) {\r\n            n = i;\r\n          }\r\n        }\r\n        var chunk = (n !== -1 ? textBuffer : \"\") + textChunk.slice(0, n + 1);\r\n        textBuffer = (n === -1 ? textBuffer : \"\") + textChunk.slice(n + 1);\r\n        if (textChunk !== \"\") {\r\n          wasActivity = Date.now();\r\n          textLength += textChunk.length;\r\n        }\r\n        for (var position = 0; position < chunk.length; position += 1) {\r\n          var c = chunk.charCodeAt(position);\r\n          if (state === AFTER_CR && c === \"\\n\".charCodeAt(0)) {\r\n            state = FIELD_START;\r\n          } else {\r\n            if (state === AFTER_CR) {\r\n              state = FIELD_START;\r\n            }\r\n            if (c === \"\\r\".charCodeAt(0) || c === \"\\n\".charCodeAt(0)) {\r\n              if (state !== FIELD_START) {\r\n                if (state === FIELD) {\r\n                  valueStart = position + 1;\r\n                }\r\n                var field = chunk.slice(fieldStart, valueStart - 1);\r\n                var value = chunk.slice(valueStart + (valueStart < position && chunk.charCodeAt(valueStart) === \" \".charCodeAt(0) ? 1 : 0), position);\r\n                if (field === \"data\") {\r\n                  dataBuffer += \"\\n\";\r\n                  dataBuffer += value;\r\n                } else if (field === \"id\") {\r\n                  lastEventIdBuffer = value;\r\n                } else if (field === \"event\") {\r\n                  eventTypeBuffer = value;\r\n                } else if (field === \"retry\") {\r\n                  initialRetry = parseDuration(value, initialRetry);\r\n                  retry = initialRetry;\r\n                } else if (field === \"heartbeatTimeout\") {\r\n                  heartbeatTimeout = parseDuration(value, heartbeatTimeout);\r\n                  if (timeout !== 0) {\r\n                    clearTimeout(timeout);\r\n                    timeout = setTimeout(function () {\r\n                      onTimeout();\r\n                    }, heartbeatTimeout);\r\n                  }\r\n                }\r\n              }\r\n              if (state === FIELD_START) {\r\n                if (dataBuffer !== \"\") {\r\n                  lastEventId = lastEventIdBuffer;\r\n                  if (eventTypeBuffer === \"\") {\r\n                    eventTypeBuffer = \"message\";\r\n                  }\r\n                  var event = new MessageEvent(eventTypeBuffer, {\r\n                    data: dataBuffer.slice(1),\r\n                    lastEventId: lastEventIdBuffer\r\n                  });\r\n                  es.dispatchEvent(event);\r\n                  if (eventTypeBuffer === \"open\") {\r\n                    fire(es, es.onopen, event);\r\n                  } else if (eventTypeBuffer === \"message\") {\r\n                    fire(es, es.onmessage, event);\r\n                  } else if (eventTypeBuffer === \"error\") {\r\n                    fire(es, es.onerror, event);\r\n                  }\r\n                  if (currentState === CLOSED) {\r\n                    return;\r\n                  }\r\n                }\r\n                dataBuffer = \"\";\r\n                eventTypeBuffer = \"\";\r\n              }\r\n              state = c === \"\\r\".charCodeAt(0) ? AFTER_CR : FIELD_START;\r\n            } else {\r\n              if (state === FIELD_START) {\r\n                fieldStart = position;\r\n                state = FIELD;\r\n              }\r\n              if (state === FIELD) {\r\n                if (c === \":\".charCodeAt(0)) {\r\n                  valueStart = position + 1;\r\n                  state = VALUE_START;\r\n                }\r\n              } else if (state === VALUE_START) {\r\n                state = VALUE;\r\n              }\r\n            }\r\n          }\r\n        }\r\n      }\r\n    };\r\n\r\n    var onFinish = function (error) {\r\n      if (currentState === OPEN || currentState === CONNECTING) {\r\n        currentState = WAITING;\r\n        if (timeout !== 0) {\r\n          clearTimeout(timeout);\r\n          timeout = 0;\r\n        }\r\n        timeout = setTimeout(function () {\r\n          onTimeout();\r\n        }, retry);\r\n        retry = clampDuration(Math.min(initialRetry * 16, retry * 2));\r\n\r\n        es.readyState = CONNECTING;\r\n        var event = new ErrorEvent(\"error\", {error: error});\r\n        es.dispatchEvent(event);\r\n        fire(es, es.onerror, event);\r\n        if (error != undefined) {\r\n          console.error(error);\r\n        }\r\n      }\r\n    };\r\n\r\n    var close = function () {\r\n      currentState = CLOSED;\r\n      if (abortController != undefined) {\r\n        abortController.abort();\r\n        abortController = undefined;\r\n      }\r\n      if (timeout !== 0) {\r\n        clearTimeout(timeout);\r\n        timeout = 0;\r\n      }\r\n      es.readyState = CLOSED;\r\n    };\r\n\r\n    var onTimeout = function () {\r\n      timeout = 0;\r\n\r\n      if (currentState !== WAITING) {\r\n        if (!wasActivity && abortController != undefined) {\r\n          onFinish(new Error(\"No activity within \" + heartbeatTimeout + \" milliseconds.\" + \" \" + (currentState === CONNECTING ? \"No response received.\" : textLength + \" chars received.\") + \" \" + \"Reconnecting.\"));\r\n          if (abortController != undefined) {\r\n            abortController.abort();\r\n            abortController = undefined;\r\n          }\r\n        } else {\r\n          var nextHeartbeat = Math.max((wasActivity || Date.now()) + heartbeatTimeout - Date.now(), 1);\r\n          wasActivity = false;\r\n          timeout = setTimeout(function () {\r\n            onTimeout();\r\n          }, nextHeartbeat);\r\n        }\r\n        return;\r\n      }\r\n\r\n      wasActivity = false;\r\n      textLength = 0;\r\n      timeout = setTimeout(function () {\r\n        onTimeout();\r\n      }, heartbeatTimeout);\r\n\r\n      currentState = CONNECTING;\r\n      dataBuffer = \"\";\r\n      eventTypeBuffer = \"\";\r\n      lastEventIdBuffer = lastEventId;\r\n      textBuffer = \"\";\r\n      fieldStart = 0;\r\n      valueStart = 0;\r\n      state = FIELD_START;\r\n\r\n      // https://bugzilla.mozilla.org/show_bug.cgi?id=428916\r\n      // Request header field Last-Event-ID is not allowed by Access-Control-Allow-Headers.\r\n      var requestURL = url;\r\n      if (url.slice(0, 5) !== \"data:\" && url.slice(0, 5) !== \"blob:\") {\r\n        if (lastEventId !== \"\") {\r\n          requestURL += (url.indexOf(\"?\") === -1 ? \"?\" : \"&\") + lastEventIdQueryParameterName +\"=\" + encodeURIComponent(lastEventId);\r\n        }\r\n      }\r\n      var withCredentials = es.withCredentials;\r\n      var requestHeaders = {};\r\n      requestHeaders[\"Accept\"] = \"text/event-stream\";\r\n      var headers = es.headers;\r\n      if (headers != undefined) {\r\n        for (var name in headers) {\r\n          if (Object.prototype.hasOwnProperty.call(headers, name)) {\r\n            requestHeaders[name] = headers[name];\r\n          }\r\n        }\r\n      }\r\n      try {\r\n        abortController = transport.open(xhr, onStart, onProgress, onFinish, requestURL, withCredentials, requestHeaders);\r\n      } catch (error) {\r\n        close();\r\n        throw error;\r\n      }\r\n    };\r\n\r\n    es.url = url;\r\n    es.readyState = CONNECTING;\r\n    es.withCredentials = withCredentials;\r\n    es.headers = headers;\r\n    es._close = close;\r\n\r\n    onTimeout();\r\n  }\r\n\r\n  EventSourcePolyfill.prototype = Object.create(EventTarget.prototype);\r\n  EventSourcePolyfill.prototype.CONNECTING = CONNECTING;\r\n  EventSourcePolyfill.prototype.OPEN = OPEN;\r\n  EventSourcePolyfill.prototype.CLOSED = CLOSED;\r\n  EventSourcePolyfill.prototype.close = function () {\r\n    this._close();\r\n  };\r\n\r\n  EventSourcePolyfill.CONNECTING = CONNECTING;\r\n  EventSourcePolyfill.OPEN = OPEN;\r\n  EventSourcePolyfill.CLOSED = CLOSED;\r\n  EventSourcePolyfill.prototype.withCredentials = undefined;\r\n\r\n  var R = NativeEventSource;\r\n  if (XMLHttpRequest != undefined && (NativeEventSource == undefined || !(\"withCredentials\" in NativeEventSource.prototype))) {\r\n    // Why replace a native EventSource ?\r\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=444328\r\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=831392\r\n    // https://code.google.com/p/chromium/issues/detail?id=260144\r\n    // https://code.google.com/p/chromium/issues/detail?id=225654\r\n    // ...\r\n    R = EventSourcePolyfill;\r\n  }\r\n\r\n  (function (factory) {\r\n    {\r\n      var v = factory(exports);\r\n      if (v !== undefined) { module.exports = v; }\r\n    }\r\n  })(function (exports) {\r\n    exports.EventSourcePolyfill = EventSourcePolyfill;\r\n    exports.NativeEventSource = NativeEventSource;\r\n    exports.EventSource = R;\r\n  });\r\n}(typeof globalThis === 'undefined' ? (typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : commonjsGlobal) : globalThis));\n});\n\nvar eventsource$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), eventsource, {\n\t'default': eventsource\n}));\n\nvar formatText = function (e) { return e.data; };\n\nvar formatJSON = function (e) { return JSON.parse(e.data); };\n\nvar SSEClient = function SSEClient(config) {\n  this._handlers = {};\n  this._listeners = {};\n  this._source = null;\n\n  if (config.format) {\n    if (typeof config.format === 'string') {\n      if (config.format === 'plain') {\n        this._format = formatText;\n      } else if (config.format === 'json') {\n        this._format = formatJSON;\n      } else {\n        this._format = formatText;\n      }\n    } else if (typeof config.format === 'function') {\n      this._format = config.format;\n    } else {\n      this._format = formatText;\n    }\n  } else {\n    this._format = formatText;\n  }\n\n  if (config.handlers) {\n    for (var event in config.handlers) {\n      this.on(event, config.handlers[event]);\n    }\n  }\n\n  this.url = config.url;\n  this.withCredentials = !!config.withCredentials;\n  this.polyfillOptions = config.polyfillOptions || {};\n  this.forcePolyfill = !!config.forcePolyfill;\n};\n\nvar prototypeAccessors = { source: { configurable: true } };\n\nprototypeAccessors.source.get = function () {\n  return this._source;\n};\n\nSSEClient.prototype.connect = function connect () {\n    var this$1 = this;\n\n  if (this.forcePolyfill) {\n    this._source = new eventsource.EventSourcePolyfill(\n      this.url,\n      Object.assign({}, this.polyfillOptions, {\n        withCredentials: this.withCredentials,\n      })\n    );\n  } else {\n    this._source = new window.EventSource(this.url, {\n      withCredentials: this.withCredentials,\n    });\n  }\n\n  return new Promise(function (resolve, reject) {\n    this$1._source.onopen = function () {\n      // Add event listeners that were added before we connected\n      for (var event in this$1._listeners) {\n        this$1._source.addEventListener(event, this$1._listeners[event]);\n      }\n\n      this$1._source.onerror = null;\n\n      resolve(this$1);\n    };\n\n    this$1._source.onerror = reject;\n  });\n};\n\nSSEClient.prototype.disconnect = function disconnect () {\n  if (this._source !== null) {\n    this._source.close();\n    this._source = null;\n  }\n};\n\nSSEClient.prototype.on = function on (event, handler) {\n  if (!event) {\n    // Default \"event-less\" event\n    event = 'message';\n  }\n\n  if (!this._listeners[event]) {\n    this._create(event);\n  }\n\n  this._handlers[event].push(handler);\n\n  return this;\n};\n\nSSEClient.prototype.once = function once (event, handler) {\n    var this$1 = this;\n\n  this.on(event, function (e) {\n    this$1.off(event, handler);\n\n    handler(e);\n  });\n\n  return this;\n};\n\nSSEClient.prototype.off = function off (event, handler) {\n  if (!this._handlers[event]) {\n    // no handlers registered for event\n    return this;\n  }\n\n  var idx = this._handlers[event].indexOf(handler);\n  if (idx === -1) {\n    // handler not registered for event\n    return this;\n  }\n\n  // remove handler from event\n  this._handlers[event].splice(idx, 1);\n\n  if (this._handlers[event].length === 0) {\n    // remove listener since no handlers exist\n    this._source.removeEventListener(event, this._listeners[event]);\n    delete this._handlers[event];\n    delete this._listeners[event];\n  }\n\n  return this;\n};\n\nSSEClient.prototype._create = function _create (event) {\n    var this$1 = this;\n\n  this._handlers[event] = [];\n\n  this._listeners[event] = function (message) {\n    var data;\n\n    try {\n      data = this$1._format(message);\n    } catch (err) {\n      if (typeof this$1._source.onerror === 'function') {\n        this$1._source.onerror(err);\n      }\n      return;\n    }\n\n    this$1._handlers[event].forEach(function (handler) { return handler(data, message.lastEventId); });\n  };\n\n  if (this._source) {\n    this._source.addEventListener(event, this._listeners[event]);\n  }\n};\n\nObject.defineProperties( SSEClient.prototype, prototypeAccessors );\n\nfunction install(Vue, config) {\n  if (Vue.config && Vue.config.globalProperties) {\n    // Vue3\n    Vue.config.globalProperties.$sse = new SSEManager(config);\n  } else {\n    // Vue2\n    // eslint-disable-next-line no-param-reassign, no-multi-assign\n    Vue.$sse = Vue.prototype.$sse = new SSEManager(config);\n  }\n\n  if (config && config.polyfill) {\n    Promise.resolve().then(function () { return eventsource$1; });\n  }\n\n  // This mixin allows components to specify that all clients that were\n  // created within it should be automatically disconnected (cleanup)\n  // when the component is destroyed.\n  Vue.mixin({\n    beforeCreate: function beforeCreate() {\n      if (this.$options.sse && this.$options.sse.cleanup) {\n        // We instantiate an SSEManager for this specific instance\n        // in order to track it (see discussions in #13 for rationale).\n        this.$sse = new SSEManager();\n\n        // We also set $clients to an empty array, as opposed to null,\n        // so that beforeDestroy and create know to use it.\n        this.$sse.$clients = [];\n      }\n    },\n    beforeDestroy: function beforeDestroy() {\n      if (this.$sse.$clients !== null) {\n        this.$sse.$clients.forEach(function (c) { return c.disconnect(); });\n        this.$sse.$clients = [];\n      }\n    },\n  });\n}\n\nvar SSEManager = function SSEManager(config) {\n  this.$defaultConfig = Object.assign(\n    {\n      format: formatText,\n      sendCredentials: false,\n    },\n    config\n  );\n\n  this.$clients = null;\n};\n\nSSEManager.prototype.create = function create (configOrURL) {\n  var config;\n  if (typeof configOrURL === 'object') {\n    config = configOrURL;\n  } else if (typeof configOrURL === 'string') {\n    config = {\n      url: configOrURL,\n    };\n  } else {\n    config = {};\n  }\n\n  var client = new SSEClient(Object.assign({}, this.$defaultConfig, config));\n\n  // If $clients is not null, then it's array that we should push this\n  // client into for later cleanup in our mixin's beforeDestroy.\n  if (this.$clients !== null) {\n    this.$clients.push(client);\n  }\n\n  return client;\n};\n\nvar index = {\n  install: install,\n};\n\nexport default index;\nexport { SSEManager, install };\n"
  },
  {
    "path": "dist/vue-sse.js",
    "content": "/*!\n * vue-sse v2.5.0\n * (c) 2021 James Churchard\n * @license MIT\n */\n(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.VueSSE = factory());\n}(this, (function () { 'use strict';\n\n\tvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n\tfunction createCommonjsModule(fn) {\n\t  var module = { exports: {} };\n\t\treturn fn(module, module.exports), module.exports;\n\t}\n\n\t/** @license\r\n\t * eventsource.js\r\n\t * Available under MIT License (MIT)\r\n\t * https://github.com/Yaffle/EventSource/\r\n\t */\n\n\tvar eventsource = createCommonjsModule(function (module, exports) {\n\t/*jslint indent: 2, vars: true, plusplus: true */\r\n\t/*global setTimeout, clearTimeout */\r\n\r\n\t(function (global) {\r\n\r\n\t  var setTimeout = global.setTimeout;\r\n\t  var clearTimeout = global.clearTimeout;\r\n\t  var XMLHttpRequest = global.XMLHttpRequest;\r\n\t  var XDomainRequest = global.XDomainRequest;\r\n\t  var ActiveXObject = global.ActiveXObject;\r\n\t  var NativeEventSource = global.EventSource;\r\n\r\n\t  var document = global.document;\r\n\t  var Promise = global.Promise;\r\n\t  var fetch = global.fetch;\r\n\t  var Response = global.Response;\r\n\t  var TextDecoder = global.TextDecoder;\r\n\t  var TextEncoder = global.TextEncoder;\r\n\t  var AbortController = global.AbortController;\r\n\r\n\t  if (typeof window !== \"undefined\" && !(\"readyState\" in document) && document.body == null) { // Firefox 2\r\n\t    document.readyState = \"loading\";\r\n\t    window.addEventListener(\"load\", function (event) {\r\n\t      document.readyState = \"complete\";\r\n\t    }, false);\r\n\t  }\r\n\r\n\t  if (XMLHttpRequest == null && ActiveXObject != null) { // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest_in_IE6\r\n\t    XMLHttpRequest = function () {\r\n\t      return new ActiveXObject(\"Microsoft.XMLHTTP\");\r\n\t    };\r\n\t  }\r\n\r\n\t  if (Object.create == undefined) {\r\n\t    Object.create = function (C) {\r\n\t      function F(){}\r\n\t      F.prototype = C;\r\n\t      return new F();\r\n\t    };\r\n\t  }\r\n\r\n\t  if (!Date.now) {\r\n\t    Date.now = function now() {\r\n\t      return new Date().getTime();\r\n\t    };\r\n\t  }\r\n\r\n\t  // see #118 (Promise#finally with polyfilled Promise)\r\n\t  // see #123 (data URLs crash Edge)\r\n\t  // see #125 (CSP violations)\r\n\t  // see pull/#138\r\n\t  // => No way to polyfill Promise#finally\r\n\r\n\t  if (AbortController == undefined) {\r\n\t    var originalFetch2 = fetch;\r\n\t    fetch = function (url, options) {\r\n\t      var signal = options.signal;\r\n\t      return originalFetch2(url, {headers: options.headers, credentials: options.credentials, cache: options.cache}).then(function (response) {\r\n\t        var reader = response.body.getReader();\r\n\t        signal._reader = reader;\r\n\t        if (signal._aborted) {\r\n\t          signal._reader.cancel();\r\n\t        }\r\n\t        return {\r\n\t          status: response.status,\r\n\t          statusText: response.statusText,\r\n\t          headers: response.headers,\r\n\t          body: {\r\n\t            getReader: function () {\r\n\t              return reader;\r\n\t            }\r\n\t          }\r\n\t        };\r\n\t      });\r\n\t    };\r\n\t    AbortController = function () {\r\n\t      this.signal = {\r\n\t        _reader: null,\r\n\t        _aborted: false\r\n\t      };\r\n\t      this.abort = function () {\r\n\t        if (this.signal._reader != null) {\r\n\t          this.signal._reader.cancel();\r\n\t        }\r\n\t        this.signal._aborted = true;\r\n\t      };\r\n\t    };\r\n\t  }\r\n\r\n\t  function TextDecoderPolyfill() {\r\n\t    this.bitsNeeded = 0;\r\n\t    this.codePoint = 0;\r\n\t  }\r\n\r\n\t  TextDecoderPolyfill.prototype.decode = function (octets) {\r\n\t    function valid(codePoint, shift, octetsCount) {\r\n\t      if (octetsCount === 1) {\r\n\t        return codePoint >= 0x0080 >> shift && codePoint << shift <= 0x07FF;\r\n\t      }\r\n\t      if (octetsCount === 2) {\r\n\t        return codePoint >= 0x0800 >> shift && codePoint << shift <= 0xD7FF || codePoint >= 0xE000 >> shift && codePoint << shift <= 0xFFFF;\r\n\t      }\r\n\t      if (octetsCount === 3) {\r\n\t        return codePoint >= 0x010000 >> shift && codePoint << shift <= 0x10FFFF;\r\n\t      }\r\n\t      throw new Error();\r\n\t    }\r\n\t    function octetsCount(bitsNeeded, codePoint) {\r\n\t      if (bitsNeeded === 6 * 1) {\r\n\t        return codePoint >> 6 > 15 ? 3 : codePoint > 31 ? 2 : 1;\r\n\t      }\r\n\t      if (bitsNeeded === 6 * 2) {\r\n\t        return codePoint > 15 ? 3 : 2;\r\n\t      }\r\n\t      if (bitsNeeded === 6 * 3) {\r\n\t        return 3;\r\n\t      }\r\n\t      throw new Error();\r\n\t    }\r\n\t    var REPLACER = 0xFFFD;\r\n\t    var string = \"\";\r\n\t    var bitsNeeded = this.bitsNeeded;\r\n\t    var codePoint = this.codePoint;\r\n\t    for (var i = 0; i < octets.length; i += 1) {\r\n\t      var octet = octets[i];\r\n\t      if (bitsNeeded !== 0) {\r\n\t        if (octet < 128 || octet > 191 || !valid(codePoint << 6 | octet & 63, bitsNeeded - 6, octetsCount(bitsNeeded, codePoint))) {\r\n\t          bitsNeeded = 0;\r\n\t          codePoint = REPLACER;\r\n\t          string += String.fromCharCode(codePoint);\r\n\t        }\r\n\t      }\r\n\t      if (bitsNeeded === 0) {\r\n\t        if (octet >= 0 && octet <= 127) {\r\n\t          bitsNeeded = 0;\r\n\t          codePoint = octet;\r\n\t        } else if (octet >= 192 && octet <= 223) {\r\n\t          bitsNeeded = 6 * 1;\r\n\t          codePoint = octet & 31;\r\n\t        } else if (octet >= 224 && octet <= 239) {\r\n\t          bitsNeeded = 6 * 2;\r\n\t          codePoint = octet & 15;\r\n\t        } else if (octet >= 240 && octet <= 247) {\r\n\t          bitsNeeded = 6 * 3;\r\n\t          codePoint = octet & 7;\r\n\t        } else {\r\n\t          bitsNeeded = 0;\r\n\t          codePoint = REPLACER;\r\n\t        }\r\n\t        if (bitsNeeded !== 0 && !valid(codePoint, bitsNeeded, octetsCount(bitsNeeded, codePoint))) {\r\n\t          bitsNeeded = 0;\r\n\t          codePoint = REPLACER;\r\n\t        }\r\n\t      } else {\r\n\t        bitsNeeded -= 6;\r\n\t        codePoint = codePoint << 6 | octet & 63;\r\n\t      }\r\n\t      if (bitsNeeded === 0) {\r\n\t        if (codePoint <= 0xFFFF) {\r\n\t          string += String.fromCharCode(codePoint);\r\n\t        } else {\r\n\t          string += String.fromCharCode(0xD800 + (codePoint - 0xFFFF - 1 >> 10));\r\n\t          string += String.fromCharCode(0xDC00 + (codePoint - 0xFFFF - 1 & 0x3FF));\r\n\t        }\r\n\t      }\r\n\t    }\r\n\t    this.bitsNeeded = bitsNeeded;\r\n\t    this.codePoint = codePoint;\r\n\t    return string;\r\n\t  };\r\n\r\n\t  // Firefox < 38 throws an error with stream option\r\n\t  var supportsStreamOption = function () {\r\n\t    try {\r\n\t      return new TextDecoder().decode(new TextEncoder().encode(\"test\"), {stream: true}) === \"test\";\r\n\t    } catch (error) {\r\n\t      console.debug(\"TextDecoder does not support streaming option. Using polyfill instead: \" + error);\r\n\t    }\r\n\t    return false;\r\n\t  };\r\n\r\n\t  // IE, Edge\r\n\t  if (TextDecoder == undefined || TextEncoder == undefined || !supportsStreamOption()) {\r\n\t    TextDecoder = TextDecoderPolyfill;\r\n\t  }\r\n\r\n\t  var k = function () {\r\n\t  };\r\n\r\n\t  function XHRWrapper(xhr) {\r\n\t    this.withCredentials = false;\r\n\t    this.readyState = 0;\r\n\t    this.status = 0;\r\n\t    this.statusText = \"\";\r\n\t    this.responseText = \"\";\r\n\t    this.onprogress = k;\r\n\t    this.onload = k;\r\n\t    this.onerror = k;\r\n\t    this.onreadystatechange = k;\r\n\t    this._contentType = \"\";\r\n\t    this._xhr = xhr;\r\n\t    this._sendTimeout = 0;\r\n\t    this._abort = k;\r\n\t  }\r\n\r\n\t  XHRWrapper.prototype.open = function (method, url) {\r\n\t    this._abort(true);\r\n\r\n\t    var that = this;\r\n\t    var xhr = this._xhr;\r\n\t    var state = 1;\r\n\t    var timeout = 0;\r\n\r\n\t    this._abort = function (silent) {\r\n\t      if (that._sendTimeout !== 0) {\r\n\t        clearTimeout(that._sendTimeout);\r\n\t        that._sendTimeout = 0;\r\n\t      }\r\n\t      if (state === 1 || state === 2 || state === 3) {\r\n\t        state = 4;\r\n\t        xhr.onload = k;\r\n\t        xhr.onerror = k;\r\n\t        xhr.onabort = k;\r\n\t        xhr.onprogress = k;\r\n\t        xhr.onreadystatechange = k;\r\n\t        // IE 8 - 9: XDomainRequest#abort() does not fire any event\r\n\t        // Opera < 10: XMLHttpRequest#abort() does not fire any event\r\n\t        xhr.abort();\r\n\t        if (timeout !== 0) {\r\n\t          clearTimeout(timeout);\r\n\t          timeout = 0;\r\n\t        }\r\n\t        if (!silent) {\r\n\t          that.readyState = 4;\r\n\t          that.onabort(null);\r\n\t          that.onreadystatechange();\r\n\t        }\r\n\t      }\r\n\t      state = 0;\r\n\t    };\r\n\r\n\t    var onStart = function () {\r\n\t      if (state === 1) {\r\n\t        //state = 2;\r\n\t        var status = 0;\r\n\t        var statusText = \"\";\r\n\t        var contentType = undefined;\r\n\t        if (!(\"contentType\" in xhr)) {\r\n\t          try {\r\n\t            status = xhr.status;\r\n\t            statusText = xhr.statusText;\r\n\t            contentType = xhr.getResponseHeader(\"Content-Type\");\r\n\t          } catch (error) {\r\n\t            // IE < 10 throws exception for `xhr.status` when xhr.readyState === 2 || xhr.readyState === 3\r\n\t            // Opera < 11 throws exception for `xhr.status` when xhr.readyState === 2\r\n\t            // https://bugs.webkit.org/show_bug.cgi?id=29121\r\n\t            status = 0;\r\n\t            statusText = \"\";\r\n\t            contentType = undefined;\r\n\t            // Firefox < 14, Chrome ?, Safari ?\r\n\t            // https://bugs.webkit.org/show_bug.cgi?id=29658\r\n\t            // https://bugs.webkit.org/show_bug.cgi?id=77854\r\n\t          }\r\n\t        } else {\r\n\t          status = 200;\r\n\t          statusText = \"OK\";\r\n\t          contentType = xhr.contentType;\r\n\t        }\r\n\t        if (status !== 0) {\r\n\t          state = 2;\r\n\t          that.readyState = 2;\r\n\t          that.status = status;\r\n\t          that.statusText = statusText;\r\n\t          that._contentType = contentType;\r\n\t          that.onreadystatechange();\r\n\t        }\r\n\t      }\r\n\t    };\r\n\t    var onProgress = function () {\r\n\t      onStart();\r\n\t      if (state === 2 || state === 3) {\r\n\t        state = 3;\r\n\t        var responseText = \"\";\r\n\t        try {\r\n\t          responseText = xhr.responseText;\r\n\t        } catch (error) {\r\n\t          // IE 8 - 9 with XMLHttpRequest\r\n\t        }\r\n\t        that.readyState = 3;\r\n\t        that.responseText = responseText;\r\n\t        that.onprogress();\r\n\t      }\r\n\t    };\r\n\t    var onFinish = function (type, event) {\r\n\t      if (event == null || event.preventDefault == null) {\r\n\t        event = {\r\n\t          preventDefault: k\r\n\t        };\r\n\t      }\r\n\t      // Firefox 52 fires \"readystatechange\" (xhr.readyState === 4) without final \"readystatechange\" (xhr.readyState === 3)\r\n\t      // IE 8 fires \"onload\" without \"onprogress\"\r\n\t      onProgress();\r\n\t      if (state === 1 || state === 2 || state === 3) {\r\n\t        state = 4;\r\n\t        if (timeout !== 0) {\r\n\t          clearTimeout(timeout);\r\n\t          timeout = 0;\r\n\t        }\r\n\t        that.readyState = 4;\r\n\t        if (type === \"load\") {\r\n\t          that.onload(event);\r\n\t        } else if (type === \"error\") {\r\n\t          that.onerror(event);\r\n\t        } else if (type === \"abort\") {\r\n\t          that.onabort(event);\r\n\t        } else {\r\n\t          throw new TypeError();\r\n\t        }\r\n\t        that.onreadystatechange();\r\n\t      }\r\n\t    };\r\n\t    var onReadyStateChange = function (event) {\r\n\t      if (xhr != undefined) { // Opera 12\r\n\t        if (xhr.readyState === 4) {\r\n\t          if (!(\"onload\" in xhr) || !(\"onerror\" in xhr) || !(\"onabort\" in xhr)) {\r\n\t            onFinish(xhr.responseText === \"\" ? \"error\" : \"load\", event);\r\n\t          }\r\n\t        } else if (xhr.readyState === 3) {\r\n\t          if (!(\"onprogress\" in xhr)) { // testing XMLHttpRequest#responseText too many times is too slow in IE 11\r\n\t            // and in Firefox 3.6\r\n\t            onProgress();\r\n\t          }\r\n\t        } else if (xhr.readyState === 2) {\r\n\t          onStart();\r\n\t        }\r\n\t      }\r\n\t    };\r\n\t    var onTimeout = function () {\r\n\t      timeout = setTimeout(function () {\r\n\t        onTimeout();\r\n\t      }, 500);\r\n\t      if (xhr.readyState === 3) {\r\n\t        onProgress();\r\n\t      }\r\n\t    };\r\n\r\n\t    // XDomainRequest#abort removes onprogress, onerror, onload\r\n\t    if (\"onload\" in xhr) {\r\n\t      xhr.onload = function (event) {\r\n\t        onFinish(\"load\", event);\r\n\t      };\r\n\t    }\r\n\t    if (\"onerror\" in xhr) {\r\n\t      xhr.onerror = function (event) {\r\n\t        onFinish(\"error\", event);\r\n\t      };\r\n\t    }\r\n\t    // improper fix to match Firefox behaviour, but it is better than just ignore abort\r\n\t    // see https://bugzilla.mozilla.org/show_bug.cgi?id=768596\r\n\t    // https://bugzilla.mozilla.org/show_bug.cgi?id=880200\r\n\t    // https://code.google.com/p/chromium/issues/detail?id=153570\r\n\t    // IE 8 fires \"onload\" without \"onprogress\r\n\t    if (\"onabort\" in xhr) {\r\n\t      xhr.onabort = function (event) {\r\n\t        onFinish(\"abort\", event);\r\n\t      };\r\n\t    }\r\n\r\n\t    if (\"onprogress\" in xhr) {\r\n\t      xhr.onprogress = onProgress;\r\n\t    }\r\n\r\n\t    // IE 8 - 9 (XMLHTTPRequest)\r\n\t    // Opera < 12\r\n\t    // Firefox < 3.5\r\n\t    // Firefox 3.5 - 3.6 - ? < 9.0\r\n\t    // onprogress is not fired sometimes or delayed\r\n\t    // see also #64 (significant lag in IE 11)\r\n\t    if (\"onreadystatechange\" in xhr) {\r\n\t      xhr.onreadystatechange = function (event) {\r\n\t        onReadyStateChange(event);\r\n\t      };\r\n\t    }\r\n\r\n\t    if (\"contentType\" in xhr || !(\"ontimeout\" in XMLHttpRequest.prototype)) {\r\n\t      url += (url.indexOf(\"?\") === -1 ? \"?\" : \"&\") + \"padding=true\";\r\n\t    }\r\n\t    xhr.open(method, url, true);\r\n\r\n\t    if (\"readyState\" in xhr) {\r\n\t      // workaround for Opera 12 issue with \"progress\" events\r\n\t      // #91 (XMLHttpRequest onprogress not fired for streaming response in Edge 14-15-?)\r\n\t      timeout = setTimeout(function () {\r\n\t        onTimeout();\r\n\t      }, 0);\r\n\t    }\r\n\t  };\r\n\t  XHRWrapper.prototype.abort = function () {\r\n\t    this._abort(false);\r\n\t  };\r\n\t  XHRWrapper.prototype.getResponseHeader = function (name) {\r\n\t    return this._contentType;\r\n\t  };\r\n\t  XHRWrapper.prototype.setRequestHeader = function (name, value) {\r\n\t    var xhr = this._xhr;\r\n\t    if (\"setRequestHeader\" in xhr) {\r\n\t      xhr.setRequestHeader(name, value);\r\n\t    }\r\n\t  };\r\n\t  XHRWrapper.prototype.getAllResponseHeaders = function () {\r\n\t    // XMLHttpRequest#getAllResponseHeaders returns null for CORS requests in Firefox 3.6.28\r\n\t    return this._xhr.getAllResponseHeaders != undefined ? this._xhr.getAllResponseHeaders() || \"\" : \"\";\r\n\t  };\r\n\t  XHRWrapper.prototype.send = function () {\r\n\t    // loading indicator in Safari < ? (6), Chrome < 14, Firefox\r\n\t    // https://bugzilla.mozilla.org/show_bug.cgi?id=736723\r\n\t    if ((!(\"ontimeout\" in XMLHttpRequest.prototype) || (!(\"sendAsBinary\" in XMLHttpRequest.prototype) && !(\"mozAnon\" in XMLHttpRequest.prototype))) &&\r\n\t        document != undefined &&\r\n\t        document.readyState != undefined &&\r\n\t        document.readyState !== \"complete\") {\r\n\t      var that = this;\r\n\t      that._sendTimeout = setTimeout(function () {\r\n\t        that._sendTimeout = 0;\r\n\t        that.send();\r\n\t      }, 4);\r\n\t      return;\r\n\t    }\r\n\r\n\t    var xhr = this._xhr;\r\n\t    // withCredentials should be set after \"open\" for Safari and Chrome (< 19 ?)\r\n\t    if (\"withCredentials\" in xhr) {\r\n\t      xhr.withCredentials = this.withCredentials;\r\n\t    }\r\n\t    try {\r\n\t      // xhr.send(); throws \"Not enough arguments\" in Firefox 3.0\r\n\t      xhr.send(undefined);\r\n\t    } catch (error1) {\r\n\t      // Safari 5.1.7, Opera 12\r\n\t      throw error1;\r\n\t    }\r\n\t  };\r\n\r\n\t  function toLowerCase(name) {\r\n\t    return name.replace(/[A-Z]/g, function (c) {\r\n\t      return String.fromCharCode(c.charCodeAt(0) + 0x20);\r\n\t    });\r\n\t  }\r\n\r\n\t  function HeadersPolyfill(all) {\r\n\t    // Get headers: implemented according to mozilla's example code: https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/getAllResponseHeaders#Example\r\n\t    var map = Object.create(null);\r\n\t    var array = all.split(\"\\r\\n\");\r\n\t    for (var i = 0; i < array.length; i += 1) {\r\n\t      var line = array[i];\r\n\t      var parts = line.split(\": \");\r\n\t      var name = parts.shift();\r\n\t      var value = parts.join(\": \");\r\n\t      map[toLowerCase(name)] = value;\r\n\t    }\r\n\t    this._map = map;\r\n\t  }\r\n\t  HeadersPolyfill.prototype.get = function (name) {\r\n\t    return this._map[toLowerCase(name)];\r\n\t  };\r\n\r\n\t  if (XMLHttpRequest != null && XMLHttpRequest.HEADERS_RECEIVED == null) { // IE < 9, Firefox 3.6\r\n\t    XMLHttpRequest.HEADERS_RECEIVED = 2;\r\n\t  }\r\n\r\n\t  function XHRTransport() {\r\n\t  }\r\n\r\n\t  XHRTransport.prototype.open = function (xhr, onStartCallback, onProgressCallback, onFinishCallback, url, withCredentials, headers) {\r\n\t    xhr.open(\"GET\", url);\r\n\t    var offset = 0;\r\n\t    xhr.onprogress = function () {\r\n\t      var responseText = xhr.responseText;\r\n\t      var chunk = responseText.slice(offset);\r\n\t      offset += chunk.length;\r\n\t      onProgressCallback(chunk);\r\n\t    };\r\n\t    xhr.onerror = function (event) {\r\n\t      event.preventDefault();\r\n\t      onFinishCallback(new Error(\"NetworkError\"));\r\n\t    };\r\n\t    xhr.onload = function () {\r\n\t      onFinishCallback(null);\r\n\t    };\r\n\t    xhr.onabort = function () {\r\n\t      onFinishCallback(null);\r\n\t    };\r\n\t    xhr.onreadystatechange = function () {\r\n\t      if (xhr.readyState === XMLHttpRequest.HEADERS_RECEIVED) {\r\n\t        var status = xhr.status;\r\n\t        var statusText = xhr.statusText;\r\n\t        var contentType = xhr.getResponseHeader(\"Content-Type\");\r\n\t        var headers = xhr.getAllResponseHeaders();\r\n\t        onStartCallback(status, statusText, contentType, new HeadersPolyfill(headers));\r\n\t      }\r\n\t    };\r\n\t    xhr.withCredentials = withCredentials;\r\n\t    for (var name in headers) {\r\n\t      if (Object.prototype.hasOwnProperty.call(headers, name)) {\r\n\t        xhr.setRequestHeader(name, headers[name]);\r\n\t      }\r\n\t    }\r\n\t    xhr.send();\r\n\t    return xhr;\r\n\t  };\r\n\r\n\t  function HeadersWrapper(headers) {\r\n\t    this._headers = headers;\r\n\t  }\r\n\t  HeadersWrapper.prototype.get = function (name) {\r\n\t    return this._headers.get(name);\r\n\t  };\r\n\r\n\t  function FetchTransport() {\r\n\t  }\r\n\r\n\t  FetchTransport.prototype.open = function (xhr, onStartCallback, onProgressCallback, onFinishCallback, url, withCredentials, headers) {\r\n\t    var reader = null;\r\n\t    var controller = new AbortController();\r\n\t    var signal = controller.signal;\r\n\t    var textDecoder = new TextDecoder();\r\n\t    fetch(url, {\r\n\t      headers: headers,\r\n\t      credentials: withCredentials ? \"include\" : \"same-origin\",\r\n\t      signal: signal,\r\n\t      cache: \"no-store\"\r\n\t    }).then(function (response) {\r\n\t      reader = response.body.getReader();\r\n\t      onStartCallback(response.status, response.statusText, response.headers.get(\"Content-Type\"), new HeadersWrapper(response.headers));\r\n\t      // see https://github.com/promises-aplus/promises-spec/issues/179\r\n\t      return new Promise(function (resolve, reject) {\r\n\t        var readNextChunk = function () {\r\n\t          reader.read().then(function (result) {\r\n\t            if (result.done) {\r\n\t              //Note: bytes in textDecoder are ignored\r\n\t              resolve(undefined);\r\n\t            } else {\r\n\t              var chunk = textDecoder.decode(result.value, {stream: true});\r\n\t              onProgressCallback(chunk);\r\n\t              readNextChunk();\r\n\t            }\r\n\t          })[\"catch\"](function (error) {\r\n\t            reject(error);\r\n\t          });\r\n\t        };\r\n\t        readNextChunk();\r\n\t      });\r\n\t    })[\"catch\"](function (error) {\r\n\t      if (error.name === \"AbortError\") {\r\n\t        return undefined;\r\n\t      } else {\r\n\t        return error;\r\n\t      }\r\n\t    }).then(function (error) {\r\n\t      onFinishCallback(error);\r\n\t    });\r\n\t    return {\r\n\t      abort: function () {\r\n\t        if (reader != null) {\r\n\t          reader.cancel(); // https://bugzilla.mozilla.org/show_bug.cgi?id=1583815\r\n\t        }\r\n\t        controller.abort();\r\n\t      }\r\n\t    };\r\n\t  };\r\n\r\n\t  function EventTarget() {\r\n\t    this._listeners = Object.create(null);\r\n\t  }\r\n\r\n\t  function throwError(e) {\r\n\t    setTimeout(function () {\r\n\t      throw e;\r\n\t    }, 0);\r\n\t  }\r\n\r\n\t  EventTarget.prototype.dispatchEvent = function (event) {\r\n\t    event.target = this;\r\n\t    var typeListeners = this._listeners[event.type];\r\n\t    if (typeListeners != undefined) {\r\n\t      var length = typeListeners.length;\r\n\t      for (var i = 0; i < length; i += 1) {\r\n\t        var listener = typeListeners[i];\r\n\t        try {\r\n\t          if (typeof listener.handleEvent === \"function\") {\r\n\t            listener.handleEvent(event);\r\n\t          } else {\r\n\t            listener.call(this, event);\r\n\t          }\r\n\t        } catch (e) {\r\n\t          throwError(e);\r\n\t        }\r\n\t      }\r\n\t    }\r\n\t  };\r\n\t  EventTarget.prototype.addEventListener = function (type, listener) {\r\n\t    type = String(type);\r\n\t    var listeners = this._listeners;\r\n\t    var typeListeners = listeners[type];\r\n\t    if (typeListeners == undefined) {\r\n\t      typeListeners = [];\r\n\t      listeners[type] = typeListeners;\r\n\t    }\r\n\t    var found = false;\r\n\t    for (var i = 0; i < typeListeners.length; i += 1) {\r\n\t      if (typeListeners[i] === listener) {\r\n\t        found = true;\r\n\t      }\r\n\t    }\r\n\t    if (!found) {\r\n\t      typeListeners.push(listener);\r\n\t    }\r\n\t  };\r\n\t  EventTarget.prototype.removeEventListener = function (type, listener) {\r\n\t    type = String(type);\r\n\t    var listeners = this._listeners;\r\n\t    var typeListeners = listeners[type];\r\n\t    if (typeListeners != undefined) {\r\n\t      var filtered = [];\r\n\t      for (var i = 0; i < typeListeners.length; i += 1) {\r\n\t        if (typeListeners[i] !== listener) {\r\n\t          filtered.push(typeListeners[i]);\r\n\t        }\r\n\t      }\r\n\t      if (filtered.length === 0) {\r\n\t        delete listeners[type];\r\n\t      } else {\r\n\t        listeners[type] = filtered;\r\n\t      }\r\n\t    }\r\n\t  };\r\n\r\n\t  function Event(type) {\r\n\t    this.type = type;\r\n\t    this.target = undefined;\r\n\t  }\r\n\r\n\t  function MessageEvent(type, options) {\r\n\t    Event.call(this, type);\r\n\t    this.data = options.data;\r\n\t    this.lastEventId = options.lastEventId;\r\n\t  }\r\n\r\n\t  MessageEvent.prototype = Object.create(Event.prototype);\r\n\r\n\t  function ConnectionEvent(type, options) {\r\n\t    Event.call(this, type);\r\n\t    this.status = options.status;\r\n\t    this.statusText = options.statusText;\r\n\t    this.headers = options.headers;\r\n\t  }\r\n\r\n\t  ConnectionEvent.prototype = Object.create(Event.prototype);\r\n\r\n\t  function ErrorEvent(type, options) {\r\n\t    Event.call(this, type);\r\n\t    this.error = options.error;\r\n\t  }\r\n\r\n\t  ErrorEvent.prototype = Object.create(Event.prototype);\r\n\r\n\t  var WAITING = -1;\r\n\t  var CONNECTING = 0;\r\n\t  var OPEN = 1;\r\n\t  var CLOSED = 2;\r\n\r\n\t  var AFTER_CR = -1;\r\n\t  var FIELD_START = 0;\r\n\t  var FIELD = 1;\r\n\t  var VALUE_START = 2;\r\n\t  var VALUE = 3;\r\n\r\n\t  var contentTypeRegExp = /^text\\/event\\-stream(;.*)?$/i;\r\n\r\n\t  var MINIMUM_DURATION = 1000;\r\n\t  var MAXIMUM_DURATION = 18000000;\r\n\r\n\t  var parseDuration = function (value, def) {\r\n\t    var n = value == null ? def : parseInt(value, 10);\r\n\t    if (n !== n) {\r\n\t      n = def;\r\n\t    }\r\n\t    return clampDuration(n);\r\n\t  };\r\n\t  var clampDuration = function (n) {\r\n\t    return Math.min(Math.max(n, MINIMUM_DURATION), MAXIMUM_DURATION);\r\n\t  };\r\n\r\n\t  var fire = function (that, f, event) {\r\n\t    try {\r\n\t      if (typeof f === \"function\") {\r\n\t        f.call(that, event);\r\n\t      }\r\n\t    } catch (e) {\r\n\t      throwError(e);\r\n\t    }\r\n\t  };\r\n\r\n\t  function EventSourcePolyfill(url, options) {\r\n\t    EventTarget.call(this);\r\n\t    options = options || {};\r\n\r\n\t    this.onopen = undefined;\r\n\t    this.onmessage = undefined;\r\n\t    this.onerror = undefined;\r\n\r\n\t    this.url = undefined;\r\n\t    this.readyState = undefined;\r\n\t    this.withCredentials = undefined;\r\n\t    this.headers = undefined;\r\n\r\n\t    this._close = undefined;\r\n\r\n\t    start(this, url, options);\r\n\t  }\r\n\r\n\t  function getBestXHRTransport() {\r\n\t    return (XMLHttpRequest != undefined && (\"withCredentials\" in XMLHttpRequest.prototype)) || XDomainRequest == undefined\r\n\t        ? new XMLHttpRequest()\r\n\t        : new XDomainRequest();\r\n\t  }\r\n\r\n\t  var isFetchSupported = fetch != undefined && Response != undefined && \"body\" in Response.prototype;\r\n\r\n\t  function start(es, url, options) {\r\n\t    url = String(url);\r\n\t    var withCredentials = Boolean(options.withCredentials);\r\n\t    var lastEventIdQueryParameterName = options.lastEventIdQueryParameterName || \"lastEventId\";\r\n\r\n\t    var initialRetry = clampDuration(1000);\r\n\t    var heartbeatTimeout = parseDuration(options.heartbeatTimeout, 45000);\r\n\r\n\t    var lastEventId = \"\";\r\n\t    var retry = initialRetry;\r\n\t    var wasActivity = false;\r\n\t    var textLength = 0;\r\n\t    var headers = options.headers || {};\r\n\t    var TransportOption = options.Transport;\r\n\t    var xhr = isFetchSupported && TransportOption == undefined ? undefined : new XHRWrapper(TransportOption != undefined ? new TransportOption() : getBestXHRTransport());\r\n\t    var transport = TransportOption != null && typeof TransportOption !== \"string\" ? new TransportOption() : (xhr == undefined ? new FetchTransport() : new XHRTransport());\r\n\t    var abortController = undefined;\r\n\t    var timeout = 0;\r\n\t    var currentState = WAITING;\r\n\t    var dataBuffer = \"\";\r\n\t    var lastEventIdBuffer = \"\";\r\n\t    var eventTypeBuffer = \"\";\r\n\r\n\t    var textBuffer = \"\";\r\n\t    var state = FIELD_START;\r\n\t    var fieldStart = 0;\r\n\t    var valueStart = 0;\r\n\r\n\t    var onStart = function (status, statusText, contentType, headers) {\r\n\t      if (currentState === CONNECTING) {\r\n\t        if (status === 200 && contentType != undefined && contentTypeRegExp.test(contentType)) {\r\n\t          currentState = OPEN;\r\n\t          wasActivity = Date.now();\r\n\t          retry = initialRetry;\r\n\t          es.readyState = OPEN;\r\n\t          var event = new ConnectionEvent(\"open\", {\r\n\t            status: status,\r\n\t            statusText: statusText,\r\n\t            headers: headers\r\n\t          });\r\n\t          es.dispatchEvent(event);\r\n\t          fire(es, es.onopen, event);\r\n\t        } else {\r\n\t          var message = \"\";\r\n\t          if (status !== 200) {\r\n\t            if (statusText) {\r\n\t              statusText = statusText.replace(/\\s+/g, \" \");\r\n\t            }\r\n\t            message = \"EventSource's response has a status \" + status + \" \" + statusText + \" that is not 200. Aborting the connection.\";\r\n\t          } else {\r\n\t            message = \"EventSource's response has a Content-Type specifying an unsupported type: \" + (contentType == undefined ? \"-\" : contentType.replace(/\\s+/g, \" \")) + \". Aborting the connection.\";\r\n\t          }\r\n\t          close();\r\n\t          var event = new ConnectionEvent(\"error\", {\r\n\t            status: status,\r\n\t            statusText: statusText,\r\n\t            headers: headers\r\n\t          });\r\n\t          es.dispatchEvent(event);\r\n\t          fire(es, es.onerror, event);\r\n\t          console.error(message);\r\n\t        }\r\n\t      }\r\n\t    };\r\n\r\n\t    var onProgress = function (textChunk) {\r\n\t      if (currentState === OPEN) {\r\n\t        var n = -1;\r\n\t        for (var i = 0; i < textChunk.length; i += 1) {\r\n\t          var c = textChunk.charCodeAt(i);\r\n\t          if (c === \"\\n\".charCodeAt(0) || c === \"\\r\".charCodeAt(0)) {\r\n\t            n = i;\r\n\t          }\r\n\t        }\r\n\t        var chunk = (n !== -1 ? textBuffer : \"\") + textChunk.slice(0, n + 1);\r\n\t        textBuffer = (n === -1 ? textBuffer : \"\") + textChunk.slice(n + 1);\r\n\t        if (textChunk !== \"\") {\r\n\t          wasActivity = Date.now();\r\n\t          textLength += textChunk.length;\r\n\t        }\r\n\t        for (var position = 0; position < chunk.length; position += 1) {\r\n\t          var c = chunk.charCodeAt(position);\r\n\t          if (state === AFTER_CR && c === \"\\n\".charCodeAt(0)) {\r\n\t            state = FIELD_START;\r\n\t          } else {\r\n\t            if (state === AFTER_CR) {\r\n\t              state = FIELD_START;\r\n\t            }\r\n\t            if (c === \"\\r\".charCodeAt(0) || c === \"\\n\".charCodeAt(0)) {\r\n\t              if (state !== FIELD_START) {\r\n\t                if (state === FIELD) {\r\n\t                  valueStart = position + 1;\r\n\t                }\r\n\t                var field = chunk.slice(fieldStart, valueStart - 1);\r\n\t                var value = chunk.slice(valueStart + (valueStart < position && chunk.charCodeAt(valueStart) === \" \".charCodeAt(0) ? 1 : 0), position);\r\n\t                if (field === \"data\") {\r\n\t                  dataBuffer += \"\\n\";\r\n\t                  dataBuffer += value;\r\n\t                } else if (field === \"id\") {\r\n\t                  lastEventIdBuffer = value;\r\n\t                } else if (field === \"event\") {\r\n\t                  eventTypeBuffer = value;\r\n\t                } else if (field === \"retry\") {\r\n\t                  initialRetry = parseDuration(value, initialRetry);\r\n\t                  retry = initialRetry;\r\n\t                } else if (field === \"heartbeatTimeout\") {\r\n\t                  heartbeatTimeout = parseDuration(value, heartbeatTimeout);\r\n\t                  if (timeout !== 0) {\r\n\t                    clearTimeout(timeout);\r\n\t                    timeout = setTimeout(function () {\r\n\t                      onTimeout();\r\n\t                    }, heartbeatTimeout);\r\n\t                  }\r\n\t                }\r\n\t              }\r\n\t              if (state === FIELD_START) {\r\n\t                if (dataBuffer !== \"\") {\r\n\t                  lastEventId = lastEventIdBuffer;\r\n\t                  if (eventTypeBuffer === \"\") {\r\n\t                    eventTypeBuffer = \"message\";\r\n\t                  }\r\n\t                  var event = new MessageEvent(eventTypeBuffer, {\r\n\t                    data: dataBuffer.slice(1),\r\n\t                    lastEventId: lastEventIdBuffer\r\n\t                  });\r\n\t                  es.dispatchEvent(event);\r\n\t                  if (eventTypeBuffer === \"open\") {\r\n\t                    fire(es, es.onopen, event);\r\n\t                  } else if (eventTypeBuffer === \"message\") {\r\n\t                    fire(es, es.onmessage, event);\r\n\t                  } else if (eventTypeBuffer === \"error\") {\r\n\t                    fire(es, es.onerror, event);\r\n\t                  }\r\n\t                  if (currentState === CLOSED) {\r\n\t                    return;\r\n\t                  }\r\n\t                }\r\n\t                dataBuffer = \"\";\r\n\t                eventTypeBuffer = \"\";\r\n\t              }\r\n\t              state = c === \"\\r\".charCodeAt(0) ? AFTER_CR : FIELD_START;\r\n\t            } else {\r\n\t              if (state === FIELD_START) {\r\n\t                fieldStart = position;\r\n\t                state = FIELD;\r\n\t              }\r\n\t              if (state === FIELD) {\r\n\t                if (c === \":\".charCodeAt(0)) {\r\n\t                  valueStart = position + 1;\r\n\t                  state = VALUE_START;\r\n\t                }\r\n\t              } else if (state === VALUE_START) {\r\n\t                state = VALUE;\r\n\t              }\r\n\t            }\r\n\t          }\r\n\t        }\r\n\t      }\r\n\t    };\r\n\r\n\t    var onFinish = function (error) {\r\n\t      if (currentState === OPEN || currentState === CONNECTING) {\r\n\t        currentState = WAITING;\r\n\t        if (timeout !== 0) {\r\n\t          clearTimeout(timeout);\r\n\t          timeout = 0;\r\n\t        }\r\n\t        timeout = setTimeout(function () {\r\n\t          onTimeout();\r\n\t        }, retry);\r\n\t        retry = clampDuration(Math.min(initialRetry * 16, retry * 2));\r\n\r\n\t        es.readyState = CONNECTING;\r\n\t        var event = new ErrorEvent(\"error\", {error: error});\r\n\t        es.dispatchEvent(event);\r\n\t        fire(es, es.onerror, event);\r\n\t        if (error != undefined) {\r\n\t          console.error(error);\r\n\t        }\r\n\t      }\r\n\t    };\r\n\r\n\t    var close = function () {\r\n\t      currentState = CLOSED;\r\n\t      if (abortController != undefined) {\r\n\t        abortController.abort();\r\n\t        abortController = undefined;\r\n\t      }\r\n\t      if (timeout !== 0) {\r\n\t        clearTimeout(timeout);\r\n\t        timeout = 0;\r\n\t      }\r\n\t      es.readyState = CLOSED;\r\n\t    };\r\n\r\n\t    var onTimeout = function () {\r\n\t      timeout = 0;\r\n\r\n\t      if (currentState !== WAITING) {\r\n\t        if (!wasActivity && abortController != undefined) {\r\n\t          onFinish(new Error(\"No activity within \" + heartbeatTimeout + \" milliseconds.\" + \" \" + (currentState === CONNECTING ? \"No response received.\" : textLength + \" chars received.\") + \" \" + \"Reconnecting.\"));\r\n\t          if (abortController != undefined) {\r\n\t            abortController.abort();\r\n\t            abortController = undefined;\r\n\t          }\r\n\t        } else {\r\n\t          var nextHeartbeat = Math.max((wasActivity || Date.now()) + heartbeatTimeout - Date.now(), 1);\r\n\t          wasActivity = false;\r\n\t          timeout = setTimeout(function () {\r\n\t            onTimeout();\r\n\t          }, nextHeartbeat);\r\n\t        }\r\n\t        return;\r\n\t      }\r\n\r\n\t      wasActivity = false;\r\n\t      textLength = 0;\r\n\t      timeout = setTimeout(function () {\r\n\t        onTimeout();\r\n\t      }, heartbeatTimeout);\r\n\r\n\t      currentState = CONNECTING;\r\n\t      dataBuffer = \"\";\r\n\t      eventTypeBuffer = \"\";\r\n\t      lastEventIdBuffer = lastEventId;\r\n\t      textBuffer = \"\";\r\n\t      fieldStart = 0;\r\n\t      valueStart = 0;\r\n\t      state = FIELD_START;\r\n\r\n\t      // https://bugzilla.mozilla.org/show_bug.cgi?id=428916\r\n\t      // Request header field Last-Event-ID is not allowed by Access-Control-Allow-Headers.\r\n\t      var requestURL = url;\r\n\t      if (url.slice(0, 5) !== \"data:\" && url.slice(0, 5) !== \"blob:\") {\r\n\t        if (lastEventId !== \"\") {\r\n\t          requestURL += (url.indexOf(\"?\") === -1 ? \"?\" : \"&\") + lastEventIdQueryParameterName +\"=\" + encodeURIComponent(lastEventId);\r\n\t        }\r\n\t      }\r\n\t      var withCredentials = es.withCredentials;\r\n\t      var requestHeaders = {};\r\n\t      requestHeaders[\"Accept\"] = \"text/event-stream\";\r\n\t      var headers = es.headers;\r\n\t      if (headers != undefined) {\r\n\t        for (var name in headers) {\r\n\t          if (Object.prototype.hasOwnProperty.call(headers, name)) {\r\n\t            requestHeaders[name] = headers[name];\r\n\t          }\r\n\t        }\r\n\t      }\r\n\t      try {\r\n\t        abortController = transport.open(xhr, onStart, onProgress, onFinish, requestURL, withCredentials, requestHeaders);\r\n\t      } catch (error) {\r\n\t        close();\r\n\t        throw error;\r\n\t      }\r\n\t    };\r\n\r\n\t    es.url = url;\r\n\t    es.readyState = CONNECTING;\r\n\t    es.withCredentials = withCredentials;\r\n\t    es.headers = headers;\r\n\t    es._close = close;\r\n\r\n\t    onTimeout();\r\n\t  }\r\n\r\n\t  EventSourcePolyfill.prototype = Object.create(EventTarget.prototype);\r\n\t  EventSourcePolyfill.prototype.CONNECTING = CONNECTING;\r\n\t  EventSourcePolyfill.prototype.OPEN = OPEN;\r\n\t  EventSourcePolyfill.prototype.CLOSED = CLOSED;\r\n\t  EventSourcePolyfill.prototype.close = function () {\r\n\t    this._close();\r\n\t  };\r\n\r\n\t  EventSourcePolyfill.CONNECTING = CONNECTING;\r\n\t  EventSourcePolyfill.OPEN = OPEN;\r\n\t  EventSourcePolyfill.CLOSED = CLOSED;\r\n\t  EventSourcePolyfill.prototype.withCredentials = undefined;\r\n\r\n\t  var R = NativeEventSource;\r\n\t  if (XMLHttpRequest != undefined && (NativeEventSource == undefined || !(\"withCredentials\" in NativeEventSource.prototype))) {\r\n\t    // Why replace a native EventSource ?\r\n\t    // https://bugzilla.mozilla.org/show_bug.cgi?id=444328\r\n\t    // https://bugzilla.mozilla.org/show_bug.cgi?id=831392\r\n\t    // https://code.google.com/p/chromium/issues/detail?id=260144\r\n\t    // https://code.google.com/p/chromium/issues/detail?id=225654\r\n\t    // ...\r\n\t    R = EventSourcePolyfill;\r\n\t  }\r\n\r\n\t  (function (factory) {\r\n\t    {\r\n\t      var v = factory(exports);\r\n\t      if (v !== undefined) { module.exports = v; }\r\n\t    }\r\n\t  })(function (exports) {\r\n\t    exports.EventSourcePolyfill = EventSourcePolyfill;\r\n\t    exports.NativeEventSource = NativeEventSource;\r\n\t    exports.EventSource = R;\r\n\t  });\r\n\t}(typeof globalThis === 'undefined' ? (typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : commonjsGlobal) : globalThis));\n\t});\n\n\tvar eventsource$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), eventsource, {\n\t\t'default': eventsource\n\t}));\n\n\tvar formatText = function (e) { return e.data; };\n\n\tvar formatJSON = function (e) { return JSON.parse(e.data); };\n\n\tvar SSEClient = function SSEClient(config) {\n\t  this._handlers = {};\n\t  this._listeners = {};\n\t  this._source = null;\n\n\t  if (config.format) {\n\t    if (typeof config.format === 'string') {\n\t      if (config.format === 'plain') {\n\t        this._format = formatText;\n\t      } else if (config.format === 'json') {\n\t        this._format = formatJSON;\n\t      } else {\n\t        this._format = formatText;\n\t      }\n\t    } else if (typeof config.format === 'function') {\n\t      this._format = config.format;\n\t    } else {\n\t      this._format = formatText;\n\t    }\n\t  } else {\n\t    this._format = formatText;\n\t  }\n\n\t  if (config.handlers) {\n\t    for (var event in config.handlers) {\n\t      this.on(event, config.handlers[event]);\n\t    }\n\t  }\n\n\t  this.url = config.url;\n\t  this.withCredentials = !!config.withCredentials;\n\t  this.polyfillOptions = config.polyfillOptions || {};\n\t  this.forcePolyfill = !!config.forcePolyfill;\n\t};\n\n\tvar prototypeAccessors = { source: { configurable: true } };\n\n\tprototypeAccessors.source.get = function () {\n\t  return this._source;\n\t};\n\n\tSSEClient.prototype.connect = function connect () {\n\t    var this$1 = this;\n\n\t  if (this.forcePolyfill) {\n\t    this._source = new eventsource.EventSourcePolyfill(\n\t      this.url,\n\t      Object.assign({}, this.polyfillOptions, {\n\t        withCredentials: this.withCredentials,\n\t      })\n\t    );\n\t  } else {\n\t    this._source = new window.EventSource(this.url, {\n\t      withCredentials: this.withCredentials,\n\t    });\n\t  }\n\n\t  return new Promise(function (resolve, reject) {\n\t    this$1._source.onopen = function () {\n\t      // Add event listeners that were added before we connected\n\t      for (var event in this$1._listeners) {\n\t        this$1._source.addEventListener(event, this$1._listeners[event]);\n\t      }\n\n\t      this$1._source.onerror = null;\n\n\t      resolve(this$1);\n\t    };\n\n\t    this$1._source.onerror = reject;\n\t  });\n\t};\n\n\tSSEClient.prototype.disconnect = function disconnect () {\n\t  if (this._source !== null) {\n\t    this._source.close();\n\t    this._source = null;\n\t  }\n\t};\n\n\tSSEClient.prototype.on = function on (event, handler) {\n\t  if (!event) {\n\t    // Default \"event-less\" event\n\t    event = 'message';\n\t  }\n\n\t  if (!this._listeners[event]) {\n\t    this._create(event);\n\t  }\n\n\t  this._handlers[event].push(handler);\n\n\t  return this;\n\t};\n\n\tSSEClient.prototype.once = function once (event, handler) {\n\t    var this$1 = this;\n\n\t  this.on(event, function (e) {\n\t    this$1.off(event, handler);\n\n\t    handler(e);\n\t  });\n\n\t  return this;\n\t};\n\n\tSSEClient.prototype.off = function off (event, handler) {\n\t  if (!this._handlers[event]) {\n\t    // no handlers registered for event\n\t    return this;\n\t  }\n\n\t  var idx = this._handlers[event].indexOf(handler);\n\t  if (idx === -1) {\n\t    // handler not registered for event\n\t    return this;\n\t  }\n\n\t  // remove handler from event\n\t  this._handlers[event].splice(idx, 1);\n\n\t  if (this._handlers[event].length === 0) {\n\t    // remove listener since no handlers exist\n\t    this._source.removeEventListener(event, this._listeners[event]);\n\t    delete this._handlers[event];\n\t    delete this._listeners[event];\n\t  }\n\n\t  return this;\n\t};\n\n\tSSEClient.prototype._create = function _create (event) {\n\t    var this$1 = this;\n\n\t  this._handlers[event] = [];\n\n\t  this._listeners[event] = function (message) {\n\t    var data;\n\n\t    try {\n\t      data = this$1._format(message);\n\t    } catch (err) {\n\t      if (typeof this$1._source.onerror === 'function') {\n\t        this$1._source.onerror(err);\n\t      }\n\t      return;\n\t    }\n\n\t    this$1._handlers[event].forEach(function (handler) { return handler(data, message.lastEventId); });\n\t  };\n\n\t  if (this._source) {\n\t    this._source.addEventListener(event, this._listeners[event]);\n\t  }\n\t};\n\n\tObject.defineProperties( SSEClient.prototype, prototypeAccessors );\n\n\tfunction install(Vue, config) {\n\t  if (Vue.config && Vue.config.globalProperties) {\n\t    // Vue3\n\t    Vue.config.globalProperties.$sse = new SSEManager(config);\n\t  } else {\n\t    // Vue2\n\t    // eslint-disable-next-line no-param-reassign, no-multi-assign\n\t    Vue.$sse = Vue.prototype.$sse = new SSEManager(config);\n\t  }\n\n\t  if (config && config.polyfill) {\n\t    Promise.resolve().then(function () { return eventsource$1; });\n\t  }\n\n\t  // This mixin allows components to specify that all clients that were\n\t  // created within it should be automatically disconnected (cleanup)\n\t  // when the component is destroyed.\n\t  Vue.mixin({\n\t    beforeCreate: function beforeCreate() {\n\t      if (this.$options.sse && this.$options.sse.cleanup) {\n\t        // We instantiate an SSEManager for this specific instance\n\t        // in order to track it (see discussions in #13 for rationale).\n\t        this.$sse = new SSEManager();\n\n\t        // We also set $clients to an empty array, as opposed to null,\n\t        // so that beforeDestroy and create know to use it.\n\t        this.$sse.$clients = [];\n\t      }\n\t    },\n\t    beforeDestroy: function beforeDestroy() {\n\t      if (this.$sse.$clients !== null) {\n\t        this.$sse.$clients.forEach(function (c) { return c.disconnect(); });\n\t        this.$sse.$clients = [];\n\t      }\n\t    },\n\t  });\n\t}\n\n\tvar SSEManager = function SSEManager(config) {\n\t  this.$defaultConfig = Object.assign(\n\t    {\n\t      format: formatText,\n\t      sendCredentials: false,\n\t    },\n\t    config\n\t  );\n\n\t  this.$clients = null;\n\t};\n\n\tSSEManager.prototype.create = function create (configOrURL) {\n\t  var config;\n\t  if (typeof configOrURL === 'object') {\n\t    config = configOrURL;\n\t  } else if (typeof configOrURL === 'string') {\n\t    config = {\n\t      url: configOrURL,\n\t    };\n\t  } else {\n\t    config = {};\n\t  }\n\n\t  var client = new SSEClient(Object.assign({}, this.$defaultConfig, config));\n\n\t  // If $clients is not null, then it's array that we should push this\n\t  // client into for later cleanup in our mixin's beforeDestroy.\n\t  if (this.$clients !== null) {\n\t    this.$clients.push(client);\n\t  }\n\n\t  return client;\n\t};\n\n\tvar index_cjs = {\n\t  SSEManager: SSEManager,\n\t  install: install,\n\t};\n\n\treturn index_cjs;\n\n})));\n"
  },
  {
    "path": "dist/vue-sse.mjs",
    "content": "import VueSSE from './vue-sse.common.js';\n\nconst {\n  SSEManager,\n  install,\n} = VueSSE;\n\nexport {\n  VueSSE as default,\n  SSEManager,\n  install,\n};\n"
  },
  {
    "path": "jest.config.js",
    "content": "module.exports = {\n  collectCoverageFrom: [\n    'src/**.*.js',\n    '!src/index.cjs.js',\n  ],\n  coverageDirectory: 'coverage',\n  coverageProvider: 'v8',\n  rootDir: __dirname,\n  setupFilesAfterEnv: ['./test/setup.js'],\n  testMatch: ['<rootDir>/test/**/*.spec.js'],\n  testPathIgnorePatterns: ['/node_modules/'],\n  transform: {\n    '^.+\\\\.js$': '<rootDir>/node_modules/babel-jest',\n  },\n};\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"vue-sse\",\n  \"version\": \"2.5.2\",\n  \"description\": \"A Vue plugin for using Server-Sent Events (EventSource)\",\n  \"main\": \"dist/vue-sse.common.js\",\n  \"exports\": {\n    \".\": {\n      \"module\": \"./dist/vue-sse.esm.js\",\n      \"require\": \"./dist/vue-sse.common.js\",\n      \"import\": \"./dist/vue-sse.mjs\"\n    },\n    \"./\": \"./\"\n  },\n  \"module\": \"dist/vue-sse.esm.js\",\n  \"typings\": \"types/index.d.ts\",\n  \"unpkg\": \"dist/vue-sse.js\",\n  \"jsdelivr\": \"dist/vue-sse.js\",\n  \"sideEffects\": [\n    \"./src/sse-client.js\"\n  ],\n  \"files\": [\n    \"dist\",\n    \"types/*.d.ts\"\n  ],\n  \"scripts\": {\n    \"build\": \"rollup -c rollup.config.js\",\n    \"format\": \"prettier --write \\\"src/**/*.js\\\"\",\n    \"lint\": \"eslint src test\",\n    \"postversion\": \"git push && git push --tags\",\n    \"prepare\": \"npm run build\",\n    \"prepublishOnly\": \"npm test && npm run lint\",\n    \"preversion\": \"npm run lint\",\n    \"test\": \"npm run lint && npm run test:unit\",\n    \"test:unit\": \"jest\",\n    \"test:types\": \"tsc -p types/test\",\n    \"version\": \"npm run format && git add -A src\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/tserkov/vue-sse.git\"\n  },\n  \"keywords\": [\n    \"vue\",\n    \"sse\",\n    \"eventsource\",\n    \"server sent events\"\n  ],\n  \"author\": \"tserkov\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/tserkov/vue-sse/issues\"\n  },\n  \"homepage\": \"https://github.com/tserkov/vue-sse\",\n  \"dependencies\": {\n    \"event-source-polyfill\": \"^1.0.22\"\n  },\n  \"peerDependencies\": {\n    \"vue\": \"^2.0.0 || ^3.0.0\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.12.17\",\n    \"@babel/preset-env\": \"^7.12.17\",\n    \"@rollup/plugin-buble\": \"^0.21.3\",\n    \"@rollup/plugin-commonjs\": \"^17.1.0\",\n    \"@rollup/plugin-node-resolve\": \"^11.2.0\",\n    \"@vue/test-utils\": \"^1.1.4\",\n    \"babel-jest\": \"^26.6.3\",\n    \"babel-loader\": \"^8.2.2\",\n    \"eslint\": \"^7.20.0\",\n    \"eslint-plugin-vue\": \"^7.6.0\",\n    \"jest\": \"^26.6.3\",\n    \"mocksse\": \"^1.0.2\",\n    \"rollup\": \"^2.37.1\",\n    \"rollup-plugin-terser\": \"^7.0.2\",\n    \"typescript\": \"^4.1.5\",\n    \"vue\": \"^2.6.12\",\n    \"vue-loader\": \"^15.9.6\"\n  }\n}\n"
  },
  {
    "path": "rollup.config.js",
    "content": "import buble from '@rollup/plugin-buble';\nimport resolve from '@rollup/plugin-node-resolve'\nimport commonjs from '@rollup/plugin-commonjs'\nimport { terser } from 'rollup-plugin-terser'\nimport pkg from './package.json';\n\nconst banner = `/*!\n * vue-sse v${pkg.version}\n * (c) ${new Date().getFullYear()} James Churchard\n * @license MIT\n */`\n\nexport default [\n  {\n    input: 'src/index.js',\n    output: {\n      banner,\n      file: 'dist/vue-sse.esm.browser.js',\n      format: 'es',\n    },\n    plugins: [\n      resolve(),\n      commonjs(),\n    ],\n    inlineDynamicImports: true,\n  },\n  {\n    input: 'src/index.js',\n    output: {\n      banner,\n      file: 'dist/vue-sse.esm.browser.min.js',\n      format: 'es',\n    },\n    plugins: [\n      resolve(),\n      commonjs(),\n      terser({ module: true })\n    ],\n    inlineDynamicImports: true,\n  },\n  {\n    input: 'src/index.js',\n    output: {\n      banner,\n      file: 'dist/vue-sse.esm.js',\n      format: 'es',\n    },\n    plugins: [\n      buble(),\n      resolve(),\n      commonjs(),\n    ],\n    inlineDynamicImports: true,\n  },\n  {\n    input: 'src/index.cjs.js',\n    output: {\n      banner,\n      file: 'dist/vue-sse.js',\n      format: 'umd',\n      name: 'VueSSE',\n    },\n    plugins: [\n      buble(),\n      resolve(),\n      commonjs(),\n    ],\n    inlineDynamicImports: true,\n  },\n  {\n    input: 'src/index.cjs.js',\n    output: {\n      banner,\n      file: 'dist/vue-sse.min.js',\n      format: 'umd',\n      name: 'VueSSE',\n    },\n    plugins: [\n      buble(),\n      resolve(),\n      commonjs(),\n      terser({ module: false })\n    ],\n    inlineDynamicImports: true,\n  },\n  {\n    input: 'src/index.cjs.js',\n    output: {\n      banner,\n      file: 'dist/vue-sse.common.js',\n      format: 'cjs',\n      exports: 'default',\n    },\n    plugins: [\n      buble(),\n      resolve(),\n      commonjs(),\n    ],\n    inlineDynamicImports: true,\n  },\n];\n"
  },
  {
    "path": "src/index.cjs.js",
    "content": "import SSEManager, { install } from './sse-manager';\n\nexport default {\n  SSEManager,\n  install,\n};\n"
  },
  {
    "path": "src/index.js",
    "content": "import SSEManager, { install } from './sse-manager';\n\nexport default {\n  install,\n};\n\nexport { SSEManager, install };\n"
  },
  {
    "path": "src/sse-client.js",
    "content": "import { EventSourcePolyfill } from 'event-source-polyfill';\n\nexport const formatText = (e) => e.data;\n\nexport const formatJSON = (e) => JSON.parse(e.data);\n\nexport default class SSEClient {\n  constructor(config) {\n    this._handlers = {};\n    this._listeners = {};\n    this._source = null;\n\n    if (config.format) {\n      if (typeof config.format === 'string') {\n        if (config.format === 'plain') {\n          this._format = formatText;\n        } else if (config.format === 'json') {\n          this._format = formatJSON;\n        } else {\n          this._format = formatText;\n        }\n      } else if (typeof config.format === 'function') {\n        this._format = config.format;\n      } else {\n        this._format = formatText;\n      }\n    } else {\n      this._format = formatText;\n    }\n\n    if (config.handlers) {\n      for (const event in config.handlers) {\n        this.on(event, config.handlers[event]);\n      }\n    }\n\n    this.url = config.url;\n    this.withCredentials = !!config.withCredentials;\n    this.polyfillOptions = config.polyfillOptions || {};\n    this.forcePolyfill = !!config.forcePolyfill;\n  }\n\n  get source() {\n    return this._source;\n  }\n\n  connect() {\n    if (this.forcePolyfill) {\n      this._source = new EventSourcePolyfill(\n        this.url,\n        Object.assign({}, this.polyfillOptions, {\n          withCredentials: this.withCredentials,\n        }),\n      );\n    } else {\n      this._source = new window.EventSource(this.url, {\n        withCredentials: this.withCredentials,\n      });\n    }\n\n    return new Promise((resolve, reject) => {\n      this._source.onopen = () => {\n        // Add event listeners that were added before we connected\n        for (let event in this._listeners) {\n          this._source.addEventListener(event, this._listeners[event]);\n        }\n\n        this._source.onerror = null;\n\n        resolve(this);\n      };\n\n      this._source.onerror = reject;\n    });\n  }\n\n  disconnect() {\n    if (this._source !== null) {\n      this._source.close();\n      this._source = null;\n    }\n  }\n\n  on(event, handler) {\n    if (!event) {\n      // Default \"event-less\" event\n      event = 'message';\n    }\n\n    if (!this._listeners[event]) {\n      this._create(event);\n    }\n\n    this._handlers[event].push(handler);\n\n    return this;\n  }\n\n  once(event, handler) {\n    this.on(event, (e) => {\n      this.off(event, handler);\n\n      handler(e);\n    });\n\n    return this;\n  }\n\n  off(event, handler) {\n    if (!this._handlers[event]) {\n      // no handlers registered for event\n      return this;\n    }\n\n    const idx = this._handlers[event].indexOf(handler);\n    if (idx === -1) {\n      // handler not registered for event\n      return this;\n    }\n\n    // remove handler from event\n    this._handlers[event].splice(idx, 1);\n\n    if (this._handlers[event].length === 0) {\n      // remove listener since no handlers exist\n      this._source.removeEventListener(event, this._listeners[event]);\n      delete this._handlers[event];\n      delete this._listeners[event];\n    }\n\n    return this;\n  }\n\n  _create(event) {\n    this._handlers[event] = [];\n\n    this._listeners[event] = (message) => {\n      let data;\n\n      try {\n        data = this._format(message);\n      } catch (err) {\n        if (typeof this._source.onerror === 'function') {\n          this._source.onerror(err);\n        }\n        return;\n      }\n\n      this._handlers[event].forEach((handler) => handler(data, message.lastEventId));\n    };\n\n    if (this._source) {\n      this._source.addEventListener(event, this._listeners[event]);\n    }\n  }\n}\n"
  },
  {
    "path": "src/sse-manager.js",
    "content": "import SSEClient, { formatText } from './sse-client';\n\nexport function install(Vue, config) {\n  if (Vue.config && Vue.config.globalProperties) {\n    // Vue3\n    Vue.config.globalProperties.$sse = new SSEManager(config);\n  } else {\n    // Vue2\n    // eslint-disable-next-line no-param-reassign, no-multi-assign\n    Vue.$sse = Vue.prototype.$sse = new SSEManager(config);\n  }\n\n  if (config && config.polyfill) {\n    import('event-source-polyfill');\n  }\n\n  // This mixin allows components to specify that all clients that were\n  // created within it should be automatically disconnected (cleanup)\n  // when the component is destroyed.\n  Vue.mixin({\n    beforeCreate() {\n      if (this.$options.sse && this.$options.sse.cleanup) {\n        // We instantiate an SSEManager for this specific instance\n        // in order to track it (see discussions in #13 for rationale).\n        this.$sse = new SSEManager();\n\n        // We also set $clients to an empty array, as opposed to null,\n        // so that beforeDestroy and create know to use it.\n        this.$sse.$clients = [];\n      }\n    },\n    beforeDestroy() {\n      if (this.$sse.$clients !== null) {\n        this.$sse.$clients.forEach((c) => c.disconnect());\n        this.$sse.$clients = [];\n      }\n    },\n  });\n}\n\nexport class SSEManager {\n  constructor(config) {\n    this.$defaultConfig = Object.assign(\n      {\n        format: formatText,\n        sendCredentials: false,\n      },\n      config,\n    );\n\n    this.$clients = null;\n  }\n\n  create(configOrURL) {\n    let config;\n    if (typeof configOrURL === 'object') {\n      config = configOrURL;\n    } else if (typeof configOrURL === 'string') {\n      config = {\n        url: configOrURL,\n      };\n    } else {\n      config = {};\n    }\n\n    const client = new SSEClient(Object.assign({}, this.$defaultConfig, config));\n\n    // If $clients is not null, then it's array that we should push this\n    // client into for later cleanup in our mixin's beforeDestroy.\n    if (this.$clients !== null) {\n      this.$clients.push(client);\n    }\n\n    return client;\n  }\n}\n\nexport default SSEManager;\n"
  },
  {
    "path": "test/.eslintrc.json",
    "content": "{\n  \"env\": {\n    \"jest\": true\n  }\n}"
  },
  {
    "path": "test/setup.js",
    "content": "import { EventSource } from 'mocksse';\n\nObject.defineProperty(global, 'window', {\n  value: {\n    EventSource,\n    navigator: {\n      userAgent: 'jest',\n    },\n  },\n});\n"
  },
  {
    "path": "test/sse-client.spec.js",
    "content": "import { MockEvent } from 'mocksse';\nimport SSEClient from '../src/sse-client';\n\ndescribe('SSEClient', () => {\n  it('can receive eventless text messages', (done) => {\n    new MockEvent({\n      url: '/eventless-text',\n      responses: [{\n        type: 'message',\n        data: 'a short message',\n      }],\n    });\n\n    const client = new SSEClient({\n      url: '/eventless-text',\n      format: 'plain',\n      handlers: {\n        message: (msg) => {\n          try {\n            expect(msg).toEqual('a short message');\n            done();\n          } catch (err) {\n            done(err);\n          } finally {\n            client.disconnect();\n          }\n        },\n      },\n    });\n\n    client.connect();\n  });\n\n  it('can receive eventless json messages', (done) => {\n    new MockEvent({\n      url: '/eventless-json',\n      responses: [{\n        type: 'message',\n        data: '{\"pi\":3.14}',\n      }],\n    });\n\n    const client = new SSEClient({\n      url: '/eventless-json',\n      format: 'json',\n      handlers: {\n        message: (msg) => {\n          try {\n            expect(msg).toStrictEqual({ pi: 3.14 });\n            done();\n          } catch (err) {\n            done(err);\n          } finally {\n            client.disconnect();\n          }\n        },\n      },\n    });\n\n    client.connect();\n  });\n\n  it('can receive custom event messages', (done) => {\n    new MockEvent({\n      url: '/custom-event',\n      responses: [{\n        type: 'ping',\n        data: 'ok!',\n      }],\n    });\n\n    const client = new SSEClient({\n      url: '/custom-event',\n      handlers: {\n        ping: (msg) => {\n          try {\n            expect(msg).toStrictEqual('ok!');\n            done();\n          } catch (err) {\n            done(err);\n          } finally {\n            client.disconnect();\n          }\n        },\n      },\n    });\n\n    client.connect();\n  });\n});\n"
  },
  {
    "path": "test/sse-manager.spec.js",
    "content": "import { createLocalVue, mount } from '@vue/test-utils';\nimport SSEManager from '../src/sse-manager';\nimport VueSSE from '../src/index';\n\ndescribe('SSEManager', () => {\n  it('creates a client that inherits from manager config', () => {\n    const $sse = new SSEManager({\n      url: 'foo.local',\n      withCredentials: true,\n    });\n\n    const client = $sse.create({});\n\n    expect(client.url).toEqual('foo.local');\n    expect(client.withCredentials).toEqual(true);\n  });\n\n  it('creates a client that overrides manager config', () => {\n    const $sse = new SSEManager({\n      url: 'foo.local',\n      withCredentials: true,\n    });\n\n    const client = $sse.create({\n      url: 'bar.local',\n      withCredentials: false,\n    });\n\n    expect(client.url).toEqual('bar.local');\n    expect(client.withCredentials).toEqual(false);\n  });\n\n  it('creates a client from url string not config object', () => {\n    const $sse = new SSEManager();\n\n    const client = $sse.create('foo.local');\n\n    expect(client.url).toEqual('foo.local');\n  });\n\n  it('creates a client and cleans up', () => {\n    const localVue = createLocalVue()\n    localVue.use(VueSSE);\n\n    const wrapper = mount({\n      template: '<div></div>',\n      sse: {\n        cleanup: true,\n      },\n      mounted() {\n        this.$sse.create('bar.local');\n      },\n    }, { localVue });\n\n    wrapper.destroy();\n\n    expect(wrapper.vm.$sse.$clients).not.toBe(null);\n    expect(wrapper.vm.$sse.$clients).toHaveLength(0);\n  });\n\n  it('creates a client and does not clean up', () => {\n    const localVue = createLocalVue()\n    localVue.use(VueSSE);\n\n    const wrapper = mount({\n      template: '<div></div>',\n      sse: {\n        cleanup: false,\n      },\n      mounted() {\n        this.$sse.create('bar.local');\n      },\n    }, { localVue });\n\n    wrapper.destroy();\n\n    expect(wrapper.vm.$sse.$clients).toBe(null);\n  });\n});\n"
  },
  {
    "path": "types/index.d.ts",
    "content": "import './vue';\nimport Vue from 'vue';\n\nexport type MessageFormatter<T> = (event: MessageEvent) => T;\n\nexport type MessageHandler = (data: any, lastEventId: string) => void;\n\nexport interface SSEConfig {\n\tformat?: 'plain' | 'json' | MessageFormatter<any>;\n\thandlers?: Partial<Record<string, MessageHandler>>;\n\tpolyfill?: boolean;\n\tforcePolyfill?: boolean;\n\tpolyfillOptions?: object;\n\turl?: string;\n\twithCredentials?: boolean;\n}\n\nexport interface SSEComponentOptions {\n\tcleanup?: boolean;\n}\n\nexport declare class SSEManager {\n\t$defaultConfig: SSEConfig;\n\t$clients: SSEClient[] | null;\n\n\tconstructor(config?: SSEConfig);\n\tcreate(configOrURL?: SSEConfig | string): SSEClient;\n}\n\nexport declare class SSEClient {\n\turl: string;\n\twithCredentials: boolean;\n\n\t_format: MessageFormatter<any>;\n\t_handlers: Partial<Record<string, MessageHandler[]>>;\n\t_listeners: Partial<Record<string, EventListener>>;\n\t_source: EventSource;\n\n\tconstructor(config?: SSEConfig);\n\tconnect(): Promise<SSEClient>;\n\tdisconnect(): void;\n\ton(event: string, handler: MessageHandler): SSEClient;\n\tonce(event: string, handler: MessageHandler): SSEClient;\n\toff(event: string, handler: MessageHandler): SSEClient;\n\n\tget source(): EventSource;\n}\n\nexport declare function install(vue: typeof Vue, config?: SSEConfig): void;\n\ndeclare const _default: {\n\tSSEClient: typeof SSEClient;\n\tSSEManager: typeof SSEManager;\n\tinstall: typeof install;\n}\nexport default _default;\n"
  },
  {
    "path": "types/vue.d.ts",
    "content": "import Vue from 'vue';\nimport { SSEComponentOptions, SSEManager } from './index';\n\ndeclare module 'vue/types/vue' {\n  interface VueConstructor {\n    readonly $sse: SSEManager;\n  }\n\n  interface Vue {\n    $sse: SSEManager;\n  }\n}\n\ndeclare module 'vue/types/options' {\n  interface ComponentOptions<V extends Vue> {\n    sse?: SSEComponentOptions;\n  }\n}\n"
  }
]