@onekeyfe/hd-core 1.2.0-alpha.96 → 1.2.0-alpha.97

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.
Files changed (89) hide show
  1. package/__tests__/check-all-firmware-release-protocol-v2.test.ts +84 -404
  2. package/__tests__/firmware-update/device-update-bootloader.test.ts +2 -6
  3. package/__tests__/firmware-update/firmware-host-binding.test.ts +0 -9
  4. package/__tests__/firmware-update/firmware-update-bootloader-poll.test.ts +112 -0
  5. package/__tests__/firmware-update/firmware-update-plan.test.ts +70 -131
  6. package/__tests__/firmware-update/firmware-update-prepared-plan.test.ts +1 -53
  7. package/__tests__/protocol-v2-resources.test.ts +232 -148
  8. package/__tests__/protocol-v2.test.ts +517 -1106
  9. package/dist/api/CheckAllFirmwareRelease.d.ts +3 -2
  10. package/dist/api/CheckAllFirmwareRelease.d.ts.map +1 -1
  11. package/dist/api/CheckBLEFirmwareRelease.d.ts +2 -3
  12. package/dist/api/CheckBLEFirmwareRelease.d.ts.map +1 -1
  13. package/dist/api/CheckBootloaderRelease.d.ts +1 -2
  14. package/dist/api/CheckBootloaderRelease.d.ts.map +1 -1
  15. package/dist/api/CheckFirmwareRelease.d.ts +2 -3
  16. package/dist/api/CheckFirmwareRelease.d.ts.map +1 -1
  17. package/dist/api/FirmwareUpdateV2.d.ts +0 -1
  18. package/dist/api/FirmwareUpdateV2.d.ts.map +1 -1
  19. package/dist/api/FirmwareUpdateV3.d.ts.map +1 -1
  20. package/dist/api/FirmwareUpdateV4.d.ts +8 -6
  21. package/dist/api/FirmwareUpdateV4.d.ts.map +1 -1
  22. package/dist/api/UploadPortfolio.d.ts.map +1 -1
  23. package/dist/api/device/DeviceUpdateBootloader.d.ts.map +1 -1
  24. package/dist/api/firmware/FirmwareHostBinding.d.ts +1 -1
  25. package/dist/api/firmware/FirmwareHostBinding.d.ts.map +1 -1
  26. package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts.map +1 -1
  27. package/dist/api/firmware/FirmwareUpdatePlan.d.ts +1 -48
  28. package/dist/api/firmware/FirmwareUpdatePlan.d.ts.map +1 -1
  29. package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts.map +1 -1
  30. package/dist/api/firmware/getBinary.d.ts +1 -0
  31. package/dist/api/firmware/getBinary.d.ts.map +1 -1
  32. package/dist/data-manager/DataManager.d.ts +3 -4
  33. package/dist/data-manager/DataManager.d.ts.map +1 -1
  34. package/dist/index.d.ts +111 -103
  35. package/dist/index.d.ts.map +1 -1
  36. package/dist/index.js +849 -1313
  37. package/dist/protocols/protocol-v2/resources.d.ts +28 -10
  38. package/dist/protocols/protocol-v2/resources.d.ts.map +1 -1
  39. package/dist/types/api/checkAllFirmwareRelease.d.ts +8 -20
  40. package/dist/types/api/checkAllFirmwareRelease.d.ts.map +1 -1
  41. package/dist/types/api/checkBLEFirmwareRelease.d.ts +13 -2
  42. package/dist/types/api/checkBLEFirmwareRelease.d.ts.map +1 -1
  43. package/dist/types/api/checkBootloaderRelease.d.ts +6 -2
  44. package/dist/types/api/checkBootloaderRelease.d.ts.map +1 -1
  45. package/dist/types/api/checkFirmwareRelease.d.ts +13 -2
  46. package/dist/types/api/checkFirmwareRelease.d.ts.map +1 -1
  47. package/dist/types/api/checkFirmwareTypeAvailable.d.ts +2 -2
  48. package/dist/types/api/checkFirmwareTypeAvailable.d.ts.map +1 -1
  49. package/dist/types/api/export.d.ts +1 -1
  50. package/dist/types/api/export.d.ts.map +1 -1
  51. package/dist/types/api/firmwareUpdate.d.ts +11 -3
  52. package/dist/types/api/firmwareUpdate.d.ts.map +1 -1
  53. package/dist/types/settings.d.ts +36 -35
  54. package/dist/types/settings.d.ts.map +1 -1
  55. package/package.json +4 -4
  56. package/src/api/CheckAllFirmwareRelease.ts +80 -108
  57. package/src/api/CheckBLEFirmwareRelease.ts +5 -37
  58. package/src/api/CheckBootloaderRelease.ts +3 -35
  59. package/src/api/CheckFirmwareRelease.ts +7 -35
  60. package/src/api/FirmwareUpdateV2.ts +3 -15
  61. package/src/api/FirmwareUpdateV3.ts +7 -29
  62. package/src/api/FirmwareUpdateV4.ts +407 -824
  63. package/src/api/UploadPortfolio.ts +0 -18
  64. package/src/api/device/DeviceUpdateBootloader.ts +5 -26
  65. package/src/api/firmware/FirmwareHostBinding.ts +3 -16
  66. package/src/api/firmware/FirmwareUpdateBaseMethod.ts +2 -0
  67. package/src/api/firmware/FirmwareUpdatePlan.ts +88 -226
  68. package/src/api/firmware/FirmwareUpdatePreparedPlan.ts +3 -10
  69. package/src/data-manager/DataManager.ts +19 -35
  70. package/src/index.ts +0 -10
  71. package/src/protocols/protocol-v2/resources.ts +341 -157
  72. package/src/types/api/checkAllFirmwareRelease.ts +12 -27
  73. package/src/types/api/checkBLEFirmwareRelease.ts +13 -4
  74. package/src/types/api/checkBootloaderRelease.ts +6 -2
  75. package/src/types/api/checkFirmwareRelease.ts +13 -2
  76. package/src/types/api/checkFirmwareTypeAvailable.ts +2 -2
  77. package/src/types/api/export.ts +1 -6
  78. package/src/types/api/firmwareUpdate.ts +16 -10
  79. package/src/types/settings.ts +61 -35
  80. package/src/utils/deviceFeaturesUtils.ts +2 -2
  81. package/__tests__/check-firmware-release-protocol-v2.test.ts +0 -199
  82. package/__tests__/firmware-memory-host.test.ts +0 -112
  83. package/__tests__/firmware-update/firmware-prepared-host-digest.test.ts +0 -469
  84. package/dist/api/firmware/FirmwareMemoryHost.d.ts +0 -22
  85. package/dist/api/firmware/FirmwareMemoryHost.d.ts.map +0 -1
  86. package/dist/api/firmware/protocolV2Release.d.ts +0 -33
  87. package/dist/api/firmware/protocolV2Release.d.ts.map +0 -1
  88. package/src/api/firmware/FirmwareMemoryHost.ts +0 -142
  89. package/src/api/firmware/protocolV2Release.ts +0 -168
