fix(forward): one forbidden target no longer fails the whole multi-room forward (#194 P6-3)
All targets were sent concurrently through matrix-js-sdk's message queue; when the send to a room you cannot post to failed with 403 the scheduler clearQueue()'d every send still waiting, so 'Send to 3 rooms' with one read-only room reported 'Failed to forward' for all three and left a half-sent comment in the first. Rooms are now sent one at a time. Verified: 'Forwarded to 2/3. Failed: Read Only Room.' and both good rooms receive comment + forwarded message. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PPmy3tPq869XDW4njjVaKA
This commit is contained in:
@@ -338,8 +338,12 @@ export function ForwardMessageDialog({ mEvent, onClose }: Props) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const commentBody = comment.trim();
|
const commentBody = comment.trim();
|
||||||
const results = await Promise.allSettled(
|
// Rooms are sent ONE AT A TIME. matrix-js-sdk queues message sends, and
|
||||||
ids.map((id) => {
|
// when one queued send fails permanently (e.g. 403 in a room you cannot
|
||||||
|
// post to) the scheduler rejects every send still waiting in the queue —
|
||||||
|
// so firing all rooms concurrently turned one forbidden target into
|
||||||
|
// "Failed to forward" for all of them, with half-sent comments (Gitea #194).
|
||||||
|
const sendToRoom = (id: string): Promise<unknown> => {
|
||||||
const destEncrypted = !!mx.getRoom(id)?.hasEncryptionStateEvent();
|
const destEncrypted = !!mx.getRoom(id)?.hasEncryptionStateEvent();
|
||||||
// Encrypted destinations keep the original (possibly encrypted-attachment)
|
// Encrypted destinations keep the original (possibly encrypted-attachment)
|
||||||
// content; unencrypted ones get the plaintext version, or fail outright if
|
// content; unencrypted ones get the plaintext version, or fail outright if
|
||||||
@@ -365,8 +369,12 @@ export function ForwardMessageDialog({ mEvent, onClose }: Props) {
|
|||||||
})
|
})
|
||||||
: Promise.resolve();
|
: Promise.resolve();
|
||||||
return step.then(sendForward);
|
return step.then(sendForward);
|
||||||
}),
|
};
|
||||||
);
|
const results: PromiseSettledResult<unknown>[] = [];
|
||||||
|
for (const id of ids) {
|
||||||
|
// eslint-disable-next-line no-await-in-loop
|
||||||
|
results.push(...(await Promise.allSettled([sendToRoom(id)])));
|
||||||
|
}
|
||||||
|
|
||||||
const failedIds: string[] = [];
|
const failedIds: string[] = [];
|
||||||
const failedNames: string[] = [];
|
const failedNames: string[] = [];
|
||||||
|
|||||||
Reference in New Issue
Block a user