| 1 | import { existsSync, rmSync, writeFileSync } from "node:fs"; |
| 2 | import http from "node:http"; |
| 3 | |
| 4 | const machineId = process.env.FLY_MACHINE_ID; |
| 5 | const token = process.env[process.env.READINESS_CONTROL_SECRET]; |
| 6 | if (!machineId || !token) throw new Error("Missing readiness control identity"); |
| 7 | |
| 8 | writeFileSync("/tmp/ready", "ready"); |
| 9 | http |
| 10 | .createServer((request, response) => { |
| 11 | response.setHeader("content-type", "application/json"); |
| 12 | response.setHeader("cache-control", "no-store"); |
| 13 | if (request.method === "GET" && request.url === "/ready") { |
| 14 | const ready = existsSync("/tmp/ready"); |
| 15 | response.writeHead(ready ? 200 : 503); |
| 16 | response.end(JSON.stringify({ machineId, ready })); |
| 17 | return; |
| 18 | } |
| 19 | if (request.method === "POST" && request.url === "/readiness/off") { |
| 20 | if (request.headers.authorization !== `Bearer ${token}`) { |
| 21 | response.writeHead(401).end(); |
| 22 | return; |
| 23 | } |
| 24 | if (request.headers["x-readiness-machine-id"] !== machineId) { |
| 25 | response.writeHead(409).end(); |
| 26 | return; |
| 27 | } |
| 28 | try { |
| 29 | rmSync("/tmp/ready", { force: true }); |
| 30 | response.end(JSON.stringify({ machineId, ready: false })); |
| 31 | } catch { |
| 32 | response.writeHead(500).end(); |
| 33 | } |
| 34 | return; |
| 35 | } |
| 36 | response.writeHead(404).end(); |
| 37 | }) |
| 38 | .listen(3000, "::"); |