split didRequest and didFailToRequest

This commit is contained in:
David Lechner
2021-01-23 19:34:49 -06:00
parent 2049edf874
commit a9d827d21d
5 changed files with 70 additions and 18 deletions
+2
View File
@@ -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
+40 -9
View File
@@ -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<BootloaderDidRequestType> & {
/**
* 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<BootloaderDidFailToRequestType> & {
/**
* 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 };
}
/**
+3 -2
View File
@@ -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
+18 -6
View File
@@ -34,6 +34,8 @@ import {
BootloaderChecksumResponseAction,
BootloaderConnectionAction,
BootloaderConnectionActionType,
BootloaderDidFailToRequestAction,
BootloaderDidFailToRequestType,
BootloaderDidRequestAction,
BootloaderDidRequestType,
BootloaderEraseResponseAction,
@@ -85,15 +87,25 @@ function* disconnectAndCancel(): SagaGenerator<void> {
}
function* waitForDidRequest(id: number): SagaGenerator<BootloaderDidRequestAction> {
const request = yield* take<BootloaderDidRequestAction>(
(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<BootloaderDidRequestAction>(
(a: Action) => a.type === BootloaderDidRequestType && a.id === id,
),
failedToRequest: take<BootloaderDidFailToRequestAction>(
(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;
}
/**
+7 -1
View File
@@ -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));
}
}
}