2019-02-28 03:20:08 +05:30
|
|
|
import EventEmitter from "../../EventEmitter.js";
|
2019-02-11 01:55:29 +05:30
|
|
|
import RoomSummary from "./summary.js";
|
2019-06-01 19:10:21 +05:30
|
|
|
import SyncWriter from "./timeline/persistence/SyncWriter.js";
|
2019-05-12 23:56:03 +05:30
|
|
|
import Timeline from "./timeline/Timeline.js";
|
2019-05-12 23:54:06 +05:30
|
|
|
import FragmentIdComparer from "./timeline/FragmentIdComparer.js";
|
2019-07-27 02:03:33 +05:30
|
|
|
import SendQueue from "./sending/SendQueue.js";
|
2018-12-21 19:05:24 +05:30
|
|
|
|
2019-02-21 04:18:16 +05:30
|
|
|
export default class Room extends EventEmitter {
|
2019-07-29 13:53:15 +05:30
|
|
|
constructor({roomId, storage, hsApi, emitCollectionChange, sendScheduler, pendingEvents, user}) {
|
2019-02-21 04:18:16 +05:30
|
|
|
super();
|
2019-03-09 00:33:18 +05:30
|
|
|
this._roomId = roomId;
|
|
|
|
this._storage = storage;
|
|
|
|
this._hsApi = hsApi;
|
2019-02-11 01:55:29 +05:30
|
|
|
this._summary = new RoomSummary(roomId);
|
2019-05-12 23:54:06 +05:30
|
|
|
this._fragmentIdComparer = new FragmentIdComparer([]);
|
2020-01-05 00:34:57 +05:30
|
|
|
this._syncWriter = new SyncWriter({roomId, fragmentIdComparer: this._fragmentIdComparer});
|
2019-02-21 04:18:16 +05:30
|
|
|
this._emitCollectionChange = emitCollectionChange;
|
2019-07-27 02:03:33 +05:30
|
|
|
this._sendQueue = new SendQueue({roomId, storage, sendScheduler, pendingEvents});
|
2019-02-28 03:20:08 +05:30
|
|
|
this._timeline = null;
|
2019-07-29 13:53:15 +05:30
|
|
|
this._user = user;
|
2018-12-21 19:05:24 +05:30
|
|
|
}
|
|
|
|
|
2019-06-02 04:19:47 +05:30
|
|
|
async persistSync(roomResponse, membership, txn) {
|
2019-02-28 03:20:08 +05:30
|
|
|
const summaryChanged = this._summary.applySync(roomResponse, membership, txn);
|
2019-06-02 04:19:47 +05:30
|
|
|
const newTimelineEntries = await this._syncWriter.writeSync(roomResponse, txn);
|
2019-07-27 02:03:33 +05:30
|
|
|
let removedPendingEvents;
|
|
|
|
if (roomResponse.timeline && roomResponse.timeline.events) {
|
|
|
|
removedPendingEvents = this._sendQueue.removeRemoteEchos(roomResponse.timeline.events, txn);
|
|
|
|
}
|
|
|
|
return {summaryChanged, newTimelineEntries, removedPendingEvents};
|
2019-02-27 23:57:45 +05:30
|
|
|
}
|
|
|
|
|
2019-07-27 02:03:33 +05:30
|
|
|
emitSync({summaryChanged, newTimelineEntries, removedPendingEvents}) {
|
2019-02-28 03:20:08 +05:30
|
|
|
if (summaryChanged) {
|
2019-02-21 04:18:16 +05:30
|
|
|
this.emit("change");
|
2019-02-28 03:52:47 +05:30
|
|
|
this._emitCollectionChange(this);
|
2019-02-21 04:18:16 +05:30
|
|
|
}
|
2019-02-28 03:20:08 +05:30
|
|
|
if (this._timeline) {
|
|
|
|
this._timeline.appendLiveEntries(newTimelineEntries);
|
|
|
|
}
|
2019-07-27 02:03:33 +05:30
|
|
|
if (removedPendingEvents) {
|
|
|
|
this._sendQueue.emitRemovals(removedPendingEvents);
|
|
|
|
}
|
2018-12-21 19:05:24 +05:30
|
|
|
}
|
|
|
|
|
2019-07-27 02:10:39 +05:30
|
|
|
resumeSending() {
|
|
|
|
this._sendQueue.resumeSending();
|
|
|
|
}
|
|
|
|
|
2019-02-11 01:55:29 +05:30
|
|
|
load(summary, txn) {
|
|
|
|
this._summary.load(summary);
|
2019-06-01 19:10:21 +05:30
|
|
|
return this._syncWriter.load(txn);
|
2018-12-21 19:05:24 +05:30
|
|
|
}
|
2019-02-27 03:15:58 +05:30
|
|
|
|
2019-07-27 02:03:33 +05:30
|
|
|
sendEvent(eventType, content) {
|
|
|
|
this._sendQueue.enqueueEvent(eventType, content);
|
|
|
|
}
|
|
|
|
|
2019-02-27 03:15:58 +05:30
|
|
|
get name() {
|
|
|
|
return this._summary.name;
|
|
|
|
}
|
2019-02-27 03:57:06 +05:30
|
|
|
|
|
|
|
get id() {
|
|
|
|
return this._roomId;
|
|
|
|
}
|
2019-02-28 03:20:08 +05:30
|
|
|
|
|
|
|
async openTimeline() {
|
|
|
|
if (this._timeline) {
|
|
|
|
throw new Error("not dealing with load race here for now");
|
|
|
|
}
|
|
|
|
this._timeline = new Timeline({
|
|
|
|
roomId: this.id,
|
|
|
|
storage: this._storage,
|
2019-03-09 00:33:18 +05:30
|
|
|
hsApi: this._hsApi,
|
2019-05-12 23:56:03 +05:30
|
|
|
fragmentIdComparer: this._fragmentIdComparer,
|
2019-07-27 02:03:33 +05:30
|
|
|
pendingEvents: this._sendQueue.pendingEvents,
|
2019-02-28 03:20:08 +05:30
|
|
|
closeCallback: () => this._timeline = null,
|
2019-07-29 13:53:15 +05:30
|
|
|
user: this._user,
|
2019-02-28 03:20:08 +05:30
|
|
|
});
|
|
|
|
await this._timeline.load();
|
|
|
|
return this._timeline;
|
|
|
|
}
|
2019-02-21 04:18:16 +05:30
|
|
|
}
|
2019-02-28 03:20:08 +05:30
|
|
|
|