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.
Files changed (53) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +17 -3
  3. package/binding.gyp +3 -3
  4. package/dist/usb/index.js +7 -16
  5. package/dist/usb/index.js.map +1 -1
  6. package/dist/webusb/webusb-device.d.ts +0 -1
  7. package/dist/webusb/webusb-device.js +149 -243
  8. package/dist/webusb/webusb-device.js.map +1 -1
  9. package/libusb/.private/ci-container-build.sh +70 -0
  10. package/libusb/AUTHORS +10 -0
  11. package/libusb/ChangeLog +13 -0
  12. package/libusb/android/examples/unrooted_android.c +3 -4
  13. package/libusb/appveyor.yml +4 -0
  14. package/libusb/configure.ac +14 -1
  15. package/libusb/libusb/Makefile.am +1 -1
  16. package/libusb/libusb/core.c +17 -5
  17. package/libusb/libusb/hotplug.c +3 -0
  18. package/libusb/libusb/io.c +32 -8
  19. package/libusb/libusb/libusb.h +7 -0
  20. package/libusb/libusb/libusbi.h +22 -4
  21. package/libusb/libusb/os/darwin_usb.c +77 -20
  22. package/libusb/libusb/os/linux_usbfs.c +1 -1
  23. package/libusb/libusb/os/windows_common.c +14 -3
  24. package/libusb/libusb/os/windows_common.h +2 -1
  25. package/libusb/libusb/os/windows_winusb.c +30 -3
  26. package/libusb/libusb/version.h +1 -1
  27. package/libusb/libusb/version_nano.h +1 -1
  28. package/libusb/tests/Makefile.am +12 -1
  29. package/libusb/tests/umockdev.c +1175 -0
  30. package/package.json +6 -5
  31. package/prebuilds/android-arm/node.napi.armv7.node +0 -0
  32. package/prebuilds/android-arm64/node.napi.armv8.node +0 -0
  33. package/prebuilds/darwin-x64+arm64/node.napi.node +0 -0
  34. package/prebuilds/linux-arm/node.napi.armv6.node +0 -0
  35. package/prebuilds/linux-arm/node.napi.armv7.node +0 -0
  36. package/prebuilds/linux-arm64/node.napi.armv8.node +0 -0
  37. package/prebuilds/linux-ia32/node.napi.node +0 -0
  38. package/prebuilds/linux-x64/node.napi.glibc.node +0 -0
  39. package/prebuilds/linux-x64/node.napi.musl.node +0 -0
  40. package/prebuilds/win32-ia32/node.napi.node +0 -0
  41. package/prebuilds/win32-x64/node.napi.node +0 -0
  42. package/src/device.cc +20 -22
  43. package/src/node_usb.cc +93 -119
  44. package/src/node_usb.h +27 -15
  45. package/src/transfer.cc +0 -5
  46. package/test/usb.coffee +18 -7
  47. package/test/worker.cjs +9 -0
  48. package/tsc/usb/index.ts +5 -8
  49. package/tsc/webusb/webusb-device.ts +67 -124
  50. package/dist/webusb/mutex.d.ts +0 -22
  51. package/dist/webusb/mutex.js +0 -89
  52. package/dist/webusb/mutex.js.map +0 -1
  53. 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
- switch (_a.label) {
123
- case 0:
124
- _a.trys.push([0, 2, 3, 4]);
125
- return [4 /*yield*/, this.deviceMutex.lock()];
126
- case 1:
127
- _a.sent();
128
- if (this.opened) {
129
- return [2 /*return*/];
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, error_2;
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, 13, 14, 15]);
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, 11, , 12]);
162
- if (!this.configuration) return [3 /*break*/, 10];
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
- _e.trys.push([3, 8, 9, 10]);
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 5:
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 = 6;
182
- case 6:
166
+ _e.label = 5;
167
+ case 5:
183
168
  _c = _b.next();
