From 75100c1c60ed89d52092039020a089388eece19e Mon Sep 17 00:00:00 2001 From: Bruno Windels Date: Sun, 12 May 2019 20:26:03 +0200 Subject: [PATCH] adjust Timeline to changes, gap persister --- src/matrix/room/room.js | 3 +- .../{timeline.js => timeline/Timeline.js} | 42 +++++++++---------- 2 files changed, 21 insertions(+), 24 deletions(-) rename src/matrix/room/{timeline.js => timeline/Timeline.js} (61%) diff --git a/src/matrix/room/room.js b/src/matrix/room/room.js index b2ad1312..c6e75e95 100644 --- a/src/matrix/room/room.js +++ b/src/matrix/room/room.js @@ -1,7 +1,7 @@ import EventEmitter from "../../EventEmitter.js"; import RoomSummary from "./summary.js"; -import Timeline from "./timeline.js"; import SyncPersister from "./timeline/persistence/SyncPersister.js"; +import Timeline from "./timeline/Timeline.js"; import FragmentIdComparer from "./timeline/FragmentIdComparer.js"; export default class Room extends EventEmitter { @@ -54,6 +54,7 @@ export default class Room extends EventEmitter { roomId: this.id, storage: this._storage, hsApi: this._hsApi, + fragmentIdComparer: this._fragmentIdComparer, closeCallback: () => this._timeline = null, }); await this._timeline.load(); diff --git a/src/matrix/room/timeline.js b/src/matrix/room/timeline/Timeline.js similarity index 61% rename from src/matrix/room/timeline.js rename to src/matrix/room/timeline/Timeline.js index b4b61fe4..fcadeadf 100644 --- a/src/matrix/room/timeline.js +++ b/src/matrix/room/timeline/Timeline.js @@ -1,17 +1,19 @@ -import { ObservableArray } from "../../observable/index.js"; -import sortedIndex from "../../utils/sortedIndex.js"; +import { ObservableArray } from "../../../observable/index.js"; +import sortedIndex from "../../../utils/sortedIndex.js"; +import GapPersister from "./persistence/GapPersister.js"; export default class Timeline { - constructor({roomId, storage, closeCallback}) { + constructor({roomId, storage, closeCallback, fragmentIdComparer}) { this._roomId = roomId; this._storage = storage; this._closeCallback = closeCallback; this._entriesList = new ObservableArray(); + this._fragmentIdComparer = fragmentIdComparer; } /** @package */ async load() { - const txn = await this._storage.readTxn([this._storage.storeNames.roomTimeline]); + const txn = await this._storage.readTxn([this._storage.storeNames.timelineEvents]); const entries = await txn.roomTimeline.lastEvents(this._roomId, 100); for (const entry of entries) { this._entriesList.append(entry); @@ -26,31 +28,25 @@ export default class Timeline { } /** @public */ - async fillGap(gapEntry, amount) { - const gap = gapEntry.gap; - let direction; - if (gap.prev_batch) { - direction = "b"; - } else if (gap.next_batch) { - direction = "f"; - } else { - throw new Error("Invalid gap, no prev_batch or next_batch field: " + JSON.stringify(gapEntry.gap)); - } - const token = gap.prev_batch || gap.next_batch; - + async fillGap(fragmentEntry, amount) { const response = await this._hsApi.messages(this._roomId, { - from: token, - dir: direction, + from: fragmentEntry.token, + dir: fragmentEntry.direction.asApiString(), limit: amount }); - const newEntries = await this._persister.persistGapFill(gapEntry, response); + const gapPersister = new GapPersister({ + roomId: this._roomId, + storage: this._storage, + fragmentIdComparer: this._fragmentIdComparer + }); + const newEntries = await gapPersister.persistFragmentFill(fragmentEntry, response); // find where to replace existing gap with newEntries by doing binary search - const gapIdx = sortedIndex(this._entriesList.array, gapEntry.sortKey, (key, entry) => { - return key.compare(entry.sortKey); + const gapIdx = sortedIndex(this._entriesList.array, fragmentEntry, (fragmentEntry, entry) => { + return fragmentEntry.compare(entry); }); // only replace the gap if it's currently in the timeline - if (this._entriesList.at(gapIdx) === gapEntry) { + if (this._entriesList.at(gapIdx) === fragmentEntry) { this._entriesList.removeAt(gapIdx); this._entriesList.insertMany(gapIdx, newEntries); } @@ -59,7 +55,7 @@ export default class Timeline { async loadAtTop(amount) { const firstEntry = this._entriesList.at(0); if (firstEntry) { - const txn = await this._storage.readTxn([this._storage.storeNames.roomTimeline]); + const txn = await this._storage.readTxn([this._storage.storeNames.timelineEvents]); const topEntries = await txn.roomTimeline.eventsBefore(this._roomId, firstEntry.sortKey, amount); this._entriesList.insertMany(0, topEntries); return topEntries.length;