@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 +2 -2
- package/custom/NavbarJobs.vue +7 -0
- package/custom/utils.ts +1 -0
- package/dist/custom/NavbarJobs.vue +7 -0
- package/dist/custom/utils.ts +1 -0
- package/dist/index.js +7 -1
- package/index.ts +11 -4
- package/package.json +2 -1
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,
|
|
15
|
-
total size is
|
|
14
|
+
sent 12,501 bytes received 134 bytes 25,270.00 bytes/sec
|
|
15
|
+
total size is 12,016 speedup is 0.95
|
package/custom/NavbarJobs.vue
CHANGED
|
@@ -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
|
@@ -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/dist/custom/utils.ts
CHANGED
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,
|
|
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
|
+
"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
|
}
|