@openapi-qraft/react
Version:
OpenAPI client for React, providing type-safe requests and dynamic TanStack Query React Hooks via a modular, Proxy-based architecture.
84 lines (75 loc) • 2.33 kB
text/typescript
import type { RequestFnResponse } from '@openapi-qraft/tanstack-query-react-types';
/**
* Processes the response from the server.
* @beta
*/
export async function processResponse<TData, TError>(
response: Response
): Promise<RequestFnResponse<TData, TError>> {
if (response.status === 204 || response.headers.get('Content-Length') === '0')
return (
response.ok ? { data: null, response } : { error: null, response }
) as RequestFnResponse<TData, TError>;
const contentType = response.headers.get('Content-Type')?.toLowerCase();
const isJsonResponse =
contentType?.includes('/json') || contentType?.includes('+json');
if (isJsonResponse) {
// clone response before parsing every time to allow multiple reads
const jsonResponse = response.clone().json();
return resolveResponse(
response,
response.ok ? jsonResponse : Promise.reject(await jsonResponse)
);
}
const textResponse = response.clone().text() as Promise<TData>;
return resolveResponse(
response,
response.ok ? textResponse : Promise.reject(await textResponse)
);
}
/**
* Resolves the response from the server.
* @beta
*/
export function resolveResponse<TData, TError>(
error: Error
): Promise<RequestFnResponse<TData, TError>>;
export function resolveResponse<TData, TError>(
responseToReturn: Response,
responsePromise: Promise<TData>
): Promise<RequestFnResponse<TData, TError>>;
export function resolveResponse<TData, TError>(
responseToReturn: Response | Error,
responsePromise?: Promise<TData>
): Promise<RequestFnResponse<TData, TError>> {
if (!responsePromise) {
if (responseToReturn instanceof Response) {
return Promise.resolve({
error: new Error('Unhandled response without promise to resolve'),
response: responseToReturn,
data: undefined,
});
} else {
return Promise.resolve({
error: responseToReturn,
response: undefined,
data: undefined,
});
}
}
return responsePromise
.then(
(data) =>
({ data, response: responseToReturn }) as RequestFnResponse<
TData,
TError
>
)
.catch(
(error) =>
({ error, response: responseToReturn }) as RequestFnResponse<
TData,
TError
>
);
}