UNPKG

cdk-amazon-chime-resources

Version:

![Experimental](https://img.shields.io/badge/experimental-important.svg?style=for-the-badge)

84 lines (83 loc) 3.2 kB
import { HttpResponse } from "@aws-sdk/protocol-http"; import { buildQueryString } from "@aws-sdk/querystring-builder"; import { requestTimeout } from "./request-timeout"; export class FetchHttpHandler { constructor(options) { if (typeof options === "function") { this.configProvider = options().then((opts) => opts || {}); } else { this.config = options ?? {}; this.configProvider = Promise.resolve(this.config); } } destroy() { } async handle(request, { abortSignal } = {}) { if (!this.config) { this.config = await this.configProvider; } const requestTimeoutInMs = this.config.requestTimeout; if (abortSignal?.aborted) { const abortError = new Error("Request aborted"); abortError.name = "AbortError"; return Promise.reject(abortError); } let path = request.path; if (request.query) { const queryString = buildQueryString(request.query); if (queryString) { path += `?${queryString}`; } } const { port, method } = request; const url = `${request.protocol}//${request.hostname}${port ? `:${port}` : ""}${path}`; const body = method === "GET" || method === "HEAD" ? undefined : request.body; const requestOptions = { body, headers: new Headers(request.headers), method: method, }; if (typeof AbortController !== "undefined") { requestOptions["signal"] = abortSignal; } const fetchRequest = new Request(url, requestOptions); const raceOfPromises = [ fetch(fetchRequest).then((response) => { const fetchHeaders = response.headers; const transformedHeaders = {}; for (const pair of fetchHeaders.entries()) { transformedHeaders[pair[0]] = pair[1]; } const hasReadableStream = response.body !== undefined; if (!hasReadableStream) { return response.blob().then((body) => ({ response: new HttpResponse({ headers: transformedHeaders, statusCode: response.status, body, }), })); } return { response: new HttpResponse({ headers: transformedHeaders, statusCode: response.status, body: response.body, }), }; }), requestTimeout(requestTimeoutInMs), ]; if (abortSignal) { raceOfPromises.push(new Promise((resolve, reject) => { abortSignal.onabort = () => { const abortError = new Error("Request aborted"); abortError.name = "AbortError"; reject(abortError); }; })); } return Promise.race(raceOfPromises); } }