@onekeyfe/hd-core 1.2.8-alpha.114 → 1.2.8-alpha.115
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/__tests__/logger.test.ts +23 -0
- package/__tests__/protocol-v2.test.ts +272 -0
- package/__tests__/search-devices.test.ts +0 -36
- package/dist/api/FirmwareUpdateV4.d.ts +3 -0
- package/dist/api/FirmwareUpdateV4.d.ts.map +1 -1
- package/dist/index.d.ts +0 -6
- package/dist/index.js +160 -37
- package/dist/types/device.d.ts +0 -1
- package/dist/types/device.d.ts.map +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/api/FirmwareUpdateV4.ts +227 -52
- package/src/types/device.ts +0 -6
- package/src/utils/logger.ts +4 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { LoggerNames, enableLog, getLogger } from '../src/utils/logger';
|
|
2
|
+
|
|
3
|
+
describe('logger', () => {
|
|
4
|
+
afterEach(() => {
|
|
5
|
+
enableLog(false);
|
|
6
|
+
});
|
|
7
|
+
|
|
8
|
+
test('enables method logs that share a prefix with common-connect-sdk', () => {
|
|
9
|
+
const consoleSpy = jest.spyOn(console, 'log').mockImplementation(() => undefined);
|
|
10
|
+
try {
|
|
11
|
+
enableLog(true);
|
|
12
|
+
getLogger(LoggerNames.Method).debug('[FirmwareUpdateV4] BLE FileWrite window');
|
|
13
|
+
|
|
14
|
+
expect(getLogger(LoggerNames.Method)).toBe(getLogger(LoggerNames.HdCommonConnectSdk));
|
|
15
|
+
expect(consoleSpy).toHaveBeenCalledWith(
|
|
16
|
+
LoggerNames.Method,
|
|
17
|
+
'[FirmwareUpdateV4] BLE FileWrite window'
|
|
18
|
+
);
|
|
19
|
+
} finally {
|
|
20
|
+
consoleSpy.mockRestore();
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
});
|
|
@@ -44,6 +44,7 @@ import FirmwareUpdateV3 from '../src/api/FirmwareUpdateV3';
|
|
|
44
44
|
import FirmwareUpdateV4, {
|
|
45
45
|
assertProtocolV2FirmwareTargetsSupported,
|
|
46
46
|
assertProtocolV2ReconnectIdentity,
|
|
47
|
+
supportsProtocolV2BleFileWriteWindow,
|
|
47
48
|
} from '../src/api/FirmwareUpdateV4';
|
|
48
49
|
import GetPassphraseState from '../src/api/GetPassphraseState';
|
|
49
50
|
import GetOnekeyFeatures from '../src/api/GetOnekeyFeatures';
|
|
@@ -8883,6 +8884,256 @@ describe('Protocol V2 firmware update targets', () => {
|
|
|
8883
8884
|
expect((method as any).protocolV2SourceUpdateProcess).not.toHaveBeenCalled();
|
|
8884
8885
|
});
|
|
8885
8886
|
|
|
8887
|
+
test.each([
|
|
8888
|
+
['1.0.3', '1.0.3', true],
|
|
8889
|
+
['1.0.10', '1.0.3', true],
|
|
8890
|
+
['1.0.2', '1.0.3', false],
|
|
8891
|
+
['0.0.0.1', '1.0.3', false],
|
|
8892
|
+
['1.0.2', undefined, true],
|
|
8893
|
+
['1.0.1', undefined, false],
|
|
8894
|
+
] as const)(
|
|
8895
|
+
'gates the BLE file write window on bootloader %s with minimum %s',
|
|
8896
|
+
(bootloaderVersion, minBootloaderVersion, expected) => {
|
|
8897
|
+
expect(supportsProtocolV2BleFileWriteWindow(bootloaderVersion, minBootloaderVersion)).toBe(
|
|
8898
|
+
expected
|
|
8899
|
+
);
|
|
8900
|
+
}
|
|
8901
|
+
);
|
|
8902
|
+
|
|
8903
|
+
test.each([
|
|
8904
|
+
['react-native', 'bootloader', true],
|
|
8905
|
+
['desktop-web-ble', 'bootloader', true],
|
|
8906
|
+
['lowlevel', 'bootloader', false],
|
|
8907
|
+
['webusb', 'bootloader', false],
|
|
8908
|
+
['react-native', 'normal', false],
|
|
8909
|
+
] as const)(
|
|
8910
|
+
'enables the BLE file write window for %s in %s mode only with a supported bootloader',
|
|
8911
|
+
(env, mode, expected) => {
|
|
8912
|
+
const getSettingsSpy = jest.spyOn(DataManager, 'getSettings').mockReturnValue(env);
|
|
8913
|
+
const method = new FirmwareUpdateV4({
|
|
8914
|
+
id: 1,
|
|
8915
|
+
payload: {
|
|
8916
|
+
method: 'firmwareUpdateV4',
|
|
8917
|
+
},
|
|
8918
|
+
});
|
|
8919
|
+
(method as any).device = stubDevice({
|
|
8920
|
+
features: { mode, bootloaderMode: mode === 'bootloader', bootloaderVersion: '1.0.3' },
|
|
8921
|
+
});
|
|
8922
|
+
|
|
8923
|
+
try {
|
|
8924
|
+
expect((method as any).shouldUseProtocolV2BleFileWriteWindow('1.0.3')).toBe(expected);
|
|
8925
|
+
expect((method as any).shouldUseProtocolV2BleFileWriteWindow('1.0.4')).toBe(false);
|
|
8926
|
+
} finally {
|
|
8927
|
+
getSettingsSpy.mockRestore();
|
|
8928
|
+
}
|
|
8929
|
+
}
|
|
8930
|
+
);
|
|
8931
|
+
|
|
8932
|
+
describe('windowed BLE file write', () => {
|
|
8933
|
+
const confirm = (request: { file: { offset: number; data: ArrayBuffer } }) => ({
|
|
8934
|
+
type: 'FilesystemFile',
|
|
8935
|
+
message: { processed_byte: request.file.offset + request.file.data.byteLength },
|
|
8936
|
+
});
|
|
8937
|
+
const streamAll = (requests: any[]) =>
|
|
8938
|
+
jest.fn(async (_name: string, _resType: string, first: any, options: any) => {
|
|
8939
|
+
const { next, onResponse } = options.fileWritePipeline;
|
|
8940
|
+
let request = first;
|
|
8941
|
+
let last;
|
|
8942
|
+
while (request) {
|
|
8943
|
+
requests.push(request);
|
|
8944
|
+
last = confirm(request);
|
|
8945
|
+
onResponse(last);
|
|
8946
|
+
request = await next();
|
|
8947
|
+
}
|
|
8948
|
+
return last;
|
|
8949
|
+
});
|
|
8950
|
+
const createMethod = (typedCall: jest.Mock) => {
|
|
8951
|
+
const method = new FirmwareUpdateV4({
|
|
8952
|
+
id: 1,
|
|
8953
|
+
payload: {
|
|
8954
|
+
method: 'firmwareUpdateV4',
|
|
8955
|
+
},
|
|
8956
|
+
});
|
|
8957
|
+
(method as any).device = stubDevice({ getCommands: () => ({ typedCall }) });
|
|
8958
|
+
(method as any).shouldUseProtocolV2BleFileWriteWindow = jest.fn().mockReturnValue(true);
|
|
8959
|
+
(method as any).getProtocolV2FirmwareChunkSize = jest.fn().mockReturnValue(1000);
|
|
8960
|
+
(method as any).recoverProtocolV2FileTransfer = jest.fn().mockResolvedValue(undefined);
|
|
8961
|
+
method.postProgressMessage = jest.fn();
|
|
8962
|
+
return method;
|
|
8963
|
+
};
|
|
8964
|
+
const transfer = async (method: FirmwareUpdateV4) => {
|
|
8965
|
+
const source = await openFirmwareByteSource({ binary: new Uint8Array(2500).buffer });
|
|
8966
|
+
try {
|
|
8967
|
+
const processedSize: number = await (method as any).protocolV2SourceUpdateProcess({
|
|
8968
|
+
source,
|
|
8969
|
+
filePath: 'vol0:/application_p1.bin',
|
|
8970
|
+
processedSize: 500,
|
|
8971
|
+
totalSize: 3000,
|
|
8972
|
+
});
|
|
8973
|
+
return processedSize;
|
|
8974
|
+
} finally {
|
|
8975
|
+
await source?.close();
|
|
8976
|
+
}
|
|
8977
|
+
};
|
|
8978
|
+
|
|
8979
|
+
test('streams the file through one FileWrite call and reports confirmed chunks', async () => {
|
|
8980
|
+
const requests: any[] = [];
|
|
8981
|
+
const typedCall = streamAll(requests);
|
|
8982
|
+
const method = createMethod(typedCall);
|
|
8983
|
+
|
|
8984
|
+
await expect(transfer(method)).resolves.toBe(3000);
|
|
8985
|
+
|
|
8986
|
+
expect(typedCall).toHaveBeenCalledTimes(1);
|
|
8987
|
+
expect(typedCall).toHaveBeenCalledWith(
|
|
8988
|
+
'FilesystemFileWrite',
|
|
8989
|
+
'FilesystemFile',
|
|
8990
|
+
expect.anything(),
|
|
8991
|
+
expect.objectContaining({
|
|
8992
|
+
writeWithResponse: false,
|
|
8993
|
+
fileWritePipeline: expect.objectContaining({
|
|
8994
|
+
next: expect.any(Function),
|
|
8995
|
+
onResponse: expect.any(Function),
|
|
8996
|
+
}),
|
|
8997
|
+
})
|
|
8998
|
+
);
|
|
8999
|
+
expect(requests.map(request => request.file.offset)).toEqual([0, 1000, 2000]);
|
|
9000
|
+
expect(requests.map(request => request.file.data.byteLength)).toEqual([1000, 1000, 500]);
|
|
9001
|
+
expect(requests.map(request => request.overwrite)).toEqual([true, false, false]);
|
|
9002
|
+
expect(requests.map(request => request.ui_percentage)).toEqual([50, 84, 99]);
|
|
9003
|
+
expect(
|
|
9004
|
+
requests.every(
|
|
9005
|
+
request =>
|
|
9006
|
+
request.append === false &&
|
|
9007
|
+
request.file.total_size === 2500 &&
|
|
9008
|
+
request.file.path === 'vol0:/application_p1.bin'
|
|
9009
|
+
)
|
|
9010
|
+
).toBe(true);
|
|
9011
|
+
const transferredBytes = (method.postProgressMessage as jest.Mock).mock.calls.map(
|
|
9012
|
+
([, , metrics]) => metrics.transferredBytes
|
|
9013
|
+
);
|
|
9014
|
+
expect(transferredBytes).toEqual([1500, 2500, 3000]);
|
|
9015
|
+
});
|
|
9016
|
+
|
|
9017
|
+
test('caps windowed staging writes at the generic BLE chunk', async () => {
|
|
9018
|
+
const requests: any[] = [];
|
|
9019
|
+
const method = createMethod(streamAll(requests));
|
|
9020
|
+
delete (method as any).getProtocolV2FirmwareChunkSize;
|
|
9021
|
+
(method as any).params = { platform: 'native', chunkSize: 4096 };
|
|
9022
|
+
|
|
9023
|
+
await expect(transfer(method)).resolves.toBe(3000);
|
|
9024
|
+
|
|
9025
|
+
expect(requests.map(request => request.file.offset)).toEqual([0, 1800]);
|
|
9026
|
+
expect(requests.map(request => request.file.data.byteLength)).toEqual([1800, 700]);
|
|
9027
|
+
});
|
|
9028
|
+
|
|
9029
|
+
test.each([
|
|
9030
|
+
['react-native', 10_000],
|
|
9031
|
+
['desktop-web-ble', 10_000],
|
|
9032
|
+
] as const)('bounds each windowed response wait in %s', async (env, timeoutMs) => {
|
|
9033
|
+
const getSettingsSpy = jest.spyOn(DataManager, 'getSettings').mockReturnValue(env);
|
|
9034
|
+
const typedCall = streamAll([]);
|
|
9035
|
+
|
|
9036
|
+
try {
|
|
9037
|
+
await transfer(createMethod(typedCall));
|
|
9038
|
+
} finally {
|
|
9039
|
+
getSettingsSpy.mockRestore();
|
|
9040
|
+
}
|
|
9041
|
+
|
|
9042
|
+
expect(typedCall.mock.calls[0][3]).toEqual(expect.objectContaining({ timeoutMs }));
|
|
9043
|
+
});
|
|
9044
|
+
|
|
9045
|
+
test('restarts the whole file after a failed windowed write', async () => {
|
|
9046
|
+
const requests: any[] = [];
|
|
9047
|
+
const succeed = streamAll(requests);
|
|
9048
|
+
const typedCall = jest
|
|
9049
|
+
.fn()
|
|
9050
|
+
.mockRejectedValueOnce(new Error('Protocol V2 file write response does not match'))
|
|
9051
|
+
.mockImplementation(succeed);
|
|
9052
|
+
const method = createMethod(typedCall);
|
|
9053
|
+
|
|
9054
|
+
await expect(transfer(method)).resolves.toBe(3000);
|
|
9055
|
+
|
|
9056
|
+
expect((method as any).recoverProtocolV2FileTransfer).toHaveBeenCalledTimes(1);
|
|
9057
|
+
expect(typedCall).toHaveBeenCalledTimes(2);
|
|
9058
|
+
expect(typedCall.mock.calls[1][2]).toEqual(
|
|
9059
|
+
expect.objectContaining({ overwrite: true, file: expect.objectContaining({ offset: 0 }) })
|
|
9060
|
+
);
|
|
9061
|
+
expect(requests.map(request => request.file.offset)).toEqual([0, 1000, 2000]);
|
|
9062
|
+
});
|
|
9063
|
+
|
|
9064
|
+
test('stops sending on cancel and raises it after the transport call returns', async () => {
|
|
9065
|
+
const abortController = new AbortController();
|
|
9066
|
+
const requests: any[] = [];
|
|
9067
|
+
const succeed = streamAll(requests);
|
|
9068
|
+
const typedCall = jest.fn((name: string, resType: string, first: any, options: any) =>
|
|
9069
|
+
succeed(name, resType, first, {
|
|
9070
|
+
...options,
|
|
9071
|
+
fileWritePipeline: {
|
|
9072
|
+
...options.fileWritePipeline,
|
|
9073
|
+
onResponse: (response: any) => {
|
|
9074
|
+
options.fileWritePipeline.onResponse(response);
|
|
9075
|
+
abortController.abort();
|
|
9076
|
+
},
|
|
9077
|
+
},
|
|
9078
|
+
})
|
|
9079
|
+
);
|
|
9080
|
+
const method = createMethod(typedCall);
|
|
9081
|
+
method.abortSignal = abortController.signal;
|
|
9082
|
+
|
|
9083
|
+
await expect(transfer(method)).rejects.toMatchObject({
|
|
9084
|
+
errorCode: HardwareErrorCode.CallQueueActionCancelled,
|
|
9085
|
+
});
|
|
9086
|
+
expect(requests.map(request => request.file.offset)).toEqual([0]);
|
|
9087
|
+
expect((method as any).recoverProtocolV2FileTransfer).not.toHaveBeenCalled();
|
|
9088
|
+
});
|
|
9089
|
+
|
|
9090
|
+
test('raises a source read error after the windowed call and retries the file', async () => {
|
|
9091
|
+
const requests: any[] = [];
|
|
9092
|
+
const typedCall = streamAll(requests);
|
|
9093
|
+
const method = createMethod(typedCall);
|
|
9094
|
+
const bytes = new Uint8Array(2500);
|
|
9095
|
+
let failed = false;
|
|
9096
|
+
const source = {
|
|
9097
|
+
size: bytes.length,
|
|
9098
|
+
readAt: jest.fn((offset: number, length: number) => {
|
|
9099
|
+
if (offset === 1000 && !failed) {
|
|
9100
|
+
failed = true;
|
|
9101
|
+
return Promise.reject(new Error('artifact read failed'));
|
|
9102
|
+
}
|
|
9103
|
+
return Promise.resolve(bytes.slice(offset, offset + length).buffer);
|
|
9104
|
+
}),
|
|
9105
|
+
close: jest.fn(),
|
|
9106
|
+
};
|
|
9107
|
+
|
|
9108
|
+
await expect(
|
|
9109
|
+
(method as any).protocolV2SourceUpdateProcess({
|
|
9110
|
+
source,
|
|
9111
|
+
filePath: 'vol0:/application_p1.bin',
|
|
9112
|
+
processedSize: 0,
|
|
9113
|
+
totalSize: 2500,
|
|
9114
|
+
})
|
|
9115
|
+
).resolves.toBe(2500);
|
|
9116
|
+
|
|
9117
|
+
expect(typedCall).toHaveBeenCalledTimes(2);
|
|
9118
|
+
expect((method as any).recoverProtocolV2FileTransfer).toHaveBeenCalledTimes(1);
|
|
9119
|
+
expect(requests.map(request => request.file.offset)).toEqual([0, 0, 1000, 2000]);
|
|
9120
|
+
});
|
|
9121
|
+
|
|
9122
|
+
test('rejects a windowed write that does not confirm the whole file', async () => {
|
|
9123
|
+
const typedCall = jest.fn((_name: string, _resType: string, first: any) =>
|
|
9124
|
+
Promise.resolve(confirm(first))
|
|
9125
|
+
);
|
|
9126
|
+
const method = createMethod(typedCall);
|
|
9127
|
+
|
|
9128
|
+
await expect(transfer(method)).rejects.toMatchObject({
|
|
9129
|
+
errorCode: HardwareErrorCode.EmmcFileWriteFirmwareError,
|
|
9130
|
+
message: expect.stringContaining('invalid processed_byte 1000 for file size 2500'),
|
|
9131
|
+
});
|
|
9132
|
+
expect(typedCall).toHaveBeenCalledTimes(3);
|
|
9133
|
+
expect((method as any).recoverProtocolV2FileTransfer).toHaveBeenCalledTimes(2);
|
|
9134
|
+
});
|
|
9135
|
+
});
|
|
9136
|
+
|
|
8886
9137
|
test('uses absolute processed_byte offsets and disables append for firmware file writes', async () => {
|
|
8887
9138
|
const method = new FirmwareUpdateV4({
|
|
8888
9139
|
id: 1,
|
|
@@ -9612,6 +9863,27 @@ describe('Protocol V2 firmware update targets', () => {
|
|
|
9612
9863
|
expect(writePayloads.map(payload => payload.file.data.byteLength)).toEqual([1960, 1]);
|
|
9613
9864
|
});
|
|
9614
9865
|
|
|
9866
|
+
test.each([
|
|
9867
|
+
[false, 'vol0:/application_p1.bin', 1960],
|
|
9868
|
+
[true, 'vol0:/application_p1.bin', 1800],
|
|
9869
|
+
[true, 'vol0:/bundles/images/animation.okpkg', 1800],
|
|
9870
|
+
])(
|
|
9871
|
+
'sizes BLE write chunks for fileWriteWindow=%s and %s',
|
|
9872
|
+
(fileWriteWindow, filePath, expected) => {
|
|
9873
|
+
const method = new FirmwareUpdateV4({
|
|
9874
|
+
id: 1,
|
|
9875
|
+
payload: {
|
|
9876
|
+
method: 'firmwareUpdateV4',
|
|
9877
|
+
},
|
|
9878
|
+
});
|
|
9879
|
+
(method as any).params = { platform: 'native', chunkSize: 4096 };
|
|
9880
|
+
|
|
9881
|
+
expect(
|
|
9882
|
+
(method as any).getProtocolV2FirmwareChunkSize('write', filePath, fileWriteWindow)
|
|
9883
|
+
).toBe(expected);
|
|
9884
|
+
}
|
|
9885
|
+
);
|
|
9886
|
+
|
|
9615
9887
|
test('keeps confirmation active after the Request write until terminal Success arrives', async () => {
|
|
9616
9888
|
const method = new FirmwareUpdateV4({
|
|
9617
9889
|
id: 1,
|
|
@@ -338,42 +338,6 @@ describe('SearchDevices', () => {
|
|
|
338
338
|
}
|
|
339
339
|
);
|
|
340
340
|
|
|
341
|
-
test('BLE discovery returns the advertised color letter without a device identity', async () => {
|
|
342
|
-
mockIsBleConnect.mockReturnValue(true);
|
|
343
|
-
|
|
344
|
-
const descriptor = {
|
|
345
|
-
id: 'ble-peripheral-id',
|
|
346
|
-
path: 'ble-peripheral-id',
|
|
347
|
-
name: 'Neo A1B2',
|
|
348
|
-
commType: 'ble',
|
|
349
|
-
bleColorCode: 'E',
|
|
350
|
-
};
|
|
351
|
-
const method = new SearchDevices({
|
|
352
|
-
id: 1,
|
|
353
|
-
payload: {
|
|
354
|
-
method: 'searchDevices',
|
|
355
|
-
},
|
|
356
|
-
} as any);
|
|
357
|
-
method.init();
|
|
358
|
-
method.connector = {
|
|
359
|
-
enumerate: jest.fn().mockResolvedValue({
|
|
360
|
-
descriptors: [descriptor],
|
|
361
|
-
}),
|
|
362
|
-
} as any;
|
|
363
|
-
|
|
364
|
-
await expect(method.run()).resolves.toEqual([
|
|
365
|
-
{
|
|
366
|
-
...descriptor,
|
|
367
|
-
connectId: 'ble-peripheral-id',
|
|
368
|
-
serialNo: null,
|
|
369
|
-
uuid: '',
|
|
370
|
-
deviceId: null,
|
|
371
|
-
deviceType: 'neo',
|
|
372
|
-
bleColorCode: 'E',
|
|
373
|
-
},
|
|
374
|
-
]);
|
|
375
|
-
});
|
|
376
|
-
|
|
377
341
|
test.each([
|
|
378
342
|
['Pro2 A1B2 - Find My', undefined, 'Pro 2 A1B2'],
|
|
379
343
|
['Pro2 5E9D - Finde My', undefined, 'Pro 2 5E9D'],
|
|
@@ -2,6 +2,7 @@ import { EDeviceType } from '@onekeyfe/hd-shared';
|
|
|
2
2
|
import { FirmwareUpdateBaseMethod } from './firmware/FirmwareUpdateBaseMethod';
|
|
3
3
|
import type { FirmwareUpdateV4Params } from '../types/api/firmwareUpdate';
|
|
4
4
|
export declare function assertProtocolV2FirmwareTargetsSupported(deviceType: EDeviceType | string | undefined, params: FirmwareUpdateV4Params, hasExplicitTargetSelection?: boolean): void;
|
|
5
|
+
export declare function supportsProtocolV2BleFileWriteWindow(bootloaderVersion: string, minBootloaderVersion?: string | undefined): boolean;
|
|
5
6
|
export declare const isProtocolV2FirmwareFingerprintValid: (binary: ArrayBuffer | Uint8Array, fingerprint: string | undefined) => boolean;
|
|
6
7
|
export declare const assertProtocolV2ReconnectIdentity: (expectedSerialNumber?: string, actualSerialNumber?: string, expectedPath?: string, actualPath?: string) => void;
|
|
7
8
|
export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareUpdateV4Params> {
|
|
@@ -99,6 +100,8 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
|
|
|
99
100
|
private ensureProtocolV2DeviceAcquired;
|
|
100
101
|
private isProtocolV2ReconnectIdentityError;
|
|
101
102
|
private fileWriteChunk;
|
|
103
|
+
private shouldUseProtocolV2BleFileWriteWindow;
|
|
104
|
+
private writeProtocolV2SourceWindowed;
|
|
102
105
|
private recoverProtocolV2FileTransfer;
|
|
103
106
|
private acquireProtocolV2BleDevice;
|
|
104
107
|
private protocolV2StartFirmwareUpdate;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FirmwareUpdateV4.d.ts","sourceRoot":"","sources":["../../src/api/FirmwareUpdateV4.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkD,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"FirmwareUpdateV4.d.ts","sourceRoot":"","sources":["../../src/api/FirmwareUpdateV4.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -383,12 +383,6 @@ type SearchDevice = {
|
|
|
383
383
|
deviceType: IDeviceType;
|
|
384
384
|
name: string;
|
|
385
385
|
commType: OneKeyDeviceCommType;
|
|
386
|
-
/**
|
|
387
|
-
* React Native and Electron BLE discovery only. Serial-number color letter ('A'-'Z')
|
|
388
|
-
* advertised by Pro2 / Neo, possibly remembered from an earlier advertisement in this
|
|
389
|
-
* process. Absent when unknown; the letter's meaning depends on deviceType.
|
|
390
|
-
*/
|
|
391
|
-
bleColorCode?: string;
|
|
392
386
|
};
|
|
393
387
|
/** Identity confirmed over USB. The descriptor path is only a transport address. */
|
|
394
388
|
type UsbDeviceIdentity = {
|
package/dist/index.js
CHANGED
|
@@ -40784,6 +40784,9 @@ class Log$n {
|
|
|
40784
40784
|
}
|
|
40785
40785
|
const _logs = {};
|
|
40786
40786
|
const initLog = (prefix, enabled) => {
|
|
40787
|
+
const existing = _logs[prefix];
|
|
40788
|
+
if (existing)
|
|
40789
|
+
return existing;
|
|
40787
40790
|
const instance = new Log$n(prefix, !!enabled);
|
|
40788
40791
|
_logs[prefix] = instance;
|
|
40789
40792
|
return instance;
|
|
@@ -52631,6 +52634,7 @@ const PROTOCOL_V2_CONNECT_POLL_INTERVAL = 500;
|
|
|
52631
52634
|
const PROTOCOL_V2_CONNECT_SINGLE_TIMEOUT = 75 * 1000;
|
|
52632
52635
|
const PROTOCOL_V2_DEVICE_INFO_READY_TIMEOUT = 30 * 1000;
|
|
52633
52636
|
const PROTOCOL_V2_FILE_TRANSFER_RETRY_COUNT = 3;
|
|
52637
|
+
const PROTOCOL_V2_BLE_FILE_WRITE_WINDOW_MIN_BOOTLOADER_VERSION = '1.0.2';
|
|
52634
52638
|
const PROTOCOL_V2_TRANSFER_PROGRESS_HEARTBEAT_MS = 1000;
|
|
52635
52639
|
const PROTOCOL_V2_INSTALL_STATUS_CONFLICT_CODE = 'FirmwareInstallStatusConflict';
|
|
52636
52640
|
const PROTOCOL_V2_INSTALL_FAILED_CODE = 'FirmwareInstallFailed';
|
|
@@ -52678,6 +52682,11 @@ function assertProtocolV2FirmwareTargetsSupported(deviceType, params, hasExplici
|
|
|
52678
52682
|
: `Cannot safely update ${targetList} without a confirmed Pro2 device type`;
|
|
52679
52683
|
throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.DeviceNotSupportMethod, message);
|
|
52680
52684
|
}
|
|
52685
|
+
function supportsProtocolV2BleFileWriteWindow(bootloaderVersion, minBootloaderVersion = PROTOCOL_V2_BLE_FILE_WRITE_WINDOW_MIN_BOOTLOADER_VERSION) {
|
|
52686
|
+
return (!!minBootloaderVersion &&
|
|
52687
|
+
!!semver__default["default"].valid(bootloaderVersion) &&
|
|
52688
|
+
semver__default["default"].gte(bootloaderVersion, minBootloaderVersion));
|
|
52689
|
+
}
|
|
52681
52690
|
const getProtocolV2DeviceTransferProgress = (bytesBeforeChunk, bytesAfterChunk, totalBytes) => {
|
|
52682
52691
|
if (!Number.isFinite(totalBytes) || totalBytes <= 0) {
|
|
52683
52692
|
return 0;
|
|
@@ -53063,7 +53072,7 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
|
|
|
53063
53072
|
componentArtifacts: preparedPlan ? undefined : payload.componentArtifacts,
|
|
53064
53073
|
};
|
|
53065
53074
|
}
|
|
53066
|
-
getProtocolV2FirmwareChunkSize(direction, filePath) {
|
|
53075
|
+
getProtocolV2FirmwareChunkSize(direction, filePath, fileWriteWindow = false) {
|
|
53067
53076
|
var _a, _b;
|
|
53068
53077
|
const payloadChunkSize = Number((_a = this.params) === null || _a === void 0 ? void 0 : _a.chunkSize);
|
|
53069
53078
|
const env = DataManager.getSettings('env');
|
|
@@ -53073,6 +53082,9 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
|
|
|
53073
53082
|
if (direction === 'read') {
|
|
53074
53083
|
maxChunkSize = hdTransport.PROTOCOL_V2_BLE_FILE_READ_CHUNK_SIZE;
|
|
53075
53084
|
}
|
|
53085
|
+
else if (fileWriteWindow) {
|
|
53086
|
+
maxChunkSize = hdTransport.PROTOCOL_V2_BLE_FILE_CHUNK_SIZE;
|
|
53087
|
+
}
|
|
53076
53088
|
else {
|
|
53077
53089
|
maxChunkSize = PROTOCOL_V2_FIRMWARE_STAGING_PATHS.has(filePath !== null && filePath !== void 0 ? filePath : '')
|
|
53078
53090
|
? hdTransport.PROTOCOL_V2_BLE_FIRMWARE_FILE_CHUNK_SIZE
|
|
@@ -54117,11 +54129,18 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
|
|
|
54117
54129
|
}
|
|
54118
54130
|
if (totalSize > 0) {
|
|
54119
54131
|
const elapsedMs = Math.max(Date.now() - transferStartedAt, 0);
|
|
54132
|
+
const rateBytesPerSecond = elapsedMs > 0 ? Math.round((totalSize / elapsedMs) * 1000) : undefined;
|
|
54120
54133
|
this.postProgressMessage(100, 'transferData', {
|
|
54121
54134
|
transferredBytes: totalSize,
|
|
54122
54135
|
totalBytes: totalSize,
|
|
54123
|
-
rateBytesPerSecond
|
|
54136
|
+
rateBytesPerSecond,
|
|
54137
|
+
elapsedMs,
|
|
54138
|
+
});
|
|
54139
|
+
Log$6.debug('[FirmwareUpdateV4] Protocol V2 transfer completed', {
|
|
54140
|
+
files: resourcesToSync.length + installSources.length,
|
|
54141
|
+
totalBytes: totalSize,
|
|
54124
54142
|
elapsedMs,
|
|
54143
|
+
rateBytesPerSecond,
|
|
54125
54144
|
});
|
|
54126
54145
|
}
|
|
54127
54146
|
if (stagedInstallTargets.length === 0) {
|
|
@@ -54132,10 +54151,15 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
|
|
|
54132
54151
|
target_id: item.targetId,
|
|
54133
54152
|
path: item.path,
|
|
54134
54153
|
}));
|
|
54154
|
+
const installStartedAt = Date.now();
|
|
54135
54155
|
try {
|
|
54136
54156
|
yield this.protocolV2StartFirmwareUpdate({ targets });
|
|
54137
54157
|
yield hdShared.wait(PROTOCOL_V2_INSTALL_STATUS_INITIAL_DELAY);
|
|
54138
54158
|
yield this.waitForProtocolV2FirmwareUpdateComplete(targets, true);
|
|
54159
|
+
Log$6.debug('[FirmwareUpdateV4] Protocol V2 install completed', {
|
|
54160
|
+
targets: targets.length,
|
|
54161
|
+
elapsedMs: Math.max(Date.now() - installStartedAt, 0),
|
|
54162
|
+
});
|
|
54139
54163
|
}
|
|
54140
54164
|
finally {
|
|
54141
54165
|
(_a = this.device) === null || _a === void 0 ? void 0 : _a.clearCancelableAction();
|
|
@@ -54144,51 +54168,81 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
|
|
|
54144
54168
|
}
|
|
54145
54169
|
protocolV2SourceUpdateProcess({ source, filePath, processedSize, totalSize, transferStartedAt = Date.now(), }) {
|
|
54146
54170
|
return __awaiter(this, void 0, void 0, function* () {
|
|
54171
|
+
const reportConfirmedChunk = (chunkEnd) => {
|
|
54172
|
+
const transferredBytes = processedSize + chunkEnd;
|
|
54173
|
+
const now = Date.now();
|
|
54174
|
+
const elapsedMs = Math.max(now - transferStartedAt, 0);
|
|
54175
|
+
const progress = Math.min(Math.ceil((transferredBytes / totalSize) * 100), 99);
|
|
54176
|
+
const shouldPostProgress = transferredBytes >= this.protocolV2LastTransferredBytes &&
|
|
54177
|
+
(progress !== this.protocolV2LastTransferProgress ||
|
|
54178
|
+
now - this.protocolV2LastTransferProgressAt >=
|
|
54179
|
+
PROTOCOL_V2_TRANSFER_PROGRESS_HEARTBEAT_MS ||
|
|
54180
|
+
chunkEnd === source.size);
|
|
54181
|
+
if (shouldPostProgress) {
|
|
54182
|
+
this.protocolV2LastTransferProgress = progress;
|
|
54183
|
+
this.protocolV2LastTransferProgressAt = now;
|
|
54184
|
+
this.protocolV2LastTransferredBytes = transferredBytes;
|
|
54185
|
+
this.postProgressMessage(progress, 'transferData', {
|
|
54186
|
+
transferredBytes,
|
|
54187
|
+
totalBytes: totalSize,
|
|
54188
|
+
rateBytesPerSecond: elapsedMs > 0 ? Math.round((transferredBytes / elapsedMs) * 1000) : undefined,
|
|
54189
|
+
elapsedMs,
|
|
54190
|
+
});
|
|
54191
|
+
}
|
|
54192
|
+
};
|
|
54147
54193
|
let lastError;
|
|
54148
54194
|
for (let attempt = 1; attempt <= PROTOCOL_V2_FILE_TRANSFER_RETRY_COUNT; attempt += 1) {
|
|
54149
54195
|
this.throwIfAborted();
|
|
54196
|
+
const attemptStartedAt = Date.now();
|
|
54150
54197
|
try {
|
|
54151
|
-
|
|
54152
|
-
|
|
54153
|
-
|
|
54154
|
-
|
|
54155
|
-
|
|
54156
|
-
|
|
54157
|
-
|
|
54158
|
-
|
|
54159
|
-
|
|
54160
|
-
|
|
54161
|
-
|
|
54162
|
-
|
|
54163
|
-
|
|
54164
|
-
|
|
54165
|
-
|
|
54166
|
-
|
|
54167
|
-
|
|
54168
|
-
|
|
54169
|
-
|
|
54170
|
-
|
|
54171
|
-
|
|
54172
|
-
|
|
54173
|
-
|
|
54174
|
-
|
|
54175
|
-
|
|
54176
|
-
|
|
54177
|
-
|
|
54178
|
-
|
|
54179
|
-
|
|
54180
|
-
|
|
54181
|
-
|
|
54182
|
-
|
|
54183
|
-
|
|
54184
|
-
|
|
54185
|
-
|
|
54198
|
+
const windowed = this.shouldUseProtocolV2BleFileWriteWindow();
|
|
54199
|
+
const chunkSize = this.getProtocolV2FirmwareChunkSize('write', filePath, windowed);
|
|
54200
|
+
if (windowed) {
|
|
54201
|
+
yield this.writeProtocolV2SourceWindowed({
|
|
54202
|
+
source,
|
|
54203
|
+
filePath,
|
|
54204
|
+
chunkSize,
|
|
54205
|
+
processedSize,
|
|
54206
|
+
totalSize,
|
|
54207
|
+
onChunkConfirmed: reportConfirmedChunk,
|
|
54208
|
+
});
|
|
54209
|
+
}
|
|
54210
|
+
else {
|
|
54211
|
+
yield writeFirmwareByteSource({
|
|
54212
|
+
source,
|
|
54213
|
+
chunkSize,
|
|
54214
|
+
write: ({ data, sourceOffset, length, first }) => __awaiter(this, void 0, void 0, function* () {
|
|
54215
|
+
this.throwIfAborted();
|
|
54216
|
+
const chunkEnd = sourceOffset + length;
|
|
54217
|
+
const deviceProgress = getProtocolV2DeviceTransferProgress(processedSize + sourceOffset, processedSize + chunkEnd, totalSize);
|
|
54218
|
+
const response = yield this.fileWriteChunk(filePath, source.size, sourceOffset, data, first, deviceProgress);
|
|
54219
|
+
const rawProcessedByte = response.message.processed_byte;
|
|
54220
|
+
const nextOffset = rawProcessedByte === undefined ? chunkEnd : Number(rawProcessedByte);
|
|
54221
|
+
if (!Number.isFinite(nextOffset) || nextOffset !== chunkEnd) {
|
|
54222
|
+
throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.EmmcFileWriteFirmwareError, `invalid processed_byte ${rawProcessedByte} for offset ${sourceOffset}`);
|
|
54223
|
+
}
|
|
54224
|
+
reportConfirmedChunk(chunkEnd);
|
|
54225
|
+
return length;
|
|
54226
|
+
}),
|
|
54227
|
+
});
|
|
54228
|
+
}
|
|
54229
|
+
Log$6.debug('[FirmwareUpdateV4] Protocol V2 file transferred', {
|
|
54230
|
+
path: filePath,
|
|
54231
|
+
bytes: source.size,
|
|
54232
|
+
elapsedMs: Math.max(Date.now() - attemptStartedAt, 0),
|
|
54233
|
+
attempt,
|
|
54234
|
+
fileWriteWindow: windowed ? hdTransport.PROTOCOL_V2_FILE_WRITE_PIPELINE_WINDOW : 1,
|
|
54186
54235
|
});
|
|
54187
54236
|
return processedSize + source.size;
|
|
54188
54237
|
}
|
|
54189
54238
|
catch (error) {
|
|
54190
54239
|
this.throwIfAborted();
|
|
54191
54240
|
lastError = error;
|
|
54241
|
+
Log$6.debug('[FirmwareUpdateV4] Protocol V2 file transfer attempt failed', {
|
|
54242
|
+
path: filePath,
|
|
54243
|
+
attempt,
|
|
54244
|
+
error: getProtocolV2UnknownErrorText(error),
|
|
54245
|
+
});
|
|
54192
54246
|
if (attempt < PROTOCOL_V2_FILE_TRANSFER_RETRY_COUNT) {
|
|
54193
54247
|
yield this.recoverProtocolV2FileTransfer();
|
|
54194
54248
|
this.throwIfAborted();
|
|
@@ -54871,6 +54925,75 @@ class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod {
|
|
|
54871
54925
|
return writeRes;
|
|
54872
54926
|
});
|
|
54873
54927
|
}
|
|
54928
|
+
shouldUseProtocolV2BleFileWriteWindow(minBootloaderVersion = PROTOCOL_V2_BLE_FILE_WRITE_WINDOW_MIN_BOOTLOADER_VERSION) {
|
|
54929
|
+
var _a, _b;
|
|
54930
|
+
const env = DataManager.getSettings('env');
|
|
54931
|
+
if ((env !== 'react-native' && env !== 'desktop-web-ble') ||
|
|
54932
|
+
!this.isProtocolV2BootloaderMode()) {
|
|
54933
|
+
return false;
|
|
54934
|
+
}
|
|
54935
|
+
const bootloaderVersion = getDeviceBootloaderVersion(this.device.features).join('.');
|
|
54936
|
+
const enabled = supportsProtocolV2BleFileWriteWindow(bootloaderVersion, minBootloaderVersion);
|
|
54937
|
+
Log$6.debug('[FirmwareUpdateV4] BLE FileWrite window', {
|
|
54938
|
+
enabled,
|
|
54939
|
+
bootloaderVersion,
|
|
54940
|
+
bootloaderBuildId: (_b = (_a = this.device.features) === null || _a === void 0 ? void 0 : _a.verify) === null || _b === void 0 ? void 0 : _b.bootloaderBuildId,
|
|
54941
|
+
});
|
|
54942
|
+
return enabled;
|
|
54943
|
+
}
|
|
54944
|
+
writeProtocolV2SourceWindowed({ source, filePath, chunkSize, processedSize, totalSize, onChunkConfirmed, }) {
|
|
54945
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
54946
|
+
let sendOffset = 0;
|
|
54947
|
+
let sourceError;
|
|
54948
|
+
const readRequest = () => __awaiter(this, void 0, void 0, function* () {
|
|
54949
|
+
const offset = sendOffset;
|
|
54950
|
+
const length = Math.min(chunkSize, source.size - offset);
|
|
54951
|
+
const data = yield source.readAt(offset, length);
|
|
54952
|
+
sendOffset += length;
|
|
54953
|
+
return {
|
|
54954
|
+
file: { path: filePath, offset, total_size: source.size, data },
|
|
54955
|
+
overwrite: offset === 0,
|
|
54956
|
+
append: false,
|
|
54957
|
+
ui_percentage: getProtocolV2DeviceTransferProgress(processedSize + offset, processedSize + sendOffset, totalSize),
|
|
54958
|
+
};
|
|
54959
|
+
});
|
|
54960
|
+
const nextRequest = () => __awaiter(this, void 0, void 0, function* () {
|
|
54961
|
+
var _a;
|
|
54962
|
+
if (((_a = this.abortSignal) === null || _a === void 0 ? void 0 : _a.aborted) || sendOffset >= source.size)
|
|
54963
|
+
return undefined;
|
|
54964
|
+
try {
|
|
54965
|
+
return yield readRequest();
|
|
54966
|
+
}
|
|
54967
|
+
catch (error) {
|
|
54968
|
+
sourceError = error;
|
|
54969
|
+
return undefined;
|
|
54970
|
+
}
|
|
54971
|
+
});
|
|
54972
|
+
this.throwIfAborted();
|
|
54973
|
+
if (source.size === 0)
|
|
54974
|
+
return;
|
|
54975
|
+
const firstRequest = yield readRequest();
|
|
54976
|
+
const response = yield this.device
|
|
54977
|
+
.getCommands()
|
|
54978
|
+
.typedCall('FilesystemFileWrite', 'FilesystemFile', firstRequest, {
|
|
54979
|
+
timeoutMs: PROTOCOL_V2_FILE_WRITE_RESPONSE_TIMEOUT,
|
|
54980
|
+
writeWithResponse: false,
|
|
54981
|
+
fileWritePipeline: {
|
|
54982
|
+
next: nextRequest,
|
|
54983
|
+
onResponse: confirmed => {
|
|
54984
|
+
onChunkConfirmed(Number(confirmed.message.processed_byte));
|
|
54985
|
+
},
|
|
54986
|
+
},
|
|
54987
|
+
});
|
|
54988
|
+
this.throwIfAborted();
|
|
54989
|
+
if (sourceError)
|
|
54990
|
+
throw sourceError;
|
|
54991
|
+
const rawProcessedByte = response.message.processed_byte;
|
|
54992
|
+
if (Number(rawProcessedByte) !== source.size) {
|
|
54993
|
+
throw hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.EmmcFileWriteFirmwareError, `invalid processed_byte ${rawProcessedByte} for file size ${source.size}`);
|
|
54994
|
+
}
|
|
54995
|
+
});
|
|
54996
|
+
}
|
|
54874
54997
|
recoverProtocolV2FileTransfer() {
|
|
54875
54998
|
return __awaiter(this, void 0, void 0, function* () {
|
|
54876
54999
|
const env = DataManager.getSettings('env');
|
package/dist/types/device.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device.d.ts","sourceRoot":"","sources":["../../src/types/device.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"device.d.ts","sourceRoot":"","sources":["../../src/types/device.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,KAAK,UAAU,GAAG;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,GAAG,EAAE,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAMF,cAAM,GAAG;IACP,MAAM,EAAE,MAAM,CAAC;IAEf,OAAO,EAAE,OAAO,CAAC;IAEjB,QAAQ,EAAE,UAAU,EAAE,CAAC;gBAEX,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;IAM5C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAYxD,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE;IASlB,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE;IASpB,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE;IASnB,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE;CAQrB;AAID,eAAO,MAAM,OAAO,WAAY,MAAM,YAAY,OAAO,
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,KAAK,UAAU,GAAG;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,GAAG,EAAE,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAMF,cAAM,GAAG;IACP,MAAM,EAAE,MAAM,CAAC;IAEf,OAAO,EAAE,OAAO,CAAC;IAEjB,QAAQ,EAAE,UAAU,EAAE,CAAC;gBAEX,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;IAM5C,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;IAYxD,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE;IASlB,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE;IASpB,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE;IASnB,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE;CAQrB;AAID,eAAO,MAAM,OAAO,WAAY,MAAM,YAAY,OAAO,QAQxD,CAAC;AAEF,eAAO,MAAM,SAAS,aAAc,OAAO,SAI1C,CAAC;AAEF,eAAO,MAAM,iBAAiB,WAAY,MAAM,WAAW,OAAO,SAIjE,CAAC;AAEF,eAAO,MAAM,MAAM,oBAOlB,CAAC;AAEF,eAAO,MAAM,oBAAoB,4BAA6B,WAAW,KAAK,IAAI,SAEjF,CAAC;AAuCF,oBAAY,WAAW;IACrB,IAAI,oBAAoB;IACxB,SAAS,cAAc;IACvB,MAAM,WAAW;IACjB,cAAc,mBAAmB;IACjC,eAAe,oBAAoB;IACnC,UAAU,eAAe;IACzB,UAAU,eAAe;IACzB,kBAAkB,+BAA+B;IACjD,QAAQ,uBAAuB;IAC/B,eAAe,8BAA8B;IAC7C,mBAAmB,kCAAkC;IACrD,cAAc,6BAA6B;IAC3C,iBAAiB,iCAAiC;IAClD,iBAAiB,gCAAgC;IACjD,kBAAkB,kCAAkC;IACpD,OAAO,oBAAoB;IAC3B,MAAM,WAAW;IACjB,WAAW,kBAAkB;IAC7B,MAAM,aAAa;CACpB;AAED,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;CAoBrB,CAAC;AAEF,eAAO,MAAM,SAAS,QAAS,WAAW,QAAmB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@onekeyfe/hd-core",
|
|
3
|
-
"version": "1.2.8-alpha.
|
|
3
|
+
"version": "1.2.8-alpha.115",
|
|
4
4
|
"description": "Core processes and APIs for communicating with OneKey hardware devices.",
|
|
5
5
|
"author": "OneKey",
|
|
6
6
|
"homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme",
|
|
@@ -25,8 +25,8 @@
|
|
|
25
25
|
"url": "https://github.com/OneKeyHQ/hardware-js-sdk/issues"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@onekeyfe/hd-shared": "1.2.8-alpha.
|
|
29
|
-
"@onekeyfe/hd-transport": "1.2.8-alpha.
|
|
28
|
+
"@onekeyfe/hd-shared": "1.2.8-alpha.115",
|
|
29
|
+
"@onekeyfe/hd-transport": "1.2.8-alpha.115",
|
|
30
30
|
"axios": "1.15.2",
|
|
31
31
|
"bignumber.js": "^9.0.2",
|
|
32
32
|
"buffer": "^6.0.3",
|
|
@@ -46,5 +46,5 @@
|
|
|
46
46
|
"@types/w3c-web-usb": "^1.0.10",
|
|
47
47
|
"@types/web-bluetooth": "^0.0.21"
|
|
48
48
|
},
|
|
49
|
-
"gitHead": "
|
|
49
|
+
"gitHead": "4f30138a51d564cd664fa9886f30229bebe469a5"
|
|
50
50
|
}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { EDeviceType, ERRORS, HardwareError, HardwareErrorCode, wait } from '@onekeyfe/hd-shared';
|
|
2
2
|
import JSZip from 'jszip';
|
|
3
|
+
import semver from 'semver';
|
|
3
4
|
import {
|
|
4
5
|
DeviceRebootType,
|
|
5
6
|
DeviceSessionPinType,
|
|
6
7
|
PROTOCOL_V2_BLE_FILE_CHUNK_SIZE,
|
|
7
8
|
PROTOCOL_V2_BLE_FILE_READ_CHUNK_SIZE,
|
|
8
9
|
PROTOCOL_V2_BLE_FIRMWARE_FILE_CHUNK_SIZE,
|
|
10
|
+
PROTOCOL_V2_FILE_WRITE_PIPELINE_WINDOW,
|
|
9
11
|
PROTOCOL_V2_WEBUSB_FILE_CHUNK_SIZE,
|
|
10
12
|
} from '@onekeyfe/hd-transport';
|
|
11
13
|
import { sha256 } from '@noble/hashes/sha256';
|
|
@@ -101,6 +103,14 @@ const PROTOCOL_V2_CONNECT_POLL_INTERVAL = 500;
|
|
|
101
103
|
const PROTOCOL_V2_CONNECT_SINGLE_TIMEOUT = 75 * 1000;
|
|
102
104
|
const PROTOCOL_V2_DEVICE_INFO_READY_TIMEOUT = 30 * 1000;
|
|
103
105
|
const PROTOCOL_V2_FILE_TRANSFER_RETRY_COUNT = 3;
|
|
106
|
+
// Bootloaders with the 2048-byte BLE UART FIFO have no room beside one waiting FileWrite
|
|
107
|
+
// frame, so a second in-flight write can overflow it and lose a chunk. Firmware has not yet
|
|
108
|
+
// confirmed which bootloader version ships the 4096-byte FIFO, nor that the BLE coprocessor
|
|
109
|
+
// queues absorb two back-to-back frames.
|
|
110
|
+
// TEST ONLY: 1.0.2 also matches released bootloaders with the 2048-byte FIFO, so this build
|
|
111
|
+
// must only update test devices flashed with the 4096-byte FIFO bootloader. Replace it with
|
|
112
|
+
// the first released version that ships the 4096-byte FIFO before any release.
|
|
113
|
+
const PROTOCOL_V2_BLE_FILE_WRITE_WINDOW_MIN_BOOTLOADER_VERSION: string | undefined = '1.0.2';
|
|
104
114
|
const PROTOCOL_V2_TRANSFER_PROGRESS_HEARTBEAT_MS = 1000;
|
|
105
115
|
const PROTOCOL_V2_INSTALL_STATUS_CONFLICT_CODE = 'FirmwareInstallStatusConflict';
|
|
106
116
|
const PROTOCOL_V2_INSTALL_FAILED_CODE = 'FirmwareInstallFailed';
|
|
@@ -170,6 +180,18 @@ export function assertProtocolV2FirmwareTargetsSupported(
|
|
|
170
180
|
throw ERRORS.TypedError(HardwareErrorCode.DeviceNotSupportMethod, message);
|
|
171
181
|
}
|
|
172
182
|
|
|
183
|
+
/** Whether the running bootloader accepts a second in-flight BLE FilesystemFileWrite. */
|
|
184
|
+
export function supportsProtocolV2BleFileWriteWindow(
|
|
185
|
+
bootloaderVersion: string,
|
|
186
|
+
minBootloaderVersion = PROTOCOL_V2_BLE_FILE_WRITE_WINDOW_MIN_BOOTLOADER_VERSION
|
|
187
|
+
) {
|
|
188
|
+
return (
|
|
189
|
+
!!minBootloaderVersion &&
|
|
190
|
+
!!semver.valid(bootloaderVersion) &&
|
|
191
|
+
semver.gte(bootloaderVersion, minBootloaderVersion)
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
|
|
173
195
|
const getProtocolV2DeviceTransferProgress = (
|
|
174
196
|
bytesBeforeChunk: number,
|
|
175
197
|
bytesAfterChunk: number,
|
|
@@ -775,7 +797,11 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
|
|
|
775
797
|
};
|
|
776
798
|
}
|
|
777
799
|
|
|
778
|
-
private getProtocolV2FirmwareChunkSize(
|
|
800
|
+
private getProtocolV2FirmwareChunkSize(
|
|
801
|
+
direction: 'read' | 'write',
|
|
802
|
+
filePath?: string,
|
|
803
|
+
fileWriteWindow = false
|
|
804
|
+
) {
|
|
779
805
|
const payloadChunkSize = Number(this.params?.chunkSize);
|
|
780
806
|
const env = DataManager.getSettings('env');
|
|
781
807
|
const isBle = this.params?.platform === 'native' || (env && DataManager.isBleConnect(env));
|
|
@@ -783,6 +809,11 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
|
|
|
783
809
|
if (isBle) {
|
|
784
810
|
if (direction === 'read') {
|
|
785
811
|
maxChunkSize = PROTOCOL_V2_BLE_FILE_READ_CHUNK_SIZE;
|
|
812
|
+
} else if (fileWriteWindow) {
|
|
813
|
+
// Pipelined frames share the main MCU's 4096-byte UART FIFO. Two 1800-byte chunks
|
|
814
|
+
// (about 3.75 KB of frames) leave room to spare; two 1960-byte staging chunks would
|
|
815
|
+
// leave under 60 bytes.
|
|
816
|
+
maxChunkSize = PROTOCOL_V2_BLE_FILE_CHUNK_SIZE;
|
|
786
817
|
} else {
|
|
787
818
|
// Firmware staging writes tolerate a larger BLE chunk than generic filesystem writes.
|
|
788
819
|
maxChunkSize = PROTOCOL_V2_FIRMWARE_STAGING_PATHS.has(filePath ?? '')
|
|
@@ -2163,11 +2194,19 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
|
|
|
2163
2194
|
|
|
2164
2195
|
if (totalSize > 0) {
|
|
2165
2196
|
const elapsedMs = Math.max(Date.now() - transferStartedAt, 0);
|
|
2197
|
+
const rateBytesPerSecond =
|
|
2198
|
+
elapsedMs > 0 ? Math.round((totalSize / elapsedMs) * 1000) : undefined;
|
|
2166
2199
|
this.postProgressMessage(100, 'transferData', {
|
|
2167
2200
|
transferredBytes: totalSize,
|
|
2168
2201
|
totalBytes: totalSize,
|
|
2169
|
-
rateBytesPerSecond
|
|
2202
|
+
rateBytesPerSecond,
|
|
2203
|
+
elapsedMs,
|
|
2204
|
+
});
|
|
2205
|
+
Log.debug('[FirmwareUpdateV4] Protocol V2 transfer completed', {
|
|
2206
|
+
files: resourcesToSync.length + installSources.length,
|
|
2207
|
+
totalBytes: totalSize,
|
|
2170
2208
|
elapsedMs,
|
|
2209
|
+
rateBytesPerSecond,
|
|
2171
2210
|
});
|
|
2172
2211
|
}
|
|
2173
2212
|
if (stagedInstallTargets.length === 0) {
|
|
@@ -2179,10 +2218,16 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
|
|
|
2179
2218
|
target_id: item.targetId,
|
|
2180
2219
|
path: item.path,
|
|
2181
2220
|
}));
|
|
2221
|
+
// Includes the wait for on-device confirmation.
|
|
2222
|
+
const installStartedAt = Date.now();
|
|
2182
2223
|
try {
|
|
2183
2224
|
await this.protocolV2StartFirmwareUpdate({ targets });
|
|
2184
2225
|
await wait(PROTOCOL_V2_INSTALL_STATUS_INITIAL_DELAY);
|
|
2185
2226
|
await this.waitForProtocolV2FirmwareUpdateComplete(targets, true);
|
|
2227
|
+
Log.debug('[FirmwareUpdateV4] Protocol V2 install completed', {
|
|
2228
|
+
targets: targets.length,
|
|
2229
|
+
elapsedMs: Math.max(Date.now() - installStartedAt, 0),
|
|
2230
|
+
});
|
|
2186
2231
|
} finally {
|
|
2187
2232
|
this.device?.clearCancelableAction();
|
|
2188
2233
|
}
|
|
@@ -2201,66 +2246,96 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
|
|
|
2201
2246
|
totalSize: number;
|
|
2202
2247
|
transferStartedAt?: number;
|
|
2203
2248
|
}) {
|
|
2249
|
+
const reportConfirmedChunk = (chunkEnd: number) => {
|
|
2250
|
+
const transferredBytes = processedSize + chunkEnd;
|
|
2251
|
+
const now = Date.now();
|
|
2252
|
+
const elapsedMs = Math.max(now - transferStartedAt, 0);
|
|
2253
|
+
const progress = Math.min(Math.ceil((transferredBytes / totalSize) * 100), 99);
|
|
2254
|
+
const shouldPostProgress =
|
|
2255
|
+
transferredBytes >= this.protocolV2LastTransferredBytes &&
|
|
2256
|
+
(progress !== this.protocolV2LastTransferProgress ||
|
|
2257
|
+
now - this.protocolV2LastTransferProgressAt >=
|
|
2258
|
+
PROTOCOL_V2_TRANSFER_PROGRESS_HEARTBEAT_MS ||
|
|
2259
|
+
chunkEnd === source.size);
|
|
2260
|
+
if (shouldPostProgress) {
|
|
2261
|
+
this.protocolV2LastTransferProgress = progress;
|
|
2262
|
+
this.protocolV2LastTransferProgressAt = now;
|
|
2263
|
+
this.protocolV2LastTransferredBytes = transferredBytes;
|
|
2264
|
+
this.postProgressMessage(progress, 'transferData', {
|
|
2265
|
+
transferredBytes,
|
|
2266
|
+
totalBytes: totalSize,
|
|
2267
|
+
rateBytesPerSecond:
|
|
2268
|
+
elapsedMs > 0 ? Math.round((transferredBytes / elapsedMs) * 1000) : undefined,
|
|
2269
|
+
elapsedMs,
|
|
2270
|
+
});
|
|
2271
|
+
}
|
|
2272
|
+
};
|
|
2204
2273
|
let lastError: unknown;
|
|
2205
2274
|
for (let attempt = 1; attempt <= PROTOCOL_V2_FILE_TRANSFER_RETRY_COUNT; attempt += 1) {
|
|
2206
2275
|
this.throwIfAborted();
|
|
2276
|
+
const attemptStartedAt = Date.now();
|
|
2207
2277
|
try {
|
|
2208
|
-
|
|
2209
|
-
|
|
2210
|
-
|
|
2211
|
-
|
|
2212
|
-
|
|
2213
|
-
|
|
2214
|
-
|
|
2215
|
-
|
|
2216
|
-
|
|
2217
|
-
|
|
2218
|
-
|
|
2219
|
-
|
|
2220
|
-
|
|
2221
|
-
|
|
2222
|
-
|
|
2223
|
-
|
|
2224
|
-
|
|
2225
|
-
|
|
2226
|
-
|
|
2227
|
-
|
|
2228
|
-
|
|
2229
|
-
|
|
2230
|
-
throw ERRORS.TypedError(
|
|
2231
|
-
HardwareErrorCode.EmmcFileWriteFirmwareError,
|
|
2232
|
-
`invalid processed_byte ${rawProcessedByte} for offset ${sourceOffset}`
|
|
2278
|
+
const windowed = this.shouldUseProtocolV2BleFileWriteWindow();
|
|
2279
|
+
const chunkSize = this.getProtocolV2FirmwareChunkSize('write', filePath, windowed);
|
|
2280
|
+
if (windowed) {
|
|
2281
|
+
await this.writeProtocolV2SourceWindowed({
|
|
2282
|
+
source,
|
|
2283
|
+
filePath,
|
|
2284
|
+
chunkSize,
|
|
2285
|
+
processedSize,
|
|
2286
|
+
totalSize,
|
|
2287
|
+
onChunkConfirmed: reportConfirmedChunk,
|
|
2288
|
+
});
|
|
2289
|
+
} else {
|
|
2290
|
+
await writeFirmwareByteSource({
|
|
2291
|
+
source,
|
|
2292
|
+
chunkSize,
|
|
2293
|
+
write: async ({ data, sourceOffset, length, first }) => {
|
|
2294
|
+
this.throwIfAborted();
|
|
2295
|
+
const chunkEnd = sourceOffset + length;
|
|
2296
|
+
const deviceProgress = getProtocolV2DeviceTransferProgress(
|
|
2297
|
+
processedSize + sourceOffset,
|
|
2298
|
+
processedSize + chunkEnd,
|
|
2299
|
+
totalSize
|
|
2233
2300
|
);
|
|
2234
|
-
|
|
2235
|
-
|
|
2236
|
-
|
|
2237
|
-
|
|
2238
|
-
|
|
2239
|
-
|
|
2240
|
-
|
|
2241
|
-
|
|
2242
|
-
|
|
2243
|
-
|
|
2244
|
-
|
|
2245
|
-
|
|
2246
|
-
|
|
2247
|
-
|
|
2248
|
-
|
|
2249
|
-
|
|
2250
|
-
|
|
2251
|
-
|
|
2252
|
-
|
|
2253
|
-
|
|
2254
|
-
|
|
2255
|
-
|
|
2256
|
-
|
|
2257
|
-
|
|
2258
|
-
|
|
2301
|
+
const response = await this.fileWriteChunk(
|
|
2302
|
+
filePath,
|
|
2303
|
+
source.size,
|
|
2304
|
+
sourceOffset,
|
|
2305
|
+
data,
|
|
2306
|
+
first,
|
|
2307
|
+
deviceProgress
|
|
2308
|
+
);
|
|
2309
|
+
const rawProcessedByte = response.message.processed_byte;
|
|
2310
|
+
const nextOffset =
|
|
2311
|
+
rawProcessedByte === undefined ? chunkEnd : Number(rawProcessedByte);
|
|
2312
|
+
if (!Number.isFinite(nextOffset) || nextOffset !== chunkEnd) {
|
|
2313
|
+
throw ERRORS.TypedError(
|
|
2314
|
+
HardwareErrorCode.EmmcFileWriteFirmwareError,
|
|
2315
|
+
`invalid processed_byte ${rawProcessedByte} for offset ${sourceOffset}`
|
|
2316
|
+
);
|
|
2317
|
+
}
|
|
2318
|
+
reportConfirmedChunk(chunkEnd);
|
|
2319
|
+
return length;
|
|
2320
|
+
},
|
|
2321
|
+
});
|
|
2322
|
+
}
|
|
2323
|
+
Log.debug('[FirmwareUpdateV4] Protocol V2 file transferred', {
|
|
2324
|
+
path: filePath,
|
|
2325
|
+
bytes: source.size,
|
|
2326
|
+
elapsedMs: Math.max(Date.now() - attemptStartedAt, 0),
|
|
2327
|
+
attempt,
|
|
2328
|
+
fileWriteWindow: windowed ? PROTOCOL_V2_FILE_WRITE_PIPELINE_WINDOW : 1,
|
|
2259
2329
|
});
|
|
2260
2330
|
return processedSize + source.size;
|
|
2261
2331
|
} catch (error) {
|
|
2262
2332
|
this.throwIfAborted();
|
|
2263
2333
|
lastError = error;
|
|
2334
|
+
Log.debug('[FirmwareUpdateV4] Protocol V2 file transfer attempt failed', {
|
|
2335
|
+
path: filePath,
|
|
2336
|
+
attempt,
|
|
2337
|
+
error: getProtocolV2UnknownErrorText(error),
|
|
2338
|
+
});
|
|
2264
2339
|
if (attempt < PROTOCOL_V2_FILE_TRANSFER_RETRY_COUNT) {
|
|
2265
2340
|
await this.recoverProtocolV2FileTransfer();
|
|
2266
2341
|
this.throwIfAborted();
|
|
@@ -3192,6 +3267,106 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
|
|
|
3192
3267
|
return writeRes;
|
|
3193
3268
|
}
|
|
3194
3269
|
|
|
3270
|
+
private shouldUseProtocolV2BleFileWriteWindow(
|
|
3271
|
+
minBootloaderVersion = PROTOCOL_V2_BLE_FILE_WRITE_WINDOW_MIN_BOOTLOADER_VERSION
|
|
3272
|
+
) {
|
|
3273
|
+
const env = DataManager.getSettings('env');
|
|
3274
|
+
// These adapters queue frames that arrive while no read is pending. LowLevel plugins are not
|
|
3275
|
+
// required to keep notifications between receive() calls, so they stay serial.
|
|
3276
|
+
if (
|
|
3277
|
+
(env !== 'react-native' && env !== 'desktop-web-ble') ||
|
|
3278
|
+
!this.isProtocolV2BootloaderMode()
|
|
3279
|
+
) {
|
|
3280
|
+
return false;
|
|
3281
|
+
}
|
|
3282
|
+
// The transfer runs in the device's current bootloader, not the one being installed.
|
|
3283
|
+
const bootloaderVersion = getDeviceBootloaderVersion(this.device.features).join('.');
|
|
3284
|
+
const enabled = supportsProtocolV2BleFileWriteWindow(bootloaderVersion, minBootloaderVersion);
|
|
3285
|
+
Log.debug('[FirmwareUpdateV4] BLE FileWrite window', {
|
|
3286
|
+
enabled,
|
|
3287
|
+
bootloaderVersion,
|
|
3288
|
+
bootloaderBuildId: this.device.features?.verify?.bootloaderBuildId,
|
|
3289
|
+
});
|
|
3290
|
+
return enabled;
|
|
3291
|
+
}
|
|
3292
|
+
|
|
3293
|
+
/**
|
|
3294
|
+
* Streams one staged file as a single ordered FilesystemFileWrite pipeline. Every chunk is
|
|
3295
|
+
* still confirmed by the device; a failure restarts the whole file like the serial path.
|
|
3296
|
+
* Cancellation and source errors only stop the pipeline and are raised after the transport
|
|
3297
|
+
* call returns: an error thrown inside it would invalidate the BLE link.
|
|
3298
|
+
*/
|
|
3299
|
+
private async writeProtocolV2SourceWindowed({
|
|
3300
|
+
source,
|
|
3301
|
+
filePath,
|
|
3302
|
+
chunkSize,
|
|
3303
|
+
processedSize,
|
|
3304
|
+
totalSize,
|
|
3305
|
+
onChunkConfirmed,
|
|
3306
|
+
}: {
|
|
3307
|
+
source: FirmwareByteSource;
|
|
3308
|
+
filePath: string;
|
|
3309
|
+
chunkSize: number;
|
|
3310
|
+
processedSize: number;
|
|
3311
|
+
totalSize: number;
|
|
3312
|
+
onChunkConfirmed: (chunkEnd: number) => void;
|
|
3313
|
+
}) {
|
|
3314
|
+
let sendOffset = 0;
|
|
3315
|
+
let sourceError: Error | undefined;
|
|
3316
|
+
const readRequest = async () => {
|
|
3317
|
+
const offset = sendOffset;
|
|
3318
|
+
const length = Math.min(chunkSize, source.size - offset);
|
|
3319
|
+
const data = await source.readAt(offset, length);
|
|
3320
|
+
sendOffset += length;
|
|
3321
|
+
return {
|
|
3322
|
+
file: { path: filePath, offset, total_size: source.size, data },
|
|
3323
|
+
overwrite: offset === 0,
|
|
3324
|
+
append: false,
|
|
3325
|
+
ui_percentage: getProtocolV2DeviceTransferProgress(
|
|
3326
|
+
processedSize + offset,
|
|
3327
|
+
processedSize + sendOffset,
|
|
3328
|
+
totalSize
|
|
3329
|
+
),
|
|
3330
|
+
};
|
|
3331
|
+
};
|
|
3332
|
+
const nextRequest = async () => {
|
|
3333
|
+
if (this.abortSignal?.aborted || sendOffset >= source.size) return undefined;
|
|
3334
|
+
try {
|
|
3335
|
+
return await readRequest();
|
|
3336
|
+
} catch (error) {
|
|
3337
|
+
sourceError = error;
|
|
3338
|
+
return undefined;
|
|
3339
|
+
}
|
|
3340
|
+
};
|
|
3341
|
+
this.throwIfAborted();
|
|
3342
|
+
if (source.size === 0) return;
|
|
3343
|
+
const firstRequest = await readRequest();
|
|
3344
|
+
|
|
3345
|
+
const response = await this.device
|
|
3346
|
+
.getCommands()
|
|
3347
|
+
.typedCall('FilesystemFileWrite', 'FilesystemFile', firstRequest, {
|
|
3348
|
+
// Both windowed transports (React Native and Electron BLE) invalidate a timed-out link,
|
|
3349
|
+
// so a lost chunk is retried after 10 s instead of the 5-minute default.
|
|
3350
|
+
timeoutMs: PROTOCOL_V2_FILE_WRITE_RESPONSE_TIMEOUT,
|
|
3351
|
+
writeWithResponse: false,
|
|
3352
|
+
fileWritePipeline: {
|
|
3353
|
+
next: nextRequest,
|
|
3354
|
+
onResponse: confirmed => {
|
|
3355
|
+
onChunkConfirmed(Number(confirmed.message.processed_byte));
|
|
3356
|
+
},
|
|
3357
|
+
},
|
|
3358
|
+
});
|
|
3359
|
+
this.throwIfAborted();
|
|
3360
|
+
if (sourceError) throw sourceError;
|
|
3361
|
+
const rawProcessedByte = response.message.processed_byte;
|
|
3362
|
+
if (Number(rawProcessedByte) !== source.size) {
|
|
3363
|
+
throw ERRORS.TypedError(
|
|
3364
|
+
HardwareErrorCode.EmmcFileWriteFirmwareError,
|
|
3365
|
+
`invalid processed_byte ${rawProcessedByte} for file size ${source.size}`
|
|
3366
|
+
);
|
|
3367
|
+
}
|
|
3368
|
+
}
|
|
3369
|
+
|
|
3195
3370
|
private async recoverProtocolV2FileTransfer() {
|
|
3196
3371
|
const env = DataManager.getSettings('env');
|
|
3197
3372
|
if (DataManager.isBleConnect(env)) {
|
package/src/types/device.ts
CHANGED
|
@@ -83,12 +83,6 @@ export type SearchDevice = {
|
|
|
83
83
|
deviceType: IDeviceType;
|
|
84
84
|
name: string;
|
|
85
85
|
commType: OneKeyDeviceCommType;
|
|
86
|
-
/**
|
|
87
|
-
* React Native and Electron BLE discovery only. Serial-number color letter ('A'-'Z')
|
|
88
|
-
* advertised by Pro2 / Neo, possibly remembered from an earlier advertisement in this
|
|
89
|
-
* process. Absent when unknown; the letter's meaning depends on deviceType.
|
|
90
|
-
*/
|
|
91
|
-
bleColorCode?: string;
|
|
92
86
|
};
|
|
93
87
|
|
|
94
88
|
/** Identity confirmed over USB. The descriptor path is only a transport address. */
|
package/src/utils/logger.ts
CHANGED
|
@@ -78,6 +78,10 @@ class Log {
|
|
|
78
78
|
const _logs: { [k: string]: Log } = {};
|
|
79
79
|
|
|
80
80
|
export const initLog = (prefix: string, enabled?: boolean) => {
|
|
81
|
+
// Loggers that share a prefix must share one instance; otherwise enableLog only reaches the
|
|
82
|
+
// last one registered and the others never print.
|
|
83
|
+
const existing = _logs[prefix];
|
|
84
|
+
if (existing) return existing;
|
|
81
85
|
const instance = new Log(prefix, !!enabled);
|
|
82
86
|
_logs[prefix] = instance;
|
|
83
87
|
return instance;
|