@whatwg-node/server 0.9.57 → 0.9.59-rc-20241125184425-a8fccc28b169011604dfa3149cf1c7a317b1f279

Sign up to get free protection for your applications and to get access to all the features.
@@ -28,33 +28,24 @@ function createServerAdapter(serverAdapterBaseObject, options) {
28
28
  const onRequestHooks = [];
29
29
  const onResponseHooks = [];
30
30
  const waitUntilPromises = new Set();
31
- const disposableStack = new disposablestack_1.AsyncDisposableStack();
32
- const signals = new Set();
33
- function registerSignal(signal) {
34
- signals.add(signal);
35
- signal.addEventListener('abort', () => {
36
- signals.delete(signal);
37
- });
38
- }
39
- disposableStack.defer(() => {
40
- for (const signal of signals) {
41
- signal.sendAbort();
42
- }
43
- });
44
- disposableStack.defer(() => {
45
- if (waitUntilPromises.size > 0) {
46
- return Promise.allSettled(waitUntilPromises).then(() => {
47
- waitUntilPromises.clear();
48
- }, () => {
49
- waitUntilPromises.clear();
31
+ let _disposableStack;
32
+ function ensureDisposableStack() {
33
+ if (!_disposableStack) {
34
+ _disposableStack = new disposablestack_1.AsyncDisposableStack();
35
+ (0, utils_js_1.ensureDisposableStackRegisteredForTerminateEvents)(_disposableStack);
36
+ _disposableStack.defer(() => {
37
+ if (waitUntilPromises.size > 0) {
38
+ return Promise.allSettled(waitUntilPromises).then(() => {
39
+ waitUntilPromises.clear();
40
+ }, () => {
41
+ waitUntilPromises.clear();
42
+ });
43
+ }
50
44
  });
51
45
  }
52
- });
46
+ return _disposableStack;
47
+ }
53
48
  function waitUntil(promiseLike) {
54
- // If it is a Node.js environment, we should register the disposable stack to handle process termination events
55
- if (globalThis.process) {
56
- (0, utils_js_1.ensureDisposableStackRegisteredForTerminateEvents)(disposableStack);
57
- }
58
49
  waitUntilPromises.add(promiseLike);
59
50
  promiseLike.then(() => {
60
51
  waitUntilPromises.delete(promiseLike);
@@ -65,17 +56,15 @@ function createServerAdapter(serverAdapterBaseObject, options) {
65
56
  }
66
57
  if (options?.plugins != null) {
67
58
  for (const plugin of options.plugins) {
68
- if (plugin != null) {
69
- if (plugin.onRequest) {
70
- onRequestHooks.push(plugin.onRequest);
71
- }
72
- if (plugin.onResponse) {
73
- onResponseHooks.push(plugin.onResponse);
74
- }
75
- const disposeFn = plugin[disposablestack_1.DisposableSymbols.asyncDispose] || plugin[disposablestack_1.DisposableSymbols.dispose];
76
- if (disposeFn != null) {
77
- disposableStack.defer(disposeFn);
78
- }
59
+ if (plugin.onRequest) {
60
+ onRequestHooks.push(plugin.onRequest);
61
+ }
62
+ if (plugin.onResponse) {
63
+ onResponseHooks.push(plugin.onResponse);
64
+ }
65
+ const disposeFn = plugin[disposablestack_1.DisposableSymbols.asyncDispose] || plugin[disposablestack_1.DisposableSymbols.dispose];
66
+ if (disposeFn != null) {
67
+ ensureDisposableStack().defer(disposeFn);
79
68
  }
80
69
  }
81
70
  }
@@ -150,7 +139,7 @@ function createServerAdapter(serverAdapterBaseObject, options) {
150
139
  // TODO: Remove this on the next major version
151
140
  function handleNodeRequest(nodeRequest, ...ctx) {
152
141
  const serverContext = ctx.length > 1 ? (0, utils_js_1.completeAssign)(...ctx) : ctx[0] || {};
153
- const request = (0, utils_js_1.normalizeNodeRequest)(nodeRequest, fetchAPI, registerSignal);
142
+ const request = (0, utils_js_1.normalizeNodeRequest)(nodeRequest, fetchAPI);
154
143
  return handleRequest(request, serverContext);
155
144
  }
156
145
  function handleNodeRequestAndResponse(nodeRequest, nodeResponseOrContainer, ...ctx) {
@@ -197,7 +186,6 @@ function createServerAdapter(serverAdapterBaseObject, options) {
197
186
  ? (0, utils_js_1.completeAssign)(defaultServerContext, ...ctx)
198
187
  : defaultServerContext;
199
188
  const signal = new utils_js_1.ServerAdapterRequestAbortSignal();
200
- registerSignal(signal);
201
189
  const originalResEnd = res.end.bind(res);
202
190
  let resEnded = false;
203
191
  res.end = function (data) {
@@ -316,16 +304,18 @@ function createServerAdapter(serverAdapterBaseObject, options) {
316
304
  handleEvent,
317
305
  handleUWS,
318
306
  handle: genericRequestHandler,
319
- disposableStack,
307
+ get disposableStack() {
308
+ return ensureDisposableStack();
309
+ },
320
310
  [disposablestack_1.DisposableSymbols.asyncDispose]() {
321
- if (!disposableStack.disposed) {
322
- return disposableStack.disposeAsync();
311
+ if (_disposableStack && !_disposableStack.disposed) {
312
+ return _disposableStack.disposeAsync();
323
313
  }
324
314
  return (0, uwebsockets_js_1.fakePromise)(undefined);
325
315
  },
326
316
  dispose() {
327
- if (!disposableStack.disposed) {
328
- return disposableStack.disposeAsync();
317
+ if (_disposableStack && !_disposableStack.disposed) {
318
+ return _disposableStack.disposeAsync();
329
319
  }
330
320
  return (0, uwebsockets_js_1.fakePromise)(undefined);
331
321
  },
package/cjs/utils.js CHANGED
@@ -547,7 +547,7 @@ function handleResponseDecompression(response, fetchAPI) {
547
547
  }
548
548
  return decompressedResponse;
549
549
  }
550
- const terminateEvents = ['SIGINT', 'SIGTERM', 'exit'];
550
+ const terminateEvents = ['SIGINT', 'exit'];
551
551
  const disposableStacks = new Set();
552
552
  let eventListenerRegistered = false;
553
553
  function ensureEventListenerForDisposableStacks() {
@@ -557,10 +557,7 @@ function ensureEventListenerForDisposableStacks() {
557
557
  eventListenerRegistered = true;
558
558
  for (const event of terminateEvents) {
559
559
  globalThis.process.once(event, function terminateHandler() {
560
- return Promise.allSettled([...disposableStacks].map(stack => !stack.disposed &&
561
- stack.disposeAsync().catch(e => {
562
- console.error('Error while disposing:', e);
563
- })));
560
+ return Promise.allSettled([...disposableStacks].map(stack => !stack.disposed && stack.disposeAsync()));
564
561
  });
565
562
  }
566
563
  }
@@ -24,33 +24,24 @@ function createServerAdapter(serverAdapterBaseObject, options) {
24
24
  const onRequestHooks = [];
25
25
  const onResponseHooks = [];
26
26
  const waitUntilPromises = new Set();
27
- const disposableStack = new AsyncDisposableStack();
28
- const signals = new Set();
29
- function registerSignal(signal) {
30
- signals.add(signal);
31
- signal.addEventListener('abort', () => {
32
- signals.delete(signal);
33
- });
34
- }
35
- disposableStack.defer(() => {
36
- for (const signal of signals) {
37
- signal.sendAbort();
38
- }
39
- });
40
- disposableStack.defer(() => {
41
- if (waitUntilPromises.size > 0) {
42
- return Promise.allSettled(waitUntilPromises).then(() => {
43
- waitUntilPromises.clear();
44
- }, () => {
45
- waitUntilPromises.clear();
27
+ let _disposableStack;
28
+ function ensureDisposableStack() {
29
+ if (!_disposableStack) {
30
+ _disposableStack = new AsyncDisposableStack();
31
+ ensureDisposableStackRegisteredForTerminateEvents(_disposableStack);
32
+ _disposableStack.defer(() => {
33
+ if (waitUntilPromises.size > 0) {
34
+ return Promise.allSettled(waitUntilPromises).then(() => {
35
+ waitUntilPromises.clear();
36
+ }, () => {
37
+ waitUntilPromises.clear();
38
+ });
39
+ }
46
40
  });
47
41
  }
48
- });
42
+ return _disposableStack;
43
+ }
49
44
  function waitUntil(promiseLike) {
50
- // If it is a Node.js environment, we should register the disposable stack to handle process termination events
51
- if (globalThis.process) {
52
- ensureDisposableStackRegisteredForTerminateEvents(disposableStack);
53
- }
54
45
  waitUntilPromises.add(promiseLike);
55
46
  promiseLike.then(() => {
56
47
  waitUntilPromises.delete(promiseLike);
@@ -61,17 +52,15 @@ function createServerAdapter(serverAdapterBaseObject, options) {
61
52
  }
62
53
  if (options?.plugins != null) {
63
54
  for (const plugin of options.plugins) {
64
- if (plugin != null) {
65
- if (plugin.onRequest) {
66
- onRequestHooks.push(plugin.onRequest);
67
- }
68
- if (plugin.onResponse) {
69
- onResponseHooks.push(plugin.onResponse);
70
- }
71
- const disposeFn = plugin[DisposableSymbols.asyncDispose] || plugin[DisposableSymbols.dispose];
72
- if (disposeFn != null) {
73
- disposableStack.defer(disposeFn);
74
- }
55
+ if (plugin.onRequest) {
56
+ onRequestHooks.push(plugin.onRequest);
57
+ }
58
+ if (plugin.onResponse) {
59
+ onResponseHooks.push(plugin.onResponse);
60
+ }
61
+ const disposeFn = plugin[DisposableSymbols.asyncDispose] || plugin[DisposableSymbols.dispose];
62
+ if (disposeFn != null) {
63
+ ensureDisposableStack().defer(disposeFn);
75
64
  }
76
65
  }
77
66
  }
@@ -146,7 +135,7 @@ function createServerAdapter(serverAdapterBaseObject, options) {
146
135
  // TODO: Remove this on the next major version
147
136
  function handleNodeRequest(nodeRequest, ...ctx) {
148
137
  const serverContext = ctx.length > 1 ? completeAssign(...ctx) : ctx[0] || {};
149
- const request = normalizeNodeRequest(nodeRequest, fetchAPI, registerSignal);
138
+ const request = normalizeNodeRequest(nodeRequest, fetchAPI);
150
139
  return handleRequest(request, serverContext);
151
140
  }
152
141
  function handleNodeRequestAndResponse(nodeRequest, nodeResponseOrContainer, ...ctx) {
@@ -193,7 +182,6 @@ function createServerAdapter(serverAdapterBaseObject, options) {
193
182
  ? completeAssign(defaultServerContext, ...ctx)
194
183
  : defaultServerContext;
195
184
  const signal = new ServerAdapterRequestAbortSignal();
196
- registerSignal(signal);
197
185
  const originalResEnd = res.end.bind(res);
198
186
  let resEnded = false;
199
187
  res.end = function (data) {
@@ -312,16 +300,18 @@ function createServerAdapter(serverAdapterBaseObject, options) {
312
300
  handleEvent,
313
301
  handleUWS,
314
302
  handle: genericRequestHandler,
315
- disposableStack,
303
+ get disposableStack() {
304
+ return ensureDisposableStack();
305
+ },
316
306
  [DisposableSymbols.asyncDispose]() {
317
- if (!disposableStack.disposed) {
318
- return disposableStack.disposeAsync();
307
+ if (_disposableStack && !_disposableStack.disposed) {
308
+ return _disposableStack.disposeAsync();
319
309
  }
320
310
  return fakePromise(undefined);
321
311
  },
322
312
  dispose() {
323
- if (!disposableStack.disposed) {
324
- return disposableStack.disposeAsync();
313
+ if (_disposableStack && !_disposableStack.disposed) {
314
+ return _disposableStack.disposeAsync();
325
315
  }
326
316
  return fakePromise(undefined);
327
317
  },
package/esm/utils.js CHANGED
@@ -524,7 +524,7 @@ export function handleResponseDecompression(response, fetchAPI) {
524
524
  }
525
525
  return decompressedResponse;
526
526
  }
527
- const terminateEvents = ['SIGINT', 'SIGTERM', 'exit'];
527
+ const terminateEvents = ['SIGINT', 'exit'];
528
528
  const disposableStacks = new Set();
529
529
  let eventListenerRegistered = false;
530
530
  function ensureEventListenerForDisposableStacks() {
@@ -534,10 +534,7 @@ function ensureEventListenerForDisposableStacks() {
534
534
  eventListenerRegistered = true;
535
535
  for (const event of terminateEvents) {
536
536
  globalThis.process.once(event, function terminateHandler() {
537
- return Promise.allSettled([...disposableStacks].map(stack => !stack.disposed &&
538
- stack.disposeAsync().catch(e => {
539
- console.error('Error while disposing:', e);
540
- })));
537
+ return Promise.allSettled([...disposableStacks].map(stack => !stack.disposed && stack.disposeAsync()));
541
538
  });
542
539
  }
543
540
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@whatwg-node/server",
3
- "version": "0.9.57",
3
+ "version": "0.9.59-rc-20241125184425-a8fccc28b169011604dfa3149cf1c7a317b1f279",
4
4
  "description": "Fetch API compliant HTTP Server adapter",
5
5
  "sideEffects": false,
6
6
  "dependencies": {
@@ -1,10 +1,10 @@
1
1
  import { FetchAPI, ServerAdapterRequestHandler, type ServerAdapterInitialContext } from '../types.cjs';
2
- export type ServerAdapterPlugin<TServerContext = {}> = {
2
+ export interface ServerAdapterPlugin<TServerContext = {}> {
3
3
  onRequest?: OnRequestHook<TServerContext & ServerAdapterInitialContext>;
4
4
  onResponse?: OnResponseHook<TServerContext & ServerAdapterInitialContext>;
5
5
  [Symbol.dispose]?: () => void;
6
6
  [Symbol.asyncDispose]?: () => PromiseLike<void> | void;
7
- } | undefined;
7
+ }
8
8
  export type OnRequestHook<TServerContext> = (payload: OnRequestEventPayload<TServerContext>) => Promise<void> | void;
9
9
  export interface OnRequestEventPayload<TServerContext> {
10
10
  request: Request;
@@ -1,10 +1,10 @@
1
1
  import { FetchAPI, ServerAdapterRequestHandler, type ServerAdapterInitialContext } from '../types.js';
2
- export type ServerAdapterPlugin<TServerContext = {}> = {
2
+ export interface ServerAdapterPlugin<TServerContext = {}> {
3
3
  onRequest?: OnRequestHook<TServerContext & ServerAdapterInitialContext>;
4
4
  onResponse?: OnResponseHook<TServerContext & ServerAdapterInitialContext>;
5
5
  [Symbol.dispose]?: () => void;
6
6
  [Symbol.asyncDispose]?: () => PromiseLike<void> | void;
7
- } | undefined;
7
+ }
8
8
  export type OnRequestHook<TServerContext> = (payload: OnRequestEventPayload<TServerContext>) => Promise<void> | void;
9
9
  export interface OnRequestEventPayload<TServerContext> {
10
10
  request: Request;