@upyo/mailgun 0.5.0-dev.164 → 0.5.0-dev.168

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/dist/index.cjs CHANGED
@@ -149,18 +149,18 @@ var MailgunHttpClient = class {
149
149
  for (const [key, value] of Object.entries(this.config.headers)) headers.set(key, value);
150
150
  const controller = new AbortController();
151
151
  const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);
152
- let signal = controller.signal;
153
- if (options.signal) signal = AbortSignal.any([controller.signal, options.signal]);
152
+ const combinedSignal = combineSignals(controller.signal, options.signal);
154
153
  try {
155
154
  return await globalThis.fetch(url, {
156
155
  ...options,
157
156
  headers,
158
- signal
157
+ signal: combinedSignal.signal
159
158
  });
160
159
  } catch (error) {
161
160
  if (isAbortError$1(error) && controller.signal.aborted && !options.signal?.aborted) throw new Error(`Mailgun API request timed out after ${this.config.timeout} ms.`);
162
161
  throw error;
163
162
  } finally {
163
+ combinedSignal.cleanup();
164
164
  clearTimeout(timeoutId);
165
165
  }
166
166
  }
@@ -203,12 +203,12 @@ function isAbortError$1(error) {
203
203
  return error instanceof Error && error.name === "AbortError";
204
204
  }
