UNPKG

@modern-js/server-core

Version:

A Progressive React Framework for modern web development.

358 lines (357 loc) • 10.7 kB
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 };