2019-07-29 23:23:58 +05:30
|
|
|
import { SortedArray, MappedList, ConcatList } from "../../../observable/index.js";
|
2019-06-01 21:09:23 +05:30
|
|
|
import Direction from "./Direction.js";
|
2019-06-01 19:10:21 +05:30
|
|
|
import GapWriter from "./persistence/GapWriter.js";
|
2019-05-20 00:19:46 +05:30
|
|
|
import TimelineReader from "./persistence/TimelineReader.js";
|
2019-07-29 23:23:58 +05:30
|
|
|
import PendingEventEntry from "./entries/PendingEventEntry.js";
|
2019-02-28 03:20:08 +05:30
|
|
|
|
|
|
|
export default class Timeline {
|
2019-07-29 23:23:58 +05:30
|
|
|
constructor({roomId, storage, closeCallback, fragmentIdComparer, pendingEvents, user, hsApi}) {
|
2019-02-28 03:20:08 +05:30
|
|
|
this._roomId = roomId;
|
|
|
|
this._storage = storage;
|
|
|
|
this._closeCallback = closeCallback;
|
2019-05-12 23:56:03 +05:30
|
|
|
this._fragmentIdComparer = fragmentIdComparer;
|
2019-06-02 19:16:24 +05:30
|
|
|
this._hsApi = hsApi;
|
2019-07-29 23:23:58 +05:30
|
|
|
this._remoteEntries = new SortedArray((a, b) => a.compare(b));
|
2019-05-20 00:19:46 +05:30
|
|
|
this._timelineReader = new TimelineReader({
|
|
|
|
roomId: this._roomId,
|
|
|
|
storage: this._storage,
|
|
|
|
fragmentIdComparer: this._fragmentIdComparer
|
|
|
|
});
|
2019-07-29 23:23:58 +05:30
|
|
|
const localEntries = new MappedList(pendingEvents, pe => {
|
|
|
|
return new PendingEventEntry({pendingEvent: pe, user});
|
|
|
|
}, (pee, params) => {
|
|
|
|
pee.notifyUpdate(params);
|
|
|
|
});
|
|
|
|
this._allEntries = new ConcatList(this._remoteEntries, localEntries);
|
2019-02-28 03:20:08 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
/** @package */
|
|
|
|
async load() {
|
2019-06-16 20:59:33 +05:30
|
|
|
const entries = await this._timelineReader.readFromEnd(50);
|
2019-07-29 23:23:58 +05:30
|
|
|
this._remoteEntries.setManySorted(entries);
|
2019-02-28 03:20:08 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
/** @package */
|
|
|
|
appendLiveEntries(newEntries) {
|
2020-03-21 00:53:07 +05:30
|
|
|
try {
|
|
|
|
this._remoteEntries.setManySorted(newEntries);
|
|
|
|
} catch (err) {
|
|
|
|
console.error("error while appending live entries in roomId", this._roomId);
|
|
|
|
console.error(err.stack);
|
|
|
|
throw err;
|
|
|
|
}
|
2019-02-28 03:20:08 +05:30
|
|
|
}
|
|
|
|
|
2019-03-09 00:33:18 +05:30
|
|
|
/** @public */
|
2019-05-12 23:56:03 +05:30
|
|
|
async fillGap(fragmentEntry, amount) {
|
2019-03-09 05:11:06 +05:30
|
|
|
const response = await this._hsApi.messages(this._roomId, {
|
2019-05-12 23:56:03 +05:30
|
|
|
from: fragmentEntry.token,
|
|
|
|
dir: fragmentEntry.direction.asApiString(),
|
2019-10-12 23:54:09 +05:30
|
|
|
limit: amount,
|
|
|
|
filter: {lazy_load_members: true}
|
2019-06-02 19:16:24 +05:30
|
|
|
}).response();
|
2019-06-01 19:10:21 +05:30
|
|
|
const gapWriter = new GapWriter({
|
2019-05-12 23:56:03 +05:30
|
|
|
roomId: this._roomId,
|
|
|
|
storage: this._storage,
|
|
|
|
fragmentIdComparer: this._fragmentIdComparer
|
|
|
|
});
|
2019-06-02 19:16:24 +05:30
|
|
|
const newEntries = await gapWriter.writeFragmentFill(fragmentEntry, response);
|
2019-07-29 23:23:58 +05:30
|
|
|
this._remoteEntries.setManySorted(newEntries);
|
2019-03-09 05:11:06 +05:30
|
|
|
}
|
2019-03-09 00:33:18 +05:30
|
|
|
|
2019-06-01 21:09:23 +05:30
|
|
|
// tries to prepend `amount` entries to the `entries` list.
|
2019-03-09 05:11:06 +05:30
|
|
|
async loadAtTop(amount) {
|
2019-07-29 23:28:35 +05:30
|
|
|
const firstEventEntry = this._remoteEntries.array.find(e => !!e.eventType);
|
2019-06-16 20:59:33 +05:30
|
|
|
if (!firstEventEntry) {
|
2019-06-01 21:09:23 +05:30
|
|
|
return;
|
2019-03-09 05:11:06 +05:30
|
|
|
}
|
2019-06-02 18:45:26 +05:30
|
|
|
const entries = await this._timelineReader.readFrom(
|
2019-06-16 20:59:33 +05:30
|
|
|
firstEventEntry.asEventKey(),
|
2019-06-02 18:45:26 +05:30
|
|
|
Direction.Backward,
|
|
|
|
amount
|
|
|
|
);
|
2019-07-29 23:23:58 +05:30
|
|
|
this._remoteEntries.setManySorted(entries);
|
2019-03-09 00:33:18 +05:30
|
|
|
}
|
|
|
|
|
2019-02-28 03:20:08 +05:30
|
|
|
/** @public */
|
|
|
|
get entries() {
|
2019-07-29 23:23:58 +05:30
|
|
|
return this._allEntries;
|
2019-02-28 03:20:08 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
/** @public */
|
|
|
|
close() {
|
|
|
|
this._closeCallback();
|
|
|
|
}
|
|
|
|
}
|