chromadb
Version:
A JavaScript interface for chroma
81 lines (75 loc) • 2.46 kB
text/typescript
import {
ChromaClientError,
ChromaConnectionError,
ChromaForbiddenError,
ChromaNotFoundError,
ChromaQuotaExceededError,
ChromaRateLimitError,
ChromaUnauthorizedError,
ChromaUniqueError,
} from "./errors";
const offlineError = (error: any): boolean => {
return Boolean(
(error?.name === "TypeError" || error?.name === "FetchError") &&
(error.message?.includes("fetch failed") ||
error.message?.includes("Failed to fetch") ||
error.message?.includes("ENOTFOUND")),
);
};
export const chromaFetch: typeof fetch = async (input, init) => {
let response: Response;
try {
response = await fetch(input, init);
} catch (err) {
if (offlineError(err)) {
throw new ChromaConnectionError(
"Failed to connect to chromadb. Make sure your server is running and try again. If you are running from a browser, make sure that your chromadb instance is configured to allow requests from the current origin using the CHROMA_SERVER_CORS_ALLOW_ORIGINS environment variable.",
);
}
throw new ChromaConnectionError("Failed to connect to Chroma");
}
if (response.ok) {
return response;
}
switch (response.status) {
case 400:
let status = "Bad Request";
try {
const responseBody = await response.json();
status = responseBody.message || status;
} catch {}
throw new ChromaClientError(
`Bad request to ${
(input as Request).url || "Chroma"
} with status: ${status}`,
);
case 401:
throw new ChromaUnauthorizedError(`Unauthorized`);
case 403:
throw new ChromaForbiddenError(
`You do not have permission to access the requested resource.`,
);
case 404:
throw new ChromaNotFoundError(
`The requested resource could not be found`,
);
case 409:
throw new ChromaUniqueError("The resource already exists");
case 422:
const body = await response.json();
if (
body &&
body.message &&
(body.message.startsWith("Quota exceeded") ||
body.message.startsWith("Billing limit exceeded"))
) {
throw new ChromaQuotaExceededError(body?.message);
}
break;
case 429:
throw new ChromaRateLimitError("Rate limit exceeded");
}
throw new ChromaConnectionError(
`Unable to connect to the chromadb server (status: ${response.status}). Please try again later.`,
);
};