@@ -1,469 +0,0 @@
1
- import { EDeviceType, EFirmwareType } from '@onekeyfe/hd-shared';
2
-
3
- import FirmwareUpdateV2 from '../../src/api/FirmwareUpdateV2';
4
- import FirmwareUpdateV3 from '../../src/api/FirmwareUpdateV3';
5
- import FirmwareUpdateV4 from '../../src/api/FirmwareUpdateV4';
6
- import DeviceUpdateBootloader from '../../src/api/device/DeviceUpdateBootloader';
7
- import {
8
- registerFirmwareUpdateHostBinding,
9
- unregisterFirmwareUpdateHostBinding,
10
- } from '../../src/api/firmware/FirmwareHostBinding';
11
- import { prepareFirmwareUpdatePlan } from '../../src/api/firmware/FirmwareUpdatePreparedPlan';
12
- import { buildFirmwareUpdatePlan } from '../../src/api/firmware/FirmwareUpdatePlan';
13
-
14
- import type { FirmwareArtifactReference } from '../../src/types/api/firmwareUpdate';
15
- import type { Features } from '../../src/types';
16
-
17
- jest.mock('../../src/data/config', () => ({
18
- getSDKVersion: jest.fn(() => '1.0.0'),
19
- DEFAULT_DOMAIN: 'https://jssdk.onekey.so/1.0.0/',
20
- }));
21
-
22
- const noUpdate = {
23
- status: 'valid' as const,
24
- release: undefined,
25
- };
26
-
27
- const createPreparedPlan = ({
28
- executor,
29
- target,
30
- }: {
31
- executor: 'v2' | 'v3';
32
- target: 'firmware' | 'bootloader';
33
- }) => {
34
- const sha256 = target === 'firmware' ? 'a'.repeat(64) : 'b'.repeat(64);
35
- const artifact: FirmwareArtifactReference = {
36
- artifactRef: `fw:${sha256}`,
37
- size: 4,
38
- sha256,
39
- };
40
- const isV3 = executor === 'v3';
41
- const plan = buildFirmwareUpdatePlan({
42
- features: {
43
- deviceType: isV3 ? EDeviceType.Pro : EDeviceType.Classic1s,
44
- serialNo: isV3 ? 'pro-device-id' : 'classic-device-id',
45
- firmwareVersion: '1.0.0',
46
- bootloaderVersion: isV3 ? '2.8.0' : '1.0.0',
47
- } as Features,
48
- firmwareType: EFirmwareType.Universal,
49
- platform: 'desktop',
50
- firmware:
51
- target === 'firmware'
52
- ? {
53
- status: 'outdated',
54
- release: {
55
- url: 'https://firmware.onekey.so/firmware.bin',
56
- expectedSize: artifact.size,
57
- fingerprint: artifact.sha256,
58
- version: [3, 0, 0],
59
- },
60
- }
61
- : noUpdate,
62
- ble: noUpdate,
63
- bootloader:
64
- target === 'bootloader'
65
- ? {
66
- status: 'outdated',
67
- shouldUpdate: true,
68
- release: {
69
- bootloaderResource: 'https://firmware.onekey.so/bootloader.bin',
70
- bootloaderExpectedSize: artifact.size,
71
- bootloaderFingerprint: artifact.sha256,
72
- bootloaderVersion: [2, 0, 0],
73
- },
74
- }
75
- : noUpdate,
76
- });
77
- expect(plan.executor).toBe(executor);
78
- const preparedPlan = prepareFirmwareUpdatePlan({
79
- plan,
80
- leaseRef: `fwlease:${executor}:${target}`,
81
- artifacts: [{ artifactId: target, artifact }],
82
- });
83
- return { artifact, preparedPlan };
84
- };
85
-
86
- const registerMismatchedHost = () => {
87
- const artifactReader = {
88
- open: jest.fn(),
89
- read: jest.fn(),
90
- close: jest.fn(),
91
- };
92
- const hostBindingGeneration = registerFirmwareUpdateHostBinding({
93
- preparedPlanDigest: 'f'.repeat(64),
94
- artifactReader,
95
- });
96
- return { artifactReader, hostBindingGeneration };
97
- };
98
-
99
- const createPreparedV4Plan = () => {
100
- const sha256 = 'c'.repeat(64);
101
- const artifact: FirmwareArtifactReference = {
102
- artifactRef: `fw:${sha256}`,
103
- size: 4,
104
- sha256,
105
- };
106
- const plan = buildFirmwareUpdatePlan({
107
- features: {
108
- deviceType: EDeviceType.Pro2,
109
- serialNo: 'pro2-device-id',
110
- firmwareVersion: '1.0.0',
111
- bootloaderVersion: '1.0.0',
112
- } as Features,
113
- firmwareType: EFirmwareType.Universal,
114
- platform: 'desktop',
115
- firmware: {
116
- status: 'outdated',
117
- release: {
118
- components: {
119
- applicationP1: {
120
- target: 'APPLICATION_P1',
121
- url: 'https://firmware.onekey.so/pro2/application-p1.bin',
122
- expectedSize: artifact.size,
123
- fingerprint: artifact.sha256,
124
- },
125
- },
126
- },
127
- },
128
- ble: noUpdate,
129
- bootloader: noUpdate,
130
- });
131
- expect(plan.executor).toBe('v4');
132
- const preparedPlan = prepareFirmwareUpdatePlan({
133
- plan,
134
- leaseRef: 'fwlease:v4:app_v1',
135
- artifacts: [{ artifactId: 'component:app_v1', artifact }],
136
- });
137
- return { artifact, preparedPlan };
138
- };
139
-
140
- describe('prepared firmware host digest binding', () => {
141
- afterEach(() => {
142
- unregisterFirmwareUpdateHostBinding();
143
- jest.restoreAllMocks();
144
- });
145
-
146
- test('FirmwareUpdateV2 rejects a host registered for another prepared plan', () => {
147
- const { artifact, preparedPlan } = createPreparedPlan({
148
- executor: 'v2',
149
- target: 'firmware',
150
- });
151
- const { artifactReader, hostBindingGeneration } = registerMismatchedHost();
152
- const method = new FirmwareUpdateV2({
153
- id: 1,
154
- payload: {
155
- method: 'firmwareUpdateV2',
156
- platform: 'desktop',
157
- updateType: 'firmware',
158
- artifact,
159
- preparedPlan,
160
- hostBindingGeneration,
161
- },
162
- });
163
-
164
- expect(() => method.init()).toThrow('does not match the prepared plan');
165
- expect(artifactReader.open).not.toHaveBeenCalled();
166
- });
167
-
168
- test('FirmwareUpdateV2 rejects a direct reader when the prepared host generation is missing', () => {
169
- const { artifact, preparedPlan } = createPreparedPlan({
170
- executor: 'v2',
171
- target: 'firmware',
172
- });
173
- const directArtifactReader = {
174
- open: jest.fn(),
175
- read: jest.fn(),
176
- close: jest.fn(),
177
- };
178
- const method = new FirmwareUpdateV2({
179
- id: 1,
180
- payload: {
181
- method: 'firmwareUpdateV2',
182
- platform: 'desktop',
183
- updateType: 'firmware',
184
- artifact,
185
- preparedPlan,
186
- artifactReader: directArtifactReader,
187
- },
188
- });
189
-
190
- expect(() => method.init()).toThrow('host binding generation NaN is stale');
191
- expect(directArtifactReader.open).not.toHaveBeenCalled();
192
- });
193
-
194
- test('FirmwareUpdateV2 does not treat a binary call carrying a prepared plan as legacy', () => {
195
- const { preparedPlan } = createPreparedPlan({
196
- executor: 'v2',
197
- target: 'firmware',
198
- });
199
- const method = new FirmwareUpdateV2({
200
- id: 1,
201
- payload: {
202
- method: 'firmwareUpdateV2',
203
- platform: 'desktop',
204
- updateType: 'firmware',
205
- binary: new ArrayBuffer(4),
206
- preparedPlan,
207
- },
208
- });
209
-
210
- expect(() => method.init()).toThrow('Prepared firmware plans require a prepared artifact');
211
- });
212
-
213
- test('FirmwareUpdateV3 rejects a host registered for another prepared plan', () => {
214
- const { artifact, preparedPlan } = createPreparedPlan({
215
- executor: 'v3',
216
- target: 'firmware',
217
- });
218
- const { artifactReader, hostBindingGeneration } = registerMismatchedHost();
219
- const method = new FirmwareUpdateV3({
220
- id: 1,
221
- payload: {
222
- method: 'firmwareUpdateV3',
223
- platform: 'desktop',
224
- artifacts: { firmware: artifact },
225
- preparedPlan,
226
- hostBindingGeneration,
227
- },
228
- });
229
-
230
- expect(() => method.init()).toThrow('does not match the prepared plan');
231
- expect(artifactReader.open).not.toHaveBeenCalled();
232
- });
233
-
234
- test('FirmwareUpdateV3 rejects a direct reader when the prepared host generation is missing', () => {
235
- const { artifact, preparedPlan } = createPreparedPlan({
236
- executor: 'v3',
237
- target: 'firmware',
238
- });
239
- const directArtifactReader = {
240
- open: jest.fn(),
241
- read: jest.fn(),
242
- close: jest.fn(),
243
- };
244
- const method = new FirmwareUpdateV3({
245
- id: 1,
246
- payload: {
247
- method: 'firmwareUpdateV3',
248
- platform: 'desktop',
249
- artifacts: { firmware: artifact },
250
- preparedPlan,
251
- artifactReader: directArtifactReader,
252
- },
253
- });
254
-
255
- expect(() => method.init()).toThrow('host binding generation NaN is stale');
256
- expect(directArtifactReader.open).not.toHaveBeenCalled();
257
- });
258
-
259
- test('FirmwareUpdateV3 does not execute legacy inputs outside the prepared plan', () => {
260
- const { artifact, preparedPlan } = createPreparedPlan({
261
- executor: 'v3',
262
- target: 'firmware',
263
- });
264
- const method = new FirmwareUpdateV3({
265
- id: 1,
266
- payload: {
267
- method: 'firmwareUpdateV3',
268
- platform: 'desktop',
269
- artifacts: { firmware: artifact },
270
- preparedPlan,
271
- bleBinary: new ArrayBuffer(4),
272
- },
273
- });
274
-
275
- expect(() => method.init()).toThrow(
276
- 'Prepared firmware plans cannot be combined with legacy firmware inputs'
277
- );
278
- });
279
-
280
- test('DeviceUpdateBootloader rejects a host registered for another prepared plan', async () => {
281
- const { artifact, preparedPlan } = createPreparedPlan({
282
- executor: 'v2',
283
- target: 'bootloader',
284
- });
285
- const { artifactReader, hostBindingGeneration } = registerMismatchedHost();
286
- const method = new DeviceUpdateBootloader({
287
- id: 1,
288
- payload: {
289
- method: 'deviceUpdateBootloader',
290
- artifact,
291
- preparedPlan,
292
- hostBindingGeneration,
293
- },
294
- });
295
- method.device = {
296
- features: {
297
- deviceType: EDeviceType.Classic1s,
298
- serialNo: 'classic-device-id',
299
- },
300
- } as any;
301
-
302
- await expect(method.run()).rejects.toThrow('does not match the prepared plan');
303
- expect(artifactReader.open).not.toHaveBeenCalled();
304
- });
305
-
306
- test('DeviceUpdateBootloader rejects a direct reader when the prepared host generation is missing', async () => {
307
- const { artifact, preparedPlan } = createPreparedPlan({
308
- executor: 'v2',
309
- target: 'bootloader',
310
- });
311
- const directArtifactReader = {
312
- open: jest.fn(),
313
- read: jest.fn(),
314
- close: jest.fn(),
315
- };
316
- const method = new DeviceUpdateBootloader({
317
- id: 1,
318
- payload: {
319
- method: 'deviceUpdateBootloader',
320
- artifact,
321
- preparedPlan,
322
- artifactReader: directArtifactReader,
323
- },
324
- });
325
- method.device = {
326
- features: {
327
- deviceType: EDeviceType.Classic1s,
328
- serialNo: 'classic-device-id',
329
- },
330
- } as any;
331
-
332
- await expect(method.run()).rejects.toThrow('host binding generation NaN is stale');
333
- expect(directArtifactReader.open).not.toHaveBeenCalled();
334
- });
335
-
336
- test('DeviceUpdateBootloader does not treat a binary call carrying a prepared plan as legacy', async () => {
337
- const { preparedPlan } = createPreparedPlan({
338
- executor: 'v2',
339
- target: 'bootloader',
340
- });
341
- const method = new DeviceUpdateBootloader({
342
- id: 1,
343
- payload: {
344
- method: 'deviceUpdateBootloader',
345
- binary: new ArrayBuffer(4),
346
- preparedPlan,
347
- },
348
- });
349
- method.device = { features: undefined } as any;
350
-
351
- await expect(method.run()).rejects.toThrow(
352
- 'Prepared bootloader plans require exactly one prepared artifact'
353
- );
354
- });
355
-
356
- test('FirmwareUpdateV4 rejects a prepared plan without a host binding generation', () => {
357
- const { preparedPlan } = createPreparedV4Plan();
358
- const directArtifactReader = {
359
- open: jest.fn(),
360
- read: jest.fn(),
361
- close: jest.fn(),
362
- };
363
- const method = new FirmwareUpdateV4({
364
- id: 1,
365
- payload: {
366
- method: 'firmwareUpdateV4',
367
- platform: 'desktop',
368
- preparedPlan,
369
- artifactReader: directArtifactReader,
370
- },
371
- });
372
-
373
- expect(() => method.init()).toThrow('host binding generation NaN is stale');
374
- expect(directArtifactReader.open).not.toHaveBeenCalled();
375
- });
376
-
377
- test('FirmwareUpdateV4 rejects a host registered for another prepared plan', () => {
378
- const { preparedPlan } = createPreparedV4Plan();
379
- const { artifactReader, hostBindingGeneration } = registerMismatchedHost();
380
- const method = new FirmwareUpdateV4({
381
- id: 1,
382
- payload: {
383
- method: 'firmwareUpdateV4',
384
- platform: 'desktop',
385
- preparedPlan,
386
- hostBindingGeneration,
387
- },
388
- });
389
-
390
- expect(() => method.init()).toThrow('does not match the prepared plan');
391
- expect(artifactReader.open).not.toHaveBeenCalled();
392
- });
393
-
394
- test('FirmwareUpdateV4 obtains the prepared reader only from the digest-bound host', async () => {
395
- const { artifact, preparedPlan } = createPreparedV4Plan();
396
- const directArtifactReader = {
397
- open: jest.fn(),
398
- read: jest.fn(),
399
- close: jest.fn(),
400
- };
401
- const boundArtifactReader = {
402
- open: jest.fn().mockResolvedValue({ readerId: 'bound-reader', size: artifact.size }),
403
- read: jest.fn(),
404
- close: jest.fn(),
405
- };
406
- const hostBindingGeneration = registerFirmwareUpdateHostBinding({
407
- preparedPlanDigest: preparedPlan.preparedPlanDigest,
408
- artifactReader: boundArtifactReader,
409
- });
410
- const method = new FirmwareUpdateV4({
411
- id: 1,
412
- payload: {
413
- method: 'firmwareUpdateV4',
414
- platform: 'desktop',
415
- preparedPlan,
416
- hostBindingGeneration,
417
- artifactReader: directArtifactReader,
418
- },
419
- });
420
-
421
- method.init();
422
- const executionReader = (
423
- method as unknown as {
424
- params: { artifactReader: typeof boundArtifactReader };
425
- }
426
- ).params.artifactReader;
427
- await executionReader.open({ artifactRef: artifact.artifactRef });
428
-
429
- expect(boundArtifactReader.open).toHaveBeenCalledWith({ artifactRef: artifact.artifactRef });
430
- expect(directArtifactReader.open).not.toHaveBeenCalled();
431
- });
432
-
433
- test('keeps non-prepared direct binary calls on the legacy paths', async () => {
434
- const v2 = new FirmwareUpdateV2({
435
- id: 1,
436
- payload: {
437
- method: 'firmwareUpdateV2',
438
- platform: 'desktop',
439
- updateType: 'firmware',
440
- binary: new ArrayBuffer(4),
441
- },
442
- });
443
- const v3 = new FirmwareUpdateV3({
444
- id: 2,
445
- payload: {
446
- method: 'firmwareUpdateV3',
447
- platform: 'desktop',
448
- firmwareBinary: new ArrayBuffer(4),
449
- },
450
- });
451
- const bootloader = new DeviceUpdateBootloader({
452
- id: 3,
453
- payload: {
454
- method: 'deviceUpdateBootloader',
455
- binary: new ArrayBuffer(4),
456
- },
457
- });
458
- bootloader.device = {
459
- features: {},
460
- getCurrentDeviceType: () => EDeviceType.Touch,
461
- getCurrentFirmwareType: () => EFirmwareType.Universal,
462
- } as any;
463
- jest.spyOn(bootloader, 'updateTouchBootloader').mockResolvedValue(true);
464
-
465
- expect(() => v2.init()).not.toThrow();
466
- expect(() => v3.init()).not.toThrow();
467
- await expect(bootloader.run()).resolves.toBe(true);
468
- });
469
- });
@@ -1,22 +0,0 @@
1
- import type { CoreApi } from '../../types/api';
2
- import type { FirmwareUpdatePlan } from '../../types/api/firmwareUpdatePlan';
3
- export type FirmwareMemoryArtifactEntry = {
4
- entryName: string;
5
- binary: ArrayBuffer;
6
- };
7
- export type FirmwareMemoryArtifact = {
8
- artifactId: string;
9
- binary: ArrayBuffer;
10
- materializedEntries?: FirmwareMemoryArtifactEntry[];
11
- };
12
- export type FirmwareUpdateV4MemoryHost = {
13
- preparedPlan: ReturnType<CoreApi['prepareFirmwareUpdatePlan']>;
14
- hostBindingGeneration: number;
15
- release: () => void;
16
- };
17
- export declare function prepareFirmwareUpdateV4MemoryHost({ sdk, plan, artifacts, }: {
18
- sdk: Pick<CoreApi, 'prepareFirmwareUpdatePlan' | 'registerFirmwareUpdateHostBinding' | 'unregisterFirmwareUpdateHostBinding'>;
19
- plan: FirmwareUpdatePlan;
20
- artifacts: FirmwareMemoryArtifact[];
21
- }): FirmwareUpdateV4MemoryHost;
22
- //# sourceMappingURL=FirmwareMemoryHost.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"FirmwareMemoryHost.d.ts","sourceRoot":"","sources":["../../../src/api/firmware/FirmwareMemoryHost.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAK/C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAE7E,MAAM,MAAM,2BAA2B,GAAG;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,WAAW,CAAC;IACpB,mBAAmB,CAAC,EAAE,2BAA2B,EAAE,CAAC;CACrD,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,YAAY,EAAE,UAAU,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC,CAAC;IAC/D,qBAAqB,EAAE,MAAM,CAAC;IAC9B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAaF,wBAAgB,iCAAiC,CAAC,EAChD,GAAG,EACH,IAAI,EACJ,SAAS,GACV,EAAE;IACD,GAAG,EAAE,IAAI,CACP,OAAO,EACL,2BAA2B,GAC3B,mCAAmC,GACnC,qCAAqC,CACxC,CAAC;IACF,IAAI,EAAE,kBAAkB,CAAC;IACzB,SAAS,EAAE,sBAAsB,EAAE,CAAC;CACrC,GAAG,0BAA0B,CAyF7B"}
@@ -1,33 +0,0 @@
1
- import { EFirmwareType } from '@onekeyfe/hd-shared';
2
- import type { EDeviceType } from '@onekeyfe/hd-shared';
3
- import type { Device } from '../../device/Device';
4
- import type { DeviceState, Features, IFirmwareReleaseInfo, IProtocolV2FirmwareComponentTarget } from '../../types';
5
- import type { FirmwareReleaseCheckResult, ProtocolV2ComponentReleaseInfo } from '../../types/api/checkAllFirmwareRelease';
6
- import type { ProtocolV2FirmwareReleasePlan } from '../CheckAllFirmwareRelease';
7
- export declare const PROTOCOL_V2_MAIN_FIRMWARE_TARGETS: readonly IProtocolV2FirmwareComponentTarget[];
8
- export declare const PROTOCOL_V2_BLE_TARGETS: readonly IProtocolV2FirmwareComponentTarget[];
9
- export declare const PROTOCOL_V2_BOOTLOADER_TARGETS: readonly IProtocolV2FirmwareComponentTarget[];
10
- export type ProtocolV2FirmwareReleaseContext = {
11
- state: Omit<DeviceState, 'identity'> & {
12
- identity: Omit<DeviceState['identity'], 'deviceType'> & {
13
- deviceType: EDeviceType.Pro2 | EDeviceType.Neo;
14
- };
15
- };
16
- features: Features;
17
- firmwareType: EFirmwareType;
18
- release: IFirmwareReleaseInfo | undefined;
19
- };
20
- export declare function loadProtocolV2FirmwareReleaseContext({ device, firmwareType: firmwareTypeParam, checkFirmwareHash, methodName, }: {
21
- device: Device;
22
- firmwareType?: EFirmwareType;
23
- checkFirmwareHash?: boolean;
24
- methodName: string;
25
- }): Promise<ProtocolV2FirmwareReleaseContext>;
26
- export declare function summarizeProtocolV2FirmwareRelease(plan: ProtocolV2FirmwareReleasePlan, componentTargets: readonly IProtocolV2FirmwareComponentTarget[]): ProtocolV2FirmwareReleasePlan;
27
- export declare function toProtocolV2FirmwareReleaseInfo({ plan, state, release, }: {
28
- plan: ProtocolV2FirmwareReleasePlan;
29
- state: DeviceState;
30
- release: FirmwareReleaseCheckResult['release'];
31
- }): FirmwareReleaseCheckResult;
32
- export declare function getProtocolV2ComponentReleaseInfo(plan: ProtocolV2FirmwareReleasePlan, componentTarget: IProtocolV2FirmwareComponentTarget): ProtocolV2ComponentReleaseInfo | undefined;
33
- //# sourceMappingURL=protocolV2Release.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"protocolV2Release.d.ts","sourceRoot":"","sources":["../../../src/api/firmware/protocolV2Release.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAA6B,MAAM,qBAAqB,CAAC;AAI/E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EACV,WAAW,EACX,QAAQ,EACR,oBAAoB,EACpB,kCAAkC,EACnC,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EACV,0BAA0B,EAC1B,8BAA8B,EAE/B,MAAM,yCAAyC,CAAC;AACjD,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,4BAA4B,CAAC;AAEhF,eAAO,MAAM,iCAAiC,EAAE,SAAS,kCAAkC,EAO1F,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,SAAS,kCAAkC,EAEhF,CAAC;AAEF,eAAO,MAAM,8BAA8B,EAAE,SAAS,kCAAkC,EAEvF,CAAC;AAEF,MAAM,MAAM,gCAAgC,GAAG;IAC7C,KAAK,EAAE,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,GAAG;QACrC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,YAAY,CAAC,GAAG;YACtD,UAAU,EAAE,WAAW,CAAC,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC;SAChD,CAAC;KACH,CAAC;IACF,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,aAAa,CAAC;IAC5B,OAAO,EAAE,oBAAoB,GAAG,SAAS,CAAC;CAC3C,CAAC;AAEF,wBAAsB,oCAAoC,CAAC,EACzD,MAAM,EACN,YAAY,EAAE,iBAAiB,EAC/B,iBAAyB,EACzB,UAAU,GACX,EAAE;IACD,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,gCAAgC,CAAC,CA4B5C;AAED,wBAAgB,kCAAkC,CAChD,IAAI,EAAE,6BAA6B,EACnC,gBAAgB,EAAE,SAAS,kCAAkC,EAAE,GAC9D,6BAA6B,CAiC/B;AAED,wBAAgB,+BAA+B,CAAC,EAC9C,IAAI,EACJ,KAAK,EACL,OAAO,GACR,EAAE;IACD,IAAI,EAAE,6BAA6B,CAAC;IACpC,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,0BAA0B,CAAC,SAAS,CAAC,CAAC;CAChD,GAAG,0BAA0B,CAU7B;AAED,wBAAgB,iCAAiC,CAC/C,IAAI,EAAE,6BAA6B,EACnC,eAAe,EAAE,kCAAkC,GAClD,8BAA8B,GAAG,SAAS,CAmB5C"}
@@ -1,142 +0,0 @@
1
- import { sha256 } from '@noble/hashes/sha256';
2
- import { bytesToHex } from '@noble/hashes/utils';
3
- import { ERRORS, HardwareErrorCode } from '@onekeyfe/hd-shared';
4
-
5
- import type { CoreApi } from '../../types/api';
6
- import type {
7
- FirmwareArtifactReader,
8
- FirmwareArtifactReference,
9
- } from '../../types/api/firmwareUpdate';
10
- import type { FirmwareUpdatePlan } from '../../types/api/firmwareUpdatePlan';
11
-
12
- export type FirmwareMemoryArtifactEntry = {
13
- entryName: string;
14
- binary: ArrayBuffer;
15
- };
16
-
17
- export type FirmwareMemoryArtifact = {
18
- artifactId: string;
19
- binary: ArrayBuffer;
20
- materializedEntries?: FirmwareMemoryArtifactEntry[];
21
- };
22
-
23
- export type FirmwareUpdateV4MemoryHost = {
24
- preparedPlan: ReturnType<CoreApi['prepareFirmwareUpdatePlan']>;
25
- hostBindingGeneration: number;
26
- release: () => void;
27
- };
28
-
29
- let memoryHostSequence = 0;
30
-
31
- const createReference = (binary: ArrayBuffer, prefix: string): FirmwareArtifactReference => {
32
- const digest = bytesToHex(sha256(new Uint8Array(binary)));
33
- return {
34
- artifactRef: `fwmem:${prefix}:${digest.slice(0, 32)}`,
35
- size: binary.byteLength,
36
- sha256: digest,
37
- };
38
- };
39
-
40
- export function prepareFirmwareUpdateV4MemoryHost({
41
- sdk,
42
- plan,
43
- artifacts,
44
- }: {
45
- sdk: Pick<
46
- CoreApi,
47
- | 'prepareFirmwareUpdatePlan'
48
- | 'registerFirmwareUpdateHostBinding'
49
- | 'unregisterFirmwareUpdateHostBinding'
50
- >;
51
- plan: FirmwareUpdatePlan;
52
- artifacts: FirmwareMemoryArtifact[];
53
- }): FirmwareUpdateV4MemoryHost {
54
- if (plan.executor !== 'v4') {
55
- throw ERRORS.TypedError(
56
- HardwareErrorCode.RuntimeError,
57
- 'Firmware memory host only supports V4 plans'
58
- );
59
- }
60
- memoryHostSequence += 1;
61
- const hostId = `${Date.now()}:${memoryHostSequence}`;
62
- const binaries = new Map<string, Uint8Array>();
63
- const inputs = artifacts.map((input, artifactIndex) => {
64
- const artifactBinary = new Uint8Array(input.binary).slice();
65
- const artifact = createReference(
66
- artifactBinary.buffer as ArrayBuffer,
67
- `${hostId}:artifact:${artifactIndex}`
68
- );
69
- binaries.set(artifact.artifactRef, artifactBinary);
70
- const materializedEntries = input.materializedEntries?.map((entry, entryIndex) => {
71
- const entryBinary = new Uint8Array(entry.binary).slice();
72
- const entryArtifact = createReference(
73
- entryBinary.buffer as ArrayBuffer,
74
- `${hostId}:entry:${artifactIndex}:${entryIndex}`
75
- );
76
- binaries.set(entryArtifact.artifactRef, entryBinary);
77
- return {
78
- entryName: entry.entryName,
79
- artifact: entryArtifact,
80
- };
81
- });
82
- return {
83
- artifactId: input.artifactId,
84
- artifact,
85
- ...(materializedEntries?.length ? { materializedEntries } : {}),
86
- };
87
- });
88
- const preparedPlan = sdk.prepareFirmwareUpdatePlan({
89
- plan,
90
- leaseRef: `fwmemlease:${hostId}`,
91
- artifacts: inputs,
92
- });
93
- const readers = new Map<string, Uint8Array>();
94
- let readerSequence = 0;
95
- const artifactReader: FirmwareArtifactReader = {
96
- open({ artifactRef }) {
97
- const binary = binaries.get(artifactRef);
98
- if (!binary) {
99
- throw ERRORS.TypedError(
100
- HardwareErrorCode.RuntimeError,
101
- 'Firmware memory artifact is unavailable'
102
- );
103
- }
104
- readerSequence += 1;
105
- const readerId = `fwmemreader:${hostId}:${readerSequence}`;
106
- readers.set(readerId, binary);
107
- return Promise.resolve({ readerId, size: binary.byteLength });
108
- },
109
- read({ readerId, offset, length }) {
110
- const binary = readers.get(readerId);
111
- if (!binary || offset < 0 || length <= 0 || offset + length > binary.byteLength) {
112
- throw ERRORS.TypedError(
113
- HardwareErrorCode.RuntimeError,
114
- 'Firmware memory artifact read is invalid'
115
- );
116
- }
117
- const data = binary.slice(offset, offset + length).buffer;
118
- return Promise.resolve({
119
- data,
120
- bytesRead: data.byteLength,
121
- eof: offset + length === binary.byteLength,
122
- });
123
- },
124
- close({ readerId }) {
125
- readers.delete(readerId);
126
- return Promise.resolve();
127
- },
128
- };
129
- const hostBindingGeneration = sdk.registerFirmwareUpdateHostBinding({
130
- artifactReader,
131
- preparedPlanDigest: preparedPlan.preparedPlanDigest,
132
- });
133
- return {
134
- preparedPlan,
135
- hostBindingGeneration,
136
- release: () => {
137
- sdk.unregisterFirmwareUpdateHostBinding(hostBindingGeneration);
138
- readers.clear();
139
- binaries.clear();
140
- },
141
- };
142
- }