@whatwg-node/server 0.6.1 → 0.6.2-alpha-20230205160326-cd8fd84

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.
Files changed (4) hide show
  1. package/index.js +32 -13
  2. package/index.mjs +32 -13
  3. package/package.json +2 -2
  4. package/utils.d.ts +1 -1
package/index.js CHANGED
@@ -132,32 +132,51 @@ function isReadableStream(stream) {
132
132
  function isFetchEvent(event) {
133
133
  return event != null && event.request != null && event.respondWith != null;
134
134
  }
135
- async function sendNodeResponse({ headers, status, statusText, body }, serverResponse) {
136
- headers.forEach((value, name) => {
135
+ function configureSocket(rawRequest) {
136
+ var _a, _b, _c, _d, _e, _f;
137
+ (_b = (_a = rawRequest === null || rawRequest === void 0 ? void 0 : rawRequest.socket) === null || _a === void 0 ? void 0 : _a.setTimeout) === null || _b === void 0 ? void 0 : _b.call(_a, 0);
138
+ (_d = (_c = rawRequest === null || rawRequest === void 0 ? void 0 : rawRequest.socket) === null || _c === void 0 ? void 0 : _c.setNoDelay) === null || _d === void 0 ? void 0 : _d.call(_c, true);
139
+ (_f = (_e = rawRequest === null || rawRequest === void 0 ? void 0 : rawRequest.socket) === null || _e === void 0 ? void 0 : _e.setKeepAlive) === null || _f === void 0 ? void 0 : _f.call(_e, true);
140
+ }
141
+ async function sendNodeResponse(fetchResponse, serverResponse, nodeRequest) {
142
+ fetchResponse.headers.forEach((value, name) => {
137
143
  serverResponse.setHeader(name, value);
138
144
  });
139
- serverResponse.statusCode = status;
140
- serverResponse.statusMessage = statusText;
145
+ serverResponse.statusCode = fetchResponse.status;
146
+ serverResponse.statusMessage = fetchResponse.statusText;
141
147
  // eslint-disable-next-line no-async-promise-executor
142
148
  return new Promise(async (resolve) => {
143
149
  serverResponse.once('close', resolve);
144
- if (body == null) {
150
+ // Our Node-fetch enhancements
151
+ if ('bodyType' in fetchResponse && fetchResponse.bodyType != null && (fetchResponse.bodyType === 'String' || fetchResponse.bodyType === 'Uint8Array')) {
152
+ // @ts-expect-error http and http2 writes are actually compatible
153
+ serverResponse.write(fetchResponse.bodyInit);
154
+ serverResponse.end();
155
+ return;
156
+ }
157
+ // Other fetch implementations
158
+ const fetchBody = fetchResponse.body;
159
+ if (fetchBody == null) {
145
160
  serverResponse.end();
161
+ return;
146
162
  }
147
- else if (body[Symbol.toStringTag] === 'Uint8Array') {
163
+ if (fetchBody[Symbol.toStringTag] === 'Uint8Array') {
148
164
  serverResponse
149
165
  // @ts-expect-error http and http2 writes are actually compatible
150
- .write(body);
166
+ .write(fetchBody);
151
167
  serverResponse.end();
168
+ return;
152
169
  }
153
- else if (isReadable(body)) {
170
+ configureSocket(nodeRequest);
171
+ if (isReadable(fetchBody)) {
154
172
  serverResponse.once('close', () => {
155
- body.destroy();
173
+ fetchBody.destroy();
156
174
  });
157
- body.pipe(serverResponse);
175
+ fetchBody.pipe(serverResponse);
176
+ return;
158
177
  }
159
- else if (isAsyncIterable(body)) {
160
- for await (const chunk of body) {
178
+ if (isAsyncIterable(fetchBody)) {
179
+ for await (const chunk of fetchBody) {
161
180
  if (!serverResponse
162
181
  // @ts-expect-error http and http2 writes are actually compatible
163
182
  .write(chunk)) {
@@ -221,7 +240,7 @@ RequestCtor = fetch.Request) {
221
240
  };
222
241
  const response = await handleNodeRequest(nodeRequest, defaultServerContext, ...ctx);
223
242
  if (response) {
224
- await sendNodeResponse(response, serverResponse);
243
+ await sendNodeResponse(response, serverResponse, nodeRequest);
225
244
  }
226
245
  else {
227
246
  await new Promise(resolve => {
package/index.mjs CHANGED
@@ -129,32 +129,51 @@ function isReadableStream(stream) {
129
129
  function isFetchEvent(event) {
130
130
  return event != null && event.request != null && event.respondWith != null;
131
131
  }
132
- async function sendNodeResponse({ headers, status, statusText, body }, serverResponse) {
133
- headers.forEach((value, name) => {
132
+ function configureSocket(rawRequest) {
133
+ var _a, _b, _c, _d, _e, _f;
134
+ (_b = (_a = rawRequest === null || rawRequest === void 0 ? void 0 : rawRequest.socket) === null || _a === void 0 ? void 0 : _a.setTimeout) === null || _b === void 0 ? void 0 : _b.call(_a, 0);
135
+ (_d = (_c = rawRequest === null || rawRequest === void 0 ? void 0 : rawRequest.socket) === null || _c === void 0 ? void 0 : _c.setNoDelay) === null || _d === void 0 ? void 0 : _d.call(_c, true);
136
+ (_f = (_e = rawRequest === null || rawRequest === void 0 ? void 0 : rawRequest.socket) === null || _e === void 0 ? void 0 : _e.setKeepAlive) === null || _f === void 0 ? void 0 : _f.call(_e, true);
137
+ }
138
+ async function sendNodeResponse(fetchResponse, serverResponse, nodeRequest) {
139
+ fetchResponse.headers.forEach((value, name) => {
134
140
  serverResponse.setHeader(name, value);
135
141
  });
136
- serverResponse.statusCode = status;
137
- serverResponse.statusMessage = statusText;
142
+ serverResponse.statusCode = fetchResponse.status;
143
+ serverResponse.statusMessage = fetchResponse.statusText;
138
144
  // eslint-disable-next-line no-async-promise-executor
139
145
  return new Promise(async (resolve) => {
140
146
  serverResponse.once('close', resolve);
141
- if (body == null) {
147
+ // Our Node-fetch enhancements
148
+ if ('bodyType' in fetchResponse && fetchResponse.bodyType != null && (fetchResponse.bodyType === 'String' || fetchResponse.bodyType === 'Uint8Array')) {
149
+ // @ts-expect-error http and http2 writes are actually compatible
150
+ serverResponse.write(fetchResponse.bodyInit);
151
+ serverResponse.end();
152
+ return;
153
+ }
154
+ // Other fetch implementations
155
+ const fetchBody = fetchResponse.body;
156
+ if (fetchBody == null) {
142
157
  serverResponse.end();
158
+ return;
143
159
  }
144
- else if (body[Symbol.toStringTag] === 'Uint8Array') {
160
+ if (fetchBody[Symbol.toStringTag] === 'Uint8Array') {
145
161
  serverResponse
146
162
  // @ts-expect-error http and http2 writes are actually compatible
147
- .write(body);
163
+ .write(fetchBody);
148
164
  serverResponse.end();
165
+ return;
149
166
  }
150
- else if (isReadable(body)) {
167
+ configureSocket(nodeRequest);
168
+ if (isReadable(fetchBody)) {
151
169
  serverResponse.once('close', () => {
152
- body.destroy();
170
+ fetchBody.destroy();
153
171
  });
154
- body.pipe(serverResponse);
172
+ fetchBody.pipe(serverResponse);
173
+ return;
155
174
  }
156
- else if (isAsyncIterable(body)) {
157
- for await (const chunk of body) {
175
+ if (isAsyncIterable(fetchBody)) {
176
+ for await (const chunk of fetchBody) {
158
177
  if (!serverResponse
159
178
  // @ts-expect-error http and http2 writes are actually compatible
160
179
  .write(chunk)) {
@@ -218,7 +237,7 @@ RequestCtor = Request) {
218
237
  };
219
238
  const response = await handleNodeRequest(nodeRequest, defaultServerContext, ...ctx);
220
239
  if (response) {
221
- await sendNodeResponse(response, serverResponse);
240
+ await sendNodeResponse(response, serverResponse, nodeRequest);
222
241
  }
223
242
  else {
224
243
  await new Promise(resolve => {
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@whatwg-node/server",
3
- "version": "0.6.1",
3
+ "version": "0.6.2-alpha-20230205160326-cd8fd84",
4
4
  "description": "Fetch API compliant HTTP Server adapter",
5
5
  "sideEffects": false,
6
6
  "dependencies": {
7
- "@whatwg-node/fetch": "0.6.6",
7
+ "@whatwg-node/fetch": "0.6.7-alpha-20230205160326-cd8fd84",
8
8
  "tslib": "^2.3.1"
9
9
  },
10
10
  "repository": {
package/utils.d.ts CHANGED
@@ -28,5 +28,5 @@ export declare function isNodeRequest(request: any): request is NodeRequest;
28
28
  export declare function isServerResponse(stream: any): stream is NodeResponse;
29
29
  export declare function isReadableStream(stream: any): stream is ReadableStream;
30
30
  export declare function isFetchEvent(event: any): event is FetchEvent;
31
- export declare function sendNodeResponse({ headers, status, statusText, body }: Response, serverResponse: NodeResponse): Promise<void>;
31
+ export declare function sendNodeResponse(fetchResponse: Response, serverResponse: NodeResponse, nodeRequest: NodeRequest): Promise<void>;
32
32
  export declare function isRequestInit(val: unknown): val is RequestInit;