@whatwg-node/server 0.4.8 → 0.4.10-alpha-20220926221307-730c2a6

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.
package/index.d.ts CHANGED
@@ -2,18 +2,18 @@
2
2
  /// <reference lib="webworker" />
3
3
  import type { RequestListener, ServerResponse } from 'node:http';
4
4
  import { NodeRequest } from './utils';
5
- export interface ServerAdapterBaseObject<TServerContext, THandleRequest extends ServerAdapterRequestHandler<TServerContext> = ServerAdapterRequestHandler<TServerContext>> {
5
+ export interface ServerAdapterBaseObject<TServerContext> {
6
6
  /**
7
7
  * An async function that takes `Request` and the server context and returns a `Response`.
8
8
  * If you use `requestListener`, the server context is `{ req: IncomingMessage, res: ServerResponse }`.
9
9
  */
10
- handle: THandleRequest;
10
+ handle: ServerAdapterRequestHandler<TServerContext>;
11
11
  }
12
- export interface ServerAdapterObject<TServerContext, TBaseObject extends ServerAdapterBaseObject<TServerContext, ServerAdapterRequestHandler<TServerContext>>> extends EventListenerObject {
12
+ export interface ServerAdapterObject<TServerContext> extends EventListenerObject {
13
13
  /**
14
14
  * A basic request listener that takes a `Request` with the server context and returns a `Response`.
15
15
  */
16
- handleRequest: TBaseObject['handle'];
16
+ handleRequest: ServerAdapterRequestHandler<TServerContext>;
17
17
  /**
18
18
  * WHATWG Fetch spec compliant `fetch` function that can be used for testing purposes.
19
19
  */
@@ -35,6 +35,9 @@ export interface ServerAdapterObject<TServerContext, TBaseObject extends ServerA
35
35
  * A request listener function that can be used with any Node server variation.
36
36
  */
37
37
  requestListener: RequestListener;
38
+ /**
39
+ * Flexible and generic request handler for all environments.
40
+ */
38
41
  handle(req: NodeRequest, res: ServerResponse, ...ctx: Partial<TServerContext>[]): Promise<void>;
39
42
  handle(request: Request, ...ctx: Partial<TServerContext>[]): Promise<Response> | Response;
40
43
  handle(fetchEvent: FetchEvent & Partial<TServerContext>, ...ctx: Partial<TServerContext>[]): void;
@@ -42,13 +45,13 @@ export interface ServerAdapterObject<TServerContext, TBaseObject extends ServerA
42
45
  request: Request;
43
46
  } & Partial<TServerContext>, ...ctx: Partial<TServerContext>[]): Promise<Response> | Response;
44
47
  }
45
- export declare type ServerAdapter<TServerContext, TBaseObject extends ServerAdapterBaseObject<TServerContext>> = TBaseObject & ServerAdapterObject<TServerContext, TBaseObject>['handle'] & ServerAdapterObject<TServerContext, TBaseObject>;
48
+ export declare type ServerAdapter<TServerContext> = ServerAdapterObject<TServerContext>['handle'] & ServerAdapterObject<TServerContext>['requestListener'] & ServerAdapterObject<TServerContext>;
46
49
  export declare type ServerAdapterRequestHandler<TServerContext> = (request: Request, ctx: TServerContext) => Promise<Response> | Response;
47
- export declare type DefaultServerAdapterContext = {
50
+ export interface NodeServerAdapterContext {
48
51
  req: NodeRequest;
49
52
  res: ServerResponse;
50
53
  waitUntil(promise: Promise<unknown>): void;
51
- };
52
- declare function createServerAdapter<TServerContext = DefaultServerAdapterContext, THandleRequest extends ServerAdapterRequestHandler<TServerContext> = ServerAdapterRequestHandler<TServerContext>>(serverAdapterRequestHandler: THandleRequest, RequestCtor?: typeof Request): ServerAdapter<TServerContext, ServerAdapterBaseObject<TServerContext, THandleRequest>>;
53
- declare function createServerAdapter<TServerContext, TBaseObject extends ServerAdapterBaseObject<TServerContext>>(serverAdapterBaseObject: TBaseObject, RequestCtor?: typeof Request): ServerAdapter<TServerContext, TBaseObject>;
54
+ }
55
+ declare function createServerAdapter<TServerContext>(serverAdapterRequestHandler: ServerAdapterRequestHandler<TServerContext>, RequestCtor?: typeof Request): ServerAdapter<TServerContext>;
56
+ declare function createServerAdapter<TServerContext>(serverAdapterBaseObject: ServerAdapterBaseObject<TServerContext>, RequestCtor?: typeof Request): ServerAdapter<TServerContext>;
54
57
  export { createServerAdapter };
