@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.
- package/background-job/src/index.d.ts +3 -0
- package/background-job/src/index.d.ts.map +1 -1
- package/background-job/src/index.js +3 -0
- package/background-job/src/index.js.map +1 -1
- package/background-job/src/lib/background-job.module.d.ts +5 -0
- package/background-job/src/lib/background-job.module.d.ts.map +1 -1
- package/background-job/src/lib/background-job.module.js +11 -2
- package/background-job/src/lib/background-job.module.js.map +1 -1
- package/background-job/src/lib/background-job.service.d.ts.map +1 -1
- package/background-job/src/lib/background-job.service.js +34 -6
- package/background-job/src/lib/background-job.service.js.map +1 -1
- package/background-job/src/lib/bull-queue-root.module.d.ts +3 -0
- package/background-job/src/lib/bull-queue-root.module.d.ts.map +1 -1
- package/background-job/src/lib/bull-queue-root.module.js +11 -1
- package/background-job/src/lib/bull-queue-root.module.js.map +1 -1
- package/background-job/src/lib/execution/background-job-execution.service.d.ts +6 -1
- package/background-job/src/lib/execution/background-job-execution.service.d.ts.map +1 -1
- package/background-job/src/lib/execution/background-job-execution.service.js +99 -36
- package/background-job/src/lib/execution/background-job-execution.service.js.map +1 -1
- package/background-job/src/lib/execution/background-job-tenant.util.d.ts +9 -0
- package/background-job/src/lib/execution/background-job-tenant.util.d.ts.map +1 -0
- package/background-job/src/lib/execution/background-job-tenant.util.js +23 -0
- package/background-job/src/lib/execution/background-job-tenant.util.js.map +1 -0
- package/background-job/src/lib/queue/background-job-dispatcher.service.d.ts +7 -1
- package/background-job/src/lib/queue/background-job-dispatcher.service.d.ts.map +1 -1
- package/background-job/src/lib/queue/background-job-dispatcher.service.js +9 -3
- package/background-job/src/lib/queue/background-job-dispatcher.service.js.map +1 -1
- package/background-job/src/lib/queue/background-job-failed-reconcile.service.d.ts +18 -0
- package/background-job/src/lib/queue/background-job-failed-reconcile.service.d.ts.map +1 -0
- package/background-job/src/lib/queue/background-job-failed-reconcile.service.js +70 -0
- package/background-job/src/lib/queue/background-job-failed-reconcile.service.js.map +1 -0
- package/background-job/src/lib/queue/background-job.processor.d.ts +10 -1
- package/background-job/src/lib/queue/background-job.processor.d.ts.map +1 -1
- package/background-job/src/lib/queue/background-job.processor.js +45 -2
- package/background-job/src/lib/queue/background-job.processor.js.map +1 -1
- package/background-job/src/lib/queue/bull-queue-worker-registration.service.d.ts +27 -0
- package/background-job/src/lib/queue/bull-queue-worker-registration.service.d.ts.map +1 -0
- package/background-job/src/lib/queue/bull-queue-worker-registration.service.js +117 -0
- package/background-job/src/lib/queue/bull-queue-worker-registration.service.js.map +1 -0
- package/background-job/src/lib/store/background-job-schema.bootstrap.d.ts +3 -1
- package/background-job/src/lib/store/background-job-schema.bootstrap.d.ts.map +1 -1
- package/background-job/src/lib/store/background-job-schema.bootstrap.js +10 -5
- package/background-job/src/lib/store/background-job-schema.bootstrap.js.map +1 -1
- package/background-job/src/lib/store/background-job-store.service.d.ts +2 -2
- package/background-job/src/lib/store/background-job-store.service.d.ts.map +1 -1
- package/background-job/src/lib/store/background-job-store.service.js +10 -4
- package/background-job/src/lib/store/background-job-store.service.js.map +1 -1
- package/core/src/index.d.ts +1 -0
- package/core/src/index.d.ts.map +1 -1
- package/core/src/index.js +1 -0
- package/core/src/index.js.map +1 -1
- package/core/src/lib/entity-storage/entity-storage-middleware.service.d.ts +2 -0
- package/core/src/lib/entity-storage/entity-storage-middleware.service.d.ts.map +1 -1
- package/core/src/lib/entity-storage/entity-storage-middleware.service.js +6 -0
- package/core/src/lib/entity-storage/entity-storage-middleware.service.js.map +1 -1
- package/core/src/lib/entity-storage/entity-storage.module.d.ts.map +1 -1
- package/core/src/lib/entity-storage/entity-storage.module.js +2 -0
- package/core/src/lib/entity-storage/entity-storage.module.js.map +1 -1
- package/core/src/lib/expression-evaluator/expression-evaluator-scope-provider.service.d.ts +12 -0
- package/core/src/lib/expression-evaluator/expression-evaluator-scope-provider.service.d.ts.map +1 -0
- package/core/src/lib/expression-evaluator/expression-evaluator-scope-provider.service.js +31 -0
- package/core/src/lib/expression-evaluator/expression-evaluator-scope-provider.service.js.map +1 -0
- package/core/src/lib/expression-evaluator/expression-evaluator-scope.registry.d.ts +11 -0
- package/core/src/lib/expression-evaluator/expression-evaluator-scope.registry.d.ts.map +1 -0
- package/core/src/lib/expression-evaluator/expression-evaluator-scope.registry.js +29 -0
- package/core/src/lib/expression-evaluator/expression-evaluator-scope.registry.js.map +1 -0
- package/core/src/lib/expression-evaluator/expression-evaluator-scope.types.d.ts +7 -0
- package/core/src/lib/expression-evaluator/expression-evaluator-scope.types.d.ts.map +1 -0
- package/core/src/lib/expression-evaluator/expression-evaluator-scope.types.js +12 -0
- package/core/src/lib/expression-evaluator/expression-evaluator-scope.types.js.map +1 -0
- package/core/src/lib/expression-evaluator/expression-evaluator.module.d.ts +3 -0
- package/core/src/lib/expression-evaluator/expression-evaluator.module.d.ts.map +1 -0
- package/core/src/lib/expression-evaluator/expression-evaluator.module.js +31 -0
- package/core/src/lib/expression-evaluator/expression-evaluator.module.js.map +1 -0
- package/core/src/lib/expression-evaluator/expression-evaluator.service.d.ts +14 -0
- package/core/src/lib/expression-evaluator/expression-evaluator.service.d.ts.map +1 -0
- package/core/src/lib/expression-evaluator/expression-evaluator.service.js +32 -0
- package/core/src/lib/expression-evaluator/expression-evaluator.service.js.map +1 -0
- package/core/src/lib/expression-evaluator/index.d.ts +7 -0
- package/core/src/lib/expression-evaluator/index.d.ts.map +1 -0
- package/core/src/lib/expression-evaluator/index.js +10 -0
- package/core/src/lib/expression-evaluator/index.js.map +1 -0
- package/core/src/lib/expression-evaluator/session-expression-evaluator-scope.provider.d.ts +13 -0
- package/core/src/lib/expression-evaluator/session-expression-evaluator-scope.provider.d.ts.map +1 -0
- package/core/src/lib/expression-evaluator/session-expression-evaluator-scope.provider.js +61 -0
- package/core/src/lib/expression-evaluator/session-expression-evaluator-scope.provider.js.map +1 -0
- package/domain/providers/src/lib/utils/expression-evaluator.util.d.ts +3 -5
- package/domain/providers/src/lib/utils/expression-evaluator.util.d.ts.map +1 -1
- package/domain/providers/src/lib/utils/expression-evaluator.util.js +5 -60
- package/domain/providers/src/lib/utils/expression-evaluator.util.js.map +1 -1
- package/package.json +2 -2
- package/security/src/lib/auth/auth.controller.d.ts +16 -1
- package/security/src/lib/auth/auth.controller.d.ts.map +1 -1
- package/security/src/lib/auth/auth.controller.js +59 -2
- package/security/src/lib/auth/auth.controller.js.map +1 -1
- package/security/src/lib/auth/auth.service.d.ts.map +1 -1
- package/security/src/lib/auth/auth.service.js +8 -0
- package/security/src/lib/auth/auth.service.js.map +1 -1
- package/security/src/lib/entity-storage/policy-expression-evaluator.util.d.ts +5 -3
- package/security/src/lib/entity-storage/policy-expression-evaluator.util.d.ts.map +1 -1
- package/security/src/lib/entity-storage/policy-expression-evaluator.util.js +7 -58
- package/security/src/lib/entity-storage/policy-expression-evaluator.util.js.map +1 -1
- package/workflow/src/lib/runtime/workflow-expression-evaluator.service.d.ts +1 -3
- package/workflow/src/lib/runtime/workflow-expression-evaluator.service.d.ts.map +1 -1
- package/workflow/src/lib/runtime/workflow-expression-evaluator.service.js +3 -62
- 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
|
-
/**
|
|
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
|
|
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
|
-
/**
|
|
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.
|
|
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.
|
|
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
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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(
|
|
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;
|
|
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":";;;;;AAAA,2CAAoD;AACpD,iEAGgD;AAEhD,yEAAgF;AAEhF,qFAI0D;AAE1D,oCAAoC;AAEpC,SAAS,IAAI,CAAC,IAAY,EAAE,KAAa;IACvC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,CAAC;AACjF,CAAC;AAED,SAAS,GAAG,CAAC,IAAY,EAAE,KAAa;IACtC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,CAAC;AACnF,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,KAAa;IAC3C,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAAE,CAAC;AACxF,CAAC;AAED,SAAS,IAAI,CAAC,IAAY,EAAE,KAAa;IACvC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;AAC1E,CAAC;AAED,YAAY;AAEZ,wCAAwC;AAExC,MAAM,cAAc,GAA4B;IAC9C,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC;IAC1B,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC;IACnC,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC;IACjC,QAAQ,CAAC,qBAAqB,EAAE,sBAAsB,CAAC;IACvD,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC;IAC1B,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC;IAC7B,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC;IACzB,IAAI,CAAC,eAAe,EAAE,gBAAgB,CAAC;IACvC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC;IACxB,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC;IAC3B,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC;IACjC,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC;IACnC,IAAI,CAAC,kBAAkB,EAAE,mBAAmB,CAAC;IAC7C,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC;IACxB,IAAI,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;IAC3C,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC;IACpC,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC;IACnC,GAAG,CAAC,oBAAoB,EAAE,wBAAwB,CAAC;IACnD,GAAG,CAAC,gBAAgB,EAAE,iBAAiB,CAAC;IACxC,GAAG,CAAC,aAAa,EAAE,cAAc,CAAC;IAClC,IAAI,CAAC,gBAAgB,EAAE,iBAAiB,CAAC;IACzC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC;IAC3B,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC;IAChC,IAAI,CAAC,eAAe,EAAE,gBAAgB,CAAC;IACvC,IAAI,CAAC,aAAa,EAAE,eAAe,CAAC;IACpC,IAAI,CAAC,mBAAmB,EAAE,sBAAsB,CAAC;IACjD,QAAQ,CAAC,yBAAyB,EAAE,2BAA2B,CAAC;IAChE,QAAQ,CAAC,aAAa,EAAE,cAAc,CAAC;IACvC,IAAI,CAAC,oBAAoB,EAAE,qBAAqB,CAAC;IACjD,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,WAAW,CAAC;IACjC,QAAQ,CAAC,gBAAgB,EAAE,kBAAkB,CAAC;IAC9C,QAAQ,CAAC,YAAY,EAAE,aAAa,CAAC;IACrC,QAAQ,CAAC,aAAa,EAAE,cAAc,CAAC;IACvC,GAAG,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;CAC9C,CAAC;AAEF,MAAM,WAAW,GAAyB;IACxC,mFAAmF;IACnF,sEAAsE;IACtE,EAAE,OAAO,EAAE,CAAC,YAAY,EAAE,qBAAqB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE;IAChE,EAAE,OAAO,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE;IACnC,EAAE,OAAO,EAAE,CAAC,UAAU,EAAE,gBAAgB,CAAC,EAAE;IAC3C,EAAE,OAAO,EAAE,CAAC,aAAa,CAAC,EAAE;IAC5B,EAAE,OAAO,EAAE,CAAC,gBAAgB,CAAC,EAAE;IAC/B,EAAE,OAAO,EAAE,CAAC,aAAa,CAAC,EAAE;CAC7B,CAAC;AAEF,MAAM,kBAAkB,GAA4B;IAClD,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC;IACvB,GAAG,CAAC,eAAe,EAAE,gBAAgB,CAAC;IACtC,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC;IAC1B,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC;IACxB,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC;IAC7B,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC;IAClC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC;IAC3B,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC;IACnC,QAAQ,CAAC,aAAa,EAAE,cAAc,CAAC;IACvC,QAAQ,CAAC,aAAa,EAAE,cAAc,CAAC;IACvC,GAAG,CAAC,YAAY,EAAE,eAAe,CAAC;IAClC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC;CACpC,CAAC;AAEF,MAAM,eAAe,GAAyB,CAAC,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAEhG,MAAM,mBAAmB,GAA4B;IACnD,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC;IAC1B,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC;IACnC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC;IAClC,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC;IACrC,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC;IAC5B,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC;IAC/B,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC;IACxB,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC;IACxB,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC;IAC3B,IAAI,CAAC,mBAAmB,EAAE,oBAAoB,CAAC;IAC/C,IAAI,CAAC,mBAAmB,EAAE,oBAAoB,CAAC;IAC/C,IAAI,CAAC,iBAAiB,EAAE,mBAAmB,CAAC;IAC5C,IAAI,CAAC,wBAAwB,EAAE,0BAA0B,CAAC;IAC1D,IAAI,CAAC,eAAe,EAAE,gBAAgB,CAAC;IACvC,IAAI,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;IAC3C,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC;IACpC,QAAQ,CAAC,iBAAiB,EAAE,mBAAmB,CAAC;IAChD,QAAQ,CAAC,eAAe,EAAE,iBAAiB,CAAC;IAC5C,QAAQ,CAAC,eAAe,EAAE,iBAAiB,CAAC;IAC5C,GAAG,CAAC,qBAAqB,EAAE,sBAAsB,CAAC;CACnD,CAAC;AAEF,MAAM,gBAAgB,GAAyB;IAC7C,EAAE,OAAO,EAAE,CAAC,wBAAwB,EAAE,aAAa,CAAC,EAAE;IACtD,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE;CACrC,CAAC;AAEF,YAAY;AAEZ,oCAAoC;AAEpC;;;;GAIG;AAEI,IAAM,4BAA4B,oCAAlC,MAAM,4BAA4B;IAGvC,YACmB,aAA+B,EAChD,UAAgC;QADf,kBAAa,GAAb,aAAa,CAAkB;QAHjC,WAAM,GAAG,IAAI,eAAM,CAAC,8BAA4B,CAAC,IAAI,CAAC,CAAC;QAMtE,UAAU,CAAC,YAAY,CAAC;YACtB,IAAI,EAAE,wBAAwB;YAC9B,QAAQ,EAAE,+BAAwB,CAAC,aAAa;YAChD,GAAG,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE;SAC3C,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,OAAoC;QAC3D,MAAM,IAAI,CAAC,QAAQ,CACjB,0CAAyB,EACzB,cAAc,EACd,WAAW,EACX,OAAO,EAAE,YAAY,CACtB,CAAC;QACF,MAAM,IAAI,CAAC,QAAQ,CACjB,kDAAiC,EACjC,kBAAkB,EAClB,eAAe,EACf,OAAO,EAAE,YAAY,CACtB,CAAC;QACF,MAAM,IAAI,CAAC,QAAQ,CACjB,mDAAkC,EAClC,mBAAmB,EACnB,gBAAgB,EAChB,OAAO,EAAE,YAAY,CACtB,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,QAAQ,CACpB,UAAkB,EAClB,UAAmC,EACnC,OAA6B,EAC7B,YAAY,GAAG,KAAK;QAEpB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,aAAa,CAAC,sBAAsB,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC;YACrF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,yBAAyB,UAAU,EAAE,CAAC,CAAC;QACzD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5D,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mCAAmC,UAAU,KAAK,OAAO,EAAE,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;CACF,CAAA;AApDY,oEAA4B;uCAA5B,4BAA4B;IADxC,IAAA,mBAAU,GAAE;6CAKuB,yBAAgB;QACpC,2BAAoB;GALvB,4BAA4B,CAoDxC;AAED,YAAY"}
|
|
@@ -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,
|
|
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
|
|
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
|
}
|