import { exec as execCb } from "node:child_process"; import { setTimeout } from "node:timers/promises"; import { promisify } from "node:util"; import { which } from "./which.mjs"; const exec = promisify(execCb); /** * @param {string} file * @returns {Promise} */ export async function waitLockUnlock(file) { if (!(await which("flock"))) throw new Error("flock is not installed"); let locked = false; while (!locked) { try { await exec(`flock -ns "${file}" -c true`); await setTimeout(100); } catch { locked = true; } } while (locked) { try { await exec(`flock -ns "${file}" -c true`); } catch { await setTimeout(100); continue; } locked = false; } }