zephyr-agent
Version:
Zephyr plugin agent
69 lines (68 loc) • 2.61 kB
JavaScript
import "node:module";
import { randomBytes } from "node:crypto";
import { setInterval as promises_setInterval } from "node:timers/promises";
import { checkSync, lockSync } from "@bybrave/proper-lockfile2";
import { DEFAULT_AUTH_COMPLETION_TIMEOUT_MS } from "../auth/auth-flags.mjs";
import { ze_log } from "../logging/index.mjs";
import { ZE_SESSION_LOCK, ensurePrivateFilePermissions } from "./storage-keys.mjs";
import * as __rspack_external_node_fs_1b05aee1 from "node:fs";
const SESSION_LENGTH = 9;
const UNLOCK_INTERVAL = 250;
function getSessionKey() {
let session = randomBytes(SESSION_LENGTH);
const unlock = safeLockSync();
if (unlock) {
ze_log.misc('Lock acquired, writing session key to lockfile');
__rspack_external_node_fs_1b05aee1.writeFileSync(ZE_SESSION_LOCK, session, {
flush: true,
mode: 384
});
ensurePrivateFilePermissions(ZE_SESSION_LOCK);
} else {
ensurePrivateFilePermissions(ZE_SESSION_LOCK);
ze_log.misc('Lock is already held by another process, using the same session key');
session = __rspack_external_node_fs_1b05aee1.readFileSync(ZE_SESSION_LOCK);
if (session.length !== SESSION_LENGTH) session = __rspack_external_node_fs_1b05aee1.readFileSync(ZE_SESSION_LOCK);
}
return {
owner: !!unlock,
session: session.toString('base64url'),
[Symbol.dispose] () {
unlock?.();
}
};
}
function safeLockSync(createIfNotExists = true) {
try {
return lockSync(ZE_SESSION_LOCK, {
stale: DEFAULT_AUTH_COMPLETION_TIMEOUT_MS
});
} catch (ex) {
const error = ex;
if ('ELOCKED' === error.code) return null;
if ('ENOENT' === error.code && createIfNotExists) {
try {
__rspack_external_node_fs_1b05aee1.writeFileSync(ZE_SESSION_LOCK, '', {
encoding: 'utf8',
flag: 'wx',
mode: 384
});
} catch (creationError) {
if ('EEXIST' !== creationError.code) throw creationError;
}
ensurePrivateFilePermissions(ZE_SESSION_LOCK);
return safeLockSync(false);
}
throw error;
}
}
async function waitForUnlock(signal) {
for await (const _ of promises_setInterval(UNLOCK_INTERVAL, null, {
ref: false,
signal
}))if (!checkSync(ZE_SESSION_LOCK, {
stale: DEFAULT_AUTH_COMPLETION_TIMEOUT_MS
})) return;
}
export { getSessionKey, waitForUnlock };
//# sourceMappingURL=session-lock.mjs.map