lazy-compile-webpack-plugin
Version:
Lazy compile dynamic imports to boost your webpack startup time.
70 lines (62 loc) • 1.9 kB
JavaScript
const detect = require('detect-port-alt');
const http = require('http');
const url = require('url');
class Server {
constructor(plugin, port) {
this.plugin = plugin;
this._listenAddr = '0.0.0.0';
this._listenPort = port;
}
async start() {
try {
this._listenPort = await detect(this._listenPort, this._listenAddr);
} catch (err) {
throw new Error(
`Could not find an open port.` +
'\n' +
('Network error message: ' + err.message || err) +
'\n'
);
}
// Create an HTTP server
if (!this.server) {
this.server = http.createServer((req, res) => {
const userRequest = url.parse(req.url, true).query.r;
this.plugin.activateModule(userRequest).then(() => {
res.writeHead(200, { 'Content-Type': 'image/svg+xml' });
res.end(
'<?xml version="1.0" encoding="utf-8"?>\n' +
'<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\n' +
'<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><text y="20">lazy-compile-webpack-plugin</text> </svg>'
);
});
});
}
return new Promise((resove, reject) => {
this.server.listen(this._listenPort, this._listenAddr, err => {
if (err) {
return reject(
new Error(
`Could not start the backend.` +
'\n' +
('Network error message: ' + err.message || err) +
'\n'
)
);
}
resove();
});
});
}
close() {
if (this.server) {
this.server.close();
}
}
createActivationUrl(userRequest) {
return `http://{host}:${this._listenPort}?r=${encodeURIComponent(
userRequest
)}`;
}
}
module.exports = Server;