Spaces:
Running
Running
const express = require("express"); | |
const { chromium: origChromium } = require("playwright"); | |
const axios = require("axios"); | |
const Form = require("form-data"); | |
const http = require("http"); | |
const app = express(); | |
app.use(express.json({ limit: "5mb" })); | |
const uploadFile = async (file) => { | |
const key = "AIzaBj7z2z3xBjsk"; | |
let domain = "https://c.termai.cc"; | |
const formData = new Form(); | |
formData.append("file", file, { filename: "file.png" }); | |
try { | |
const response = await axios.post( | |
`${domain}/api/upload?uploader=drive&key=` + key, | |
formData, | |
{ | |
headers: formData.getHeaders(), | |
maxBodyLength: Infinity, | |
} | |
); | |
console.log("[uploadFile] Upload result:", response.data); | |
return response.data || {}; | |
} catch (error) { | |
console.error( | |
"Error uploading file", | |
error.response?.data || error.message | |
); | |
return {}; | |
} | |
}; | |
const patchScreenshot = (page, images) => { | |
const orig = page.screenshot; | |
page.screenshot = async function (options = {}) { | |
console.log("[patchScreenshot] Screenshot called"); | |
const buffer = await orig.apply(this, [options]); | |
const url = await uploadFile(buffer); | |
if (url && url.path) { | |
images.push(url.path); | |
} | |
return buffer; | |
}; | |
}; | |
app.all("/", async (req, res) => { | |
const code = req.body?.code || req.query?.code; | |
if (!code) return res.status(400).json({ error: "No code provided" }); | |
let browser; | |
let images = []; | |
const chromium = { | |
...origChromium, | |
launch: async (...args) => { | |
browser = await origChromium.launch(...args); | |
const origNewPage = browser.newPage.bind(browser); | |
browser.newPage = async (...a) => { | |
const page = await origNewPage(...a); | |
patchScreenshot(page, images); | |
return page; | |
}; | |
return browser; | |
}, | |
}; | |
try { | |
const func = new Function( | |
"chromium", | |
`return (async () => { ${code} })()` | |
); | |
const result = await func(chromium); | |
res.json({ success: true, result, images }); | |
} catch (err) { | |
res.status(500).json({ error: err.message, images }); | |
} finally { | |
if (browser) { | |
try { | |
await browser.close(); | |
} catch {} | |
} | |
} | |
}); | |
const PORT = process.env.PORT || 7860; | |
const server = http.createServer( | |
{ | |
maxHeaderSize: 64 * 1024, | |
}, | |
app | |
); | |
server.listen(PORT, () => { | |
console.log(`Server running on port ${PORT}`); | |
}); | |