@whatwg-node/server 0.9.66-alpha-20250205000734-b48a2e64484147e8ccb74c205803bb5cd4b7e948 → 0.9.66

Sign up to get free protection for your applications and to get access to all the features.
@@ -213,7 +213,7 @@ function createServerAdapter(serverAdapterBaseObject, options) {
213
213
  controller.abort();
214
214
  });
215
215
  res.onAborted = function (cb) {
216
- controller.signal.addEventListener('abort', cb);
216
+ controller.signal.addEventListener('abort', cb, { once: true });
217
217
  };
218
218
  const request = (0, uwebsockets_js_1.getRequestFromUWSRequest)({
219
219
  req,
@@ -275,13 +275,17 @@ function createServerAdapter(serverAdapterBaseObject, options) {
275
275
  if ((0, utils_js_1.isRequestInit)(initOrCtx)) {
276
276
  const request = new fetchAPI.Request(input, initOrCtx);
277
277
  const res$ = handleRequestWithWaitUntil(request, ...restOfCtx);
278
- return (0, utils_js_1.handleAbortSignalAndPromiseResponse)(res$, initOrCtx?.signal);
278
+ const signal = initOrCtx.signal;
279
+ if (signal) {
280
+ return (0, utils_js_1.handleAbortSignalAndPromiseResponse)(res$, signal);
281
+ }
282
+ return res$;
279
283
  }
280
284
  const request = new fetchAPI.Request(input);
281
285
  return handleRequestWithWaitUntil(request, ...maybeCtx);
282
286
  }
283
287
  const res$ = handleRequestWithWaitUntil(input, ...maybeCtx);
284
- return (0, utils_js_1.handleAbortSignalAndPromiseResponse)(res$, input._signal);
288
+ return (0, utils_js_1.handleAbortSignalAndPromiseResponse)(res$, input.signal);
285
289
  };
286
290
  const genericRequestHandler = (input, ...maybeCtx) => {
287
291
  // If it is a Node request
@@ -112,7 +112,6 @@ function useCORS(options) {
112
112
  }
113
113
  },
114
114
  async onResponse({ request, serverContext, response }) {
115
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
116
115
  const headers = await getCORSResponseHeaders(request, corsOptionsFactory, serverContext);
117
116
  if (headers != null) {
118
117
  for (const headerName in headers) {
package/cjs/utils.js CHANGED
@@ -97,7 +97,7 @@ function normalizeNodeRequest(nodeRequest, fetchAPI) {
97
97
  const closeEventListener = () => {
98
98
  if (!controller.signal.aborted) {
99
99
  Object.defineProperty(rawRequest, 'aborted', { value: true });
100
- controller.abort();
100
+ controller.abort(nodeResponse.errored ?? undefined);
101
101
  }
102
102
  };
103
103
  nodeResponse.once('error', closeEventListener);
@@ -443,17 +443,24 @@ function createDeferredPromise() {
443
443
  };
444
444
  }
445
445
  function handleAbortSignalAndPromiseResponse(response$, abortSignal) {
446
+ if (abortSignal?.aborted) {
447
+ throw abortSignal.reason;
448
+ }
446
449
  if (isPromise(response$) && abortSignal) {
447
450
  const deferred$ = createDeferredPromise();
448
- abortSignal.addEventListener('abort', function abortSignalFetchErrorHandler() {
451
+ function abortSignalFetchErrorHandler() {
449
452
  deferred$.reject(abortSignal.reason);
450
- });
453
+ }
454
+ abortSignal.addEventListener('abort', abortSignalFetchErrorHandler, { once: true });
451
455
  response$
452
456
  .then(function fetchSuccessHandler(res) {
453
457
  deferred$.resolve(res);
454
458
  })
455
459
  .catch(function fetchErrorHandler(err) {
456
460
  deferred$.reject(err);
461
+ })
462
+ .finally(() => {
463
+ abortSignal.removeEventListener('abort', abortSignalFetchErrorHandler);
457
464
  });
458
465
  return deferred$.promise;
459
466
  }
@@ -45,7 +45,7 @@ function getRequestFromUWSRequest({ req, res, fetchAPI, controller, }) {
45
45
  duplex = 'half';
46
46
  controller.signal.addEventListener('abort', () => {
47
47
  stop();
48
- });
48
+ }, { once: true });
49
49
  let readableStream;
50
50
  getReadableStream = () => {
51
51
  if (!readableStream) {
@@ -212,7 +212,7 @@ function sendResponseToUwsOpts(uwsResponse, fetchResponse, controller, fetchAPI)
212
212
  if (!fetchResponse.body?.locked) {
213
213
  fetchResponse.body?.cancel(controller.signal.reason);
214
214
  }
215
- });
215
+ }, { once: true });
216
216
  return fetchResponse.body
217
217
  .pipeTo(createWritableFromUWS(uwsResponse, fetchAPI), {
218
218
  signal: controller.signal,
@@ -209,7 +209,7 @@ function createServerAdapter(serverAdapterBaseObject, options) {
209
209
  controller.abort();
210
210
  });
211
211
  res.onAborted = function (cb) {
212
- controller.signal.addEventListener('abort', cb);
212
+ controller.signal.addEventListener('abort', cb, { once: true });
213
213
  };
214
214
  const request = getRequestFromUWSRequest({
215
215
  req,
@@ -271,13 +271,17 @@ function createServerAdapter(serverAdapterBaseObject, options) {
271
271
  if (isRequestInit(initOrCtx)) {
272
272
  const request = new fetchAPI.Request(input, initOrCtx);
273
273
  const res$ = handleRequestWithWaitUntil(request, ...restOfCtx);
274
- return handleAbortSignalAndPromiseResponse(res$, initOrCtx?.signal);
274
+ const signal = initOrCtx.signal;
275
+ if (signal) {
276
+ return handleAbortSignalAndPromiseResponse(res$, signal);
277
+ }
278
+ return res$;
275
279
  }
276
280
  const request = new fetchAPI.Request(input);
277
281
  return handleRequestWithWaitUntil(request, ...maybeCtx);
278
282
  }
279
283
  const res$ = handleRequestWithWaitUntil(input, ...maybeCtx);
280
- return handleAbortSignalAndPromiseResponse(res$, input._signal);
284
+ return handleAbortSignalAndPromiseResponse(res$, input.signal);
281
285
  };
282
286
  const genericRequestHandler = (input, ...maybeCtx) => {
283
287
  // If it is a Node request
@@ -108,7 +108,6 @@ export function useCORS(options) {
108
108
  }
109
109
  },
110
110
  async onResponse({ request, serverContext, response }) {
111
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
112
111
  const headers = await getCORSResponseHeaders(request, corsOptionsFactory, serverContext);
113
112
  if (headers != null) {
114
113
  for (const headerName in headers) {
package/esm/utils.js CHANGED
@@ -75,7 +75,7 @@ export function normalizeNodeRequest(nodeRequest, fetchAPI) {
75
75
  const closeEventListener = () => {
76
76
  if (!controller.signal.aborted) {
77
77
  Object.defineProperty(rawRequest, 'aborted', { value: true });
78
- controller.abort();
78
+ controller.abort(nodeResponse.errored ?? undefined);
79
79
  }
80
80
  };
81
81
  nodeResponse.once('error', closeEventListener);
@@ -421,17 +421,24 @@ export function createDeferredPromise() {
421
421
  };
422
422
  }
423
423
  export function handleAbortSignalAndPromiseResponse(response$, abortSignal) {
424
+ if (abortSignal?.aborted) {
425
+ throw abortSignal.reason;
426
+ }
424
427
  if (isPromise(response$) && abortSignal) {
425
428
  const deferred$ = createDeferredPromise();
426
- abortSignal.addEventListener('abort', function abortSignalFetchErrorHandler() {
429
+ function abortSignalFetchErrorHandler() {
427
430
  deferred$.reject(abortSignal.reason);
428
- });
431
+ }
432
+ abortSignal.addEventListener('abort', abortSignalFetchErrorHandler, { once: true });
429
433
  response$
430
434
  .then(function fetchSuccessHandler(res) {
431
435
  deferred$.resolve(res);
432
436
  })
433
437
  .catch(function fetchErrorHandler(err) {
434
438
  deferred$.reject(err);
439
+ })
440
+ .finally(() => {
441
+ abortSignal.removeEventListener('abort', abortSignalFetchErrorHandler);
435
442
  });
436
443
  return deferred$.promise;
437
444
  }
@@ -38,7 +38,7 @@ export function getRequestFromUWSRequest({ req, res, fetchAPI, controller, }) {
38
38
  duplex = 'half';
39
39
  controller.signal.addEventListener('abort', () => {
40
40
  stop();
41
- });
41
+ }, { once: true });
42
42
  let readableStream;
43
43
  getReadableStream = () => {
44
44
  if (!readableStream) {
@@ -205,7 +205,7 @@ export function sendResponseToUwsOpts(uwsResponse, fetchResponse, controller, fe
205
205
  if (!fetchResponse.body?.locked) {
206
206
  fetchResponse.body?.cancel(controller.signal.reason);
207
207
  }
208
- });
208
+ }, { once: true });
209
209
  return fetchResponse.body
210
210
  .pipeTo(createWritableFromUWS(uwsResponse, fetchAPI), {
211
211
  signal: controller.signal,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@whatwg-node/server",
3
- "version": "0.9.66-alpha-20250205000734-b48a2e64484147e8ccb74c205803bb5cd4b7e948",
3
+ "version": "0.9.66",
4
4
  "description": "Fetch API compliant HTTP Server adapter",
5
5
  "sideEffects": false,
6
6
  "dependencies": {
@@ -40,7 +40,7 @@ export interface DeferredPromise<T = void> {
40
40
  reject: (reason: any) => void;
41
41
  }
42
42
  export declare function createDeferredPromise<T = void>(): DeferredPromise<T>;
43
- export declare function handleAbortSignalAndPromiseResponse(response$: Promise<Response> | Response, abortSignal?: AbortSignal | null): Response | Promise<Response>;
43
+ export declare function handleAbortSignalAndPromiseResponse(response$: Promise<Response> | Response, abortSignal: AbortSignal): Response | Promise<Response>;
44
44
  export declare const decompressedResponseMap: WeakMap<Response, Response>;
45
45
  export declare function getSupportedEncodings(fetchAPI: FetchAPI): CompressionFormat[];
46
46
  export declare function handleResponseDecompression(response: Response, fetchAPI: FetchAPI): Response;
@@ -40,7 +40,7 @@ export interface DeferredPromise<T = void> {
40
40
  reject: (reason: any) => void;
41
41
  }
42
42
  export declare function createDeferredPromise<T = void>(): DeferredPromise<T>;
43
- export declare function handleAbortSignalAndPromiseResponse(response$: Promise<Response> | Response, abortSignal?: AbortSignal | null): Response | Promise<Response>;
43
+ export declare function handleAbortSignalAndPromiseResponse(response$: Promise<Response> | Response, abortSignal: AbortSignal): Response | Promise<Response>;
44
44
  export declare const decompressedResponseMap: WeakMap<Response, Response>;
45
45
  export declare function getSupportedEncodings(fetchAPI: FetchAPI): CompressionFormat[];
46
46
  export declare function handleResponseDecompression(response: Response, fetchAPI: FetchAPI): Response;