usb 1.9.1 → 2.0.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/.eslintignore +4 -0
- package/.eslintrc.json +87 -0
- package/.gitattributes +1 -0
- package/.vscode/launch.json +15 -0
- package/.vscode/tasks.json +23 -0
- package/CHANGELOG.md +13 -0
- package/README.md +400 -175
- package/dist/index.d.ts +17 -0
- package/dist/index.js +133 -0
- package/dist/index.js.map +1 -0
- package/dist/usb/bindings.d.ts +253 -0
- package/dist/usb/bindings.js +10 -0
- package/dist/usb/bindings.js.map +1 -0
- package/dist/usb/capability.d.ts +14 -0
- package/dist/usb/capability.js +18 -0
- package/dist/usb/capability.js.map +1 -0
- package/dist/usb/descriptors.d.ts +129 -0
- package/dist/usb/descriptors.js +3 -0
- package/dist/usb/descriptors.js.map +1 -0
- package/dist/usb/device.d.ts +94 -0
- package/dist/usb/device.js +300 -0
- package/dist/usb/device.js.map +1 -0
- package/dist/usb/endpoint.d.ts +91 -0
- package/dist/usb/endpoint.js +236 -0
- package/dist/usb/endpoint.js.map +1 -0
- package/dist/usb/index.d.ts +25 -0
- package/dist/usb/index.js +116 -0
- package/dist/usb/index.js.map +1 -0
- package/dist/usb/interface.d.ts +78 -0
- package/dist/usb/interface.js +137 -0
- package/dist/usb/interface.js.map +1 -0
- package/dist/webusb/index.d.ts +56 -0
- package/dist/webusb/index.js +412 -0
- package/dist/webusb/index.js.map +1 -0
- package/dist/webusb/mutex.d.ts +22 -0
- package/dist/webusb/mutex.js +89 -0
- package/dist/webusb/mutex.js.map +1 -0
- package/dist/webusb/webusb-device.d.ts +49 -0
- package/dist/webusb/webusb-device.js +888 -0
- package/dist/webusb/webusb-device.js.map +1 -0
- package/package.json +28 -15
- package/prebuilds/android-arm/node.napi.armv7.node +0 -0
- package/prebuilds/android-arm64/node.napi.armv8.node +0 -0
- package/prebuilds/darwin-x64+arm64/node.napi.node +0 -0
- package/prebuilds/linux-arm/node.napi.armv6.node +0 -0
- package/prebuilds/linux-arm/node.napi.armv7.node +0 -0
- package/prebuilds/linux-arm64/node.napi.armv8.node +0 -0
- package/prebuilds/linux-ia32/node.napi.node +0 -0
- package/prebuilds/linux-x64/node.napi.glibc.node +0 -0
- package/prebuilds/linux-x64/node.napi.musl.node +0 -0
- package/prebuilds/win32-ia32/node.napi.node +0 -0
- package/prebuilds/win32-x64/node.napi.node +0 -0
- package/src/device.cc +6 -6
- package/test/usb.coffee +13 -7
- package/test/webusb.coffee +189 -0
- package/tsc/index.ts +67 -0
- package/tsc/usb/bindings.ts +304 -0
- package/tsc/usb/capability.ts +22 -0
- package/tsc/usb/descriptors.ts +180 -0
- package/tsc/usb/device.ts +325 -0
- package/tsc/usb/endpoint.ts +228 -0
- package/tsc/usb/index.ts +111 -0
- package/tsc/usb/interface.ts +172 -0
- package/tsc/webusb/index.ts +363 -0
- package/tsc/webusb/mutex.ts +38 -0
- package/tsc/webusb/webusb-device.ts +534 -0
- package/tsconfig.json +17 -0
- package/typedoc.json +9 -0
- package/usb.js +0 -573
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (_) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
var __values = (this && this.__values) || function(o) {
|
|
39
|
+
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
40
|
+
if (m) return m.call(o);
|
|
41
|
+
if (o && typeof o.length === "number") return {
|
|
42
|
+
next: function () {
|
|
43
|
+
if (o && i >= o.length) o = void 0;
|
|
44
|
+
return { value: o && o[i++], done: !o };
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
48
|
+
};
|
|
49
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
50
|
+
exports.WebUSB = void 0;
|
|
51
|
+
var usb = require("../usb");
|
|
52
|
+
var events_1 = require("events");
|
|
53
|
+
var webusb_device_1 = require("./webusb-device");
|
|
54
|
+
var WebUSB = /** @class */ (function () {
|
|
55
|
+
function WebUSB(options) {
|
|
56
|
+
var _this = this;
|
|
57
|
+
if (options === void 0) { options = {}; }
|
|
58
|
+
this.options = options;
|
|
59
|
+
this.emitter = new events_1.EventEmitter();
|
|
60
|
+
this.knownDevices = new Map();
|
|
61
|
+
this.allowedDevices = options.allowedDevices || [];
|
|
62
|
+
var deviceConnectCallback = function (device) { return __awaiter(_this, void 0, void 0, function () {
|
|
63
|
+
var webDevice, deviceId, event_1;
|
|
64
|
+
return __generator(this, function (_a) {
|
|
65
|
+
switch (_a.label) {
|
|
66
|
+
case 0: return [4 /*yield*/, webusb_device_1.WebUSBDevice.createInstance(device)];
|
|
67
|
+
case 1:
|
|
68
|
+
webDevice = _a.sent();
|
|
69
|
+
// When connected, emit an event if it is an allowed device
|
|
70
|
+
if (webDevice && this.isAllowedDevice(webDevice)) {
|
|
71
|
+
deviceId = this.getDeviceId(device);
|
|
72
|
+
if (deviceId) {
|
|
73
|
+
this.knownDevices.set(deviceId, webDevice);
|
|
74
|
+
}
|
|
75
|
+
event_1 = {
|
|
76
|
+
type: 'connect',
|
|
77
|
+
device: webDevice
|
|
78
|
+
};
|
|
79
|
+
this.emitter.emit('connect', event_1);
|
|
80
|
+
}
|
|
81
|
+
return [2 /*return*/];
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}); };
|
|
85
|
+
var deviceDisconnectCallback = function (device) { return __awaiter(_this, void 0, void 0, function () {
|
|
86
|
+
var deviceId, webDevice, event_2;
|
|
87
|
+
return __generator(this, function (_a) {
|
|
88
|
+
deviceId = this.getDeviceId(device);
|
|
89
|
+
// When disconnected, emit an event if the device was a known allowed device
|
|
90
|
+
if (deviceId !== undefined && this.knownDevices.has(deviceId)) {
|
|
91
|
+
webDevice = this.knownDevices.get(deviceId);
|
|
92
|
+
if (webDevice && this.isAllowedDevice(webDevice)) {
|
|
93
|
+
event_2 = {
|
|
94
|
+
type: 'disconnect',
|
|
95
|
+
device: webDevice
|
|
96
|
+
};
|
|
97
|
+
this.emitter.emit('disconnect', event_2);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return [2 /*return*/];
|
|
101
|
+
});
|
|
102
|
+
}); };
|
|
103
|
+
this.emitter.on('newListener', function (event) {
|
|
104
|
+
var listenerCount = _this.emitter.listenerCount(event);
|
|
105
|
+
if (listenerCount !== 0) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
if (event === 'connect') {
|
|
109
|
+
usb.addListener('attach', deviceConnectCallback);
|
|
110
|
+
}
|
|
111
|
+
else if (event === 'disconnect') {
|
|
112
|
+
usb.addListener('detach', deviceDisconnectCallback);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
this.emitter.on('removeListener', function (event) {
|
|
116
|
+
var listenerCount = _this.emitter.listenerCount(event);
|
|
117
|
+
if (listenerCount !== 0) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
if (event === 'connect') {
|
|
121
|
+
usb.removeListener('attach', deviceConnectCallback);
|
|
122
|
+
}
|
|
123
|
+
else if (event === 'disconnect') {
|
|
124
|
+
usb.removeListener('detach', deviceDisconnectCallback);
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
Object.defineProperty(WebUSB.prototype, "onconnect", {
|
|
129
|
+
set: function (fn) {
|
|
130
|
+
if (this._onconnect) {
|
|
131
|
+
this.removeEventListener('connect', this._onconnect);
|
|
132
|
+
this._onconnect = undefined;
|
|
133
|
+
}
|
|
134
|
+
if (fn) {
|
|
135
|
+
this._onconnect = fn;
|
|
136
|
+
this.addEventListener('connect', this._onconnect);
|
|
137
|
+
}
|
|
138
|
+
},
|
|
139
|
+
enumerable: false,
|
|
140
|
+
configurable: true
|
|
141
|
+
});
|
|
142
|
+
Object.defineProperty(WebUSB.prototype, "ondisconnect", {
|
|
143
|
+
set: function (fn) {
|
|
144
|
+
if (this._ondisconnect) {
|
|
145
|
+
this.removeEventListener('disconnect', this._ondisconnect);
|
|
146
|
+
this._ondisconnect = undefined;
|
|
147
|
+
}
|
|
148
|
+
if (fn) {
|
|
149
|
+
this._ondisconnect = fn;
|
|
150
|
+
this.addEventListener('disconnect', this._ondisconnect);
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
enumerable: false,
|
|
154
|
+
configurable: true
|
|
155
|
+
});
|
|
156
|
+
WebUSB.prototype.addEventListener = function (type, listener) {
|
|
157
|
+
this.emitter.addListener(type, listener);
|
|
158
|
+
};
|
|
159
|
+
WebUSB.prototype.removeEventListener = function (type, callback) {
|
|
160
|
+
this.emitter.removeListener(type, callback);
|
|
161
|
+
};
|
|
162
|
+
WebUSB.prototype.dispatchEvent = function (_event) {
|
|
163
|
+
// Don't dispatch from here
|
|
164
|
+
return false;
|
|
165
|
+
};
|
|
166
|
+
/**
|
|
167
|
+
* Requests a single Web USB device
|
|
168
|
+
* @param options The options to use when scanning
|
|
169
|
+
* @returns Promise containing the selected device
|
|
170
|
+
*/
|
|
171
|
+
WebUSB.prototype.requestDevice = function (options) {
|
|
172
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
173
|
+
var devices, device, _a, error_1;
|
|
174
|
+
var _this = this;
|
|
175
|
+
return __generator(this, function (_b) {
|
|
176
|
+
switch (_b.label) {
|
|
177
|
+
case 0:
|
|
178
|
+
// Must have options
|
|
179
|
+
if (!options) {
|
|
180
|
+
throw new TypeError('requestDevice error: 1 argument required, but only 0 present');
|
|
181
|
+
}
|
|
182
|
+
// Options must be an object
|
|
183
|
+
if (options.constructor !== {}.constructor) {
|
|
184
|
+
throw new TypeError('requestDevice error: parameter 1 (options) is not an object');
|
|
185
|
+
}
|
|
186
|
+
// Must have a filter
|
|
187
|
+
if (!options.filters) {
|
|
188
|
+
throw new TypeError('requestDevice error: required member filters is undefined');
|
|
189
|
+
}
|
|
190
|
+
// Filter must be an array
|
|
191
|
+
if (options.filters.constructor !== [].constructor) {
|
|
192
|
+
throw new TypeError('requestDevice error: the provided value cannot be converted to a sequence');
|
|
193
|
+
}
|
|
194
|
+
// Check filters
|
|
195
|
+
options.filters.forEach(function (filter) {
|
|
196
|
+
// Protocol & Subclass
|
|
197
|
+
if (filter.protocolCode && !filter.subclassCode) {
|
|
198
|
+
throw new TypeError('requestDevice error: subclass code is required');
|
|
199
|
+
}
|
|
200
|
+
// Subclass & Class
|
|
201
|
+
if (filter.subclassCode && !filter.classCode) {
|
|
202
|
+
throw new TypeError('requestDevice error: class code is required');
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
return [4 /*yield*/, this.loadDevices(options.filters)];
|
|
206
|
+
case 1:
|
|
207
|
+
devices = _b.sent();
|
|
208
|
+
devices = devices.filter(function (device) { return _this.filterDevice(options, device); });
|
|
209
|
+
if (devices.length === 0) {
|
|
210
|
+
throw new Error('requestDevice error: no devices found');
|
|
211
|
+
}
|
|
212
|
+
_b.label = 2;
|
|
213
|
+
case 2:
|
|
214
|
+
_b.trys.push([2, 6, , 7]);
|
|
215
|
+
if (!this.options.devicesFound) return [3 /*break*/, 4];
|
|
216
|
+
return [4 /*yield*/, this.options.devicesFound(devices)];
|
|
217
|
+
case 3:
|
|
218
|
+
_a = _b.sent();
|
|
219
|
+
return [3 /*break*/, 5];
|
|
220
|
+
case 4:
|
|
221
|
+
_a = devices[0];
|
|
222
|
+
_b.label = 5;
|
|
223
|
+
case 5:
|
|
224
|
+
device = _a;
|
|
225
|
+
if (!device) {
|
|
226
|
+
throw new Error('selected device not found');
|
|
227
|
+
}
|
|
228
|
+
if (!this.isAllowedDevice(device)) {
|
|
229
|
+
this.allowedDevices.push({
|
|
230
|
+
vendorId: device.vendorId,
|
|
231
|
+
productId: device.productId,
|
|
232
|
+
serialNumber: device.serialNumber
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
return [2 /*return*/, device];
|
|
236
|
+
case 6:
|
|
237
|
+
error_1 = _b.sent();
|
|
238
|
+
throw new Error("requestDevice error: " + error_1);
|
|
239
|
+
case 7: return [2 /*return*/];
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
};
|
|
244
|
+
/**
|
|
245
|
+
* Gets all allowed Web USB devices which are connected
|
|
246
|
+
* @returns Promise containing an array of devices
|
|
247
|
+
*/
|
|
248
|
+
WebUSB.prototype.getDevices = function () {
|
|
249
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
250
|
+
var preFilters, devices;
|
|
251
|
+
var _this = this;
|
|
252
|
+
return __generator(this, function (_a) {
|
|
253
|
+
switch (_a.label) {
|
|
254
|
+
case 0:
|
|
255
|
+
if (!this.options.allowAllDevices) {
|
|
256
|
+
// Create pre-filters
|
|
257
|
+
preFilters = this.allowedDevices.map(function (device) { return ({
|
|
258
|
+
vendorId: device.vendorId || undefined,
|
|
259
|
+
productId: device.productId || undefined,
|
|
260
|
+
serialNumber: device.serialNumber || undefined
|
|
261
|
+
}); });
|
|
262
|
+
}
|
|
263
|
+
return [4 /*yield*/, this.loadDevices(preFilters)];
|
|
264
|
+
case 1:
|
|
265
|
+
devices = _a.sent();
|
|
266
|
+
return [2 /*return*/, devices.filter(function (device) { return _this.isAllowedDevice(device); })];
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
});
|
|
270
|
+
};
|
|
271
|
+
WebUSB.prototype.loadDevices = function (preFilters) {
|
|
272
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
273
|
+
var devices, webDevices, devices_1, devices_1_1, device, webDevice, deviceId, e_1_1;
|
|
274
|
+
var e_1, _a;
|
|
275
|
+
return __generator(this, function (_b) {
|
|
276
|
+
switch (_b.label) {
|
|
277
|
+
case 0:
|
|
278
|
+
devices = usb.getDeviceList();
|
|
279
|
+
// Pre-filter devices
|
|
280
|
+
devices = this.preFilterDevices(devices, preFilters);
|
|
281
|
+
webDevices = [];
|
|
282
|
+
_b.label = 1;
|
|
283
|
+
case 1:
|
|
284
|
+
_b.trys.push([1, 6, 7, 8]);
|
|
285
|
+
devices_1 = __values(devices), devices_1_1 = devices_1.next();
|
|
286
|
+
_b.label = 2;
|
|
287
|
+
case 2:
|
|
288
|
+
if (!!devices_1_1.done) return [3 /*break*/, 5];
|
|
289
|
+
device = devices_1_1.value;
|
|
290
|
+
if (this.options.deviceTimeout) {
|
|
291
|
+
device.timeout = this.options.deviceTimeout;
|
|
292
|
+
}
|
|
293
|
+
return [4 /*yield*/, webusb_device_1.WebUSBDevice.createInstance(device)];
|
|
294
|
+
case 3:
|
|
295
|
+
webDevice = _b.sent();
|
|
296
|
+
if (webDevice) {
|
|
297
|
+
webDevices.push(webDevice);
|
|
298
|
+
deviceId = this.getDeviceId(device);
|
|
299
|
+
if (deviceId) {
|
|
300
|
+
this.knownDevices.set(deviceId, webDevice);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
_b.label = 4;
|
|
304
|
+
case 4:
|
|
305
|
+
devices_1_1 = devices_1.next();
|
|
306
|
+
return [3 /*break*/, 2];
|
|
307
|
+
case 5: return [3 /*break*/, 8];
|
|
308
|
+
case 6:
|
|
309
|
+
e_1_1 = _b.sent();
|
|
310
|
+
e_1 = { error: e_1_1 };
|
|
311
|
+
return [3 /*break*/, 8];
|
|
312
|
+
case 7:
|
|
313
|
+
try {
|
|
314
|
+
if (devices_1_1 && !devices_1_1.done && (_a = devices_1.return)) _a.call(devices_1);
|
|
315
|
+
}
|
|
316
|
+
finally { if (e_1) throw e_1.error; }
|
|
317
|
+
return [7 /*endfinally*/];
|
|
318
|
+
case 8: return [2 /*return*/, webDevices];
|
|
319
|
+
}
|
|
320
|
+
});
|
|
321
|
+
});
|
|
322
|
+
};
|
|
323
|
+
WebUSB.prototype.preFilterDevices = function (devices, preFilters) {
|
|
324
|
+
if (!preFilters || !preFilters.length) {
|
|
325
|
+
return devices;
|
|
326
|
+
}
|
|
327
|
+
// Just pre-filter on vid/pid
|
|
328
|
+
return devices.filter(function (device) { return preFilters.some(function (filter) {
|
|
329
|
+
// Vendor
|
|
330
|
+
if (filter.vendorId && filter.vendorId !== device.deviceDescriptor.idVendor)
|
|
331
|
+
return false;
|
|
332
|
+
// Product
|
|
333
|
+
if (filter.productId && filter.productId !== device.deviceDescriptor.idProduct)
|
|
334
|
+
return false;
|
|
335
|
+
// Ignore serial number for node-usb as it requires device connection
|
|
336
|
+
return true;
|
|
337
|
+
}); });
|
|
338
|
+
};
|
|
339
|
+
WebUSB.prototype.filterDevice = function (options, device) {
|
|
340
|
+
if (!options.filters || !options.filters.length) {
|
|
341
|
+
return true;
|
|
342
|
+
}
|
|
343
|
+
return options.filters.some(function (filter) {
|
|
344
|
+
// Vendor
|
|
345
|
+
if (filter.vendorId && filter.vendorId !== device.vendorId)
|
|
346
|
+
return false;
|
|
347
|
+
// Product
|
|
348
|
+
if (filter.productId && filter.productId !== device.productId)
|
|
349
|
+
return false;
|
|
350
|
+
// Class
|
|
351
|
+
if (filter.classCode) {
|
|
352
|
+
if (!device.configuration) {
|
|
353
|
+
return false;
|
|
354
|
+
}
|
|
355
|
+
// Interface Descriptors
|
|
356
|
+
var match = device.configuration.interfaces.some(function (iface) {
|
|
357
|
+
// Class
|
|
358
|
+
if (filter.classCode && filter.classCode !== iface.alternate.interfaceClass)
|
|
359
|
+
return false;
|
|
360
|
+
// Subclass
|
|
361
|
+
if (filter.subclassCode && filter.subclassCode !== iface.alternate.interfaceSubclass)
|
|
362
|
+
return false;
|
|
363
|
+
// Protocol
|
|
364
|
+
if (filter.protocolCode && filter.protocolCode !== iface.alternate.interfaceProtocol)
|
|
365
|
+
return false;
|
|
366
|
+
return true;
|
|
367
|
+
});
|
|
368
|
+
if (match) {
|
|
369
|
+
return true;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
// Class
|
|
373
|
+
if (filter.classCode && filter.classCode !== device.deviceClass)
|
|
374
|
+
return false;
|
|
375
|
+
// Subclass
|
|
376
|
+
if (filter.subclassCode && filter.subclassCode !== device.deviceSubclass)
|
|
377
|
+
return false;
|
|
378
|
+
// Protocol
|
|
379
|
+
if (filter.protocolCode && filter.protocolCode !== device.deviceProtocol)
|
|
380
|
+
return false;
|
|
381
|
+
// Serial
|
|
382
|
+
if (filter.serialNumber && filter.serialNumber !== device.serialNumber)
|
|
383
|
+
return false;
|
|
384
|
+
return true;
|
|
385
|
+
});
|
|
386
|
+
};
|
|
387
|
+
WebUSB.prototype.getDeviceId = function (device) {
|
|
388
|
+
if (device.busNumber === undefined || device.deviceAddress === undefined) {
|
|
389
|
+
return undefined;
|
|
390
|
+
}
|
|
391
|
+
return device.busNumber + "." + device.deviceAddress;
|
|
392
|
+
};
|
|
393
|
+
WebUSB.prototype.isAllowedDevice = function (device) {
|
|
394
|
+
if (this.options.allowAllDevices) {
|
|
395
|
+
return true;
|
|
396
|
+
}
|
|
397
|
+
var isSameDevice = function (device1, device2) {
|
|
398
|
+
return (device1.productId === device2.productId
|
|
399
|
+
&& device1.vendorId === device2.vendorId
|
|
400
|
+
&& device1.serialNumber === device2.serialNumber);
|
|
401
|
+
};
|
|
402
|
+
for (var i in this.allowedDevices) {
|
|
403
|
+
if (isSameDevice(device, this.allowedDevices[i])) {
|
|
404
|
+
return true;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
return false;
|
|
408
|
+
};
|
|
409
|
+
return WebUSB;
|
|
410
|
+
}());
|
|
411
|
+
exports.WebUSB = WebUSB;
|
|
412
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../tsc/webusb/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A mutex implementation that can be used to lock access between concurrent async functions
|
|
3
|
+
*/
|
|
4
|
+
export declare class Mutex {
|
|
5
|
+
private locked;
|
|
6
|
+
/**
|
|
7
|
+
* Create a new Mutex
|
|
8
|
+
*/
|
|
9
|
+
constructor();
|
|
10
|
+
/**
|
|
11
|
+
* Yield the current execution context, effectively moving it to the back of the promise queue
|
|
12
|
+
*/
|
|
13
|
+
private sleep;
|
|
14
|
+
/**
|
|
15
|
+
* Wait until the Mutex is available and claim it
|
|
16
|
+
*/
|
|
17
|
+
lock(): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Unlock the Mutex
|
|
20
|
+
*/
|
|
21
|
+
unlock(): void;
|
|
22
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (_) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.Mutex = void 0;
|
|
40
|
+
/**
|
|
41
|
+
* A mutex implementation that can be used to lock access between concurrent async functions
|
|
42
|
+
*/
|
|
43
|
+
var Mutex = /** @class */ (function () {
|
|
44
|
+
/**
|
|
45
|
+
* Create a new Mutex
|
|
46
|
+
*/
|
|
47
|
+
function Mutex() {
|
|
48
|
+
this.locked = false;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Yield the current execution context, effectively moving it to the back of the promise queue
|
|
52
|
+
*/
|
|
53
|
+
Mutex.prototype.sleep = function () {
|
|
54
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
55
|
+
return __generator(this, function (_a) {
|
|
56
|
+
return [2 /*return*/, new Promise(function (resolve) { return setTimeout(resolve, 1); })];
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Wait until the Mutex is available and claim it
|
|
62
|
+
*/
|
|
63
|
+
Mutex.prototype.lock = function () {
|
|
64
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
65
|
+
return __generator(this, function (_a) {
|
|
66
|
+
switch (_a.label) {
|
|
67
|
+
case 0:
|
|
68
|
+
if (!this.locked) return [3 /*break*/, 2];
|
|
69
|
+
return [4 /*yield*/, this.sleep()];
|
|
70
|
+
case 1:
|
|
71
|
+
_a.sent();
|
|
72
|
+
return [3 /*break*/, 0];
|
|
73
|
+
case 2:
|
|
74
|
+
this.locked = true;
|
|
75
|
+
return [2 /*return*/];
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* Unlock the Mutex
|
|
82
|
+
*/
|
|
83
|
+
Mutex.prototype.unlock = function () {
|
|
84
|
+
this.locked = false;
|
|
85
|
+
};
|
|
86
|
+
return Mutex;
|
|
87
|
+
}());
|
|
88
|
+
exports.Mutex = Mutex;
|
|
89
|
+
//# sourceMappingURL=mutex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mutex.js","sourceRoot":"","sources":["../../tsc/webusb/mutex.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;GAEG;AACH;IAGI;;OAEG;IACH;QACI,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACxB,CAAC;IAED;;OAEG;IACW,qBAAK,GAAnB;;;gBACI,sBAAO,IAAI,OAAO,CAAC,UAAA,OAAO,IAAI,OAAA,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,EAAtB,CAAsB,CAAC,EAAC;;;KACzD;IAED;;OAEG;IACU,oBAAI,GAAjB;;;;;6BACW,IAAI,CAAC,MAAM;wBACd,qBAAM,IAAI,CAAC,KAAK,EAAE,EAAA;;wBAAlB,SAAkB,CAAC;;;wBAGvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;;;;;KACtB;IAED;;OAEG;IACI,sBAAM,GAAb;QACI,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;IACxB,CAAC;IACL,YAAC;AAAD,CAAC,AAlCD,IAkCC;AAlCY,sBAAK"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/// <reference types="w3c-web-usb" />
|
|
2
|
+
import * as usb from '../usb';
|
|
3
|
+
/**
|
|
4
|
+
* Wrapper to make a node-usb device look like a webusb device
|
|
5
|
+
*/
|
|
6
|
+
export declare class WebUSBDevice implements USBDevice {
|
|
7
|
+
private device;
|
|
8
|
+
static createInstance(device: usb.Device): Promise<WebUSBDevice | undefined>;
|
|
9
|
+
readonly usbVersionMajor: number;
|
|
10
|
+
readonly usbVersionMinor: number;
|
|
11
|
+
readonly usbVersionSubminor: number;
|
|
12
|
+
readonly deviceClass: number;
|
|
13
|
+
readonly deviceSubclass: number;
|
|
14
|
+
readonly deviceProtocol: number;
|
|
15
|
+
readonly vendorId: number;
|
|
16
|
+
readonly productId: number;
|
|
17
|
+
readonly deviceVersionMajor: number;
|
|
18
|
+
readonly deviceVersionMinor: number;
|
|
19
|
+
readonly deviceVersionSubminor: number;
|
|
20
|
+
manufacturerName?: string | undefined;
|
|
21
|
+
productName?: string | undefined;
|
|
22
|
+
serialNumber?: string | undefined;
|
|
23
|
+
configurations: USBConfiguration[];
|
|
24
|
+
private deviceMutex;
|
|
25
|
+
private constructor();
|
|
26
|
+
get configuration(): USBConfiguration | undefined;
|
|
27
|
+
get opened(): boolean;
|
|
28
|
+
open(): Promise<void>;
|
|
29
|
+
close(): Promise<void>;
|
|
30
|
+
selectConfiguration(configurationValue: number): Promise<void>;
|
|
31
|
+
claimInterface(interfaceNumber: number): Promise<void>;
|
|
32
|
+
releaseInterface(interfaceNumber: number): Promise<void>;
|
|
33
|
+
selectAlternateInterface(interfaceNumber: number, alternateSetting: number): Promise<void>;
|
|
34
|
+
controlTransferIn(setup: USBControlTransferParameters, length: number): Promise<USBInTransferResult>;
|
|
35
|
+
controlTransferOut(setup: USBControlTransferParameters, data?: ArrayBuffer): Promise<USBOutTransferResult>;
|
|
36
|
+
clearHalt(direction: USBDirection, endpointNumber: number): Promise<void>;
|
|
37
|
+
transferIn(endpointNumber: number, length: number): Promise<USBInTransferResult>;
|
|
38
|
+
transferOut(endpointNumber: number, data: ArrayBuffer): Promise<USBOutTransferResult>;
|
|
39
|
+
isochronousTransferIn(_endpointNumber: number, _packetLengths: number[]): Promise<USBIsochronousInTransferResult>;
|
|
40
|
+
isochronousTransferOut(_endpointNumber: number, _data: BufferSource, _packetLengths: number[]): Promise<USBIsochronousOutTransferResult>;
|
|
41
|
+
reset(): Promise<void>;
|
|
42
|
+
private initialize;
|
|
43
|
+
private decodeVersion;
|
|
44
|
+
private getStringDescriptor;
|
|
45
|
+
private getConfigurations;
|
|
46
|
+
private getEndpoint;
|
|
47
|
+
private controlTransferParamsToType;
|
|
48
|
+
private _releaseInterface;
|
|
49
|
+
}
|