Spaces:
Paused
Paused
| const bytes = require('bytes') | |
| const express = require('express') | |
| const os = require('node:os') | |
| const path = require('node:path') | |
| const util = require('node:util') | |
| const { Worker } = require('node:worker_threads') | |
| const app = express() | |
| app.set('json spaces', 4) | |
| app.use(express.json()) | |
| app.use(express.urlencoded({ extended: true })) | |
| const runBrowserScript = (code) => new Promise((resolve, reject) => { | |
| const worker = new Worker(path.resolve(__dirname, 'worker.js')) | |
| worker.postMessage(code) | |
| worker.on('message', ({ result, error }) => | |
| error ? reject(new Error(error)) : resolve(result) | |
| ) | |
| worker.on('error', reject) | |
| worker.on('exit', (code) => | |
| (code !== 0) && reject(new Error(`Worker exited with code ${code}`)) | |
| ) | |
| }) | |
| app.use((req, res, next) => { | |
| const time = new Date().toLocaleString('id', { timeZone: 'Asia/Jakarta' }) | |
| console.log('[%s] %s: %s', time, req.method, req.url) | |
| next() | |
| }) | |
| app.use('/file', express.static('/tmp')) | |
| app.all('/', (_, res) => { | |
| const formatSize = (n) => bytes(+n, { unitSeparator: ' ' }) | |
| const status = {} | |
| const used = process.memoryUsage() | |
| for (let x in used) status[x] = formatSize(used[x]) | |
| const totalmem = os.totalmem() | |
| const freemem = os.freemem() | |
| status['memoryUsage'] = | |
| `${formatSize(totalmem - freemem)} / ${formatSize(totalmem)}` | |
| res.json({ | |
| uptime: new Date(process.uptime() * 1000).toUTCString().split(' ')[4], | |
| status | |
| }) | |
| }) | |
| app.post('/run', async (req, res) => { | |
| const { code } = req.body | |
| if (!code) return res.status(400).json({ error: 'Code is required' }) | |
| try { | |
| const result = await runBrowserScript(code) | |
| res.json({ result }) | |
| } catch (e) { | |
| res.status(500).json({ error: util.format(e) }) | |
| } | |
| }) | |
| const PORT = process.env.SPACE_ID ? 7860 : process.env.PORT || 3000 | |
| app.listen(PORT, () => console.log(`Playwright API listening at http://localhost:${PORT}`)) | |