2019-02-27 22:50:08 +01:00
|
|
|
import EventEmitter from "../../EventEmitter.js";
|
2019-02-10 21:25:29 +01:00
|
|
|
import RoomSummary from "./summary.js";
|
|
|
|
import RoomPersister from "./persister.js";
|
2019-02-27 22:50:08 +01:00
|
|
|
import Timeline from "./timeline.js";
|
2018-12-21 14:35:24 +01:00
|
|
|
|
2019-02-20 23:48:16 +01:00
|
|
|
export default class Room extends EventEmitter {
|
|
|
|
constructor(roomId, storage, emitCollectionChange) {
|
|
|
|
super();
|
2018-12-21 14:35:24 +01:00
|
|
|
this._roomId = roomId;
|
|
|
|
this._storage = storage;
|
2019-02-10 21:25:29 +01:00
|
|
|
this._summary = new RoomSummary(roomId);
|
|
|
|
this._persister = new RoomPersister(roomId);
|
2019-02-20 23:48:16 +01:00
|
|
|
this._emitCollectionChange = emitCollectionChange;
|
2019-02-27 22:50:08 +01:00
|
|
|
this._timeline = null;
|
2018-12-21 14:35:24 +01:00
|
|
|
}
|
|
|
|
|
2019-02-27 19:27:45 +01:00
|
|
|
persistSync(roomResponse, membership, txn) {
|
2019-02-27 22:50:08 +01:00
|
|
|
const summaryChanged = this._summary.applySync(roomResponse, membership, txn);
|
|
|
|
const newTimelineEntries = this._persister.persistSync(roomResponse, txn);
|
|
|
|
return {summaryChanged, newTimelineEntries};
|
2019-02-27 19:27:45 +01:00
|
|
|
}
|
|
|
|
|
2019-02-27 22:50:08 +01:00
|
|
|
emitSync({summaryChanged, newTimelineEntries}) {
|
|
|
|
if (summaryChanged) {
|
2019-02-20 23:48:16 +01:00
|
|
|
this.emit("change");
|
2019-02-24 19:25:06 +01:00
|
|
|
(this._emitCollectionChange)(this);
|
2019-02-20 23:48:16 +01:00
|
|
|
}
|
2019-02-27 22:50:08 +01:00
|
|
|
if (this._timeline) {
|
|
|
|
this._timeline.appendLiveEntries(newTimelineEntries);
|
|
|
|
}
|
2018-12-21 14:35:24 +01:00
|
|
|
}
|
|
|
|
|
2019-02-10 21:25:29 +01:00
|
|
|
load(summary, txn) {
|
|
|
|
this._summary.load(summary);
|
|
|
|
return this._persister.load(txn);
|
2018-12-21 14:35:24 +01:00
|
|
|
}
|
2019-02-26 22:45:58 +01:00
|
|
|
|
|
|
|
get name() {
|
|
|
|
return this._summary.name;
|
|
|
|
}
|
2019-02-26 23:27:06 +01:00
|
|
|
|
|
|
|
get id() {
|
|
|
|
return this._roomId;
|
|
|
|
}
|
2019-02-27 22:50:08 +01:00
|
|
|
|
|
|
|
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,
|
|
|
|
closeCallback: () => this._timeline = null,
|
|
|
|
});
|
|
|
|
await this._timeline.load();
|
|
|
|
return this._timeline;
|
|
|
|
}
|
2019-02-20 23:48:16 +01:00
|
|
|
}
|
2019-02-27 22:50:08 +01:00
|
|
|
|