const __SERVER__NAME = "{{host}}";
const __PATH = "echo";

let __SCHEME;
let __PORT;
if (url_has_flag('h2')) {
  __SCHEME = 'wss';
  __PORT = "{{ports[h2][0]}}";
} else if (url_has_variant('wss') || location.protocol === 'https:') {
  __SCHEME = 'wss';
  __PORT = "{{ports[wss][0]}}";
} else {
  __SCHEME = 'ws';
  __PORT = "{{ports[ws][0]}}";
}

const SCHEME_DOMAIN_PORT = __SCHEME + '://' + __SERVER__NAME + ':' + __PORT;
const SCHEME_CROSSDOMAIN_PORT = __SCHEME + '://' + '{{hosts[alt][www]}}' + ':' + __PORT;

function url_has_variant(variant) {
  const params = new URLSearchParams(location.search);
  return params.get(variant) === "";
}

function url_has_flag(flag) {
  const params = new URLSearchParams(location.search);
  return params.getAll("wpt_flags").indexOf(flag) !== -1;
}

function IsWebSocket() {
  if (!self.WebSocket) {
    assert_true(false, "Browser does not support WebSocket");
  }
}

function CreateWebSocketNonAsciiProtocol(nonAsciiProtocol) {
  IsWebSocket();
  const url = SCHEME_DOMAIN_PORT + "/" + __PATH;
  return new WebSocket(url, nonAsciiProtocol);
}

function CreateWebSocketWithAsciiSep(asciiWithSep) {
  IsWebSocket();
  const url = SCHEME_DOMAIN_PORT + "/" + __PATH;
  return new WebSocket(url, asciiWithSep);
}

function CreateWebSocketWithBlockedPort(blockedPort) {
  IsWebSocket();
  const url = __SCHEME + "://" + __SERVER__NAME + ":" + blockedPort + "/" + __PATH;
  return new WebSocket(url);
}

function CreateWebSocketWithSpaceInUrl(urlWithSpace) {
  IsWebSocket();
  const url = __SCHEME + "://" + urlWithSpace + ":" + __PORT + "/" + __PATH;
  return new WebSocket(url);
}

function CreateWebSocketWithSpaceInProtocol(protocolWithSpace) {
  IsWebSocket();
  const url = SCHEME_DOMAIN_PORT + "/" + __PATH;
  return new WebSocket(url, protocolWithSpace);
}

function CreateWebSocketWithRepeatedProtocols() {
  IsWebSocket();
  const url = SCHEME_DOMAIN_PORT + "/" + __PATH;
  return new WebSocket(url, ["echo", "echo"]);
}

function CreateWebSocketWithRepeatedProtocolsCaseInsensitive() {
  IsWebSocket();
  const url = SCHEME_DOMAIN_PORT + "/" + __PATH;
  wsocket = new WebSocket(url, ["echo", "eCho"]);
}

function CreateInsecureWebSocket() {
  IsWebSocket();
  const url = `ws://${__SERVER__NAME}:{{ports[ws][0]}}/${__PATH}`;
  return new WebSocket(url);
}

function CreateWebSocket(isProtocol, isProtocols) {
  IsWebSocket();
  const url = SCHEME_DOMAIN_PORT + "/" + __PATH;

  if (isProtocol) {
    return new WebSocket(url, "echo");
  }
  if (isProtocols) {
    return new WebSocket(url, ["echo", "chat"]);
  }
  return new WebSocket(url);
}
