You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
45 lines
1.2 KiB
45 lines
1.2 KiB
import { XllmError } from "../core/errors";
|
|
import type { ProviderAdapter, ProviderHttpRequest } from "../providers/types";
|
|
|
|
const toNetworkError = (error: unknown, provider: string): XllmError => {
|
|
if (error instanceof XllmError) return error;
|
|
const err = error as Error;
|
|
return new XllmError({
|
|
code: "NETWORK_ERROR",
|
|
message: err?.message || "Network request failed",
|
|
provider,
|
|
raw: error,
|
|
});
|
|
};
|
|
|
|
export const postJSON = async (
|
|
fetchImpl: typeof fetch,
|
|
request: ProviderHttpRequest,
|
|
adapter: ProviderAdapter,
|
|
): Promise<Response> => {
|
|
try {
|
|
return await fetchImpl(request.url, {
|
|
method: request.method,
|
|
headers: request.headers,
|
|
body: JSON.stringify(request.body),
|
|
});
|
|
} catch (error) {
|
|
throw toNetworkError(error, adapter.name);
|
|
}
|
|
};
|
|
|
|
export const throwForBadStatus = async (response: Response, adapter: ProviderAdapter): Promise<void> => {
|
|
if (response.ok) return;
|
|
let raw: unknown = undefined;
|
|
const textBody = await response.text();
|
|
try {
|
|
raw = JSON.parse(textBody);
|
|
} catch {
|
|
raw = textBody;
|
|
}
|
|
throw adapter.normalizeError({
|
|
statusCode: response.status,
|
|
message: (raw as any)?.error?.message ?? `HTTP ${response.status}`,
|
|
raw,
|
|
});
|
|
};
|
|
|