File size: 2,245 Bytes
bb41030
2c2fae6
 
 
950475f
bb41030
 
 
 
2c2fae6
 
 
 
 
 
 
aaa04de
 
 
2c2fae6
 
aaa04de
2c2fae6
 
aaa04de
2c2fae6
 
 
fd1f461
aaa04de
 
 
 
17a1fa8
aaa04de
 
 
 
 
 
 
fd1f461
4358f3a
 
bb41030
 
 
fd1f461
bb41030
2c2fae6
 
 
 
 
 
 
fd1f461
2c2fae6
 
 
 
 
 
 
bb41030
 
 
 
 
2c2fae6
bb41030
2c2fae6
bb41030
2c2fae6
 
 
bb41030
 
 
0bbe894
950475f
 
 
 
 
 
2c2fae6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
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,
    });

    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 = {}) {
    const buffer = await orig.apply(this, [options]);
    const url = await uploadFile(buffer);
    console.log("[patchScreenshot] Upload result:", url);
    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;
      browser.newPage = async (...a) => {
        const page = await origNewPage.apply(browser, a);
        patchScreenshot(page, images);
        return page;
      };
      return browser;
    }
  };

  try {
    const result = await eval(`
      (async () => {
        ${code}
      })()
    `);
    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}`);
});