mogultv/background.js

419 lines
17 KiB
JavaScript

import {
d as dt,
t
} from './parse_token.util-73818eef.js';
import {
n,
e,
c
} from './constants-27e12ede.js';
import {
n as n$1
} from './router.interface-6cdbc015.js';
import {
s,
m as m$1
} from './storage-6f9cf62e.js';
class i extends Error {
constructor(t, e) {
super(e), this.code = t, this.message = e;
}
}
const l = (t, e = {}, n) => ({
body: e,
meta: {
isSuccess: !1,
code: t,
nonce: n
}
});
let u;
const d = t => s.cookies.getAll({
url: t
}).then((t => t.filter((t => !t.name.startsWith("ST-"))).map((t => [t.name, t.value])))).then(Object.fromEntries),
p = {
"@me": async () => {
const t = await m$1.auth.get("token2");
return dt(t)
},
token: async () => m$1.auth.get("token2"),
logout: async () => {
const t = await m$1.auth.get("token2");
await fetch("https://truffle-tv-source-test.truffle-tv.workers.dev/auth/youtube", {
method: "DELETE",
headers: {
Authorization: `Bearer ${t}`
}
}), await m$1.auth.remove("token2");
},
login: async t => {
const n = await d(t.href),
o = await fetch("https://truffle-tv-source-test.truffle-tv.workers.dev/auth/youtube", {
method: "POST",
body: JSON.stringify(Object.assign(Object.assign({}, t), {
cookies: n
}))
});
if (200 !== o.status) return null;
const {
jwt: r
} = await o.json();
return await m$1.auth.set("token2", r), r
},
link: async t => {
const n = await m$1.auth.get("token2"),
r = await fetch(`https://truffle-tv-source-test.truffle-tv.workers.dev/link/${t}`, {
method: "GET",
headers: {
Authorization: `Bearer ${n}`
}
});
if (200 !== r.status) return;
const s = await r.text();
await chrome.cookies.set({
url: "https://truffle-tv-source-test.truffle-tv.workers.dev",
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 a = await new Promise((t => {
u = t;
}));
return m$1.auth.set("token2", a), dt(a)
},
"finish-link": async (t, e) => {
var o, r;
(null === (o = e.sender.tab) || void 0 === o ? void 0 : o.id) && s.tabs.remove(null === (r = e.sender.tab) || void 0 === r ? void 0 : r.id), null == u || u(t);
},
"disconnect-link": async t => {
const n = await m$1.auth.get("token2"),
r = await fetch(`https://truffle-tv-source-test.truffle-tv.workers.dev/link/${t}`, {
method: "DELETE",
headers: {
Authorization: `Bearer ${n}`
}
});
if (200 !== r.status) return;
const {
jwt: s
} = await r.json();
return await m$1.auth.set("token2", s), dt(s)
}
};
const h = {
"get-stream": async () => {
const t = await m$1.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,
o = t.contents.twoColumnWatchNextResults.results.results.contents[0].videoPrimaryInfoRenderer,
r = t.contents.twoColumnWatchNextResults.results.results.contents[1].videoSecondaryInfoRenderer.owner.videoOwnerRenderer.thumbnail.thumbnails[0].url,
s = o.viewCount.videoViewCountRenderer.viewCount.runs.find((t => /^[0-9,]+$/.test(t.text))).text;
return {
title: o.title.runs[0].text,
viewersCount: parseInt(s.replace(/,/g, "")),
previewImageURL: `https://i.ytimg.com/vi/${e}/mqdefault.jpg`,
profileImageURL: r
}
}
} catch (t) {
console.warn(t);
}
return null
}(), await m$1.cache.set("get-stream", {
expiresAt: t,
value: n
});
}
return n
},
"get-user": async t => {
const e$1 = await d(t.href),
n = await e(Object.assign(Object.assign({}, t), {
cookies: e$1
}));
if (!n.success) throw new i(n.code, n.message);
return n.data
}
},
g = async (t, {
cacheExpirationMs: n = c.ONE_SECOND_MS,
cacheControlFallback: o = c.FIVE_MINUTE_SECONDS
} = {}) => {
var r, s;
const a = await m$1.cache.get(t);
let i;
if (a && a.expiresAt > Date.now()) i = a.value;
else {
const a = await fetch("https://truffle-tv-source-test.truffle-tv.workers.dev" + t),
c = Number(a.headers.get("age")),
l = Number((null === (s = null === (r = a.headers.get("cache-control")) || void 0 === r ? void 0 : r.match(/max-age=(\d+)/)) || void 0 === s ? void 0 : s[1]) || o) - c,
u = Date.now() + l * n;
i = await a.json(), await m$1.cache.set(t, {
expiresAt: u,
value: i
});
}
return i
}, f = (t, {
cacheExpirationMs: e = c.ONE_SECOND_MS,
cacheControlFallback: n = c.FIVE_MINUTE_SECONDS
} = {}) => async () => g(t, {
cacheControlFallback: n,
cacheExpirationMs: e
}), w = {
users: t => (console.log("fetching channelId"), g(`/gateway/users/c/${t}`)),
emotes: f("/gateway/emotes"),
badges: f("/gateway/badges"),
"set-settings": async t => {
console.log("updating settings", t);
const n = await m$1.auth.get("token2"),
r = await fetch("https://truffle-tv-source-test.truffle-tv.workers.dev/gateway/settings", {
method: "PUT",
headers: {
Authorization: `Bearer ${n}`
},
body: JSON.stringify(t)
}),
{
jwt: s
} = await r.json();
return m$1.auth.set("token2", s), dt(s)
}
};
async function v(t, n, {
expireSeconds: o = c.ONE_MINUTE_SECONDS
} = {}) {
const r = await m$1.cache.get(t);
let s;
const a = (null == r ? void 0 : r.expiresAt) > Date.now();
if ((null == r ? void 0 : r.value) && a) s = r.value;
else {
s = await n();
const r = Date.now() + o * c.ONE_SECOND_MS;
await m$1.cache.set(t, {
expiresAt: r,
value: s
});
}
return s
}
function y(t$1, e) {
const n = function(t$1) {
if (null == t$1 ? void 0 : t$1.nodes) return t$1.nodes.map((t$1 => {
if (t$1) return function(t$1) {
return {
id: t$1.collectible.id,
name: t$1.collectible.slug,
ext: t$1.collectible.fileRel.fileObj.ext,
provider: t.Spore
}
}(t$1)
})).filter(m);
return []
}(null == e ? void 0 : e.ownedCollectibleConnection),
o = (s = null == e ? void 0 : e.ownedCollectibleConnection, null === (a = null == s ? void 0 : s.nodes) || void 0 === a ? void 0 : a.map((t => {
var e;
return null === (e = null == t ? void 0 : t.collectible) || void 0 === e ? void 0 : e.slug
})));
var s, a;
const c = function(t) {
var e;
return null === (e = null == t ? void 0 : t.nodes) || void 0 === e ? void 0 : e.map((t => {
var e;
return null === (e = null == t ? void 0 : t.powerup) || void 0 === e ? void 0 : e.slug
}))
}(null == e ? void 0 : e.activePowerupConnection);
return {
id: t$1,
emotes: o,
badges: c,
serializedEmotes: n
}
}
const m = t => !!t;
async function b(t, e, n, {
throwIfErrors: o
} = {}) {
var r;
const s = await fetch(t, {
method: "POST",
headers: {
Authorization: "Bearer pk_1K4r062GimOrw71jtDpzSAhii0lExREdcMZ2Fp5Y2uBjiZ1gS",
"Content-Type": "application/json"
},
body: JSON.stringify({
query: e,
variables: n
})
}),
a = await s.json();
if (o && (null === (r = a.data) || void 0 === r ? void 0 : r.errors)) throw new Error(`spore graphql error ${a.data.errors}`);
return a.data
}
const S = {
youtube: h,
gateway: w,
auth: p,
extension: {
popup: () => s.action.openPopup(),
"open-tab": async t => {
await s.tabs.create({
url: t
});
}
},
spore: {
"fetch-extension-mappings": async ({
channelId: t,
extensionVersion: e
}) => (console.log("fetching ext. mappigns", {
channelId: t,
extensionVersion: e
}), await async function(t, e, n) {
const o = {
sourceType: t,
sourceId: e,
extensionVersion: n
};
try {
const t = await b("https://zygote.spore.build/graphql", "query GetExtensionMappingConnection($sourceType: String, $sourceId: String, $extensionVersion: String) {\n\textensionMappingConnection(sourceType: $sourceType, sourceId: $sourceId, extensionVersion: $extensionVersion) {\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}", o);
return console.log("res", t), t.extensionMappingConnection.nodes
} catch (t) {
console.error(t);
}
}("youtube", t, e)),
"fetch-spore-user": async ({
connectionSourceId: t,
sporeOrgId: e,
preferCache: n = !0
} = {}) => {
const o = async () => {
const n = await async function(t, e) {
const n = {
orgId: e,
connectionSourceType: "youtube",
connectionSourceId: t,
collectibleType: "emote"
};
try {
return (await b("https://zygote.spore.build/graphql", "query CacheableOrgUserWithCollectiblesAndActivePowerups(\n $orgId: ID\n $connectionSourceType: String,\n $connectionSourceId: String,\n $collectibleType: String\n ) {\n orgUser(\n orgId: $orgId\n connectionSourceType: $connectionSourceType,\n connectionSourceId: $connectionSourceId\n\t\t\t) \n\t\t{\n\t\t\tid\n\t\t\tuserId\n\t\t\torgId\n\t\t\townedCollectibleConnection(collectibleType: $collectibleType) {\n\t\t\t\tnodes {\n\t\t\t\t\tuserId\n\t\t\t\t\tcollectible {\n\t\t\t\t\t\tid\n\t\t\t\t\t\tname\n\t\t\t\t\t\tslug\n\t\t\t\t\t\tfileRel {\n\t\t\t\t\t\t\tfileObj {\n\t\t\t\t\t\t\t\tsrc\n\t\t\t\t\t\t\t\text\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tactivePowerupConnection {\n\t\t\t\ttotalCount\n\t\t\t\tnodes {\n\t\t\t\t\tid\n\t\t\t\t\tuserId\n\t\t\t\t\tpowerup {\n\t\t\t\t\t\tid\n\t\t\t\t\t\tslug\n\t\t\t\t\t\tcomponentRels {\n\t\t\t\t\t\t\tprops\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n }\n\t}", n)).orgUser
} catch (t) {
console.error(t);
}
}(t, e);
return y(t, n)
};
if (n) {
const t = ((t, e) => `${t}:${e}`)(e, e);
return v(t, o, {
expireSeconds: 15
})
}
return o()
},
"fetch-youtube-channel": async t => {
const e = (t => `spore-org-yt-channel:${t}`)(t);
return v(e, (() => async function(t) {
const e = {
id: t
};
try {
return (await b("https://zygote.spore.build/graphql", "query YoutubeChannelById($id: String) {\n\tyoutubeChannel(id: $id) {\n\t\tid\n\t\tsporeOrgId\n\t\tchannelName\n\t\tisLive\t\n\t}\n}", e)).youtubeChannel
} catch (t) {
console.error(t);
}
}(t)), {
expireSeconds: 60
})
}
}
},
x = async (e, n$2) => {
var o;
const {
path: r,
body: a
} = e;
if (!r) return;
e.meta ? e.meta.sender = n$2 : e.meta = {
sender: n$2,
isPort: !1
}, e.meta.isPort || (e.meta.isPort = !1);
const c = (t => {
const e = Date.now();
return console.groupEnd(), console.groupCollapsed(`${t.meta.isPort?"P":""}-> %c${t.path}`, `color: ${n(t.path)}`), void 0 !== t.body && console.log("%cBody:", "color: hsl(0deg, 100%, 70%); font-weight: bold;", t.body), console.log("%cMeta:", "color: hsl(30deg, 100%, 70%); font-weight: bold;", t.meta), console.groupEnd(), n$1 => {
console.groupEnd(), console.groupCollapsed(`${t.meta.isPort?"P":""}<- %c${n$1.meta.code}%c ${t.path} %c${Date.now()-e}ms`, `background: ${n$1.meta.isSuccess?"#2ecc71":"#e74c3c"}; color: black; padding: 2px; border-radius: 2px;`, `color: ${n(t.path)}`, "color: white; font-weight: normal"), console.log("%cBody:", "color: hsl(0deg, 100%, 70%); font-weight: bold;", n$1.body), console.groupEnd();
}
})(e),
i = r.split("/").filter(Boolean),
u = i[0];
if (!(u in S)) {
const n = l(n$1.NotFound, void 0, e.nonce);
return c(n), n
}
const d = S[u][i.slice(1).join("/")];
if (!d) {
const n = l(n$1.NotFound, void 0, e.nonce);
return c(n), n
}
try {
const n = ((e, n) => ({
body: e,
meta: {
isSuccess: !0,
code: n$1.Success,
nonce: n
}
}))(await d(a, e.meta), e.nonce);
return c(n), n
} catch (n) {
const r = n;
console.error("error in background", r);
const s = l(null !== (o = r.code) && void 0 !== o ? o : n$1.Unknown, {
message: r.message
}, e.nonce);
return c(s), s
}
};
s.runtime.onConnect.addListener((t => {
var e;
const o = t.sender;
o && (console.log(`%cCONNECT:%c ${null===(e=t.sender)||void 0===e?void 0:e.url}`, "color: black; font-weight: bold; background: #2ecc71; padding: 2px; border-radius: 2px;", ""), t.onDisconnect.addListener((() => {
var e;
console.log(`%cDISCONNECT:%c ${null===(e=t.sender)||void 0===e?void 0:e.url}`, "color: black; font-weight: bold; background: #e74c3c; padding: 2px; border-radius: 2px;", "");
})), t.onMessage.addListener((async e => {
e.meta = {
isPort: !0
};
const n = await x(e, o);
t.postMessage(n);
})), s.tabs.onUpdated.addListener(((e, n, o) => {
t.postMessage({
type: "tab:updated",
tabId: e,
changeInfo: n,
tab: o
});
})));
})), s.runtime.onMessage.addListener(x);