You've already forked matrix-react-sdk
mirror of
https://github.com/matrix-org/matrix-react-sdk.git
synced 2025-07-28 15:22:05 +03:00
Check native sliding sync support against an unstable feature flag (#12498)
* Check native sliding sync support against an unstable feature flag The `OPTIONS` approach from https://github.com/matrix-org/matrix-react-sdk/pull/12492 doesn't work because Synapse *always* responds with 204 (success) to `OPTIONS` requests, as described here: https://github.com/element-hq/synapse/issues/17153 We further can't use `HEAD` because it's not part of the allowed CORS methods, meaning the browser will mask the exact status code and error message from us, and the proxy hangs on the request anyways: https://github.com/matrix-org/sliding-sync/pull/429 To avoid these problems, we instead search for an unstable feature flag to be exposed by the server. Presence of this flag denotes native support. See https://github.com/matrix-org/matrix-spec-proposals/pull/3575/files#r1588877046 for details. Implementations which support sliding sync natively will need to update to support this new unstable feature flag usage. * Appease the linter * Appease the tests
This commit is contained in:
@ -16,8 +16,7 @@ limitations under the License.
|
||||
|
||||
import { SlidingSync } from "matrix-js-sdk/src/sliding-sync";
|
||||
import { mocked } from "jest-mock";
|
||||
import { IRequestOpts, MatrixClient, MatrixEvent, Method, Room } from "matrix-js-sdk/src/matrix";
|
||||
import { QueryDict } from "matrix-js-sdk/src/utils";
|
||||
import { MatrixClient, MatrixEvent, Room } from "matrix-js-sdk/src/matrix";
|
||||
|
||||
import { SlidingSyncManager } from "../src/SlidingSyncManager";
|
||||
import { stubClient } from "./test-utils";
|
||||
@ -261,41 +260,18 @@ describe("SlidingSyncManager", () => {
|
||||
it("should make an OPTIONS request to avoid unintended side effects", async () => {
|
||||
// See https://github.com/element-hq/element-web/issues/27426
|
||||
|
||||
// Developer note: We mock this in a truly terrible way because of how the call is done. There's not
|
||||
// really much we can do to avoid it.
|
||||
client.http = {
|
||||
async authedRequest(
|
||||
method: Method,
|
||||
path: string,
|
||||
queryParams?: QueryDict,
|
||||
body?: Body,
|
||||
paramOpts: IRequestOpts & {
|
||||
doNotAttemptTokenRefresh?: boolean;
|
||||
} = {},
|
||||
): Promise<any> {
|
||||
// XXX: Ideally we'd use ResponseType<> like in the real thing, but it's not exported
|
||||
expect(method).toBe(Method.Options);
|
||||
expect(path).toBe("/sync");
|
||||
expect(queryParams).toBeUndefined();
|
||||
expect(body).toBeUndefined();
|
||||
expect(paramOpts).toEqual({
|
||||
localTimeoutMs: 10 * 1000, // 10s
|
||||
prefix: "/_matrix/client/unstable/org.matrix.msc3575",
|
||||
});
|
||||
return {};
|
||||
},
|
||||
} as any;
|
||||
|
||||
const unstableSpy = jest
|
||||
.spyOn(client, "doesServerSupportUnstableFeature")
|
||||
.mockImplementation(async (feature: string) => {
|
||||
expect(feature).toBe("org.matrix.msc3575");
|
||||
return true;
|
||||
});
|
||||
const proxySpy = jest.spyOn(manager, "getProxyFromWellKnown").mockResolvedValue("proxy");
|
||||
|
||||
expect(SlidingSyncController.serverSupportsSlidingSync).toBeFalsy();
|
||||
|
||||
await manager.checkSupport(client); // first thing it does is call nativeSlidingSyncSupport
|
||||
|
||||
// Note: if this expectation is failing, it may mean the authedRequest mock threw an expectation failure
|
||||
// which got consumed by `nativeSlidingSyncSupport`. Log your errors to discover more.
|
||||
expect(proxySpy).not.toHaveBeenCalled();
|
||||
|
||||
expect(unstableSpy).toHaveBeenCalled();
|
||||
expect(SlidingSyncController.serverSupportsSlidingSync).toBeTruthy();
|
||||
});
|
||||
});
|
||||
|
Reference in New Issue
Block a user