ember-cli
Version:
Command line tool for developing ambitious ember.js apps
61 lines (49 loc) • 1.69 kB
JavaScript
;
// eslint-disable-next-line
const isLiveReloadRequest = require('../../../../utilities/is-live-reload-request');
class ProxyServerAddon {
constructor(project) {
this.project = project;
this.name = 'proxy-server-middleware';
}
serverMiddleware(options) {
let app = options.app,
server = options.options.httpServer;
options = options.options;
if (options.proxy) {
let proxy = require('http-proxy').createProxyServer({
target: options.proxy,
ws: true,
secure: options.secureProxy,
changeOrigin: true,
xfwd: options.transparentProxy,
preserveHeaderKeyCase: true,
proxyTimeout: options.proxyOutTimeout,
timeout: options.proxyInTimeout,
});
proxy.on('error', (e, req, res) => {
options.ui.writeLine(`Error proxying to ${options.proxy}`);
options.ui.writeError(e);
if (typeof res.status === 'function') {
res.status(502);
res.end();
}
});
const morgan = require('morgan');
options.ui.writeLine(`Proxying to ${options.proxy}`);
server.on('upgrade', (req, socket, head) => {
this.handleProxiedRequest({ req, socket, head, options, proxy });
});
app.use(morgan('dev'));
app.use((req, res) => proxy.web(req, res));
}
}
handleProxiedRequest({ req, socket, head, options, proxy }) {
if (!isLiveReloadRequest(req.url, options.liveReloadPrefix)) {
options.ui.writeLine(`Proxying websocket to ${req.url}`);
socket.on('error', (e) => proxy.emit('error', e));
proxy.ws(req, socket, head);
}
}
}
module.exports = ProxyServerAddon;