@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.
- package/cjs/createServerAdapter.js +93 -84
- package/cjs/utils.js +15 -1
- package/cjs/uwebsockets.js +26 -21
- package/esm/createServerAdapter.js +94 -85
- package/esm/utils.js +13 -0
- package/esm/uwebsockets.js +26 -21
- package/package.json +1 -1
- package/typings/utils.d.cts +1 -0
- package/typings/utils.d.ts +1 -0
- package/typings/uwebsockets.d.cts +1 -5
- package/typings/uwebsockets.d.ts +1 -5
|
@@ -51,58 +51,66 @@ function createServerAdapter(serverAdapterBaseObject, options) {
|
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
return response
|
|
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
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
return
|
|
108
|
+
if ((0, utils_js_1.isPromise)(onRequestHooksIteration$)) {
|
|
109
|
+
return onRequestHooksIteration$.then(handleEarlyResponse);
|
|
110
|
+
}
|
|
111
|
+
return handleEarlyResponse();
|
|
103
112
|
}
|
|
104
|
-
|
|
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
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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
|
|
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
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
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
|
|
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;
|
package/cjs/uwebsockets.js
CHANGED
|
@@ -70,55 +70,60 @@ function getRequestFromUWSRequest({ req, res, fetchAPI }) {
|
|
|
70
70
|
});
|
|
71
71
|
}
|
|
72
72
|
exports.getRequestFromUWSRequest = getRequestFromUWSRequest;
|
|
73
|
-
async function forwardResponseBodyToUWSResponse(
|
|
73
|
+
async function forwardResponseBodyToUWSResponse(uwsResponse, fetchResponse) {
|
|
74
74
|
let resAborted = false;
|
|
75
|
-
|
|
75
|
+
uwsResponse.onAborted(function () {
|
|
76
76
|
resAborted = true;
|
|
77
77
|
});
|
|
78
|
-
for await (const chunk of
|
|
78
|
+
for await (const chunk of fetchResponse.body) {
|
|
79
79
|
if (resAborted) {
|
|
80
80
|
return;
|
|
81
81
|
}
|
|
82
|
-
|
|
83
|
-
|
|
82
|
+
uwsResponse.cork(() => {
|
|
83
|
+
uwsResponse.write(chunk);
|
|
84
84
|
});
|
|
85
85
|
}
|
|
86
|
-
|
|
87
|
-
|
|
86
|
+
uwsResponse.cork(() => {
|
|
87
|
+
uwsResponse.end();
|
|
88
88
|
});
|
|
89
89
|
}
|
|
90
|
-
function sendResponseToUwsOpts(
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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 =
|
|
105
|
+
const setCookies = fetchResponse.headers.getSetCookie?.();
|
|
101
106
|
if (setCookies) {
|
|
102
107
|
for (const setCookie of setCookies) {
|
|
103
|
-
|
|
108
|
+
uwsResponse.writeHeader(key, setCookie);
|
|
104
109
|
}
|
|
105
110
|
continue;
|
|
106
111
|
}
|
|
107
112
|
}
|
|
108
|
-
|
|
113
|
+
uwsResponse.writeHeader(key, value);
|
|
109
114
|
}
|
|
110
115
|
}
|
|
111
116
|
if (isStringOrBuffer) {
|
|
112
|
-
|
|
117
|
+
uwsResponse.end(fetchResponse.bodyInit);
|
|
113
118
|
}
|
|
114
119
|
});
|
|
115
120
|
if (isStringOrBuffer) {
|
|
116
121
|
return;
|
|
117
122
|
}
|
|
118
|
-
if (!
|
|
119
|
-
|
|
123
|
+
if (!fetchResponse.body) {
|
|
124
|
+
uwsResponse.end();
|
|
120
125
|
return;
|
|
121
126
|
}
|
|
122
|
-
return forwardResponseBodyToUWSResponse(
|
|
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
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
return response
|
|
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
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
return
|
|
104
|
+
if (isPromise(onRequestHooksIteration$)) {
|
|
105
|
+
return onRequestHooksIteration$.then(handleEarlyResponse);
|
|
106
|
+
}
|
|
107
|
+
return handleEarlyResponse();
|
|
99
108
|
}
|
|
100
|
-
|
|
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
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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
|
|
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
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
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
|
|
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
|
+
}
|
package/esm/uwebsockets.js
CHANGED
|
@@ -65,54 +65,59 @@ export function getRequestFromUWSRequest({ req, res, fetchAPI }) {
|
|
|
65
65
|
signal: new UWSAbortSignal(res),
|
|
66
66
|
});
|
|
67
67
|
}
|
|
68
|
-
async function forwardResponseBodyToUWSResponse(
|
|
68
|
+
async function forwardResponseBodyToUWSResponse(uwsResponse, fetchResponse) {
|
|
69
69
|
let resAborted = false;
|
|
70
|
-
|
|
70
|
+
uwsResponse.onAborted(function () {
|
|
71
71
|
resAborted = true;
|
|
72
72
|
});
|
|
73
|
-
for await (const chunk of
|
|
73
|
+
for await (const chunk of fetchResponse.body) {
|
|
74
74
|
if (resAborted) {
|
|
75
75
|
return;
|
|
76
76
|
}
|
|
77
|
-
|
|
78
|
-
|
|
77
|
+
uwsResponse.cork(() => {
|
|
78
|
+
uwsResponse.write(chunk);
|
|
79
79
|
});
|
|
80
80
|
}
|
|
81
|
-
|
|
82
|
-
|
|
81
|
+
uwsResponse.cork(() => {
|
|
82
|
+
uwsResponse.end();
|
|
83
83
|
});
|
|
84
84
|
}
|
|
85
|
-
export function sendResponseToUwsOpts(
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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 =
|
|
100
|
+
const setCookies = fetchResponse.headers.getSetCookie?.();
|
|
96
101
|
if (setCookies) {
|
|
97
102
|
for (const setCookie of setCookies) {
|
|
98
|
-
|
|
103
|
+
uwsResponse.writeHeader(key, setCookie);
|
|
99
104
|
}
|
|
100
105
|
continue;
|
|
101
106
|
}
|
|
102
107
|
}
|
|
103
|
-
|
|
108
|
+
uwsResponse.writeHeader(key, value);
|
|
104
109
|
}
|
|
105
110
|
}
|
|
106
111
|
if (isStringOrBuffer) {
|
|
107
|
-
|
|
112
|
+
uwsResponse.end(fetchResponse.bodyInit);
|
|
108
113
|
}
|
|
109
114
|
});
|
|
110
115
|
if (isStringOrBuffer) {
|
|
111
116
|
return;
|
|
112
117
|
}
|
|
113
|
-
if (!
|
|
114
|
-
|
|
118
|
+
if (!fetchResponse.body) {
|
|
119
|
+
uwsResponse.end();
|
|
115
120
|
return;
|
|
116
121
|
}
|
|
117
|
-
return forwardResponseBodyToUWSResponse(
|
|
122
|
+
return forwardResponseBodyToUWSResponse(uwsResponse, fetchResponse);
|
|
118
123
|
}
|
package/package.json
CHANGED
package/typings/utils.d.cts
CHANGED
|
@@ -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;
|
package/typings/utils.d.ts
CHANGED
|
@@ -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
|
-
|
|
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 {};
|
package/typings/uwebsockets.d.ts
CHANGED
|
@@ -24,9 +24,5 @@ interface GetRequestFromUWSOpts {
|
|
|
24
24
|
fetchAPI: FetchAPI;
|
|
25
25
|
}
|
|
26
26
|
export declare function getRequestFromUWSRequest({ req, res, fetchAPI }: GetRequestFromUWSOpts): Request;
|
|
27
|
-
|
|
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 {};
|