UNPKG

18.2 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 _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; }; }();
11
12var _desc, _value, _class;
13
14var _debugDecorator = require('./debug-decorator');
15
16Function.prototype.$asyncbind = function $asyncbind(self, catcher) {
17 "use strict";
18
19 if (!Function.prototype.$asyncbind) {
20 Object.defineProperty(Function.prototype, "$asyncbind", {
21 value: $asyncbind,
22 enumerable: false,
23 configurable: true,
24 writable: true
25 });
26 }
27
28 if (!$asyncbind.trampoline) {
29 $asyncbind.trampoline = function trampoline(t, x, s, e, u) {
30 return function b(q) {
31 while (q) {
32 if (q.then) {
33 q = q.then(b, e);
34 return u ? undefined : q;
35 }
36
37 try {
38 if (q.pop) {
39 if (q.length) return q.pop() ? x.call(t) : q;
40 q = s;
41 } else q = q.call(t);
42 } catch (r) {
43 return e(r);
44 }
45 }
46 };
47 };
48 }
49
50 if (!$asyncbind.LazyThenable) {
51 $asyncbind.LazyThenable = function () {
52 function isThenable(obj) {
53 return obj && obj instanceof Object && typeof obj.then === "function";
54 }
55
56 function resolution(p, r, how) {
57 try {
58 var x = how ? how(r) : r;
59 if (p === x) return p.reject(new TypeError("Promise resolution loop"));
60
61 if (isThenable(x)) {
62 x.then(function (y) {
63 resolution(p, y);
64 }, function (e) {
65 p.reject(e);
66 });
67 } else {
68 p.resolve(x);
69 }
70 } catch (ex) {
71 p.reject(ex);
72 }
73 }
74
75 function Chained() {}
76
77 ;
78 Chained.prototype = {
79 resolve: _unchained,
80 reject: _unchained,
81 then: thenChain
82 };
83
84 function _unchained(v) {}
85
86 function thenChain(res, rej) {
87 this.resolve = res;
88 this.reject = rej;
89 }
90
91 function then(res, rej) {
92 var chain = new Chained();
93
94 try {
95 this._resolver(function (value) {
96 return isThenable(value) ? value.then(res, rej) : resolution(chain, value, res);
97 }, function (ex) {
98 resolution(chain, ex, rej);
99 });
100 } catch (ex) {
101 resolution(chain, ex, rej);
102 }
103
104 return chain;
105 }
106
107 function Thenable(resolver) {
108 this._resolver = resolver;
109 this.then = then;
110 }
111
112 ;
113
114 Thenable.resolve = function (v) {
115 return Thenable.isThenable(v) ? v : {
116 then: function then(resolve) {
117 return resolve(v);
118 }
119 };
120 };
121
122 Thenable.isThenable = isThenable;
123 return Thenable;
124 }();
125
126 $asyncbind.EagerThenable = $asyncbind.Thenable = ($asyncbind.EagerThenableFactory = function (tick) {
127 tick = tick || (typeof process === 'undefined' ? 'undefined' : _typeof(process)) === "object" && process.nextTick || typeof setImmediate === "function" && setImmediate || function (f) {
128 setTimeout(f, 0);
129 };
130
131 var soon = function () {
132 var fq = [],
133 fqStart = 0,
134 bufferSize = 1024;
135
136 function callQueue() {
137 while (fq.length - fqStart) {
138 fq[fqStart]();
139 fq[fqStart++] = undefined;
140
141 if (fqStart === bufferSize) {
142 fq.splice(0, bufferSize);
143 fqStart = 0;
144 }
145 }
146 }
147
148 return function (fn) {
149 fq.push(fn);
150 if (fq.length - fqStart === 1) tick(callQueue);
151 };
152 }();
153
154 function Zousan(func) {
155 if (func) {
156 var me = this;
157 func(function (arg) {
158 me.resolve(arg);
159 }, function (arg) {
160 me.reject(arg);
161 });
162 }
163 }
164
165 Zousan.prototype = {
166 resolve: function resolve(value) {
167 if (this.state !== undefined) return;
168 if (value === this) return this.reject(new TypeError("Attempt to resolve promise with self"));
169 var me = this;
170
171 if (value && (typeof value === "function" || (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === "object")) {
172 try {
173 var first = 0;
174 var then = value.then;
175
176 if (typeof then === "function") {
177 then.call(value, function (ra) {
178 if (!first++) {
179 me.resolve(ra);
180 }
181 }, function (rr) {
182 if (!first++) {
183 me.reject(rr);
184 }
185 });
186 return;
187 }
188 } catch (e) {
189 if (!first) this.reject(e);
190 return;
191 }
192 }
193
194 this.state = STATE_FULFILLED;
195 this.v = value;
196 if (me.c) soon(function () {
197 for (var n = 0, l = me.c.length; n < l; n++) {
198 STATE_FULFILLED(me.c[n], value);
199 }
200 });
201 },
202 reject: function reject(reason) {
203 if (this.state !== undefined) return;
204 this.state = STATE_REJECTED;
205 this.v = reason;
206 var clients = this.c;
207 if (clients) soon(function () {
208 for (var n = 0, l = clients.length; n < l; n++) {
209 STATE_REJECTED(clients[n], reason);
210 }
211 });
212 },
213 then: function then(onF, onR) {
214 var p = new Zousan();
215 var client = {
216 y: onF,
217 n: onR,
218 p: p
219 };
220
221 if (this.state === undefined) {
222 if (this.c) this.c.push(client);else this.c = [client];
223 } else {
224 var s = this.state,
225 a = this.v;
226 soon(function () {
227 s(client, a);
228 });
229 }
230
231 return p;
232 }
233 };
234
235 function STATE_FULFILLED(c, arg) {
236 if (typeof c.y === "function") {
237 try {
238 var yret = c.y.call(undefined, arg);
239 c.p.resolve(yret);
240 } catch (err) {
241 c.p.reject(err);
242 }
243 } else c.p.resolve(arg);
244 }
245
246 function STATE_REJECTED(c, reason) {
247 if (typeof c.n === "function") {
248 try {
249 var yret = c.n.call(undefined, reason);
250 c.p.resolve(yret);
251 } catch (err) {
252 c.p.reject(err);
253 }
254 } else c.p.reject(reason);
255 }
256
257 Zousan.resolve = function (val) {
258 if (val && val instanceof Zousan) return val;
259 var z = new Zousan();
260 z.resolve(val);
261 return z;
262 };
263
264 Zousan.reject = function (err) {
265 if (err && err instanceof Zousan) return err;
266 var z = new Zousan();
267 z.reject(err);
268 return z;
269 };
270
271 Zousan.version = "2.3.2-nodent";
272 return Zousan;
273 })();
274 }
275
276 var resolver = this;
277
278 switch (catcher) {
279 case true:
280 return new $asyncbind.Thenable(boundThen);
281
282 case 0:
283 return new $asyncbind.LazyThenable(boundThen);
284
285 case undefined:
286 boundThen.then = boundThen;
287 return boundThen;
288
289 default:
290 return function () {
291 try {
292 return resolver.apply(self, arguments);
293 } catch (ex) {
294 return catcher(ex);
295 }
296 };
297 }
298
299 function boundThen() {
300 return resolver.apply(self, arguments);
301 }
302};
303
304function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
305
306function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) {
307 var desc = {};
308 Object['ke' + 'ys'](descriptor).forEach(function (key) {
309 desc[key] = descriptor[key];
310 });
311 desc.enumerable = !!desc.enumerable;
312 desc.configurable = !!desc.configurable;
313
314 if ('value' in desc || desc.initializer) {
315 desc.writable = true;
316 }
317
318 desc = decorators.slice().reverse().reduce(function (desc, decorator) {
319 return decorator(target, property, desc) || desc;
320 }, desc);
321
322 if (context && desc.initializer !== void 0) {
323 desc.value = desc.initializer ? desc.initializer.call(context) : void 0;
324 desc.initializer = undefined;
325 }
326
327 if (desc.initializer === void 0) {
328 Object['define' + 'Property'](target, property, desc);
329 desc = null;
330 }
331
332 return desc;
333}
334
335var FallbackTransport = (_class = function () {
336
337 // note: activeTransport is actually "?Transport", but
338 // everywhere I am using it is in `async`, so error gets returned as Promise.reject
339 function FallbackTransport(transports) {
340 _classCallCheck(this, FallbackTransport);
341
342 this.name = 'FallbackTransport';
343 this.activeName = '';
344 this.debug = false;
345 this.requestNeeded = false;
346
347 this.transports = transports;
348 }
349
350 // first one that inits successfuly is the final one; others won't even start initing
351
352
353 _createClass(FallbackTransport, [{
354 key: '_tryInitTransports',
355 value: function _tryInitTransports() {
356 return new Promise(function ($return, $error) {
357 var $Try_1_Finally = function ($Try_1_Exit) {
358 return function ($Try_1_Value) {
359 try {
360 if (!_iteratorNormalCompletion && _iterator.return) {
361 _iterator.return();
362 }
363 } catch ($exception_4) {
364 return $Try_3_Finally($error)($exception_4);
365 } finally {
366 if (_didIteratorError) {
367 return $error(_iteratorError);
368 }
369 }
370
371 return $Try_1_Exit && $Try_1_Exit.call(this, $Try_1_Value);
372 }.$asyncbind(this, $error);
373 }.$asyncbind(this);
374
375 var res, lastError, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, transport;
376
377 res = [];
378 lastError = null;
379 _iteratorNormalCompletion = true;
380 _didIteratorError = false;
381 _iteratorError = undefined;
382
383 function $Try_1_Post() {
384 if (res.length === 0) {
385 return $error(lastError || new Error('No transport could be initialized.'));
386 }
387 return $return(res);
388 }
389
390 var $Try_1_Catch = function (err) {
391 _didIteratorError = true;
392 _iteratorError = err;
393 return $Try_1_Finally($Try_1_Post).call(this);
394 }.$asyncbind(this, $Try_1_Finally($error));
395
396 try {
397 _iterator = this.transports[Symbol.iterator]();
398 return Function.$asyncbind.trampoline(this, $Loop_9_exit, $Loop_9_step, $Try_1_Catch, true)($Loop_9);
399
400 function $Loop_9() {
401 if (!(_iteratorNormalCompletion = (_step = _iterator.next()).done)) {
402 transport = _step.value;
403
404 function $Try_2_Post() {
405 return $Loop_9_step;
406 }
407
408 var $Try_2_Catch = function (e) {
409 lastError = e;
410 return $Try_2_Post.call(this);
411 }.$asyncbind(this, $Try_1_Catch);
412 try {
413 return transport.init(this.debug).then(function ($await_13) {
414 res.push(transport);
415 return $Try_2_Post.call(this);
416 }.$asyncbind(this, $Try_2_Catch), $Try_2_Catch);
417 } catch (e) {
418 $Try_2_Catch(e)
419 }
420 } else return [1];
421 }
422
423 function $Loop_9_step() {
424 _iteratorNormalCompletion = true;
425 return $Loop_9;
426 }
427
428 function $Loop_9_exit() {
429 return $Try_1_Finally($Try_1_Post).call(this);
430 }
431 } catch (err) {
432 $Try_1_Catch(err)
433 }
434 }.$asyncbind(this));
435 }
436
437 // first one that inits successfuly is the final one; others won't even start initing
438
439 }, {
440 key: '_tryConfigureTransports',
441 value: function _tryConfigureTransports(data) {
442 return new Promise(function ($return, $error) {
443 var $Try_5_Finally = function ($Try_5_Exit) {
444 return function ($Try_5_Value) {
445 try {
446 if (!_iteratorNormalCompletion2 && _iterator2.return) {
447 _iterator2.return();
448 }
449 } catch ($exception_8) {
450 return $Try_7_Finally($error)($exception_8);
451 } finally {
452 if (_didIteratorError2) {
453 return $error(_iteratorError2);
454 }
455 }
456
457 return $Try_5_Exit && $Try_5_Exit.call(this, $Try_5_Value);
458 }.$asyncbind(this, $error);
459 }.$asyncbind(this);
460
461 var lastError, _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _iterator2, _step2, transport;
462
463 lastError = null;
464 _iteratorNormalCompletion2 = true;
465 _didIteratorError2 = false;
466 _iteratorError2 = undefined;
467
468 function $Try_5_Post() {
469 return $error(lastError || new Error('No transport could be initialized.'));
470 }
471
472 var $Try_5_Catch = function (err) {
473 _didIteratorError2 = true;
474 _iteratorError2 = err;
475 return $Try_5_Finally($Try_5_Post).call(this);
476 }.$asyncbind(this, $Try_5_Finally($error));
477 try {
478 _iterator2 = this._availableTransports[Symbol.iterator]();
479 return Function.$asyncbind.trampoline(this, $Loop_11_exit, $Loop_11_step, $Try_5_Catch, true)($Loop_11);
480
481 function $Loop_11() {
482 if (!(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done)) {
483 transport = _step2.value;
484 var $Try_6_Catch = function (e) {
485 lastError = e;
486 return $Loop_11_step;
487 }.$asyncbind(this, $Try_5_Catch);
488 try {
489 return transport.configure(data).then(function ($await_14) {
490 return $Try_5_Finally($return)(transport);
491 }.$asyncbind(this, $Try_6_Catch), $Try_6_Catch);
492 } catch (e) {
493 $Try_6_Catch(e)
494 }
495 } else return [1];
496 }
497
498 function $Loop_11_step() {
499 _iteratorNormalCompletion2 = true;
500 return $Loop_11;
501 }
502
503 function $Loop_11_exit() {
504 return $Try_5_Finally($Try_5_Post).call(this);
505 }
506 } catch (err) {
507 $Try_5_Catch(err)
508 }
509 }.$asyncbind(this));
510 }
511 }, {
512 key: 'init',
513 value: function init(debug) {
514 return new Promise(function ($return, $error) {
515 var transports;
516
517 this.debug = !!debug;
518
519 // init ALL OF THEM
520 return this._tryInitTransports().then(function ($await_15) {
521 transports = $await_15;
522 this._availableTransports = transports;
523
524 // a slight hack - configured is always false, so we force caller to call configure()
525 // to find out the actual working transport (bridge falls on configure, not on info)
526 this.version = transports[0].version;
527 this.configured = false;
528 return $return();
529 }.$asyncbind(this, $error), $error);
530 }.$asyncbind(this));
531 }
532 }, {
533 key: 'configure',
534 value: function configure(signedData) {
535 return new Promise(function ($return, $error) {
536 return this._tryConfigureTransports(signedData).then(function ($await_16) {
537 this.activeTransport = $await_16;
538 this.configured = this.activeTransport.configured;
539 this.version = this.activeTransport.version;
540 this.activeName = this.activeTransport.name;
541 this.requestNeeded = this.activeTransport.requestNeeded;
542 return $return();
543 }.$asyncbind(this, $error), $error);
544 }.$asyncbind(this));
545 }
546
547 // using async so I get Promise.recect on this.activeTransport == null (or other error), not Error
548
549 }, {
550 key: 'enumerate',
551 value: function enumerate() {
552 return new Promise(function ($return, $error) {
553 return $return(this.activeTransport.enumerate());
554 }.$asyncbind(this));
555 }
556 }, {
557 key: 'listen',
558 value: function listen(old) {
559 return new Promise(function ($return, $error) {
560 return $return(this.activeTransport.listen(old));
561 }.$asyncbind(this));
562 }
563 }, {
564 key: 'acquire',
565 value: function acquire(input) {
566 return new Promise(function ($return, $error) {
567 return $return(this.activeTransport.acquire(input));
568 }.$asyncbind(this));
569 }
570 }, {
571 key: 'release',
572 value: function release(session) {
573 return new Promise(function ($return, $error) {
574 return $return(this.activeTransport.release(session));
575 }.$asyncbind(this));
576 }
577 }, {
578 key: 'call',
579 value: function call(session, name, data) {
580 return new Promise(function ($return, $error) {
581 return $return(this.activeTransport.call(session, name, data));
582 }.$asyncbind(this));
583 }
584 }, {
585 key: 'requestDevice',
586 value: function requestDevice() {
587 return new Promise(function ($return, $error) {
588 return $return(this.activeTransport.requestDevice());
589 }.$asyncbind(this));
590 }
591 }]);
592
593 return FallbackTransport;
594}(), (_applyDecoratedDescriptor(_class.prototype, 'init', [_debugDecorator.debugInOut], Object.getOwnPropertyDescriptor(_class.prototype, 'init'), _class.prototype)), _class);
595exports.default = FallbackTransport;
596module.exports = exports['default'];
\No newline at end of file