@acorex-platform/framework-server 0.0.15 → 0.0.18

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.
Files changed (106) hide show
  1. package/background-job/src/index.d.ts +3 -0
  2. package/background-job/src/index.d.ts.map +1 -1
  3. package/background-job/src/index.js +3 -0
  4. package/background-job/src/index.js.map +1 -1
  5. package/background-job/src/lib/background-job.module.d.ts +5 -0
  6. package/background-job/src/lib/background-job.module.d.ts.map +1 -1
  7. package/background-job/src/lib/background-job.module.js +11 -2
  8. package/background-job/src/lib/background-job.module.js.map +1 -1
  9. package/background-job/src/lib/background-job.service.d.ts.map +1 -1
  10. package/background-job/src/lib/background-job.service.js +34 -6
  11. package/background-job/src/lib/background-job.service.js.map +1 -1
  12. package/background-job/src/lib/bull-queue-root.module.d.ts +3 -0
  13. package/background-job/src/lib/bull-queue-root.module.d.ts.map +1 -1
  14. package/background-job/src/lib/bull-queue-root.module.js +11 -1
  15. package/background-job/src/lib/bull-queue-root.module.js.map +1 -1
  16. package/background-job/src/lib/execution/background-job-execution.service.d.ts +6 -1
  17. package/background-job/src/lib/execution/background-job-execution.service.d.ts.map +1 -1
  18. package/background-job/src/lib/execution/background-job-execution.service.js +99 -36
  19. package/background-job/src/lib/execution/background-job-execution.service.js.map +1 -1
  20. package/background-job/src/lib/execution/background-job-tenant.util.d.ts +9 -0
  21. package/background-job/src/lib/execution/background-job-tenant.util.d.ts.map +1 -0
  22. package/background-job/src/lib/execution/background-job-tenant.util.js +23 -0
  23. package/background-job/src/lib/execution/background-job-tenant.util.js.map +1 -0
  24. package/background-job/src/lib/queue/background-job-dispatcher.service.d.ts +7 -1
  25. package/background-job/src/lib/queue/background-job-dispatcher.service.d.ts.map +1 -1
  26. package/background-job/src/lib/queue/background-job-dispatcher.service.js +9 -3
  27. package/background-job/src/lib/queue/background-job-dispatcher.service.js.map +1 -1
  28. package/background-job/src/lib/queue/background-job-failed-reconcile.service.d.ts +18 -0
  29. package/background-job/src/lib/queue/background-job-failed-reconcile.service.d.ts.map +1 -0
  30. package/background-job/src/lib/queue/background-job-failed-reconcile.service.js +70 -0
  31. package/background-job/src/lib/queue/background-job-failed-reconcile.service.js.map +1 -0
  32. package/background-job/src/lib/queue/background-job.processor.d.ts +10 -1
  33. package/background-job/src/lib/queue/background-job.processor.d.ts.map +1 -1
  34. package/background-job/src/lib/queue/background-job.processor.js +45 -2
  35. package/background-job/src/lib/queue/background-job.processor.js.map +1 -1
  36. package/background-job/src/lib/queue/bull-queue-worker-registration.service.d.ts +27 -0
  37. package/background-job/src/lib/queue/bull-queue-worker-registration.service.d.ts.map +1 -0
  38. package/background-job/src/lib/queue/bull-queue-worker-registration.service.js +117 -0
  39. package/background-job/src/lib/queue/bull-queue-worker-registration.service.js.map +1 -0
  40. package/background-job/src/lib/store/background-job-schema.bootstrap.d.ts +3 -1
  41. package/background-job/src/lib/store/background-job-schema.bootstrap.d.ts.map +1 -1
  42. package/background-job/src/lib/store/background-job-schema.bootstrap.js +10 -5
  43. package/background-job/src/lib/store/background-job-schema.bootstrap.js.map +1 -1
  44. package/background-job/src/lib/store/background-job-store.service.d.ts +2 -2
  45. package/background-job/src/lib/store/background-job-store.service.d.ts.map +1 -1
  46. package/background-job/src/lib/store/background-job-store.service.js +10 -4
  47. package/background-job/src/lib/store/background-job-store.service.js.map +1 -1
  48. package/core/src/index.d.ts +1 -0
  49. package/core/src/index.d.ts.map +1 -1
  50. package/core/src/index.js +1 -0
  51. package/core/src/index.js.map +1 -1
  52. package/core/src/lib/entity-storage/entity-storage-middleware.service.d.ts +2 -0
  53. package/core/src/lib/entity-storage/entity-storage-middleware.service.d.ts.map +1 -1
  54. package/core/src/lib/entity-storage/entity-storage-middleware.service.js +6 -0
  55. package/core/src/lib/entity-storage/entity-storage-middleware.service.js.map +1 -1
  56. package/core/src/lib/entity-storage/entity-storage.module.d.ts.map +1 -1
  57. package/core/src/lib/entity-storage/entity-storage.module.js +2 -0
  58. package/core/src/lib/entity-storage/entity-storage.module.js.map +1 -1
  59. package/core/src/lib/expression-evaluator/expression-evaluator-scope-provider.service.d.ts +12 -0
  60. package/core/src/lib/expression-evaluator/expression-evaluator-scope-provider.service.d.ts.map +1 -0
  61. package/core/src/lib/expression-evaluator/expression-evaluator-scope-provider.service.js +31 -0
  62. package/core/src/lib/expression-evaluator/expression-evaluator-scope-provider.service.js.map +1 -0
  63. package/core/src/lib/expression-evaluator/expression-evaluator-scope.registry.d.ts +11 -0
  64. package/core/src/lib/expression-evaluator/expression-evaluator-scope.registry.d.ts.map +1 -0
  65. package/core/src/lib/expression-evaluator/expression-evaluator-scope.registry.js +29 -0
  66. package/core/src/lib/expression-evaluator/expression-evaluator-scope.registry.js.map +1 -0
  67. package/core/src/lib/expression-evaluator/expression-evaluator-scope.types.d.ts +7 -0
  68. package/core/src/lib/expression-evaluator/expression-evaluator-scope.types.d.ts.map +1 -0
  69. package/core/src/lib/expression-evaluator/expression-evaluator-scope.types.js +12 -0
  70. package/core/src/lib/expression-evaluator/expression-evaluator-scope.types.js.map +1 -0
  71. package/core/src/lib/expression-evaluator/expression-evaluator.module.d.ts +3 -0
  72. package/core/src/lib/expression-evaluator/expression-evaluator.module.d.ts.map +1 -0
  73. package/core/src/lib/expression-evaluator/expression-evaluator.module.js +31 -0
  74. package/core/src/lib/expression-evaluator/expression-evaluator.module.js.map +1 -0
  75. package/core/src/lib/expression-evaluator/expression-evaluator.service.d.ts +14 -0
  76. package/core/src/lib/expression-evaluator/expression-evaluator.service.d.ts.map +1 -0
  77. package/core/src/lib/expression-evaluator/expression-evaluator.service.js +32 -0
  78. package/core/src/lib/expression-evaluator/expression-evaluator.service.js.map +1 -0
  79. package/core/src/lib/expression-evaluator/index.d.ts +7 -0
  80. package/core/src/lib/expression-evaluator/index.d.ts.map +1 -0
  81. package/core/src/lib/expression-evaluator/index.js +10 -0
  82. package/core/src/lib/expression-evaluator/index.js.map +1 -0
  83. package/core/src/lib/expression-evaluator/session-expression-evaluator-scope.provider.d.ts +13 -0
  84. package/core/src/lib/expression-evaluator/session-expression-evaluator-scope.provider.d.ts.map +1 -0
  85. package/core/src/lib/expression-evaluator/session-expression-evaluator-scope.provider.js +61 -0
  86. package/core/src/lib/expression-evaluator/session-expression-evaluator-scope.provider.js.map +1 -0
  87. package/domain/providers/src/lib/utils/expression-evaluator.util.d.ts +3 -5
  88. package/domain/providers/src/lib/utils/expression-evaluator.util.d.ts.map +1 -1
  89. package/domain/providers/src/lib/utils/expression-evaluator.util.js +5 -60
  90. package/domain/providers/src/lib/utils/expression-evaluator.util.js.map +1 -1
  91. package/package.json +2 -2
  92. package/security/src/lib/auth/auth.controller.d.ts +16 -1
  93. package/security/src/lib/auth/auth.controller.d.ts.map +1 -1
  94. package/security/src/lib/auth/auth.controller.js +59 -2
  95. package/security/src/lib/auth/auth.controller.js.map +1 -1
  96. package/security/src/lib/auth/auth.service.d.ts.map +1 -1
  97. package/security/src/lib/auth/auth.service.js +8 -0
  98. package/security/src/lib/auth/auth.service.js.map +1 -1
  99. package/security/src/lib/entity-storage/policy-expression-evaluator.util.d.ts +5 -3
  100. package/security/src/lib/entity-storage/policy-expression-evaluator.util.d.ts.map +1 -1
  101. package/security/src/lib/entity-storage/policy-expression-evaluator.util.js +7 -58
  102. package/security/src/lib/entity-storage/policy-expression-evaluator.util.js.map +1 -1
  103. package/workflow/src/lib/runtime/workflow-expression-evaluator.service.d.ts +1 -3
  104. package/workflow/src/lib/runtime/workflow-expression-evaluator.service.d.ts.map +1 -1
  105. package/workflow/src/lib/runtime/workflow-expression-evaluator.service.js +3 -62
  106. package/workflow/src/lib/runtime/workflow-expression-evaluator.service.js.map +1 -1
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveBackgroundJobTenantId = resolveBackgroundJobTenantId;
4
+ exports.isBackgroundJobAccessibleToTenant = isBackgroundJobAccessibleToTenant;
5
+ //#region ----- Tenant helpers -----
6
+ /** Resolves the durable tenant scope for a job (top-level field preferred). */
7
+ function resolveBackgroundJobTenantId(job) {
8
+ return job.tenantId?.trim() || job.ownershipInfo?.tenantId?.trim() || '';
9
+ }
10
+ /**
11
+ * True when the session may access the job.
12
+ * Missing session tenant fails closed.
13
+ */
14
+ function isBackgroundJobAccessibleToTenant(job, sessionTenantId) {
15
+ const sessionTenant = sessionTenantId?.trim();
16
+ if (!sessionTenant) {
17
+ return false;
18
+ }
19
+ const jobTenant = resolveBackgroundJobTenantId(job);
20
+ return !!jobTenant && jobTenant === sessionTenant;
21
+ }
22
+ //#endregion
23
+ //# sourceMappingURL=background-job-tenant.util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"background-job-tenant.util.js","sourceRoot":"","sources":["../../../../../../../../libs/framework/server/background-job/src/lib/execution/background-job-tenant.util.ts"],"names":[],"mappings":";;AAKA,oEAIC;AAMD,8EAUC;AAvBD,oCAAoC;AAEpC,+EAA+E;AAC/E,SAAgB,4BAA4B,CAC1C,GAAyD;IAEzD,OAAO,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAC3E,CAAC;AAED;;;GAGG;AACH,SAAgB,iCAAiC,CAC/C,GAAyD,EACzD,eAA0C;IAE1C,MAAM,aAAa,GAAG,eAAe,EAAE,IAAI,EAAE,CAAC;IAC9C,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,SAAS,GAAG,4BAA4B,CAAC,GAAG,CAAC,CAAC;IACpD,OAAO,CAAC,CAAC,SAAS,IAAI,SAAS,KAAK,aAAa,CAAC;AACpD,CAAC;AAED,YAAY"}
@@ -6,7 +6,13 @@ export declare class BackgroundJobDispatcherService {
6
6
  private readonly scheduler;
7
7
  private readonly logger;
8
8
  constructor(jobStore: BackgroundJobStoreService, scheduler: BackgroundJobRetrySchedulerService);
9
- /** Marks the job queued and hands it to the queue (or inline executor). */
9
+ /**
10
+ * Marks the job queued and hands it to the queue (or inline executor).
11
+ *
12
+ * Uses engine storage reads/writes so dispatch works when the caller session
13
+ * tenant differs from the job's durable `tenantId` (e.g. platform admin
14
+ * password-reset for a user in another tenant).
15
+ */
10
16
  dispatch(jobId: string, attemptTrigger: AXPBackgroundJobAttemptTrigger, delayMs?: number): Promise<void>;
11
17
  }
