mirror of
https://github.com/pybricks/pybricks-code.git
synced 2026-09-12 09:36:27 +00:00
split didRequest and didFailToRequest
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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 };
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user