diff --git a/src/actions/lwp3-bootloader.ts b/src/actions/lwp3-bootloader.ts index c0066c1b..fde0834d 100644 --- a/src/actions/lwp3-bootloader.ts +++ b/src/actions/lwp3-bootloader.ts @@ -37,6 +37,10 @@ export enum BootloaderConnectionActionType { * Finished sending a message. */ DidSend = 'bootloader.action.connection.did.send', + /** + * Sending a message failed with error. + */ + DidFailToSend = 'bootloader.action.connection.did.failToSend', /** * The connection received a message. */ @@ -152,12 +156,18 @@ export function send( return { type: BootloaderConnectionActionType.Send, data, withResponse }; } -export type BootloaderConnectionDidSendAction = Action & { - err?: Error; +export type BootloaderConnectionDidSendAction = Action; + +export function didSend(): BootloaderConnectionDidSendAction { + return { type: BootloaderConnectionActionType.DidSend }; +} + +export type BootloaderConnectionDidFailToSendAction = Action & { + err: Error; }; -export function didSend(err?: Error): BootloaderConnectionDidSendAction { - return { type: BootloaderConnectionActionType.DidSend, err }; +export function didFailToSend(err: Error): BootloaderConnectionDidFailToSendAction { + return { type: BootloaderConnectionActionType.DidFailToSend, err }; } export type BootloaderConnectionDidReceiveAction = Action & { @@ -184,7 +194,7 @@ export type BootloaderConnectionAction = | BootloaderConnectionDidErrorAction | BootloaderConnectionSendAction | BootloaderConnectionDidSendAction - | BootloaderConnectionDidSendAction + | BootloaderConnectionDidFailToSendAction | BootloaderConnectionDidReceiveAction | BootloaderConnectionDidDisconnectAction; diff --git a/src/sagas/lwp3-bootloader-ble.ts b/src/sagas/lwp3-bootloader-ble.ts index 3d825535..69ad67cd 100644 --- a/src/sagas/lwp3-bootloader-ble.ts +++ b/src/sagas/lwp3-bootloader-ble.ts @@ -13,6 +13,7 @@ import { didConnect, didDisconnect, didFailToConnect, + didFailToSend, didReceive, didSend, } from '../actions/lwp3-bootloader'; @@ -34,7 +35,7 @@ function* write( } yield* put(didSend()); } catch (err) { - yield* put(didSend(err)); + yield* put(didFailToSend(err)); } } diff --git a/src/sagas/lwp3-bootloader-protocol.ts b/src/sagas/lwp3-bootloader-protocol.ts index cc858eb3..4918dccc 100644 --- a/src/sagas/lwp3-bootloader-protocol.ts +++ b/src/sagas/lwp3-bootloader-protocol.ts @@ -3,10 +3,18 @@ // File: sagas/lwp3-bootloader-protocol.ts // Handles LEGO Wireless Protocol v3 Bootloader protocol. -import { actionChannel, fork, put, take, takeEvery } from 'typed-redux-saga/macro'; +import { + actionChannel, + fork, + put, + race, + take, + takeEvery, +} from 'typed-redux-saga/macro'; import { Action } from '../actions'; import { BootloaderConnectionActionType, + BootloaderConnectionDidFailToSendAction, BootloaderConnectionDidReceiveAction, BootloaderConnectionDidSendAction, BootloaderRequestAction, @@ -104,10 +112,15 @@ function* encodeRequest(): Generator { continue; } - const sent = yield* take( - BootloaderConnectionActionType.DidSend, - ); - yield* put(didRequest(action.id, sent.err)); + const { failedToSend } = yield* race({ + sent: take( + BootloaderConnectionActionType.DidSend, + ), + failedToSend: take( + BootloaderConnectionActionType.DidFailToSend, + ), + }); + yield* put(didRequest(action.id, failedToSend?.err)); } }