bunqueue 1.0.3 → 1.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 +63 -0
- package/dist/application/eventsManager.d.ts +2 -0
- package/dist/application/eventsManager.d.ts.map +1 -1
- package/dist/application/eventsManager.js +13 -1
- package/dist/application/eventsManager.js.map +1 -1
- package/dist/application/jobLogsManager.d.ts +2 -1
- package/dist/application/jobLogsManager.d.ts.map +1 -1
- package/dist/application/jobLogsManager.js.map +1 -1
- package/dist/application/operations/ack.d.ts +3 -2
- package/dist/application/operations/ack.d.ts.map +1 -1
- package/dist/application/operations/ack.js.map +1 -1
- package/dist/application/operations/jobManagement.d.ts +3 -0
- package/dist/application/operations/jobManagement.d.ts.map +1 -1
- package/dist/application/operations/jobManagement.js +90 -50
- package/dist/application/operations/jobManagement.js.map +1 -1
- package/dist/application/operations/push.d.ts +3 -2
- package/dist/application/operations/push.d.ts.map +1 -1
- package/dist/application/operations/push.js.map +1 -1
- package/dist/application/operations/queryOperations.d.ts +4 -3
- package/dist/application/operations/queryOperations.d.ts.map +1 -1
- package/dist/application/operations/queryOperations.js.map +1 -1
- package/dist/application/queueManager.d.ts +19 -4
- package/dist/application/queueManager.d.ts.map +1 -1
- package/dist/application/queueManager.js +159 -30
- package/dist/application/queueManager.js.map +1 -1
- package/dist/application/webhookManager.d.ts.map +1 -1
- package/dist/application/webhookManager.js +4 -3
- package/dist/application/webhookManager.js.map +1 -1
- package/dist/application/workerManager.d.ts.map +1 -1
- package/dist/application/workerManager.js +5 -3
- package/dist/application/workerManager.js.map +1 -1
- package/dist/infrastructure/persistence/sqlite.d.ts.map +1 -1
- package/dist/infrastructure/persistence/sqlite.js +22 -6
- package/dist/infrastructure/persistence/sqlite.js.map +1 -1
- package/dist/infrastructure/scheduler/cronScheduler.d.ts.map +1 -1
- package/dist/infrastructure/scheduler/cronScheduler.js +13 -8
- package/dist/infrastructure/scheduler/cronScheduler.js.map +1 -1
- package/dist/infrastructure/server/handlers/core.d.ts.map +1 -1
- package/dist/infrastructure/server/handlers/core.js +20 -1
- package/dist/infrastructure/server/handlers/core.js.map +1 -1
- package/dist/infrastructure/server/handlers/monitoring.d.ts.map +1 -1
- package/dist/infrastructure/server/handlers/monitoring.js +5 -0
- package/dist/infrastructure/server/handlers/monitoring.js.map +1 -1
- package/dist/infrastructure/server/http.d.ts.map +1 -1
- package/dist/infrastructure/server/http.js +50 -2
- package/dist/infrastructure/server/http.js.map +1 -1
- package/dist/infrastructure/server/protocol.d.ts +10 -0
- package/dist/infrastructure/server/protocol.d.ts.map +1 -1
- package/dist/infrastructure/server/protocol.js +104 -0
- package/dist/infrastructure/server/protocol.js.map +1 -1
- package/dist/infrastructure/server/rateLimiter.d.ts +2 -0
- package/dist/infrastructure/server/rateLimiter.d.ts.map +1 -1
- package/dist/infrastructure/server/rateLimiter.js +7 -0
- package/dist/infrastructure/server/rateLimiter.js.map +1 -1
- package/dist/main.js +7 -1
- package/dist/main.js.map +1 -1
- package/dist/shared/logger.d.ts +3 -0
- package/dist/shared/logger.d.ts.map +1 -1
- package/dist/shared/logger.js +3 -0
- package/dist/shared/logger.js.map +1 -1
- package/dist/shared/lru.d.ts +76 -0
- package/dist/shared/lru.d.ts.map +1 -0
- package/dist/shared/lru.js +173 -0
- package/dist/shared/lru.js.map +1 -0
- package/package.json +17 -5
package/README.md
CHANGED
|
@@ -658,6 +658,69 @@ docker compose up -d
|
|
|
658
658
|
docker compose --profile dev up bunqueue-dev
|
|
659
659
|
```
|
|
660
660
|
|
|
661
|
+
## Deployment
|
|
662
|
+
|
|
663
|
+
bunqueue requires a **persistent server** with filesystem access for SQLite. It is **not compatible** with serverless platforms like Vercel or Cloudflare Workers.
|
|
664
|
+
|
|
665
|
+
### Compatible Platforms
|
|
666
|
+
|
|
667
|
+
| Platform | Bun | SQLite | TCP | Notes |
|
|
668
|
+
|----------|:---:|:------:|:---:|-------|
|
|
669
|
+
| [Fly.io](https://fly.io) | ✅ | ✅ | ✅ | Recommended - persistent volumes, global deployment |
|
|
670
|
+
| [Railway](https://railway.app) | ✅ | ✅ | ✅ | Easy deploy from GitHub |
|
|
671
|
+
| [Render](https://render.com) | ✅ | ✅ | ✅ | Docker support, persistent disks |
|
|
672
|
+
| [DigitalOcean](https://digitalocean.com) | ✅ | ✅ | ✅ | App Platform or Droplets |
|
|
673
|
+
| Any VPS | ✅ | ✅ | ✅ | Full control |
|
|
674
|
+
|
|
675
|
+
### Fly.io (Recommended)
|
|
676
|
+
|
|
677
|
+
```bash
|
|
678
|
+
# Install flyctl
|
|
679
|
+
curl -L https://fly.io/install.sh | sh
|
|
680
|
+
|
|
681
|
+
# Launch (uses existing Dockerfile)
|
|
682
|
+
fly launch
|
|
683
|
+
|
|
684
|
+
# Create persistent volume for SQLite
|
|
685
|
+
fly volumes create bunqueue_data --size 1
|
|
686
|
+
|
|
687
|
+
# Set secrets
|
|
688
|
+
fly secrets set AUTH_TOKENS=your-secret-token
|
|
689
|
+
|
|
690
|
+
# Deploy
|
|
691
|
+
fly deploy
|
|
692
|
+
```
|
|
693
|
+
|
|
694
|
+
Add to `fly.toml`:
|
|
695
|
+
```toml
|
|
696
|
+
[mounts]
|
|
697
|
+
source = "bunqueue_data"
|
|
698
|
+
destination = "/app/data"
|
|
699
|
+
|
|
700
|
+
[env]
|
|
701
|
+
DATA_PATH = "/app/data/bunqueue.db"
|
|
702
|
+
```
|
|
703
|
+
|
|
704
|
+
### Railway
|
|
705
|
+
|
|
706
|
+
[](https://railway.app/template)
|
|
707
|
+
|
|
708
|
+
```bash
|
|
709
|
+
# Or via CLI
|
|
710
|
+
railway login
|
|
711
|
+
railway init
|
|
712
|
+
railway up
|
|
713
|
+
```
|
|
714
|
+
|
|
715
|
+
### Not Compatible
|
|
716
|
+
|
|
717
|
+
| Platform | Reason |
|
|
718
|
+
|----------|--------|
|
|
719
|
+
| Vercel | Serverless functions, no persistent filesystem, no TCP |
|
|
720
|
+
| Cloudflare Workers | V8 isolates (not Bun), no filesystem, no TCP |
|
|
721
|
+
| AWS Lambda | Serverless, no persistent storage |
|
|
722
|
+
| Netlify Functions | Serverless, no filesystem |
|
|
723
|
+
|
|
661
724
|
## Architecture
|
|
662
725
|
|
|
663
726
|
```
|
|
@@ -14,6 +14,8 @@ export declare class EventsManager {
|
|
|
14
14
|
constructor(webhookManager: WebhookManager);
|
|
15
15
|
/** Subscribe to job events */
|
|
16
16
|
subscribe(callback: EventSubscriber): () => void;
|
|
17
|
+
/** Clear all subscribers (for shutdown) */
|
|
18
|
+
clear(): void;
|
|
17
19
|
/** Broadcast event to all subscribers */
|
|
18
20
|
broadcast(event: Partial<JobEvent> & {
|
|
19
21
|
eventType: EventType;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eventsManager.d.ts","sourceRoot":"","sources":["../../src/application/eventsManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"eventsManager.d.ts","sourceRoot":"","sources":["../../src/application/eventsManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAIvD,gCAAgC;AAChC,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;AAExD,2BAA2B;AAC3B,qBAAa,aAAa;IAGZ,OAAO,CAAC,QAAQ,CAAC,cAAc;IAF3C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAyB;gBAExB,cAAc,EAAE,cAAc;IAE3D,8BAA8B;IAC9B,SAAS,CAAC,QAAQ,EAAE,eAAe,GAAG,MAAM,IAAI;IAQhD,2CAA2C;IAC3C,KAAK,IAAI,IAAI;IAIb,yCAAyC;IACzC,SAAS,CACP,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG;QACzB,SAAS,EAAE,SAAS,CAAC;QACrB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,KAAK,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GACA,IAAI;IA6BP,+CAA+C;IAC/C,OAAO,CAAC,iBAAiB;CAc1B"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Events Manager
|
|
3
3
|
* Job event subscription and broadcasting
|
|
4
4
|
*/
|
|
5
|
+
import { webhookLog } from '../shared/logger';
|
|
5
6
|
/** Events manager class */
|
|
6
7
|
export class EventsManager {
|
|
7
8
|
webhookManager;
|
|
@@ -18,6 +19,10 @@ export class EventsManager {
|
|
|
18
19
|
this.subscribers.splice(idx, 1);
|
|
19
20
|
};
|
|
20
21
|
}
|
|
22
|
+
/** Clear all subscribers (for shutdown) */
|
|
23
|
+
clear() {
|
|
24
|
+
this.subscribers.length = 0;
|
|
25
|
+
}
|
|
21
26
|
/** Broadcast event to all subscribers */
|
|
22
27
|
broadcast(event) {
|
|
23
28
|
// Notify subscribers
|
|
@@ -37,7 +42,14 @@ export class EventsManager {
|
|
|
37
42
|
data: event.data,
|
|
38
43
|
error: event.error,
|
|
39
44
|
})
|
|
40
|
-
.catch(() => {
|
|
45
|
+
.catch((err) => {
|
|
46
|
+
webhookLog.error('Webhook trigger failed', {
|
|
47
|
+
event: webhookEvent,
|
|
48
|
+
jobId: String(event.jobId),
|
|
49
|
+
queue: event.queue,
|
|
50
|
+
error: String(err),
|
|
51
|
+
});
|
|
52
|
+
});
|
|
41
53
|
}
|
|
42
54
|
}
|
|
43
55
|
/** Map internal event type to webhook event */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eventsManager.js","sourceRoot":"","sources":["../../src/application/eventsManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"eventsManager.js","sourceRoot":"","sources":["../../src/application/eventsManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAK9C,2BAA2B;AAC3B,MAAM,OAAO,aAAa;IAGK;IAFZ,WAAW,GAAsB,EAAE,CAAC;IAErD,YAA6B,cAA8B;QAA9B,mBAAc,GAAd,cAAc,CAAgB;IAAG,CAAC;IAE/D,8BAA8B;IAC9B,SAAS,CAAC,QAAyB;QACjC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,OAAO,GAAG,EAAE;YACV,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC/C,IAAI,GAAG,KAAK,CAAC,CAAC;gBAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAClD,CAAC,CAAC;IACJ,CAAC;IAED,2CAA2C;IAC3C,KAAK;QACH,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;IAC9B,CAAC;IAED,yCAAyC;IACzC,SAAS,CACP,KAMC;QAED,qBAAqB;QACrB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,GAAG,CAAC,KAAiB,CAAC,CAAC;YACzB,CAAC;YAAC,MAAM,CAAC;gBACP,2BAA2B;YAC7B,CAAC;QACH,CAAC;QAED,mBAAmB;QACnB,MAAM,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7D,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,CAAC,cAAc;iBAChB,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,KAAK,EAAE;gBACvD,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,KAAK,EAAE,KAAK,CAAC,KAAK;aACnB,CAAC;iBACD,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;gBACtB,UAAU,CAAC,KAAK,CAAC,wBAAwB,EAAE;oBACzC,KAAK,EAAE,YAAY;oBACnB,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;oBAC1B,KAAK,EAAE,KAAK,CAAC,KAAK;oBAClB,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC;iBACnB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC;IACH,CAAC;IAED,+CAA+C;IACvC,iBAAiB,CAAC,SAAoB;QAC5C,QAAQ,SAAS,EAAE,CAAC;YAClB;gBACE,OAAO,YAAY,CAAC;YACtB;gBACE,OAAO,aAAa,CAAC;YACvB;gBACE,OAAO,eAAe,CAAC;YACzB;gBACE,OAAO,YAAY,CAAC;YACtB;gBACE,OAAO,IAAI,CAAC;QAChB,CAAC;IACH,CAAC;CACF"}
|
|
@@ -5,10 +5,11 @@
|
|
|
5
5
|
import type { JobId } from '../domain/types/job';
|
|
6
6
|
import { type JobLogEntry } from '../domain/types/worker';
|
|
7
7
|
import type { JobLocation } from '../domain/types/queue';
|
|
8
|
+
import type { MapLike } from '../shared/lru';
|
|
8
9
|
/** Context for job logs operations */
|
|
9
10
|
export interface JobLogsContext {
|
|
10
11
|
jobIndex: Map<JobId, JobLocation>;
|
|
11
|
-
jobLogs:
|
|
12
|
+
jobLogs: MapLike<JobId, JobLogEntry[]>;
|
|
12
13
|
maxLogsPerJob: number;
|
|
13
14
|
}
|
|
14
15
|
/** Add log entry to a job */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jobLogsManager.d.ts","sourceRoot":"","sources":["../../src/application/jobLogsManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,KAAK,WAAW,EAAkB,MAAM,wBAAwB,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"jobLogsManager.d.ts","sourceRoot":"","sources":["../../src/application/jobLogsManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,KAAK,WAAW,EAAkB,MAAM,wBAAwB,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,sCAAsC;AACtC,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IACvC,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,6BAA6B;AAC7B,wBAAgB,SAAS,CACvB,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,cAAc,EACnB,KAAK,GAAE,MAAM,GAAG,MAAM,GAAG,OAAgB,GACxC,OAAO,CAcT;AAED,yBAAyB;AACzB,wBAAgB,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,cAAc,GAAG,WAAW,EAAE,CAE3E;AAED,2BAA2B;AAC3B,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI,CAEpE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jobLogsManager.js","sourceRoot":"","sources":["../../src/application/jobLogsManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAoB,cAAc,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"jobLogsManager.js","sourceRoot":"","sources":["../../src/application/jobLogsManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAoB,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAW1E,6BAA6B;AAC7B,MAAM,UAAU,SAAS,CACvB,KAAY,EACZ,OAAe,EACf,GAAmB,EACnB,QAAmC,MAAM;IAEzC,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAE5B,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAC1C,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IAE1C,eAAe;IACf,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,aAAa,EAAE,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,aAAa,CAAC,CAAC;IAClD,CAAC;IAED,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC7B,OAAO,IAAI,CAAC;AACd,CAAC;AAED,yBAAyB;AACzB,MAAM,UAAU,UAAU,CAAC,KAAY,EAAE,GAAmB;IAC1D,OAAO,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;AACtC,CAAC;AAED,2BAA2B;AAC3B,MAAM,UAAU,YAAY,CAAC,KAAY,EAAE,GAAmB;IAC5D,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC"}
|
|
@@ -7,6 +7,7 @@ import type { JobLocation, EventType } from '../../domain/types/queue';
|
|
|
7
7
|
import type { Shard } from '../../domain/queue/shard';
|
|
8
8
|
import type { SqliteStorage } from '../../infrastructure/persistence/sqlite';
|
|
9
9
|
import { RWLock } from '../../shared/lock';
|
|
10
|
+
import type { SetLike, MapLike } from '../../shared/lru';
|
|
10
11
|
/** Ack operation context */
|
|
11
12
|
export interface AckContext {
|
|
12
13
|
storage: SqliteStorage | null;
|
|
@@ -14,8 +15,8 @@ export interface AckContext {
|
|
|
14
15
|
shardLocks: RWLock[];
|
|
15
16
|
processingShards: Map<JobId, Job>[];
|
|
16
17
|
processingLocks: RWLock[];
|
|
17
|
-
completedJobs:
|
|
18
|
-
jobResults:
|
|
18
|
+
completedJobs: SetLike<JobId>;
|
|
19
|
+
jobResults: MapLike<JobId, unknown>;
|
|
19
20
|
jobIndex: Map<JobId, JobLocation>;
|
|
20
21
|
totalCompleted: {
|
|
21
22
|
value: bigint;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ack.d.ts","sourceRoot":"","sources":["../../../src/application/operations/ack.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,KAAK,EAA8B,MAAM,wBAAwB,CAAC;AAC1F,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,MAAM,EAAiB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"ack.d.ts","sourceRoot":"","sources":["../../../src/application/operations/ack.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,KAAK,EAA8B,MAAM,wBAAwB,CAAC;AAC1F,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,MAAM,EAAiB,MAAM,mBAAmB,CAAC;AAE1D,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAEzD,4BAA4B;AAC5B,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,gBAAgB,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;IACpC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9B,UAAU,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACpC,QAAQ,EAAE,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAClC,cAAc,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAClC,WAAW,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/B,SAAS,EAAE,CAAC,KAAK,EAAE;QACjB,SAAS,EAAE,SAAS,CAAC;QACrB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,KAAK,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,KAAK,IAAI,CAAC;IACX,cAAc,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACxC;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAgD1F;AAED;;GAEG;AACH,wBAAsB,OAAO,CAC3B,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,GAAG,EAAE,UAAU,GACd,OAAO,CAAC,IAAI,CAAC,CA+Cf;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAIjF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ack.js","sourceRoot":"","sources":["../../../src/application/operations/ack.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAwB,gBAAgB,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAI1F,OAAO,EAAU,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"ack.js","sourceRoot":"","sources":["../../../src/application/operations/ack.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,11 +7,14 @@ import type { JobLocation } from '../../domain/types/queue';
|
|
|
7
7
|
import type { Shard } from '../../domain/queue/shard';
|
|
8
8
|
import type { SqliteStorage } from '../../infrastructure/persistence/sqlite';
|
|
9
9
|
import type { WebhookManager } from '../webhookManager';
|
|
10
|
+
import { type RWLock } from '../../shared/lock';
|
|
10
11
|
/** Context for job management operations */
|
|
11
12
|
export interface JobManagementContext {
|
|
12
13
|
storage: SqliteStorage | null;
|
|
13
14
|
shards: Shard[];
|
|
15
|
+
shardLocks: RWLock[];
|
|
14
16
|
processingShards: Map<JobId, Job>[];
|
|
17
|
+
processingLocks: RWLock[];
|
|
15
18
|
jobIndex: Map<JobId, JobLocation>;
|
|
16
19
|
webhookManager: WebhookManager;
|
|
17
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jobManagement.d.ts","sourceRoot":"","sources":["../../../src/application/operations/jobManagement.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGxD,4CAA4C;AAC5C,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,gBAAgB,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;IACpC,QAAQ,EAAE,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAClC,cAAc,EAAE,cAAc,CAAC;CAChC;AAED,uCAAuC;AACvC,wBAAsB,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"jobManagement.d.ts","sourceRoot":"","sources":["../../../src/application/operations/jobManagement.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGxD,OAAO,EAAE,KAAK,MAAM,EAAiB,MAAM,mBAAmB,CAAC;AAE/D,4CAA4C;AAC5C,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,gBAAgB,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;IACpC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,EAAE,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAClC,cAAc,EAAE,cAAc,CAAC;CAChC;AAED,uCAAuC;AACvC,wBAAsB,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,CAkBzF;AAED,0BAA0B;AAC1B,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,oBAAoB,EACzB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC,CAwBlB;AAED,sBAAsB;AACtB,wBAAsB,aAAa,CACjC,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,OAAO,EACb,GAAG,EAAE,oBAAoB,GACxB,OAAO,CAAC,OAAO,CAAC,CAyBlB;AAED,0BAA0B;AAC1B,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,oBAAoB,GACxB,OAAO,CAAC,OAAO,CAAC,CAQlB;AAED,qCAAqC;AACrC,wBAAsB,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,CAY1F;AAED,sCAAsC;AACtC,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,oBAAoB,GACxB,OAAO,CAAC,OAAO,CAAC,CA4BlB;AAED,yBAAyB;AACzB,wBAAsB,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,CA4B1F"}
|
|
@@ -2,22 +2,27 @@
|
|
|
2
2
|
* Job Management Operations
|
|
3
3
|
* Cancel, update progress, change priority, promote, move to delayed, discard
|
|
4
4
|
*/
|
|
5
|
-
import { shardIndex } from '../../shared/hash';
|
|
5
|
+
import { shardIndex, processingShardIndex } from '../../shared/hash';
|
|
6
|
+
import { webhookLog } from '../../shared/logger';
|
|
7
|
+
import { withWriteLock } from '../../shared/lock';
|
|
6
8
|
/** Cancel a job (remove from queue) */
|
|
7
9
|
export async function cancelJob(jobId, ctx) {
|
|
8
10
|
const location = ctx.jobIndex.get(jobId);
|
|
9
11
|
if (!location)
|
|
10
12
|
return false;
|
|
11
13
|
if (location.type === 'queue') {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
if (job
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
14
|
+
return withWriteLock(ctx.shardLocks[location.shardIdx], () => {
|
|
15
|
+
const shard = ctx.shards[location.shardIdx];
|
|
16
|
+
const job = shard.getQueue(location.queueName).remove(jobId);
|
|
17
|
+
if (job) {
|
|
18
|
+
if (job.uniqueKey)
|
|
19
|
+
shard.releaseUniqueKey(location.queueName, job.uniqueKey);
|
|
20
|
+
ctx.jobIndex.delete(jobId);
|
|
21
|
+
ctx.storage?.deleteJob(jobId);
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
return false;
|
|
25
|
+
});
|
|
21
26
|
}
|
|
22
27
|
return false;
|
|
23
28
|
}
|
|
@@ -26,18 +31,25 @@ export async function updateJobProgress(jobId, progress, ctx, message) {
|
|
|
26
31
|
const location = ctx.jobIndex.get(jobId);
|
|
27
32
|
if (location?.type !== 'processing')
|
|
28
33
|
return false;
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
job.
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
.
|
|
38
|
-
|
|
34
|
+
const procIdx = processingShardIndex(jobId);
|
|
35
|
+
return withWriteLock(ctx.processingLocks[procIdx], () => {
|
|
36
|
+
const job = ctx.processingShards[procIdx].get(jobId);
|
|
37
|
+
if (!job)
|
|
38
|
+
return false;
|
|
39
|
+
job.progress = Math.max(0, Math.min(100, progress));
|
|
40
|
+
if (message !== undefined)
|
|
41
|
+
job.progressMessage = message;
|
|
42
|
+
ctx.webhookManager
|
|
43
|
+
.trigger('job.progress', String(jobId), job.queue, { progress: job.progress })
|
|
44
|
+
.catch((err) => {
|
|
45
|
+
webhookLog.error('Progress webhook failed', {
|
|
46
|
+
jobId: String(jobId),
|
|
47
|
+
queue: job.queue,
|
|
48
|
+
error: String(err),
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
return true;
|
|
39
52
|
});
|
|
40
|
-
return true;
|
|
41
53
|
}
|
|
42
54
|
/** Update job data */
|
|
43
55
|
export async function updateJobData(jobId, data, ctx) {
|
|
@@ -45,18 +57,25 @@ export async function updateJobData(jobId, data, ctx) {
|
|
|
45
57
|
if (!location)
|
|
46
58
|
return false;
|
|
47
59
|
if (location.type === 'queue') {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
job
|
|
51
|
-
|
|
52
|
-
|
|
60
|
+
return withWriteLock(ctx.shardLocks[location.shardIdx], () => {
|
|
61
|
+
const job = ctx.shards[location.shardIdx].getQueue(location.queueName).find(jobId);
|
|
62
|
+
if (job) {
|
|
63
|
+
job.data = data;
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
return false;
|
|
67
|
+
});
|
|
53
68
|
}
|
|
54
69
|
else if (location.type === 'processing') {
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
job
|
|
58
|
-
|
|
59
|
-
|
|
70
|
+
const procIdx = processingShardIndex(jobId);
|
|
71
|
+
return withWriteLock(ctx.processingLocks[procIdx], () => {
|
|
72
|
+
const job = ctx.processingShards[procIdx].get(jobId);
|
|
73
|
+
if (job) {
|
|
74
|
+
job.data = data;
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
return false;
|
|
78
|
+
});
|
|
60
79
|
}
|
|
61
80
|
return false;
|
|
62
81
|
}
|
|
@@ -65,36 +84,49 @@ export async function changeJobPriority(jobId, priority, ctx) {
|
|
|
65
84
|
const location = ctx.jobIndex.get(jobId);
|
|
66
85
|
if (location?.type !== 'queue')
|
|
67
86
|
return false;
|
|
68
|
-
|
|
69
|
-
|
|
87
|
+
return withWriteLock(ctx.shardLocks[location.shardIdx], () => {
|
|
88
|
+
const q = ctx.shards[location.shardIdx].getQueue(location.queueName);
|
|
89
|
+
return q.updatePriority(jobId, priority);
|
|
90
|
+
});
|
|
70
91
|
}
|
|
71
92
|
/** Promote delayed job to waiting */
|
|
72
93
|
export async function promoteJob(jobId, ctx) {
|
|
73
94
|
const location = ctx.jobIndex.get(jobId);
|
|
74
95
|
if (location?.type !== 'queue')
|
|
75
96
|
return false;
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
97
|
+
return withWriteLock(ctx.shardLocks[location.shardIdx], () => {
|
|
98
|
+
const q = ctx.shards[location.shardIdx].getQueue(location.queueName);
|
|
99
|
+
const job = q.find(jobId);
|
|
100
|
+
if (!job || job.runAt <= Date.now())
|
|
101
|
+
return false;
|
|
102
|
+
job.runAt = Date.now();
|
|
103
|
+
return true;
|
|
104
|
+
});
|
|
82
105
|
}
|
|
83
106
|
/** Move active job back to delayed */
|
|
84
107
|
export async function moveJobToDelayed(jobId, delay, ctx) {
|
|
85
108
|
const location = ctx.jobIndex.get(jobId);
|
|
86
109
|
if (location?.type !== 'processing')
|
|
87
110
|
return false;
|
|
88
|
-
const
|
|
89
|
-
|
|
111
|
+
const procIdx = processingShardIndex(jobId);
|
|
112
|
+
// First remove from processing with lock
|
|
113
|
+
const job = await withWriteLock(ctx.processingLocks[procIdx], () => {
|
|
114
|
+
const job = ctx.processingShards[procIdx].get(jobId);
|
|
115
|
+
if (job) {
|
|
116
|
+
ctx.processingShards[procIdx].delete(jobId);
|
|
117
|
+
}
|
|
118
|
+
return job;
|
|
119
|
+
});
|
|
90
120
|
if (!job)
|
|
91
121
|
return false;
|
|
92
|
-
|
|
122
|
+
// Then add back to queue with lock
|
|
93
123
|
job.runAt = Date.now() + delay;
|
|
94
124
|
job.startedAt = null;
|
|
95
125
|
const idx = shardIndex(job.queue);
|
|
96
|
-
ctx.
|
|
97
|
-
|
|
126
|
+
await withWriteLock(ctx.shardLocks[idx], () => {
|
|
127
|
+
ctx.shards[idx].getQueue(job.queue).push(job);
|
|
128
|
+
ctx.jobIndex.set(jobId, { type: 'queue', shardIdx: idx, queueName: job.queue });
|
|
129
|
+
});
|
|
98
130
|
return true;
|
|
99
131
|
}
|
|
100
132
|
/** Discard job to DLQ */
|
|
@@ -104,17 +136,25 @@ export async function discardJob(jobId, ctx) {
|
|
|
104
136
|
return false;
|
|
105
137
|
let job = null;
|
|
106
138
|
if (location.type === 'queue') {
|
|
107
|
-
job = ctx.
|
|
139
|
+
job = await withWriteLock(ctx.shardLocks[location.shardIdx], () => {
|
|
140
|
+
return ctx.shards[location.shardIdx].getQueue(location.queueName).remove(jobId);
|
|
141
|
+
});
|
|
108
142
|
}
|
|
109
143
|
else if (location.type === 'processing') {
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
ctx.processingShards[
|
|
144
|
+
const procIdx = processingShardIndex(jobId);
|
|
145
|
+
job = await withWriteLock(ctx.processingLocks[procIdx], () => {
|
|
146
|
+
const j = ctx.processingShards[procIdx].get(jobId) ?? null;
|
|
147
|
+
if (j)
|
|
148
|
+
ctx.processingShards[procIdx].delete(jobId);
|
|
149
|
+
return j;
|
|
150
|
+
});
|
|
113
151
|
}
|
|
114
152
|
if (job) {
|
|
115
153
|
const idx = shardIndex(job.queue);
|
|
116
|
-
ctx.
|
|
117
|
-
|
|
154
|
+
await withWriteLock(ctx.shardLocks[idx], () => {
|
|
155
|
+
ctx.shards[idx].addToDlq(job);
|
|
156
|
+
ctx.jobIndex.set(jobId, { type: 'dlq', queueName: job.queue });
|
|
157
|
+
});
|
|
118
158
|
return true;
|
|
119
159
|
}
|
|
120
160
|
return false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jobManagement.js","sourceRoot":"","sources":["../../../src/application/operations/jobManagement.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"jobManagement.js","sourceRoot":"","sources":["../../../src/application/operations/jobManagement.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,13 +7,14 @@ import type { JobLocation, EventType } from '../../domain/types/queue';
|
|
|
7
7
|
import type { Shard } from '../../domain/queue/shard';
|
|
8
8
|
import type { SqliteStorage } from '../../infrastructure/persistence/sqlite';
|
|
9
9
|
import { RWLock } from '../../shared/lock';
|
|
10
|
+
import type { SetLike, MapLike } from '../../shared/lru';
|
|
10
11
|
/** Push operation context */
|
|
11
12
|
export interface PushContext {
|
|
12
13
|
storage: SqliteStorage | null;
|
|
13
14
|
shards: Shard[];
|
|
14
15
|
shardLocks: RWLock[];
|
|
15
|
-
completedJobs:
|
|
16
|
-
customIdMap:
|
|
16
|
+
completedJobs: SetLike<JobId>;
|
|
17
|
+
customIdMap: MapLike<string, JobId>;
|
|
17
18
|
jobIndex: Map<JobId, JobLocation>;
|
|
18
19
|
totalPushed: {
|
|
19
20
|
value: bigint;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../../src/application/operations/push.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,KAAK,EAAE,KAAK,QAAQ,EAAoB,MAAM,wBAAwB,CAAC;AAC/F,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,MAAM,EAAiB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"push.d.ts","sourceRoot":"","sources":["../../../src/application/operations/push.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,KAAK,EAAE,KAAK,QAAQ,EAAoB,MAAM,wBAAwB,CAAC;AAC/F,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,MAAM,EAAiB,MAAM,mBAAmB,CAAC;AAE1D,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAEzD,6BAA6B;AAC7B,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9B,WAAW,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACpC,QAAQ,EAAE,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAClC,WAAW,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/B,SAAS,EAAE,CAAC,KAAK,EAAE;QACjB,SAAS,EAAE,SAAS,CAAC;QACrB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,KAAK,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACnB,KAAK,IAAI,CAAC;CACZ;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAgE5F;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,QAAQ,EAAE,EAClB,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,KAAK,EAAE,CAAC,CAiClB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"push.js","sourceRoot":"","sources":["../../../src/application/operations/push.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAuC,SAAS,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAI/F,OAAO,EAAU,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"push.js","sourceRoot":"","sources":["../../../src/application/operations/push.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ import type { JobLocation } from '../../domain/types/queue';
|
|
|
7
7
|
import type { Shard } from '../../domain/queue/shard';
|
|
8
8
|
import type { SqliteStorage } from '../../infrastructure/persistence/sqlite';
|
|
9
9
|
import { type RWLock } from '../../shared/lock';
|
|
10
|
+
import type { SetLike, MapLike } from '../../shared/lru';
|
|
10
11
|
/** Context for query operations */
|
|
11
12
|
export interface QueryContext {
|
|
12
13
|
storage: SqliteStorage | null;
|
|
@@ -15,9 +16,9 @@ export interface QueryContext {
|
|
|
15
16
|
processingShards: Map<JobId, Job>[];
|
|
16
17
|
processingLocks: RWLock[];
|
|
17
18
|
jobIndex: Map<JobId, JobLocation>;
|
|
18
|
-
completedJobs:
|
|
19
|
-
jobResults:
|
|
20
|
-
customIdMap:
|
|
19
|
+
completedJobs: SetLike<JobId>;
|
|
20
|
+
jobResults: MapLike<JobId, unknown>;
|
|
21
|
+
customIdMap: MapLike<string, JobId>;
|
|
21
22
|
}
|
|
22
23
|
/** Get job by ID */
|
|
23
24
|
export declare function getJob(jobId: JobId, ctx: QueryContext): Promise<Job | null>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queryOperations.d.ts","sourceRoot":"","sources":["../../../src/application/operations/queryOperations.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"queryOperations.d.ts","sourceRoot":"","sources":["../../../src/application/operations/queryOperations.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAEzD,mCAAmC;AACnC,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,aAAa,GAAG,IAAI,CAAC;IAC9B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,gBAAgB,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;IACpC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,EAAE,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAClC,aAAa,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9B,UAAU,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACpC,WAAW,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;CACrC;AAED,oBAAoB;AACpB,wBAAsB,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAmBjF;AAED,qBAAqB;AACrB,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAErE;AAED,2BAA2B;AAC3B,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,GAAG,GAAG,IAAI,CAchF;AAED,uBAAuB;AACvB,wBAAgB,cAAc,CAC5B,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,YAAY,GAChB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAQrD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queryOperations.js","sourceRoot":"","sources":["../../../src/application/operations/queryOperations.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAe,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"queryOperations.js","sourceRoot":"","sources":["../../../src/application/operations/queryOperations.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,8 +13,12 @@ export interface QueueManagerConfig {
|
|
|
13
13
|
dataPath?: string;
|
|
14
14
|
maxCompletedJobs?: number;
|
|
15
15
|
maxJobResults?: number;
|
|
16
|
+
maxJobLogs?: number;
|
|
17
|
+
maxCustomIds?: number;
|
|
18
|
+
maxWaitingDeps?: number;
|
|
16
19
|
cleanupIntervalMs?: number;
|
|
17
20
|
jobTimeoutCheckMs?: number;
|
|
21
|
+
dependencyCheckMs?: number;
|
|
18
22
|
}
|
|
19
23
|
/**
|
|
20
24
|
* QueueManager - Central coordinator
|
|
@@ -27,14 +31,16 @@ export declare class QueueManager {
|
|
|
27
31
|
private readonly processingShards;
|
|
28
32
|
private readonly processingLocks;
|
|
29
33
|
private readonly jobIndex;
|
|
30
|
-
private
|
|
31
|
-
private
|
|
32
|
-
private
|
|
34
|
+
private completedJobs;
|
|
35
|
+
private jobResults;
|
|
36
|
+
private customIdMap;
|
|
37
|
+
private jobLogs;
|
|
38
|
+
private readonly pendingDepChecks;
|
|
39
|
+
private depCheckInterval;
|
|
33
40
|
private readonly cronScheduler;
|
|
34
41
|
readonly webhookManager: WebhookManager;
|
|
35
42
|
readonly workerManager: WorkerManager;
|
|
36
43
|
private readonly eventsManager;
|
|
37
|
-
private readonly jobLogs;
|
|
38
44
|
private readonly maxLogsPerJob;
|
|
39
45
|
private readonly metrics;
|
|
40
46
|
private readonly startTime;
|
|
@@ -89,7 +95,16 @@ export declare class QueueManager {
|
|
|
89
95
|
getCron(name: string): CronJob | undefined;
|
|
90
96
|
listCrons(): CronJob[];
|
|
91
97
|
subscribe(callback: (event: JobEvent) => void): () => void;
|
|
98
|
+
/**
|
|
99
|
+
* Called when a job is completed - schedules deferred dependency check
|
|
100
|
+
* This avoids lock order violations by not iterating shards while holding locks
|
|
101
|
+
*/
|
|
92
102
|
private onJobCompleted;
|
|
103
|
+
/**
|
|
104
|
+
* Process pending dependency checks in a separate task
|
|
105
|
+
* This runs periodically to check if waiting jobs can now proceed
|
|
106
|
+
*/
|
|
107
|
+
private processPendingDependencies;
|
|
93
108
|
private startBackgroundTasks;
|
|
94
109
|
private checkJobTimeouts;
|
|
95
110
|
private recover;
|