mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-03 23:00:30 +00:00
65 lines
1.7 KiB
TypeScript
65 lines
1.7 KiB
TypeScript
import fs from "node:fs/promises";
|
|
import os from "node:os";
|
|
import path from "node:path";
|
|
|
|
type HomeEnvSnapshot = {
|
|
home: string | undefined;
|
|
userProfile: string | undefined;
|
|
homeDrive: string | undefined;
|
|
homePath: string | undefined;
|
|
stateDir: string | undefined;
|
|
};
|
|
|
|
function snapshotHomeEnv(): HomeEnvSnapshot {
|
|
return {
|
|
home: process.env.HOME,
|
|
userProfile: process.env.USERPROFILE,
|
|
homeDrive: process.env.HOMEDRIVE,
|
|
homePath: process.env.HOMEPATH,
|
|
stateDir: process.env.OPENCLAW_STATE_DIR,
|
|
};
|
|
}
|
|
|
|
function restoreHomeEnv(snapshot: HomeEnvSnapshot) {
|
|
const restoreKey = (key: string, value: string | undefined) => {
|
|
if (value === undefined) {
|
|
delete process.env[key];
|
|
} else {
|
|
process.env[key] = value;
|
|
}
|
|
};
|
|
restoreKey("HOME", snapshot.home);
|
|
restoreKey("USERPROFILE", snapshot.userProfile);
|
|
restoreKey("HOMEDRIVE", snapshot.homeDrive);
|
|
restoreKey("HOMEPATH", snapshot.homePath);
|
|
restoreKey("OPENCLAW_STATE_DIR", snapshot.stateDir);
|
|
}
|
|
|
|
export async function withTempHome<T>(
|
|
prefix: string,
|
|
fn: (home: string) => Promise<T>,
|
|
): Promise<T> {
|
|
const home = await fs.mkdtemp(path.join(os.tmpdir(), prefix));
|
|
await fs.mkdir(path.join(home, ".openclaw"), { recursive: true });
|
|
|
|
const snapshot = snapshotHomeEnv();
|
|
process.env.HOME = home;
|
|
process.env.USERPROFILE = home;
|
|
process.env.OPENCLAW_STATE_DIR = path.join(home, ".openclaw");
|
|
|
|
if (process.platform === "win32") {
|
|
const match = home.match(/^([A-Za-z]:)(.*)$/);
|
|
if (match) {
|
|
process.env.HOMEDRIVE = match[1];
|
|
process.env.HOMEPATH = match[2] || "\\";
|
|
}
|
|
}
|
|
|
|
try {
|
|
return await fn(home);
|
|
} finally {
|
|
restoreHomeEnv(snapshot);
|
|
await fs.rm(home, { recursive: true, force: true });
|
|
}
|
|
}
|