@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.
- package/cjs/createServerAdapter.js +32 -42
- package/cjs/utils.js +2 -5
- package/esm/createServerAdapter.js +32 -42
- package/esm/utils.js +2 -5
- package/package.json +1 -1
- package/typings/plugins/types.d.cts +2 -2
- package/typings/plugins/types.d.ts +2 -2
@@ -28,33 +28,24 @@ function createServerAdapter(serverAdapterBaseObject, options) {
|
|
28
28
|
const onRequestHooks = [];
|
29
29
|
const onResponseHooks = [];
|
30
30
|
const waitUntilPromises = new Set();
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
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
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
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
|
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 (!
|
322
|
-
return
|
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 (!
|
328
|
-
return
|
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', '
|
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
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
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
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
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
|
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 (!
|
318
|
-
return
|
307
|
+
if (_disposableStack && !_disposableStack.disposed) {
|
308
|
+
return _disposableStack.disposeAsync();
|
319
309
|
}
|
320
310
|
return fakePromise(undefined);
|
321
311
|
},
|
322
312
|
dispose() {
|
323
|
-
if (!
|
324
|
-
return
|
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', '
|
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,10 +1,10 @@
|
|
1
1
|
import { FetchAPI, ServerAdapterRequestHandler, type ServerAdapterInitialContext } from '../types.cjs';
|
2
|
-
export
|
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
|
-
}
|
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
|
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
|
-
}
|
7
|
+
}
|
8
8
|
export type OnRequestHook<TServerContext> = (payload: OnRequestEventPayload<TServerContext>) => Promise<void> | void;
|
9
9
|
export interface OnRequestEventPayload<TServerContext> {
|
10
10
|
request: Request;
|