1
0
mirror of https://github.com/matrix-org/matrix-js-sdk.git synced 2025-12-04 05:02:41 +03:00

Implement TypedEventEmitter for better TS support (#2018)

We're using stringly typed events everywhere, this is the first step for
better typescript support with our event emitters before we replace it
with something much better for React support.
This commit is contained in:
Dariusz Niemczyk
2021-11-15 15:47:21 +01:00
committed by GitHub
parent f41d815aa6
commit c3a266b3e7
2 changed files with 53 additions and 27 deletions

51
src/models/base-model.ts Normal file
View File

@@ -0,0 +1,51 @@
/*
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<Events extends string> 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;
}
}

View File

@@ -14,12 +14,12 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
import { EventEmitter } from "events";
import { MatrixClient } from "../matrix"; import { MatrixClient } from "../matrix";
import { MatrixEvent } from "./event"; import { MatrixEvent } from "./event";
import { EventTimeline } from "./event-timeline"; import { EventTimeline } from "./event-timeline";
import { EventTimelineSet } from './event-timeline-set'; import { EventTimelineSet } from './event-timeline-set';
import { Room } from './room'; import { Room } from './room';
import { BaseModel } from "./base-model";
export enum ThreadEvent { export enum ThreadEvent {
New = "Thread.new", New = "Thread.new",
@@ -30,7 +30,7 @@ export enum ThreadEvent {
/** /**
* @experimental * @experimental
*/ */
export class Thread extends EventEmitter { export class Thread extends BaseModel<ThreadEvent> {
/** /**
* A reference to the event ID at the top of the thread * A reference to the event ID at the top of the thread
*/ */
@@ -183,29 +183,4 @@ export class Thread extends EventEmitter {
public has(eventId: string): boolean { public has(eventId: string): boolean {
return this.timelineSet.findEventById(eventId) instanceof MatrixEvent; return this.timelineSet.findEventById(eventId) instanceof MatrixEvent;
} }
public on(event: ThreadEvent, listener: (...args: any[]) => void): this {
super.on(event, listener);
return this;
}
public once(event: ThreadEvent, listener: (...args: any[]) => void): this {
super.once(event, listener);
return this;
}
public off(event: ThreadEvent, listener: (...args: any[]) => void): this {
super.off(event, listener);
return this;
}
public addListener(event: ThreadEvent, listener: (...args: any[]) => void): this {
super.addListener(event, listener);
return this;
}
public removeListener(event: ThreadEvent, listener: (...args: any[]) => void): this {
super.removeListener(event, listener);
return this;
}
} }