From a9d827d21dadd1ac1a68c6f154db518c4829ddc0 Mon Sep 17 00:00:00 2001 From: David Lechner Date: Sat, 23 Jan 2021 19:34:49 -0600 Subject: [PATCH] split didRequest and didFailToRequest --- src/actions/index.ts | 2 ++ src/actions/lwp3-bootloader.ts | 49 ++++++++++++++++++++++----- src/sagas/flash-firmware.test.ts | 5 +-- src/sagas/flash-firmware.ts | 24 +++++++++---- src/sagas/lwp3-bootloader-protocol.ts | 8 ++++- 5 files changed, 70 insertions(+), 18 deletions(-) diff --git a/src/actions/index.ts b/src/actions/index.ts index e4ded3ad..698e8d22 100644 --- a/src/actions/index.ts +++ b/src/actions/index.ts @@ -11,6 +11,7 @@ import { HubAction, HubMessageAction } from './hub'; import { LicenseAction } from './license'; import { BootloaderConnectionAction, + BootloaderDidFailToRequestAction, BootloaderDidRequestAction, BootloaderRequestAction, BootloaderResponseAction, @@ -31,6 +32,7 @@ export type Action = | BleUartAction | BootloaderConnectionAction | BootloaderDidRequestAction + | BootloaderDidFailToRequestAction | BootloaderRequestAction | BootloaderResponseAction | EditorAction diff --git a/src/actions/lwp3-bootloader.ts b/src/actions/lwp3-bootloader.ts index fde0834d..07c74789 100644 --- a/src/actions/lwp3-bootloader.ts +++ b/src/actions/lwp3-bootloader.ts @@ -365,26 +365,57 @@ export type BootloaderDidRequestType = 'bootloader.action.did.request'; export const BootloaderDidRequestType = 'bootloader.action.did.request'; /** - * Action that indicates a request was sent or failed to send. + * Action that indicates a request was sent. */ export type BootloaderDidRequestAction = Action & { /** * The unique identifier of the action. */ id: number; - /** - * The error on failure or undefined on success. - */ - err?: Error; }; /** - * Creates an action that indicates a request was sent or failed to send. + * Creates an action that indicates a request was sent. * @param id The unique identifier of the action. - * @param err The error message on failure or undefined on success. */ -export function didRequest(id: number, err?: Error): BootloaderDidRequestAction { - return { type: BootloaderDidRequestType, id, err }; +export function didRequest(id: number): BootloaderDidRequestAction { + return { type: BootloaderDidRequestType, id }; +} + +/** + * Action type for bootloader did fail to request action. + */ +export type BootloaderDidFailToRequestType = 'bootloader.action.did.failToRequest'; + +/** + * Action type for bootloader did fail to request action. + */ +export const BootloaderDidFailToRequestType = 'bootloader.action.did.failToRequest'; + +/** + * Action that indicates a request failed to send. + */ +export type BootloaderDidFailToRequestAction = Action & { + /** + * The unique identifier of the action. + */ + id: number; + /** + * The error. + */ + err: Error; +}; + +/** + * Creates an action that indicates a request failed to send. + * @param id The unique identifier of the action. + * @param err The error message. + */ +export function didFailToRequest( + id: number, + err: Error, +): BootloaderDidFailToRequestAction { + return { type: BootloaderDidFailToRequestType, id, err }; } /** diff --git a/src/sagas/flash-firmware.test.ts b/src/sagas/flash-firmware.test.ts index 2f356a60..dcf9aa74 100644 --- a/src/sagas/flash-firmware.test.ts +++ b/src/sagas/flash-firmware.test.ts @@ -27,6 +27,7 @@ import { didConnect, didDisconnect, didFailToConnect, + didFailToRequest, didRequest, disconnect, eraseRequest, @@ -329,7 +330,7 @@ describe('flashFirmware', () => { // On city hub, we can end up in this situation. BLE writeValueWithResponse() // doesn't return until erasing is done, so there is a long window for // this to happen. - saga.put(didRequest(0, new Error('failed due to disconnect'))); + saga.put(didFailToRequest(0, new Error('failed due to disconnect'))); await saga.end(); }); @@ -387,7 +388,7 @@ describe('flashFirmware', () => { expect(action).toEqual(infoRequest(0)); const testError = new Error('test'); - saga.put(didRequest(0, testError)); + saga.put(didFailToRequest(0, testError)); // should get a failure to start diff --git a/src/sagas/flash-firmware.ts b/src/sagas/flash-firmware.ts index 2176f82d..7d3234e7 100644 --- a/src/sagas/flash-firmware.ts +++ b/src/sagas/flash-firmware.ts @@ -34,6 +34,8 @@ import { BootloaderChecksumResponseAction, BootloaderConnectionAction, BootloaderConnectionActionType, + BootloaderDidFailToRequestAction, + BootloaderDidFailToRequestType, BootloaderDidRequestAction, BootloaderDidRequestType, BootloaderEraseResponseAction, @@ -85,15 +87,25 @@ function* disconnectAndCancel(): SagaGenerator { } function* waitForDidRequest(id: number): SagaGenerator { - const request = yield* take( - (a: Action) => a.type === BootloaderDidRequestType && a.id === id, - ); - if (request.err) { - yield* put(didFailToFinish(FailToFinishReasonType.BleError, request.err)); + const { requested, failedToRequest } = yield* race({ + requested: take( + (a: Action) => a.type === BootloaderDidRequestType && a.id === id, + ), + failedToRequest: take( + (a: Action) => a.type === BootloaderDidFailToRequestType && a.id === id, + ), + }); + + if (failedToRequest) { + yield* put( + didFailToFinish(FailToFinishReasonType.BleError, failedToRequest.err), + ); yield* disconnectAndCancel(); } - return request; + defined(requested); + + return requested; } /** diff --git a/src/sagas/lwp3-bootloader-protocol.ts b/src/sagas/lwp3-bootloader-protocol.ts index 4918dccc..55f5922b 100644 --- a/src/sagas/lwp3-bootloader-protocol.ts +++ b/src/sagas/lwp3-bootloader-protocol.ts @@ -21,6 +21,7 @@ import { BootloaderRequestActionType, checksumResponse, didError, + didFailToRequest, didRequest, eraseResponse, errorResponse, @@ -120,7 +121,12 @@ function* encodeRequest(): Generator { BootloaderConnectionActionType.DidFailToSend, ), }); - yield* put(didRequest(action.id, failedToSend?.err)); + + if (failedToSend) { + yield* put(didFailToRequest(action.id, failedToSend.err)); + } else { + yield* put(didRequest(action.id)); + } } }