@zintrust/workers 0.4.3 → 0.4.27
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/README.md +26 -0
- package/dist/BroadcastWorker.d.ts +5 -0
- package/dist/NotificationWorker.d.ts +5 -0
- package/dist/WorkerFactory.d.ts +8 -0
- package/dist/WorkerFactory.js +305 -27
- package/dist/WorkerInit.d.ts +17 -0
- package/dist/WorkerInit.js +54 -2
- package/dist/build-manifest.json +12 -12
- package/dist/createQueueWorker.d.ts +5 -0
- package/dist/createQueueWorker.js +13 -2
- package/dist/dashboard/workers-api.js +46 -8
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -13
- package/dist/register.d.ts +4 -1
- package/dist/register.js +10 -4
- package/package.json +14 -3
- package/src/WorkerFactory.ts +439 -30
- package/src/WorkerInit.ts +81 -3
- package/src/createQueueWorker.ts +18 -2
- package/src/dashboard/workers-api.ts +60 -13
- package/src/index.ts +6 -1
- package/src/register.ts +14 -6
|
@@ -278,6 +278,10 @@ async function getWorkersFromMixedPersistence(
|
|
|
278
278
|
...transformToWorkerData(redisRecords, 'redis'),
|
|
279
279
|
];
|
|
280
280
|
|
|
281
|
+
if (workers.length === 0) {
|
|
282
|
+
return getWorkersFromFileFallback(limit, query.includeInactive === true);
|
|
283
|
+
}
|
|
284
|
+
|
|
281
285
|
return {
|
|
282
286
|
workers,
|
|
283
287
|
total:
|
|
@@ -312,6 +316,11 @@ async function getWorkersFromSinglePersistence(
|
|
|
312
316
|
{ driver: normalizedDriver },
|
|
313
317
|
{ offset, limit, includeInactive: query.includeInactive }
|
|
314
318
|
);
|
|
319
|
+
|
|
320
|
+
if (driverRecords.length === 0) {
|
|
321
|
+
return getWorkersFromFileFallback(limit, query.includeInactive === true);
|
|
322
|
+
}
|
|
323
|
+
|
|
315
324
|
const workers = transformToWorkerData(driverRecords, normalizedDriver);
|
|
316
325
|
|
|
317
326
|
return {
|
|
@@ -333,6 +342,35 @@ async function getWorkersFromSinglePersistence(
|
|
|
333
342
|
}
|
|
334
343
|
}
|
|
335
344
|
|
|
345
|
+
async function getWorkersFromFileFallback(
|
|
346
|
+
limit: number,
|
|
347
|
+
includeInactive: boolean
|
|
348
|
+
): Promise<PersistenceResult> {
|
|
349
|
+
try {
|
|
350
|
+
const discovered = await WorkerFactory.listFileBackedRecords();
|
|
351
|
+
const filtered = includeInactive
|
|
352
|
+
? discovered
|
|
353
|
+
: discovered.filter((record) => record.activeStatus !== false);
|
|
354
|
+
|
|
355
|
+
return {
|
|
356
|
+
workers: transformToWorkerData(filtered, 'memory'),
|
|
357
|
+
total: filtered.length,
|
|
358
|
+
drivers: getAvailableDriversFromDrivers(['memory']),
|
|
359
|
+
effectiveLimit: limit,
|
|
360
|
+
prePaginated: false,
|
|
361
|
+
};
|
|
362
|
+
} catch (error) {
|
|
363
|
+
Logger.debug('File-backed worker fallback failed', error);
|
|
364
|
+
return {
|
|
365
|
+
workers: [],
|
|
366
|
+
total: 0,
|
|
367
|
+
drivers: getAvailableDriversFromDrivers(['memory']),
|
|
368
|
+
effectiveLimit: limit,
|
|
369
|
+
prePaginated: false,
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
|
|
336
374
|
const normalizeDriver = (driver: string): WorkerDriver => {
|
|
337
375
|
if (driver === 'db' || driver === 'database') return 'database';
|
|
338
376
|
if (driver === 'redis') return 'redis';
|
|
@@ -527,17 +565,17 @@ async function getQueueData(): Promise<QueueData> {
|
|
|
527
565
|
// Get queue statistics based on QUEUE_DRIVER
|
|
528
566
|
switch (queueDriver) {
|
|
529
567
|
case 'redis':
|
|
530
|
-
return getRedisQueueData();
|
|
568
|
+
return await getRedisQueueData();
|
|
531
569
|
case 'database':
|
|
532
|
-
return getDatabaseQueueData();
|
|
570
|
+
return await getDatabaseQueueData();
|
|
533
571
|
case 'db':
|
|
534
|
-
return getDatabaseQueueData();
|
|
572
|
+
return await getDatabaseQueueData();
|
|
535
573
|
default:
|
|
536
|
-
return getMemoryQueueData();
|
|
574
|
+
return await getMemoryQueueData();
|
|
537
575
|
}
|
|
538
576
|
} catch (error) {
|
|
539
577
|
Logger.error('Error fetching queue data:', error);
|
|
540
|
-
return getMemoryQueueData();
|
|
578
|
+
return await getMemoryQueueData();
|
|
541
579
|
}
|
|
542
580
|
}
|
|
543
581
|
|
|
@@ -603,7 +641,12 @@ async function getDatabaseQueueData(): Promise<QueueData> {
|
|
|
603
641
|
const db = await useEnsureDbConnected();
|
|
604
642
|
|
|
605
643
|
// Get queue statistics from actual database tables using proper query builder
|
|
606
|
-
const queueStats
|
|
644
|
+
const queueStats: {
|
|
645
|
+
totalQueues: number;
|
|
646
|
+
totalJobs: number;
|
|
647
|
+
processingJobs: number;
|
|
648
|
+
failedJobs: number;
|
|
649
|
+
} | null = await db
|
|
607
650
|
.table('queue_jobs')
|
|
608
651
|
.select('COUNT(DISTINCT queue) as totalQueues')
|
|
609
652
|
.selectAs('COUNT(*)', 'totalJobs')
|
|
@@ -612,12 +655,7 @@ async function getDatabaseQueueData(): Promise<QueueData> {
|
|
|
612
655
|
'processingJobs'
|
|
613
656
|
)
|
|
614
657
|
.selectAs('SUM(CASE WHEN failed_at IS NOT NULL THEN 1 ELSE 0 END)', 'failedJobs')
|
|
615
|
-
.first()
|
|
616
|
-
totalQueues: number;
|
|
617
|
-
totalJobs: number;
|
|
618
|
-
processingJobs: number;
|
|
619
|
-
failedJobs: number;
|
|
620
|
-
} | null;
|
|
658
|
+
.first();
|
|
621
659
|
|
|
622
660
|
const stats = queueStats || {
|
|
623
661
|
totalQueues: 0,
|
|
@@ -733,7 +771,9 @@ async function enrichWithDetails(workers: WorkerData[]): Promise<WorkerData[]> {
|
|
|
733
771
|
async function buildWorkerDetails(worker: WorkerData): Promise<WorkerData> {
|
|
734
772
|
try {
|
|
735
773
|
const persistenceOverride = resolvePersistenceOverride(worker.driver);
|
|
736
|
-
const persisted =
|
|
774
|
+
const persisted =
|
|
775
|
+
(await WorkerFactory.getPersisted(worker.name, persistenceOverride)) ??
|
|
776
|
+
(await WorkerFactory.getFileBackedRecord(worker.name));
|
|
737
777
|
const health = await getWorkerHealthSnapshot(worker.name, worker.health);
|
|
738
778
|
const metrics = await getWorkerMetricsSnapshot(worker.name, worker);
|
|
739
779
|
const configuration = buildWorkerConfiguration(worker, persisted);
|
|
@@ -896,6 +936,13 @@ export async function getWorkerDetails(name: string, driver?: string): Promise<W
|
|
|
896
936
|
}
|
|
897
937
|
}
|
|
898
938
|
|
|
939
|
+
if (!worker) {
|
|
940
|
+
const fileBacked = await WorkerFactory.getFileBackedRecord(name);
|
|
941
|
+
if (fileBacked) {
|
|
942
|
+
worker = buildWorkerFromRecord(fileBacked, 'memory');
|
|
943
|
+
}
|
|
944
|
+
}
|
|
945
|
+
|
|
899
946
|
if (!worker) {
|
|
900
947
|
throw ErrorFactory.createWorkerError(`Worker ${name} not found`);
|
|
901
948
|
}
|
package/src/index.ts
CHANGED
|
@@ -44,7 +44,12 @@ export type {
|
|
|
44
44
|
WorkerFactoryConfig,
|
|
45
45
|
WorkerPersistenceConfig,
|
|
46
46
|
} from './WorkerFactory';
|
|
47
|
-
export {
|
|
47
|
+
export {
|
|
48
|
+
buildFileBackedAutoStartTasks,
|
|
49
|
+
selectAutoStartNames,
|
|
50
|
+
selectAutoStartTasks,
|
|
51
|
+
WorkerInit,
|
|
52
|
+
} from './WorkerInit';
|
|
48
53
|
export { WorkerShutdown } from './WorkerShutdown';
|
|
49
54
|
|
|
50
55
|
// HTTP Controllers & Routes
|
package/src/register.ts
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
import type { CliCommandProvider } from '@zintrust/core/cli';
|
|
2
|
-
|
|
3
1
|
type Registry = {
|
|
4
2
|
register: (id: string, provider: CliCommandProvider) => void;
|
|
5
3
|
};
|
|
6
4
|
|
|
5
|
+
type CliCommandProvider = {
|
|
6
|
+
getCommand: () => unknown;
|
|
7
|
+
name?: string;
|
|
8
|
+
};
|
|
9
|
+
|
|
7
10
|
type WorkerCommandsModule = {
|
|
8
11
|
WorkerCommands: {
|
|
9
12
|
createWorkerListCommand: () => CliCommandProvider;
|
|
@@ -17,7 +20,12 @@ type WorkerCommandsModule = {
|
|
|
17
20
|
};
|
|
18
21
|
|
|
19
22
|
const commandModule = (await (async (): Promise<WorkerCommandsModule> => {
|
|
20
|
-
|
|
23
|
+
const workerCommandsSpecifier = '@zintrust/core/worker-commands';
|
|
24
|
+
try {
|
|
25
|
+
return (await import(workerCommandsSpecifier)) as unknown as WorkerCommandsModule;
|
|
26
|
+
} catch {
|
|
27
|
+
return (await import('@zintrust/core/cli')) as unknown as WorkerCommandsModule;
|
|
28
|
+
}
|
|
21
29
|
})()) satisfies WorkerCommandsModule;
|
|
22
30
|
|
|
23
31
|
const getWorkerProviders = (): Array<[string, CliCommandProvider]> => {
|
|
@@ -56,12 +64,12 @@ registerWorkerCliCommands({
|
|
|
56
64
|
});
|
|
57
65
|
|
|
58
66
|
try {
|
|
59
|
-
const
|
|
67
|
+
const coreCli = (await import('@zintrust/core/cli')) as unknown as {
|
|
60
68
|
OptionalCliCommandRegistry?: Registry;
|
|
61
69
|
};
|
|
62
70
|
|
|
63
|
-
if (
|
|
64
|
-
registerWorkerCliCommands(
|
|
71
|
+
if (coreCli.OptionalCliCommandRegistry !== undefined) {
|
|
72
|
+
registerWorkerCliCommands(coreCli.OptionalCliCommandRegistry);
|
|
65
73
|
}
|
|
66
74
|
} catch {
|
|
67
75
|
// no-op
|