mirror of
https://github.com/windmill-labs/windmill.git
synced 2026-08-19 08:01:25 +00:00
86 lines
1.7 KiB
TypeScript
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)
|
|
}
|
|
}
|
|
}
|