enqiu 0.1.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.
@@ -0,0 +1,202 @@
1
+ import type { AddOptions, BackoffOptions, JobInput, JobLogEntry, JobMap, JobName, JobOutput, JobSnapshot, JobStatus, QueueEventMap, QueueOptions, QueueStats, SerializedError } from "./memory.js";
2
+ export interface RedisCommandClient {
3
+ /** Bun's native RedisClient shape. */
4
+ send?(command: string, arguments_: string[]): Promise<unknown>;
5
+ /** node-redis and compatible clients. */
6
+ sendCommand?(arguments_: string[]): Promise<unknown>;
7
+ }
8
+ export interface RedisDriverOptions {
9
+ /** Redis key namespace. @default "enqiu" */
10
+ prefix?: string;
11
+ /** Worker polling interval in milliseconds. @default 100 */
12
+ pollInterval?: number;
13
+ /** Time before work owned by a dead worker is reclaimed. @default 30000 */
14
+ visibilityTimeout?: number;
15
+ /** Terminal job metadata retention in milliseconds. @default 604800000 */
16
+ retention?: number;
17
+ }
18
+ export interface RedisDriver {
19
+ readonly kind: "redis";
20
+ readonly client: RedisCommandClient;
21
+ readonly prefix: string;
22
+ readonly pollInterval: number;
23
+ readonly visibilityTimeout: number;
24
+ readonly retention: number;
25
+ }
26
+ export interface RedisRetryOptions {
27
+ retries: number;
28
+ backoff?: number | BackoffOptions;
29
+ }
30
+ export interface RedisAddOptions extends Omit<AddOptions, "retry"> {
31
+ retry?: number | RedisRetryOptions;
32
+ }
33
+ export interface RedisQueueOptions extends Omit<QueueOptions, "retry"> {
34
+ driver: RedisDriver;
35
+ /**
36
+ * Start a local worker for these handlers. Set `false` in producer-only
37
+ * processes. @default true
38
+ */
39
+ worker?: boolean;
40
+ retry?: number | RedisRetryOptions;
41
+ }
42
+ export interface RedisJob<Output = unknown, Input = unknown, Name extends string = string> {
43
+ readonly id: string;
44
+ readonly name: Name;
45
+ readonly input: Input;
46
+ readonly status: JobStatus;
47
+ readonly deduplicated: boolean;
48
+ /** Resolves after Redis atomically accepts the job. */
49
+ readonly accepted: Promise<void>;
50
+ readonly result: Promise<Output>;
51
+ cancel(reason?: string): Promise<boolean>;
52
+ refresh(): Promise<JobSnapshot<Input, Output, Name>>;
53
+ }
54
+ export interface RedisQueueEventMap extends QueueEventMap {
55
+ error: Error;
56
+ recovered: JobSnapshot;
57
+ }
58
+ export interface RedisListOptions {
59
+ status?: JobStatus;
60
+ name?: string;
61
+ before?: number;
62
+ after?: number;
63
+ limit?: number;
64
+ cursor?: string;
65
+ }
66
+ export interface RedisListPage {
67
+ jobs: JobSnapshot[];
68
+ cursor?: string;
69
+ }
70
+ export interface RedisScheduleRegistration {
71
+ id?: string;
72
+ jobName: string;
73
+ cron: string;
74
+ timezone?: string;
75
+ input: unknown;
76
+ catchUp?: boolean;
77
+ submit: RedisAddOptions;
78
+ }
79
+ export interface RedisScheduleSnapshot {
80
+ id: string;
81
+ jobName: string;
82
+ cron: string;
83
+ timezone: string;
84
+ status: "active" | "paused";
85
+ nextRunAt: number;
86
+ input: unknown;
87
+ catchUp: boolean;
88
+ }
89
+ export interface RedisScheduleHandle {
90
+ readonly id: string;
91
+ readonly nextRunAt: number;
92
+ pause(): Promise<void>;
93
+ resume(): Promise<void>;
94
+ remove(): Promise<void>;
95
+ refresh(): Promise<RedisScheduleSnapshot>;
96
+ }
97
+ interface RedisJobRecord {
98
+ id: string;
99
+ name: string;
100
+ input: unknown;
101
+ status: JobStatus;
102
+ priority: number;
103
+ attempt: number;
104
+ retry: NormalizedRedisRetry;
105
+ timeout: number | undefined;
106
+ expiresAt: number | undefined;
107
+ keyRetention: number;
108
+ concurrency: RedisAddOptions["concurrency"];
109
+ throttle: RedisAddOptions["throttle"];
110
+ debounce: RedisAddOptions["debounce"];
111
+ createdAt: number;
112
+ runAt: number;
113
+ startedAt: number | undefined;
114
+ finishedAt: number | undefined;
115
+ progress: unknown;
116
+ output: unknown;
117
+ error: SerializedError | undefined;
118
+ logs: JobLogEntry[];
119
+ deduplicated: boolean;
120
+ submission: Promise<void>;
121
+ submissionError: Error | undefined;
122
+ }
123
+ interface NormalizedRedisRetry {
124
+ retries: number;
125
+ backoff: number | BackoffOptions | undefined;
126
+ }
127
+ export declare function redis(client: RedisCommandClient, options?: RedisDriverOptions): RedisDriver;
128
+ export declare class RedisQueue<Jobs extends JobMap> {
129
+ readonly name: string;
130
+ private readonly handlers;
131
+ private readonly driver;
132
+ private readonly workerEnabled;
133
+ private concurrency;
134
+ private readonly retry;
135
+ private readonly timeout;
136
+ private readonly rateLimit;
137
+ private readonly historyLimit;
138
+ private readonly logLimit;
139
+ private readonly keys;
140
+ private readonly local;
141
+ private readonly listeners;
142
+ private readonly running;
143
+ private started;
144
+ private closed;
145
+ private workerLoop;
146
+ private eventLoop;
147
+ private eventCursor;
148
+ private sequence;
149
+ constructor(handlers: Jobs, options: RedisQueueOptions);
150
+ add<Name extends JobName<Jobs>>(name: Name, input: JobInput<Jobs, Name>, options?: RedisAddOptions): RedisJob<JobOutput<Jobs, Name>, JobInput<Jobs, Name>, Name>;
151
+ addMany<Name extends JobName<Jobs>>(name: Name, inputs: readonly JobInput<Jobs, Name>[], options?: RedisAddOptions): Array<RedisJob<JobOutput<Jobs, Name>, JobInput<Jobs, Name>, Name>>;
152
+ get(id: string): Promise<JobSnapshot | undefined>;
153
+ list(options?: RedisListOptions): Promise<RedisListPage>;
154
+ cleanup(options?: {
155
+ status?: JobStatus | readonly JobStatus[];
156
+ olderThan?: number;
157
+ limit?: number;
158
+ }): Promise<string[]>;
159
+ redrive(id: string): Promise<RedisJob<unknown>>;
160
+ pauseQueue(): Promise<void>;
161
+ resumeQueue(): Promise<void>;
162
+ setGlobalConcurrency(limit: number): Promise<void>;
163
+ upsertSchedule(registration: RedisScheduleRegistration): Promise<RedisScheduleHandle>;
164
+ getSchedule(id: string): Promise<RedisScheduleSnapshot | undefined>;
165
+ pauseSchedule(id: string): Promise<void>;
166
+ resumeSchedule(id: string): Promise<number>;
167
+ removeSchedule(id: string): Promise<void>;
168
+ cancel(id: string, reason?: string): Promise<boolean>;
169
+ stats(): Promise<QueueStats>;
170
+ pause(): this;
171
+ start(): this;
172
+ setWorkerConcurrency(limit: number): void;
173
+ onIdle(): Promise<void>;
174
+ close(options?: {
175
+ drain?: boolean;
176
+ }): Promise<void>;
177
+ on<Event extends keyof RedisQueueEventMap>(event: Event, listener: (payload: RedisQueueEventMap[Event]) => void): () => void;
178
+ /** @internal */
179
+ resultFor(record: RedisJobRecord): Promise<unknown>;
180
+ private handle;
181
+ private enqueue;
182
+ private ensureWorker;
183
+ private work;
184
+ private claim;
185
+ private processSchedules;
186
+ private execute;
187
+ private heartbeat;
188
+ private complete;
189
+ private fail;
190
+ private localRecordFromClaim;
191
+ private recordFromSnapshot;
192
+ private ensureEventLoop;
193
+ private readEvents;
194
+ private hasEventListeners;
195
+ private dispatchRemoteEvent;
196
+ private publishEvent;
197
+ private command;
198
+ private eval;
199
+ private emit;
200
+ private assertOpen;
201
+ }
202
+ export {};