bunqueue 1.0.0
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/LICENSE +21 -0
- package/README.md +640 -0
- package/dist/application/dlqManager.d.ts +19 -0
- package/dist/application/dlqManager.d.ts.map +1 -0
- package/dist/application/dlqManager.js +44 -0
- package/dist/application/dlqManager.js.map +1 -0
- package/dist/application/eventsManager.d.ts +28 -0
- package/dist/application/eventsManager.d.ts.map +1 -0
- package/dist/application/eventsManager.js +59 -0
- package/dist/application/eventsManager.js.map +1 -0
- package/dist/application/jobLogsManager.d.ts +20 -0
- package/dist/application/jobLogsManager.d.ts.map +1 -0
- package/dist/application/jobLogsManager.js +28 -0
- package/dist/application/jobLogsManager.js.map +1 -0
- package/dist/application/metricsExporter.d.ts +24 -0
- package/dist/application/metricsExporter.d.ts.map +1 -0
- package/dist/application/metricsExporter.js +80 -0
- package/dist/application/metricsExporter.js.map +1 -0
- package/dist/application/operations/ack.d.ts +48 -0
- package/dist/application/operations/ack.d.ts.map +1 -0
- package/dist/application/operations/ack.js +109 -0
- package/dist/application/operations/ack.js.map +1 -0
- package/dist/application/operations/index.d.ts +10 -0
- package/dist/application/operations/index.d.ts.map +1 -0
- package/dist/application/operations/index.js +10 -0
- package/dist/application/operations/index.js.map +1 -0
- package/dist/application/operations/jobManagement.d.ts +32 -0
- package/dist/application/operations/jobManagement.d.ts.map +1 -0
- package/dist/application/operations/jobManagement.js +122 -0
- package/dist/application/operations/jobManagement.js.map +1 -0
- package/dist/application/operations/pull.d.ts +36 -0
- package/dist/application/operations/pull.d.ts.map +1 -0
- package/dist/application/operations/pull.js +109 -0
- package/dist/application/operations/pull.js.map +1 -0
- package/dist/application/operations/push.d.ts +36 -0
- package/dist/application/operations/push.d.ts.map +1 -0
- package/dist/application/operations/push.js +94 -0
- package/dist/application/operations/push.js.map +1 -0
- package/dist/application/operations/queryOperations.d.ts +33 -0
- package/dist/application/operations/queryOperations.d.ts.map +1 -0
- package/dist/application/operations/queryOperations.js +57 -0
- package/dist/application/operations/queryOperations.js.map +1 -0
- package/dist/application/operations/queueControl.d.ts +32 -0
- package/dist/application/operations/queueControl.d.ts.map +1 -0
- package/dist/application/operations/queueControl.js +72 -0
- package/dist/application/operations/queueControl.js.map +1 -0
- package/dist/application/queueManager.d.ts +113 -0
- package/dist/application/queueManager.d.ts.map +1 -0
- package/dist/application/queueManager.js +406 -0
- package/dist/application/queueManager.js.map +1 -0
- package/dist/application/webhookManager.d.ts +35 -0
- package/dist/application/webhookManager.d.ts.map +1 -0
- package/dist/application/webhookManager.js +109 -0
- package/dist/application/webhookManager.js.map +1 -0
- package/dist/application/workerManager.d.ts +48 -0
- package/dist/application/workerManager.d.ts.map +1 -0
- package/dist/application/workerManager.js +121 -0
- package/dist/application/workerManager.js.map +1 -0
- package/dist/domain/queue/index.d.ts +6 -0
- package/dist/domain/queue/index.d.ts.map +1 -0
- package/dist/domain/queue/index.js +6 -0
- package/dist/domain/queue/index.js.map +1 -0
- package/dist/domain/queue/priorityQueue.d.ts +45 -0
- package/dist/domain/queue/priorityQueue.d.ts.map +1 -0
- package/dist/domain/queue/priorityQueue.js +203 -0
- package/dist/domain/queue/priorityQueue.js.map +1 -0
- package/dist/domain/queue/shard.d.ts +98 -0
- package/dist/domain/queue/shard.d.ts.map +1 -0
- package/dist/domain/queue/shard.js +245 -0
- package/dist/domain/queue/shard.js.map +1 -0
- package/dist/domain/types/command.d.ts +270 -0
- package/dist/domain/types/command.d.ts.map +1 -0
- package/dist/domain/types/command.js +6 -0
- package/dist/domain/types/command.js.map +1 -0
- package/dist/domain/types/cron.d.ts +32 -0
- package/dist/domain/types/cron.d.ts.map +1 -0
- package/dist/domain/types/cron.js +31 -0
- package/dist/domain/types/cron.js.map +1 -0
- package/dist/domain/types/index.d.ts +9 -0
- package/dist/domain/types/index.d.ts.map +1 -0
- package/dist/domain/types/index.js +9 -0
- package/dist/domain/types/index.js.map +1 -0
- package/dist/domain/types/job.d.ts +94 -0
- package/dist/domain/types/job.d.ts.map +1 -0
- package/dist/domain/types/job.js +81 -0
- package/dist/domain/types/job.js.map +1 -0
- package/dist/domain/types/queue.d.ts +86 -0
- package/dist/domain/types/queue.d.ts.map +1 -0
- package/dist/domain/types/queue.js +84 -0
- package/dist/domain/types/queue.js.map +1 -0
- package/dist/domain/types/response.d.ts +158 -0
- package/dist/domain/types/response.d.ts.map +1 -0
- package/dist/domain/types/response.js +86 -0
- package/dist/domain/types/response.js.map +1 -0
- package/dist/domain/types/webhook.d.ts +33 -0
- package/dist/domain/types/webhook.d.ts.map +1 -0
- package/dist/domain/types/webhook.js +20 -0
- package/dist/domain/types/webhook.js.map +1 -0
- package/dist/domain/types/worker.d.ts +27 -0
- package/dist/domain/types/worker.d.ts.map +1 -0
- package/dist/domain/types/worker.js +27 -0
- package/dist/domain/types/worker.js.map +1 -0
- package/dist/infrastructure/persistence/index.d.ts +6 -0
- package/dist/infrastructure/persistence/index.d.ts.map +1 -0
- package/dist/infrastructure/persistence/index.js +6 -0
- package/dist/infrastructure/persistence/index.js.map +1 -0
- package/dist/infrastructure/persistence/schema.d.ts +14 -0
- package/dist/infrastructure/persistence/schema.d.ts.map +1 -0
- package/dist/infrastructure/persistence/schema.js +123 -0
- package/dist/infrastructure/persistence/schema.js.map +1 -0
- package/dist/infrastructure/persistence/sqlite.d.ts +42 -0
- package/dist/infrastructure/persistence/sqlite.d.ts.map +1 -0
- package/dist/infrastructure/persistence/sqlite.js +164 -0
- package/dist/infrastructure/persistence/sqlite.js.map +1 -0
- package/dist/infrastructure/persistence/statements.d.ts +55 -0
- package/dist/infrastructure/persistence/statements.d.ts.map +1 -0
- package/dist/infrastructure/persistence/statements.js +42 -0
- package/dist/infrastructure/persistence/statements.js.map +1 -0
- package/dist/infrastructure/scheduler/cronParser.d.ts +44 -0
- package/dist/infrastructure/scheduler/cronParser.d.ts.map +1 -0
- package/dist/infrastructure/scheduler/cronParser.js +90 -0
- package/dist/infrastructure/scheduler/cronParser.js.map +1 -0
- package/dist/infrastructure/scheduler/cronScheduler.d.ts +68 -0
- package/dist/infrastructure/scheduler/cronScheduler.d.ts.map +1 -0
- package/dist/infrastructure/scheduler/cronScheduler.js +172 -0
- package/dist/infrastructure/scheduler/cronScheduler.js.map +1 -0
- package/dist/infrastructure/scheduler/index.d.ts +6 -0
- package/dist/infrastructure/scheduler/index.d.ts.map +1 -0
- package/dist/infrastructure/scheduler/index.js +6 -0
- package/dist/infrastructure/scheduler/index.js.map +1 -0
- package/dist/infrastructure/server/handler.d.ts +13 -0
- package/dist/infrastructure/server/handler.d.ts.map +1 -0
- package/dist/infrastructure/server/handler.js +167 -0
- package/dist/infrastructure/server/handler.js.map +1 -0
- package/dist/infrastructure/server/handlers/advanced.d.ts +68 -0
- package/dist/infrastructure/server/handlers/advanced.d.ts.map +1 -0
- package/dist/infrastructure/server/handlers/advanced.js +99 -0
- package/dist/infrastructure/server/handlers/advanced.js.map +1 -0
- package/dist/infrastructure/server/handlers/core.d.ts +36 -0
- package/dist/infrastructure/server/handlers/core.d.ts.map +1 -0
- package/dist/infrastructure/server/handlers/core.js +82 -0
- package/dist/infrastructure/server/handlers/core.js.map +1 -0
- package/dist/infrastructure/server/handlers/cron.d.ts +20 -0
- package/dist/infrastructure/server/handlers/cron.d.ts.map +1 -0
- package/dist/infrastructure/server/handlers/cron.js +56 -0
- package/dist/infrastructure/server/handlers/cron.js.map +1 -0
- package/dist/infrastructure/server/handlers/dlq.d.ts +20 -0
- package/dist/infrastructure/server/handlers/dlq.d.ts.map +1 -0
- package/dist/infrastructure/server/handlers/dlq.js +31 -0
- package/dist/infrastructure/server/handlers/dlq.js.map +1 -0
- package/dist/infrastructure/server/handlers/index.d.ts +7 -0
- package/dist/infrastructure/server/handlers/index.d.ts.map +1 -0
- package/dist/infrastructure/server/handlers/index.js +7 -0
- package/dist/infrastructure/server/handlers/index.js.map +1 -0
- package/dist/infrastructure/server/handlers/management.d.ts +36 -0
- package/dist/infrastructure/server/handlers/management.d.ts.map +1 -0
- package/dist/infrastructure/server/handlers/management.js +75 -0
- package/dist/infrastructure/server/handlers/management.js.map +1 -0
- package/dist/infrastructure/server/handlers/monitoring.d.ts +18 -0
- package/dist/infrastructure/server/handlers/monitoring.d.ts.map +1 -0
- package/dist/infrastructure/server/handlers/monitoring.js +102 -0
- package/dist/infrastructure/server/handlers/monitoring.js.map +1 -0
- package/dist/infrastructure/server/handlers/query.d.ts +32 -0
- package/dist/infrastructure/server/handlers/query.d.ts.map +1 -0
- package/dist/infrastructure/server/handlers/query.js +61 -0
- package/dist/infrastructure/server/handlers/query.js.map +1 -0
- package/dist/infrastructure/server/http.d.ts +43 -0
- package/dist/infrastructure/server/http.d.ts.map +1 -0
- package/dist/infrastructure/server/http.js +344 -0
- package/dist/infrastructure/server/http.js.map +1 -0
- package/dist/infrastructure/server/index.d.ts +8 -0
- package/dist/infrastructure/server/index.d.ts.map +1 -0
- package/dist/infrastructure/server/index.js +8 -0
- package/dist/infrastructure/server/index.js.map +1 -0
- package/dist/infrastructure/server/protocol.d.ts +44 -0
- package/dist/infrastructure/server/protocol.d.ts.map +1 -0
- package/dist/infrastructure/server/protocol.js +129 -0
- package/dist/infrastructure/server/protocol.js.map +1 -0
- package/dist/infrastructure/server/rateLimiter.d.ts +31 -0
- package/dist/infrastructure/server/rateLimiter.d.ts.map +1 -0
- package/dist/infrastructure/server/rateLimiter.js +79 -0
- package/dist/infrastructure/server/rateLimiter.js.map +1 -0
- package/dist/infrastructure/server/tcp.d.ts +36 -0
- package/dist/infrastructure/server/tcp.d.ts.map +1 -0
- package/dist/infrastructure/server/tcp.js +101 -0
- package/dist/infrastructure/server/tcp.js.map +1 -0
- package/dist/infrastructure/server/types.d.ts +11 -0
- package/dist/infrastructure/server/types.d.ts.map +1 -0
- package/dist/infrastructure/server/types.js +5 -0
- package/dist/infrastructure/server/types.js.map +1 -0
- package/dist/main.d.ts +6 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +111 -0
- package/dist/main.js.map +1 -0
- package/dist/shared/hash.d.ts +30 -0
- package/dist/shared/hash.d.ts.map +1 -0
- package/dist/shared/hash.js +69 -0
- package/dist/shared/hash.js.map +1 -0
- package/dist/shared/index.d.ts +6 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/index.js +6 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/shared/lock.d.ts +70 -0
- package/dist/shared/lock.d.ts.map +1 -0
- package/dist/shared/lock.js +207 -0
- package/dist/shared/lock.js.map +1 -0
- package/dist/shared/logger.d.ts +38 -0
- package/dist/shared/logger.d.ts.map +1 -0
- package/dist/shared/logger.js +74 -0
- package/dist/shared/logger.js.map +1 -0
- package/dist/shared/serialization.d.ts +23 -0
- package/dist/shared/serialization.d.ts.map +1 -0
- package/dist/shared/serialization.js +63 -0
- package/dist/shared/serialization.js.map +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Protocol responses
|
|
3
|
+
* All response types for TCP/HTTP protocol
|
|
4
|
+
*/
|
|
5
|
+
// ============ Response Builders ============
|
|
6
|
+
export function ok(id, reqId) {
|
|
7
|
+
return {
|
|
8
|
+
ok: true,
|
|
9
|
+
id: id?.toString(),
|
|
10
|
+
reqId,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
export function batch(ids, reqId) {
|
|
14
|
+
return {
|
|
15
|
+
ok: true,
|
|
16
|
+
ids: ids.map((id) => id.toString()),
|
|
17
|
+
reqId,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export function job(j, reqId) {
|
|
21
|
+
return {
|
|
22
|
+
ok: true,
|
|
23
|
+
job: serializeJobForResponse(j),
|
|
24
|
+
reqId,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export function nullableJob(j, reqId) {
|
|
28
|
+
return {
|
|
29
|
+
ok: true,
|
|
30
|
+
job: j ? serializeJobForResponse(j) : null,
|
|
31
|
+
reqId,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export function jobs(list, reqId) {
|
|
35
|
+
return {
|
|
36
|
+
ok: true,
|
|
37
|
+
jobs: list.map(serializeJobForResponse),
|
|
38
|
+
reqId,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/** Serialize job for JSON response (convert BigInt to string) */
|
|
42
|
+
function serializeJobForResponse(j) {
|
|
43
|
+
return {
|
|
44
|
+
...j,
|
|
45
|
+
id: j.id.toString(),
|
|
46
|
+
dependsOn: j.dependsOn.map((id) => id.toString()),
|
|
47
|
+
parentId: j.parentId ? j.parentId.toString() : null,
|
|
48
|
+
childrenIds: j.childrenIds.map((id) => id.toString()),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export function error(message, reqId) {
|
|
52
|
+
return {
|
|
53
|
+
ok: false,
|
|
54
|
+
error: message,
|
|
55
|
+
reqId,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export function data(payload, reqId) {
|
|
59
|
+
return {
|
|
60
|
+
ok: true,
|
|
61
|
+
data: payload,
|
|
62
|
+
reqId,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
export function counts(c, reqId) {
|
|
66
|
+
return {
|
|
67
|
+
ok: true,
|
|
68
|
+
counts: c,
|
|
69
|
+
reqId,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
export function stats(s, reqId) {
|
|
73
|
+
return {
|
|
74
|
+
ok: true,
|
|
75
|
+
stats: s,
|
|
76
|
+
reqId,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
export function metrics(m, reqId) {
|
|
80
|
+
return {
|
|
81
|
+
ok: true,
|
|
82
|
+
metrics: m,
|
|
83
|
+
reqId,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=response.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response.js","sourceRoot":"","sources":["../../../src/domain/types/response.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAoLH,8CAA8C;AAE9C,MAAM,UAAU,EAAE,CAAC,EAAW,EAAE,KAAc;IAC5C,OAAO;QACL,EAAE,EAAE,IAAI;QACR,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE;QAClB,KAAK;KACN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,GAAa,EAAE,KAAc;IACjD,OAAO;QACL,EAAE,EAAE,IAAI;QACR,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC;QACnC,KAAK;KACN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,CAAM,EAAE,KAAc;IACxC,OAAO;QACL,EAAE,EAAE,IAAI;QACR,GAAG,EAAE,uBAAuB,CAAC,CAAC,CAAC;QAC/B,KAAK;KACS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,CAAa,EAAE,KAAc;IACvD,OAAO;QACL,EAAE,EAAE,IAAI;QACR,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;QAC1C,KAAK;KACiB,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,IAAW,EAAE,KAAc;IAC9C,OAAO;QACL,EAAE,EAAE,IAAI;QACR,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,uBAAuB,CAAC;QACvC,KAAK;KACU,CAAC;AACpB,CAAC;AAED,iEAAiE;AACjE,SAAS,uBAAuB,CAAC,CAAM;IACrC,OAAO;QACL,GAAG,CAAC;QACJ,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,QAAQ,EAAsB;QACvC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAsB,CAAC;QACrE,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAuB,CAAC,CAAC,CAAC,IAAI;QACzE,WAAW,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,EAAsB,CAAC;KAC1E,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,OAAe,EAAE,KAAc;IACnD,OAAO;QACL,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,OAAO;QACd,KAAK;KACN,CAAC;AACJ,CAAC;AAQD,MAAM,UAAU,IAAI,CAAI,OAAU,EAAE,KAAc;IAChD,OAAO;QACL,EAAE,EAAE,IAAI;QACR,IAAI,EAAE,OAAO;QACb,KAAK;KACN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,CAAY,EAAE,KAAc;IACjD,OAAO;QACL,EAAE,EAAE,IAAI;QACR,MAAM,EAAE,CAAC;QACT,KAAK;KACN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,CAAY,EAAE,KAAc;IAChD,OAAO;QACL,EAAE,EAAE,IAAI;QACR,KAAK,EAAE,CAAC;QACR,KAAK;KACN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,CAAc,EAAE,KAAc;IACpD,OAAO;QACL,EAAE,EAAE,IAAI;QACR,OAAO,EAAE,CAAC;QACV,KAAK;KACN,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Webhook domain types
|
|
3
|
+
*/
|
|
4
|
+
/** Webhook ID type */
|
|
5
|
+
export type WebhookId = string;
|
|
6
|
+
/** Webhook event types */
|
|
7
|
+
export type WebhookEvent = 'job.pushed' | 'job.started' | 'job.completed' | 'job.failed' | 'job.progress' | 'job.stalled';
|
|
8
|
+
/** Webhook configuration */
|
|
9
|
+
export interface Webhook {
|
|
10
|
+
id: WebhookId;
|
|
11
|
+
url: string;
|
|
12
|
+
events: WebhookEvent[];
|
|
13
|
+
queue: string | null;
|
|
14
|
+
secret: string | null;
|
|
15
|
+
createdAt: number;
|
|
16
|
+
lastTriggered: number | null;
|
|
17
|
+
successCount: number;
|
|
18
|
+
failureCount: number;
|
|
19
|
+
enabled: boolean;
|
|
20
|
+
}
|
|
21
|
+
/** Create a new webhook */
|
|
22
|
+
export declare function createWebhook(url: string, events: string[], queue?: string, secret?: string): Webhook;
|
|
23
|
+
/** Webhook payload */
|
|
24
|
+
export interface WebhookPayload {
|
|
25
|
+
event: WebhookEvent;
|
|
26
|
+
timestamp: number;
|
|
27
|
+
jobId: string;
|
|
28
|
+
queue: string;
|
|
29
|
+
data?: unknown;
|
|
30
|
+
error?: string;
|
|
31
|
+
progress?: number;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=webhook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../../src/domain/types/webhook.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,sBAAsB;AACtB,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAE/B,0BAA0B;AAC1B,MAAM,MAAM,YAAY,GACpB,YAAY,GACZ,aAAa,GACb,eAAe,GACf,YAAY,GACZ,cAAc,GACd,aAAa,CAAC;AAElB,4BAA4B;AAC5B,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,SAAS,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,2BAA2B;AAC3B,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EAAE,EAChB,KAAK,CAAC,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAaT;AAED,sBAAsB;AACtB,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,YAAY,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Webhook domain types
|
|
3
|
+
*/
|
|
4
|
+
import { uuid } from '../../shared/hash';
|
|
5
|
+
/** Create a new webhook */
|
|
6
|
+
export function createWebhook(url, events, queue, secret) {
|
|
7
|
+
return {
|
|
8
|
+
id: uuid(),
|
|
9
|
+
url,
|
|
10
|
+
events: events,
|
|
11
|
+
queue: queue ?? null,
|
|
12
|
+
secret: secret ?? null,
|
|
13
|
+
createdAt: Date.now(),
|
|
14
|
+
lastTriggered: null,
|
|
15
|
+
successCount: 0,
|
|
16
|
+
failureCount: 0,
|
|
17
|
+
enabled: true,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=webhook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../../src/domain/types/webhook.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AA4BzC,2BAA2B;AAC3B,MAAM,UAAU,aAAa,CAC3B,GAAW,EACX,MAAgB,EAChB,KAAc,EACd,MAAe;IAEf,OAAO;QACL,EAAE,EAAE,IAAI,EAAE;QACV,GAAG;QACH,MAAM,EAAE,MAAwB;QAChC,KAAK,EAAE,KAAK,IAAI,IAAI;QACpB,MAAM,EAAE,MAAM,IAAI,IAAI;QACtB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,aAAa,EAAE,IAAI;QACnB,YAAY,EAAE,CAAC;QACf,YAAY,EAAE,CAAC;QACf,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker domain types
|
|
3
|
+
*/
|
|
4
|
+
/** Worker ID type */
|
|
5
|
+
export type WorkerId = string;
|
|
6
|
+
/** Worker status */
|
|
7
|
+
export interface Worker {
|
|
8
|
+
id: WorkerId;
|
|
9
|
+
name: string;
|
|
10
|
+
queues: string[];
|
|
11
|
+
registeredAt: number;
|
|
12
|
+
lastSeen: number;
|
|
13
|
+
activeJobs: number;
|
|
14
|
+
processedJobs: number;
|
|
15
|
+
failedJobs: number;
|
|
16
|
+
}
|
|
17
|
+
/** Create a new worker */
|
|
18
|
+
export declare function createWorker(name: string, queues: string[]): Worker;
|
|
19
|
+
/** Job log entry */
|
|
20
|
+
export interface JobLogEntry {
|
|
21
|
+
timestamp: number;
|
|
22
|
+
level: 'info' | 'warn' | 'error';
|
|
23
|
+
message: string;
|
|
24
|
+
}
|
|
25
|
+
/** Create log entry */
|
|
26
|
+
export declare function createLogEntry(message: string, level?: 'info' | 'warn' | 'error'): JobLogEntry;
|
|
27
|
+
//# sourceMappingURL=worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../src/domain/types/worker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,qBAAqB;AACrB,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC;AAE9B,oBAAoB;AACpB,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,QAAQ,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,0BAA0B;AAC1B,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAYnE;AAED,oBAAoB;AACpB,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,uBAAuB;AACvB,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,MAAM,GAAG,MAAM,GAAG,OAAgB,GACxC,WAAW,CAMb"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Worker domain types
|
|
3
|
+
*/
|
|
4
|
+
import { uuid } from '../../shared/hash';
|
|
5
|
+
/** Create a new worker */
|
|
6
|
+
export function createWorker(name, queues) {
|
|
7
|
+
const now = Date.now();
|
|
8
|
+
return {
|
|
9
|
+
id: uuid(),
|
|
10
|
+
name,
|
|
11
|
+
queues,
|
|
12
|
+
registeredAt: now,
|
|
13
|
+
lastSeen: now,
|
|
14
|
+
activeJobs: 0,
|
|
15
|
+
processedJobs: 0,
|
|
16
|
+
failedJobs: 0,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/** Create log entry */
|
|
20
|
+
export function createLogEntry(message, level = 'info') {
|
|
21
|
+
return {
|
|
22
|
+
timestamp: Date.now(),
|
|
23
|
+
level,
|
|
24
|
+
message,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/domain/types/worker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAiBzC,0BAA0B;AAC1B,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,MAAgB;IACzD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,OAAO;QACL,EAAE,EAAE,IAAI,EAAE;QACV,IAAI;QACJ,MAAM;QACN,YAAY,EAAE,GAAG;QACjB,QAAQ,EAAE,GAAG;QACb,UAAU,EAAE,CAAC;QACb,aAAa,EAAE,CAAC;QAChB,UAAU,EAAE,CAAC;KACd,CAAC;AACJ,CAAC;AASD,uBAAuB;AACvB,MAAM,UAAU,cAAc,CAC5B,OAAe,EACf,QAAmC,MAAM;IAEzC,OAAO;QACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,KAAK;QACL,OAAO;KACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/persistence/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/infrastructure/persistence/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite schema and migrations
|
|
3
|
+
*/
|
|
4
|
+
/** SQLite PRAGMA settings for optimal performance */
|
|
5
|
+
export declare const PRAGMA_SETTINGS = "\nPRAGMA journal_mode = WAL;\nPRAGMA synchronous = NORMAL;\nPRAGMA cache_size = -64000;\nPRAGMA temp_store = MEMORY;\nPRAGMA mmap_size = 268435456;\nPRAGMA page_size = 4096;\n";
|
|
6
|
+
/** Main schema creation */
|
|
7
|
+
export declare const SCHEMA = "\n-- Jobs table\nCREATE TABLE IF NOT EXISTS jobs (\n id INTEGER PRIMARY KEY,\n queue TEXT NOT NULL,\n data TEXT NOT NULL,\n priority INTEGER NOT NULL DEFAULT 0,\n created_at INTEGER NOT NULL,\n run_at INTEGER NOT NULL,\n started_at INTEGER,\n completed_at INTEGER,\n attempts INTEGER NOT NULL DEFAULT 0,\n max_attempts INTEGER NOT NULL DEFAULT 3,\n backoff INTEGER NOT NULL DEFAULT 1000,\n ttl INTEGER,\n timeout INTEGER,\n unique_key TEXT,\n custom_id TEXT,\n depends_on TEXT,\n parent_id INTEGER,\n children_ids TEXT,\n tags TEXT,\n state TEXT NOT NULL DEFAULT 'waiting',\n lifo INTEGER NOT NULL DEFAULT 0,\n group_id TEXT,\n progress INTEGER DEFAULT 0,\n progress_msg TEXT,\n remove_on_complete INTEGER DEFAULT 0,\n remove_on_fail INTEGER DEFAULT 0,\n stall_timeout INTEGER,\n last_heartbeat INTEGER\n);\n\n-- Indexes for common queries\nCREATE INDEX IF NOT EXISTS idx_jobs_queue_state\n ON jobs(queue, state);\nCREATE INDEX IF NOT EXISTS idx_jobs_run_at\n ON jobs(run_at) WHERE state IN ('waiting', 'delayed');\nCREATE INDEX IF NOT EXISTS idx_jobs_unique\n ON jobs(queue, unique_key) WHERE unique_key IS NOT NULL;\nCREATE INDEX IF NOT EXISTS idx_jobs_custom_id\n ON jobs(custom_id) WHERE custom_id IS NOT NULL;\nCREATE INDEX IF NOT EXISTS idx_jobs_parent\n ON jobs(parent_id) WHERE parent_id IS NOT NULL;\n\n-- Job results storage\nCREATE TABLE IF NOT EXISTS job_results (\n job_id INTEGER PRIMARY KEY,\n result TEXT,\n completed_at INTEGER NOT NULL\n);\n\n-- Dead letter queue\nCREATE TABLE IF NOT EXISTS dlq (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n job_id INTEGER NOT NULL,\n queue TEXT NOT NULL,\n data TEXT NOT NULL,\n error TEXT,\n failed_at INTEGER NOT NULL,\n attempts INTEGER NOT NULL\n);\n\nCREATE INDEX IF NOT EXISTS idx_dlq_queue ON dlq(queue);\nCREATE INDEX IF NOT EXISTS idx_dlq_job_id ON dlq(job_id);\n\n-- Cron jobs\nCREATE TABLE IF NOT EXISTS cron_jobs (\n name TEXT PRIMARY KEY,\n queue TEXT NOT NULL,\n data TEXT NOT NULL,\n schedule TEXT,\n repeat_every INTEGER,\n priority INTEGER NOT NULL DEFAULT 0,\n next_run INTEGER NOT NULL,\n executions INTEGER NOT NULL DEFAULT 0,\n max_limit INTEGER\n);\n\n-- Sequence for job IDs\nCREATE TABLE IF NOT EXISTS sequences (\n name TEXT PRIMARY KEY,\n value INTEGER NOT NULL DEFAULT 0\n);\n\n-- Initialize job_id sequence\nINSERT OR IGNORE INTO sequences (name, value) VALUES ('job_id', 0);\n\n-- Queue state persistence (optional)\nCREATE TABLE IF NOT EXISTS queue_state (\n name TEXT PRIMARY KEY,\n paused INTEGER NOT NULL DEFAULT 0,\n rate_limit INTEGER,\n concurrency_limit INTEGER\n);\n";
|
|
8
|
+
/** Migration version table */
|
|
9
|
+
export declare const MIGRATION_TABLE = "\nCREATE TABLE IF NOT EXISTS migrations (\n version INTEGER PRIMARY KEY,\n applied_at INTEGER NOT NULL\n);\n";
|
|
10
|
+
/** Current schema version */
|
|
11
|
+
export declare const SCHEMA_VERSION = 1;
|
|
12
|
+
/** All migrations in order */
|
|
13
|
+
export declare const MIGRATIONS: Record<number, string>;
|
|
14
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/persistence/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,qDAAqD;AACrD,eAAO,MAAM,eAAe,oLAO3B,CAAC;AAEF,2BAA2B;AAC3B,eAAO,MAAM,MAAM,8qFA+FlB,CAAC;AAEF,8BAA8B;AAC9B,eAAO,MAAM,eAAe,uHAK3B,CAAC;AAEF,6BAA6B;AAC7B,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC,8BAA8B;AAC9B,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAE7C,CAAC"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite schema and migrations
|
|
3
|
+
*/
|
|
4
|
+
/** SQLite PRAGMA settings for optimal performance */
|
|
5
|
+
export const PRAGMA_SETTINGS = `
|
|
6
|
+
PRAGMA journal_mode = WAL;
|
|
7
|
+
PRAGMA synchronous = NORMAL;
|
|
8
|
+
PRAGMA cache_size = -64000;
|
|
9
|
+
PRAGMA temp_store = MEMORY;
|
|
10
|
+
PRAGMA mmap_size = 268435456;
|
|
11
|
+
PRAGMA page_size = 4096;
|
|
12
|
+
`;
|
|
13
|
+
/** Main schema creation */
|
|
14
|
+
export const SCHEMA = `
|
|
15
|
+
-- Jobs table
|
|
16
|
+
CREATE TABLE IF NOT EXISTS jobs (
|
|
17
|
+
id INTEGER PRIMARY KEY,
|
|
18
|
+
queue TEXT NOT NULL,
|
|
19
|
+
data TEXT NOT NULL,
|
|
20
|
+
priority INTEGER NOT NULL DEFAULT 0,
|
|
21
|
+
created_at INTEGER NOT NULL,
|
|
22
|
+
run_at INTEGER NOT NULL,
|
|
23
|
+
started_at INTEGER,
|
|
24
|
+
completed_at INTEGER,
|
|
25
|
+
attempts INTEGER NOT NULL DEFAULT 0,
|
|
26
|
+
max_attempts INTEGER NOT NULL DEFAULT 3,
|
|
27
|
+
backoff INTEGER NOT NULL DEFAULT 1000,
|
|
28
|
+
ttl INTEGER,
|
|
29
|
+
timeout INTEGER,
|
|
30
|
+
unique_key TEXT,
|
|
31
|
+
custom_id TEXT,
|
|
32
|
+
depends_on TEXT,
|
|
33
|
+
parent_id INTEGER,
|
|
34
|
+
children_ids TEXT,
|
|
35
|
+
tags TEXT,
|
|
36
|
+
state TEXT NOT NULL DEFAULT 'waiting',
|
|
37
|
+
lifo INTEGER NOT NULL DEFAULT 0,
|
|
38
|
+
group_id TEXT,
|
|
39
|
+
progress INTEGER DEFAULT 0,
|
|
40
|
+
progress_msg TEXT,
|
|
41
|
+
remove_on_complete INTEGER DEFAULT 0,
|
|
42
|
+
remove_on_fail INTEGER DEFAULT 0,
|
|
43
|
+
stall_timeout INTEGER,
|
|
44
|
+
last_heartbeat INTEGER
|
|
45
|
+
);
|
|
46
|
+
|
|
47
|
+
-- Indexes for common queries
|
|
48
|
+
CREATE INDEX IF NOT EXISTS idx_jobs_queue_state
|
|
49
|
+
ON jobs(queue, state);
|
|
50
|
+
CREATE INDEX IF NOT EXISTS idx_jobs_run_at
|
|
51
|
+
ON jobs(run_at) WHERE state IN ('waiting', 'delayed');
|
|
52
|
+
CREATE INDEX IF NOT EXISTS idx_jobs_unique
|
|
53
|
+
ON jobs(queue, unique_key) WHERE unique_key IS NOT NULL;
|
|
54
|
+
CREATE INDEX IF NOT EXISTS idx_jobs_custom_id
|
|
55
|
+
ON jobs(custom_id) WHERE custom_id IS NOT NULL;
|
|
56
|
+
CREATE INDEX IF NOT EXISTS idx_jobs_parent
|
|
57
|
+
ON jobs(parent_id) WHERE parent_id IS NOT NULL;
|
|
58
|
+
|
|
59
|
+
-- Job results storage
|
|
60
|
+
CREATE TABLE IF NOT EXISTS job_results (
|
|
61
|
+
job_id INTEGER PRIMARY KEY,
|
|
62
|
+
result TEXT,
|
|
63
|
+
completed_at INTEGER NOT NULL
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
-- Dead letter queue
|
|
67
|
+
CREATE TABLE IF NOT EXISTS dlq (
|
|
68
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
69
|
+
job_id INTEGER NOT NULL,
|
|
70
|
+
queue TEXT NOT NULL,
|
|
71
|
+
data TEXT NOT NULL,
|
|
72
|
+
error TEXT,
|
|
73
|
+
failed_at INTEGER NOT NULL,
|
|
74
|
+
attempts INTEGER NOT NULL
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
CREATE INDEX IF NOT EXISTS idx_dlq_queue ON dlq(queue);
|
|
78
|
+
CREATE INDEX IF NOT EXISTS idx_dlq_job_id ON dlq(job_id);
|
|
79
|
+
|
|
80
|
+
-- Cron jobs
|
|
81
|
+
CREATE TABLE IF NOT EXISTS cron_jobs (
|
|
82
|
+
name TEXT PRIMARY KEY,
|
|
83
|
+
queue TEXT NOT NULL,
|
|
84
|
+
data TEXT NOT NULL,
|
|
85
|
+
schedule TEXT,
|
|
86
|
+
repeat_every INTEGER,
|
|
87
|
+
priority INTEGER NOT NULL DEFAULT 0,
|
|
88
|
+
next_run INTEGER NOT NULL,
|
|
89
|
+
executions INTEGER NOT NULL DEFAULT 0,
|
|
90
|
+
max_limit INTEGER
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
-- Sequence for job IDs
|
|
94
|
+
CREATE TABLE IF NOT EXISTS sequences (
|
|
95
|
+
name TEXT PRIMARY KEY,
|
|
96
|
+
value INTEGER NOT NULL DEFAULT 0
|
|
97
|
+
);
|
|
98
|
+
|
|
99
|
+
-- Initialize job_id sequence
|
|
100
|
+
INSERT OR IGNORE INTO sequences (name, value) VALUES ('job_id', 0);
|
|
101
|
+
|
|
102
|
+
-- Queue state persistence (optional)
|
|
103
|
+
CREATE TABLE IF NOT EXISTS queue_state (
|
|
104
|
+
name TEXT PRIMARY KEY,
|
|
105
|
+
paused INTEGER NOT NULL DEFAULT 0,
|
|
106
|
+
rate_limit INTEGER,
|
|
107
|
+
concurrency_limit INTEGER
|
|
108
|
+
);
|
|
109
|
+
`;
|
|
110
|
+
/** Migration version table */
|
|
111
|
+
export const MIGRATION_TABLE = `
|
|
112
|
+
CREATE TABLE IF NOT EXISTS migrations (
|
|
113
|
+
version INTEGER PRIMARY KEY,
|
|
114
|
+
applied_at INTEGER NOT NULL
|
|
115
|
+
);
|
|
116
|
+
`;
|
|
117
|
+
/** Current schema version */
|
|
118
|
+
export const SCHEMA_VERSION = 1;
|
|
119
|
+
/** All migrations in order */
|
|
120
|
+
export const MIGRATIONS = {
|
|
121
|
+
1: SCHEMA,
|
|
122
|
+
};
|
|
123
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/infrastructure/persistence/schema.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,qDAAqD;AACrD,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;;CAO9B,CAAC;AAEF,2BAA2B;AAC3B,MAAM,CAAC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+FrB,CAAC;AAEF,8BAA8B;AAC9B,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;CAK9B,CAAC;AAEF,6BAA6B;AAC7B,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAEhC,8BAA8B;AAC9B,MAAM,CAAC,MAAM,UAAU,GAA2B;IAChD,CAAC,EAAE,MAAM;CACV,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite Storage Implementation
|
|
3
|
+
* Persistence layer using Bun's native SQLite
|
|
4
|
+
*/
|
|
5
|
+
import { type Job, type JobId } from '../../domain/types/job';
|
|
6
|
+
import type { CronJob } from '../../domain/types/cron';
|
|
7
|
+
/** SQLite configuration */
|
|
8
|
+
export interface SqliteConfig {
|
|
9
|
+
path: string;
|
|
10
|
+
walMode?: boolean;
|
|
11
|
+
synchronous?: 'OFF' | 'NORMAL' | 'FULL';
|
|
12
|
+
cacheSize?: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* SQLite Storage class
|
|
16
|
+
*/
|
|
17
|
+
export declare class SqliteStorage {
|
|
18
|
+
private db;
|
|
19
|
+
private readonly statements;
|
|
20
|
+
constructor(config: SqliteConfig);
|
|
21
|
+
private migrate;
|
|
22
|
+
nextJobId(): JobId;
|
|
23
|
+
insertJob(job: Job): void;
|
|
24
|
+
markActive(jobId: JobId, startedAt: number): void;
|
|
25
|
+
markCompleted(jobId: JobId, completedAt: number): void;
|
|
26
|
+
markFailed(job: Job, error: string | null): void;
|
|
27
|
+
updateForRetry(job: Job): void;
|
|
28
|
+
deleteJob(jobId: JobId): void;
|
|
29
|
+
getJob(id: JobId): Job | null;
|
|
30
|
+
storeResult(jobId: JobId, result: unknown): void;
|
|
31
|
+
getResult(jobId: JobId): unknown;
|
|
32
|
+
insertJobsBatch(jobs: Job[]): void;
|
|
33
|
+
loadPendingJobs(): Job[];
|
|
34
|
+
loadActiveJobs(): Job[];
|
|
35
|
+
saveCron(cron: CronJob): void;
|
|
36
|
+
loadCronJobs(): CronJob[];
|
|
37
|
+
deleteCron(name: string): void;
|
|
38
|
+
private rowToJob;
|
|
39
|
+
close(): void;
|
|
40
|
+
getSize(): number;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=sqlite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/persistence/sqlite.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,KAAK,EAAS,MAAM,wBAAwB,CAAC;AACrE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAIvD,2BAA2B;AAC3B,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,EAAE,CAAW;IACrB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsD;gBAErE,MAAM,EAAE,YAAY;IAOhC,OAAO,CAAC,OAAO;IAgBf,SAAS,IAAI,KAAK;IAKlB,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI;IA6BzB,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAIjD,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAItD,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAMhD,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI;IAM9B,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAI7B,MAAM,CAAC,EAAE,EAAE,KAAK,GAAG,GAAG,GAAG,IAAI;IAK7B,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;IAIhD,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAOhC,eAAe,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAkClC,eAAe,IAAI,GAAG,EAAE;IAOxB,cAAc,IAAI,GAAG,EAAE;IASvB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAgB7B,YAAY,IAAI,OAAO,EAAE;IAezB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAM9B,OAAO,CAAC,QAAQ;IAwChB,KAAK,IAAI,IAAI;IAIb,OAAO,IAAI,MAAM;CAIlB"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite Storage Implementation
|
|
3
|
+
* Persistence layer using Bun's native SQLite
|
|
4
|
+
*/
|
|
5
|
+
import { Database } from 'bun:sqlite';
|
|
6
|
+
import { jobId } from '../../domain/types/job';
|
|
7
|
+
import { PRAGMA_SETTINGS, SCHEMA, MIGRATION_TABLE, SCHEMA_VERSION } from './schema';
|
|
8
|
+
import { prepareStatements } from './statements';
|
|
9
|
+
/**
|
|
10
|
+
* SQLite Storage class
|
|
11
|
+
*/
|
|
12
|
+
export class SqliteStorage {
|
|
13
|
+
db;
|
|
14
|
+
statements;
|
|
15
|
+
constructor(config) {
|
|
16
|
+
this.db = new Database(config.path, { create: true });
|
|
17
|
+
this.db.run(PRAGMA_SETTINGS);
|
|
18
|
+
this.migrate();
|
|
19
|
+
this.statements = prepareStatements(this.db);
|
|
20
|
+
}
|
|
21
|
+
migrate() {
|
|
22
|
+
this.db.run(MIGRATION_TABLE);
|
|
23
|
+
const currentVersion = this.db.query('SELECT MAX(version) as version FROM migrations').get()
|
|
24
|
+
?.version ?? 0;
|
|
25
|
+
if (currentVersion < SCHEMA_VERSION) {
|
|
26
|
+
this.db.run(SCHEMA);
|
|
27
|
+
this.db
|
|
28
|
+
.prepare('INSERT INTO migrations (version, applied_at) VALUES (?, ?)')
|
|
29
|
+
.run(SCHEMA_VERSION, Date.now());
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// ============ Job Operations ============
|
|
33
|
+
nextJobId() {
|
|
34
|
+
const result = this.statements.get('nextJobId').get();
|
|
35
|
+
return jobId(BigInt(result.value));
|
|
36
|
+
}
|
|
37
|
+
insertJob(job) {
|
|
38
|
+
this.statements
|
|
39
|
+
.get('insertJob')
|
|
40
|
+
.run(Number(job.id), job.queue, JSON.stringify(job.data), job.priority, job.createdAt, job.runAt, job.attempts, job.maxAttempts, job.backoff, job.ttl, job.timeout, job.uniqueKey, job.customId, job.dependsOn.length > 0 ? JSON.stringify(job.dependsOn.map(String)) : null, job.parentId ? Number(job.parentId) : null, job.tags.length > 0 ? JSON.stringify(job.tags) : null, job.runAt > Date.now() ? 'delayed' : 'waiting', job.lifo ? 1 : 0, job.groupId, job.removeOnComplete ? 1 : 0, job.removeOnFail ? 1 : 0, job.stallTimeout);
|
|
41
|
+
}
|
|
42
|
+
markActive(jobId, startedAt) {
|
|
43
|
+
this.statements.get('updateJobState').run('active', startedAt, Number(jobId));
|
|
44
|
+
}
|
|
45
|
+
markCompleted(jobId, completedAt) {
|
|
46
|
+
this.statements.get('completeJob').run('completed', completedAt, Number(jobId));
|
|
47
|
+
}
|
|
48
|
+
markFailed(job, error) {
|
|
49
|
+
this.statements
|
|
50
|
+
.get('insertDlq')
|
|
51
|
+
.run(Number(job.id), job.queue, JSON.stringify(job.data), error, Date.now(), job.attempts);
|
|
52
|
+
}
|
|
53
|
+
updateForRetry(job) {
|
|
54
|
+
this.db
|
|
55
|
+
.prepare('UPDATE jobs SET attempts = ?, run_at = ?, state = ? WHERE id = ?')
|
|
56
|
+
.run(job.attempts, job.runAt, 'waiting', Number(job.id));
|
|
57
|
+
}
|
|
58
|
+
deleteJob(jobId) {
|
|
59
|
+
this.statements.get('deleteJob').run(Number(jobId));
|
|
60
|
+
}
|
|
61
|
+
getJob(id) {
|
|
62
|
+
const row = this.statements.get('getJob').get(Number(id));
|
|
63
|
+
return row ? this.rowToJob(row) : null;
|
|
64
|
+
}
|
|
65
|
+
storeResult(jobId, result) {
|
|
66
|
+
this.statements.get('insertResult').run(Number(jobId), JSON.stringify(result), Date.now());
|
|
67
|
+
}
|
|
68
|
+
getResult(jobId) {
|
|
69
|
+
const row = this.statements.get('getResult').get(Number(jobId));
|
|
70
|
+
return row ? JSON.parse(row.result) : null;
|
|
71
|
+
}
|
|
72
|
+
// ============ Bulk Operations ============
|
|
73
|
+
insertJobsBatch(jobs) {
|
|
74
|
+
const stmt = this.statements.get('insertJob');
|
|
75
|
+
this.db.transaction(() => {
|
|
76
|
+
for (const job of jobs) {
|
|
77
|
+
stmt.run(Number(job.id), job.queue, JSON.stringify(job.data), job.priority, job.createdAt, job.runAt, job.attempts, job.maxAttempts, job.backoff, job.ttl, job.timeout, job.uniqueKey, job.customId, job.dependsOn.length > 0 ? JSON.stringify(job.dependsOn.map(String)) : null, job.parentId ? Number(job.parentId) : null, job.tags.length > 0 ? JSON.stringify(job.tags) : null, job.runAt > Date.now() ? 'delayed' : 'waiting', job.lifo ? 1 : 0, job.groupId, job.removeOnComplete ? 1 : 0, job.removeOnFail ? 1 : 0, job.stallTimeout);
|
|
78
|
+
}
|
|
79
|
+
})();
|
|
80
|
+
}
|
|
81
|
+
// ============ Query Operations ============
|
|
82
|
+
loadPendingJobs() {
|
|
83
|
+
const rows = this.db
|
|
84
|
+
.query("SELECT * FROM jobs WHERE state IN ('waiting', 'delayed') ORDER BY id")
|
|
85
|
+
.all();
|
|
86
|
+
return rows.map((row) => this.rowToJob(row));
|
|
87
|
+
}
|
|
88
|
+
loadActiveJobs() {
|
|
89
|
+
const rows = this.db
|
|
90
|
+
.query("SELECT * FROM jobs WHERE state = 'active' ORDER BY id")
|
|
91
|
+
.all();
|
|
92
|
+
return rows.map((row) => this.rowToJob(row));
|
|
93
|
+
}
|
|
94
|
+
// ============ Cron Operations ============
|
|
95
|
+
saveCron(cron) {
|
|
96
|
+
this.statements
|
|
97
|
+
.get('insertCron')
|
|
98
|
+
.run(cron.name, cron.queue, JSON.stringify(cron.data), cron.schedule, cron.repeatEvery, cron.priority, cron.nextRun, cron.executions, cron.maxLimit);
|
|
99
|
+
}
|
|
100
|
+
loadCronJobs() {
|
|
101
|
+
const rows = this.db.query('SELECT * FROM cron_jobs').all();
|
|
102
|
+
return rows.map((row) => ({
|
|
103
|
+
name: row.name,
|
|
104
|
+
queue: row.queue,
|
|
105
|
+
data: JSON.parse(row.data),
|
|
106
|
+
schedule: row.schedule,
|
|
107
|
+
repeatEvery: row.repeat_every,
|
|
108
|
+
priority: row.priority,
|
|
109
|
+
nextRun: row.next_run,
|
|
110
|
+
executions: row.executions,
|
|
111
|
+
maxLimit: row.max_limit,
|
|
112
|
+
}));
|
|
113
|
+
}
|
|
114
|
+
deleteCron(name) {
|
|
115
|
+
this.db.prepare('DELETE FROM cron_jobs WHERE name = ?').run(name);
|
|
116
|
+
}
|
|
117
|
+
// ============ Utilities ============
|
|
118
|
+
rowToJob(row) {
|
|
119
|
+
const dependsOn = row.depends_on ? JSON.parse(row.depends_on) : [];
|
|
120
|
+
const childrenIds = row.children_ids
|
|
121
|
+
? JSON.parse(row.children_ids)
|
|
122
|
+
: [];
|
|
123
|
+
const tags = row.tags ? JSON.parse(row.tags) : [];
|
|
124
|
+
return {
|
|
125
|
+
id: jobId(BigInt(row.id)),
|
|
126
|
+
queue: row.queue,
|
|
127
|
+
data: JSON.parse(row.data),
|
|
128
|
+
priority: row.priority,
|
|
129
|
+
createdAt: row.created_at,
|
|
130
|
+
runAt: row.run_at,
|
|
131
|
+
startedAt: row.started_at,
|
|
132
|
+
completedAt: row.completed_at,
|
|
133
|
+
attempts: row.attempts,
|
|
134
|
+
maxAttempts: row.max_attempts,
|
|
135
|
+
backoff: row.backoff,
|
|
136
|
+
ttl: row.ttl,
|
|
137
|
+
timeout: row.timeout,
|
|
138
|
+
uniqueKey: row.unique_key,
|
|
139
|
+
customId: row.custom_id,
|
|
140
|
+
dependsOn: dependsOn.map((s) => jobId(BigInt(s))),
|
|
141
|
+
parentId: row.parent_id ? jobId(BigInt(row.parent_id)) : null,
|
|
142
|
+
childrenIds: childrenIds.map((s) => jobId(BigInt(s))),
|
|
143
|
+
childrenCompleted: 0,
|
|
144
|
+
tags,
|
|
145
|
+
lifo: row.lifo === 1,
|
|
146
|
+
groupId: row.group_id,
|
|
147
|
+
progress: row.progress ?? 0,
|
|
148
|
+
progressMessage: row.progress_msg,
|
|
149
|
+
removeOnComplete: row.remove_on_complete === 1,
|
|
150
|
+
removeOnFail: row.remove_on_fail === 1,
|
|
151
|
+
lastHeartbeat: row.last_heartbeat ?? row.created_at,
|
|
152
|
+
stallTimeout: row.stall_timeout,
|
|
153
|
+
stallCount: 0,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
close() {
|
|
157
|
+
this.db.close();
|
|
158
|
+
}
|
|
159
|
+
getSize() {
|
|
160
|
+
const file = Bun.file(this.db.filename);
|
|
161
|
+
return file.size;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=sqlite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../../src/infrastructure/persistence/sqlite.ts"],"names":[],"mappings":"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"}
|