73 lines
1.7 KiB
TypeScript
73 lines
1.7 KiB
TypeScript
import { Auth } from "home-assistant-js-websocket";
|
|
import { fetchWithAuth } from "./fetch-with-auth";
|
|
|
|
export const handleFetchPromise = async <T>(
|
|
fetchPromise: Promise<Response>
|
|
): Promise<T> => {
|
|
let response;
|
|
|
|
try {
|
|
response = await fetchPromise;
|
|
} catch (err: any) {
|
|
// eslint-disable-next-line @typescript-eslint/no-throw-literal
|
|
throw {
|
|
error: "Request error",
|
|
status_code: undefined,
|
|
body: undefined,
|
|
};
|
|
}
|
|
|
|
let body = null;
|
|
|
|
const contentType = response.headers.get("content-type");
|
|
|
|
if (contentType && contentType.includes("application/json")) {
|
|
try {
|
|
body = await response.json();
|
|
} catch (err: any) {
|
|
// eslint-disable-next-line @typescript-eslint/no-throw-literal
|
|
throw {
|
|
error: "Unable to parse JSON response",
|
|
status_code: err.status,
|
|
body: null,
|
|
};
|
|
}
|
|
} else {
|
|
body = await response.text();
|
|
}
|
|
|
|
if (!response.ok) {
|
|
// eslint-disable-next-line @typescript-eslint/no-throw-literal
|
|
throw {
|
|
error: `Response error: ${response.status}`,
|
|
status_code: response.status,
|
|
body,
|
|
};
|
|
}
|
|
|
|
return body as unknown as T;
|
|
};
|
|
|
|
export default async function hassCallApi<T>(
|
|
auth: Auth,
|
|
method: string,
|
|
path: string,
|
|
parameters?: Record<string, unknown>,
|
|
headers?: Record<string, string>
|
|
) {
|
|
const url = `${auth.data.hassUrl}/api/${path}`;
|
|
|
|
const init: RequestInit = {
|
|
method,
|
|
headers: headers || {},
|
|
};
|
|
|
|
if (parameters) {
|
|
// @ts-ignore
|
|
init.headers["Content-Type"] = "application/json;charset=UTF-8";
|
|
init.body = JSON.stringify(parameters);
|
|
}
|
|
|
|
return handleFetchPromise<T>(fetchWithAuth(auth, url, init));
|
|
}
|