feat(nodejs): pause and resume jobs from the TypeScript SDK (#4113)

Companion to #4112: `pauseJob` and `resumeJob` on `Connection`, posting
to the server's `/v1/jobs/pause` and `/v1/jobs/resume` endpoints. A
pause parks the job until it is resumed: its workers drain and stop, and
a resume re-queues it to pick work back up from checkpoints.

The outcome strings mirror the server's answers — `"pausing"`,
`"already_paused"`, or `"committing"` (a job finalizing its results
cannot be parked; retry shortly), and `"resumed"`, `"still_pausing"`, or
`"not_paused"` — so a caller can retry the transient refusals rather
than treat them as failures.

Stacked on #4112 (shares the Rust core change); draft until the
server-side endpoints reach production.
This commit is contained in:
Wyatt Alt
2026-09-24 02:35:03 +08:00
committed by GitHub
parent 1fc72427e3
commit 2ebd6142e4
4 changed files with 119 additions and 0 deletions
+21
View File
@@ -1152,6 +1152,24 @@ describe("remote connection jobs surface", () => {
res
.writeHead(200, { "Content-Type": "application/json" })
.end('{"job_id": "job-1"}');
} else if (req.url === "/v1/jobs/pause") {
if (payload["job_id"] !== "job-1") {
res.writeHead(404).end("no such job");
return;
}
res
.writeHead(200, { "Content-Type": "application/json" })
.end('{"job_id": "job-1", "paused": true}');
} else if (req.url === "/v1/jobs/resume") {
if (payload["job_id"] !== "job-1") {
res.writeHead(404).end("no such job");
return;
}
res
.writeHead(200, { "Content-Type": "application/json" })
.end(
'{"job_id": "job-1", "resumed": false, "still_pausing": true}',
);
} else if (req.url === "/v1/jobs/query_events") {
queryEventsPayloads.push(payload);
res
@@ -1173,6 +1191,9 @@ describe("remote connection jobs surface", () => {
expect(await db.cancelJob("job-1")).toBe(true);
expect(await db.cancelJob("missing")).toBe(false);
expect(await db.pauseJob("job-1")).toEqual("pausing");
expect(await db.resumeJob("job-1")).toEqual("still_pausing");
// Opening a job hands back a populated handle; a missing one rejects.
await expect(db.openJob("missing")).rejects.toThrow("not found");
const finished = await db.openJob("job-2");