forked from waja/action-debian-package
		
	node_modules: update
This commit is contained in:
		
							parent
							
								
									63ec4f26a7
								
							
						
					
					
						commit
						d33a5e2307
					
				
					 193 changed files with 30796 additions and 147 deletions
				
			
		
							
								
								
									
										189
									
								
								node_modules/undici/lib/core/connect.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										189
									
								
								node_modules/undici/lib/core/connect.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,189 @@
 | 
			
		|||
'use strict'
 | 
			
		||||
 | 
			
		||||
const net = require('net')
 | 
			
		||||
const assert = require('assert')
 | 
			
		||||
const util = require('./util')
 | 
			
		||||
const { InvalidArgumentError, ConnectTimeoutError } = require('./errors')
 | 
			
		||||
 | 
			
		||||
let tls // include tls conditionally since it is not always available
 | 
			
		||||
 | 
			
		||||
// TODO: session re-use does not wait for the first
 | 
			
		||||
// connection to resolve the session and might therefore
 | 
			
		||||
// resolve the same servername multiple times even when
 | 
			
		||||
// re-use is enabled.
 | 
			
		||||
 | 
			
		||||
let SessionCache
 | 
			
		||||
// FIXME: remove workaround when the Node bug is fixed
 | 
			
		||||
// https://github.com/nodejs/node/issues/49344#issuecomment-1741776308
 | 
			
		||||
