Skip to content

Commit ac08e52

Browse files
authored
De-duplicate code and fix types (#2319)
1 parent 1bb8210 commit ac08e52

File tree

10 files changed

+52
-54
lines changed

10 files changed

+52
-54
lines changed

spec/unit/room.spec.ts

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1471,16 +1471,13 @@ describe("Room", function() {
14711471
isRoomEncrypted: function() {
14721472
return false;
14731473
},
1474-
http: {
1475-
serverResponse,
1476-
authedRequest: function() {
1477-
if (this.serverResponse instanceof Error) {
1478-
return Promise.reject(this.serverResponse);
1479-
} else {
1480-
return Promise.resolve({ chunk: this.serverResponse });
1481-
}
1482-
},
1483-
},
1474+
members: jest.fn().mockImplementation(() => {
1475+
if (serverResponse instanceof Error) {
1476+
return Promise.reject(serverResponse);
1477+
} else {
1478+
return Promise.resolve({ chunk: serverResponse });
1479+
}
1480+
}),
14841481
store: {
14851482
storageResponse,
14861483
storedMembers: null,
@@ -1547,7 +1544,7 @@ describe("Room", function() {
15471544
}
15481545
expect(hasThrown).toEqual(true);
15491546

1550-
client.http.serverResponse = [memberEvent];
1547+
client.members.mockReturnValue({ chunk: [memberEvent] });
15511548
await room.loadMembersIfNeeded();
15521549
const memberA = room.getMember("@user_a:bar");
15531550
expect(memberA.name).toEqual("User A");

src/client.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7277,12 +7277,12 @@ export class MatrixClient extends TypedEventEmitter<EmittedEvents, ClientEventHa
72777277
*/
72787278
public members(
72797279
roomId: string,
7280-
includeMembership?: string[],
7281-
excludeMembership?: string[],
7280+
includeMembership?: string,
7281+
excludeMembership?: string,
72827282
atEventId?: string,
72837283
callback?: Callback,
7284-
): Promise<{ [userId: string]: IStateEventWithRoomId }> {
7285-
const queryParams: any = {};
7284+
): Promise<{ [userId: string]: IStateEventWithRoomId[] }> {
7285+
const queryParams: Record<string, string> = {};
72867286
if (includeMembership) {
72877287
queryParams.membership = includeMembership;
72887288
}

src/models/room.ts

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ import {
4646
FILTER_RELATED_BY_SENDERS,
4747
ThreadFilterType,
4848
} from "./thread";
49-
import { Method } from "../http-api";
5049
import { TypedEventEmitter } from "./typed-event-emitter";
50+
import { IStateEventWithRoomId } from "../@types/search";
5151

5252
// These constants are used as sane defaults when the homeserver doesn't support
5353
// the m.room_versions capability. In practice, KNOWN_SAFE_ROOM_VERSION should be
@@ -788,16 +788,9 @@ export class Room extends TypedEventEmitter<EmittedEvents, RoomEventHandlerMap>
788788
}
789789
}
790790

791-
private async loadMembersFromServer(): Promise<IEvent[]> {
791+
private async loadMembersFromServer(): Promise<IStateEventWithRoomId[]> {
792792
const lastSyncToken = this.client.store.getSyncToken();
793-
const queryString = utils.encodeParams({
794-
not_membership: "leave",
795-
at: lastSyncToken,
796-
});
797-
const path = utils.encodeUri("/rooms/$roomId/members?" + queryString,
798-
{ $roomId: this.roomId });
799-
const http = this.client.http;
800-
const response = await http.authedRequest<{ chunk: IEvent[] }>(undefined, Method.Get, path);
793+
const response = await this.client.members(this.roomId, undefined, "leave", lastSyncToken);
801794
return response.chunk;
802795
}
803796

@@ -806,12 +799,13 @@ export class Room extends TypedEventEmitter<EmittedEvents, RoomEventHandlerMap>
806799
let fromServer = false;
807800
let rawMembersEvents = await this.client.store.getOutOfBandMembers(this.roomId);
808801
// If the room is encrypted, we always fetch members from the server at
809-
// least once, in case the latest state wasn't persisted properly. Note
802+
// least once, in case the latest state wasn't persisted properly. Note
810803
// that this function is only called once (unless loading the members
811804
// fails), since loadMembersIfNeeded always returns this.membersPromise
812805
// if set, which will be the result of the first (successful) call.
813806
if (rawMembersEvents === null ||
814-
(this.client.isCryptoEnabled() && this.client.isRoomEncrypted(this.roomId))) {
807+
(this.client.isCryptoEnabled() && this.client.isRoomEncrypted(this.roomId))
808+
) {
815809
fromServer = true;
816810
rawMembersEvents = await this.loadMembersFromServer();
817811
logger.log(`LL: got ${rawMembersEvents.length} ` +
@@ -857,7 +851,7 @@ export class Room extends TypedEventEmitter<EmittedEvents, RoomEventHandlerMap>
857851
if (fromServer) {
858852
const oobMembers = this.currentState.getMembers()
859853
.filter((m) => m.isOutOfBand())
860-
.map((m) => m.events.member.event as IEvent);
854+
.map((m) => m.events.member.event as IStateEventWithRoomId);
861855
logger.log(`LL: telling store to write ${oobMembers.length}`
862856
+ ` members for room ${this.roomId}`);
863857
const store = this.client.store;

src/store/index.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,12 @@ limitations under the License.
1717
import { EventType } from "../@types/event";
1818
import { Room } from "../models/room";
1919
import { User } from "../models/user";
20-
import { IEvent, MatrixEvent } from "../models/event";
20+
import { MatrixEvent } from "../models/event";
2121
import { Filter } from "../filter";
2222
import { RoomSummary } from "../models/room-summary";
2323
import { IMinimalEvent, IRooms, ISyncResponse } from "../sync-accumulator";
2424
import { IStartClientOpts } from "../client";
25+
import { IStateEventWithRoomId } from "../@types/search";
2526

2627
export interface ISavedSync {
2728
nextBatch: string;
@@ -204,9 +205,9 @@ export interface IStore {
204205
*/
205206
deleteAllData(): Promise<void>;
206207

207-
getOutOfBandMembers(roomId: string): Promise<IEvent[] | null>;
208+
getOutOfBandMembers(roomId: string): Promise<IStateEventWithRoomId[] | null>;
208209

209-
setOutOfBandMembers(roomId: string, membershipEvents: IEvent[]): Promise<void>;
210+
setOutOfBandMembers(roomId: string, membershipEvents: IStateEventWithRoomId[]): Promise<void>;
210211

211212
clearOutOfBandMembers(roomId: string): Promise<void>;
212213

src/store/indexeddb-backend.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 { ISavedSync } from "./index";
18-
import { IEvent, IStartClientOpts, ISyncResponse } from "..";
18+
import { IEvent, IStartClientOpts, IStateEventWithRoomId, ISyncResponse } from "..";
1919

2020
export interface IIndexedDBBackend {
2121
connect(): Promise<void>;
@@ -25,8 +25,8 @@ export interface IIndexedDBBackend {
2525
getSavedSync(): Promise<ISavedSync>;
2626
getNextBatchToken(): Promise<string>;
2727
clearDatabase(): Promise<void>;
28-
getOutOfBandMembers(roomId: string): Promise<IEvent[] | null>;
29-
setOutOfBandMembers(roomId: string, membershipEvents: IEvent[]): Promise<void>;
28+
getOutOfBandMembers(roomId: string): Promise<IStateEventWithRoomId[] | null>;
29+
setOutOfBandMembers(roomId: string, membershipEvents: IStateEventWithRoomId[]): Promise<void>;
3030
clearOutOfBandMembers(roomId: string): Promise<void>;
3131
getUserPresenceEvents(): Promise<UserTuple[]>;
3232
getClientOptions(): Promise<IStartClientOpts>;

src/store/indexeddb-local-backend.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import { IMinimalEvent, ISyncData, ISyncResponse, SyncAccumulator } from "../syn
1818
import * as utils from "../utils";
1919
import * as IndexedDBHelpers from "../indexeddb-helpers";
2020
import { logger } from '../logger';
21-
import { IEvent, IStartClientOpts } from "..";
21+
import { IStartClientOpts, IStateEventWithRoomId } from "..";
2222
import { ISavedSync } from "./index";
2323
import { IIndexedDBBackend, UserTuple } from "./indexeddb-backend";
2424

@@ -229,15 +229,15 @@ export class LocalIndexedDBStoreBackend implements IIndexedDBBackend {
229229
* @returns {Promise<event[]>} the events, potentially an empty array if OOB loading didn't yield any new members
230230
* @returns {null} in case the members for this room haven't been stored yet
231231
*/
232-
public getOutOfBandMembers(roomId: string): Promise<IEvent[] | null> {
233-
return new Promise<IEvent[] | null>((resolve, reject) => {
232+
public getOutOfBandMembers(roomId: string): Promise<IStateEventWithRoomId[] | null> {
233+
return new Promise<IStateEventWithRoomId[] | null>((resolve, reject) => {
234234
const tx = this.db.transaction(["oob_membership_events"], "readonly");
235235
const store = tx.objectStore("oob_membership_events");
236236
const roomIndex = store.index("room");
237237
const range = IDBKeyRange.only(roomId);
238238
const request = roomIndex.openCursor(range);
239239

240-
const membershipEvents: IEvent[] = [];
240+
const membershipEvents: IStateEventWithRoomId[] = [];
241241
// did we encounter the oob_written marker object
242242
// amongst the results? That means OOB member
243243
// loading already happened for this room
@@ -278,7 +278,7 @@ export class LocalIndexedDBStoreBackend implements IIndexedDBBackend {
278278
* @param {string} roomId
279279
* @param {event[]} membershipEvents the membership events to store
280280
*/
281-
public async setOutOfBandMembers(roomId: string, membershipEvents: IEvent[]): Promise<void> {
281+
public async setOutOfBandMembers(roomId: string, membershipEvents: IStateEventWithRoomId[]): Promise<void> {
282282
logger.log(`LL: backend about to store ${membershipEvents.length}` +
283283
` members for ${roomId}`);
284284
const tx = this.db.transaction(["oob_membership_events"], "readwrite");

src/store/indexeddb-remote-backend.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import { logger } from "../logger";
1818
import { defer, IDeferred } from "../utils";
1919
import { ISavedSync } from "./index";
2020
import { IStartClientOpts } from "../client";
21-
import { IEvent, ISyncResponse } from "..";
21+
import { IStateEventWithRoomId, ISyncResponse } from "..";
2222
import { IIndexedDBBackend, UserTuple } from "./indexeddb-backend";
2323

2424
export class RemoteIndexedDBStoreBackend implements IIndexedDBBackend {
@@ -97,7 +97,7 @@ export class RemoteIndexedDBStoreBackend implements IIndexedDBBackend {
9797
* @returns {event[]} the events, potentially an empty array if OOB loading didn't yield any new members
9898
* @returns {null} in case the members for this room haven't been stored yet
9999
*/
100-
public getOutOfBandMembers(roomId: string): Promise<IEvent[] | null> {
100+
public getOutOfBandMembers(roomId: string): Promise<IStateEventWithRoomId[] | null> {
101101
return this.doCmd('getOutOfBandMembers', [roomId]);
102102
}
103103

@@ -109,7 +109,7 @@ export class RemoteIndexedDBStoreBackend implements IIndexedDBBackend {
109109
* @param {event[]} membershipEvents the membership events to store
110110
* @returns {Promise} when all members have been stored
111111
*/
112-
public setOutOfBandMembers(roomId: string, membershipEvents: IEvent[]): Promise<void> {
112+
public setOutOfBandMembers(roomId: string, membershipEvents: IStateEventWithRoomId[]): Promise<void> {
113113
return this.doCmd('setOutOfBandMembers', [roomId, membershipEvents]);
114114
}
115115

src/store/indexeddb.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import { ISavedSync } from "./index";
2626
import { IIndexedDBBackend } from "./indexeddb-backend";
2727
import { ISyncResponse } from "../sync-accumulator";
2828
import { TypedEventEmitter } from "../models/typed-event-emitter";
29+
import { IStateEventWithRoomId } from "../@types/search";
2930

3031
/**
3132
* This is an internal module. See {@link IndexedDBStore} for the public class.
@@ -242,7 +243,7 @@ export class IndexedDBStore extends MemoryStore {
242243
* @returns {event[]} the events, potentially an empty array if OOB loading didn't yield any new members
243244
* @returns {null} in case the members for this room haven't been stored yet
244245
*/
245-
public getOutOfBandMembers = this.degradable((roomId: string): Promise<IEvent[]> => {
246+
public getOutOfBandMembers = this.degradable((roomId: string): Promise<IStateEventWithRoomId[]> => {
246247
return this.backend.getOutOfBandMembers(roomId);
247248
}, "getOutOfBandMembers");
248249

@@ -254,10 +255,13 @@ export class IndexedDBStore extends MemoryStore {
254255
* @param {event[]} membershipEvents the membership events to store
255256
* @returns {Promise} when all members have been stored
256257
*/
257-
public setOutOfBandMembers = this.degradable((roomId: string, membershipEvents: IEvent[]): Promise<void> => {
258-
super.setOutOfBandMembers(roomId, membershipEvents);
259-
return this.backend.setOutOfBandMembers(roomId, membershipEvents);
260-
}, "setOutOfBandMembers");
258+
public setOutOfBandMembers = this.degradable(
259+
(roomId: string, membershipEvents: IStateEventWithRoomId[]): Promise<void> => {
260+
super.setOutOfBandMembers(roomId, membershipEvents);
261+
return this.backend.setOutOfBandMembers(roomId, membershipEvents);
262+
},
263+
"setOutOfBandMembers",
264+
);
261265

262266
public clearOutOfBandMembers = this.degradable((roomId: string) => {
263267
super.clearOutOfBandMembers(roomId);

src/store/memory.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,14 @@ limitations under the License.
2222
import { EventType } from "../@types/event";
2323
import { Room } from "../models/room";
2424
import { User } from "../models/user";
25-
import { IEvent, MatrixEvent } from "../models/event";
25+
import { MatrixEvent } from "../models/event";
2626
import { RoomState, RoomStateEvent } from "../models/room-state";
2727
import { RoomMember } from "../models/room-member";
2828
import { Filter } from "../filter";
2929
import { ISavedSync, IStore } from "./index";
3030
import { RoomSummary } from "../models/room-summary";
3131
import { ISyncResponse } from "../sync-accumulator";
32+
import { IStateEventWithRoomId } from "../@types/search";
3233

3334
function isValidFilterId(filterId: string): boolean {
3435
const isValidStr = typeof filterId === "string" &&
@@ -60,7 +61,7 @@ export class MemoryStore implements IStore {
6061
private filters: Record<string, Record<string, Filter>> = {};
6162
public accountData: Record<string, MatrixEvent> = {}; // type : content
6263
private readonly localStorage: Storage;
63-
private oobMembers: Record<string, IEvent[]> = {}; // roomId: [member events]
64+
private oobMembers: Record<string, IStateEventWithRoomId[]> = {}; // roomId: [member events]
6465
private clientOptions = {};
6566

6667
constructor(opts: IOpts = {}) {
@@ -389,7 +390,7 @@ export class MemoryStore implements IStore {
389390
* @returns {event[]} the events, potentially an empty array if OOB loading didn't yield any new members
390391
* @returns {null} in case the members for this room haven't been stored yet
391392
*/
392-
public getOutOfBandMembers(roomId: string): Promise<IEvent[] | null> {
393+
public getOutOfBandMembers(roomId: string): Promise<IStateEventWithRoomId[] | null> {
393394
return Promise.resolve(this.oobMembers[roomId] || null);
394395
}
395396

@@ -401,7 +402,7 @@ export class MemoryStore implements IStore {
401402
* @param {event[]} membershipEvents the membership events to store
402403
* @returns {Promise} when all members have been stored
403404
*/
404-
public setOutOfBandMembers(roomId: string, membershipEvents: IEvent[]): Promise<void> {
405+
public setOutOfBandMembers(roomId: string, membershipEvents: IStateEventWithRoomId[]): Promise<void> {
405406
this.oobMembers[roomId] = membershipEvents;
406407
return Promise.resolve();
407408
}

src/store/stub.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,12 @@ limitations under the License.
2222
import { EventType } from "../@types/event";
2323
import { Room } from "../models/room";
2424
import { User } from "../models/user";
25-
import { IEvent, MatrixEvent } from "../models/event";
25+
import { MatrixEvent } from "../models/event";
2626
import { Filter } from "../filter";
2727
import { ISavedSync, IStore } from "./index";
2828
import { RoomSummary } from "../models/room-summary";
2929
import { ISyncResponse } from "../sync-accumulator";
30+
import { IStateEventWithRoomId } from "../@types/search";
3031

3132
/**
3233
* Construct a stub store. This does no-ops on most store methods.
@@ -242,11 +243,11 @@ export class StubStore implements IStore {
242243
return Promise.resolve();
243244
}
244245

245-
public getOutOfBandMembers(): Promise<IEvent[]> {
246+
public getOutOfBandMembers(): Promise<IStateEventWithRoomId[]> {
246247
return Promise.resolve(null);
247248
}
248249

249-
public setOutOfBandMembers(roomId: string, membershipEvents: IEvent[]): Promise<void> {
250+
public setOutOfBandMembers(roomId: string, membershipEvents: IStateEventWithRoomId[]): Promise<void> {
250251
return Promise.resolve();
251252
}
252253

0 commit comments

Comments
 (0)