@onekeyfe/hd-core 1.2.0-alpha.96 → 1.2.0-alpha.98
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__/firmware-update/device-update-bootloader.test.ts +8 -1
- package/__tests__/firmware-update/firmware-prepared-host-digest.test.ts +106 -2
- package/__tests__/firmware-update/firmware-prepared-resource-archive.test.ts +150 -0
- package/__tests__/firmware-update/firmware-update-bootloader-poll.test.ts +112 -0
- package/__tests__/firmware-update/firmware-update-plan.test.ts +101 -0
- package/__tests__/firmware-update/firmware-update-prepared-resource-executors.test.ts +326 -0
- package/__tests__/firmware-update/firmware-update-v2-download-before-boot.test.ts +2 -2
- package/__tests__/protocol-v2.test.ts +131 -0
- package/dist/api/FirmwareUpdateV2.d.ts.map +1 -1
- package/dist/api/FirmwareUpdateV3.d.ts.map +1 -1
- package/dist/api/FirmwareUpdateV4.d.ts +2 -0
- package/dist/api/FirmwareUpdateV4.d.ts.map +1 -1
- package/dist/api/device/DeviceUpdateBootloader.d.ts.map +1 -1
- package/dist/api/firmware/FirmwarePreparedResourceArchive.d.ts +11 -0
- package/dist/api/firmware/FirmwarePreparedResourceArchive.d.ts.map +1 -0
- package/dist/api/firmware/FirmwareUpdateBaseMethod.d.ts.map +1 -1
- package/dist/api/firmware/FirmwareUpdatePlan.d.ts.map +1 -1
- package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts +6 -1
- package/dist/api/firmware/FirmwareUpdatePreparedPlan.d.ts.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.js +359 -157
- package/dist/types/api/deviceUpdateBootloader.d.ts.map +1 -1
- package/dist/types/api/firmwareUpdate.d.ts +1 -1
- package/dist/types/api/firmwareUpdate.d.ts.map +1 -1
- package/dist/types/api/firmwareUpdatePlan.d.ts +2 -2
- package/dist/types/api/firmwareUpdatePlan.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/api/FirmwareUpdateV2.ts +95 -72
- package/src/api/FirmwareUpdateV3.ts +74 -51
- package/src/api/FirmwareUpdateV4.ts +72 -7
- package/src/api/device/DeviceUpdateBootloader.ts +17 -12
- package/src/api/firmware/FirmwarePreparedResourceArchive.ts +207 -0
- package/src/api/firmware/FirmwareUpdateBaseMethod.ts +2 -0
- package/src/api/firmware/FirmwareUpdatePlan.ts +70 -48
- package/src/api/firmware/FirmwareUpdatePreparedPlan.ts +17 -0
- package/src/types/api/deviceUpdateBootloader.ts +1 -0
- package/src/types/api/firmwareUpdate.ts +2 -1
- package/src/types/api/firmwareUpdatePlan.ts +2 -2
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
import { sha256 } from '@noble/hashes/sha256';
|
|
2
|
+
import { bytesToHex } from '@noble/hashes/utils';
|
|
3
|
+
import { EDeviceType, EFirmwareType } from '@onekeyfe/hd-shared';
|
|
4
|
+
import JSZip from 'jszip';
|
|
5
|
+
|
|
6
|
+
import FirmwareUpdateV2 from '../../src/api/FirmwareUpdateV2';
|
|
7
|
+
import FirmwareUpdateV3 from '../../src/api/FirmwareUpdateV3';
|
|
8
|
+
import { DataManager } from '../../src/data-manager';
|
|
9
|
+
import {
|
|
10
|
+
registerFirmwareUpdateHostBinding,
|
|
11
|
+
unregisterFirmwareUpdateHostBinding,
|
|
12
|
+
} from '../../src/api/firmware/FirmwareHostBinding';
|
|
13
|
+
import { prepareFirmwareUpdatePlan } from '../../src/api/firmware/FirmwareUpdatePreparedPlan';
|
|
14
|
+
import { digestFirmwareUpdateContract } from '../../src/api/firmware/FirmwareUpdatePlan';
|
|
15
|
+
import {
|
|
16
|
+
updateResourcesFromSources,
|
|
17
|
+
uploadFirmwareFromSource,
|
|
18
|
+
} from '../../src/api/firmware/uploadFirmware';
|
|
19
|
+
import * as utils from '../../src/utils';
|
|
20
|
+
|
|
21
|
+
import type {
|
|
22
|
+
FirmwareArtifactReader,
|
|
23
|
+
FirmwareArtifactReference,
|
|
24
|
+
} from '../../src/types/api/firmwareUpdate';
|
|
25
|
+
import type { FirmwareUpdatePlan } from '../../src/types/api/firmwareUpdatePlan';
|
|
26
|
+
|
|
27
|
+
jest.mock('../../src/data/config', () => ({
|
|
28
|
+
getSDKVersion: jest.fn(() => '1.0.0'),
|
|
29
|
+
DEFAULT_DOMAIN: 'https://jssdk.onekey.so/1.0.0/',
|
|
30
|
+
}));
|
|
31
|
+
|
|
32
|
+
jest.mock('../../src/api/firmware/getBinary', () => ({
|
|
33
|
+
getBinary: jest.fn(),
|
|
34
|
+
getInfo: jest.fn(),
|
|
35
|
+
getSysResourceBinary: jest.fn(),
|
|
36
|
+
}));
|
|
37
|
+
|
|
38
|
+
jest.mock('../../src/api/firmware/uploadFirmware', () => ({
|
|
39
|
+
updateResources: jest.fn(),
|
|
40
|
+
updateResourcesFromSources: jest.fn(),
|
|
41
|
+
uploadFirmwareFromSource: jest.fn(),
|
|
42
|
+
}));
|
|
43
|
+
|
|
44
|
+
jest.mock('../../src/device/DevicePool', () => ({
|
|
45
|
+
DevicePool: {
|
|
46
|
+
clearDeviceCache: jest.fn(),
|
|
47
|
+
devicesCache: {},
|
|
48
|
+
},
|
|
49
|
+
}));
|
|
50
|
+
|
|
51
|
+
const mockUpdateResourcesFromSources = updateResourcesFromSources as jest.MockedFunction<
|
|
52
|
+
typeof updateResourcesFromSources
|
|
53
|
+
>;
|
|
54
|
+
const mockUploadFirmwareFromSource = uploadFirmwareFromSource as jest.MockedFunction<
|
|
55
|
+
typeof uploadFirmwareFromSource
|
|
56
|
+
>;
|
|
57
|
+
|
|
58
|
+
const createReference = (artifactRef: string, binary: ArrayBuffer): FirmwareArtifactReference => ({
|
|
59
|
+
artifactRef,
|
|
60
|
+
size: binary.byteLength,
|
|
61
|
+
sha256: bytesToHex(sha256(new Uint8Array(binary))),
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
const createReader = (artifacts: Map<string, ArrayBuffer>): FirmwareArtifactReader => {
|
|
65
|
+
const opened = new Map<string, ArrayBuffer>();
|
|
66
|
+
let sequence = 0;
|
|
67
|
+
return {
|
|
68
|
+
open({ artifactRef }) {
|
|
69
|
+
const binary = artifacts.get(artifactRef);
|
|
70
|
+
if (!binary) throw new Error(`missing artifact: ${artifactRef}`);
|
|
71
|
+
sequence += 1;
|
|
72
|
+
const readerId = `reader-${sequence}`;
|
|
73
|
+
opened.set(readerId, binary);
|
|
74
|
+
return Promise.resolve({ readerId, size: binary.byteLength });
|
|
75
|
+
},
|
|
76
|
+
read({ readerId, offset, length }) {
|
|
77
|
+
const binary = opened.get(readerId);
|
|
78
|
+
if (!binary) throw new Error(`missing reader: ${readerId}`);
|
|
79
|
+
const data = binary.slice(offset, offset + length);
|
|
80
|
+
return Promise.resolve({
|
|
81
|
+
data,
|
|
82
|
+
bytesRead: data.byteLength,
|
|
83
|
+
eof: offset + length === binary.byteLength,
|
|
84
|
+
});
|
|
85
|
+
},
|
|
86
|
+
close({ readerId }) {
|
|
87
|
+
opened.delete(readerId);
|
|
88
|
+
return Promise.resolve();
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
const createPreparedPlan = async (
|
|
94
|
+
executor: 'v2' | 'v3',
|
|
95
|
+
componentTarget: 'firmware' | 'ble' = 'firmware'
|
|
96
|
+
) => {
|
|
97
|
+
const firmwareBinary = Uint8Array.from([5, 6, 7, 8]).buffer;
|
|
98
|
+
const resourceBinary = Uint8Array.from([1, 2, 3, 4]).buffer;
|
|
99
|
+
const zip = new JSZip();
|
|
100
|
+
zip.file('images/logo.bin', resourceBinary);
|
|
101
|
+
const archiveBinary = await zip.generateAsync({ type: 'arraybuffer' });
|
|
102
|
+
const firmwareArtifact = createReference('firmware-artifact', firmwareBinary);
|
|
103
|
+
const archiveArtifact = createReference('resource-archive', archiveBinary);
|
|
104
|
+
const resourceArtifact = createReference('resource-entry', resourceBinary);
|
|
105
|
+
const planWithoutDigest: Omit<FirmwareUpdatePlan, 'planDigest'> = {
|
|
106
|
+
schemaVersion: 2,
|
|
107
|
+
executor,
|
|
108
|
+
deviceIdentity: executor === 'v2' ? 'touch-device' : 'pro-device',
|
|
109
|
+
deviceModel: String(executor === 'v2' ? EDeviceType.Touch : EDeviceType.Pro),
|
|
110
|
+
firmwareType: EFirmwareType.Universal,
|
|
111
|
+
platform: 'desktop',
|
|
112
|
+
artifacts: [
|
|
113
|
+
{
|
|
114
|
+
artifactId: componentTarget,
|
|
115
|
+
role: componentTarget,
|
|
116
|
+
target: componentTarget,
|
|
117
|
+
url: `https://firmware.onekey.so/${componentTarget}.bin`,
|
|
118
|
+
container: 'raw',
|
|
119
|
+
expectedSize: firmwareArtifact.size,
|
|
120
|
+
expectedSha256: firmwareArtifact.sha256,
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
artifactId: 'resource',
|
|
124
|
+
role: 'resource',
|
|
125
|
+
target: 'resource',
|
|
126
|
+
url: 'https://firmware.onekey.so/resource.zip',
|
|
127
|
+
container: 'zip',
|
|
128
|
+
expectedSize: archiveArtifact.size,
|
|
129
|
+
expectedSha256: archiveArtifact.sha256,
|
|
130
|
+
},
|
|
131
|
+
],
|
|
132
|
+
targetsToUpdate: [componentTarget, 'resource'],
|
|
133
|
+
};
|
|
134
|
+
const plan: FirmwareUpdatePlan = {
|
|
135
|
+
...planWithoutDigest,
|
|
136
|
+
planDigest: digestFirmwareUpdateContract(planWithoutDigest),
|
|
137
|
+
};
|
|
138
|
+
const preparedPlan = prepareFirmwareUpdatePlan({
|
|
139
|
+
plan,
|
|
140
|
+
leaseRef: `${executor}-resource-executor`,
|
|
141
|
+
artifacts: [
|
|
142
|
+
{ artifactId: componentTarget, artifact: firmwareArtifact },
|
|
143
|
+
{
|
|
144
|
+
artifactId: 'resource',
|
|
145
|
+
artifact: archiveArtifact,
|
|
146
|
+
materializedEntries: [{ entryName: 'images/logo.bin', artifact: resourceArtifact }],
|
|
147
|
+
},
|
|
148
|
+
],
|
|
149
|
+
});
|
|
150
|
+
return {
|
|
151
|
+
firmwareArtifact,
|
|
152
|
+
firmwareBinary,
|
|
153
|
+
archiveArtifact,
|
|
154
|
+
archiveBinary,
|
|
155
|
+
resourceBinary,
|
|
156
|
+
preparedPlan,
|
|
157
|
+
};
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
describe('prepared resource executors', () => {
|
|
161
|
+
afterEach(() => {
|
|
162
|
+
unregisterFirmwareUpdateHostBinding();
|
|
163
|
+
jest.restoreAllMocks();
|
|
164
|
+
jest.clearAllMocks();
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
test('FirmwareUpdateV3 derives resource bytes from the approved ZIP without duplicate entries', async () => {
|
|
168
|
+
const prepared = await createPreparedPlan('v3');
|
|
169
|
+
const artifactReader = createReader(
|
|
170
|
+
new Map([
|
|
171
|
+
[prepared.firmwareArtifact.artifactRef, prepared.firmwareBinary],
|
|
172
|
+
[prepared.archiveArtifact.artifactRef, prepared.archiveBinary],
|
|
173
|
+
])
|
|
174
|
+
);
|
|
175
|
+
const hostBindingGeneration = registerFirmwareUpdateHostBinding({
|
|
176
|
+
preparedPlanDigest: prepared.preparedPlan.preparedPlanDigest,
|
|
177
|
+
artifactReader,
|
|
178
|
+
});
|
|
179
|
+
const method = new FirmwareUpdateV3({
|
|
180
|
+
id: 1,
|
|
181
|
+
payload: {
|
|
182
|
+
method: 'firmwareUpdateV3',
|
|
183
|
+
platform: 'desktop',
|
|
184
|
+
preparedPlan: prepared.preparedPlan,
|
|
185
|
+
hostBindingGeneration,
|
|
186
|
+
artifacts: { firmware: prepared.firmwareArtifact },
|
|
187
|
+
},
|
|
188
|
+
});
|
|
189
|
+
method.init();
|
|
190
|
+
|
|
191
|
+
const result = await (method as any).prepareResourceInput(EFirmwareType.Universal);
|
|
192
|
+
expect(result.resourceEntries).toHaveLength(1);
|
|
193
|
+
expect(result.resourceEntries[0].entryName).toBe('logo.bin');
|
|
194
|
+
await expect(result.resourceEntries[0].source.readAt(0, 4)).resolves.toEqual(
|
|
195
|
+
prepared.resourceBinary
|
|
196
|
+
);
|
|
197
|
+
await (method as any).closeArtifactSources();
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
test('FirmwareUpdateV2 executes prepared resources without a live release record', async () => {
|
|
201
|
+
const prepared = await createPreparedPlan('v2');
|
|
202
|
+
const artifactReader = createReader(
|
|
203
|
+
new Map([
|
|
204
|
+
[prepared.firmwareArtifact.artifactRef, prepared.firmwareBinary],
|
|
205
|
+
[prepared.archiveArtifact.artifactRef, prepared.archiveBinary],
|
|
206
|
+
])
|
|
207
|
+
);
|
|
208
|
+
const hostBindingGeneration = registerFirmwareUpdateHostBinding({
|
|
209
|
+
preparedPlanDigest: prepared.preparedPlan.preparedPlanDigest,
|
|
210
|
+
artifactReader,
|
|
211
|
+
});
|
|
212
|
+
const method = new FirmwareUpdateV2({
|
|
213
|
+
id: 1,
|
|
214
|
+
payload: {
|
|
215
|
+
method: 'firmwareUpdateV2',
|
|
216
|
+
connectId: 'touch-connect-id',
|
|
217
|
+
platform: 'desktop',
|
|
218
|
+
updateType: 'firmware',
|
|
219
|
+
artifact: prepared.firmwareArtifact,
|
|
220
|
+
preparedPlan: prepared.preparedPlan,
|
|
221
|
+
hostBindingGeneration,
|
|
222
|
+
},
|
|
223
|
+
});
|
|
224
|
+
method.init();
|
|
225
|
+
|
|
226
|
+
const typedCall = jest.fn().mockResolvedValue({ type: 'Success' });
|
|
227
|
+
const commands = { typedCall, checkDisposed: jest.fn(), disposed: false };
|
|
228
|
+
method.device = {
|
|
229
|
+
features: {
|
|
230
|
+
deviceType: EDeviceType.Touch,
|
|
231
|
+
serialNo: 'touch-device',
|
|
232
|
+
firmwareVersion: '3.2.0',
|
|
233
|
+
bootloaderVersion: '2.8.0',
|
|
234
|
+
},
|
|
235
|
+
commands,
|
|
236
|
+
getCommands: () => commands,
|
|
237
|
+
getCurrentDeviceType: () => EDeviceType.Touch,
|
|
238
|
+
getCurrentFirmwareType: () => EFirmwareType.Universal,
|
|
239
|
+
getCurrentFirmwareVersionString: () => '3.2.0',
|
|
240
|
+
getCurrentBootloaderVersionString: () => '2.8.0',
|
|
241
|
+
getCurrentSerialNo: () => 'touch-device',
|
|
242
|
+
isBootloader: () => false,
|
|
243
|
+
isProtocolV2: () => false,
|
|
244
|
+
acquire: jest.fn().mockResolvedValue(undefined),
|
|
245
|
+
toMessageObject: jest.fn(() => ({})),
|
|
246
|
+
} as any;
|
|
247
|
+
method.postMessage = jest.fn();
|
|
248
|
+
jest.spyOn(method, 'checkDeviceToBootloader').mockImplementation(() => {
|
|
249
|
+
method.checkPromise = { promise: Promise.resolve(true) } as any;
|
|
250
|
+
});
|
|
251
|
+
jest.spyOn(utils, 'wait').mockResolvedValue(undefined);
|
|
252
|
+
const liveReleaseSpy = jest
|
|
253
|
+
.spyOn(DataManager, 'getSysResourcesLatestRelease')
|
|
254
|
+
.mockReturnValue(undefined);
|
|
255
|
+
mockUpdateResourcesFromSources.mockImplementation(async (_call, _post, _device, entries) => {
|
|
256
|
+
expect(entries).toHaveLength(1);
|
|
257
|
+
expect(entries[0].entryName).toBe('logo.bin');
|
|
258
|
+
await expect(entries[0].source.readAt(0, 4)).resolves.toEqual(prepared.resourceBinary);
|
|
259
|
+
return true;
|
|
260
|
+
});
|
|
261
|
+
mockUploadFirmwareFromSource.mockResolvedValue({ success: true } as any);
|
|
262
|
+
|
|
263
|
+
await expect(method.run()).resolves.toEqual({ success: true });
|
|
264
|
+
expect(liveReleaseSpy).not.toHaveBeenCalled();
|
|
265
|
+
expect(mockUpdateResourcesFromSources).toHaveBeenCalledTimes(1);
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
test('FirmwareUpdateV2 does not replay a plan resource during its BLE component phase', async () => {
|
|
269
|
+
const prepared = await createPreparedPlan('v2', 'ble');
|
|
270
|
+
const artifactReader = createReader(
|
|
271
|
+
new Map([
|
|
272
|
+
[prepared.firmwareArtifact.artifactRef, prepared.firmwareBinary],
|
|
273
|
+
[prepared.archiveArtifact.artifactRef, prepared.archiveBinary],
|
|
274
|
+
])
|
|
275
|
+
);
|
|
276
|
+
const hostBindingGeneration = registerFirmwareUpdateHostBinding({
|
|
277
|
+
preparedPlanDigest: prepared.preparedPlan.preparedPlanDigest,
|
|
278
|
+
artifactReader,
|
|
279
|
+
});
|
|
280
|
+
const method = new FirmwareUpdateV2({
|
|
281
|
+
id: 1,
|
|
282
|
+
payload: {
|
|
283
|
+
method: 'firmwareUpdateV2',
|
|
284
|
+
connectId: 'touch-connect-id',
|
|
285
|
+
platform: 'desktop',
|
|
286
|
+
updateType: 'ble',
|
|
287
|
+
preparedPlan: prepared.preparedPlan,
|
|
288
|
+
hostBindingGeneration,
|
|
289
|
+
},
|
|
290
|
+
});
|
|
291
|
+
method.init();
|
|
292
|
+
|
|
293
|
+
const typedCall = jest.fn().mockResolvedValue({ type: 'Success' });
|
|
294
|
+
const commands = { typedCall, checkDisposed: jest.fn(), disposed: false };
|
|
295
|
+
method.device = {
|
|
296
|
+
features: {
|
|
297
|
+
deviceType: EDeviceType.Touch,
|
|
298
|
+
serialNo: 'touch-device',
|
|
299
|
+
firmwareVersion: '3.2.0',
|
|
300
|
+
bootloaderVersion: '2.8.0',
|
|
301
|
+
},
|
|
302
|
+
commands,
|
|
303
|
+
getCommands: () => commands,
|
|
304
|
+
getCurrentDeviceType: () => EDeviceType.Touch,
|
|
305
|
+
getCurrentFirmwareType: () => EFirmwareType.Universal,
|
|
306
|
+
getCurrentFirmwareVersionString: () => '3.2.0',
|
|
307
|
+
getCurrentBootloaderVersionString: () => '2.8.0',
|
|
308
|
+
getCurrentSerialNo: () => 'touch-device',
|
|
309
|
+
isBootloader: () => false,
|
|
310
|
+
isProtocolV2: () => false,
|
|
311
|
+
acquire: jest.fn().mockResolvedValue(undefined),
|
|
312
|
+
toMessageObject: jest.fn(() => ({})),
|
|
313
|
+
} as any;
|
|
314
|
+
method.postMessage = jest.fn();
|
|
315
|
+
jest.spyOn(method, 'checkDeviceToBootloader').mockImplementation(() => {
|
|
316
|
+
method.checkPromise = { promise: Promise.resolve(true) } as any;
|
|
317
|
+
});
|
|
318
|
+
jest.spyOn(utils, 'wait').mockResolvedValue(undefined);
|
|
319
|
+
const liveReleaseSpy = jest.spyOn(DataManager, 'getSysResourcesLatestRelease');
|
|
320
|
+
mockUploadFirmwareFromSource.mockResolvedValue({ success: true } as any);
|
|
321
|
+
|
|
322
|
+
await expect(method.run()).resolves.toEqual({ success: true });
|
|
323
|
+
expect(liveReleaseSpy).not.toHaveBeenCalled();
|
|
324
|
+
expect(mockUpdateResourcesFromSources).not.toHaveBeenCalled();
|
|
325
|
+
});
|
|
326
|
+
});
|
|
@@ -151,7 +151,7 @@ describe('FirmwareUpdateV2 download-before-reboot safety', () => {
|
|
|
151
151
|
jest.restoreAllMocks();
|
|
152
152
|
});
|
|
153
153
|
|
|
154
|
-
it('rejects
|
|
154
|
+
it('rejects a prepared plan combined with legacy inputs during initialization', () => {
|
|
155
155
|
const method = new FirmwareUpdateV2({
|
|
156
156
|
id: 1,
|
|
157
157
|
payload: {
|
|
@@ -173,7 +173,7 @@ describe('FirmwareUpdateV2 download-before-reboot safety', () => {
|
|
|
173
173
|
expect(() => method.init()).toThrow(
|
|
174
174
|
expect.objectContaining({
|
|
175
175
|
errorCode: HardwareErrorCode.CallMethodInvalidParameter,
|
|
176
|
-
message: '
|
|
176
|
+
message: 'Prepared firmware plans cannot be combined with legacy firmware inputs',
|
|
177
177
|
})
|
|
178
178
|
);
|
|
179
179
|
});
|
|
@@ -5506,6 +5506,9 @@ describe('Protocol V2 firmware update targets', () => {
|
|
|
5506
5506
|
return Number(params.processedSize ?? 0) + Number(params.source.size);
|
|
5507
5507
|
});
|
|
5508
5508
|
(method as any).enterProtocolV2BootloaderMode = jest.fn().mockResolvedValue(undefined);
|
|
5509
|
+
(method as any).ensureProtocolV2BootResourceStagingIsEmpty = jest
|
|
5510
|
+
.fn()
|
|
5511
|
+
.mockResolvedValue(undefined);
|
|
5509
5512
|
(method as any).exitProtocolV2BootloaderToNormal = jest.fn().mockResolvedValue(undefined);
|
|
5510
5513
|
(method as any).waitForProtocolV2FinalFeatures = jest.fn().mockResolvedValue({});
|
|
5511
5514
|
(method as any).completeProtocolV2FinalVerification = jest.fn().mockResolvedValue({});
|
|
@@ -5579,6 +5582,9 @@ describe('Protocol V2 firmware update targets', () => {
|
|
|
5579
5582
|
Promise.resolve(Number(params.processedSize ?? 0) + Number(params.source.size))
|
|
5580
5583
|
);
|
|
5581
5584
|
(method as any).enterProtocolV2BootloaderMode = jest.fn().mockResolvedValue(undefined);
|
|
5585
|
+
(method as any).ensureProtocolV2BootResourceStagingIsEmpty = jest
|
|
5586
|
+
.fn()
|
|
5587
|
+
.mockResolvedValue(undefined);
|
|
5582
5588
|
(method as any).exitProtocolV2BootloaderToNormal = jest.fn().mockResolvedValue(undefined);
|
|
5583
5589
|
(method as any).completeProtocolV2FinalVerification = jest.fn().mockResolvedValue({});
|
|
5584
5590
|
(method as any).verifyProtocolV2StagedFile = jest.fn().mockResolvedValue(undefined);
|
|
@@ -5657,6 +5663,74 @@ describe('Protocol V2 firmware update targets', () => {
|
|
|
5657
5663
|
]);
|
|
5658
5664
|
});
|
|
5659
5665
|
|
|
5666
|
+
test('stages the mounted boot resource before any firmware install phase', () => {
|
|
5667
|
+
const method = new FirmwareUpdateV4({
|
|
5668
|
+
id: 1,
|
|
5669
|
+
payload: { method: 'firmwareUpdateV4' },
|
|
5670
|
+
});
|
|
5671
|
+
const bootResource = {
|
|
5672
|
+
devicePath: 'vol0:/loaders/bootloader/boot_resource.okpkg',
|
|
5673
|
+
};
|
|
5674
|
+
const phases = (method as any).buildProtocolV2ExecutionPhases({
|
|
5675
|
+
installSources: [{ kind: 'bootloader' }, { kind: 'component' }],
|
|
5676
|
+
resourceSources: [bootResource, { devicePath: 'vol0:/resource/images/images.okpkg' }],
|
|
5677
|
+
});
|
|
5678
|
+
|
|
5679
|
+
expect(phases.map((phase: { kind: string }) => phase.kind)).toEqual([
|
|
5680
|
+
'resource-sync',
|
|
5681
|
+
'bootloader-install',
|
|
5682
|
+
'bootloader-verify',
|
|
5683
|
+
'resource-sync',
|
|
5684
|
+
'component-install',
|
|
5685
|
+
'final-verify',
|
|
5686
|
+
]);
|
|
5687
|
+
expect(phases[0].resourceSources).toEqual([bootResource]);
|
|
5688
|
+
});
|
|
5689
|
+
|
|
5690
|
+
test('removes stale boot resource staging before a component-only reboot', async () => {
|
|
5691
|
+
const method = new FirmwareUpdateV4({
|
|
5692
|
+
id: 1,
|
|
5693
|
+
payload: { method: 'firmwareUpdateV4' },
|
|
5694
|
+
});
|
|
5695
|
+
const events: string[] = [];
|
|
5696
|
+
let stagingExists = true;
|
|
5697
|
+
const typedCall = jest.fn((requestType: string) => {
|
|
5698
|
+
if (requestType === 'FilesystemPathInfoQuery') {
|
|
5699
|
+
return Promise.resolve({
|
|
5700
|
+
type: 'FilesystemPathInfo',
|
|
5701
|
+
message: { exist: stagingExists, directory: false, size: stagingExists ? 3 : 0 },
|
|
5702
|
+
});
|
|
5703
|
+
}
|
|
5704
|
+
if (requestType === 'FilesystemFileDelete') {
|
|
5705
|
+
events.push('delete-stale-staging');
|
|
5706
|
+
stagingExists = false;
|
|
5707
|
+
return Promise.resolve({ type: 'Success', message: {} });
|
|
5708
|
+
}
|
|
5709
|
+
throw new Error(`Unexpected request: ${requestType}`);
|
|
5710
|
+
});
|
|
5711
|
+
(method as any).device = stubDevice({ getCommands: () => ({ typedCall }) });
|
|
5712
|
+
(method as any).enterProtocolV2BootloaderMode = jest.fn().mockResolvedValue(undefined);
|
|
5713
|
+
(method as any).executeProtocolV2TransferPhase = jest.fn().mockImplementation(() => {
|
|
5714
|
+
events.push('transfer-component');
|
|
5715
|
+
return Promise.resolve();
|
|
5716
|
+
});
|
|
5717
|
+
(method as any).exitProtocolV2BootloaderToNormal = jest.fn().mockImplementation(() => {
|
|
5718
|
+
events.push('reboot-normal');
|
|
5719
|
+
return Promise.resolve();
|
|
5720
|
+
});
|
|
5721
|
+
(method as any).completeProtocolV2FinalVerification = jest.fn().mockResolvedValue({});
|
|
5722
|
+
|
|
5723
|
+
await (method as any).executeProtocolV2SourceUpdate({
|
|
5724
|
+
installSources: [{ kind: 'firmware' }],
|
|
5725
|
+
resourceSources: [],
|
|
5726
|
+
});
|
|
5727
|
+
|
|
5728
|
+
expect(events).toEqual(['delete-stale-staging', 'transfer-component', 'reboot-normal']);
|
|
5729
|
+
expect(typedCall).toHaveBeenNthCalledWith(2, 'FilesystemFileDelete', 'Success', {
|
|
5730
|
+
path: 'vol0:/loaders/bootloader/boot_resource.okpkg.staging',
|
|
5731
|
+
});
|
|
5732
|
+
});
|
|
5733
|
+
|
|
5660
5734
|
test('does not request installation when the staged file size does not match', async () => {
|
|
5661
5735
|
const method = new FirmwareUpdateV4({
|
|
5662
5736
|
id: 1,
|
|
@@ -5669,6 +5743,9 @@ describe('Protocol V2 firmware update targets', () => {
|
|
|
5669
5743
|
method.postProgressMessage = jest.fn();
|
|
5670
5744
|
(method as any).protocolV2SourceUpdateProcess = jest.fn().mockResolvedValue(3);
|
|
5671
5745
|
(method as any).enterProtocolV2BootloaderMode = jest.fn().mockResolvedValue(undefined);
|
|
5746
|
+
(method as any).ensureProtocolV2BootResourceStagingIsEmpty = jest
|
|
5747
|
+
.fn()
|
|
5748
|
+
.mockResolvedValue(undefined);
|
|
5672
5749
|
(method as any).device = stubDevice({
|
|
5673
5750
|
getCommands: () => ({
|
|
5674
5751
|
typedCall: jest.fn().mockResolvedValue({
|
|
@@ -5720,6 +5797,9 @@ describe('Protocol V2 firmware update targets', () => {
|
|
|
5720
5797
|
Promise.resolve(Number(params.processedSize ?? 0) + Number(params.source.size))
|
|
5721
5798
|
);
|
|
5722
5799
|
(method as any).enterProtocolV2BootloaderMode = jest.fn().mockResolvedValue(undefined);
|
|
5800
|
+
(method as any).ensureProtocolV2BootResourceStagingIsEmpty = jest
|
|
5801
|
+
.fn()
|
|
5802
|
+
.mockResolvedValue(undefined);
|
|
5723
5803
|
(method as any).exitProtocolV2BootloaderToNormal = jest.fn().mockResolvedValue(undefined);
|
|
5724
5804
|
(method as any).completeProtocolV2FinalVerification = jest.fn().mockResolvedValue({});
|
|
5725
5805
|
(method as any).verifyProtocolV2StagedFile = jest.fn().mockResolvedValue(undefined);
|
|
@@ -6295,6 +6375,8 @@ describe('Protocol V2 firmware update targets', () => {
|
|
|
6295
6375
|
url: 'https://example.com/resource.zip',
|
|
6296
6376
|
container: 'zip' as const,
|
|
6297
6377
|
logicalName: 'protocol-v2-resource-archive',
|
|
6378
|
+
expectedSize: 3,
|
|
6379
|
+
expectedSha256: 'a'.repeat(64),
|
|
6298
6380
|
},
|
|
6299
6381
|
],
|
|
6300
6382
|
};
|
|
@@ -6399,6 +6481,8 @@ describe('Protocol V2 firmware update targets', () => {
|
|
|
6399
6481
|
url: 'https://example.com/bootloader.bin',
|
|
6400
6482
|
container: 'raw' as const,
|
|
6401
6483
|
logicalName: 'bootloader',
|
|
6484
|
+
expectedSize: componentArtifact.size,
|
|
6485
|
+
expectedSha256: componentArtifact.sha256,
|
|
6402
6486
|
targetVersion: '1.2.3',
|
|
6403
6487
|
},
|
|
6404
6488
|
],
|
|
@@ -6494,6 +6578,8 @@ describe('Protocol V2 firmware update targets', () => {
|
|
|
6494
6578
|
url: 'https://example.com/resource.zip',
|
|
6495
6579
|
container: 'zip' as const,
|
|
6496
6580
|
logicalName: 'protocol-v2-resource-archive',
|
|
6581
|
+
expectedSize: 3,
|
|
6582
|
+
expectedSha256: 'a'.repeat(64),
|
|
6497
6583
|
},
|
|
6498
6584
|
],
|
|
6499
6585
|
};
|
|
@@ -6908,6 +6994,9 @@ describe('Protocol V2 firmware update targets', () => {
|
|
|
6908
6994
|
method.postProgressMessage = jest.fn();
|
|
6909
6995
|
(method as any).protocolV2SourceUpdateProcess = jest.fn().mockResolvedValue(3);
|
|
6910
6996
|
(method as any).enterProtocolV2BootloaderMode = jest.fn().mockResolvedValue(undefined);
|
|
6997
|
+
(method as any).ensureProtocolV2BootResourceStagingIsEmpty = jest
|
|
6998
|
+
.fn()
|
|
6999
|
+
.mockResolvedValue(undefined);
|
|
6911
7000
|
(method as any).completeProtocolV2FinalVerification = jest.fn().mockResolvedValue({});
|
|
6912
7001
|
(method as any).verifyProtocolV2StagedFile = jest.fn().mockResolvedValue(undefined);
|
|
6913
7002
|
(method as any).protocolV2StartFirmwareUpdate = jest.fn();
|
|
@@ -6977,6 +7066,46 @@ describe('Protocol V2 firmware update targets', () => {
|
|
|
6977
7066
|
expect((method as any).verifyProtocolV2StagedFile).toHaveBeenCalledWith(stagingPath, 3);
|
|
6978
7067
|
});
|
|
6979
7068
|
|
|
7069
|
+
test('rewrites the mounted boot resource staging file even when the final file is current', async () => {
|
|
7070
|
+
const method = new FirmwareUpdateV4({
|
|
7071
|
+
id: 1,
|
|
7072
|
+
payload: {
|
|
7073
|
+
method: 'firmwareUpdateV4',
|
|
7074
|
+
},
|
|
7075
|
+
});
|
|
7076
|
+
|
|
7077
|
+
method.postTipMessage = jest.fn();
|
|
7078
|
+
method.postProgressMessage = jest.fn();
|
|
7079
|
+
(method as any).isProtocolV2ResourceBundleUpToDate = jest.fn().mockResolvedValue(true);
|
|
7080
|
+
(method as any).protocolV2SourceUpdateProcess = jest.fn().mockResolvedValue(3);
|
|
7081
|
+
(method as any).verifyProtocolV2StagedFile = jest.fn().mockResolvedValue(undefined);
|
|
7082
|
+
|
|
7083
|
+
const resource = {
|
|
7084
|
+
name: 'boot_resource.okpkg',
|
|
7085
|
+
source: {
|
|
7086
|
+
size: 3,
|
|
7087
|
+
readAt: jest.fn(),
|
|
7088
|
+
close: jest.fn(),
|
|
7089
|
+
},
|
|
7090
|
+
devicePath: 'vol0:/loaders/bootloader/boot_resource.okpkg',
|
|
7091
|
+
version: [1, 0, 0],
|
|
7092
|
+
payloadHash: '11'.repeat(64),
|
|
7093
|
+
headerHash: '22'.repeat(64),
|
|
7094
|
+
};
|
|
7095
|
+
|
|
7096
|
+
await (method as any).executeProtocolV2TransferPhase({
|
|
7097
|
+
installSources: [],
|
|
7098
|
+
resourceSources: [resource],
|
|
7099
|
+
});
|
|
7100
|
+
|
|
7101
|
+
const stagingPath = 'vol0:/loaders/bootloader/boot_resource.okpkg.staging';
|
|
7102
|
+
expect((method as any).isProtocolV2ResourceBundleUpToDate).not.toHaveBeenCalled();
|
|
7103
|
+
expect((method as any).protocolV2SourceUpdateProcess).toHaveBeenCalledWith(
|
|
7104
|
+
expect.objectContaining({ source: resource.source, filePath: stagingPath, totalSize: 3 })
|
|
7105
|
+
);
|
|
7106
|
+
expect((method as any).verifyProtocolV2StagedFile).toHaveBeenCalledWith(stagingPath, 3);
|
|
7107
|
+
});
|
|
7108
|
+
|
|
6980
7109
|
test('uses absolute processed_byte offsets and disables append for firmware file writes', async () => {
|
|
6981
7110
|
const method = new FirmwareUpdateV4({
|
|
6982
7111
|
id: 1,
|
|
@@ -7783,6 +7912,8 @@ describe('Protocol V2 firmware reconnect identity', () => {
|
|
|
7783
7912
|
url: 'https://example.com/bootloader.bin',
|
|
7784
7913
|
container: 'raw' as const,
|
|
7785
7914
|
logicalName: 'bootloader',
|
|
7915
|
+
expectedSize: 1,
|
|
7916
|
+
expectedSha256: 'a'.repeat(64),
|
|
7786
7917
|
},
|
|
7787
7918
|
],
|
|
7788
7919
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FirmwareUpdateV2.d.ts","sourceRoot":"","sources":["../../src/api/FirmwareUpdateV2.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,QAAQ,EAEb,KAAK,aAAa,EAKnB,MAAM,qBAAqB,CAAC;AAI7B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"FirmwareUpdateV2.d.ts","sourceRoot":"","sources":["../../src/api/FirmwareUpdateV2.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,QAAQ,EAEb,KAAK,aAAa,EAKnB,MAAM,qBAAqB,CAAC;AAI7B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AA2B1C,OAAO,KAAK,EAAE,QAAQ,EAAe,MAAM,UAAU,CAAC;AAEtD,OAAO,KAAK,EACV,sBAAsB,EACtB,yBAAyB,EAC1B,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,yCAAyC,CAAC;AAE1F,KAAK,MAAM,GAAG;IACZ,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,yBAAyB,CAAC;IACrC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,eAAe,CAAC,EAAE,KAAK,CAAC;QACtB,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,yBAAyB,CAAC;KACrC,CAAC,CAAC;IACH,cAAc,CAAC,EAAE,sBAAsB,CAAC;IACxC,YAAY,CAAC,EAAE,0BAA0B,CAAC;IAC1C,QAAQ,CAAC,EAAE,0BAA0B,CAAC,UAAU,CAAC,CAAC;IAClD,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,UAAU,GAAG,KAAK,CAAC;IAC/B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,YAAY,CAAC,EAAE,aAAa,CAAC;CAC9B,CAAC;AAkFF,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,UAAU,CAAC,MAAM,CAAC;IAC9D,YAAY,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAQ;IAE1C,IAAI;IAiGJ,cAAc,YAAa,MAAM,UAS/B;YAEY,qCAAqC;IAkBnD,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS;YA8FvC,4BAA4B;IAyB1C,qBAAqB;IAUrB,uBAAuB,CAAC,UAAU,EAAE,MAAM;IAc1C,gCAAgC,CAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAAE,YAAY,EAAE,aAAa;IAwBtF,GAAG;CAkRV"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FirmwareUpdateV3.d.ts","sourceRoot":"","sources":["../../src/api/FirmwareUpdateV3.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;
|
|
1
|
+
{"version":3,"file":"FirmwareUpdateV3.d.ts","sourceRoot":"","sources":["../../src/api/FirmwareUpdateV3.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AAc/E,OAAO,KAAK,EAEV,sBAAsB,EACvB,MAAM,6BAA6B,CAAC;AACrC,OAAO,KAAK,EAAE,QAAQ,EAAiB,MAAM,qBAAqB,CAAC;AAMnE,eAAO,MAAM,gCAAgC,UAAU,CAAC;AAaxD,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,wBAAwB,CAAC,sBAAsB,CAAC;IAC5F,YAAY,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAQ;IAE1C,OAAO,CAAC,gBAAgB,CAAS;IAEjC,OAAO,CAAC,eAAe,CAA4B;IAEnD,IAAI;IA8HE,GAAG;;;;;YAQK,aAAa;IA6D3B,OAAO,CAAC,wBAAwB;YAiBlB,kBAAkB;YAelB,oBAAoB;IAKlC,OAAO,CAAC,wBAAwB;YAgBlB,oBAAoB;YA2DpB,uBAAuB;YAuBvB,4BAA4B;YA+E5B,aAAa;IAyN3B,OAAO,CAAC,yBAAyB;IAajC,OAAO,CAAC,yBAAyB;IAQjC,OAAO,CAAC,qBAAqB;IAmB7B,OAAO,CAAC,sCAAsC;IAexC,sBAAsB,CAAC,OAAO,EAAE,MAAM;CA+E7C"}
|
|
@@ -10,6 +10,7 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
|
|
|
10
10
|
getSupportedProtocols(): readonly ["V2"];
|
|
11
11
|
private protocolV2PreparedSources;
|
|
12
12
|
private protocolV2ExecutionInLoader;
|
|
13
|
+
private protocolV2BootResourceStagingSafe;
|
|
13
14
|
private protocolV2CompletedTargetVersions;
|
|
14
15
|
private protocolV2LatestFinalFeatures?;
|
|
15
16
|
private protocolV2FinalStatusVerified;
|
|
@@ -60,6 +61,7 @@ export default class FirmwareUpdateV4 extends FirmwareUpdateBaseMethod<FirmwareU
|
|
|
60
61
|
private collectExplicitTargetBinaries;
|
|
61
62
|
private buildProtocolV2ExecutionPhases;
|
|
62
63
|
private executeProtocolV2Phases;
|
|
64
|
+
private ensureProtocolV2BootResourceStagingIsEmpty;
|
|
63
65
|
private executeProtocolV2SourceUpdate;
|
|
64
66
|
private executeProtocolV2Update;
|
|
65
67
|
private executeProtocolV2TransferPhase;
|
|
@@ -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;AAyBlG,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AAkC/E,OAAO,KAAK,EAEV,sBAAsB,EAEvB,MAAM,6BAA6B,CAAC;AA2ErC,wBAAgB,wCAAwC,CACtD,UAAU,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,EAC5C,MAAM,EAAE,sBAAsB,QAgB/B;
|
|
1
|
+
{"version":3,"file":"FirmwareUpdateV4.d.ts","sourceRoot":"","sources":["../../src/api/FirmwareUpdateV4.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAkD,MAAM,qBAAqB,CAAC;AAyBlG,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AAkC/E,OAAO,KAAK,EAEV,sBAAsB,EAEvB,MAAM,6BAA6B,CAAC;AA2ErC,wBAAgB,wCAAwC,CACtD,UAAU,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,EAC5C,MAAM,EAAE,sBAAsB,QAgB/B;AAmWD,eAAO,MAAM,oCAAoC,WACvC,WAAW,GAAG,UAAU,eACnB,MAAM,GAAG,SAAS,YAKhC,CAAC;AAEF,eAAO,MAAM,iCAAiC,0BACrB,MAAM,uBACR,MAAM,iBACZ,MAAM,eACR,MAAM,SAsBpB,CAAC;AAUF,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,wBAAwB,CAAC,sBAAsB,CAAC;IAC5F,OAAO,CAAC,8BAA8B,CAAC,CAAS;IAEhD,OAAO,CAAC,sBAAsB,CAAC,CAAS;IAExC,qBAAqB;IAIrB,OAAO,CAAC,yBAAyB,CAA4B;IAE7D,OAAO,CAAC,2BAA2B,CAAS;IAE5C,OAAO,CAAC,iCAAiC,CAAS;IAElD,OAAO,CAAC,iCAAiC,CAA6B;IAEtE,OAAO,CAAC,6BAA6B,CAAC,CAAW;IAEjD,OAAO,CAAC,6BAA6B,CAAS;IAE9C,IAAI;IA0KJ,OAAO,CAAC,8BAA8B;IAwBhC,GAAG;;;;;YAKK,aAAa;YAsHb,4BAA4B;YAkB5B,0BAA0B;YAY1B,8BAA8B;YAK9B,+BAA+B;YAqG/B,gCAAgC;YA+HhC,qCAAqC;YA0IrC,gCAAgC;YAgBhC,uCAAuC;YAmJvC,8BAA8B;IAsB5C,OAAO,CAAC,8BAA8B;IA0BtC,OAAO,CAAC,kCAAkC;IAc1C,OAAO,CAAC,gCAAgC;IAsDxC,OAAO,CAAC,6BAA6B;YAsBvB,2BAA2B;IAWzC,OAAO,CAAC,yBAAyB;IAKjC,OAAO,CAAC,oCAAoC;IAY5C,OAAO,CAAC,4BAA4B;IAUpC,OAAO,CAAC,kCAAkC;IAS1C,OAAO,CAAC,8BAA8B;YAMxB,iCAAiC;YAOjC,iCAAiC;YAmBjC,iCAAiC;IAM/C,OAAO,CAAC,uBAAuB;IAI/B,OAAO,CAAC,mCAAmC;IAe3C,OAAO,CAAC,2BAA2B;IAsBnC,OAAO,CAAC,yBAAyB;IAiBjC,OAAO,CAAC,wBAAwB;YAkBlB,iCAAiC;YAuDjC,+BAA+B;IA6E7C,OAAO,CAAC,6BAA6B;YAMvB,8BAA8B;YA+C9B,kCAAkC;IA+BhD,OAAO,CAAC,0BAA0B;IAUlC,OAAO,CAAC,yBAAyB;IAc3B,6BAA6B;YAgCrB,+BAA+B;IAkD7C,OAAO,CAAC,6BAA6B;IAkCrC,OAAO,CAAC,8BAA8B;YA6DxB,uBAAuB;YA0CvB,0CAA0C;YA6B1C,6BAA6B;YAa7B,uBAAuB;YAiCvB,8BAA8B;YAqE9B,6BAA6B;IAuE3C,OAAO,CAAC,mCAAmC;YAI7B,0BAA0B;IAaxC,OAAO,CAAC,4BAA4B;IAyGpC,OAAO,CAAC,6BAA6B;YAcvB,uCAAuC;YA0JvC,gCAAgC;YAehC,yBAAyB;YAQzB,8BAA8B;IAQ5C,OAAO,CAAC,0BAA0B;YAkBpB,mCAAmC;YAWnC,qCAAqC;YAgDrC,yBAAyB;YA8DzB,8BAA8B;IAU5C,OAAO,CAAC,kCAAkC;YAQ5B,cAAc;YAuCd,6BAA6B;YAW7B,0BAA0B;YAS1B,6BAA6B;YAmB7B,gBAAgB;IAiB9B,OAAO,CAAC,qBAAqB;CAM9B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeviceUpdateBootloader.d.ts","sourceRoot":"","sources":["../../../src/api/device/DeviceUpdateBootloader.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"DeviceUpdateBootloader.d.ts","sourceRoot":"","sources":["../../../src/api/device/DeviceUpdateBootloader.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,wBAAwB,EAAE,MAAM,sCAAsC,CAAC;AAkBhF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAE7E,MAAM,CAAC,OAAO,OAAO,sBAAuB,SAAQ,wBAAwB,CAAC,GAAG,CAAC;IAC/E,IAAI;IAOE,iCAAiC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW;IAoBtE,2CAA2C,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB;IAcvF,qBAAqB,CAAC,EAC1B,MAAM,EACN,QAAQ,EACR,YAAY,EACZ,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,cAAc,GACvB,EAAE;QACD,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,QAAQ,CAAC;QACpB,YAAY,EAAE,aAAa,CAAC;QAC5B,MAAM,CAAC,EAAE,WAAW,CAAC;QACrB,MAAM,CAAC,EAAE,kBAAkB,CAAC;KAC7B;IA0EK,GAAG;CAkGV"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { FirmwareArtifactReader } from '../../types/api/firmwareUpdate';
|
|
2
|
+
import type { FirmwareUpdatePreparedPlan } from '../../types/api/firmwareUpdatePreparedPlan';
|
|
3
|
+
export type VerifiedPreparedResourceEntry = {
|
|
4
|
+
entryName: string;
|
|
5
|
+
binary: ArrayBuffer;
|
|
6
|
+
};
|
|
7
|
+
export declare const readVerifiedPreparedResourceArchive: ({ preparedPlan, reader, }: {
|
|
8
|
+
preparedPlan: FirmwareUpdatePreparedPlan;
|
|
9
|
+
reader: FirmwareArtifactReader | undefined;
|
|
10
|
+
}) => Promise<VerifiedPreparedResourceEntry[]>;
|
|
11
|
+
//# sourceMappingURL=FirmwarePreparedResourceArchive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FirmwarePreparedResourceArchive.d.ts","sourceRoot":"","sources":["../../../src/api/firmware/FirmwarePreparedResourceArchive.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAC7E,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,4CAA4C,CAAC;AAY7F,MAAM,MAAM,6BAA6B,GAAG;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,WAAW,CAAC;CACrB,CAAC;AAgCF,eAAO,MAAM,mCAAmC;kBAIhC,0BAA0B;YAChC,sBAAsB,GAAG,SAAS;MACxC,QAAQ,6BAA6B,EAAE,CAgJ1C,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FirmwareUpdateBaseMethod.d.ts","sourceRoot":"","sources":["../../../src/api/firmware/FirmwareUpdateBaseMethod.ts"],"names":[],"mappings":";AAaA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAI3C,OAAO,KAAK,EACV,gBAAgB,EAChB,2BAA2B,EAC3B,yBAAyB,EAC1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAcnE,eAAO,MAAM,qCAAqC,OAAO,CAAC;AAE1D,KAAK,uBAAuB,GAAG,IAAI,CACjC,gBAAgB,CAAC,SAAS,CAAC,EAC3B,kBAAkB,GAAG,YAAY,GAAG,oBAAoB,GAAG,WAAW,CACvE,CAAC;AAWF,qBAAa,wBAAwB,CAAC,MAAM,CAAE,SAAQ,UAAU,CAAC,MAAM,CAAC;IACtE,YAAY,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAQ;IAE1C,IAAI,IAAI,IAAI;IAEZ,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IAInB,cAAc,IAAI,OAAO;IASzB,cAAc,YAAa,yBAAyB,UASlD;IAMF,qBAAqB,SAAU,UAAU,GAAG,KAAK,GAAG,YAAY,GAAG,UAAU,UAM3E;IAMF,mBAAmB,aACP,MAAM,gBACF,2BAA2B,YAC/B,uBAAuB,UAUjC;cAEc,qCAAqC;cAkBrC,uCAAuC;IAkBvD,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS;
|
|
1
|
+
{"version":3,"file":"FirmwareUpdateBaseMethod.d.ts","sourceRoot":"","sources":["../../../src/api/firmware/FirmwareUpdateBaseMethod.ts"],"names":[],"mappings":";AAaA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAI3C,OAAO,KAAK,EACV,gBAAgB,EAChB,2BAA2B,EAC3B,yBAAyB,EAC1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAcnE,eAAO,MAAM,qCAAqC,OAAO,CAAC;AAE1D,KAAK,uBAAuB,GAAG,IAAI,CACjC,gBAAgB,CAAC,SAAS,CAAC,EAC3B,kBAAkB,GAAG,YAAY,GAAG,oBAAoB,GAAG,WAAW,CACvE,CAAC;AAWF,qBAAa,wBAAwB,CAAC,MAAM,CAAE,SAAQ,UAAU,CAAC,MAAM,CAAC;IACtE,YAAY,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAQ;IAE1C,IAAI,IAAI,IAAI;IAEZ,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IAInB,cAAc,IAAI,OAAO;IASzB,cAAc,YAAa,yBAAyB,UASlD;IAMF,qBAAqB,SAAU,UAAU,GAAG,KAAK,GAAG,YAAY,GAAG,UAAU,UAM3E;IAMF,mBAAmB,aACP,MAAM,gBACF,2BAA2B,YAC/B,uBAAuB,UAUjC;cAEc,qCAAqC;cAkBrC,uCAAuC;IAkBvD,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS;YAwGvC,4BAA4B;IAyBpC,mBAAmB;IA8CnB,uBAAuB,CAAC,EAAE,IAAI,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE;IA6BlD,8BAA8B,CAAC,IAAI,EAAE,MAAM;IAW3C,uBAAuB,CAAC,EAC5B,OAAO,EACP,QAAQ,EACR,aAAa,EACb,SAAS,GACV,EAAE,KAAK,CAAC,cAAc,GAAG;QACxB,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB;IA4CK,iCAAiC,CAAC,EACtC,MAAM,EACN,QAAQ,EACR,aAAa,EACb,SAAS,GACV,EAAE;QACD,MAAM,EAAE,kBAAkB,CAAC;QAC3B,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB;IAsCK,sBAAsB,CAC1B,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,WAAW,GAAG,MAAM,EAC3B,SAAS,EAAE,OAAO,EAClB,QAAQ,EAAE,MAAM,GAAG,IAAI;IAgFnB,MAAM,CAAC,UAAU,EAAE,UAAU;CAsBpC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FirmwareUpdatePlan.d.ts","sourceRoot":"","sources":["../../../src/api/firmware/FirmwareUpdatePlan.ts"],"names":[],"mappings":"AAEA,OAAO,EAAe,aAAa,EAA6B,MAAM,qBAAqB,CAAC;AAU5F,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAC7E,OAAO,KAAK,EACV,kBAAkB,EAElB,6BAA6B,EAC7B,wBAAwB,EACzB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,QAAQ,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAEvE,KAAK,sBAAsB,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG,WAAW,CAAC;AAEjF,KAAK,aAAa,GAAG;IACnB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AA+GF,eAAO,MAAM,4BAA4B,UAAW,OAAO,KAAG,MAG3D,CAAC;
|
|
1
|
+
{"version":3,"file":"FirmwareUpdatePlan.d.ts","sourceRoot":"","sources":["../../../src/api/firmware/FirmwareUpdatePlan.ts"],"names":[],"mappings":"AAEA,OAAO,EAAe,aAAa,EAA6B,MAAM,qBAAqB,CAAC;AAU5F,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAC7E,OAAO,KAAK,EACV,kBAAkB,EAElB,6BAA6B,EAC7B,wBAAwB,EACzB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,KAAK,EAAE,QAAQ,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAEvE,KAAK,sBAAsB,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG,WAAW,CAAC;AAEjF,KAAK,aAAa,GAAG;IACnB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AA+GF,eAAO,MAAM,4BAA4B,UAAW,OAAO,KAAG,MAG3D,CAAC;AAgCJ,eAAO,MAAM,sCAAsC,UAC1C,OAAO,KACb,6BAA6B,EAa/B,CAAC;AAEF,eAAO,MAAM,uCAAuC,UAC3C,OAAO,KACb,sBAAsB,EAaxB,CAAC;AAuBF,eAAO,MAAM,4BAA4B,+BAavC,CAAC;AAEH,eAAO,MAAM,0BAA0B,aAOrC,CAAC;AAYH,eAAO,MAAM,wBAAwB,UAAW,OAAO,KAAG,kBAmHzD,CAAC;AAkPF,MAAM,MAAM,yCAAyC,GAAG;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC,sBAAsB,EAAE,gBAAgB,CAAC,CAAC;IAC1D,SAAS,EAAE,KAAK,GAAG,KAAK,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,eAAO,MAAM,sCAAsC;cAMvC,QAAQ;kBACJ,aAAa;cACjB,sBAAsB;eACrB,yCAAyC,EAAE;MACpD,kBAmBH,CAAC;AAEF,eAAO,MAAM,iCAAiC;cASlC,QAAQ;kBACJ,aAAa;cACjB,sBAAsB;aACvB,aAAa,GAAG,SAAS;qBACjB,SAAS,sBAAsB,EAAE;;qBAEjC,yBAAyB,GAAG,SAAS;MACpD,kBA6DH,CAAC;AAEF,eAAO,MAAM,uBAAuB;cASxB,QAAQ;kBACJ,aAAa;cACjB,sBAAsB;cACtB,gBAAgB;SACrB,gBAAgB;;;MAGnB,kBA0JH,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { FirmwareUpdatePreparedArtifactInput, FirmwareUpdatePreparedPlan } from '../../types/api/firmwareUpdatePreparedPlan';
|
|
1
|
+
import type { FirmwareUpdatePreparedArtifact, FirmwareUpdatePreparedArtifactInput, FirmwareUpdatePreparedPlan } from '../../types/api/firmwareUpdatePreparedPlan';
|
|
2
2
|
import type { FirmwareArtifactReference } from '../../types/api/firmwareUpdate';
|
|
3
3
|
import type { FirmwareUpdatePlan } from '../../types/api/firmwareUpdatePlan';
|
|
4
4
|
export declare const getFirmwareUpdateResourceName: (value: unknown) => string;
|
|
@@ -8,6 +8,11 @@ export declare const prepareFirmwareUpdatePlan: ({ plan: value, leaseRef, artifa
|
|
|
8
8
|
artifacts: FirmwareUpdatePreparedArtifactInput[];
|
|
9
9
|
}) => FirmwareUpdatePreparedPlan;
|
|
10
10
|
export declare const validateFirmwareUpdatePreparedPlan: (value: unknown) => FirmwareUpdatePreparedPlan;
|
|
11
|
+
export declare const getFirmwareUpdatePreparedRawArtifact: ({ preparedPlan: value, target, role, }: {
|
|
12
|
+
preparedPlan: unknown;
|
|
13
|
+
target: FirmwareUpdatePreparedArtifact['target'];
|
|
14
|
+
role: FirmwareUpdatePreparedArtifact['role'];
|
|
15
|
+
}) => FirmwareUpdatePreparedArtifact;
|
|
11
16
|
export declare const assertFirmwareUpdatePreparedPlanDeviceIdentity: ({ preparedPlan: value, deviceIdentity: reportedIdentity, bootloaderMode, deviceModel, }: {
|
|
12
17
|
preparedPlan: unknown;
|
|
13
18
|
deviceIdentity: string | undefined;
|