usb 2.2.0 → 2.4.0
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/CHANGELOG.md +26 -0
- package/README.md +17 -3
- package/binding.gyp +3 -3
- package/dist/usb/index.js +7 -16
- package/dist/usb/index.js.map +1 -1
- package/dist/webusb/webusb-device.d.ts +0 -1
- package/dist/webusb/webusb-device.js +149 -243
- package/dist/webusb/webusb-device.js.map +1 -1
- package/libusb/.private/ci-container-build.sh +70 -0
- package/libusb/AUTHORS +10 -0
- package/libusb/ChangeLog +13 -0
- package/libusb/android/examples/unrooted_android.c +3 -4
- package/libusb/appveyor.yml +4 -0
- package/libusb/configure.ac +14 -1
- package/libusb/libusb/Makefile.am +1 -1
- package/libusb/libusb/core.c +17 -5
- package/libusb/libusb/hotplug.c +3 -0
- package/libusb/libusb/io.c +32 -8
- package/libusb/libusb/libusb.h +7 -0
- package/libusb/libusb/libusbi.h +22 -4
- package/libusb/libusb/os/darwin_usb.c +77 -20
- package/libusb/libusb/os/linux_usbfs.c +1 -1
- package/libusb/libusb/os/windows_common.c +14 -3
- package/libusb/libusb/os/windows_common.h +2 -1
- package/libusb/libusb/os/windows_winusb.c +30 -3
- package/libusb/libusb/version.h +1 -1
- package/libusb/libusb/version_nano.h +1 -1
- package/libusb/tests/Makefile.am +12 -1
- package/libusb/tests/umockdev.c +1175 -0
- package/package.json +6 -5
- 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 +20 -22
- package/src/node_usb.cc +93 -119
- package/src/node_usb.h +27 -15
- package/src/transfer.cc +0 -5
- package/test/usb.coffee +18 -7
- package/test/worker.cjs +9 -0
- package/tsc/usb/index.ts +5 -8
- package/tsc/webusb/webusb-device.ts +67 -124
- package/dist/webusb/mutex.d.ts +0 -22
- package/dist/webusb/mutex.js +0 -89
- package/dist/webusb/mutex.js.map +0 -1
- package/tsc/webusb/mutex.ts +0 -38
|
@@ -50,7 +50,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
50
50
|
exports.WebUSBDevice = void 0;
|
|
51
51
|
var usb = require("../usb");
|
|
52
52
|
var util_1 = require("util");
|
|
53
|
-
var mutex_1 = require("./mutex");
|
|
54
53
|
var LIBUSB_TRANSFER_TYPE_MASK = 0x03;
|
|
55
54
|
var ENDPOINT_NUMBER_MASK = 0x7f;
|
|
56
55
|
var CLEAR_FEATURE = 0x01;
|
|
@@ -62,7 +61,6 @@ var WebUSBDevice = /** @class */ (function () {
|
|
|
62
61
|
function WebUSBDevice(device) {
|
|
63
62
|
this.device = device;
|
|
64
63
|
this.configurations = [];
|
|
65
|
-
this.deviceMutex = new mutex_1.Mutex();
|
|
66
64
|
var usbVersion = this.decodeVersion(device.deviceDescriptor.bcdUSB);
|
|
67
65
|
this.usbVersionMajor = usbVersion.major;
|
|
68
66
|
this.usbVersionMinor = usbVersion.minor;
|
|
@@ -117,59 +115,46 @@ var WebUSBDevice = /** @class */ (function () {
|
|
|
117
115
|
});
|
|
118
116
|
WebUSBDevice.prototype.open = function () {
|
|
119
117
|
return __awaiter(this, void 0, void 0, function () {
|
|
120
|
-
var error_1;
|
|
121
118
|
return __generator(this, function (_a) {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
}
|
|
131
|
-
this.device.open();
|
|
132
|
-
return [3 /*break*/, 4];
|
|
133
|
-
case 2:
|
|
134
|
-
error_1 = _a.sent();
|
|
135
|
-
throw new Error("open error: " + error_1);
|
|
136
|
-
case 3:
|
|
137
|
-
this.deviceMutex.unlock();
|
|
138
|
-
return [7 /*endfinally*/];
|
|
139
|
-
case 4: return [2 /*return*/];
|
|
119
|
+
try {
|
|
120
|
+
if (this.opened) {
|
|
121
|
+
return [2 /*return*/];
|
|
122
|
+
}
|
|
123
|
+
this.device.open();
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
throw new Error("open error: " + error);
|
|
140
127
|
}
|
|
128
|
+
return [2 /*return*/];
|
|
141
129
|
});
|
|
142
130
|
});
|
|
143
131
|
};
|
|
144
132
|
WebUSBDevice.prototype.close = function () {
|
|
145
133
|
var _a;
|
|
146
134
|
return __awaiter(this, void 0, void 0, function () {
|
|
147
|
-
var _b, _c, iface, e_1_1, _error_1,
|
|
135
|
+
var _b, _c, iface, e_1_1, _error_1, error_1;
|
|
148
136
|
var e_1, _d;
|
|
149
137
|
return __generator(this, function (_e) {
|
|
150
138
|
switch (_e.label) {
|
|
151
139
|
case 0:
|
|
152
|
-
_e.trys.push([0,
|
|
153
|
-
return [4 /*yield*/, this.deviceMutex.lock()];
|
|
154
|
-
case 1:
|
|
155
|
-
_e.sent();
|
|
140
|
+
_e.trys.push([0, 12, , 13]);
|
|
156
141
|
if (!this.opened) {
|
|
157
142
|
return [2 /*return*/];
|
|
158
143
|
}
|
|
144
|
+
_e.label = 1;
|
|
145
|
+
case 1:
|
|
146
|
+
_e.trys.push([1, 10, , 11]);
|
|
147
|
+
if (!this.configuration) return [3 /*break*/, 9];
|
|
159
148
|
_e.label = 2;
|
|
160
149
|
case 2:
|
|
161
|
-
_e.trys.push([2,
|
|
162
|
-
|
|
150
|
+
_e.trys.push([2, 7, 8, 9]);
|
|
151
|
+
_b = __values((_a = this.configuration) === null || _a === void 0 ? void 0 : _a.interfaces), _c = _b.next();
|
|
163
152
|
_e.label = 3;
|
|
164
153
|
case 3:
|
|
165
|
-
|
|
166
|
-
_b = __values((_a = this.configuration) === null || _a === void 0 ? void 0 : _a.interfaces), _c = _b.next();
|
|
167
|
-
_e.label = 4;
|
|
168
|
-
case 4:
|
|
169
|
-
if (!!_c.done) return [3 /*break*/, 7];
|
|
154
|
+
if (!!_c.done) return [3 /*break*/, 6];
|
|
170
155
|
iface = _c.value;
|
|
171
156
|
return [4 /*yield*/, this._releaseInterface(iface.interfaceNumber)];
|
|
172
|
-
case
|
|
157
|
+
case 4:
|
|
173
158
|
_e.sent();
|
|
174
159
|
// Re-create the USBInterface to set the claimed attribute
|
|
175
160
|
this.configuration.interfaces[this.configuration.interfaces.indexOf(iface)] = {
|
|
@@ -178,49 +163,42 @@ var WebUSBDevice = /** @class */ (function () {
|
|
|
178
163
|
alternates: iface.alternates,
|
|
179
164
|
claimed: false
|
|
180
165
|
};
|
|
181
|
-
_e.label =
|
|
182
|
-
case
|
|
166
|
+
_e.label = 5;
|
|
167
|
+
case 5:
|
|
183
168
|
_c = _b.next();
|
|
184
|
-
return [3 /*break*/,
|
|
185
|
-
case
|
|
186
|
-
case
|
|
169
|
+
return [3 /*break*/, 3];
|
|
170
|
+
case 6: return [3 /*break*/, 9];
|
|
171
|
+
case 7:
|
|
187
172
|
e_1_1 = _e.sent();
|
|
188
173
|
e_1 = { error: e_1_1 };
|
|
189
|
-
return [3 /*break*/,
|
|
190
|
-
case
|
|
174
|
+
return [3 /*break*/, 9];
|
|
175
|
+
case 8:
|
|
191
176
|
try {
|
|
192
177
|
if (_c && !_c.done && (_d = _b.return)) _d.call(_b);
|
|
193
178
|
}
|
|
194
179
|
finally { if (e_1) throw e_1.error; }
|
|
195
180
|
return [7 /*endfinally*/];
|
|
196
|
-
case
|
|
197
|
-
case
|
|
181
|
+
case 9: return [3 /*break*/, 11];
|
|
182
|
+
case 10:
|
|
198
183
|
_error_1 = _e.sent();
|
|
199
|
-
return [3 /*break*/,
|
|
200
|
-
case
|
|
184
|
+
return [3 /*break*/, 11];
|
|
185
|
+
case 11:
|
|
201
186
|
this.device.close();
|
|
202
|
-
return [3 /*break*/,
|
|
203
|
-
case
|
|
204
|
-
|
|
205
|
-
throw new Error("close error: " +
|
|
206
|
-
case
|
|
207
|
-
this.deviceMutex.unlock();
|
|
208
|
-
return [7 /*endfinally*/];
|
|
209
|
-
case 15: return [2 /*return*/];
|
|
187
|
+
return [3 /*break*/, 13];
|
|
188
|
+
case 12:
|
|
189
|
+
error_1 = _e.sent();
|
|
190
|
+
throw new Error("close error: " + error_1);
|
|
191
|
+
case 13: return [2 /*return*/];
|
|
210
192
|
}
|
|
211
193
|
});
|
|
212
194
|
});
|
|
213
195
|
};
|
|
214
196
|
WebUSBDevice.prototype.selectConfiguration = function (configurationValue) {
|
|
215
197
|
return __awaiter(this, void 0, void 0, function () {
|
|
216
|
-
var config, setConfiguration,
|
|
198
|
+
var config, setConfiguration, error_2;
|
|
217
199
|
return __generator(this, function (_a) {
|
|
218
200
|
switch (_a.label) {
|
|
219
201
|
case 0:
|
|
220
|
-
_a.trys.push([0, , 6, 7]);
|
|
221
|
-
return [4 /*yield*/, this.deviceMutex.lock()];
|
|
222
|
-
case 1:
|
|
223
|
-
_a.sent();
|
|
224
202
|
if (!this.opened || !this.device.configDescriptor) {
|
|
225
203
|
throw new Error('selectConfiguration error: invalid state');
|
|
226
204
|
}
|
|
@@ -231,22 +209,18 @@ var WebUSBDevice = /** @class */ (function () {
|
|
|
231
209
|
if (!config) {
|
|
232
210
|
throw new Error('selectConfiguration error: configuration not found');
|
|
233
211
|
}
|
|
234
|
-
_a.label =
|
|
235
|
-
case
|
|
236
|
-
_a.trys.push([
|
|
212
|
+
_a.label = 1;
|
|
213
|
+
case 1:
|
|
214
|
+
_a.trys.push([1, 3, , 4]);
|
|
237
215
|
setConfiguration = util_1.promisify(this.device.setConfiguration).bind(this.device);
|
|
238
216
|
return [4 /*yield*/, setConfiguration(configurationValue)];
|
|
239
|
-
case
|
|
217
|
+
case 2:
|
|
240
218
|
_a.sent();
|
|
241
|
-
return [3 /*break*/,
|
|
242
|
-
case
|
|
243
|
-
|
|
244
|
-
throw new Error("selectConfiguration error: " +
|
|
245
|
-
case
|
|
246
|
-
case 6:
|
|
247
|
-
this.deviceMutex.unlock();
|
|
248
|
-
return [7 /*endfinally*/];
|
|
249
|
-
case 7: return [2 /*return*/];
|
|
219
|
+
return [3 /*break*/, 4];
|
|
220
|
+
case 3:
|
|
221
|
+
error_2 = _a.sent();
|
|
222
|
+
throw new Error("selectConfiguration error: " + error_2);
|
|
223
|
+
case 4: return [2 /*return*/];
|
|
250
224
|
}
|
|
251
225
|
});
|
|
252
226
|
});
|
|
@@ -255,44 +229,33 @@ var WebUSBDevice = /** @class */ (function () {
|
|
|
255
229
|
return __awaiter(this, void 0, void 0, function () {
|
|
256
230
|
var iface;
|
|
257
231
|
return __generator(this, function (_a) {
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
_a.trys.push([0, , 2, 3]);
|
|
261
|
-
return [4 /*yield*/, this.deviceMutex.lock()];
|
|
262
|
-
case 1:
|
|
263
|
-
_a.sent();
|
|
264
|
-
if (!this.opened) {
|
|
265
|
-
throw new Error('claimInterface error: invalid state');
|
|
266
|
-
}
|
|
267
|
-
if (!this.configuration) {
|
|
268
|
-
throw new Error('claimInterface error: interface not found');
|
|
269
|
-
}
|
|
270
|
-
iface = this.configuration.interfaces.find(function (usbInterface) { return usbInterface.interfaceNumber === interfaceNumber; });
|
|
271
|
-
if (!iface) {
|
|
272
|
-
throw new Error('claimInterface error: interface not found');
|
|
273
|
-
}
|
|
274
|
-
if (iface.claimed) {
|
|
275
|
-
return [2 /*return*/];
|
|
276
|
-
}
|
|
277
|
-
try {
|
|
278
|
-
this.device.interface(interfaceNumber).claim();
|
|
279
|
-
// Re-create the USBInterface to set the claimed attribute
|
|
280
|
-
this.configuration.interfaces[this.configuration.interfaces.indexOf(iface)] = {
|
|
281
|
-
interfaceNumber: interfaceNumber,
|
|
282
|
-
alternate: iface.alternate,
|
|
283
|
-
alternates: iface.alternates,
|
|
284
|
-
claimed: true
|
|
285
|
-
};
|
|
286
|
-
}
|
|
287
|
-
catch (error) {
|
|
288
|
-
throw new Error("claimInterface error: " + error);
|
|
289
|
-
}
|
|
290
|
-
return [3 /*break*/, 3];
|
|
291
|
-
case 2:
|
|
292
|
-
this.deviceMutex.unlock();
|
|
293
|
-
return [7 /*endfinally*/];
|
|
294
|
-
case 3: return [2 /*return*/];
|
|
232
|
+
if (!this.opened) {
|
|
233
|
+
throw new Error('claimInterface error: invalid state');
|
|
295
234
|
}
|
|
235
|
+
if (!this.configuration) {
|
|
236
|
+
throw new Error('claimInterface error: interface not found');
|
|
237
|
+
}
|
|
238
|
+
iface = this.configuration.interfaces.find(function (usbInterface) { return usbInterface.interfaceNumber === interfaceNumber; });
|
|
239
|
+
if (!iface) {
|
|
240
|
+
throw new Error('claimInterface error: interface not found');
|
|
241
|
+
}
|
|
242
|
+
if (iface.claimed) {
|
|
243
|
+
return [2 /*return*/];
|
|
244
|
+
}
|
|
245
|
+
try {
|
|
246
|
+
this.device.interface(interfaceNumber).claim();
|
|
247
|
+
// Re-create the USBInterface to set the claimed attribute
|
|
248
|
+
this.configuration.interfaces[this.configuration.interfaces.indexOf(iface)] = {
|
|
249
|
+
interfaceNumber: interfaceNumber,
|
|
250
|
+
alternate: iface.alternate,
|
|
251
|
+
alternates: iface.alternates,
|
|
252
|
+
claimed: true
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
catch (error) {
|
|
256
|
+
throw new Error("claimInterface error: " + error);
|
|
257
|
+
}
|
|
258
|
+
return [2 /*return*/];
|
|
296
259
|
});
|
|
297
260
|
});
|
|
298
261
|
};
|
|
@@ -301,13 +264,8 @@ var WebUSBDevice = /** @class */ (function () {
|
|
|
301
264
|
var iface;
|
|
302
265
|
return __generator(this, function (_a) {
|
|
303
266
|
switch (_a.label) {
|
|
304
|
-
case 0:
|
|
305
|
-
_a.trys.push([0, , 3, 4]);
|
|
306
|
-
return [4 /*yield*/, this.deviceMutex.lock()];
|
|
267
|
+
case 0: return [4 /*yield*/, this._releaseInterface(interfaceNumber)];
|
|
307
268
|
case 1:
|
|
308
|
-
_a.sent();
|
|
309
|
-
return [4 /*yield*/, this._releaseInterface(interfaceNumber)];
|
|
310
|
-
case 2:
|
|
311
269
|
_a.sent();
|
|
312
270
|
if (this.configuration) {
|
|
313
271
|
iface = this.configuration.interfaces.find(function (usbInterface) { return usbInterface.interfaceNumber === interfaceNumber; });
|
|
@@ -321,25 +279,17 @@ var WebUSBDevice = /** @class */ (function () {
|
|
|
321
279
|
};
|
|
322
280
|
}
|
|
323
281
|
}
|
|
324
|
-
return [
|
|
325
|
-
case 3:
|
|
326
|
-
this.deviceMutex.unlock();
|
|
327
|
-
return [7 /*endfinally*/];
|
|
328
|
-
case 4: return [2 /*return*/];
|
|
282
|
+
return [2 /*return*/];
|
|
329
283
|
}
|
|
330
284
|
});
|
|
331
285
|
});
|
|
332
286
|
};
|
|
333
287
|
WebUSBDevice.prototype.selectAlternateInterface = function (interfaceNumber, alternateSetting) {
|
|
334
288
|
return __awaiter(this, void 0, void 0, function () {
|
|
335
|
-
var iface, iface_1, setAltSetting,
|
|
289
|
+
var iface, iface_1, setAltSetting, error_3;
|
|
336
290
|
return __generator(this, function (_a) {
|
|
337
291
|
switch (_a.label) {
|
|
338
292
|
case 0:
|
|
339
|
-
_a.trys.push([0, , 6, 7]);
|
|
340
|
-
return [4 /*yield*/, this.deviceMutex.lock()];
|
|
341
|
-
case 1:
|
|
342
|
-
_a.sent();
|
|
343
293
|
if (!this.opened) {
|
|
344
294
|
throw new Error('selectAlternateInterface error: invalid state');
|
|
345
295
|
}
|
|
@@ -353,230 +303,190 @@ var WebUSBDevice = /** @class */ (function () {
|
|
|
353
303
|
if (!iface.claimed) {
|
|
354
304
|
throw new Error('selectAlternateInterface error: invalid state');
|
|
355
305
|
}
|
|
356
|
-
_a.label =
|
|
357
|
-
case
|
|
358
|
-
_a.trys.push([
|
|
306
|
+
_a.label = 1;
|
|
307
|
+
case 1:
|
|
308
|
+
_a.trys.push([1, 3, , 4]);
|
|
359
309
|
iface_1 = this.device.interface(interfaceNumber);
|
|
360
310
|
setAltSetting = util_1.promisify(iface_1.setAltSetting).bind(iface_1);
|
|
361
311
|
return [4 /*yield*/, setAltSetting(alternateSetting)];
|
|
362
|
-
case
|
|
312
|
+
case 2:
|
|
363
313
|
_a.sent();
|
|
364
|
-
return [3 /*break*/,
|
|
365
|
-
case
|
|
366
|
-
|
|
367
|
-
throw new Error("selectAlternateInterface error: " +
|
|
368
|
-
case
|
|
369
|
-
case 6:
|
|
370
|
-
this.deviceMutex.unlock();
|
|
371
|
-
return [7 /*endfinally*/];
|
|
372
|
-
case 7: return [2 /*return*/];
|
|
314
|
+
return [3 /*break*/, 4];
|
|
315
|
+
case 3:
|
|
316
|
+
error_3 = _a.sent();
|
|
317
|
+
throw new Error("selectAlternateInterface error: " + error_3);
|
|
318
|
+
case 4: return [2 /*return*/];
|
|
373
319
|
}
|
|
374
320
|
});
|
|
375
321
|
});
|
|
376
322
|
};
|
|
377
323
|
WebUSBDevice.prototype.controlTransferIn = function (setup, length) {
|
|
378
324
|
return __awaiter(this, void 0, void 0, function () {
|
|
379
|
-
var type, controlTransfer, result,
|
|
325
|
+
var type, controlTransfer, result, error_4;
|
|
380
326
|
return __generator(this, function (_a) {
|
|
381
327
|
switch (_a.label) {
|
|
382
328
|
case 0:
|
|
383
|
-
_a.trys.push([0,
|
|
384
|
-
return [4 /*yield*/, this.deviceMutex.lock()];
|
|
385
|
-
case 1:
|
|
386
|
-
_a.sent();
|
|
329
|
+
_a.trys.push([0, 2, , 3]);
|
|
387
330
|
type = this.controlTransferParamsToType(setup, usb.LIBUSB_ENDPOINT_IN);
|
|
388
331
|
controlTransfer = util_1.promisify(this.device.controlTransfer).bind(this.device);
|
|
389
332
|
return [4 /*yield*/, controlTransfer(type, setup.request, setup.value, setup.index, length)];
|
|
390
|
-
case
|
|
333
|
+
case 1:
|
|
391
334
|
result = _a.sent();
|
|
392
335
|
return [2 /*return*/, {
|
|
393
336
|
data: result ? new DataView(new Uint8Array(result).buffer) : undefined,
|
|
394
337
|
status: 'ok'
|
|
395
338
|
}];
|
|
396
|
-
case
|
|
397
|
-
|
|
398
|
-
if (
|
|
339
|
+
case 2:
|
|
340
|
+
error_4 = _a.sent();
|
|
341
|
+
if (error_4.errno === usb.LIBUSB_TRANSFER_STALL) {
|
|
399
342
|
return [2 /*return*/, {
|
|
400
343
|
status: 'stall'
|
|
401
344
|
}];
|
|
402
345
|
}
|
|
403
|
-
if (
|
|
346
|
+
if (error_4.errno === usb.LIBUSB_TRANSFER_OVERFLOW) {
|
|
404
347
|
return [2 /*return*/, {
|
|
405
348
|
status: 'babble'
|
|
406
349
|
}];
|
|
407
350
|
}
|
|
408
|
-
throw new Error("controlTransferIn error: " +
|
|
409
|
-
case
|
|
410
|
-
this.deviceMutex.unlock();
|
|
411
|
-
return [7 /*endfinally*/];
|
|
412
|
-
case 5: return [2 /*return*/];
|
|
351
|
+
throw new Error("controlTransferIn error: " + error_4);
|
|
352
|
+
case 3: return [2 /*return*/];
|
|
413
353
|
}
|
|
414
354
|
});
|
|
415
355
|
});
|
|
416
356
|
};
|
|
417
357
|
WebUSBDevice.prototype.controlTransferOut = function (setup, data) {
|
|
418
358
|
return __awaiter(this, void 0, void 0, function () {
|
|
419
|
-
var type, controlTransfer, buffer, bytesWritten,
|
|
359
|
+
var type, controlTransfer, buffer, bytesWritten, error_5;
|
|
420
360
|
return __generator(this, function (_a) {
|
|
421
361
|
switch (_a.label) {
|
|
422
362
|
case 0:
|
|
423
|
-
_a.trys.push([0,
|
|
424
|
-
return [4 /*yield*/, this.deviceMutex.lock()];
|
|
425
|
-
case 1:
|
|
426
|
-
_a.sent();
|
|
363
|
+
_a.trys.push([0, 2, , 3]);
|
|
427
364
|
type = this.controlTransferParamsToType(setup, usb.LIBUSB_ENDPOINT_OUT);
|
|
428
365
|
controlTransfer = util_1.promisify(this.device.controlTransfer).bind(this.device);
|
|
429
366
|
buffer = data ? Buffer.from(data) : Buffer.alloc(0);
|
|
430
367
|
return [4 /*yield*/, controlTransfer(type, setup.request, setup.value, setup.index, buffer)];
|
|
431
|
-
case
|
|
368
|
+
case 1:
|
|
432
369
|
bytesWritten = _a.sent();
|
|
433
370
|
return [2 /*return*/, {
|
|
434
371
|
bytesWritten: bytesWritten,
|
|
435
372
|
status: 'ok'
|
|
436
373
|
}];
|
|
437
|
-
case
|
|
438
|
-
|
|
439
|
-
if (
|
|
374
|
+
case 2:
|
|
375
|
+
error_5 = _a.sent();
|
|
376
|
+
if (error_5.errno === usb.LIBUSB_TRANSFER_STALL) {
|
|
440
377
|
return [2 /*return*/, {
|
|
441
378
|
bytesWritten: 0,
|
|
442
379
|
status: 'stall'
|
|
443
380
|
}];
|
|
444
381
|
}
|
|
445
|
-
throw new Error("controlTransferOut error: " +
|
|
446
|
-
case
|
|
447
|
-
this.deviceMutex.unlock();
|
|
448
|
-
return [7 /*endfinally*/];
|
|
449
|
-
case 5: return [2 /*return*/];
|
|
382
|
+
throw new Error("controlTransferOut error: " + error_5);
|
|
383
|
+
case 3: return [2 /*return*/];
|
|
450
384
|
}
|
|
451
385
|
});
|
|
452
386
|
});
|
|
453
387
|
};
|
|
454
388
|
WebUSBDevice.prototype.clearHalt = function (direction, endpointNumber) {
|
|
455
389
|
return __awaiter(this, void 0, void 0, function () {
|
|
456
|
-
var wIndex, controlTransfer,
|
|
390
|
+
var wIndex, controlTransfer, error_6;
|
|
457
391
|
return __generator(this, function (_a) {
|
|
458
392
|
switch (_a.label) {
|
|
459
393
|
case 0:
|
|
460
|
-
_a.trys.push([0,
|
|
461
|
-
return [4 /*yield*/, this.deviceMutex.lock()];
|
|
462
|
-
case 1:
|
|
463
|
-
_a.sent();
|
|
394
|
+
_a.trys.push([0, 2, , 3]);
|
|
464
395
|
wIndex = endpointNumber | (direction === 'in' ? usb.LIBUSB_ENDPOINT_IN : usb.LIBUSB_ENDPOINT_OUT);
|
|
465
396
|
controlTransfer = util_1.promisify(this.device.controlTransfer).bind(this.device);
|
|
466
397
|
return [4 /*yield*/, controlTransfer(usb.LIBUSB_RECIPIENT_ENDPOINT, CLEAR_FEATURE, ENDPOINT_HALT, wIndex, 0)];
|
|
467
|
-
case
|
|
398
|
+
case 1:
|
|
468
399
|
_a.sent();
|
|
469
|
-
return [3 /*break*/,
|
|
470
|
-
case
|
|
471
|
-
|
|
472
|
-
throw new Error("clearHalt error: " +
|
|
473
|
-
case
|
|
474
|
-
this.deviceMutex.unlock();
|
|
475
|
-
return [7 /*endfinally*/];
|
|
476
|
-
case 5: return [2 /*return*/];
|
|
400
|
+
return [3 /*break*/, 3];
|
|
401
|
+
case 2:
|
|
402
|
+
error_6 = _a.sent();
|
|
403
|
+
throw new Error("clearHalt error: " + error_6);
|
|
404
|
+
case 3: return [2 /*return*/];
|
|
477
405
|
}
|
|
478
406
|
});
|
|
479
407
|
});
|
|
480
408
|
};
|
|
481
409
|
WebUSBDevice.prototype.transferIn = function (endpointNumber, length) {
|
|
482
410
|
return __awaiter(this, void 0, void 0, function () {
|
|
483
|
-
var endpoint, transfer, result,
|
|
411
|
+
var endpoint, transfer, result, error_7;
|
|
484
412
|
return __generator(this, function (_a) {
|
|
485
413
|
switch (_a.label) {
|
|
486
414
|
case 0:
|
|
487
|
-
_a.trys.push([0,
|
|
488
|
-
return [4 /*yield*/, this.deviceMutex.lock()];
|
|
489
|
-
case 1:
|
|
490
|
-
_a.sent();
|
|
415
|
+
_a.trys.push([0, 2, , 3]);
|
|
491
416
|
endpoint = this.getEndpoint(endpointNumber | usb.LIBUSB_ENDPOINT_IN);
|
|
492
417
|
transfer = util_1.promisify(endpoint.transfer).bind(endpoint);
|
|
493
418
|
return [4 /*yield*/, transfer(length)];
|
|
494
|
-
case
|
|
419
|
+
case 1:
|
|
495
420
|
result = _a.sent();
|
|
496
421
|
return [2 /*return*/, {
|
|
497
422
|
data: result ? new DataView(new Uint8Array(result).buffer) : undefined,
|
|
498
423
|
status: 'ok'
|
|
499
424
|
}];
|
|
500
|
-
case
|
|
501
|
-
|
|
502
|
-
if (
|
|
425
|
+
case 2:
|
|
426
|
+
error_7 = _a.sent();
|
|
427
|
+
if (error_7.errno === usb.LIBUSB_TRANSFER_STALL) {
|
|
503
428
|
return [2 /*return*/, {
|
|
504
429
|
status: 'stall'
|
|
505
430
|
}];
|
|
506
431
|
}
|
|
507
|
-
if (
|
|
432
|
+
if (error_7.errno === usb.LIBUSB_TRANSFER_OVERFLOW) {
|
|
508
433
|
return [2 /*return*/, {
|
|
509
434
|
status: 'babble'
|
|
510
435
|
}];
|
|
511
436
|
}
|
|
512
|
-
throw new Error("transferIn error: " +
|
|
513
|
-
case
|
|
514
|
-
this.deviceMutex.unlock();
|
|
515
|
-
return [7 /*endfinally*/];
|
|
516
|
-
case 5: return [2 /*return*/];
|
|
437
|
+
throw new Error("transferIn error: " + error_7);
|
|
438
|
+
case 3: return [2 /*return*/];
|
|
517
439
|
}
|
|
518
440
|
});
|
|
519
441
|
});
|
|
520
442
|
};
|
|
521
443
|
WebUSBDevice.prototype.transferOut = function (endpointNumber, data) {
|
|
522
444
|
return __awaiter(this, void 0, void 0, function () {
|
|
523
|
-
var endpoint, transfer, buffer, bytesWritten,
|
|
445
|
+
var endpoint, transfer, buffer, bytesWritten, error_8;
|
|
524
446
|
return __generator(this, function (_a) {
|
|
525
447
|
switch (_a.label) {
|
|
526
448
|
case 0:
|
|
527
|
-
_a.trys.push([0,
|
|
528
|
-
return [4 /*yield*/, this.deviceMutex.lock()];
|
|
529
|
-
case 1:
|
|
530
|
-
_a.sent();
|
|
449
|
+
_a.trys.push([0, 2, , 3]);
|
|
531
450
|
endpoint = this.getEndpoint(endpointNumber | usb.LIBUSB_ENDPOINT_OUT);
|
|
532
451
|
transfer = util_1.promisify(endpoint.transfer).bind(endpoint);
|
|
533
452
|
buffer = Buffer.from(data);
|
|
534
453
|
return [4 /*yield*/, transfer(buffer)];
|
|
535
|
-
case
|
|
454
|
+
case 1:
|
|
536
455
|
bytesWritten = _a.sent();
|
|
537
456
|
return [2 /*return*/, {
|
|
538
457
|
bytesWritten: bytesWritten,
|
|
539
458
|
status: 'ok'
|
|
540
459
|
}];
|
|
541
|
-
case
|
|
542
|
-
|
|
543
|
-
if (
|
|
460
|
+
case 2:
|
|
461
|
+
error_8 = _a.sent();
|
|
462
|
+
if (error_8.errno === usb.LIBUSB_TRANSFER_STALL) {
|
|
544
463
|
return [2 /*return*/, {
|
|
545
464
|
bytesWritten: 0,
|
|
546
465
|
status: 'stall'
|
|
547
466
|
}];
|
|
548
467
|
}
|
|
549
|
-
throw new Error("transferOut error: " +
|
|
550
|
-
case
|
|
551
|
-
this.deviceMutex.unlock();
|
|
552
|
-
return [7 /*endfinally*/];
|
|
553
|
-
case 5: return [2 /*return*/];
|
|
468
|
+
throw new Error("transferOut error: " + error_8);
|
|
469
|
+
case 3: return [2 /*return*/];
|
|
554
470
|
}
|
|
555
471
|
});
|
|
556
472
|
});
|
|
557
473
|
};
|
|
558
474
|
WebUSBDevice.prototype.reset = function () {
|
|
559
475
|
return __awaiter(this, void 0, void 0, function () {
|
|
560
|
-
var reset,
|
|
476
|
+
var reset, error_9;
|
|
561
477
|
return __generator(this, function (_a) {
|
|
562
478
|
switch (_a.label) {
|
|
563
479
|
case 0:
|
|
564
|
-
_a.trys.push([0,
|
|
565
|
-
return [4 /*yield*/, this.deviceMutex.lock()];
|
|
566
|
-
case 1:
|
|
567
|
-
_a.sent();
|
|
480
|
+
_a.trys.push([0, 2, , 3]);
|
|
568
481
|
reset = util_1.promisify(this.device.reset).bind(this.device);
|
|
569
482
|
return [4 /*yield*/, reset()];
|
|
570
|
-
case
|
|
483
|
+
case 1:
|
|
571
484
|
_a.sent();
|
|
572
|
-
return [3 /*break*/,
|
|
573
|
-
case
|
|
574
|
-
|
|
575
|
-
throw new Error("reset error: " +
|
|
576
|
-
case
|
|
577
|
-
this.deviceMutex.unlock();
|
|
578
|
-
return [7 /*endfinally*/];
|
|
579
|
-
case 5: return [2 /*return*/];
|
|
485
|
+
return [3 /*break*/, 3];
|
|
486
|
+
case 2:
|
|
487
|
+
error_9 = _a.sent();
|
|
488
|
+
throw new Error("reset error: " + error_9);
|
|
489
|
+
case 3: return [2 /*return*/];
|
|
580
490
|
}
|
|
581
491
|
});
|
|
582
492
|
});
|
|
@@ -604,44 +514,40 @@ var WebUSBDevice = /** @class */ (function () {
|
|
|
604
514
|
};
|
|
605
515
|
WebUSBDevice.prototype.initialize = function () {
|
|
606
516
|
return __awaiter(this, void 0, void 0, function () {
|
|
607
|
-
var _a, _b, _c, _d,
|
|
517
|
+
var _a, _b, _c, _d, error_10;
|
|
608
518
|
return __generator(this, function (_e) {
|
|
609
519
|
switch (_e.label) {
|
|
610
520
|
case 0:
|
|
611
|
-
_e.trys.push([0, 6, 7
|
|
612
|
-
return [4 /*yield*/, this.deviceMutex.lock()];
|
|
613
|
-
case 1:
|
|
614
|
-
_e.sent();
|
|
521
|
+
_e.trys.push([0, 5, 6, 7]);
|
|
615
522
|
if (!this.opened) {
|
|
616
523
|
this.device.open();
|
|
617
524
|
}
|
|
618
525
|
_a = this;
|
|
619
526
|
return [4 /*yield*/, this.getStringDescriptor(this.device.deviceDescriptor.iManufacturer)];
|
|
620
|
-
case
|
|
527
|
+
case 1:
|
|
621
528
|
_a.manufacturerName = _e.sent();
|
|
622
529
|
_b = this;
|
|
623
530
|
return [4 /*yield*/, this.getStringDescriptor(this.device.deviceDescriptor.iProduct)];
|
|
624
|
-
case
|
|
531
|
+
case 2:
|
|
625
532
|
_b.productName = _e.sent();
|
|
626
533
|
_c = this;
|
|
627
534
|
return [4 /*yield*/, this.getStringDescriptor(this.device.deviceDescriptor.iSerialNumber)];
|
|
628
|
-
case
|
|
535
|
+
case 3:
|
|
629
536
|
_c.serialNumber = _e.sent();
|
|
630
537
|
_d = this;
|
|
631
538
|
return [4 /*yield*/, this.getConfigurations()];
|
|
632
|
-
case
|
|
539
|
+
case 4:
|
|
633
540
|
_d.configurations = _e.sent();
|
|
634
|
-
return [3 /*break*/,
|
|
541
|
+
return [3 /*break*/, 7];
|
|
542
|
+
case 5:
|
|
543
|
+
error_10 = _e.sent();
|
|
544
|
+
throw new Error("initialize error: " + error_10);
|
|
635
545
|
case 6:
|
|
636
|
-
error_11 = _e.sent();
|
|
637
|
-
throw new Error("initialize error: " + error_11);
|
|
638
|
-
case 7:
|
|
639
546
|
if (this.opened) {
|
|
640
547
|
this.device.close();
|
|
641
548
|
}
|
|
642
|
-
this.deviceMutex.unlock();
|
|
643
549
|
return [7 /*endfinally*/];
|
|
644
|
-
case
|
|
550
|
+
case 7: return [2 /*return*/];
|
|
645
551
|
}
|
|
646
552
|
});
|
|
647
553
|
});
|
|
@@ -656,7 +562,7 @@ var WebUSBDevice = /** @class */ (function () {
|
|
|
656
562
|
};
|
|
657
563
|
WebUSBDevice.prototype.getStringDescriptor = function (index) {
|
|
658
564
|
return __awaiter(this, void 0, void 0, function () {
|
|
659
|
-
var getStringDescriptor, buffer,
|
|
565
|
+
var getStringDescriptor, buffer, error_11;
|
|
660
566
|
return __generator(this, function (_a) {
|
|
661
567
|
switch (_a.label) {
|
|
662
568
|
case 0:
|
|
@@ -667,7 +573,7 @@ var WebUSBDevice = /** @class */ (function () {
|
|
|
667
573
|
buffer = _a.sent();
|
|
668
574
|
return [2 /*return*/, buffer ? buffer.toString() : ''];
|
|
669
575
|
case 2:
|
|
670
|
-
|
|
576
|
+
error_11 = _a.sent();
|
|
671
577
|
return [2 /*return*/, ''];
|
|
672
578
|
case 3: return [2 /*return*/];
|
|
673
579
|
}
|
|
@@ -862,7 +768,7 @@ var WebUSBDevice = /** @class */ (function () {
|
|
|
862
768
|
};
|
|
863
769
|
WebUSBDevice.prototype._releaseInterface = function (interfaceNumber) {
|
|
864
770
|
return __awaiter(this, void 0, void 0, function () {
|
|
865
|
-
var iface, iface_3, release,
|
|
771
|
+
var iface, iface_3, release, error_12;
|
|
866
772
|
return __generator(this, function (_a) {
|
|
867
773
|
switch (_a.label) {
|
|
868
774
|
case 0:
|
|
@@ -889,8 +795,8 @@ var WebUSBDevice = /** @class */ (function () {
|
|
|
889
795
|
_a.sent();
|
|
890
796
|
return [3 /*break*/, 4];
|
|
891
797
|
case 3:
|
|
892
|
-
|
|
893
|
-
throw new Error("releaseInterface error: " +
|
|
798
|
+
error_12 = _a.sent();
|
|
799
|
+
throw new Error("releaseInterface error: " + error_12);
|
|
894
800
|
case 4: return [2 /*return*/];
|
|
895
801
|
}
|
|
896
802
|
});
|