import parseuri from "parseuri" ; import debugModule from "debug" ; const debug = debugModule ( "socket.io-client:url" ) ; type ParsedUrl = { source : string ; protocol : string ; authority : string ; userInfo : string ; user : string ; password : string ; host : string ; port : string ; relative : string ; path : string ; directory : string ; file : string ; query : string ; anchor : string ; pathNames : Array < string > ; queryKey : { [ key ] : string ; } ; id : string ; href : string ; } ; param uri param path param loc public export function url ( uri , path = "" , loc ? ) { let obj = uri as ParsedUrl ; loc = loc || ( typeof location !== "undefined" && location ) ; if ( null == uri ) uri = loc . protocol + "//" + loc . host ; if ( typeof uri === "string" ) { if ( "/" === uri . charAt ( 0 ) ) { if ( "/" === uri . charAt ( 1 ) ) { uri = loc . protocol + uri ; } else { uri = loc . host + uri ; } } if ( ! /^(https?|wss?):\/\// . test ( uri ) ) { debug ( "protocol-less url %s" , uri ) ; if ( "undefined" !== typeof loc ) { uri = loc . protocol + "//" + uri ; } else { uri = "https://" + uri ; } } debug ( "parse %s" , uri ) ; obj = parseuri ( uri ) as ParsedUrl ; } if ( ! obj . port ) { if ( /^(http|ws)$/ . test ( obj . protocol ) ) { obj . port = "80" ; } else if ( /^(http|ws)s$/ . test ( obj . protocol ) ) { obj . port = "443" ; } } obj . path = obj . path || "/" ; const ipv6 = obj . host . indexOf ( ":" ) !== - 1 ; const host = ipv6 ? "[" + obj . host + "]" : obj . host ; obj . id = obj . protocol + "://" + host + ":" + obj . port + path ; obj . href = obj . protocol + "://" + host + ( loc && loc . port === obj . port ? "" : ":" + obj . port ) ; return obj ; }