import { useEffect, useRef } from 'react'; type Subscription = (val: T) => void; export class EventEmitter { private subscriptions = new Set>(); emit = (val: T) => { for (const subscription of this.subscriptions) { subscription(val); } } useSubscription = (callback: Subscription) => { const callbackRef = useRef>(); callbackRef.current = callback; useEffect(() => { function subscription(val: T) { if (callbackRef.current) { callbackRef.current(val); } } this.subscriptions.add(subscription); return () => { this.subscriptions.delete(subscription); } }, []); } } export default function useEventEmitter() { const ref = useRef>(); if (!ref.current) { ref.current = new EventEmitter(); } return ref.current; }