scrapeless-mcp-server
Version:
Scrapeless Mcp Server
69 lines (68 loc) • 2.51 kB
JavaScript
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);
}
}
}