@softchef/cdk-iot-device-management
Version:
IoT device management is composed of things, thing types, thing groups, jobs, files API services. The constructs can be used independently, that are based on full-managed service to create an API Gateway & Lambda function.
87 lines (86 loc) • 3.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.FetchHttpHandler = void 0;
const protocol_http_1 = require("@aws-sdk/protocol-http");
const querystring_builder_1 = require("@aws-sdk/querystring-builder");
const request_timeout_1 = require("./request-timeout");
class FetchHttpHandler {
constructor(options) {
if (typeof options === "function") {
this.configProvider = async () => (await options()) || {};
}
else {
this.config = options !== null && options !== void 0 ? options : {};
}
}
destroy() {
}
async handle(request, { abortSignal } = {}) {
if (!this.config && this.configProvider) {
this.config = await this.configProvider();
}
const requestTimeoutInMs = this.config.requestTimeout;
if (abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.aborted) {
const abortError = new Error("Request aborted");
abortError.name = "AbortError";
return Promise.reject(abortError);
}
let path = request.path;
if (request.query) {
const queryString = querystring_builder_1.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 protocol_http_1.HttpResponse({
headers: transformedHeaders,
statusCode: response.status,
body,
}),
}));
}
return {
response: new protocol_http_1.HttpResponse({
headers: transformedHeaders,
statusCode: response.status,
body: response.body,
}),
};
}),
request_timeout_1.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);
}
}
exports.FetchHttpHandler = FetchHttpHandler;