async transportRequest()

in packages/enterprise-search-universal/src/client.ts [85:136]


  async transportRequest<T = unknown>(params: RequestParams, options?: RequestOptions): Promise<T> {
    const requestOptions: RequestInit = {
      method: params.method,
      headers: new Headers({ authorization: this._token }),
      signal: options?.signal
    }

    if (this._metaHeader != null) {
      // @ts-expect-error
      requestOptions.headers.set('x-elastic-client-meta', this._metaHeader)
    }

    if (params.body != null && typeof params.body === 'object') {
      requestOptions.body = JSON.stringify(params.body)
      // @ts-expect-error
      requestOptions.headers.set('content-type', 'application/json')
    }

    for (const header in options?.headers) {
      // @ts-expect-error
      requestOptions.headers.set(header, options.headers[header])
    }

    const url = new URL(params.path, this._url)
    for (const param in params.querystring) {
      if (Array.isArray(params.querystring[param])) {
        for (const element of params.querystring[param]) {
          url.searchParams.append(`${param}[]`, element)
        }
      } else if (typeof params.querystring[param] === 'object' && params.querystring[param] !== null) {
        // it only works for flat objects
        for (const key in params.querystring[param]) {
          url.searchParams.append(`${param}[${key}]`, params.querystring[param][key])
        }
      } else {
        url.searchParams.set(param, params.querystring[param])
      }
    }

    const response = await fetch(url.toString(), requestOptions)
    let body = await response.text()
    if (response.headers.get('content-type')?.includes('json') === true && body !== '') {
      body = JSON.parse(body)
    }

    if (!response.ok) {
      throw new ResponseError('Response error', response.status, body)
    }

    // @ts-expect-error
    return body
  }