@motiadev/adapter-bullmq-events 0.14.0-beta.165-210612 → 0.14.0-beta.165-256670
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 +1 -1
- package/dist/bullmq-event-adapter.d.ts +27 -0
- package/dist/bullmq-event-adapter.d.ts.map +1 -0
- package/dist/bullmq-event-adapter.js +75 -0
- package/dist/config-builder.d.ts +6 -0
- package/dist/config-builder.d.ts.map +1 -0
- package/dist/config-builder.js +29 -0
- package/dist/connection-manager.d.ts +10 -0
- package/dist/connection-manager.d.ts.map +1 -0
- package/dist/connection-manager.js +39 -0
- package/dist/constants.d.ts +14 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +16 -0
- package/dist/dlq-manager.d.ts +22 -0
- package/dist/dlq-manager.d.ts.map +1 -0
- package/dist/dlq-manager.js +112 -0
- package/dist/errors.d.ts +14 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +35 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +11 -0
- package/dist/queue-manager.d.ts +20 -0
- package/dist/queue-manager.d.ts.map +1 -0
- package/dist/queue-manager.js +85 -0
- package/dist/types.d.ts +23 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/worker-manager.d.ts +38 -0
- package/dist/worker-manager.d.ts.map +1 -0
- package/dist/worker-manager.js +136 -0
- package/package.json +7 -11
- package/tsconfig.json +2 -2
- package/dist/bullmq-event-adapter.d.mts +0 -31
- package/dist/bullmq-event-adapter.d.mts.map +0 -1
- package/dist/bullmq-event-adapter.mjs +0 -74
- package/dist/bullmq-event-adapter.mjs.map +0 -1
- package/dist/config-builder.d.mts +0 -9
- package/dist/config-builder.d.mts.map +0 -1
- package/dist/config-builder.mjs +0 -28
- package/dist/config-builder.mjs.map +0 -1
- package/dist/connection-manager.mjs +0 -35
- package/dist/connection-manager.mjs.map +0 -1
- package/dist/constants.mjs +0 -18
- package/dist/constants.mjs.map +0 -1
- package/dist/dlq-manager.d.mts +0 -26
- package/dist/dlq-manager.d.mts.map +0 -1
- package/dist/dlq-manager.mjs +0 -105
- package/dist/dlq-manager.mjs.map +0 -1
- package/dist/errors.mjs +0 -31
- package/dist/errors.mjs.map +0 -1
- package/dist/index.d.mts +0 -6
- package/dist/index.mjs +0 -6
- package/dist/queue-manager.d.mts +0 -24
- package/dist/queue-manager.d.mts.map +0 -1
- package/dist/queue-manager.mjs +0 -83
- package/dist/queue-manager.mjs.map +0 -1
- package/dist/types.d.mts +0 -27
- package/dist/types.d.mts.map +0 -1
- package/dist/worker-manager.d.mts +0 -41
- package/dist/worker-manager.d.mts.map +0 -1
- package/dist/worker-manager.mjs +0 -130
- package/dist/worker-manager.mjs.map +0 -1
- package/tsdown.config.ts +0 -17
package/dist/queue-manager.d.mts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { MergedConfig } from "./config-builder.mjs";
|
|
2
|
-
import { SubscriberInfo } from "./worker-manager.mjs";
|
|
3
|
-
import { Redis } from "ioredis";
|
|
4
|
-
import { Queue } from "bullmq";
|
|
5
|
-
import { Event } from "@motiadev/core";
|
|
6
|
-
|
|
7
|
-
//#region src/queue-manager.d.ts
|
|
8
|
-
declare class QueueManager {
|
|
9
|
-
private readonly queues;
|
|
10
|
-
private readonly connection;
|
|
11
|
-
private readonly config;
|
|
12
|
-
constructor(connection: Redis, config: MergedConfig);
|
|
13
|
-
getQueue(queueName: string): Queue;
|
|
14
|
-
getQueueName(topic: string, stepName: string): string;
|
|
15
|
-
enqueueToAll<TData>(event: Event<TData>, subscribers: SubscriberInfo[]): Promise<void>;
|
|
16
|
-
closeQueue(queueName: string): Promise<void>;
|
|
17
|
-
closeAll(): Promise<void>;
|
|
18
|
-
listQueueNames(): string[];
|
|
19
|
-
getPrefix(): string;
|
|
20
|
-
getConnection(): Redis;
|
|
21
|
-
}
|
|
22
|
-
//#endregion
|
|
23
|
-
export { QueueManager };
|
|
24
|
-
//# sourceMappingURL=queue-manager.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"queue-manager.d.mts","names":[],"sources":["../src/queue-manager.ts"],"sourcesContent":[],"mappings":";;;;;;;cAQa,YAAA;;EAAA,iBAAY,UAAA;EAKC,iBAAA,MAAA;EAAe,WAAA,CAAA,UAAA,EAAf,KAAe,EAAA,MAAA,EAAA,YAAA;EAKV,QAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAAA,KAAA;EA0BU,YAAA,CAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,MAAA,CAAA,EAAA,MAAA;EAAN,YAAA,CAAA,KAAA,CAAA,CAAA,KAAA,EAAA,KAAA,CAAM,KAAN,CAAA,EAAA,WAAA,EAA2B,cAA3B,EAAA,CAAA,EAA8C,OAA9C,CAAA,IAAA,CAAA;EAA2B,UAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAiCvB,OAjCuB,CAAA,IAAA,CAAA;EAAmB,QAAA,CAAA,CAAA,EAyC7D,OAzC6D,CAAA,IAAA,CAAA;EAiC1C,cAAA,CAAA,CAAA,EAAA,MAAA,EAAA;EAQnB,SAAA,CAAA,CAAA,EAAA,MAAA;EAkBD,aAAA,CAAA,CAAA,EAAA,KAAA"}
|
package/dist/queue-manager.mjs
DELETED
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import { MILLISECONDS_PER_SECOND } from "./constants.mjs";
|
|
2
|
-
import { QueueCreationError } from "./errors.mjs";
|
|
3
|
-
import { Queue } from "bullmq";
|
|
4
|
-
|
|
5
|
-
//#region src/queue-manager.ts
|
|
6
|
-
var QueueManager = class {
|
|
7
|
-
constructor(connection, config) {
|
|
8
|
-
this.queues = /* @__PURE__ */ new Map();
|
|
9
|
-
this.connection = connection;
|
|
10
|
-
this.config = config;
|
|
11
|
-
}
|
|
12
|
-
getQueue(queueName) {
|
|
13
|
-
if (!this.queues.has(queueName)) {
|
|
14
|
-
const queue$1 = new Queue(queueName, {
|
|
15
|
-
connection: this.connection,
|
|
16
|
-
prefix: this.config.prefix,
|
|
17
|
-
defaultJobOptions: this.config.defaultJobOptions
|
|
18
|
-
});
|
|
19
|
-
queue$1.on("error", (err) => {
|
|
20
|
-
console.error(`[BullMQ] Queue error for ${queueName}:`, err);
|
|
21
|
-
});
|
|
22
|
-
this.queues.set(queueName, queue$1);
|
|
23
|
-
}
|
|
24
|
-
const queue = this.queues.get(queueName);
|
|
25
|
-
if (!queue) throw new QueueCreationError(queueName);
|
|
26
|
-
return queue;
|
|
27
|
-
}
|
|
28
|
-
getQueueName(topic, stepName) {
|
|
29
|
-
return `${topic}.${stepName}`;
|
|
30
|
-
}
|
|
31
|
-
async enqueueToAll(event, subscribers) {
|
|
32
|
-
const promises = subscribers.map((subscriber) => {
|
|
33
|
-
const queueName = this.getQueueName(subscriber.topic, subscriber.stepName);
|
|
34
|
-
const queue = this.getQueue(queueName);
|
|
35
|
-
const jobId = event.messageGroupId ? `${queueName}.${event.messageGroupId}` : void 0;
|
|
36
|
-
const jobData = {
|
|
37
|
-
topic: event.topic,
|
|
38
|
-
data: event.data,
|
|
39
|
-
traceId: event.traceId,
|
|
40
|
-
flows: event.flows,
|
|
41
|
-
messageGroupId: event.messageGroupId
|
|
42
|
-
};
|
|
43
|
-
const maxRetries = subscriber.queueConfig?.maxRetries;
|
|
44
|
-
const attempts = maxRetries != null ? maxRetries + 1 : this.config.defaultJobOptions.attempts;
|
|
45
|
-
const delay = subscriber.queueConfig?.delaySeconds ? subscriber.queueConfig.delaySeconds * MILLISECONDS_PER_SECOND : void 0;
|
|
46
|
-
const jobOptions = {
|
|
47
|
-
jobId,
|
|
48
|
-
attempts,
|
|
49
|
-
backoff: this.config.defaultJobOptions.backoff,
|
|
50
|
-
delay
|
|
51
|
-
};
|
|
52
|
-
return queue.add(event.topic, jobData, jobOptions).then(() => void 0);
|
|
53
|
-
});
|
|
54
|
-
await Promise.all(promises);
|
|
55
|
-
}
|
|
56
|
-
async closeQueue(queueName) {
|
|
57
|
-
const queue = this.queues.get(queueName);
|
|
58
|
-
if (queue) {
|
|
59
|
-
await queue.close();
|
|
60
|
-
this.queues.delete(queueName);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
async closeAll() {
|
|
64
|
-
const promises = Array.from(this.queues.values()).map((queue) => queue.close().catch((err) => {
|
|
65
|
-
console.error(`[BullMQ] Error closing queue:`, err);
|
|
66
|
-
}));
|
|
67
|
-
await Promise.allSettled(promises);
|
|
68
|
-
this.queues.clear();
|
|
69
|
-
}
|
|
70
|
-
listQueueNames() {
|
|
71
|
-
return Array.from(this.queues.keys());
|
|
72
|
-
}
|
|
73
|
-
getPrefix() {
|
|
74
|
-
return this.config.prefix;
|
|
75
|
-
}
|
|
76
|
-
getConnection() {
|
|
77
|
-
return this.connection;
|
|
78
|
-
}
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
//#endregion
|
|
82
|
-
export { QueueManager };
|
|
83
|
-
//# sourceMappingURL=queue-manager.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"queue-manager.mjs","names":["queue"],"sources":["../src/queue-manager.ts"],"sourcesContent":["import type { Event } from '@motiadev/core'\nimport { Queue } from 'bullmq'\nimport type { Redis } from 'ioredis'\nimport type { MergedConfig } from './config-builder'\nimport { MILLISECONDS_PER_SECOND } from './constants'\nimport { QueueCreationError } from './errors'\nimport type { SubscriberInfo } from './worker-manager'\n\nexport class QueueManager {\n private readonly queues: Map<string, Queue> = new Map()\n private readonly connection: Redis\n private readonly config: MergedConfig\n\n constructor(connection: Redis, config: MergedConfig) {\n this.connection = connection\n this.config = config\n }\n\n getQueue(queueName: string): Queue {\n if (!this.queues.has(queueName)) {\n const queue = new Queue(queueName, {\n connection: this.connection,\n prefix: this.config.prefix,\n defaultJobOptions: this.config.defaultJobOptions,\n })\n\n queue.on('error', (err: Error) => {\n console.error(`[BullMQ] Queue error for ${queueName}:`, err)\n })\n\n this.queues.set(queueName, queue)\n }\n\n const queue = this.queues.get(queueName)\n if (!queue) {\n throw new QueueCreationError(queueName)\n }\n return queue\n }\n\n getQueueName(topic: string, stepName: string): string {\n return `${topic}.${stepName}`\n }\n\n async enqueueToAll<TData>(event: Event<TData>, subscribers: SubscriberInfo[]): Promise<void> {\n const promises = subscribers.map((subscriber) => {\n const queueName = this.getQueueName(subscriber.topic, subscriber.stepName)\n const queue = this.getQueue(queueName)\n const jobId = event.messageGroupId ? `${queueName}.${event.messageGroupId}` : undefined\n\n const jobData = {\n topic: event.topic,\n data: event.data,\n traceId: event.traceId,\n flows: event.flows,\n messageGroupId: event.messageGroupId,\n }\n\n const maxRetries = subscriber.queueConfig?.maxRetries\n const attempts = maxRetries != null ? maxRetries + 1 : this.config.defaultJobOptions.attempts\n const delay = subscriber.queueConfig?.delaySeconds\n ? subscriber.queueConfig.delaySeconds * MILLISECONDS_PER_SECOND\n : undefined\n\n const jobOptions = {\n jobId,\n attempts,\n backoff: this.config.defaultJobOptions.backoff,\n delay,\n }\n\n return queue.add(event.topic, jobData, jobOptions).then(() => undefined)\n })\n\n await Promise.all(promises)\n }\n\n async closeQueue(queueName: string): Promise<void> {\n const queue = this.queues.get(queueName)\n if (queue) {\n await queue.close()\n this.queues.delete(queueName)\n }\n }\n\n async closeAll(): Promise<void> {\n const promises = Array.from(this.queues.values()).map((queue) =>\n queue.close().catch((err) => {\n console.error(`[BullMQ] Error closing queue:`, err)\n }),\n )\n await Promise.allSettled(promises)\n this.queues.clear()\n }\n\n listQueueNames(): string[] {\n return Array.from(this.queues.keys())\n }\n\n getPrefix(): string {\n return this.config.prefix\n }\n\n getConnection(): Redis {\n return this.connection\n }\n}\n"],"mappings":";;;;;AAQA,IAAa,eAAb,MAA0B;CAKxB,YAAY,YAAmB,QAAsB;gCAJP,IAAI,KAAK;AAKrD,OAAK,aAAa;AAClB,OAAK,SAAS;;CAGhB,SAAS,WAA0B;AACjC,MAAI,CAAC,KAAK,OAAO,IAAI,UAAU,EAAE;GAC/B,MAAMA,UAAQ,IAAI,MAAM,WAAW;IACjC,YAAY,KAAK;IACjB,QAAQ,KAAK,OAAO;IACpB,mBAAmB,KAAK,OAAO;IAChC,CAAC;AAEF,WAAM,GAAG,UAAU,QAAe;AAChC,YAAQ,MAAM,4BAA4B,UAAU,IAAI,IAAI;KAC5D;AAEF,QAAK,OAAO,IAAI,WAAWA,QAAM;;EAGnC,MAAM,QAAQ,KAAK,OAAO,IAAI,UAAU;AACxC,MAAI,CAAC,MACH,OAAM,IAAI,mBAAmB,UAAU;AAEzC,SAAO;;CAGT,aAAa,OAAe,UAA0B;AACpD,SAAO,GAAG,MAAM,GAAG;;CAGrB,MAAM,aAAoB,OAAqB,aAA8C;EAC3F,MAAM,WAAW,YAAY,KAAK,eAAe;GAC/C,MAAM,YAAY,KAAK,aAAa,WAAW,OAAO,WAAW,SAAS;GAC1E,MAAM,QAAQ,KAAK,SAAS,UAAU;GACtC,MAAM,QAAQ,MAAM,iBAAiB,GAAG,UAAU,GAAG,MAAM,mBAAmB;GAE9E,MAAM,UAAU;IACd,OAAO,MAAM;IACb,MAAM,MAAM;IACZ,SAAS,MAAM;IACf,OAAO,MAAM;IACb,gBAAgB,MAAM;IACvB;GAED,MAAM,aAAa,WAAW,aAAa;GAC3C,MAAM,WAAW,cAAc,OAAO,aAAa,IAAI,KAAK,OAAO,kBAAkB;GACrF,MAAM,QAAQ,WAAW,aAAa,eAClC,WAAW,YAAY,eAAe,0BACtC;GAEJ,MAAM,aAAa;IACjB;IACA;IACA,SAAS,KAAK,OAAO,kBAAkB;IACvC;IACD;AAED,UAAO,MAAM,IAAI,MAAM,OAAO,SAAS,WAAW,CAAC,WAAW,OAAU;IACxE;AAEF,QAAM,QAAQ,IAAI,SAAS;;CAG7B,MAAM,WAAW,WAAkC;EACjD,MAAM,QAAQ,KAAK,OAAO,IAAI,UAAU;AACxC,MAAI,OAAO;AACT,SAAM,MAAM,OAAO;AACnB,QAAK,OAAO,OAAO,UAAU;;;CAIjC,MAAM,WAA0B;EAC9B,MAAM,WAAW,MAAM,KAAK,KAAK,OAAO,QAAQ,CAAC,CAAC,KAAK,UACrD,MAAM,OAAO,CAAC,OAAO,QAAQ;AAC3B,WAAQ,MAAM,iCAAiC,IAAI;IACnD,CACH;AACD,QAAM,QAAQ,WAAW,SAAS;AAClC,OAAK,OAAO,OAAO;;CAGrB,iBAA2B;AACzB,SAAO,MAAM,KAAK,KAAK,OAAO,MAAM,CAAC;;CAGvC,YAAoB;AAClB,SAAO,KAAK,OAAO;;CAGrB,gBAAuB;AACrB,SAAO,KAAK"}
|
package/dist/types.d.mts
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { Redis, RedisOptions } from "ioredis";
|
|
2
|
-
import { KeepJobs } from "bullmq";
|
|
3
|
-
|
|
4
|
-
//#region src/types.d.ts
|
|
5
|
-
type BullMQConnectionConfig = Redis | RedisOptions;
|
|
6
|
-
interface BullMQEventAdapterConfig {
|
|
7
|
-
connection: BullMQConnectionConfig;
|
|
8
|
-
concurrency?: number;
|
|
9
|
-
defaultJobOptions?: {
|
|
10
|
-
attempts?: number;
|
|
11
|
-
backoff?: {
|
|
12
|
-
type: 'fixed' | 'exponential';
|
|
13
|
-
delay: number;
|
|
14
|
-
};
|
|
15
|
-
removeOnComplete?: KeepJobs;
|
|
16
|
-
removeOnFail?: KeepJobs;
|
|
17
|
-
};
|
|
18
|
-
prefix?: string;
|
|
19
|
-
dlq?: {
|
|
20
|
-
enabled?: boolean;
|
|
21
|
-
ttl?: number;
|
|
22
|
-
suffix?: string;
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
//#endregion
|
|
26
|
-
export { BullMQConnectionConfig, BullMQEventAdapterConfig };
|
|
27
|
-
//# sourceMappingURL=types.d.mts.map
|
package/dist/types.d.mts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.mts","names":[],"sources":["../src/types.ts"],"sourcesContent":[],"mappings":";;;;KAGY,sBAAA,GAAyB,QAAQ;UAE5B,wBAAA;EAFL,UAAA,EAGE,sBAHoB;EAEjB,WAAA,CAAA,EAAA,MAAA;EACH,iBAAA,CAAA,EAAA;IAQS,QAAA,CAAA,EAAA,MAAA;IACJ,OAAA,CAAA,EAAA;MAAQ,IAAA,EAAA,OAAA,GAAA,aAAA;;;uBADJ;mBACJ"}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { MergedConfig } from "./config-builder.mjs";
|
|
2
|
-
import { DLQManager } from "./dlq-manager.mjs";
|
|
3
|
-
import { Redis } from "ioredis";
|
|
4
|
-
import { Worker } from "bullmq";
|
|
5
|
-
import { Event, QueueConfig, SubscriptionHandle } from "@motiadev/core";
|
|
6
|
-
|
|
7
|
-
//#region src/worker-manager.d.ts
|
|
8
|
-
type SubscriberInfo = {
|
|
9
|
-
topic: string;
|
|
10
|
-
stepName: string;
|
|
11
|
-
queueConfig?: QueueConfig;
|
|
12
|
-
};
|
|
13
|
-
type WorkerInfo = {
|
|
14
|
-
worker: Worker;
|
|
15
|
-
topic: string;
|
|
16
|
-
stepName: string;
|
|
17
|
-
handle: SubscriptionHandle;
|
|
18
|
-
queueConfig?: QueueConfig;
|
|
19
|
-
};
|
|
20
|
-
declare class WorkerManager {
|
|
21
|
-
private readonly workers;
|
|
22
|
-
private readonly topicSubscriptions;
|
|
23
|
-
private readonly connection;
|
|
24
|
-
private readonly config;
|
|
25
|
-
private readonly getQueueName;
|
|
26
|
-
private readonly dlqManager;
|
|
27
|
-
constructor(connection: Redis, config: MergedConfig, getQueueName: (topic: string, stepName: string) => string, dlqManager?: DLQManager);
|
|
28
|
-
createWorker<TData>(topic: string, stepName: string, handler: (event: Event<TData>) => void | Promise<void>, options?: QueueConfig): SubscriptionHandle;
|
|
29
|
-
getSubscribers(topic: string): SubscriberInfo[];
|
|
30
|
-
getWorkerInfo(id: string): WorkerInfo | undefined;
|
|
31
|
-
removeWorker(id: string): Promise<void>;
|
|
32
|
-
closeAll(): Promise<void>;
|
|
33
|
-
getSubscriptionCount(topic: string): number;
|
|
34
|
-
listTopics(): string[];
|
|
35
|
-
private addTopicSubscription;
|
|
36
|
-
private removeTopicSubscription;
|
|
37
|
-
private setupWorkerHandlers;
|
|
38
|
-
}
|
|
39
|
-
//#endregion
|
|
40
|
-
export { SubscriberInfo, WorkerManager };
|
|
41
|
-
//# sourceMappingURL=worker-manager.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"worker-manager.d.mts","names":[],"sources":["../src/worker-manager.ts"],"sourcesContent":[],"mappings":";;;;;;;KASY,cAAA;;EAAA,QAAA,EAAA,MAAA;EAMP,WAAA,CAAA,EAHW,WAGD;CACL;KADL,UAAA,GAIK;EACM,MAAA,EAJN,MAIM;EAAW,KAAA,EAAA,MAAA;EAWd,QAAA,EAAA,MAAa;EASV,MAAA,EArBN,kBAqBM;EACJ,WAAA,CAAA,EArBI,WAqBJ;CAEK;AAWU,cAvBd,aAAA,CAuBc;EAAN,iBAAA,OAAA;EAAwB,iBAAA,kBAAA;EAC/B,iBAAA,UAAA;EACT,iBAAA,MAAA;EAuD4B,iBAAA,YAAA;EAYJ,iBAAA,UAAA;EAIK,WAAA,CAAA,UAAA,EAvFlB,KAuFkB,EAAA,MAAA,EAtFtB,YAsFsB,EAAA,YAAA,EAAA,CAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,MAAA,EAAA,GAAA,MAAA,EAAA,UAAA,CAAA,EApFjB,UAoFiB;EAWd,YAAA,CAAA,KAAA,CAAA,CAAA,KAAA,EAAA,MAAA,EAAA,QAAA,EAAA,MAAA,EAAA,OAAA,EAAA,CAAA,KAAA,EApFC,KAoFD,CApFO,KAoFP,CAAA,EAAA,GAAA,IAAA,GApFyB,OAoFzB,CAAA,IAAA,CAAA,EAAA,OAAA,CAAA,EAnFN,WAmFM,CAAA,EAlFf,kBAkFe;EAAO,cAAA,CAAA,KAAA,EAAA,MAAA,CAAA,EA3BM,cA2BN,EAAA;6BAfE;4BAIK;cAWd"}
|
package/dist/worker-manager.mjs
DELETED
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
import { FIFO_CONCURRENCY, MILLISECONDS_PER_SECOND } from "./constants.mjs";
|
|
2
|
-
import { WorkerCreationError } from "./errors.mjs";
|
|
3
|
-
import { Worker } from "bullmq";
|
|
4
|
-
import { v4 } from "uuid";
|
|
5
|
-
|
|
6
|
-
//#region src/worker-manager.ts
|
|
7
|
-
var WorkerManager = class {
|
|
8
|
-
constructor(connection, config, getQueueName, dlqManager) {
|
|
9
|
-
this.workers = /* @__PURE__ */ new Map();
|
|
10
|
-
this.topicSubscriptions = /* @__PURE__ */ new Map();
|
|
11
|
-
this.connection = connection;
|
|
12
|
-
this.config = config;
|
|
13
|
-
this.getQueueName = getQueueName;
|
|
14
|
-
this.dlqManager = dlqManager ?? null;
|
|
15
|
-
}
|
|
16
|
-
createWorker(topic, stepName, handler, options) {
|
|
17
|
-
const id = v4();
|
|
18
|
-
const queueName = this.getQueueName(topic, stepName);
|
|
19
|
-
this.addTopicSubscription(topic, id);
|
|
20
|
-
const concurrency = options?.type === "fifo" ? FIFO_CONCURRENCY : this.config.concurrency;
|
|
21
|
-
const attempts = options?.maxRetries != null ? options.maxRetries + 1 : this.config.defaultJobOptions.attempts;
|
|
22
|
-
const lockDuration = options?.visibilityTimeout ? options.visibilityTimeout * MILLISECONDS_PER_SECOND : void 0;
|
|
23
|
-
const worker = new Worker(queueName, async (job) => {
|
|
24
|
-
const eventData = job.data;
|
|
25
|
-
await handler({
|
|
26
|
-
topic: eventData.topic,
|
|
27
|
-
data: eventData.data,
|
|
28
|
-
traceId: eventData.traceId,
|
|
29
|
-
flows: eventData.flows,
|
|
30
|
-
messageGroupId: eventData.messageGroupId
|
|
31
|
-
});
|
|
32
|
-
}, {
|
|
33
|
-
connection: this.connection,
|
|
34
|
-
prefix: this.config.prefix,
|
|
35
|
-
concurrency,
|
|
36
|
-
lockDuration,
|
|
37
|
-
removeOnComplete: this.config.defaultJobOptions.removeOnComplete,
|
|
38
|
-
removeOnFail: this.config.defaultJobOptions.removeOnFail
|
|
39
|
-
});
|
|
40
|
-
this.setupWorkerHandlers(worker, topic, stepName, attempts ?? 3);
|
|
41
|
-
const handle = {
|
|
42
|
-
topic,
|
|
43
|
-
id,
|
|
44
|
-
unsubscribe: async () => {
|
|
45
|
-
await this.removeWorker(handle.id);
|
|
46
|
-
}
|
|
47
|
-
};
|
|
48
|
-
const workerInfo = {
|
|
49
|
-
worker,
|
|
50
|
-
topic,
|
|
51
|
-
stepName,
|
|
52
|
-
handle,
|
|
53
|
-
queueConfig: options
|
|
54
|
-
};
|
|
55
|
-
this.workers.set(id, workerInfo);
|
|
56
|
-
return handle;
|
|
57
|
-
}
|
|
58
|
-
getSubscribers(topic) {
|
|
59
|
-
const subscriptionIds = this.topicSubscriptions.get(topic);
|
|
60
|
-
if (!subscriptionIds || subscriptionIds.size === 0) return [];
|
|
61
|
-
return Array.from(subscriptionIds).map((id) => this.workers.get(id)).filter((info) => info !== void 0).map((info) => ({
|
|
62
|
-
topic: info.topic,
|
|
63
|
-
stepName: info.stepName,
|
|
64
|
-
queueConfig: info.queueConfig
|
|
65
|
-
}));
|
|
66
|
-
}
|
|
67
|
-
getWorkerInfo(id) {
|
|
68
|
-
return this.workers.get(id);
|
|
69
|
-
}
|
|
70
|
-
async removeWorker(id) {
|
|
71
|
-
const workerInfo = this.workers.get(id);
|
|
72
|
-
if (!workerInfo) return;
|
|
73
|
-
this.removeTopicSubscription(workerInfo.topic, id);
|
|
74
|
-
await workerInfo.worker.close();
|
|
75
|
-
this.workers.delete(id);
|
|
76
|
-
}
|
|
77
|
-
async closeAll() {
|
|
78
|
-
const promises = Array.from(this.workers.values()).map((info) => info.worker.close().catch((err) => {
|
|
79
|
-
console.error(`[BullMQ] Error closing worker for topic ${info.topic}, step ${info.stepName}:`, err);
|
|
80
|
-
}));
|
|
81
|
-
await Promise.allSettled(promises);
|
|
82
|
-
this.workers.clear();
|
|
83
|
-
this.topicSubscriptions.clear();
|
|
84
|
-
}
|
|
85
|
-
getSubscriptionCount(topic) {
|
|
86
|
-
return Array.from(this.workers.values()).filter((w) => w.topic === topic).length;
|
|
87
|
-
}
|
|
88
|
-
listTopics() {
|
|
89
|
-
return Array.from(new Set(Array.from(this.workers.values()).map((w) => w.topic)));
|
|
90
|
-
}
|
|
91
|
-
addTopicSubscription(topic, id) {
|
|
92
|
-
if (!this.topicSubscriptions.has(topic)) this.topicSubscriptions.set(topic, /* @__PURE__ */ new Set());
|
|
93
|
-
this.topicSubscriptions.get(topic)?.add(id);
|
|
94
|
-
}
|
|
95
|
-
removeTopicSubscription(topic, id) {
|
|
96
|
-
const subscriptions = this.topicSubscriptions.get(topic);
|
|
97
|
-
if (subscriptions) {
|
|
98
|
-
subscriptions.delete(id);
|
|
99
|
-
if (subscriptions.size === 0) this.topicSubscriptions.delete(topic);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
setupWorkerHandlers(worker, topic, stepName, attempts) {
|
|
103
|
-
worker.on("error", (err) => {
|
|
104
|
-
const error = new WorkerCreationError(topic, stepName, err);
|
|
105
|
-
console.error(`[BullMQ] Worker error for topic ${topic}, step ${stepName}:`, error);
|
|
106
|
-
});
|
|
107
|
-
worker.on("failed", async (job, err) => {
|
|
108
|
-
if (job) {
|
|
109
|
-
const attemptsMade = job.attemptsMade || 0;
|
|
110
|
-
if (attemptsMade >= attempts) {
|
|
111
|
-
if (this.dlqManager) {
|
|
112
|
-
const eventData = job.data;
|
|
113
|
-
const event = {
|
|
114
|
-
topic: eventData.topic || topic,
|
|
115
|
-
data: eventData.data,
|
|
116
|
-
traceId: eventData.traceId || "unknown",
|
|
117
|
-
...eventData.flows && { flows: eventData.flows },
|
|
118
|
-
...eventData.messageGroupId && { messageGroupId: eventData.messageGroupId }
|
|
119
|
-
};
|
|
120
|
-
await this.dlqManager.moveToDLQ(topic, stepName, event, err, attemptsMade, job.id);
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
});
|
|
125
|
-
}
|
|
126
|
-
};
|
|
127
|
-
|
|
128
|
-
//#endregion
|
|
129
|
-
export { WorkerManager };
|
|
130
|
-
//# sourceMappingURL=worker-manager.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"worker-manager.mjs","names":["uuidv4","handle: SubscriptionHandle","workerInfo: WorkerInfo"],"sources":["../src/worker-manager.ts"],"sourcesContent":["import type { Event, QueueConfig, SubscriptionHandle } from '@motiadev/core'\nimport { type Job, Worker } from 'bullmq'\nimport type { Redis } from 'ioredis'\nimport { v4 as uuidv4 } from 'uuid'\nimport type { MergedConfig } from './config-builder'\nimport { FIFO_CONCURRENCY, MILLISECONDS_PER_SECOND } from './constants'\nimport type { DLQManager } from './dlq-manager'\nimport { WorkerCreationError } from './errors'\n\nexport type SubscriberInfo = {\n topic: string\n stepName: string\n queueConfig?: QueueConfig\n}\n\ntype WorkerInfo = {\n worker: Worker\n topic: string\n stepName: string\n handle: SubscriptionHandle\n queueConfig?: QueueConfig\n}\n\ntype JobData<TData> = {\n topic: string\n data: TData\n traceId: string\n flows?: string[]\n messageGroupId?: string\n}\n\nexport class WorkerManager {\n private readonly workers: Map<string, WorkerInfo> = new Map()\n private readonly topicSubscriptions: Map<string, Set<string>> = new Map()\n private readonly connection: Redis\n private readonly config: MergedConfig\n private readonly getQueueName: (topic: string, stepName: string) => string\n private readonly dlqManager: DLQManager | null\n\n constructor(\n connection: Redis,\n config: MergedConfig,\n getQueueName: (topic: string, stepName: string) => string,\n dlqManager?: DLQManager,\n ) {\n this.connection = connection\n this.config = config\n this.getQueueName = getQueueName\n this.dlqManager = dlqManager ?? null\n }\n\n createWorker<TData>(\n topic: string,\n stepName: string,\n handler: (event: Event<TData>) => void | Promise<void>,\n options?: QueueConfig,\n ): SubscriptionHandle {\n const id = uuidv4()\n const queueName = this.getQueueName(topic, stepName)\n\n this.addTopicSubscription(topic, id)\n\n const concurrency = options?.type === 'fifo' ? FIFO_CONCURRENCY : this.config.concurrency\n const attempts = options?.maxRetries != null ? options.maxRetries + 1 : this.config.defaultJobOptions.attempts\n const lockDuration = options?.visibilityTimeout ? options.visibilityTimeout * MILLISECONDS_PER_SECOND : undefined\n\n const worker = new Worker(\n queueName,\n async (job: Job<JobData<TData>>) => {\n const eventData = job.data\n const event = {\n topic: eventData.topic,\n data: eventData.data,\n traceId: eventData.traceId,\n flows: eventData.flows,\n messageGroupId: eventData.messageGroupId,\n } as Event<TData>\n await handler(event)\n },\n {\n connection: this.connection,\n prefix: this.config.prefix,\n concurrency,\n lockDuration,\n removeOnComplete: this.config.defaultJobOptions.removeOnComplete,\n removeOnFail: this.config.defaultJobOptions.removeOnFail,\n },\n )\n\n this.setupWorkerHandlers(worker, topic, stepName, attempts ?? 3)\n\n const handle: SubscriptionHandle = {\n topic,\n id,\n unsubscribe: async () => {\n await this.removeWorker(handle.id)\n },\n }\n\n const workerInfo: WorkerInfo = {\n worker,\n topic,\n stepName,\n handle,\n queueConfig: options,\n }\n\n this.workers.set(id, workerInfo)\n return handle\n }\n\n getSubscribers(topic: string): SubscriberInfo[] {\n const subscriptionIds = this.topicSubscriptions.get(topic)\n if (!subscriptionIds || subscriptionIds.size === 0) {\n return []\n }\n\n return Array.from(subscriptionIds)\n .map((id) => this.workers.get(id))\n .filter((info): info is WorkerInfo => info !== undefined)\n .map((info) => ({ topic: info.topic, stepName: info.stepName, queueConfig: info.queueConfig }))\n }\n\n getWorkerInfo(id: string): WorkerInfo | undefined {\n return this.workers.get(id)\n }\n\n async removeWorker(id: string): Promise<void> {\n const workerInfo = this.workers.get(id)\n if (!workerInfo) {\n return\n }\n\n this.removeTopicSubscription(workerInfo.topic, id)\n await workerInfo.worker.close()\n this.workers.delete(id)\n }\n\n async closeAll(): Promise<void> {\n const promises = Array.from(this.workers.values()).map((info) =>\n info.worker.close().catch((err) => {\n console.error(`[BullMQ] Error closing worker for topic ${info.topic}, step ${info.stepName}:`, err)\n }),\n )\n await Promise.allSettled(promises)\n this.workers.clear()\n this.topicSubscriptions.clear()\n }\n\n getSubscriptionCount(topic: string): number {\n return Array.from(this.workers.values()).filter((w) => w.topic === topic).length\n }\n\n listTopics(): string[] {\n return Array.from(new Set(Array.from(this.workers.values()).map((w) => w.topic)))\n }\n\n private addTopicSubscription(topic: string, id: string): void {\n if (!this.topicSubscriptions.has(topic)) {\n this.topicSubscriptions.set(topic, new Set())\n }\n this.topicSubscriptions.get(topic)?.add(id)\n }\n\n private removeTopicSubscription(topic: string, id: string): void {\n const subscriptions = this.topicSubscriptions.get(topic)\n if (subscriptions) {\n subscriptions.delete(id)\n if (subscriptions.size === 0) {\n this.topicSubscriptions.delete(topic)\n }\n }\n }\n\n private setupWorkerHandlers(worker: Worker, topic: string, stepName: string, attempts: number): void {\n worker.on('error', (err: Error) => {\n const error = new WorkerCreationError(topic, stepName, err)\n console.error(`[BullMQ] Worker error for topic ${topic}, step ${stepName}:`, error)\n })\n worker.on('failed', async (job: Job<JobData<unknown>> | undefined, err: Error) => {\n if (job) {\n const attemptsMade = job.attemptsMade || 0\n if (attemptsMade >= attempts) {\n if (this.dlqManager) {\n const eventData = job.data\n const event = {\n topic: eventData.topic || topic,\n data: eventData.data,\n traceId: eventData.traceId || 'unknown',\n ...(eventData.flows && { flows: eventData.flows }),\n ...(eventData.messageGroupId && { messageGroupId: eventData.messageGroupId }),\n } as Event<unknown>\n\n await this.dlqManager.moveToDLQ(topic, stepName, event, err, attemptsMade, job.id)\n }\n }\n }\n })\n }\n}\n"],"mappings":"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"}
|
package/tsdown.config.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { defineConfig } from 'tsdown'
|
|
2
|
-
|
|
3
|
-
export default defineConfig({
|
|
4
|
-
entry: {
|
|
5
|
-
index: './src/index.ts',
|
|
6
|
-
},
|
|
7
|
-
format: 'esm',
|
|
8
|
-
platform: 'node',
|
|
9
|
-
external: ['@motiadev/core', 'bullmq', 'ioredis', 'uuid'],
|
|
10
|
-
dts: {
|
|
11
|
-
build: true,
|
|
12
|
-
},
|
|
13
|
-
clean: true,
|
|
14
|
-
outDir: 'dist',
|
|
15
|
-
sourcemap: true,
|
|
16
|
-
unbundle: true,
|
|
17
|
-
})
|