export type BuiltInEventType = 'open' | 'message' | 'error' | 'close'; export type EventType = E | BuiltInEventType; export interface MessageEvent { type: 'message'; data: string | null; lastEventId: string | null; url: string; } export interface OpenEvent { type: 'open'; } export interface CloseEvent { type: 'close'; } export interface TimeoutEvent { type: 'timeout'; } export interface ErrorEvent { type: 'error'; message: string; xhrState: number; xhrStatus: number; } export interface CustomEvent { type: E; data: string | null; lastEventId: string | null; url: string; } export interface ExceptionEvent { type: 'exception'; message: string; error: Error; } export interface EventSourceOptions { method?: string; timeout?: number; timeoutBeforeConnection?: number; withCredentials?: boolean; headers?: Record; body?: any; debug?: boolean; pollingInterval?: number; lineEndingCharacter?: string; } type BuiltInEventMap = { 'message': MessageEvent, 'open': OpenEvent, 'close': CloseEvent, 'error': ErrorEvent | TimeoutEvent | ExceptionEvent, }; export type EventSourceEvent = E extends BuiltInEventType ? BuiltInEventMap[E] : CustomEvent; export type EventSourceListener = EventType> = ( event: EventSourceEvent ) => void; declare class EventSource { constructor(url: URL | string, options?: EventSourceOptions); open(): void; close(): void; addEventListener>(type: T, listener: EventSourceListener): void; removeEventListener>(type: T, listener: EventSourceListener): void; removeAllEventListeners>(type?: T): void; dispatch>(type: T, data: EventSourceEvent): void; } export default EventSource;