feat(discovery): auto-detect Antigravity via CDP port scan + auto-create sessions
This commit is contained in:
@@ -10,6 +10,7 @@ const http = require('http');
|
||||
const path = require('path');
|
||||
const { WebSocketServer, WebSocket } = require('ws');
|
||||
const SessionManager = require('./session-manager');
|
||||
const { AutoDiscovery } = require('./auto-discover');
|
||||
|
||||
const PORT = process.env.PORT || 3300;
|
||||
const app = express();
|
||||
@@ -326,8 +327,78 @@ server.listen(PORT, () => {
|
||||
console.log(` Gravity Web 서버 시작`);
|
||||
console.log(` http://localhost:${PORT}`);
|
||||
console.log('═'.repeat(50));
|
||||
|
||||
// Auto Discovery 시작
|
||||
const discovery = new AutoDiscovery({
|
||||
host: 'localhost',
|
||||
intervalMs: 15000,
|
||||
onDiscovered: async (instance) => {
|
||||
// 이미 같은 포트의 세션이 있는지 확인
|
||||
const existing = sessionManager.listSessions().find(
|
||||
s => s.host === 'localhost' && s.cdpPort === instance.port
|
||||
);
|
||||
if (existing) return;
|
||||
|
||||
// 자동 세션 생성
|
||||
try {
|
||||
const session = await sessionManager.addSession(
|
||||
`Antigravity :${instance.port}`,
|
||||
'localhost',
|
||||
instance.port
|
||||
);
|
||||
|
||||
console.log(`[AutoDiscovery] 자동 세션 생성: ${session.name} (${session.id})`);
|
||||
|
||||
// 모든 WS 클라이언트에 세션 목록 업데이트
|
||||
broadcastToAll({
|
||||
type: 'sessions_list',
|
||||
sessions: sessionManager.listSessions(),
|
||||
});
|
||||
|
||||
// 자동 발견 알림
|
||||
broadcastToAll({
|
||||
type: 'auto_discovered',
|
||||
session: {
|
||||
id: session.id,
|
||||
name: session.name,
|
||||
host: 'localhost',
|
||||
port: instance.port,
|
||||
status: session.status,
|
||||
},
|
||||
});
|
||||
} catch (err) {
|
||||
console.error(`[AutoDiscovery] 세션 생성 실패:`, err.message);
|
||||
}
|
||||
},
|
||||
onLost: (port) => {
|
||||
// 해당 포트의 세션 상태 업데이트
|
||||
const sessions = sessionManager.listSessions();
|
||||
const lost = sessions.find(s => s.cdpPort === port && s.host === 'localhost');
|
||||
if (lost) {
|
||||
console.log(`[AutoDiscovery] 세션 소실: ${lost.name}`);
|
||||
broadcastToAll({
|
||||
type: 'session_lost',
|
||||
sessionId: lost.id,
|
||||
port,
|
||||
});
|
||||
}
|
||||
},
|
||||
});
|
||||
discovery.start();
|
||||
});
|
||||
|
||||
/**
|
||||
* 모든 WS 클라이언트에 메시지 브로드캐스트
|
||||
*/
|
||||
function broadcastToAll(data) {
|
||||
const json = JSON.stringify(data);
|
||||
for (const [ws] of wsClients) {
|
||||
if (ws.readyState === WebSocket.OPEN) {
|
||||
ws.send(json);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Graceful shutdown
|
||||
process.on('SIGINT', async () => {
|
||||
console.log('\n[Server] 종료 중...');
|
||||
|
||||
Reference in New Issue
Block a user