chargebee
Version:
A library for integrating with Chargebee.
60 lines (59 loc) • 1.95 kB
JavaScript
import { HttpClient } from './ClientInterface.js';
export class FetchHttpClient extends HttpClient {
async makeApiRequest(request, timeout) {
try {
const response = globalThis.AbortController
? await this.fetchWithAbortTimeout(request, timeout)
: await this.fetchWithTimeout(request, timeout);
return response;
}
catch (err) {
return Promise.reject(err);
}
}
_createHeaders(httpHeaders) {
const headers = new Headers();
Object.entries(httpHeaders).forEach(([key, value]) => {
headers.append(key, String(value));
});
return headers;
}
async fetchWithTimeout(request, timeout) {
let pendingTimeoutId;
const timeoutPromise = new Promise((_, reject) => {
pendingTimeoutId = setTimeout(() => {
pendingTimeoutId = null;
reject(HttpClient.timeOutError());
}, timeout);
});
const fetchPromise = fetch(request);
return Promise.race([fetchPromise, timeoutPromise]).finally(() => {
if (pendingTimeoutId) {
clearTimeout(pendingTimeoutId);
}
});
}
async fetchWithAbortTimeout(request, timeout) {
const abort = new AbortController();
let timeoutId = setTimeout(() => {
timeoutId = null;
abort.abort(HttpClient.timeOutError());
}, timeout);
try {
return await fetch(new Request(request, { signal: abort.signal }));
}
catch (err) {
if (err.name === 'AbortError') {
return Promise.reject(HttpClient.timeOutError());
}
else {
return Promise.reject(err);
}
}
finally {
if (timeoutId) {
clearTimeout(timeoutId);
}
}
}
}