184
- return [3 /*break*/, 4];
185
- case 7: return [3 /*break*/, 10];
186
- case 8:
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*/, 10];
190
- case 9:
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 10: return [3 /*break*/, 12];
197
- case 11:
181
+ case 9: return [3 /*break*/, 11];
182
+ case 10:
198
183
  _error_1 = _e.sent();
199
- return [3 /*break*/, 12];
200
- case 12:
184
+ return [3 /*break*/, 11];
185
+ case 11:
201
186
  this.device.close();
202
- return [3 /*break*/, 15];
203
- case 13:
204
- error_2 = _e.sent();
205
- throw new Error("close error: " + error_2);
206
- case 14:
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, error_3;
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 = 2;
235
- case 2:
236
- _a.trys.push([2, 4, , 5]);
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 3:
217
+ case 2:
240
218
  _a.sent();
241
- return [3 /*break*/, 5];
242
- case 4:
243
- error_3 = _a.sent();
244
- throw new Error("selectConfiguration error: " + error_3);
245
- case 5: return [3 /*break*/, 7];
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
- switch (_a.label) {
259
- case 0:
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 [3 /*break*/, 4];
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, error_4;
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 = 2;
357
- case 2:
358
- _a.trys.push([2, 4, , 5]);
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 3:
312
+ case 2:
363
313
  _a.sent();
364
- return [3 /*break*/, 5];
365
- case 4:
366
- error_4 = _a.sent();
367
- throw new Error("selectAlternateInterface error: " + error_4);
368
- case 5: return [3 /*break*/, 7];
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, error_5;
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, 3, 4, 5]);
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 2:
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 3:
397
- error_5 = _a.sent();
398
- if (error_5.errno === usb.LIBUSB_TRANSFER_STALL) {
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 (error_5.errno === usb.LIBUSB_TRANSFER_OVERFLOW) {
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: " + error_5);
409
- case 4:
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, error_6;
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, 3, 4, 5]);
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 2:
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 3:
438
- error_6 = _a.sent();
439
- if (error_6.errno === usb.LIBUSB_TRANSFER_STALL) {
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: " + error_6);
446
- case 4:
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, error_7;
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, 3, 4, 5]);
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 2:
398
+ case 1:
468
399
  _a.sent();
469
- return [3 /*break*/, 5];
470
- case 3:
471
- error_7 = _a.sent();
472
- throw new Error("clearHalt error: " + error_7);
473
- case 4:
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, error_8;
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, 3, 4, 5]);
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 2:
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 3:
501
- error_8 = _a.sent();
502
- if (error_8.errno === usb.LIBUSB_TRANSFER_STALL) {
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 (error_8.errno === usb.LIBUSB_TRANSFER_OVERFLOW) {
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: " + error_8);
513
- case 4:
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, error_9;
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, 3, 4, 5]);
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 2:
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 3:
542
- error_9 = _a.sent();
543
- if (error_9.errno === usb.LIBUSB_TRANSFER_STALL) {
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: " + error_9);
550
- case 4:
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, error_10;
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, 3, 4, 5]);
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 2:
483
+ case 1:
571
484
  _a.sent();
572
- return [3 /*break*/, 5];
573
- case 3:
574
- error_10 = _a.sent();
575
- throw new Error("reset error: " + error_10);
576
- case 4:
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, error_11;
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, 8]);
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 2:
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 3:
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 4:
535
+ case 3:
629
536
  _c.serialNumber = _e.sent();
630
537
  _d = this;
631
538
  return [4 /*yield*/, this.getConfigurations()];
632
- case 5:
539
+ case 4:
633
540
  _d.configurations = _e.sent();
634
- return [3 /*break*/, 8];
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 8: return [2 /*return*/];
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, error_12;
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
- error_12 = _a.sent();
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, error_13;
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
- error_13 = _a.sent();
893
- throw new Error("releaseInterface error: " + error_13);
798
+ error_12 = _a.sent();
799
+ throw new Error("releaseInterface error: " + error_12);
894
800
  case 4: return [2 /*return*/];
895
801
  }
896
802
  });