Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 48 additions & 0 deletions index.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@

import { fileURLToPath } from "node:url";
import { arch, platform } from "node:process";


const BASE_PACKAGE_NAME = "sqlite-vec";
const ENTRYPOINT_BASE_NAME = "vec0";
const supportedPlatforms = [["darwin","x64"],["linux","x64"],["darwin","arm64"],["win32","x64"],["linux","arm64"],["android","arm64"]];

const invalidPlatformErrorMessage = `Unsupported platform for ${BASE_PACKAGE_NAME}, on a ${platform}-${arch} machine. Supported platforms are (${supportedPlatforms
.map(([p, a]) => `${p}-${a}`)
.join(",")}). Consult the ${BASE_PACKAGE_NAME} NPM package README for details.`;

const extensionNotFoundErrorMessage = packageName => `Loadble extension for ${BASE_PACKAGE_NAME} not found. Was the ${packageName} package installed?`;

function validPlatform(platform, arch) {
return (
supportedPlatforms.find(([p, a]) => platform === p && arch === a) !== undefined
);
}
function extensionSuffix(platform) {
if (platform === "win32") return "dll";
if (platform === "darwin") return "dylib";
return "so";
}
function platformPackageName(platform, arch) {
let os = platform === "win32" ? "windows" : platform;
if (os === "android") os = "linux";
return `${BASE_PACKAGE_NAME}-${os}-${arch}`;
}

function getLoadablePath() {
if (!validPlatform(platform, arch)) {
throw new Error(
invalidPlatformErrorMessage
);
}
const packageName = platformPackageName(platform, arch);
const loadablePath = fileURLToPath(import.meta.resolve(packageName + "/" + ENTRYPOINT_BASE_NAME + "." + extensionSuffix(platform)));
return loadablePath;
}

function load(db) {
const p = getLoadablePath();
db.loadExtension(p.replace(/\.so$/, ''));
}

export {getLoadablePath, load};