UNPKG

31.4 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.try = exports.attempt = exports.TimeoutError = exports.promisifyAll = exports.promisify = exports.finally = exports.fromEvents = exports.fromEvent = exports.fromCallback = exports.forOwn = exports.forIterable = exports.forIn = exports.forEach = exports.forArray = exports.makeAsyncIterator = exports.defer = exports.cancellable = exports.cancelable = exports.CancelToken = exports.Cancel = exports.nodeify = exports.wrapApply = exports.wrapCall = exports.isPromise = undefined;
7
8var _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; }; }();
9
10exports.all = all;
11exports.asCallback = asCallback;
12exports.catchPlus = catchPlus;
13exports.delay = delay;
14exports.disposer = disposer;
15exports.using = using;
16exports.ignoreErrors = ignoreErrors;
17exports.join = join;
18exports.lastly = lastly;
19exports.reflect = reflect;
20exports.settle = settle;
21exports.some = some;
22exports.tap = tap;
23exports.timeout = timeout;
24exports.unpromisify = unpromisify;
25
26var _makeError = require('make-error');
27
28function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
29
30function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
31
32function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
33
34// ===================================================================
35
36if (typeof Promise !== 'function' || typeof Promise.reject !== 'function' || typeof Promise.resolve !== 'function') {
37 throw new Error('a standard Promise implementation is required (https://github.com/JsCommunity/promise-toolbox#usage)');
38}
39
40// ===================================================================
41
42var _endsWith = function _endsWith(str, suffix) {
43 var pos = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : str.length;
44
45 pos -= suffix.length;
46 return pos >= 0 && str.indexOf(suffix, pos) === pos;
47};
48
49var _isArray = Array.isArray || function (value) {
50 return value instanceof Array;
51};
52
53var _isLength = function _isLength(value) {
54 return typeof value === 'number' && value >= 0 && value < Infinity && Math.floor(value) === value;
55};
56
57var _isArrayLike = function _isArrayLike(value) {
58 return value && typeof value !== 'function' && _isLength(value.length);
59};
60
61var _iteratorSymbol = typeof Symbol === 'function' && Symbol.iterator || '@@iterator';
62
63var _isIterable = function _isIterable(value) {
64 return value && typeof value[_iteratorSymbol] === 'function';
65};
66
67var _once = function _once(fn) {
68 var result = void 0;
69 return function () {
70 if (fn) {
71 result = fn.apply(this, arguments);
72 fn = null;
73 }
74 return result;
75 };
76};
77
78var _noop = function _noop() {};
79
80// -------------------------------------------------------------------
81
82var _forArray = function _forArray(array, iteratee) {
83 var length = array.length;
84
85 for (var i = 0; i < length; ++i) {
86 iteratee(array[i], i, array);
87 }
88};
89
90var _forIn = function _forIn(object, iteratee) {
91 for (var key in object) {
92 iteratee(object[key], key, object);
93 }
94};
95
96var _forIterable = function _forIterable(iterable, iteratee) {
97 var iterator = iterable[Symbol.iterator]();
98
99 var current = void 0;
100 while (!(current = iterator.next()).done) {
101 iteratee(current.value, null, iterable);
102 }
103};
104
105var hasOwnProperty = Object.prototype.hasOwnProperty;
106
107var _forOwn = function _forOwn(object, iteratee) {
108 for (var key in object) {
109 if (hasOwnProperty.call(object, key)) {
110 iteratee(object[key], key, object);
111 }
112 }
113};
114
115var _forEach = function _forEach(collection, iteratee) {
116 return _isArray(collection) ? _forArray(collection, iteratee) : _isIterable(collection) ? _forIterable(collection, iteratee) : _isArrayLike(collection) ? _forArray(collection, iteratee) : _forOwn(collection, iteratee);
117};
118
119var _map = function _map(collection, iteratee) {
120 var result = _isArrayLike(collection) ? new Array(collection.length) : {};
121
122 // If iteratee is not a function, simply returns the new container.
123 if (iteratee) {
124 _forEach(collection, function (item, key) {
125 result[key] = iteratee(item, key, collection);
126 });
127 }
128
129 return result;
130};
131
132// ===================================================================
133
134var isPromise = exports.isPromise = function isPromise(value) {
135 return value != null && typeof value.then === 'function';
136};
137
138// -------------------------------------------------------------------
139
140var _makeAsyncIterator = function _makeAsyncIterator(iterator) {
141 return function (promises, cb) {
142 var mainPromise = Promise.resolve();
143
144 iterator(promises, function (promise, key) {
145 mainPromise = isPromise(promise) ? mainPromise.then(function () {
146 return promise.then(function (value) {
147 return cb(value, key, promises);
148 });
149 }) : mainPromise.then(function () {
150 return cb(promise, key, promises);
151 });
152 });
153
154 return mainPromise;
155 };
156};
157
158var _wrap = function _wrap(value) {
159 return isPromise(value) ? value : Promise.resolve(value);
160};
161
162var wrapCall = exports.wrapCall = function wrapCall(fn, arg, thisArg) {
163 try {
164 return _wrap(fn.call(thisArg, arg));
165 } catch (error) {
166 return Promise.reject(error);
167 }
168};
169
170var wrapApply = exports.wrapApply = function wrapApply(fn, args, thisArg) {
171 try {
172 return _wrap(fn.apply(thisArg, args));
173 } catch (error) {
174 return Promise.reject(error);
175 }
176};
177
178// ===================================================================
179
180var _all = function _all(promises, mapFn) {
181 return new Promise(function (resolve, reject) {
182 // mapFn may be undefined but it's okay :)
183 var result = _map(promises, mapFn);
184
185 var count = 1;
186 var onFulfillment0 = function onFulfillment0() {
187 if (--count === 0) {
188 var tmp = result;
189 result = null;
190 resolve(tmp);
191 }
192 };
193
194 var onFulfillment = function onFulfillment(value, key) {
195 if (!result) {
196 return;
197 }
198
199 result[key] = value;
200 onFulfillment0();
201 };
202
203 var onRejection = function onRejection(reason) {
204 if (!result) {
205 return;
206 }
207
208 result = null;
209 reject(reason);
210 };
211
212 _forEach(mapFn ? result : promises, function (promise, key) {
213 ++count;
214
215 if (isPromise(promise)) {
216 promise.then(function (value) {
217 return onFulfillment(value, key);
218 }, onRejection);
219 } else {
220 onFulfillment(promise, key);
221 }
222 });
223 onFulfillment0();
224 });
225};
226
227// Returns a promise which resolves when all the promises in a
228// collection have resolved or rejects with the reason of the first
229// promise that rejects.
230//
231// Optionally a function can be provided to map all items in the
232// collection before waiting for completion.
233//
234// Usage: promises::all([ mapFn ])
235function all(mapFn) {
236 return _wrap(this).then(function (promises) {
237 return _all(promises, mapFn);
238 });
239}
240
241// -------------------------------------------------------------------
242
243// Usage: promise::asCallback(cb)
244function asCallback(cb) {
245 // cb can be undefined.
246 if (cb) {
247 this.then(function (value) {
248 return cb(null, value);
249 }, function (error) {
250 return cb(error);
251 }).then(null, _noop);
252 }
253
254 return this;
255}
256
257exports.nodeify = asCallback;
258
259// -------------------------------------------------------------------
260
261var Cancel = exports.Cancel = function () {
262 function Cancel() {
263 var message = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'this action has been canceled';
264
265 _classCallCheck(this, Cancel);
266
267 Object.defineProperty(this, 'message', {
268 enumerable: true,
269 value: message
270 });
271 }
272
273 _createClass(Cancel, [{
274 key: 'toString',
275 value: function toString() {
276 return `Cancel: ${this.message}`;
277 }
278 }]);
279
280 return Cancel;
281}();
282
283var _cancelTokenTag = 'CancelToken';
284var _toStringTagSymbol = typeof Symbol === 'function' && Symbol.toStringTag || '@@toStringTag';
285
286// https://github.com/zenparsing/es-cancel-token
287// https://tc39.github.io/proposal-cancelable-promises/
288
289var CancelToken = exports.CancelToken = function () {
290 _createClass(CancelToken, null, [{
291 key: 'isCancelToken',
292 value: function isCancelToken(value) {
293 return value != null && typeof value[_toStringTagSymbol] === 'function' && value[_toStringTagSymbol]() === _cancelTokenTag;
294 }
295
296 // https://github.com/zenparsing/es-cancel-token/issues/3#issuecomment-221173214
297
298 }, {
299 key: 'source',
300 value: function source() {
301 var cancel = void 0;
302 var token = new CancelToken(function (cancel_) {
303 cancel = cancel_;
304 });
305 return { cancel, token };
306 }
307 }, {
308 key: 'race',
309 value: function race(tokens, _executor) {
310 return new CancelToken(function (cancel) {
311 _forEach(tokens, function (token) {
312 var reason = token.reason;
313
314 if (reason !== undefined) {
315 cancel(reason);
316 return false;
317 }
318
319 (token._listeners || (token._listeners = [])).push(cancel);
320 });
321 if (_executor !== undefined) {
322 _executor(cancel);
323 }
324 });
325 }
326 }]);
327
328 function CancelToken(executor) {
329 var _this = this;
330
331 _classCallCheck(this, CancelToken);
332
333 this._listeners = null;
334 this._promise = null;
335 this._reason = undefined;
336 this._resolve = null;
337
338 var _cancelOnce = function cancelOnce(message) {
339 _cancelOnce = _noop;
340
341 var reason = _this._reason = message instanceof Cancel ? message : new Cancel(message);
342
343 var resolve = _this._resolve;
344 if (resolve !== null) {
345 _this._resolve = null;
346 resolve(reason);
347 }
348
349 // notify sync listeners (for race)
350 var listeners = _this._listeners;
351 if (listeners !== null) {
352 _this._listeners = null;
353 _forArray(listeners, function (listener) {
354 return void listener(reason);
355 });
356 }
357 };
358 var cancel = function cancel(message) {
359 return _cancelOnce(message);
360 };
361 executor(cancel);
362 }
363
364 _createClass(CancelToken, [{
365 key: 'fork',
366 value: function fork(executor) {
367 if (executor !== undefined) {
368 return CancelToken.race([this], executor);
369 }
370
371 var cancel = void 0;
372 var token = CancelToken.race([this], function (c) {
373 cancel = c;
374 });
375 return { cancel, token };
376 }
377 }, {
378 key: 'throwIfRequested',
379 value: function throwIfRequested() {
380 var reason = this._reason;
381 if (reason !== undefined) {
382 throw reason;
383 }
384 }
385 }, {
386 key: _toStringTagSymbol,
387 value: function value() {
388 return _cancelTokenTag;
389 }
390 }, {
391 key: 'promise',
392 get: function get() {
393 var _this2 = this;
394
395 var promise = this._promise;
396 if (promise === null) {
397 var reason = this._reason;
398 promise = this._promise = reason !== undefined ? Promise.resolve(reason) : new Promise(function (resolve) {
399 _this2._resolve = resolve;
400 });
401 }
402 return promise;
403 }
404 }, {
405 key: 'reason',
406 get: function get() {
407 return this._reason;
408 }
409 }, {
410 key: 'requested',
411 get: function get() {
412 return this._reason !== undefined;
413 }
414 }]);
415
416 return CancelToken;
417}();
418
419// Usage:
420//
421// @cancelable
422// async fn (cancelToken, other, args) {
423// if (!cancelToken.requested) {
424// doStuff()
425// }
426//
427// cancelToken.throwIfRequested()
428//
429// doSomeMoreStuff()
430//
431// cancelToken.promise.then(() => {
432// // Do stuff if canceled.
433// })
434//
435// // do other stuff.
436// }
437
438
439var cancelable = exports.cancelable = function cancelable(target, name, descriptor) {
440 var fn = descriptor !== undefined ? descriptor.value : target;
441
442 function cancelableWrapper() {
443 var length = arguments.length;
444
445 if (length !== 0 && CancelToken.isCancelToken(arguments[0])) {
446 return fn.apply(this, arguments);
447 }
448
449 var _CancelToken$source = CancelToken.source(),
450 cancel = _CancelToken$source.cancel,
451 token = _CancelToken$source.token;
452
453 var args = new Array(length + 1);
454 args[0] = token;
455 for (var i = 0; i < length; ++i) {
456 args[i + 1] = arguments[i];
457 }
458
459 var promise = fn.apply(this, args);
460 promise.cancel = cancel;
461
462 return promise;
463 }
464
465 if (descriptor !== undefined) {
466 descriptor.value = cancelableWrapper;
467 return descriptor;
468 }
469
470 return cancelableWrapper;
471};
472exports.cancellable = cancelable; // alternative UK spelling
473
474// -------------------------------------------------------------------
475
476var _isProgrammerError = function _isProgrammerError(reason) {
477 return reason instanceof ReferenceError || reason instanceof SyntaxError || reason instanceof TypeError;
478};
479
480var _matchError = function _matchError(predicate, error) {
481 if (typeof predicate === 'function') {
482 return predicate === Error || predicate.prototype instanceof Error ? error instanceof predicate : predicate(error);
483 }
484
485 if (error != null && typeof predicate === 'object') {
486 for (var key in predicate) {
487 if (hasOwnProperty.call(predicate, key) && error[key] !== predicate[key]) {
488 return false;
489 }
490 }
491 return true;
492 }
493};
494
495// Similar to `Promise#catch()` but:
496// - support predicates
497// - do not catch `ReferenceError`, `SyntaxError` or `TypeError`
498// unless they match a predicate because they are usually programmer
499// errors and should be handled separately.
500function catchPlus() {
501 var _this3 = this;
502
503 var n = arguments.length - 1;
504
505 var cb = void 0;
506 if (n < 0 || typeof (cb = arguments[n]) !== 'function') {
507 return this;
508 }
509
510 var predicates = void 0;
511 if (n !== 0) {
512 predicates = new Array(n);
513 for (var i = 0; i < n; ++i) {
514 predicates[i] = arguments[i];
515 }
516 }
517
518 return _wrap(this).then(null, function (reason) {
519 if (predicates !== undefined) {
520 for (var _i = 0; _i < n; ++_i) {
521 if (_matchError(predicates[_i], reason)) {
522 return cb(reason);
523 }
524 }
525 } else if (!_isProgrammerError(reason)) {
526 return cb(reason);
527 }
528
529 // Forward error without throwing (perf).
530 return _this3;
531 });
532}
533
534// -------------------------------------------------------------------
535
536// Discouraged but sometimes necessary way to create a promise.
537var defer = exports.defer = function defer() {
538 var resolve = void 0,
539 reject = void 0;
540 var promise = new Promise(function (resolve_, reject_) {
541 // eslint-disable-line promise/param-names
542 resolve = resolve_;
543 reject = reject_;
544 });
545
546 return {
547 promise,
548 reject,
549 resolve
550 };
551};
552
553// -------------------------------------------------------------------
554
555// Usage: promise::delay(ms)
556function delay(ms) {
557 var _this4 = this;
558
559 return isPromise(this) ? this.then(function (value) {
560 return new Promise(function (resolve) {
561 setTimeout(function () {
562 return resolve(value);
563 }, ms);
564 });
565 }) : new Promise(function (resolve) {
566 setTimeout(function () {
567 return resolve(_this4);
568 }, ms);
569 });
570}
571
572// -------------------------------------------------------------------
573
574function Resource(promise, disposer) {
575 this.d = disposer;
576 this.p = promise;
577}
578
579// Usage: promise::disposer(disposer)
580function disposer(disposer) {
581 return new Resource(this, disposer);
582}
583
584// Usage: using(disposers…, handler)
585function using() {
586 var _this5 = this;
587
588 var nResources = arguments.length - 1;
589
590 if (nResources < 1) {
591 throw new TypeError('using expects at least 2 arguments');
592 }
593
594 var handler = arguments[nResources];
595
596 var resources = arguments[0];
597 var spread = nResources > 1 || !_isArray(resources);
598 if (spread) {
599 resources = new Array(nResources);
600 for (var i = 0; i < nResources; ++i) {
601 resources[i] = arguments[i];
602 }
603 } else {
604 nResources = resources.length;
605 }
606
607 var dispose = _once(function (fn, value) {
608 var leftToProcess = nResources;
609
610 var onSettle = function onSettle() {
611 if (--leftToProcess === 0) {
612 fn(value);
613 }
614 };
615
616 // like Bluebird, on failure to dispose a resource, throw an async error
617 var onFailure = function onFailure(reason) {
618 setTimeout(function () {
619 throw reason;
620 }, 0);
621 };
622
623 _forArray(resources, function (resource) {
624 var d = void 0;
625 if (resource != null && typeof (d = resource.d) === 'function') {
626 resource.p.then(function (value) {
627 return wrapCall(d, value).then(onSettle, onFailure);
628 }, onSettle);
629
630 resource.p = resource.d = null;
631 } else {
632 --leftToProcess;
633 }
634 });
635 });
636
637 return new Promise(function (resolve, reject) {
638 var values = new Array(nResources);
639 var leftToProcess = nResources;
640
641 var _onProviderFailure_ = function onProviderFailure_(reason) {
642 _onProviderFailure_ = onProviderSettle;
643 onSettle = function onSettle() {
644 return dispose(reject, reason);
645 };
646
647 onProviderSettle();
648 };
649 var onProviderFailure = function onProviderFailure(reason) {
650 return _onProviderFailure_(reason);
651 };
652
653 var onProviderSettle = function onProviderSettle() {
654 if (--leftToProcess === 0) {
655 onSettle();
656 }
657 };
658
659 var onSettle = function onSettle() {
660 return (spread ? wrapApply : wrapCall)(handler, values, _this5).then(function (value) {
661 return dispose(resolve, value);
662 }, function (reason) {
663 return dispose(reject, reason);
664 });
665 };
666
667 _forArray(resources, function (resource, i) {
668 var p = resource instanceof Resource ? resource.p : resource;
669 if (p === null) {
670 onProviderFailure(new TypeError('resource has already been disposed of'));
671 return;
672 }
673
674 p.then(function (value) {
675 values[i] = value;
676
677 onProviderSettle();
678 }, onProviderFailure);
679 });
680 });
681}
682
683// -------------------------------------------------------------------
684
685var makeAsyncIterator = exports.makeAsyncIterator = function makeAsyncIterator(iterator) {
686 var asyncIterator = _makeAsyncIterator(iterator);
687
688 return function (cb) {
689 return _wrap(this).then(function (promises) {
690 return asyncIterator(promises, cb);
691 }).then(_noop); // Resolves to undefined
692 };
693};
694
695var forArray = exports.forArray = makeAsyncIterator(_forArray);
696var forEach = exports.forEach = makeAsyncIterator(_forEach);
697var forIn = exports.forIn = makeAsyncIterator(_forIn);
698var forIterable = exports.forIterable = makeAsyncIterator(_forIterable);
699var forOwn = exports.forOwn = makeAsyncIterator(_forOwn);
700
701// -------------------------------------------------------------------
702
703// Usage:
704//
705// fromCallback(cb => fs.readFile('foo.txt', cb))
706// .then(content => {
707// console.log(content)
708// })
709var fromCallback = exports.fromCallback = function fromCallback(fn) {
710 return new Promise(function (resolve, reject) {
711 fn(function (error, result) {
712 return error ? reject(error) : resolve(result);
713 });
714 });
715};
716
717// -------------------------------------------------------------------
718
719var _ignoreErrorsCb = function _ignoreErrorsCb(error) {
720 if (_isProgrammerError(error)) {
721 throw error;
722 }
723};
724
725function ignoreErrors() {
726 if (!isPromise(this)) {
727 return this;
728 }
729
730 return this.then(null, _ignoreErrorsCb);
731}
732
733// -------------------------------------------------------------------
734
735var _makeEventAdder = function _makeEventAdder($cancelToken, emitter, arrayArg) {
736 var add = emitter.addEventListener || emitter.addListener || emitter.on;
737 if (add === undefined) {
738 throw new Error('cannot register event listener');
739 }
740
741 var remove = emitter.removeEventListener || emitter.removeListener || emitter.off;
742
743 var eventsAndListeners = [];
744
745 var clean = _noop;
746 if (remove !== undefined) {
747 clean = _once(function () {
748 for (var i = 0, n = eventsAndListeners.length; i < n; i += 2) {
749 remove.call(emitter, eventsAndListeners[i], eventsAndListeners[i + 1]);
750 }
751 });
752 $cancelToken.promise.then(clean);
753 }
754
755 return arrayArg ? function (event, cb) {
756 function listener() {
757 clean();
758 var length = arguments.length;
759
760 var args = new Array(length);
761 for (var i = 0; i < length; ++i) {
762 args[i] = arguments[i];
763 }
764 args.event = event;
765 cb(args);
766 }
767 eventsAndListeners.push(event, listener);
768 add.call(emitter, event, listener);
769 } : function (event, cb) {
770 var listener = function listener(arg) {
771 clean();
772 cb(arg);
773 };
774 eventsAndListeners.push(event, listener);
775 add.call(emitter, event, listener);
776 };
777};
778
779var fromEvent = exports.fromEvent = cancelable(function ($cancelToken, emitter, event) {
780 var opts = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
781 return new Promise(function (resolve, reject) {
782 var add = _makeEventAdder($cancelToken, emitter, opts.array);
783 add(event, resolve);
784 if (!opts.ignoreErrors) {
785 var _opts$error = opts.error,
786 error = _opts$error === undefined ? 'error' : _opts$error;
787
788 if (error !== event) {
789 add(error, reject);
790 }
791 }
792 });
793});
794
795var fromEvents = exports.fromEvents = cancelable(function ($cancelToken, emitter, successEvents) {
796 var errorEvents = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ['error'];
797 return new Promise(function (resolve, reject) {
798 var add = _makeEventAdder($cancelToken, emitter, true);
799 _forArray(successEvents, function (event) {
800 return add(event, resolve);
801 });
802 _forArray(errorEvents, function (event) {
803 return add(event, reject);
804 });
805 });
806});
807
808// -------------------------------------------------------------------
809
810// Usage: join(p1, ..., pn, cb) or join([p1, ..., pn], cb)
811function join() {
812 var n = arguments.length - 1;
813 var cb = arguments[n];
814
815 var promises = void 0;
816 if (n === 0) {
817 return new Promise(function (resolve) {
818 return resolve(cb());
819 });
820 } else if (n !== 1) {
821 promises = new Array(n);
822 for (var i = 0; i < n; ++i) {
823 promises[i] = arguments[i];
824 }
825 } else if (!_isArrayLike(promises = arguments[0])) {
826 return _wrap(promises).then(function (value) {
827 return cb(value);
828 });
829 }
830
831 return _all(promises).then(function (args) {
832 return cb.apply(null, args);
833 });
834}
835
836// -------------------------------------------------------------------
837
838// Ponyfill for Promise.finally(cb)
839//
840// Usage: promise::lastly(cb)
841function lastly(cb) {
842 var _this6 = this;
843
844 return _wrap(this).then(function (value) {
845 return _wrap(cb()).then(function () {
846 return _this6;
847 });
848 }, function (reason) {
849 return _wrap(cb()).then(function () {
850 return _this6;
851 });
852 });
853}
854exports.finally = lastly;
855
856// -------------------------------------------------------------------
857
858var _setFunctionNameAndLength = function () {
859 var _defineProperties = Object.defineProperties;
860
861 try {
862 var f = _defineProperties(function () {}, {
863 length: { value: 2 },
864 name: { value: 'foo' }
865 });
866
867 if (f.length === 2 && f.name === 'foo') {
868 return function (fn, name, length) {
869 return _defineProperties(fn, {
870 length: {
871 configurable: true,
872 value: length
873 },
874 name: {
875 configurable: true,
876 value: name
877 }
878 });
879 };
880 }
881 } catch (_) {}
882
883 return function (fn) {
884 return fn;
885 };
886}();
887
888// Usage: promisify(fn, [ context ])
889var promisify = exports.promisify = function promisify(fn, context) {
890 return _setFunctionNameAndLength(function () {
891 var _this7 = this;
892
893 var length = arguments.length;
894
895 var args = new Array(length + 1);
896 for (var i = 0; i < length; ++i) {
897 args[i] = arguments[i];
898 }
899
900 return new Promise(function (resolve, reject) {
901 args[length] = function (error, result) {
902 return error ? reject(error) : resolve(result);
903 };
904
905 fn.apply(context || _this7, args);
906 });
907 }, fn.name, fn.length && fn.length - 1);
908};
909
910var _DEFAULT_PALL_MAPPER = function _DEFAULT_PALL_MAPPER(name) {
911 return !(_endsWith(name, 'Sync') || _endsWith(name, 'Async')) && name;
912};
913
914// Usage: promisifyAll(obj, [ opts ])
915var promisifyAll = exports.promisifyAll = function promisifyAll(obj) {
916 var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
917 _ref$mapper = _ref.mapper,
918 mapper = _ref$mapper === undefined ? _DEFAULT_PALL_MAPPER : _ref$mapper,
919 _ref$target = _ref.target,
920 target = _ref$target === undefined ? {} : _ref$target,
921 _ref$context = _ref.context,
922 context = _ref$context === undefined ? obj : _ref$context;
923
924 _forIn(obj, function (value, name) {
925 var newName = void 0;
926 if (typeof value === 'function' && (newName = mapper(name, value, obj))) {
927 target[newName] = promisify(value, context);
928 }
929 });
930
931 return target;
932};
933
934// -------------------------------------------------------------------
935
936var FN_FALSE = function FN_FALSE() {
937 return false;
938};
939var FN_TRUE = function FN_TRUE() {
940 return true;
941};
942
943var _reflectResolution = function (__proto__) {
944 return function (_value) {
945 return {
946 __proto__: __proto__,
947 value: function value() {
948 return _value;
949 }
950 };
951 };
952}({
953 isFulfilled: FN_TRUE,
954 isPending: FN_FALSE,
955 isRejected: FN_FALSE,
956 isResolved: FN_TRUE,
957 reason: function reason() {
958 throw new Error('no reason, the promise has resolved');
959 }
960});
961
962var _reflectRejection = function (__proto__) {
963 return function (_reason) {
964 return {
965 __proto__: __proto__,
966 reason: function reason() {
967 return _reason;
968 }
969 };
970 };
971}({
972 isFulfilled: FN_FALSE,
973 isPending: FN_FALSE,
974 isRejected: FN_TRUE,
975 isResolved: FN_FALSE,
976 value: function value() {
977 throw new Error('no value, the promise has rejected');
978 }
979});
980
981// Returns a promise that is always successful when this promise is
982// settled. Its fulfillment value is an object that implements the
983// PromiseInspection interface and reflects the resolution this
984// promise.
985//
986// Usage: promise::reflect()
987function reflect() {
988 return _wrap(this).then(_reflectResolution, _reflectRejection);
989}
990
991// -------------------------------------------------------------------
992
993// Given a collection (array or object) which contains promises,
994// return a promise that is fulfilled when all the items in the
995// collection are either fulfilled or rejected.
996//
997// This promise will be fulfilled with a collection (of the same type,
998// array or object) containing promise inspections.
999//
1000// Usage: promises::settle()
1001function settle() {
1002 return all.call(this, function (x) {
1003 return reflect.call(x);
1004 });
1005}
1006
1007// -------------------------------------------------------------------
1008
1009var _some = function _some(promises, count) {
1010 return new Promise(function (resolve, reject) {
1011 var values = [];
1012 var errors = [];
1013
1014 var onFulfillment = function onFulfillment(value) {
1015 if (!values) {
1016 return;
1017 }
1018
1019 values.push(value);
1020 if (--count === 0) {
1021 resolve(values);
1022 values = errors = null;
1023 }
1024 };
1025
1026 var acceptableErrors = -count;
1027 var onRejection = function onRejection(reason) {
1028 if (!values) {
1029 return;
1030 }
1031
1032 errors.push(reason);
1033 if (--acceptableErrors === 0) {
1034 reject(errors);
1035 values = errors = null;
1036 }
1037 };
1038
1039 _forEach(promises, function (promise) {
1040 ++acceptableErrors;
1041 _wrap(promise).then(onFulfillment, onRejection);
1042 });
1043 });
1044};
1045
1046// Usage: promises::some(count)
1047function some(count) {
1048 return _wrap(this).then(function (promises) {
1049 return _some(promises, count);
1050 });
1051}
1052
1053// -------------------------------------------------------------------
1054
1055function tap(onResolved, onRejected) {
1056 var _this8 = this;
1057
1058 var forward = function forward() {
1059 return _this8;
1060 };
1061
1062 return _wrap(this).then(onResolved && function (value) {
1063 return _wrap(onResolved(value)).then(forward);
1064 }, onRejected && function (reason) {
1065 return _wrap(onRejected(reason)).then(forward);
1066 });
1067}
1068
1069// -------------------------------------------------------------------
1070
1071var TimeoutError = exports.TimeoutError = function (_BaseError) {
1072 _inherits(TimeoutError, _BaseError);
1073
1074 function TimeoutError() {
1075 _classCallCheck(this, TimeoutError);
1076
1077 return _possibleConstructorReturn(this, (TimeoutError.__proto__ || Object.getPrototypeOf(TimeoutError)).call(this, 'operation timed out'));
1078 }
1079
1080 return TimeoutError;
1081}(_makeError.BaseError);
1082
1083// Usage: promise::timeout(ms, cb)
1084
1085
1086function timeout(ms, cb) {
1087 var _this10 = this;
1088
1089 return new Promise(function (resolve, reject) {
1090 var handle = setTimeout(function () {
1091 handle = null;
1092
1093 if (typeof _this10.cancel === 'function') {
1094 _this10.cancel();
1095 }
1096
1097 if (cb) {
1098 try {
1099 resolve(cb());
1100 } catch (error) {
1101 reject(error);
1102 }
1103 } else {
1104 reject(new TimeoutError());
1105 }
1106 }, ms);
1107
1108 _wrap(_this10).then(function (value) {
1109 handle !== null && clearTimeout(handle);
1110 resolve(value);
1111 }, function (reason) {
1112 handle !== null && clearTimeout(handle);
1113 reject(reason);
1114 });
1115 });
1116}
1117
1118// -------------------------------------------------------------------
1119
1120var attempt = exports.attempt = function attempt(fn) {
1121 return new Promise(function (resolve) {
1122 return resolve(fn());
1123 });
1124};
1125exports.try = attempt;
1126
1127// -------------------------------------------------------------------
1128
1129// Usage: fn::unpromisify()
1130
1131function unpromisify() {
1132 var fn = this;
1133 return _setFunctionNameAndLength(function () {
1134 var n = arguments.length - 1;
1135 var cb = void 0;
1136 if (n < 0 || typeof (cb = arguments[n]) !== 'function') {
1137 throw new Error('missing callback');
1138 }
1139
1140 var args = new Array(n);
1141 for (var i = 0; i < n; ++i) {
1142 args[i] = arguments[i];
1143 }
1144
1145 wrapApply(fn, args, this).then(function (result) {
1146 return cb(null, result);
1147 }, function (reason) {
1148 return cb(reason);
1149 });
1150 }, fn.name, fn.length + 1);
1151}
1152//# sourceMappingURL=index.js.map
\No newline at end of file