fix(update): add a timeout for deployment/rebuild and add a cancel button.
This commit is contained in:
1 parent
c30f828d2c
commit
81622b5a4c
8 files changed
+443
-19
No files matched your search
@@ -1,6 +1,12 @@
|
||||
import { randomUUID } from "crypto";
|
||||
|
||||
export type ProcessJobStatus = "queued" | "running" | "success" | "error";
|
||||
export type ProcessJobStatus =
|
||||
| "queued"
|
||||
| "running"
|
||||
| "cancelling"
|
||||
| "cancelled"
|
||||
| "success"
|
||||
| "error";
|
||||
|
||||
export interface ProcessJobLogEntry {
|
||||
id: number;
|
||||
@@ -19,6 +25,8 @@ export interface ProcessJob {
|
||||
logs: ProcessJobLogEntry[];
|
||||
result?: unknown;
|
||||
error?: string;
|
||||
cancelReason?: string;
|
||||
cancel?: (reason?: string) => void;
|
||||
nextLogId: number;
|
||||
subscribers: Set<(entry: ProcessJobLogEntry) => void>;
|
||||
}
|
||||
@@ -31,7 +39,9 @@ function pruneJobs(now = Date.now()) {
|
||||
for (const [jobId, job] of jobs.entries()) {
|
||||
if (
|
||||
job.subscribers.size === 0 &&
|
||||
(job.status === "success" || job.status === "error") &&
|
||||
(job.status === "success" ||
|
||||
job.status === "error" ||
|
||||
job.status === "cancelled") &&
|
||||
now - job.updatedAt > JOB_TTL_MS
|
||||
) {
|
||||
jobs.delete(jobId);
|
||||
@@ -102,14 +112,39 @@ export function updateProcessJob(
|
||||
status?: ProcessJobStatus;
|
||||
result?: unknown;
|
||||
error?: string;
|
||||
cancel?: (reason?: string) => void;
|
||||
cancelReason?: string;
|
||||
},
|
||||
) {
|
||||
job.status = patch.status ?? job.status;
|
||||
job.result = patch.result ?? job.result;
|
||||
job.error = patch.error ?? job.error;
|
||||
job.cancel = patch.cancel ?? job.cancel;
|
||||
job.cancelReason = patch.cancelReason ?? job.cancelReason;
|
||||
job.updatedAt = Date.now();
|
||||
}
|
||||
|
||||
export function cancelProcessJob(job: ProcessJob, reason = "Cancelled by user") {
|
||||
if (job.status === "success" || job.status === "error") {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (job.status === "cancelled") {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (job.status === "cancelling") {
|
||||
return true;
|
||||
}
|
||||
|
||||
job.status = "cancelling";
|
||||
job.cancelReason = reason;
|
||||
job.updatedAt = Date.now();
|
||||
job.cancel?.(reason);
|
||||
appendProcessJobLog(job, `[job] Cancellation requested: ${reason}`);
|
||||
return true;
|
||||
}
|
||||
|
||||
export function subscribeProcessJob(
|
||||
job: ProcessJob,
|
||||
subscriber: (entry: ProcessJobLogEntry) => void,
|
||||
@@ -131,5 +166,6 @@ export function serializeProcessJob(job: ProcessJob) {
|
||||
logs: job.logs,
|
||||
result: job.result,
|
||||
error: job.error,
|
||||
cancelReason: job.cancelReason,
|
||||
};
|
||||
}
|
||||
Reference in new issue
Block a user