@whatwg-node/server 0.9.8 → 0.9.9-alpha-20230808153258-e342bf0

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.
@@ -51,58 +51,66 @@ function createServerAdapter(serverAdapterBaseObject, options) {
51
51
  }
52
52
  }
53
53
  }
54
- function handleRequest(request, serverContext) {
55
- let url = new Proxy(EMPTY_OBJECT, {
56
- get(_target, prop, _receiver) {
57
- url = new fetchAPI.URL(request.url, 'http://localhost');
58
- return Reflect.get(url, prop, url);
59
- },
60
- });
61
- let requestHandler = givenHandleRequest;
62
- let response;
63
- const onRequestHooksIteration$ = (0, utils_js_1.iterateAsyncVoid)(onRequestHooks, (onRequestHook, stopEarly) => onRequestHook({
64
- request,
65
- serverContext,
66
- fetchAPI,
67
- url,
68
- requestHandler,
69
- setRequestHandler(newRequestHandler) {
70
- requestHandler = newRequestHandler;
71
- },
72
- endResponse(newResponse) {
73
- response = newResponse;
74
- if (newResponse) {
75
- stopEarly();
76
- }
77
- },
78
- }));
79
- function handleResponse(response) {
80
- const onResponseHookPayload = {
54
+ const handleRequest = onRequestHooks.length > 0 || onResponseHooks.length > 0
55
+ ? function handleRequest(request, serverContext) {
56
+ let requestHandler = givenHandleRequest;
57
+ let response;
58
+ if (onRequestHooks.length === 0) {
59
+ return handleEarlyResponse();
60
+ }
61
+ let url = new Proxy(EMPTY_OBJECT, {
62
+ get(_target, prop, _receiver) {
63
+ url = new fetchAPI.URL(request.url, 'http://localhost');
64
+ return Reflect.get(url, prop, url);
65
+ },
66
+ });
67
+ const onRequestHooksIteration$ = (0, utils_js_1.iterateAsyncVoid)(onRequestHooks, (onRequestHook, stopEarly) => onRequestHook({
81
68
  request,
82
- response,
83
69
  serverContext,
84
- };
85
- const onResponseHooksIteration$ = (0, utils_js_1.iterateAsyncVoid)(onResponseHooks, onResponseHook => onResponseHook(onResponseHookPayload));
86
- if ((0, utils_js_1.isPromise)(onResponseHooksIteration$)) {
87
- return onResponseHooksIteration$.then(() => response);
70
+ fetchAPI,
71
+ url,
72
+ requestHandler,
73
+ setRequestHandler(newRequestHandler) {
74
+ requestHandler = newRequestHandler;
75
+ },
76
+ endResponse(newResponse) {
77
+ response = newResponse;
78
+ if (newResponse) {
79
+ stopEarly();
80
+ }
81
+ },
82
+ }));
83
+ function handleResponse(response) {
84
+ if (onRequestHooks.length === 0) {
85
+ return response;
86
+ }
87
+ const onResponseHookPayload = {
88
+ request,
89
+ response,
90
+ serverContext,
91
+ };
92
+ const onResponseHooksIteration$ = (0, utils_js_1.iterateAsyncVoid)(onResponseHooks, onResponseHook => onResponseHook(onResponseHookPayload));
93
+ if ((0, utils_js_1.isPromise)(onResponseHooksIteration$)) {
94
+ return onResponseHooksIteration$.then(() => response);
95
+ }
96
+ return response;
88
97
  }
89
- return response;
90
- }
91
- function handleEarlyResponse() {
92
- if (!response) {
93
- const response$ = requestHandler(request, serverContext);
94
- if ((0, utils_js_1.isPromise)(response$)) {
95
- return response$.then(handleResponse);
98
+ function handleEarlyResponse() {
99
+ if (!response) {
100
+ const response$ = requestHandler(request, serverContext);
101
+ if ((0, utils_js_1.isPromise)(response$)) {
102
+ return response$.then(handleResponse);
103
+ }
104
+ return handleResponse(response$);
96
105
  }
97
- return handleResponse(response$);
106
+ return handleResponse(response);
98
107
  }
99
- return handleResponse(response);
100
- }
101
- if ((0, utils_js_1.isPromise)(onRequestHooksIteration$)) {
102
- return onRequestHooksIteration$.then(handleEarlyResponse);
108
+ if ((0, utils_js_1.isPromise)(onRequestHooksIteration$)) {
109
+ return onRequestHooksIteration$.then(handleEarlyResponse);
110
+ }
111
+ return handleEarlyResponse();
103
112
  }
104
- return handleEarlyResponse();
105
- }
113
+ : givenHandleRequest;
106
114
  function handleNodeRequest(nodeRequest, ...ctx) {
107
115
  const serverContext = ctx.length > 1 ? (0, utils_js_1.completeAssign)(...ctx) : ctx[0] || {};
108
116
  const request = (0, utils_js_1.normalizeNodeRequest)(nodeRequest, fetchAPI.Request);
@@ -115,26 +123,27 @@ function createServerAdapter(serverAdapterBaseObject, options) {
115
123
  res: serverResponse,
116
124
  };
117
125
  addWaitUntil(defaultServerContext, waitUntilPromises);
118
- const response$ = handleNodeRequest(nodeRequest, defaultServerContext, ...ctx);
119
- function handleFetchResponse(response) {
120
- try {
121
- if (serverResponse.closed || serverResponse.destroyed) {
122
- return;
123
- }
124
- if (response) {
125
- return (0, utils_js_1.sendNodeResponse)(response, serverResponse, nodeRequest);
126
- }
127
- serverResponse.statusCode = 404;
128
- serverResponse.end();
129
- }
130
- catch (e) {
131
- console.error(`Unexpected error: ${e.message || e}`);
132
- }
126
+ let response$;
127
+ try {
128
+ response$ = handleNodeRequest(nodeRequest, defaultServerContext, ...ctx);
129
+ }
130
+ catch (err) {
131
+ response$ = (0, utils_js_1.handleErrorFromRequestHandler)(err, fetchAPI.Response);
133
132
  }
134
133
  if ((0, utils_js_1.isPromise)(response$)) {
135
- return response$.then(handleFetchResponse);
134
+ return response$
135
+ .catch((e) => (0, utils_js_1.handleErrorFromRequestHandler)(e, fetchAPI.Response))
136
+ .then(response => (0, utils_js_1.sendNodeResponse)(response, serverResponse, nodeRequest))
137
+ .catch(err => {
138
+ console.error(`Unexpected error while handling request: ${err.message || err}`);
139
+ });
140
+ }
141
+ try {
142
+ return (0, utils_js_1.sendNodeResponse)(response$, serverResponse, nodeRequest);
143
+ }
144
+ catch (err) {
145
+ console.error(`Unexpected error while handling request: ${err.message || err}`);
136
146
  }
137
- return handleFetchResponse(response$);
138
147
  }
139
148
  function handleUWS(res, req, ...ctx) {
140
149
  const waitUntilPromises = [];
@@ -153,30 +162,30 @@ function createServerAdapter(serverAdapterBaseObject, options) {
153
162
  res.onAborted(() => {
154
163
  resAborted = true;
155
164
  });
156
- const response$ = handleRequest(request, serverContext);
157
- function handleFetchResponse(response) {
158
- if (resAborted) {
159
- return;
160
- }
161
- try {
162
- if (!response) {
163
- res.writeStatus('404 Not Found');
164
- res.end();
165
- return;
166
- }
167
- return (0, uwebsockets_js_1.sendResponseToUwsOpts)({
168
- response,
169
- res,
170
- });
171
- }
172
- catch (e) {
173
- console.error(`Unexpected error: ${e.message || e}`);
174
- }
165
+ let response$;
166
+ try {
167
+ response$ = handleRequest(request, serverContext);
168
+ }
169
+ catch (err) {
170
+ response$ = (0, utils_js_1.handleErrorFromRequestHandler)(err, fetchAPI.Response);
175
171
  }
176
172
  if ((0, utils_js_1.isPromise)(response$)) {
177
- return response$.then(handleFetchResponse);
173
+ return response$
174
+ .then(response => {
175
+ if (!resAborted) {
176
+ return (0, uwebsockets_js_1.sendResponseToUwsOpts)(res, response);
177
+ }
178
+ })
179
+ .catch(err => {
180
+ console.error(`Unexpected error while handling request: ${err.message || err}`);
181
+ });
182
+ }
183
+ try {
184
+ return (0, uwebsockets_js_1.sendResponseToUwsOpts)(res, response$);
185
+ }
186
+ catch (err) {
187
+ console.error(`Unexpected error while handling request: ${err.message || err}`);
178
188
  }
179
- return handleFetchResponse(response$);
180
189
  }
181
190
  function handleEvent(event, ...ctx) {
182
191
  if (!event.respondWith || !event.request) {
package/cjs/utils.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.iterateAsyncVoid = exports.isPromise = exports.completeAssign = exports.isRequestInit = exports.sendNodeResponse = exports.isFetchEvent = exports.isReadableStream = exports.isServerResponse = exports.isNodeRequest = exports.isReadable = exports.normalizeNodeRequest = exports.isAsyncIterable = void 0;
3
+ exports.handleErrorFromRequestHandler = exports.iterateAsyncVoid = exports.isPromise = exports.completeAssign = exports.isRequestInit = exports.sendNodeResponse = exports.isFetchEvent = exports.isReadableStream = exports.isServerResponse = exports.isNodeRequest = exports.isReadable = exports.normalizeNodeRequest = exports.isAsyncIterable = void 0;
4
4
  const fetch_1 = require("@whatwg-node/fetch");
5
5
  function isAsyncIterable(body) {
6
6
  return (body != null && typeof body === 'object' && typeof body[Symbol.asyncIterator] === 'function');
@@ -156,6 +156,14 @@ async function sendAsyncIterable(serverResponse, asyncIterable) {
156
156
  endResponse(serverResponse);
157
157
  }
158
158
  function sendNodeResponse(fetchResponse, serverResponse, nodeRequest) {
159
+ if (serverResponse.closed || serverResponse.destroyed) {
160
+ return;
161
+ }
162
+ if (!fetchResponse) {
163
+ serverResponse.statusCode = 404;
164
+ serverResponse.end();
165
+ return;
166
+ }
159
167
  serverResponse.statusCode = fetchResponse.status;
160
168
  serverResponse.statusMessage = fetchResponse.statusText;
161
169
  fetchResponse.headers.forEach((value, key) => {
@@ -275,3 +283,9 @@ function iterateAsyncVoid(iterable, callback) {
275
283
  return iterate();
276
284
  }
277
285
  exports.iterateAsyncVoid = iterateAsyncVoid;
286
+ function handleErrorFromRequestHandler(error, ResponseCtor) {
287
+ return new ResponseCtor(error.stack || error.message || error.toString(), {
288
+ status: error.status || 500,
289
+ });
290
+ }
291
+ exports.handleErrorFromRequestHandler = handleErrorFromRequestHandler;
@@ -70,55 +70,60 @@ function getRequestFromUWSRequest({ req, res, fetchAPI }) {
70
70
  });
71
71
  }
72
72
  exports.getRequestFromUWSRequest = getRequestFromUWSRequest;
73
- async function forwardResponseBodyToUWSResponse({ res, response }) {
73
+ async function forwardResponseBodyToUWSResponse(uwsResponse, fetchResponse) {
74
74
  let resAborted = false;
75
- res.onAborted(function () {
75
+ uwsResponse.onAborted(function () {
76
76
  resAborted = true;
77
77
  });
78
- for await (const chunk of response.body) {
78
+ for await (const chunk of fetchResponse.body) {
79
79
  if (resAborted) {
80
80
  return;
81
81
  }
82
- res.cork(() => {
83
- res.write(chunk);
82
+ uwsResponse.cork(() => {
83
+ uwsResponse.write(chunk);
84
84
  });
85
85
  }
86
- res.cork(() => {
87
- res.end();
86
+ uwsResponse.cork(() => {
87
+ uwsResponse.end();
88
88
  });
89
89
  }
90
- function sendResponseToUwsOpts({ res, response }) {
91
- const isStringOrBuffer = response.bodyType === 'Buffer' ||
92
- response.bodyType === 'String' ||
93
- response.bodyType === 'Uint8Array';
94
- res.cork(() => {
95
- res.writeStatus(`${response.status} ${response.statusText}`);
96
- for (const [key, value] of response.headers) {
90
+ function sendResponseToUwsOpts(uwsResponse, fetchResponse) {
91
+ if (!fetchResponse) {
92
+ uwsResponse.writeStatus('404 Not Found');
93
+ uwsResponse.end();
94
+ return;
95
+ }
96
+ const isStringOrBuffer = fetchResponse.bodyType === 'Buffer' ||
97
+ fetchResponse.bodyType === 'String' ||
98
+ fetchResponse.bodyType === 'Uint8Array';
99
+ uwsResponse.cork(() => {
100
+ uwsResponse.writeStatus(`${fetchResponse.status} ${fetchResponse.statusText}`);
101
+ for (const [key, value] of fetchResponse.headers) {
97
102
  // content-length causes an error with Node.js's fetch
98
103
  if (key !== 'content-length') {
99
104
  if (key === 'set-cookie') {
100
- const setCookies = response.headers.getSetCookie?.();
105
+ const setCookies = fetchResponse.headers.getSetCookie?.();
101
106
  if (setCookies) {
102
107
  for (const setCookie of setCookies) {
103
- res.writeHeader(key, setCookie);
108
+ uwsResponse.writeHeader(key, setCookie);
104
109
  }
105
110
  continue;
106
111
  }
107
112
  }
108
- res.writeHeader(key, value);
113
+ uwsResponse.writeHeader(key, value);
109
114
  }
110
115
  }
111
116
  if (isStringOrBuffer) {
112
- res.end(response.bodyInit);
117
+ uwsResponse.end(fetchResponse.bodyInit);
113
118
  }
114
119
  });
115
120
  if (isStringOrBuffer) {
116
121
  return;
117
122
  }
118
- if (!response.body) {
119
- res.end();
123
+ if (!fetchResponse.body) {
124
+ uwsResponse.end();
120
125
  return;
121
126
  }
122
- return forwardResponseBodyToUWSResponse({ res, response });
127
+ return forwardResponseBodyToUWSResponse(uwsResponse, fetchResponse);
123
128
  }
124
129
  exports.sendResponseToUwsOpts = sendResponseToUwsOpts;
@@ -1,6 +1,6 @@
1
1
  /* eslint-disable @typescript-eslint/ban-types */
2
2
  import * as DefaultFetchAPI from '@whatwg-node/fetch';
3
- import { completeAssign, isFetchEvent, isNodeRequest, isPromise, isRequestInit, isServerResponse, iterateAsyncVoid, normalizeNodeRequest, sendNodeResponse, } from './utils.js';
3
+ import { completeAssign, handleErrorFromRequestHandler, isFetchEvent, isNodeRequest, isPromise, isRequestInit, isServerResponse, iterateAsyncVoid, normalizeNodeRequest, sendNodeResponse, } from './utils.js';
4
4
  import { getRequestFromUWSRequest, isUWSResponse, sendResponseToUwsOpts, } from './uwebsockets.js';
5
5
  async function handleWaitUntils(waitUntilPromises) {
6
6
  const waitUntils = await Promise.allSettled(waitUntilPromises);
@@ -47,58 +47,66 @@ function createServerAdapter(serverAdapterBaseObject, options) {
47
47
  }
48
48
  }
49
49
  }
50
- function handleRequest(request, serverContext) {
51
- let url = new Proxy(EMPTY_OBJECT, {
52
- get(_target, prop, _receiver) {
53
- url = new fetchAPI.URL(request.url, 'http://localhost');
54
- return Reflect.get(url, prop, url);
55
- },
56
- });
57
- let requestHandler = givenHandleRequest;
58
- let response;
59
- const onRequestHooksIteration$ = iterateAsyncVoid(onRequestHooks, (onRequestHook, stopEarly) => onRequestHook({
60
- request,
61
- serverContext,
62
- fetchAPI,
63
- url,
64
- requestHandler,
65
- setRequestHandler(newRequestHandler) {
66
- requestHandler = newRequestHandler;
67
- },
68
- endResponse(newResponse) {
69
- response = newResponse;
70
- if (newResponse) {
71
- stopEarly();
72
- }
73
- },
74
- }));
75
- function handleResponse(response) {
76
- const onResponseHookPayload = {
50
+ const handleRequest = onRequestHooks.length > 0 || onResponseHooks.length > 0
51
+ ? function handleRequest(request, serverContext) {
52
+ let requestHandler = givenHandleRequest;
53
+ let response;
54
+ if (onRequestHooks.length === 0) {
55
+ return handleEarlyResponse();
56
+ }
57
+ let url = new Proxy(EMPTY_OBJECT, {
58
+ get(_target, prop, _receiver) {
59
+ url = new fetchAPI.URL(request.url, 'http://localhost');
60
+ return Reflect.get(url, prop, url);
61
+ },
62
+ });
63
+ const onRequestHooksIteration$ = iterateAsyncVoid(onRequestHooks, (onRequestHook, stopEarly) => onRequestHook({
77
64
  request,
78
- response,
79
65
  serverContext,
80
- };
81
- const onResponseHooksIteration$ = iterateAsyncVoid(onResponseHooks, onResponseHook => onResponseHook(onResponseHookPayload));
82
- if (isPromise(onResponseHooksIteration$)) {
83
- return onResponseHooksIteration$.then(() => response);
66
+ fetchAPI,
67
+ url,
68
+ requestHandler,
69
+ setRequestHandler(newRequestHandler) {
70
+ requestHandler = newRequestHandler;
71
+ },
72
+ endResponse(newResponse) {
73
+ response = newResponse;
74
+ if (newResponse) {
75
+ stopEarly();
76
+ }
77
+ },
78
+ }));
79
+ function handleResponse(response) {
80
+ if (onRequestHooks.length === 0) {
81
+ return response;
82
+ }
83
+ const onResponseHookPayload = {
84
+ request,
85
+ response,
86
+ serverContext,
87
+ };
88
+ const onResponseHooksIteration$ = iterateAsyncVoid(onResponseHooks, onResponseHook => onResponseHook(onResponseHookPayload));
89
+ if (isPromise(onResponseHooksIteration$)) {
90
+ return onResponseHooksIteration$.then(() => response);
91
+ }
92
+ return response;
84
93
  }
85
- return response;
86
- }
87
- function handleEarlyResponse() {
88
- if (!response) {
89
- const response$ = requestHandler(request, serverContext);
90
- if (isPromise(response$)) {
91
- return response$.then(handleResponse);
94
+ function handleEarlyResponse() {
95
+ if (!response) {
96
+ const response$ = requestHandler(request, serverContext);
97
+ if (isPromise(response$)) {
98
+ return response$.then(handleResponse);
99
+ }
100
+ return handleResponse(response$);
92
101
  }
93
- return handleResponse(response$);
102
+ return handleResponse(response);
94
103
  }
95
- return handleResponse(response);
96
- }
97
- if (isPromise(onRequestHooksIteration$)) {
98
- return onRequestHooksIteration$.then(handleEarlyResponse);
104
+ if (isPromise(onRequestHooksIteration$)) {
105
+ return onRequestHooksIteration$.then(handleEarlyResponse);
106
+ }
107
+ return handleEarlyResponse();
99
108
  }
100
- return handleEarlyResponse();
101
- }
109
+ : givenHandleRequest;
102
110
  function handleNodeRequest(nodeRequest, ...ctx) {
103
111
  const serverContext = ctx.length > 1 ? completeAssign(...ctx) : ctx[0] || {};
104
112
  const request = normalizeNodeRequest(nodeRequest, fetchAPI.Request);
@@ -111,26 +119,27 @@ function createServerAdapter(serverAdapterBaseObject, options) {
111
119
  res: serverResponse,
112
120
  };
113
121
  addWaitUntil(defaultServerContext, waitUntilPromises);
114
- const response$ = handleNodeRequest(nodeRequest, defaultServerContext, ...ctx);
115
- function handleFetchResponse(response) {
116
- try {
117
- if (serverResponse.closed || serverResponse.destroyed) {
118
- return;
119
- }
120
- if (response) {
121
- return sendNodeResponse(response, serverResponse, nodeRequest);
122
- }
123
- serverResponse.statusCode = 404;
124
- serverResponse.end();
125
- }
126
- catch (e) {
127
- console.error(`Unexpected error: ${e.message || e}`);
128
- }
122
+ let response$;
123
+ try {
124
+ response$ = handleNodeRequest(nodeRequest, defaultServerContext, ...ctx);
125
+ }
126
+ catch (err) {
127
+ response$ = handleErrorFromRequestHandler(err, fetchAPI.Response);
129
128
  }
130
129
  if (isPromise(response$)) {
131
- return response$.then(handleFetchResponse);
130
+ return response$
131
+ .catch((e) => handleErrorFromRequestHandler(e, fetchAPI.Response))
132
+ .then(response => sendNodeResponse(response, serverResponse, nodeRequest))
133
+ .catch(err => {
134
+ console.error(`Unexpected error while handling request: ${err.message || err}`);
135
+ });
136
+ }
137
+ try {
138
+ return sendNodeResponse(response$, serverResponse, nodeRequest);
139
+ }
140
+ catch (err) {
141
+ console.error(`Unexpected error while handling request: ${err.message || err}`);
132
142
  }
133
- return handleFetchResponse(response$);
134
143
  }
135
144
  function handleUWS(res, req, ...ctx) {
136
145
  const waitUntilPromises = [];
@@ -149,30 +158,30 @@ function createServerAdapter(serverAdapterBaseObject, options) {
149
158
  res.onAborted(() => {
150
159
  resAborted = true;
151
160
  });
152
- const response$ = handleRequest(request, serverContext);
153
- function handleFetchResponse(response) {
154
- if (resAborted) {
155
- return;
156
- }
157
- try {
158
- if (!response) {
159
- res.writeStatus('404 Not Found');
160
- res.end();
161
- return;
162
- }
163
- return sendResponseToUwsOpts({
164
- response,
165
- res,
166
- });
167
- }
168
- catch (e) {
169
- console.error(`Unexpected error: ${e.message || e}`);
170
- }
161
+ let response$;
162
+ try {
163
+ response$ = handleRequest(request, serverContext);
164
+ }
165
+ catch (err) {
166
+ response$ = handleErrorFromRequestHandler(err, fetchAPI.Response);
171
167
  }
172
168
  if (isPromise(response$)) {
173
- return response$.then(handleFetchResponse);
169
+ return response$
170
+ .then(response => {
171
+ if (!resAborted) {
172
+ return sendResponseToUwsOpts(res, response);
173
+ }
174
+ })
175
+ .catch(err => {
176
+ console.error(`Unexpected error while handling request: ${err.message || err}`);
177
+ });
178
+ }
179
+ try {
180
+ return sendResponseToUwsOpts(res, response$);
181
+ }
182
+ catch (err) {
183
+ console.error(`Unexpected error while handling request: ${err.message || err}`);
174
184
  }
175
- return handleFetchResponse(response$);
176
185
  }
177
186
  function handleEvent(event, ...ctx) {
178
187
  if (!event.respondWith || !event.request) {
package/esm/utils.js CHANGED
@@ -146,6 +146,14 @@ async function sendAsyncIterable(serverResponse, asyncIterable) {
146
146
  endResponse(serverResponse);
147
147
  }
148
148
  export function sendNodeResponse(fetchResponse, serverResponse, nodeRequest) {
149
+ if (serverResponse.closed || serverResponse.destroyed) {
150
+ return;
151
+ }
152
+ if (!fetchResponse) {
153
+ serverResponse.statusCode = 404;
154
+ serverResponse.end();
155
+ return;
156
+ }
149
157
  serverResponse.statusCode = fetchResponse.status;
150
158
  serverResponse.statusMessage = fetchResponse.statusText;
151
159
  fetchResponse.headers.forEach((value, key) => {
@@ -260,3 +268,8 @@ export function iterateAsyncVoid(iterable, callback) {
260
268
  }
261
269
  return iterate();
262
270
  }
271
+ export function handleErrorFromRequestHandler(error, ResponseCtor) {
272
+ return new ResponseCtor(error.stack || error.message || error.toString(), {
273
+ status: error.status || 500,
274
+ });
275
+ }
@@ -65,54 +65,59 @@ export function getRequestFromUWSRequest({ req, res, fetchAPI }) {
65
65
  signal: new UWSAbortSignal(res),
66
66
  });
67
67
  }
68
- async function forwardResponseBodyToUWSResponse({ res, response }) {
68
+ async function forwardResponseBodyToUWSResponse(uwsResponse, fetchResponse) {
69
69
  let resAborted = false;
70
- res.onAborted(function () {
70
+ uwsResponse.onAborted(function () {
71
71
  resAborted = true;
72
72
  });
73
- for await (const chunk of response.body) {
73
+ for await (const chunk of fetchResponse.body) {
74
74
  if (resAborted) {
75
75
  return;
76
76
  }
77
- res.cork(() => {
78
- res.write(chunk);
77
+ uwsResponse.cork(() => {
78
+ uwsResponse.write(chunk);
79
79
  });
80
80
  }
81
- res.cork(() => {
82
- res.end();
81
+ uwsResponse.cork(() => {
82
+ uwsResponse.end();
83
83
  });
84
84
  }
85
- export function sendResponseToUwsOpts({ res, response }) {
86
- const isStringOrBuffer = response.bodyType === 'Buffer' ||
87
- response.bodyType === 'String' ||
88
- response.bodyType === 'Uint8Array';
89
- res.cork(() => {
90
- res.writeStatus(`${response.status} ${response.statusText}`);
91
- for (const [key, value] of response.headers) {
85
+ export function sendResponseToUwsOpts(uwsResponse, fetchResponse) {
86
+ if (!fetchResponse) {
87
+ uwsResponse.writeStatus('404 Not Found');
88
+ uwsResponse.end();
89
+ return;
90
+ }
91
+ const isStringOrBuffer = fetchResponse.bodyType === 'Buffer' ||
92
+ fetchResponse.bodyType === 'String' ||
93
+ fetchResponse.bodyType === 'Uint8Array';
94
+ uwsResponse.cork(() => {
95
+ uwsResponse.writeStatus(`${fetchResponse.status} ${fetchResponse.statusText}`);
96
+ for (const [key, value] of fetchResponse.headers) {
92
97
  // content-length causes an error with Node.js's fetch
93
98
  if (key !== 'content-length') {
94
99
  if (key === 'set-cookie') {
95
- const setCookies = response.headers.getSetCookie?.();
100
+ const setCookies = fetchResponse.headers.getSetCookie?.();
96
101
  if (setCookies) {
97
102
  for (const setCookie of setCookies) {
98
- res.writeHeader(key, setCookie);
103
+ uwsResponse.writeHeader(key, setCookie);
99
104
  }
100
105
  continue;
101
106
  }
102
107
  }
103
- res.writeHeader(key, value);
108
+ uwsResponse.writeHeader(key, value);
104
109
  }
105
110
  }
106
111
  if (isStringOrBuffer) {
107
- res.end(response.bodyInit);
112
+ uwsResponse.end(fetchResponse.bodyInit);
108
113
  }
109
114
  });
110
115
  if (isStringOrBuffer) {
111
116
  return;
112
117
  }
113
- if (!response.body) {
114
- res.end();
118
+ if (!fetchResponse.body) {
119
+ uwsResponse.end();
115
120
  return;
116
121
  }
117
- return forwardResponseBodyToUWSResponse({ res, response });
122
+ return forwardResponseBodyToUWSResponse(uwsResponse, fetchResponse);
118
123
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@whatwg-node/server",
3
- "version": "0.9.8",
3
+ "version": "0.9.9-alpha-20230808153258-e342bf0",
4
4
  "description": "Fetch API compliant HTTP Server adapter",
5
5
  "sideEffects": false,
6
6
  "dependencies": {
@@ -33,3 +33,4 @@ export declare function isRequestInit(val: unknown): val is RequestInit;
33
33
  export declare function completeAssign(...args: any[]): any;
34
34
  export declare function isPromise<T>(val: T | Promise<T>): val is Promise<T>;
35
35
  export declare function iterateAsyncVoid<TInput>(iterable: Iterable<TInput>, callback: (input: TInput, stopEarly: () => void) => Promise<void> | void): Promise<void> | void;
36
+ export declare function handleErrorFromRequestHandler(error: any, ResponseCtor: typeof Response): Response;
@@ -33,3 +33,4 @@ export declare function isRequestInit(val: unknown): val is RequestInit;
33
33
  export declare function completeAssign(...args: any[]): any;
34
34
  export declare function isPromise<T>(val: T | Promise<T>): val is Promise<T>;
35
35
  export declare function iterateAsyncVoid<TInput>(iterable: Iterable<TInput>, callback: (input: TInput, stopEarly: () => void) => Promise<void> | void): Promise<void> | void;
36
+ export declare function handleErrorFromRequestHandler(error: any, ResponseCtor: typeof Response): Response;
@@ -24,9 +24,5 @@ interface GetRequestFromUWSOpts {
24
24
  fetchAPI: FetchAPI;
25
25
  }
26
26
  export declare function getRequestFromUWSRequest({ req, res, fetchAPI }: GetRequestFromUWSOpts): Request;
27
- interface SendResponseToUWSOpts {
28
- res: UWSResponse;
29
- response: Response;
30
- }
31
- export declare function sendResponseToUwsOpts({ res, response }: SendResponseToUWSOpts): Promise<void> | undefined;
27
+ export declare function sendResponseToUwsOpts(uwsResponse: UWSResponse, fetchResponse: Response): Promise<void> | undefined;
32
28
  export {};
@@ -24,9 +24,5 @@ interface GetRequestFromUWSOpts {
24
24
  fetchAPI: FetchAPI;
25
25
  }
26
26
  export declare function getRequestFromUWSRequest({ req, res, fetchAPI }: GetRequestFromUWSOpts): Request;
27
- interface SendResponseToUWSOpts {
28
- res: UWSResponse;
29
- response: Response;
30
- }
31
- export declare function sendResponseToUwsOpts({ res, response }: SendResponseToUWSOpts): Promise<void> | undefined;
27
+ export declare function sendResponseToUwsOpts(uwsResponse: UWSResponse, fetchResponse: Response): Promise<void> | undefined;
32
28
  export {};