@ledgerhq/hw-transport-webhid 6.27.13 → 6.27.14-next.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 +9 -0
- package/lib/TransportWebHID.js +149 -287
- package/lib/TransportWebHID.js.map +1 -1
- package/lib-es/TransportWebHID.js +142 -281
- package/lib-es/TransportWebHID.js.map +1 -1
- package/package.json +6 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# @ledgerhq/hw-transport-webhid
|
|
2
2
|
|
|
3
|
+
## 6.27.14-next.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [[`87d2349fd8`](https://github.com/LedgerHQ/ledger-live/commit/87d2349fd835e5deb39d1ee8dfcf3539f4195472)]:
|
|
8
|
+
- @ledgerhq/errors@6.12.5-next.0
|
|
9
|
+
- @ledgerhq/devices@8.0.2-next.0
|
|
10
|
+
- @ledgerhq/hw-transport@6.28.3-next.0
|
|
11
|
+
|
|
3
12
|
## 6.27.13
|
|
4
13
|
|
|
5
14
|
### Patch Changes
|
package/lib/TransportWebHID.js
CHANGED
|
@@ -1,19 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __extends = (this && this.__extends) || (function () {
|
|
3
|
-
var extendStatics = function (d, b) {
|
|
4
|
-
extendStatics = Object.setPrototypeOf ||
|
|
5
|
-
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
6
|
-
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
7
|
-
return extendStatics(d, b);
|
|
8
|
-
};
|
|
9
|
-
return function (d, b) {
|
|
10
|
-
if (typeof b !== "function" && b !== null)
|
|
11
|
-
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
12
|
-
extendStatics(d, b);
|
|
13
|
-
function __() { this.constructor = d; }
|
|
14
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
|
-
};
|
|
16
|
-
})();
|
|
17
2
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
18
3
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
19
4
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -23,119 +8,51 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
23
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
24
9
|
});
|
|
25
10
|
};
|
|
26
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
27
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
28
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
29
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
30
|
-
function step(op) {
|
|
31
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
32
|
-
while (_) try {
|
|
33
|
-
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;
|
|
34
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
35
|
-
switch (op[0]) {
|
|
36
|
-
case 0: case 1: t = op; break;
|
|
37
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
38
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
39
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
40
|
-
default:
|
|
41
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
42
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
43
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
44
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
45
|
-
if (t[2]) _.ops.pop();
|
|
46
|
-
_.trys.pop(); continue;
|
|
47
|
-
}
|
|
48
|
-
op = body.call(thisArg, _);
|
|
49
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
50
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
51
|
-
}
|
|
52
|
-
};
|
|
53
|
-
var __read = (this && this.__read) || function (o, n) {
|
|
54
|
-
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
55
|
-
if (!m) return o;
|
|
56
|
-
var i = m.call(o), r, ar = [], e;
|
|
57
|
-
try {
|
|
58
|
-
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
59
|
-
}
|
|
60
|
-
catch (error) { e = { error: error }; }
|
|
61
|
-
finally {
|
|
62
|
-
try {
|
|
63
|
-
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
64
|
-
}
|
|
65
|
-
finally { if (e) throw e.error; }
|
|
66
|
-
}
|
|
67
|
-
return ar;
|
|
68
|
-
};
|
|
69
11
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
70
12
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
71
13
|
};
|
|
72
|
-
exports
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const hw_transport_1 = __importDefault(require("@ledgerhq/hw-transport"));
|
|
16
|
+
const hid_framing_1 = __importDefault(require("@ledgerhq/devices/hid-framing"));
|
|
17
|
+
const devices_1 = require("@ledgerhq/devices");
|
|
18
|
+
const logs_1 = require("@ledgerhq/logs");
|
|
19
|
+
const errors_1 = require("@ledgerhq/errors");
|
|
20
|
+
const ledgerDevices = [
|
|
79
21
|
{
|
|
80
|
-
vendorId: devices_1.ledgerUSBVendorId
|
|
22
|
+
vendorId: devices_1.ledgerUSBVendorId,
|
|
81
23
|
},
|
|
82
24
|
];
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
};
|
|
86
|
-
var getHID = function () {
|
|
25
|
+
const isSupported = () => Promise.resolve(!!(window.navigator && window.navigator.hid));
|
|
26
|
+
const getHID = () => {
|
|
87
27
|
// $FlowFixMe
|
|
88
|
-
|
|
28
|
+
const { hid } = navigator;
|
|
89
29
|
if (!hid)
|
|
90
30
|
throw new errors_1.TransportError("navigator.hid is not supported", "HIDNotSupported");
|
|
91
31
|
return hid;
|
|
92
32
|
};
|
|
93
33
|
function requestLedgerDevices() {
|
|
94
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
switch (_a.label) {
|
|
98
|
-
case 0: return [4 /*yield*/, getHID().requestDevice({
|
|
99
|
-
filters: ledgerDevices
|
|
100
|
-
})];
|
|
101
|
-
case 1:
|
|
102
|
-
device = _a.sent();
|
|
103
|
-
if (Array.isArray(device))
|
|
104
|
-
return [2 /*return*/, device];
|
|
105
|
-
return [2 /*return*/, [device]];
|
|
106
|
-
}
|
|
34
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
35
|
+
const device = yield getHID().requestDevice({
|
|
36
|
+
filters: ledgerDevices,
|
|
107
37
|
});
|
|
38
|
+
if (Array.isArray(device))
|
|
39
|
+
return device;
|
|
40
|
+
return [device];
|
|
108
41
|
});
|
|
109
42
|
}
|
|
110
43
|
function getLedgerDevices() {
|
|
111
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
112
|
-
|
|
113
|
-
return
|
|
114
|
-
switch (_a.label) {
|
|
115
|
-
case 0: return [4 /*yield*/, getHID().getDevices()];
|
|
116
|
-
case 1:
|
|
117
|
-
devices = _a.sent();
|
|
118
|
-
return [2 /*return*/, devices.filter(function (d) { return d.vendorId === devices_1.ledgerUSBVendorId; })];
|
|
119
|
-
}
|
|
120
|
-
});
|
|
44
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
45
|
+
const devices = yield getHID().getDevices();
|
|
46
|
+
return devices.filter((d) => d.vendorId === devices_1.ledgerUSBVendorId);
|
|
121
47
|
});
|
|
122
48
|
}
|
|
123
49
|
function getFirstLedgerDevice() {
|
|
124
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
existingDevices = _a.sent();
|
|
131
|
-
if (existingDevices.length > 0)
|
|
132
|
-
return [2 /*return*/, existingDevices[0]];
|
|
133
|
-
return [4 /*yield*/, requestLedgerDevices()];
|
|
134
|
-
case 2:
|
|
135
|
-
devices = _a.sent();
|
|
136
|
-
return [2 /*return*/, devices[0]];
|
|
137
|
-
}
|
|
138
|
-
});
|
|
50
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
51
|
+
const existingDevices = yield getLedgerDevices();
|
|
52
|
+
if (existingDevices.length > 0)
|
|
53
|
+
return existingDevices[0];
|
|
54
|
+
const devices = yield requestLedgerDevices();
|
|
55
|
+
return devices[0];
|
|
139
56
|
});
|
|
140
57
|
}
|
|
141
58
|
/**
|
|
@@ -145,221 +62,166 @@ function getFirstLedgerDevice() {
|
|
|
145
62
|
* ...
|
|
146
63
|
* TransportWebHID.create().then(transport => ...)
|
|
147
64
|
*/
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
return Promise.resolve(_this.inputs.shift());
|
|
65
|
+
class TransportWebHID extends hw_transport_1.default {
|
|
66
|
+
constructor(device) {
|
|
67
|
+
super();
|
|
68
|
+
this.channel = Math.floor(Math.random() * 0xffff);
|
|
69
|
+
this.packetSize = 64;
|
|
70
|
+
this.inputs = [];
|
|
71
|
+
this.read = () => {
|
|
72
|
+
if (this.inputs.length) {
|
|
73
|
+
return Promise.resolve(this.inputs.shift());
|
|
158
74
|
}
|
|
159
|
-
return new Promise(
|
|
160
|
-
|
|
75
|
+
return new Promise((success) => {
|
|
76
|
+
this.inputCallback = success;
|
|
161
77
|
});
|
|
162
78
|
};
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
if (
|
|
166
|
-
|
|
167
|
-
|
|
79
|
+
this.onInputReport = (e) => {
|
|
80
|
+
const buffer = Buffer.from(e.data.buffer);
|
|
81
|
+
if (this.inputCallback) {
|
|
82
|
+
this.inputCallback(buffer);
|
|
83
|
+
this.inputCallback = null;
|
|
168
84
|
}
|
|
169
85
|
else {
|
|
170
|
-
|
|
86
|
+
this.inputs.push(buffer);
|
|
171
87
|
}
|
|
172
88
|
};
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
if (
|
|
89
|
+
this._disconnectEmitted = false;
|
|
90
|
+
this._emitDisconnect = (e) => {
|
|
91
|
+
if (this._disconnectEmitted)
|
|
176
92
|
return;
|
|
177
|
-
|
|
178
|
-
|
|
93
|
+
this._disconnectEmitted = true;
|
|
94
|
+
this.emit("disconnect", e);
|
|
179
95
|
};
|
|
180
96
|
/**
|
|
181
97
|
* Exchange with the device using APDU protocol.
|
|
182
98
|
* @param apdu
|
|
183
99
|
* @returns a promise of apdu response
|
|
184
100
|
*/
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
case 0:
|
|
195
|
-
_a = this, channel = _a.channel, packetSize = _a.packetSize;
|
|
196
|
-
(0, logs_1.log)("apdu", "=> " + apdu.toString("hex"));
|
|
197
|
-
framing = (0, hid_framing_1["default"])(channel, packetSize);
|
|
198
|
-
blocks = framing.makeBlocks(apdu);
|
|
199
|
-
i = 0;
|
|
200
|
-
_b.label = 1;
|
|
201
|
-
case 1:
|
|
202
|
-
if (!(i < blocks.length)) return [3 /*break*/, 4];
|
|
203
|
-
return [4 /*yield*/, this.device.sendReport(0, blocks[i])];
|
|
204
|
-
case 2:
|
|
205
|
-
_b.sent();
|
|
206
|
-
_b.label = 3;
|
|
207
|
-
case 3:
|
|
208
|
-
i++;
|
|
209
|
-
return [3 /*break*/, 1];
|
|
210
|
-
case 4:
|
|
211
|
-
if (!!(result = framing.getReducedResult(acc))) return [3 /*break*/, 6];
|
|
212
|
-
return [4 /*yield*/, this.read()];
|
|
213
|
-
case 5:
|
|
214
|
-
buffer = _b.sent();
|
|
215
|
-
acc = framing.reduceResponse(acc, buffer);
|
|
216
|
-
return [3 /*break*/, 4];
|
|
217
|
-
case 6:
|
|
218
|
-
(0, logs_1.log)("apdu", "<= " + result.toString("hex"));
|
|
219
|
-
return [2 /*return*/, result];
|
|
220
|
-
}
|
|
221
|
-
});
|
|
222
|
-
}); })["catch"](function (e) {
|
|
223
|
-
if (e && e.message && e.message.includes("write")) {
|
|
224
|
-
_this._emitDisconnect(e);
|
|
225
|
-
throw new errors_1.DisconnectedDeviceDuringOperation(e.message);
|
|
226
|
-
}
|
|
227
|
-
throw e;
|
|
228
|
-
})];
|
|
229
|
-
case 1:
|
|
230
|
-
b = _a.sent();
|
|
231
|
-
return [2 /*return*/, b];
|
|
101
|
+
this.exchange = (apdu) => __awaiter(this, void 0, void 0, function* () {
|
|
102
|
+
const b = yield this.exchangeAtomicImpl(() => __awaiter(this, void 0, void 0, function* () {
|
|
103
|
+
const { channel, packetSize } = this;
|
|
104
|
+
(0, logs_1.log)("apdu", "=> " + apdu.toString("hex"));
|
|
105
|
+
const framing = (0, hid_framing_1.default)(channel, packetSize);
|
|
106
|
+
// Write...
|
|
107
|
+
const blocks = framing.makeBlocks(apdu);
|
|
108
|
+
for (let i = 0; i < blocks.length; i++) {
|
|
109
|
+
yield this.device.sendReport(0, blocks[i]);
|
|
232
110
|
}
|
|
111
|
+
// Read...
|
|
112
|
+
let result;
|
|
113
|
+
let acc;
|
|
114
|
+
while (!(result = framing.getReducedResult(acc))) {
|
|
115
|
+
const buffer = yield this.read();
|
|
116
|
+
acc = framing.reduceResponse(acc, buffer);
|
|
117
|
+
}
|
|
118
|
+
(0, logs_1.log)("apdu", "<= " + result.toString("hex"));
|
|
119
|
+
return result;
|
|
120
|
+
})).catch((e) => {
|
|
121
|
+
if (e && e.message && e.message.includes("write")) {
|
|
122
|
+
this._emitDisconnect(e);
|
|
123
|
+
throw new errors_1.DisconnectedDeviceDuringOperation(e.message);
|
|
124
|
+
}
|
|
125
|
+
throw e;
|
|
233
126
|
});
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
127
|
+
return b;
|
|
128
|
+
});
|
|
129
|
+
this.device = device;
|
|
130
|
+
this.deviceModel =
|
|
237
131
|
typeof device.productId === "number"
|
|
238
132
|
? (0, devices_1.identifyUSBProductId)(device.productId)
|
|
239
133
|
: undefined;
|
|
240
|
-
device.addEventListener("inputreport",
|
|
241
|
-
return _this;
|
|
134
|
+
device.addEventListener("inputreport", this.onInputReport);
|
|
242
135
|
}
|
|
243
136
|
/**
|
|
244
137
|
* Similar to create() except it will always display the device permission (even if some devices are already accepted).
|
|
245
138
|
*/
|
|
246
|
-
|
|
247
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
248
|
-
|
|
249
|
-
return
|
|
250
|
-
switch (_b.label) {
|
|
251
|
-
case 0: return [4 /*yield*/, requestLedgerDevices()];
|
|
252
|
-
case 1:
|
|
253
|
-
_a = __read.apply(void 0, [_b.sent(), 1]), device = _a[0];
|
|
254
|
-
return [2 /*return*/, TransportWebHID.open(device)];
|
|
255
|
-
}
|
|
256
|
-
});
|
|
139
|
+
static request() {
|
|
140
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
141
|
+
const [device] = yield requestLedgerDevices();
|
|
142
|
+
return TransportWebHID.open(device);
|
|
257
143
|
});
|
|
258
|
-
}
|
|
144
|
+
}
|
|
259
145
|
/**
|
|
260
146
|
* Similar to create() except it will never display the device permission (it returns a Promise<?Transport>, null if it fails to find a device).
|
|
261
147
|
*/
|
|
262
|
-
|
|
263
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
case 1:
|
|
269
|
-
devices = _a.sent();
|
|
270
|
-
if (devices.length === 0)
|
|
271
|
-
return [2 /*return*/, null];
|
|
272
|
-
return [2 /*return*/, TransportWebHID.open(devices[0])];
|
|
273
|
-
}
|
|
274
|
-
});
|
|
148
|
+
static openConnected() {
|
|
149
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
150
|
+
const devices = yield getLedgerDevices();
|
|
151
|
+
if (devices.length === 0)
|
|
152
|
+
return null;
|
|
153
|
+
return TransportWebHID.open(devices[0]);
|
|
275
154
|
});
|
|
276
|
-
}
|
|
155
|
+
}
|
|
277
156
|
/**
|
|
278
157
|
* Create a Ledger transport with a HIDDevice
|
|
279
158
|
*/
|
|
280
|
-
|
|
281
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
transport = new TransportWebHID(device);
|
|
289
|
-
onDisconnect = function (e) {
|
|
290
|
-
if (device === e.device) {
|
|
291
|
-
getHID().removeEventListener("disconnect", onDisconnect);
|
|
292
|
-
transport._emitDisconnect(new errors_1.DisconnectedDevice());
|
|
293
|
-
}
|
|
294
|
-
};
|
|
295
|
-
getHID().addEventListener("disconnect", onDisconnect);
|
|
296
|
-
return [2 /*return*/, transport];
|
|
159
|
+
static open(device) {
|
|
160
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
161
|
+
yield device.open();
|
|
162
|
+
const transport = new TransportWebHID(device);
|
|
163
|
+
const onDisconnect = (e) => {
|
|
164
|
+
if (device === e.device) {
|
|
165
|
+
getHID().removeEventListener("disconnect", onDisconnect);
|
|
166
|
+
transport._emitDisconnect(new errors_1.DisconnectedDevice());
|
|
297
167
|
}
|
|
298
|
-
}
|
|
168
|
+
};
|
|
169
|
+
getHID().addEventListener("disconnect", onDisconnect);
|
|
170
|
+
return transport;
|
|
299
171
|
});
|
|
300
|
-
}
|
|
172
|
+
}
|
|
301
173
|
/**
|
|
302
174
|
* Release the transport device
|
|
303
175
|
*/
|
|
304
|
-
|
|
305
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
case 1:
|
|
310
|
-
_a.sent();
|
|
311
|
-
this.device.removeEventListener("inputreport", this.onInputReport);
|
|
312
|
-
return [4 /*yield*/, this.device.close()];
|
|
313
|
-
case 2:
|
|
314
|
-
_a.sent();
|
|
315
|
-
return [2 /*return*/];
|
|
316
|
-
}
|
|
317
|
-
});
|
|
318
|
-
});
|
|
319
|
-
};
|
|
320
|
-
TransportWebHID.prototype.setScrambleKey = function () { };
|
|
321
|
-
/**
|
|
322
|
-
* Check if WebUSB transport is supported.
|
|
323
|
-
*/
|
|
324
|
-
TransportWebHID.isSupported = isSupported;
|
|
325
|
-
/**
|
|
326
|
-
* List the WebUSB devices that was previously authorized by the user.
|
|
327
|
-
*/
|
|
328
|
-
TransportWebHID.list = getLedgerDevices;
|
|
329
|
-
/**
|
|
330
|
-
* Actively listen to WebUSB devices and emit ONE device
|
|
331
|
-
* that was either accepted before, if not it will trigger the native permission UI.
|
|
332
|
-
*
|
|
333
|
-
* Important: it must be called in the context of a UI click!
|
|
334
|
-
*/
|
|
335
|
-
TransportWebHID.listen = function (observer) {
|
|
336
|
-
var unsubscribed = false;
|
|
337
|
-
getFirstLedgerDevice().then(function (device) {
|
|
338
|
-
if (!device) {
|
|
339
|
-
observer.error(new errors_1.TransportOpenUserCancelled("Access denied to use Ledger device"));
|
|
340
|
-
}
|
|
341
|
-
else if (!unsubscribed) {
|
|
342
|
-
var deviceModel = typeof device.productId === "number"
|
|
343
|
-
? (0, devices_1.identifyUSBProductId)(device.productId)
|
|
344
|
-
: undefined;
|
|
345
|
-
observer.next({
|
|
346
|
-
type: "add",
|
|
347
|
-
descriptor: device,
|
|
348
|
-
deviceModel: deviceModel
|
|
349
|
-
});
|
|
350
|
-
observer.complete();
|
|
351
|
-
}
|
|
352
|
-
}, function (error) {
|
|
353
|
-
observer.error(new errors_1.TransportOpenUserCancelled(error.message));
|
|
176
|
+
close() {
|
|
177
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
178
|
+
yield this.exchangeBusyPromise;
|
|
179
|
+
this.device.removeEventListener("inputreport", this.onInputReport);
|
|
180
|
+
yield this.device.close();
|
|
354
181
|
});
|
|
355
|
-
|
|
356
|
-
|
|
182
|
+
}
|
|
183
|
+
setScrambleKey() { }
|
|
184
|
+
}
|
|
185
|
+
exports.default = TransportWebHID;
|
|
186
|
+
/**
|
|
187
|
+
* Check if WebUSB transport is supported.
|
|
188
|
+
*/
|
|
189
|
+
TransportWebHID.isSupported = isSupported;
|
|
190
|
+
/**
|
|
191
|
+
* List the WebUSB devices that was previously authorized by the user.
|
|
192
|
+
*/
|
|
193
|
+
TransportWebHID.list = getLedgerDevices;
|
|
194
|
+
/**
|
|
195
|
+
* Actively listen to WebUSB devices and emit ONE device
|
|
196
|
+
* that was either accepted before, if not it will trigger the native permission UI.
|
|
197
|
+
*
|
|
198
|
+
* Important: it must be called in the context of a UI click!
|
|
199
|
+
*/
|
|
200
|
+
TransportWebHID.listen = (observer) => {
|
|
201
|
+
let unsubscribed = false;
|
|
202
|
+
getFirstLedgerDevice().then((device) => {
|
|
203
|
+
if (!device) {
|
|
204
|
+
observer.error(new errors_1.TransportOpenUserCancelled("Access denied to use Ledger device"));
|
|
357
205
|
}
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
206
|
+
else if (!unsubscribed) {
|
|
207
|
+
const deviceModel = typeof device.productId === "number"
|
|
208
|
+
? (0, devices_1.identifyUSBProductId)(device.productId)
|
|
209
|
+
: undefined;
|
|
210
|
+
observer.next({
|
|
211
|
+
type: "add",
|
|
212
|
+
descriptor: device,
|
|
213
|
+
deviceModel,
|
|
214
|
+
});
|
|
215
|
+
observer.complete();
|
|
216
|
+
}
|
|
217
|
+
}, (error) => {
|
|
218
|
+
observer.error(new errors_1.TransportOpenUserCancelled(error.message));
|
|
219
|
+
});
|
|
220
|
+
function unsubscribe() {
|
|
221
|
+
unsubscribed = true;
|
|
222
|
+
}
|
|
223
|
+
return {
|
|
224
|
+
unsubscribe,
|
|
361
225
|
};
|
|
362
|
-
|
|
363
|
-
}(hw_transport_1["default"]));
|
|
364
|
-
exports["default"] = TransportWebHID;
|
|
226
|
+
};
|
|
365
227
|
//# sourceMappingURL=TransportWebHID.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransportWebHID.js","sourceRoot":"","sources":["../src/TransportWebHID.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TransportWebHID.js","sourceRoot":"","sources":["../src/TransportWebHID.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,3 @@
|
|
|
1
|
-
var __extends = (this && this.__extends) || (function () {
|
|
2
|
-
var extendStatics = function (d, b) {
|
|
3
|
-
extendStatics = Object.setPrototypeOf ||
|
|
4
|
-
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
5
|
-
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
|
6
|
-
return extendStatics(d, b);
|
|
7
|
-
};
|
|
8
|
-
return function (d, b) {
|
|
9
|
-
if (typeof b !== "function" && b !== null)
|
|
10
|
-
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
11
|
-
extendStatics(d, b);
|
|
12
|
-
function __() { this.constructor = d; }
|
|
13
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
14
|
-
};
|
|
15
|
-
})();
|
|
16
1
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
17
2
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
18
3
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -22,115 +7,47 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
22
7
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
23
8
|
});
|
|
24
9
|
};
|
|
25
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
26
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
27
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
28
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
29
|
-
function step(op) {
|
|
30
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
31
|
-
while (_) try {
|
|
32
|
-
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;
|
|
33
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
34
|
-
switch (op[0]) {
|
|
35
|
-
case 0: case 1: t = op; break;
|
|
36
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
37
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
38
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
39
|
-
default:
|
|
40
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
41
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
42
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
43
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
44
|
-
if (t[2]) _.ops.pop();
|
|
45
|
-
_.trys.pop(); continue;
|
|
46
|
-
}
|
|
47
|
-
op = body.call(thisArg, _);
|
|
48
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
49
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
50
|
-
}
|
|
51
|
-
};
|
|
52
|
-
var __read = (this && this.__read) || function (o, n) {
|
|
53
|
-
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
54
|
-
if (!m) return o;
|
|
55
|
-
var i = m.call(o), r, ar = [], e;
|
|
56
|
-
try {
|
|
57
|
-
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
58
|
-
}
|
|
59
|
-
catch (error) { e = { error: error }; }
|
|
60
|
-
finally {
|
|
61
|
-
try {
|
|
62
|
-
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
63
|
-
}
|
|
64
|
-
finally { if (e) throw e.error; }
|
|
65
|
-
}
|
|
66
|
-
return ar;
|
|
67
|
-
};
|
|
68
10
|
import Transport from "@ledgerhq/hw-transport";
|
|
69
11
|
import hidFraming from "@ledgerhq/devices/hid-framing";
|
|
70
12
|
import { identifyUSBProductId, ledgerUSBVendorId } from "@ledgerhq/devices";
|
|
71
13
|
import { log } from "@ledgerhq/logs";
|
|
72
14
|
import { TransportOpenUserCancelled, DisconnectedDeviceDuringOperation, DisconnectedDevice, TransportError, } from "@ledgerhq/errors";
|
|
73
|
-
|
|
15
|
+
const ledgerDevices = [
|
|
74
16
|
{
|
|
75
|
-
vendorId: ledgerUSBVendorId
|
|
17
|
+
vendorId: ledgerUSBVendorId,
|
|
76
18
|
},
|
|
77
19
|
];
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
};
|
|
81
|
-
var getHID = function () {
|
|
20
|
+
const isSupported = () => Promise.resolve(!!(window.navigator && window.navigator.hid));
|
|
21
|
+
const getHID = () => {
|
|
82
22
|
// $FlowFixMe
|
|
83
|
-
|
|
23
|
+
const { hid } = navigator;
|
|
84
24
|
if (!hid)
|
|
85
25
|
throw new TransportError("navigator.hid is not supported", "HIDNotSupported");
|
|
86
26
|
return hid;
|
|
87
27
|
};
|
|
88
28
|
function requestLedgerDevices() {
|
|
89
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
switch (_a.label) {
|
|
93
|
-
case 0: return [4 /*yield*/, getHID().requestDevice({
|
|
94
|
-
filters: ledgerDevices
|
|
95
|
-
})];
|
|
96
|
-
case 1:
|
|
97
|
-
device = _a.sent();
|
|
98
|
-
if (Array.isArray(device))
|
|
99
|
-
return [2 /*return*/, device];
|
|
100
|
-
return [2 /*return*/, [device]];
|
|
101
|
-
}
|
|
29
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
30
|
+
const device = yield getHID().requestDevice({
|
|
31
|
+
filters: ledgerDevices,
|
|
102
32
|
});
|
|
33
|
+
if (Array.isArray(device))
|
|
34
|
+
return device;
|
|
35
|
+
return [device];
|
|
103
36
|
});
|
|
104
37
|
}
|
|
105
38
|
function getLedgerDevices() {
|
|
106
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
107
|
-
|
|
108
|
-
return
|
|
109
|
-
switch (_a.label) {
|
|
110
|
-
case 0: return [4 /*yield*/, getHID().getDevices()];
|
|
111
|
-
case 1:
|
|
112
|
-
devices = _a.sent();
|
|
113
|
-
return [2 /*return*/, devices.filter(function (d) { return d.vendorId === ledgerUSBVendorId; })];
|
|
114
|
-
}
|
|
115
|
-
});
|
|
39
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
40
|
+
const devices = yield getHID().getDevices();
|
|
41
|
+
return devices.filter((d) => d.vendorId === ledgerUSBVendorId);
|
|
116
42
|
});
|
|
117
43
|
}
|
|
118
44
|
function getFirstLedgerDevice() {
|
|
119
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
existingDevices = _a.sent();
|
|
126
|
-
if (existingDevices.length > 0)
|
|
127
|
-
return [2 /*return*/, existingDevices[0]];
|
|
128
|
-
return [4 /*yield*/, requestLedgerDevices()];
|
|
129
|
-
case 2:
|
|
130
|
-
devices = _a.sent();
|
|
131
|
-
return [2 /*return*/, devices[0]];
|
|
132
|
-
}
|
|
133
|
-
});
|
|
45
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
46
|
+
const existingDevices = yield getLedgerDevices();
|
|
47
|
+
if (existingDevices.length > 0)
|
|
48
|
+
return existingDevices[0];
|
|
49
|
+
const devices = yield requestLedgerDevices();
|
|
50
|
+
return devices[0];
|
|
134
51
|
});
|
|
135
52
|
}
|
|
136
53
|
/**
|
|
@@ -140,221 +57,165 @@ function getFirstLedgerDevice() {
|
|
|
140
57
|
* ...
|
|
141
58
|
* TransportWebHID.create().then(transport => ...)
|
|
142
59
|
*/
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
return Promise.resolve(_this.inputs.shift());
|
|
60
|
+
export default class TransportWebHID extends Transport {
|
|
61
|
+
constructor(device) {
|
|
62
|
+
super();
|
|
63
|
+
this.channel = Math.floor(Math.random() * 0xffff);
|
|
64
|
+
this.packetSize = 64;
|
|
65
|
+
this.inputs = [];
|
|
66
|
+
this.read = () => {
|
|
67
|
+
if (this.inputs.length) {
|
|
68
|
+
return Promise.resolve(this.inputs.shift());
|
|
153
69
|
}
|
|
154
|
-
return new Promise(
|
|
155
|
-
|
|
70
|
+
return new Promise((success) => {
|
|
71
|
+
this.inputCallback = success;
|
|
156
72
|
});
|
|
157
73
|
};
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
if (
|
|
161
|
-
|
|
162
|
-
|
|
74
|
+
this.onInputReport = (e) => {
|
|
75
|
+
const buffer = Buffer.from(e.data.buffer);
|
|
76
|
+
if (this.inputCallback) {
|
|
77
|
+
this.inputCallback(buffer);
|
|
78
|
+
this.inputCallback = null;
|
|
163
79
|
}
|
|
164
80
|
else {
|
|
165
|
-
|
|
81
|
+
this.inputs.push(buffer);
|
|
166
82
|
}
|
|
167
83
|
};
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
if (
|
|
84
|
+
this._disconnectEmitted = false;
|
|
85
|
+
this._emitDisconnect = (e) => {
|
|
86
|
+
if (this._disconnectEmitted)
|
|
171
87
|
return;
|
|
172
|
-
|
|
173
|
-
|
|
88
|
+
this._disconnectEmitted = true;
|
|
89
|
+
this.emit("disconnect", e);
|
|
174
90
|
};
|
|
175
91
|
/**
|
|
176
92
|
* Exchange with the device using APDU protocol.
|
|
177
93
|
* @param apdu
|
|
178
94
|
* @returns a promise of apdu response
|
|
179
95
|
*/
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
case 0:
|
|
190
|
-
_a = this, channel = _a.channel, packetSize = _a.packetSize;
|
|
191
|
-
log("apdu", "=> " + apdu.toString("hex"));
|
|
192
|
-
framing = hidFraming(channel, packetSize);
|
|
193
|
-
blocks = framing.makeBlocks(apdu);
|
|
194
|
-
i = 0;
|
|
195
|
-
_b.label = 1;
|
|
196
|
-
case 1:
|
|
197
|
-
if (!(i < blocks.length)) return [3 /*break*/, 4];
|
|
198
|
-
return [4 /*yield*/, this.device.sendReport(0, blocks[i])];
|
|
199
|
-
case 2:
|
|
200
|
-
_b.sent();
|
|
201
|
-
_b.label = 3;
|
|
202
|
-
case 3:
|
|
203
|
-
i++;
|
|
204
|
-
return [3 /*break*/, 1];
|
|
205
|
-
case 4:
|
|
206
|
-
if (!!(result = framing.getReducedResult(acc))) return [3 /*break*/, 6];
|
|
207
|
-
return [4 /*yield*/, this.read()];
|
|
208
|
-
case 5:
|
|
209
|
-
buffer = _b.sent();
|
|
210
|
-
acc = framing.reduceResponse(acc, buffer);
|
|
211
|
-
return [3 /*break*/, 4];
|
|
212
|
-
case 6:
|
|
213
|
-
log("apdu", "<= " + result.toString("hex"));
|
|
214
|
-
return [2 /*return*/, result];
|
|
215
|
-
}
|
|
216
|
-
});
|
|
217
|
-
}); })["catch"](function (e) {
|
|
218
|
-
if (e && e.message && e.message.includes("write")) {
|
|
219
|
-
_this._emitDisconnect(e);
|
|
220
|
-
throw new DisconnectedDeviceDuringOperation(e.message);
|
|
221
|
-
}
|
|
222
|
-
throw e;
|
|
223
|
-
})];
|
|
224
|
-
case 1:
|
|
225
|
-
b = _a.sent();
|
|
226
|
-
return [2 /*return*/, b];
|
|
96
|
+
this.exchange = (apdu) => __awaiter(this, void 0, void 0, function* () {
|
|
97
|
+
const b = yield this.exchangeAtomicImpl(() => __awaiter(this, void 0, void 0, function* () {
|
|
98
|
+
const { channel, packetSize } = this;
|
|
99
|
+
log("apdu", "=> " + apdu.toString("hex"));
|
|
100
|
+
const framing = hidFraming(channel, packetSize);
|
|
101
|
+
// Write...
|
|
102
|
+
const blocks = framing.makeBlocks(apdu);
|
|
103
|
+
for (let i = 0; i < blocks.length; i++) {
|
|
104
|
+
yield this.device.sendReport(0, blocks[i]);
|
|
227
105
|
}
|
|
106
|
+
// Read...
|
|
107
|
+
let result;
|
|
108
|
+
let acc;
|
|
109
|
+
while (!(result = framing.getReducedResult(acc))) {
|
|
110
|
+
const buffer = yield this.read();
|
|
111
|
+
acc = framing.reduceResponse(acc, buffer);
|
|
112
|
+
}
|
|
113
|
+
log("apdu", "<= " + result.toString("hex"));
|
|
114
|
+
return result;
|
|
115
|
+
})).catch((e) => {
|
|
116
|
+
if (e && e.message && e.message.includes("write")) {
|
|
117
|
+
this._emitDisconnect(e);
|
|
118
|
+
throw new DisconnectedDeviceDuringOperation(e.message);
|
|
119
|
+
}
|
|
120
|
+
throw e;
|
|
228
121
|
});
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
122
|
+
return b;
|
|
123
|
+
});
|
|
124
|
+
this.device = device;
|
|
125
|
+
this.deviceModel =
|
|
232
126
|
typeof device.productId === "number"
|
|
233
127
|
? identifyUSBProductId(device.productId)
|
|
234
128
|
: undefined;
|
|
235
|
-
device.addEventListener("inputreport",
|
|
236
|
-
return _this;
|
|
129
|
+
device.addEventListener("inputreport", this.onInputReport);
|
|
237
130
|
}
|
|
238
131
|
/**
|
|
239
132
|
* Similar to create() except it will always display the device permission (even if some devices are already accepted).
|
|
240
133
|
*/
|
|
241
|
-
|
|
242
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
243
|
-
|
|
244
|
-
return
|
|
245
|
-
switch (_b.label) {
|
|
246
|
-
case 0: return [4 /*yield*/, requestLedgerDevices()];
|
|
247
|
-
case 1:
|
|
248
|
-
_a = __read.apply(void 0, [_b.sent(), 1]), device = _a[0];
|
|
249
|
-
return [2 /*return*/, TransportWebHID.open(device)];
|
|
250
|
-
}
|
|
251
|
-
});
|
|
134
|
+
static request() {
|
|
135
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
136
|
+
const [device] = yield requestLedgerDevices();
|
|
137
|
+
return TransportWebHID.open(device);
|
|
252
138
|
});
|
|
253
|
-
}
|
|
139
|
+
}
|
|
254
140
|
/**
|
|
255
141
|
* Similar to create() except it will never display the device permission (it returns a Promise<?Transport>, null if it fails to find a device).
|
|
256
142
|
*/
|
|
257
|
-
|
|
258
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
case 1:
|
|
264
|
-
devices = _a.sent();
|
|
265
|
-
if (devices.length === 0)
|
|
266
|
-
return [2 /*return*/, null];
|
|
267
|
-
return [2 /*return*/, TransportWebHID.open(devices[0])];
|
|
268
|
-
}
|
|
269
|
-
});
|
|
143
|
+
static openConnected() {
|
|
144
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
145
|
+
const devices = yield getLedgerDevices();
|
|
146
|
+
if (devices.length === 0)
|
|
147
|
+
return null;
|
|
148
|
+
return TransportWebHID.open(devices[0]);
|
|
270
149
|
});
|
|
271
|
-
}
|
|
150
|
+
}
|
|
272
151
|
/**
|
|
273
152
|
* Create a Ledger transport with a HIDDevice
|
|
274
153
|
*/
|
|
275
|
-
|
|
276
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
transport = new TransportWebHID(device);
|
|
284
|
-
onDisconnect = function (e) {
|
|
285
|
-
if (device === e.device) {
|
|
286
|
-
getHID().removeEventListener("disconnect", onDisconnect);
|
|
287
|
-
transport._emitDisconnect(new DisconnectedDevice());
|
|
288
|
-
}
|
|
289
|
-
};
|
|
290
|
-
getHID().addEventListener("disconnect", onDisconnect);
|
|
291
|
-
return [2 /*return*/, transport];
|
|
154
|
+
static open(device) {
|
|
155
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
156
|
+
yield device.open();
|
|
157
|
+
const transport = new TransportWebHID(device);
|
|
158
|
+
const onDisconnect = (e) => {
|
|
159
|
+
if (device === e.device) {
|
|
160
|
+
getHID().removeEventListener("disconnect", onDisconnect);
|
|
161
|
+
transport._emitDisconnect(new DisconnectedDevice());
|
|
292
162
|
}
|
|
293
|
-
}
|
|
163
|
+
};
|
|
164
|
+
getHID().addEventListener("disconnect", onDisconnect);
|
|
165
|
+
return transport;
|
|
294
166
|
});
|
|
295
|
-
}
|
|
167
|
+
}
|
|
296
168
|
/**
|
|
297
169
|
* Release the transport device
|
|
298
170
|
*/
|
|
299
|
-
|
|
300
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
case 1:
|
|
305
|
-
_a.sent();
|
|
306
|
-
this.device.removeEventListener("inputreport", this.onInputReport);
|
|
307
|
-
return [4 /*yield*/, this.device.close()];
|
|
308
|
-
case 2:
|
|
309
|
-
_a.sent();
|
|
310
|
-
return [2 /*return*/];
|
|
311
|
-
}
|
|
312
|
-
});
|
|
313
|
-
});
|
|
314
|
-
};
|
|
315
|
-
TransportWebHID.prototype.setScrambleKey = function () { };
|
|
316
|
-
/**
|
|
317
|
-
* Check if WebUSB transport is supported.
|
|
318
|
-
*/
|
|
319
|
-
TransportWebHID.isSupported = isSupported;
|
|
320
|
-
/**
|
|
321
|
-
* List the WebUSB devices that was previously authorized by the user.
|
|
322
|
-
*/
|
|
323
|
-
TransportWebHID.list = getLedgerDevices;
|
|
324
|
-
/**
|
|
325
|
-
* Actively listen to WebUSB devices and emit ONE device
|
|
326
|
-
* that was either accepted before, if not it will trigger the native permission UI.
|
|
327
|
-
*
|
|
328
|
-
* Important: it must be called in the context of a UI click!
|
|
329
|
-
*/
|
|
330
|
-
TransportWebHID.listen = function (observer) {
|
|
331
|
-
var unsubscribed = false;
|
|
332
|
-
getFirstLedgerDevice().then(function (device) {
|
|
333
|
-
if (!device) {
|
|
334
|
-
observer.error(new TransportOpenUserCancelled("Access denied to use Ledger device"));
|
|
335
|
-
}
|
|
336
|
-
else if (!unsubscribed) {
|
|
337
|
-
var deviceModel = typeof device.productId === "number"
|
|
338
|
-
? identifyUSBProductId(device.productId)
|
|
339
|
-
: undefined;
|
|
340
|
-
observer.next({
|
|
341
|
-
type: "add",
|
|
342
|
-
descriptor: device,
|
|
343
|
-
deviceModel: deviceModel
|
|
344
|
-
});
|
|
345
|
-
observer.complete();
|
|
346
|
-
}
|
|
347
|
-
}, function (error) {
|
|
348
|
-
observer.error(new TransportOpenUserCancelled(error.message));
|
|
171
|
+
close() {
|
|
172
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
173
|
+
yield this.exchangeBusyPromise;
|
|
174
|
+
this.device.removeEventListener("inputreport", this.onInputReport);
|
|
175
|
+
yield this.device.close();
|
|
349
176
|
});
|
|
350
|
-
|
|
351
|
-
|
|
177
|
+
}
|
|
178
|
+
setScrambleKey() { }
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Check if WebUSB transport is supported.
|
|
182
|
+
*/
|
|
183
|
+
TransportWebHID.isSupported = isSupported;
|
|
184
|
+
/**
|
|
185
|
+
* List the WebUSB devices that was previously authorized by the user.
|
|
186
|
+
*/
|
|
187
|
+
TransportWebHID.list = getLedgerDevices;
|
|
188
|
+
/**
|
|
189
|
+
* Actively listen to WebUSB devices and emit ONE device
|
|
190
|
+
* that was either accepted before, if not it will trigger the native permission UI.
|
|
191
|
+
*
|
|
192
|
+
* Important: it must be called in the context of a UI click!
|
|
193
|
+
*/
|
|
194
|
+
TransportWebHID.listen = (observer) => {
|
|
195
|
+
let unsubscribed = false;
|
|
196
|
+
getFirstLedgerDevice().then((device) => {
|
|
197
|
+
if (!device) {
|
|
198
|
+
observer.error(new TransportOpenUserCancelled("Access denied to use Ledger device"));
|
|
352
199
|
}
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
200
|
+
else if (!unsubscribed) {
|
|
201
|
+
const deviceModel = typeof device.productId === "number"
|
|
202
|
+
? identifyUSBProductId(device.productId)
|
|
203
|
+
: undefined;
|
|
204
|
+
observer.next({
|
|
205
|
+
type: "add",
|
|
206
|
+
descriptor: device,
|
|
207
|
+
deviceModel,
|
|
208
|
+
});
|
|
209
|
+
observer.complete();
|
|
210
|
+
}
|
|
211
|
+
}, (error) => {
|
|
212
|
+
observer.error(new TransportOpenUserCancelled(error.message));
|
|
213
|
+
});
|
|
214
|
+
function unsubscribe() {
|
|
215
|
+
unsubscribed = true;
|
|
216
|
+
}
|
|
217
|
+
return {
|
|
218
|
+
unsubscribe,
|
|
356
219
|
};
|
|
357
|
-
|
|
358
|
-
}(Transport));
|
|
359
|
-
export default TransportWebHID;
|
|
220
|
+
};
|
|
360
221
|
//# sourceMappingURL=TransportWebHID.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransportWebHID.js","sourceRoot":"","sources":["../src/TransportWebHID.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TransportWebHID.js","sourceRoot":"","sources":["../src/TransportWebHID.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ledgerhq/hw-transport-webhid",
|
|
3
|
-
"version": "6.27.
|
|
3
|
+
"version": "6.27.14-next.0",
|
|
4
4
|
"description": "Ledger Hardware Wallet WebHID implementation of the communication layer",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Ledger",
|
|
@@ -26,9 +26,9 @@
|
|
|
26
26
|
"types": "lib/TransportWebHID.d.ts",
|
|
27
27
|
"license": "Apache-2.0",
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@ledgerhq/devices": "^8.0.
|
|
30
|
-
"@ledgerhq/errors": "^6.12.
|
|
31
|
-
"@ledgerhq/hw-transport": "^6.28.
|
|
29
|
+
"@ledgerhq/devices": "^8.0.2-next.0",
|
|
30
|
+
"@ledgerhq/errors": "^6.12.5-next.0",
|
|
31
|
+
"@ledgerhq/hw-transport": "^6.28.3-next.0",
|
|
32
32
|
"@ledgerhq/logs": "^6.10.1"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
@@ -37,11 +37,10 @@
|
|
|
37
37
|
"@types/w3c-web-hid": "^1.0.2",
|
|
38
38
|
"documentation": "13.2.4",
|
|
39
39
|
"jest": "^28.1.1",
|
|
40
|
-
"rimraf": "^4.1
|
|
40
|
+
"rimraf": "^4.4.1",
|
|
41
41
|
"source-map-support": "^0.5.21",
|
|
42
42
|
"ts-jest": "^28.0.5",
|
|
43
|
-
"ts-node": "^10.4.0"
|
|
44
|
-
"typescript": "^4"
|
|
43
|
+
"ts-node": "^10.4.0"
|
|
45
44
|
},
|
|
46
45
|
"gitHead": "dd0dea64b58e5a9125c8a422dcffd29e5ef6abec",
|
|
47
46
|
"scripts": {
|