mirror of
https://github.com/trezor/trezor-suite.git
synced 2026-03-06 23:39:38 +01:00
refactor(connect): random thp code polish
This commit is contained in:
@@ -121,9 +121,7 @@ const processThpPairingResponse = (device: Device, payload: UiResponseThpPairing
|
||||
const waitForPairingCancel = (device: Device) => {
|
||||
const readAbort = new AbortController();
|
||||
device.getThpState()?.setExpectedResponses([0x04]); // expect Cancel
|
||||
const readCancel = device.getCurrentSession().receive({
|
||||
signal: readAbort.signal,
|
||||
});
|
||||
const readCancel = device.getCurrentSession().receive({ signal: readAbort.signal });
|
||||
|
||||
return {
|
||||
readAbort,
|
||||
|
||||
@@ -95,24 +95,18 @@ export const getExpectedResponses = (bytes: Buffer) => {
|
||||
// get expected responses from ThpState (stored as numbers)
|
||||
// and join them with the channel to receive 3 bytes header
|
||||
export const getExpectedHeaders = (state: ThpState): Buffer[] =>
|
||||
[
|
||||
...state.expectedResponses,
|
||||
THP_ERROR_HEADER_BYTE, // error could be sent any time
|
||||
].map(resp => {
|
||||
let magic;
|
||||
switch (resp) {
|
||||
case THP_CONTINUATION_PACKET:
|
||||
magic = Buffer.from([resp]); // THP_CONTINUATION_PACKET is not masked with sequence bit
|
||||
break;
|
||||
case THP_READ_ACK_HEADER_BYTE:
|
||||
magic = addAckBit(resp, state.sendBit);
|
||||
break;
|
||||
default:
|
||||
magic = addSequenceBit(resp, state.recvBit);
|
||||
}
|
||||
|
||||
return Buffer.concat([magic, state.channel]);
|
||||
});
|
||||
[...state.expectedResponses, THP_ERROR_HEADER_BYTE] // error could be sent any time
|
||||
.map(resp => {
|
||||
switch (resp) {
|
||||
case THP_CONTINUATION_PACKET:
|
||||
return Buffer.from([resp]); // THP_CONTINUATION_PACKET is not masked with sequence bit
|
||||
case THP_READ_ACK_HEADER_BYTE:
|
||||
return addAckBit(resp, state.sendBit);
|
||||
default:
|
||||
return addSequenceBit(resp, state.recvBit);
|
||||
}
|
||||
})
|
||||
.map(magic => Buffer.concat([magic, state.channel]));
|
||||
|
||||
export const isExpectedResponse = (bytes: Buffer, state: ThpState) => {
|
||||
if (bytes.length < 3) {
|
||||
|
||||
@@ -46,7 +46,11 @@ export const sendThpMessage = async ({
|
||||
|
||||
let attempt = 0;
|
||||
|
||||
const apiReadWithExpectedHeaders = readWithExpectedHeaders(apiRead, { signal, graceful });
|
||||
const apiReadWithExpectedHeaders = readWithExpectedHeaders(apiRead, {
|
||||
signal,
|
||||
graceful,
|
||||
logger,
|
||||
});
|
||||
|
||||
// create sequence of scheduled actions controlled by one AbortSignal (from Transport call/send)
|
||||
// 1. send message
|
||||
@@ -72,6 +76,7 @@ export const sendThpMessage = async ({
|
||||
),
|
||||
{
|
||||
signal: attemptSignal,
|
||||
graceful,
|
||||
deadline: Date.now() + THP_ACK_DEADLINE,
|
||||
},
|
||||
);
|
||||
|
||||
@@ -411,6 +411,7 @@ export abstract class AbstractApiTransport extends AbstractTransport {
|
||||
apiRead,
|
||||
signal,
|
||||
graceful: true,
|
||||
logger: this.logger,
|
||||
});
|
||||
|
||||
if (!decoded.success) {
|
||||
|
||||
@@ -36,13 +36,10 @@ async function readAndAssert<T extends Receiver>(
|
||||
}
|
||||
|
||||
const bytes = chunk.payload;
|
||||
const expected = expectedHeaders.find(header => {
|
||||
if (bytes.length < header.length) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return bytes.subarray(0, header.length).compare(header) === 0 ? true : false;
|
||||
});
|
||||
const expected = expectedHeaders.find(
|
||||
header =>
|
||||
header.length <= bytes.length && bytes.subarray(0, header.length).compare(header) === 0,
|
||||
);
|
||||
|
||||
if (expected) {
|
||||
logger?.debug('readAndAssert done');
|
||||
|
||||
Reference in New Issue
Block a user