browse
Version:
Unified Browserbase CLI for browser automation and cloud APIs.
65 lines (64 loc) • 2.39 kB
JavaScript
import { promises as fs } from "node:fs";
import { createHash } from "node:crypto";
import os from "node:os";
import path from "node:path";
export const PRIVATE_DIR_MODE = 0o700;
export const PRIVATE_FILE_MODE = 0o600;
export function runtimeDir() {
return (process.env.BROWSE_DAEMON_DIR ??
path.join(os.tmpdir(), defaultRuntimeDirName()));
}
export function sanitizeSessionName(session) {
const sanitized = session
.replace(/[^A-Za-z0-9._-]/g, "-")
.replace(/^[.-]+|[.-]+$/g, "");
const base = sanitized || "default";
if (base === session)
return base;
const hash = createHash("sha256").update(session).digest("hex").slice(0, 8);
return `${base}-${hash}`;
}
export async function ensureRuntimeDir() {
const dir = runtimeDir();
await ensurePrivateDir(dir);
return dir;
}
export async function ensurePrivateDir(dir) {
await fs.mkdir(dir, { mode: PRIVATE_DIR_MODE, recursive: true });
await chmodIfSupported(dir, PRIVATE_DIR_MODE);
}
export async function writePrivateFile(file, contents) {
await fs.writeFile(file, contents, { mode: PRIVATE_FILE_MODE });
await chmodIfSupported(file, PRIVATE_FILE_MODE);
}
export function getSocketPath(session) {
const name = sanitizeSessionName(session);
if (process.platform === "win32") {
return `\\\\.\\pipe\\browse-driver-${name}`;
}
return path.join(runtimeDir(), `${name}.sock`);
}
export function getPidPath(session) {
return path.join(runtimeDir(), `${sanitizeSessionName(session)}.pid`);
}
export function getLockPath(session) {
return path.join(runtimeDir(), `${sanitizeSessionName(session)}.lock`);
}
export async function cleanupDaemonFiles(session, { includeLock = true } = {}) {
const files = [getSocketPath(session), getPidPath(session)];
if (includeLock)
files.push(getLockPath(session));
await Promise.allSettled(files.map((file) => fs.unlink(file)));
}
export function getNetworkDir(session) {
return path.join(runtimeDir(), `${sanitizeSessionName(session)}-network`);
}
async function chmodIfSupported(target, mode) {
if (process.platform === "win32")
return;
await fs.chmod(target, mode);
}
function defaultRuntimeDirName() {
const uid = typeof process.getuid === "function" ? process.getuid() : null;
return uid === null ? "browse-driver" : `browse-driver-${uid}`;
}