created HttpRequest

This commit is contained in:
2025-08-16 23:47:55 -04:00
parent 8a7cf7bb1c
commit 2bc62eed01
6 changed files with 107 additions and 1 deletions

View File

@@ -0,0 +1,8 @@
// Replace entire file with simplified string enum
export enum HttpMethod {
Get = 'GET',
Post = 'POST',
Put = 'PUT',
Patch = 'PATCH',
Delete = 'DELETE'
}

View File

@@ -0,0 +1,58 @@
import {HttpMethod} from './HttpMethod';
const defaultRequestTimeoutDurationInMilliseconds = 30_000;
export class HttpRequests {
private readonly _baseUri: string;
private readonly _baseHeaders: Headers;
private readonly _requestTimeoutDuration: number;
constructor(baseUri: string, baseHeaders: Headers, options: {requestTimeoutDuration?: number} = {}) {
this._baseUri = baseUri;
this._baseHeaders = baseHeaders;
this._requestTimeoutDuration = options.requestTimeoutDuration ?? defaultRequestTimeoutDurationInMilliseconds;
}
public async request<T>(method: HttpMethod, path: string, options?: RequestInit & {body?: Record<string, unknown> | string}): Promise<T | void> {
const abortController = new AbortController();
const abortSignal = abortController.signal;
let requestOptions: RequestInit = {
headers: this._baseHeaders,
method: method.toString(), // Convert enum to string
signal: abortSignal
};
if (options?.body && method !== HttpMethod.Get) {
requestOptions.body = typeof options.body === 'string' ? options.body : JSON.stringify(options.body);
}
return this.makeRequest<T>(path, requestOptions, abortController, this._requestTimeoutDuration);
}
private async makeRequest<T>(path: string, options: RequestInit, abortController: AbortController, timeoutDuration: number): Promise<T | void> {
const requestTimeoutId = globalThis.setTimeout(() => abortController.abort(), timeoutDuration);
try {
const requestPath = `${this._baseUri}${path}`;
const response = await fetch(requestPath, options);
if (!response.ok) {
throw new Error(`HTTP error! status [${response.status}] ${response.statusText}`);
}
const responseContentType = response.headers.get('content-type');
if (responseContentType?.includes('application/json')) {
return response.json() as T;
}
return response.text() as T;
} catch (e) {
console.error(e);
return;
} finally {
globalThis.clearTimeout(requestTimeoutId);
}
}
}