feat(bridge): connect Gravity Web server to Extension Bridge — proxy routes + WS forwarding

This commit is contained in:
2026-03-07 23:56:41 +09:00
parent 68298eba74
commit bee5e512a9
3 changed files with 257 additions and 1 deletions

View File

@@ -11,6 +11,7 @@ const path = require('path');
const { WebSocketServer, WebSocket } = require('ws');
const SessionManager = require('./session-manager');
const { AutoDiscovery } = require('./auto-discover');
const BridgeClient = require('./bridge-client');
const PORT = process.env.PORT || 3300;
const app = express();
@@ -252,7 +253,80 @@ function broadcastSessions() {
}
}
// ─── REST API ───────────────────────────────────────────
// ─── Bridge API 프록시 ──────────────────────────────────
const bridge = new BridgeClient();
app.get('/api/bridge/health', async (req, res) => {
try {
const health = await bridge.checkHealth();
res.json(health);
} catch (e) {
res.json({ available: false, error: e.message });
}
});
app.get('/api/bridge/sessions', async (req, res) => {
try {
const data = await bridge.getSessions();
res.json(data);
} catch (e) {
res.status(502).json({ error: 'Bridge 연결 실패: ' + e.message });
}
});
app.get('/api/bridge/cascades', async (req, res) => {
try {
const data = await bridge.getCascades();
res.json(data);
} catch (e) {
res.status(502).json({ error: 'Bridge 연결 실패: ' + e.message });
}
});
app.post('/api/bridge/send', async (req, res) => {
try {
const { message, sessionId } = req.body;
const result = await bridge.sendMessage(message, sessionId);
res.json(result);
} catch (e) {
res.status(502).json({ error: e.message });
}
});
app.post('/api/bridge/accept', async (req, res) => {
try {
const result = await bridge.acceptStep();
res.json(result);
} catch (e) {
res.status(502).json({ error: e.message });
}
});
app.post('/api/bridge/reject', async (req, res) => {
try {
const result = await bridge.rejectStep();
res.json(result);
} catch (e) {
res.status(502).json({ error: e.message });
}
});
app.post('/api/bridge/accept-terminal', async (req, res) => {
try {
const result = await bridge.acceptTerminal();
res.json(result);
} catch (e) {
res.status(502).json({ error: e.message });
}
});
// Bridge WS 이벤트 → 프론트엔드 포워딩
bridge.connectWs((msg) => {
broadcastToAll({ type: 'bridge_event', ...msg });
});
// ─── CDP REST API (레거시) ──────────────────────────────
app.get('/api/sessions', (req, res) => {
res.json(sessionManager.listSessions());