From d2ad51c3fb43c6a103aa2561fbe271393e63b6c4 Mon Sep 17 00:00:00 2001 From: Louis Aussedat Date: Wed, 29 May 2024 14:18:16 +0200 Subject: [PATCH 1/3] fix(errors): restore TransportRaceCondition This reverts commit 931d511f5c5da86ddee53c69775515da019b6241 that renamed TransportRaceCondition to TransportPendingOperation and causing a unwanted breaking change. --- .../src/renderer/components/DeviceAction/index.tsx | 4 ++-- apps/ledger-live-desktop/static/i18n/en/app.json | 2 +- .../FirmwareUpdate/useUpdateFirmwareAndRestoreSettings.ts | 2 +- .../deviceSDK/actions/getLatestAvailableFirmware.test.ts | 8 ++++---- libs/ledger-live-common/src/deviceSDK/tasks/core.ts | 4 ++-- .../src/hw/getOnboardingStatePolling.ts | 4 ++-- libs/ledgerjs/packages/errors/src/index.ts | 2 +- libs/ledgerjs/packages/hw-transport/src/Transport.ts | 4 ++-- 8 files changed, 15 insertions(+), 15 deletions(-) diff --git a/apps/ledger-live-desktop/src/renderer/components/DeviceAction/index.tsx b/apps/ledger-live-desktop/src/renderer/components/DeviceAction/index.tsx index 9abee9dd0a99..cd9fd8e9f119 100644 --- a/apps/ledger-live-desktop/src/renderer/components/DeviceAction/index.tsx +++ b/apps/ledger-live-desktop/src/renderer/components/DeviceAction/index.tsx @@ -35,7 +35,7 @@ import { UserRefusedOnDevice, UserRefusedDeviceNameChange, UnresponsiveDeviceError, - TransportPendingOperation, + TransportRaceCondition, } from "@ledgerhq/errors"; import { InstallingApp, @@ -426,7 +426,7 @@ export const DeviceActionDefaultRendering = ({ return renderInWrongAppForAccount({ t, onRetry }); } - if (unresponsive || error instanceof TransportPendingOperation) { + if (unresponsive || error instanceof TransportRaceCondition) { return renderError({ t, error: new UnresponsiveDeviceError(), diff --git a/apps/ledger-live-desktop/static/i18n/en/app.json b/apps/ledger-live-desktop/static/i18n/en/app.json index 0bd38b3b914e..0df9090ee40d 100644 --- a/apps/ledger-live-desktop/static/i18n/en/app.json +++ b/apps/ledger-live-desktop/static/i18n/en/app.json @@ -5571,7 +5571,7 @@ "title": "Something went wrong. Please reconnect your device", "description": "{{message}}" }, - "TransportPendingOperation": { + "TransportRaceCondition": { "title": "Something went wrong. Please reconnect your device", "description": "An action was already pending on the Ledger device. Please deny or reconnect." }, diff --git a/apps/ledger-live-mobile/src/screens/FirmwareUpdate/useUpdateFirmwareAndRestoreSettings.ts b/apps/ledger-live-mobile/src/screens/FirmwareUpdate/useUpdateFirmwareAndRestoreSettings.ts index 919d758f060e..8f89f2e2b408 100644 --- a/apps/ledger-live-mobile/src/screens/FirmwareUpdate/useUpdateFirmwareAndRestoreSettings.ts +++ b/apps/ledger-live-mobile/src/screens/FirmwareUpdate/useUpdateFirmwareAndRestoreSettings.ts @@ -368,7 +368,7 @@ export const useUpdateFirmwareAndRestoreSettings = ({ * then either: this current fw update step is skipped or this error is ignored * And in both cases: nothing should be displayed to the user (logs are saved). * - * Especially: a `TransportPendingOperation` error is to be expected since we chain multiple + * Especially: a `TransportRaceCondition` error is to be expected since we chain multiple * device actions that use different transport acquisition paradigms the action should, * however, retry to execute and resolve the error by itself. * There is no need to present the error to the user. diff --git a/libs/ledger-live-common/src/deviceSDK/actions/getLatestAvailableFirmware.test.ts b/libs/ledger-live-common/src/deviceSDK/actions/getLatestAvailableFirmware.test.ts index 45c9aaa3da01..3ebd24660528 100644 --- a/libs/ledger-live-common/src/deviceSDK/actions/getLatestAvailableFirmware.test.ts +++ b/libs/ledger-live-common/src/deviceSDK/actions/getLatestAvailableFirmware.test.ts @@ -1,5 +1,5 @@ import { Observable, of } from "rxjs"; -import { LockedDeviceError, TransportPendingOperation } from "@ledgerhq/errors"; +import { LockedDeviceError, TransportRaceCondition } from "@ledgerhq/errors"; import { DeviceInfo, FirmwareUpdateContext } from "@ledgerhq/types-live"; import { getDeviceInfoTask, internalGetDeviceInfoTask } from "../tasks/getDeviceInfo"; @@ -249,9 +249,9 @@ describe("getLatestAvailableFirmwareAction", () => { new Observable(o => { if (count < 1) { count++; - // Mocks the internal task, some shared error are thrown (like `TransportPendingOperation`) + // Mocks the internal task, some shared error are thrown (like `TransportRaceCondition`) // and caught by the `sharedLogicTaskWrapper` - o.error(new TransportPendingOperation()); + o.error(new TransportRaceCondition()); } else { o.next({ type: "data", deviceInfo: aDeviceInfo }); } @@ -291,7 +291,7 @@ describe("getLatestAvailableFirmwareAction", () => { expect(error).toEqual( expect.objectContaining({ type: "SharedError", - name: "TransportPendingOperation", + name: "TransportRaceCondition", retrying: true, }), ); diff --git a/libs/ledger-live-common/src/deviceSDK/tasks/core.ts b/libs/ledger-live-common/src/deviceSDK/tasks/core.ts index 523a9e2e8a0c..58d35877ac1a 100644 --- a/libs/ledger-live-common/src/deviceSDK/tasks/core.ts +++ b/libs/ledger-live-common/src/deviceSDK/tasks/core.ts @@ -2,7 +2,7 @@ import { CantOpenDevice, DisconnectedDevice, LockedDeviceError, - TransportPendingOperation, + TransportRaceCondition, UnresponsiveDeviceError, TransportStatusErrorClassType, CustomErrorClassType, @@ -49,7 +49,7 @@ export function sharedLogicTaskWrapper( error instanceof UnresponsiveDeviceError || error instanceof CantOpenDevice || error instanceof DisconnectedDevice || - error instanceof TransportPendingOperation + error instanceof TransportRaceCondition ) { // Emits to the action an error event so it is aware of it (for ex locked device) before retrying const event: SharedTaskEvent = { diff --git a/libs/ledger-live-common/src/hw/getOnboardingStatePolling.ts b/libs/ledger-live-common/src/hw/getOnboardingStatePolling.ts index 00fe10dc5fbe..052fcae2a43e 100644 --- a/libs/ledger-live-common/src/hw/getOnboardingStatePolling.ts +++ b/libs/ledger-live-common/src/hw/getOnboardingStatePolling.ts @@ -8,7 +8,7 @@ import { DeviceExtractOnboardingStateError, DisconnectedDevice, CantOpenDevice, - TransportPendingOperation, + TransportRaceCondition, LockedDeviceError, UnexpectedBootloader, TransportExchangeTimeoutError, @@ -139,7 +139,7 @@ export const isAllowedOnboardingStatePollingError = (error: unknown): boolean => error instanceof DisconnectedDevice || error instanceof DisconnectedDeviceDuringOperation || error instanceof CantOpenDevice || - error instanceof TransportPendingOperation || + error instanceof TransportRaceCondition || error instanceof TransportStatusError || // A locked device is handled as an allowed error error instanceof LockedDeviceError) diff --git a/libs/ledgerjs/packages/errors/src/index.ts b/libs/ledgerjs/packages/errors/src/index.ts index 18a51d29e1af..da4e6b1c9106 100644 --- a/libs/ledgerjs/packages/errors/src/index.ts +++ b/libs/ledgerjs/packages/errors/src/index.ts @@ -127,7 +127,7 @@ export const TransportOpenUserCancelled = createCustomErrorClass("TransportOpenU export const TransportInterfaceNotAvailable = createCustomErrorClass( "TransportInterfaceNotAvailable", ); -export const TransportPendingOperation = createCustomErrorClass("TransportPendingOperation"); +export const TransportRaceCondition = createCustomErrorClass("TransportRaceCondition"); export const TransportWebUSBGestureRequired = createCustomErrorClass( "TransportWebUSBGestureRequired", ); diff --git a/libs/ledgerjs/packages/hw-transport/src/Transport.ts b/libs/ledgerjs/packages/hw-transport/src/Transport.ts index 62893021a937..d44d28217466 100644 --- a/libs/ledgerjs/packages/hw-transport/src/Transport.ts +++ b/libs/ledgerjs/packages/hw-transport/src/Transport.ts @@ -1,7 +1,7 @@ import EventEmitter from "events"; import type { DeviceModel } from "@ledgerhq/devices"; import { - TransportPendingOperation, + TransportRaceCondition, TransportError, StatusCodes, getAltStatusMessage, @@ -339,7 +339,7 @@ export default class Transport { if (this.exchangeBusyPromise) { tracer.trace("Atomic exchange is already busy"); - throw new TransportPendingOperation( + throw new TransportRaceCondition( "An action was already pending on the Ledger device. Please deny or reconnect.", ); } From 0e7fe3bf78053f39cffbbe407e3d415d2d69cf2c Mon Sep 17 00:00:00 2001 From: Louis Aussedat Date: Wed, 29 May 2024 14:37:39 +0200 Subject: [PATCH 2/3] fix(errors): enable all unit tests --- libs/ledgerjs/packages/errors/src/index.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/ledgerjs/packages/errors/src/index.test.ts b/libs/ledgerjs/packages/errors/src/index.test.ts index 2f317d9bd024..cf12eb2e6ea5 100644 --- a/libs/ledgerjs/packages/errors/src/index.test.ts +++ b/libs/ledgerjs/packages/errors/src/index.test.ts @@ -86,7 +86,7 @@ describe("custom errors", () => { expect(error.statusCode).toEqual(0x6d02); }); - test.only("TransportStatusError should be mapped to a LockedDeviceError on status code 0x5515", () => { + test("TransportStatusError should be mapped to a LockedDeviceError on status code 0x5515", () => { const error = new TransportStatusError(StatusCodes.LOCKED_DEVICE); expect(error.name).toEqual("LockedDeviceError"); From 815ae3dae8027823854ada837df3dc983d09b10f Mon Sep 17 00:00:00 2001 From: Louis Aussedat Date: Wed, 29 May 2024 15:03:45 +0200 Subject: [PATCH 3/3] chore: changeset --- .changeset/breezy-countries-protect.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .changeset/breezy-countries-protect.md diff --git a/.changeset/breezy-countries-protect.md b/.changeset/breezy-countries-protect.md new file mode 100644 index 000000000000..d2db2ec48086 --- /dev/null +++ b/.changeset/breezy-countries-protect.md @@ -0,0 +1,9 @@ +--- +"@ledgerhq/hw-transport": patch +"@ledgerhq/errors": patch +"ledger-live-desktop": patch +"live-mobile": patch +"@ledgerhq/live-common": patch +--- + +restore TransportRaceCondition instead of TransportPendingOperation that caused a breaking change