Skip to content

Commit 0a3f331

Browse files
committed
Add pre-filters to adapter
1 parent f2334d1 commit 0a3f331

File tree

2 files changed

+42
-7
lines changed

2 files changed

+42
-7
lines changed

src/adapter.ts

+30-5
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ export interface Adapter {
8989
getConnected(handle: string): boolean;
9090
getOpened(handle: string): boolean;
9191

92-
listUSBDevices(): Promise<Array<USBDevice>>;
92+
listUSBDevices(filters: Array<USBDeviceFilter>): Promise<Array<USBDevice>>;
9393
open(handle: string): Promise<void>;
9494
close(handle: string): Promise<void>;
9595
selectConfiguration(handle: string, id: number): Promise<void>;
@@ -234,13 +234,38 @@ export class USBAdapter extends EventEmitter implements Adapter {
234234
});
235235
}
236236

237-
private loadDevices(): Promise<Array<Device>> {
237+
private loadDevices(filters: Array<USBDeviceFilter>): Promise<Array<Device>> {
238238
// Reset device cache
239239
this.devices = {};
240-
const devices = getDeviceList();
240+
let devices = getDeviceList();
241+
242+
// Pre-filter devices
243+
devices = this.filterDevices(devices, filters);
241244
return this.serialPromises(this.loadDevice, devices);
242245
}
243246

247+
private filterDevices(devices: Array<Device>, filters: Array<USBDeviceFilter>): Array<Device> {
248+
return devices.filter(device => filters.some(filter => {
249+
// Vendor
250+
if (filter.vendorId && filter.vendorId !== device.deviceDescriptor.idVendor) return false;
251+
252+
// Product
253+
if (filter.productId && filter.productId !== device.deviceDescriptor.idProduct) return false;
254+
255+
// Class
256+
if (filter.classCode && filter.classCode !== device.deviceDescriptor.bDeviceClass) return false;
257+
258+
// Subclass
259+
if (filter.subclassCode && filter.subclassCode !== device.deviceDescriptor.bDeviceSubClass) return false;
260+
261+
// Protocol
262+
if (filter.protocolCode && filter.protocolCode !== device.deviceDescriptor.bDeviceProtocol) return false;
263+
264+
// Ignore serial number for node-usb as it requires device connection
265+
return true;
266+
}));
267+
}
268+
244269
private loadDevice(device: Device, retries: number = 0): Promise<Device> {
245270

246271
// Early guard against unsupported USB devices
@@ -590,8 +615,8 @@ export class USBAdapter extends EventEmitter implements Adapter {
590615
return (device.interfaces !== null);
591616
}
592617

593-
public listUSBDevices(): Promise<Array<USBDevice>> {
594-
return this.loadDevices()
618+
public listUSBDevices(filters: Array<USBDeviceFilter>): Promise<Array<USBDevice>> {
619+
return this.loadDevices(filters)
595620
.then(() => {
596621
return this.serialPromises(this.devicetoUSBDevice, Object.keys(this.devices));
597622
});

src/usb.ts

+12-2
Original file line numberDiff line numberDiff line change
@@ -210,8 +210,18 @@ export class USB extends (EventDispatcher as new() => TypedDispatcher<USBEvents>
210210
* @returns Promise containing an array of devices
211211
*/
212212
public getDevices(): Promise<Array<USBDevice>> {
213+
// Create pre-filters
214+
const filters = this.allowedDevices.map(device => ({
215+
vendorId: device.vendorId || undefined,
216+
productId: device.productId || undefined,
217+
classCode: device.deviceClass || undefined,
218+
subclassCode: device.deviceSubclass || undefined,
219+
protocolCode: device.deviceProtocol || undefined,
220+
serialNumber: device.serialNumber || undefined
221+
}));
222+
213223
// Refresh devices and filter for allowed ones
214-
return adapter.listUSBDevices()
224+
return adapter.listUSBDevices(filters)
215225
.then(devices => {
216226
const allowed = devices.filter(device => {
217227
if (!device.connected) {
@@ -278,7 +288,7 @@ export class USB extends (EventDispatcher as new() => TypedDispatcher<USBEvents>
278288

279289
if (!check) return;
280290

281-
return adapter.listUSBDevices()
291+
return adapter.listUSBDevices(options.filters)
282292
.then(devices => {
283293
devices = devices.filter(device => this.filterDevice(options, device));
284294

0 commit comments

Comments
 (0)