11import { AdminForthPlugin , Filters , Sorts } from "adminforth" ;
2- import type { IAdminForth , IHttpServer , AdminForthResourcePages , AdminForthResourceColumn , AdminForthDataTypes , AdminForthResource , AdminUser , AdminForthComponentDeclarationFull } from "adminforth" ;
2+ import type { IAdminForth , IHttpServer , AdminForthResource , AdminUser , AdminForthComponentDeclarationFull } from "adminforth" ;
33import type { PluginOptions } from './types.js' ;
44import { afLogger } from "adminforth" ;
55import pLimit from 'p-limit' ;
66import { Level } from 'level' ;
77import fs from 'fs/promises' ;
8+ import { Mutex , MutexInterface , Semaphore , SemaphoreInterface , withTimeout } from 'async-mutex' ;
9+
10+ const mutex = new Mutex ( ) ;
811
912type TaskStatus = 'SCHEDULED' | 'IN_PROGRESS' | 'DONE' | 'FAILED' ;
1013type setStateFieldParams = ( state : Record < string , any > ) => void ;
1114type getStateFieldParams = ( ) => any ;
12- type taskHandlerType = ( { setTaskStateField, getTaskStateField } : { setTaskStateField : setStateFieldParams ; getTaskStateField : getStateFieldParams } ) => Promise < void > ;
15+ type taskHandlerType = ( { jobId , setTaskStateField, getTaskStateField } : { jobId : string ; setTaskStateField : setStateFieldParams ; getTaskStateField : getStateFieldParams } ) => Promise < void > ;
1316type taskType = {
1417 skip ?: boolean ;
1518 state : Record < string , any > ;
@@ -146,7 +149,7 @@ export default class BackgroundJobsPlugin extends AdminForthPlugin {
146149 adminUser : AdminUser ,
147150 tasks : taskType [ ] ,
148151 jobHandlerName : string ,
149- ) {
152+ ) : Promise < string > {
150153
151154 const handleTask : taskHandlerType = this . taskHandlers [ jobHandlerName ] ;
152155 if ( ! handleTask ) {
@@ -161,6 +164,7 @@ export default class BackgroundJobsPlugin extends AdminForthPlugin {
161164 [ this . options . progressField ] : 0 ,
162165 [ this . options . statusField ] : 'IN_PROGRESS' ,
163166 [ this . options . jobHandlerField ] : jobHandlerName ,
167+ [ this . options . stateField ] : '{}'
164168 }
165169
166170 const creationResult = await this . adminforth . resource ( this . getResourceId ( ) ) . create ( objectToSave ) ;
@@ -193,6 +197,7 @@ export default class BackgroundJobsPlugin extends AdminForthPlugin {
193197 await Promise . all ( createTaskRecordsPromises ) ;
194198
195199 this . runProcessingTasks ( tasks , jobLevelDb , jobId , handleTask , parrallelLimit ) ;
200+ return jobId ;
196201 }
197202
198203 private async runProcessingTasks (
@@ -238,7 +243,7 @@ export default class BackgroundJobsPlugin extends AdminForthPlugin {
238243
239244 //handling the task
240245 try {
241- await handleTask ( { setTaskStateField, getTaskStateField } ) ;
246+ await handleTask ( { jobId , setTaskStateField, getTaskStateField } ) ;
242247
243248 //Set task status to completed in level db
244249 await this . setLevelDbTaskStatusField ( jobLevelDb , taskIndex . toString ( ) , 'DONE' ) ;
@@ -348,6 +353,7 @@ export default class BackgroundJobsPlugin extends AdminForthPlugin {
348353 const state = jobRecord [ this . options . stateField ] ;
349354 const parsedState = JSON . parse ( state ) ;
350355 parsedState [ key ] = value ;
356+ this . adminforth . websocket . publish ( `/background-jobs` , { jobId, state : parsedState } ) ;
351357 await this . adminforth . resource ( this . getResourceId ( ) ) . update ( jobId , {
352358 [ this . options . stateField ] : JSON . stringify ( parsedState ) ,
353359 } ) ;
@@ -415,6 +421,7 @@ export default class BackgroundJobsPlugin extends AdminForthPlugin {
415421 createdAt : job [ this . options . createdAtField ] ,
416422 finishedAt : job [ this . options . finishedAtField ] || null ,
417423 status : job [ this . options . statusField ] ,
424+ state : JSON . parse ( job [ this . options . stateField ] ) ,
418425 progress : job [ this . options . progressField ] ,
419426 customComponent : this . jobCustomComponents [ job [ this . options . jobHandlerField ] ] ,
420427 }
0 commit comments