@onekeyfe/hd-transport-web-device 1.2.8-alpha.19 → 1.2.8-alpha.20
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.
|
@@ -2,7 +2,8 @@ import { ERRORS, HardwareErrorCode, createDeferred } from '@onekeyfe/hd-shared';
|
|
|
2
2
|
|
|
3
3
|
import WebUsbTransport from '../src/webusb';
|
|
4
4
|
import { probeUsbDeviceIdentities } from '@onekeyfe/hd-common-connect-sdk/src';
|
|
5
|
-
import Core from '@onekeyfe/hd-core/src/core';
|
|
5
|
+
import Core, { switchTransport } from '@onekeyfe/hd-core/src/core';
|
|
6
|
+
import DataManager from '@onekeyfe/hd-core/src/data-manager/DataManager';
|
|
6
7
|
import TransportManager from '@onekeyfe/hd-core/src/data-manager/TransportManager';
|
|
7
8
|
import { Device } from '@onekeyfe/hd-core/src/device/Device';
|
|
8
9
|
|
|
@@ -80,6 +81,125 @@ describe('WebUSB identity probe ownership', () => {
|
|
|
80
81
|
return active;
|
|
81
82
|
}
|
|
82
83
|
|
|
84
|
+
test.each(['V1', 'V2'] as const)(
|
|
85
|
+
'reacquires %s USB after keepSession and switching away and back',
|
|
86
|
+
async protocol => {
|
|
87
|
+
const previous = TransportManager.transport;
|
|
88
|
+
const { settings } = DataManager;
|
|
89
|
+
const active = createAcquiredTransport(protocol);
|
|
90
|
+
const next = createAcquiredTransport(protocol);
|
|
91
|
+
const selected = new Device({
|
|
92
|
+
path: 'USB_PATH',
|
|
93
|
+
id: 'USB_PATH',
|
|
94
|
+
name: 'Mock device',
|
|
95
|
+
commType: 'webusb',
|
|
96
|
+
debug: false,
|
|
97
|
+
});
|
|
98
|
+
selected.keepSession = true;
|
|
99
|
+
selected.mainId = 'USB_PATH';
|
|
100
|
+
jest.spyOn(selected, 'isUsedHere').mockReturnValue(true);
|
|
101
|
+
const release = jest.spyOn(active, 'release');
|
|
102
|
+
const Emulator = jest.fn(() => ({ stop: jest.fn().mockResolvedValue(undefined) }));
|
|
103
|
+
const RestoreUsb = jest.fn(() => next);
|
|
104
|
+
TransportManager.transport = active as unknown as Transport;
|
|
105
|
+
try {
|
|
106
|
+
await active.acquire({ path: 'USB_PATH' });
|
|
107
|
+
await selected.release();
|
|
108
|
+
expect(release).not.toHaveBeenCalled();
|
|
109
|
+
await switchTransport({ env: 'emulator', Transport: Emulator });
|
|
110
|
+
expect(device.opened).toBe(false);
|
|
111
|
+
await switchTransport({ env: 'webusb', Transport: RestoreUsb });
|
|
112
|
+
await expect(next.acquire({ path: 'USB_PATH' })).resolves.toBe('USB_PATH');
|
|
113
|
+
} finally {
|
|
114
|
+
await active.stop();
|
|
115
|
+
await next.stop();
|
|
116
|
+
TransportManager.transport = previous;
|
|
117
|
+
DataManager.settings = settings;
|
|
118
|
+
jest.restoreAllMocks();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
test('does not replace the transport until USB cleanup completes, or after it fails', async () => {
|
|
124
|
+
const previous = TransportManager.transport;
|
|
125
|
+
const { settings } = DataManager;
|
|
126
|
+
const active = createAcquiredTransport();
|
|
127
|
+
const closing = createDeferred<void>();
|
|
128
|
+
const entered = createDeferred<void>();
|
|
129
|
+
device.close.mockImplementation(() => {
|
|
130
|
+
entered.resolve();
|
|
131
|
+
return closing.promise;
|
|
132
|
+
});
|
|
133
|
+
const Emulator = jest.fn();
|
|
134
|
+
TransportManager.transport = active as unknown as Transport;
|
|
135
|
+
try {
|
|
136
|
+
await active.acquire({ path: 'USB_PATH' });
|
|
137
|
+
const switching = Promise.resolve(switchTransport({ env: 'emulator', Transport: Emulator }));
|
|
138
|
+
const result = switching.catch(error => error as Error);
|
|
139
|
+
await Promise.resolve();
|
|
140
|
+
expect(Emulator).not.toHaveBeenCalled();
|
|
141
|
+
await entered.promise;
|
|
142
|
+
expect(Emulator).not.toHaveBeenCalled();
|
|
143
|
+
expect(TransportManager.transport).toBe(active);
|
|
144
|
+
closing.reject(new Error('close failed'));
|
|
145
|
+
expect(await result).toEqual(new Error('close failed'));
|
|
146
|
+
expect(TransportManager.transport).toBe(active);
|
|
147
|
+
expect(DataManager.settings).toBe(settings);
|
|
148
|
+
} finally {
|
|
149
|
+
closing.resolve();
|
|
150
|
+
device.close.mockImplementation(() => {
|
|
151
|
+
device.opened = false;
|
|
152
|
+
return Promise.resolve();
|
|
153
|
+
});
|
|
154
|
+
await active.stop();
|
|
155
|
+
TransportManager.transport = previous;
|
|
156
|
+
DataManager.settings = settings;
|
|
157
|
+
jest.restoreAllMocks();
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
test('serializes overlapping transport switches and stops each replaced instance', async () => {
|
|
162
|
+
const previous = TransportManager.transport;
|
|
163
|
+
const { settings } = DataManager;
|
|
164
|
+
const active = createAcquiredTransport();
|
|
165
|
+
const next = createAcquiredTransport();
|
|
166
|
+
const closing = createDeferred<void>();
|
|
167
|
+
const entered = createDeferred<void>();
|
|
168
|
+
const emulatorCleanup = createDeferred<void>();
|
|
169
|
+
device.close.mockImplementation(() => {
|
|
170
|
+
entered.resolve();
|
|
171
|
+
return closing.promise.then(() => {
|
|
172
|
+
device.opened = false;
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
const emulator = { stop: jest.fn(() => emulatorCleanup.promise) };
|
|
176
|
+
const Emulator = jest.fn(() => emulator);
|
|
177
|
+
const RestoreUsb = jest.fn(() => next);
|
|
178
|
+
TransportManager.transport = active as unknown as Transport;
|
|
179
|
+
try {
|
|
180
|
+
await active.acquire({ path: 'USB_PATH' });
|
|
181
|
+
const first = switchTransport({ env: 'emulator', Transport: Emulator });
|
|
182
|
+
await entered.promise;
|
|
183
|
+
const second = switchTransport({ env: 'webusb', Transport: RestoreUsb });
|
|
184
|
+
closing.resolve();
|
|
185
|
+
await first;
|
|
186
|
+
await Promise.resolve();
|
|
187
|
+
expect(emulator.stop).toHaveBeenCalledTimes(1);
|
|
188
|
+
expect(RestoreUsb).not.toHaveBeenCalled();
|
|
189
|
+
emulatorCleanup.resolve();
|
|
190
|
+
await second;
|
|
191
|
+
expect(TransportManager.transport).toBe(next);
|
|
192
|
+
} finally {
|
|
193
|
+
closing.resolve();
|
|
194
|
+
emulatorCleanup.resolve();
|
|
195
|
+
await active.stop();
|
|
196
|
+
await next.stop();
|
|
197
|
+
TransportManager.transport = previous;
|
|
198
|
+
DataManager.settings = settings;
|
|
199
|
+
jest.restoreAllMocks();
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
|
|
83
203
|
test.each(['V1', 'V2'] as const)(
|
|
84
204
|
'Core disposal releases a retained %s USB session for a new transport',
|
|
85
205
|
async protocol => {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@onekeyfe/hd-transport-web-device",
|
|
3
|
-
"version": "1.2.8-alpha.
|
|
3
|
+
"version": "1.2.8-alpha.20",
|
|
4
4
|
"author": "OneKey",
|
|
5
5
|
"homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme",
|
|
6
6
|
"license": "MIT",
|
|
@@ -21,13 +21,13 @@
|
|
|
21
21
|
"lint:fix": "eslint . --fix"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@onekeyfe/hd-shared": "1.2.8-alpha.
|
|
25
|
-
"@onekeyfe/hd-transport": "1.2.8-alpha.
|
|
24
|
+
"@onekeyfe/hd-shared": "1.2.8-alpha.20",
|
|
25
|
+
"@onekeyfe/hd-transport": "1.2.8-alpha.20"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
|
-
"@onekeyfe/hd-transport-electron": "1.2.8-alpha.
|
|
28
|
+
"@onekeyfe/hd-transport-electron": "1.2.8-alpha.20",
|
|
29
29
|
"@types/w3c-web-usb": "^1.0.6",
|
|
30
30
|
"@types/web-bluetooth": "^0.0.17"
|
|
31
31
|
},
|
|
32
|
-
"gitHead": "
|
|
32
|
+
"gitHead": "973f059fe93a58fdcf098ddb32ba63f621a2c78e"
|
|
33
33
|
}
|