2
0

flock-worker.ts 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import fs from "fs/promises"
  2. import { Flock } from "../../src/util/flock"
  3. type Msg = {
  4. key: string
  5. dir: string
  6. staleMs?: number
  7. timeoutMs?: number
  8. baseDelayMs?: number
  9. maxDelayMs?: number
  10. holdMs?: number
  11. ready?: string
  12. active?: string
  13. done?: string
  14. }
  15. function sleep(ms: number) {
  16. return new Promise<void>((resolve) => {
  17. setTimeout(resolve, ms)
  18. })
  19. }
  20. function input() {
  21. const raw = process.argv[2]
  22. if (!raw) {
  23. throw new Error("Missing flock worker input")
  24. }
  25. return JSON.parse(raw) as Msg
  26. }
  27. async function job(input: Msg) {
  28. if (input.ready) {
  29. await fs.writeFile(input.ready, String(process.pid))
  30. }
  31. if (input.active) {
  32. await fs.writeFile(input.active, String(process.pid), { flag: "wx" })
  33. }
  34. try {
  35. if (input.holdMs && input.holdMs > 0) {
  36. await sleep(input.holdMs)
  37. }
  38. if (input.done) {
  39. await fs.appendFile(input.done, "1\n")
  40. }
  41. } finally {
  42. if (input.active) {
  43. await fs.rm(input.active, { force: true })
  44. }
  45. }
  46. }
  47. async function main() {
  48. const msg = input()
  49. await Flock.withLock(msg.key, () => job(msg), {
  50. dir: msg.dir,
  51. staleMs: msg.staleMs,
  52. timeoutMs: msg.timeoutMs,
  53. baseDelayMs: msg.baseDelayMs,
  54. maxDelayMs: msg.maxDelayMs,
  55. })
  56. }
  57. await main().catch((err) => {
  58. const text = err instanceof Error ? (err.stack ?? err.message) : String(err)
  59. process.stderr.write(text)
  60. process.exit(1)
  61. })