vector-im-hydrogen-web/src/matrix/room/room.js

79 lines
2.7 KiB
JavaScript
Raw Normal View History

import EventEmitter from "../../EventEmitter.js";
2019-02-10 21:25:29 +01:00
import RoomSummary from "./summary.js";
import SyncWriter from "./timeline/persistence/SyncWriter.js";
import Timeline from "./timeline/Timeline.js";
import FragmentIdComparer from "./timeline/FragmentIdComparer.js";
import SendQueue from "./sending/SendQueue.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, hsApi, emitCollectionChange, sendScheduler, pendingEvents}) {
2019-02-20 23:48:16 +01:00
super();
this._roomId = roomId;
this._storage = storage;
this._hsApi = hsApi;
2019-02-10 21:25:29 +01:00
this._summary = new RoomSummary(roomId);
this._fragmentIdComparer = new FragmentIdComparer([]);
this._syncWriter = new SyncWriter({roomId, storage, fragmentIdComparer: this._fragmentIdComparer});
2019-02-20 23:48:16 +01:00
this._emitCollectionChange = emitCollectionChange;
this._sendQueue = new SendQueue({roomId, storage, sendScheduler, pendingEvents});
this._timeline = null;
2018-12-21 14:35:24 +01:00
}
async persistSync(roomResponse, membership, txn) {
const summaryChanged = this._summary.applySync(roomResponse, membership, txn);
const newTimelineEntries = await this._syncWriter.writeSync(roomResponse, txn);
let removedPendingEvents;
if (roomResponse.timeline && roomResponse.timeline.events) {
removedPendingEvents = this._sendQueue.removeRemoteEchos(roomResponse.timeline.events, txn);
}
return {summaryChanged, newTimelineEntries, removedPendingEvents};
}
emitSync({summaryChanged, newTimelineEntries, removedPendingEvents}) {
if (summaryChanged) {
2019-02-20 23:48:16 +01:00
this.emit("change");
this._emitCollectionChange(this);
2019-02-20 23:48:16 +01:00
}
if (this._timeline) {
this._timeline.appendLiveEntries(newTimelineEntries);
}
if (removedPendingEvents) {
this._sendQueue.emitRemovals(removedPendingEvents);
}
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._syncWriter.load(txn);
2018-12-21 14:35:24 +01:00
}
2019-02-26 22:45:58 +01:00
sendEvent(eventType, content) {
this._sendQueue.enqueueEvent(eventType, content);
}
2019-02-26 22:45:58 +01:00
get name() {
return this._summary.name;
}
get id() {
return this._roomId;
}
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,
hsApi: this._hsApi,
fragmentIdComparer: this._fragmentIdComparer,
pendingEvents: this._sendQueue.pendingEvents,
closeCallback: () => this._timeline = null,
});
await this._timeline.load();
return this._timeline;
}
2019-02-20 23:48:16 +01:00
}