CodeOceanEditorWebsocket = {
  websocket: null,

  createSocketUrl: function(url) {
      var sockURL = new URL(window.location);
      sockURL.pathname = url;
      // sanitize socket protocol string, strip trailing slash and other malicious chars if they are there
      sockURL.protocol = '<%= DockerClient.config['ws_client_protocol']&.match(/(\w+):*\/*/)&.to_a&.at(1) %>:';

      // strip anchor if it is in the url
      sockURL.hash = '';

      return sockURL.toString();
  },

  initializeSocket: function(url) {
    this.websocket = new CommandSocket(this.createSocketUrl(url),
        function (evt) {
          this.resetOutputTab();
        }.bind(this)
    );
    this.websocket.onError(this.showWebsocketError.bind(this));
  },

  initializeSocketForTesting: function(url) {
    this.initializeSocket(url);
    this.websocket.on('default',this.handleTestResponse.bind(this));
    this.websocket.on('exit', this.handleExitCommand.bind(this));
  },

  initializeSocketForScoring: function(url) {
    this.initializeSocket(url);
    this.websocket.on('default',this.handleScoringResponse.bind(this));
    this.websocket.on('hint', this.showHint.bind(this));
    this.websocket.on('exit', this.handleExitCommand.bind(this));
  },

  initializeSocketForRunning: function(url) {
    this.initializeSocket(url);
    this.websocket.on('input',this.showPrompt.bind(this));
    this.websocket.on('write', this.printWebsocketOutput.bind(this));
    this.websocket.on('turtle', this.handleTurtleCommand.bind(this));
    this.websocket.on('turtlebatch', this.handleTurtlebatchCommand.bind(this));
    this.websocket.on('render', this.renderWebsocketOutput.bind(this));
    this.websocket.on('exit', this.handleExitCommand.bind(this));
    this.websocket.on('timeout', this.showTimeoutMessage.bind(this));
    this.websocket.on('status', this.showStatus.bind(this));
    this.websocket.on('hint', this.showHint.bind(this));
  },

  handleExitCommand: function() {
    this.killWebsocket();
    this.handleQaApiOutput();
    this.handleStderrOutputForFlowr();
    this.augmentStacktraceInOutput();
    this.cleanUpTurtle();
    this.cleanUpUI();
  }
};
