UNPKG

scrapeless-mcp-server

Version:
69 lines (68 loc) 2.51 kB
import { Scrapeless } from "@scrapeless-ai/sdk"; import { getParamValue } from "@chatmcp/sdk/utils/index.js"; import puppeteer from "puppeteer-core"; export class SessionManager { sessions; constructor() { this.sessions = new Map(); } async createSession(id, apiKey, headers) { if (!this.sessions.has(id)) { this.sessions.set(id, { browser: null, page: null, closed: true }); } const scrapelessClient = new Scrapeless({ apiKey }); const session = this.sessions.get(id); const { browserWSEndpoint } = scrapelessClient.browser.create({ session_ttl: Number(process.env.BROWSER_SESSION_TTL || getParamValue("BROWSER_SESSION_TTL") || headers?.["x-browser-session-ttl"] || 30000), profile_id: process.env.BROWSER_PROFILE_ID || getParamValue("BROWSER_PROFILE_ID") || headers?.["x-browser-profile-id"] || "", profile_persist: Boolean(process.env.BROWSER_PROFILE_PERSIST || getParamValue("BROWSER_PROFILE_PERSIST") || headers?.["x-browser-profile-persist"]), }); const browser = await puppeteer.connect({ browserWSEndpoint, defaultViewport: null, }); const pages = await browser.pages(); const page = pages.length > 0 ? pages[0] : await browser.newPage(); browser.on("disconnected", () => { session.closed = true; session.browser = null; session.page = null; }); session.browser = browser; session.page = page; session.closed = false; return session; } getSession(id) { if (!this.sessions.has(id)) return null; const session = this.sessions.get(id); if (!session.browser || !session.browser?.connected) { session.browser = null; session.page = null; session.closed = true; this.sessions.delete(id); return null; } return session; } async closeSession(id) { const session = this.sessions.get(id); if (session) { session.page?.close().catch(() => { }); session.browser?.disconnect().catch(() => { }); session.closed = true; session.browser = null; session.page = null; this.sessions.delete(id); } } }