@adminforth/background-jobs 1.3.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build.log CHANGED
@@ -11,5 +11,5 @@ custom/StateToIcon.vue
11
11
  custom/tsconfig.json
12
12
  custom/utils.ts
13
13
 
14
- sent 12,276 bytes received 134 bytes 24,820.00 bytes/sec
15
- total size is 11,791 speedup is 0.95
14
+ sent 12,501 bytes received 134 bytes 25,270.00 bytes/sec
15
+ total size is 12,016 speedup is 0.95
@@ -97,11 +97,18 @@
97
97
  if (data.finishedAt) {
98
98
  jobs.value[jobIndex].finishedAt = data.finishedAt;
99
99
  }
100
+ if (data.state) {
101
+ jobs.value[jobIndex].state = {
102
+ ...jobs.value[jobIndex].state,
103
+ ...data.state,
104
+ };
105
+ }
100
106
  } else {
101
107
  jobs.value.unshift({
102
108
  id: data.jobId,
103
109
  name: data.name || 'Unknown Job',
104
110
  status: data.status || 'IN_PROGRESS',
111
+ state: data.state || {},
105
112
  progress: data.progress || 0,
106
113
  createdAt: data.createdAt || new Date().toISOString(),
107
114
  customComponent: data.customComponent,
package/custom/utils.ts CHANGED
@@ -3,6 +3,7 @@ export interface IJob {
3
3
  id: string;
4
4
  name: string;
5
5
  status: 'IN_PROGRESS' | 'DONE' | 'DONE_WITH_ERRORS' | 'CANCELLED';
6
+ state: Record<string, any>;
6
7
  progress: number; // 0 to 100
7
8
  createdAt: Date;
8
9
  finishedAt?: Date;
@@ -97,11 +97,18 @@
97
97
  if (data.finishedAt) {
98
98
  jobs.value[jobIndex].finishedAt = data.finishedAt;
99
99
  }
100
+ if (data.state) {
101
+ jobs.value[jobIndex].state = {
102
+ ...jobs.value[jobIndex].state,
103
+ ...data.state,
104
+ };
105
+ }
100
106
  } else {
101
107
  jobs.value.unshift({
102
108
  id: data.jobId,
103
109
  name: data.name || 'Unknown Job',
104
110
  status: data.status || 'IN_PROGRESS',
111
+ state: data.state || {},
105
112
  progress: data.progress || 0,
106
113
  createdAt: data.createdAt || new Date().toISOString(),
107
114
  customComponent: data.customComponent,
@@ -3,6 +3,7 @@ export interface IJob {
3
3
  id: string;
4
4
  name: string;
5
5
  status: 'IN_PROGRESS' | 'DONE' | 'DONE_WITH_ERRORS' | 'CANCELLED';
6
+ state: Record<string, any>;
6
7
  progress: number; // 0 to 100
7
8
  createdAt: Date;
8
9
  finishedAt?: Date;
package/dist/index.js CHANGED
@@ -12,6 +12,8 @@ import { afLogger } from "adminforth";
12
12
  import pLimit from 'p-limit';
13
13
  import { Level } from 'level';
14
14
  import fs from 'fs/promises';
15
+ import { Mutex } from 'async-mutex';
16
+ const mutex = new Mutex();
15
17
  export default class BackgroundJobsPlugin extends AdminForthPlugin {
16
18
  constructor(options) {
17
19
  super(options, import.meta.url);
@@ -147,6 +149,7 @@ export default class BackgroundJobsPlugin extends AdminForthPlugin {
147
149
  [this.options.progressField]: 0,
148
150
  [this.options.statusField]: 'IN_PROGRESS',
149
151
  [this.options.jobHandlerField]: jobHandlerName,
152
+ [this.options.stateField]: '{}'
150
153
  };
151
154
  const creationResult = yield this.adminforth.resource(this.getResourceId()).create(objectToSave);
152
155
  let createdRecord = null;
@@ -174,6 +177,7 @@ export default class BackgroundJobsPlugin extends AdminForthPlugin {
174
177
  });
175
178
  yield Promise.all(createTaskRecordsPromises);
176
179
  this.runProcessingTasks(tasks, jobLevelDb, jobId, handleTask, parrallelLimit);
180
+ return jobId;
177
181
  });
178
182
  }
179
183
  runProcessingTasks(tasks, jobLevelDb, jobId, handleTask, parrallelLimit) {
@@ -209,7 +213,7 @@ export default class BackgroundJobsPlugin extends AdminForthPlugin {
209
213
  this.adminforth.websocket.publish(`/background-jobs-task-update/${jobId}`, { taskIndex, status: "IN_PROGRESS" });
210
214
  //handling the task
211
215
  try {
212
- yield handleTask({ setTaskStateField, getTaskStateField });
216
+ yield handleTask({ jobId, setTaskStateField, getTaskStateField });
213
217
  //Set task status to completed in level db
214
218
  yield this.setLevelDbTaskStatusField(jobLevelDb, taskIndex.toString(), 'DONE');
215
219
  this.adminforth.websocket.publish(`/background-jobs-task-update/${jobId}`, { taskIndex, status: "DONE" });
@@ -319,6 +323,7 @@ export default class BackgroundJobsPlugin extends AdminForthPlugin {
319
323
  const state = jobRecord[this.options.stateField];
320
324
  const parsedState = JSON.parse(state);
321
325
  parsedState[key] = value;
326
+ this.adminforth.websocket.publish(`/background-jobs`, { jobId, state: parsedState });
322
327
  yield this.adminforth.resource(this.getResourceId()).update(jobId, {
323
328
  [this.options.stateField]: JSON.stringify(parsedState),
324
329
  });
@@ -385,6 +390,7 @@ export default class BackgroundJobsPlugin extends AdminForthPlugin {
385
390
  createdAt: job[this.options.createdAtField],
386
391
  finishedAt: job[this.options.finishedAtField] || null,
387
392
  status: job[this.options.statusField],
393
+ state: JSON.parse(job[this.options.stateField]),
388
394
  progress: job[this.options.progressField],
389
395
  customComponent: this.jobCustomComponents[job[this.options.jobHandlerField]],
390
396
  };
package/index.ts CHANGED
@@ -1,15 +1,18 @@
1
1
  import { 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";
3
3
  import type { PluginOptions } from './types.js';
4
4
  import { afLogger } from "adminforth";
5
5
  import pLimit from 'p-limit';
6
6
  import { Level } from 'level';
7
7
  import fs from 'fs/promises';
8
+ import {Mutex, MutexInterface, Semaphore, SemaphoreInterface, withTimeout} from 'async-mutex';
9
+
10
+ const mutex = new Mutex();
8
11
 
9
12
  type TaskStatus = 'SCHEDULED' | 'IN_PROGRESS' | 'DONE' | 'FAILED';
10
13
  type setStateFieldParams = (state: Record<string, any>) => void;
11
14
  type 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>;
13
16
  type taskType = {
14
17
  skip?: boolean;
15
18
  state: Record<string, any>;
@@ -146,7 +149,7 @@ export default class BackgroundJobsPlugin extends AdminForthPlugin {
146
149
  adminUser: AdminUser,
147
150
  tasks: taskType[],
148
151
  jobHandlerName: string,
149
- ) {
152
+ ): Promise<string> {
150
153
 
151
154
  const handleTask: taskHandlerType = this.taskHandlers[jobHandlerName];
152
155
  if (!handleTask) {
@@ -161,6 +164,7 @@ export default class BackgroundJobsPlugin extends AdminForthPlugin {
161
164
  [this.options.progressField]: 0,
162
165
  [this.options.statusField]: 'IN_PROGRESS',
163
166
  [this.options.jobHandlerField]: jobHandlerName,
167
+ [this.options.stateField]: '{}'
164
168
  }
165
169
 
166
170
  const creationResult = await this.adminforth.resource(this.getResourceId()).create(objectToSave);
@@ -193,6 +197,7 @@ export default class BackgroundJobsPlugin extends AdminForthPlugin {
193
197
  await Promise.all(createTaskRecordsPromises);
194
198
 
195
199
  this.runProcessingTasks(tasks, jobLevelDb, jobId, handleTask, parrallelLimit);
200
+ return jobId;
196
201
  }
197
202
 
198
203
  private async runProcessingTasks(
@@ -238,7 +243,7 @@ export default class BackgroundJobsPlugin extends AdminForthPlugin {
238
243
 
239
244
  //handling the task
240
245
  try {
241
- await handleTask({ setTaskStateField, getTaskStateField });
246
+ await handleTask({ jobId, setTaskStateField, getTaskStateField });
242
247
 
243
248
  //Set task status to completed in level db
244
249
  await this.setLevelDbTaskStatusField(jobLevelDb, taskIndex.toString(), 'DONE');
@@ -348,6 +353,7 @@ export default class BackgroundJobsPlugin extends AdminForthPlugin {
348
353
  const state = jobRecord[this.options.stateField];
349
354
  const parsedState = JSON.parse(state);
350
355
  parsedState[key] = value;
356
+ this.adminforth.websocket.publish(`/background-jobs`, { jobId, state: parsedState });
351
357
  await this.adminforth.resource(this.getResourceId()).update(jobId, {
352
358
  [this.options.stateField]: JSON.stringify(parsedState),
353
359
  });
@@ -415,6 +421,7 @@ export default class BackgroundJobsPlugin extends AdminForthPlugin {
415
421
  createdAt: job[this.options.createdAtField],
416
422
  finishedAt: job[this.options.finishedAtField] || null,
417
423
  status: job[this.options.statusField],
424
+ state: JSON.parse(job[this.options.stateField]),
418
425
  progress: job[this.options.progressField],
419
426
  customComponent: this.jobCustomComponents[job[this.options.jobHandlerField]],
420
427
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adminforth/background-jobs",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "type": "module",
@@ -21,6 +21,7 @@
21
21
  "dependencies": {
22
22
  "@vueuse/core": "^14.2.1",
23
23
  "adminforth": "latest",
24
+ "async-mutex": "^0.5.0",
24
25
  "level": "^10.0.0",
25
26
  "p-limit": "^7.3.0"
26
27
  }