|
|
import * as cluster from "../../misc/cluster.js"; |
|
|
|
|
|
import { Agent } from "undici"; |
|
|
import { env } from "../../config.js"; |
|
|
import { Green, Yellow } from "../../misc/console-text.js"; |
|
|
|
|
|
const defaultAgent = new Agent(); |
|
|
|
|
|
let session; |
|
|
|
|
|
const validateSession = (sessionResponse) => { |
|
|
if (!sessionResponse.potoken) { |
|
|
throw "no poToken in session response"; |
|
|
} |
|
|
|
|
|
if (!sessionResponse.visitor_data) { |
|
|
throw "no visitor_data in session response"; |
|
|
} |
|
|
|
|
|
if (!sessionResponse.updated) { |
|
|
throw "no last update timestamp in session response"; |
|
|
} |
|
|
|
|
|
|
|
|
if (sessionResponse.potoken.length < 160) { |
|
|
console.error(`${Yellow('[!]')} poToken is too short and might not work (${new Date().toISOString()})`); |
|
|
} |
|
|
} |
|
|
|
|
|
const updateSession = (newSession) => { |
|
|
session = newSession; |
|
|
} |
|
|
|
|
|
const loadSession = async () => { |
|
|
const sessionServerUrl = new URL(env.ytSessionServer); |
|
|
sessionServerUrl.pathname = "/token"; |
|
|
|
|
|
const newSession = await fetch( |
|
|
sessionServerUrl, |
|
|
{ dispatcher: defaultAgent } |
|
|
).then(a => a.json()); |
|
|
|
|
|
validateSession(newSession); |
|
|
|
|
|
if (!session || session.updated < newSession?.updated) { |
|
|
cluster.broadcast({ youtube_session: newSession }); |
|
|
updateSession(newSession); |
|
|
} |
|
|
} |
|
|
|
|
|
const wrapLoad = (initial = false) => { |
|
|
loadSession() |
|
|
.then(() => { |
|
|
if (initial) { |
|
|
console.log(`${Green('[✓]')} poToken & visitor_data loaded successfully!`); |
|
|
} |
|
|
}) |
|
|
.catch((e) => { |
|
|
console.error(`${Yellow('[!]')} Failed loading poToken & visitor_data at ${new Date().toISOString()}.`); |
|
|
console.error('Error:', e); |
|
|
}) |
|
|
} |
|
|
|
|
|
export const getYouTubeSession = () => { |
|
|
return session; |
|
|
} |
|
|
|
|
|
export const setup = () => { |
|
|
if (cluster.isPrimary) { |
|
|
wrapLoad(true); |
|
|
if (env.ytSessionReloadInterval > 0) { |
|
|
setInterval(wrapLoad, env.ytSessionReloadInterval * 1000); |
|
|
} |
|
|
} else if (cluster.isWorker) { |
|
|
process.on('message', (message) => { |
|
|
if ('youtube_session' in message) { |
|
|
updateSession(message.youtube_session); |
|
|
} |
|
|
}); |
|
|
} |
|
|
} |
|
|
|