Skip to content

Commit

Permalink
Threads need to ask server for edits when using relations to fetch ev…
Browse files Browse the repository at this point in the history
…ents
  • Loading branch information
t3chguy committed Mar 23, 2022
1 parent 8fd3d24 commit fc73566
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 8 deletions.
6 changes: 2 additions & 4 deletions src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6620,10 +6620,8 @@ export class MatrixClient extends TypedEventEmitter<EmittedEvents, ClientEventHa
fetchedEventType,
opts);
const mapper = this.getEventMapper();
let originalEvent: MatrixEvent;
if (result.original_event) {
originalEvent = mapper(result.original_event);
}

const originalEvent = result.original_event ? mapper(result.original_event) : undefined;
let events = result.chunk.map(mapper);

if (fetchedEventType === EventType.RoomMessageEncrypted) {
Expand Down
29 changes: 25 additions & 4 deletions src/models/thread.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License.
*/

import { MatrixClient, RoomEvent } from "../matrix";
import { MatrixClient, RelationType, RoomEvent } from "../matrix";
import { TypedReEmitter } from "../ReEmitter";
import { IRelationsRequestOpts } from "../@types/requests";
import { IThreadBundledRelationship, MatrixEvent } from "./event";
Expand All @@ -24,6 +24,7 @@ import { Room } from './room';
import { TypedEventEmitter } from "./typed-event-emitter";
import { RoomState } from "./room-state";
import { ServerControlledNamespacedValue } from "../NamespacedValue";
import { logger } from "../logger";

export enum ThreadEvent {
New = "Thread.new",
Expand Down Expand Up @@ -164,10 +165,10 @@ export class Thread extends TypedEventEmitter<EmittedEvents, EventHandlerMap> {
this.addEventToTimeline(event, toStartOfTimeline);

await this.client.decryptEventIfNeeded(event, {});
}
} else {
await this.fetchEditsWhereNeeded(event);

if (Thread.hasServerSideSupport && this.initialEventsFetched) {
if (event.localTimestamp > this.lastReply().localTimestamp) {
if (this.initialEventsFetched && event.localTimestamp > this.lastReply().localTimestamp) {
this.addEventToTimeline(event, false);
}
}
Expand Down Expand Up @@ -218,9 +219,26 @@ export class Thread extends TypedEventEmitter<EmittedEvents, EventHandlerMap> {
this.setEventMetadata(event);
event.setThread(this);
this.lastEvent = event;

this.fetchEditsWhereNeeded(event);
}
}

// XXX: Workaround for https://github.com/matrix-org/matrix-spec-proposals/pull/2676/files#r827240084
private async fetchEditsWhereNeeded(...events: MatrixEvent[]): Promise<unknown> {
return Promise.all(events.filter(e => e.isEncrypted()).map((event: MatrixEvent) => {
return this.client.relations(this.roomId, event.getId(), RelationType.Replace, event.getType(), {
limit: 1,
}).then(relations => {
if (relations.events.length) {
event.makeReplaced(relations.events[0]);
}
}).catch(e => {
logger.error("Failed to load edits for encrypted thread event", e);
});
}));
}

public async fetchInitialEvents(): Promise<{
originalEvent: MatrixEvent;
events: MatrixEvent[];
Expand All @@ -231,6 +249,7 @@ export class Thread extends TypedEventEmitter<EmittedEvents, EventHandlerMap> {
this.initialEventsFetched = true;
return null;
}

try {
const response = await this.fetchEvents();
this.initialEventsFetched = true;
Expand Down Expand Up @@ -330,6 +349,8 @@ export class Thread extends TypedEventEmitter<EmittedEvents, EventHandlerMap> {
events = [...events, originalEvent];
}

await this.fetchEditsWhereNeeded(...events);

await Promise.all(events.map(event => {
this.setEventMetadata(event);
return this.client.decryptEventIfNeeded(event);
Expand Down

0 comments on commit fc73566

Please sign in to comment.