mirror of
https://fastgit.cc/https://github.com/anomalyco/opencode
synced 2026-04-23 02:13:48 +08:00
64 lines
1.6 KiB
TypeScript
64 lines
1.6 KiB
TypeScript
import fs from "fs/promises"
|
|
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)
|
|
})
|