File size: 1,440 Bytes
49f9107
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import { useEffect, useCallback } from 'react';

interface NeuralEvent {
  source: string;
  data: any;
  options?: { priority?: 'low' | 'medium' | 'high' | 'critical' };
}

type EventHandler = (event: NeuralEvent) => void;

class NeuralEventBus {
  private listeners: Map<string, EventHandler[]> = new Map();

  on(event: string, handler: EventHandler) {
    if (!this.listeners.has(event)) {
      this.listeners.set(event, []);
    }
    this.listeners.get(event)?.push(handler);
  }

  off(event: string, handler: EventHandler) {
    const handlers = this.listeners.get(event);
    if (handlers) {
      this.listeners.set(event, handlers.filter(h => h !== handler));
    }
  }

  emit(event: string, neuralEvent: NeuralEvent) {
    const handlers = this.listeners.get(event);
    if (handlers) {
      handlers.forEach(h => h(neuralEvent));
    }
  }
}

export const neuralEventBus = new NeuralEventBus();

export const emitNeuralEvent = (
  event: string,
  source: string,
  data: any,
  options?: { priority?: 'low' | 'medium' | 'high' | 'critical' }
) => {
  neuralEventBus.emit(event, { source, data, options });
};

export const useNeuralEvent = (event: string, handler: (event: NeuralEvent) => void) => {
  const stableHandler = useCallback(handler, []);

  useEffect(() => {
    neuralEventBus.on(event, stableHandler);
    return () => {
      neuralEventBus.off(event, stableHandler);
    };
  }, [event, stableHandler]);
};