if (global.FinalizationRegistry && !process.env.NODE_V8_COVERAGE) {
 | 
			
		||||
  SessionCache = class WeakSessionCache {
 | 
			
		||||
    constructor (maxCachedSessions) {
 | 
			
		||||
      this._maxCachedSessions = maxCachedSessions
 | 
			
		||||
      this._sessionCache = new Map()
 | 
			
		||||
      this._sessionRegistry = new global.FinalizationRegistry((key) => {
 | 
			
		||||
        if (this._sessionCache.size < this._maxCachedSessions) {
 | 
			
		||||
          return
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        const ref = this._sessionCache.get(key)
 | 
			
		||||
        if (ref !== undefined && ref.deref() === undefined) {
 | 
			
		||||
          this._sessionCache.delete(key)
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get (sessionKey) {
 | 
			
		||||
      const ref = this._sessionCache.get(sessionKey)
 | 
			
		||||
      return ref ? ref.deref() : null
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    set (sessionKey, session) {
 | 
			
		||||
      if (this._maxCachedSessions === 0) {
 | 
			
		||||
        return
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      this._sessionCache.set(sessionKey, new WeakRef(session))
 | 
			
		||||
      this._sessionRegistry.register(session, sessionKey)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
} else {
 | 
			
		||||
  SessionCache = class SimpleSessionCache {
 | 
			
		||||
    constructor (maxCachedSessions) {
 | 
			
		||||
      this._maxCachedSessions = maxCachedSessions
 | 
			
		||||
      this._sessionCache = new Map()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    get (sessionKey) {
 | 
			
		||||
      return this._sessionCache.get(sessionKey)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    set (sessionKey, session) {
 | 
			
		||||
      if (this._maxCachedSessions === 0) {
 | 
			
		||||
        return
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (this._sessionCache.size >= this._maxCachedSessions) {
 | 
			
		||||
        // remove the oldest session
 | 
			
		||||
        const { value: oldestKey } = this._sessionCache.keys().next()
 | 
			
		||||
        this._sessionCache.delete(oldestKey)
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      this._sessionCache.set(sessionKey, session)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function buildConnector ({ allowH2, maxCachedSessions, socketPath, timeout, ...opts }) {
 | 
			
		||||
  if (maxCachedSessions != null && (!Number.isInteger(maxCachedSessions) || maxCachedSessions < 0)) {
 | 
			
		||||
    throw new InvalidArgumentError('maxCachedSessions must be a positive integer or zero')
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const options = { path: socketPath, ...opts }
 | 
			
		||||
  const sessionCache = new SessionCache(maxCachedSessions == null ? 100 : maxCachedSessions)
 | 
			
		||||
  timeout = timeout == null ? 10e3 : timeout
 | 
			
		||||
  allowH2 = allowH2 != null ? allowH2 : false
 | 
			
		||||
  return function connect ({ hostname, host, protocol, port, servername, localAddress, httpSocket }, callback) {
 | 
			
		||||
    let socket
 | 
			
		||||
    if (protocol === 'https:') {
 | 
			
		||||
      if (!tls) {
 | 
			
		||||
        tls = require('tls')
 | 
			
		||||
      }
 | 
			
		||||
      servername = servername || options.servername || util.getServerName(host) || null
 | 
			
		||||
 | 
			
		||||
      const sessionKey = servername || hostname
 | 
			
		||||
      const session = sessionCache.get(sessionKey) || null
 | 
			
		||||
 | 
			
		||||
      assert(sessionKey)
 | 
			
		||||
 | 
			
		||||
      socket = tls.connect({
 | 
			
		||||
        highWaterMark: 16384, // TLS in node can't have bigger HWM anyway...
 | 
			
		||||
        ...options,
 | 
			
		||||
        servername,
 | 
			
		||||
        session,
 | 
			
		||||
        localAddress,
 | 
			
		||||
        // TODO(HTTP/2): Add support for h2c
 | 
			
		||||
        ALPNProtocols: allowH2 ? ['http/1.1', 'h2'] : ['http/1.1'],
 | 
			
		||||
        socket: httpSocket, // upgrade socket connection
 | 
			
		||||
        port: port || 443,
 | 
			
		||||
        host: hostname
 | 
			
		||||
      })
 | 
			
		||||
 | 
			
		||||
      socket
 | 
			
		||||
        .on('session', function (session) {
 | 
			
		||||
          // TODO (fix): Can a session become invalid once established? Don't think so?
 | 
			
		||||
          sessionCache.set(sessionKey, session)
 | 
			
		||||
        })
 | 
			
		||||
    } else {
 | 
			
		||||
      assert(!httpSocket, 'httpSocket can only be sent on TLS update')
 | 
			
		||||
      socket = net.connect({
 | 
			
		||||
        highWaterMark: 64 * 1024, // Same as nodejs fs streams.
 | 
			
		||||
        ...options,
 | 
			
		||||
        localAddress,
 | 
			
		||||
        port: port || 80,
 | 
			
		||||
        host: hostname
 | 
			
		||||
      })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Set TCP keep alive options on the socket here instead of in connect() for the case of assigning the socket
 | 
			
		||||
    if (options.keepAlive == null || options.keepAlive) {
 | 
			
		||||
      const keepAliveInitialDelay = options.keepAliveInitialDelay === undefined ? 60e3 : options.keepAliveInitialDelay
 | 
			
		||||
      socket.setKeepAlive(true, keepAliveInitialDelay)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const cancelTimeout = setupTimeout(() => onConnectTimeout(socket), timeout)
 | 
			
		||||
 | 
			
		||||
    socket
 | 
			
		||||
      .setNoDelay(true)
 | 
			
		||||
      .once(protocol === 'https:' ? 'secureConnect' : 'connect', function () {
 | 
			
		||||
        cancelTimeout()
 | 
			
		||||
 | 
			
		||||
        if (callback) {
 | 
			
		||||
          const cb = callback
 | 
			
		||||
          callback = null
 | 
			
		||||
          cb(null, this)
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
      .on('error', function (err) {
 | 
			
		||||
        cancelTimeout()
 | 
			
		||||
 | 
			
		||||
        if (callback) {
 | 
			
		||||
          const cb = callback
 | 
			
		||||
          callback = null
 | 
			
		||||
          cb(err)
 | 
			
		||||
        }
 | 
			
		||||
      })
 | 
			
		||||
 | 
			
		||||
    return socket
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function setupTimeout (onConnectTimeout, timeout) {
 | 
			
		||||
  if (!timeout) {
 | 
			
		||||
    return () => {}
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  let s1 = null
 | 
			
		||||
  let s2 = null
 | 
			
		||||
  const timeoutId = setTimeout(() => {
 | 
			
		||||
    // setImmediate is added to make sure that we priotorise socket error events over timeouts
 | 
			
		||||
    s1 = setImmediate(() => {
 | 
			
		||||
      if (process.platform === 'win32') {
 | 
			
		||||
        // Windows needs an extra setImmediate probably due to implementation differences in the socket logic
 | 
			
		||||
        s2 = setImmediate(() => onConnectTimeout())
 | 
			
		||||
      } else {
 | 
			
		||||
        onConnectTimeout()
 | 
			
		||||
      }
 | 
			
		||||
    })
 | 
			
		||||
  }, timeout)
 | 
			
		||||
  return () => {
 | 
			
		||||
    clearTimeout(timeoutId)
 | 
			
		||||
    clearImmediate(s1)
 | 
			
		||||
    clearImmediate(s2)
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function onConnectTimeout (socket) {
 | 
			
		||||
  util.destroy(socket, new ConnectTimeoutError())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = buildConnector
 | 
			
		||||
							
								
								
									
										230
									
								
								node_modules/undici/lib/core/errors.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										230
									
								
								node_modules/undici/lib/core/errors.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,230 @@
 | 
			
		|||
'use strict'
 | 
			
		||||
 | 
			
		||||
class UndiciError extends Error {
 | 
			
		||||
  constructor (message) {
 | 
			
		||||
    super(message)
 | 
			
		||||
    this.name = 'UndiciError'
 | 
			
		||||
    this.code = 'UND_ERR'
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class ConnectTimeoutError extends UndiciError {
 | 
			
		||||
  constructor (message) {
 | 
			
		||||
    super(message)
 | 
			
		||||
    Error.captureStackTrace(this, ConnectTimeoutError)
 | 
			
		||||
    this.name = 'ConnectTimeoutError'
 | 
			
		||||
    this.message = message || 'Connect Timeout Error'
 | 
			
		||||
    this.code = 'UND_ERR_CONNECT_TIMEOUT'
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class HeadersTimeoutError extends UndiciError {
 | 
			
		||||
  constructor (message) {
 | 
			
		||||
    super(message)
 | 
			
		||||
    Error.captureStackTrace(this, HeadersTimeoutError)
 | 
			
		||||
    this.name = 'HeadersTimeoutError'
 | 
			
		||||
    this.message = message || 'Headers Timeout Error'
 | 
			
		||||
    this.code = 'UND_ERR_HEADERS_TIMEOUT'
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class HeadersOverflowError extends UndiciError {
 | 
			
		||||
  constructor (message) {
 | 
			
		||||
    super(message)
 | 
			
		||||
    Error.captureStackTrace(this, HeadersOverflowError)
 | 
			
		||||
    this.name = 'HeadersOverflowError'
 | 
			
		||||
    this.message = message || 'Headers Overflow Error'
 | 
			
		||||
    this.code = 'UND_ERR_HEADERS_OVERFLOW'
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class BodyTimeoutError extends UndiciError {
 | 
			
		||||
  constructor (message) {
 | 
			
		||||
    super(message)
 | 
			
		||||
    Error.captureStackTrace(this, BodyTimeoutError)
 | 
			
		||||
    this.name = 'BodyTimeoutError'
 | 
			
		||||
    this.message = message || 'Body Timeout Error'
 | 
			
		||||
    this.code = 'UND_ERR_BODY_TIMEOUT'
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class ResponseStatusCodeError extends UndiciError {
 | 
			
		||||
  constructor (message, statusCode, headers, body) {
 | 
			
		||||
    super(message)
 | 
			
		||||
    Error.captureStackTrace(this, ResponseStatusCodeError)
 | 
			
		||||
    this.name = 'ResponseStatusCodeError'
 | 
			
		||||
    this.message = message || 'Response Status Code Error'
 | 
			
		||||
    this.code = 'UND_ERR_RESPONSE_STATUS_CODE'
 | 
			
		||||
    this.body = body
 | 
			
		||||
    this.status = statusCode
 | 
			
		||||
    this.statusCode = statusCode
 | 
			
		||||
    this.headers = headers
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class InvalidArgumentError extends UndiciError {
 | 
			
		||||
  constructor (message) {
 | 
			
		||||
    super(message)
 | 
			
		||||
    Error.captureStackTrace(this, InvalidArgumentError)
 | 
			
		||||
    this.name = 'InvalidArgumentError'
 | 
			
		||||
    this.message = message || 'Invalid Argument Error'
 | 
			
		||||
    this.code = 'UND_ERR_INVALID_ARG'
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class InvalidReturnValueError extends UndiciError {
 | 
			
		||||
  constructor (message) {
 | 
			
		||||
    super(message)
 | 
			
		||||
    Error.captureStackTrace(this, InvalidReturnValueError)
 | 
			
		||||
    this.name = 'InvalidReturnValueError'
 | 
			
		||||
    this.message = message || 'Invalid Return Value Error'
 | 
			
		||||
    this.code = 'UND_ERR_INVALID_RETURN_VALUE'
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class RequestAbortedError extends UndiciError {
 | 
			
		||||
  constructor (message) {
 | 
			
		||||
    super(message)
 | 
			
		||||
    Error.captureStackTrace(this, RequestAbortedError)
 | 
			
		||||
    this.name = 'AbortError'
 | 
			
		||||
    this.message = message || 'Request aborted'
 | 
			
		||||
    this.code = 'UND_ERR_ABORTED'
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class InformationalError extends UndiciError {
 | 
			
		||||
  constructor (message) {
 | 
			
		||||
    super(message)
 | 
			
		||||
    Error.captureStackTrace(this, InformationalError)
 | 
			
		||||
    this.name = 'InformationalError'
 | 
			
		||||
    this.message = message || 'Request information'
 | 
			
		||||
    this.code = 'UND_ERR_INFO'
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class RequestContentLengthMismatchError extends UndiciError {
 | 
			
		||||
  constructor (message) {
 | 
			
		||||
    super(message)
 | 
			
		||||
    Error.captureStackTrace(this, RequestContentLengthMismatchError)
 | 
			
		||||
    this.name = 'RequestContentLengthMismatchError'
 | 
			
		||||
    this.message = message || 'Request body length does not match content-length header'
 | 
			
		||||
    this.code = 'UND_ERR_REQ_CONTENT_LENGTH_MISMATCH'
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class ResponseContentLengthMismatchError extends UndiciError {
 | 
			
		||||
  constructor (message) {
 | 
			
		||||
    super(message)
 | 
			
		||||
    Error.captureStackTrace(this, ResponseContentLengthMismatchError)
 | 
			
		||||
    this.name = 'ResponseContentLengthMismatchError'
 | 
			
		||||
    this.message = message || 'Response body length does not match content-length header'
 | 
			
		||||
    this.code = 'UND_ERR_RES_CONTENT_LENGTH_MISMATCH'
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class ClientDestroyedError extends UndiciError {
 | 
			
		||||
  constructor (message) {
 | 
			
		||||
    super(message)
 | 
			
		||||
    Error.captureStackTrace(this, ClientDestroyedError)
 | 
			
		||||
    this.name = 'ClientDestroyedError'
 | 
			
		||||
    this.message = message || 'The client is destroyed'
 | 
			
		||||
    this.code = 'UND_ERR_DESTROYED'
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class ClientClosedError extends UndiciError {
 | 
			
		||||
  constructor (message) {
 | 
			
		||||
    super(message)
 | 
			
		||||
    Error.captureStackTrace(this, ClientClosedError)
 | 
			
		||||
    this.name = 'ClientClosedError'
 | 
			
		||||
    this.message = message || 'The client is closed'
 | 
			
		||||
    this.code = 'UND_ERR_CLOSED'
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class SocketError extends UndiciError {
 | 
			
		||||
  constructor (message, socket) {
 | 
			
		||||
    super(message)
 | 
			
		||||
    Error.captureStackTrace(this, SocketError)
 | 
			
		||||
    this.name = 'SocketError'
 | 
			
		||||
    this.message = message || 'Socket error'
 | 
			
		||||
    this.code = 'UND_ERR_SOCKET'
 | 
			
		||||
    this.socket = socket
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class NotSupportedError extends UndiciError {
 | 
			
		||||
  constructor (message) {
 | 
			
		||||
    super(message)
 | 
			
		||||
    Error.captureStackTrace(this, NotSupportedError)
 | 
			
		||||
    this.name = 'NotSupportedError'
 | 
			
		||||
    this.message = message || 'Not supported error'
 | 
			
		||||
    this.code = 'UND_ERR_NOT_SUPPORTED'
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class BalancedPoolMissingUpstreamError extends UndiciError {
 | 
			
		||||
  constructor (message) {
 | 
			
		||||
    super(message)
 | 
			
		||||
    Error.captureStackTrace(this, NotSupportedError)
 | 
			
		||||
    this.name = 'MissingUpstreamError'
 | 
			
		||||
    this.message = message || 'No upstream has been added to the BalancedPool'
 | 
			
		||||
    this.code = 'UND_ERR_BPL_MISSING_UPSTREAM'
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class HTTPParserError extends Error {
 | 
			
		||||
  constructor (message, code, data) {
 | 
			
		||||
    super(message)
 | 
			
		||||
    Error.captureStackTrace(this, HTTPParserError)
 | 
			
		||||
    this.name = 'HTTPParserError'
 | 
			
		||||
    this.code = code ? `HPE_${code}` : undefined
 | 
			
		||||
    this.data = data ? data.toString() : undefined
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class ResponseExceededMaxSizeError extends UndiciError {
 | 
			
		||||
  constructor (message) {
 | 
			
		||||
    super(message)
 | 
			
		||||
    Error.captureStackTrace(this, ResponseExceededMaxSizeError)
 | 
			
		||||
    this.name = 'ResponseExceededMaxSizeError'
 | 
			
		||||
    this.message = message || 'Response content exceeded max size'
 | 
			
		||||
    this.code = 'UND_ERR_RES_EXCEEDED_MAX_SIZE'
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class RequestRetryError extends UndiciError {
 | 
			
		||||
  constructor (message, code, { headers, data }) {
 | 
			
		||||
    super(message)
 | 
			
		||||
    Error.captureStackTrace(this, RequestRetryError)
 | 
			
		||||
    this.name = 'RequestRetryError'
 | 
			
		||||
    this.message = message || 'Request retry error'
 | 
			
		||||
    this.code = 'UND_ERR_REQ_RETRY'
 | 
			
		||||
    this.statusCode = code
 | 
			
		||||
    this.data = data
 | 
			
		||||
    this.headers = headers
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
  HTTPParserError,
 | 
			
		||||
  UndiciError,
 | 
			
		||||
  HeadersTimeoutError,
 | 
			
		||||
  HeadersOverflowError,
 | 
			
		||||
  BodyTimeoutError,
 | 
			
		||||
  RequestContentLengthMismatchError,
 | 
			
		||||
  ConnectTimeoutError,
 | 
			
		||||
  ResponseStatusCodeError,
 | 
			
		||||
  InvalidArgumentError,
 | 
			
		||||
  InvalidReturnValueError,
 | 
			
		||||
  RequestAbortedError,
 | 
			
		||||
  ClientDestroyedError,
 | 
			
		||||
  ClientClosedError,
 | 
			
		||||
  InformationalError,
 | 
			
		||||
  SocketError,
 | 
			
		||||
  NotSupportedError,
 | 
			
		||||
  ResponseContentLengthMismatchError,
 | 
			
		||||
  BalancedPoolMissingUpstreamError,
 | 
			
		||||
  ResponseExceededMaxSizeError,
 | 
			
		||||
  RequestRetryError
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										499
									
								
								node_modules/undici/lib/core/request.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										499
									
								
								node_modules/undici/lib/core/request.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,499 @@
 | 
			
		|||
'use strict'
 | 
			
		||||
 | 
			
		||||
const {
 | 
			
		||||
  InvalidArgumentError,
 | 
			
		||||
  NotSupportedError
 | 
			
		||||
} = require('./errors')
 | 
			
		||||
const assert = require('assert')
 | 
			
		||||
const { kHTTP2BuildRequest, kHTTP2CopyHeaders, kHTTP1BuildRequest } = require('./symbols')
 | 
			
		||||
const util = require('./util')
 | 
			
		||||
 | 
			
		||||
// tokenRegExp and headerCharRegex have been lifted from
 | 
			
		||||
// https://github.com/nodejs/node/blob/main/lib/_http_common.js
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Verifies that the given val is a valid HTTP token
 | 
			
		||||
 * per the rules defined in RFC 7230
 | 
			
		||||
 * See https://tools.ietf.org/html/rfc7230#section-3.2.6
 | 
			
		||||
 */
 | 
			
		||||
const tokenRegExp = /^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Matches if val contains an invalid field-vchar
 | 
			
		||||
 *  field-value    = *( field-content / obs-fold )
 | 
			
		||||
 *  field-content  = field-vchar [ 1*( SP / HTAB ) field-vchar ]
 | 
			
		||||
 *  field-vchar    = VCHAR / obs-text
 | 
			
		||||
 */
 | 
			
		||||
const headerCharRegex = /[^\t\x20-\x7e\x80-\xff]/
 | 
			
		||||
 | 
			
		||||
// Verifies that a given path is valid does not contain control chars \x00 to \x20
 | 
			
		||||
const invalidPathRegex = /[^\u0021-\u00ff]/
 | 
			
		||||
 | 
			
		||||
const kHandler = Symbol('handler')
 | 
			
		||||
 | 
			
		||||
const channels = {}
 | 
			
		||||
 | 
			
		||||
let extractBody
 | 
			
		||||
 | 
			
		||||
try {
 | 
			
		||||
  const diagnosticsChannel = require('diagnostics_channel')
 | 
			
		||||
  channels.create = diagnosticsChannel.channel('undici:request:create')
 | 
			
		||||
  channels.bodySent = diagnosticsChannel.channel('undici:request:bodySent')
 | 
			
		||||
  channels.headers = diagnosticsChannel.channel('undici:request:headers')
 | 
			
		||||
  channels.trailers = diagnosticsChannel.channel('undici:request:trailers')
 | 
			
		||||
  channels.error = diagnosticsChannel.channel('undici:request:error')
 | 
			
		||||
} catch {
 | 
			
		||||
  channels.create = { hasSubscribers: false }
 | 
			
		||||
  channels.bodySent = { hasSubscribers: false }
 | 
			
		||||
  channels.headers = { hasSubscribers: false }
 | 
			
		||||
  channels.trailers = { hasSubscribers: false }
 | 
			
		||||
  channels.error = { hasSubscribers: false }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class Request {
 | 
			
		||||
  constructor (origin, {
 | 
			
		||||
    path,
 | 
			
		||||
    method,
 | 
			
		||||
    body,
 | 
			
		||||
    headers,
 | 
			
		||||
    query,
 | 
			
		||||
    idempotent,
 | 
			
		||||
    blocking,
 | 
			
		||||
    upgrade,
 | 
			
		||||
    headersTimeout,
 | 
			
		||||
    bodyTimeout,
 | 
			
		||||
    reset,
 | 
			
		||||
    throwOnError,
 | 
			
		||||
    expectContinue
 | 
			
		||||
  }, handler) {
 | 
			
		||||
    if (typeof path !== 'string') {
 | 
			
		||||
      throw new InvalidArgumentError('path must be a string')
 | 
			
		||||
    } else if (
 | 
			
		||||
      path[0] !== '/' &&
 | 
			
		||||
      !(path.startsWith('http://') || path.startsWith('https://')) &&
 | 
			
		||||
      method !== 'CONNECT'
 | 
			
		||||
    ) {
 | 
			
		||||
      throw new InvalidArgumentError('path must be an absolute URL or start with a slash')
 | 
			
		||||
    } else if (invalidPathRegex.exec(path) !== null) {
 | 
			
		||||
      throw new InvalidArgumentError('invalid request path')
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (typeof method !== 'string') {
 | 
			
		||||
      throw new InvalidArgumentError('method must be a string')
 | 
			
		||||
    } else if (tokenRegExp.exec(method) === null) {
 | 
			
		||||
      throw new InvalidArgumentError('invalid request method')
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (upgrade && typeof upgrade !== 'string') {
 | 
			
		||||
      throw new InvalidArgumentError('upgrade must be a string')
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (headersTimeout != null && (!Number.isFinite(headersTimeout) || headersTimeout < 0)) {
 | 
			
		||||
      throw new InvalidArgumentError('invalid headersTimeout')
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (bodyTimeout != null && (!Number.isFinite(bodyTimeout) || bodyTimeout < 0)) {
 | 
			
		||||
      throw new InvalidArgumentError('invalid bodyTimeout')
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (reset != null && typeof reset !== 'boolean') {
 | 
			
		||||
      throw new InvalidArgumentError('invalid reset')
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (expectContinue != null && typeof expectContinue !== 'boolean') {
 | 
			
		||||
      throw new InvalidArgumentError('invalid expectContinue')
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    this.headersTimeout = headersTimeout
 | 
			
		||||
 | 
			
		||||
    this.bodyTimeout = bodyTimeout
 | 
			
		||||
 | 
			
		||||
    this.throwOnError = throwOnError === true
 | 
			
		||||
 | 
			
		||||
    this.method = method
 | 
			
		||||
 | 
			
		||||
    this.abort = null
 | 
			
		||||
 | 
			
		||||
    if (body == null) {
 | 
			
		||||
      this.body = null
 | 
			
		||||
    } else if (util.isStream(body)) {
 | 
			
		||||
      this.body = body
 | 
			
		||||
 | 
			
		||||
      const rState = this.body._readableState
 | 
			
		||||
      if (!rState || !rState.autoDestroy) {
 | 
			
		||||
        this.endHandler = function autoDestroy () {
 | 
			
		||||
          util.destroy(this)
 | 
			
		||||
        }
 | 
			
		||||
        this.body.on('end', this.endHandler)
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      this.errorHandler = err => {
 | 
			
		||||
        if (this.abort) {
 | 
			
		||||
          this.abort(err)
 | 
			
		||||
        } else {
 | 
			
		||||
          this.error = err
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      this.body.on('error', this.errorHandler)
 | 
			
		||||
    } else if (util.isBuffer(body)) {
 | 
			
		||||
      this.body = body.byteLength ? body : null
 | 
			
		||||
    } else if (ArrayBuffer.isView(body)) {
 | 
			
		||||
      this.body = body.buffer.byteLength ? Buffer.from(body.buffer, body.byteOffset, body.byteLength) : null
 | 
			
		||||
    } else if (body instanceof ArrayBuffer) {
 | 
			
		||||
      this.body = body.byteLength ? Buffer.from(body) : null
 | 
			
		||||
    } else if (typeof body === 'string') {
 | 
			
		||||
      this.body = body.length ? Buffer.from(body) : null
 | 
			
		||||
    } else if (util.isFormDataLike(body) || util.isIterable(body) || util.isBlobLike(body)) {
 | 
			
		||||
      this.body = body
 | 
			
		||||
    } else {
 | 
			
		||||
      throw new InvalidArgumentError('body must be a string, a Buffer, a Readable stream, an iterable, or an async iterable')
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    this.completed = false
 | 
			
		||||
 | 
			
		||||
    this.aborted = false
 | 
			
		||||
 | 
			
		||||
    this.upgrade = upgrade || null
 | 
			
		||||
 | 
			
		||||
    this.path = query ? util.buildURL(path, query) : path
 | 
			
		||||
 | 
			
		||||
    this.origin = origin
 | 
			
		||||
 | 
			
		||||
    this.idempotent = idempotent == null
 | 
			
		||||
      ? method === 'HEAD' || method === 'GET'
 | 
			
		||||
      : idempotent
 | 
			
		||||
 | 
			
		||||
    this.blocking = blocking == null ? false : blocking
 | 
			
		||||
 | 
			
		||||
    this.reset = reset == null ? null : reset
 | 
			
		||||
 | 
			
		||||
    this.host = null
 | 
			
		||||
 | 
			
		||||
    this.contentLength = null
 | 
			
		||||
 | 
			
		||||
    this.contentType = null
 | 
			
		||||
 | 
			
		||||
    this.headers = ''
 | 
			
		||||
 | 
			
		||||
    // Only for H2
 | 
			
		||||
    this.expectContinue = expectContinue != null ? expectContinue : false
 | 
			
		||||
 | 
			
		||||
    if (Array.isArray(headers)) {
 | 
			
		||||
      if (headers.length % 2 !== 0) {
 | 
			
		||||
        throw new InvalidArgumentError('headers array must be even')
 | 
			
		||||
      }
 | 
			
		||||
      for (let i = 0; i < headers.length; i += 2) {
 | 
			
		||||
        processHeader(this, headers[i], headers[i + 1])
 | 
			
		||||
      }
 | 
			
		||||
    } else if (headers && typeof headers === 'object') {
 | 
			
		||||
      const keys = Object.keys(headers)
 | 
			
		||||
      for (let i = 0; i < keys.length; i++) {
 | 
			
		||||
        const key = keys[i]
 | 
			
		||||
        processHeader(this, key, headers[key])
 | 
			
		||||
      }
 | 
			
		||||
    } else if (headers != null) {
 | 
			
		||||
      throw new InvalidArgumentError('headers must be an object or an array')
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (util.isFormDataLike(this.body)) {
 | 
			
		||||
      if (util.nodeMajor < 16 || (util.nodeMajor === 16 && util.nodeMinor < 8)) {
 | 
			
		||||
        throw new InvalidArgumentError('Form-Data bodies are only supported in node v16.8 and newer.')
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (!extractBody) {
 | 
			
		||||
        extractBody = require('../fetch/body.js').extractBody
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      const [bodyStream, contentType] = extractBody(body)
 | 
			
		||||
      if (this.contentType == null) {
 | 
			
		||||
        this.contentType = contentType
 | 
			
		||||
        this.headers += `content-type: ${contentType}\r\n`
 | 
			
		||||
      }
 | 
			
		||||
      this.body = bodyStream.stream
 | 
			
		||||
      this.contentLength = bodyStream.length
 | 
			
		||||
    } else if (util.isBlobLike(body) && this.contentType == null && body.type) {
 | 
			
		||||
      this.contentType = body.type
 | 
			
		||||
      this.headers += `content-type: ${body.type}\r\n`
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    util.validateHandler(handler, method, upgrade)
 | 
			
		||||
 | 
			
		||||
    this.servername = util.getServerName(this.host)
 | 
			
		||||
 | 
			
		||||
    this[kHandler] = handler
 | 
			
		||||
 | 
			
		||||
    if (channels.create.hasSubscribers) {
 | 
			
		||||
      channels.create.publish({ request: this })
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  onBodySent (chunk) {
 | 
			
		||||
    if (this[kHandler].onBodySent) {
 | 
			
		||||
      try {
 | 
			
		||||
        return this[kHandler].onBodySent(chunk)
 | 
			
		||||
      } catch (err) {
 | 
			
		||||
        this.abort(err)
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  onRequestSent () {
 | 
			
		||||
    if (channels.bodySent.hasSubscribers) {
 | 
			
		||||
      channels.bodySent.publish({ request: this })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (this[kHandler].onRequestSent) {
 | 
			
		||||
      try {
 | 
			
		||||
        return this[kHandler].onRequestSent()
 | 
			
		||||
      } catch (err) {
 | 
			
		||||
        this.abort(err)
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  onConnect (abort) {
 | 
			
		||||
    assert(!this.aborted)
 | 
			
		||||
    assert(!this.completed)
 | 
			
		||||
 | 
			
		||||
    if (this.error) {
 | 
			
		||||
      abort(this.error)
 | 
			
		||||
    } else {
 | 
			
		||||
      this.abort = abort
 | 
			
		||||
      return this[kHandler].onConnect(abort)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  onHeaders (statusCode, headers, resume, statusText) {
 | 
			
		||||
    assert(!this.aborted)
 | 
			
		||||
    assert(!this.completed)
 | 
			
		||||
 | 
			
		||||
    if (channels.headers.hasSubscribers) {
 | 
			
		||||
      channels.headers.publish({ request: this, response: { statusCode, headers, statusText } })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    try {
 | 
			
		||||
      return this[kHandler].onHeaders(statusCode, headers, resume, statusText)
 | 
			
		||||
    } catch (err) {
 | 
			
		||||
      this.abort(err)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  onData (chunk) {
 | 
			
		||||
    assert(!this.aborted)
 | 
			
		||||
    assert(!this.completed)
 | 
			
		||||
 | 
			
		||||
    try {
 | 
			
		||||
      return this[kHandler].onData(chunk)
 | 
			
		||||
    } catch (err) {
 | 
			
		||||
      this.abort(err)
 | 
			
		||||
      return false
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  onUpgrade (statusCode, headers, socket) {
 | 
			
		||||
    assert(!this.aborted)
 | 
			
		||||
    assert(!this.completed)
 | 
			
		||||
 | 
			
		||||
    return this[kHandler].onUpgrade(statusCode, headers, socket)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  onComplete (trailers) {
 | 
			
		||||
    this.onFinally()
 | 
			
		||||
 | 
			
		||||
    assert(!this.aborted)
 | 
			
		||||
 | 
			
		||||
    this.completed = true
 | 
			
		||||
    if (channels.trailers.hasSubscribers) {
 | 
			
		||||
      channels.trailers.publish({ request: this, trailers })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    try {
 | 
			
		||||
      return this[kHandler].onComplete(trailers)
 | 
			
		||||
    } catch (err) {
 | 
			
		||||
      // TODO (fix): This might be a bad idea?
 | 
			
		||||
      this.onError(err)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  onError (error) {
 | 
			
		||||
    this.onFinally()
 | 
			
		||||
 | 
			
		||||
    if (channels.error.hasSubscribers) {
 | 
			
		||||
      channels.error.publish({ request: this, error })
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (this.aborted) {
 | 
			
		||||
      return
 | 
			
		||||
    }
 | 
			
		||||
    this.aborted = true
 | 
			
		||||
 | 
			
		||||
    return this[kHandler].onError(error)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  onFinally () {
 | 
			
		||||
    if (this.errorHandler) {
 | 
			
		||||
      this.body.off('error', this.errorHandler)
 | 
			
		||||
      this.errorHandler = null
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (this.endHandler) {
 | 
			
		||||
      this.body.off('end', this.endHandler)
 | 
			
		||||
      this.endHandler = null
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // TODO: adjust to support H2
 | 
			
		||||
  addHeader (key, value) {
 | 
			
		||||
    processHeader(this, key, value)
 | 
			
		||||
    return this
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static [kHTTP1BuildRequest] (origin, opts, handler) {
 | 
			
		||||
    // TODO: Migrate header parsing here, to make Requests
 | 
			
		||||
    // HTTP agnostic
 | 
			
		||||
    return new Request(origin, opts, handler)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static [kHTTP2BuildRequest] (origin, opts, handler) {
 | 
			
		||||
    const headers = opts.headers
 | 
			
		||||
    opts = { ...opts, headers: null }
 | 
			
		||||
 | 
			
		||||
    const request = new Request(origin, opts, handler)
 | 
			
		||||
 | 
			
		||||
    request.headers = {}
 | 
			
		||||
 | 
			
		||||
    if (Array.isArray(headers)) {
 | 
			
		||||
      if (headers.length % 2 !== 0) {
 | 
			
		||||
        throw new InvalidArgumentError('headers array must be even')
 | 
			
		||||
      }
 | 
			
		||||
      for (let i = 0; i < headers.length; i += 2) {
 | 
			
		||||
        processHeader(request, headers[i], headers[i + 1], true)
 | 
			
		||||
      }
 | 
			
		||||
    } else if (headers && typeof headers === 'object') {
 | 
			
		||||
      const keys = Object.keys(headers)
 | 
			
		||||
      for (let i = 0; i < keys.length; i++) {
 | 
			
		||||
        const key = keys[i]
 | 
			
		||||
        processHeader(request, key, headers[key], true)
 | 
			
		||||
      }
 | 
			
		||||
    } else if (headers != null) {
 | 
			
		||||
      throw new InvalidArgumentError('headers must be an object or an array')
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return request
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static [kHTTP2CopyHeaders] (raw) {
 | 
			
		||||
    const rawHeaders = raw.split('\r\n')
 | 
			
		||||
    const headers = {}
 | 
			
		||||
 | 
			
		||||
    for (const header of rawHeaders) {
 | 
			
		||||
      const [key, value] = header.split(': ')
 | 
			
		||||
 | 
			
		||||
      if (value == null || value.length === 0) continue
 | 
			
		||||
 | 
			
		||||
      if (headers[key]) headers[key] += `,${value}`
 | 
			
		||||
      else headers[key] = value
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return headers
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function processHeaderValue (key, val, skipAppend) {
 | 
			
		||||
  if (val && typeof val === 'object') {
 | 
			
		||||
    throw new InvalidArgumentError(`invalid ${key} header`)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  val = val != null ? `${val}` : ''
 | 
			
		||||
 | 
			
		||||
  if (headerCharRegex.exec(val) !== null) {
 | 
			
		||||
    throw new InvalidArgumentError(`invalid ${key} header`)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return skipAppend ? val : `${key}: ${val}\r\n`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function processHeader (request, key, val, skipAppend = false) {
 | 
			
		||||
  if (val && (typeof val === 'object' && !Array.isArray(val))) {
 | 
			
		||||
    throw new InvalidArgumentError(`invalid ${key} header`)
 | 
			
		||||
  } else if (val === undefined) {
 | 
			
		||||
    return
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (
 | 
			
		||||
    request.host === null &&
 | 
			
		||||
    key.length === 4 &&
 | 
			
		||||
    key.toLowerCase() === 'host'
 | 
			
		||||
  ) {
 | 
			
		||||
    if (headerCharRegex.exec(val) !== null) {
 | 
			
		||||
      throw new InvalidArgumentError(`invalid ${key} header`)
 | 
			
		||||
    }
 | 
			
		||||
    // Consumed by Client
 | 
			
		||||
    request.host = val
 | 
			
		||||
  } else if (
 | 
			
		||||
    request.contentLength === null &&
 | 
			
		||||
    key.length === 14 &&
 | 
			
		||||
    key.toLowerCase() === 'content-length'
 | 
			
		||||
  ) {
 | 
			
		||||
    request.contentLength = parseInt(val, 10)
 | 
			
		||||
    if (!Number.isFinite(request.contentLength)) {
 | 
			
		||||
      throw new InvalidArgumentError('invalid content-length header')
 | 
			
		||||
    }
 | 
			
		||||
  } else if (
 | 
			
		||||
    request.contentType === null &&
 | 
			
		||||
    key.length === 12 &&
 | 
			
		||||
    key.toLowerCase() === 'content-type'
 | 
			
		||||
  ) {
 | 
			
		||||
    request.contentType = val
 | 
			
		||||
    if (skipAppend) request.headers[key] = processHeaderValue(key, val, skipAppend)
 | 
			
		||||
    else request.headers += processHeaderValue(key, val)
 | 
			
		||||
  } else if (
 | 
			
		||||
    key.length === 17 &&
 | 
			
		||||
    key.toLowerCase() === 'transfer-encoding'
 | 
			
		||||
  ) {
 | 
			
		||||
    throw new InvalidArgumentError('invalid transfer-encoding header')
 | 
			
		||||
  } else if (
 | 
			
		||||
    key.length === 10 &&
 | 
			
		||||
    key.toLowerCase() === 'connection'
 | 
			
		||||
  ) {
 | 
			
		||||
    const value = typeof val === 'string' ? val.toLowerCase() : null
 | 
			
		||||
    if (value !== 'close' && value !== 'keep-alive') {
 | 
			
		||||
      throw new InvalidArgumentError('invalid connection header')
 | 
			
		||||
    } else if (value === 'close') {
 | 
			
		||||
      request.reset = true
 | 
			
		||||
    }
 | 
			
		||||
  } else if (
 | 
			
		||||
    key.length === 10 &&
 | 
			
		||||
    key.toLowerCase() === 'keep-alive'
 | 
			
		||||
  ) {
 | 
			
		||||
    throw new InvalidArgumentError('invalid keep-alive header')
 | 
			
		||||
  } else if (
 | 
			
		||||
    key.length === 7 &&
 | 
			
		||||
    key.toLowerCase() === 'upgrade'
 | 
			
		||||
  ) {
 | 
			
		||||
    throw new InvalidArgumentError('invalid upgrade header')
 | 
			
		||||
  } else if (
 | 
			
		||||
    key.length === 6 &&
 | 
			
		||||
    key.toLowerCase() === 'expect'
 | 
			
		||||
  ) {
 | 
			
		||||
    throw new NotSupportedError('expect header not supported')
 | 
			
		||||
  } else if (tokenRegExp.exec(key) === null) {
 | 
			
		||||
    throw new InvalidArgumentError('invalid header key')
 | 
			
		||||
  } else {
 | 
			
		||||
    if (Array.isArray(val)) {
 | 
			
		||||
      for (let i = 0; i < val.length; i++) {
 | 
			
		||||
        if (skipAppend) {
 | 
			
		||||
          if (request.headers[key]) request.headers[key] += `,${processHeaderValue(key, val[i], skipAppend)}`
 | 
			
		||||
          else request.headers[key] = processHeaderValue(key, val[i], skipAppend)
 | 
			
		||||
        } else {
 | 
			
		||||
          request.headers += processHeaderValue(key, val[i])
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    } else {
 | 
			
		||||
      if (skipAppend) request.headers[key] = processHeaderValue(key, val, skipAppend)
 | 
			
		||||
      else request.headers += processHeaderValue(key, val)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = Request
 | 
			
		||||
							
								
								
									
										63
									
								
								node_modules/undici/lib/core/symbols.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								node_modules/undici/lib/core/symbols.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,63 @@
 | 
			
		|||
module.exports = {
 | 
			
		||||
  kClose: Symbol('close'),
 | 
			
		||||
  kDestroy: Symbol('destroy'),
 | 
			
		||||
  kDispatch: Symbol('dispatch'),
 | 
			
		||||
  kUrl: Symbol('url'),
 | 
			
		||||
  kWriting: Symbol('writing'),
 | 
			
		||||
  kResuming: Symbol('resuming'),
 | 
			
		||||
  kQueue: Symbol('queue'),
 | 
			
		||||
  kConnect: Symbol('connect'),
 | 
			
		||||
  kConnecting: Symbol('connecting'),
 | 
			
		||||
  kHeadersList: Symbol('headers list'),
 | 
			
		||||
  kKeepAliveDefaultTimeout: Symbol('default keep alive timeout'),
 | 
			
		||||
  kKeepAliveMaxTimeout: Symbol('max keep alive timeout'),
 | 
			
		||||
  kKeepAliveTimeoutThreshold: Symbol('keep alive timeout threshold'),
 | 
			
		||||
  kKeepAliveTimeoutValue: Symbol('keep alive timeout'),
 | 
			
		||||
  kKeepAlive: Symbol('keep alive'),
 | 
			
		||||
  kHeadersTimeout: Symbol('headers timeout'),
 | 
			
		||||
  kBodyTimeout: Symbol('body timeout'),
 | 
			
		||||
  kServerName: Symbol('server name'),
 | 
			
		||||
  kLocalAddress: Symbol('local address'),
 | 
			
		||||
  kHost: Symbol('host'),
 | 
			
		||||
  kNoRef: Symbol('no ref'),
 | 
			
		||||
  kBodyUsed: Symbol('used'),
 | 
			
		||||
  kRunning: Symbol('running'),
 | 
			
		||||
  kBlocking: Symbol('blocking'),
 | 
			
		||||
  kPending: Symbol('pending'),
 | 
			
		||||
  kSize: Symbol('size'),
 | 
			
		||||
  kBusy: Symbol('busy'),
 | 
			
		||||
  kQueued: Symbol('queued'),
 | 
			
		||||
  kFree: Symbol('free'),
 | 
			
		||||
  kConnected: Symbol('connected'),
 | 
			
		||||
  kClosed: Symbol('closed'),
 | 
			
		||||
  kNeedDrain: Symbol('need drain'),
 | 
			
		||||
  kReset: Symbol('reset'),
 | 
			
		||||
  kDestroyed: Symbol.for('nodejs.stream.destroyed'),
 | 
			
		||||
  kMaxHeadersSize: Symbol('max headers size'),
 | 
			
		||||
  kRunningIdx: Symbol('running index'),
 | 
			
		||||
  kPendingIdx: Symbol('pending index'),
 | 
			
		||||
  kError: Symbol('error'),
 | 
			
		||||
  kClients: Symbol('clients'),
 | 
			
		||||
  kClient: Symbol('client'),
 | 
			
		||||
  kParser: Symbol('parser'),
 | 
			
		||||
  kOnDestroyed: Symbol('destroy callbacks'),
 | 
			
		||||
  kPipelining: Symbol('pipelining'),
 | 
			
		||||
  kSocket: Symbol('socket'),
 | 
			
		||||
  kHostHeader: Symbol('host header'),
 | 
			
		||||
  kConnector: Symbol('connector'),
 | 
			
		||||
  kStrictContentLength: Symbol('strict content length'),
 | 
			
		||||
  kMaxRedirections: Symbol('maxRedirections'),
 | 
			
		||||
  kMaxRequests: Symbol('maxRequestsPerClient'),
 | 
			
		||||
  kProxy: Symbol('proxy agent options'),
 | 
			
		||||
  kCounter: Symbol('socket request counter'),
 | 
			
		||||
  kInterceptors: Symbol('dispatch interceptors'),
 | 
			
		||||
  kMaxResponseSize: Symbol('max response size'),
 | 
			
		||||
  kHTTP2Session: Symbol('http2Session'),
 | 
			
		||||
  kHTTP2SessionState: Symbol('http2Session state'),
 | 
			
		||||
  kHTTP2BuildRequest: Symbol('http2 build request'),
 | 
			
		||||
  kHTTP1BuildRequest: Symbol('http1 build request'),
 | 
			
		||||
  kHTTP2CopyHeaders: Symbol('http2 copy headers'),
 | 
			
		||||
  kHTTPConnVersion: Symbol('http connection version'),
 | 
			
		||||
  kRetryHandlerDefaultRetry: Symbol('retry agent default retry'),
 | 
			
		||||
  kConstruct: Symbol('constructable')
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										511
									
								
								node_modules/undici/lib/core/util.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										511
									
								
								node_modules/undici/lib/core/util.js
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,511 @@
 | 
			
		|||
'use strict'
 | 
			
		||||
 | 
			
		||||
const assert = require('assert')
 | 
			
		||||
const { kDestroyed, kBodyUsed } = require('./symbols')
 | 
			
		||||
const { IncomingMessage } = require('http')
 | 
			
		||||
const stream = require('stream')
 | 
			
		||||
const net = require('net')
 | 
			
		||||
const { InvalidArgumentError } = require('./errors')
 | 
			
		||||
const { Blob } = require('buffer')
 | 
			
		||||
const nodeUtil = require('util')
 | 
			
		||||
const { stringify } = require('querystring')
 | 
			
		||||
 | 
			
		||||
const [nodeMajor, nodeMinor] = process.versions.node.split('.').map(v => Number(v))
 | 
			
		||||
 | 
			
		||||
function nop () {}
 | 
			
		||||
 | 
			
		||||
function isStream (obj) {
 | 
			
		||||
  return obj && typeof obj === 'object' && typeof obj.pipe === 'function' && typeof obj.on === 'function'
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// based on https://github.com/node-fetch/fetch-blob/blob/8ab587d34080de94140b54f07168451e7d0b655e/index.js#L229-L241 (MIT License)
 | 
			
		||||
function isBlobLike (object) {
 | 
			
		||||
  return (Blob && object instanceof Blob) || (
 | 
			
		||||
    object &&
 | 
			
		||||
    typeof object === 'object' &&
 | 
			
		||||
    (typeof object.stream === 'function' ||
 | 
			
		||||
      typeof object.arrayBuffer === 'function') &&
 | 
			
		||||
    /^(Blob|File)$/.test(object[Symbol.toStringTag])
 | 
			
		||||
  )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function buildURL (url, queryParams) {
 | 
			
		||||
  if (url.includes('?') || url.includes('#')) {
 | 
			
		||||
    throw new Error('Query params cannot be passed when url already contains "?" or "#".')
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const stringified = stringify(queryParams)
 | 
			
		||||
 | 
			
		||||
  if (stringified) {
 | 
			
		||||
    url += '?' + stringified
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return url
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function parseURL (url) {
 | 
			
		||||
  if (typeof url === 'string') {
 | 
			
		||||
    url = new URL(url)
 | 
			
		||||
 | 
			
		||||
    if (!/^https?:/.test(url.origin || url.protocol)) {
 | 
			
		||||
      throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.')
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return url
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (!url || typeof url !== 'object') {
 | 
			
		||||
    throw new InvalidArgumentError('Invalid URL: The URL argument must be a non-null object.')
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (!/^https?:/.test(url.origin || url.protocol)) {
 | 
			
		||||
    throw new InvalidArgumentError('Invalid URL protocol: the URL must start with `http:` or `https:`.')
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (!(url instanceof URL)) {
 | 
			
		||||
    if (url.port != null && url.port !== '' && !Number.isFinite(parseInt(url.port))) {
 | 
			
		||||
      throw new InvalidArgumentError('Invalid URL: port must be a valid integer or a string representation of an integer.')
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (url.path != null && typeof url.path !== 'string') {
 | 
			
		||||
      throw new InvalidArgumentError('Invalid URL path: the path must be a string or null/undefined.')
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (url.pathname != null && typeof url.pathname !== 'string') {
 | 
			
		||||
      throw new InvalidArgumentError('Invalid URL pathname: the pathname must be a string or null/undefined.')
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (url.hostname != null && typeof url.hostname !== 'string') {
 | 
			
		||||
      throw new InvalidArgumentError('Invalid URL hostname: the hostname must be a string or null/undefined.')
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (url.origin != null && typeof url.origin !== 'string') {
 | 
			
		||||
      throw new InvalidArgumentError('Invalid URL origin: the origin must be a string or null/undefined.')
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const port = url.port != null
 | 
			
		||||
      ? url.port
 | 
			
		||||
      : (url.protocol === 'https:' ? 443 : 80)
 | 
			
		||||
    let origin = url.origin != null
 | 
			
		||||
      ? url.origin
 | 
			
		||||
      : `${url.protocol}//${url.hostname}:${port}`
 | 
			
		||||
    let path = url.path != null
 | 
			
		||||
      ? url.path
 | 
			
		||||
      : `${url.pathname || ''}${url.search || ''}`
 | 
			
		||||
 | 
			
		||||
    if (origin.endsWith('/')) {
 | 
			
		||||
      origin = origin.substring(0, origin.length - 1)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (path && !path.startsWith('/')) {
 | 
			
		||||
      path = `/${path}`
 | 
			
		||||
    }
 | 
			
		||||
    // new URL(path, origin) is unsafe when `path` contains an absolute URL
 | 
			
		||||
    // From https://developer.mozilla.org/en-US/docs/Web/API/URL/URL:
 | 
			
		||||
    // If first parameter is a relative URL, second param is required, and will be used as the base URL.
 | 
			
		||||
    // If first parameter is an absolute URL, a given second param will be ignored.
 | 
			
		||||
    url = new URL(origin + path)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return url
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function parseOrigin (url) {
 | 
			
		||||
  url = parseURL(url)
 | 
			
		||||
 | 
			
		||||
  if (url.pathname !== '/' || url.search || url.hash) {
 | 
			
		||||
    throw new InvalidArgumentError('invalid url')
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return url
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function getHostname (host) {
 | 
			
		||||
  if (host[0] === '[') {
 | 
			
		||||
    const idx = host.indexOf(']')
 | 
			
		||||
 | 
			
		||||
    assert(idx !== -1)
 | 
			
		||||
    return host.substring(1, idx)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const idx = host.indexOf(':')
 | 
			
		||||
  if (idx === -1) return host
 | 
			
		||||
 | 
			
		||||
  return host.substring(0, idx)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// IP addresses are not valid server names per RFC6066
 | 
			
		||||
// > Currently, the only server names supported are DNS hostnames
 | 
			
		||||
function getServerName (host) {
 | 
			
		||||
  if (!host) {
 | 
			
		||||
    return null
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  assert.strictEqual(typeof host, 'string')
 | 
			
		||||
 | 
			
		||||
  const servername = getHostname(host)
 | 
			
		||||
  if (net.isIP(servername)) {
 | 
			
		||||
    return ''
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return servername
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function deepClone (obj) {
 | 
			
		||||
  return JSON.parse(JSON.stringify(obj))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function isAsyncIterable (obj) {
 | 
			
		||||
  return !!(obj != null && typeof obj[Symbol.asyncIterator] === 'function')
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function isIterable (obj) {
 | 
			
		||||
  return !!(obj != null && (typeof obj[Symbol.iterator] === 'function' || typeof obj[Symbol.asyncIterator] === 'function'))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function bodyLength (body) {
 | 
			
		||||
  if (body == null) {
 | 
			
		||||
    return 0
 | 
			
		||||
  } else if (isStream(body)) {
 | 
			
		||||
    const state = body._readableState
 | 
			
		||||
    return state && state.objectMode === false && state.ended === true && Number.isFinite(state.length)
 | 
			
		||||
      ? state.length
 | 
			
		||||
      : null
 | 
			
		||||
  } else if (isBlobLike(body)) {
 | 
			
		||||
    return body.size != null ? body.size : null
 | 
			
		||||
  } else if (isBuffer(body)) {
 | 
			
		||||
    return body.byteLength
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return null
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function isDestroyed (stream) {
 | 
			
		||||
  return !stream || !!(stream.destroyed || stream[kDestroyed])
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function isReadableAborted (stream) {
 | 
			
		||||
  const state = stream && stream._readableState
 | 
			
		||||
  return isDestroyed(stream) && state && !state.endEmitted
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function destroy (stream, err) {
 | 
			
		||||
  if (stream == null || !isStream(stream) || isDestroyed(stream)) {
 | 
			
		||||
    return
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (typeof stream.destroy === 'function') {
 | 
			
		||||
    if (Object.getPrototypeOf(stream).constructor === IncomingMessage) {
 | 
			
		||||
      // See: https://github.com/nodejs/node/pull/38505/files
 | 
			
		||||
      stream.socket = null
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    stream.destroy(err)
 | 
			
		||||
  } else if (err) {
 | 
			
		||||
    process.nextTick((stream, err) => {
 | 
			
		||||
      stream.emit('error', err)
 | 
			
		||||
    }, stream, err)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (stream.destroyed !== true) {
 | 
			
		||||
    stream[kDestroyed] = true
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const KEEPALIVE_TIMEOUT_EXPR = /timeout=(\d+)/
 | 
			
		||||
function parseKeepAliveTimeout (val) {
 | 
			
		||||
  const m = val.toString().match(KEEPALIVE_TIMEOUT_EXPR)
 | 
			
		||||
  return m ? parseInt(m[1], 10) * 1000 : null
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function parseHeaders (headers, obj = {}) {
 | 
			
		||||
  // For H2 support
 | 
			
		||||
  if (!Array.isArray(headers)) return headers
 | 
			
		||||
 | 
			
		||||
  for (let i = 0; i < headers.length; i += 2) {
 | 
			
		||||
    const key = headers[i].toString().toLowerCase()
 | 
			
		||||
    let val = obj[key]
 | 
			
		||||
 | 
			
		||||
    if (!val) {
 | 
			
		||||
      if (Array.isArray(headers[i + 1])) {
 | 
			
		||||
        obj[key] = headers[i + 1].map(x => x.toString('utf8'))
 | 
			
		||||
      } else {
 | 
			
		||||
        obj[key] = headers[i + 1].toString('utf8')
 | 
			
		||||
      }
 | 
			
		||||
    } else {
 | 
			
		||||
      if (!Array.isArray(val)) {
 | 
			
		||||
        val = [val]
 | 
			
		||||
        obj[key] = val
 | 
			
		||||
      }
 | 
			
		||||
      val.push(headers[i + 1].toString('utf8'))
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // See https://github.com/nodejs/node/pull/46528
 | 
			
		||||
  if ('content-length' in obj && 'content-disposition' in obj) {
 | 
			
		||||
    obj['content-disposition'] = Buffer.from(obj['content-disposition']).toString('latin1')
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return obj
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function parseRawHeaders (headers) {
 | 
			
		||||
  const ret = []
 | 
			
		||||
  let hasContentLength = false
 | 
			
		||||
  let contentDispositionIdx = -1
 | 
			
		||||
 | 
			
		||||
  for (let n = 0; n < headers.length; n += 2) {
 | 
			
		||||
    const key = headers[n + 0].toString()
 | 
			
		||||
    const val = headers[n + 1].toString('utf8')
 | 
			
		||||
 | 
			
		||||
    if (key.length === 14 && (key === 'content-length' || key.toLowerCase() === 'content-length')) {
 | 
			
		||||
      ret.push(key, val)
 | 
			
		||||
      hasContentLength = true
 | 
			
		||||
    } else if (key.length === 19 && (key === 'content-disposition' || key.toLowerCase() === 'content-disposition')) {
 | 
			
		||||
      contentDispositionIdx = ret.push(key, val) - 1
 | 
			
		||||
    } else {
 | 
			
		||||
      ret.push(key, val)
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // See https://github.com/nodejs/node/pull/46528
 | 
			
		||||
  if (hasContentLength && contentDispositionIdx !== -1) {
 | 
			
		||||
    ret[contentDispositionIdx] = Buffer.from(ret[contentDispositionIdx]).toString('latin1')
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return ret
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function isBuffer (buffer) {
 | 
			
		||||
  // See, https://github.com/mcollina/undici/pull/319
 | 
			
		||||
  return buffer instanceof Uint8Array || Buffer.isBuffer(buffer)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function validateHandler (handler, method, upgrade) {
 | 
			
		||||
  if (!handler || typeof handler !== 'object') {
 | 
			
		||||
    throw new InvalidArgumentError('handler must be an object')
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (typeof handler.onConnect !== 'function') {
 | 
			
		||||
    throw new InvalidArgumentError('invalid onConnect method')
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (typeof handler.onError !== 'function') {
 | 
			
		||||
    throw new InvalidArgumentError('invalid onError method')
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (typeof handler.onBodySent !== 'function' && handler.onBodySent !== undefined) {
 | 
			
		||||
    throw new InvalidArgumentError('invalid onBodySent method')
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (upgrade || method === 'CONNECT') {
 | 
			
		||||
    if (typeof handler.onUpgrade !== 'function') {
 | 
			
		||||
      throw new InvalidArgumentError('invalid onUpgrade method')
 | 
			
		||||
    }
 | 
			
		||||
  } else {
 | 
			
		||||
    if (typeof handler.onHeaders !== 'function') {
 | 
			
		||||
      throw new InvalidArgumentError('invalid onHeaders method')
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (typeof handler.onData !== 'function') {
 | 
			
		||||
      throw new InvalidArgumentError('invalid onData method')
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (typeof handler.onComplete !== 'function') {
 | 
			
		||||
      throw new InvalidArgumentError('invalid onComplete method')
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// A body is disturbed if it has been read from and it cannot
 | 
			
		||||
// be re-used without losing state or data.
 | 
			
		||||
function isDisturbed (body) {
 | 
			
		||||
  return !!(body && (
 | 
			
		||||
    stream.isDisturbed
 | 
			
		||||
      ? stream.isDisturbed(body) || body[kBodyUsed] // TODO (fix): Why is body[kBodyUsed] needed?
 | 
			
		||||
      : body[kBodyUsed] ||
 | 
			
		||||
        body.readableDidRead ||
 | 
			
		||||
        (body._readableState && body._readableState.dataEmitted) ||
 | 
			
		||||
        isReadableAborted(body)
 | 
			
		||||
  ))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function isErrored (body) {
 | 
			
		||||
  return !!(body && (
 | 
			
		||||
    stream.isErrored
 | 
			
		||||
      ? stream.isErrored(body)
 | 
			
		||||
      : /state: 'errored'/.test(nodeUtil.inspect(body)
 | 
			
		||||
      )))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function isReadable (body) {
 | 
			
		||||
  return !!(body && (
 | 
			
		||||
    stream.isReadable
 | 
			
		||||
      ? stream.isReadable(body)
 | 
			
		||||
      : /state: 'readable'/.test(nodeUtil.inspect(body)
 | 
			
		||||
      )))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function getSocketInfo (socket) {
 | 
			
		||||
  return {
 | 
			
		||||
    localAddress: socket.localAddress,
 | 
			
		||||
    localPort: socket.localPort,
 | 
			
		||||
    remoteAddress: socket.remoteAddress,
 | 
			
		||||
    remotePort: socket.remotePort,
 | 
			
		||||
    remoteFamily: socket.remoteFamily,
 | 
			
		||||
    timeout: socket.timeout,
 | 
			
		||||
    bytesWritten: socket.bytesWritten,
 | 
			
		||||
    bytesRead: socket.bytesRead
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
async function * convertIterableToBuffer (iterable) {
 | 
			
		||||
  for await (const chunk of iterable) {
 | 
			
		||||
    yield Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
let ReadableStream
 | 
			
		||||
function ReadableStreamFrom (iterable) {
 | 
			
		||||
  if (!ReadableStream) {
 | 
			
		||||
    ReadableStream = require('stream/web').ReadableStream
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (ReadableStream.from) {
 | 
			
		||||
    return ReadableStream.from(convertIterableToBuffer(iterable))
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  let iterator
 | 
			
		||||
  return new ReadableStream(
 | 
			
		||||
    {
 | 
			
		||||
      async start () {
 | 
			
		||||
        iterator = iterable[Symbol.asyncIterator]()
 | 
			
		||||
      },
 | 
			
		||||
      async pull (controller) {
 | 
			
		||||
        const { done, value } = await iterator.next()
 | 
			
		||||
        if (done) {
 | 
			
		||||
          queueMicrotask(() => {
 | 
			
		||||
            controller.close()
 | 
			
		||||
          })
 | 
			
		||||
        } else {
 | 
			
		||||
          const buf = Buffer.isBuffer(value) ? value : Buffer.from(value)
 | 
			
		||||
          controller.enqueue(new Uint8Array(buf))
 | 
			
		||||
        }
 | 
			
		||||
        return controller.desiredSize > 0
 | 
			
		||||
      },
 | 
			
		||||
      async cancel (reason) {
 | 
			
		||||
        await iterator.return()
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    0
 | 
			
		||||
  )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// The chunk should be a FormData instance and contains
 | 
			
		||||
// all the required methods.
 | 
			
		||||
function isFormDataLike (object) {
 | 
			
		||||
  return (
 | 
			
		||||
    object &&
 | 
			
		||||
    typeof object === 'object' &&
 | 
			
		||||
    typeof object.append === 'function' &&
 | 
			
		||||
    typeof object.delete === 'function' &&
 | 
			
		||||
    typeof object.get === 'function' &&
 | 
			
		||||
    typeof object.getAll === 'function' &&
 | 
			
		||||
    typeof object.has === 'function' &&
 | 
			
		||||
    typeof object.set === 'function' &&
 | 
			
		||||
    object[Symbol.toStringTag] === 'FormData'
 | 
			
		||||
  )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function throwIfAborted (signal) {
 | 
			
		||||
  if (!signal) { return }
 | 
			
		||||
  if (typeof signal.throwIfAborted === 'function') {
 | 
			
		||||
    signal.throwIfAborted()
 | 
			
		||||
  } else {
 | 
			
		||||
    if (signal.aborted) {
 | 
			
		||||
      // DOMException not available < v17.0.0
 | 
			
		||||
      const err = new Error('The operation was aborted')
 | 
			
		||||
      err.name = 'AbortError'
 | 
			
		||||
      throw err
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function addAbortListener (signal, listener) {
 | 
			
		||||
  if ('addEventListener' in signal) {
 | 
			
		||||
    signal.addEventListener('abort', listener, { once: true })
 | 
			
		||||
    return () => signal.removeEventListener('abort', listener)
 | 
			
		||||
  }
 | 
			
		||||
  signal.addListener('abort', listener)
 | 
			
		||||
  return () => signal.removeListener('abort', listener)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const hasToWellFormed = !!String.prototype.toWellFormed
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @param {string} val
 | 
			
		||||
 */
 | 
			
		||||
function toUSVString (val) {
 | 
			
		||||
  if (hasToWellFormed) {
 | 
			
		||||
    return `${val}`.toWellFormed()
 | 
			
		||||
  } else if (nodeUtil.toUSVString) {
 | 
			
		||||
    return nodeUtil.toUSVString(val)
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return `${val}`
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Parsed accordingly to RFC 9110
 | 
			
		||||
// https://www.rfc-editor.org/rfc/rfc9110#field.content-range
 | 
			
		||||
function parseRangeHeader (range) {
 | 
			
		||||
  if (range == null || range === '') return { start: 0, end: null, size: null }
 | 
			
		||||
 | 
			
		||||
  const m = range ? range.match(/^bytes (\d+)-(\d+)\/(\d+)?$/) : null
 | 
			
		||||
  return m
 | 
			
		||||
    ? {
 | 
			
		||||
        start: parseInt(m[1]),
 | 
			
		||||
        end: m[2] ? parseInt(m[2]) : null,
 | 
			
		||||
        size: m[3] ? parseInt(m[3]) : null
 | 
			
		||||
      }
 | 
			
		||||
    : null
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const kEnumerableProperty = Object.create(null)
 | 
			
		||||
kEnumerableProperty.enumerable = true
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
  kEnumerableProperty,
 | 
			
		||||
  nop,
 | 
			
		||||
  isDisturbed,
 | 
			
		||||
  isErrored,
 | 
			
		||||
  isReadable,
 | 
			
		||||
  toUSVString,
 | 
			
		||||
  isReadableAborted,
 | 
			
		||||
  isBlobLike,
 | 
			
		||||
  parseOrigin,
 | 
			
		||||
  parseURL,
 | 
			
		||||
  getServerName,
 | 
			
		||||
  isStream,
 | 
			
		||||
  isIterable,
 | 
			
		||||
  isAsyncIterable,
 | 
			
		||||
  isDestroyed,
 | 
			
		||||
  parseRawHeaders,
 | 
			
		||||
  parseHeaders,
 | 
			
		||||
  parseKeepAliveTimeout,
 | 
			
		||||
  destroy,
 | 
			
		||||
  bodyLength,
 | 
			
		||||
  deepClone,
 | 
			
		||||
  ReadableStreamFrom,
 | 
			
		||||
  isBuffer,
 | 
			
		||||
  validateHandler,
 | 
			
		||||
  getSocketInfo,
 | 
			
		||||
  isFormDataLike,
 | 
			
		||||
  buildURL,
 | 
			
		||||
  throwIfAborted,
 | 
			
		||||
  addAbortListener,
 | 
			
		||||
  parseRangeHeader,
 | 
			
		||||
  nodeMajor,
 | 
			
		||||
  nodeMinor,
 | 
			
		||||
  nodeHasAutoSelectFamily: nodeMajor > 18 || (nodeMajor === 18 && nodeMinor >= 13),
 | 
			
		||||
  safeHTTPMethods: ['GET', 'HEAD', 'OPTIONS', 'TRACE']
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue