@whatwg-node/server 0.9.39 → 0.9.40
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.
|
@@ -117,19 +117,18 @@ function createServerAdapter(serverAdapterBaseObject, options) {
|
|
|
117
117
|
utils_js_1.nodeRequestResponseMap.set(nodeRequest, nodeResponse);
|
|
118
118
|
return handleNodeRequest(nodeRequest, ...ctx);
|
|
119
119
|
}
|
|
120
|
-
function requestListener(nodeRequest,
|
|
120
|
+
function requestListener(nodeRequest, nodeResponse, ...ctx) {
|
|
121
121
|
const waitUntilPromises = [];
|
|
122
122
|
const defaultServerContext = {
|
|
123
123
|
req: nodeRequest,
|
|
124
|
-
res:
|
|
124
|
+
res: nodeResponse,
|
|
125
125
|
waitUntil(cb) {
|
|
126
126
|
waitUntilPromises.push(cb.catch(err => console.error(err)));
|
|
127
127
|
},
|
|
128
128
|
};
|
|
129
|
-
utils_js_1.nodeRequestResponseMap.set(nodeRequest, serverResponse);
|
|
130
129
|
let response$;
|
|
131
130
|
try {
|
|
132
|
-
response$ =
|
|
131
|
+
response$ = handleNodeRequestAndResponse(nodeRequest, nodeResponse, defaultServerContext, ...ctx);
|
|
133
132
|
}
|
|
134
133
|
catch (err) {
|
|
135
134
|
response$ = (0, utils_js_1.handleErrorFromRequestHandler)(err, fetchAPI.Response);
|
|
@@ -137,13 +136,13 @@ function createServerAdapter(serverAdapterBaseObject, options) {
|
|
|
137
136
|
if ((0, utils_js_1.isPromise)(response$)) {
|
|
138
137
|
return response$
|
|
139
138
|
.catch((e) => (0, utils_js_1.handleErrorFromRequestHandler)(e, fetchAPI.Response))
|
|
140
|
-
.then(response => (0, utils_js_1.sendNodeResponse)(response,
|
|
139
|
+
.then(response => (0, utils_js_1.sendNodeResponse)(response, nodeResponse, nodeRequest))
|
|
141
140
|
.catch(err => {
|
|
142
141
|
console.error(`Unexpected error while handling request: ${err.message || err}`);
|
|
143
142
|
});
|
|
144
143
|
}
|
|
145
144
|
try {
|
|
146
|
-
return (0, utils_js_1.sendNodeResponse)(response$,
|
|
145
|
+
return (0, utils_js_1.sendNodeResponse)(response$, nodeResponse, nodeRequest);
|
|
147
146
|
}
|
|
148
147
|
catch (err) {
|
|
149
148
|
console.error(`Unexpected error while handling request: ${err.message || err}`);
|
|
@@ -285,7 +284,7 @@ function createServerAdapter(serverAdapterBaseObject, options) {
|
|
|
285
284
|
return fetchFn(input, ...maybeCtx);
|
|
286
285
|
};
|
|
287
286
|
const adapterObj = {
|
|
288
|
-
handleRequest,
|
|
287
|
+
handleRequest: handleRequestWithWaitUntil,
|
|
289
288
|
fetch: fetchFn,
|
|
290
289
|
handleNodeRequest,
|
|
291
290
|
handleNodeRequestAndResponse,
|
|
@@ -113,19 +113,18 @@ function createServerAdapter(serverAdapterBaseObject, options) {
|
|
|
113
113
|
nodeRequestResponseMap.set(nodeRequest, nodeResponse);
|
|
114
114
|
return handleNodeRequest(nodeRequest, ...ctx);
|
|
115
115
|
}
|
|
116
|
-
function requestListener(nodeRequest,
|
|
116
|
+
function requestListener(nodeRequest, nodeResponse, ...ctx) {
|
|
117
117
|
const waitUntilPromises = [];
|
|
118
118
|
const defaultServerContext = {
|
|
119
119
|
req: nodeRequest,
|
|
120
|
-
res:
|
|
120
|
+
res: nodeResponse,
|
|
121
121
|
waitUntil(cb) {
|
|
122
122
|
waitUntilPromises.push(cb.catch(err => console.error(err)));
|
|
123
123
|
},
|
|
124
124
|
};
|
|
125
|
-
nodeRequestResponseMap.set(nodeRequest, serverResponse);
|
|
126
125
|
let response$;
|
|
127
126
|
try {
|
|
128
|
-
response$ =
|
|
127
|
+
response$ = handleNodeRequestAndResponse(nodeRequest, nodeResponse, defaultServerContext, ...ctx);
|
|
129
128
|
}
|
|
130
129
|
catch (err) {
|
|
131
130
|
response$ = handleErrorFromRequestHandler(err, fetchAPI.Response);
|
|
@@ -133,13 +132,13 @@ function createServerAdapter(serverAdapterBaseObject, options) {
|
|
|
133
132
|
if (isPromise(response$)) {
|
|
134
133
|
return response$
|
|
135
134
|
.catch((e) => handleErrorFromRequestHandler(e, fetchAPI.Response))
|
|
136
|
-
.then(response => sendNodeResponse(response,
|
|
135
|
+
.then(response => sendNodeResponse(response, nodeResponse, nodeRequest))
|
|
137
136
|
.catch(err => {
|
|
138
137
|
console.error(`Unexpected error while handling request: ${err.message || err}`);
|
|
139
138
|
});
|
|
140
139
|
}
|
|
141
140
|
try {
|
|
142
|
-
return sendNodeResponse(response$,
|
|
141
|
+
return sendNodeResponse(response$, nodeResponse, nodeRequest);
|
|
143
142
|
}
|
|
144
143
|
catch (err) {
|
|
145
144
|
console.error(`Unexpected error while handling request: ${err.message || err}`);
|
|
@@ -281,7 +280,7 @@ function createServerAdapter(serverAdapterBaseObject, options) {
|
|
|
281
280
|
return fetchFn(input, ...maybeCtx);
|
|
282
281
|
};
|
|
283
282
|
const adapterObj = {
|
|
284
|
-
handleRequest,
|
|
283
|
+
handleRequest: handleRequestWithWaitUntil,
|
|
285
284
|
fetch: fetchFn,
|
|
286
285
|
handleNodeRequest,
|
|
287
286
|
handleNodeRequestAndResponse,
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { FetchAPI, ServerAdapterRequestHandler } from '../types.cjs';
|
|
1
|
+
import { FetchAPI, ServerAdapterRequestHandler, type ServerAdapterInitialContext } from '../types.cjs';
|
|
2
2
|
export interface ServerAdapterPlugin<TServerContext = {}> {
|
|
3
|
-
onRequest?: OnRequestHook<TServerContext>;
|
|
4
|
-
onResponse?: OnResponseHook<TServerContext>;
|
|
3
|
+
onRequest?: OnRequestHook<TServerContext & ServerAdapterInitialContext>;
|
|
4
|
+
onResponse?: OnResponseHook<TServerContext & ServerAdapterInitialContext>;
|
|
5
5
|
}
|
|
6
6
|
export type OnRequestHook<TServerContext> = (payload: OnRequestEventPayload<TServerContext>) => Promise<void> | void;
|
|
7
7
|
export interface OnRequestEventPayload<TServerContext> {
|
|
8
8
|
request: Request;
|
|
9
9
|
setRequest(newRequest: Request): void;
|
|
10
|
-
serverContext: TServerContext
|
|
10
|
+
serverContext: TServerContext;
|
|
11
11
|
fetchAPI: FetchAPI;
|
|
12
12
|
requestHandler: ServerAdapterRequestHandler<TServerContext>;
|
|
13
13
|
setRequestHandler(newRequestHandler: ServerAdapterRequestHandler<TServerContext>): void;
|
|
@@ -17,7 +17,7 @@ export interface OnRequestEventPayload<TServerContext> {
|
|
|
17
17
|
export type OnResponseHook<TServerContext> = (payload: OnResponseEventPayload<TServerContext>) => Promise<void> | void;
|
|
18
18
|
export interface OnResponseEventPayload<TServerContext> {
|
|
19
19
|
request: Request;
|
|
20
|
-
serverContext: TServerContext
|
|
20
|
+
serverContext: TServerContext;
|
|
21
21
|
response: Response;
|
|
22
22
|
setResponse(newResponse: Response): void;
|
|
23
23
|
fetchAPI: FetchAPI;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { FetchAPI, ServerAdapterRequestHandler } from '../types.js';
|
|
1
|
+
import { FetchAPI, ServerAdapterRequestHandler, type ServerAdapterInitialContext } from '../types.js';
|
|
2
2
|
export interface ServerAdapterPlugin<TServerContext = {}> {
|
|
3
|
-
onRequest?: OnRequestHook<TServerContext>;
|
|
4
|
-
onResponse?: OnResponseHook<TServerContext>;
|
|
3
|
+
onRequest?: OnRequestHook<TServerContext & ServerAdapterInitialContext>;
|
|
4
|
+
onResponse?: OnResponseHook<TServerContext & ServerAdapterInitialContext>;
|
|
5
5
|
}
|
|
6
6
|
export type OnRequestHook<TServerContext> = (payload: OnRequestEventPayload<TServerContext>) => Promise<void> | void;
|
|
7
7
|
export interface OnRequestEventPayload<TServerContext> {
|
|
8
8
|
request: Request;
|
|
9
9
|
setRequest(newRequest: Request): void;
|
|
10
|
-
serverContext: TServerContext
|
|
10
|
+
serverContext: TServerContext;
|
|
11
11
|
fetchAPI: FetchAPI;
|
|
12
12
|
requestHandler: ServerAdapterRequestHandler<TServerContext>;
|
|
13
13
|
setRequestHandler(newRequestHandler: ServerAdapterRequestHandler<TServerContext>): void;
|
|
@@ -17,7 +17,7 @@ export interface OnRequestEventPayload<TServerContext> {
|
|
|
17
17
|
export type OnResponseHook<TServerContext> = (payload: OnResponseEventPayload<TServerContext>) => Promise<void> | void;
|
|
18
18
|
export interface OnResponseEventPayload<TServerContext> {
|
|
19
19
|
request: Request;
|
|
20
|
-
serverContext: TServerContext
|
|
20
|
+
serverContext: TServerContext;
|
|
21
21
|
response: Response;
|
|
22
22
|
setResponse(newResponse: Response): void;
|
|
23
23
|
fetchAPI: FetchAPI;
|
package/typings/types.d.cts
CHANGED
|
@@ -17,7 +17,7 @@ export interface ServerAdapterObject<TServerContext> extends EventListenerObject
|
|
|
17
17
|
/**
|
|
18
18
|
* A basic request listener that takes a `Request` with the server context and returns a `Response`.
|
|
19
19
|
*/
|
|
20
|
-
handleRequest: (request: Request, ctx: TServerContext) => Promise<Response> | Response;
|
|
20
|
+
handleRequest: (request: Request, ctx: TServerContext & Partial<ServerAdapterInitialContext>) => Promise<Response> | Response;
|
|
21
21
|
/**
|
|
22
22
|
* WHATWG Fetch spec compliant `fetch` function that can be used for testing purposes.
|
|
23
23
|
*/
|
|
@@ -33,27 +33,29 @@ export interface ServerAdapterObject<TServerContext> extends EventListenerObject
|
|
|
33
33
|
fetch(url: URL, init: RequestInit, ...ctx: Partial<TServerContext>[]): Promise<Response> | Response;
|
|
34
34
|
/**
|
|
35
35
|
* This function takes Node's request object and returns a WHATWG Fetch spec compliant `Response` object.
|
|
36
|
+
*
|
|
37
|
+
* @deprecated Use `handleNodeRequestAndResponse` instead.
|
|
36
38
|
**/
|
|
37
|
-
handleNodeRequest(nodeRequest: NodeRequest, ...ctx: Partial<TServerContext>[]): Promise<Response> | Response;
|
|
39
|
+
handleNodeRequest(nodeRequest: NodeRequest, ...ctx: Partial<TServerContext & ServerAdapterInitialContext>[]): Promise<Response> | Response;
|
|
38
40
|
/**
|
|
39
41
|
* This function takes Node's request and response objects and returns a WHATWG Fetch spec compliant `Response` object.
|
|
40
42
|
*/
|
|
41
43
|
handleNodeRequestAndResponse(nodeRequest: NodeRequest, nodeResponseOrContainer: {
|
|
42
44
|
raw: NodeResponse;
|
|
43
|
-
} | NodeResponse, ...ctx: Partial<TServerContext>[]): Promise<Response> | Response;
|
|
45
|
+
} | NodeResponse, ...ctx: Partial<TServerContext & ServerAdapterInitialContext>[]): Promise<Response> | Response;
|
|
44
46
|
/**
|
|
45
47
|
* A request listener function that can be used with any Node server variation.
|
|
46
48
|
*/
|
|
47
49
|
requestListener: RequestListener;
|
|
48
50
|
handleUWS: UWSHandler;
|
|
49
|
-
handle(req: NodeRequest, res: NodeResponse, ...ctx: Partial<TServerContext>[]): Promise<void>;
|
|
50
|
-
handle(requestLike: RequestLike, ...ctx: Partial<TServerContext>[]): Promise<Response> | Response;
|
|
51
|
-
handle(request: Request, ...ctx: Partial<TServerContext>[]): Promise<Response> | Response;
|
|
52
|
-
handle(fetchEvent: FetchEvent & Partial<TServerContext>, ...ctx: Partial<TServerContext>[]): void;
|
|
53
|
-
handle(res: UWSResponse, req: UWSRequest, ...ctx: Partial<TServerContext>[]): Promise<void>;
|
|
51
|
+
handle(req: NodeRequest, res: NodeResponse, ...ctx: Partial<TServerContext & ServerAdapterInitialContext>[]): Promise<void>;
|
|
52
|
+
handle(requestLike: RequestLike, ...ctx: Partial<TServerContext & ServerAdapterInitialContext>[]): Promise<Response> | Response;
|
|
53
|
+
handle(request: Request, ...ctx: Partial<TServerContext & ServerAdapterInitialContext>[]): Promise<Response> | Response;
|
|
54
|
+
handle(fetchEvent: FetchEvent & Partial<TServerContext & ServerAdapterInitialContext>, ...ctx: Partial<TServerContext>[]): void;
|
|
55
|
+
handle(res: UWSResponse, req: UWSRequest, ...ctx: Partial<TServerContext & ServerAdapterInitialContext>[]): Promise<void>;
|
|
54
56
|
handle(container: {
|
|
55
57
|
request: Request;
|
|
56
|
-
} & Partial<TServerContext>, ...ctx: Partial<TServerContext>[]): Promise<Response> | Response;
|
|
58
|
+
} & Partial<TServerContext & ServerAdapterInitialContext>, ...ctx: Partial<TServerContext & ServerAdapterInitialContext>[]): Promise<Response> | Response;
|
|
57
59
|
}
|
|
58
60
|
export interface RequestLike {
|
|
59
61
|
url: string;
|
|
@@ -67,10 +69,20 @@ export interface HeadersLike extends Iterable<[string, string]> {
|
|
|
67
69
|
has(name: string): boolean;
|
|
68
70
|
}
|
|
69
71
|
export type ServerAdapter<TServerContext, TBaseObject extends ServerAdapterBaseObject<TServerContext>> = TBaseObject & ServerAdapterObject<TServerContext>['handle'] & ServerAdapterObject<TServerContext>;
|
|
70
|
-
export type ServerAdapterRequestHandler<TServerContext> = (request: Request, ctx: TServerContext) => Promise<Response> | Response;
|
|
72
|
+
export type ServerAdapterRequestHandler<TServerContext> = (request: Request, ctx: TServerContext & ServerAdapterInitialContext) => Promise<Response> | Response;
|
|
71
73
|
export type ServerAdapterNodeContext = {
|
|
72
74
|
req: NodeRequest;
|
|
73
75
|
res: NodeResponse;
|
|
74
76
|
};
|
|
75
|
-
export type WaitUntilFn = (promise: Promise<
|
|
77
|
+
export type WaitUntilFn = (promise: Promise<unknown>) => void;
|
|
76
78
|
export type FetchAPI = ReturnType<typeof import('@whatwg-node/fetch').createFetch>;
|
|
79
|
+
export type ServerAdapterInitialContext = {
|
|
80
|
+
/**
|
|
81
|
+
* Register a promise that should be waited in the background for before the server process is exited.
|
|
82
|
+
*
|
|
83
|
+
* This also avoids unhandled promise rejections, which would otherwise cause the process to exit on some environment like Node.
|
|
84
|
+
* @param promise The promise to wait for
|
|
85
|
+
* @returns
|
|
86
|
+
*/
|
|
87
|
+
waitUntil: WaitUntilFn;
|
|
88
|
+
};
|
package/typings/types.d.ts
CHANGED
|
@@ -17,7 +17,7 @@ export interface ServerAdapterObject<TServerContext> extends EventListenerObject
|
|
|
17
17
|
/**
|
|
18
18
|
* A basic request listener that takes a `Request` with the server context and returns a `Response`.
|
|
19
19
|
*/
|
|
20
|
-
handleRequest: (request: Request, ctx: TServerContext) => Promise<Response> | Response;
|
|
20
|
+
handleRequest: (request: Request, ctx: TServerContext & Partial<ServerAdapterInitialContext>) => Promise<Response> | Response;
|
|
21
21
|
/**
|
|
22
22
|
* WHATWG Fetch spec compliant `fetch` function that can be used for testing purposes.
|
|
23
23
|
*/
|
|
@@ -33,27 +33,29 @@ export interface ServerAdapterObject<TServerContext> extends EventListenerObject
|
|
|
33
33
|
fetch(url: URL, init: RequestInit, ...ctx: Partial<TServerContext>[]): Promise<Response> | Response;
|
|
34
34
|
/**
|
|
35
35
|
* This function takes Node's request object and returns a WHATWG Fetch spec compliant `Response` object.
|
|
36
|
+
*
|
|
37
|
+
* @deprecated Use `handleNodeRequestAndResponse` instead.
|
|
36
38
|
**/
|
|
37
|
-
handleNodeRequest(nodeRequest: NodeRequest, ...ctx: Partial<TServerContext>[]): Promise<Response> | Response;
|
|
39
|
+
handleNodeRequest(nodeRequest: NodeRequest, ...ctx: Partial<TServerContext & ServerAdapterInitialContext>[]): Promise<Response> | Response;
|
|
38
40
|
/**
|
|
39
41
|
* This function takes Node's request and response objects and returns a WHATWG Fetch spec compliant `Response` object.
|
|
40
42
|
*/
|
|
41
43
|
handleNodeRequestAndResponse(nodeRequest: NodeRequest, nodeResponseOrContainer: {
|
|
42
44
|
raw: NodeResponse;
|
|
43
|
-
} | NodeResponse, ...ctx: Partial<TServerContext>[]): Promise<Response> | Response;
|
|
45
|
+
} | NodeResponse, ...ctx: Partial<TServerContext & ServerAdapterInitialContext>[]): Promise<Response> | Response;
|
|
44
46
|
/**
|
|
45
47
|
* A request listener function that can be used with any Node server variation.
|
|
46
48
|
*/
|
|
47
49
|
requestListener: RequestListener;
|
|
48
50
|
handleUWS: UWSHandler;
|
|
49
|
-
handle(req: NodeRequest, res: NodeResponse, ...ctx: Partial<TServerContext>[]): Promise<void>;
|
|
50
|
-
handle(requestLike: RequestLike, ...ctx: Partial<TServerContext>[]): Promise<Response> | Response;
|
|
51
|
-
handle(request: Request, ...ctx: Partial<TServerContext>[]): Promise<Response> | Response;
|
|
52
|
-
handle(fetchEvent: FetchEvent & Partial<TServerContext>, ...ctx: Partial<TServerContext>[]): void;
|
|
53
|
-
handle(res: UWSResponse, req: UWSRequest, ...ctx: Partial<TServerContext>[]): Promise<void>;
|
|
51
|
+
handle(req: NodeRequest, res: NodeResponse, ...ctx: Partial<TServerContext & ServerAdapterInitialContext>[]): Promise<void>;
|
|
52
|
+
handle(requestLike: RequestLike, ...ctx: Partial<TServerContext & ServerAdapterInitialContext>[]): Promise<Response> | Response;
|
|
53
|
+
handle(request: Request, ...ctx: Partial<TServerContext & ServerAdapterInitialContext>[]): Promise<Response> | Response;
|
|
54
|
+
handle(fetchEvent: FetchEvent & Partial<TServerContext & ServerAdapterInitialContext>, ...ctx: Partial<TServerContext>[]): void;
|
|
55
|
+
handle(res: UWSResponse, req: UWSRequest, ...ctx: Partial<TServerContext & ServerAdapterInitialContext>[]): Promise<void>;
|
|
54
56
|
handle(container: {
|
|
55
57
|
request: Request;
|
|
56
|
-
} & Partial<TServerContext>, ...ctx: Partial<TServerContext>[]): Promise<Response> | Response;
|
|
58
|
+
} & Partial<TServerContext & ServerAdapterInitialContext>, ...ctx: Partial<TServerContext & ServerAdapterInitialContext>[]): Promise<Response> | Response;
|
|
57
59
|
}
|
|
58
60
|
export interface RequestLike {
|
|
59
61
|
url: string;
|
|
@@ -67,10 +69,20 @@ export interface HeadersLike extends Iterable<[string, string]> {
|
|
|
67
69
|
has(name: string): boolean;
|
|
68
70
|
}
|
|
69
71
|
export type ServerAdapter<TServerContext, TBaseObject extends ServerAdapterBaseObject<TServerContext>> = TBaseObject & ServerAdapterObject<TServerContext>['handle'] & ServerAdapterObject<TServerContext>;
|
|
70
|
-
export type ServerAdapterRequestHandler<TServerContext> = (request: Request, ctx: TServerContext) => Promise<Response> | Response;
|
|
72
|
+
export type ServerAdapterRequestHandler<TServerContext> = (request: Request, ctx: TServerContext & ServerAdapterInitialContext) => Promise<Response> | Response;
|
|
71
73
|
export type ServerAdapterNodeContext = {
|
|
72
74
|
req: NodeRequest;
|
|
73
75
|
res: NodeResponse;
|
|
74
76
|
};
|
|
75
|
-
export type WaitUntilFn = (promise: Promise<
|
|
77
|
+
export type WaitUntilFn = (promise: Promise<unknown>) => void;
|
|
76
78
|
export type FetchAPI = ReturnType<typeof import('@whatwg-node/fetch').createFetch>;
|
|
79
|
+
export type ServerAdapterInitialContext = {
|
|
80
|
+
/**
|
|
81
|
+
* Register a promise that should be waited in the background for before the server process is exited.
|
|
82
|
+
*
|
|
83
|
+
* This also avoids unhandled promise rejections, which would otherwise cause the process to exit on some environment like Node.
|
|
84
|
+
* @param promise The promise to wait for
|
|
85
|
+
* @returns
|
|
86
|
+
*/
|
|
87
|
+
waitUntil: WaitUntilFn;
|
|
88
|
+
};
|