Spaces:
Running
Running
; | |
Object.defineProperty(exports, "__esModule", { value: true }); | |
exports.getHandlers = exports.init = void 0; | |
const logger_1 = require("./logger"); | |
const logger = (0, logger_1.getInstance)(); | |
function init(proxy, option) { | |
const handlers = getHandlers(option); | |
for (const eventName of Object.keys(handlers)) { | |
proxy.on(eventName, handlers[eventName]); | |
} | |
// https://github.com/webpack/webpack-dev-server/issues/1642 | |
proxy.on('econnreset', (error, req, res, target) => { | |
logger.error(`[HPM] ECONNRESET: %O`, error); | |
}); | |
// https://github.com/webpack/webpack-dev-server/issues/1642#issuecomment-1104325120 | |
proxy.on('proxyReqWs', (proxyReq, req, socket, options, head) => { | |
socket.on('error', (error) => { | |
logger.error(`[HPM] WebSocket error: %O`, error); | |
}); | |
}); | |
logger.debug('[HPM] Subscribed to http-proxy events:', Object.keys(handlers)); | |
} | |
exports.init = init; | |
function getHandlers(options) { | |
// https://github.com/nodejitsu/node-http-proxy#listening-for-proxy-events | |
const proxyEventsMap = { | |
error: 'onError', | |
proxyReq: 'onProxyReq', | |
proxyReqWs: 'onProxyReqWs', | |
proxyRes: 'onProxyRes', | |
open: 'onOpen', | |
close: 'onClose', | |
}; | |
const handlers = {}; | |
for (const [eventName, onEventName] of Object.entries(proxyEventsMap)) { | |
// all handlers for the http-proxy events are prefixed with 'on'. | |
// loop through options and try to find these handlers | |
// and add them to the handlers object for subscription in init(). | |
const fnHandler = options ? options[onEventName] : null; | |
if (typeof fnHandler === 'function') { | |
handlers[eventName] = fnHandler; | |
} | |
} | |
// add default error handler in absence of error handler | |
if (typeof handlers.error !== 'function') { | |
handlers.error = defaultErrorHandler; | |
} | |
// add default close handler in absence of close handler | |
if (typeof handlers.close !== 'function') { | |
handlers.close = logClose; | |
} | |
return handlers; | |
} | |
exports.getHandlers = getHandlers; | |
function defaultErrorHandler(err, req, res) { | |
// Re-throw error. Not recoverable since req & res are empty. | |
if (!req && !res) { | |
throw err; // "Error: Must provide a proper URL as target" | |
} | |
const host = req.headers && req.headers.host; | |
const code = err.code; | |
if (res.writeHead && !res.headersSent) { | |
if (/HPE_INVALID/.test(code)) { | |
res.writeHead(502); | |
} | |
else { | |
switch (code) { | |
case 'ECONNRESET': | |
case 'ENOTFOUND': | |
case 'ECONNREFUSED': | |
case 'ETIMEDOUT': | |
res.writeHead(504); | |
break; | |
default: | |
res.writeHead(500); | |
} | |
} | |
} | |
res.end(`Error occurred while trying to proxy: ${host}${req.url}`); | |
} | |
function logClose(req, socket, head) { | |
// view disconnected websocket connections | |
logger.info('[HPM] Client disconnected'); | |
} | |