Skip to content

Commit 12e525b

Browse files
authored
Improve typing around event emitter handlers (#2180)
1 parent 1ac4cc4 commit 12e525b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+906
-416
lines changed

.eslintrc.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ module.exports = {
3131
"no-async-promise-executor": "off",
3232
// We use a `logger` intermediary module
3333
"no-console": "error",
34+
35+
// restrict EventEmitters to force callers to use TypedEventEmitter
36+
"no-restricted-imports": ["error", "events"],
3437
},
3538
overrides: [{
3639
files: [

spec/integ/matrix-client-retrying.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { EventStatus } from "../../src/matrix";
1+
import { EventStatus, RoomEvent } from "../../src/matrix";
22
import { MatrixScheduler } from "../../src/scheduler";
33
import { Room } from "../../src/models/room";
44
import { TestClient } from "../TestClient";
@@ -95,7 +95,7 @@ describe("MatrixClient retrying", function() {
9595

9696
// wait for the localecho of ev1 to be updated
9797
const p3 = new Promise<void>((resolve, reject) => {
98-
room.on("Room.localEchoUpdated", (ev0) => {
98+
room.on(RoomEvent.LocalEchoUpdated, (ev0) => {
9999
if (ev0 === ev1) {
100100
resolve();
101101
}

spec/unit/ReEmitter.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ See the License for the specific language governing permissions and
1414
limitations under the License.
1515
*/
1616

17+
// eslint-disable-next-line no-restricted-imports
1718
import { EventEmitter } from "events";
1819

1920
import { ReEmitter } from "../../src/ReEmitter";

spec/unit/crypto.spec.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import '../olm-loader';
2+
// eslint-disable-next-line no-restricted-imports
23
import { EventEmitter } from "events";
34

45
import { Crypto } from "../../src/crypto";

spec/unit/crypto/crypto-utils.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ export async function resetCrossSigningKeys(client, {
2626
crypto.crossSigningInfo.keys = oldKeys;
2727
throw e;
2828
}
29-
crypto.baseApis.emit("crossSigning.keysChanged", {});
29+
crypto.emit("crossSigning.keysChanged", {});
3030
await crypto.afterCrossSigningLocalKeyChange();
3131
}
3232

spec/unit/crypto/verification/secret_request.spec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ See the License for the specific language governing permissions and
1414
limitations under the License.
1515
*/
1616

17-
import { VerificationBase } from '../../../../src/crypto/verification/Base';
1817
import { CrossSigningInfo } from '../../../../src/crypto/CrossSigning';
1918
import { encodeBase64 } from "../../../../src/crypto/olmlib";
2019
import { setupWebcrypto, teardownWebcrypto } from './util';
20+
import { VerificationBase } from '../../../../src/crypto/verification/Base';
2121

2222
jest.useFakeTimers();
2323

spec/unit/relations.spec.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ limitations under the License.
1515
*/
1616

1717
import { EventTimelineSet } from "../../src/models/event-timeline-set";
18-
import { MatrixEvent } from "../../src/models/event";
18+
import { MatrixEvent, MatrixEventEvent } from "../../src/models/event";
1919
import { Room } from "../../src/models/room";
2020
import { Relations } from "../../src/models/relations";
2121

@@ -103,7 +103,7 @@ describe("Relations", function() {
103103
// Add the target event first, then the relation event
104104
{
105105
const relationsCreated = new Promise(resolve => {
106-
targetEvent.once("Event.relationsCreated", resolve);
106+
targetEvent.once(MatrixEventEvent.RelationsCreated, resolve);
107107
});
108108

109109
const timelineSet = new EventTimelineSet(room, {
@@ -118,7 +118,7 @@ describe("Relations", function() {
118118
// Add the relation event first, then the target event
119119
{
120120
const relationsCreated = new Promise(resolve => {
121-
targetEvent.once("Event.relationsCreated", resolve);
121+
targetEvent.once(MatrixEventEvent.RelationsCreated, resolve);
122122
});
123123

124124
const timelineSet = new EventTimelineSet(room, {

src/ReEmitter.ts

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,15 @@ See the License for the specific language governing permissions and
1616
limitations under the License.
1717
*/
1818

19+
// eslint-disable-next-line no-restricted-imports
1920
import { EventEmitter } from "events";
2021

21-
export class ReEmitter {
22-
private target: EventEmitter;
22+
import { ListenerMap, TypedEventEmitter } from "./models/typed-event-emitter";
2323

24-
constructor(target: EventEmitter) {
25-
this.target = target;
26-
}
24+
export class ReEmitter {
25+
constructor(private readonly target: EventEmitter) {}
2726

28-
reEmit(source: EventEmitter, eventNames: string[]) {
27+
public reEmit(source: EventEmitter, eventNames: string[]): void {
2928
for (const eventName of eventNames) {
3029
// We include the source as the last argument for event handlers which may need it,
3130
// such as read receipt listeners on the client class which won't have the context
@@ -48,3 +47,19 @@ export class ReEmitter {
4847
}
4948
}
5049
}
50+
51+
export class TypedReEmitter<
52+
Events extends string,
53+
Arguments extends ListenerMap<Events>,
54+
> extends ReEmitter {
55+
constructor(target: TypedEventEmitter<Events, Arguments>) {
56+
super(target);
57+
}
58+
59+
public reEmit<ReEmittedEvents extends string, T extends Events & ReEmittedEvents>(
60+
source: TypedEventEmitter<ReEmittedEvents, any>,
61+
eventNames: T[],
62+
): void {
63+
super.reEmit(source, eventNames);
64+
}
65+
}

0 commit comments

Comments
 (0)