///
import { z } from "zod";
const getDocsBody200Schema = z.object({}).strict();
const getHealthcheckBody200Schema = z
.object({
http: z.enum(["healthy"]),
database: z.enum(["healthy", "unhealthy"]),
cache: z.enum(["healthy", "unhealthy"]),
systemMemory: z.enum(["healthy", "unhealthy"]),
processMemory: z.enum(["healthy", "unhealthy"]),
})
.strict();
type HttpResult =
| {
success: true;
headers: Record;
data: T;
}
| {
success: false;
headers: Record;
data: unknown;
};
export function createClient(
baseUrl: string,
globalFetchOverrides: RequestInit = {},
jsonStringifier = JSON.stringify
) {
async function getDocs(
fetchOverrides: RequestInit = {}
): Promise>> {
const url = new URL("/docs", baseUrl);
const { headers, ...fetchOverridesWithoutHeaders } = fetchOverrides;
const { headers: globalHeaders, ...globalFetchOverridesWithoutHeaders } =
globalFetchOverrides;
const response = await fetch(url.toString(), {
method: "get",
headers: {
Accept: "application/json",
"Content-Type": "application/json",
...globalHeaders,
...headers,
},
...globalFetchOverridesWithoutHeaders,
...fetchOverridesWithoutHeaders,
});
if (!response.ok) {
return {
success: false,
headers: Object.fromEntries(response.headers.entries()),
data: await response.json(),
};
}
const data = await response.json();
return {
success: true,
headers: Object.fromEntries(response.headers.entries()),
data: getDocsBody200Schema.parse(data),
};
}
async function getHealthcheck(
fetchOverrides: RequestInit = {}
): Promise>> {
const url = new URL("/healthcheck", baseUrl);
const { headers, ...fetchOverridesWithoutHeaders } = fetchOverrides;
const { headers: globalHeaders, ...globalFetchOverridesWithoutHeaders } =
globalFetchOverrides;
const response = await fetch(url.toString(), {
method: "get",
headers: {
Accept: "application/json",
"Content-Type": "application/json",
...globalHeaders,
...headers,
},
...globalFetchOverridesWithoutHeaders,
...fetchOverridesWithoutHeaders,
});
if (!response.ok) {
return {
success: false,
headers: Object.fromEntries(response.headers.entries()),
data: await response.json(),
};
}
const data = await response.json();
return {
success: true,
headers: Object.fromEntries(response.headers.entries()),
data: getHealthcheckBody200Schema.parse(data),
};
}
return {
getDocs,
getHealthcheck,
};
}
export function createTraceHeader({
traceId,
parentSpanId,
version,
}: {
traceId: string;
parentSpanId: string;
version?: string;
}) {
return {
traceparent: [version ?? "00", traceId, parentSpanId, "01"].join("-"),
};
}