You've already forked matrix-js-sdk
mirror of
https://github.com/matrix-org/matrix-js-sdk.git
synced 2025-08-07 23:02:56 +03:00
Handle M_MAX_DELAY_EXCEEDED errors (#4511)
* Handle M_MAX_DELAY_EXCEEDED errors Use a lower delay time if the server rejects a delay as too long. * Add test * Lint test * Update src/matrixrtc/MatrixRTCSession.ts Co-authored-by: Robin <robin@robin.town> * Test computed expiry timeout value --------- Co-authored-by: Robin <robin@robin.town>
This commit is contained in:
committed by
GitHub
parent
581b3209ab
commit
35d862ebd3
@@ -508,6 +508,19 @@ describe("MatrixRTCSession", () => {
|
|||||||
|
|
||||||
jest.useFakeTimers();
|
jest.useFakeTimers();
|
||||||
|
|
||||||
|
// preparing the delayed disconnect should handle the delay being too long
|
||||||
|
const sendDelayedStateExceedAttempt = new Promise<void>((resolve) => {
|
||||||
|
const error = new MatrixError({
|
||||||
|
"errcode": "M_UNKNOWN",
|
||||||
|
"org.matrix.msc4140.errcode": "M_MAX_DELAY_EXCEEDED",
|
||||||
|
"org.matrix.msc4140.max_delay": 7500,
|
||||||
|
});
|
||||||
|
sendDelayedStateMock.mockImplementationOnce(() => {
|
||||||
|
resolve();
|
||||||
|
return Promise.reject(error);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
// preparing the delayed disconnect should handle ratelimiting
|
// preparing the delayed disconnect should handle ratelimiting
|
||||||
const sendDelayedStateAttempt = new Promise<void>((resolve) => {
|
const sendDelayedStateAttempt = new Promise<void>((resolve) => {
|
||||||
const error = new MatrixError({ errcode: "M_LIMIT_EXCEEDED" });
|
const error = new MatrixError({ errcode: "M_LIMIT_EXCEEDED" });
|
||||||
@@ -541,7 +554,14 @@ describe("MatrixRTCSession", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
sess!.joinRoomSession([activeFocusConfig], activeFocus, { useLegacyMemberEvents: false });
|
sess!.joinRoomSession([activeFocusConfig], activeFocus, {
|
||||||
|
useLegacyMemberEvents: false,
|
||||||
|
membershipServerSideExpiryTimeout: 9000,
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(sess).toHaveProperty("membershipServerSideExpiryTimeout", 9000);
|
||||||
|
await sendDelayedStateExceedAttempt.then(); // needed to resolve after the send attempt catches
|
||||||
|
expect(sess).toHaveProperty("membershipServerSideExpiryTimeout", 7500);
|
||||||
|
|
||||||
await sendDelayedStateAttempt;
|
await sendDelayedStateAttempt;
|
||||||
jest.advanceTimersByTime(5000);
|
jest.advanceTimersByTime(5000);
|
||||||
|
@@ -184,8 +184,18 @@ export class MatrixRTCSession extends TypedEventEmitter<MatrixRTCSessionEvent, M
|
|||||||
return this.joinConfig?.useKeyDelay ?? 5_000;
|
return this.joinConfig?.useKeyDelay ?? 5_000;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the server disallows the configured {@link membershipServerSideExpiryTimeout},
|
||||||
|
* this stores a delay that the server does allow.
|
||||||
|
*/
|
||||||
|
private membershipServerSideExpiryTimeoutOverride?: number;
|
||||||
|
|
||||||
private get membershipServerSideExpiryTimeout(): number {
|
private get membershipServerSideExpiryTimeout(): number {
|
||||||
return this.joinConfig?.membershipServerSideExpiryTimeout ?? 8_000;
|
return (
|
||||||
|
this.membershipServerSideExpiryTimeoutOverride ??
|
||||||
|
this.joinConfig?.membershipServerSideExpiryTimeout ??
|
||||||
|
8_000
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private get membershipKeepAlivePeriod(): number {
|
private get membershipKeepAlivePeriod(): number {
|
||||||
@@ -1141,6 +1151,20 @@ export class MatrixRTCSession extends TypedEventEmitter<MatrixRTCSessionEvent, M
|
|||||||
);
|
);
|
||||||
this.disconnectDelayId = res.delay_id;
|
this.disconnectDelayId = res.delay_id;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
if (
|
||||||
|
e instanceof MatrixError &&
|
||||||
|
e.errcode === "M_UNKNOWN" &&
|
||||||
|
e.data["org.matrix.msc4140.errcode"] === "M_MAX_DELAY_EXCEEDED"
|
||||||
|
) {
|
||||||
|
const maxDelayAllowed = e.data["org.matrix.msc4140.max_delay"];
|
||||||
|
if (
|
||||||
|
typeof maxDelayAllowed === "number" &&
|
||||||
|
this.membershipServerSideExpiryTimeout > maxDelayAllowed
|
||||||
|
) {
|
||||||
|
this.membershipServerSideExpiryTimeoutOverride = maxDelayAllowed;
|
||||||
|
return prepareDelayedDisconnection();
|
||||||
|
}
|
||||||
|
}
|
||||||
logger.error("Failed to prepare delayed disconnection event:", e);
|
logger.error("Failed to prepare delayed disconnection event:", e);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user