mirror of
https://github.com/spacedriveapp/spacedrive
synced 2024-07-14 19:24:07 +00:00
36 lines
688 B
JavaScript
36 lines
688 B
JavaScript
|
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<void>}
|
||
|
*/
|
||
|
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
|
||
|
}
|
||
|
}
|