import express from 'express' import { WebSocketServer } from 'ws' import * as pty from 'node-pty' const app = express() app.use(express.json()) app.get('/api/foo', c => c.json({ foo: 42 })) app.get('/api/docker/:tag', (req, res) => { wss.handleUpgrade(req, res.socket, req.headers, ws => { wss.emit('connection', ws, req) }) }) const server = app.listen(5432, () => { console.log('Starting API server on :5432...') }) const wss = new WebSocketServer({ server }) wss.on('connection', (ws, req) => { const url = new URL(req.url, `http://${req.headers.host}`) const tag = url.pathname.split('/')[3] console.log(`Client connected, initializing "${tag}"...`) const docker = pty.spawn('docker', ['run', '--init', '-it', '--rm', tag, '/bin/sh']) docker.onExit(e => { ws.send(JSON.stringify(e)) ws.close() console.log('Client requested stop') }) docker.onData(data => { ws.send(data) }) ws.on('message', message => { docker.write(message) }) ws.on('close', () => { docker.kill() console.log('Client disconnected') }) })