@arikajs/queue 0.0.4 → 0.0.5

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/README.md CHANGED
@@ -37,29 +37,70 @@ pnpm add @arikajs/queue
37
37
 
38
38
  ```ts
39
39
  import { Queue } from '@arikajs/queue';
40
+ import { SendEmailJob } from './Jobs/SendEmailJob';
40
41
 
42
+ // Basic dispatch
41
43
  await Queue.dispatch(new SendEmailJob(user));
44
+
45
+ // Dispatch to specific connection & queue
46
+ await Queue.connection('redis')
47
+ .push(new SendEmailJob(user).onQueue('high'));
48
+
49
+ // Delayed dispatching (10 seconds)
50
+ await Queue.later(10, new SendEmailJob(user));
51
+
52
+ // Or using chaining on the job
53
+ await Queue.dispatch(
54
+ new SendEmailJob(user)
55
+ .onDelay(60)
56
+ .onQueue('emails')
57
+ );
42
58
  ```
43
59
 
44
60
  ### Defining a Job
45
61
 
62
+ Jobs should extend `BaseJob` to support method chaining.
63
+
46
64
  ```ts
47
- export class SendEmailJob {
65
+ import { BaseJob } from '@arikajs/queue';
66
+
67
+ export class SendEmailJob extends BaseJob {
68
+ constructor(public user: any) {
69
+ super();
70
+ }
71
+
48
72
  async handle() {
49
- // job logic
73
+ // job logic using this.user
50
74
  }
51
75
  }
52
76
  ```
53
77
 
54
78
  ---
55
79
 
80
+ ## 🏗 Running Workers
81
+
82
+ To start processing jobs, use the `queue:work` command:
83
+
84
+ ```bash
85
+ # Process default queue on default connection
86
+ arika queue:work
87
+
88
+ # Process specific connection and queue
89
+ arika queue:work --connection=redis --queue=high
90
+
91
+ # Control sleep time when no jobs are found
92
+ arika queue:work --sleep=5
93
+ ```
94
+
95
+ ---
96
+
56
97
  ## 🔁 Queue Drivers (v1)
57
98
 
58
99
  | Driver | Status | Description |
59
100
  | :--- | :--- | :--- |
60
101
  | **Sync** | ✅ Supported | Default synchronous driver for local dev |
61
102
  | **Database** | ✅ Supported | Stores jobs in your database |
62
- | **Redis** | Planned | Redis-based queue driver |
103
+ | **Redis** | Supported | Redis-based queue driver (High-performance) |
63
104
 
64
105
  ---
65
106
 
@@ -105,27 +146,26 @@ arika migrate
105
146
 
106
147
  ---
107
148
 
108
- ## 🧠 Architecture (High Level)
149
+ ## 🏗 Architecture
109
150
 
110
- ```
151
+ ```text
111
152
  queue/
112
153
  ├── src/
113
- │ ├── QueueManager.ts
154
+ │ ├── Drivers
155
+ │ │ ├── DatabaseDriver.ts
156
+ │ │ ├── RedisDriver.ts
157
+ │ │ └── SyncDriver.ts
158
+ │ ├── Contracts.ts
159
+ │ ├── index.ts
114
160
  │ ├── Job.ts
115
- │ ├── Worker.ts
116
- ├── Drivers/
117
- │ │ ├── SyncDriver.ts
118
- │ │ └── DatabaseDriver.ts
119
- │ └── index.ts
161
+ │ ├── QueueManager.ts
162
+ └── Worker.ts
120
163
  ├── tests/
121
164
  ├── package.json
122
165
  ├── tsconfig.json