package/index.js CHANGED
@@ -156,17 +156,23 @@ async function sendNodeResponse({ headers, status, statusText, body }, serverRes
156
156
  else if (isReadableStream(body)) {
157
157
  const reader = body.getReader();
158
158
  serverResponse.once('close', () => {
159
- reader.cancel();
159
+ reader.cancel().finally(() => {
160
+ reader.releaseLock();
161
+ body.cancel();
162
+ });
160
163
  });
161
164
  // eslint-disable-next-line no-inner-declarations
162
165
  function pump() {
163
- reader.read().then(({ done, value }) => {
166
+ reader
167
+ .read()
168
+ .then(({ done, value }) => {
164
169
  if (done) {
165
170
  serverResponse.end(resolve);
166
171
  return;
167
172
  }
168
173
  serverResponse.write(value, pump);
169
- }).catch(error => {
174
+ })
175
+ .catch(error => {
170
176
  console.error(error);
171
177
  serverResponse.end(resolve);
172
178
  });
@@ -224,14 +230,14 @@ RequestCtor = fetch.Request) {
224
230
  }
225
231
  async function requestListener(nodeRequest, serverResponse, ...ctx) {
226
232
  const waitUntilPromises = [];
227
- const defaultServerContext = {
233
+ const nodeServerContext = {
228
234
  req: nodeRequest,
229
235
  res: serverResponse,
230
236
  waitUntil(p) {
231
237
  waitUntilPromises.push(p);
232
238
  },
233
239
  };
234
- const response = await handleNodeRequest(nodeRequest, defaultServerContext, ...ctx);
240
+ const response = await handleNodeRequest(nodeRequest, nodeServerContext, ...ctx);
235
241
  if (response) {
236
242
  await sendNodeResponse(response, serverResponse);
237
243
  }
package/index.mjs CHANGED
@@ -152,17 +152,23 @@ async function sendNodeResponse({ headers, status, statusText, body }, serverRes
152
152
  else if (isReadableStream(body)) {
153
153
  const reader = body.getReader();
154
154
  serverResponse.once('close', () => {
155
- reader.cancel();
155
+ reader.cancel().finally(() => {
156
+ reader.releaseLock();
157
+ body.cancel();
158
+ });
156
159
  });
157
160
  // eslint-disable-next-line no-inner-declarations
158
161
  function pump() {
159
- reader.read().then(({ done, value }) => {
162
+ reader
163
+ .read()
164
+ .then(({ done, value }) => {
160
165
  if (done) {
161
166
  serverResponse.end(resolve);
162
167
  return;
163
168
  }
164
169
  serverResponse.write(value, pump);
165
- }).catch(error => {
170
+ })
171
+ .catch(error => {
166
172
  console.error(error);
167
173
  serverResponse.end(resolve);
168
174
  });
@@ -220,14 +226,14 @@ RequestCtor = Request) {
220
226
  }
221
227
  async function requestListener(nodeRequest, serverResponse, ...ctx) {
222
228
  const waitUntilPromises = [];
223
- const defaultServerContext = {
229
+ const nodeServerContext = {
224
230
  req: nodeRequest,
225
231
  res: serverResponse,
226
232
  waitUntil(p) {
227
233
  waitUntilPromises.push(p);
228
234
  },
229
235
  };
230
- const response = await handleNodeRequest(nodeRequest, defaultServerContext, ...ctx);
236
+ const response = await handleNodeRequest(nodeRequest, nodeServerContext, ...ctx);
231
237
  if (response) {
232
238
  await sendNodeResponse(response, serverResponse);
233
239
  }
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@whatwg-node/server",
3
- "version": "0.4.8",
3
+ "version": "0.4.10-alpha-20220926221307-730c2a6",
4
4
  "description": "Fetch API compliant HTTP Server adapter",
5
5
  "sideEffects": false,
6
6
  "peerDependencies": {
7
7
  "@types/node": "^18.0.6"
8
8
  },
9
9
  "dependencies": {
10
- "@whatwg-node/fetch": "0.4.5",
10
+ "@whatwg-node/fetch": "0.4.6-alpha-20220926221307-730c2a6",
11
11
  "tslib": "^2.3.1"
12
12
  },
13
13
  "repository": {