Code coverage report for webpack-hot-middleware/middleware.js

Statements: 93.75% (45 / 48)      Branches: 72.22% (13 / 18)      Functions: 86.67% (13 / 15)      Lines: 95.65% (44 / 46)      Ignored: none     

All files » webpack-hot-middleware/ » middleware.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 841   1 1   1 6 6 6 6   6 6 2 2   6 1 1 1   1                 6 7 7   6 6     1 6 6 1 7 8     6 3 3     6   7 7             7 7 7 7         4 5           1 1 1     1    
module.exports = webpackHotMiddleware;
 
var helpers = require('./helpers');
var pathMatch = helpers.pathMatch;
 
function webpackHotMiddleware(compiler, opts) {
  opts = opts || {};
  opts.log = typeof opts.log == 'undefined' ? console.log : opts.log;
  opts.path = opts.path || '/__webpack_hmr';
  opts.heartbeat = opts.heartbeat || 10 * 1000;
 
  var eventStream = createEventStream(opts.heartbeat);
  compiler.plugin("compile", function() {
    Eif (opts.log) opts.log("webpack building...");
    eventStream.publish({action: "building"});
  });
  compiler.plugin("done", function(stats) {
    stats = stats.toJson();
    Eif (opts.log) {
      opts.log("webpack built " + stats.hash + " in " + stats.time + "ms");
    }
    eventStream.publish({
      action: "built",
      time: stats.time,
      hash: stats.hash,
      warnings: stats.warnings || [],
      errors: stats.errors || [],
      modules: buildModuleMap(stats.modules)
    });
  });
  var middleware = function(req, res, next) {
    Iif (!pathMatch(req.url, opts.path)) return next();
    eventStream.handler(req, res);
  };
  middleware.publish = eventStream.publish;
  return middleware;
}
 
function createEventStream(heartbeat) {
  var clientId = 0;
  var clients = {};
  function everyClient(fn) {
    Object.keys(clients).forEach(function(id) {
      fn(clients[id]);
    });
  }
  setInterval(function heartbeatTick() {
    everyClient(function(client) {
      client.write("data: \uD83D\uDC93\n\n");
    });
  }, heartbeat).unref();
  return {
    handler: function(req, res) {
      req.socket.setKeepAlive(true);
      res.writeHead(200, {
        'Access-Control-Allow-Origin': '*',
        'Content-Type': 'text/event-stream;charset=utf-8',
        'Transfer-Encoding': 'chunked',
        'Cache-Control': 'no-cache, no-transform',
        'Connection': 'keep-alive'
      });
      res.write('\n');
      var id = clientId++;
      clients[id] = res;
      req.on("close", function(){
        delete clients[id];
      });
    },
    publish: function(payload) {
      everyClient(function(client) {
          client.write("data: " + JSON.stringify(payload) + "\n\n");
      });
    }
  };
}
 
function buildModuleMap(modules) {
  var map = {};
  modules.forEach(function(module) {
    map[module.id] = module.name;
  });
  return map;
}