@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
|
@@ -191,6 +191,9 @@ async function getWorkersFromMixedPersistence(offset, limit, query) {
|
|
|
191
191
|
...transformToWorkerData(dbRecords, 'database'),
|
|
192
192
|
...transformToWorkerData(redisRecords, 'redis'),
|
|
193
193
|
];
|
|
194
|
+
if (workers.length === 0) {
|
|
195
|
+
return getWorkersFromFileFallback(limit, query.includeInactive === true);
|
|
196
|
+
}
|
|
194
197
|
return {
|
|
195
198
|
workers,
|
|
196
199
|
total: dbRecords.length + redisRecords.length >= limit
|
|
@@ -216,6 +219,9 @@ async function getWorkersFromSinglePersistence(persistenceDriver, offset, limit,
|
|
|
216
219
|
try {
|
|
217
220
|
const normalizedDriver = normalizeDriver(persistenceDriver);
|
|
218
221
|
const driverRecords = await WorkerFactory.listPersistedRecords({ driver: normalizedDriver }, { offset, limit, includeInactive: query.includeInactive });
|
|
222
|
+
if (driverRecords.length === 0) {
|
|
223
|
+
return getWorkersFromFileFallback(limit, query.includeInactive === true);
|
|
224
|
+
}
|
|
219
225
|
const workers = transformToWorkerData(driverRecords, normalizedDriver);
|
|
220
226
|
return {
|
|
221
227
|
workers,
|
|
@@ -236,6 +242,31 @@ async function getWorkersFromSinglePersistence(persistenceDriver, offset, limit,
|
|
|
236
242
|
};
|
|
237
243
|
}
|
|
238
244
|
}
|
|
245
|
+
async function getWorkersFromFileFallback(limit, includeInactive) {
|
|
246
|
+
try {
|
|
247
|
+
const discovered = await WorkerFactory.listFileBackedRecords();
|
|
248
|
+
const filtered = includeInactive
|
|
249
|
+
? discovered
|
|
250
|
+
: discovered.filter((record) => record.activeStatus !== false);
|
|
251
|
+
return {
|
|
252
|
+
workers: transformToWorkerData(filtered, 'memory'),
|
|
253
|
+
total: filtered.length,
|
|
254
|
+
drivers: getAvailableDriversFromDrivers(['memory']),
|
|
255
|
+
effectiveLimit: limit,
|
|
256
|
+
prePaginated: false,
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
Logger.debug('File-backed worker fallback failed', error);
|
|
261
|
+
return {
|
|
262
|
+
workers: [],
|
|
263
|
+
total: 0,
|
|
264
|
+
drivers: getAvailableDriversFromDrivers(['memory']),
|
|
265
|
+
effectiveLimit: limit,
|
|
266
|
+
prePaginated: false,
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
}
|
|
239
270
|
const normalizeDriver = (driver) => {
|
|
240
271
|
if (driver === 'db' || driver === 'database')
|
|
241
272
|
return 'database';
|
|
@@ -402,18 +433,18 @@ async function getQueueData() {
|
|
|
402
433
|
// Get queue statistics based on QUEUE_DRIVER
|
|
403
434
|
switch (queueDriver) {
|
|
404
435
|
case 'redis':
|
|
405
|
-
return getRedisQueueData();
|
|
436
|
+
return await getRedisQueueData();
|
|
406
437
|
case 'database':
|
|
407
|
-
return getDatabaseQueueData();
|
|
438
|
+
return await getDatabaseQueueData();
|
|
408
439
|
case 'db':
|
|
409
|
-
return getDatabaseQueueData();
|
|
440
|
+
return await getDatabaseQueueData();
|
|
410
441
|
default:
|
|
411
|
-
return getMemoryQueueData();
|
|
442
|
+
return await getMemoryQueueData();
|
|
412
443
|
}
|
|
413
444
|
}
|
|
414
445
|
catch (error) {
|
|
415
446
|
Logger.error('Error fetching queue data:', error);
|
|
416
|
-
return getMemoryQueueData();
|
|
447
|
+
return await getMemoryQueueData();
|
|
417
448
|
}
|
|
418
449
|
}
|
|
419
450
|
async function getRedisQueueData() {
|
|
@@ -472,13 +503,13 @@ async function getDatabaseQueueData() {
|
|
|
472
503
|
const { useEnsureDbConnected } = await import('@zintrust/core');
|
|
473
504
|
const db = await useEnsureDbConnected();
|
|
474
505
|
// Get queue statistics from actual database tables using proper query builder
|
|
475
|
-
const queueStats =
|
|
506
|
+
const queueStats = await db
|
|
476
507
|
.table('queue_jobs')
|
|
477
508
|
.select('COUNT(DISTINCT queue) as totalQueues')
|
|
478
509
|
.selectAs('COUNT(*)', 'totalJobs')
|
|
479
510
|
.selectAs('SUM(CASE WHEN reserved_at IS NOT NULL AND failed_at IS NULL THEN 1 ELSE 0 END)', 'processingJobs')
|
|
480
511
|
.selectAs('SUM(CASE WHEN failed_at IS NOT NULL THEN 1 ELSE 0 END)', 'failedJobs')
|
|
481
|
-
.first()
|
|
512
|
+
.first();
|
|
482
513
|
const stats = queueStats || {
|
|
483
514
|
totalQueues: 0,
|
|
484
515
|
totalJobs: 0,
|
|
@@ -582,7 +613,8 @@ async function enrichWithDetails(workers) {
|
|
|
582
613
|
async function buildWorkerDetails(worker) {
|
|
583
614
|
try {
|
|
584
615
|
const persistenceOverride = resolvePersistenceOverride(worker.driver);
|
|
585
|
-
const persisted = await WorkerFactory.getPersisted(worker.name, persistenceOverride)
|
|
616
|
+
const persisted = (await WorkerFactory.getPersisted(worker.name, persistenceOverride)) ??
|
|
617
|
+
(await WorkerFactory.getFileBackedRecord(worker.name));
|
|
586
618
|
const health = await getWorkerHealthSnapshot(worker.name, worker.health);
|
|
587
619
|
const metrics = await getWorkerMetricsSnapshot(worker.name, worker);
|
|
588
620
|
const configuration = buildWorkerConfiguration(worker, persisted);
|
|
@@ -730,6 +762,12 @@ export async function getWorkerDetails(name, driver) {
|
|
|
730
762
|
worker = buildWorkerFromRecord(record, normalizedDriver);
|
|
731
763
|
}
|
|
732
764
|
}
|
|
765
|
+
if (!worker) {
|
|
766
|
+
const fileBacked = await WorkerFactory.getFileBackedRecord(name);
|
|
767
|
+
if (fileBacked) {
|
|
768
|
+
worker = buildWorkerFromRecord(fileBacked, 'memory');
|
|
769
|
+
}
|
|
770
|
+
}
|
|
733
771
|
if (!worker) {
|
|
734
772
|
throw ErrorFactory.createWorkerError(`Worker ${name} not found`);
|
|
735
773
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -24,7 +24,7 @@ export { MultiQueueWorker } from './MultiQueueWorker';
|
|
|
24
24
|
export { WorkerVersioning } from './WorkerVersioning';
|
|
25
25
|
export { WorkerFactory } from './WorkerFactory';
|
|
26
26
|
export type { ProcessorResolver, WorkerFactoryConfig, WorkerPersistenceConfig, } from './WorkerFactory';
|
|
27
|
-
export { WorkerInit } from './WorkerInit';
|
|
27
|
+
export { buildFileBackedAutoStartTasks, selectAutoStartNames, selectAutoStartTasks, WorkerInit, } from './WorkerInit';
|
|
28
28
|
export { WorkerShutdown } from './WorkerShutdown';
|
|
29
29
|
export { WorkerController } from './http/WorkerController';
|
|
30
30
|
export { registerWorkerRoutes } from './routes/workers';
|
package/dist/index.js
CHANGED
|
@@ -1,14 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @zintrust/workers v0.1.52
|
|
3
|
-
*
|
|
4
|
-
* ZinTrust Framework Package
|
|
5
|
-
*
|
|
6
|
-
* Build Information:
|
|
7
|
-
* Built: 2026-03-20T13:12:38.169Z
|
|
8
|
-
* Node: >=20.0.0
|
|
9
|
-
* License: MIT
|
|
10
|
-
*
|
|
11
|
-
*/
|
|
12
1
|
/**
|
|
13
2
|
* Worker Management System - Public API
|
|
14
3
|
*
|
|
@@ -42,7 +31,7 @@ export { MultiQueueWorker } from './MultiQueueWorker.js';
|
|
|
42
31
|
export { WorkerVersioning } from './WorkerVersioning.js';
|
|
43
32
|
// Factory & Lifecycle
|
|
44
33
|
export { WorkerFactory } from './WorkerFactory.js';
|
|
45
|
-
export { WorkerInit } from './WorkerInit.js';
|
|
34
|
+
export { buildFileBackedAutoStartTasks, selectAutoStartNames, selectAutoStartTasks, WorkerInit, } from './WorkerInit.js';
|
|
46
35
|
export { WorkerShutdown } from './WorkerShutdown.js';
|
|
47
36
|
// HTTP Controllers & Routes
|
|
48
37
|
export { WorkerController } from './http/WorkerController.js';
|
|
@@ -56,4 +45,4 @@ export { NotificationWorker } from './NotificationWorker.js';
|
|
|
56
45
|
* Available at runtime for debugging and health checks
|
|
57
46
|
*/
|
|
58
47
|
export const _ZINTRUST_WORKERS_VERSION = '0.1.0';
|
|
59
|
-
export const _ZINTRUST_WORKERS_BUILD_DATE = '
|
|
48
|
+
export const _ZINTRUST_WORKERS_BUILD_DATE = '__BUILD_DATE__';
|
package/dist/register.d.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
import type { CliCommandProvider } from '@zintrust/core/cli';
|
|
2
1
|
type Registry = {
|
|
3
2
|
register: (id: string, provider: CliCommandProvider) => void;
|
|
4
3
|
};
|
|
4
|
+
type CliCommandProvider = {
|
|
5
|
+
getCommand: () => unknown;
|
|
6
|
+
name?: string;
|
|
7
|
+
};
|
|
5
8
|
export declare function registerWorkerCliCommands(registry: Registry): void;
|
|
6
9
|
export {};
|
package/dist/register.js
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
const commandModule = (await (async () => {
|
|
2
|
-
|
|
2
|
+
const workerCommandsSpecifier = '@zintrust/core/worker-commands';
|
|
3
|
+
try {
|
|
4
|
+
return (await import(workerCommandsSpecifier));
|
|
5
|
+
}
|
|
6
|
+
catch {
|
|
7
|
+
return (await import('@zintrust/core/cli'));
|
|
8
|
+
}
|
|
3
9
|
})());
|
|
4
10
|
const getWorkerProviders = () => {
|
|
5
11
|
const { WorkerCommands } = commandModule;
|
|
@@ -27,9 +33,9 @@ registerWorkerCliCommands({
|
|
|
27
33
|
},
|
|
28
34
|
});
|
|
29
35
|
try {
|
|
30
|
-
const
|
|
31
|
-
if (
|
|
32
|
-
registerWorkerCliCommands(
|
|
36
|
+
const coreCli = (await import('@zintrust/core/cli'));
|
|
37
|
+
if (coreCli.OptionalCliCommandRegistry !== undefined) {
|
|
38
|
+
registerWorkerCliCommands(coreCli.OptionalCliCommandRegistry);
|
|
33
39
|
}
|
|
34
40
|
}
|
|
35
41
|
catch {
|
package/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zintrust/workers",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.27",
|
|
4
|
+
"description": "Worker orchestration and background job management for ZinTrust.",
|
|
4
5
|
"private": false,
|
|
5
6
|
"type": "module",
|
|
6
7
|
"main": "./dist/index.js",
|
|
@@ -39,7 +40,7 @@
|
|
|
39
40
|
"node": ">=20.0.0"
|
|
40
41
|
},
|
|
41
42
|
"peerDependencies": {
|
|
42
|
-
"@zintrust/core": "^0.4.
|
|
43
|
+
"@zintrust/core": "^0.4.27",
|
|
43
44
|
"@zintrust/queue-monitor": "*",
|
|
44
45
|
"@zintrust/queue-redis": "*"
|
|
45
46
|
},
|
|
@@ -54,11 +55,21 @@
|
|
|
54
55
|
"publishConfig": {
|
|
55
56
|
"access": "public"
|
|
56
57
|
},
|
|
58
|
+
"keywords": [
|
|
59
|
+
"zintrust",
|
|
60
|
+
"workers",
|
|
61
|
+
"jobs",
|
|
62
|
+
"queue",
|
|
63
|
+
"orchestration"
|
|
64
|
+
],
|
|
65
|
+
"scripts": {
|
|
66
|
+
"build": "node scripts/generate-embedded-assets.mjs && tsc -p tsconfig.json && node ../../scripts/fix-dist-esm-imports.mjs dist",
|
|
67
|
+
"prepublishOnly": "npm run build"
|
|
68
|
+
},
|
|
57
69
|
"dependencies": {
|
|
58
70
|
"@opentelemetry/api": "^1.9.0",
|
|
59
71
|
"hot-shots": "^14.2.0",
|
|
60
72
|
"ioredis": "^5.10.0",
|
|
61
|
-
"ml.js": "^0.0.1",
|
|
62
73
|
"prom-client": "^15.1.3",
|
|
63
74
|
"simple-statistics": "^7.8.9"
|
|
64
75
|
}
|