1(()=>{2 let g = globalThis, d = g.document3 if (g.argon) return4 let db5 let done = (r)=>new Promise((res, rej)=>(r.onsuccess = ()=>res(r.result), r.onerror = ()=>rej(r.error)))6 let store = async(mode)=>(await (db ||= new Promise((res, rej)=>{7 let r = indexedDB.open(g.narCfg?.name ?? "argon", 1)8 r.onupgradeneeded = ()=>r.result.createObjectStore("e", {keyPath:"k"}).createIndex("t", "e.created_at")9 done(r).then(res, rej)10 }))).transaction("e", mode).objectStore("e")11 let key = (e)=>{12 let k = e.kind, who = k + ":" + e.pubkey13 if (k == 0 || k == 3 || k >= 1e4 && k < 2e4) return who14 if (k >= 3e4 && k < 4e4) return who + ":" + (e.tags.find((t)=>t[0] == "d")?.[1] ?? "")15 return e.id16 }17 let match = (f, e)=>(!f.ids || f.ids.includes(e.id))18 && (!f.kinds || f.kinds.includes(e.kind))19 && (!f.authors || f.authors.includes(e.pubkey))20 && !(e.created_at < f.since || e.created_at > f.until)21 && Object.keys(f).every((k)=>k[0] != "#" || e.tags.some((t)=>t[0] == k.slice(1) && f[k].includes(t[1])))22 let put = async(e)=>{23 if (e.kind >= 2e4 && e.kind < 3e4) return false24 let s = await store("readwrite"), k = key(e), old = (await done(s.get(k)))?.e25 if (old && (old.created_at > e.created_at || old.created_at == e.created_at && old.id <= e.id)) return false26 if (e.kind == 5) for (let [t, v] of e.tags) if (t == "e" && (await done(s.get(v)))?.e.pubkey == e.pubkey) s.delete(v)27 await done(s.put({k, e}))28 return true29 }30 let query = async(filters)=>{31 let out = new Map(), n = filters.map(()=>0), c = (await store("readonly")).index("t").openCursor(null, "prev")32 return new Promise((res, rej)=>{33 c.onerror = ()=>rej(c.error)34 c.onsuccess = ()=>{35 let cur = c.result, full = (f, i)=>f.limit != null && n[i] >= f.limit36 if (!cur || filters.every(full)) return res([...out.values()])37 let e = cur.value.e38 filters.forEach((f, i)=>!full(f, i) && match(f, e) && out.set(e.id, e) && n[i]++)39 cur.continue()40 }41 })42 }43 let remove = async(k)=>done((await store("readwrite"))[k ? "delete" : "clear"](k))44 g.argon = {put, query, match, remove}45 if (!d) return46 let skip = (c)=>c.elt?.closest?.("[nar-ignore]")47 d.addEventListener("nhy:config", (evt)=>{48 let c = evt.detail.cfg49 if (c.filters && !skip(c)) query(c.filters).then((es)=>{50 if (evt.defaultPrevented) return51 es.forEach((e)=>c.deliver(e, "argon"))52 c.oneose?.("argon")53 })54 })55 d.addEventListener("nhy:event", (evt)=>evt.detail.from != "argon" && !skip(evt.detail.cfg) && put(evt.detail.event))56 d.addEventListener("nxe:publish", (evt)=>put(evt.detail.cfg.event))57})()