@onekeyfe/hd-core 1.1.32 → 1.1.34-alpha.1
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/firmware-update-v2-download-before-boot.test.ts +394 -0
- package/__tests__/kaspaSignTransaction.test.ts +60 -0
- package/__tests__/networkUtils.test.ts +386 -0
- package/dist/api/FirmwareUpdateV2.d.ts.map +1 -1
- package/dist/api/firmware/getBinary.d.ts +7 -3
- package/dist/api/firmware/getBinary.d.ts.map +1 -1
- package/dist/api/kaspa/KaspaSignTransaction.d.ts.map +1 -1
- package/dist/device/DeviceCommands.d.ts +4 -4
- package/dist/index.d.ts +12 -3
- package/dist/index.js +323 -45
- package/dist/utils/assets.d.ts +2 -1
- package/dist/utils/assets.d.ts.map +1 -1
- package/dist/utils/networkUtils.d.ts +9 -1
- package/dist/utils/networkUtils.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/api/FirmwareUpdateV2.ts +122 -27
- package/src/api/firmware/getBinary.ts +8 -3
- package/src/api/kaspa/KaspaSignTransaction.ts +12 -1
- package/src/utils/assets.ts +4 -1
- package/src/utils/networkUtils.ts +270 -14
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
|
|
3
|
+
import { httpRequest } from '../src/utils/networkUtils';
|
|
4
|
+
|
|
5
|
+
describe('networkUtils httpRequest retry bounds', () => {
|
|
6
|
+
afterEach(() => {
|
|
7
|
+
jest.restoreAllMocks();
|
|
8
|
+
jest.useRealTimers();
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
it('keeps timeout, retries, and cancellation opt-in for existing callers', async () => {
|
|
12
|
+
const requestSpy = jest.spyOn(axios, 'request').mockResolvedValue({
|
|
13
|
+
status: 200,
|
|
14
|
+
data: {
|
|
15
|
+
ok: true,
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
await expect(httpRequest('https://example.com/data.json', 'json')).resolves.toEqual({
|
|
20
|
+
ok: true,
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
expect(requestSpy).toHaveBeenCalledTimes(1);
|
|
24
|
+
expect(requestSpy.mock.calls[0][0]).not.toHaveProperty('timeout');
|
|
25
|
+
expect(requestSpy.mock.calls[0][0]).not.toHaveProperty('signal');
|
|
26
|
+
expect(requestSpy.mock.calls[0][0]).not.toHaveProperty('adapter');
|
|
27
|
+
expect(requestSpy.mock.calls[0][0]).not.toHaveProperty('onDownloadProgress');
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it('passes the per-attempt timeout and stops after the configured retry count', async () => {
|
|
31
|
+
const timeoutError = Object.assign(new Error('timeout'), {
|
|
32
|
+
code: 'ECONNABORTED',
|
|
33
|
+
isAxiosError: true,
|
|
34
|
+
});
|
|
35
|
+
const requestSpy = jest.spyOn(axios, 'request').mockRejectedValue(timeoutError);
|
|
36
|
+
|
|
37
|
+
await expect(
|
|
38
|
+
httpRequest('https://example.com/firmware.bin', 'binary', {
|
|
39
|
+
timeoutMs: 1234,
|
|
40
|
+
maxRetries: 2,
|
|
41
|
+
retryDelayMs: 0,
|
|
42
|
+
})
|
|
43
|
+
).rejects.toBe(timeoutError);
|
|
44
|
+
|
|
45
|
+
expect(requestSpy).toHaveBeenCalledTimes(3);
|
|
46
|
+
expect(requestSpy).toHaveBeenNthCalledWith(
|
|
47
|
+
1,
|
|
48
|
+
expect.objectContaining({
|
|
49
|
+
timeout: 1234,
|
|
50
|
+
})
|
|
51
|
+
);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it('retries a connection deadline and stops at the configured attempt bound', async () => {
|
|
55
|
+
jest.useFakeTimers({ doNotFake: ['performance'] });
|
|
56
|
+
const requestSpy = jest.spyOn(axios, 'request').mockImplementation(
|
|
57
|
+
config =>
|
|
58
|
+
new Promise((_resolve, reject) => {
|
|
59
|
+
config.signal?.addEventListener(
|
|
60
|
+
'abort',
|
|
61
|
+
() => {
|
|
62
|
+
reject(
|
|
63
|
+
Object.assign(new Error('canceled'), {
|
|
64
|
+
__CANCEL__: true,
|
|
65
|
+
code: 'ERR_CANCELED',
|
|
66
|
+
isAxiosError: true,
|
|
67
|
+
})
|
|
68
|
+
);
|
|
69
|
+
},
|
|
70
|
+
{ once: true }
|
|
71
|
+
);
|
|
72
|
+
})
|
|
73
|
+
);
|
|
74
|
+
const requestPromise = httpRequest('https://example.com/firmware.bin', 'binary', {
|
|
75
|
+
connectTimeoutMs: 1_000,
|
|
76
|
+
maxRetries: 1,
|
|
77
|
+
retryDelayMs: 0,
|
|
78
|
+
});
|
|
79
|
+
const rejection = expect(requestPromise).rejects.toMatchObject({
|
|
80
|
+
name: 'HttpRequestPhaseTimeoutError',
|
|
81
|
+
code: 'ECONNECTTIMEDOUT',
|
|
82
|
+
message: expect.stringContaining('connect timeout'),
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
await Promise.resolve();
|
|
86
|
+
jest.advanceTimersByTime(1_000);
|
|
87
|
+
await Promise.resolve();
|
|
88
|
+
await Promise.resolve();
|
|
89
|
+
expect(requestSpy).toHaveBeenCalledTimes(2);
|
|
90
|
+
|
|
91
|
+
jest.advanceTimersByTime(1_000);
|
|
92
|
+
|
|
93
|
+
await rejection;
|
|
94
|
+
expect(requestSpy).toHaveBeenCalledTimes(2);
|
|
95
|
+
expect(requestSpy.mock.calls[0][0].adapter).toEqual(['xhr', 'http']);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it('restarts the read-idle deadline only when loaded bytes increase', async () => {
|
|
99
|
+
jest.useFakeTimers({ doNotFake: ['performance'] });
|
|
100
|
+
let requestConfig: Parameters<typeof axios.request>[0] | undefined;
|
|
101
|
+
const requestSpy = jest.spyOn(axios, 'request').mockImplementation(
|
|
102
|
+
config =>
|
|
103
|
+
new Promise((_resolve, reject) => {
|
|
104
|
+
requestConfig = config;
|
|
105
|
+
config.signal?.addEventListener(
|
|
106
|
+
'abort',
|
|
107
|
+
() => {
|
|
108
|
+
reject(
|
|
109
|
+
Object.assign(new Error('canceled'), {
|
|
110
|
+
__CANCEL__: true,
|
|
111
|
+
code: 'ERR_CANCELED',
|
|
112
|
+
isAxiosError: true,
|
|
113
|
+
})
|
|
114
|
+
);
|
|
115
|
+
},
|
|
116
|
+
{ once: true }
|
|
117
|
+
);
|
|
118
|
+
})
|
|
119
|
+
);
|
|
120
|
+
const requestPromise = httpRequest('https://example.com/firmware.bin', 'binary', {
|
|
121
|
+
connectTimeoutMs: 1_000,
|
|
122
|
+
readTimeoutMs: 2_000,
|
|
123
|
+
});
|
|
124
|
+
const rejection = expect(requestPromise).rejects.toMatchObject({
|
|
125
|
+
name: 'HttpRequestPhaseTimeoutError',
|
|
126
|
+
code: 'EREADTIMEDOUT',
|
|
127
|
+
message: expect.stringContaining('read timeout'),
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
await Promise.resolve();
|
|
131
|
+
jest.advanceTimersByTime(500);
|
|
132
|
+
requestConfig?.onDownloadProgress?.({
|
|
133
|
+
bytes: 0,
|
|
134
|
+
lengthComputable: false,
|
|
135
|
+
loaded: 0,
|
|
136
|
+
});
|
|
137
|
+
jest.advanceTimersByTime(400);
|
|
138
|
+
requestConfig?.onDownloadProgress?.({
|
|
139
|
+
bytes: 1,
|
|
140
|
+
lengthComputable: false,
|
|
141
|
+
loaded: 1,
|
|
142
|
+
});
|
|
143
|
+
jest.advanceTimersByTime(900);
|
|
144
|
+
requestConfig?.onDownloadProgress?.({
|
|
145
|
+
bytes: 1,
|
|
146
|
+
lengthComputable: false,
|
|
147
|
+
loaded: 2,
|
|
148
|
+
});
|
|
149
|
+
jest.advanceTimersByTime(1_900);
|
|
150
|
+
expect(requestConfig?.signal?.aborted).toBe(false);
|
|
151
|
+
|
|
152
|
+
requestConfig?.onDownloadProgress?.({
|
|
153
|
+
bytes: 0,
|
|
154
|
+
lengthComputable: false,
|
|
155
|
+
loaded: 2,
|
|
156
|
+
});
|
|
157
|
+
jest.advanceTimersByTime(99);
|
|
158
|
+
expect(requestConfig?.signal?.aborted).toBe(false);
|
|
159
|
+
|
|
160
|
+
jest.advanceTimersByTime(1);
|
|
161
|
+
|
|
162
|
+
await rejection;
|
|
163
|
+
expect(requestSpy).toHaveBeenCalledTimes(1);
|
|
164
|
+
expect(requestConfig?.signal?.aborted).toBe(true);
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
it('ignores progress callbacks after the attempt has settled', async () => {
|
|
168
|
+
let requestConfig: Parameters<typeof axios.request>[0] | undefined;
|
|
169
|
+
jest.spyOn(axios, 'request').mockImplementation(config => {
|
|
170
|
+
requestConfig = config;
|
|
171
|
+
return Promise.resolve({
|
|
172
|
+
status: 200,
|
|
173
|
+
data: new ArrayBuffer(4),
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
await httpRequest('https://example.com/firmware.bin', 'binary', {
|
|
178
|
+
connectTimeoutMs: 1_000,
|
|
179
|
+
readTimeoutMs: 2_000,
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
const timeoutSpy = jest.spyOn(global, 'setTimeout');
|
|
183
|
+
requestConfig?.onDownloadProgress?.({
|
|
184
|
+
bytes: 1,
|
|
185
|
+
lengthComputable: false,
|
|
186
|
+
loaded: 1,
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
expect(timeoutSpy).not.toHaveBeenCalled();
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
it.each(['ECONNRESET', 'ENOTFOUND', 'ERR_NETWORK', 'ETIMEDOUT'])(
|
|
193
|
+
'retries transient network error %s',
|
|
194
|
+
async code => {
|
|
195
|
+
const networkError = Object.assign(new Error('temporarily unreachable'), {
|
|
196
|
+
code,
|
|
197
|
+
isAxiosError: true,
|
|
198
|
+
});
|
|
199
|
+
const firmwareBinary = new ArrayBuffer(4);
|
|
200
|
+
const requestSpy = jest
|
|
201
|
+
.spyOn(axios, 'request')
|
|
202
|
+
.mockRejectedValueOnce(networkError)
|
|
203
|
+
.mockResolvedValueOnce({
|
|
204
|
+
status: 200,
|
|
205
|
+
data: firmwareBinary,
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
await expect(
|
|
209
|
+
httpRequest('https://example.com/firmware.bin', 'binary', {
|
|
210
|
+
maxRetries: 1,
|
|
211
|
+
retryDelayMs: 0,
|
|
212
|
+
})
|
|
213
|
+
).resolves.toBe(firmwareBinary);
|
|
214
|
+
|
|
215
|
+
expect(requestSpy).toHaveBeenCalledTimes(2);
|
|
216
|
+
}
|
|
217
|
+
);
|
|
218
|
+
|
|
219
|
+
it('does not retry a canceled request', async () => {
|
|
220
|
+
const canceledError = Object.assign(new Error('canceled'), {
|
|
221
|
+
__CANCEL__: true,
|
|
222
|
+
code: 'ERR_CANCELED',
|
|
223
|
+
isAxiosError: true,
|
|
224
|
+
});
|
|
225
|
+
const requestSpy = jest.spyOn(axios, 'request').mockRejectedValue(canceledError);
|
|
226
|
+
|
|
227
|
+
await expect(
|
|
228
|
+
httpRequest('https://example.com/firmware.bin', 'binary', {
|
|
229
|
+
maxRetries: 2,
|
|
230
|
+
retryDelayMs: 0,
|
|
231
|
+
})
|
|
232
|
+
).rejects.toBe(canceledError);
|
|
233
|
+
|
|
234
|
+
expect(requestSpy).toHaveBeenCalledTimes(1);
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
it('enforces an overall deadline independently from per-attempt phase deadlines', async () => {
|
|
238
|
+
jest.useFakeTimers({ doNotFake: ['performance'] });
|
|
239
|
+
const requestSpy = jest.spyOn(axios, 'request').mockImplementation(
|
|
240
|
+
() =>
|
|
241
|
+
new Promise(() => {
|
|
242
|
+
// Keep the request pending until the overall deadline aborts it.
|
|
243
|
+
})
|
|
244
|
+
);
|
|
245
|
+
const requestPromise = httpRequest('https://example.com/firmware.bin', 'binary', {
|
|
246
|
+
connectTimeoutMs: 5_000,
|
|
247
|
+
readTimeoutMs: 5_000,
|
|
248
|
+
overallTimeoutMs: 2_500,
|
|
249
|
+
maxRetries: 2,
|
|
250
|
+
retryDelayMs: 0,
|
|
251
|
+
});
|
|
252
|
+
const rejection = expect(requestPromise).rejects.toMatchObject({
|
|
253
|
+
name: 'HttpRequestOverallTimeoutError',
|
|
254
|
+
message: expect.stringContaining('2500ms'),
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
jest.advanceTimersByTime(2_500);
|
|
258
|
+
|
|
259
|
+
await rejection;
|
|
260
|
+
expect(requestSpy).toHaveBeenCalledTimes(1);
|
|
261
|
+
expect(requestSpy.mock.calls[0][0].signal?.aborted).toBe(true);
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
it('includes retry backoff in the overall deadline', async () => {
|
|
265
|
+
jest.useFakeTimers({ doNotFake: ['performance'] });
|
|
266
|
+
const networkError = Object.assign(new Error('temporarily unreachable'), {
|
|
267
|
+
code: 'ECONNRESET',
|
|
268
|
+
isAxiosError: true,
|
|
269
|
+
});
|
|
270
|
+
const requestSpy = jest.spyOn(axios, 'request').mockRejectedValue(networkError);
|
|
271
|
+
const requestPromise = httpRequest('https://example.com/firmware.bin', 'binary', {
|
|
272
|
+
overallTimeoutMs: 2_500,
|
|
273
|
+
maxRetries: 2,
|
|
274
|
+
retryDelayMs: 5_000,
|
|
275
|
+
});
|
|
276
|
+
const rejection = expect(requestPromise).rejects.toMatchObject({
|
|
277
|
+
name: 'HttpRequestOverallTimeoutError',
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
await Promise.resolve();
|
|
281
|
+
await Promise.resolve();
|
|
282
|
+
await Promise.resolve();
|
|
283
|
+
await Promise.resolve();
|
|
284
|
+
expect(requestSpy).toHaveBeenCalledTimes(1);
|
|
285
|
+
expect(jest.getTimerCount()).toBe(2);
|
|
286
|
+
jest.advanceTimersByTime(2_500);
|
|
287
|
+
|
|
288
|
+
await rejection;
|
|
289
|
+
expect(requestSpy).toHaveBeenCalledTimes(1);
|
|
290
|
+
expect(jest.getTimerCount()).toBe(0);
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
it('does not start another attempt after an absolute deadline clock jump', async () => {
|
|
294
|
+
jest
|
|
295
|
+
.spyOn(Date, 'now')
|
|
296
|
+
.mockReturnValueOnce(1_000)
|
|
297
|
+
.mockReturnValueOnce(1_000)
|
|
298
|
+
.mockReturnValue(4_000);
|
|
299
|
+
const networkError = Object.assign(new Error('temporarily unreachable'), {
|
|
300
|
+
code: 'ECONNRESET',
|
|
301
|
+
isAxiosError: true,
|
|
302
|
+
});
|
|
303
|
+
const requestSpy = jest.spyOn(axios, 'request').mockRejectedValue(networkError);
|
|
304
|
+
|
|
305
|
+
await expect(
|
|
306
|
+
httpRequest('https://example.com/firmware.bin', 'binary', {
|
|
307
|
+
overallTimeoutMs: 2_500,
|
|
308
|
+
maxRetries: 1,
|
|
309
|
+
retryDelayMs: 0,
|
|
310
|
+
})
|
|
311
|
+
).rejects.toMatchObject({
|
|
312
|
+
name: 'HttpRequestOverallTimeoutError',
|
|
313
|
+
message: expect.stringContaining('2500ms'),
|
|
314
|
+
});
|
|
315
|
+
|
|
316
|
+
expect(requestSpy).toHaveBeenCalledTimes(1);
|
|
317
|
+
});
|
|
318
|
+
|
|
319
|
+
it.each([500, 502, 503, 504])(
|
|
320
|
+
'retries transient HTTP %s and returns the next response',
|
|
321
|
+
async status => {
|
|
322
|
+
const serverError = Object.assign(new Error('unavailable'), {
|
|
323
|
+
isAxiosError: true,
|
|
324
|
+
response: {
|
|
325
|
+
status,
|
|
326
|
+
},
|
|
327
|
+
});
|
|
328
|
+
const firmwareBinary = new ArrayBuffer(4);
|
|
329
|
+
const requestSpy = jest
|
|
330
|
+
.spyOn(axios, 'request')
|
|
331
|
+
.mockRejectedValueOnce(serverError)
|
|
332
|
+
.mockResolvedValueOnce({
|
|
333
|
+
status: 200,
|
|
334
|
+
data: firmwareBinary,
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
await expect(
|
|
338
|
+
httpRequest('https://example.com/firmware.bin', 'binary', {
|
|
339
|
+
maxRetries: 1,
|
|
340
|
+
retryDelayMs: 0,
|
|
341
|
+
})
|
|
342
|
+
).resolves.toBe(firmwareBinary);
|
|
343
|
+
|
|
344
|
+
expect(requestSpy).toHaveBeenCalledTimes(2);
|
|
345
|
+
}
|
|
346
|
+
);
|
|
347
|
+
|
|
348
|
+
it.each([404, 501, 505])('does not retry HTTP %s', async status => {
|
|
349
|
+
const responseError = Object.assign(new Error('request failed'), {
|
|
350
|
+
isAxiosError: true,
|
|
351
|
+
response: {
|
|
352
|
+
status,
|
|
353
|
+
},
|
|
354
|
+
});
|
|
355
|
+
const requestSpy = jest.spyOn(axios, 'request').mockRejectedValue(responseError);
|
|
356
|
+
|
|
357
|
+
await expect(
|
|
358
|
+
httpRequest('https://example.com/firmware.bin', 'binary', {
|
|
359
|
+
maxRetries: 2,
|
|
360
|
+
retryDelayMs: 0,
|
|
361
|
+
})
|
|
362
|
+
).rejects.toBe(responseError);
|
|
363
|
+
|
|
364
|
+
expect(requestSpy).toHaveBeenCalledTimes(1);
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
it.each(['CERT_HAS_EXPIRED', 'DEPTH_ZERO_SELF_SIGNED_CERT', 'ERR_TLS_CERT_ALTNAME_INVALID'])(
|
|
368
|
+
'does not retry TLS/certificate error %s',
|
|
369
|
+
async code => {
|
|
370
|
+
const certificateError = Object.assign(new Error('certificate rejected'), {
|
|
371
|
+
code,
|
|
372
|
+
isAxiosError: true,
|
|
373
|
+
});
|
|
374
|
+
const requestSpy = jest.spyOn(axios, 'request').mockRejectedValue(certificateError);
|
|
375
|
+
|
|
376
|
+
await expect(
|
|
377
|
+
httpRequest('https://example.com/firmware.bin', 'binary', {
|
|
378
|
+
maxRetries: 2,
|
|
379
|
+
retryDelayMs: 0,
|
|
380
|
+
})
|
|
381
|
+
).rejects.toBe(certificateError);
|
|
382
|
+
|
|
383
|
+
expect(requestSpy).toHaveBeenCalledTimes(1);
|
|
384
|
+
}
|
|
385
|
+
);
|
|
386
|
+
});
|
|
@@ -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;AAmB1C,OAAO,KAAK,EAAE,QAAQ,EAAe,MAAM,UAAU,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;AAmB1C,OAAO,KAAK,EAAE,QAAQ,EAAe,MAAM,UAAU,CAAC;AAItD,KAAK,MAAM,GAAG;IACZ,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,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;AA2EF,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,UAAU,CAAC,MAAM,CAAC;IAC9D,YAAY,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAQ;IAE1C,IAAI;IA6CJ,cAAc,YAAa,MAAM,UAS/B;YAEY,qCAAqC;IAkBnD,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS;YAqFvC,4BAA4B;IAuB1C,qBAAqB,CAAC,QAAQ,EAAE,QAAQ;IAUxC,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM;IAc9D,gCAAgC,CAAC,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAAE,YAAY,EAAE,aAAa;IAwBtF,GAAG;CAwJV"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
1
2
|
import type { Features } from '../../types';
|
|
3
|
+
import type { HttpRequestOptions } from '../../utils/networkUtils';
|
|
2
4
|
import type { EFirmwareType } from '@onekeyfe/hd-shared';
|
|
5
|
+
export type FirmwareBinary = ArrayBuffer | Buffer;
|
|
3
6
|
export interface GetInfoProps {
|
|
4
7
|
features: Features;
|
|
5
8
|
updateType: 'firmware' | 'ble';
|
|
@@ -9,9 +12,10 @@ export interface GetInfoProps {
|
|
|
9
12
|
}
|
|
10
13
|
interface GetBinaryProps extends GetInfoProps {
|
|
11
14
|
version?: number[];
|
|
15
|
+
requestOptions?: HttpRequestOptions;
|
|
12
16
|
}
|
|
13
|
-
export declare const getBinary: ({ features, updateType, version, isUpdateBootloader, firmwareType, }: GetBinaryProps) => Promise<{
|
|
14
|
-
binary:
|
|
17
|
+
export declare const getBinary: ({ features, updateType, version, isUpdateBootloader, firmwareType, requestOptions, }: GetBinaryProps) => Promise<{
|
|
18
|
+
binary: FirmwareBinary;
|
|
15
19
|
required: boolean;
|
|
16
20
|
url: string;
|
|
17
21
|
firmwareType?: EFirmwareType | undefined;
|
|
@@ -34,7 +38,7 @@ export declare const getBinary: ({ features, updateType, version, isUpdateBootlo
|
|
|
34
38
|
};
|
|
35
39
|
}>;
|
|
36
40
|
export declare const getSysResourceBinary: (url: string) => Promise<{
|
|
37
|
-
binary:
|
|
41
|
+
binary: FirmwareBinary;
|
|
38
42
|
}>;
|
|
39
43
|
export declare const getInfo: ({ features, updateType, targetVersion, firmwareType }: GetInfoProps) => import("../../types").IFirmwareReleaseInfo | null | undefined;
|
|
40
44
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getBinary.d.ts","sourceRoot":"","sources":["../../../src/api/firmware/getBinary.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,EAAE,UAAU,GAAG,KAAK,CAAC;IAC/B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,aAAa,CAAC;CAC7B;AAED,UAAU,cAAe,SAAQ,YAAY;IAC3C,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"getBinary.d.ts","sourceRoot":"","sources":["../../../src/api/firmware/getBinary.ts"],"names":[],"mappings":";AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGzD,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,MAAM,CAAC;AAElD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,QAAQ,CAAC;IACnB,UAAU,EAAE,UAAU,GAAG,KAAK,CAAC;IAC/B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,aAAa,CAAC;CAC7B;AAED,UAAU,cAAe,SAAQ,YAAY;IAC3C,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,cAAc,CAAC,EAAE,kBAAkB,CAAC;CACrC;AAED,eAAO,MAAM,SAAS,yFAOnB,cAAc;;;;;;;;;;;;;;;;;;;;;;EAsChB,CAAC;AAEF,eAAO,MAAM,oBAAoB,QAAe,MAAM;;EAWrD,CAAC;AAEF,eAAO,MAAM,OAAO,0DAA2D,YAAY,kEAe1F,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"KaspaSignTransaction.d.ts","sourceRoot":"","sources":["../../../src/api/kaspa/KaspaSignTransaction.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAK3C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,KAAK,EAGV,0BAA0B,EAC1B,cAAc,EACf,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAEV,cAAc,EAEd,SAAS,EACV,MAAM,wBAAwB,CAAC;AAQhC,MAAM,CAAC,OAAO,OAAO,oBAAqB,SAAQ,UAAU,CAAC,0BAA0B,CAAC;IACtF,SAAS,UAAS;IAGlB,cAAc,UAAS;IAEvB,iBAAiB,UAAS;IAE1B,IAAI;IA4GJ,eAAe;;;;;;;;IAWf,uBAAuB;;;;;;;;IAejB,gBAAgB,CACpB,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,oBAAoB,CAAC,qBAAqB,CAAC,GAAG,oBAAoB,CAAC,eAAe,CAAC,EACxF,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,cAAc,EAAE,GAC1B,OAAO,CAAC,cAAc,EAAE,CAAC;IA0CtB,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM;IA8ElF,YAAY,CAChB,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,oBAAoB,CAAC,gBAAgB,CAAC,GACpD,OAAO,CAAC,cAAc,EAAE,CAAC;IAmGtB,GAAG;
|
|
1
|
+
{"version":3,"file":"KaspaSignTransaction.d.ts","sourceRoot":"","sources":["../../../src/api/kaspa/KaspaSignTransaction.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAK3C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,KAAK,EAGV,0BAA0B,EAC1B,cAAc,EACf,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAEV,cAAc,EAEd,SAAS,EACV,MAAM,wBAAwB,CAAC;AAQhC,MAAM,CAAC,OAAO,OAAO,oBAAqB,SAAQ,UAAU,CAAC,0BAA0B,CAAC;IACtF,SAAS,UAAS;IAGlB,cAAc,UAAS;IAEvB,iBAAiB,UAAS;IAE1B,IAAI;IA4GJ,eAAe;;;;;;;;IAWf,uBAAuB;;;;;;;;IAejB,gBAAgB,CACpB,SAAS,EAAE,SAAS,EACpB,GAAG,EAAE,oBAAoB,CAAC,qBAAqB,CAAC,GAAG,oBAAoB,CAAC,eAAe,CAAC,EACxF,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,cAAc,EAAE,GAC1B,OAAO,CAAC,cAAc,EAAE,CAAC;IA0CtB,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM;IA8ElF,YAAY,CAChB,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,oBAAoB,CAAC,gBAAgB,CAAC,GACpD,OAAO,CAAC,cAAc,EAAE,CAAC;IAmGtB,GAAG;CAuGV"}
|
|
@@ -31,7 +31,7 @@ export declare const cancelDeviceInPrompt: (device: Device, expectResponse?: boo
|
|
|
31
31
|
};
|
|
32
32
|
} | {
|
|
33
33
|
success: boolean;
|
|
34
|
-
error: 0 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 200 | 300 | 301 | 302 | 303 | 304 | 305 | 400 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 500 | 600 | 601 | 602 | 603 | 700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 800 | 801 | 802 | 803 | 804 | 805 | 806 | 807 | 808 | 809 | 810 | 811 | 812 | 813 | 814 | 815 | 816 | 817 | 818 | 819 | 820 | 821 | 822 | 823 | 824 | 825 | 826 | 827 | 828 | 900 | 901 | 902;
|
|
34
|
+
error: 0 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 200 | 300 | 301 | 302 | 303 | 304 | 305 | 400 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 500 | 600 | 601 | 602 | 603 | 700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 800 | 801 | 802 | 803 | 804 | 805 | 806 | 807 | 808 | 809 | 810 | 811 | 812 | 813 | 814 | 815 | 816 | 817 | 818 | 819 | 820 | 821 | 822 | 823 | 824 | 825 | 826 | 827 | 828 | 829 | 900 | 901 | 902;
|
|
35
35
|
payload: {
|
|
36
36
|
message: string;
|
|
37
37
|
};
|
|
@@ -50,7 +50,7 @@ export declare const cancelDeviceWithInitialize: (device: Device) => Promise<{
|
|
|
50
50
|
};
|
|
51
51
|
} | {
|
|
52
52
|
success: boolean;
|
|
53
|
-
error: 0 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 200 | 300 | 301 | 302 | 303 | 304 | 305 | 400 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 500 | 600 | 601 | 602 | 603 | 700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 800 | 801 | 802 | 803 | 804 | 805 | 806 | 807 | 808 | 809 | 810 | 811 | 812 | 813 | 814 | 815 | 816 | 817 | 818 | 819 | 820 | 821 | 822 | 823 | 824 | 825 | 826 | 827 | 828 | 900 | 901 | 902;
|
|
53
|
+
error: 0 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 200 | 300 | 301 | 302 | 303 | 304 | 305 | 400 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 500 | 600 | 601 | 602 | 603 | 700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 800 | 801 | 802 | 803 | 804 | 805 | 806 | 807 | 808 | 809 | 810 | 811 | 812 | 813 | 814 | 815 | 816 | 817 | 818 | 819 | 820 | 821 | 822 | 823 | 824 | 825 | 826 | 827 | 828 | 829 | 900 | 901 | 902;
|
|
54
54
|
payload: {
|
|
55
55
|
message: string;
|
|
56
56
|
};
|
|
@@ -80,7 +80,7 @@ export declare class DeviceCommands {
|
|
|
80
80
|
};
|
|
81
81
|
} | {
|
|
82
82
|
success: boolean;
|
|
83
|
-
error: 0 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 200 | 300 | 301 | 302 | 303 | 304 | 305 | 400 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 500 | 600 | 601 | 602 | 603 | 700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 800 | 801 | 802 | 803 | 804 | 805 | 806 | 807 | 808 | 809 | 810 | 811 | 812 | 813 | 814 | 815 | 816 | 817 | 818 | 819 | 820 | 821 | 822 | 823 | 824 | 825 | 826 | 827 | 828 | 900 | 901 | 902;
|
|
83
|
+
error: 0 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 200 | 300 | 301 | 302 | 303 | 304 | 305 | 400 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 500 | 600 | 601 | 602 | 603 | 700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 800 | 801 | 802 | 803 | 804 | 805 | 806 | 807 | 808 | 809 | 810 | 811 | 812 | 813 | 814 | 815 | 816 | 817 | 818 | 819 | 820 | 821 | 822 | 823 | 824 | 825 | 826 | 827 | 828 | 829 | 900 | 901 | 902;
|
|
84
84
|
payload: {
|
|
85
85
|
message: string;
|
|
86
86
|
};
|
|
@@ -99,7 +99,7 @@ export declare class DeviceCommands {
|
|
|
99
99
|
};
|
|
100
100
|
} | {
|
|
101
101
|
success: boolean;
|
|
102
|
-
error: 0 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 200 | 300 | 301 | 302 | 303 | 304 | 305 | 400 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 500 | 600 | 601 | 602 | 603 | 700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 800 | 801 | 802 | 803 | 804 | 805 | 806 | 807 | 808 | 809 | 810 | 811 | 812 | 813 | 814 | 815 | 816 | 817 | 818 | 819 | 820 | 821 | 822 | 823 | 824 | 825 | 826 | 827 | 828 | 900 | 901 | 902;
|
|
102
|
+
error: 0 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 200 | 300 | 301 | 302 | 303 | 304 | 305 | 400 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 500 | 600 | 601 | 602 | 603 | 700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 800 | 801 | 802 | 803 | 804 | 805 | 806 | 807 | 808 | 809 | 810 | 811 | 812 | 813 | 814 | 815 | 816 | 817 | 818 | 819 | 820 | 821 | 822 | 823 | 824 | 825 | 826 | 827 | 828 | 829 | 900 | 901 | 902;
|
|
103
103
|
payload: {
|
|
104
104
|
message: string;
|
|
105
105
|
};
|
package/dist/index.d.ts
CHANGED
|
@@ -3035,7 +3035,7 @@ declare class DeviceCommands {
|
|
|
3035
3035
|
};
|
|
3036
3036
|
} | {
|
|
3037
3037
|
success: boolean;
|
|
3038
|
-
error: 0 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 200 | 300 | 301 | 302 | 303 | 304 | 305 | 400 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 500 | 600 | 601 | 602 | 603 | 700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 800 | 801 | 802 | 803 | 804 | 805 | 806 | 807 | 808 | 809 | 810 | 811 | 812 | 813 | 814 | 815 | 816 | 817 | 818 | 819 | 820 | 821 | 822 | 823 | 824 | 825 | 826 | 827 | 828 | 900 | 901 | 902;
|
|
3038
|
+
error: 0 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 200 | 300 | 301 | 302 | 303 | 304 | 305 | 400 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 500 | 600 | 601 | 602 | 603 | 700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 800 | 801 | 802 | 803 | 804 | 805 | 806 | 807 | 808 | 809 | 810 | 811 | 812 | 813 | 814 | 815 | 816 | 817 | 818 | 819 | 820 | 821 | 822 | 823 | 824 | 825 | 826 | 827 | 828 | 829 | 900 | 901 | 902;
|
|
3039
3039
|
payload: {
|
|
3040
3040
|
message: string;
|
|
3041
3041
|
};
|
|
@@ -3054,7 +3054,7 @@ declare class DeviceCommands {
|
|
|
3054
3054
|
};
|
|
3055
3055
|
} | {
|
|
3056
3056
|
success: boolean;
|
|
3057
|
-
error: 0 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 200 | 300 | 301 | 302 | 303 | 304 | 305 | 400 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 500 | 600 | 601 | 602 | 603 | 700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 800 | 801 | 802 | 803 | 804 | 805 | 806 | 807 | 808 | 809 | 810 | 811 | 812 | 813 | 814 | 815 | 816 | 817 | 818 | 819 | 820 | 821 | 822 | 823 | 824 | 825 | 826 | 827 | 828 | 900 | 901 | 902;
|
|
3057
|
+
error: 0 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 200 | 300 | 301 | 302 | 303 | 304 | 305 | 400 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 500 | 600 | 601 | 602 | 603 | 700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 800 | 801 | 802 | 803 | 804 | 805 | 806 | 807 | 808 | 809 | 810 | 811 | 812 | 813 | 814 | 815 | 816 | 817 | 818 | 819 | 820 | 821 | 822 | 823 | 824 | 825 | 826 | 827 | 828 | 829 | 900 | 901 | 902;
|
|
3058
3058
|
payload: {
|
|
3059
3059
|
message: string;
|
|
3060
3060
|
};
|
|
@@ -3302,7 +3302,16 @@ declare enum LoggerNames {
|
|
|
3302
3302
|
}
|
|
3303
3303
|
declare const getLogger: (key: LoggerNames) => Log;
|
|
3304
3304
|
|
|
3305
|
-
|
|
3305
|
+
type HttpRequestOptions = {
|
|
3306
|
+
timeoutMs?: number;
|
|
3307
|
+
connectTimeoutMs?: number;
|
|
3308
|
+
readTimeoutMs?: number;
|
|
3309
|
+
overallTimeoutMs?: number;
|
|
3310
|
+
maxRetries?: number;
|
|
3311
|
+
retryDelayMs?: number;
|
|
3312
|
+
};
|
|
3313
|
+
|
|
3314
|
+
declare const httpRequest: (url: string, type: string, options?: HttpRequestOptions) => any;
|
|
3306
3315
|
declare const getTimeStamp: () => number;
|
|
3307
3316
|
|
|
3308
3317
|
declare const isValidVersionString: (version: string) => boolean;
|