diff --git a/src/ScalarMessaging.ts b/src/ScalarMessaging.ts index e500c34828..0c103aa17d 100644 --- a/src/ScalarMessaging.ts +++ b/src/ScalarMessaging.ts @@ -626,7 +626,8 @@ async function setBotPower( success: true, }); } catch (err) { - sendError(event, err instanceof Error ? err.message : _t("Failed to send request."), err); + const error = err instanceof Error ? err : undefined; + sendError(event, error?.message ?? _t("Failed to send request."), error); } } diff --git a/src/SlashCommands.tsx b/src/SlashCommands.tsx index ce9d6cd187..a044dedfaa 100644 --- a/src/SlashCommands.tsx +++ b/src/SlashCommands.tsx @@ -1105,7 +1105,7 @@ export const Commands = [ try { cli.forceDiscardSession(roomId); } catch (e) { - return reject(e.message); + return reject(e instanceof Error ? e.message : e); } return success(); }, @@ -1134,7 +1134,7 @@ export const Commands = [ }), ); } catch (e) { - return reject(e.message); + return reject(e instanceof Error ? e.message : e); } }, category: CommandCategories.advanced, diff --git a/src/async-components/views/dialogs/security/CreateSecretStorageDialog.tsx b/src/async-components/views/dialogs/security/CreateSecretStorageDialog.tsx index 8f57c07e1a..bf39565a4f 100644 --- a/src/async-components/views/dialogs/security/CreateSecretStorageDialog.tsx +++ b/src/async-components/views/dialogs/security/CreateSecretStorageDialog.tsx @@ -20,10 +20,11 @@ import FileSaver from "file-saver"; import { logger } from "matrix-js-sdk/src/logger"; import { IKeyBackupInfo } from "matrix-js-sdk/src/crypto/keybackup"; import { TrustInfo } from "matrix-js-sdk/src/crypto/backup"; -import { CrossSigningKeys, MatrixError, UIAFlow } from "matrix-js-sdk/src/matrix"; +import { CrossSigningKeys, IAuthDict, MatrixError, UIAFlow } from "matrix-js-sdk/src/matrix"; import { IRecoveryKey } from "matrix-js-sdk/src/crypto/api"; import { CryptoEvent } from "matrix-js-sdk/src/crypto"; import classNames from "classnames"; +import { UIAResponse } from "matrix-js-sdk/src/@types/uia"; import { MatrixClientPeg } from "../../../../MatrixClientPeg"; import { _t, _td } from "../../../../languageHandler"; @@ -90,7 +91,7 @@ interface IState { accountPasswordCorrect: boolean | null; canSkip: boolean; passPhraseKeySelected: string; - error?: string; + error?: boolean; } /* @@ -279,7 +280,9 @@ export default class CreateSecretStorageDialog extends React.PureComponent Promise<{}>): Promise => { + private doBootstrapUIAuth = async ( + makeRequest: (authData: IAuthDict) => Promise>, + ): Promise => { if (this.state.canUploadKeysWithPasswordOnly && this.state.accountPassword) { await makeRequest({ type: "m.login.password", @@ -385,7 +388,7 @@ export default class CreateSecretStorageDialog extends React.PureComponent { } } catch (e) { if (serverConfig !== this.latestServerConfig) return; // discard, serverConfig changed from under us - if (e.httpStatus === 401) { + if (e instanceof MatrixError && e.httpStatus === 401) { this.setState({ flows: e.data.flows, }); - } else if (e.httpStatus === 403 || e.errcode === "M_FORBIDDEN") { + } else if (e instanceof MatrixError && (e.httpStatus === 403 || e.errcode === "M_FORBIDDEN")) { // Check for 403 or M_FORBIDDEN, Synapse used to send 403 M_UNKNOWN but now sends 403 M_FORBIDDEN. // At this point registration is pretty much disabled, but before we do that let's // quickly check to see if the server supports SSO instead. If it does, we'll send diff --git a/src/components/views/dialogs/ChangelogDialog.tsx b/src/components/views/dialogs/ChangelogDialog.tsx index 8321cc40f4..56b5758c62 100644 --- a/src/components/views/dialogs/ChangelogDialog.tsx +++ b/src/components/views/dialogs/ChangelogDialog.tsx @@ -60,7 +60,7 @@ export default class ChangelogDialog extends React.Component { const body = await res.json(); this.setState({ [repo]: body.commits }); } catch (err) { - this.setState({ [repo]: err.message }); + this.setState({ [repo]: err instanceof Error ? err.message : _t("Unknown error") }); } } diff --git a/src/components/views/dialogs/LogoutDialog.tsx b/src/components/views/dialogs/LogoutDialog.tsx index bf92719c19..9830cf5992 100644 --- a/src/components/views/dialogs/LogoutDialog.tsx +++ b/src/components/views/dialogs/LogoutDialog.tsx @@ -39,7 +39,6 @@ interface IState { shouldLoadBackupStatus: boolean; loading: boolean; backupInfo: IKeyBackupInfo | null; - error?: string; } export default class LogoutDialog extends React.Component { @@ -75,7 +74,6 @@ export default class LogoutDialog extends React.Component { logger.log("Unable to fetch key backup status", e); this.setState({ loading: false, - error: e, }); } } diff --git a/src/components/views/dialogs/ReportEventDialog.tsx b/src/components/views/dialogs/ReportEventDialog.tsx index ecf7c856e0..f5912131b5 100644 --- a/src/components/views/dialogs/ReportEventDialog.tsx +++ b/src/components/views/dialogs/ReportEventDialog.tsx @@ -272,7 +272,7 @@ export default class ReportEventDialog extends React.Component { logger.error(e); this.setState({ busy: false, - err: e.message, + err: e instanceof Error ? e.message : String(e), }); } }; diff --git a/src/components/views/dialogs/security/CreateCrossSigningDialog.tsx b/src/components/views/dialogs/security/CreateCrossSigningDialog.tsx index 7a6412c8ed..d27e7aec04 100644 --- a/src/components/views/dialogs/security/CreateCrossSigningDialog.tsx +++ b/src/components/views/dialogs/security/CreateCrossSigningDialog.tsx @@ -18,7 +18,8 @@ limitations under the License. import React from "react"; import { CrossSigningKeys } from "matrix-js-sdk/src/client"; import { logger } from "matrix-js-sdk/src/logger"; -import { UIAFlow } from "matrix-js-sdk/src/matrix"; +import { AuthDict, MatrixError, UIAFlow } from "matrix-js-sdk/src/matrix"; +import { UIAResponse } from "matrix-js-sdk/src/@types/uia"; import { MatrixClientPeg } from "../../../../MatrixClientPeg"; import { _t } from "../../../../languageHandler"; @@ -79,7 +80,7 @@ export default class CreateCrossSigningDialog extends React.PureComponent Promise<{}>): Promise => { + private doBootstrapUIAuth = async ( + makeRequest: (authData: AuthDict) => Promise>, + ): Promise => { if (this.state.canUploadKeysWithPasswordOnly && this.state.accountPassword) { await makeRequest({ type: "m.login.password", diff --git a/src/components/views/dialogs/security/RestoreKeyBackupDialog.tsx b/src/components/views/dialogs/security/RestoreKeyBackupDialog.tsx index d4eb3a0bd7..7ec4caa429 100644 --- a/src/components/views/dialogs/security/RestoreKeyBackupDialog.tsx +++ b/src/components/views/dialogs/security/RestoreKeyBackupDialog.tsx @@ -55,7 +55,7 @@ interface IState { backupInfo: IKeyBackupInfo | null; backupKeyStored: Record | null; loading: boolean; - loadError: string | null; + loadError: boolean | null; restoreError: { errcode: string; } | null; @@ -66,7 +66,7 @@ interface IState { passPhrase: string; restoreType: RestoreType | null; progress: { - stage: ProgressState; + stage: ProgressState | string; total?: number; successes?: number; failures?: number; @@ -304,7 +304,7 @@ export default class RestoreKeyBackupDialog extends React.PureComponent extends React.Component, this.state = LazyRenderList.getDerivedStateFromProps(props, {} as IState) as IState; } - public static getDerivedStateFromProps(props: IProps, state: IState): Partial | null { + public static getDerivedStateFromProps(props: IProps, state: IState): Partial | null { const range = LazyRenderList.getVisibleRangeFromProps(props); const intersectRange = range.expand(props.overflowMargin); const renderRange = range.expand(props.overflowItems); @@ -105,7 +105,7 @@ export default class LazyRenderList extends React.Component, return null; } - private static getVisibleRangeFromProps(props: IProps): ItemRange { + private static getVisibleRangeFromProps(props: IProps): ItemRange { const { items, itemHeight, scrollTop, height } = props; const length = items ? items.length : 0; const topCount = Math.min(Math.max(0, Math.floor(scrollTop / itemHeight)), length); diff --git a/src/components/views/elements/RoomAliasField.tsx b/src/components/views/elements/RoomAliasField.tsx index 10549d79db..6590bba783 100644 --- a/src/components/views/elements/RoomAliasField.tsx +++ b/src/components/views/elements/RoomAliasField.tsx @@ -15,6 +15,7 @@ limitations under the License. */ import React, { createRef, KeyboardEventHandler } from "react"; +import { MatrixError } from "matrix-js-sdk/src/matrix"; import { _t } from "../../../languageHandler"; import withValidation, { IFieldState, IValidationResult } from "./Validation"; @@ -209,7 +210,7 @@ export default class RoomAliasField extends React.PureComponent // any server error code will do, // either it M_NOT_FOUND or the alias is invalid somehow, // in which case we don't want to show the invalid message - return !!err.errcode; + return err instanceof MatrixError; } }, valid: () => _t("This address is available to use"), diff --git a/src/components/views/settings/devices/deleteDevices.tsx b/src/components/views/settings/devices/deleteDevices.tsx index 3fa042864a..b1f527187d 100644 --- a/src/components/views/settings/devices/deleteDevices.tsx +++ b/src/components/views/settings/devices/deleteDevices.tsx @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { MatrixClient } from "matrix-js-sdk/src/matrix"; +import { MatrixClient, MatrixError } from "matrix-js-sdk/src/matrix"; import { IAuthDict, IAuthData } from "matrix-js-sdk/src/interactive-auth"; import { _t } from "../../../../languageHandler"; @@ -42,7 +42,7 @@ export const deleteDevicesWithInteractiveAuth = async ( // no interactive auth needed onFinished(true, undefined); } catch (error) { - if (error.httpStatus !== 401 || !error.data?.flows) { + if (!(error instanceof MatrixError) || error.httpStatus !== 401 || !error.data?.flows) { // doesn't look like an interactive-auth failure throw error; } @@ -73,7 +73,7 @@ export const deleteDevicesWithInteractiveAuth = async ( Modal.createDialog(InteractiveAuthDialog, { title: _t("Authentication"), matrixClient: matrixClient, - authData: error.data, + authData: error.data as IAuthData, onFinished, makeRequest: makeDeleteRequest(matrixClient, deviceIds), aestheticsForStagePhases: { diff --git a/src/components/views/toasts/VerificationRequestToast.tsx b/src/components/views/toasts/VerificationRequestToast.tsx index 37c1683d81..2476c7ce44 100644 --- a/src/components/views/toasts/VerificationRequestToast.tsx +++ b/src/components/views/toasts/VerificationRequestToast.tsx @@ -147,7 +147,7 @@ export default class VerificationRequestToast extends React.PureComponent(key: string, initialValue: T): T => { try { @@ -26,7 +26,7 @@ const getValue = (key: string, initialValue: T): T => { }; // Hook behaving like useState but persisting the value to localStorage. Returns same as useState -export const useLocalStorageState = (key: string, initialValue: T): [T, Dispatch>] => { +export const useLocalStorageState = (key: string, initialValue: T): [T, Dispatch] => { const lsKey = "mx_" + key; const [value, setValue] = useState(getValue(lsKey, initialValue)); @@ -35,7 +35,7 @@ export const useLocalStorageState = (key: string, initialValue: T): [T, Dispa setValue(getValue(lsKey, initialValue)); }, [lsKey, initialValue]); - const _setValue: Dispatch> = useCallback( + const _setValue: Dispatch = useCallback( (v: T) => { window.localStorage.setItem(lsKey, JSON.stringify(v)); setValue(v); diff --git a/src/hooks/useStateCallback.ts b/src/hooks/useStateCallback.ts index 39863666c6..ab73f26520 100644 --- a/src/hooks/useStateCallback.ts +++ b/src/hooks/useStateCallback.ts @@ -14,11 +14,11 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { Dispatch, SetStateAction, useState } from "react"; +import { Dispatch, useState } from "react"; // Hook to simplify interactions with a store-backed state values // Returns value and method to change the state value -export const useStateCallback = (initialValue: T, callback: (v: T) => void): [T, Dispatch>] => { +export const useStateCallback = (initialValue: T, callback: (v: T) => void): [T, Dispatch] => { const [value, setValue] = useState(initialValue); const interceptSetValue = (newVal: T): void => { setValue(newVal); diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index d2e280ff13..5c51a0f7fc 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -2765,6 +2765,7 @@ "Remove %(count)s messages|one": "Remove 1 message", "Can't start voice message": "Can't start voice message", "You can't start a voice message as you are currently recording a live broadcast. Please end your live broadcast in order to start recording a voice message.": "You can't start a voice message as you are currently recording a live broadcast. Please end your live broadcast in order to start recording a voice message.", + "Unknown error": "Unknown error", "Unable to load commit detail: %(msg)s": "Unable to load commit detail: %(msg)s", "Unavailable": "Unavailable", "Changelog": "Changelog", @@ -3469,7 +3470,6 @@ "You don't have permission": "You don't have permission", "This room is suggested as a good one to join": "This room is suggested as a good one to join", "Suggested": "Suggested", - "Unknown error": "Unknown error", "Select a room below first": "Select a room below first", "Mark as not suggested": "Mark as not suggested", "Mark as suggested": "Mark as suggested", diff --git a/src/settings/SettingsStore.ts b/src/settings/SettingsStore.ts index 7169494f4c..457908d858 100644 --- a/src/settings/SettingsStore.ts +++ b/src/settings/SettingsStore.ts @@ -666,7 +666,9 @@ export default class SettingsStore { logger.log(`--- ${handlerName}@${roomId || ""} = ${JSON.stringify(value)}`); } catch (e) { logger.log( - `--- ${handler.constructor.name}@${roomId || ""} THREW ERROR: ${e.message}`, + `--- ${handler.constructor.name}@${roomId || ""} THREW ERROR: ${ + e instanceof Error ? e.message : e + }`, ); logger.error(e); } @@ -676,7 +678,11 @@ export default class SettingsStore { const value = handler.getValue(settingName, null); logger.log(`--- ${handlerName}@ = ${JSON.stringify(value)}`); } catch (e) { - logger.log(`--- ${handler.constructor.name}@ THREW ERROR: ${e.message}`); + logger.log( + `--- ${handler.constructor.name}@ THREW ERROR: ${ + e instanceof Error ? e.message : e + }`, + ); logger.error(e); } } @@ -689,7 +695,11 @@ export default class SettingsStore { const value = SettingsStore.getValue(settingName, roomId); logger.log(`--- SettingsStore#generic@${roomId || ""} = ${JSON.stringify(value)}`); } catch (e) { - logger.log(`--- SettingsStore#generic@${roomId || ""} THREW ERROR: ${e.message}`); + logger.log( + `--- SettingsStore#generic@${roomId || ""} THREW ERROR: ${ + e instanceof Error ? e.message : e + }`, + ); logger.error(e); } @@ -698,7 +708,9 @@ export default class SettingsStore { const value = SettingsStore.getValue(settingName, null); logger.log(`--- SettingsStore#generic@ = ${JSON.stringify(value)}`); } catch (e) { - logger.log(`--- SettingsStore#generic@$ THREW ERROR: ${e.message}`); + logger.log( + `--- SettingsStore#generic@$ THREW ERROR: ${e instanceof Error ? e.message : e}`, + ); logger.error(e); } } @@ -708,7 +720,11 @@ export default class SettingsStore { const value = SettingsStore.getValueAt(level, settingName, roomId); logger.log(`--- SettingsStore#${level}@${roomId || ""} = ${JSON.stringify(value)}`); } catch (e) { - logger.log(`--- SettingsStore#${level}@${roomId || ""} THREW ERROR: ${e.message}`); + logger.log( + `--- SettingsStore#${level}@${roomId || ""} THREW ERROR: ${ + e instanceof Error ? e.message : e + }`, + ); logger.error(e); } @@ -717,7 +733,11 @@ export default class SettingsStore { const value = SettingsStore.getValueAt(level, settingName, null); logger.log(`--- SettingsStore#${level}@ = ${JSON.stringify(value)}`); } catch (e) { - logger.log(`--- SettingsStore#${level}@$ THREW ERROR: ${e.message}`); + logger.log( + `--- SettingsStore#${level}@$ THREW ERROR: ${ + e instanceof Error ? e.message : e + }`, + ); logger.error(e); } } diff --git a/src/utils/MultiInviter.ts b/src/utils/MultiInviter.ts index 1cff080a63..31ca6f87b5 100644 --- a/src/utils/MultiInviter.ts +++ b/src/utils/MultiInviter.ts @@ -178,7 +178,7 @@ export default class MultiInviter { } catch (err) { // The error handling during the invitation process covers any API. // Some errors must to me mapped from profile API errors to more specific ones to avoid collisions. - switch (err.errcode) { + switch (err instanceof MatrixError ? err.errcode : err) { case "M_FORBIDDEN": throw new MatrixError({ errcode: "M_PROFILE_UNDISCLOSED" }); case "M_NOT_FOUND": diff --git a/src/utils/UserInteractiveAuth.ts b/src/utils/UserInteractiveAuth.ts index 2eed476c3c..e78f88cbce 100644 --- a/src/utils/UserInteractiveAuth.ts +++ b/src/utils/UserInteractiveAuth.ts @@ -14,13 +14,13 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { IAuthDict } from "matrix-js-sdk/src/interactive-auth"; +import { AuthDict } from "matrix-js-sdk/src/interactive-auth"; import { UIAResponse } from "matrix-js-sdk/src/@types/uia"; import Modal from "../Modal"; import InteractiveAuthDialog, { InteractiveAuthDialogProps } from "../components/views/dialogs/InteractiveAuthDialog"; -type FunctionWithUIA = (auth?: IAuthDict | null, ...args: A[]) => Promise>; +type FunctionWithUIA = (auth?: AuthDict, ...args: A[]) => Promise>; export function wrapRequestWithDialog( requestFunction: FunctionWithUIA, @@ -29,7 +29,7 @@ export function wrapRequestWithDialog( return async function (...args): Promise { return new Promise((resolve, reject) => { const boundFunction = requestFunction.bind(opts.matrixClient) as FunctionWithUIA; - boundFunction(null, ...args) + boundFunction(undefined, ...args) .then((res) => resolve(res as R)) .catch((error) => { if (error.httpStatus !== 401 || !error.data?.flows) { @@ -40,7 +40,7 @@ export function wrapRequestWithDialog( Modal.createDialog(InteractiveAuthDialog, { ...opts, authData: error.data, - makeRequest: (authData: IAuthDict | null) => boundFunction(authData, ...args), + makeRequest: (authData: AuthDict) => boundFunction(authData, ...args), onFinished: (success, result) => { if (success) { resolve(result as R); diff --git a/test/components/structures/auth/Registration-test.tsx b/test/components/structures/auth/Registration-test.tsx index 3f6f44db7e..e72ffc58b9 100644 --- a/test/components/structures/auth/Registration-test.tsx +++ b/test/components/structures/auth/Registration-test.tsx @@ -17,8 +17,7 @@ limitations under the License. import React from "react"; import { fireEvent, render, screen, waitForElementToBeRemoved } from "@testing-library/react"; -import { createClient, MatrixClient } from "matrix-js-sdk/src/matrix"; -import { MatrixError } from "matrix-js-sdk/src/http-api/errors"; +import { createClient, MatrixClient, MatrixError } from "matrix-js-sdk/src/matrix"; import { mocked } from "jest-mock"; import fetchMock from "fetch-mock-jest"; @@ -26,7 +25,10 @@ import SdkConfig, { DEFAULTS } from "../../../../src/SdkConfig"; import { mkServerConfig, mockPlatformPeg, unmockPlatformPeg } from "../../../test-utils"; import Registration from "../../../../src/components/structures/auth/Registration"; -jest.mock("matrix-js-sdk/src/matrix"); +jest.mock("matrix-js-sdk/src/matrix", () => ({ + ...jest.requireActual("matrix-js-sdk/src/matrix"), + createClient: jest.fn(), +})); jest.useFakeTimers(); describe("Registration", function () { diff --git a/test/components/views/dialogs/CreateRoomDialog-test.tsx b/test/components/views/dialogs/CreateRoomDialog-test.tsx index d312f0eaa0..f675efd023 100644 --- a/test/components/views/dialogs/CreateRoomDialog-test.tsx +++ b/test/components/views/dialogs/CreateRoomDialog-test.tsx @@ -16,7 +16,7 @@ limitations under the License. import React from "react"; import { fireEvent, render, screen, within } from "@testing-library/react"; -import { Preset, Visibility } from "matrix-js-sdk/src/matrix"; +import { MatrixError, Preset, Visibility } from "matrix-js-sdk/src/matrix"; import CreateRoomDialog from "../../../../src/components/views/dialogs/CreateRoomDialog"; import { flushPromises, getMockClientWithEventEmitter, mockClientMethodsUser } from "../../../test-utils"; @@ -29,7 +29,7 @@ describe("", () => { getClientWellKnown: jest.fn(), doesServerForceEncryptionForPreset: jest.fn(), // make every alias available - getRoomIdForAlias: jest.fn().mockRejectedValue({ errcode: "M_NOT_FOUND" }), + getRoomIdForAlias: jest.fn().mockRejectedValue(new MatrixError({ errcode: "M_NOT_FOUND" })), }); const getE2eeEnableToggleInputElement = () => screen.getByLabelText("Enable end-to-end encryption"); diff --git a/test/components/views/dialogs/InteractiveAuthDialog-test.tsx b/test/components/views/dialogs/InteractiveAuthDialog-test.tsx index 1fce8783e8..76a6607ed2 100644 --- a/test/components/views/dialogs/InteractiveAuthDialog-test.tsx +++ b/test/components/views/dialogs/InteractiveAuthDialog-test.tsx @@ -131,7 +131,7 @@ describe("InteractiveAuthDialog", function () { const successfulResult = { test: 1 }; const makeRequest = jest .fn() - .mockRejectedValueOnce(new MatrixError({ data: { flows: [{ stages: ["m.login.sso"] }] } }, 401)) + .mockRejectedValueOnce(new MatrixError({ flows: [{ stages: ["m.login.sso"] }] }, 401)) .mockResolvedValue(successfulResult); mockClient.credentials = { userId: "@user:id" }; diff --git a/test/components/views/settings/devices/deleteDevices-test.tsx b/test/components/views/settings/devices/deleteDevices-test.tsx index bdd0c5a8c2..ca748d9896 100644 --- a/test/components/views/settings/devices/deleteDevices-test.tsx +++ b/test/components/views/settings/devices/deleteDevices-test.tsx @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { UIAFlow } from "matrix-js-sdk/src/matrix"; +import { MatrixError, UIAFlow } from "matrix-js-sdk/src/matrix"; import { deleteDevicesWithInteractiveAuth } from "../../../../../src/components/views/settings/devices/deleteDevices"; import Modal from "../../../../../src/Modal"; @@ -30,7 +30,7 @@ describe("deleteDevices()", () => { const modalSpy = jest.spyOn(Modal, "createDialog") as jest.SpyInstance; - const interactiveAuthError = { httpStatus: 401, data: { flows: [] as UIAFlow[] } }; + const interactiveAuthError = new MatrixError({ flows: [] as UIAFlow[] }, 401); beforeEach(() => { jest.clearAllMocks(); diff --git a/test/components/views/settings/tabs/user/SessionManagerTab-test.tsx b/test/components/views/settings/tabs/user/SessionManagerTab-test.tsx index f2e34d37e6..3de4eff002 100644 --- a/test/components/views/settings/tabs/user/SessionManagerTab-test.tsx +++ b/test/components/views/settings/tabs/user/SessionManagerTab-test.tsx @@ -31,6 +31,7 @@ import { UNSTABLE_MSC3882_CAPABILITY, CryptoApi, DeviceVerificationStatus, + MatrixError, } from "matrix-js-sdk/src/matrix"; import { mocked } from "jest-mock"; @@ -722,10 +723,12 @@ describe("", () => { }); describe("other devices", () => { - const interactiveAuthError = { - httpStatus: 401, - data: { flows: [{ stages: ["m.login.password"] }] }, - }; + const interactiveAuthError = new MatrixError( + { + flows: [{ stages: ["m.login.password"] }], + }, + 401, + ); beforeEach(() => { mockClient.deleteMultipleDevices.mockReset(); diff --git a/test/utils/MultiInviter-test.ts b/test/utils/MultiInviter-test.ts index 2c25cd5e3a..4e63407119 100644 --- a/test/utils/MultiInviter-test.ts +++ b/test/utils/MultiInviter-test.ts @@ -32,8 +32,8 @@ const MXID3 = "@user3:server"; const MXID_PROFILE_STATES: Record> = { [MXID1]: Promise.resolve({}), - [MXID2]: Promise.reject({ errcode: "M_FORBIDDEN" }), - [MXID3]: Promise.reject({ errcode: "M_NOT_FOUND" }), + [MXID2]: Promise.reject(new MatrixError({ errcode: "M_FORBIDDEN" })), + [MXID3]: Promise.reject(new MatrixError({ errcode: "M_NOT_FOUND" })), }; jest.mock("../../src/Modal", () => ({