function generateREForProtocol(protocol) {
  return [
    new RegExp(
      `${protocol}(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$`
    ),
    new RegExp(
      `${protocol}(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]).)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9-]*[A-Za-z0-9/])$`
    ),
  ]
}

const ws = generateREForProtocol("^(wss?:\\/\\/)?")
const sse = generateREForProtocol("^(https?:\\/\\/)?")
const socketio = generateREForProtocol("^((wss?:\\/\\/)|(https?:\\/\\/))?")
const regex = { ws, sse, socketio }

// type = ws/sse/socketio
async function validator(type, url) {
  console.time(`validator ${url}`)
  const [res1, res2] = await Promise.all([
    regex[type][0].test(url),
    regex[type][1].test(url),
  ])
  console.timeEnd(`validator ${url}`)
  return res1 || res2
}

onmessage = async ({ data }) => {
  const { type, url } = data
  const result = await validator(type, url)
  postMessage({ type, url, result })
}
