clear all room state before rejoining room
This commit is contained in:
parent
15080edfa7
commit
00d8f81bdd
2 changed files with 14 additions and 2 deletions
|
@ -251,6 +251,9 @@ export class Room extends EventEmitter {
|
||||||
log.set("id", this.id);
|
log.set("id", this.id);
|
||||||
const isRejoin = summaryChanges.membership === "join" && this.membership !== "join";
|
const isRejoin = summaryChanges.membership === "join" && this.membership !== "join";
|
||||||
if (isRejoin) {
|
if (isRejoin) {
|
||||||
|
// remove all room state before calling syncWriter,
|
||||||
|
// so no old state sticks around
|
||||||
|
txn.roomState.removeAllForRoom(this.id);
|
||||||
this._summary.tryRemoveArchive(txn);
|
this._summary.tryRemoveArchive(txn);
|
||||||
}
|
}
|
||||||
const {entries: newEntries, newLiveKey, memberChanges} =
|
const {entries: newEntries, newLiveKey, memberChanges} =
|
||||||
|
|
|
@ -14,17 +14,19 @@ See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
const MAX_UNICODE = "\u{10FFFF}";
|
||||||
|
|
||||||
export class RoomStateStore {
|
export class RoomStateStore {
|
||||||
constructor(idbStore) {
|
constructor(idbStore) {
|
||||||
this._roomStateStore = idbStore;
|
this._roomStateStore = idbStore;
|
||||||
}
|
}
|
||||||
|
|
||||||
async getAllForType(type) {
|
async getAllForType(type) {
|
||||||
|
throw new Error("unimplemented");
|
||||||
}
|
}
|
||||||
|
|
||||||
async get(type, stateKey) {
|
async get(type, stateKey) {
|
||||||
|
throw new Error("unimplemented");
|
||||||
}
|
}
|
||||||
|
|
||||||
async set(roomId, event) {
|
async set(roomId, event) {
|
||||||
|
@ -32,4 +34,11 @@ export class RoomStateStore {
|
||||||
const entry = {roomId, event, key};
|
const entry = {roomId, event, key};
|
||||||
return this._roomStateStore.put(entry);
|
return this._roomStateStore.put(entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
removeAllForRoom(roomId) {
|
||||||
|
// exclude both keys as they are theoretical min and max,
|
||||||
|
// but we should't have a match for just the room id, or room id with max
|
||||||
|
const range = IDBKeyRange.bound(roomId, `${roomId}|${MAX_UNICODE}`, true, true);
|
||||||
|
this._roomStateStore.delete(range);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue