/*! * Copyright (c) Microsoft Corporation and contributors. All rights reserved. * Licensed under the MIT License. */ import { EventEmitter } from "events"; import { IEvent, TransformedEvent, IEventTransformer, IEventProvider, } from "@fluidframework/common-definitions"; /** * The event emitter polyfill and the node event emitter have different event types: * string | symbol vs. string | number * * This type allow us to correctly handle either type * * @deprecated Moved to the `@fluidframework-internal/client-utils` package. * @internal */ export type EventEmitterEventType = EventEmitter extends { on(event: infer E, listener: any) } ? E : never; /** * @deprecated Moved to the `@fluidframework-internal/client-utils` package. * @internal */ export type TypedEventTransform = // Event emitter supports some special events for the emitter itself to use // this exposes those events for the TypedEventEmitter. // Since we know what the shape of these events are, we can describe them directly via a TransformedEvent // which easier than trying to extend TEvent directly TransformedEvent< TThis, "newListener" | "removeListener", Parameters<(event: string, listener: (...args: any[]) => void) => void> > & // Expose all the events provides by TEvent IEventTransformer & // Add the default overload so this is covertable to EventEmitter regardless of environment TransformedEvent; /** * Event Emitter helper class the supports emitting typed events * * @deprecated Moved to the `@fluidframework-internal/client-utils` package. * @internal */ export class TypedEventEmitter extends EventEmitter implements IEventProvider { constructor() { super(); this.addListener = super.addListener.bind(this) as TypedEventTransform; this.on = super.on.bind(this) as TypedEventTransform; this.once = super.once.bind(this) as TypedEventTransform; this.prependListener = super.prependListener.bind(this) as TypedEventTransform< this, TEvent >; this.prependOnceListener = super.prependOnceListener.bind(this) as TypedEventTransform< this, TEvent >; this.removeListener = super.removeListener.bind(this) as TypedEventTransform; this.off = super.off.bind(this) as TypedEventTransform; } readonly addListener: TypedEventTransform; readonly on: TypedEventTransform; readonly once: TypedEventTransform; readonly prependListener: TypedEventTransform; readonly prependOnceListener: TypedEventTransform; readonly removeListener: TypedEventTransform; readonly off: TypedEventTransform; }