@trigger.dev/redis-worker 0.0.0-re2-20250321122245

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.
@@ -0,0 +1,165 @@
1
+ import { Callback, Result, RedisOptions } from '@internal/redis';
2
+ import { Logger } from '@trigger.dev/core/logger';
3
+ import { z } from 'zod';
4
+ import { Tracer } from '@internal/tracing';
5
+ import { RetryOptions } from '@trigger.dev/core/v3/schemas';
6
+ import { Registry } from 'prom-client';
7
+
8
+ interface MessageCatalogSchema {
9
+ [key: string]: z.ZodFirstPartySchemaTypes | z.ZodDiscriminatedUnion<any, any>;
10
+ }
11
+ type MessageCatalogKey<TMessageCatalog extends MessageCatalogSchema> = keyof TMessageCatalog;
12
+ type MessageCatalogValue<TMessageCatalog extends MessageCatalogSchema, TKey extends MessageCatalogKey<TMessageCatalog>> = z.infer<TMessageCatalog[TKey]>;
13
+ type AnyMessageCatalog = MessageCatalogSchema;
14
+ type QueueItem<TMessageCatalog extends MessageCatalogSchema> = {
15
+ id: string;
16
+ job: MessageCatalogKey<TMessageCatalog>;
17
+ item: MessageCatalogValue<TMessageCatalog, MessageCatalogKey<TMessageCatalog>>;
18
+ visibilityTimeoutMs: number;
19
+ attempt: number;
20
+ timestamp: Date;
21
+ };
22
+ type AnyQueueItem = {
23
+ id: string;
24
+ job: string;
25
+ item: any;
26
+ visibilityTimeoutMs: number;
27
+ attempt: number;
28
+ timestamp: Date;
29
+ };
30
+ declare class SimpleQueue<TMessageCatalog extends MessageCatalogSchema> {
31
+ #private;
32
+ name: string;
33
+ private redis;
34
+ private schema;
35
+ private logger;
36
+ constructor({ name, schema, redisOptions, logger, }: {
37
+ name: string;
38
+ schema: TMessageCatalog;
39
+ redisOptions: RedisOptions;
40
+ logger?: Logger;
41
+ });
42
+ enqueue({ id, job, item, attempt, availableAt, visibilityTimeoutMs, }: {
43
+ id?: string;
44
+ job: MessageCatalogKey<TMessageCatalog>;
45
+ item: MessageCatalogValue<TMessageCatalog, MessageCatalogKey<TMessageCatalog>>;
46
+ attempt?: number;
47
+ availableAt?: Date;
48
+ visibilityTimeoutMs: number;
49
+ }): Promise<void>;
50
+ dequeue(count?: number): Promise<Array<QueueItem<TMessageCatalog>>>;
51
+ ack(id: string): Promise<void>;
52
+ reschedule(id: string, availableAt: Date): Promise<void>;
53
+ size({ includeFuture }?: {
54
+ includeFuture?: boolean;
55
+ }): Promise<number>;
56
+ moveToDeadLetterQueue(id: string, errorMessage: string): Promise<void>;
57
+ sizeOfDeadLetterQueue(): Promise<number>;
58
+ redriveFromDeadLetterQueue(id: string): Promise<void>;
59
+ close(): Promise<void>;
60
+ }
61
+ declare module "@internal/redis" {
62
+ interface RedisCommander<Context> {
63
+ enqueueItem(queue: string, items: string, id: string, score: number, serializedItem: string, callback?: Callback<number>): Result<number, Context>;
64
+ dequeueItems(queue: string, items: string, now: number, count: number, callback?: Callback<Array<[string, string, string]>>): Result<Array<[string, string, string]>, Context>;
65
+ ackItem(queue: string, items: string, id: string, callback?: Callback<number>): Result<number, Context>;
66
+ redriveFromDeadLetterQueue(queue: string, items: string, dlq: string, dlqItems: string, id: string, callback?: Callback<number>): Result<number, Context>;
67
+ moveToDeadLetterQueue(queue: string, items: string, dlq: string, dlqItems: string, id: string, errorMessage: string, callback?: Callback<number>): Result<number, Context>;
68
+ }
69
+ }
70
+
71
+ type WorkerCatalog = {
72
+ [key: string]: {
73
+ schema: z.ZodFirstPartySchemaTypes | z.ZodDiscriminatedUnion<any, any>;
74
+ visibilityTimeoutMs: number;
75
+ retry?: RetryOptions;
76
+ };
77
+ };
78
+ type QueueCatalogFromWorkerCatalog<Catalog extends WorkerCatalog> = {
79
+ [K in keyof Catalog]: Catalog[K]["schema"];
80
+ };
81
+ type JobHandler<Catalog extends WorkerCatalog, K extends keyof Catalog> = (params: {
82
+ id: string;
83
+ payload: z.infer<Catalog[K]["schema"]>;
84
+ visibilityTimeoutMs: number;
85
+ attempt: number;
86
+ }) => Promise<void>;
87
+ type WorkerConcurrencyOptions = {
88
+ workers?: number;
89
+ tasksPerWorker?: number;
90
+ limit?: number;
91
+ };
92
+ type WorkerOptions<TCatalog extends WorkerCatalog> = {
93
+ name: string;
94
+ redisOptions: RedisOptions;
95
+ catalog: TCatalog;
96
+ jobs: {
97
+ [K in keyof TCatalog]: JobHandler<TCatalog, K>;
98
+ };
99
+ concurrency?: WorkerConcurrencyOptions;
100
+ pollIntervalMs?: number;
101
+ immediatePollIntervalMs?: number;
102
+ shutdownTimeoutMs?: number;
103
+ logger?: Logger;
104
+ tracer?: Tracer;
105
+ metrics?: {
106
+ register: Registry;
107
+ };
108
+ };
109
+ declare class Worker<TCatalog extends WorkerCatalog> {
110
+ private options;
111
+ private subscriber;
112
+ private tracer;
113
+ private metrics;
114
+ queue: SimpleQueue<QueueCatalogFromWorkerCatalog<TCatalog>>;
115
+ private jobs;
116
+ private logger;
117
+ private workerLoops;
118
+ private isShuttingDown;
119
+ private concurrency;
120
+ private shutdownTimeoutMs;
121
+ private limiter;
122
+ constructor(options: WorkerOptions<TCatalog>);
123
+ start(): this;
124
+ /**
125
+ * Enqueues a job for processing.
126
+ * @param options - The enqueue options.
127
+ * @param options.id - Optional unique identifier for the job. If not provided, one will be generated. It prevents duplication.
128
+ * @param options.job - The job type from the worker catalog.
129
+ * @param options.payload - The job payload that matches the schema defined in the catalog.
130
+ * @param options.visibilityTimeoutMs - Optional visibility timeout in milliseconds. Defaults to value from catalog.
131
+ * @param options.availableAt - Optional date when the job should become available for processing. Defaults to now.
132
+ * @returns A promise that resolves when the job is enqueued.
133
+ */
134
+ enqueue<K extends keyof TCatalog>({ id, job, payload, visibilityTimeoutMs, availableAt, }: {
135
+ id?: string;
136
+ job: K;
137
+ payload: z.infer<TCatalog[K]["schema"]>;
138
+ visibilityTimeoutMs?: number;
139
+ availableAt?: Date;
140
+ }): Promise<void>;
141
+ /**
142
+ * Reschedules an existing job to a new available date.
143
+ * If the job isn't in the queue, it will be ignored.
144
+ */
145
+ reschedule(id: string, availableAt: Date): Promise<void>;
146
+ ack(id: string): Promise<void>;
147
+ /**
148
+ * The main loop that each worker runs. It repeatedly polls for items,
149
+ * processes them, and then waits before the next iteration.
150
+ */
151
+ private runWorkerLoop;
152
+ /**
153
+ * Processes a single item.
154
+ */
155
+ private processItem;
156
+ private withHistogram;
157
+ private static delay;
158
+ private setupSubscriber;
159
+ private handleRedriveMessage;
160
+ private setupShutdownHandlers;
161
+ private shutdown;
162
+ stop(): Promise<void>;
163
+ }
164
+
165
+ export { type AnyMessageCatalog, type AnyQueueItem, type MessageCatalogKey, type MessageCatalogSchema, type MessageCatalogValue, type QueueItem, SimpleQueue, Worker, type WorkerCatalog, type WorkerConcurrencyOptions };
@@ -0,0 +1,165 @@
1
+ import { Callback, Result, RedisOptions } from '@internal/redis';
2
+ import { Logger } from '@trigger.dev/core/logger';
3
+ import { z } from 'zod';
4
+ import { Tracer } from '@internal/tracing';
5
+ import { RetryOptions } from '@trigger.dev/core/v3/schemas';
6
+ import { Registry } from 'prom-client';
7
+
8
+ interface MessageCatalogSchema {
9
+ [key: string]: z.ZodFirstPartySchemaTypes | z.ZodDiscriminatedUnion<any, any>;
10
+ }
11
+ type MessageCatalogKey<TMessageCatalog extends MessageCatalogSchema> = keyof TMessageCatalog;
12
+ type MessageCatalogValue<TMessageCatalog extends MessageCatalogSchema, TKey extends MessageCatalogKey<TMessageCatalog>> = z.infer<TMessageCatalog[TKey]>;
13
+ type AnyMessageCatalog = MessageCatalogSchema;
14
+ type QueueItem<TMessageCatalog extends MessageCatalogSchema> = {
15
+ id: string;
16
+ job: MessageCatalogKey<TMessageCatalog>;
17
+ item: MessageCatalogValue<TMessageCatalog, MessageCatalogKey<TMessageCatalog>>;
18
+ visibilityTimeoutMs: number;
19
+ attempt: number;
20
+ timestamp: Date;
21
+ };
22
+ type AnyQueueItem = {
23
+ id: string;
24
+ job: string;
25
+ item: any;
26
+ visibilityTimeoutMs: number;
27
+ attempt: number;
28
+ timestamp: Date;
29
+ };
30
+ declare class SimpleQueue<TMessageCatalog extends MessageCatalogSchema> {
31
+ #private;
32
+ name: string;
33
+ private redis;
34
+ private schema;
35
+ private logger;
36
+ constructor({ name, schema, redisOptions, logger, }: {
37
+ name: string;
38
+ schema: TMessageCatalog;
39
+ redisOptions: RedisOptions;
40
+ logger?: Logger;
41
+ });
42
+ enqueue({ id, job, item, attempt, availableAt, visibilityTimeoutMs, }: {
43
+ id?: string;
44
+ job: MessageCatalogKey<TMessageCatalog>;
45
+ item: MessageCatalogValue<TMessageCatalog, MessageCatalogKey<TMessageCatalog>>;
46
+ attempt?: number;
47
+ availableAt?: Date;
48
+ visibilityTimeoutMs: number;
49
+ }): Promise<void>;
50
+ dequeue(count?: number): Promise<Array<QueueItem<TMessageCatalog>>>;
51
+ ack(id: string): Promise<void>;
52
+ reschedule(id: string, availableAt: Date): Promise<void>;
53
+ size({ includeFuture }?: {
54
+ includeFuture?: boolean;
55
+ }): Promise<number>;
56
+ moveToDeadLetterQueue(id: string, errorMessage: string): Promise<void>;
57
+ sizeOfDeadLetterQueue(): Promise<number>;
58
+ redriveFromDeadLetterQueue(id: string): Promise<void>;
59
+ close(): Promise<void>;
60
+ }
61
+ declare module "@internal/redis" {
62
+ interface RedisCommander<Context> {
63
+ enqueueItem(queue: string, items: string, id: string, score: number, serializedItem: string, callback?: Callback<number>): Result<number, Context>;
64
+ dequeueItems(queue: string, items: string, now: number, count: number, callback?: Callback<Array<[string, string, string]>>): Result<Array<[string, string, string]>, Context>;
65
+ ackItem(queue: string, items: string, id: string, callback?: Callback<number>): Result<number, Context>;
66
+ redriveFromDeadLetterQueue(queue: string, items: string, dlq: string, dlqItems: string, id: string, callback?: Callback<number>): Result<number, Context>;
67
+ moveToDeadLetterQueue(queue: string, items: string, dlq: string, dlqItems: string, id: string, errorMessage: string, callback?: Callback<number>): Result<number, Context>;
68
+ }
69
+ }
70
+
71
+ type WorkerCatalog = {
72
+ [key: string]: {
73
+ schema: z.ZodFirstPartySchemaTypes | z.ZodDiscriminatedUnion<any, any>;
74
+ visibilityTimeoutMs: number;
75
+ retry?: RetryOptions;
76
+ };
77
+ };
78
+ type QueueCatalogFromWorkerCatalog<Catalog extends WorkerCatalog> = {
79
+ [K in keyof Catalog]: Catalog[K]["schema"];
80
+ };
81
+ type JobHandler<Catalog extends WorkerCatalog, K extends keyof Catalog> = (params: {
82
+ id: string;
83
+ payload: z.infer<Catalog[K]["schema"]>;
84
+ visibilityTimeoutMs: number;
85
+ attempt: number;
86
+ }) => Promise<void>;
87
+ type WorkerConcurrencyOptions = {
88
+ workers?: number;
89
+ tasksPerWorker?: number;
90
+ limit?: number;
91
+ };
92
+ type WorkerOptions<TCatalog extends WorkerCatalog> = {
93
+ name: string;
94
+ redisOptions: RedisOptions;
95
+ catalog: TCatalog;
96
+ jobs: {
97
+ [K in keyof TCatalog]: JobHandler<TCatalog, K>;
98
+ };
99
+ concurrency?: WorkerConcurrencyOptions;
100
+ pollIntervalMs?: number;
101
+ immediatePollIntervalMs?: number;
102
+ shutdownTimeoutMs?: number;
103
+ logger?: Logger;
104
+ tracer?: Tracer;
105
+ metrics?: {
106
+ register: Registry;
107
+ };
108
+ };
109
+ declare class Worker<TCatalog extends WorkerCatalog> {
110
+ private options;
111
+ private subscriber;
112
+ private tracer;
113
+ private metrics;
114
+ queue: SimpleQueue<QueueCatalogFromWorkerCatalog<TCatalog>>;
115
+ private jobs;
116
+ private logger;
117
+ private workerLoops;
118
+ private isShuttingDown;
119
+ private concurrency;
120
+ private shutdownTimeoutMs;
121
+ private limiter;
122
+ constructor(options: WorkerOptions<TCatalog>);
123
+ start(): this;
124
+ /**
125
+ * Enqueues a job for processing.
126
+ * @param options - The enqueue options.
127
+ * @param options.id - Optional unique identifier for the job. If not provided, one will be generated. It prevents duplication.
128
+ * @param options.job - The job type from the worker catalog.
129
+ * @param options.payload - The job payload that matches the schema defined in the catalog.
130
+ * @param options.visibilityTimeoutMs - Optional visibility timeout in milliseconds. Defaults to value from catalog.
131
+ * @param options.availableAt - Optional date when the job should become available for processing. Defaults to now.
132
+ * @returns A promise that resolves when the job is enqueued.
133
+ */
134
+ enqueue<K extends keyof TCatalog>({ id, job, payload, visibilityTimeoutMs, availableAt, }: {
135
+ id?: string;
136
+ job: K;
137
+ payload: z.infer<TCatalog[K]["schema"]>;
138
+ visibilityTimeoutMs?: number;
139
+ availableAt?: Date;
140
+ }): Promise<void>;
141
+ /**
142
+ * Reschedules an existing job to a new available date.
143
+ * If the job isn't in the queue, it will be ignored.
144
+ */
145
+ reschedule(id: string, availableAt: Date): Promise<void>;
146
+ ack(id: string): Promise<void>;
147
+ /**
148
+ * The main loop that each worker runs. It repeatedly polls for items,
149
+ * processes them, and then waits before the next iteration.
150
+ */
151
+ private runWorkerLoop;
152
+ /**
153
+ * Processes a single item.
154
+ */
155
+ private processItem;
156
+ private withHistogram;
157
+ private static delay;
158
+ private setupSubscriber;
159
+ private handleRedriveMessage;
160
+ private setupShutdownHandlers;
161
+ private shutdown;
162
+ stop(): Promise<void>;
163
+ }
164
+
165
+ export { type AnyMessageCatalog, type AnyQueueItem, type MessageCatalogKey, type MessageCatalogSchema, type MessageCatalogValue, type QueueItem, SimpleQueue, Worker, type WorkerCatalog, type WorkerConcurrencyOptions };