64
services/mcpService.ts
Normal file
64
services/mcpService.ts
Normal file
@@ -0,0 +1,64 @@
|
||||
import { CalendarEvent } from '../types';
|
||||
|
||||
type EventCallback = (event: CalendarEvent) => void;
|
||||
|
||||
class MCPService {
|
||||
private eventSource: EventSource | null = null;
|
||||
private listeners: EventCallback[] = [];
|
||||
|
||||
connect(url: string) {
|
||||
if (this.eventSource) {
|
||||
this.eventSource.close();
|
||||
}
|
||||
|
||||
try {
|
||||
console.log(`Connecting to MCP Brain at ${url}...`);
|
||||
this.eventSource = new EventSource(url);
|
||||
|
||||
this.eventSource.onopen = () => {
|
||||
console.log('MCP Brain Connected!');
|
||||
};
|
||||
|
||||
this.eventSource.onmessage = (event) => {
|
||||
try {
|
||||
const data = JSON.parse(event.data);
|
||||
// Assuming the backend sends an event structure similar to ours
|
||||
// or wraps it in { type: 'new_event', payload: ... }
|
||||
if (data.id && data.title) {
|
||||
this.notify(data);
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('Failed to parse MCP message', e);
|
||||
}
|
||||
};
|
||||
|
||||
this.eventSource.onerror = (err) => {
|
||||
console.error('MCP Connection Error', err);
|
||||
// Optional: Implement retry logic here
|
||||
};
|
||||
|
||||
} catch (e) {
|
||||
console.error('Invalid URL for MCP', e);
|
||||
}
|
||||
}
|
||||
|
||||
disconnect() {
|
||||
if (this.eventSource) {
|
||||
this.eventSource.close();
|
||||
this.eventSource = null;
|
||||
}
|
||||
}
|
||||
|
||||
subscribe(callback: EventCallback) {
|
||||
this.listeners.push(callback);
|
||||
return () => {
|
||||
this.listeners = this.listeners.filter(l => l !== callback);
|
||||
};
|
||||
}
|
||||
|
||||
private notify(event: CalendarEvent) {
|
||||
this.listeners.forEach(cb => cb(event));
|
||||
}
|
||||
}
|
||||
|
||||
export const mcpService = new MCPService();
|
||||
Reference in New Issue
Block a user