@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, serverResponse, ...ctx) {
120
+ function requestListener(nodeRequest, nodeResponse, ...ctx) {
121
121
  const waitUntilPromises = [];
122
122
  const defaultServerContext = {
123
123
  req: nodeRequest,
124
- res: serverResponse,
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$ = handleNodeRequest(nodeRequest, defaultServerContext, ...ctx);
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, serverResponse, nodeRequest))
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$, serverResponse, nodeRequest);
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, serverResponse, ...ctx) {
116
+ function requestListener(nodeRequest, nodeResponse, ...ctx) {
117
117
  const waitUntilPromises = [];
118
118
  const defaultServerContext = {
119
119
  req: nodeRequest,
120
- res: serverResponse,
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$ = handleNodeRequest(nodeRequest, defaultServerContext, ...ctx);
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, serverResponse, nodeRequest))
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$, serverResponse, nodeRequest);
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,6 +1,6 @@
1
1
  {
2
2
  "name": "@whatwg-node/server",
3
- "version": "0.9.39",
3
+ "version": "0.9.40",
4
4
  "description": "Fetch API compliant HTTP Server adapter",
5
5
  "sideEffects": false,
6
6
  "dependencies": {
@@ -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 | undefined;
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 | undefined;
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 | undefined;
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 | undefined;
20
+ serverContext: TServerContext;
21
21
  response: Response;
22
22
  setResponse(newResponse: Response): void;
23
23
  fetchAPI: FetchAPI;
@@ -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<void> | void) => void;
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
+ };
@@ -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<void> | void) => void;
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
+ };