Skip to content

Commit a230981

Browse files
committed
make typescript-strict checker a bit happier
1 parent 21f777c commit a230981

File tree

6 files changed

+64
-51
lines changed

6 files changed

+64
-51
lines changed

src/client.ts

+15-12
Original file line numberDiff line numberDiff line change
@@ -5243,6 +5243,10 @@ export class MatrixClient extends TypedEventEmitter<EmittedEvents, ClientEventHa
52435243
throw new Error("could not get thread timeline: no client support");
52445244
}
52455245

5246+
if (!timelineSet.room) {
5247+
throw new Error("could not get thread timeline: not a room timeline");
5248+
}
5249+
52465250
if (!timelineSet.thread) {
52475251
throw new Error("could not get thread timeline: not a thread timeline");
52485252
}
@@ -5277,14 +5281,14 @@ export class MatrixClient extends TypedEventEmitter<EmittedEvents, ClientEventHa
52775281
}
52785282

52795283
const thread = timelineSet.thread;
5280-
const resOlder = await this.fetchRelations(
5284+
const resOlder: IRelationsResponse = await this.fetchRelations(
52815285
timelineSet.room.roomId,
52825286
thread.id,
52835287
THREAD_RELATION_TYPE.name,
52845288
null,
52855289
{ dir: Direction.Backward, from: res.start },
52865290
);
5287-
const resNewer = await this.fetchRelations(
5291+
const resNewer: IRelationsResponse = await this.fetchRelations(
52885292
timelineSet.room.roomId,
52895293
thread.id,
52905294
THREAD_RELATION_TYPE.name,
@@ -5339,10 +5343,10 @@ export class MatrixClient extends TypedEventEmitter<EmittedEvents, ClientEventHa
53395343
null,
53405344
{ dir: Direction.Backward, from: res.start },
53415345
);
5342-
const eventsNewer = [];
5346+
const eventsNewer: IEvent[] = [];
53435347
let nextBatch: Optional<string> = res.end;
53445348
while (nextBatch) {
5345-
const resNewer = await this.fetchRelations(
5349+
const resNewer: IRelationsResponse = await this.fetchRelations(
53465350
timelineSet.room.roomId,
53475351
thread.id,
53485352
THREAD_RELATION_TYPE.name,
@@ -5532,7 +5536,6 @@ export class MatrixClient extends TypedEventEmitter<EmittedEvents, ClientEventHa
55325536
// create a shallow copy of LAZY_LOADING_MESSAGES_FILTER,
55335537
// so the timelineFilter doesn't get written into it below
55345538
filter = {
5535-
...filter,
55365539
...Filter.LAZY_LOADING_MESSAGES_FILTER,
55375540
};
55385541
}
@@ -5579,7 +5582,7 @@ export class MatrixClient extends TypedEventEmitter<EmittedEvents, ClientEventHa
55795582
const isNotifTimeline = (eventTimeline.getTimelineSet() === this.notifTimelineSet);
55805583
const room = this.getRoom(eventTimeline.getRoomId());
55815584
const isThreadListTimeline = eventTimeline.getTimelineSet().isThreadTimeline;
5582-
const isThreadTimeline = (eventTimeline.getTimelineSet().thread);
5585+
const thread = eventTimeline.getTimelineSet().thread;
55835586

55845587
// TODO: we should implement a backoff (as per scrollback()) to deal more
55855588
// nicely with HTTP errors.
@@ -5690,18 +5693,18 @@ export class MatrixClient extends TypedEventEmitter<EmittedEvents, ClientEventHa
56905693
eventTimeline.paginationRequests[dir] = null;
56915694
});
56925695
eventTimeline.paginationRequests[dir] = promise;
5693-
} else if (isThreadTimeline) {
5696+
} else if (thread) {
56945697
const room = this.getRoom(eventTimeline.getRoomId());
56955698
if (!room) {
56965699
throw new Error("Unknown room " + eventTimeline.getRoomId());
56975700
}
56985701

56995702
promise = this.fetchRelations(
57005703
eventTimeline.getRoomId(),
5701-
eventTimeline.getTimelineSet().thread?.id,
5704+
thread.id,
57025705
THREAD_RELATION_TYPE.name,
57035706
null,
5704-
{ dir, limit: opts.limit, from: token },
5707+
{ dir, limit: opts.limit, from: token ?? undefined },
57055708
).then(async (res) => {
57065709
const mapper = this.getEventMapper();
57075710
const matrixEvents = res.chunk.map(mapper);
@@ -6933,12 +6936,12 @@ export class MatrixClient extends TypedEventEmitter<EmittedEvents, ClientEventHa
69336936
eventType?: EventType | string | null,
69346937
opts: IRelationsRequestOpts = { dir: Direction.Backward },
69356938
): Promise<{
6936-
originalEvent: MatrixEvent;
6939+
originalEvent: MatrixEvent | null;
69376940
events: MatrixEvent[];
69386941
nextBatch?: string;
69396942
prevBatch?: string;
69406943
}> {
6941-
const fetchedEventType = this.getEncryptedIfNeededEventType(roomId, eventType);
6944+
const fetchedEventType = eventType ? this.getEncryptedIfNeededEventType(roomId, eventType) : null;
69426945
const result = await this.fetchRelations(
69436946
roomId,
69446947
eventId,
@@ -6962,7 +6965,7 @@ export class MatrixClient extends TypedEventEmitter<EmittedEvents, ClientEventHa
69626965
events = events.filter(e => e.getSender() === originalEvent.getSender());
69636966
}
69646967
return {
6965-
originalEvent,
6968+
originalEvent: originalEvent ?? null,
69666969
events,
69676970
nextBatch: result.next_batch,
69686971
prevBatch: result.prev_batch,

src/models/event-timeline-set.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -297,8 +297,8 @@ export class EventTimelineSet extends TypedEventEmitter<EmittedEvents, EventTime
297297
* @return {?module:models/event-timeline~EventTimeline} timeline containing
298298
* the given event, or null if unknown
299299
*/
300-
public getTimelineForEvent(eventId: string | null): EventTimeline | null {
301-
if (eventId === null) { return null; }
300+
public getTimelineForEvent(eventId?: string): EventTimeline | null {
301+
if (eventId === null || eventId === undefined) { return null; }
302302
const res = this._eventIdToTimeline.get(eventId);
303303
return (res === undefined) ? null : res;
304304
}

src/models/event.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1543,7 +1543,7 @@ export class MatrixEvent extends TypedEventEmitter<MatrixEventEmittedEvents, Mat
15431543
/**
15441544
* @experimental
15451545
*/
1546-
public setThread(thread: Thread | null): void {
1546+
public setThread(thread?: Thread): void {
15471547
if (this.thread) {
15481548
this.reEmitter.stopReEmitting(this.thread, [ThreadEvent.Update]);
15491549
}
@@ -1561,7 +1561,7 @@ export class MatrixEvent extends TypedEventEmitter<MatrixEventEmittedEvents, Mat
15611561
return this.thread;
15621562
}
15631563

1564-
public setThreadId(threadId: string): void {
1564+
public setThreadId(threadId?: string): void {
15651565
this.threadId = threadId;
15661566
}
15671567
}

src/models/room.ts

+25-22
Original file line numberDiff line numberDiff line change
@@ -1828,9 +1828,7 @@ export class Room extends ReadReceipt<RoomEmittedEvents, RoomEventHandlerMap> {
18281828
}
18291829

18301830
private onThreadNewReply(thread: Thread): void {
1831-
if (thread.length && thread.rootEvent) {
1832-
this.updateThreadRootEvents(thread, false);
1833-
}
1831+
this.updateThreadRootEvents(thread, false);
18341832
}
18351833

18361834
private onThreadDelete(thread: Thread): void {
@@ -1957,9 +1955,11 @@ export class Room extends ReadReceipt<RoomEmittedEvents, RoomEventHandlerMap> {
19571955
}
19581956

19591957
private updateThreadRootEvents = (thread: Thread, toStartOfTimeline: boolean) => {
1960-
this.updateThreadRootEvent(this.threadsTimelineSets?.[0], thread, toStartOfTimeline);
1961-
if (thread.hasCurrentUserParticipated) {
1962-
this.updateThreadRootEvent(this.threadsTimelineSets?.[1], thread, toStartOfTimeline);
1958+
if (thread.length) {
1959+
this.updateThreadRootEvent(this.threadsTimelineSets?.[0], thread, toStartOfTimeline);
1960+
if (thread.hasCurrentUserParticipated) {
1961+
this.updateThreadRootEvent(this.threadsTimelineSets?.[1], thread, toStartOfTimeline);
1962+
}
19631963
}
19641964
};
19651965

@@ -1968,18 +1968,20 @@ export class Room extends ReadReceipt<RoomEmittedEvents, RoomEventHandlerMap> {
19681968
thread: Thread,
19691969
toStartOfTimeline: boolean,
19701970
) => {
1971-
if (Thread.hasServerSideSupport) {
1972-
timelineSet.addLiveEvent(thread.rootEvent, {
1973-
duplicateStrategy: DuplicateStrategy.Replace,
1974-
fromCache: false,
1975-
roomState: this.currentState,
1976-
});
1977-
} else {
1978-
timelineSet.addEventToTimeline(
1979-
thread.rootEvent,
1980-
timelineSet.getLiveTimeline(),
1981-
{ toStartOfTimeline },
1982-
);
1971+
if (timelineSet && thread.rootEvent) {
1972+
if (Thread.hasServerSideSupport) {
1973+
timelineSet.addLiveEvent(thread.rootEvent, {
1974+
duplicateStrategy: DuplicateStrategy.Replace,
1975+
fromCache: false,
1976+
roomState: this.currentState,
1977+
});
1978+
} else {
1979+
timelineSet.addEventToTimeline(
1980+
thread.rootEvent,
1981+
timelineSet.getLiveTimeline(),
1982+
{ toStartOfTimeline },
1983+
);
1984+
}
19831985
}
19841986
};
19851987

@@ -2020,15 +2022,16 @@ export class Room extends ReadReceipt<RoomEmittedEvents, RoomEventHandlerMap> {
20202022
RoomEvent.Timeline,
20212023
RoomEvent.TimelineReset,
20222024
]);
2025+
const isNewer = this.lastThread?.rootEvent
2026+
&& rootEvent?.localTimestamp
2027+
&& this.lastThread.rootEvent?.localTimestamp < rootEvent?.localTimestamp;
20232028

2024-
if (!this.lastThread || this.lastThread.rootEvent?.localTimestamp < rootEvent?.localTimestamp) {
2029+
if (!this.lastThread || isNewer) {
20252030
this.lastThread = thread;
20262031
}
20272032

20282033
if (this.threadsReady) {
2029-
if (thread.length && thread.rootEvent) {
2030-
this.updateThreadRootEvents(thread, toStartOfTimeline);
2031-
}
2034+
this.updateThreadRootEvents(thread, toStartOfTimeline);
20322035
}
20332036

20342037
this.emit(ThreadEvent.New, thread, toStartOfTimeline);

src/models/thread.ts

+13-11
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,9 @@ export class Thread extends ReadReceipt<EmittedEvents, EventHandlerMap> {
234234
public async addEvent(event: MatrixEvent, toStartOfTimeline: boolean, emit = true): Promise<void> {
235235
this.setEventMetadata(event);
236236

237+
const lastReply = this.lastReply();
238+
const isNewestReply = !lastReply || event.localTimestamp > lastReply?.localTimestamp;
239+
237240
// Add all incoming events to the thread's timeline set when there's no server support
238241
if (!Thread.hasServerSideSupport) {
239242
// all the relevant membership info to hydrate events with a sender
@@ -243,16 +246,13 @@ export class Thread extends ReadReceipt<EmittedEvents, EventHandlerMap> {
243246
this.addEventToTimeline(event, toStartOfTimeline);
244247

245248
this.client.decryptEventIfNeeded(event, {});
246-
} else if (!toStartOfTimeline &&
247-
this.initialEventsFetched &&
248-
event.localTimestamp > this.lastReply()?.localTimestamp
249-
) {
249+
} else if (!toStartOfTimeline && this.initialEventsFetched && isNewestReply) {
250250
await this.fetchEditsWhereNeeded(event);
251251
this.addEventToTimeline(event, false);
252252
} else if (event.isRelation(RelationType.Annotation) || event.isRelation(RelationType.Replace)) {
253253
// Apply annotations and replace relations to the relations of the timeline only
254-
this.timelineSet.relations.aggregateParentEvent(event);
255-
this.timelineSet.relations.aggregateChildEvent(event, this.timelineSet);
254+
this.timelineSet.relations?.aggregateParentEvent(event);
255+
this.timelineSet.relations?.aggregateChildEvent(event, this.timelineSet);
256256
return;
257257
}
258258

@@ -268,12 +268,14 @@ export class Thread extends ReadReceipt<EmittedEvents, EventHandlerMap> {
268268
}
269269
}
270270

271-
public async processEvent(event: MatrixEvent): Promise<void> {
272-
this.setEventMetadata(event);
273-
await this.fetchEditsWhereNeeded(event);
271+
public async processEvent(event: Optional<MatrixEvent>): Promise<void> {
272+
if (event) {
273+
this.setEventMetadata(event);
274+
await this.fetchEditsWhereNeeded(event);
275+
}
274276
}
275277

276-
private getRootEventBundledRelationship(rootEvent = this.rootEvent): IThreadBundledRelationship {
278+
private getRootEventBundledRelationship(rootEvent = this.rootEvent): IThreadBundledRelationship | undefined {
277279
return rootEvent?.getServerAggregatedRelation<IThreadBundledRelationship>(THREAD_RELATION_TYPE.name);
278280
}
279281

@@ -286,7 +288,7 @@ export class Thread extends ReadReceipt<EmittedEvents, EventHandlerMap> {
286288

287289
if (Thread.hasServerSideSupport && bundledRelationship) {
288290
this.replyCount = bundledRelationship.count;
289-
this._currentUserParticipated = bundledRelationship.current_user_participated;
291+
this._currentUserParticipated = bundledRelationship.current_user_participated ?? false;
290292

291293
const mapper = this.client.getEventMapper();
292294
this.lastEvent = mapper(bundledRelationship.latest_event);

src/utils.ts

+7-2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ limitations under the License.
2222

2323
import unhomoglyph from "unhomoglyph";
2424
import promiseRetry from "p-retry";
25+
import { Optional } from "matrix-events-sdk";
2526

2627
import type * as NodeCrypto from "crypto";
2728
import { MatrixEvent } from "./models/event";
@@ -123,13 +124,17 @@ export function decodeParams(query: string): Record<string, string | string[]> {
123124
* variables with. E.g. { "$bar": "baz" }.
124125
* @return {string} The result of replacing all template variables e.g. '/foo/baz'.
125126
*/
126-
export function encodeUri(pathTemplate: string, variables: Record<string, string>): string {
127+
export function encodeUri(pathTemplate: string, variables: Record<string, Optional<string>>): string {
127128
for (const key in variables) {
128129
if (!variables.hasOwnProperty(key)) {
129130
continue;
130131
}
132+
const value = variables[key];
133+
if (value === undefined || value === null) {
134+
continue;
135+
}
131136
pathTemplate = pathTemplate.replace(
132-
key, encodeURIComponent(variables[key]),
137+
key, encodeURIComponent(value),
133138
);
134139
}
135140
return pathTemplate;

0 commit comments

Comments
 (0)