12
18
  //# sourceMappingURL=background-job-dispatcher.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"background-job-dispatcher.service.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/framework/server/background-job/src/lib/queue/background-job-dispatcher.service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,kDAAkD,CAAC;AACvG,OAAO,EAAE,kCAAkC,EAAE,MAAM,qDAAqD,CAAC;AACzG,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAIlF,qBACa,8BAA8B;IAIvC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAJ5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmD;gBAGvD,QAAQ,EAAE,yBAAyB,EACnC,SAAS,EAAE,kCAAkC;IAGhE,2EAA2E;IACrE,QAAQ,CACZ,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,8BAA8B,EAC9C,OAAO,SAAI,GACV,OAAO,CAAC,IAAI,CAAC;CAsBjB"}
1
+ {"version":3,"file":"background-job-dispatcher.service.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/framework/server/background-job/src/lib/queue/background-job-dispatcher.service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,kDAAkD,CAAC;AACvG,OAAO,EAAE,kCAAkC,EAAE,MAAM,qDAAqD,CAAC;AACzG,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAIlF,qBACa,8BAA8B;IAIvC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAJ5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmD;gBAGvD,QAAQ,EAAE,yBAAyB,EACnC,SAAS,EAAE,kCAAkC;IAGhE;;;;;;OAMG;IACG,QAAQ,CACZ,KAAK,EAAE,MAAM,EACb,cAAc,EAAE,8BAA8B,EAC9C,OAAO,SAAI,GACV,OAAO,CAAC,IAAI,CAAC;CAsBjB"}
@@ -13,13 +13,19 @@ let BackgroundJobDispatcherService = BackgroundJobDispatcherService_1 = class Ba
13
13
  this.scheduler = scheduler;
