Skip to main content
Glama
by Coder-RL
network-manager.ts34.6 kB
import { EventEmitter } from 'events'; import * as crypto from 'crypto'; import { IncomingMessage, ServerResponse } from 'http'; export interface NetworkTopology { id: string; name: string; type: 'mesh' | 'hub-spoke' | 'ring' | 'tree' | 'hybrid'; regions: NetworkRegion[]; connections: NetworkConnection[]; policies: NetworkPolicy[]; redundancy: RedundancyConfig; monitoring: NetworkMonitoring; security: NetworkSecurity; created: Date; modified: Date; } export interface NetworkRegion { id: string; name: string; location: GeographicLocation; provider: CloudProvider; zones: AvailabilityZone[]; capacity: NetworkCapacity; latency: LatencyMap; status: 'active' | 'degraded' | 'offline' | 'maintenance'; lastUpdated: Date; } export interface GeographicLocation { continent: string; country: string; region: string; city: string; coordinates: { latitude: number; longitude: number; }; timezone: string; } export interface CloudProvider { name: string; type: 'aws' | 'azure' | 'gcp' | 'alibaba' | 'oracle' | 'on-premise' | 'hybrid'; credentials: any; endpoints: ServiceEndpoint[]; limits: ProviderLimits; } export interface ServiceEndpoint { service: string; url: string; region: string; authenticated: boolean; } export interface ProviderLimits { bandwidth: number; // Mbps instances: number; storage: number; // GB networks: number; loadBalancers: number; } export interface AvailabilityZone { id: string; name: string; region: string; datacenters: Datacenter[]; capacity: ZoneCapacity; status: 'available' | 'limited' | 'unavailable'; } export interface Datacenter { id: string; name: string; location: GeographicLocation; capacity: DatacenterCapacity; connectivity: ConnectivityInfo; power: PowerInfo; cooling: CoolingInfo; security: PhysicalSecurity; } export interface DatacenterCapacity { totalRacks: number; usedRacks: number; totalPower: number; // kW usedPower: number; // kW totalCooling: number; // BTU/hr usedCooling: number; // BTU/hr } export interface ConnectivityInfo { uplinks: NetworkUplink[]; internalBandwidth: number; // Gbps externalBandwidth: number; // Gbps carriers: string[]; peering: PeeringInfo[]; } export interface NetworkUplink { id: string; provider: string; capacity: number; // Mbps redundancy: boolean; latency: number; // ms status: 'active' | 'standby' | 'failed'; } export interface PeeringInfo { asn: number; name: string; type: 'public' | 'private'; locations: string[]; } export interface PowerInfo { totalCapacity: number; // kW currentUsage: number; // kW redundancy: 'N' | 'N+1' | '2N' | '2N+1'; efficiency: number; // PUE renewable: number; // percentage } export interface CoolingInfo { totalCapacity: number; // BTU/hr currentUsage: number; // BTU/hr type: 'air' | 'liquid' | 'hybrid'; efficiency: number; // percentage } export interface PhysicalSecurity { accessControl: boolean; biometrics: boolean; surveillance: boolean; guards: boolean; barriers: boolean; certification: string[]; } export interface NetworkCapacity { bandwidth: number; // Gbps throughput: number; // requests/second connections: number; storage: number; // GB compute: ComputeCapacity; } export interface ComputeCapacity { cpu: number; // cores memory: number; // GB gpu: number; // units fpga: number; // units } export interface ZoneCapacity { instances: number; volume: number; // GB snapshots: number; loadBalancers: number; addresses: number; } export interface LatencyMap { [regionId: string]: number; // milliseconds } export interface NetworkConnection { id: string; name: string; type: 'vpn' | 'direct-connect' | 'peering' | 'transit' | 'internet'; source: string; // region ID destination: string; // region ID bandwidth: number; // Mbps latency: number; // ms cost: number; // per Mbps per hour redundancy: boolean; encryption: boolean; qos: QoSConfig; status: 'active' | 'standby' | 'failed' | 'maintenance'; metrics: ConnectionMetrics; } export interface QoSConfig { enabled: boolean; classes: QoSClass[]; defaultClass: string; congestionControl: string; bufferSize: number; } export interface QoSClass { name: string; priority: number; bandwidth: number; // percentage latency: number; // ms jitter: number; // ms loss: number; // percentage applications: string[]; } export interface ConnectionMetrics { utilization: number; // percentage throughput: number; // Mbps latency: number; // ms jitter: number; // ms packetLoss: number; // percentage errors: number; retransmissions: number; lastUpdated: Date; } export interface NetworkPolicy { id: string; name: string; type: 'routing' | 'security' | 'qos' | 'access' | 'bandwidth'; rules: PolicyRule[]; scope: PolicyScope; priority: number; enabled: boolean; enforced: boolean; created: Date; modified: Date; } export interface PolicyRule { id: string; condition: PolicyCondition; action: PolicyAction; order: number; enabled: boolean; } export interface PolicyCondition { type: 'source' | 'destination' | 'protocol' | 'port' | 'application' | 'time' | 'user' | 'device'; operator: 'equals' | 'contains' | 'matches' | 'in-range' | 'greater-than' | 'less-than'; value: any; negated: boolean; } export interface PolicyAction { type: 'allow' | 'deny' | 'route' | 'redirect' | 'throttle' | 'prioritize' | 'log' | 'alert'; parameters: Record<string, any>; } export interface PolicyScope { regions: string[]; networks: string[]; applications: string[]; users: string[]; timeRange?: { start: string; end: string; timezone: string; }; } export interface RedundancyConfig { level: 'none' | 'basic' | 'full' | 'geo-redundant'; automaticFailover: boolean; failoverTime: number; // seconds healthCheckInterval: number; // seconds backupRegions: string[]; dataReplication: 'sync' | 'async' | 'multi-sync'; } export interface NetworkMonitoring { enabled: boolean; agents: MonitoringAgent[]; metrics: MonitoringMetric[]; alerts: AlertRule[]; dashboards: Dashboard[]; retention: number; // days } export interface MonitoringAgent { id: string; name: string; type: 'synthetic' | 'real-user' | 'infrastructure' | 'application'; location: string; targets: string[]; frequency: number; // seconds configuration: Record<string, any>; status: 'active' | 'inactive' | 'error'; } export interface MonitoringMetric { name: string; type: 'gauge' | 'counter' | 'histogram' | 'summary'; unit: string; description: string; tags: string[]; retention: number; // days } export interface AlertRule { id: string; name: string; metric: string; condition: string; threshold: number; duration: number; // seconds severity: 'low' | 'medium' | 'high' | 'critical'; channels: string[]; enabled: boolean; } export interface Dashboard { id: string; name: string; description: string; widgets: DashboardWidget[]; layout: string; shared: boolean; owner: string; } export interface DashboardWidget { id: string; type: 'chart' | 'table' | 'metric' | 'map' | 'text'; title: string; position: { x: number; y: number; width: number; height: number }; configuration: Record<string, any>; } export interface NetworkSecurity { firewall: FirewallConfig; ddosProtection: DDoSProtectionConfig; encryption: EncryptionConfig; authentication: AuthenticationConfig; monitoring: SecurityMonitoring; } export interface FirewallConfig { enabled: boolean; type: 'stateful' | 'stateless' | 'hybrid'; rules: FirewallRule[]; defaultAction: 'allow' | 'deny'; logging: boolean; } export interface FirewallRule { id: string; name: string; source: string; destination: string; protocol: string; port: string; action: 'allow' | 'deny' | 'redirect'; priority: number; enabled: boolean; } export interface DDoSProtectionConfig { enabled: boolean; type: 'cloud' | 'on-premise' | 'hybrid'; thresholds: DDoSThreshold[]; mitigation: DDoSMitigation[]; whitelist: string[]; blacklist: string[]; } export interface DDoSThreshold { metric: string; threshold: number; duration: number; // seconds action: string; } export interface DDoSMitigation { type: 'rate-limit' | 'block' | 'challenge' | 'redirect'; parameters: Record<string, any>; duration: number; // seconds } export interface EncryptionConfig { inTransit: { enabled: boolean; protocols: string[]; ciphers: string[]; keyExchange: string[]; }; atRest: { enabled: boolean; algorithm: string; keyManagement: string; rotation: number; // days }; } export interface AuthenticationConfig { enabled: boolean; methods: string[]; mfa: boolean; certificates: boolean; tokenLifetime: number; // seconds } export interface SecurityMonitoring { enabled: boolean; intrusion: boolean; anomaly: boolean; threat: boolean; compliance: boolean; reporting: boolean; } export interface TrafficFlow { id: string; source: NetworkNode; destination: NetworkNode; protocol: string; port: number; bandwidth: number; // Mbps latency: number; // ms path: string[]; qos: string; encrypted: boolean; startTime: Date; endTime?: Date; bytes: number; packets: number; status: 'active' | 'completed' | 'failed'; } export interface NetworkNode { id: string; type: 'server' | 'router' | 'switch' | 'firewall' | 'load-balancer' | 'gateway'; region: string; zone: string; address: string; interfaces: NetworkInterface[]; routes: Route[]; policies: string[]; } export interface NetworkInterface { name: string; type: 'ethernet' | 'wireless' | 'fiber' | 'virtual'; address: string; subnet: string; mtu: number; speed: number; // Mbps duplex: 'half' | 'full'; status: 'up' | 'down' | 'testing'; } export interface Route { destination: string; gateway: string; interface: string; metric: number; protocol: string; age: number; // seconds } export interface NetworkEvent { id: string; timestamp: Date; type: 'connection' | 'disconnection' | 'failure' | 'recovery' | 'maintenance' | 'attack'; severity: 'info' | 'warning' | 'error' | 'critical'; source: string; description: string; impact: string; resolution?: string; metadata: Record<string, any>; } export class NetworkManager extends EventEmitter { private topologies = new Map<string, NetworkTopology>(); private connections = new Map<string, NetworkConnection>(); private flows = new Map<string, TrafficFlow>(); private events: NetworkEvent[] = []; private monitoringInterval: NodeJS.Timeout | null = null; private healthCheckInterval: NodeJS.Timeout | null = null; private metricsCollection: NodeJS.Timeout | null = null; constructor() { super(); this.startMonitoring(); this.startHealthChecks(); this.startMetricsCollection(); } createTopology(config: Omit<NetworkTopology, 'id' | 'created' | 'modified'>): string { const topology: NetworkTopology = { id: crypto.randomUUID(), created: new Date(), modified: new Date(), ...config }; this.topologies.set(topology.id, topology); // Initialize connections for (const connection of topology.connections) { this.connections.set(connection.id, connection); } this.emit('topology-created', topology); return topology.id; } updateTopology(topologyId: string, updates: Partial<NetworkTopology>): boolean { const topology = this.topologies.get(topologyId); if (!topology) { return false; } Object.assign(topology, updates); topology.modified = new Date(); this.emit('topology-updated', topology); return true; } addConnection(connection: NetworkConnection): void { this.connections.set(connection.id, connection); // Add to topology if it exists for (const topology of this.topologies.values()) { if (topology.regions.some(r => r.id === connection.source) && topology.regions.some(r => r.id === connection.destination)) { topology.connections.push(connection); topology.modified = new Date(); break; } } this.emit('connection-added', connection); } removeConnection(connectionId: string): boolean { const connection = this.connections.get(connectionId); if (!connection) { return false; } this.connections.delete(connectionId); // Remove from topologies for (const topology of this.topologies.values()) { topology.connections = topology.connections.filter(c => c.id !== connectionId); topology.modified = new Date(); } this.emit('connection-removed', { connectionId }); return true; } async establishConnection(sourceRegion: string, destinationRegion: string, config: Partial<NetworkConnection> = {}): Promise<string> { const connectionId = crypto.randomUUID(); const connection: NetworkConnection = { id: connectionId, name: `${sourceRegion}-${destinationRegion}`, type: 'vpn', source: sourceRegion, destination: destinationRegion, bandwidth: 1000, // 1 Gbps default latency: 0, cost: 0.1, redundancy: false, encryption: true, qos: { enabled: false, classes: [], defaultClass: 'best-effort', congestionControl: 'cubic', bufferSize: 1024 }, status: 'active', metrics: { utilization: 0, throughput: 0, latency: 0, jitter: 0, packetLoss: 0, errors: 0, retransmissions: 0, lastUpdated: new Date() }, ...config }; // Measure initial latency connection.latency = await this.measureLatency(sourceRegion, destinationRegion); this.addConnection(connection); this.emit('connection-established', connection); return connectionId; } async measureLatency(sourceRegion: string, destinationRegion: string): Promise<number> { // Simulate latency measurement based on geographic distance const source = this.findRegion(sourceRegion); const destination = this.findRegion(destinationRegion); if (!source || !destination) { return 100; // Default latency } const distance = this.calculateDistance( source.location.coordinates, destination.location.coordinates ); // Approximate latency: ~1ms per 100km + base latency return Math.round(distance / 100 + 10); } private findRegion(regionId: string): NetworkRegion | null { for (const topology of this.topologies.values()) { const region = topology.regions.find(r => r.id === regionId); if (region) { return region; } } return null; } private calculateDistance(coord1: { latitude: number; longitude: number }, coord2: { latitude: number; longitude: number }): number { const R = 6371; // Earth's radius in kilometers const dLat = this.toRadians(coord2.latitude - coord1.latitude); const dLon = this.toRadians(coord2.longitude - coord1.longitude); const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(this.toRadians(coord1.latitude)) * Math.cos(this.toRadians(coord2.latitude)) * Math.sin(dLon / 2) * Math.sin(dLon / 2); const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); return R * c; } private toRadians(degrees: number): number { return degrees * (Math.PI / 180); } startTrafficFlow(source: NetworkNode, destination: NetworkNode, config: Partial<TrafficFlow> = {}): string { const flowId = crypto.randomUUID(); const flow: TrafficFlow = { id: flowId, source, destination, protocol: 'TCP', port: 80, bandwidth: 10, // Mbps latency: 0, path: [], qos: 'best-effort', encrypted: false, startTime: new Date(), bytes: 0, packets: 0, status: 'active', ...config }; // Calculate optimal path flow.path = this.calculateOptimalPath(source, destination); flow.latency = this.calculatePathLatency(flow.path); this.flows.set(flowId, flow); this.emit('traffic-flow-started', flow); return flowId; } private calculateOptimalPath(source: NetworkNode, destination: NetworkNode): string[] { // Simplified path calculation - would use proper routing algorithms const path = [source.id]; // Find intermediate nodes based on regions and connections const sourceRegion = source.region; const destinationRegion = destination.region; if (sourceRegion !== destinationRegion) { // Find connection between regions const connection = Array.from(this.connections.values()).find( c => (c.source === sourceRegion && c.destination === destinationRegion) || (c.source === destinationRegion && c.destination === sourceRegion) ); if (connection) { path.push(`connection:${connection.id}`); } } path.push(destination.id); return path; } private calculatePathLatency(path: string[]): number { let totalLatency = 0; for (const nodeId of path) { if (nodeId.startsWith('connection:')) { const connectionId = nodeId.substring(11); const connection = this.connections.get(connectionId); if (connection) { totalLatency += connection.latency; } } else { // Add node processing latency totalLatency += 1; // 1ms per hop } } return totalLatency; } stopTrafficFlow(flowId: string): boolean { const flow = this.flows.get(flowId); if (!flow) { return false; } flow.status = 'completed'; flow.endTime = new Date(); this.emit('traffic-flow-stopped', flow); return true; } applyNetworkPolicy(policy: NetworkPolicy): void { // Apply policy to relevant topologies for (const topology of this.topologies.values()) { if (policy.scope.regions.length === 0 || policy.scope.regions.some(regionId => topology.regions.some(r => r.id === regionId))) { topology.policies.push(policy); topology.modified = new Date(); } } this.emit('policy-applied', policy); } removeNetworkPolicy(policyId: string): boolean { let removed = false; for (const topology of this.topologies.values()) { const initialLength = topology.policies.length; topology.policies = topology.policies.filter(p => p.id !== policyId); if (topology.policies.length !== initialLength) { topology.modified = new Date(); removed = true; } } if (removed) { this.emit('policy-removed', { policyId }); } return removed; } async performFailover(sourceRegion: string, targetRegion: string): Promise<boolean> { const source = this.findRegion(sourceRegion); const target = this.findRegion(targetRegion); if (!source || !target) { return false; } try { // Mark source as degraded source.status = 'degraded'; // Redirect traffic to target const activeFlows = Array.from(this.flows.values()) .filter(f => f.status === 'active' && f.source.region === sourceRegion); for (const flow of activeFlows) { // Update flow destination region flow.destination.region = targetRegion; flow.path = this.calculateOptimalPath(flow.source, flow.destination); flow.latency = this.calculatePathLatency(flow.path); } // Log failover event this.logEvent({ type: 'failure', severity: 'warning', source: sourceRegion, description: `Failover from ${sourceRegion} to ${targetRegion}`, impact: `${activeFlows.length} traffic flows redirected`, metadata: { targetRegion, flowCount: activeFlows.length } }); this.emit('failover-completed', { sourceRegion, targetRegion, affectedFlows: activeFlows.length }); return true; } catch (error) { this.logEvent({ type: 'failure', severity: 'error', source: sourceRegion, description: `Failover failed: ${(error as Error).message}`, impact: 'Traffic may be disrupted', metadata: { error: (error as Error).message } }); return false; } } async performLoadBalancing(regionId: string, algorithm: 'round-robin' | 'least-connections' | 'weighted' | 'geographic' = 'round-robin'): Promise<void> { const region = this.findRegion(regionId); if (!region) { return; } const activeFlows = Array.from(this.flows.values()) .filter(f => f.status === 'active' && f.destination.region === regionId); switch (algorithm) { case 'round-robin': this.distributeRoundRobin(activeFlows, region); break; case 'least-connections': this.distributeLeastConnections(activeFlows, region); break; case 'weighted': this.distributeWeighted(activeFlows, region); break; case 'geographic': this.distributeGeographic(activeFlows, region); break; } this.emit('load-balancing-applied', { regionId, algorithm, affectedFlows: activeFlows.length }); } private distributeRoundRobin(flows: TrafficFlow[], region: NetworkRegion): void { const zones = region.zones.filter(z => z.status === 'available'); if (zones.length === 0) return; flows.forEach((flow, index) => { const targetZone = zones[index % zones.length]; flow.destination.zone = targetZone.id; }); } private distributeLeastConnections(flows: TrafficFlow[], region: NetworkRegion): void { const zones = region.zones.filter(z => z.status === 'available'); if (zones.length === 0) return; // Count current connections per zone const connectionCounts = new Map<string, number>(); zones.forEach(zone => connectionCounts.set(zone.id, 0)); flows.forEach(flow => { if (flow.destination.zone) { const current = connectionCounts.get(flow.destination.zone) || 0; connectionCounts.set(flow.destination.zone, current + 1); } }); // Redistribute to least loaded zones flows.forEach(flow => { const leastLoadedZone = zones.reduce((min, zone) => { const minCount = connectionCounts.get(min.id) || 0; const zoneCount = connectionCounts.get(zone.id) || 0; return zoneCount < minCount ? zone : min; }); flow.destination.zone = leastLoadedZone.id; const current = connectionCounts.get(leastLoadedZone.id) || 0; connectionCounts.set(leastLoadedZone.id, current + 1); }); } private distributeWeighted(flows: TrafficFlow[], region: NetworkRegion): void { const zones = region.zones.filter(z => z.status === 'available'); if (zones.length === 0) return; // Simple weight distribution based on capacity const totalCapacity = zones.reduce((sum, zone) => sum + zone.capacity.instances, 0); flows.forEach(flow => { let random = Math.random() * totalCapacity; for (const zone of zones) { random -= zone.capacity.instances; if (random <= 0) { flow.destination.zone = zone.id; break; } } }); } private distributeGeographic(flows: TrafficFlow[], region: NetworkRegion): void { const zones = region.zones.filter(z => z.status === 'available'); if (zones.length === 0) return; flows.forEach(flow => { // Find closest zone based on source location // This is a simplified implementation const closestZone = zones[0]; // Would calculate actual distance flow.destination.zone = closestZone.id; }); } private startMonitoring(): void { this.monitoringInterval = setInterval(async () => { await this.collectNetworkMetrics(); this.detectAnomalies(); }, 30000); // Every 30 seconds } private async collectNetworkMetrics(): Promise<void> { // Update connection metrics for (const connection of this.connections.values()) { await this.updateConnectionMetrics(connection); } // Update flow metrics for (const flow of this.flows.values()) { if (flow.status === 'active') { this.updateFlowMetrics(flow); } } this.emit('metrics-collected', { connections: this.connections.size, flows: this.flows.size, timestamp: new Date() }); } private async updateConnectionMetrics(connection: NetworkConnection): Promise<void> { // Simulate metric collection connection.metrics.utilization = Math.random() * 100; connection.metrics.throughput = connection.bandwidth * (connection.metrics.utilization / 100); connection.metrics.latency = connection.latency + (Math.random() * 10 - 5); // ±5ms jitter connection.metrics.jitter = Math.random() * 5; connection.metrics.packetLoss = Math.random() * 0.1; // Up to 0.1% connection.metrics.lastUpdated = new Date(); // Update connection status based on metrics if (connection.metrics.packetLoss > 1 || connection.metrics.latency > connection.latency * 2) { connection.status = 'degraded'; } else if (connection.status === 'degraded' && connection.metrics.packetLoss < 0.1 && connection.metrics.latency < connection.latency * 1.5) { connection.status = 'active'; } } private updateFlowMetrics(flow: TrafficFlow): void { // Simulate flow metrics const elapsed = (Date.now() - flow.startTime.getTime()) / 1000; // seconds const dataRate = flow.bandwidth * 1024 * 1024 / 8; // bytes per second flow.bytes += dataRate; flow.packets += Math.floor(dataRate / 1500); // Assuming 1500 byte packets } private detectAnomalies(): void { // Detect high latency for (const connection of this.connections.values()) { if (connection.metrics.latency > connection.latency * 3) { this.logEvent({ type: 'failure', severity: 'warning', source: connection.id, description: `High latency detected: ${connection.metrics.latency}ms`, impact: 'Degraded performance', metadata: { expectedLatency: connection.latency, actualLatency: connection.metrics.latency } }); } } // Detect high packet loss for (const connection of this.connections.values()) { if (connection.metrics.packetLoss > 1) { this.logEvent({ type: 'failure', severity: 'error', source: connection.id, description: `High packet loss detected: ${connection.metrics.packetLoss}%`, impact: 'Connection quality degraded', metadata: { packetLoss: connection.metrics.packetLoss } }); } } } private startHealthChecks(): void { this.healthCheckInterval = setInterval(async () => { await this.performHealthChecks(); }, 60000); // Every minute } private async performHealthChecks(): Promise<void> { for (const topology of this.topologies.values()) { for (const region of topology.regions) { await this.checkRegionHealth(region); } } } private async checkRegionHealth(region: NetworkRegion): Promise<void> { const previousStatus = region.status; // Simulate health check const healthScore = Math.random(); if (healthScore > 0.9) { region.status = 'active'; } else if (healthScore > 0.7) { region.status = 'degraded'; } else if (healthScore > 0.3) { region.status = 'offline'; } else { region.status = 'maintenance'; } region.lastUpdated = new Date(); if (previousStatus !== region.status) { this.logEvent({ type: region.status === 'active' ? 'recovery' : 'failure', severity: region.status === 'offline' ? 'critical' : 'warning', source: region.id, description: `Region status changed from ${previousStatus} to ${region.status}`, impact: region.status === 'offline' ? 'Service disruption' : 'Performance impact', metadata: { previousStatus, newStatus: region.status } }); this.emit('region-status-changed', { regionId: region.id, previousStatus, newStatus: region.status }); } } private startMetricsCollection(): void { this.metricsCollection = setInterval(() => { this.aggregateMetrics(); this.cleanupOldData(); }, 300000); // Every 5 minutes } private aggregateMetrics(): void { const metrics = { timestamp: new Date(), connections: { total: this.connections.size, active: Array.from(this.connections.values()).filter(c => c.status === 'active').length, degraded: Array.from(this.connections.values()).filter(c => c.status === 'degraded').length, failed: Array.from(this.connections.values()).filter(c => c.status === 'failed').length }, flows: { total: this.flows.size, active: Array.from(this.flows.values()).filter(f => f.status === 'active').length, completed: Array.from(this.flows.values()).filter(f => f.status === 'completed').length, failed: Array.from(this.flows.values()).filter(f => f.status === 'failed').length }, regions: { total: 0, active: 0, degraded: 0, offline: 0 }, performance: { averageLatency: 0, totalThroughput: 0, averageUtilization: 0 } }; // Calculate region metrics for (const topology of this.topologies.values()) { metrics.regions.total += topology.regions.length; for (const region of topology.regions) { switch (region.status) { case 'active': metrics.regions.active++; break; case 'degraded': metrics.regions.degraded++; break; case 'offline': metrics.regions.offline++; break; } } } // Calculate performance metrics const activeConnections = Array.from(this.connections.values()).filter(c => c.status === 'active'); if (activeConnections.length > 0) { metrics.performance.averageLatency = activeConnections.reduce((sum, c) => sum + c.metrics.latency, 0) / activeConnections.length; metrics.performance.totalThroughput = activeConnections.reduce((sum, c) => sum + c.metrics.throughput, 0); metrics.performance.averageUtilization = activeConnections.reduce((sum, c) => sum + c.metrics.utilization, 0) / activeConnections.length; } this.emit('metrics-aggregated', metrics); } private cleanupOldData(): void { const cutoffTime = Date.now() - 24 * 60 * 60 * 1000; // 24 hours // Clean up completed flows for (const [flowId, flow] of this.flows) { if (flow.status === 'completed' && flow.endTime && flow.endTime.getTime() < cutoffTime) { this.flows.delete(flowId); } } // Clean up old events this.events = this.events.filter(event => event.timestamp.getTime() > cutoffTime); } private logEvent(eventData: Omit<NetworkEvent, 'id' | 'timestamp'>): void { const event: NetworkEvent = { id: crypto.randomUUID(), timestamp: new Date(), ...eventData }; this.events.push(event); this.emit('network-event', event); } // Public API methods getTopologies(): NetworkTopology[] { return Array.from(this.topologies.values()); } getTopology(topologyId: string): NetworkTopology | null { return this.topologies.get(topologyId) || null; } getConnections(): NetworkConnection[] { return Array.from(this.connections.values()); } getConnection(connectionId: string): NetworkConnection | null { return this.connections.get(connectionId) || null; } getTrafficFlows(): TrafficFlow[] { return Array.from(this.flows.values()); } getTrafficFlow(flowId: string): TrafficFlow | null { return this.flows.get(flowId) || null; } getNetworkEvents(limit: number = 100): NetworkEvent[] { return this.events .sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime()) .slice(0, limit); } getNetworkHealth(): any { const connections = Array.from(this.connections.values()); const regions = Array.from(this.topologies.values()).flatMap(t => t.regions); return { overall: 'healthy', // Would calculate based on various factors connections: { total: connections.length, healthy: connections.filter(c => c.status === 'active').length, degraded: connections.filter(c => c.status === 'degraded').length, failed: connections.filter(c => c.status === 'failed').length }, regions: { total: regions.length, active: regions.filter(r => r.status === 'active').length, degraded: regions.filter(r => r.status === 'degraded').length, offline: regions.filter(r => r.status === 'offline').length }, performance: { averageLatency: connections.reduce((sum, c) => sum + c.metrics.latency, 0) / connections.length || 0, totalThroughput: connections.reduce((sum, c) => sum + c.metrics.throughput, 0), averageUtilization: connections.reduce((sum, c) => sum + c.metrics.utilization, 0) / connections.length || 0 } }; } getStats(): any { return { topologies: this.topologies.size, connections: this.connections.size, flows: this.flows.size, events: this.events.length, regions: Array.from(this.topologies.values()).reduce((sum, t) => sum + t.regions.length, 0), zones: Array.from(this.topologies.values()).reduce((sum, t) => sum + t.regions.reduce((regionSum, r) => regionSum + r.zones.length, 0), 0) }; } destroy(): void { if (this.monitoringInterval) { clearInterval(this.monitoringInterval); } if (this.healthCheckInterval) { clearInterval(this.healthCheckInterval); } if (this.metricsCollection) { clearInterval(this.metricsCollection); } this.topologies.clear(); this.connections.clear(); this.flows.clear(); this.events = []; this.removeAllListeners(); } }

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Coder-RL/Claude_MCPServer_Dev1'

If you have feedback or need assistance with the MCP directory API, please join our Discord server