Persist offer assistant jobs and recover results across closed views
This commit is contained in:
@@ -0,0 +1,23 @@
|
||||
import {accountRequest} from './accountRequest.js';
|
||||
import {awaitWithAbort} from './abortable.js';
|
||||
export const listAiJobs=ikn=>accountRequest('/api/me/ai-jobs?'+new URLSearchParams({ikn}));
|
||||
export const getAiJob=id=>accountRequest('/api/me/ai-jobs?'+new URLSearchParams({id}));
|
||||
export const cancelAiJob=id=>accountRequest('/api/me/ai-jobs?'+new URLSearchParams({id}),{method:'DELETE'});
|
||||
export const retryAiJob=id=>accountRequest('/api/me/ai-jobs?'+new URLSearchParams({id}),{method:'POST',body:JSON.stringify({action:'retry'})});
|
||||
export async function runDurableAiJob(operation,input,{signal,check,onProgress=()=>{},request=accountRequest,pollMs=1500}={}) {
|
||||
check();
|
||||
const started=await request('/api/me/ai-jobs',{method:'POST',signal,body:JSON.stringify({operation,input,requestId:crypto.randomUUID()})});
|
||||
let job=started.job;
|
||||
while(true) {
|
||||
check();
|
||||
if(!job || !['queued','running','completed','failed','interrupted','cancelled'].includes(job.state))throw new Error('AI iş durumu geçersiz. Kayıtlı işler bölümünden kontrol edin.');
|
||||
onProgress(job);
|
||||
if(job.state==='completed')return job.result;
|
||||
if(['failed','interrupted','cancelled'].includes(job.state))throw new Error(job.error || 'AI işi iptal edildi.');
|
||||
let timer;
|
||||
try {await awaitWithAbort(new Promise(resolve=>{timer=setTimeout(resolve,pollMs);}),signal,()=>clearTimeout(timer));}
|
||||
finally {clearTimeout(timer);}
|
||||
check();
|
||||
job=(await request('/api/me/ai-jobs?'+new URLSearchParams({id:job.id}),{signal})).job;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user