fix(update): add a timeout for deployment/rebuild and add a cancel button.

This commit is contained in:
KodekaTeam committed 2026-06-06 00:22:04 +07:00
1 parent c30f828d2c
commit 81622b5a4c
8 files changed
+443 -19

No files matched your search

+38 -2
View File
@@ -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,
};
}