{"version":3,"file":"XMLHttpRequest.cjs","sources":["../src/XMLHttpRequest.js"],"sourcesContent":["/* eslint-disable n/no-sync, n/prefer-promises/fs -- Polyfilling sync API */\n/**\n * Wrapper for built-in http.js to emulate the browser XMLHttpRequest object.\n *\n * This can be used with JS designed for browsers to improve reuse of code and\n * allow the use of existing libraries.\n *\n * Usage: include(\"XMLHttpRequest.js\") and use XMLHttpRequest per W3C specs.\n *\n * @author Dan DeFelippi <dan@driverdan.com>\n * @author David Ellis <d.f.ellis@ieee.org>\n * @license MIT\n */\n\nimport http from 'node:http';\nimport https from 'node:https';\nimport path from 'node:path';\nimport {spawn} from 'node:child_process';\nimport fs from 'node:fs';\n\n// eslint-disable-next-line no-shadow -- Convenient\nconst __dirname = import.meta.dirname;\n\n/**\n * @typedef {ReturnType<typeof localXMLHttpRequest>} LocalXMLHttpRequest\n */\n\n/**\n * @typedef {InstanceType<LocalXMLHttpRequest>} LocalXMLHttpRequestInstance\n */\n\n/**\n * @typedef {number} Integer\n */\n\n/* eslint-disable jsdoc/reject-any-type -- For user */\n/**\n * @typedef {any} AnyResponse\n */\n/* eslint-enable jsdoc/reject-any-type -- For user */\n\n// Set some default headers\nconst defaultHeaders = {\n  'User-Agent': 'node-XMLHttpRequest',\n  Accept: '*/*'\n};\n\n// These headers are not user setable.\n// The following are allowed but banned in the spec:\n// * user-agent\nconst forbiddenRequestHeaders = [\n  'accept-charset',\n  'accept-encoding',\n  'access-control-request-headers',\n  'access-control-request-method',\n  'connection',\n  'content-length',\n  'content-transfer-encoding',\n  'cookie',\n  'cookie2',\n  'date',\n  'expect',\n  'host',\n  'keep-alive',\n  'origin',\n  'referer',\n  'te',\n  'trailer',\n  'transfer-encoding',\n  'upgrade',\n  'via'\n];\n\n// These request methods are not allowed\nconst forbiddenRequestMethods = [\n  'TRACE',\n  'TRACK',\n  'CONNECT'\n];\n\n/**\n * Check if the specified method is allowed.\n *\n * @param {string} method Request method to validate\n * @returns {boolean} False if not allowed, otherwise true\n */\nconst isAllowedHttpMethod = (method) => {\n  return Boolean(method && !forbiddenRequestMethods.includes(method));\n};\n\n/**\n * A minimal, non-deprecated stand-in for the legacy `url.parse()`. Like\n * `url.parse()` (but unlike `new URL()`), it never throws: a relative or\n * protocol-less string -- a bare local path, or a redirect `Location`\n * header that omits the origin -- comes back with only `pathname`/\n * `search`/`path` populated and `protocol`/`hostname`/`port` left\n * `undefined`, which is what lets callers below detect \"no protocol\" and\n * fall through to the local-file handling, or -- for redirects -- keep\n * working (if imperfectly) against an unset host the way this module\n * always has.\n *\n * @param {string} urlString\n * @returns {{\n *   protocol: (string|undefined),\n *   hostname: (string|undefined),\n *   port: (string|undefined),\n *   pathname: string,\n *   search: string,\n *   path: string\n * }}\n */\nfunction parseUrl (urlString) {\n  try {\n    const {protocol, hostname, port, pathname, search} = new URL(urlString);\n    return {\n      protocol, hostname, port, pathname, search, path: pathname + search\n    };\n  } catch {\n    const [pathname, search = ''] = urlString.split(/(?=\\?)/v, 2);\n    return {\n      protocol: undefined, hostname: undefined, port: undefined,\n      pathname, search, path: pathname + search\n    };\n  }\n}\n\n/* eslint-disable jsdoc/require-returns -- Let TS handle */\n/**\n * @param {{\n *   basePath?: string|false,\n *   baseURL?: string,\n *   resolveBlobURL?: (url: string) =>\n *     {type: string, bytes: Buffer|string}|undefined|null|false,\n *   readBlobSync?: (data: unknown) =>\n *     {type: string, bytes: Buffer|string}|undefined|null|false\n * }} [config]\n */\nfunction localXMLHttpRequest (config) {\n  /* eslint-enable jsdoc/require-returns -- Let TS handle */\n  const cfg = config || {};\n\n  /**\n   *\n   */\n  class XMLHttpRequest {\n    // Per spec, these readyState constants live on the constructor itself\n    //   (as well as on each instance, set in the constructor above) --\n    //   test code commonly checks against the static form, e.g.\n    //   `xhr.readyState !== XMLHttpRequest.DONE`.\n    static UNSENT = 0;\n    static OPENED = 1;\n    static HEADERS_RECEIVED = 2;\n    static LOADING = 3;\n    static DONE = 4;\n\n    /**\n     *\n     */\n    constructor () {\n      /**\n       * Private variables.\n       */\n\n      // Holds http.js objects\n      // this._request;\n      // this._response;\n\n      /**\n       * @type {{\n       *   async?: boolean,\n       *   method?: string,\n       *   url?: string,\n       *   user?: string|null,\n       *   password?: string|null\n       * }}\n       */\n      this._settings = {};\n\n      // Disable header blacklist.\n      // Not part of XHR specs.\n      this._disableHeaderCheck = false;\n\n      /**\n       * @type {Record<string, string|undefined>}\n       */\n      this._headers = {...defaultHeaders};\n\n      // Send flag\n      this._sendFlag = false;\n      // Error flag, used when errors occur or abort is called\n      this._errorFlag = false;\n\n      // Event listeners\n      /** @type {Record<string, ((e?: Event) => AnyResponse)[]>} */\n      this._listeners = {};\n\n      /**\n       * Constants.\n       */\n\n      this.UNSENT = 0;\n      this.OPENED = 1;\n      this.HEADERS_RECEIVED = 2;\n      this.LOADING = 3;\n      this.DONE = 4;\n\n      /**\n       * Public vars.\n       */\n\n      // Current state\n      this.readyState = this.UNSENT;\n\n      // default ready state change handler in case one is not set or is\n      //   set late\n      // eslint-disable-next-line unicorn/prefer-add-event-listener -- API\n      this.onreadystatechange = null;\n\n      // Result & response\n      this.responseText = '';\n      this.responseXML = '';\n      this.status = null;\n      this.statusText = null;\n\n      /**\n       * Private methods.\n       */\n    }\n\n    /**\n     * Check if the specified header is allowed.\n     *\n     * @param {string} header\n     * @returns {boolean} False if not allowed, otherwise true\n     */\n    _isAllowedHttpHeader (header) {\n      return this._disableHeaderCheck ||\n        Boolean(\n          header && !forbiddenRequestHeaders.includes(header.toLowerCase())\n        );\n    }\n\n    /**\n     * Changes readyState and calls onreadystatechange.\n     *\n     * @param {Integer} state New state\n     * @returns {void}\n     */\n    _setState (state) {\n      if (state === this.LOADING || this.readyState !== state) {\n        this.readyState = state;\n\n        if (this._settings.async ||\n            this.readyState < this.OPENED || this.readyState === this.DONE) {\n          this.dispatchEvent('readystatechange');\n        }\n\n        if (this.readyState === this.DONE && !this._errorFlag) {\n          this.dispatchEvent('load');\n          // @TODO figure out InspectorInstrumentation::didLoadXHR(cookie)\n          this.dispatchEvent('loadend');\n        }\n      }\n    }\n\n    /**\n     * Public methods.\n     */\n\n    /**\n     * Open the connection. Currently supports local server requests.\n     *\n     * @param {string} method method Connection method (eg GET, POST)\n     * @param {string} url url URL for the connection.\n     * @param {boolean} [async] Asynchronous connection. Default is true.\n     * @param {string} [user] Username for basic authentication\n     * @param {string} [password] Password for basic authentication\n     * @returns {void}\n     */\n    open (method, url, async, user, password) {\n      this.abort();\n      this._errorFlag = false;\n\n      // Check for valid request method\n      if (!isAllowedHttpMethod(method)) {\n        throw new Error('SecurityError: Request method not allowed');\n      }\n\n      this._settings = {\n        method,\n        url: url.toString(),\n        async: ((typeof async !== 'boolean') || async),\n        user: user || null,\n        password: password || null\n      };\n\n      this._setState(this.OPENED);\n    }\n\n    /**\n     * Disables or enables isAllowedHttpHeader() check the request. Enabled by\n     *   default.\n     * This does not conform to the W3C spec.\n     *\n     * @param {boolean} state Enable or disable header checking.\n     * @returns {void}\n     */\n    setDisableHeaderCheck (state) {\n      this._disableHeaderCheck = state;\n    }\n\n    /**\n     * Sets a header for the request.\n     *\n     * @param {string} header Header name\n     * @param {string} value Header value\n     * @returns {void}\n     */\n    setRequestHeader (header, value) {\n      if (this.readyState !== this.OPENED) {\n        throw new Error(\n          'INVALID_STATE_ERR: setRequestHeader can only be ' +\n            'called when state is OPEN'\n        );\n      }\n      if (!this._isAllowedHttpHeader(header)) {\n        // eslint-disable-next-line no-console -- Feedback\n        console.warn('Refused to set unsafe header \"' + header + '\"');\n        return;\n      }\n      if (this._sendFlag) {\n        throw new Error('INVALID_STATE_ERR: send flag is true');\n      }\n      this._headers[header] = value;\n    }\n\n    /**\n     * Gets a header from the server response.\n     *\n     * @param {string} header Name of header to get.\n     * @returns {string|null} Text of the header or null if it doesn't exist.\n     */\n    getResponseHeader (header) {\n      if (typeof header === 'string' &&\n        this.readyState > this.OPENED &&\n        this._response &&\n        this._response.headers &&\n        Object.hasOwn(this._response.headers, header.toLowerCase()) &&\n        !this._errorFlag\n      ) {\n        return /** @type {string|null} */ (\n          this._response.headers[header.toLowerCase()]\n        );\n      }\n\n      return null;\n    }\n\n    /**\n     * Gets all the response headers.\n     *\n     * @returns {string} A string with all response headers separated by CR+LF\n     */\n    getAllResponseHeaders () {\n      if (this.readyState < this.HEADERS_RECEIVED || this._errorFlag) {\n        return '';\n      }\n      let result = '';\n\n      // eslint-disable-next-line @stylistic/max-len -- Long\n      // eslint-disable-next-line unicorn/no-unreadable-for-of-expression -- Readable\n      for (const [i, header] of Object.entries(this._response?.headers ?? {})) {\n        // Cookie headers are excluded\n        if (i !== 'set-cookie' && i !== 'set-cookie2') {\n          result += i + ': ' + header + '\\r\\n';\n        }\n      }\n      return result.slice(0, Math.max(0, result.length - 2));\n    }\n\n    /**\n     * Gets a request header.\n     *\n     * @param {string} name Name of header to get\n     * @returns {string} Returns the request header or empty string if not set\n     */\n    getRequestHeader (name) {\n      // @TODO Make this case insensitive\n      if (typeof name === 'string' && Object.hasOwn(this._headers, name)) {\n        return /** @type {string} */ (this._headers[name]);\n      }\n\n      return '';\n    }\n\n    /**\n     * Sends the request to the server.\n     *\n     * @param {null|string|Buffer<ArrayBufferLike>} [data] Optional data to\n     *   send as request body.\n     * @returns {void}\n     */\n    send (data) {\n      if (this.readyState !== this.OPENED) {\n        throw new Error(\n          'INVALID_STATE_ERR: connection must be opened before send() is called'\n        );\n      }\n\n      if (this._sendFlag) {\n        throw new Error('INVALID_STATE_ERR: send has already been called');\n      }\n\n      // This module has no concept of `Blob`/`File` itself (which\n      //   implementation is in play varies by environment), so a `Blob`/\n      //   `File` request body is read via a `cfg.readBlobSync(data)`\n      //   callback the consumer supplies -- returning `{type, bytes}`, or a\n      //   falsy value if `data` isn't one it recognizes (left as-is below).\n      if (data && cfg.readBlobSync) {\n        const blob = cfg.readBlobSync(data);\n        if (blob) {\n          if (!this._headers['Content-Type'] && blob.type) {\n            this._headers['Content-Type'] = blob.type;\n          }\n          data = blob.bytes;\n        }\n      }\n\n      let ssl = false, local = false, blobURL = false;\n      let url =\n        /**\n         * @type {Partial<ReturnType<typeof parseUrl>> &\n         *   Required<Pick<Partial<ReturnType<typeof parseUrl>>, \"pathname\">>}\n         */ (\n          parseUrl(/** @type {string} */ (this._settings.url))\n        );\n      let host;\n\n      // A protocol-less (relative) URL normally means \"read this path off\n      //   the local filesystem\" (see the `undefined`/`null`/`''` case below)\n      //   -- a deliberate shortcut for reading static test resources without\n      //   a server round-trip. That can't work for anything but a GET,\n      //   though (there's no such thing as \"POSTing\" to a file on disk), so\n      //   when the method isn't GET and the consumer has supplied a real\n      //   server origin via `cfg.baseURL`, resolve against that instead and\n      //   let it fall through to the normal http/https handling below.\n      if (\n        ((!('protocol' in url)) || !url.protocol) &&\n        this._settings.method !== 'GET' && cfg.baseURL\n      ) {\n        url = parseUrl(new URL(\n          /** @type {string} */ (this._settings.url),\n          cfg.baseURL\n        ).href);\n      }\n\n      const getStack = () => {\n        const orig = Error.prepareStackTrace;\n        Error.prepareStackTrace = (_, stack) => {\n          return stack;\n        };\n        // eslint-disable-next-line @stylistic/max-len -- Long\n        // eslint-disable-next-line unicorn/error-message -- This is a stack trace\n        const err = new Error();\n        // // eslint-disable-next-line no-caller -- This is a stack trace\n        // Error.captureStackTrace(err, arguments.callee);\n        const {stack} = err;\n        Error.prepareStackTrace = orig;\n        return /** @type {NodeJS.CallSite[]} */ (\n          /** @type {unknown} */\n          (stack)\n        );\n      };\n\n      // Determine the server\n      switch (/** @type {unknown} */ (url.protocol)) {\n      case 'https:':\n        ssl = true;\n        // SSL & non-SSL both need host, no break here.\n        /* falls through */\n      case 'http:':\n        host = url.hostname;\n        break;\n\n      case 'file:':\n        local = true;\n        break;\n\n      case 'blob:':\n        blobURL = true;\n        break;\n\n      case undefined:\n      case null:\n      case '': {\n        // `getStack()` temporarily overrides the process-global\n        //   `Error.prepareStackTrace` -- only pay that cost (and its small\n        //   risk of colliding with some other code's lazy `.stack` access\n        //   during the same tick) when `cfg.basePath` isn't already given,\n        //   since its result would otherwise go unused.\n        const basePath = cfg.basePath ||\n          // eslint-disable-next-line @stylistic/wrap-iife -- Why not?\n          (function () {\n            const dir = getStack().findLast((item) => {\n              const filename = /** @type {string} */ (item.getFileName());\n              const idx = filename.search(/[\\/\\\\]node_modules[\\/\\\\]/v);\n              // Should be a user file, as a node executable like nodeunit\n              //   ought to have node_modules in the path\n              //\n              // The `idx !== -1` path below (should be a user file because\n              //   its last \"node_modules\" contains this XMLHttpRequest\n              //   file, i.e. XMLHttpRequest is a dependency of some kind)\n              //   is unreachable in practice: `findLast` walks the stack\n              //   outermost-frame-first, and the outermost frame is always\n              //   a `node:internal/...` entry, which never matches\n              //   `node_modules` and so always satisfies this `idx === -1`\n              //   check first, short-circuiting before that path is ever\n              //   consulted.\n              if (idx === -1) {\n                return true;\n              }\n              /* c8 ignore next -- see comment above: unreachable */\n              return __dirname.includes(filename.slice(0, idx));\n            })?.getFileName();\n            return path.dirname(/** @type {string} */ (dir));\n          })();\n          // We should support this instead if the config were relative to URL\n          // var pathName = new URL(this._settings.url, basePath).pathname;\n\n        const pathName = path.resolve(\n          basePath,\n          /** @type {string} */\n          (this._settings.url)\n        );\n        url = {pathname: pathName};\n        local = true;\n        break;\n      } default:\n        throw new Error('Protocol not supported.');\n      }\n\n      // Load files off the local filesystem (file://)\n      if (local) {\n        if (this._settings.method !== 'GET') {\n          throw new Error('XMLHttpRequest: Only GET method is supported');\n        }\n\n        if (this._settings.async) {\n          // eslint-disable-next-line @stylistic/max-len -- Long\n          // eslint-disable-next-line promise/prefer-await-to-callbacks -- Sync API\n          fs.readFile(url.pathname, 'utf8', (error, dta) => {\n            if (error) {\n              this.handleError(error);\n            } else {\n              this.status = 200;\n              this.responseText = dta;\n              this._setState(this.DONE);\n            }\n          });\n        } else {\n          try {\n            this.responseText = fs.readFileSync(url.pathname, 'utf8');\n            this.status = 200;\n            this._setState(this.DONE);\n          } catch (e) {\n            this.handleError(/** @type {Error} */ (e));\n          }\n        }\n\n        return;\n      }\n\n      // Serve `blob:` URLs (created via `URL.createObjectURL`) the way a\n      //   browser would -- synchronously, without going over the network.\n      //   This module has no concept of a `Blob`/`URL.createObjectURL`\n      //   registry itself, so it defers to a `cfg.resolveBlobURL(url)`\n      //   callback the consumer supplies (returning `{type, bytes}`, or a\n      //   falsy value if `url` isn't a `blob:` URL it recognizes).\n      if (blobURL) {\n        if (this._settings.method !== 'GET') {\n          throw new Error(\n            'XMLHttpRequest: Only GET method is supported for blob: URLs'\n          );\n        }\n\n        /**\n         * @returns {void}\n         */\n        const respondWithBlob = () => {\n          const resolved = cfg.resolveBlobURL &&\n            cfg.resolveBlobURL(/** @type {string} */ (this._settings.url));\n          if (!resolved) {\n            this.handleError(new Error('Failed to load ' + this._settings.url));\n            return;\n          }\n          this._response = {\n            headers: /** @type {Record<string, string>} */ ({\n              'content-type': resolved.type || ''\n            })\n          };\n          this.status = 200;\n          this.responseText = Buffer.isBuffer(resolved.bytes)\n            ? resolved.bytes.toString('binary')\n            : resolved.bytes;\n          this._setState(this.HEADERS_RECEIVED);\n          this._setState(this.DONE);\n        };\n\n        if (this._settings.async) {\n          queueMicrotask(respondWithBlob);\n        } else {\n          respondWithBlob();\n        }\n\n        return;\n      }\n\n      // Default to port 80. If accessing localhost on another port be sure\n      // to use http://localhost:port/path\n      const port = url.port || (ssl ? 443 : 80);\n      // Add query string if one is used\n      const uri = url.pathname + (url.search || '');\n\n      // Set the Host header or the server may reject the request\n      this._headers.Host = host;\n      if (!(port === 80 || (ssl && port === 443))) {\n        this._headers.Host += ':' + url.port;\n      }\n\n      // Set Basic Auth if necessary\n      if (this._settings.user) {\n        if (this._settings.password === undefined ||\n            this._settings.password === null) {\n          this._settings.password = '';\n        }\n        const authBuf = Buffer.from(\n          this._settings.user + ':' + this._settings.password\n        );\n        this._headers.Authorization = 'Basic ' + authBuf.toString('base64');\n      }\n\n      // Set content length header\n      if (this._settings.method === 'GET' || this._settings.method === 'HEAD') {\n        data = null;\n      } else if (data) {\n        this._headers['Content-Length'] = String(Buffer.isBuffer(data)\n          ? data.length\n          : Buffer.byteLength(data));\n\n        if (!this._headers['Content-Type']) {\n          this._headers['Content-Type'] = 'text/plain;charset=UTF-8';\n        }\n      } else if (this._settings.method === 'POST') {\n        // For a post with no data set Content-Length: 0.\n        // This is required by buggy servers that don't meet the specs.\n        this._headers['Content-Length'] = '0';\n      }\n\n      const options = {\n        host,\n        port,\n        path: uri,\n        method: this._settings.method,\n        headers: this._headers,\n        agent: false\n      };\n\n      /** @type {typeof https.request | typeof http.request} */\n      let doRequest;\n\n      // Reset error flag\n      this._errorFlag = false;\n\n      // Error handler for the request\n      /**\n       * @param {Error} error\n       */\n      const errorHandler = (error) => {\n        this.handleError(error);\n      };\n\n      /**\n       * Handler for the response\n       * Called directly as a plain callback by `http(s).request` (not bound\n       * to the XHR instance), so it must reference `self` -- a stray\n       * `this` here would silently read/write the wrong object.\n       * @type {(res: http.IncomingMessage) => void}\n       */\n      const responseHandler = (resp) => {\n        // Set response var to the response we got back\n        // This is so it remains accessable outside this scope\n        this._response = resp;\n        // Check for redirect\n        // @TODO Prevent looped redirects\n        if ([301, 302, 303, 307].includes(Number(this._response.statusCode))) {\n          // Change URL to the redirect location\n          this._settings.url = this._response.headers.location;\n          url = parseUrl(/** @type {string} */ (this._settings.url));\n          // Set host var in case it's used later\n          host = url.hostname;\n          // Options for the new request\n          const newOptions = {\n            hostname: url.hostname,\n            port: url.port,\n            path: url.path,\n            method: this._response.statusCode === 303\n              ? 'GET'\n              : this._settings.method,\n            headers: this._headers\n          };\n\n          // Issue the new request\n          this._request = doRequest(\n            newOptions, responseHandler\n          ).on('error', errorHandler);\n          this._request.end();\n          // @TODO Check if an XHR event needs to be fired here\n          return;\n        }\n\n        this._response.setEncoding('utf8');\n\n        this._setState(this.HEADERS_RECEIVED);\n        this.status = this._response.statusCode;\n\n        this._response.on('data', (chunk) => {\n          // Make sure there's some data\n          if (chunk) {\n            this.responseText += chunk;\n          }\n          // Don't emit state changes if the connection has been aborted.\n          if (this._sendFlag) {\n            this._setState(this.LOADING);\n          }\n        });\n\n        this._response.on('end', () => {\n          if (this._sendFlag) {\n            // Discard the 'end' event if the connection has been aborted\n            this._setState(this.DONE);\n            this._sendFlag = false;\n          }\n        });\n\n        this._response.on('error', (error) => {\n          this.handleError(error);\n        });\n      };\n\n      // Handle async requests\n      if (this._settings.async) {\n        // Use the proper protocol\n        doRequest = ssl ? https.request : http.request;\n\n        // Request is being sent, set send flag\n        this._sendFlag = true;\n\n        // As per spec, this is called here for historical reasons.\n        this.dispatchEvent('readystatechange');\n\n        // Create the request\n        this._request = doRequest(\n          options, responseHandler\n        ).on('error', errorHandler);\n\n        // Node 0.4 and later won't accept empty data. Make sure it's needed.\n        if (data) {\n          this._request.write(data);\n        }\n\n        this._request.end();\n\n        this.dispatchEvent('loadstart');\n      } else { // Synchronous\n        // Create a temporary file for communication with the other Node process\n        const contentFile = '.node-xmlhttprequest-content-' + process.pid;\n        const syncFile = '.node-xmlhttprequest-sync-' + process.pid;\n        fs.writeFileSync(syncFile, '', 'utf8');\n        // The async request the other Node process executes\n        const execString = `\nimport http from 'node:http';\nimport https from 'node:https';\nimport fs from 'node:fs';\n\nconst doRequest = http${ssl ? 's' : ''}.request;\nconst options = ${JSON.stringify(options)};\n\nlet responseText = '';\nconst req = doRequest(options, function (response) {\n  response.setEncoding('utf8');\n\n  response.on('data', function (chunk) {\n    responseText += chunk;\n  });\n\n  response.on('end', function () {\n    fs.writeFileSync(\n      '${contentFile}',\n      'NODE-XMLHTTPREQUEST-STATUS:' + response.statusCode + ',' +\n        responseText,\n      'utf8'\n    );\n    fs.unlinkSync('${syncFile}');\n  });\n  response.on('error', function(error) {\n    fs.writeFileSync(\n      '${contentFile}',\n      'NODE-XMLHTTPREQUEST-ERROR:' + JSON.stringify(error),\n      'utf8'\n    );\n    fs.unlinkSync('${syncFile}');\n  });\n}).on('error', function(error) {\n  fs.writeFileSync(\n    '${contentFile}',\n    'NODE-XMLHTTPREQUEST-ERROR:' + JSON.stringify(error),\n    'utf8'\n  );\n  fs.unlinkSync('${syncFile}');\n});\n${(data\n    ? `req.write('${JSON.stringify(data).slice(\n      1, -1\n    ).replaceAll(\"'\", String.raw`\\'`)}');`\n    : ''\n  )}\nreq.end();\n`;\n        // Start the other Node Process, executing this string\n        const syncProc = spawn(process.argv[0], ['-e', execString]);\n        while (fs.existsSync(syncFile)) {\n          // Wait while the sync file is empty\n        }\n        this.responseText = fs.readFileSync(contentFile, 'utf8');\n        // Kill the child process once the file has data\n        syncProc.stdin.end();\n        // Remove the temporary file\n        fs.unlinkSync(contentFile);\n        if ((this.responseText).startsWith('NODE-XMLHTTPREQUEST-ERROR:')) {\n          // If the file returned an error, handle it\n          const errorObj = new Error(\n            this.responseText.replace(/^NODE-XMLHTTPREQUEST-ERROR:/v, '')\n          );\n          this.handleError(errorObj);\n        } else {\n          // If the file returned okay, parse its data and move to the\n          //   DONE state\n          this.status = Number(\n            // eslint-disable-next-line prefer-named-capture-group -- Convenient\n            this.responseText.replace(/^NODE-XMLHTTPREQUEST-STATUS:(\\d*),.*/v, '$1')\n          );\n          this.responseText = this.responseText.replace(\n            // eslint-disable-next-line prefer-named-capture-group -- Convenient\n            /^NODE-XMLHTTPREQUEST-STATUS:\\d*,(.*)/v, '$1'\n          );\n          this._setState(this.DONE);\n        }\n      }\n    }\n\n    /**\n     * Called when an error is encountered to deal with it.\n     * @param {Error} error\n     * @returns {void}\n     */\n    handleError (error) {\n      this.status = 503;\n      this.statusText = error.message;\n      this.responseText = /** @type {string} */ (error.stack);\n      this._errorFlag = true;\n      this._setState(this.DONE);\n    }\n\n    /**\n     * Aborts a request.\n     * @returns {void}\n     */\n    abort () {\n      if (this._request) {\n        this._request.abort();\n        this._request = null;\n      }\n\n      this._headers = {...defaultHeaders};\n      this.responseText = '';\n      this.responseXML = '';\n\n      this._errorFlag = true;\n\n      if (this.readyState !== this.UNSENT &&\n          (this.readyState !== this.OPENED || this._sendFlag) &&\n          this.readyState !== this.DONE) {\n        this._sendFlag = false;\n        this._setState(this.DONE);\n      }\n      this.readyState = this.UNSENT;\n    }\n\n    /* eslint-disable promise/prefer-await-to-callbacks -- API */\n    /**\n     * Adds an event listener. Preferred method of binding to events.\n     * @param {string} event\n     * @param {(e?: Event) => AnyResponse} callback\n     * @returns {void}\n     */\n    addEventListener (event, callback) {\n      /* eslint-enable promise/prefer-await-to-callbacks -- API */\n      if (!(Object.hasOwnProperty.call(this._listeners, event))) {\n        this._listeners[event] = [];\n      }\n      // Currently allows duplicate callbacks. Should it?\n      this._listeners[event].push(callback);\n    }\n\n    /* eslint-disable promise/prefer-await-to-callbacks -- API */\n    /**\n     * Remove an event callback that has already been bound.\n     * Only works on the matching funciton, cannot be a copy.\n     * @param {string} event\n     * @param {(e: Event) => AnyResponse} callback\n     * @returns {void}\n     */\n    removeEventListener (event, callback) {\n      /* eslint-enable promise/prefer-await-to-callbacks -- API */\n      if (Object.hasOwnProperty.call(this._listeners, event)) {\n        // Filter will return a new array with the callback removed\n        this._listeners[event] = this._listeners[event].filter((ev) => {\n          return ev !== callback;\n        });\n      }\n    }\n\n    /**\n     * Dispatch any events, including both \"on\" methods and events\n     *  attached using `addEventListener`.\n     * @param {\"readystatechange\"|\"load\"|\"loadend\"|\"loadstart\"} event\n     * @returns {void}\n     */\n    dispatchEvent (event) {\n      if (\n        [\n          'readystatechange', 'load', 'loadend', 'loadstart'\n        ].includes(event) &&\n        // @ts-expect-error -- Safe now\n        typeof this['on' + event] === 'function'\n      ) {\n        // @ts-expect-error -- Safe now\n        this['on' + event]();\n      }\n      let i, len;\n      if (Object.hasOwn(this._listeners, event)) {\n        for (i = 0, len = this._listeners[event].length; i < len; i++) {\n          this._listeners[event][i].call(this);\n        }\n      }\n    }\n  }\n\n  // `response` is spec'd to reflect `responseType`; this module only ever\n  //   populates `responseText` (no `arraybuffer`/`blob`/`json` support), so\n  //   `response` mirrors it -- matching the default (`\"\"`/`\"text\"`)\n  //   `responseType` behavior real browsers use.\n  Object.defineProperty(XMLHttpRequest.prototype, 'response', {\n    enumerable: true,\n    configurable: true,\n    get () {\n      return this.responseText;\n    }\n  });\n\n  return XMLHttpRequest;\n}\n\nexport default localXMLHttpRequest;\n"],"names":["__dirname","spawn"],"mappings":"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"}