mail-time 4.0.0 → 5.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/index.d.cts CHANGED
@@ -4,6 +4,7 @@ export type MailTimePingResult = {
4
4
  status: string;
5
5
  code: number;
6
6
  statusCode: number;
7
+ paused?: boolean;
7
8
  error?: unknown;
8
9
  };
9
10
  export type MailTimeStorageClient = {
@@ -34,6 +35,7 @@ export type MailTimeJoSkOptions = {
34
35
  debug?: boolean;
35
36
  autoClear?: boolean;
36
37
  zombieTime?: number;
38
+ lockLeaseTime?: number;
37
39
  minRevolvingDelay?: number;
38
40
  maxRevolvingDelay?: number;
39
41
  execute?: "batch" | "one";
@@ -43,6 +45,14 @@ export type MailTimeJoSkOptions = {
43
45
  onError?: (title: string, details: object) => void;
44
46
  onExecuted?: (uid: string, details: object) => void;
45
47
  };
48
+ export type MailTimeScheduler = {
49
+ [key: string]: any;
50
+ ping: () => Promise<MailTimePingResult>;
51
+ setInterval: (func: (...args: any[]) => unknown, delay: number, uid: string) => Promise<string>;
52
+ destroy: () => boolean;
53
+ pause: (timerId?: string) => boolean;
54
+ resume: (timerId?: string) => boolean;
55
+ };
46
56
  export type MailTimeTask = {
47
57
  uuid: string;
48
58
  to?: string | string[];
@@ -94,13 +104,18 @@ export type MailTimeMailOptions = {
94
104
  export type MailTimeConcatEmailsOptions = {
95
105
  subject?: string;
96
106
  };
107
+ export type MailTimeFromDetails = {
108
+ index: number;
109
+ from: string | undefined;
110
+ };
97
111
  export type MailTimeOptions = {
98
112
  queue: RedisQueue | MongoQueue | PostgresQueue | CustomQueue;
99
113
  type?: "server" | "client";
100
- from?: string | ((transport: MailTimeTransport) => string);
114
+ from?: string | ((transport: MailTimeTransport, details: MailTimeFromDetails) => string);
101
115
  transports?: MailTimeTransport[];
102
116
  strategy?: "backup" | "balancer";
103
117
  failsToNext?: number;
118
+ shouldFailOver?: (error: unknown, info: object | undefined, email: MailTimeTask) => boolean;
104
119
  retries?: number;
105
120
  maxTries?: number;
106
121
  retryDelay?: number;
@@ -115,6 +130,10 @@ export type MailTimeOptions = {
115
130
  mode?: "one" | "batch";
116
131
  concurrency?: number;
117
132
  sendingTimeout?: number;
133
+ renewClaim?: boolean | number;
134
+ maxRenewals?: number;
135
+ strictPayload?: boolean;
136
+ allowedMailFields?: string[];
118
137
  verifyTransports?: boolean;
119
138
  template?: string;
120
139
  prefix?: string;
@@ -130,7 +149,7 @@ export type MailTimeOptions = {
130
149
  * @typedef {import('./presets.js').MailTimePresetConfig} MailTimePresetConfig
131
150
  */
132
151
  /**
133
- * @typedef {{ status: string, code: number, statusCode: number, error?: unknown }} MailTimePingResult
152
+ * @typedef {{ status: string, code: number, statusCode: number, paused?: boolean, error?: unknown }} MailTimePingResult
134
153
  */
135
154
  /**
136
155
  * @typedef {{ [key: string]: any, query?: (queryText: string, values?: unknown[]) => Promise<{ rows?: unknown[], rowCount?: number | null }> }} MailTimeStorageClient
@@ -145,7 +164,10 @@ export type MailTimeOptions = {
145
164
  * @typedef {{ [key: string]: any, type?: 'mongo' | 'redis' | 'postgres', client?: MailTimeStorageClient, db?: MailTimeMongoDb, prefix?: string, resetOnInit?: boolean, useHashTags?: boolean }} MailTimeJoSkAdapterOptions
146
165
  */
147
166
  /**
148
- * @typedef {{ [key: string]: any, adapter: MailTimeJoSkAdapterOptions | object, debug?: boolean, autoClear?: boolean, zombieTime?: number, minRevolvingDelay?: number, maxRevolvingDelay?: number, execute?: 'batch' | 'one', concurrency?: number, lockOwnerId?: string, resetOnInit?: boolean, onError?: (title: string, details: object) => void, onExecuted?: (uid: string, details: object) => void }} MailTimeJoSkOptions
167
+ * @typedef {{ [key: string]: any, adapter: MailTimeJoSkAdapterOptions | object, debug?: boolean, autoClear?: boolean, zombieTime?: number, lockLeaseTime?: number, minRevolvingDelay?: number, maxRevolvingDelay?: number, execute?: 'batch' | 'one', concurrency?: number, lockOwnerId?: string, resetOnInit?: boolean, onError?: (title: string, details: object) => void, onExecuted?: (uid: string, details: object) => void }} MailTimeJoSkOptions
168
+ */
169
+ /**
170
+ * @typedef {{ [key: string]: any, ping: () => Promise<MailTimePingResult>, setInterval: (func: (...args: any[]) => unknown, delay: number, uid: string) => Promise<string>, destroy: () => boolean, pause: (timerId?: string) => boolean, resume: (timerId?: string) => boolean }} MailTimeScheduler
149
171
  */
150
172
  /**
151
173
  * @typedef {{ uuid: string, to?: string | string[], tries: number, sendAt: number, isSent: boolean, isCancelled: boolean, isFailed: boolean, isSending?: boolean, sendingAt?: number, template?: string | false, transport: number, concatSubject?: string | false, mailOptions: MailTimeMailOptions[] }} MailTimeTask
@@ -166,12 +188,28 @@ export type MailTimeOptions = {
166
188
  * @typedef {{ subject?: string }} MailTimeConcatEmailsOptions
167
189
  */
168
190
  /**
169
- * @typedef {{ queue: RedisQueue | MongoQueue | PostgresQueue | CustomQueue, type?: 'server' | 'client', from?: string | ((transport: MailTimeTransport) => string), transports?: MailTimeTransport[], strategy?: 'backup' | 'balancer', failsToNext?: number, retries?: number, maxTries?: number, retryDelay?: number, interval?: number, keepHistory?: boolean, concatEmails?: boolean | MailTimeConcatEmailsOptions, concatSubject?: string, concatDelimiter?: string, concatDelay?: number, concatThrottling?: number, revolvingInterval?: number, mode?: 'one' | 'batch', concurrency?: number, sendingTimeout?: number, verifyTransports?: boolean, template?: string, prefix?: string, debug?: boolean, josk?: MailTimeJoSkOptions, onError?: (error: unknown, email: MailTimeTask | null, details?: object) => void, onSent?: (email: MailTimeTask, details?: object) => void }} MailTimeOptions
191
+ * @typedef {{ index: number, from: string | undefined }} MailTimeFromDetails
192
+ */
193
+ /**
194
+ * @typedef {{ queue: RedisQueue | MongoQueue | PostgresQueue | CustomQueue, type?: 'server' | 'client', from?: string | ((transport: MailTimeTransport, details: MailTimeFromDetails) => string), transports?: MailTimeTransport[], strategy?: 'backup' | 'balancer', failsToNext?: number, shouldFailOver?: (error: unknown, info: object | undefined, email: MailTimeTask) => boolean, retries?: number, maxTries?: number, retryDelay?: number, interval?: number, keepHistory?: boolean, concatEmails?: boolean | MailTimeConcatEmailsOptions, concatSubject?: string, concatDelimiter?: string, concatDelay?: number, concatThrottling?: number, revolvingInterval?: number, mode?: 'one' | 'batch', concurrency?: number, sendingTimeout?: number, renewClaim?: boolean | number, maxRenewals?: number, strictPayload?: boolean, allowedMailFields?: string[], verifyTransports?: boolean, template?: string, prefix?: string, debug?: boolean, josk?: MailTimeJoSkOptions, onError?: (error: unknown, email: MailTimeTask | null, details?: object) => void, onSent?: (email: MailTimeTask, details?: object) => void }} MailTimeOptions
170
195
  */
171
196
  /** Class of MailTime */
172
197
  export class MailTime {
173
198
  static set Template(newVal: string);
174
199
  static get Template(): string;
200
+ /**
201
+ * @static
202
+ * @memberOf MailTime
203
+ * @name transportFrom
204
+ * @description Best-effort sender address for a transport. `nodemailer.createTransport()`
205
+ * only exposes `.options` for *plain-object* configs — for a class-instance transporter
206
+ * (anything with its own `.send()`) nodemailer's internal `Mail.options` is always `{}`,
207
+ * so `transport.options.from` silently reads `undefined`. This walks the places the
208
+ * address can actually live.
209
+ * @param {MailTimeTransport} transport
210
+ * @returns {string | undefined}
211
+ */
212
+ static transportFrom(transport: MailTimeTransport): string | undefined;
175
213
  /**
176
214
  * Create a MailTime instance
177
215
  * @param {MailTimeOptions} opts - configuration object
@@ -191,12 +229,17 @@ export class MailTime {
191
229
  mode: "one" | "batch";
192
230
  concurrency: number;
193
231
  sendingTimeout: number;
232
+ renewClaim: number;
233
+ maxRenewals: number;
234
+ shouldFailOver: ((error: unknown, info: object | undefined, email: MailTimeTask) => boolean) | null;
235
+ strictPayload: boolean;
236
+ allowedMailFields: Set<string>;
194
237
  failsToNext: number;
195
238
  strategy: "backup" | "balancer";
196
239
  transports: MailTimeTransport[];
197
240
  transport: number;
198
241
  verifyTransports: boolean;
199
- from: boolean | ((transport: MailTimeTransport) => string);
242
+ from: boolean | ((transport: MailTimeTransport, details: MailTimeFromDetails) => string);
200
243
  /** @type {string} */
201
244
  concatSubject: string;
202
245
  concatEmails: boolean;
@@ -208,6 +251,7 @@ export class MailTime {
208
251
  debug?: boolean;
209
252
  autoClear?: boolean;
210
253
  zombieTime?: number;
254
+ lockLeaseTime?: number;
211
255
  minRevolvingDelay?: number;
212
256
  maxRevolvingDelay?: number;
213
257
  execute?: "batch" | "one";
@@ -217,7 +261,8 @@ export class MailTime {
217
261
  onError?: (title: string, details: object) => void;
218
262
  onExecuted?: (uid: string, details: object) => void;
219
263
  } | undefined;
220
- scheduler: JoSk | undefined;
264
+ /** @type {MailTimeScheduler | undefined} */
265
+ scheduler: MailTimeScheduler | undefined;
221
266
  /**
222
267
  * @async
223
268
  * @memberOf MailTime
@@ -238,7 +283,7 @@ export class MailTime {
238
283
  /**
239
284
  * @memberOf MailTime
240
285
  * @name destroy
241
- * @description Stop the scheduler and block future dispatches. Pass `{ drain: true }` to also wait for in-flight SMTP attempts (returns a Promise).
286
+ * @description Stop the scheduler and block future dispatches. Without `{ drain: true }`, any in-flight SMTP attempts are neutralized on completion — they perform no storage writes, no `onSent`/`onError` callbacks, and no logging once `destroy()` returns; their claimed rows are recovered by stale-lock timeout (`sendingTimeout`). Pass `{ drain: true }` to instead let in-flight attempts run to completion (returns a Promise that resolves once they settle).
242
287
  * @param {{ drain?: boolean }} [opts]
243
288
  * @returns {boolean | Promise<boolean>}
244
289
  */
@@ -253,6 +298,27 @@ export class MailTime {
253
298
  * @returns {Promise<void>}
254
299
  */
255
300
  drain(): Promise<void>;
301
+ /**
302
+ * @memberOf MailTime
303
+ * @name pause
304
+ * @description Pause this server instance from competing for the queue-drain lease. In-flight SMTP sends finish; peer server instances keep draining. Reversible (unlike `destroy()`). No-op on `client` instances or after `destroy()`. To stop scanning *and* wait for in-flight sends: `mailTime.pause(); await mailTime.drain();`.
305
+ * @returns {boolean} `true` if newly paused; `false` if already paused, a client instance, or destroyed
306
+ */
307
+ pause(): boolean;
308
+ /**
309
+ * @memberOf MailTime
310
+ * @name resume
311
+ * @description Resume competing for the queue-drain lease after `pause()`; triggers an immediate scan. No-op on `client` instances, after `destroy()`, or when not paused.
312
+ * @returns {boolean} `true` if newly resumed; `false` if not paused, a client instance, or destroyed
313
+ */
314
+ resume(): boolean;
315
+ /**
316
+ * @memberOf MailTime
317
+ * @name isPaused
318
+ * @description Whether this instance is currently paused from draining the queue. Always `false` on `client` instances.
319
+ * @returns {boolean}
320
+ */
321
+ get isPaused(): boolean;
256
322
  /**
257
323
  * @memberOf MailTime
258
324
  * @name send
@@ -270,7 +336,7 @@ export class MailTime {
270
336
  * @returns {Promise<string>} uuid of the email
271
337
  * @throws {Error}
272
338
  */
273
- sendMail(opts?: MailTimeMailOptions): Promise<string>;
339
+ sendMail(opts: MailTimeMailOptions): Promise<string>;
274
340
  /**
275
341
  * @async
276
342
  * @memberOf MailTime
@@ -296,5 +362,4 @@ import { PostgresQueue } from './adapters/postgres.js';
296
362
  import { mailTimePreset } from './presets.js';
297
363
  import { presets } from './presets.js';
298
364
  import { presetNames } from './presets.js';
299
- import { JoSk } from 'josk';
300
365
  export { MongoQueue, RedisQueue, PostgresQueue, mailTimePreset, presets, presetNames };
package/index.d.ts CHANGED
@@ -4,6 +4,7 @@ export type MailTimePingResult = {
4
4
  status: string;
5
5
  code: number;
6
6
  statusCode: number;
7
+ paused?: boolean;
7
8
  error?: unknown;
8
9
  };
9
10
  export type MailTimeStorageClient = {
@@ -34,6 +35,7 @@ export type MailTimeJoSkOptions = {
34
35
  debug?: boolean;
35
36
  autoClear?: boolean;
36
37
  zombieTime?: number;
38
+ lockLeaseTime?: number;
37
39
  minRevolvingDelay?: number;
38
40
  maxRevolvingDelay?: number;
39
41
  execute?: "batch" | "one";
@@ -43,6 +45,14 @@ export type MailTimeJoSkOptions = {
43
45
  onError?: (title: string, details: object) => void;
44
46
  onExecuted?: (uid: string, details: object) => void;
45
47
  };
48
+ export type MailTimeScheduler = {
49
+ [key: string]: any;
50
+ ping: () => Promise<MailTimePingResult>;
51
+ setInterval: (func: (...args: any[]) => unknown, delay: number, uid: string) => Promise<string>;
52
+ destroy: () => boolean;
53
+ pause: (timerId?: string) => boolean;
54
+ resume: (timerId?: string) => boolean;
55
+ };
46
56
  export type MailTimeTask = {
47
57
  uuid: string;
48
58
  to?: string | string[];
@@ -94,13 +104,18 @@ export type MailTimeMailOptions = {
94
104
  export type MailTimeConcatEmailsOptions = {
95
105
  subject?: string;
96
106
  };
107
+ export type MailTimeFromDetails = {
108
+ index: number;
109
+ from: string | undefined;
110
+ };
97
111
  export type MailTimeOptions = {
98
112
  queue: RedisQueue | MongoQueue | PostgresQueue | CustomQueue;
99
113
  type?: "server" | "client";
100
- from?: string | ((transport: MailTimeTransport) => string);
114
+ from?: string | ((transport: MailTimeTransport, details: MailTimeFromDetails) => string);
101
115
  transports?: MailTimeTransport[];
102
116
  strategy?: "backup" | "balancer";
103
117
  failsToNext?: number;
118
+ shouldFailOver?: (error: unknown, info: object | undefined, email: MailTimeTask) => boolean;
104
119
  retries?: number;
105
120
  maxTries?: number;
106
121
  retryDelay?: number;
@@ -115,6 +130,10 @@ export type MailTimeOptions = {
115
130
  mode?: "one" | "batch";
116
131
  concurrency?: number;
117
132
  sendingTimeout?: number;
133
+ renewClaim?: boolean | number;
134
+ maxRenewals?: number;
135
+ strictPayload?: boolean;
136
+ allowedMailFields?: string[];
118
137
  verifyTransports?: boolean;
119
138
  template?: string;
120
139
  prefix?: string;
@@ -130,7 +149,7 @@ export type MailTimeOptions = {
130
149
  * @typedef {import('./presets.js').MailTimePresetConfig} MailTimePresetConfig
131
150
  */
132
151
  /**
133
- * @typedef {{ status: string, code: number, statusCode: number, error?: unknown }} MailTimePingResult
152
+ * @typedef {{ status: string, code: number, statusCode: number, paused?: boolean, error?: unknown }} MailTimePingResult
134
153
  */
135
154
  /**
136
155
  * @typedef {{ [key: string]: any, query?: (queryText: string, values?: unknown[]) => Promise<{ rows?: unknown[], rowCount?: number | null }> }} MailTimeStorageClient
@@ -145,7 +164,10 @@ export type MailTimeOptions = {
145
164
  * @typedef {{ [key: string]: any, type?: 'mongo' | 'redis' | 'postgres', client?: MailTimeStorageClient, db?: MailTimeMongoDb, prefix?: string, resetOnInit?: boolean, useHashTags?: boolean }} MailTimeJoSkAdapterOptions
146
165
  */
147
166
  /**
148
- * @typedef {{ [key: string]: any, adapter: MailTimeJoSkAdapterOptions | object, debug?: boolean, autoClear?: boolean, zombieTime?: number, minRevolvingDelay?: number, maxRevolvingDelay?: number, execute?: 'batch' | 'one', concurrency?: number, lockOwnerId?: string, resetOnInit?: boolean, onError?: (title: string, details: object) => void, onExecuted?: (uid: string, details: object) => void }} MailTimeJoSkOptions
167
+ * @typedef {{ [key: string]: any, adapter: MailTimeJoSkAdapterOptions | object, debug?: boolean, autoClear?: boolean, zombieTime?: number, lockLeaseTime?: number, minRevolvingDelay?: number, maxRevolvingDelay?: number, execute?: 'batch' | 'one', concurrency?: number, lockOwnerId?: string, resetOnInit?: boolean, onError?: (title: string, details: object) => void, onExecuted?: (uid: string, details: object) => void }} MailTimeJoSkOptions
168
+ */
169
+ /**
170
+ * @typedef {{ [key: string]: any, ping: () => Promise<MailTimePingResult>, setInterval: (func: (...args: any[]) => unknown, delay: number, uid: string) => Promise<string>, destroy: () => boolean, pause: (timerId?: string) => boolean, resume: (timerId?: string) => boolean }} MailTimeScheduler
149
171
  */
150
172
  /**
151
173
  * @typedef {{ uuid: string, to?: string | string[], tries: number, sendAt: number, isSent: boolean, isCancelled: boolean, isFailed: boolean, isSending?: boolean, sendingAt?: number, template?: string | false, transport: number, concatSubject?: string | false, mailOptions: MailTimeMailOptions[] }} MailTimeTask
@@ -166,12 +188,28 @@ export type MailTimeOptions = {
166
188
  * @typedef {{ subject?: string }} MailTimeConcatEmailsOptions
167
189
  */
168
190
  /**
169
- * @typedef {{ queue: RedisQueue | MongoQueue | PostgresQueue | CustomQueue, type?: 'server' | 'client', from?: string | ((transport: MailTimeTransport) => string), transports?: MailTimeTransport[], strategy?: 'backup' | 'balancer', failsToNext?: number, retries?: number, maxTries?: number, retryDelay?: number, interval?: number, keepHistory?: boolean, concatEmails?: boolean | MailTimeConcatEmailsOptions, concatSubject?: string, concatDelimiter?: string, concatDelay?: number, concatThrottling?: number, revolvingInterval?: number, mode?: 'one' | 'batch', concurrency?: number, sendingTimeout?: number, verifyTransports?: boolean, template?: string, prefix?: string, debug?: boolean, josk?: MailTimeJoSkOptions, onError?: (error: unknown, email: MailTimeTask | null, details?: object) => void, onSent?: (email: MailTimeTask, details?: object) => void }} MailTimeOptions
191
+ * @typedef {{ index: number, from: string | undefined }} MailTimeFromDetails
192
+ */
193
+ /**
194
+ * @typedef {{ queue: RedisQueue | MongoQueue | PostgresQueue | CustomQueue, type?: 'server' | 'client', from?: string | ((transport: MailTimeTransport, details: MailTimeFromDetails) => string), transports?: MailTimeTransport[], strategy?: 'backup' | 'balancer', failsToNext?: number, shouldFailOver?: (error: unknown, info: object | undefined, email: MailTimeTask) => boolean, retries?: number, maxTries?: number, retryDelay?: number, interval?: number, keepHistory?: boolean, concatEmails?: boolean | MailTimeConcatEmailsOptions, concatSubject?: string, concatDelimiter?: string, concatDelay?: number, concatThrottling?: number, revolvingInterval?: number, mode?: 'one' | 'batch', concurrency?: number, sendingTimeout?: number, renewClaim?: boolean | number, maxRenewals?: number, strictPayload?: boolean, allowedMailFields?: string[], verifyTransports?: boolean, template?: string, prefix?: string, debug?: boolean, josk?: MailTimeJoSkOptions, onError?: (error: unknown, email: MailTimeTask | null, details?: object) => void, onSent?: (email: MailTimeTask, details?: object) => void }} MailTimeOptions
170
195
  */
171
196
  /** Class of MailTime */
172
197
  export class MailTime {
173
198
  static set Template(newVal: string);
174
199
  static get Template(): string;
200
+ /**
201
+ * @static
202
+ * @memberOf MailTime
203
+ * @name transportFrom
204
+ * @description Best-effort sender address for a transport. `nodemailer.createTransport()`
205
+ * only exposes `.options` for *plain-object* configs — for a class-instance transporter
206
+ * (anything with its own `.send()`) nodemailer's internal `Mail.options` is always `{}`,
207
+ * so `transport.options.from` silently reads `undefined`. This walks the places the
208
+ * address can actually live.
209
+ * @param {MailTimeTransport} transport
210
+ * @returns {string | undefined}
211
+ */
212
+ static transportFrom(transport: MailTimeTransport): string | undefined;
175
213
  /**
176
214
  * Create a MailTime instance
177
215
  * @param {MailTimeOptions} opts - configuration object
@@ -191,12 +229,17 @@ export class MailTime {
191
229
  mode: "one" | "batch";
192
230
  concurrency: number;
193
231
  sendingTimeout: number;
232
+ renewClaim: number;
233
+ maxRenewals: number;
234
+ shouldFailOver: ((error: unknown, info: object | undefined, email: MailTimeTask) => boolean) | null;
235
+ strictPayload: boolean;
236
+ allowedMailFields: Set<string>;
194
237
  failsToNext: number;
195
238
  strategy: "backup" | "balancer";
196
239
  transports: MailTimeTransport[];
197
240
  transport: number;
198
241
  verifyTransports: boolean;
199
- from: boolean | ((transport: MailTimeTransport) => string);
242
+ from: boolean | ((transport: MailTimeTransport, details: MailTimeFromDetails) => string);
200
243
  /** @type {string} */
201
244
  concatSubject: string;
202
245
  concatEmails: boolean;
@@ -208,6 +251,7 @@ export class MailTime {
208
251
  debug?: boolean;
209
252
  autoClear?: boolean;
210
253
  zombieTime?: number;
254
+ lockLeaseTime?: number;
211
255
  minRevolvingDelay?: number;
212
256
  maxRevolvingDelay?: number;
213
257
  execute?: "batch" | "one";
@@ -217,7 +261,8 @@ export class MailTime {
217
261
  onError?: (title: string, details: object) => void;
218
262
  onExecuted?: (uid: string, details: object) => void;
219
263
  } | undefined;
220
- scheduler: JoSk | undefined;
264
+ /** @type {MailTimeScheduler | undefined} */
265
+ scheduler: MailTimeScheduler | undefined;
221
266
  /**
222
267
  * @async
223
268
  * @memberOf MailTime
@@ -238,7 +283,7 @@ export class MailTime {
238
283
  /**
239
284
  * @memberOf MailTime
240
285
  * @name destroy
241
- * @description Stop the scheduler and block future dispatches. Pass `{ drain: true }` to also wait for in-flight SMTP attempts (returns a Promise).
286
+ * @description Stop the scheduler and block future dispatches. Without `{ drain: true }`, any in-flight SMTP attempts are neutralized on completion — they perform no storage writes, no `onSent`/`onError` callbacks, and no logging once `destroy()` returns; their claimed rows are recovered by stale-lock timeout (`sendingTimeout`). Pass `{ drain: true }` to instead let in-flight attempts run to completion (returns a Promise that resolves once they settle).
242
287
  * @param {{ drain?: boolean }} [opts]
243
288
  * @returns {boolean | Promise<boolean>}
244
289
  */
@@ -253,6 +298,27 @@ export class MailTime {
253
298
  * @returns {Promise<void>}
254
299
  */
255
300
  drain(): Promise<void>;
301
+ /**
302
+ * @memberOf MailTime
303
+ * @name pause
304
+ * @description Pause this server instance from competing for the queue-drain lease. In-flight SMTP sends finish; peer server instances keep draining. Reversible (unlike `destroy()`). No-op on `client` instances or after `destroy()`. To stop scanning *and* wait for in-flight sends: `mailTime.pause(); await mailTime.drain();`.
305
+ * @returns {boolean} `true` if newly paused; `false` if already paused, a client instance, or destroyed
306
+ */
307
+ pause(): boolean;
308
+ /**
309
+ * @memberOf MailTime
310
+ * @name resume
311
+ * @description Resume competing for the queue-drain lease after `pause()`; triggers an immediate scan. No-op on `client` instances, after `destroy()`, or when not paused.
312
+ * @returns {boolean} `true` if newly resumed; `false` if not paused, a client instance, or destroyed
313
+ */
314
+ resume(): boolean;
315
+ /**
316
+ * @memberOf MailTime
317
+ * @name isPaused
318
+ * @description Whether this instance is currently paused from draining the queue. Always `false` on `client` instances.
319
+ * @returns {boolean}
320
+ */
321
+ get isPaused(): boolean;
256
322
  /**
257
323
  * @memberOf MailTime
258
324
  * @name send
@@ -270,7 +336,7 @@ export class MailTime {
270
336
  * @returns {Promise<string>} uuid of the email
271
337
  * @throws {Error}
272
338
  */
273
- sendMail(opts?: MailTimeMailOptions): Promise<string>;
339
+ sendMail(opts: MailTimeMailOptions): Promise<string>;
274
340
  /**
275
341
  * @async
276
342
  * @memberOf MailTime
@@ -296,5 +362,4 @@ import { PostgresQueue } from './adapters/postgres.js';
296
362
  import { mailTimePreset } from './presets.js';
297
363
  import { presets } from './presets.js';
298
364
  import { presetNames } from './presets.js';
299
- import { JoSk } from 'josk';
300
365
  export { MongoQueue, RedisQueue, PostgresQueue, mailTimePreset, presets, presetNames };