@spinajs/queue 2.0.481 → 2.0.484
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/lib/cjs/config/queue.d.ts +10 -0
- package/lib/cjs/config/queue.d.ts.map +1 -1
- package/lib/cjs/config/queue.js +21 -0
- package/lib/cjs/config/queue.js.map +1 -1
- package/lib/cjs/decorators.d.ts.map +1 -1
- package/lib/cjs/decorators.js.map +1 -1
- package/lib/cjs/fp.d.ts.map +1 -1
- package/lib/cjs/fp.js.map +1 -1
- package/lib/cjs/index.d.ts +13 -2
- package/lib/cjs/index.d.ts.map +1 -1
- package/lib/cjs/index.js +103 -14
- package/lib/cjs/index.js.map +1 -1
- package/lib/cjs/interfaces.d.ts +178 -7
- package/lib/cjs/interfaces.d.ts.map +1 -1
- package/lib/cjs/interfaces.js +59 -11
- package/lib/cjs/interfaces.js.map +1 -1
- package/lib/cjs/migrations/Queue_2026_06_30_00_00_00.d.ts +10 -0
- package/lib/cjs/migrations/Queue_2026_06_30_00_00_00.d.ts.map +1 -0
- package/lib/cjs/migrations/Queue_2026_06_30_00_00_00.js +29 -0
- package/lib/cjs/migrations/Queue_2026_06_30_00_00_00.js.map +1 -0
- package/lib/cjs/migrations/Queue_2026_07_02_00_00_00.d.ts +14 -0
- package/lib/cjs/migrations/Queue_2026_07_02_00_00_00.d.ts.map +1 -0
- package/lib/cjs/migrations/Queue_2026_07_02_00_00_00.js +53 -0
- package/lib/cjs/migrations/Queue_2026_07_02_00_00_00.js.map +1 -0
- package/lib/cjs/migrations/Queue_2026_07_10_00_00_00.d.ts +10 -0
- package/lib/cjs/migrations/Queue_2026_07_10_00_00_00.d.ts.map +1 -0
- package/lib/cjs/migrations/Queue_2026_07_10_00_00_00.js +31 -0
- package/lib/cjs/migrations/Queue_2026_07_10_00_00_00.js.map +1 -0
- package/lib/cjs/migrations/Queue_2026_07_17_00_00_00.d.ts +16 -0
- package/lib/cjs/migrations/Queue_2026_07_17_00_00_00.d.ts.map +1 -0
- package/lib/cjs/migrations/Queue_2026_07_17_00_00_00.js +49 -0
- package/lib/cjs/migrations/Queue_2026_07_17_00_00_00.js.map +1 -0
- package/lib/cjs/models/JobModel.d.ts +66 -4
- package/lib/cjs/models/JobModel.d.ts.map +1 -1
- package/lib/cjs/models/JobModel.js +43 -2
- package/lib/cjs/models/JobModel.js.map +1 -1
- package/lib/cjs/services/JobRetentionService.d.ts +26 -0
- package/lib/cjs/services/JobRetentionService.d.ts.map +1 -0
- package/lib/cjs/services/JobRetentionService.js +87 -0
- package/lib/cjs/services/JobRetentionService.js.map +1 -0
- package/lib/mjs/config/queue.d.ts +10 -0
- package/lib/mjs/config/queue.d.ts.map +1 -1
- package/lib/mjs/config/queue.js +21 -0
- package/lib/mjs/config/queue.js.map +1 -1
- package/lib/mjs/decorators.d.ts.map +1 -1
- package/lib/mjs/decorators.js.map +1 -1
- package/lib/mjs/fp.d.ts.map +1 -1
- package/lib/mjs/fp.js.map +1 -1
- package/lib/mjs/index.d.ts +13 -2
- package/lib/mjs/index.d.ts.map +1 -1
- package/lib/mjs/index.js +105 -16
- package/lib/mjs/index.js.map +1 -1
- package/lib/mjs/interfaces.d.ts +178 -7
- package/lib/mjs/interfaces.d.ts.map +1 -1
- package/lib/mjs/interfaces.js +57 -10
- package/lib/mjs/interfaces.js.map +1 -1
- package/lib/mjs/migrations/Queue_2026_06_30_00_00_00.d.ts +10 -0
- package/lib/mjs/migrations/Queue_2026_06_30_00_00_00.d.ts.map +1 -0
- package/lib/mjs/migrations/Queue_2026_06_30_00_00_00.js +26 -0
- package/lib/mjs/migrations/Queue_2026_06_30_00_00_00.js.map +1 -0
- package/lib/mjs/migrations/Queue_2026_07_02_00_00_00.d.ts +14 -0
- package/lib/mjs/migrations/Queue_2026_07_02_00_00_00.d.ts.map +1 -0
- package/lib/mjs/migrations/Queue_2026_07_02_00_00_00.js +50 -0
- package/lib/mjs/migrations/Queue_2026_07_02_00_00_00.js.map +1 -0
- package/lib/mjs/migrations/Queue_2026_07_10_00_00_00.d.ts +10 -0
- package/lib/mjs/migrations/Queue_2026_07_10_00_00_00.d.ts.map +1 -0
- package/lib/mjs/migrations/Queue_2026_07_10_00_00_00.js +28 -0
- package/lib/mjs/migrations/Queue_2026_07_10_00_00_00.js.map +1 -0
- package/lib/mjs/migrations/Queue_2026_07_17_00_00_00.d.ts +16 -0
- package/lib/mjs/migrations/Queue_2026_07_17_00_00_00.d.ts.map +1 -0
- package/lib/mjs/migrations/Queue_2026_07_17_00_00_00.js +46 -0
- package/lib/mjs/migrations/Queue_2026_07_17_00_00_00.js.map +1 -0
- package/lib/mjs/models/JobModel.d.ts +66 -4
- package/lib/mjs/models/JobModel.d.ts.map +1 -1
- package/lib/mjs/models/JobModel.js +42 -2
- package/lib/mjs/models/JobModel.js.map +1 -1
- package/lib/mjs/services/JobRetentionService.d.ts +26 -0
- package/lib/mjs/services/JobRetentionService.d.ts.map +1 -0
- package/lib/mjs/services/JobRetentionService.js +84 -0
- package/lib/mjs/services/JobRetentionService.js.map +1 -0
- package/lib/tsconfig.cjs.tsbuildinfo +1 -1
- package/lib/tsconfig.mjs.tsbuildinfo +1 -1
- package/package.json +10 -6
|
@@ -5,6 +5,16 @@ declare const queue: {
|
|
|
5
5
|
name: string;
|
|
6
6
|
service: string;
|
|
7
7
|
}[];
|
|
8
|
+
deduplicate: boolean;
|
|
9
|
+
retention: {
|
|
10
|
+
service: string;
|
|
11
|
+
enabled: boolean;
|
|
12
|
+
interval: number;
|
|
13
|
+
};
|
|
14
|
+
progress: {
|
|
15
|
+
minDelta: number;
|
|
16
|
+
minInterval: number;
|
|
17
|
+
};
|
|
8
18
|
};
|
|
9
19
|
};
|
|
10
20
|
export default queue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../../src/config/queue.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,KAAK
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../../src/config/queue.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,KAAK;;;;;;;;;;;;;;;;;;CAqCV,CAAC;AAEF,eAAe,KAAK,CAAC"}
|
package/lib/cjs/config/queue.js
CHANGED
|
@@ -12,6 +12,27 @@ const queue = {
|
|
|
12
12
|
service: 'BlackHoleQueueClient',
|
|
13
13
|
},
|
|
14
14
|
],
|
|
15
|
+
// Skip re-executing a job whose tracking row ( queue_jobs ) is already terminal
|
|
16
|
+
// ( success / error / dead ). Messaging is at-least-once, so duplicates happen on
|
|
17
|
+
// consumer crash and broker failover - dedup keeps jobs idempotent. Defaults to true.
|
|
18
|
+
deduplicate: true,
|
|
19
|
+
// Periodic cleanup of tracked jobs ( queue_jobs rows ). The `service` selects the
|
|
20
|
+
// JobRetentionService implementation; swap it to plug in a custom purge strategy.
|
|
21
|
+
// Disabled by default - set `enabled: true` and a `maxAge` ( ms ) to opt in.
|
|
22
|
+
retention: {
|
|
23
|
+
service: 'DefaultJobRetentionService',
|
|
24
|
+
enabled: false,
|
|
25
|
+
interval: 60 * 60 * 1000, // how often ( ms ) to run the purge
|
|
26
|
+
// maxAge: 7 * 24 * 60 * 60 * 1000, // delete terminal jobs older than this ( ms )
|
|
27
|
+
// statuses: ['success', 'error', 'dead'], // which statuses to purge
|
|
28
|
+
},
|
|
29
|
+
// Throttle job progress persistence so a chatty job doesn't write to the DB on every
|
|
30
|
+
// callback. A non-final, meta-less progress update is skipped unless it moved at least
|
|
31
|
+
// `minDelta` % or `minInterval` ms have passed since the last persisted write.
|
|
32
|
+
progress: {
|
|
33
|
+
minDelta: 5, // minimum progress delta ( % ) between throttled writes
|
|
34
|
+
minInterval: 1000, // minimum time ( ms ) between throttled writes
|
|
35
|
+
},
|
|
15
36
|
},
|
|
16
37
|
};
|
|
17
38
|
exports.default = queue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../../src/config/queue.ts"],"names":[],"mappings":";;AAAA,MAAM,KAAK,GAAG;IACZ,KAAK,EAAE;QACL,kDAAkD;QAClD,gEAAgE;QAChE,sEAAsE;QACtE,OAAO,EAAE,YAAY;QACrB,WAAW,EAAE;YACX;gBACE,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,sBAAsB;aAChC;SACF;KACF;CACF,CAAC;AAEF,kBAAe,KAAK,CAAC"}
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../../src/config/queue.ts"],"names":[],"mappings":";;AAAA,MAAM,KAAK,GAAG;IACZ,KAAK,EAAE;QACL,kDAAkD;QAClD,gEAAgE;QAChE,sEAAsE;QACtE,OAAO,EAAE,YAAY;QACrB,WAAW,EAAE;YACX;gBACE,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,sBAAsB;aAChC;SACF;QAED,gFAAgF;QAChF,kFAAkF;QAClF,sFAAsF;QACtF,WAAW,EAAE,IAAI;QAEjB,kFAAkF;QAClF,kFAAkF;QAClF,6EAA6E;QAC7E,SAAS,EAAE;YACT,OAAO,EAAE,4BAA4B;YACrC,OAAO,EAAE,KAAK;YACd,QAAQ,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,oCAAoC;YAC9D,kFAAkF;YAClF,qEAAqE;SACtE;QAED,qFAAqF;QACrF,uFAAuF;QACvF,+EAA+E;QAC/E,QAAQ,EAAE;YACR,QAAQ,EAAE,CAAC,EAAE,wDAAwD;YACrE,WAAW,EAAE,IAAI,EAAE,+CAA+C;SACnE;KACF;CACF,CAAC;AAEF,kBAAe,KAAK,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/decorators.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;
|
|
1
|
+
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/decorators.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,GAAG,KACT,QAAQ,GAAG,UAWpB;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,OAAO,CAAC,EAAE,YAAY,IAClC,QAAQ,GAAG,UAYpB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/decorators.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/decorators.ts"],"names":[],"mappings":";;AAaA,kBAYC;AAOD,sBAaC;AAtCD;;;;;GAKG;AACH,SAAgB,GAAG;IACjB,OAAO,CAAC,MAAW,EAAE,EAAE;QACrB,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,eAAe,EAAE,MAAM,CAAC,EAAE,CAAC;YAClD,OAAO,CAAC,cAAc,CACpB,eAAe,EACf;gBACE,IAAI,EAAE,KAAK;aACZ,EACD,MAAM,CACP,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAgB,KAAK,CAAC,OAAsB;IAC1C,OAAO,CAAC,MAAW,EAAE,EAAE;QACrB,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,eAAe,EAAE,MAAM,CAAC,EAAE,CAAC;YAClD,OAAO,CAAC,cAAc,CACpB,eAAe,EACf;gBACE,GAAG,OAAO;gBACV,IAAI,EAAE,OAAO;aACd,EACD,MAAM,CACP,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
package/lib/cjs/fp.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fp.d.ts","sourceRoot":"","sources":["../../src/fp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAgB,MAAM,iBAAiB,CAAC;AAIpF,wBAAgB,GAAG,CAAC,KAAK,EAAE,aAAa,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"fp.d.ts","sourceRoot":"","sources":["../../src/fp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAgB,MAAM,iBAAiB,CAAC;AAIpF,wBAAgB,GAAG,CAAC,KAAK,EAAE,aAAa,GAAG,UAAU,GAAG,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAErF"}
|
package/lib/cjs/fp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fp.js","sourceRoot":"","sources":["../../src/fp.ts"],"names":[],"mappings":";;AAIA,
|
|
1
|
+
{"version":3,"file":"fp.js","sourceRoot":"","sources":["../../src/fp.ts"],"names":[],"mappings":";;AAIA,kBAEC;AAND,mDAAoF;AACpF,wCAAuC;AACvC,oCAAuC;AAEvC,SAAgB,GAAG,CAAC,KAA4C;IAC9D,OAAO,GAAG,EAAE,CAAC,IAAA,aAAM,EAAC,IAAA,aAAQ,EAAC,4BAAY,CAAC,EAAE,CAAC,OAAqB,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAC9F,CAAC"}
|
package/lib/cjs/index.d.ts
CHANGED
|
@@ -1,17 +1,28 @@
|
|
|
1
1
|
import { Constructor } from '@spinajs/di';
|
|
2
2
|
import { Log } from '@spinajs/log';
|
|
3
|
-
import { QueueClient, QueueJob, QueueEvent, IQueueMessage, QueueMessage, QueueService } from './interfaces.js';
|
|
3
|
+
import { QueueClient, QueueJob, QueueEvent, IQueueMessage, QueueMessage, QueueService, JobRetentionService } from './interfaces.js';
|
|
4
4
|
export * from './BlackHoleQueueClient.js';
|
|
5
5
|
export * from './interfaces.js';
|
|
6
6
|
export * from './decorators.js';
|
|
7
7
|
export * from './models/JobModel.js';
|
|
8
|
+
export * from './services/JobRetentionService.js';
|
|
8
9
|
export * from './migrations/Queue_2022_10_18_01_13_00.js';
|
|
10
|
+
export * from './migrations/Queue_2026_06_30_00_00_00.js';
|
|
11
|
+
export * from './migrations/Queue_2026_07_02_00_00_00.js';
|
|
12
|
+
export * from './migrations/Queue_2026_07_10_00_00_00.js';
|
|
13
|
+
export * from './migrations/Queue_2026_07_17_00_00_00.js';
|
|
9
14
|
export * from './fp.js';
|
|
10
15
|
export declare class DefaultQueueService extends QueueService {
|
|
11
16
|
protected Log: Log;
|
|
12
17
|
protected Connections: Map<string, QueueClient>;
|
|
18
|
+
/**
|
|
19
|
+
* Config-selected retention service that periodically purges old tracked jobs.
|
|
20
|
+
* Started / stopped by DI on injection / disposal. May be undefined if retention
|
|
21
|
+
* is not configured.
|
|
22
|
+
*/
|
|
23
|
+
protected Retention?: JobRetentionService;
|
|
13
24
|
dispose(): Promise<void>;
|
|
14
|
-
emit(event: IQueueMessage | QueueEvent | QueueJob): Promise<
|
|
25
|
+
emit(event: IQueueMessage | QueueEvent | QueueJob): Promise<string | undefined>;
|
|
15
26
|
stopConsuming(event: Constructor<QueueMessage>): Promise<void>;
|
|
16
27
|
/**
|
|
17
28
|
*
|
package/lib/cjs/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAmC,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,GAAG,EAAU,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAmC,MAAM,aAAa,CAAC;AAC3E,OAAO,EAAE,GAAG,EAAU,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAoB,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAS,MAAM,iBAAiB,CAAC;AAM7J,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,mCAAmC,CAAC;AAClD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,SAAS,CAAC;AAMxB,qBACa,mBAAoB,SAAQ,YAAY;IAEnD,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;IAGnB,SAAS,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAEhD;;;;OAIG;IAEH,SAAS,CAAC,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAE7B,OAAO;IAoBP,IAAI,CAAC,KAAK,EAAE,aAAa,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAwB/E,aAAa,CAAC,KAAK,EAAE,WAAW,CAAC,YAAY,CAAC;IAI3D;;;;;;;;;;;;;;;OAeG;IACU,OAAO,CAAC,CAAC,SAAS,YAAY,EAAE,KAAK,EAAE,WAAW,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,EAAE,cAAc,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO;IAwKnK;;;;OAIG;IACI,GAAG,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW;CAG7C"}
|
package/lib/cjs/index.js
CHANGED
|
@@ -36,10 +36,26 @@ __exportStar(require("./BlackHoleQueueClient.js"), exports);
|
|
|
36
36
|
__exportStar(require("./interfaces.js"), exports);
|
|
37
37
|
__exportStar(require("./decorators.js"), exports);
|
|
38
38
|
__exportStar(require("./models/JobModel.js"), exports);
|
|
39
|
+
__exportStar(require("./services/JobRetentionService.js"), exports);
|
|
39
40
|
__exportStar(require("./migrations/Queue_2022_10_18_01_13_00.js"), exports);
|
|
41
|
+
__exportStar(require("./migrations/Queue_2026_06_30_00_00_00.js"), exports);
|
|
42
|
+
__exportStar(require("./migrations/Queue_2026_07_02_00_00_00.js"), exports);
|
|
43
|
+
__exportStar(require("./migrations/Queue_2026_07_10_00_00_00.js"), exports);
|
|
44
|
+
__exportStar(require("./migrations/Queue_2026_07_17_00_00_00.js"), exports);
|
|
40
45
|
__exportStar(require("./fp.js"), exports);
|
|
46
|
+
/** Fallback progress-throttle values used when `queue.progress` is not configured. */
|
|
47
|
+
const DEFAULT_PROGRESS_MIN_DELTA = 5;
|
|
48
|
+
const DEFAULT_PROGRESS_MIN_INTERVAL_MS = 1000;
|
|
41
49
|
let DefaultQueueService = class DefaultQueueService extends interfaces_js_1.QueueService {
|
|
42
50
|
async dispose() {
|
|
51
|
+
if (this.Retention) {
|
|
52
|
+
try {
|
|
53
|
+
await this.Retention.dispose();
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
this.Log.error(err, 'Cannot dispose job retention service');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
43
59
|
this.Connections.forEach(async (val) => {
|
|
44
60
|
try {
|
|
45
61
|
await val.dispose();
|
|
@@ -52,24 +68,21 @@ let DefaultQueueService = class DefaultQueueService extends interfaces_js_1.Queu
|
|
|
52
68
|
}
|
|
53
69
|
async emit(event) {
|
|
54
70
|
const connections = this.getConnectionsForMessage(event);
|
|
71
|
+
let jobId;
|
|
55
72
|
for (let c of connections) {
|
|
56
73
|
const connection = this.Connections.get(c);
|
|
57
74
|
if (!connection) {
|
|
58
75
|
throw new exceptions_1.ConnectionNotFound(`Queue connection ${c} not found. Please check your configuration before emitting events to this connection.`);
|
|
59
76
|
}
|
|
60
77
|
if ((0, interfaces_js_1.isJob)(event)) {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
jModel.Name = event.Name;
|
|
64
|
-
jModel.Status = 'created';
|
|
65
|
-
jModel.Progress = 0;
|
|
66
|
-
jModel.Connection = c;
|
|
67
|
-
await jModel.insert();
|
|
68
|
-
event.JobId = jModel.JobId;
|
|
78
|
+
event.JobId = event.JobId ?? (0, uuid_1.v4)(); // generate only; consumer writes the row
|
|
79
|
+
jobId = event.JobId;
|
|
69
80
|
}
|
|
70
81
|
await connection.emit(event);
|
|
71
82
|
this.Log.trace(`Emitted message ${event.Name}, type: ${event.Type} to connection ${c}`);
|
|
72
83
|
}
|
|
84
|
+
// for jobs this is the id the caller uses to track progress / status
|
|
85
|
+
return jobId;
|
|
73
86
|
}
|
|
74
87
|
async stopConsuming(event) {
|
|
75
88
|
this.getConnectionsForMessage(event).forEach((c) => this.Connections.get(c).unsubscribe(event));
|
|
@@ -116,9 +129,46 @@ let DefaultQueueService = class DefaultQueueService extends interfaces_js_1.Queu
|
|
|
116
129
|
*/
|
|
117
130
|
if (ev instanceof interfaces_js_1.QueueJob) {
|
|
118
131
|
let jobResult = null;
|
|
119
|
-
|
|
132
|
+
// Consumer owns the tracking row. First receipt inserts; a redelivery finds the
|
|
133
|
+
// row from the prior attempt. The queue_jobs.JobId unique index makes a rare
|
|
134
|
+
// concurrent double-receipt safe (second insert collides -> re-read).
|
|
135
|
+
let jModel = await JobModel_js_1.JobModel.where({ JobId: ev.JobId }).first();
|
|
136
|
+
if (!jModel) {
|
|
137
|
+
jModel = new JobModel_js_1.JobModel();
|
|
138
|
+
jModel.JobId = ev.JobId;
|
|
139
|
+
jModel.Name = ev.Name;
|
|
140
|
+
jModel.Connection = c;
|
|
141
|
+
jModel.Attempt = 0;
|
|
142
|
+
jModel.Progress = 0;
|
|
143
|
+
// set Status explicitly so tracking never depends on the DB column default,
|
|
144
|
+
// which can differ across dialects ( and MySQL MODIFY COLUMN can drop it ).
|
|
145
|
+
jModel.Status = 'created';
|
|
146
|
+
// capture the dispatch-time attempt ceiling ( retries + 1 ) so it stays authoritative
|
|
147
|
+
// across redeliveries and consumers can render Attempt/MaxAttempts consistently.
|
|
148
|
+
jModel.MaxAttempts = (ev.RetryCount ?? 0) + 1;
|
|
149
|
+
try {
|
|
150
|
+
await jModel.insert();
|
|
151
|
+
}
|
|
152
|
+
catch (e) {
|
|
153
|
+
// concurrent first-receipt from another worker won the insert; re-read and continue.
|
|
154
|
+
jModel = await JobModel_js_1.JobModel.where({ JobId: ev.JobId }).firstOrThrow(new exceptions_1.UnexpectedServerError(`No model found for jobId ${ev.JobId}`));
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// at-least-once delivery means a job can be redelivered after it already finished
|
|
158
|
+
// ( consumer crash before ack, broker failover ). Skip re-running a job whose tracking
|
|
159
|
+
// row is already terminal so jobs stay idempotent. Acks without re-execution or rethrow.
|
|
160
|
+
if ((this.Configuration?.deduplicate ?? true) && JobModel_js_1.JOB_TERMINAL_STATUSES.includes(jModel.Status)) {
|
|
161
|
+
this.Log.info(`Job ${ev.Name}:${ev.JobId} already in terminal state ${jModel.Status}, skipping duplicate delivery`);
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
120
164
|
jModel.Status = 'executing';
|
|
121
165
|
jModel.ExecutedAt = luxon_1.DateTime.now();
|
|
166
|
+
// throttle progress persistence: skip writes smaller than the threshold and
|
|
167
|
+
// closer together than the min interval, so a chatty job doesn't hammer the DB.
|
|
168
|
+
let lastProgress = 0;
|
|
169
|
+
let lastProgressAt = 0;
|
|
170
|
+
const minProgressDelta = this.Configuration.progress?.minDelta ?? DEFAULT_PROGRESS_MIN_DELTA;
|
|
171
|
+
const minProgressInterval = this.Configuration.progress?.minInterval ?? DEFAULT_PROGRESS_MIN_INTERVAL_MS;
|
|
122
172
|
try {
|
|
123
173
|
// update executing state
|
|
124
174
|
await jModel.update();
|
|
@@ -131,13 +181,48 @@ let DefaultQueueService = class DefaultQueueService extends interfaces_js_1.Queu
|
|
|
131
181
|
}
|
|
132
182
|
catch (err) {
|
|
133
183
|
this.Log.error(err, `Cannot execute job ${event.name}`);
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
jModel.
|
|
184
|
+
// record the failed attempt and mark the job retrying / dead so the
|
|
185
|
+
// transport can apply its retry-then-dead-letter policy ( re-thrown below ).
|
|
186
|
+
// the error goes to LastError - Result is reserved for the successful output.
|
|
187
|
+
jModel.Attempt = (jModel.Attempt ?? 0) + 1;
|
|
188
|
+
// derive the retry limit from the dispatch-time ceiling captured on the row so it stays
|
|
189
|
+
// authoritative across redeliveries ( a redelivered wire message could carry a different
|
|
190
|
+
// RetryCount ). MaxAttempts is retries + 1, so the limit is MaxAttempts - 1.
|
|
191
|
+
const maxRetries = jModel.MaxAttempts ? jModel.MaxAttempts - 1 : (ev.RetryCount ?? 0);
|
|
192
|
+
jModel.Status = jModel.Attempt > maxRetries ? 'dead' : 'retrying';
|
|
193
|
+
jModel.LastError = err instanceof Error ? err.message : String(err);
|
|
194
|
+
await jModel.update();
|
|
195
|
+
// notify the job of the failed attempt ( e.g. to send an alert on the final one ).
|
|
196
|
+
// the hook must never mask the original error, so its own failure is only logged.
|
|
197
|
+
try {
|
|
198
|
+
await ev.onFailed(err, { attempt: jModel.Attempt, maxAttempts: jModel.MaxAttempts ?? maxRetries + 1, isFinal: jModel.Status === 'dead', jobId: ev.JobId });
|
|
199
|
+
}
|
|
200
|
+
catch (hookErr) {
|
|
201
|
+
this.Log.error(hookErr, `onFailed hook for job ${event.name} threw`);
|
|
202
|
+
}
|
|
203
|
+
// propagate so the transport sees the failure and can retry / dead-letter.
|
|
204
|
+
// ( previously the error was swallowed and the message silently acked )
|
|
205
|
+
throw err;
|
|
138
206
|
}
|
|
139
207
|
await jModel.update();
|
|
140
|
-
async function onProgress(p) {
|
|
208
|
+
async function onProgress(p, meta) {
|
|
209
|
+
const now = luxon_1.DateTime.now().toMillis();
|
|
210
|
+
const isFinal = p >= 100;
|
|
211
|
+
const hasMeta = meta?.phase !== undefined || meta?.message !== undefined;
|
|
212
|
+
// apply meta eagerly so a phase / message change is never lost to throttling
|
|
213
|
+
if (meta?.phase !== undefined) {
|
|
214
|
+
jModel.Phase = meta.phase;
|
|
215
|
+
}
|
|
216
|
+
if (meta?.message !== undefined) {
|
|
217
|
+
jModel.Message = meta.message;
|
|
218
|
+
}
|
|
219
|
+
// always persist the final 100% or a meta change; otherwise throttle by delta + time
|
|
220
|
+
if (!isFinal && !hasMeta && p - lastProgress < minProgressDelta && now - lastProgressAt < minProgressInterval) {
|
|
221
|
+
jModel.Progress = p;
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
lastProgress = p;
|
|
225
|
+
lastProgressAt = now;
|
|
141
226
|
jModel.Progress = p;
|
|
142
227
|
await jModel.update();
|
|
143
228
|
self.Log.trace(`Job ${event.name}:${jModel.JobId} progress: ${p}%`);
|
|
@@ -172,6 +257,10 @@ __decorate([
|
|
|
172
257
|
(0, configuration_1.AutoinjectService)('queue.connections', interfaces_js_1.QueueClient),
|
|
173
258
|
__metadata("design:type", Map)
|
|
174
259
|
], DefaultQueueService.prototype, "Connections", void 0);
|
|
260
|
+
__decorate([
|
|
261
|
+
(0, configuration_1.AutoinjectService)('queue.retention', interfaces_js_1.JobRetentionService),
|
|
262
|
+
__metadata("design:type", interfaces_js_1.JobRetentionService)
|
|
263
|
+
], DefaultQueueService.prototype, "Retention", void 0);
|
|
175
264
|
exports.DefaultQueueService = DefaultQueueService = __decorate([
|
|
176
265
|
(0, di_1.Injectable)(interfaces_js_1.QueueService)
|
|
177
266
|
], DefaultQueueService);
|
package/lib/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,oDAAiG;AACjG,oCAA2E;AAC3E,sCAA2C;AAC3C,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/lib/cjs/interfaces.d.ts
CHANGED
|
@@ -34,7 +34,12 @@ export interface IQueueJob extends IQueueMessage {
|
|
|
34
34
|
}
|
|
35
35
|
export declare abstract class QueueService extends AsyncService {
|
|
36
36
|
protected Configuration: IQueueConfiguration;
|
|
37
|
-
|
|
37
|
+
/**
|
|
38
|
+
* Emit a message. For jobs the generated JobId is returned so the caller can
|
|
39
|
+
* correlate the job with its progress/status (e.g. via queue-http-progress).
|
|
40
|
+
* Returns undefined for non-job messages.
|
|
41
|
+
*/
|
|
42
|
+
abstract emit(event: IQueueMessage | QueueEvent | QueueJob): Promise<string | undefined>;
|
|
38
43
|
abstract consume<T extends QueueMessage>(event: Constructor<QueueMessage>, callback?: (message: T) => Promise<void>, subscriptionId?: string, durable?: boolean): Promise<void>;
|
|
39
44
|
abstract stopConsuming(event: Constructor<QueueMessage>): Promise<void>;
|
|
40
45
|
abstract get(connection?: string): QueueClient;
|
|
@@ -88,6 +93,35 @@ export declare abstract class QueueEvent extends QueueMessage {
|
|
|
88
93
|
*
|
|
89
94
|
* Job results are preserved
|
|
90
95
|
*/
|
|
96
|
+
/**
|
|
97
|
+
* Optional richer progress metadata a job may report alongside the numeric
|
|
98
|
+
* percentage - persisted to the job model and exposed by queue-http-progress.
|
|
99
|
+
*/
|
|
100
|
+
export interface IJobProgressMeta {
|
|
101
|
+
/** Short phase label, e.g. `loading`, `rendering`. */
|
|
102
|
+
phase?: string;
|
|
103
|
+
/** Human-facing status message. */
|
|
104
|
+
message?: string;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Progress reporter passed to {@link QueueJob.execute}. Call with a 0-100
|
|
108
|
+
* percentage; the optional `meta` carries a phase label / message. Jobs that
|
|
109
|
+
* only report a percentage can ignore `meta`.
|
|
110
|
+
*/
|
|
111
|
+
export type JobProgressCallback = (p: number, meta?: IJobProgressMeta) => Promise<void>;
|
|
112
|
+
/**
|
|
113
|
+
* Context passed to {@link QueueJob.onFailed} describing the failed attempt.
|
|
114
|
+
*/
|
|
115
|
+
export interface IJobFailureContext {
|
|
116
|
+
/** The attempt number that just failed ( 1-based ). */
|
|
117
|
+
attempt: number;
|
|
118
|
+
/** The total allowed executions ( retries + 1 ). */
|
|
119
|
+
maxAttempts: number;
|
|
120
|
+
/** True when this failure exhausted the retries and the job was marked dead. */
|
|
121
|
+
isFinal: boolean;
|
|
122
|
+
/** The failed job's JobId. */
|
|
123
|
+
jobId: string;
|
|
124
|
+
}
|
|
91
125
|
export declare abstract class QueueJob extends QueueMessage implements IQueueJob {
|
|
92
126
|
JobId: string;
|
|
93
127
|
/**
|
|
@@ -95,8 +129,18 @@ export declare abstract class QueueJob extends QueueMessage implements IQueueJob
|
|
|
95
129
|
*/
|
|
96
130
|
RetryCount: number;
|
|
97
131
|
constructor();
|
|
98
|
-
abstract execute(progress:
|
|
99
|
-
|
|
132
|
+
abstract execute(progress: JobProgressCallback): Promise<unknown>;
|
|
133
|
+
/**
|
|
134
|
+
* Called by the consumer after a failed execute(); isFinal=true when the job was marked dead.
|
|
135
|
+
* Must not throw - errors are logged and swallowed. Override to react to failures ( e.g. send an
|
|
136
|
+
* alert on the final attempt ). No-op by default.
|
|
137
|
+
*/
|
|
138
|
+
onFailed(_err: unknown, _ctx: IJobFailureContext): Promise<void>;
|
|
139
|
+
/**
|
|
140
|
+
* Emit (enqueue) this job. Returns the generated JobId so the caller can track
|
|
141
|
+
* the job's progress / status (e.g. via queue-http-progress `:jobId/status`).
|
|
142
|
+
*/
|
|
143
|
+
static emit<T extends typeof QueueMessage>(this: T, val: Partial<InstanceType<T>>, options?: IMessageOptions): Promise<string | undefined>;
|
|
100
144
|
}
|
|
101
145
|
export declare abstract class QueueClient extends AsyncService implements IInstanceCheck, IMappableService {
|
|
102
146
|
Options: IQueueConnectionOptions;
|
|
@@ -108,9 +152,14 @@ export declare abstract class QueueClient extends AsyncService implements IInsta
|
|
|
108
152
|
__checkInstance__(creationOptions: any): boolean;
|
|
109
153
|
/**
|
|
110
154
|
*
|
|
111
|
-
* Dispatches
|
|
155
|
+
* Dispatches a message to the broker.
|
|
112
156
|
*
|
|
113
|
-
*
|
|
157
|
+
* Delivery-guarantee contract: the returned promise MUST resolve only once the broker has
|
|
158
|
+
* taken custody of the message ( AMQP publisher confirm / STOMP RECEIPT frame ), so callers
|
|
159
|
+
* emitting persistent Jobs get an at-least-once guarantee. Fire-and-forget publishing is only
|
|
160
|
+
* acceptable for non-persistent Events.
|
|
161
|
+
*
|
|
162
|
+
* @param event - message to dispatch
|
|
114
163
|
*/
|
|
115
164
|
abstract emit(event: IQueueMessage): Promise<void>;
|
|
116
165
|
/**
|
|
@@ -128,8 +177,17 @@ export declare abstract class QueueClient extends AsyncService implements IInsta
|
|
|
128
177
|
* @param durable - is durable event ?
|
|
129
178
|
*/
|
|
130
179
|
abstract subscribe(channel: string, callback: (e: IQueueMessage) => Promise<void>, subscriptionId?: string, durable?: boolean): Promise<void>;
|
|
131
|
-
abstract unsubscribe(event: Constructor<QueueMessage
|
|
132
|
-
abstract unsubscribe(channel: string): void;
|
|
180
|
+
abstract unsubscribe(event: Constructor<QueueMessage>, removeDurable?: boolean): void;
|
|
181
|
+
abstract unsubscribe(channel: string, removeDurable?: boolean): void;
|
|
182
|
+
/**
|
|
183
|
+
*
|
|
184
|
+
* Gets dead-letter channel for message from routing table or connection default if non is set.
|
|
185
|
+
* Used by transports to redirect messages that failed processing so they don't block the queue.
|
|
186
|
+
*
|
|
187
|
+
* @param event - event/job to check
|
|
188
|
+
* @returns the dead-letter channel, or undefined if none is configured
|
|
189
|
+
*/
|
|
190
|
+
getDeadLetterChannelForMessage(event: IQueueMessage | Constructor<QueueMessage>): string | undefined;
|
|
133
191
|
/**
|
|
134
192
|
*
|
|
135
193
|
* Gets event channel from routing table or default if non is set
|
|
@@ -154,6 +212,78 @@ export interface IQueueConfiguration {
|
|
|
154
212
|
*/
|
|
155
213
|
routing?: IQueueMessageRoutingOptions;
|
|
156
214
|
connections: IQueueConnectionOptions[];
|
|
215
|
+
/**
|
|
216
|
+
* Skip re-executing a job whose {@link JobModel} is already in a terminal state
|
|
217
|
+
* ( `success` or `dead` ). Messaging is at-least-once, so duplicates happen on
|
|
218
|
+
* consumer crash and on broker failover - dedup keeps jobs idempotent.
|
|
219
|
+
*
|
|
220
|
+
* Defaults to `true`.
|
|
221
|
+
*/
|
|
222
|
+
deduplicate?: boolean;
|
|
223
|
+
/**
|
|
224
|
+
* Automatic cleanup of old tracked jobs ( {@link JobModel} rows ) so the table doesn't
|
|
225
|
+
* grow unbounded. Disabled by default - opt in to avoid silently deleting data.
|
|
226
|
+
*/
|
|
227
|
+
retention?: IQueueRetentionOptions;
|
|
228
|
+
/**
|
|
229
|
+
* Throttling of job progress persistence, so a chatty job that reports progress
|
|
230
|
+
* frequently doesn't hammer the DB with a write per callback.
|
|
231
|
+
*/
|
|
232
|
+
progress?: IQueueProgressOptions;
|
|
233
|
+
}
|
|
234
|
+
export interface IQueueProgressOptions {
|
|
235
|
+
/**
|
|
236
|
+
* Minimum progress delta ( % ) between throttled DB writes. Default `5`.
|
|
237
|
+
*/
|
|
238
|
+
minDelta?: number;
|
|
239
|
+
/**
|
|
240
|
+
* Minimum time ( ms ) between throttled DB writes. Default `1000`.
|
|
241
|
+
*/
|
|
242
|
+
minInterval?: number;
|
|
243
|
+
}
|
|
244
|
+
export interface IQueueRetentionOptions {
|
|
245
|
+
/**
|
|
246
|
+
* DI service name of the {@link JobRetentionService} implementation that runs the purge.
|
|
247
|
+
* Selected via {@link AutoinjectService}; defaults to `DefaultJobRetentionService`.
|
|
248
|
+
*/
|
|
249
|
+
service: string;
|
|
250
|
+
/**
|
|
251
|
+
* Turn the periodic purge on. Default `false`.
|
|
252
|
+
*/
|
|
253
|
+
enabled?: boolean;
|
|
254
|
+
/**
|
|
255
|
+
* Age in milliseconds after which a purged job is deleted ( based on CreatedAt ).
|
|
256
|
+
*/
|
|
257
|
+
maxAge?: number;
|
|
258
|
+
/**
|
|
259
|
+
* Which statuses to purge. Defaults to terminal statuses ( success / error / dead ).
|
|
260
|
+
*/
|
|
261
|
+
statuses?: string[];
|
|
262
|
+
/**
|
|
263
|
+
* How often ( ms ) to run the purge. Default 1 hour.
|
|
264
|
+
*/
|
|
265
|
+
interval?: number;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Runs the periodic cleanup of tracked jobs ( {@link JobModel} rows ) so the table doesn't grow
|
|
269
|
+
* unbounded. The concrete implementation is selected by config ( `queue.retention.service` ) and
|
|
270
|
+
* injected into the {@link QueueService} via {@link AutoinjectService}. Because it is an
|
|
271
|
+
* {@link AsyncService}, DI runs `resolve()` on injection ( where the periodic purge is started )
|
|
272
|
+
* and `dispose()` on teardown ( where it is stopped ).
|
|
273
|
+
*/
|
|
274
|
+
export declare abstract class JobRetentionService extends AsyncService implements IMappableService {
|
|
275
|
+
Options: IQueueRetentionOptions;
|
|
276
|
+
constructor(Options: IQueueRetentionOptions);
|
|
277
|
+
get ServiceName(): string;
|
|
278
|
+
/**
|
|
279
|
+
* Deletes tracked jobs ( {@link JobModel} rows ) created before `olderThan` in one of `statuses`.
|
|
280
|
+
* Used by the periodic purge and available for manual cleanup.
|
|
281
|
+
*
|
|
282
|
+
* @param olderThan - delete jobs created before this moment
|
|
283
|
+
* @param statuses - which statuses to purge ( defaults to terminal: success / error / dead )
|
|
284
|
+
* @returns number of deleted rows
|
|
285
|
+
*/
|
|
286
|
+
abstract purgeJobs(olderThan: DateTime, statuses?: string[]): Promise<number>;
|
|
157
287
|
}
|
|
158
288
|
export interface IMessageRoutingOption {
|
|
159
289
|
channel?: string;
|
|
@@ -190,6 +320,47 @@ export interface IQueueConnectionOptions {
|
|
|
190
320
|
* and for unblocking source queue
|
|
191
321
|
*/
|
|
192
322
|
defaultQueueDeadLetterChannel?: string;
|
|
323
|
+
/**
|
|
324
|
+
* Delay in milliseconds before the transport tries to reconnect after a dropped connection.
|
|
325
|
+
*/
|
|
326
|
+
reconnectDelay?: number;
|
|
327
|
+
/**
|
|
328
|
+
* Incoming heartbeat interval in milliseconds ( 0 to disable ).
|
|
329
|
+
*/
|
|
330
|
+
heartbeatIncoming?: number;
|
|
331
|
+
/**
|
|
332
|
+
* Outgoing heartbeat interval in milliseconds ( 0 to disable ).
|
|
333
|
+
*/
|
|
334
|
+
heartbeatOutgoing?: number;
|
|
335
|
+
/**
|
|
336
|
+
* How long ( ms ) to wait for the initial connection before giving up.
|
|
337
|
+
*/
|
|
338
|
+
connectionTimeout?: number;
|
|
339
|
+
/**
|
|
340
|
+
* How long ( ms ) to wait for a broker delivery receipt when emitting a message.
|
|
341
|
+
*/
|
|
342
|
+
receiptTimeout?: number;
|
|
343
|
+
/**
|
|
344
|
+
* Base delay ( ms ) for retry backoff when a job fails and is rescheduled.
|
|
345
|
+
* Transports may apply exponential backoff based on this value. 0 means retry immediately.
|
|
346
|
+
*/
|
|
347
|
+
retryDelay?: number;
|
|
348
|
+
/**
|
|
349
|
+
* Optional DI service name resolving to an {@link IQueueCredentialsProvider}.
|
|
350
|
+
* When set, the transport asks it for credentials right before each ( re )connect,
|
|
351
|
+
* allowing rotating secrets / token based authentication.
|
|
352
|
+
*/
|
|
353
|
+
credentialProvider?: string;
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Provides connection credentials on demand ( e.g. rotating secrets, short lived tokens ).
|
|
357
|
+
* Resolved from DI by the name set in {@link IQueueConnectionOptions.credentialProvider}.
|
|
358
|
+
*/
|
|
359
|
+
export interface IQueueCredentialsProvider {
|
|
360
|
+
getCredentials(options: IQueueConnectionOptions): Promise<{
|
|
361
|
+
login?: string;
|
|
362
|
+
passcode?: string;
|
|
363
|
+
}>;
|
|
193
364
|
}
|
|
194
365
|
export interface IMessageOptions {
|
|
195
366
|
Persistent: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAM,cAAc,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC9F,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,OAAO,EAAE,GAAG,EAAU,MAAM,cAAc,CAAC;AAG3C,oBAAY,gBAAgB;IAC1B,GAAG,QAAQ;IACX,KAAK,UAAU;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,QAAQ,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,gBAAgB,CAAC;IAEvB,UAAU,EAAE,OAAO,CAAC;IAEpB,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,SAAU,SAAQ,aAAa;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,8BAAsB,YAAa,SAAQ,YAAY;IAErD,SAAS,CAAC,aAAa,EAAE,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"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"}
|