123
- ├── README.md
124
- └── LICENSE
166
+ └── README.md
125
167
  ```
126
168
 
127
- ---
128
-
129
169
  ## 📄 License
130
170
 
131
171
  `@arikajs/queue` is open-source software licensed under the **MIT License**.
@@ -1,7 +1,18 @@
1
1
  export interface Job {
2
2
  handle(): Promise<void> | void;
3
+ connection?: string;
4
+ queue?: string;
5
+ delay?: number | Date;
6
+ tries?: number;
7
+ timeout?: number;
3
8
  }
4
9
  export interface QueueDriver {
5
- push(job: Job): Promise<void>;
10
+ push(job: Job, options?: {
11
+ queue?: string;
12
+ delay?: number | Date;
13
+ }): Promise<void>;
14
+ pop(queue?: string): Promise<any | null>;
15
+ acknowledge(jobData: any): Promise<void>;
16
+ fail(jobData: any, error: any): Promise<void>;
6
17
  }
7
18
  //# sourceMappingURL=Contracts.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Contracts.d.ts","sourceRoot":"","sources":["../src/Contracts.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,GAAG;IAChB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAGlC;AAED,MAAM,WAAW,WAAW;IACxB,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjC"}
1
+ {"version":3,"file":"Contracts.d.ts","sourceRoot":"","sources":["../src/Contracts.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,GAAG;IAChB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IACxB,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnF,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;IACzC,WAAW,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD"}
@@ -8,7 +8,13 @@ export declare class DatabaseDriver implements QueueDriver {
8
8
  private database;
9
9
  private config;
10
10
  constructor(database: any, config: DatabaseQueueConfig);
11
- push(job: Job): Promise<void>;
11
+ push(job: Job, options?: {
12
+ queue?: string;
13
+ delay?: number | Date;
14
+ }): Promise<void>;
15
+ pop(queue?: string): Promise<any | null>;
16
+ acknowledge(jobData: any): Promise<void>;
17
+ fail(jobData: any, error: any): Promise<void>;
12
18
  protected createPayload(job: Job): any;
13
19
  protected getJobData(job: any): any;
14
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DatabaseDriver.d.ts","sourceRoot":"","sources":["../../src/Drivers/DatabaseDriver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,WAAW,mBAAmB;IAChC,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,cAAe,YAAW,WAAW;IAE1C,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,MAAM;gBADN,QAAQ,EAAE,GAAG,EACb,MAAM,EAAE,mBAAmB;IAGjC,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAYnC,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG;IAQtC,SAAS,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG;CAQtC"}
1
+ {"version":3,"file":"DatabaseDriver.d.ts","sourceRoot":"","sources":["../../src/Drivers/DatabaseDriver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,MAAM,WAAW,mBAAmB;IAChC,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,cAAe,YAAW,WAAW;IAE1C,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,MAAM;gBADN,QAAQ,EAAE,GAAG,EACb,MAAM,EAAE,mBAAmB;IAGjC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBtF,GAAG,CAAC,KAAK,GAAE,MAAkB,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IA8BnD,WAAW,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAMxC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAenD,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG;IAQtC,SAAS,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG;CAWtC"}
@@ -6,15 +6,67 @@ class DatabaseDriver {
6
6
  this.database = database;
7
7
  this.config = config;
8
8
  }
9
- async push(job) {
9
+ async push(job, options = {}) {
10
10
  const payload = this.createPayload(job);
11
- await this.database.table(this.config.table).insert({
12
- queue: 'default',
11
+ const queue = options.queue || job.queue || 'default';
12
+ let availableAt = Math.floor(Date.now() / 1000);
13
+ if (options.delay) {
14
+ if (options.delay instanceof Date) {
15
+ availableAt = Math.floor(options.delay.getTime() / 1000);
16
+ }
17
+ else {
18
+ availableAt += options.delay;
19
+ }
20
+ }
21
+ await this.database.table(this.config.table, this.config.connection).insert({
22
+ queue: queue,
13
23
  payload: JSON.stringify(payload),
14
24
  attempts: 0,
15
- available_at: new Date(),
16
- created_at: new Date(),
25
+ available_at: availableAt,
26
+ created_at: Math.floor(Date.now() / 1000),
27
+ });
28
+ }
29
+ async pop(queue = 'default') {
30
+ const now = Math.floor(Date.now() / 1000);
31
+ // Find the next available job
32
+ const job = await this.database.table(this.config.table, this.config.connection)
33
+ .where('queue', queue)
34
+ .where('available_at', '<=', now)
35
+ .whereNull('reserved_at')
36
+ .orderBy('available_at', 'asc')
37
+ .first();
38
+ if (!job) {
39
+ return null;
40
+ }
41
+ // Reserve the job
42
+ await this.database.table(this.config.table, this.config.connection)
43
+ .where('id', job.id)
44
+ .update({
45
+ reserved_at: now,
46
+ attempts: job.attempts + 1
47
+ });
48
+ return {
49
+ id: job.id,
50
+ payload: JSON.parse(job.payload),
51
+ attempts: job.attempts + 1
52
+ };
53
+ }
54
+ async acknowledge(jobData) {
55
+ await this.database.table(this.config.table, this.config.connection)
56
+ .where('id', jobData.id)
57
+ .delete();
58
+ }
59
+ async fail(jobData, error) {
60
+ const failedTable = 'failed_jobs';
61
+ await this.database.table(failedTable, this.config.connection).insert({
62
+ uuid: Math.random().toString(36).substring(2),
63
+ connection: this.config.connection || 'default',
64
+ queue: jobData.queue || 'default',
65
+ payload: JSON.stringify(jobData.payload),
66
+ exception: error.stack || error.message,
67
+ failed_at: new Date()
17
68
  });
69
+ await this.acknowledge(jobData);
18
70
  }
19
71
  createPayload(job) {
20
72
  return {
@@ -27,7 +79,10 @@ class DatabaseDriver {
27
79
  // Simple serialization of job properties
28
80
  const data = {};
29
81
  for (const key of Object.keys(job)) {
30
- data[key] = job[key];
82
+ // Avoid serializing functions or complex objects
83
+ if (typeof job[key] !== 'function') {
84
+ data[key] = job[key];
85
+ }
31
86
  }
32
87
  return data;
33
88
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DatabaseDriver.js","sourceRoot":"","sources":["../../src/Drivers/DatabaseDriver.ts"],"names":[],"mappings":";;;AASA,MAAa,cAAc;IACvB,YACY,QAAa,EACb,MAA2B;QAD3B,aAAQ,GAAR,QAAQ,CAAK;QACb,WAAM,GAAN,MAAM,CAAqB;IACnC,CAAC;IAEL,KAAK,CAAC,IAAI,CAAC,GAAQ;QACf,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;QAExC,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;YAChD,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YAChC,QAAQ,EAAE,CAAC;YACX,YAAY,EAAE,IAAI,IAAI,EAAE;YACxB,UAAU,EAAE,IAAI,IAAI,EAAE;SACzB,CAAC,CAAC;IACP,CAAC;IAES,aAAa,CAAC,GAAQ;QAC5B,OAAO;YACH,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC,IAAI;YACjC,GAAG,EAAE,GAAG,CAAC,WAAW,CAAC,IAAI;YACzB,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;SAC7B,CAAC;IACN,CAAC;IAES,UAAU,CAAC,GAAQ;QACzB,yCAAyC;QACzC,MAAM,IAAI,GAAQ,EAAE,CAAC;QACrB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AAlCD,wCAkCC"}
1
+ {"version":3,"file":"DatabaseDriver.js","sourceRoot":"","sources":["../../src/Drivers/DatabaseDriver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { Job, QueueDriver } from '../Contracts';
2
+ import { Redis, RedisOptions } from 'ioredis';
3
+ export interface RedisQueueConfig {
4
+ driver: 'redis';
5
+ connection?: string;
6
+ queue?: string;
7
+ redisConfig?: string | RedisOptions;
8
+ client?: Redis;
9
+ }
10
+ export declare class RedisDriver implements QueueDriver {
11
+ protected config: RedisQueueConfig;
12
+ protected redis: Redis;
13
+ protected queueName: string;
14
+ constructor(config: RedisQueueConfig);
15
+ push(job: Job, options?: {
16
+ queue?: string;
17
+ delay?: number | Date;
18
+ }): Promise<void>;
19
+ protected createPayload(job: Job): any;
20
+ protected getJobData(job: any): any;
21
+ protected generateJobId(): string;
22
+ pop(queue?: string): Promise<any>;
23
+ protected migrateDelayedJobs(queue: string): Promise<void>;
24
+ acknowledge(jobData: any): Promise<void>;
25
+ fail(jobData: any, error: any): Promise<void>;
26
+ flush(): Promise<void>;
27
+ close(): Promise<void>;
28
+ }
29
+ //# sourceMappingURL=RedisDriver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RedisDriver.d.ts","sourceRoot":"","sources":["../../src/Drivers/RedisDriver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE9C,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC;IACpC,MAAM,CAAC,EAAE,KAAK,CAAC;CAClB;AAED,qBAAa,WAAY,YAAW,WAAW;IAI/B,SAAS,CAAC,MAAM,EAAE,gBAAgB;IAH9C,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC;IACvB,SAAS,CAAC,SAAS,EAAE,MAAM,CAAC;gBAEN,MAAM,EAAE,gBAAgB;IAcxC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB5F,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG;IAWtC,SAAS,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG;IAQnC,SAAS,CAAC,aAAa,IAAI,MAAM;IAK3B,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;cASvB,kBAAkB,CAAC,KAAK,EAAE,MAAM;IAa1C,WAAW,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAU7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RedisDriver = void 0;
4
+ const ioredis_1 = require("ioredis");
5
+ class RedisDriver {
6
+ constructor(config) {
7
+ this.config = config;
8
+ this.queueName = config.queue || 'default';
9
+ if (config.client) {
10
+ this.redis = config.client;
11
+ }
12
+ else if (typeof config.redisConfig === 'string') {
13
+ this.redis = new ioredis_1.Redis(config.redisConfig);
14
+ }
15
+ else if (typeof config.redisConfig === 'object') {
16
+ this.redis = new ioredis_1.Redis(config.redisConfig);
17
+ }
18
+ else {
19
+ this.redis = new ioredis_1.Redis(); // defaults to localhost:6379
20
+ }
21
+ }
22
+ async push(job, options = {}) {
23
+ const payload = this.createPayload(job);
24
+ const queue = options.queue || job.queue || this.queueName;
25
+ const json = JSON.stringify(payload);
26
+ if (options.delay) {
27
+ let availableAt = Math.floor(Date.now() / 1000);
28
+ if (options.delay instanceof Date) {
29
+ availableAt = Math.floor(options.delay.getTime() / 1000);
30
+ }
31
+ else {
32
+ availableAt += options.delay;
33
+ }
34
+ await this.redis.zadd(`queues:${queue}:delayed`, availableAt, json);
35
+ }
36
+ else {
37
+ await this.redis.rpush(`queues:${queue}`, json);
38
+ }
39
+ }
40
+ createPayload(job) {
41
+ return {
42
+ displayName: job.constructor.name,
43
+ job: job.constructor.name,
44
+ data: this.getJobData(job),
45
+ id: this.generateJobId(),
46
+ attempts: 0,
47
+ createdAt: new Date().toISOString()
48
+ };
49
+ }
50
+ getJobData(job) {
51
+ const data = {};
52
+ for (const key of Object.keys(job)) {
53
+ data[key] = job[key];
54
+ }
55
+ return data;
56
+ }
57
+ generateJobId() {
58
+ return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);
59
+ }
60
+ // Helper method useful for fetching jobs if Worker implements polling later
61
+ async pop(queue) {
62
+ const queueName = queue || this.queueName;
63
+ // First try to move delayed jobs that are now available
64
+ await this.migrateDelayedJobs(queueName);
65
+ const result = await this.redis.lpop(`queues:${queueName}`);
66
+ return result ? JSON.parse(result) : null;
67
+ }
68
+ async migrateDelayedJobs(queue) {
69
+ const now = Math.floor(Date.now() / 1000);
70
+ const delayedKey = `queues:${queue}:delayed`;
71
+ const jobs = await this.redis.zrangebyscore(delayedKey, 0, now);
72
+ if (jobs.length > 0) {
73
+ await this.redis.zremrangebyscore(delayedKey, 0, now);
74
+ for (const job of jobs) {
75
+ await this.redis.rpush(`queues:${queue}`, job);
76
+ }
77
+ }
78
+ }
79
+ async acknowledge(jobData) {
80
+ // Redis lpop already removed the job, but we could implement ack for RPOPPLPUSH if needed
81
+ }
82
+ async fail(jobData, error) {
83
+ const failedKey = `queues:failed`;
84
+ await this.redis.rpush(failedKey, JSON.stringify({
85
+ ...jobData,
86
+ exception: error.stack || error.message,
87
+ failedAt: new Date().toISOString()
88
+ }));
89
+ }
90
+ // Helper method to clear for tests
91
+ async flush() {
92
+ await this.redis.del(`queues:${this.queueName}`);
93
+ }
94
+ async close() {
95
+ await this.redis.quit();
96
+ }
97
+ }
98
+ exports.RedisDriver = RedisDriver;
99
+ //# sourceMappingURL=RedisDriver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RedisDriver.js","sourceRoot":"","sources":["../../src/Drivers/RedisDriver.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,11 @@
1
1
  import { Job, QueueDriver } from '../Contracts';
2
2
  export declare class SyncDriver implements QueueDriver {
3
- push(job: Job): Promise<void>;
3
+ push(job: Job, options?: {
4
+ queue?: string;
5
+ delay?: number | Date;
6
+ }): Promise<void>;
7
+ pop(queue?: string): Promise<any | null>;
8
+ acknowledge(jobData: any): Promise<void>;
9
+ fail(jobData: any, error: any): Promise<void>;
4
10
  }
5
11
  //# sourceMappingURL=SyncDriver.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SyncDriver.d.ts","sourceRoot":"","sources":["../../src/Drivers/SyncDriver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,qBAAa,UAAW,YAAW,WAAW;IACpC,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;CAStC"}
1
+ {"version":3,"file":"SyncDriver.d.ts","sourceRoot":"","sources":["../../src/Drivers/SyncDriver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,qBAAa,UAAW,YAAW,WAAW;IACpC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAUlF,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;IAIxC,WAAW,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;CAItD"}
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SyncDriver = void 0;
4
4
  class SyncDriver {
5
- async push(job) {
5
+ async push(job, options) {
6
6
  // Sync driver executes immediately
7
7
  try {
8
8
  await job.handle();
@@ -12,6 +12,16 @@ class SyncDriver {
12
12
  throw error; // Or handle failure policy
13
13
  }
14
14
  }
15
+ async pop(queue) {
16
+ return null; // Sync doesn't support popping as it's immediate
17
+ }
18
+ async acknowledge(jobData) {
19
+ // Nothing to do for sync
20
+ }
21
+ async fail(jobData, error) {
22
+ // Log and throw for sync
23
+ console.error('Sync job failed:', error);
24
+ }
15
25
  }
16
26
  exports.SyncDriver = SyncDriver;
17
27
  //# sourceMappingURL=SyncDriver.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SyncDriver.js","sourceRoot":"","sources":["../../src/Drivers/SyncDriver.ts"],"names":[],"mappings":";;;AAGA,MAAa,UAAU;IACnB,KAAK,CAAC,IAAI,CAAC,GAAQ;QACf,mCAAmC;QACnC,IAAI,CAAC;YACD,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;YACpC,MAAM,KAAK,CAAC,CAAC,2BAA2B;QAC5C,CAAC;IACL,CAAC;CACJ;AAVD,gCAUC"}
1
+ {"version":3,"file":"SyncDriver.js","sourceRoot":"","sources":["../../src/Drivers/SyncDriver.ts"],"names":[],"mappings":";;;AAGA,MAAa,UAAU;IACnB,KAAK,CAAC,IAAI,CAAC,GAAQ,EAAE,OAAmD;QACpE,mCAAmC;QACnC,IAAI,CAAC;YACD,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;QACvB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;YACpC,MAAM,KAAK,CAAC,CAAC,2BAA2B;QAC5C,CAAC;IACL,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,KAAc;QACpB,OAAO,IAAI,CAAC,CAAC,iDAAiD;IAClE,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,OAAY;QAC1B,yBAAyB;IAC7B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAY,EAAE,KAAU;QAC/B,yBAAyB;QACzB,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;IAC7C,CAAC;CACJ;AAvBD,gCAuBC"}
package/dist/Job.d.ts CHANGED
@@ -1,5 +1,13 @@
1
1
  import { Job } from './Contracts';
2
2
  export declare abstract class BaseJob implements Job {
3
+ connection?: string;
4
+ queue?: string;
5
+ delay?: number | Date;
6
+ tries?: number;
7
+ timeout?: number;
3
8
  abstract handle(): Promise<void> | void;
9
+ onConnection(connection: string): this;
10
+ onQueue(queue: string): this;
11
+ onDelay(delay: number | Date): this;
4
12
  }
5
13
  //# sourceMappingURL=Job.d.ts.map
package/dist/Job.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Job.d.ts","sourceRoot":"","sources":["../src/Job.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAGlC,8BAAsB,OAAQ,YAAW,GAAG;IACxC,QAAQ,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;CAC1C"}
1
+ {"version":3,"file":"Job.d.ts","sourceRoot":"","sources":["../src/Job.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAGlC,8BAAsB,OAAQ,YAAW,GAAG;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IAExB,QAAQ,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAEhC,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAKtC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK5B,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;CAI7C"}
package/dist/Job.js CHANGED
@@ -3,6 +3,18 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BaseJob = void 0;
4
4
  // Base class for Jobs if users prefer inheritance
5
5
  class BaseJob {
6
+ onConnection(connection) {
7
+ this.connection = connection;
8
+ return this;
9
+ }
10
+ onQueue(queue) {
11
+ this.queue = queue;
12
+ return this;
13
+ }
14
+ onDelay(delay) {
15
+ this.delay = delay;
16
+ return this;
17
+ }
6
18
  }
7
19
  exports.BaseJob = BaseJob;
8
20
  //# sourceMappingURL=Job.js.map
package/dist/Job.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Job.js","sourceRoot":"","sources":["../src/Job.ts"],"names":[],"mappings":";;;AAGA,kDAAkD;AAClD,MAAsB,OAAO;CAE5B;AAFD,0BAEC"}
1
+ {"version":3,"file":"Job.js","sourceRoot":"","sources":["../src/Job.ts"],"names":[],"mappings":";;;AAGA,kDAAkD;AAClD,MAAsB,OAAO;IASlB,YAAY,CAAC,UAAkB;QAClC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,OAAO,CAAC,KAAa;QACxB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,OAAO,IAAI,CAAC;IAChB,CAAC;IAEM,OAAO,CAAC,KAAoB;QAC/B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AAvBD,0BAuBC"}
@@ -6,6 +6,12 @@ export declare class QueueManager {
6
6
  constructor(config: any, database?: any);
7
7
  driver(name?: string): QueueDriver;
8
8
  protected resolve(name: string): QueueDriver;
9
+ push(job: Job, options?: {
10
+ queue?: string;
11
+ delay?: number | Date;
12
+ }, connection?: string): Promise<void>;
13
+ later(delay: number | Date, job: Job, queue?: string, connection?: string): Promise<void>;
9
14
  dispatch(job: Job, connection?: string): Promise<void>;
15
+ bulk(jobs: Job[], connection?: string): Promise<void[]>;
10
16
  }
11
17
  //# sourceMappingURL=QueueManager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"QueueManager.d.ts","sourceRoot":"","sources":["../src/QueueManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI/C,qBAAa,YAAY;IACrB,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,QAAQ,CAAM;gBAEV,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,GAAG;IAKhC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW;IAUzC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW;IAiB/B,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,UAAU,CAAC,EAAE,MAAM;CAGtD"}
1
+ {"version":3,"file":"QueueManager.d.ts","sourceRoot":"","sources":["../src/QueueManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAK/C,qBAAa,YAAY;IACrB,OAAO,CAAC,OAAO,CAAuC;IACtD,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,QAAQ,CAAM;gBAEV,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,GAAG;IAKhC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW;IAUzC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW;IAmB/B,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,EAAE,UAAU,CAAC,EAAE,MAAM;IAIvF,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;IAIzE,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,UAAU,CAAC,EAAE,MAAM;IAOtC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,UAAU,CAAC,EAAE,MAAM;CAGrD"}
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.QueueManager = void 0;
4
4
  const SyncDriver_1 = require("./Drivers/SyncDriver");
5
5
  const DatabaseDriver_1 = require("./Drivers/DatabaseDriver");
6
+ const RedisDriver_1 = require("./Drivers/RedisDriver");
6
7
  class QueueManager {
7
8
  constructor(config, database) {
8
9
  this.drivers = new Map();
@@ -25,13 +26,27 @@ class QueueManager {
25
26
  case 'sync':
26
27
  return new SyncDriver_1.SyncDriver();
27
28
  case 'database':
28
- return new DatabaseDriver_1.DatabaseDriver(this.database.connection(config.connection), config);
29
+ return new DatabaseDriver_1.DatabaseDriver(this.database, config);
30
+ case 'redis':
31
+ return new RedisDriver_1.RedisDriver(config);
29
32
  default:
30
33
  throw new Error(`Unsupported queue driver [${config.driver}].`);
31
34
  }
32
35
  }
36
+ async push(job, options, connection) {
37
+ return this.driver(connection || job.connection).push(job, options);
38
+ }
39
+ async later(delay, job, queue, connection) {
40
+ return this.push(job, { delay, queue }, connection);
41
+ }
33
42
  async dispatch(job, connection) {
34
- return this.driver(connection).push(job);
43
+ return this.push(job, {
44
+ queue: job.queue,
45
+ delay: job.delay
46
+ }, connection || job.connection);
47
+ }
48
+ async bulk(jobs, connection) {
49
+ return Promise.all(jobs.map(job => this.dispatch(job, connection)));
35
50
  }
36
51
  }
37
52
  exports.QueueManager = QueueManager;
@@ -1 +1 @@
1
- {"version":3,"file":"QueueManager.js","sourceRoot":"","sources":["../src/QueueManager.ts"],"names":[],"mappings":";;;AAEA,qDAAkD;AAClD,6DAA0D;AAE1D,MAAa,YAAY;IAKrB,YAAY,MAAW,EAAE,QAAc;QAJ/B,YAAO,GAA6B,IAAI,GAAG,EAAE,CAAC;QAKlD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;IAEM,MAAM,CAAC,IAAa;QACvB,MAAM,UAAU,GAAG,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QAE/C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QAC3D,CAAC;QAED,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC;IACzC,CAAC;IAES,OAAO,CAAC,IAAY;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAE7C,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,mBAAmB,CAAC,CAAC;QAClE,CAAC;QAED,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;YACpB,KAAK,MAAM;gBACP,OAAO,IAAI,uBAAU,EAAE,CAAC;YAC5B,KAAK,UAAU;gBACX,OAAO,IAAI,+BAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,CAAC;YACnF;gBACI,MAAM,IAAI,KAAK,CAAC,6BAA6B,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;QACxE,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,GAAQ,EAAE,UAAmB;QAC/C,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC;CACJ;AAxCD,oCAwCC"}
1
+ {"version":3,"file":"QueueManager.js","sourceRoot":"","sources":["../src/QueueManager.ts"],"names":[],"mappings":";;;AAEA,qDAAkD;AAClD,6DAA0D;AAC1D,uDAAoD;AAEpD,MAAa,YAAY;IAKrB,YAAY,MAAW,EAAE,QAAc;QAJ/B,YAAO,GAA6B,IAAI,GAAG,EAAE,CAAC;QAKlD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;IAEM,MAAM,CAAC,IAAa;QACvB,MAAM,UAAU,GAAG,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QAE/C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QAC3D,CAAC;QAED,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC;IACzC,CAAC;IAES,OAAO,CAAC,IAAY;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAE7C,IAAI,CAAC,MAAM,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,mBAAmB,CAAC,CAAC;QAClE,CAAC;QAED,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;YACpB,KAAK,MAAM;gBACP,OAAO,IAAI,uBAAU,EAAE,CAAC;YAC5B,KAAK,UAAU;gBACX,OAAO,IAAI,+BAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YACrD,KAAK,OAAO;gBACR,OAAO,IAAI,yBAAW,CAAC,MAAM,CAAC,CAAC;YACnC;gBACI,MAAM,IAAI,KAAK,CAAC,6BAA6B,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;QACxE,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,GAAQ,EAAE,OAAmD,EAAE,UAAmB;QAChG,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACxE,CAAC;IAEM,KAAK,CAAC,KAAK,CAAC,KAAoB,EAAE,GAAQ,EAAE,KAAc,EAAE,UAAmB;QAClF,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,UAAU,CAAC,CAAC;IACxD,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,GAAQ,EAAE,UAAmB;QAC/C,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YAClB,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,KAAK,EAAE,GAAG,CAAC,KAAK;SACnB,EAAE,UAAU,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,IAAW,EAAE,UAAmB;QAC9C,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IACxE,CAAC;CACJ;AAzDD,oCAyDC"}
package/dist/Worker.d.ts CHANGED
@@ -1,7 +1,15 @@
1
- import { Job } from './Contracts';
2
1
  export declare class Worker {
3
2
  private driver;
4
- constructor(driver: any);
5
- process(job: Job): Promise<void>;
3
+ private options;
4
+ private static jobClasses;
5
+ private isRunning;
6
+ constructor(driver: any, options?: {
7
+ queue?: string;
8
+ sleep?: number;
9
+ });
10
+ static registerJob(name: string, jobClass: any): void;
11
+ run(): Promise<void>;
12
+ stop(): void;
13
+ process(jobData: any): Promise<void>;
6
14
  }
7
15
  //# sourceMappingURL=Worker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Worker.d.ts","sourceRoot":"","sources":["../src/Worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,qBAAa,MAAM;IACH,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,GAAG;IAIzB,OAAO,CAAC,GAAG,EAAE,GAAG;CAOzB"}
1
+ {"version":3,"file":"Worker.d.ts","sourceRoot":"","sources":["../src/Worker.ts"],"names":[],"mappings":"AAEA,qBAAa,MAAM;IAIH,OAAO,CAAC,MAAM;IAAO,OAAO,CAAC,OAAO;IAHhD,OAAO,CAAC,MAAM,CAAC,UAAU,CAA+B;IACxD,OAAO,CAAC,SAAS,CAAiB;gBAEd,MAAM,EAAE,GAAG,EAAU,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO;WAE3E,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG;IAIxC,GAAG;IA4BT,IAAI;IAIL,OAAO,CAAC,OAAO,EAAE,GAAG;CAgB7B"}
package/dist/Worker.js CHANGED
@@ -2,18 +2,56 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Worker = void 0;
4
4
  class Worker {
5
- constructor(driver) {
5
+ constructor(driver, options = {}) {
6
6
  this.driver = driver;
7
- // In future: Worker will pull from driver
7
+ this.options = options;
8
+ this.isRunning = true;
8
9
  }
9
- async process(job) {
10
- try {
11
- await job.handle();
10
+ static registerJob(name, jobClass) {
11
+ this.jobClasses.set(name, jobClass);
12
+ }
13
+ async run() {
14
+ while (this.isRunning) {
15
+ const jobData = await this.driver.pop(this.options.queue || 'default');
16
+ if (jobData) {
17
+ const startTime = Date.now();
18
+ const jobName = jobData.payload.job;
19
+ const dateString = new Date().toISOString().replace(/T/, ' ').replace(/\..+/, '');
20
+ console.log(`[\x1b[90m${dateString}\x1b[0m] \x1b[33mProcessing:\x1b[0m ${jobName}`);
21
+ try {
22
+ await this.process(jobData);
23
+ await this.driver.acknowledge(jobData);
24
+ const duration = ((Date.now() - startTime) / 1000).toFixed(2);
25
+ console.log(`[\x1b[90m${dateString}\x1b[0m] \x1b[32mProcessed:\x1b[0m ${jobName} (${duration}s)`);
26
+ }
27
+ catch (error) {
28
+ await this.driver.fail(jobData, error);
29
+ console.log(`[\x1b[90m${dateString}\x1b[0m] \x1b[31mFailed:\x1b[0m ${jobName}`);
30
+ console.error(`\x1b[31mError: ${error.message}\x1b[0m`);
31
+ }
32
+ }
33
+ else {
34
+ await new Promise(resolve => setTimeout(resolve, (this.options.sleep || 3) * 1000));
35
+ }
36
+ }
37
+ }
38
+ stop() {
39
+ this.isRunning = false;
40
+ }
41
+ async process(jobData) {
42
+ const jobName = jobData.payload.job;
43
+ const JobClass = Worker.jobClasses.get(jobName);
44
+ if (!JobClass) {
45
+ throw new Error(`Job class [${jobName}] not registered with Worker.`);
12
46
  }
13
- catch (e) {
14
- throw e;
47
+ const job = new JobClass();
48
+ // Fill job properties from data
49
+ if (jobData.payload.data) {
50
+ Object.assign(job, jobData.payload.data);
15
51
  }
52
+ await job.handle();
16
53
  }
17
54
  }
18
55
  exports.Worker = Worker;
56
+ Worker.jobClasses = new Map();
19
57
  //# sourceMappingURL=Worker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Worker.js","sourceRoot":"","sources":["../src/Worker.ts"],"names":[],"mappings":";;;AAEA,MAAa,MAAM;IACf,YAAoB,MAAW;QAAX,WAAM,GAAN,MAAM,CAAK;QAC3B,0CAA0C;IAC9C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAQ;QAClB,IAAI,CAAC;YACD,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;QACvB,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YACd,MAAM,CAAC,CAAC;QACZ,CAAC;IACL,CAAC;CACJ;AAZD,wBAYC"}
1
+ {"version":3,"file":"Worker.js","sourceRoot":"","sources":["../src/Worker.ts"],"names":[],"mappings":";;;AAEA,MAAa,MAAM;IAIf,YAAoB,MAAW,EAAU,UAA8C,EAAE;QAArE,WAAM,GAAN,MAAM,CAAK;QAAU,YAAO,GAAP,OAAO,CAAyC;QAFjF,cAAS,GAAY,IAAI,CAAC;IAE2D,CAAC;IAEvF,MAAM,CAAC,WAAW,CAAC,IAAY,EAAE,QAAa;QACjD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC;IAEM,KAAK,CAAC,GAAG;QACZ,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC;YAEvE,IAAI,OAAO,EAAE,CAAC;gBACV,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC;gBACpC,MAAM,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBAElF,OAAO,CAAC,GAAG,CAAC,YAAY,UAAU,uCAAuC,OAAO,EAAE,CAAC,CAAC;gBAEpF,IAAI,CAAC;oBACD,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBAC5B,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;oBAEvC,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;oBAC9D,OAAO,CAAC,GAAG,CAAC,YAAY,UAAU,uCAAuC,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC;gBACvG,CAAC;gBAAC,OAAO,KAAU,EAAE,CAAC;oBAClB,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;oBACvC,OAAO,CAAC,GAAG,CAAC,YAAY,UAAU,uCAAuC,OAAO,EAAE,CAAC,CAAC;oBACpF,OAAO,CAAC,KAAK,CAAC,kBAAkB,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC;gBAC5D,CAAC;YACL,CAAC;iBAAM,CAAC;gBACJ,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YACxF,CAAC;QACL,CAAC;IACL,CAAC;IAEM,IAAI;QACP,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAAY;QACtB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC;QACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAEhD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,cAAc,OAAO,+BAA+B,CAAC,CAAC;QAC1E,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,gCAAgC;QAChC,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACvB,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;IACvB,CAAC;;AAzDL,wBA0DC;AAzDkB,iBAAU,GAAqB,IAAI,GAAG,EAAE,AAA9B,CAA+B"}
package/dist/index.d.ts CHANGED
@@ -1,10 +1,19 @@
1
1
  import { QueueManager } from './QueueManager';
2
2
  import { Job } from './Contracts';
3
+ import { Worker } from './Worker';
3
4
  export declare let queueManager: QueueManager;
4
5
  export declare class Queue {
5
6
  static setManager(manager: QueueManager): void;
7
+ static connection(name: string): {
8
+ push: (job: Job) => Promise<void>;
9
+ later: (delay: number | Date, job: Job) => Promise<void>;
10
+ };
6
11
  static dispatch(job: Job): Promise<void>;
12
+ static push(job: Job): Promise<void>;
13
+ static later(delay: number | Date, job: Job): Promise<void>;
14
+ static bulk(jobs: Job[]): Promise<void[]>;
7
15
  }
8
- export { QueueManager, Job };
16
+ export { QueueManager, Job, Worker };
9
17
  export { BaseJob } from './Job';
18
+ export { RedisDriver } from './Drivers/RedisDriver';
10
19
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAGlC,eAAO,IAAI,YAAY,EAAE,YAAY,CAAC;AAEtC,qBAAa,KAAK;IACd,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY;WAI1B,QAAQ,CAAC,GAAG,EAAE,GAAG;CAMjC;AAED,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,eAAO,IAAI,YAAY,EAAE,YAAY,CAAC;AAEtC,qBAAa,KAAK;IACd,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY;IAIvC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM;oBAEV,GAAG;uBACA,MAAM,GAAG,IAAI,OAAO,GAAG;;WAIjC,QAAQ,CAAC,GAAG,EAAE,GAAG;WAOjB,IAAI,CAAC,GAAG,EAAE,GAAG;WAIb,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG;WAIpC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE;CAGhC;AAED,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC"}
package/dist/index.js CHANGED
@@ -1,20 +1,39 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.BaseJob = exports.QueueManager = exports.Queue = exports.queueManager = void 0;
3
+ exports.RedisDriver = exports.BaseJob = exports.Worker = exports.QueueManager = exports.Queue = exports.queueManager = void 0;
4
4
  const QueueManager_1 = require("./QueueManager");
5
5
  Object.defineProperty(exports, "QueueManager", { enumerable: true, get: function () { return QueueManager_1.QueueManager; } });
6
+ const Worker_1 = require("./Worker");
7
+ Object.defineProperty(exports, "Worker", { enumerable: true, get: function () { return Worker_1.Worker; } });
6
8
  class Queue {
7
9
  static setManager(manager) {
8
10
  exports.queueManager = manager;
9
11
  }
12
+ static connection(name) {
13
+ return {
14
+ push: (job) => exports.queueManager.push(job, {}, name),
15
+ later: (delay, job) => exports.queueManager.later(delay, job, undefined, name),
16
+ };
17
+ }
10
18
  static async dispatch(job) {
11
19
  if (!exports.queueManager) {
12
20
  throw new Error('Queue not configured. Please use Queue.setManager().');
13
21
  }
14
22
  return exports.queueManager.dispatch(job);
15
23
  }
24
+ static async push(job) {
25
+ return exports.queueManager.push(job);
26
+ }
27
+ static async later(delay, job) {
28
+ return exports.queueManager.later(delay, job);
29
+ }
30
+ static async bulk(jobs) {
31
+ return exports.queueManager.bulk(jobs);
32
+ }
16
33
  }
17
34
  exports.Queue = Queue;
18
35
  var Job_1 = require("./Job");
19
36
  Object.defineProperty(exports, "BaseJob", { enumerable: true, get: function () { return Job_1.BaseJob; } });
37
+ var RedisDriver_1 = require("./Drivers/RedisDriver");
38
+ Object.defineProperty(exports, "RedisDriver", { enumerable: true, get: function () { return RedisDriver_1.RedisDriver; } });
20
39
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,iDAA8C;AAmBrC,6FAnBA,2BAAY,OAmBA;AAbrB,MAAa,KAAK;IACd,MAAM,CAAC,UAAU,CAAC,OAAqB;QACnC,oBAAY,GAAG,OAAO,CAAC;IAC3B,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAQ;QAC1B,IAAI,CAAC,oBAAY,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO,oBAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;CACJ;AAXD,sBAWC;AAGD,6BAAgC;AAAvB,8FAAA,OAAO,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,iDAA8C;AAsCrC,6FAtCA,2BAAY,OAsCA;AApCrB,qCAAkC;AAoCN,uFApCnB,eAAM,OAoCmB;AAhClC,MAAa,KAAK;IACd,MAAM,CAAC,UAAU,CAAC,OAAqB;QACnC,oBAAY,GAAG,OAAO,CAAC;IAC3B,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,IAAY;QAC1B,OAAO;YACH,IAAI,EAAE,CAAC,GAAQ,EAAE,EAAE,CAAC,oBAAY,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC;YACpD,KAAK,EAAE,CAAC,KAAoB,EAAE,GAAQ,EAAE,EAAE,CAAC,oBAAY,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC;SAC7F,CAAC;IACN,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAQ;QAC1B,IAAI,CAAC,oBAAY,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO,oBAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAQ;QACtB,OAAO,oBAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAoB,EAAE,GAAQ;QAC7C,OAAO,oBAAY,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAW;QACzB,OAAO,oBAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;CACJ;AA9BD,sBA8BC;AAGD,6BAAgC;AAAvB,8FAAA,OAAO,OAAA;AAChB,qDAAoD;AAA3C,0GAAA,WAAW,OAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arikajs/queue",
3
- "version": "0.0.4",
3
+ "version": "0.0.5",
4
4
  "description": "Asynchronous job processing for the ArikaJS framework.",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
@@ -10,8 +10,9 @@
10
10
  "build:tests": "tsc -p tsconfig.test.json",
11
11
  "clean": "rm -rf dist",
12
12
  "prepare": "echo skip",
13
- "test": "npm run build && npm run build:tests && node scripts/fix-test-imports.js && node --test 'dist/tests/**/*.test.js'",
14
- "test:watch": "npm run build && npm run build:tests && node --test --watch 'dist/tests/**/*.test.js'"
13
+ "test": "npx tsx --test tests/**/*.test.ts",
14
+ "test:watch": "npx tsx --test --watch tests/**/*.test.ts",
15
+ "dev": "tsc -p tsconfig.json --watch"
15
16
  },
16
17
  "files": [
17
18
  "dist"
@@ -30,13 +31,16 @@
30
31
  },
31
32
  "repository": {
32
33
  "type": "git",
33
- "url": "git+https://github.com/arikajs/queue.git"
34
+ "url": "git+https://github.com/ArikaJs/arikajs.git",
35
+ "directory": "packages/queue"
34
36
  },
35
37
  "bugs": {
36
- "url": "https://github.com/arikajs/queue/issues"
38
+ "url": "https://github.com/ArikaJs/arikajs/issues"
39
+ },
40
+ "homepage": "https://github.com/ArikaJs/arikajs/tree/main/packages/queue#readme",
41
+ "dependencies": {
42
+ "ioredis": "^5.9.3"
37
43
  },
38
- "homepage": "https://github.com/arikajs/queue#readme",
39
- "dependencies": {},
40
44
  "devDependencies": {
41
45
  "@types/node": "^20.11.24",
42
46
  "typescript": "^5.3.3"