1 | import createMiddleware from 'webpack-dev-middleware';
|
2 | import webpack from 'webpack';
|
3 | import http from 'http';
|
4 | import socketio from 'socket.io';
|
5 |
|
6 | export 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 |
|
49 | io.sockets.on('connection', socket => {
|
50 | socket.emit('hot');
|
51 | sendStats(socket, true);
|
52 | });
|
53 |
|
54 |
|
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 | }
|