'use strict'; /* eslint-disable class-methods-use-this, func-names */ const sockjs = require('sockjs'); const BaseServer = require('./BaseServer'); // Workaround for sockjs@~0.3.19 // sockjs will remove Origin header, however Origin header is required for checking host. // See https://github.com/webpack/webpack-dev-server/issues/1604 for more information { const SockjsSession = require('sockjs/lib/transport').Session; const decorateConnection = SockjsSession.prototype.decorateConnection; SockjsSession.prototype.decorateConnection = function(req) { decorateConnection.call(this, req); const connection = this.connection; if ( connection.headers && !('origin' in connection.headers) && 'origin' in req.headers ) { connection.headers.origin = req.headers.origin; } }; } module.exports = class SockJSServer extends BaseServer { // options has: error (function), debug (function), server (http/s server), path (string) constructor(server) { super(server); this.socket = sockjs.createServer({ // Use provided up-to-date sockjs-client sockjs_url: '/__webpack_dev_server__/sockjs.bundle.js', // Limit useless logs log: (severity, line) => { if (severity === 'error') { this.server.log.error(line); } else { this.server.log.debug(line); } }, }); this.socket.installHandlers(this.server.listeningApp, { prefix: this.server.sockPath, }); } send(connection, message) { // prevent cases where the server is trying to send data while connection is closing if (connection.readyState !== 1) { return; } connection.write(message); } close(connection) { connection.close(); } // f should be passed the resulting connection and the connection headers onConnection(f) { this.socket.on('connection', (connection) => { f(connection, connection ? connection.headers : null); }); } onConnectionClose(connection, f) { connection.on('close', f); } };