@modern-js/server-core
Version:
A Progressive React Framework for modern web development.
358 lines (357 loc) • 10.7 kB
JavaScript
import { _ as _async_to_generator } from "@swc/helpers/_/_async_to_generator";
import { _ as _instanceof } from "@swc/helpers/_/_instanceof";
import { _ as _object_spread } from "@swc/helpers/_/_object_spread";
import { _ as _sliced_to_array } from "@swc/helpers/_/_sliced_to_array";
import { _ as _to_consumable_array } from "@swc/helpers/_/_to_consumable_array";
import { _ as _ts_generator } from "@swc/helpers/_/_ts_generator";
import { ServerResponse } from "node:http";
import { Readable, Writable } from "node:stream";
import cloneable from "cloneable-readable";
import { isResFinalized } from "./helper";
var createWebRequest = function(req, res, body) {
var headerRecord = [];
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
try {
for (var _iterator = Object.entries(req.headers)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var _step_value = _sliced_to_array(_step.value, 2), key = _step_value[0], value = _step_value[1];
if (key.startsWith(":")) {
continue;
}
if (Array.isArray(value)) {
var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = void 0;
try {
for (var _iterator1 = value[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true) {
var item = _step1.value;
if (item !== void 0) {
headerRecord.push([
key,
item
]);
}
}
} catch (err) {
_didIteratorError1 = true;
_iteratorError1 = err;
} finally {
try {
if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
_iterator1.return();
}
} finally {
if (_didIteratorError1) {
throw _iteratorError1;
}
}
}
} else if (value !== void 0) {
if (typeof value === "string") {
headerRecord.push([
key,
value
]);
}
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return != null) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
var method = req.method;
var controller = new AbortController();
var init = {
method,
headers: headerRecord,
signal: controller.signal
};
res.on("close", function() {
return controller.abort("res closed");
});
var url = "http://".concat(req.headers.host).concat(req.url);
var needsRequestBody = body || !(method === "GET" || method === "HEAD");
var cloneableReq = needsRequestBody ? cloneable(req) : null;
if (needsRequestBody) {
if (body) {
init.body = body;
} else {
var stream = cloneableReq.clone();
init.body = Readable.toWeb(stream);
}
init.duplex = "half";
}
var originalRequest = new Request(url, init);
if (needsRequestBody) {
var interceptedMethods = [
"json",
"text",
"blob",
"arrayBuffer",
"formData"
];
return new Proxy(originalRequest, {
get: function get(target, prop) {
if (interceptedMethods.includes(prop)) {
return function() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
var _target_prop;
cloneableReq.resume();
return (_target_prop = target[prop]).call.apply(_target_prop, [
target
].concat(_to_consumable_array(args)));
};
}
var value2 = target[prop];
if (prop === "body") {
cloneableReq.resume();
return value2;
}
if (typeof value2 === "function") {
return function() {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return value2.apply(target, args);
};
}
return value2;
}
});
}
return originalRequest;
};
var sendResponse = function() {
var _ref = _async_to_generator(function(response, res) {
var _response_headers_get, cookies, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, _step_value, key, value, writable;
return _ts_generator(this, function(_state) {
switch (_state.label) {
case 0:
res.statusMessage = response.statusText;
res.statusCode = response.status;
cookies = [];
_iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = void 0;
try {
for (_iterator = response.headers.entries()[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
_step_value = _sliced_to_array(_step.value, 2), key = _step_value[0], value = _step_value[1];
if (key === "set-cookie") {
cookies.push(value);
} else {
res.setHeader(key, value);
}
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return != null) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
if (cookies.length > 0) {
res.setHeader("set-cookie", cookies);
}
if (((_response_headers_get = response.headers.get("Content-Type")) === null || _response_headers_get === void 0 ? void 0 : _response_headers_get.match(/text\/event-stream/i)) && _instanceof(res, ServerResponse)) {
res.flushHeaders();
}
if (!response.body)
return [
3,
2
];
writable = Writable.toWeb(res);
return [
4,
response.body.pipeTo(writable)
];
case 1:
_state.sent();
return [
3,
3
];
case 2:
res.end();
_state.label = 3;
case 3:
return [
2
];
}
});
});
return function sendResponse2(response, res) {
return _ref.apply(this, arguments);
};
}();
var handleResponseError = function(e, res) {
var err = _instanceof(e, Error) ? e : new Error("unknown error", {
cause: e
});
if (err.code === "ERR_STREAM_PREMATURE_CLOSE") {
console.info("The user aborted a request.");
} else {
console.error(e);
if (!res.headersSent) {
res.writeHead(500, {
"Content-Type": "text/plain"
});
}
res.end("Error: ".concat(err.message));
res.destroy(err);
}
};
var getRequestListener = function(handler) {
return function() {
var _ref = _async_to_generator(function(req, res) {
var request, response, error;
return _ts_generator(this, function(_state) {
switch (_state.label) {
case 0:
_state.trys.push([
0,
4,
,
5
]);
request = createWebRequest(req, res);
return [
4,
handler(request, {
node: {
req,
res
}
})
];
case 1:
response = _state.sent();
if (!(!response.res && !isResFinalized(res)))
return [
3,
3
];
return [
4,
sendResponse(response, res)
];
case 2:
_state.sent();
_state.label = 3;
case 3:
return [
3,
5
];
case 4:
error = _state.sent();
return [
2,
handleResponseError(error, res)
];
case 5:
return [
2
];
}
});
});
return function(req, res) {
return _ref.apply(this, arguments);
};
}();
};
var createNodeServer = function() {
var _ref = _async_to_generator(function(requestHandler, httpsOptions, http2) {
var requestListener, nodeServer, createSecureServer, createServer, createServer1;
return _ts_generator(this, function(_state) {
switch (_state.label) {
case 0:
requestListener = getRequestListener(requestHandler);
if (!httpsOptions)
return [
3,
5
];
if (!http2)
return [
3,
2
];
return [
4,
import("node:http2")
];
case 1:
createSecureServer = _state.sent().createSecureServer;
nodeServer = createSecureServer(_object_spread({
allowHTTP1: true,
maxSessionMemory: 1024
}, httpsOptions), function(req, res) {
return requestListener(req, res);
});
return [
3,
4
];
case 2:
return [
4,
import("node:https")
];
case 3:
createServer = _state.sent().createServer;
nodeServer = createServer(httpsOptions, requestListener);
_state.label = 4;
case 4:
return [
3,
7
];
case 5:
return [
4,
import("node:http")
];
case 6:
createServer1 = _state.sent().createServer;
nodeServer = createServer1(requestListener);
_state.label = 7;
case 7:
nodeServer.getRequestListener = function() {
return requestListener;
};
nodeServer.getRequestHandler = function() {
return requestHandler;
};
return [
2,
nodeServer
];
}
});
});
return function createNodeServer2(requestHandler, httpsOptions, http2) {
return _ref.apply(this, arguments);
};
}();
export {
createNodeServer,
createWebRequest,
sendResponse
};