| 401 | on(handler: SessionEventHandler): () => void; |
| 402 | |
| 403 | on<K extends SessionEventType>( |
| 404 | eventTypeOrHandler: K | SessionEventHandler, |
| 405 | handler?: TypedSessionEventHandler<K> |
| 406 | ): () => void { |
| 407 | // Overload 1: on(eventType, handler) - typed event subscription |
| 408 | if (typeof eventTypeOrHandler === "string" && handler) { |
| 409 | const eventType = eventTypeOrHandler; |
| 410 | if (!this.typedEventHandlers.has(eventType)) { |
| 411 | this.typedEventHandlers.set(eventType, new Set()); |
| 412 | } |
| 413 | // Cast is safe: handler receives the correctly typed event at dispatch time |
| 414 | const storedHandler = handler as (event: SessionEvent) => void; |
| 415 | this.typedEventHandlers.get(eventType)!.add(storedHandler); |
| 416 | return () => { |
| 417 | const handlers = this.typedEventHandlers.get(eventType); |
| 418 | if (handlers) { |
| 419 | handlers.delete(storedHandler); |
| 420 | } |
| 421 | }; |
| 422 | } |
| 423 | |
| 424 | // Overload 2: on(handler) - wildcard subscription |
| 425 | const wildcardHandler = eventTypeOrHandler as SessionEventHandler; |
| 426 | this.eventHandlers.add(wildcardHandler); |
| 427 | return () => { |
| 428 | this.eventHandlers.delete(wildcardHandler); |
| 429 | }; |
| 430 | } |
| 431 | |
| 432 | /** |
| 433 | * Dispatches an event to all registered handlers. |