205
205
  function sleep(milliseconds, signal) {
206
- if (signal?.aborted) return Promise.reject(createAbortError());
206
+ if (signal?.aborted) return Promise.reject(createAbortError(signal));
207
207
  return new Promise((resolve, reject) => {
208
208
  function abort() {
209
209
  clearTimeout(timeoutId);
210
210
  signal?.removeEventListener("abort", abort);
211
- reject(createAbortError());
211
+ reject(createAbortError(signal));
212
212
  }
213
213
  const timeoutId = setTimeout(() => {
214
214
  signal?.removeEventListener("abort", abort);
@@ -217,8 +217,41 @@ function sleep(milliseconds, signal) {
217
217
  signal?.addEventListener("abort", abort, { once: true });
218
218
  });
219
219
  }
220
- function createAbortError() {
221
- return new DOMException("The operation was aborted.", "AbortError");
220
+ function createAbortError(signal) {
221
+ return signal?.reason ?? new DOMException("The operation was aborted.", "AbortError");
222
+ }
223
+ function combineSignals(timeoutSignal, externalSignal) {
224
+ if (externalSignal == null) return {
225
+ signal: timeoutSignal,
226
+ cleanup: () => {}
227
+ };
228
+ if (typeof AbortSignal.any === "function") return {
229
+ signal: AbortSignal.any([timeoutSignal, externalSignal]),
230
+ cleanup: () => {}
231
+ };
232
+ const controller = new AbortController();
233
+ const cleanup = () => {
234
+ timeoutSignal.removeEventListener("abort", abortFromTimeout);
235
+ externalSignal.removeEventListener("abort", abortFromExternal);
236
+ };
237
+ const abortFromTimeout = () => {
238
+ cleanup();
239
+ controller.abort(timeoutSignal.reason);
240
+ };
241
+ const abortFromExternal = () => {
242
+ cleanup();
243
+ controller.abort(externalSignal.reason);
244
+ };
245
+ if (timeoutSignal.aborted) controller.abort(timeoutSignal.reason);
246
+ else if (externalSignal.aborted) controller.abort(externalSignal.reason);
247
+ else {
248
+ timeoutSignal.addEventListener("abort", abortFromTimeout, { once: true });
249
+ externalSignal.addEventListener("abort", abortFromExternal, { once: true });
250
+ }
251
+ return {
252
+ signal: controller.signal,
253
+ cleanup
254
+ };
222
255
  }
223
256
  function truncateErrorBody(text) {
224
257
  return text.length > 500 ? `${text.slice(0, 500)}...` : text;
@@ -409,7 +442,7 @@ var MailgunTransport = class {
409
442
  provider: "mailgun"
410
443
  };
411
444
  } catch (error) {
412
- if (isAbortError(error) && options?.signal?.aborted) throw error;
445
+ if (isCallerAbort(error, options?.signal)) throw error;
413
446
  const errorMessage = error instanceof Error ? error.message : String(error);
414
447
  return createMailgunFailure(errorMessage, error);
415
448
  }
@@ -488,6 +521,9 @@ function createMailgunFailure(message, error) {
488
521
  });
489
522
  return (0, __upyo_core.createFailedReceipt)(message, { provider: "mailgun" });
490
523
  }
524
+ function isCallerAbort(error, signal) {
525
+ return signal?.aborted === true && (isAbortError(error) || error === signal.reason);
526
+ }
491
527
  function isAbortError(error) {
492
528
  return error instanceof Error && error.name === "AbortError";
493
529
  }
package/dist/index.js CHANGED
@@ -126,18 +126,18 @@ var MailgunHttpClient = class {
126
126
  for (const [key, value] of Object.entries(this.config.headers)) headers.set(key, value);
127
127
  const controller = new AbortController();
128
128
  const timeoutId = setTimeout(() => controller.abort(), this.config.timeout);
129
- let signal = controller.signal;
130
- if (options.signal) signal = AbortSignal.any([controller.signal, options.signal]);
129
+ const combinedSignal = combineSignals(controller.signal, options.signal);
131
130
  try {
132
131
  return await globalThis.fetch(url, {
133
132
  ...options,
134
133
  headers,
135
- signal
134
+ signal: combinedSignal.signal
136
135
  });
137
136
  } catch (error) {
138
137
  if (isAbortError$1(error) && controller.signal.aborted && !options.signal?.aborted) throw new Error(`Mailgun API request timed out after ${this.config.timeout} ms.`);
139
138
  throw error;
140
139
  } finally {
140
+ combinedSignal.cleanup();
141
141
  clearTimeout(timeoutId);
142
142
  }
143
143
  }
@@ -180,12 +180,12 @@ function isAbortError$1(error) {
180
180
  return error instanceof Error && error.name === "AbortError";
181
181
  }
182
182
  function sleep(milliseconds, signal) {
183
- if (signal?.aborted) return Promise.reject(createAbortError());
183
+ if (signal?.aborted) return Promise.reject(createAbortError(signal));
184
184
  return new Promise((resolve, reject) => {
185
185
  function abort() {
186
186
  clearTimeout(timeoutId);
187
187
  signal?.removeEventListener("abort", abort);
188
- reject(createAbortError());
188
+ reject(createAbortError(signal));
189
189
  }
190
190
  const timeoutId = setTimeout(() => {
191
191
  signal?.removeEventListener("abort", abort);
@@ -194,8 +194,41 @@ function sleep(milliseconds, signal) {
194
194
  signal?.addEventListener("abort", abort, { once: true });
195
195
  });
196
196
  }
197
- function createAbortError() {
198
- return new DOMException("The operation was aborted.", "AbortError");
197
+ function createAbortError(signal) {
198
+ return signal?.reason ?? new DOMException("The operation was aborted.", "AbortError");
199
+ }
200
+ function combineSignals(timeoutSignal, externalSignal) {
201
+ if (externalSignal == null) return {
202
+ signal: timeoutSignal,
203
+ cleanup: () => {}
204
+ };
205
+ if (typeof AbortSignal.any === "function") return {
206
+ signal: AbortSignal.any([timeoutSignal, externalSignal]),
207
+ cleanup: () => {}
208
+ };
209
+ const controller = new AbortController();
210
+ const cleanup = () => {
211
+ timeoutSignal.removeEventListener("abort", abortFromTimeout);
212
+ externalSignal.removeEventListener("abort", abortFromExternal);
213
+ };
214
+ const abortFromTimeout = () => {
215
+ cleanup();
216
+ controller.abort(timeoutSignal.reason);
217
+ };
218
+ const abortFromExternal = () => {
219
+ cleanup();
220
+ controller.abort(externalSignal.reason);
221
+ };
222
+ if (timeoutSignal.aborted) controller.abort(timeoutSignal.reason);
223
+ else if (externalSignal.aborted) controller.abort(externalSignal.reason);
224
+ else {
225
+ timeoutSignal.addEventListener("abort", abortFromTimeout, { once: true });
226
+ externalSignal.addEventListener("abort", abortFromExternal, { once: true });
227
+ }
228
+ return {
229
+ signal: controller.signal,
230
+ cleanup
231
+ };
199
232
  }
200
233
  function truncateErrorBody(text) {
201
234
  return text.length > 500 ? `${text.slice(0, 500)}...` : text;
@@ -386,7 +419,7 @@ var MailgunTransport = class {
386
419
  provider: "mailgun"
387
420
  };
388
421
  } catch (error) {
389
- if (isAbortError(error) && options?.signal?.aborted) throw error;
422
+ if (isCallerAbort(error, options?.signal)) throw error;
390
423
  const errorMessage = error instanceof Error ? error.message : String(error);
391
424
  return createMailgunFailure(errorMessage, error);
392
425
  }
@@ -465,6 +498,9 @@ function createMailgunFailure(message, error) {
465
498
  });
466
499
  return createFailedReceipt(message, { provider: "mailgun" });
467
500
  }
501
+ function isCallerAbort(error, signal) {
502
+ return signal?.aborted === true && (isAbortError(error) || error === signal.reason);
503
+ }
468
504
  function isAbortError(error) {
469
505
  return error instanceof Error && error.name === "AbortError";
470
506
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@upyo/mailgun",
3
- "version": "0.5.0-dev.164",
3
+ "version": "0.5.0-dev.168",
4
4
  "description": "Mailgun transport for Upyo email library",
5
5
  "keywords": [
6
6
  "email",
@@ -53,7 +53,7 @@
53
53
  },
54
54
  "sideEffects": false,
55
55
  "peerDependencies": {
56
- "@upyo/core": "0.5.0-dev.164+5e283c64"
56
+ "@upyo/core": "0.5.0-dev.168+1e808a3a"
57
57
  },
58
58
  "devDependencies": {
59
59
  "tsdown": "^0.12.7",