Headless image-to-video UI queues jobs on the desktop ComfyUI instance with live SSE progress and Authentik SSO.
42 lines
949 B
TypeScript
42 lines
949 B
TypeScript
export default defineEventHandler(async (event) => {
|
|
const id = getRouterParam(event, 'id')
|
|
const job = id ? getJob(id) : undefined
|
|
if (!job) {
|
|
throw createError({ statusCode: 404, statusMessage: 'Job not found' })
|
|
}
|
|
|
|
const stream = createEventStream(event)
|
|
const send = async (payload: unknown) => {
|
|
await stream.push(JSON.stringify(payload))
|
|
}
|
|
|
|
await send({
|
|
type: 'hello',
|
|
status: job.status,
|
|
message: job.message,
|
|
progress: job.progress,
|
|
step: job.step,
|
|
maxStep: job.maxStep,
|
|
promptId: job.promptId,
|
|
elapsedMs: Date.now() - job.startedAt
|
|
})
|
|
|
|
for (const past of job.events) {
|
|
await send(past)
|
|
}
|
|
|
|
const unsubscribe = subscribeJob(job, (payload) => {
|
|
void send(payload).then(() => {
|
|
if (payload.type === 'complete' || payload.type === 'error') {
|
|
void stream.close()
|
|
}
|
|
})
|
|
})
|
|
|
|
stream.onClosed(() => {
|
|
unsubscribe()
|
|
})
|
|
|
|
return stream.send()
|
|
})
|