@lesscap/baton-cli 0.2.6 → 0.2.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/baton.mjs +40 -7
  2. package/package.json +1 -1
package/dist/baton.mjs CHANGED
@@ -768,10 +768,17 @@ var common = {
768
768
  },
769
769
  json: { type: "boolean", description: "output JSON" }
770
770
  };
771
+ var resolveAuth = (env, fileToken) => {
772
+ const envBearer = env.BATON_TOKEN ?? env.BATON_WORKER_TOKEN;
773
+ if (envBearer) return { bearer: envBearer };
774
+ if (env.BATON_USER && env.BATON_PASS) return "cookie";
775
+ return fileToken ? { bearer: fileToken } : void 0;
776
+ };
771
777
  var clientFor = (args) => {
772
- const envAuth = process.env.BATON_TOKEN ?? (process.env.BATON_USER && process.env.BATON_PASS);
773
- const cfgToken = envAuth ? void 0 : loadProjectConfigOrNull(projectConfigPath())?.worker?.apiToken;
774
- return createClient(resolveBaseUrl(args.url), cfgToken ? { bearer: cfgToken } : void 0);
778
+ const baseUrl = resolveBaseUrl(args.url);
779
+ const fileToken = loadProjectConfigOrNull(projectConfigPath())?.worker?.apiToken;
780
+ const auth = resolveAuth(process.env, fileToken);
781
+ return createClient(baseUrl, auth && auth !== "cookie" ? auth : void 0);
775
782
  };
776
783
  var resolveProjectId = (args) => {
777
784
  if (args.project !== void 0 && args.project !== "") return Number(args.project);
@@ -2645,11 +2652,35 @@ var runWorkerDaemon = async (cfg, client, signal) => {
2645
2652
  const worktreeDir = defaultWorktreeDir();
2646
2653
  const children = /* @__PURE__ */ new Map();
2647
2654
  const log = (m) => console.log(`[worker #${cfg.workerId} ${cfg.name}] ${m}`);
2648
- const ping = () => {
2649
- void client.workers.heartbeat(cfg.machineId).catch((e) => log(`heartbeat failed: ${String(e)}`));
2655
+ const HEARTBEAT_MS = 3e4;
2656
+ const HEARTBEAT_TIMEOUT_MS = 15e3;
2657
+ const MAX_HEARTBEAT_FAILURES = 5;
2658
+ let heartbeatFailures = 0;
2659
+ let fatal = false;
2660
+ let stop = () => {
2661
+ };
2662
+ const ping = async () => {
2663
+ try {
2664
+ await Promise.race([
2665
+ client.workers.heartbeat(cfg.machineId),
2666
+ new Promise(
2667
+ (_, reject) => setTimeout(() => reject(new Error("heartbeat timeout")), HEARTBEAT_TIMEOUT_MS)
2668
+ )
2669
+ ]);
2670
+ heartbeatFailures = 0;
2671
+ } catch (e) {
2672
+ heartbeatFailures += 1;
2673
+ log(`heartbeat failed (${heartbeatFailures}/${MAX_HEARTBEAT_FAILURES}): ${String(e)}`);
2674
+ if (heartbeatFailures >= MAX_HEARTBEAT_FAILURES) {
2675
+ const downSec = MAX_HEARTBEAT_FAILURES * HEARTBEAT_MS / 1e3;
2676
+ log(`heartbeat down ~${downSec}s \u2014 exiting so the supervisor restarts a clean worker`);
2677
+ fatal = true;
2678
+ stop();
2679
+ }
2680
+ }
2650
2681
  };
2651
- ping();
2652
- const hb = setInterval(ping, 3e4);
2682
+ void ping();
2683
+ const hb = setInterval(() => void ping(), HEARTBEAT_MS);
2653
2684
  const killChild = (child) => {
2654
2685
  if (child.pid === void 0) return;
2655
2686
  try {
@@ -2769,12 +2800,14 @@ var runWorkerDaemon = async (cfg, client, signal) => {
2769
2800
  es.onerror = () => log("command stream error (eventsource will retry)");
2770
2801
  log(`listening for commands (server ${cfg.server}, repo ${repo})`);
2771
2802
  await new Promise((resolve2) => {
2803
+ stop = resolve2;
2772
2804
  if (signal.aborted) return resolve2();
2773
2805
  signal.addEventListener("abort", () => resolve2(), { once: true });
2774
2806
  });
2775
2807
  es.close();
2776
2808
  clearInterval(hb);
2777
2809
  for (const { child } of children.values()) killChild(child);
2810
+ if (fatal) process.exit(1);
2778
2811
  };
2779
2812
 
2780
2813
  // src/worker/machine-id.ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lesscap/baton-cli",
3
- "version": "0.2.6",
3
+ "version": "0.2.7",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "description": "baton CLI — register/run a worker, manage projects/requirements/tasks/sessions",