import { Emitter, TypedEvent, type TypedListenerOptions } from 'rettime' import { type AnyNetworkFrame, type ExtractFrameEvents, } from '../frames/network-frame' class NetworkFrameEvent< DataType = void, ReturnType = void, EventType extends string = string, > extends TypedEvent { public frame: AnyNetworkFrame constructor(type: string, frame: AnyNetworkFrame) { super(...([type, {}] as any)) this.frame = frame } } type NetworkSourceEventMap = { frame: NetworkFrameEvent } export type ExtractSourceEvents = Source extends NetworkSource ? ExtractFrameEvents : never export abstract class NetworkSource< Frame extends AnyNetworkFrame = AnyNetworkFrame, > { protected emitter: Emitter> constructor() { this.emitter = new Emitter() } public abstract enable(): unknown | Promise public async queue(frame: Frame): Promise { await this.emitter.emitAsPromise( // @ts-expect-error Trouble handling a conditional type parameter. new NetworkFrameEvent('frame', frame), ) } public on>( type: Type, listener: Emitter.Listener, options?: TypedListenerOptions, ): void { this.emitter.on(type, listener, options) } public disable(): void | Promise { this.emitter.removeAllListeners() } }