UNPKG

17 kBJavaScriptView Raw
1'use strict';
2
3var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
4
5Object.defineProperty(exports, "__esModule", {
6 value: true
7});
8exports.default = undefined;
9
10var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
11
12var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
13
14var _desc, _value, _class;
15
16var _semverCompare = require('semver-compare');
17
18var _semverCompare2 = _interopRequireDefault(_semverCompare);
19
20var _http = require('./http');
21
22var _highlevelChecks = require('../highlevel-checks');
23
24var check = _interopRequireWildcard(_highlevelChecks);
25
26var _debugDecorator = require('../debug-decorator');
27
28function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
29
30function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
31
32Function.prototype.$asyncbind = function $asyncbind(self, catcher) {
33 'use strict';
34
35 if (!Function.prototype.$asyncbind) {
36 Object.defineProperty(Function.prototype, '$asyncbind', {
37 value: $asyncbind,
38 enumerable: false,
39 configurable: true,
40 writable: true
41 });
42 }
43
44 if (!$asyncbind.trampoline) {
45 $asyncbind.trampoline = function trampoline(t, x, s, e) {
46 return function b(q) {
47 while (q) {
48 if (q.then) return q.then(b, e);
49
50 try {
51 if (q.pop) {
52 if (q.length) return q.pop() ? x.call(t) : q;
53 q = s;
54 } else q = q.call(t);
55 } catch (r) {
56 return e(r);
57 }
58 }
59 };
60 };
61 }
62
63 if (!$asyncbind.LazyThenable) {
64 $asyncbind.LazyThenable = function () {
65 function isThenable(obj) {
66 return obj && obj instanceof Object && typeof obj.then === 'function';
67 }
68
69 function resolution(p, r, how) {
70 try {
71 var x = how ? how(r) : r;
72 if (p === x) return p.reject(new TypeError('Promise resolution loop'));
73
74 if (isThenable(x)) {
75 x.then(function (y) {
76 resolution(p, y);
77 }, function (e) {
78 p.reject(e);
79 });
80 } else {
81 p.resolve(x);
82 }
83 } catch (ex) {
84 p.reject(ex);
85 }
86 }
87
88 function Chained() {}
89
90 ;
91 Chained.prototype = {
92 resolve: _unchained,
93 reject: _unchained,
94 then: thenChain
95 };
96
97 function _unchained(v) {}
98
99 function thenChain(res, rej) {
100 this.resolve = res;
101 this.reject = rej;
102 }
103
104 function then(res, rej) {
105 var chain = new Chained();
106
107 try {
108 this._resolver(function (value) {
109 return isThenable(value) ? value.then(res, rej) : resolution(chain, value, res);
110 }, function (ex) {
111 resolution(chain, ex, rej);
112 });
113 } catch (ex) {
114 resolution(chain, ex, rej);
115 }
116
117 return chain;
118 }
119
120 function Thenable(resolver) {
121 this._resolver = resolver;
122 this.then = then;
123 }
124
125 ;
126
127 Thenable.resolve = function (v) {
128 return Thenable.isThenable(v) ? v : {
129 then: function then(resolve) {
130 return resolve(v);
131 }
132 };
133 };
134
135 Thenable.isThenable = isThenable;
136 return Thenable;
137 }();
138
139 $asyncbind.EagerThenable = $asyncbind.Thenable = ($asyncbind.EagerThenableFactory = function (tick) {
140 tick = tick || (typeof process === 'undefined' ? 'undefined' : _typeof(process)) === 'object' && process.nextTick || typeof setImmediate === 'function' && setImmediate || function (f) {
141 setTimeout(f, 0);
142 };
143
144 var soon = function () {
145 var fq = [],
146 fqStart = 0,
147 bufferSize = 1024;
148
149 function callQueue() {
150 while (fq.length - fqStart) {
151 fq[fqStart]();
152 fq[fqStart++] = undefined;
153
154 if (fqStart === bufferSize) {
155 fq.splice(0, bufferSize);
156 fqStart = 0;
157 }
158 }
159 }
160
161 return function (fn) {
162 fq.push(fn);
163 if (fq.length - fqStart === 1) tick(callQueue);
164 };
165 }();
166
167 function Zousan(func) {
168 if (func) {
169 var me = this;
170 func(function (arg) {
171 me.resolve(arg);
172 }, function (arg) {
173 me.reject(arg);
174 });
175 }
176 }
177
178 Zousan.prototype = {
179 resolve: function resolve(value) {
180 if (this.state !== undefined) return;
181 if (value === this) return this.reject(new TypeError('Attempt to resolve promise with self'));
182 var me = this;
183
184 if (value && (typeof value === 'function' || (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object')) {
185 try {
186 var first = 0;
187 var then = value.then;
188
189 if (typeof then === 'function') {
190 then.call(value, function (ra) {
191 if (!first++) {
192 me.resolve(ra);
193 }
194 }, function (rr) {
195 if (!first++) {
196 me.reject(rr);
197 }
198 });
199 return;
200 }
201 } catch (e) {
202 if (!first) this.reject(e);
203 return;
204 }
205 }
206
207 this.state = STATE_FULFILLED;
208 this.v = value;
209 if (me.c) soon(function () {
210 for (var n = 0, l = me.c.length; n < l; n++) {
211 STATE_FULFILLED(me.c[n], value);
212 }
213 });
214 },
215 reject: function reject(reason) {
216 if (this.state !== undefined) return;
217 this.state = STATE_REJECTED;
218 this.v = reason;
219 var clients = this.c;
220 if (clients) soon(function () {
221 for (var n = 0, l = clients.length; n < l; n++) {
222 STATE_REJECTED(clients[n], reason);
223 }
224 });
225 },
226 then: function then(onF, onR) {
227 var p = new Zousan();
228 var client = {
229 y: onF,
230 n: onR,
231 p: p
232 };
233
234 if (this.state === undefined) {
235 if (this.c) this.c.push(client);else this.c = [client];
236 } else {
237 var s = this.state,
238 a = this.v;
239 soon(function () {
240 s(client, a);
241 });
242 }
243
244 return p;
245 }
246 };
247
248 function STATE_FULFILLED(c, arg) {
249 if (typeof c.y === 'function') {
250 try {
251 var yret = c.y.call(undefined, arg);
252 c.p.resolve(yret);
253 } catch (err) {
254 c.p.reject(err);
255 }
256 } else c.p.resolve(arg);
257 }
258
259 function STATE_REJECTED(c, reason) {
260 if (typeof c.n === 'function') {
261 try {
262 var yret = c.n.call(undefined, reason);
263 c.p.resolve(yret);
264 } catch (err) {
265 c.p.reject(err);
266 }
267 } else c.p.reject(reason);
268 }
269
270 Zousan.resolve = function (val) {
271 if (val && val instanceof Zousan) return val;
272 var z = new Zousan();
273 z.resolve(val);
274 return z;
275 };
276
277 Zousan.reject = function (err) {
278 if (err && err instanceof Zousan) return err;
279 var z = new Zousan();
280 z.reject(err);
281 return z;
282 };
283
284 Zousan.version = '2.3.2-nodent';
285 return Zousan;
286 })();
287 }
288
289 var resolver = this;
290
291 switch (catcher) {
292 case true:
293 return new $asyncbind.Thenable(boundThen);
294
295 case 0:
296 return new $asyncbind.LazyThenable(boundThen);
297
298 case undefined:
299 boundThen.then = boundThen;
300 return boundThen;
301
302 default:
303 return function () {
304 try {
305 return resolver.apply(self, arguments);
306 } catch (ex) {
307 return catcher(ex);
308 }
309 };
310 }
311
312 function boundThen() {
313 return resolver.apply(self, arguments);
314 }
315};
316
317function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
318
319function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {
320 var desc = {};
321 Object['ke' + 'ys'](descriptor).forEach(function (key) {
322 desc[key] = descriptor[key];
323 });
324 desc.enumerable = !!desc.enumerable;
325 desc.configurable = !!desc.configurable;
326
327 if ('value' in desc || desc.initializer) {
328 desc.writable = true;
329 }
330
331 desc = decorators.slice().reverse().reduce(function (desc, decorator) {
332 return decorator(target, property, desc) || desc;
333 }, desc);
334
335 if (context && desc.initializer !== void 0) {
336 desc.value = desc.initializer ? desc.initializer.call(context) : void 0;
337 desc.initializer = undefined;
338 }
339
340 if (desc.initializer === void 0) {
341 Object['define' + 'Property'](target, property, desc);
342 desc = null;
343 }
344
345 return desc;
346}
347
348var DEFAULT_URL = 'https://localback.net:21324';
349var DEFAULT_VERSION_URL = 'https://wallet.mytrezor.com/data/bridge/latest.txt';
350
351var BridgeTransport = (_class = function () {
352 function BridgeTransport(url, newestVersionUrl) {
353 _classCallCheck(this, BridgeTransport);
354
355 this.name = 'BridgeTransport';
356 this.version = '';
357 this.configured = false;
358 this.debug = false;
359
360 this.url = url == null ? DEFAULT_URL : url;
361 this.newestVersionUrl = newestVersionUrl == null ? DEFAULT_VERSION_URL : newestVersionUrl;
362 }
363
364 _createClass(BridgeTransport, [{
365 key: '_post',
366 value: function _post(options) {
367 return new Promise(function ($return, $error) {
368 return (0, _http.request)(_extends({}, options, { method: 'POST', url: this.url + options.url })).then($return, $error);
369 }.$asyncbind(this));
370 }
371 }, {
372 key: '_get',
373 value: function _get(options) {
374 return new Promise(function ($return, $error) {
375 return (0, _http.request)(_extends({}, options, { method: 'GET', url: this.url + options.url })).then($return, $error);
376 }.$asyncbind(this));
377 }
378 }, {
379 key: 'init',
380 value: function init(debug) {
381 return new Promise(function ($return, $error) {
382 this.debug = !!debug;
383 return this._silentInit().then(function ($await_3) {
384 return $return();
385 }.$asyncbind(this, $error), $error);
386 }.$asyncbind(this));
387 }
388 }, {
389 key: '_silentInit',
390 value: function _silentInit() {
391 return new Promise(function ($return, $error) {
392 var infoS, info, newVersion;
393 return (0, _http.request)({
394 url: this.url,
395 method: 'GET'
396 }).then(function ($await_4) {
397 infoS = $await_4;
398 info = check.info(infoS);
399 this.version = info.version;
400 this.configured = info.configured;
401 return (0, _http.request)({
402 url: this.newestVersionUrl + '?' + Date.now(),
403 method: 'GET'
404 }).then(function ($await_5) {
405 newVersion = check.version($await_5);
406 this.isOutdated = (0, _semverCompare2.default)(this.version, newVersion) < 0;
407 return $return();
408 }.$asyncbind(this, $error), $error);
409 }.$asyncbind(this, $error), $error);
410 }.$asyncbind(this));
411 }
412 }, {
413 key: 'configure',
414 value: function configure(config) {
415 return new Promise(function ($return, $error) {
416 return this._post({
417 url: '/configure',
418 body: config
419 }).then(function ($await_6) {
420 return this._silentInit().then(function ($await_7) {
421 return $return();
422 }.$asyncbind(this, $error), $error);
423 }.$asyncbind(this, $error), $error);
424 }.$asyncbind(this));
425 }
426 }, {
427 key: 'listen',
428 value: function listen(old) {
429 return new Promise(function ($return, $error) {
430 var devicesS, devices;
431 return (old == null ? this._get({ url: '/listen' }) : this._post({
432 url: '/listen',
433 body: old.map(function (device) {
434 return _extends({}, device, {
435 // hack for old trezord
436 product: 1,
437 vendor: 21324
438 });
439 })
440 })).then(function ($await_8) {
441 devicesS = $await_8;
442 devices = check.devices(devicesS);
443 return $return(devices);
444 }.$asyncbind(this, $error), $error);
445 }.$asyncbind(this));
446 }
447 }, {
448 key: 'enumerate',
449 value: function enumerate() {
450 return new Promise(function ($return, $error) {
451 var devicesS, devices;
452 return this._get({ url: '/enumerate' }).then(function ($await_9) {
453 devicesS = $await_9;
454 devices = check.devices(devicesS);
455 return $return(devices);
456 }.$asyncbind(this, $error), $error);
457 }.$asyncbind(this));
458 }
459 }, {
460 key: '_acquireMixed',
461 value: function _acquireMixed(input) {
462 return new Promise(function ($return, $error) {
463 var checkPrevious = input.checkPrevious && (0, _semverCompare2.default)(this.version, '1.1.3') >= 0;
464 if (checkPrevious) {
465 var previousStr = input.previous == null ? 'null' : input.previous;
466 var _url = '/acquire/' + input.path + '/' + previousStr;
467 return $return(this._post({ url: _url }));
468 } else {
469 return $return(this._post({ url: '/acquire/' + input.path }));
470 }
471 return $return();
472 }.$asyncbind(this));
473 }
474 }, {
475 key: 'acquire',
476 value: function acquire(input) {
477 return new Promise(function ($return, $error) {
478 var acquireS;
479 return this._acquireMixed(input).then(function ($await_10) {
480 acquireS = $await_10;
481 return $return(check.acquire(acquireS));
482 }.$asyncbind(this, $error), $error);
483 }.$asyncbind(this));
484 }
485 }, {
486 key: 'release',
487 value: function release(session) {
488 return new Promise(function ($return, $error) {
489 return this._post({ url: '/release/' + session }).then(function ($await_11) {
490 return $return();
491 }.$asyncbind(this, $error), $error);
492 }.$asyncbind(this));
493 }
494 }, {
495 key: 'call',
496 value: function call(session, name, data) {
497 return new Promise(function ($return, $error) {
498 var res;
499 return this._post({
500 url: '/call/' + session,
501 body: {
502 type: name,
503 message: data
504 }
505 }).then(function ($await_12) {
506 res = $await_12;
507 return $return(check.call(res));
508 }.$asyncbind(this, $error), $error);
509 }.$asyncbind(this));
510 }
511 }], [{
512 key: 'setFetch',
513 value: function setFetch(fetch) {
514 (0, _http.setFetch)(fetch);
515 }
516 }]);
517
518 return BridgeTransport;
519}(), (_applyDecoratedDescriptor(_class.prototype, 'init', [_debugDecorator.debugInOut], Object.getOwnPropertyDescriptor(_class.prototype, 'init'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, 'configure', [_debugDecorator.debugInOut], Object.getOwnPropertyDescriptor(_class.prototype, 'configure'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, 'listen', [_debugDecorator.debugInOut], Object.getOwnPropertyDescriptor(_class.prototype, 'listen'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, 'enumerate', [_debugDecorator.debugInOut], Object.getOwnPropertyDescriptor(_class.prototype, 'enumerate'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, 'acquire', [_debugDecorator.debugInOut], Object.getOwnPropertyDescriptor(_class.prototype, 'acquire'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, 'release', [_debugDecorator.debugInOut], Object.getOwnPropertyDescriptor(_class.prototype, 'release'), _class.prototype), _applyDecoratedDescriptor(_class.prototype, 'call', [_debugDecorator.debugInOut], Object.getOwnPropertyDescriptor(_class.prototype, 'call'), _class.prototype)), _class);
520exports.default = BridgeTransport;
521module.exports = exports['default'];
\No newline at end of file