This repository has been archived on 2022-08-19. You can view files and clone it, but cannot push or open issues or pull requests.
hydrogen-web/src/room/persister.js

56 lines
1.5 KiB
JavaScript

import SortKey from "../storage/sortkey.js";
export default class RoomPersister {
constructor(roomId) {
this._roomId = roomId;
this._lastSortKey = new SortKey();
}
async load(txn) {
//fetch key here instead?
const [lastEvent] = await txn.roomTimeline.lastEvents(this._roomId, 1);
if (lastEvent) {
console.log("room persister load", this._roomId, lastEvent);
this._lastSortKey = new SortKey(lastEvent.sortKey);
}
}
// async persistGapFill(...) {
// }
async persistSync(roomResponse, txn) {
let nextKey = this._lastSortKey;
const timeline = roomResponse.timeline;
// is limited true for initial sync???? or do we need to handle that as a special case?
// I suppose it will, yes
if (timeline.limited) {
nextKey = nextKey.nextKeyWithGap();
txn.roomTimeline.appendGap(this._roomId, nextKey, {prev_batch: timeline.prev_batch});
}
// const startOfChunkSortKey = nextKey;
if (timeline.events) {
for(const event of timeline.events) {
nextKey = nextKey.nextKey();
txn.roomTimeline.appendEvent(this._roomId, nextKey, event);
}
}
// right thing to do? if the txn fails, not sure we'll continue anyways ...
// only advance the key once the transaction has
// succeeded
txn.complete().then(() => {
console.log("txn complete, setting key");
this._lastSortKey = nextKey;
});
// persist state
const state = roomResponse.state;
if (state.events) {
for (const event of state.events) {
txn.roomState.setStateEvent(this._roomId, event)
}
}
}
}