| 33 | type AdvancedProfilerDataListener = (data: AdvancedProfilerDataPayload) => void; |
| 34 | |
| 35 | export class ProfilerService implements IProfilerService { |
| 36 | private ws: WebSocket | null = null; |
| 37 | private isServerRunning = false; |
| 38 | private wsPort: number; |
| 39 | private listeners: Set<ProfilerDataListener> = new Set(); |
| 40 | private advancedListeners: Set<AdvancedProfilerDataListener> = new Set(); |
| 41 | private currentData: ProfilerData | null = null; |
| 42 | private lastRawData: AdvancedProfilerDataPayload | null = null; |
| 43 | private checkServerInterval: NodeJS.Timeout | null = null; |
| 44 | private reconnectTimeout: NodeJS.Timeout | null = null; |
| 45 | private clientIdMap: Map<string, string> = new Map(); |
| 46 | private autoStart: boolean; |
| 47 | |
| 48 | constructor() { |
| 49 | const settings = SettingsService.getInstance(); |
| 50 | this.wsPort = settings.get('profiler.port', 8080); |
| 51 | this.autoStart = settings.get('profiler.autoStart', true); |
| 52 | |
| 53 | this.startServerCheck(); |
| 54 | this.listenToSettingsChanges(); |
| 55 | |
| 56 | // 如果设置了自动启动,则启动服务器 |
| 57 | if (this.autoStart) { |
| 58 | this.manualStartServer(); |
| 59 | } |
| 60 | } |
| 61 | |
| 62 | private listenToSettingsChanges(): void { |
| 63 | window.addEventListener('settings:changed', ((event: CustomEvent) => { |
| 64 | const newPort = event.detail['profiler.port']; |
| 65 | if (newPort !== undefined && Number(newPort) !== this.wsPort) { |
| 66 | console.log(`[ProfilerService] Port changed from ${this.wsPort} to ${newPort}`); |
| 67 | this.wsPort = Number(newPort); |
| 68 | this.reconnectWithNewPort(); |
| 69 | } |
| 70 | }) as EventListener); |
| 71 | } |
| 72 | |
| 73 | private async reconnectWithNewPort(): Promise<void> { |
| 74 | this.disconnect(); |
| 75 | |
| 76 | if (this.checkServerInterval) { |
| 77 | clearInterval(this.checkServerInterval); |
| 78 | this.checkServerInterval = null; |
| 79 | } |
| 80 | |
| 81 | try { |
| 82 | await invoke('stop_profiler_server'); |
| 83 | this.isServerRunning = false; |
| 84 | } catch (error) { |
| 85 | console.error('[ProfilerService] Failed to stop server:', error); |
| 86 | } |
| 87 | |
| 88 | this.startServerCheck(); |
| 89 | } |
| 90 | |
| 91 | public subscribe(listener: ProfilerDataListener): () => void { |
| 92 | this.listeners.add(listener); |
nothing calls this directly
no outgoing calls
no test coverage detected