@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 +12 -9
- package/index.js +11 -5
- package/index.mjs +11 -5
- package/package.json +2 -2
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
|
|
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:
|
|
10
|
+
handle: ServerAdapterRequestHandler<TServerContext>;
|
|
11
11
|
}
|
|
12
|
-
export interface ServerAdapterObject<TServerContext
|
|
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:
|
|
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
|
|
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
|
|
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
|
|
53
|
-
declare function createServerAdapter<TServerContext
|
|
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
|
|
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
|
-
})
|
|
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
|
|
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,
|
|
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
|
|
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
|
-
})
|
|
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
|
|
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,
|
|
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.
|
|
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.
|
|
10
|
+
"@whatwg-node/fetch": "0.4.6-alpha-20220926221307-730c2a6",
|
|
11
11
|
"tslib": "^2.3.1"
|
|
12
12
|
},
|
|
13
13
|
"repository": {
|