Skip to content

Commit

Permalink
Fetch member data from from state event if needed
Browse files Browse the repository at this point in the history
Signed-off-by: RMidhunSuresh <rmidhunsuresh@gmail.com>
  • Loading branch information
MidhunSureshR committed Aug 2, 2021
1 parent 6cfb4cf commit 1cafac7
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 4 deletions.
12 changes: 9 additions & 3 deletions src/matrix/room/BaseRoom.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import {RelationWriter} from "./timeline/persistence/RelationWriter.js";
import {Timeline} from "./timeline/Timeline.js";
import {FragmentIdComparer} from "./timeline/FragmentIdComparer.js";
import {WrappedError} from "../error.js"
import {fetchOrLoadMembers, loadMember} from "./members/load.js";
import {fetchOrLoadMembers, fetchOrLoadMember} from "./members/load.js";
import {MemberList} from "./members/MemberList.js";
import {Heroes} from "./members/Heroes.js";
import {EventEntry} from "./timeline/entries/EventEntry.js";
Expand Down Expand Up @@ -224,8 +224,14 @@ export class BaseRoom extends EventEmitter {
// Hit, we're already observing this member
return mapMember;
}
// Miss, load from storage and set in map
const member = await loadMember({roomId: this._roomId, userId, storage: this._storage});
// Miss, load from storage/hs and set in map
const member = await fetchOrLoadMember({
summary: this._summary,
roomId: this._roomId,
userId,
storage: this._storage,
hsApi: this._hsApi
}, this._platform.logger);
if (!member) {
return false;
}
Expand Down
34 changes: 33 additions & 1 deletion src/matrix/room/members/load.js
Original file line number Diff line number Diff line change
Expand Up @@ -91,8 +91,40 @@ export async function fetchOrLoadMembers(options, logger) {
}
}

export async function loadMember({roomId, userId, storage}) {
export async function fetchOrLoadMember(options, logger) {
const member = await loadMember(options);
const {summary} = options;
if (!summary.data.hasFetchedMembers && !member) {
// We haven't fetched the memberlist yet; so ping the hs to see if this member does exist
return logger.wrapOrRun(options.log, "fetchMember", log => fetchMember(options, log));
}
return member;
}

async function loadMember({roomId, userId, storage}) {
const txn = await storage.readTxn([storage.storeNames.roomMembers,]);
const member = await txn.roomMembers.get(roomId, userId);
return member? new RoomMember(member) : undefined;
}

async function fetchMember({roomId, userId, hsApi, storage}, log) {
const memberData = await hsApi.state(roomId, "m.room.member", userId, {log}).response();
console.log(memberData);
const member = new RoomMember({
roomId,
userId,
membership: memberData.membership,
avatarUrl: memberData.avatar_url,
displayName: memberData.displayname,
});
const txn = await storage.readWriteTxn([storage.storeNames.roomMembers]);
try {
txn.roomMembers.set(member.serialize());
}
catch(e) {
txn.abort();
throw e;
}
await txn.complete();
return member;
}

0 comments on commit 1cafac7

Please sign in to comment.