1(()=>{2 let doc = document, w = window3 if (w.gold) return4 let state = {}5 let send = (type, detail)=>doc.dispatchEvent(new CustomEvent("nau:" + type, {detail, cancelable:1, bubbles:1, composed:1}))6 let has = (a)=>doc.documentElement.hasAttribute(a) || doc.body?.hasAttribute(a)7 let allowed = (url, l = doc.querySelector("[nau-relays]")?.getAttribute("nau-relays").split(/\s+/) ?? w.nauCfg?.relays)=>!l || l.includes(url)8 let conn = (url, r)=>{9 let c = state[url]10 return c?.ws == r.ws ? c : state[url] = {ws:r.ws, tried:new Set(), oks:new Map(), wait:[]}11 }12 let auth = (url)=>{13 let r = hydrogen.relay(url), c = conn(url, r)14 return c.p ??= (async()=>{15 if (!allowed(url)) throw Error("relay not allowed")16 if (!c.challenge) await new Promise((res, rej)=>{17 c.wait.push(res)18 setTimeout(()=>rej(Error("no challenge")), 3e3)19 })20 let challenge = c.challenge21 let cfg = {elt:doc, relays:[url], event:{kind:22242, created_at:Date.now() / 1e3 | 0, tags:[["relay", url], ["challenge", challenge]], content:""}}22 let e = send("auth", {url, challenge, cfg}) && await hydrogen.sign(cfg)23 if (!e) throw Error("cancelled")24 let [ok, msg] = await new Promise((res)=>{25 c.oks.set(e.id, res)26 setTimeout(()=>res([0, "timeout"]), 8e3)27 r.send(["AUTH", e])28 })29 if (!ok) throw Error(msg)30 send("authed", {url, pubkey:c.pubkey = e.pubkey})31 return e.pubkey32 })().catch((error)=>{33 send("error", {url, error})34 throw error35 })36 }37 doc.addEventListener("nhy:message", (evt)=>{38 let {url, relay:r, msg:[t, a, b, m]} = evt.detail, c = conn(url, r), done = c.oks.get(a)39 if (t == "AUTH"){40 c.challenge = a41 c.wait.splice(0).forEach((f)=>f())42 if ((w.nauCfg?.eager || has("nau-eager")) && allowed(url)) auth(url).catch(()=>{})43 }44 if (t == "OK" && done){45 evt.preventDefault()46 c.oks.delete(a)47 done([b, m])48 }49 let s = t == "CLOSED" ? r.subs.get(a) : t == "OK" && !b && r.oks.get(a)50 if (s && /^auth-required:/.test(t == "OK" ? m : b) && allowed(url) && !c.tried.has(t + a)){51 c.tried.add(t + a)52 evt.preventDefault()53 auth(url).catch(()=>{}).then(()=>t == "OK" ? r.oks.has(a) && r.send(["EVENT", s.event]) : r.subs.has(a) && r.send(["REQ", a, ...s.filters]))54 }55 })56 w.gold = {auth, state}57})()