You've already forked matrix-js-sdk
mirror of
https://github.com/matrix-org/matrix-js-sdk.git
synced 2025-11-28 05:03:59 +03:00
prototype how we could store ll members
This commit is contained in:
@@ -757,6 +757,20 @@ MatrixClient.prototype.getRoom = function(roomId) {
|
|||||||
return this.store.getRoom(roomId);
|
return this.store.getRoom(roomId);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
MatrixClient.prototype._loadMembers = async function(room) {
|
||||||
|
const roomId = room.roomId;
|
||||||
|
let rawMembersEvents = await this.store.getOutOfBandMembers(roomId);
|
||||||
|
if (rawMembersEvents.length == 0) {
|
||||||
|
const lastEventId = room.getLastEventId();
|
||||||
|
const response = await this.members(roomId, "join", "leave", lastEventId);
|
||||||
|
rawMembersEvents = response.chunk;
|
||||||
|
// TODO don't block on writing
|
||||||
|
await this.store.setOutOfBandMembers(roomId, rawMembersEvents);
|
||||||
|
}
|
||||||
|
const memberEvents = rawMembersEvents.map(this.getEventMapper());
|
||||||
|
return memberEvents;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Preloads the member list for the given room id,
|
* Preloads the member list for the given room id,
|
||||||
* in case lazy loading of memberships is in use.
|
* in case lazy loading of memberships is in use.
|
||||||
@@ -767,13 +781,8 @@ MatrixClient.prototype.loadRoomMembersIfNeeded = async function(roomId) {
|
|||||||
if (!room || !room.needsOutOfBandMembers()) {
|
if (!room || !room.needsOutOfBandMembers()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
const membersPromise = this._loadMembers(room);
|
||||||
const lastEventId = room.getLastEventId();
|
await room.loadOutOfBandMembers(membersPromise);
|
||||||
const responsePromise = this.members(roomId, "join", "leave", lastEventId);
|
|
||||||
const eventsPromise = responsePromise.then((response) => {
|
|
||||||
return response.chunk.map(this.getEventMapper());
|
|
||||||
});
|
|
||||||
await room.loadOutOfBandMembers(eventsPromise);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import Promise from 'bluebird';
|
|||||||
import SyncAccumulator from "../sync-accumulator";
|
import SyncAccumulator from "../sync-accumulator";
|
||||||
import utils from "../utils";
|
import utils from "../utils";
|
||||||
|
|
||||||
const VERSION = 1;
|
const VERSION = 2;
|
||||||
|
|
||||||
function createDatabase(db) {
|
function createDatabase(db) {
|
||||||
// Make user store, clobber based on user ID. (userId property of User objects)
|
// Make user store, clobber based on user ID. (userId property of User objects)
|
||||||
@@ -33,6 +33,11 @@ function createDatabase(db) {
|
|||||||
db.createObjectStore("sync", { keyPath: ["clobber"] });
|
db.createObjectStore("sync", { keyPath: ["clobber"] });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function upgradeSchemaV2(db) {
|
||||||
|
const llMembersStore = db.createObjectStore("lazy_loaded_members", { keyPath: ["roomId", "userId"]});
|
||||||
|
llMembersStore.createIndex("room", "roomId");
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper method to collect results from a Cursor and promiseify it.
|
* Helper method to collect results from a Cursor and promiseify it.
|
||||||
* @param {ObjectStore|Index} store The store to perform openCursor on.
|
* @param {ObjectStore|Index} store The store to perform openCursor on.
|
||||||
@@ -136,6 +141,9 @@ LocalIndexedDBStoreBackend.prototype = {
|
|||||||
if (oldVersion < 1) { // The database did not previously exist.
|
if (oldVersion < 1) { // The database did not previously exist.
|
||||||
createDatabase(db);
|
createDatabase(db);
|
||||||
}
|
}
|
||||||
|
if (oldVersion < 2) {
|
||||||
|
upgradeSchemaV2(db);
|
||||||
|
}
|
||||||
// Expand as needed.
|
// Expand as needed.
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -187,6 +195,56 @@ LocalIndexedDBStoreBackend.prototype = {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
getOutOfBandMembers: function(roomId) {
|
||||||
|
return new Promise((resolve, reject) =>{
|
||||||
|
const tx = this.db.transaction(["lazy_loaded_members"], "readonly");
|
||||||
|
const store = tx.objectStore("lazy_loaded_members");
|
||||||
|
const roomIndex = store.index("room");
|
||||||
|
const range = IDBKeyRange.only(roomId);
|
||||||
|
const request = roomIndex.openCursor(range);
|
||||||
|
|
||||||
|
const members = [];
|
||||||
|
request.onsuccess = (event) => {
|
||||||
|
const cursor = event.target.result;
|
||||||
|
if (!cursor) {
|
||||||
|
return resolve(members);
|
||||||
|
}
|
||||||
|
const record = cursor.value;
|
||||||
|
members.push({
|
||||||
|
userId: record.userId,
|
||||||
|
displayName: record.displayName,
|
||||||
|
membership: record.membership,
|
||||||
|
avatarUrl: record.avatarUrl,
|
||||||
|
});
|
||||||
|
cursor.continue();
|
||||||
|
};
|
||||||
|
request.onerror = (err) => {
|
||||||
|
reject(err);
|
||||||
|
};
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
setOutOfBandMembers: function(roomId, members) {
|
||||||
|
function ignoreResult() {};
|
||||||
|
// run everything in a promise so anything that throws will reject
|
||||||
|
return new Promise((resolve) =>{
|
||||||
|
const tx = this.db.transaction(["lazy_loaded_members"], "readwrite");
|
||||||
|
const store = tx.objectStore("lazy_loaded_members");
|
||||||
|
const puts = members.map((m) => {
|
||||||
|
const record = {
|
||||||
|
roomId: roomId,
|
||||||
|
userId: m.userId,
|
||||||
|
displayName: m.displayName,
|
||||||
|
avatarUrl: m.avatarUrl,
|
||||||
|
membership: m.membership
|
||||||
|
};
|
||||||
|
let putPromise = promiseifyRequest(store.put(record));
|
||||||
|
return putPromise.then(ignoreResult);
|
||||||
|
});
|
||||||
|
resolve(Promise.all(puts).then(ignoreResult));
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Clear the entire database. This should be used when logging out of a client
|
* Clear the entire database. This should be used when logging out of a client
|
||||||
* to prevent mixing data between accounts.
|
* to prevent mixing data between accounts.
|
||||||
|
|||||||
@@ -87,6 +87,13 @@ RemoteIndexedDBStoreBackend.prototype = {
|
|||||||
return this._doCmd('syncToDatabase', [users]);
|
return this._doCmd('syncToDatabase', [users]);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
getOutOfBandMembers: function(roomId) {
|
||||||
|
return this._doCmd('getOutOfBandMembers', [roomId]);
|
||||||
|
},
|
||||||
|
|
||||||
|
setOutOfBandMembers: function(roomId, members) {
|
||||||
|
return this._doCmd('setOutOfBandMembers', [roomId, members]);
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load all user presence events from the database. This is not cached.
|
* Load all user presence events from the database. This is not cached.
|
||||||
|
|||||||
@@ -92,6 +92,12 @@ class IndexedDBStoreWorker {
|
|||||||
case 'getNextBatchToken':
|
case 'getNextBatchToken':
|
||||||
prom = this.backend.getNextBatchToken();
|
prom = this.backend.getNextBatchToken();
|
||||||
break;
|
break;
|
||||||
|
case 'getOutOfBandMembers':
|
||||||
|
prom = this.backend.getOutOfBandMembers(msg.args[0]);
|
||||||
|
break;
|
||||||
|
case 'setOutOfBandMembers':
|
||||||
|
prom = this.backend.setOutOfBandMembers(msg.args[0], msg.args[1]);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (prom === undefined) {
|
if (prom === undefined) {
|
||||||
|
|||||||
@@ -219,4 +219,12 @@ IndexedDBStore.prototype.setSyncData = function(syncData) {
|
|||||||
return this.backend.setSyncData(syncData);
|
return this.backend.setSyncData(syncData);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
IndexedDBStore.prototype.getOutOfBandMembers = function(roomId) {
|
||||||
|
return this.backend.getOutOfBandMembers(roomId);
|
||||||
|
};
|
||||||
|
|
||||||
|
IndexedDBStore.prototype.setOutOfBandMembers = function(roomId, members) {
|
||||||
|
return this.backend.setOutOfBandMembers(roomId, members);
|
||||||
|
};
|
||||||
|
|
||||||
module.exports.IndexedDBStore = IndexedDBStore;
|
module.exports.IndexedDBStore = IndexedDBStore;
|
||||||
|
|||||||
Reference in New Issue
Block a user