Files
windmill/frontend/src/lib/components/waitJob.ts
T
2026-02-09 00:23:42 +00:00

86 lines
1.7 KiB
TypeScript

import { JobService } from '$lib/gen'
import { workspaceStore } from '$lib/stores'
import { get } from 'svelte/store'
const ITERATIONS_BEFORE_SLOW_REFRESH = 10
const ITERATIONS_BEFORE_SUPER_SLOW_REFRESH = 100
export async function waitJob(id: string, forceWorkspace?: string) {
const workspace = forceWorkspace || get(workspaceStore)
if (!id) {
return
}
if (!workspace) {
throw new Error('Workspace not found')
}
let syncIteration: number = 0
let errorIteration: number = 0
let job: any
return new Promise((resolve, reject) => {
async function checkJob() {
try {
const maybeJob = await JobService.getCompletedJobResultMaybe({
workspace: workspace!,
id,
getStarted: false
})
if (maybeJob.completed) {
job = { ...maybeJob, id }
if (!job.success && typeof job.result === 'object' && 'error' in job.result) {
reject(job.result.error)
} else {
resolve(job.result)
}
return
}
} catch (err) {
errorIteration += 1
if (errorIteration === 5) {
try {
await cancelJob(id, workspace!)
return
} catch (err) {
console.error(err)
}
}
}
syncIteration++
let nextIteration = 50
if (syncIteration > ITERATIONS_BEFORE_SLOW_REFRESH) {
nextIteration = 500
} else if (syncIteration > ITERATIONS_BEFORE_SUPER_SLOW_REFRESH) {
nextIteration = 2000
}
setTimeout(checkJob, nextIteration)
}
job = undefined
checkJob()
})
}
async function cancelJob(id: string, workspace: string) {
if (id) {
try {
await JobService.cancelQueuedJob({
workspace,
id,
requestBody: {}
})
} catch (err) {
console.error(err)
}
}
}