You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					75 lines
				
				2.0 KiB
			
		
		
			
		
	
	
					75 lines
				
				2.0 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								'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);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								};
							 |