Stop re-attempting /joined_members on rooms we can't read
Reddit's homeserver returns 404 from /_matrix/client/v3/rooms/{id}/joined_members
for rooms we've left, been kicked from, or never fully joined — which is
roughly every chat that wasn't accepted by the recipient. The previous
enrichUsernames pass retried these on every delta sync, flooding the
dashboard log with debug-level 404s. Track failures in an in-memory
unresolvable set so each room is tried at most once per process.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
1 parent
ad5c63fc50
commit
1df7b680ee
1 file changed
+11
@@ -104,6 +104,8 @@ export class ChatService {
|
|||||||
private cache: ChatCache;
|
private cache: ChatCache;
|
||||||
private queue: Promise<unknown> = Promise.resolve();
|
private queue: Promise<unknown> = Promise.resolve();
|
||||||
private readonly t2ToUsername = new Map<string, string>();
|
private readonly t2ToUsername = new Map<string, string>();
|
||||||
|
/** Rooms whose /joined_members lookup has already failed — don't retry. */
|
||||||
|
private readonly unresolvableRooms = new Set<string>();
|
||||||
private syncingKind: 'full' | 'delta' | null = null;
|
private syncingKind: 'full' | 'delta' | null = null;
|
||||||
private progress: SyncProgress | null = null;
|
private progress: SyncProgress | null = null;
|
||||||
private progressListener: SyncProgressListener | null = null;
|
private progressListener: SyncProgressListener | null = null;
|
||||||
@@ -1006,6 +1008,7 @@ export class ChatService {
|
|||||||
const roomT2: Map<string, string> = new Map(); // roomId -> bare t2 id
|
const roomT2: Map<string, string> = new Map(); // roomId -> bare t2 id
|
||||||
for (const chat of this.cache.get()) {
|
for (const chat of this.cache.get()) {
|
||||||
if (!chat.roomId) continue;
|
if (!chat.roomId) continue;
|
||||||
|
if (this.unresolvableRooms.has(chat.roomId)) continue;
|
||||||
const needsLookup =
|
const needsLookup =
|
||||||
!chat.username ||
|
!chat.username ||
|
||||||
chat.username === 'unknown' ||
|
chat.username === 'unknown' ||
|
||||||
@@ -1023,8 +1026,16 @@ export class ChatService {
|
|||||||
if (!chat.roomName || chat.roomName === 'unknown' || chat.roomName.startsWith('@')) {
|
if (!chat.roomName || chat.roomName === 'unknown' || chat.roomName.startsWith('@')) {
|
||||||
chat.roomName = chat.username;
|
chat.roomName = chat.username;
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
// No t2-shaped member in the room (probably empty or only us
|
||||||
|
// after the other party left). Don't keep retrying every sync.
|
||||||
|
this.unresolvableRooms.add(chat.roomId);
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
// 404/403 means we can't read membership for this room (left, kicked,
|
||||||
|
// or never fully joined). Cache the failure so the next delta doesn't
|
||||||
|
// spam the homeserver — and the log — with the same lookup.
|
||||||
|
this.unresolvableRooms.add(chat.roomId);
|
||||||
this.logger.debug(`[chat] joined_members lookup failed for ${chat.roomId}:`, err);
|
this.logger.debug(`[chat] joined_members lookup failed for ${chat.roomId}:`, err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user