import type { DefaultEventsMap, EventsMap, ReservedOrUserEventNames, ReservedOrUserListener, } from '@socket.io/component-emitter'; import type { Socket } from 'socket.io-client'; export function createEventEmitter< ListenEvents extends EventsMap = DefaultEventsMap, EmitEvents extends EventsMap = ListenEvents, ReservedEvents extends EventsMap = NonNullable, >(socket: Socket) { function on>( ev: Ev, listener: ReservedOrUserListener, ) { socket.on(ev, listener); return () => { socket.off(ev, listener); }; } function once>( ev: Ev, listener: ReservedOrUserListener, ) { socket.once(ev, listener); return () => { socket.off(ev, listener); }; } function off>( ev: Ev, listener: ReservedOrUserListener, ) { socket.off(ev, listener); } return { on, once, off }; }