diff options
| author | Dax <[email protected]> | 2026-04-15 11:50:24 -0400 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-04-15 15:50:24 +0000 |
| commit | 4ae7c77f8abda8d51ddf52ee6e07890fa19b6629 (patch) | |
| tree | d1b2891cb58ffe0d7d2a9e3af67340921f9f9758 /packages/shared/test/fixture | |
| parent | f1751401aa2c53a4a0215c6deddf93df306aac8b (diff) | |
| download | opencode-4ae7c77f8abda8d51ddf52ee6e07890fa19b6629.tar.gz opencode-4ae7c77f8abda8d51ddf52ee6e07890fa19b6629.zip | |
migrate: move flock and hash utilities to shared package (#22640)
Diffstat (limited to 'packages/shared/test/fixture')
| -rw-r--r-- | packages/shared/test/fixture/flock-worker.ts | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/packages/shared/test/fixture/flock-worker.ts b/packages/shared/test/fixture/flock-worker.ts new file mode 100644 index 000000000..9954d290c --- /dev/null +++ b/packages/shared/test/fixture/flock-worker.ts @@ -0,0 +1,72 @@ +import fs from "fs/promises" +import { Flock } from "@opencode-ai/shared/util/flock" + +type Msg = { + key: string + dir: string + staleMs?: number + timeoutMs?: number + baseDelayMs?: number + maxDelayMs?: number + holdMs?: number + ready?: string + active?: string + done?: string +} + +function sleep(ms: number) { + return new Promise<void>((resolve) => { + setTimeout(resolve, ms) + }) +} + +function input() { + const raw = process.argv[2] + if (!raw) { + throw new Error("Missing flock worker input") + } + + return JSON.parse(raw) as Msg +} + +async function job(input: Msg) { + if (input.ready) { + await fs.writeFile(input.ready, String(process.pid)) + } + + if (input.active) { + await fs.writeFile(input.active, String(process.pid), { flag: "wx" }) + } + + try { + if (input.holdMs && input.holdMs > 0) { + await sleep(input.holdMs) + } + + if (input.done) { + await fs.appendFile(input.done, "1\n") + } + } finally { + if (input.active) { + await fs.rm(input.active, { force: true }) + } + } +} + +async function main() { + const msg = input() + + await Flock.withLock(msg.key, () => job(msg), { + dir: msg.dir, + staleMs: msg.staleMs, + timeoutMs: msg.timeoutMs, + baseDelayMs: msg.baseDelayMs, + maxDelayMs: msg.maxDelayMs, + }) +} + +await main().catch((err) => { + const text = err instanceof Error ? (err.stack ?? err.message) : String(err) + process.stderr.write(text) + process.exit(1) +}) |
