120 lines
2.9 KiB
JavaScript
120 lines
2.9 KiB
JavaScript
/**
|
|
* Session Manager — 다중 Antigravity CDP 세션을 관리
|
|
*/
|
|
|
|
const CDPClient = require('./cdp-client');
|
|
|
|
class SessionManager {
|
|
constructor() {
|
|
/** @type {Map<string, {id: string, name: string, host: string, cdpPort: number, client: CDPClient, status: string, title: string}>} */
|
|
this.sessions = new Map();
|
|
this.nextId = 1;
|
|
}
|
|
|
|
/**
|
|
* 새 세션 등록 + CDP 연결 시도
|
|
*/
|
|
async addSession(name, host = 'localhost', cdpPort = 9000) {
|
|
const id = `s${this.nextId++}`;
|
|
const client = new CDPClient(host, cdpPort);
|
|
|
|
const session = {
|
|
id,
|
|
name,
|
|
host,
|
|
cdpPort,
|
|
client,
|
|
status: 'connecting',
|
|
title: '',
|
|
createdAt: new Date().toISOString(),
|
|
};
|
|
|
|
this.sessions.set(id, session);
|
|
|
|
// CDP 연결 시도
|
|
const result = await client.connect();
|
|
if (result.success) {
|
|
session.status = 'connected';
|
|
session.title = result.title || '';
|
|
} else {
|
|
session.status = 'error';
|
|
session.error = result.error;
|
|
}
|
|
|
|
// 연결 끊김 시 상태 업데이트
|
|
client.onDisconnect = () => {
|
|
session.status = 'disconnected';
|
|
};
|
|
|
|
return session;
|
|
}
|
|
|
|
/**
|
|
* 세션 제거 + CDP 연결 해제
|
|
*/
|
|
async removeSession(id) {
|
|
const session = this.sessions.get(id);
|
|
if (!session) return false;
|
|
|
|
await session.client.disconnect();
|
|
this.sessions.delete(id);
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* 세션 조회
|
|
*/
|
|
getSession(id) {
|
|
return this.sessions.get(id) || null;
|
|
}
|
|
|
|
/**
|
|
* 전체 세션 목록 (클라이언트 전송용 직렬화)
|
|
*/
|
|
listSessions() {
|
|
return Array.from(this.sessions.values()).map(s => ({
|
|
id: s.id,
|
|
name: s.name,
|
|
host: s.host,
|
|
cdpPort: s.cdpPort,
|
|
status: s.status,
|
|
title: s.title,
|
|
createdAt: s.createdAt,
|
|
error: s.error || null,
|
|
}));
|
|
}
|
|
|
|
/**
|
|
* 세션 재연결
|
|
*/
|
|
async reconnectSession(id) {
|
|
const session = this.sessions.get(id);
|
|
if (!session) return { success: false, error: 'Session not found' };
|
|
|
|
await session.client.disconnect();
|
|
const result = await session.client.connect();
|
|
|
|
if (result.success) {
|
|
session.status = 'connected';
|
|
session.title = result.title || '';
|
|
session.error = null;
|
|
} else {
|
|
session.status = 'error';
|
|
session.error = result.error;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* 모든 세션 정리
|
|
*/
|
|
async cleanup() {
|
|
for (const [id] of this.sessions) {
|
|
await this.removeSession(id);
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = SessionManager;
|