diff options
| author | Kit Langton <[email protected]> | 2026-04-15 20:55:14 -0400 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-04-16 00:55:14 +0000 |
| commit | a147ad68e6aed8a6a3eeaf2ce1e56f73fab7fa31 (patch) | |
| tree | 5322ab88658950d27ffe2f3d9d6f5815a088c9ed /packages/shared/test/fixture | |
| parent | ac2fa668cfef16935317e8f0fa3a6b709c1f6fdc (diff) | |
| download | opencode-a147ad68e6aed8a6a3eeaf2ce1e56f73fab7fa31.tar.gz opencode-a147ad68e6aed8a6a3eeaf2ce1e56f73fab7fa31.zip | |
feat(shared): add Effect-idiomatic file lock (EffectFlock) (#22681)
Diffstat (limited to 'packages/shared/test/fixture')
| -rw-r--r-- | packages/shared/test/fixture/effect-flock-worker.ts | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/packages/shared/test/fixture/effect-flock-worker.ts b/packages/shared/test/fixture/effect-flock-worker.ts new file mode 100644 index 000000000..7fd2e144a --- /dev/null +++ b/packages/shared/test/fixture/effect-flock-worker.ts @@ -0,0 +1,64 @@ +import fs from "fs/promises" +import path from "path" +import os from "os" +import { Effect, Layer } from "effect" +import { AppFileSystem } from "@opencode-ai/shared/filesystem" +import { EffectFlock } from "@opencode-ai/shared/util/effect-flock" +import { Global } from "@opencode-ai/shared/global" + +type Msg = { + key: string + dir: string + holdMs?: number + ready?: string + active?: string + done?: string +} + +function sleep(ms: number) { + return new Promise<void>((resolve) => setTimeout(resolve, ms)) +} + +const msg: Msg = JSON.parse(process.argv[2]!) + +const testGlobal = Layer.succeed( + Global.Service, + Global.Service.of({ + home: os.homedir(), + data: os.tmpdir(), + cache: os.tmpdir(), + config: os.tmpdir(), + state: os.tmpdir(), + bin: os.tmpdir(), + log: os.tmpdir(), + }), +) + +const testLayer = EffectFlock.layer.pipe(Layer.provide(testGlobal), Layer.provide(AppFileSystem.defaultLayer)) + +async function job() { + if (msg.ready) await fs.writeFile(msg.ready, String(process.pid)) + if (msg.active) await fs.writeFile(msg.active, String(process.pid), { flag: "wx" }) + + try { + if (msg.holdMs && msg.holdMs > 0) await sleep(msg.holdMs) + if (msg.done) await fs.appendFile(msg.done, "1\n") + } finally { + if (msg.active) await fs.rm(msg.active, { force: true }) + } +} + +await Effect.runPromise( + Effect.gen(function* () { + const flock = yield* EffectFlock.Service + yield* flock.withLock( + Effect.promise(() => job()), + msg.key, + msg.dir, + ) + }).pipe(Effect.provide(testLayer)), +).catch((err) => { + const text = err instanceof Error ? (err.stack ?? err.message) : String(err) + process.stderr.write(text) + process.exit(1) +}) |
