@whatwg-node/server 0.6.4 → 0.6.5-alpha-20230207082824-72139f9

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 (3) hide show
  1. package/index.js +39 -9
  2. package/index.mjs +39 -9
  3. package/package.json +2 -2
package/index.js CHANGED
@@ -138,12 +138,42 @@ function configureSocket(rawRequest) {
138
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
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
140
  }
141
- async function sendNodeResponse(fetchResponse, serverResponse, nodeRequest) {
142
- fetchResponse.headers.forEach((value, name) => {
143
- serverResponse.setHeader(name, value);
141
+ function endResponse(serverResponse) {
142
+ // @ts-expect-error Avoid arguments adaptor trampoline https://v8.dev/blog/adaptor-frame
143
+ serverResponse.end(null, null, null);
144
+ }
145
+ function getHeadersObj(headers) {
146
+ return new Proxy({}, {
147
+ get(_target, prop) {
148
+ return headers.get(prop);
149
+ },
150
+ set(_target, prop, value) {
151
+ headers.set(prop, value);
152
+ return true;
153
+ },
154
+ has(_target, prop) {
155
+ return headers.has(prop);
156
+ },
157
+ deleteProperty(_target, prop) {
158
+ headers.delete(prop);
159
+ return true;
160
+ },
161
+ ownKeys() {
162
+ const keys = [];
163
+ headers.forEach((_, key) => keys.push(key));
164
+ return keys;
165
+ },
166
+ getOwnPropertyDescriptor() {
167
+ return {
168
+ enumerable: true,
169
+ configurable: true,
170
+ };
171
+ },
144
172
  });
145
- serverResponse.statusCode = fetchResponse.status;
146
- serverResponse.statusMessage = fetchResponse.statusText;
173
+ }
174
+ async function sendNodeResponse(fetchResponse, serverResponse, nodeRequest) {
175
+ const headersObj = getHeadersObj(fetchResponse.headers);
176
+ serverResponse.writeHead(fetchResponse.status, fetchResponse.statusText, headersObj);
147
177
  // eslint-disable-next-line no-async-promise-executor
148
178
  return new Promise(async (resolve) => {
149
179
  serverResponse.once('close', resolve);
@@ -153,20 +183,20 @@ async function sendNodeResponse(fetchResponse, serverResponse, nodeRequest) {
153
183
  (fetchResponse.bodyType === 'String' || fetchResponse.bodyType === 'Uint8Array')) {
154
184
  // @ts-expect-error http and http2 writes are actually compatible
155
185
  serverResponse.write(fetchResponse.bodyInit);
156
- serverResponse.end();
186
+ endResponse(serverResponse);
157
187
  return;
158
188
  }
159
189
  // Other fetch implementations
160
190
  const fetchBody = fetchResponse.body;
161
191
  if (fetchBody == null) {
162
- serverResponse.end();
192
+ endResponse(serverResponse);
163
193
  return;
164
194
  }
165
195
  if (fetchBody[Symbol.toStringTag] === 'Uint8Array') {
166
196
  serverResponse
167
197
  // @ts-expect-error http and http2 writes are actually compatible
168
198
  .write(fetchBody);
169
- serverResponse.end();
199
+ endResponse(serverResponse);
170
200
  return;
171
201
  }
172
202
  configureSocket(nodeRequest);
@@ -185,7 +215,7 @@ async function sendNodeResponse(fetchResponse, serverResponse, nodeRequest) {
185
215
  break;
186
216
  }
187
217
  }
188
- serverResponse.end();
218
+ endResponse(serverResponse);
189
219
  }
190
220
  });
191
221
  }
package/index.mjs CHANGED
@@ -135,12 +135,42 @@ function configureSocket(rawRequest) {
135
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
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
137
  }
138
- async function sendNodeResponse(fetchResponse, serverResponse, nodeRequest) {
139
- fetchResponse.headers.forEach((value, name) => {
140
- serverResponse.setHeader(name, value);
138
+ function endResponse(serverResponse) {
139
+ // @ts-expect-error Avoid arguments adaptor trampoline https://v8.dev/blog/adaptor-frame
140
+ serverResponse.end(null, null, null);
141
+ }
142
+ function getHeadersObj(headers) {
143
+ return new Proxy({}, {
144
+ get(_target, prop) {
145
+ return headers.get(prop);
146
+ },
147
+ set(_target, prop, value) {
148
+ headers.set(prop, value);
149
+ return true;
150
+ },
151
+ has(_target, prop) {
152
+ return headers.has(prop);
153
+ },
154
+ deleteProperty(_target, prop) {
155
+ headers.delete(prop);
156
+ return true;
157
+ },
158
+ ownKeys() {
159
+ const keys = [];
160
+ headers.forEach((_, key) => keys.push(key));
161
+ return keys;
162
+ },
163
+ getOwnPropertyDescriptor() {
164
+ return {
165
+ enumerable: true,
166
+ configurable: true,
167
+ };
168
+ },
141
169
  });
142
- serverResponse.statusCode = fetchResponse.status;
143
- serverResponse.statusMessage = fetchResponse.statusText;
170
+ }
171
+ async function sendNodeResponse(fetchResponse, serverResponse, nodeRequest) {
172
+ const headersObj = getHeadersObj(fetchResponse.headers);
173
+ serverResponse.writeHead(fetchResponse.status, fetchResponse.statusText, headersObj);
144
174
  // eslint-disable-next-line no-async-promise-executor
145
175
  return new Promise(async (resolve) => {
146
176
  serverResponse.once('close', resolve);
@@ -150,20 +180,20 @@ async function sendNodeResponse(fetchResponse, serverResponse, nodeRequest) {
150
180
  (fetchResponse.bodyType === 'String' || fetchResponse.bodyType === 'Uint8Array')) {
151
181
  // @ts-expect-error http and http2 writes are actually compatible
152
182
  serverResponse.write(fetchResponse.bodyInit);
153
- serverResponse.end();
183
+ endResponse(serverResponse);
154
184
  return;
155
185
  }
156
186
  // Other fetch implementations
157
187
  const fetchBody = fetchResponse.body;
158
188
  if (fetchBody == null) {
159
- serverResponse.end();
189
+ endResponse(serverResponse);
160
190
  return;
161
191
  }
162
192
  if (fetchBody[Symbol.toStringTag] === 'Uint8Array') {
163
193
  serverResponse
164
194
  // @ts-expect-error http and http2 writes are actually compatible
165
195
  .write(fetchBody);
166
- serverResponse.end();
196
+ endResponse(serverResponse);
167
197
  return;
168
198
  }
169
199
  configureSocket(nodeRequest);
@@ -182,7 +212,7 @@ async function sendNodeResponse(fetchResponse, serverResponse, nodeRequest) {
182
212
  break;
183
213
  }
184
214
  }
185
- serverResponse.end();
215
+ endResponse(serverResponse);
186
216
  }
187
217
  });
188
218
  }
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@whatwg-node/server",
3
- "version": "0.6.4",
3
+ "version": "0.6.5-alpha-20230207082824-72139f9",
4
4
  "description": "Fetch API compliant HTTP Server adapter",
5
5
  "sideEffects": false,
6
6
  "dependencies": {
7
- "@whatwg-node/fetch": "^0.6.9",
7
+ "@whatwg-node/fetch": "0.6.10-alpha-20230207082824-72139f9",
8
8
  "tslib": "^2.3.1"
9
9
  },
10
10
  "repository": {