@tyravel/queue 0.1.0 → 0.2.1
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/dist/database-queue.d.ts +2 -1
- package/dist/database-queue.d.ts.map +1 -1
- package/dist/database-queue.js.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/queue-manager.d.ts +3 -1
- package/dist/queue-manager.d.ts.map +1 -1
- package/dist/queue-manager.js +10 -1
- package/dist/queue-manager.js.map +1 -1
- package/dist/queue-processor.js +3 -3
- package/dist/queue-processor.js.map +1 -1
- package/dist/redis-queue.d.ts +32 -0
- package/dist/redis-queue.d.ts.map +1 -0
- package/dist/redis-queue.js +155 -0
- package/dist/redis-queue.js.map +1 -0
- package/dist/redis-queue.test.d.ts +2 -0
- package/dist/redis-queue.test.d.ts.map +1 -0
- package/dist/redis-queue.test.js +60 -0
- package/dist/redis-queue.test.js.map +1 -0
- package/dist/types.d.ts +9 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/worker-queue.d.ts +11 -0
- package/dist/worker-queue.d.ts.map +1 -0
- package/dist/worker-queue.js +7 -0
- package/dist/worker-queue.js.map +1 -0
- package/package.json +4 -3
package/dist/database-queue.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type { DatabaseConnection } from '@tyravel/database';
|
|
2
2
|
import type { Job } from './job.js';
|
|
3
3
|
import type { QueueContract } from './queue-contract.js';
|
|
4
|
+
import type { WorkerQueue } from './worker-queue.js';
|
|
4
5
|
import type { DatabaseQueueConnectionConfig, QueueJobRecord, SerializedJobPayload } from './types.js';
|
|
5
|
-
export declare class DatabaseQueue implements QueueContract {
|
|
6
|
+
export declare class DatabaseQueue implements QueueContract, WorkerQueue {
|
|
6
7
|
private readonly connection;
|
|
7
8
|
private readonly table;
|
|
8
9
|
private readonly retryAfter;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database-queue.d.ts","sourceRoot":"","sources":["../src/database-queue.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAEpC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EACV,6BAA6B,EAC7B,cAAc,EACd,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAYpB,qBAAa,aAAc,YAAW,aAAa;
|
|
1
|
+
{"version":3,"file":"database-queue.d.ts","sourceRoot":"","sources":["../src/database-queue.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAE5D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAEpC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EACV,6BAA6B,EAC7B,cAAc,EACd,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAYpB,qBAAa,aAAc,YAAW,aAAa,EAAE,WAAW;IAK5D,OAAO,CAAC,QAAQ,CAAC,UAAU;IAJ7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAGjB,UAAU,EAAE,kBAAkB,EAC/C,MAAM,GAAE,6BAAsD;IAM1D,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,SAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAIlD,OAAO,CAAC,OAAO,EAAE,oBAAoB,EAAE,KAAK,SAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAc1E,KAAK,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,SAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAezE,GAAG,CAAC,KAAK,SAAY,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IA2BtD,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,SAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAe1D,MAAM,CAAC,MAAM,EAAE,cAAc;IAI7B,aAAa,IAAI,MAAM;IAIvB,OAAO,CAAC,YAAY;CAGrB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database-queue.js","sourceRoot":"","sources":["../src/database-queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"database-queue.js","sourceRoot":"","sources":["../src/database-queue.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Container } from '@tyravel/container';
|
|
2
2
|
import type { DatabaseManager } from '@tyravel/database';
|
|
3
|
+
import type { RedisManager } from '@tyravel/redis';
|
|
3
4
|
import { Dispatcher } from './dispatcher.js';
|
|
4
5
|
import { JobRegistry } from './registry.js';
|
|
5
6
|
import { QueueManager } from './queue-manager.js';
|
|
@@ -9,6 +10,7 @@ export declare function createQueueStack(options: {
|
|
|
9
10
|
config: QueueConfig;
|
|
10
11
|
registry: JobRegistry;
|
|
11
12
|
database?: DatabaseManager;
|
|
13
|
+
redis?: RedisManager;
|
|
12
14
|
container?: Container;
|
|
13
15
|
}): {
|
|
14
16
|
manager: QueueManager;
|
|
@@ -17,6 +19,9 @@ export declare function createQueueStack(options: {
|
|
|
17
19
|
registry: JobRegistry;
|
|
18
20
|
};
|
|
19
21
|
export { DatabaseQueue } from './database-queue.js';
|
|
22
|
+
export { RedisQueue } from './redis-queue.js';
|
|
23
|
+
export { isWorkerQueue } from './worker-queue.js';
|
|
24
|
+
export type { WorkerQueue } from './worker-queue.js';
|
|
20
25
|
export { Dispatcher } from './dispatcher.js';
|
|
21
26
|
export { FailedJobRepository, formatJobException, newFailedJobUuid, } from './failed-job-repository.js';
|
|
22
27
|
export { Job } from './job.js';
|
|
@@ -26,6 +31,6 @@ export type { QueueContract } from './queue-contract.js';
|
|
|
26
31
|
export { QueueManager } from './queue-manager.js';
|
|
27
32
|
export { QueueProcessor } from './queue-processor.js';
|
|
28
33
|
export { SyncQueue } from './sync-queue.js';
|
|
29
|
-
export type { DatabaseQueueConnectionConfig, FailedJobRecord, FailedJobsConfig, QueueConfig, QueueConnectionConfig, QueueJobRecord, SerializedJobPayload, SyncQueueConnectionConfig, } from './types.js';
|
|
34
|
+
export type { DatabaseQueueConnectionConfig, FailedJobRecord, FailedJobsConfig, QueueConfig, QueueConnectionConfig, QueueJobRecord, SerializedJobPayload, RedisQueueConnectionConfig, SyncQueueConnectionConfig, } from './types.js';
|
|
30
35
|
export { QueueWorker } from './worker.js';
|
|
31
36
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,wBAAgB,gBAAgB,CAAC,OAAO,EAAE;IACxC,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,WAAW,CAAC;IACtB,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,GAAG;IACF,OAAO,EAAE,YAAY,CAAC;IACtB,UAAU,EAAE,UAAU,CAAC;IACvB,SAAS,EAAE,cAAc,CAAC;IAC1B,QAAQ,EAAE,WAAW,CAAC;CACvB,CAQA;AAED,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC1E,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EACV,6BAA6B,EAC7B,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,qBAAqB,EACrB,cAAc,EACd,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,wBAAgB,gBAAgB,CAAC,OAAO,EAAE;IACxC,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,WAAW,CAAC;IACtB,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,GAAG;IACF,OAAO,EAAE,YAAY,CAAC;IACtB,UAAU,EAAE,UAAU,CAAC;IACvB,SAAS,EAAE,cAAc,CAAC;IAC1B,QAAQ,EAAE,WAAW,CAAC;CACvB,CAQA;AAED,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC1E,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EACV,6BAA6B,EAC7B,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,qBAAqB,EACrB,cAAc,EACd,oBAAoB,EACpB,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -5,12 +5,14 @@ import { QueueWorker } from './worker.js';
|
|
|
5
5
|
export function createQueueStack(options) {
|
|
6
6
|
const registry = options.registry;
|
|
7
7
|
const worker = new QueueWorker(registry, options.container);
|
|
8
|
-
const manager = new QueueManager(options.config, worker, options.database);
|
|
8
|
+
const manager = new QueueManager(options.config, worker, options.database, options.redis);
|
|
9
9
|
const dispatcher = new Dispatcher(manager.connection());
|
|
10
10
|
const processor = new QueueProcessor(manager, registry, worker);
|
|
11
11
|
return { manager, dispatcher, processor, registry };
|
|
12
12
|
}
|
|
13
13
|
export { DatabaseQueue } from './database-queue.js';
|
|
14
|
+
export { RedisQueue } from './redis-queue.js';
|
|
15
|
+
export { isWorkerQueue } from './worker-queue.js';
|
|
14
16
|
export { Dispatcher } from './dispatcher.js';
|
|
15
17
|
export { FailedJobRepository, formatJobException, newFailedJobUuid, } from './failed-job-repository.js';
|
|
16
18
|
export { Job } from './job.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,UAAU,gBAAgB,CAAC,OAMhC;IAMC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAClC,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAC1F,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,IAAI,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAEhE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AACtD,CAAC;AAED,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE1E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAY5C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/queue-manager.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { DatabaseManager } from '@tyravel/database';
|
|
2
|
+
import type { RedisManager } from '@tyravel/redis';
|
|
2
3
|
import type { QueueContract } from './queue-contract.js';
|
|
3
4
|
import type { QueueConfig } from './types.js';
|
|
4
5
|
import { QueueWorker } from './worker.js';
|
|
@@ -6,8 +7,9 @@ export declare class QueueManager {
|
|
|
6
7
|
private readonly config;
|
|
7
8
|
private readonly worker;
|
|
8
9
|
private readonly database?;
|
|
10
|
+
private readonly redis?;
|
|
9
11
|
private readonly queues;
|
|
10
|
-
constructor(config: QueueConfig, worker: QueueWorker, database?: DatabaseManager | undefined);
|
|
12
|
+
constructor(config: QueueConfig, worker: QueueWorker, database?: DatabaseManager | undefined, redis?: RedisManager | undefined);
|
|
11
13
|
connection(name?: string): QueueContract;
|
|
12
14
|
getDefaultConnection(): string;
|
|
13
15
|
private createConnection;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue-manager.d.ts","sourceRoot":"","sources":["../src/queue-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"queue-manager.d.ts","sourceRoot":"","sources":["../src/queue-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,OAAO,KAAK,EAAE,WAAW,EAAyB,MAAM,YAAY,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,qBAAa,YAAY;IAIrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;IANzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;gBAGxC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,WAAW,EACnB,QAAQ,CAAC,EAAE,eAAe,YAAA,EAC1B,KAAK,CAAC,EAAE,YAAY,YAAA;IAGvC,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,aAAa;IAiBxC,oBAAoB,IAAI,MAAM;IAI9B,OAAO,CAAC,gBAAgB;CAqBzB"}
|
package/dist/queue-manager.js
CHANGED
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
import { DatabaseQueue } from './database-queue.js';
|
|
2
|
+
import { RedisQueue } from './redis-queue.js';
|
|
2
3
|
import { SyncQueue } from './sync-queue.js';
|
|
3
4
|
export class QueueManager {
|
|
4
5
|
config;
|
|
5
6
|
worker;
|
|
6
7
|
database;
|
|
8
|
+
redis;
|
|
7
9
|
queues = new Map();
|
|
8
|
-
constructor(config, worker, database) {
|
|
10
|
+
constructor(config, worker, database, redis) {
|
|
9
11
|
this.config = config;
|
|
10
12
|
this.worker = worker;
|
|
11
13
|
this.database = database;
|
|
14
|
+
this.redis = redis;
|
|
12
15
|
}
|
|
13
16
|
connection(name) {
|
|
14
17
|
const connectionName = name ?? this.config.default;
|
|
@@ -38,6 +41,12 @@ export class QueueManager {
|
|
|
38
41
|
const dbConnection = this.database.connection(config.connection);
|
|
39
42
|
return new DatabaseQueue(dbConnection, config);
|
|
40
43
|
}
|
|
44
|
+
case 'redis': {
|
|
45
|
+
if (!this.redis) {
|
|
46
|
+
throw new Error('Redis manager is required for the redis queue driver');
|
|
47
|
+
}
|
|
48
|
+
return new RedisQueue(this.redis, config);
|
|
49
|
+
}
|
|
41
50
|
default:
|
|
42
51
|
throw new Error(`Unsupported queue driver: ${config.driver}`);
|
|
43
52
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue-manager.js","sourceRoot":"","sources":["../src/queue-manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"queue-manager.js","sourceRoot":"","sources":["../src/queue-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C,MAAM,OAAO,YAAY;IAIJ;IACA;IACA;IACA;IANF,MAAM,GAAG,IAAI,GAAG,EAAyB,CAAC;IAE3D,YACmB,MAAmB,EACnB,MAAmB,EACnB,QAA0B,EAC1B,KAAoB;QAHpB,WAAM,GAAN,MAAM,CAAa;QACnB,WAAM,GAAN,MAAM,CAAa;QACnB,aAAQ,GAAR,QAAQ,CAAkB;QAC1B,UAAK,GAAL,KAAK,CAAe;IACpC,CAAC;IAEJ,UAAU,CAAC,IAAa;QACtB,MAAM,cAAc,GAAG,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACjD,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;QACjE,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,oCAAoC,cAAc,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;QACvC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,oBAAoB;QAClB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;IAC7B,CAAC;IAEO,gBAAgB,CAAC,MAA6B;QACpD,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;YACtB,KAAK,MAAM;gBACT,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpC,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACnB,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;gBAChF,CAAC;gBACD,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBACjE,OAAO,IAAI,aAAa,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;YACjD,CAAC;YACD,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;oBAChB,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;gBAC1E,CAAC;gBACD,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAC5C,CAAC;YACD;gBACE,MAAM,IAAI,KAAK,CAAC,6BAA8B,MAAgC,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;CACF"}
|
package/dist/queue-processor.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { isWorkerQueue } from './worker-queue.js';
|
|
2
2
|
import { formatJobException, newFailedJobUuid, } from './failed-job-repository.js';
|
|
3
3
|
export class QueueProcessor {
|
|
4
4
|
manager;
|
|
@@ -17,8 +17,8 @@ export class QueueProcessor {
|
|
|
17
17
|
const sleepSeconds = options.sleepSeconds ?? 1;
|
|
18
18
|
const maxJobs = options.maxJobs;
|
|
19
19
|
const connection = this.manager.connection(connectionName);
|
|
20
|
-
if (!(connection
|
|
21
|
-
throw new Error('Queue worker only supports
|
|
20
|
+
if (!isWorkerQueue(connection)) {
|
|
21
|
+
throw new Error('Queue worker only supports database and redis queue drivers');
|
|
22
22
|
}
|
|
23
23
|
let processed = 0;
|
|
24
24
|
while (maxJobs === undefined || processed < maxJobs) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue-processor.js","sourceRoot":"","sources":["../src/queue-processor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"queue-processor.js","sourceRoot":"","sources":["../src/queue-processor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { RedisManager } from '@tyravel/redis';
|
|
2
|
+
import type { Job } from './job.js';
|
|
3
|
+
import type { QueueContract } from './queue-contract.js';
|
|
4
|
+
import type { QueueJobRecord, RedisQueueConnectionConfig, SerializedJobPayload } from './types.js';
|
|
5
|
+
import type { WorkerQueue } from './worker-queue.js';
|
|
6
|
+
export declare class RedisQueue implements QueueContract, WorkerQueue {
|
|
7
|
+
private readonly redis;
|
|
8
|
+
private readonly redisConnection;
|
|
9
|
+
private readonly prefix;
|
|
10
|
+
private readonly retryAfter;
|
|
11
|
+
private readonly blockTimeout;
|
|
12
|
+
constructor(redis: RedisManager, config?: RedisQueueConnectionConfig);
|
|
13
|
+
push(job: Job, queue?: string): Promise<string>;
|
|
14
|
+
pushRaw(payload: SerializedJobPayload, queue?: string): Promise<string>;
|
|
15
|
+
later(delaySeconds: number, job: Job, queue?: string): Promise<string>;
|
|
16
|
+
pop(queue?: string): Promise<QueueJobRecord | null>;
|
|
17
|
+
deleteJob(id: number): Promise<void>;
|
|
18
|
+
release(id: number, delaySeconds?: number): Promise<void>;
|
|
19
|
+
decode(record: QueueJobRecord): SerializedJobPayload;
|
|
20
|
+
getRetryAfter(): number;
|
|
21
|
+
private client;
|
|
22
|
+
private createEnvelope;
|
|
23
|
+
private promoteDelayed;
|
|
24
|
+
private saveEnvelope;
|
|
25
|
+
private loadEnvelope;
|
|
26
|
+
private idsKey;
|
|
27
|
+
private jobKey;
|
|
28
|
+
private readyKey;
|
|
29
|
+
private delayedKey;
|
|
30
|
+
private reservedKey;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=redis-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-queue.d.ts","sourceRoot":"","sources":["../src/redis-queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAEpC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EACV,cAAc,EACd,0BAA0B,EAC1B,oBAAoB,EACrB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAYrD,qBAAa,UAAW,YAAW,aAAa,EAAE,WAAW;IAOzD,OAAO,CAAC,QAAQ,CAAC,KAAK;IANxB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAGnB,KAAK,EAAE,YAAY,EACpC,MAAM,GAAE,0BAAgD;IAQpD,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,SAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAIlD,OAAO,CAAC,OAAO,EAAE,oBAAoB,EAAE,KAAK,SAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAS1E,KAAK,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,SAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAazE,GAAG,CAAC,KAAK,SAAY,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IA2BtD,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAYpC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,SAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB1D,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,oBAAoB;IAIpD,aAAa,IAAI,MAAM;YAIT,MAAM;IAIpB,OAAO,CAAC,cAAc;YAaR,cAAc;YASd,YAAY;YAIZ,YAAY;IAQ1B,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,WAAW;CAGpB"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { decodePayload, encodePayload, serializeJob } from './payload.js';
|
|
2
|
+
export class RedisQueue {
|
|
3
|
+
redis;
|
|
4
|
+
redisConnection;
|
|
5
|
+
prefix;
|
|
6
|
+
retryAfter;
|
|
7
|
+
blockTimeout;
|
|
8
|
+
constructor(redis, config = { driver: 'redis' }) {
|
|
9
|
+
this.redis = redis;
|
|
10
|
+
this.redisConnection = config.connection ?? 'default';
|
|
11
|
+
this.prefix = config.prefix ?? 'tyravel:';
|
|
12
|
+
this.retryAfter = config.retryAfter ?? 90;
|
|
13
|
+
this.blockTimeout = config.blockTimeout ?? 1;
|
|
14
|
+
}
|
|
15
|
+
async push(job, queue = 'default') {
|
|
16
|
+
return this.pushRaw(serializeJob(job), queue);
|
|
17
|
+
}
|
|
18
|
+
async pushRaw(payload, queue = 'default') {
|
|
19
|
+
const client = await this.client();
|
|
20
|
+
const id = await client.incr(this.idsKey());
|
|
21
|
+
const envelope = this.createEnvelope(id, queue, encodePayload(payload));
|
|
22
|
+
await this.saveEnvelope(client, envelope);
|
|
23
|
+
await client.lPush(this.readyKey(queue), String(id));
|
|
24
|
+
return String(id);
|
|
25
|
+
}
|
|
26
|
+
async later(delaySeconds, job, queue = 'default') {
|
|
27
|
+
const client = await this.client();
|
|
28
|
+
const id = await client.incr(this.idsKey());
|
|
29
|
+
const envelope = this.createEnvelope(id, queue, encodePayload(serializeJob(job)));
|
|
30
|
+
envelope.availableAt = unixNow() + delaySeconds;
|
|
31
|
+
await this.saveEnvelope(client, envelope);
|
|
32
|
+
await client.zAdd(this.delayedKey(queue), {
|
|
33
|
+
score: envelope.availableAt,
|
|
34
|
+
value: String(id),
|
|
35
|
+
});
|
|
36
|
+
return String(id);
|
|
37
|
+
}
|
|
38
|
+
async pop(queue = 'default') {
|
|
39
|
+
const client = await this.client();
|
|
40
|
+
await this.promoteDelayed(client, queue);
|
|
41
|
+
const blocked = await client.brPop(this.readyKey(queue), this.blockTimeout);
|
|
42
|
+
const element = blocked?.element ?? (await client.rPop(this.readyKey(queue)));
|
|
43
|
+
if (!element) {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
const id = Number(element);
|
|
47
|
+
const envelope = await this.loadEnvelope(client, id);
|
|
48
|
+
if (!envelope) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
const now = unixNow();
|
|
52
|
+
envelope.reservedAt = now;
|
|
53
|
+
await this.saveEnvelope(client, envelope);
|
|
54
|
+
await client.zAdd(this.reservedKey(queue), {
|
|
55
|
+
score: now + this.retryAfter,
|
|
56
|
+
value: String(id),
|
|
57
|
+
});
|
|
58
|
+
return mapEnvelope(envelope);
|
|
59
|
+
}
|
|
60
|
+
async deleteJob(id) {
|
|
61
|
+
const client = await this.client();
|
|
62
|
+
const envelope = await this.loadEnvelope(client, id);
|
|
63
|
+
if (!envelope) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
await client.del(this.jobKey(id));
|
|
67
|
+
await client.zRem(this.reservedKey(envelope.queue), String(id));
|
|
68
|
+
await client.zRem(this.delayedKey(envelope.queue), String(id));
|
|
69
|
+
}
|
|
70
|
+
async release(id, delaySeconds = 0) {
|
|
71
|
+
const client = await this.client();
|
|
72
|
+
const envelope = await this.loadEnvelope(client, id);
|
|
73
|
+
if (!envelope) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
envelope.attempts += 1;
|
|
77
|
+
envelope.reservedAt = null;
|
|
78
|
+
envelope.availableAt = unixNow() + delaySeconds;
|
|
79
|
+
await this.saveEnvelope(client, envelope);
|
|
80
|
+
await client.zRem(this.reservedKey(envelope.queue), String(id));
|
|
81
|
+
await client.zAdd(this.delayedKey(envelope.queue), {
|
|
82
|
+
score: envelope.availableAt,
|
|
83
|
+
value: String(id),
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
decode(record) {
|
|
87
|
+
return decodePayload(record.payload);
|
|
88
|
+
}
|
|
89
|
+
getRetryAfter() {
|
|
90
|
+
return this.retryAfter;
|
|
91
|
+
}
|
|
92
|
+
async client() {
|
|
93
|
+
return this.redis.connection(this.redisConnection);
|
|
94
|
+
}
|
|
95
|
+
createEnvelope(id, queue, payload) {
|
|
96
|
+
const now = unixNow();
|
|
97
|
+
return {
|
|
98
|
+
id,
|
|
99
|
+
queue,
|
|
100
|
+
payload,
|
|
101
|
+
attempts: 0,
|
|
102
|
+
reservedAt: null,
|
|
103
|
+
availableAt: now,
|
|
104
|
+
createdAt: now,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
async promoteDelayed(client, queue) {
|
|
108
|
+
const now = unixNow();
|
|
109
|
+
const ids = await client.zRangeByScore(this.delayedKey(queue), 0, now);
|
|
110
|
+
for (const id of ids) {
|
|
111
|
+
await client.zRem(this.delayedKey(queue), id);
|
|
112
|
+
await client.lPush(this.readyKey(queue), id);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
async saveEnvelope(client, envelope) {
|
|
116
|
+
await client.set(this.jobKey(envelope.id), JSON.stringify(envelope));
|
|
117
|
+
}
|
|
118
|
+
async loadEnvelope(client, id) {
|
|
119
|
+
const raw = await client.get(this.jobKey(id));
|
|
120
|
+
if (!raw) {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
return JSON.parse(raw);
|
|
124
|
+
}
|
|
125
|
+
idsKey() {
|
|
126
|
+
return `${this.prefix}queue:ids`;
|
|
127
|
+
}
|
|
128
|
+
jobKey(id) {
|
|
129
|
+
return `${this.prefix}queue:job:${id}`;
|
|
130
|
+
}
|
|
131
|
+
readyKey(queue) {
|
|
132
|
+
return `${this.prefix}queue:${queue}:ready`;
|
|
133
|
+
}
|
|
134
|
+
delayedKey(queue) {
|
|
135
|
+
return `${this.prefix}queue:${queue}:delayed`;
|
|
136
|
+
}
|
|
137
|
+
reservedKey(queue) {
|
|
138
|
+
return `${this.prefix}queue:${queue}:reserved`;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
function unixNow() {
|
|
142
|
+
return Math.floor(Date.now() / 1000);
|
|
143
|
+
}
|
|
144
|
+
function mapEnvelope(envelope) {
|
|
145
|
+
return {
|
|
146
|
+
id: envelope.id,
|
|
147
|
+
queue: envelope.queue,
|
|
148
|
+
payload: envelope.payload,
|
|
149
|
+
attempts: envelope.attempts,
|
|
150
|
+
reservedAt: envelope.reservedAt,
|
|
151
|
+
availableAt: envelope.availableAt,
|
|
152
|
+
createdAt: envelope.createdAt,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=redis-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-queue.js","sourceRoot":"","sources":["../src/redis-queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-queue.test.d.ts","sourceRoot":"","sources":["../src/redis-queue.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { MemoryRedis } from '@tyravel/redis';
|
|
3
|
+
import { Job } from './job.js';
|
|
4
|
+
import { JobRegistry } from './registry.js';
|
|
5
|
+
import { QueueManager } from './queue-manager.js';
|
|
6
|
+
import { QueueProcessor } from './queue-processor.js';
|
|
7
|
+
import { RedisQueue } from './redis-queue.js';
|
|
8
|
+
import { QueueWorker } from './worker.js';
|
|
9
|
+
class PersistedJob extends Job {
|
|
10
|
+
static values = [];
|
|
11
|
+
async handle() {
|
|
12
|
+
PersistedJob.values.push(this.data.value);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function asRedisManager(client) {
|
|
16
|
+
return {
|
|
17
|
+
connection: async () => client,
|
|
18
|
+
prefixKey: (key) => key,
|
|
19
|
+
close: async () => { },
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
describe('RedisQueue', () => {
|
|
23
|
+
it('stores and processes jobs through the worker', async () => {
|
|
24
|
+
PersistedJob.values = [];
|
|
25
|
+
const redis = asRedisManager(new MemoryRedis());
|
|
26
|
+
const queue = new RedisQueue(redis, { driver: 'redis', blockTimeout: 0 });
|
|
27
|
+
await queue.push(new PersistedJob({ value: 'redis-job' }));
|
|
28
|
+
const record = await queue.pop('default');
|
|
29
|
+
expect(record).not.toBeNull();
|
|
30
|
+
const registry = new JobRegistry().register(PersistedJob);
|
|
31
|
+
const worker = new QueueWorker(registry);
|
|
32
|
+
await worker.process(queue.decode(record));
|
|
33
|
+
await queue.deleteJob(record.id);
|
|
34
|
+
expect(PersistedJob.values).toEqual(['redis-job']);
|
|
35
|
+
});
|
|
36
|
+
it('processes queued jobs via QueueProcessor', async () => {
|
|
37
|
+
PersistedJob.values = [];
|
|
38
|
+
const redis = asRedisManager(new MemoryRedis());
|
|
39
|
+
const registry = new JobRegistry().register(PersistedJob);
|
|
40
|
+
const worker = new QueueWorker(registry);
|
|
41
|
+
const config = {
|
|
42
|
+
default: 'redis',
|
|
43
|
+
connections: {
|
|
44
|
+
redis: { driver: 'redis', blockTimeout: 0 },
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
const manager = new QueueManager(config, worker, undefined, redis);
|
|
48
|
+
const queue = manager.connection('redis');
|
|
49
|
+
await queue.push(new PersistedJob({ value: 'queued-redis' }));
|
|
50
|
+
const processor = new QueueProcessor(manager, registry, worker);
|
|
51
|
+
const processed = await processor.run({
|
|
52
|
+
connection: 'redis',
|
|
53
|
+
maxJobs: 1,
|
|
54
|
+
sleepSeconds: 0,
|
|
55
|
+
});
|
|
56
|
+
expect(processed).toBe(1);
|
|
57
|
+
expect(PersistedJob.values).toEqual(['queued-redis']);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
//# sourceMappingURL=redis-queue.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-queue.test.js","sourceRoot":"","sources":["../src/redis-queue.test.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { FailedJobsConfig } from './failed-job-types.js';
|
|
2
|
-
export type QueueDriver = 'sync' | 'database';
|
|
2
|
+
export type QueueDriver = 'sync' | 'database' | 'redis';
|
|
3
3
|
export interface SyncQueueConnectionConfig {
|
|
4
4
|
driver: 'sync';
|
|
5
5
|
}
|
|
@@ -9,7 +9,14 @@ export interface DatabaseQueueConnectionConfig {
|
|
|
9
9
|
connection?: string;
|
|
10
10
|
retryAfter?: number;
|
|
11
11
|
}
|
|
12
|
-
export
|
|
12
|
+
export interface RedisQueueConnectionConfig {
|
|
13
|
+
driver: 'redis';
|
|
14
|
+
connection?: string;
|
|
15
|
+
prefix?: string;
|
|
16
|
+
retryAfter?: number;
|
|
17
|
+
blockTimeout?: number;
|
|
18
|
+
}
|
|
19
|
+
export type QueueConnectionConfig = SyncQueueConnectionConfig | DatabaseQueueConnectionConfig | RedisQueueConnectionConfig;
|
|
13
20
|
export interface QueueConfig {
|
|
14
21
|
default: string;
|
|
15
22
|
connections: Record<string, QueueConnectionConfig>;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC;AAExD,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,6BAA6B;IAC5C,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,qBAAqB,GAC7B,yBAAyB,GACzB,6BAA6B,GAC7B,0BAA0B,CAAC;AAE/B,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IACnD,MAAM,CAAC,EAAE,gBAAgB,CAAC;CAC3B;AAED,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAErG,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { QueueContract } from './queue-contract.js';
|
|
2
|
+
import type { QueueJobRecord, SerializedJobPayload } from './types.js';
|
|
3
|
+
export interface WorkerQueue extends QueueContract {
|
|
4
|
+
pop(queue?: string): Promise<QueueJobRecord | null>;
|
|
5
|
+
deleteJob(id: number): Promise<void>;
|
|
6
|
+
release(id: number, delaySeconds?: number): Promise<void>;
|
|
7
|
+
decode(record: QueueJobRecord): SerializedJobPayload;
|
|
8
|
+
getRetryAfter(): number;
|
|
9
|
+
}
|
|
10
|
+
export declare function isWorkerQueue(connection: QueueContract): connection is WorkerQueue;
|
|
11
|
+
//# sourceMappingURL=worker-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-queue.d.ts","sourceRoot":"","sources":["../src/worker-queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvE,MAAM,WAAW,WAAY,SAAQ,aAAa;IAChD,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACpD,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,oBAAoB,CAAC;IACrD,aAAa,IAAI,MAAM,CAAC;CACzB;AAED,wBAAgB,aAAa,CAAC,UAAU,EAAE,aAAa,GAAG,UAAU,IAAI,WAAW,CAOlF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-queue.js","sourceRoot":"","sources":["../src/worker-queue.ts"],"names":[],"mappings":"AAWA,MAAM,UAAU,aAAa,CAAC,UAAyB;IACrD,OAAO,CACL,KAAK,IAAI,UAAU;QACnB,OAAQ,UAA0B,CAAC,GAAG,KAAK,UAAU;QACrD,WAAW,IAAI,UAAU;QACzB,OAAQ,UAA0B,CAAC,SAAS,KAAK,UAAU,CAC5D,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tyravel/queue",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -15,8 +15,9 @@
|
|
|
15
15
|
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@tyravel/container": "0.1
|
|
19
|
-
"@tyravel/database": "0.1
|
|
18
|
+
"@tyravel/container": "0.2.1",
|
|
19
|
+
"@tyravel/database": "0.2.1",
|
|
20
|
+
"@tyravel/redis": "0.2.1"
|
|
20
21
|
},
|
|
21
22
|
"files": [
|
|
22
23
|
"dist"
|