UNPKG

1.82 kBJavaScriptView Raw
1import createMiddleware from 'webpack-dev-middleware';
2import webpack from 'webpack';
3import http from 'http';
4import socketio from 'socket.io';
5
6export default function createAssetServer(assets, options) {
7 const compiler = webpack(assets);
8 const middleware = createMiddleware(compiler, {
9 ...options,
10 publicPath: assets.output.publicPath,
11 });
12 const server = http.createServer((req, res) => {
13 middleware(req, res, () => {
14 res.writeHead(404);
15 res.end();
16 });
17 });
18 const io = socketio(server, {
19 path: `${assets.output.publicPath}/socket.io`,
20 });
21
22 let stats = null;
23
24 function ok(stats) {
25 return (!stats.errors || stats.errors.length === 0) &&
26 stats.assets &&
27 stats.assets.every(asset => !asset.emitted);
28 }
29
30 function sendStats(socket, force) {
31 if (!stats) {
32 return;
33 } else if (!force && ok(stats)) {
34 socket.emit('still-ok');
35 return;
36 }
37
38 socket.emit('hash', stats.hash);
39 if (stats.errors && stats.errors.length > 0) {
40 socket.emit('errors', stats.errors);
41 } else if (stats.warnings && stats.warnings.length > 0) {
42 socket.emit('warnings', stats.warnings);
43 } else {
44 socket.emit('ok');
45 }
46 }
47
48 // Socket events.
49 io.sockets.on('connection', socket => {
50 socket.emit('hot');
51 sendStats(socket, true);
52 });
53
54 // Compiler events.
55 compiler.plugin('compile', () => io.sockets.emit('invalid'));
56 compiler.plugin('invalid', () => io.sockets.emit('invalid'));
57 compiler.plugin('done', _stats => {
58 stats = _stats;
59 sendStats(io.sockets);
60 });
61 compiler.plugin('done', stats => server.emit('stats', stats));
62
63 return Object.assign(server, {
64 compiler,
65 close() {
66 io.close();
67 middleware.close();
68 http.Server.prototype.close.apply(this, arguments);
69 },
70 });
71}