import { d as dt } from './parse_token.util-ed270559.js'; import { n } from './router.interface-6cdbc015.js'; import { e } from './fetch_youtube-cfbafc47.js'; import { s as s$1, m } from './storage-a8ac7bd3.js'; class s extends Error { constructor(t, e) { super(e), this.code = t, this.message = e; } } const r = (t, e = {}, n) => ({ body: e, meta: { isSuccess: !1, code: t, nonce: n } }); let i; const c = t => s$1.cookies.getAll({ url: t }).then((t => t.filter((t => !t.name.startsWith("ST-"))).map((t => [t.name, t.value])))).then(Object.fromEntries), u = { "@me": async () => { const t = await m.auth.get("token"); return dt(t) }, token: async () => await m.auth.get("token"), logout: async () => { const t = await m.auth.get("token"); await fetch("https://v2.mogultv.org/auth/youtube", { method: "DELETE", headers: { Authorization: `Bearer ${t}` } }), await m.auth.remove("token"); }, login: async t => { const n = await c(t.href), a = await fetch("https://v2.mogultv.org/auth/youtube", { method: "POST", body: JSON.stringify(Object.assign(Object.assign({}, t), { cookies: n })) }); if (200 !== a.status) return null; const { jwt: o } = await a.json(); return await m.auth.set("token", o), o }, link: async t => { const n = await m.auth.get("token"), o = await fetch(`https://v2.mogultv.org/link/${t}`, { method: "GET", headers: { Authorization: `Bearer ${n}` } }); if (200 !== o.status) return; const s = await o.text(); await chrome.cookies.set({ url: "https://v2.mogultv.org", name: "Authorization", value: n, httpOnly: !0, path: `/link/${t}/callback`, expirationDate: Math.floor(Date.now() / 1e3) + 3600 }), await chrome.windows.create({ url: s, focused: !0, type: "popup", width: 850, height: 800 }); const r = await new Promise((t => { i = t; })); return m.auth.set("token", r), dt(r) }, "finish-link": async (t, e) => { var a, o; (null === (a = e.sender.tab) || void 0 === a ? void 0 : a.id) && s$1.tabs.remove(null === (o = e.sender.tab) || void 0 === o ? void 0 : o.id), null == i || i(t); }, "disconnect-link": async t => { const n = await m.auth.get("token"), o = await fetch(`https://v2.mogultv.org/link/${t}`, { method: "DELETE", headers: { Authorization: `Bearer ${n}` } }); if (200 !== o.status) return; const { jwt: s } = await o.json(); return await m.auth.set("token", s), dt(s) } }; const l = t => async () => { var n, a; const o = await m.cache.get(t); let s; if (o && o.expiresAt > Date.now()) s = o.value; else { const o = await fetch("https://v2.mogultv.org" + t), r = Number(o.headers.get("age")), i = Number((null === (a = null === (n = o.headers.get("cache-control")) || void 0 === n ? void 0 : n.match(/max-age=(\d+)/)) || void 0 === a ? void 0 : a[1]) || 300) - r, c = Date.now() + 1e3 * i; s = await o.json(), await m.cache.set(t, { expiresAt: c, value: s }); } return s }; async function d(t, e) { const n = { sourceType: t, sourceId: e }; try { const t = await async function(t, e, n, { throwIfErrors: a } = {}) { var o; const s = await fetch(t, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ query: e, variables: n }) }), r = await s.json(); if (a && (null === (o = r.data) || void 0 === o ? void 0 : o.errors)) throw new Error(`spore graphql error ${r.data.errors}`); return r.data }("https://zygote.spore.build/graphql", "query GetExtensionMappingConnection($sourceType: String, $sourceId: String) {\n\textensionMappingConnection(sourceType: $sourceType, sourceId: $sourceId) {\n\t\tnodes {\n\t\t\tid\n\t\t\tslug\n\t\t\tiframeUrl\n\t\t\tdomAction\n\t\t\tquerySelector\n\t\t\tiframeQuerySelector\n\t\t}\n\t}\n}", n); return t.extensionMappingConnection.nodes } catch (t) { console.error(t); } } const h = { youtube: { "get-stream": async () => { const t = await m.cache.get("get-stream"); let n; if (t && t.expiresAt > Date.now()) n = t.value; else { const t = Date.now() + 6e4; n = await async function() { try { const t = await fetch("https://youtube.com/channel/UCrPseYLGpNygVi34QpGNqpA/live"); if (200 !== t.status) return null; const e = await t.text(), n = /(?:window\s*\[\s*["']ytInitialData["']\s*\]|ytInitialData)\s*=\s*({.+?})\s*;/.exec(e); if (n) { const t = JSON.parse(n[1]), e = t.currentVideoEndpoint.watchEndpoint.videoId, a = t.contents.twoColumnWatchNextResults.results.results.contents[0].videoPrimaryInfoRenderer, o = t.contents.twoColumnWatchNextResults.results.results.contents[1].videoSecondaryInfoRenderer.owner.videoOwnerRenderer.thumbnail.thumbnails[0].url, s = a.viewCount.videoViewCountRenderer.viewCount.runs.find((t => /^[0-9,]+$/.test(t.text))).text; return { title: a.title.runs[0].text, viewersCount: parseInt(s.replace(/,/g, "")), previewImageURL: `https://i.ytimg.com/vi/${e}/mqdefault.jpg`, profileImageURL: o } } } catch (t) { console.warn(t); } return null }(), await m.cache.set("get-stream", { expiresAt: t, value: n }); } return n }, "get-user": async t => { const e$1 = await c(t.href), n = await e(Object.assign(Object.assign({}, t), { cookies: e$1 })); if (!n.success) throw new s(n.code, n.message); return n.data } }, gateway: { users: l("/gateway/users"), emotes: l("/gateway/emotes"), badges: l("/gateway/badges"), "set-settings": async t => { const n = await m.auth.get("token"), o = await fetch("https://v2.mogultv.org/gateway/settings", { method: "PUT", headers: { Authorization: `Bearer ${n}` }, body: JSON.stringify(t) }), { jwt: s } = await o.json(); return m.auth.set("token", s), dt(s) } }, auth: u, extension: { popup: () => s$1.action.openPopup(), "open-tab": async t => { await s$1.tabs.create({ url: t }); } }, spore: { "fetch-extension-mappings": async t => await d("youtube", t) } }, w = async (e, n$1) => { var a; const { path: o, body: s } = e; if (!o) return; e.meta ? e.meta.sender = n$1 : e.meta = { sender: n$1, isPort: !1 }, e.meta.isPort || (e.meta.isPort = !1); const i = t => {}, c = o.split("/").filter(Boolean), u = c[0]; if (!(u in h)) { return r(n.NotFound, void 0, e.nonce) } const l = h[u][c.slice(1).join("/")]; if (!l) { return r(n.NotFound, void 0, e.nonce) } try { const n$1 = ((e, n$1) => ({ body: e, meta: { isSuccess: !0, code: n.Success, nonce: n$1 } }))(await l(s, e.meta), e.nonce); return i(n$1), n$1 } catch (n$1) { const o = n$1; return r(null !== (a = o.code) && void 0 !== a ? a : n.Unknown, { message: o.message }, e.nonce) } }; s$1.runtime.onConnect.addListener((t => { const e = t.sender; e && t.onMessage.addListener((async n => { n.meta = { isPort: !0 }; const a = await w(n, e); t.postMessage(a); })); })), s$1.runtime.onMessage.addListener(w);