text: /**
   * Copyright (c) 2015-present, Facebook, Inc.
   * All rights reserved.
   *
   * This source code is licensed under the BSD-style license found in the
   * LICENSE file in the root directory of this source tree. An additional grant
   * of patent rights can be found in the PATENTS file in the same directory.
   */
  'use strict';
  
  
  function attachToServer(server, path) {
    var WebSocketServer = require('ws').Server;
    var wss = new WebSocketServer({
      server: server,
      path: path
    });
    var debuggerSocket, clientSocket;
  
    function send(dest, message) {
      if (!dest) {
        return;
      }
  
      try {
        dest.send(message);
      } catch(e) {
        console.warn(e);
        // Sometimes this call throws 'not opened'
      }
    }
  
    wss.on('connection', function(ws) {
      const {url} = ws.upgradeReq;
  
      if (url.indexOf('role=debugger') > -1) {
        if (debuggerSocket) {
          ws.close(1011, 'Another debugger is already connected');
          return;
        }
        debuggerSocket = ws;
        debuggerSocket.onerror =
        debuggerSocket.onclose = () => {
          debuggerSocket = null;
          if (clientSocket) {
            clientSocket.close(1011, 'Debugger was disconnected');
          }
        };
        debuggerSocket.onmessage = ({data}) => send(clientSocket, data);
      } else if (url.indexOf('role=client') > -1) {
        if (clientSocket) {
          clientSocket.onerror = clientSocket.onclose = clientSocket.onmessage = null;
          clientSocket.close(1011, 'Another client connected');
        }
        clientSocket = ws;
        clientSocket.onerror =
        clientSocket.onclose = () => {
          clientSocket = null;
          send(debuggerSocket, JSON.stringify({method: '$disconnected'}));
        };
        clientSocket.onmessage = ({data}) => send(debuggerSocket, data);
      } else {
        ws.close(1011, 'Missing role param');
      }
    });
  
    return {
      server: wss,
      isChromeConnected: function() {
        return !!debuggerSocket;
      }
    };
  }
  
  module.exports = {
    attachToServer: attachToServer
  };
  