Add HyperFrames skills (from heygen-com/hyperframes, Apache-2.0)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FXVsD1DgdzZLiPuwtKzMSY
This commit is contained in:
300 files changed
+49175
No files matched your search
@@ -0,0 +1,45 @@
|
||||
// The one lock on ~/.hyperframes/config.json, for the CLI, its auto-update step and media-use. The auto-update step
|
||||
// embeds this function's source, so it must use only its arguments and globals.
|
||||
export function withFileLock(lockPath, fs, task) {
|
||||
const token = `${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
||||
const started = Date.now();
|
||||
for (;;) {
|
||||
let fd;
|
||||
try {
|
||||
fd = fs.openSync(lockPath, "wx");
|
||||
} catch (error) {
|
||||
if (error.code !== "EEXIST") throw error;
|
||||
// Never taken over: a lock older than any hold was left by a process that stopped, and a person removes it.
|
||||
let leftover = false;
|
||||
try {
|
||||
leftover = Date.now() - fs.statSync(lockPath).mtimeMs > 5000;
|
||||
} catch {}
|
||||
if (leftover || Date.now() - started > 10000)
|
||||
throw Object.assign(
|
||||
new Error(
|
||||
`Settings are locked by another hyperframes process. If none is running, delete ${lockPath}`,
|
||||
),
|
||||
{ code: "HF_SETTINGS_LOCKED" },
|
||||
);
|
||||
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 25);
|
||||
continue;
|
||||
}
|
||||
try {
|
||||
fs.writeSync(fd, token);
|
||||
} catch (error) {
|
||||
fs.rmSync(lockPath, { force: true });
|
||||
throw error;
|
||||
} finally {
|
||||
fs.closeSync(fd);
|
||||
}
|
||||
break;
|
||||
}
|
||||
try {
|
||||
return task();
|
||||
} finally {
|
||||
// No code removes another's lock, so release needs no check (only a person deleting a live one defeats it).
|
||||
try {
|
||||
fs.rmSync(lockPath);
|
||||
} catch {}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user