feat(bridge): connect Gravity Web server to Extension Bridge — proxy routes + WS forwarding
This commit is contained in:
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user