14
14
  this.logger = new common_1.Logger(BackgroundJobDispatcherService_1.name);
15
15
  }
16
- /** Marks the job queued and hands it to the queue (or inline executor). */
16
+ /**
17
+ * Marks the job queued and hands it to the queue (or inline executor).
18
+ *
19
+ * Uses engine storage reads/writes so dispatch works when the caller session
20
+ * tenant differs from the job's durable `tenantId` (e.g. platform admin
21
+ * password-reset for a user in another tenant).
22
+ */
17
23
  async dispatch(jobId, attemptTrigger, delayMs = 0) {
18
- const job = await this.jobStore.getOne(jobId);
24
+ const job = await this.jobStore.getOneAsEngine(jobId);
19
25
  if (!job) {
20
26
  throw new Error(`Job ${jobId} not found`);
21
27
  }
22
- await this.jobStore.patch(jobId, {
28
+ await this.jobStore.patchAsEngine(jobId, {
23
29
  status: 'queued',
24
30
  queuedAt: new Date().toISOString(),
25
31
  });
@@ -1 +1 @@
1
- {"version":3,"file":"background-job-dispatcher.service.js","sourceRoot":"","sources":["../../../../../../../../libs/framework/server/background-job/src/lib/queue/background-job-dispatcher.service.ts"],"names":[],"mappings":";;;;;AAAA,2CAAoD;AAEpD,gHAAyG;AACzG,wFAAkF;AAElF,iEAAiE;AAG1D,IAAM,8BAA8B,sCAApC,MAAM,8BAA8B;IAGzC,YACmB,QAAmC,EACnC,SAA6C;QAD7C,aAAQ,GAAR,QAAQ,CAA2B;QACnC,cAAS,GAAT,SAAS,CAAoC;QAJ/C,WAAM,GAAG,IAAI,eAAM,CAAC,gCAA8B,CAAC,IAAI,CAAC,CAAC;IAKvE,CAAC;IAEJ,2EAA2E;IAC3E,KAAK,CAAC,QAAQ,CACZ,KAAa,EACb,cAA8C,EAC9C,OAAO,GAAG,CAAC;QAEX,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,OAAO,KAAK,YAAY,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE;YAC/B,MAAM,EAAE,QAAQ;YAChB,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACnC,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,SAAS,CAAC,iBAAiB,CACpC;YACE,KAAK;YACL,cAAc;YACd,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,aAAa,EAAE,GAAG,CAAC,aAAa;SACjC,EACD,OAAO,CACR,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,KAAK,KAAK,cAAc,WAAW,OAAO,KAAK,CAAC,CAAC;IACvF,CAAC;CACF,CAAA;AAnCY,wEAA8B;yCAA9B,8BAA8B;IAD1C,IAAA,mBAAU,GAAE;6CAKkB,wDAAyB;QACxB,2EAAkC;GALrD,8BAA8B,CAmC1C;AAED,YAAY"}
1
+ {"version":3,"file":"background-job-dispatcher.service.js","sourceRoot":"","sources":["../../../../../../../../libs/framework/server/background-job/src/lib/queue/background-job-dispatcher.service.ts"],"names":[],"mappings":";;;;;AAAA,2CAAoD;AAEpD,gHAAyG;AACzG,wFAAkF;AAElF,iEAAiE;AAG1D,IAAM,8BAA8B,sCAApC,MAAM,8BAA8B;IAGzC,YACmB,QAAmC,EACnC,SAA6C;QAD7C,aAAQ,GAAR,QAAQ,CAA2B;QACnC,cAAS,GAAT,SAAS,CAAoC;QAJ/C,WAAM,GAAG,IAAI,eAAM,CAAC,gCAA8B,CAAC,IAAI,CAAC,CAAC;IAKvE,CAAC;IAEJ;;;;;;OAMG;IACH,KAAK,CAAC,QAAQ,CACZ,KAAa,EACb,cAA8C,EAC9C,OAAO,GAAG,CAAC;QAEX,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACtD,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,OAAO,KAAK,YAAY,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,EAAE;YACvC,MAAM,EAAE,QAAQ;YAChB,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACnC,CAAC,CAAC;QACH,MAAM,IAAI,CAAC,SAAS,CAAC,iBAAiB,CACpC;YACE,KAAK;YACL,cAAc;YACd,QAAQ,EAAE,GAAG,CAAC,QAAQ;YACtB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,aAAa,EAAE,GAAG,CAAC,aAAa;SACjC,EACD,OAAO,CACR,CAAC;QACF,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,KAAK,KAAK,cAAc,WAAW,OAAO,KAAK,CAAC,CAAC;IACvF,CAAC;CACF,CAAA;AAzCY,wEAA8B;yCAA9B,8BAA8B;IAD1C,IAAA,mBAAU,GAAE;6CAKkB,wDAAyB;QACxB,2EAAkC;GALrD,8BAA8B,CAyC1C;AAED,YAAY"}
@@ -0,0 +1,18 @@
1
+ import type { Queue } from 'bullmq';
2
+ import { AXPAppStartUpService } from '@acorex-platform/framework-server/core';
3
+ import { BackgroundJobExecutionService } from '../execution/background-job-execution.service';
4
+ import type { BackgroundJobQueuePayload } from '../execution/background-job-retry-scheduler.service';
5
+ import { BackgroundJobSchemaBootstrap } from '../store/background-job-schema.bootstrap';
6
+ /**
7
+ * After schemas are ready, copy Bull `failedReason` into Mongo for jobs that
8
+ * still look `queued`/`running` so the jobs UI does not show eternal Queued.
9
+ */
10
+ export declare class BackgroundJobFailedReconcileService {
11
+ private readonly queue;
12
+ private readonly execution;
13
+ private readonly schemaBootstrap;
14
+ private readonly logger;
15
+ constructor(queue: Queue<BackgroundJobQueuePayload>, execution: BackgroundJobExecutionService, schemaBootstrap: BackgroundJobSchemaBootstrap, appStartUp: AXPAppStartUpService);
16
+ private reconcileFailedJobs;
17
+ }
18
+ //# sourceMappingURL=background-job-failed-reconcile.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"background-job-failed-reconcile.service.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/framework/server/background-job/src/lib/queue/background-job-failed-reconcile.service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAEL,oBAAoB,EACrB,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EAAE,6BAA6B,EAAE,MAAM,+CAA+C,CAAC;AAC9F,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qDAAqD,CAAC;AACrG,OAAO,EAAE,4BAA4B,EAAE,MAAM,0CAA0C,CAAC;AAWxF;;;GAGG;AACH,qBACa,mCAAmC;IAK5C,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,eAAe;IANlC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwD;gBAI5D,KAAK,EAAE,KAAK,CAAC,yBAAyB,CAAC,EACvC,SAAS,EAAE,6BAA6B,EACxC,eAAe,EAAE,4BAA4B,EAC9D,UAAU,EAAE,oBAAoB;YAcpB,mBAAmB;CA8BlC"}
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ var BackgroundJobFailedReconcileService_1;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.BackgroundJobFailedReconcileService = void 0;
5
+ const tslib_1 = require("tslib");
6
+ const bullmq_1 = require("@nestjs/bullmq");
7
+ const common_1 = require("@nestjs/common");
8
+ const core_1 = require("@acorex-platform/framework-server/core");
9
+ const background_job_1 = require("@acorex-platform/framework-shared/background-job");
10
+ const background_job_execution_service_1 = require("../execution/background-job-execution.service");
11
+ const background_job_schema_bootstrap_1 = require("../store/background-job-schema.bootstrap");
12
+ //#region ----- Constants -----
13
+ /** How many Bull failed jobs to inspect on each startup reconcile. */
14
+ const FAILED_RECONCILE_LIMIT = 100;
15
+ //#endregion
16
+ //#region ----- Bull failed → Mongo status reconcile -----
17
+ /**
18
+ * After schemas are ready, copy Bull `failedReason` into Mongo for jobs that
19
+ * still look `queued`/`running` so the jobs UI does not show eternal Queued.
20
+ */
21
+ let BackgroundJobFailedReconcileService = BackgroundJobFailedReconcileService_1 = class BackgroundJobFailedReconcileService {
22
+ constructor(queue, execution, schemaBootstrap, appStartUp) {
23
+ this.queue = queue;
24
+ this.execution = execution;
25
+ this.schemaBootstrap = schemaBootstrap;
26
+ this.logger = new common_1.Logger(BackgroundJobFailedReconcileService_1.name);
27
+ if (process.env['BACKGROUND_JOB_WORKER_ENABLED'] === 'false') {
28
+ return;
29
+ }
30
+ appStartUp.registerTask({
31
+ name: 'background-job-failed-reconcile',
32
+ // After moduleSchemas (31); before Bull workers register (35).
33
+ priority: core_1.AXP_APP_STARTUP_PRIORITY.moduleSchemas + 1,
34
+ run: async () => this.reconcileFailedJobs(),
35
+ });
36
+ }
37
+ async reconcileFailedJobs() {
38
+ await this.schemaBootstrap.registerAllSchemas({ throwOnError: true });
39
+ const failedJobs = await this.queue.getFailed(0, FAILED_RECONCILE_LIMIT - 1);
40
+ if (failedJobs.length === 0) {
41
+ return;
42
+ }
43
+ let synced = 0;
44
+ for (const bullJob of failedJobs) {
45
+ const jobId = bullJob.data?.jobId?.trim();
46
+ if (!jobId) {
47
+ continue;
48
+ }
49
+ const reason = bullJob.failedReason?.trim() ||
50
+ 'Background job failed in the queue without a persisted status.';
51
+ const marked = await this.execution.markQueueDeliveryFailure(jobId, new Error(reason));
52
+ if (marked) {
53
+ synced += 1;
54
+ }
55
+ }
56
+ if (synced > 0) {
57
+ this.logger.warn(`Reconciled ${synced} background job(s) from Bull failed state into Mongo`);
58
+ }
59
+ }
60
+ };
61
+ exports.BackgroundJobFailedReconcileService = BackgroundJobFailedReconcileService;
62
+ exports.BackgroundJobFailedReconcileService = BackgroundJobFailedReconcileService = BackgroundJobFailedReconcileService_1 = tslib_1.__decorate([
63
+ (0, common_1.Injectable)(),
64
+ tslib_1.__param(0, (0, bullmq_1.InjectQueue)(background_job_1.AXP_BACKGROUND_JOBS_QUEUE)),
65
+ tslib_1.__metadata("design:paramtypes", [Function, background_job_execution_service_1.BackgroundJobExecutionService,
66
+ background_job_schema_bootstrap_1.BackgroundJobSchemaBootstrap,
67
+ core_1.AXPAppStartUpService])
68
+ ], BackgroundJobFailedReconcileService);
69
+ //#endregion
70
+ //# sourceMappingURL=background-job-failed-reconcile.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"background-job-failed-reconcile.service.js","sourceRoot":"","sources":["../../../../../../../../libs/framework/server/background-job/src/lib/queue/background-job-failed-reconcile.service.ts"],"names":[],"mappings":";;;;;AAAA,2CAA6C;AAC7C,2CAAoD;AAEpD,iEAGgD;AAChD,qFAA6F;AAC7F,oGAA8F;AAE9F,8FAAwF;AAExF,+BAA+B;AAE/B,sEAAsE;AACtE,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAEnC,YAAY;AAEZ,0DAA0D;AAE1D;;;GAGG;AAEI,IAAM,mCAAmC,2CAAzC,MAAM,mCAAmC;IAG9C,YAEE,KAAwD,EACvC,SAAwC,EACxC,eAA6C,EAC9D,UAAgC;QAHf,UAAK,GAAL,KAAK,CAAkC;QACvC,cAAS,GAAT,SAAS,CAA+B;QACxC,oBAAe,GAAf,eAAe,CAA8B;QAN/C,WAAM,GAAG,IAAI,eAAM,CAAC,qCAAmC,CAAC,IAAI,CAAC,CAAC;QAS7E,IAAI,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,KAAK,OAAO,EAAE,CAAC;YAC7D,OAAO;QACT,CAAC;QAED,UAAU,CAAC,YAAY,CAAC;YACtB,IAAI,EAAE,iCAAiC;YACvC,+DAA+D;YAC/D,QAAQ,EAAE,+BAAwB,CAAC,aAAa,GAAG,CAAC;YACpD,GAAG,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,mBAAmB,EAAE;SAC5C,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,mBAAmB;QAC/B,MAAM,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QAEtE,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,sBAAsB,GAAG,CAAC,CAAC,CAAC;QAC7E,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO;QACT,CAAC;QAED,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,KAAK,MAAM,OAAO,IAAI,UAAU,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YAC1C,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,SAAS;YACX,CAAC;YAED,MAAM,MAAM,GACV,OAAO,CAAC,YAAY,EAAE,IAAI,EAAE;gBAC5B,gEAAgE,CAAC;YACnE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,wBAAwB,CAAC,KAAK,EAAE,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;YACvF,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,IAAI,CAAC,CAAC;YACd,CAAC;QACH,CAAC;QAED,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,cAAc,MAAM,sDAAsD,CAC3E,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAA;AApDY,kFAAmC;8CAAnC,mCAAmC;IAD/C,IAAA,mBAAU,GAAE;IAKR,mBAAA,IAAA,oBAAW,EAAC,0CAAyB,CAAC,CAAA;uDAEX,gEAA6B;QACvB,8DAA4B;QAClD,2BAAoB;GARvB,mCAAmC,CAoD/C;AAED,YAAY"}
@@ -2,10 +2,19 @@ import { WorkerHost } from '@nestjs/bullmq';
2
2
  import type { Job } from 'bullmq';
3
3
  import { BackgroundJobExecutionService } from '../execution/background-job-execution.service';
4
4
  import type { BackgroundJobQueuePayload } from '../execution/background-job-retry-scheduler.service';
5
+ import { BackgroundJobSchemaBootstrap } from '../store/background-job-schema.bootstrap';
5
6
  export declare class BackgroundJobProcessor extends WorkerHost {
6
7
  private readonly execution;
8
+ private readonly schemaBootstrap;
7
9
  private readonly logger;
8
- constructor(execution: BackgroundJobExecutionService);
10
+ private schemasReady;
11
+ constructor(execution: BackgroundJobExecutionService, schemaBootstrap: BackgroundJobSchemaBootstrap);
9
12
  process(job: Job<BackgroundJobQueuePayload>): Promise<void>;
13
+ /**
14
+ * Bull already failed the queue job — ensure Mongo shows Failed + reason
15
+ * even when the pre-attempt patch could not run (e.g. schemas not ready yet).
16
+ */
17
+ onFailed(job: Job<BackgroundJobQueuePayload> | undefined, error: Error): Promise<void>;
18
+ private ensureSchemasReady;
10
19
  }
11
20
  //# sourceMappingURL=background-job.processor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"background-job.processor.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/framework/server/background-job/src/lib/queue/background-job.processor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEvD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAKlC,OAAO,EAAE,6BAA6B,EAAE,MAAM,+CAA+C,CAAC;AAC9F,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qDAAqD,CAAC;AAIrG,qBACa,sBAAuB,SAAQ,UAAU;IAGxC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAFtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2C;gBAErC,SAAS,EAAE,6BAA6B;IAI/D,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,yBAAyB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAuBlE"}
1
+ {"version":3,"file":"background-job.processor.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/framework/server/background-job/src/lib/queue/background-job.processor.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEtE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAKlC,OAAO,EAAE,6BAA6B,EAAE,MAAM,+CAA+C,CAAC;AAC9F,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qDAAqD,CAAC;AACrG,OAAO,EAAE,4BAA4B,EAAE,MAAM,0CAA0C,CAAC;AAIxF,qBACa,sBAAuB,SAAQ,UAAU;IAKlD,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,eAAe;IALlC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2C;IAClE,OAAO,CAAC,YAAY,CAA8B;gBAG/B,SAAS,EAAE,6BAA6B,EACxC,eAAe,EAAE,4BAA4B;IAK1D,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,yBAAyB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BjE;;;OAGG;IAEG,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,yBAAyB,CAAC,GAAG,SAAS,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB5F,OAAO,CAAC,kBAAkB;CAW3B"}
@@ -7,12 +7,15 @@ const bullmq_1 = require("@nestjs/bullmq");
7
7
  const common_1 = require("@nestjs/common");
8
8
  const background_job_1 = require("@acorex-platform/framework-shared/background-job");
9
9
  const background_job_execution_service_1 = require("../execution/background-job-execution.service");
10
+ const background_job_schema_bootstrap_1 = require("../store/background-job-schema.bootstrap");
10
11
  //#region ---- BullMQ processor (queue delivery only — spec §9.2) ----
11
12
  let BackgroundJobProcessor = BackgroundJobProcessor_1 = class BackgroundJobProcessor extends bullmq_1.WorkerHost {
12
- constructor(execution) {
13
+ constructor(execution, schemaBootstrap) {
13
14
  super();
14
15
  this.execution = execution;
16
+ this.schemaBootstrap = schemaBootstrap;
15
17
  this.logger = new common_1.Logger(BackgroundJobProcessor_1.name);
18
+ this.schemasReady = null;
16
19
  }
17
20
  async process(job) {
18
21
  if (job.name !== background_job_1.AXP_BACKGROUND_JOB_EXECUTE) {
@@ -20,6 +23,8 @@ let BackgroundJobProcessor = BackgroundJobProcessor_1 = class BackgroundJobProce
20
23
  return;
21
24
  }
22
25
  try {
26
+ // Safety net if a job arrives before/without post-schema worker registration.
27
+ await this.ensureSchemasReady();
23
28
  await this.execution.executeAttempt({
24
29
  jobId: job.data.jobId,
25
30
  attemptTrigger: job.data.attemptTrigger,
@@ -34,11 +39,49 @@ let BackgroundJobProcessor = BackgroundJobProcessor_1 = class BackgroundJobProce
34
39
  throw error;
35
40
  }
36
41
  }
42
+ /**
43
+ * Bull already failed the queue job — ensure Mongo shows Failed + reason
44
+ * even when the pre-attempt patch could not run (e.g. schemas not ready yet).
45
+ */
46
+ async onFailed(job, error) {
47
+ const jobId = job?.data?.jobId?.trim();
48
+ if (!jobId) {
49
+ return;
50
+ }
51
+ try {
52
+ await this.ensureSchemasReady();
53
+ const reason = error?.message?.trim() ||
54
+ job?.failedReason?.trim() ||
55
+ 'Background job failed in the queue without a persisted status.';
56
+ await this.execution.markQueueDeliveryFailure(jobId, new Error(reason));
57
+ }
58
+ catch (syncError) {
59
+ this.logger.warn(`Could not sync Bull failure to Mongo for job ${jobId}: ${syncError instanceof Error ? syncError.message : String(syncError)}`);
60
+ }
61
+ }
62
+ ensureSchemasReady() {
63
+ if (!this.schemasReady) {
64
+ this.schemasReady = this.schemaBootstrap
65
+ .registerAllSchemas({ throwOnError: true })
66
+ .catch((error) => {
67
+ this.schemasReady = null;
68
+ throw error;
69
+ });
70
+ }
71
+ return this.schemasReady;
72
+ }
37
73
  };
38
74
  exports.BackgroundJobProcessor = BackgroundJobProcessor;
75
+ tslib_1.__decorate([
76
+ (0, bullmq_1.OnWorkerEvent)('failed'),
77
+ tslib_1.__metadata("design:type", Function),
78
+ tslib_1.__metadata("design:paramtypes", [Object, Error]),
79
+ tslib_1.__metadata("design:returntype", Promise)
80
+ ], BackgroundJobProcessor.prototype, "onFailed", null);
39
81
  exports.BackgroundJobProcessor = BackgroundJobProcessor = BackgroundJobProcessor_1 = tslib_1.__decorate([
40
82
  (0, bullmq_1.Processor)(background_job_1.AXP_BACKGROUND_JOBS_QUEUE),
41
- tslib_1.__metadata("design:paramtypes", [background_job_execution_service_1.BackgroundJobExecutionService])
83
+ tslib_1.__metadata("design:paramtypes", [background_job_execution_service_1.BackgroundJobExecutionService,
84
+ background_job_schema_bootstrap_1.BackgroundJobSchemaBootstrap])
42
85
  ], BackgroundJobProcessor);
43
86
  //#endregion
44
87
  //# sourceMappingURL=background-job.processor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"background-job.processor.js","sourceRoot":"","sources":["../../../../../../../../libs/framework/server/background-job/src/lib/queue/background-job.processor.ts"],"names":[],"mappings":";;;;;AAAA,2CAAuD;AACvD,2CAAwC;AAExC,qFAG0D;AAC1D,oGAA8F;AAG9F,sEAAsE;AAG/D,IAAM,sBAAsB,8BAA5B,MAAM,sBAAuB,SAAQ,mBAAU;IAGpD,YAA6B,SAAwC;QACnE,KAAK,EAAE,CAAC;QADmB,cAAS,GAAT,SAAS,CAA+B;QAFpD,WAAM,GAAG,IAAI,eAAM,CAAC,wBAAsB,CAAC,IAAI,CAAC,CAAC;IAIlE,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAmC;QAC/C,IAAI,GAAG,CAAC,IAAI,KAAK,2CAA0B,EAAE,CAAC;YAC5C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;gBAClC,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK;gBACrB,cAAc,EAAE,GAAG,CAAC,IAAI,CAAC,cAAc;gBACvC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ;gBAC3B,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM;gBACvB,aAAa,EAAE,GAAG,CAAC,IAAI,CAAC,aAAa;gBACrC,UAAU,EAAE,GAAG,CAAC,EAAE;aACnB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,kBAAkB,GAAG,CAAC,IAAI,CAAC,KAAK,YAAY,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EACpG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CACjD,CAAC;YACF,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF,CAAA;AA9BY,wDAAsB;iCAAtB,sBAAsB;IADlC,IAAA,kBAAS,EAAC,0CAAyB,CAAC;6CAIK,gEAA6B;GAH1D,sBAAsB,CA8BlC;AAED,YAAY"}
1
+ {"version":3,"file":"background-job.processor.js","sourceRoot":"","sources":["../../../../../../../../libs/framework/server/background-job/src/lib/queue/background-job.processor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { OnModuleDestroy } from '@nestjs/common';
2
+ import { ModuleRef } from '@nestjs/core';
3
+ import { AXPAppStartUpService } from '@acorex-platform/framework-server/core';
4
+ /**
5
+ * Defers BullMQ {@link BullRegistrar.register} until app startup schemas finish.
6
+ *
7
+ * NestJS Bull registers workers in `onModuleInit`, which runs before
8
+ * `AXPAppStartUpRunner` schema tasks — jobs are then consumed with
9
+ * "Entity schema is not registered" and Mongo stays `queued` (patch also needs schemas).
10
+ *
11
+ * Resolves {@link BullRegistrar} lazily so this can live on `BullQueueRootModule`
12
+ * before any `registerQueue()` import wires the Bull core providers.
13
+ */
14
+ export declare class BullQueueWorkerRegistrationService implements OnModuleDestroy {
15
+ private readonly moduleRef;
16
+ private readonly logger;
17
+ constructor(moduleRef: ModuleRef, appStartUp: AXPAppStartUpService);
18
+ onModuleDestroy(): void;
19
+ private registerWorkers;
20
+ /**
21
+ * Webpack/`nx serve` restarts can leave orphan Node processes that still hold
22
+ * Bull blocking clients. Those steal jobs with a dead Nest DI graph (schema errors).
23
+ * Local/dev only — multi-instance production must keep multiple workers.
24
+ */
25
+ private killDevOrphanBullWorkers;
26
+ }
27
+ //# sourceMappingURL=bull-queue-worker-registration.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bull-queue-worker-registration.service.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/framework/server/background-job/src/lib/queue/bull-queue-worker-registration.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,OAAO,EAEL,oBAAoB,EACrB,MAAM,wCAAwC,CAAC;AAqBhD;;;;;;;;;GASG;AACH,qBACa,kCAAmC,YAAW,eAAe;IAItE,OAAO,CAAC,QAAQ,CAAC,SAAS;IAH5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuD;gBAG3D,SAAS,EAAE,SAAS,EACrC,UAAU,EAAE,oBAAoB;IAgBlC,eAAe,IAAI,IAAI;YAKT,eAAe;IAiB7B;;;;OAIG;YACW,wBAAwB;CAyCvC"}
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ var BullQueueWorkerRegistrationService_1;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.BullQueueWorkerRegistrationService = void 0;
5
+ const tslib_1 = require("tslib");
6
+ const common_1 = require("@nestjs/common");
7
+ const core_1 = require("@nestjs/core");
8
+ const bullmq_1 = require("@nestjs/bullmq");
9
+ const ioredis_1 = tslib_1.__importDefault(require("ioredis"));
10
+ const core_2 = require("@acorex-platform/framework-server/core");
11
+ const background_job_redis_config_1 = require("../background-job-redis.config");
12
+ //#region ----- Constants -----
13
+ /**
14
+ * Process-wide guard: Nest/webpack can reinject modules in one PID and call
15
+ * registration more than once; a second Bull worker steals jobs with a stale DI graph.
16
+ */
17
+ const BULL_WORKERS_REGISTERED_KEY = '__AXP_BULLMQ_WORKERS_REGISTERED__';
18
+ /** BullMQ sets `CLIENT SETNAME` to `bull:` + base64(queueName). */
19
+ const DEV_ORPHAN_BULL_CLIENT_NAMES = [
20
+ `bull:${Buffer.from('background-jobs').toString('base64')}`,
21
+ `bull:${Buffer.from('workflow-jobs').toString('base64')}`,
22
+ ];
23
+ //#endregion
24
+ //#region ----- Bull worker registration (after schemas) -----
25
+ /**
26
+ * Defers BullMQ {@link BullRegistrar.register} until app startup schemas finish.
27
+ *
28
+ * NestJS Bull registers workers in `onModuleInit`, which runs before
29
+ * `AXPAppStartUpRunner` schema tasks — jobs are then consumed with
30
+ * "Entity schema is not registered" and Mongo stays `queued` (patch also needs schemas).
31
+ *
32
+ * Resolves {@link BullRegistrar} lazily so this can live on `BullQueueRootModule`
33
+ * before any `registerQueue()` import wires the Bull core providers.
34
+ */
35
+ let BullQueueWorkerRegistrationService = BullQueueWorkerRegistrationService_1 = class BullQueueWorkerRegistrationService {
36
+ constructor(moduleRef, appStartUp) {
37
+ this.moduleRef = moduleRef;
38
+ this.logger = new common_1.Logger(BullQueueWorkerRegistrationService_1.name);
39
+ // Seed / CLI sets this so Nest contexts never consume Redis Bull jobs.
40
+ if (process.env['BACKGROUND_JOB_WORKER_ENABLED'] === 'false') {
41
+ this.logger.log('BullMQ worker registration skipped (BACKGROUND_JOB_WORKER_ENABLED=false)');
42
+ return;
43
+ }
44
+ appStartUp.registerTask({
45
+ name: 'bullmq-worker-registration',
46
+ // After moduleSchemas (background-job, locks, …) and before seed/runtime.
47
+ priority: core_2.AXP_APP_STARTUP_PRIORITY.postSchemaServices,
48
+ run: async () => this.registerWorkers(),
49
+ });
50
+ }
51
+ onModuleDestroy() {
52
+ const globalState = globalThis;
53
+ delete globalState[BULL_WORKERS_REGISTERED_KEY];
54
+ }
55
+ async registerWorkers() {
56
+ const globalState = globalThis;
57
+ if (globalState[BULL_WORKERS_REGISTERED_KEY]) {
58
+ this.logger.warn('BullMQ workers already registered in this process — skipping duplicate registration');
59
+ return;
60
+ }
61
+ await this.killDevOrphanBullWorkers();
62
+ const registrar = this.moduleRef.get(bullmq_1.BullRegistrar, { strict: false });
63
+ registrar.register();
64
+ globalState[BULL_WORKERS_REGISTERED_KEY] = true;
65
+ this.logger.log('BullMQ workers registered (post-schema startup)');
66
+ }
67
+ /**
68
+ * Webpack/`nx serve` restarts can leave orphan Node processes that still hold
69
+ * Bull blocking clients. Those steal jobs with a dead Nest DI graph (schema errors).
70
+ * Local/dev only — multi-instance production must keep multiple workers.
71
+ */
72
+ async killDevOrphanBullWorkers() {
73
+ if (process.env.NODE_ENV === 'production') {
74
+ return;
75
+ }
76
+ const connection = (0, background_job_redis_config_1.resolveBackgroundJobRedisConnection)();
77
+ if (!connection) {
78
+ return;
79
+ }
80
+ const redis = 'url' in connection ? new ioredis_1.default(connection.url) : new ioredis_1.default(connection);
81
+ try {
82
+ const orphanNames = new Set(DEV_ORPHAN_BULL_CLIENT_NAMES);
83
+ const clientList = await redis.client('LIST');
84
+ const listText = typeof clientList === 'string' ? clientList : String(clientList ?? '');
85
+ let killed = 0;
86
+ for (const line of listText.split('\n')) {
87
+ if (!line.trim()) {
88
+ continue;
89
+ }
90
+ const name = /(?:^| )name=(\S+)/.exec(line)?.[1];
91
+ const id = /(?:^| )id=(\d+)/.exec(line)?.[1];
92
+ if (!name || !id || !orphanNames.has(name)) {
93
+ continue;
94
+ }
95
+ await redis.client('KILL', 'ID', id);
96
+ killed += 1;
97
+ }
98
+ if (killed > 0) {
99
+ this.logger.warn(`Killed ${killed} orphan Bull Redis client(s) before worker registration`);
100
+ }
101
+ }
102
+ catch (error) {
103
+ this.logger.warn(`Could not prune orphan Bull Redis clients: ${error instanceof Error ? error.message : String(error)}`);
104
+ }
105
+ finally {
106
+ redis.disconnect();
107
+ }
108
+ }
109
+ };
110
+ exports.BullQueueWorkerRegistrationService = BullQueueWorkerRegistrationService;
111
+ exports.BullQueueWorkerRegistrationService = BullQueueWorkerRegistrationService = BullQueueWorkerRegistrationService_1 = tslib_1.__decorate([
112
+ (0, common_1.Injectable)(),
113
+ tslib_1.__metadata("design:paramtypes", [core_1.ModuleRef,
114
+ core_2.AXPAppStartUpService])
115
+ ], BullQueueWorkerRegistrationService);
116
+ //#endregion
117
+ //# sourceMappingURL=bull-queue-worker-registration.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bull-queue-worker-registration.service.js","sourceRoot":"","sources":["../../../../../../../../libs/framework/server/background-job/src/lib/queue/bull-queue-worker-registration.service.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,9 @@ export declare class BackgroundJobSchemaBootstrap {
9
9
  private readonly schemaService;
10
10
  private readonly logger;
11
11
  constructor(schemaService: JqlSchemaService, appStartUp: AXPAppStartUpService);
12
- registerAllSchemas(): Promise<void>;
12
+ registerAllSchemas(options?: {
13
+ throwOnError?: boolean;
14
+ }): Promise<void>;
13
15
  private register;
14
16
  }
15
17
  //# sourceMappingURL=background-job-schema.bootstrap.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"background-job-schema.bootstrap.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/framework/server/background-job/src/lib/store/background-job-schema.bootstrap.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,oBAAoB,EACrB,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8CAA8C,CAAC;AAmIhF;;;;GAIG;AACH,qBACa,4BAA4B;IAIrC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAHhC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiD;gBAGrD,aAAa,EAAE,gBAAgB,EAChD,UAAU,EAAE,oBAAoB;IAS5B,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;YAM3B,QAAQ;CAavB"}
1
+ {"version":3,"file":"background-job-schema.bootstrap.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/framework/server/background-job/src/lib/store/background-job-schema.bootstrap.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,oBAAoB,EACrB,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8CAA8C,CAAC;AAqIhF;;;;GAIG;AACH,qBACa,4BAA4B;IAIrC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAHhC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiD;gBAGrD,aAAa,EAAE,gBAAgB,EAChD,UAAU,EAAE,oBAAoB;IAS5B,kBAAkB,CAAC,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YAqB/D,QAAQ;CAiBvB"}
@@ -66,8 +66,10 @@ const JOB_INDEXES = [
66
66
  // null for non-scheduled jobs; scanner also pre-checks before insert.
67
67
  { columns: ['scheduleId', 'scheduledOccurrence'], unique: true },
68
68
  { columns: ['tenantId', 'status'] },
69
+ { columns: ['tenantId', 'idempotencyKey'] },
69
70
  { columns: ['command.key'] },
70
71
  { columns: ['idempotencyKey'] },
72
+ { columns: ['parentJobId'] },
71
73
  ];
72
74
  const ATTEMPT_PROPERTIES = [
73
75
  text('jobId', 'Job Id'),
@@ -130,18 +132,21 @@ let BackgroundJobSchemaBootstrap = BackgroundJobSchemaBootstrap_1 = class Backgr
130
132
  run: async () => this.registerAllSchemas(),
131
133
  });
132
134
  }
133
- async registerAllSchemas() {
134
- await this.register(background_job_1.AXP_BACKGROUND_JOB_ENTITY, JOB_PROPERTIES, JOB_INDEXES);
135
- await this.register(background_job_1.AXP_BACKGROUND_JOB_ATTEMPT_ENTITY, ATTEMPT_PROPERTIES, ATTEMPT_INDEXES);
136
- await this.register(background_job_1.AXP_BACKGROUND_JOB_SCHEDULE_ENTITY, SCHEDULE_PROPERTIES, SCHEDULE_INDEXES);
135
+ async registerAllSchemas(options) {
136
+ await this.register(background_job_1.AXP_BACKGROUND_JOB_ENTITY, JOB_PROPERTIES, JOB_INDEXES, options?.throwOnError);
137
+ await this.register(background_job_1.AXP_BACKGROUND_JOB_ATTEMPT_ENTITY, ATTEMPT_PROPERTIES, ATTEMPT_INDEXES, options?.throwOnError);
138
+ await this.register(background_job_1.AXP_BACKGROUND_JOB_SCHEDULE_ENTITY, SCHEDULE_PROPERTIES, SCHEDULE_INDEXES, options?.throwOnError);
137
139
  }
138
- async register(entityName, properties, indexes) {
140
+ async register(entityName, properties, indexes, throwOnError = false) {
139
141
  try {
140
142
  await this.schemaService.registerFromProperties({ entityName, properties, indexes });
141
143
  this.logger.log(`Registered schema for ${entityName}`);
142
144
  }
143
145
  catch (error) {
144
146
  const message = error instanceof Error ? error.message : String(error);
147
+ if (throwOnError) {
148
+ throw error instanceof Error ? error : new Error(message);
149
+ }
145
150
  this.logger.warn(`Schema registration skipped for ${entityName}: ${message}`);
146
151
  }
147
152
  }
@@ -1 +1 @@
1
- {"version":3,"file":"background-job-schema.bootstrap.js","sourceRoot":"","sources":["../../../../../../../../libs/framework/server/background-job/src/lib/store/background-job-schema.bootstrap.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"background-job-schema.bootstrap.js","sourceRoot":"","sources":["../../../../../../../../libs/framework/server/background-job/src/lib/store/background-job-schema.bootstrap.ts"],"names":[],"mappings":"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"}
@@ -8,8 +8,8 @@ export declare class BackgroundJobStoreService {
8
8
  getOneAsEngine(jobId: string): Promise<AXPBackgroundJob | null>;
9
9
  patch(jobId: string, patch: Partial<AXPBackgroundJob>): Promise<void>;
10
10
  patchAsEngine(jobId: string, patch: Partial<AXPBackgroundJob>): Promise<void>;
11
- /** Non-terminal job with the same idempotency key (create-time deduplication). */
12
- findActiveByIdempotencyKey(idempotencyKey: string): Promise<AXPBackgroundJob | null>;
11
+ /** Non-terminal job with the same idempotency key (create-time deduplication, tenant-scoped). */
12
+ findActiveByIdempotencyKey(tenantId: string, idempotencyKey: string): Promise<AXPBackgroundJob | null>;
13
13
  /** Durable occurrence idempotency check (backs the unique index pre-insert). */
14
14
  findByScheduleOccurrence(scheduleId: string, scheduledOccurrence: string): Promise<AXPBackgroundJob | null>;
15
15
  /** Any non-terminal job created by this schedule (`concurrencyPolicy = skip-if-running`). */
@@ -1 +1 @@
1
- {"version":3,"file":"background-job-store.service.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/framework/server/background-job/src/lib/store/background-job-store.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,8BAA8B,EAAE,MAAM,wCAAwC,CAAC;AACxF,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,kDAAkD,CAAC;AAO1D,qBACa,yBAAyB;IACxB,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAAb,aAAa,EAAE,8BAA8B;IAEpE,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAKpE,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAKvD,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAK/D,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQrE,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQnF,kFAAkF;IAC5E,0BAA0B,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAS1F,gFAAgF;IAC1E,wBAAwB,CAC5B,UAAU,EAAE,MAAM,EAClB,mBAAmB,EAAE,MAAM,GAC1B,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAYnC,6FAA6F;IACvF,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASnE,iCAAiC;IAC3B,UAAU,CAAC,OAAO,EAAE;QACxB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAkB/B,UAAU,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO;IAIpC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7C;;;OAGG;IACG,6BAA6B,CAAC,OAAO,EAAE;QAC3C,SAAS,EAAE,MAAM,CAAC;QAClB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,IAAI,EAAE,MAAM,CAAC;KACd,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;CA4BhC"}
1
+ {"version":3,"file":"background-job-store.service.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/framework/server/background-job/src/lib/store/background-job-store.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,8BAA8B,EAAE,MAAM,wCAAwC,CAAC;AACxF,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,kDAAkD,CAAC;AAO1D,qBACa,yBAAyB;IACxB,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAAb,aAAa,EAAE,8BAA8B;IAEpE,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAKpE,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAKvD,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAK/D,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQrE,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQnF,iGAAiG;IAC3F,0BAA0B,CAC9B,QAAQ,EAAE,MAAM,EAChB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAoBnC,gFAAgF;IAC1E,wBAAwB,CAC5B,UAAU,EAAE,MAAM,EAClB,mBAAmB,EAAE,MAAM,GAC1B,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAYnC,6FAA6F;IACvF,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IASnE,iCAAiC;IAC3B,UAAU,CAAC,OAAO,EAAE;QACxB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAkB/B,UAAU,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO;IAIpC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7C;;;OAGG;IACG,6BAA6B,CAAC,OAAO,EAAE;QAC3C,SAAS,EAAE,MAAM,CAAC;QAClB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,IAAI,EAAE,MAAM,CAAC;KACd,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;CA4BhC"}
@@ -30,12 +30,18 @@ let BackgroundJobStoreService = class BackgroundJobStoreService {
30
30
  async patchAsEngine(jobId, patch) {
31
31
  await this.entityStorage.updateOneAsEngine(background_job_1.AXP_BACKGROUND_JOB_ENTITY, jobId, patch);
32
32
  }
33
- /** Non-terminal job with the same idempotency key (create-time deduplication). */
34
- async findActiveByIdempotencyKey(idempotencyKey) {
35
- const page = await this.entityStorage.query(background_job_1.AXP_BACKGROUND_JOB_ENTITY, {
33
+ /** Non-terminal job with the same idempotency key (create-time deduplication, tenant-scoped). */
34
+ async findActiveByIdempotencyKey(tenantId, idempotencyKey) {
35
+ const scopedTenantId = tenantId.trim();
36
+ if (!scopedTenantId || !idempotencyKey.trim()) {
37
+ return null;
38
+ }
39
+ // Engine query: create may run under a session tenant that differs from the
40
+ // job's durable tenantId (cross-tenant admin / system sends).
41
+ const page = await this.entityStorage.queryAsEngine(background_job_1.AXP_BACKGROUND_JOB_ENTITY, {
36
42
  skip: 0,
37
43
  take: 1,
38
- filter: (0, jql_filter_util_1.and)((0, jql_filter_util_1.whereEqual)('idempotencyKey', idempotencyKey), (0, jql_filter_util_1.whereIn)('status', [...ACTIVE_STATUSES])),
44
+ filter: (0, jql_filter_util_1.and)((0, jql_filter_util_1.whereEqual)('tenantId', scopedTenantId), (0, jql_filter_util_1.whereEqual)('idempotencyKey', idempotencyKey), (0, jql_filter_util_1.whereIn)('status', [...ACTIVE_STATUSES])),
39
45
  });
40
46
  return (page.items ?? [])[0] ?? null;
41
47
  }