@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.
@@ -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 = (await db
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()) as {
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 = await WorkerFactory.getPersisted(worker.name, persistenceOverride);
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 { WorkerInit } from './WorkerInit';
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
- return (await import('@zintrust/core/cli')) as unknown as WorkerCommandsModule;
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 core = (await import('@zintrust/core/cli')) as unknown as {
67
+ const coreCli = (await import('@zintrust/core/cli')) as unknown as {
60
68
  OptionalCliCommandRegistry?: Registry;
61
69
  };
62
70
 
63
- if (core.OptionalCliCommandRegistry !== undefined) {
64
- registerWorkerCliCommands(core.OptionalCliCommandRegistry);
71
+ if (coreCli.OptionalCliCommandRegistry !== undefined) {
72
+ registerWorkerCliCommands(coreCli.OptionalCliCommandRegistry);
65
73
  }
66
74
  } catch {
67
75
  // no-op