refactor(connect): random thp code polish

This commit is contained in:
Marek Polak
2025-10-03 13:54:19 +02:00
committed by Marek Polák
parent 61e0e38da9
commit bdd7b7bb61
5 changed files with 24 additions and 29 deletions

View File

@@ -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,

View File

@@ -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) {

View File

@@ -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,
},
);

View File

@@ -411,6 +411,7 @@ export abstract class AbstractApiTransport extends AbstractTransport {
apiRead,
signal,
graceful: true,
logger: this.logger,
});
if (!decoded.success) {

View File

@@ -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');