You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					119 lines
				
				3.0 KiB
			
		
		
			
		
	
	
					119 lines
				
				3.0 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								"use strict";
							 | 
						||
| 
								 | 
							
								module.exports = function(
							 | 
						||
| 
								 | 
							
								    Promise, PromiseArray, tryConvertToPromise, apiRejection) {
							 | 
						||
| 
								 | 
							
								var util = require("./util");
							 | 
						||
| 
								 | 
							
								var isObject = util.isObject;
							 | 
						||
| 
								 | 
							
								var es5 = require("./es5");
							 | 
						||
| 
								 | 
							
								var Es6Map;
							 | 
						||
| 
								 | 
							
								if (typeof Map === "function") Es6Map = Map;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var mapToEntries = (function() {
							 | 
						||
| 
								 | 
							
								    var index = 0;
							 | 
						||
| 
								 | 
							
								    var size = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    function extractEntry(value, key) {
							 | 
						||
| 
								 | 
							
								        this[index] = value;
							 | 
						||
| 
								 | 
							
								        this[index + size] = key;
							 | 
						||
| 
								 | 
							
								        index++;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return function mapToEntries(map) {
							 | 
						||
| 
								 | 
							
								        size = map.size;
							 | 
						||
| 
								 | 
							
								        index = 0;
							 | 
						||
| 
								 | 
							
								        var ret = new Array(map.size * 2);
							 | 
						||
| 
								 | 
							
								        map.forEach(extractEntry, ret);
							 | 
						||
| 
								 | 
							
								        return ret;
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								})();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var entriesToMap = function(entries) {
							 | 
						||
| 
								 | 
							
								    var ret = new Es6Map();
							 | 
						||
| 
								 | 
							
								    var length = entries.length / 2 | 0;
							 | 
						||
| 
								 | 
							
								    for (var i = 0; i < length; ++i) {
							 | 
						||
| 
								 | 
							
								        var key = entries[length + i];
							 | 
						||
| 
								 | 
							
								        var value = entries[i];
							 | 
						||
| 
								 | 
							
								        ret.set(key, value);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return ret;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function PropertiesPromiseArray(obj) {
							 | 
						||
| 
								 | 
							
								    var isMap = false;
							 | 
						||
| 
								 | 
							
								    var entries;
							 | 
						||
| 
								 | 
							
								    if (Es6Map !== undefined && obj instanceof Es6Map) {
							 | 
						||
| 
								 | 
							
								        entries = mapToEntries(obj);
							 | 
						||
| 
								 | 
							
								        isMap = true;
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								        var keys = es5.keys(obj);
							 | 
						||
| 
								 | 
							
								        var len = keys.length;
							 | 
						||
| 
								 | 
							
								        entries = new Array(len * 2);
							 | 
						||
| 
								 | 
							
								        for (var i = 0; i < len; ++i) {
							 | 
						||
| 
								 | 
							
								            var key = keys[i];
							 | 
						||
| 
								 | 
							
								            entries[i] = obj[key];
							 | 
						||
| 
								 | 
							
								            entries[i + len] = key;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    this.constructor$(entries);
							 | 
						||
| 
								 | 
							
								    this._isMap = isMap;
							 | 
						||
| 
								 | 
							
								    this._init$(undefined, isMap ? -6 : -3);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								util.inherits(PropertiesPromiseArray, PromiseArray);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								PropertiesPromiseArray.prototype._init = function () {};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								PropertiesPromiseArray.prototype._promiseFulfilled = function (value, index) {
							 | 
						||
| 
								 | 
							
								    this._values[index] = value;
							 | 
						||
| 
								 | 
							
								    var totalResolved = ++this._totalResolved;
							 | 
						||
| 
								 | 
							
								    if (totalResolved >= this._length) {
							 | 
						||
| 
								 | 
							
								        var val;
							 | 
						||
| 
								 | 
							
								        if (this._isMap) {
							 | 
						||
| 
								 | 
							
								            val = entriesToMap(this._values);
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            val = {};
							 | 
						||
| 
								 | 
							
								            var keyOffset = this.length();
							 | 
						||
| 
								 | 
							
								            for (var i = 0, len = this.length(); i < len; ++i) {
							 | 
						||
| 
								 | 
							
								                val[this._values[i + keyOffset]] = this._values[i];
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        this._resolve(val);
							 | 
						||
| 
								 | 
							
								        return true;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return false;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								PropertiesPromiseArray.prototype.shouldCopyValues = function () {
							 | 
						||
| 
								 | 
							
								    return false;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								PropertiesPromiseArray.prototype.getActualLength = function (len) {
							 | 
						||
| 
								 | 
							
								    return len >> 1;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function props(promises) {
							 | 
						||
| 
								 | 
							
								    var ret;
							 | 
						||
| 
								 | 
							
								    var castValue = tryConvertToPromise(promises);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (!isObject(castValue)) {
							 | 
						||
| 
								 | 
							
								        return apiRejection("cannot await properties of a non-object\u000a\u000a    See http://goo.gl/MqrFmX\u000a");
							 | 
						||
| 
								 | 
							
								    } else if (castValue instanceof Promise) {
							 | 
						||
| 
								 | 
							
								        ret = castValue._then(
							 | 
						||
| 
								 | 
							
								            Promise.props, undefined, undefined, undefined, undefined);
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								        ret = new PropertiesPromiseArray(castValue).promise();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (castValue instanceof Promise) {
							 | 
						||
| 
								 | 
							
								        ret._propagateFrom(castValue, 2);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return ret;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Promise.prototype.props = function () {
							 | 
						||
| 
								 | 
							
								    return props(this);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Promise.props = function (promises) {
							 | 
						||
| 
								 | 
							
								    return props(promises);
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								};
							 |