diff --git a/src/models/base-model.ts b/src/models/base-model.ts deleted file mode 100644 index e18d85e9c..000000000 --- a/src/models/base-model.ts +++ /dev/null @@ -1,51 +0,0 @@ -/* -Copyright 2021 The Matrix.org Foundation C.I.C. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import { EventEmitter } from "events"; - -/** - * Typed Event Emitter class which can act as a Base Model for all our model - * and communication events. - * This makes it much easier for us to distinguish between events, as we now need - * to properly type this, so that our events are not stringly-based and prone - * to silly typos. - */ -export abstract class BaseModel extends EventEmitter { - public on(event: Events, listener: (...args: any[]) => void): this { - super.on(event, listener); - return this; - } - - public once(event: Events, listener: (...args: any[]) => void): this { - super.once(event, listener); - return this; - } - - public off(event: Events, listener: (...args: any[]) => void): this { - super.off(event, listener); - return this; - } - - public addListener(event: Events, listener: (...args: any[]) => void): this { - super.addListener(event, listener); - return this; - } - - public removeListener(event: Events, listener: (...args: any[]) => void): this { - super.removeListener(event, listener); - return this; - } -} diff --git a/src/models/thread.ts b/src/models/thread.ts index 2e9080c88..5167a6b79 100644 --- a/src/models/thread.ts +++ b/src/models/thread.ts @@ -19,7 +19,7 @@ import { MatrixEvent } from "./event"; import { EventTimeline } from "./event-timeline"; import { EventTimelineSet } from './event-timeline-set'; import { Room } from './room'; -import { BaseModel } from "./base-model"; +import { TypedEventEmitter } from "./typed-event-emitter"; export enum ThreadEvent { New = "Thread.new", @@ -30,7 +30,7 @@ export enum ThreadEvent { /** * @experimental */ -export class Thread extends BaseModel { +export class Thread extends TypedEventEmitter { /** * A reference to the event ID at the top of the thread */ diff --git a/src/models/typed-event-emitter.ts b/src/models/typed-event-emitter.ts new file mode 100644 index 000000000..5bbe750ba --- /dev/null +++ b/src/models/typed-event-emitter.ts @@ -0,0 +1,83 @@ +/* +Copyright 2021 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import { EventEmitter } from "events"; + +enum EventEmitterEvents { + NewListener = "newListener", + RemoveListener = "removeListener", +} + +/** + * Typed Event Emitter class which can act as a Base Model for all our model + * and communication events. + * This makes it much easier for us to distinguish between events, as we now need + * to properly type this, so that our events are not stringly-based and prone + * to silly typos. + */ +export abstract class TypedEventEmitter extends EventEmitter { + public addListener(event: Events | EventEmitterEvents, listener: (...args: any[]) => void): this { + return super.addListener(event, listener); + } + + public emit(event: Events | EventEmitterEvents, ...args: any[]): boolean { + return super.emit(event, ...args); + } + + public eventNames(): (Events | EventEmitterEvents)[] { + return super.eventNames() as Events[]; + } + + public listenerCount(event: Events | EventEmitterEvents): number { + return super.listenerCount(event); + } + + public listeners(event: Events | EventEmitterEvents): Function[] { + return super.listeners(event); + } + + public off(event: Events | EventEmitterEvents, listener: (...args: any[]) => void): this { + return super.off(event, listener); + } + + public on(event: Events | EventEmitterEvents, listener: (...args: any[]) => void): this { + return super.on(event, listener); + } + + public once(event: Events | EventEmitterEvents, listener: (...args: any[]) => void): this { + return super.once(event, listener); + } + + public prependListener(event: Events | EventEmitterEvents, listener: (...args: any[]) => void): this { + return super.prependListener(event, listener); + } + + public prependOnceListener(event: Events | EventEmitterEvents, listener: (...args: any[]) => void): this { + return super.prependOnceListener(event, listener); + } + + public removeAllListeners(event?: Events | EventEmitterEvents): this { + return super.removeAllListeners(event); + } + + public removeListener(event: Events | EventEmitterEvents, listener: (...args: any[]) => void): this { + return super.removeListener(event, listener); + } + + public rawListeners(event: Events | EventEmitterEvents): Function[] { + return super.rawListeners(event); + } +} diff --git a/src/store/local-storage-events-emitter.ts b/src/store/local-storage-events-emitter.ts index 009e7daf8..18f15b593 100644 --- a/src/store/local-storage-events-emitter.ts +++ b/src/store/local-storage-events-emitter.ts @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { BaseModel } from "../models/base-model"; +import { TypedEventEmitter } from "../models/typed-event-emitter"; export enum LocalStorageErrors { Global = 'Global', @@ -33,5 +33,5 @@ export enum LocalStorageErrors { * maybe you should check out your disk, as it's probably dying and your session may die with it. * See: https://github.com/vector-im/element-web/issues/18423 */ -class LocalStorageErrorsEventsEmitter extends BaseModel {} +class LocalStorageErrorsEventsEmitter extends TypedEventEmitter {} export const localStorageErrorsEventsEmitter = new LocalStorageErrorsEventsEmitter();