Skip to content

Commit a3f5ec1

Browse files
Kerryturt2live
andauthored
reemit beacon events (#2245)
* reemit beacon events Signed-off-by: Kerry Archibald <[email protected]> * use specific imports Signed-off-by: Kerry Archibald <[email protected]> * Update src/models/room-state.ts Co-authored-by: Travis Ralston <[email protected]> Co-authored-by: Travis Ralston <[email protected]>
1 parent 5243222 commit a3f5ec1

File tree

4 files changed

+28
-7
lines changed

4 files changed

+28
-7
lines changed

spec/unit/room-state.spec.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import * as utils from "../test-utils/test-utils";
22
import { makeBeaconInfoEvent } from "../test-utils/beacon";
33
import { filterEmitCallsByEventType } from "../test-utils/emitter";
44
import { RoomState, RoomStateEvent } from "../../src/models/room-state";
5+
import { BeaconEvent } from "../../src/models/beacon";
56

67
describe("RoomState", function() {
78
const roomId = "!foo:bar";
@@ -251,13 +252,16 @@ describe("RoomState", function() {
251252
);
252253
});
253254

254-
it('adds new beacon info events to state', () => {
255+
it('adds new beacon info events to state and emits', () => {
255256
const beaconEvent = makeBeaconInfoEvent(userA, roomId);
257+
const emitSpy = jest.spyOn(state, 'emit');
256258

257259
state.setStateEvents([beaconEvent]);
258260

259261
expect(state.beacons.size).toEqual(1);
260-
expect(state.beacons.get(beaconEvent.getId())).toBeTruthy();
262+
const beaconInstance = state.beacons.get(beaconEvent.getId());
263+
expect(beaconInstance).toBeTruthy();
264+
expect(emitSpy).toHaveBeenCalledWith(BeaconEvent.New, beaconEvent, beaconInstance);
261265
});
262266

263267
it('updates existing beacon info events in state', () => {

src/models/beacon.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ export enum BeaconEvent {
2626
}
2727

2828
export type BeaconEventHandlerMap = {
29-
[BeaconEvent.New]: (event: MatrixEvent, beacon: Beacon) => void;
3029
[BeaconEvent.Update]: (event: MatrixEvent, beacon: Beacon) => void;
3130
[BeaconEvent.LivenessChange]: (isLive: boolean, beacon: Beacon) => void;
3231
};
@@ -42,7 +41,7 @@ export const isBeaconInfoEventType = (type: string) =>
4241
type.startsWith(M_BEACON_INFO.altName);
4342

4443
// https://github.com/matrix-org/matrix-spec-proposals/pull/3489
45-
export class Beacon extends TypedEventEmitter<BeaconEvent, BeaconEventHandlerMap> {
44+
export class Beacon extends TypedEventEmitter<Exclude<BeaconEvent, BeaconEvent.New>, BeaconEventHandlerMap> {
4645
public readonly roomId: string;
4746
private _beaconInfo: BeaconInfoState;
4847
private _isLive: boolean;
@@ -54,7 +53,6 @@ export class Beacon extends TypedEventEmitter<BeaconEvent, BeaconEventHandlerMap
5453
super();
5554
this.setBeaconInfo(this.rootEvent);
5655
this.roomId = this.rootEvent.getRoomId();
57-
this.emit(BeaconEvent.New, this.rootEvent, this);
5856
}
5957

6058
public get isLive(): boolean {

src/models/room-state.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ import { MatrixEvent } from "./event";
2626
import { MatrixClient } from "../client";
2727
import { GuestAccess, HistoryVisibility, IJoinRuleEventContent, JoinRule } from "../@types/partials";
2828
import { TypedEventEmitter } from "./typed-event-emitter";
29-
import { Beacon, BeaconEvent, isBeaconInfoEventType } from "./beacon";
29+
import { Beacon, BeaconEvent, isBeaconInfoEventType, BeaconEventHandlerMap } from "./beacon";
30+
import { TypedReEmitter } from "../ReEmitter";
3031

3132
// possible statuses for out-of-band member loading
3233
enum OobStatus {
@@ -49,9 +50,14 @@ export type RoomStateEventHandlerMap = {
4950
[RoomStateEvent.NewMember]: (event: MatrixEvent, state: RoomState, member: RoomMember) => void;
5051
[RoomStateEvent.Update]: (state: RoomState) => void;
5152
[RoomStateEvent.BeaconLiveness]: (state: RoomState, hasLiveBeacons: boolean) => void;
53+
[BeaconEvent.New]: (event: MatrixEvent, beacon: Beacon) => void;
5254
};
5355

54-
export class RoomState extends TypedEventEmitter<RoomStateEvent, RoomStateEventHandlerMap> {
56+
type EmittedEvents = RoomStateEvent | BeaconEvent;
57+
type EventHandlerMap = RoomStateEventHandlerMap & BeaconEventHandlerMap;
58+
59+
export class RoomState extends TypedEventEmitter<EmittedEvents, EventHandlerMap> {
60+
public readonly reEmitter = new TypedReEmitter<EmittedEvents, EventHandlerMap>(this);
5561
private sentinels: Record<string, RoomMember> = {}; // userId: RoomMember
5662
// stores fuzzy matches to a list of userIDs (applies utils.removeHiddenChars to keys)
5763
private displayNameToUserIds: Record<string, string[]> = {};
@@ -436,6 +442,14 @@ export class RoomState extends TypedEventEmitter<RoomStateEvent, RoomStateEventH
436442
}
437443

438444
const beacon = new Beacon(event);
445+
446+
this.reEmitter.reEmit<BeaconEvent, BeaconEvent>(beacon, [
447+
BeaconEvent.New,
448+
BeaconEvent.Update,
449+
BeaconEvent.LivenessChange,
450+
]);
451+
452+
this.emit(BeaconEvent.New, event, beacon);
439453
beacon.on(BeaconEvent.LivenessChange, this.onBeaconLivenessChange.bind(this));
440454
this.beacons.set(beacon.beaconInfoId, beacon);
441455
}

src/sync.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ import { EventType } from "./@types/event";
5555
import { IPushRules } from "./@types/PushRules";
5656
import { RoomStateEvent } from "./models/room-state";
5757
import { RoomMemberEvent } from "./models/room-member";
58+
import { BeaconEvent } from "./models/beacon";
5859

5960
const DEBUG = true;
6061

@@ -241,7 +242,11 @@ export class SyncApi {
241242
RoomStateEvent.Members,
242243
RoomStateEvent.NewMember,
243244
RoomStateEvent.Update,
245+
BeaconEvent.New,
246+
BeaconEvent.Update,
247+
BeaconEvent.LivenessChange,
244248
]);
249+
245250
room.currentState.on(RoomStateEvent.NewMember, function(event, state, member) {
246251
member.user = client.getUser(member.userId);
247252
client.reEmitter.reEmit(member, [

0 commit comments

Comments
 (0)