@ledgerhq/hw-transport
Advanced tools
Comparing version
@@ -7,13 +7,32 @@ "use strict"; | ||
exports.StatusCodes = undefined; | ||
var _toConsumableArray2 = require("babel-runtime/helpers/toConsumableArray"); | ||
var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2); | ||
var _regenerator = require("babel-runtime/regenerator"); | ||
var _regenerator2 = _interopRequireDefault(_regenerator); | ||
var _asyncToGenerator2 = require("babel-runtime/helpers/asyncToGenerator"); | ||
var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2); | ||
var _classCallCheck2 = require("babel-runtime/helpers/classCallCheck"); | ||
var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); | ||
var _createClass2 = require("babel-runtime/helpers/createClass"); | ||
var _createClass3 = _interopRequireDefault(_createClass2); | ||
exports.TransportError = TransportError; | ||
exports.TransportStatusError = TransportStatusError; | ||
var _events = require("events"); | ||
var _events2 = require("events"); | ||
var _events2 = _interopRequireDefault(_events); | ||
var _events3 = _interopRequireDefault(_events2); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } | ||
/** | ||
@@ -30,8 +49,13 @@ * all possible status codes. | ||
/** | ||
*/ | ||
/** | ||
*/ | ||
const StatusCodes = exports.StatusCodes = { | ||
/** | ||
*/ | ||
var StatusCodes = exports.StatusCodes = { | ||
/** | ||
@@ -67,2 +91,4 @@ * Incorrect length | ||
*/ | ||
function TransportError(message, id) { | ||
@@ -95,28 +121,59 @@ this.name = "TransportError"; | ||
*/ | ||
class Transport { | ||
constructor() { | ||
var Transport = function () { | ||
function Transport() { | ||
var _this = this; | ||
(0, _classCallCheck3.default)(this, Transport); | ||
this.debug = false; | ||
this._events = new _events2.default(); | ||
this._events = new _events3.default(); | ||
this.send = (() => { | ||
var _ref = _asyncToGenerator(function* (cla, ins, p1, p2, data = Buffer.alloc(0), statusList = [StatusCodes.Success]) { | ||
if (data.length >= 256) { | ||
throw new TransportError("data.length exceed 256 bytes limit. Got: " + data.length, "DataLengthTooBig"); | ||
} | ||
const response = yield _this.exchange(Buffer.concat([Buffer.from([cla, ins, p1, p2]), Buffer.from([data.length]), data])); | ||
const sw = response.readUInt16BE(response.length - 2); | ||
if (!statusList.some(function (s) { | ||
return s === sw; | ||
})) { | ||
throw new TransportStatusError(sw); | ||
} | ||
return response; | ||
}); | ||
this.send = function () { | ||
var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(cla, ins, p1, p2) { | ||
var data = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : Buffer.alloc(0); | ||
var statusList = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : [StatusCodes.Success]; | ||
var response, sw; | ||
return _regenerator2.default.wrap(function _callee$(_context) { | ||
while (1) { | ||
switch (_context.prev = _context.next) { | ||
case 0: | ||
if (!(data.length >= 256)) { | ||
_context.next = 2; | ||
break; | ||
} | ||
throw new TransportError("data.length exceed 256 bytes limit. Got: " + data.length, "DataLengthTooBig"); | ||
case 2: | ||
_context.next = 4; | ||
return _this.exchange(Buffer.concat([Buffer.from([cla, ins, p1, p2]), Buffer.from([data.length]), data])); | ||
case 4: | ||
response = _context.sent; | ||
sw = response.readUInt16BE(response.length - 2); | ||
if (statusList.some(function (s) { | ||
return s === sw; | ||
})) { | ||
_context.next = 8; | ||
break; | ||
} | ||
throw new TransportStatusError(sw); | ||
case 8: | ||
return _context.abrupt("return", response); | ||
case 9: | ||
case "end": | ||
return _context.stop(); | ||
} | ||
} | ||
}, _callee, _this); | ||
})); | ||
return function (_x, _x2, _x3, _x4) { | ||
return _ref.apply(this, arguments); | ||
}; | ||
})(); | ||
}(); | ||
} | ||
@@ -186,61 +243,116 @@ | ||
/** | ||
* Listen to an event on an instance of transport. | ||
* Transport implementation can have specific events. Here is the common events: | ||
* * `"disconnect"` : triggered if Transport is disconnected | ||
*/ | ||
on(eventName, cb) { | ||
this._events.on(eventName, cb); | ||
} | ||
(0, _createClass3.default)(Transport, [{ | ||
key: "on", | ||
/** | ||
* Stop listening to an event on an instance of transport. | ||
*/ | ||
off(eventName, cb) { | ||
this._events.removeListener(eventName, cb); | ||
} | ||
emit(event, ...args) { | ||
this._events.emit(event, ...args); | ||
} | ||
/** | ||
* Listen to an event on an instance of transport. | ||
* Transport implementation can have specific events. Here is the common events: | ||
* * `"disconnect"` : triggered if Transport is disconnected | ||
*/ | ||
value: function on(eventName, cb) { | ||
this._events.on(eventName, cb); | ||
} | ||
/** | ||
* Enable or not logs of the binary exchange | ||
*/ | ||
setDebugMode(debug) { | ||
this.debug = debug; | ||
} | ||
/** | ||
* Stop listening to an event on an instance of transport. | ||
*/ | ||
/** | ||
* wrapper on top of exchange to simplify work of the implementation. | ||
* @param cla | ||
* @param ins | ||
* @param p1 | ||
* @param p2 | ||
* @param data | ||
* @param statusList is a list of accepted status code (shorts). [0x9000] by default | ||
* @return a Promise of response buffer | ||
*/ | ||
}, { | ||
key: "off", | ||
value: function off(eventName, cb) { | ||
this._events.removeListener(eventName, cb); | ||
} | ||
}, { | ||
key: "emit", | ||
value: function emit(event) { | ||
var _events; | ||
for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { | ||
args[_key - 1] = arguments[_key]; | ||
} | ||
/** | ||
* create() allows to open the first descriptor available or throw if there is none. | ||
* **DEPRECATED**: use `list()` or `listen()` and `open()` instead. | ||
*/ | ||
static create(timeout, debug = false) { | ||
var _this2 = this; | ||
(_events = this._events).emit.apply(_events, [event].concat((0, _toConsumableArray3.default)(args))); | ||
} | ||
return _asyncToGenerator(function* () { | ||
console.warn(_this2.name + ".create is deprecated. Please use .list()/.listen() and .open() instead"); | ||
const descriptors = yield _this2.list(); | ||
if (descriptors.length === 0) { | ||
throw new TransportError("No device found", "NoDeviceFound"); | ||
/** | ||
* Enable or not logs of the binary exchange | ||
*/ | ||
}, { | ||
key: "setDebugMode", | ||
value: function setDebugMode(debug) { | ||
this.debug = debug; | ||
} | ||
/** | ||
* wrapper on top of exchange to simplify work of the implementation. | ||
* @param cla | ||
* @param ins | ||
* @param p1 | ||
* @param p2 | ||
* @param data | ||
* @param statusList is a list of accepted status code (shorts). [0x9000] by default | ||
* @return a Promise of response buffer | ||
*/ | ||
}], [{ | ||
key: "create", | ||
/** | ||
* create() allows to open the first descriptor available or throw if there is none. | ||
* **DEPRECATED**: use `list()` or `listen()` and `open()` instead. | ||
*/ | ||
value: function () { | ||
var _ref2 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(timeout) { | ||
var debug = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; | ||
var descriptors, transport; | ||
return _regenerator2.default.wrap(function _callee2$(_context2) { | ||
while (1) { | ||
switch (_context2.prev = _context2.next) { | ||
case 0: | ||
console.warn(this.name + ".create is deprecated. Please use .list()/.listen() and .open() instead"); | ||
_context2.next = 3; | ||
return this.list(); | ||
case 3: | ||
descriptors = _context2.sent; | ||
if (!(descriptors.length === 0)) { | ||
_context2.next = 6; | ||
break; | ||
} | ||
throw new TransportError("No device found", "NoDeviceFound"); | ||
case 6: | ||
_context2.next = 8; | ||
return this.open(descriptors[0], timeout); | ||
case 8: | ||
transport = _context2.sent; | ||
transport.setDebugMode(debug); | ||
return _context2.abrupt("return", transport); | ||
case 11: | ||
case "end": | ||
return _context2.stop(); | ||
} | ||
} | ||
}, _callee2, this); | ||
})); | ||
function create(_x7) { | ||
return _ref2.apply(this, arguments); | ||
} | ||
const transport = yield _this2.open(descriptors[0], timeout); | ||
transport.setDebugMode(debug); | ||
return transport; | ||
})(); | ||
} | ||
} | ||
return create; | ||
}() | ||
}]); | ||
return Transport; | ||
}(); | ||
exports.default = Transport; | ||
//# sourceMappingURL=Transport.js.map |
{ | ||
"name": "@ledgerhq/hw-transport", | ||
"version": "2.1.0", | ||
"version": "2.1.2", | ||
"description": "Ledger Hardware Wallet common interface of the communication layer", | ||
@@ -5,0 +5,0 @@ "keywords": [ |
@@ -8,7 +8,13 @@ //@flow | ||
export type Subscription = { unsubscribe: () => void }; | ||
/** | ||
*/ | ||
export type Device = Object; | ||
/** | ||
*/ | ||
export type DescriptorEvent<Descriptor> = { | ||
type: "add" | "remove", | ||
descriptor: Descriptor | ||
descriptor: Descriptor, | ||
device: Device | ||
}; | ||
@@ -19,4 +25,4 @@ /** | ||
next: (event: Ev) => void, | ||
error: (e: ?Error) => void, | ||
complete: () => void | ||
error?: (e: ?Error) => void, | ||
complete?: () => void | ||
}; | ||
@@ -23,0 +29,0 @@ |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
314171
622.58%11
10%801
10.64%