react / wstein / node_modules / jest-cli / node_modules / jsdom / node_modules / request / node_modules / har-validator / node_modules / bluebird / js / main / promisify.js
81160 views"use strict";1module.exports = function(Promise, INTERNAL) {2var THIS = {};3var util = require("./util.js");4var nodebackForPromise = require("./promise_resolver.js")5._nodebackForPromise;6var withAppended = util.withAppended;7var maybeWrapAsError = util.maybeWrapAsError;8var canEvaluate = util.canEvaluate;9var TypeError = require("./errors").TypeError;10var defaultSuffix = "Async";11var defaultPromisified = {__isPromisified__: true};12var noCopyPropsPattern =13/^(?:length|name|arguments|caller|callee|prototype|__isPromisified__)$/;14var defaultFilter = function(name, func) {15return util.isIdentifier(name) &&16name.charAt(0) !== "_" &&17!util.isClass(func);18};1920function propsFilter(key) {21return !noCopyPropsPattern.test(key);22}2324function isPromisified(fn) {25try {26return fn.__isPromisified__ === true;27}28catch (e) {29return false;30}31}3233function hasPromisified(obj, key, suffix) {34var val = util.getDataPropertyOrDefault(obj, key + suffix,35defaultPromisified);36return val ? isPromisified(val) : false;37}38function checkValid(ret, suffix, suffixRegexp) {39for (var i = 0; i < ret.length; i += 2) {40var key = ret[i];41if (suffixRegexp.test(key)) {42var keyWithoutAsyncSuffix = key.replace(suffixRegexp, "");43for (var j = 0; j < ret.length; j += 2) {44if (ret[j] === keyWithoutAsyncSuffix) {45throw new TypeError("Cannot promisify an API that has normal methods with '%s'-suffix\u000a\u000a See http://goo.gl/iWrZbw\u000a"46.replace("%s", suffix));47}48}49}50}51}5253function promisifiableMethods(obj, suffix, suffixRegexp, filter) {54var keys = util.inheritedDataKeys(obj);55var ret = [];56for (var i = 0; i < keys.length; ++i) {57var key = keys[i];58var value = obj[key];59var passesDefaultFilter = filter === defaultFilter60? true : defaultFilter(key, value, obj);61if (typeof value === "function" &&62!isPromisified(value) &&63!hasPromisified(obj, key, suffix) &&64filter(key, value, obj, passesDefaultFilter)) {65ret.push(key, value);66}67}68checkValid(ret, suffix, suffixRegexp);69return ret;70}7172var escapeIdentRegex = function(str) {73return str.replace(/([$])/, "\\$");74};7576var makeNodePromisifiedEval;77if (!false) {78var switchCaseArgumentOrder = function(likelyArgumentCount) {79var ret = [likelyArgumentCount];80var min = Math.max(0, likelyArgumentCount - 1 - 3);81for(var i = likelyArgumentCount - 1; i >= min; --i) {82ret.push(i);83}84for(var i = likelyArgumentCount + 1; i <= 3; ++i) {85ret.push(i);86}87return ret;88};8990var argumentSequence = function(argumentCount) {91return util.filledRange(argumentCount, "_arg", "");92};9394var parameterDeclaration = function(parameterCount) {95return util.filledRange(96Math.max(parameterCount, 3), "_arg", "");97};9899var parameterCount = function(fn) {100if (typeof fn.length === "number") {101return Math.max(Math.min(fn.length, 1023 + 1), 0);102}103return 0;104};105106makeNodePromisifiedEval =107function(callback, receiver, originalName, fn) {108var newParameterCount = Math.max(0, parameterCount(fn) - 1);109var argumentOrder = switchCaseArgumentOrder(newParameterCount);110var shouldProxyThis = typeof callback === "string" || receiver === THIS;111112function generateCallForArgumentCount(count) {113var args = argumentSequence(count).join(", ");114var comma = count > 0 ? ", " : "";115var ret;116if (shouldProxyThis) {117ret = "ret = callback.call(this, {{args}}, nodeback); break;\n";118} else {119ret = receiver === undefined120? "ret = callback({{args}}, nodeback); break;\n"121: "ret = callback.call(receiver, {{args}}, nodeback); break;\n";122}123return ret.replace("{{args}}", args).replace(", ", comma);124}125126function generateArgumentSwitchCase() {127var ret = "";128for (var i = 0; i < argumentOrder.length; ++i) {129ret += "case " + argumentOrder[i] +":" +130generateCallForArgumentCount(argumentOrder[i]);131}132133ret += " \n\134default: \n\135var args = new Array(len + 1); \n\136var i = 0; \n\137for (var i = 0; i < len; ++i) { \n\138args[i] = arguments[i]; \n\139} \n\140args[i] = nodeback; \n\141[CodeForCall] \n\142break; \n\143".replace("[CodeForCall]", (shouldProxyThis144? "ret = callback.apply(this, args);\n"145: "ret = callback.apply(receiver, args);\n"));146return ret;147}148149var getFunctionCode = typeof callback === "string"150? ("this != null ? this['"+callback+"'] : fn")151: "fn";152153return new Function("Promise",154"fn",155"receiver",156"withAppended",157"maybeWrapAsError",158"nodebackForPromise",159"tryCatch",160"errorObj",161"INTERNAL","'use strict'; \n\162var ret = function (Parameters) { \n\163'use strict'; \n\164var len = arguments.length; \n\165var promise = new Promise(INTERNAL); \n\166promise._captureStackTrace(); \n\167var nodeback = nodebackForPromise(promise); \n\168var ret; \n\169var callback = tryCatch([GetFunctionCode]); \n\170switch(len) { \n\171[CodeForSwitchCase] \n\172} \n\173if (ret === errorObj) { \n\174promise._rejectCallback(maybeWrapAsError(ret.e), true, true);\n\175} \n\176return promise; \n\177}; \n\178ret.__isPromisified__ = true; \n\179return ret; \n\180"181.replace("Parameters", parameterDeclaration(newParameterCount))182.replace("[CodeForSwitchCase]", generateArgumentSwitchCase())183.replace("[GetFunctionCode]", getFunctionCode))(184Promise,185fn,186receiver,187withAppended,188maybeWrapAsError,189nodebackForPromise,190util.tryCatch,191util.errorObj,192INTERNAL193);194};195}196197function makeNodePromisifiedClosure(callback, receiver, _, fn) {198var defaultThis = (function() {return this;})();199var method = callback;200if (typeof method === "string") {201callback = fn;202}203function promisified() {204var _receiver = receiver;205if (receiver === THIS) _receiver = this;206var promise = new Promise(INTERNAL);207promise._captureStackTrace();208var cb = typeof method === "string" && this !== defaultThis209? this[method] : callback;210var fn = nodebackForPromise(promise);211try {212cb.apply(_receiver, withAppended(arguments, fn));213} catch(e) {214promise._rejectCallback(maybeWrapAsError(e), true, true);215}216return promise;217}218promisified.__isPromisified__ = true;219return promisified;220}221222var makeNodePromisified = canEvaluate223? makeNodePromisifiedEval224: makeNodePromisifiedClosure;225226function promisifyAll(obj, suffix, filter, promisifier) {227var suffixRegexp = new RegExp(escapeIdentRegex(suffix) + "$");228var methods =229promisifiableMethods(obj, suffix, suffixRegexp, filter);230231for (var i = 0, len = methods.length; i < len; i+= 2) {232var key = methods[i];233var fn = methods[i+1];234var promisifiedKey = key + suffix;235obj[promisifiedKey] = promisifier === makeNodePromisified236? makeNodePromisified(key, THIS, key, fn, suffix)237: promisifier(fn, function() {238return makeNodePromisified(key, THIS, key, fn, suffix);239});240}241util.toFastProperties(obj);242return obj;243}244245function promisify(callback, receiver) {246return makeNodePromisified(callback, receiver, undefined, callback);247}248249Promise.promisify = function (fn, receiver) {250if (typeof fn !== "function") {251throw new TypeError("fn must be a function\u000a\u000a See http://goo.gl/916lJJ\u000a");252}253if (isPromisified(fn)) {254return fn;255}256var ret = promisify(fn, arguments.length < 2 ? THIS : receiver);257util.copyDescriptors(fn, ret, propsFilter);258return ret;259};260261Promise.promisifyAll = function (target, options) {262if (typeof target !== "function" && typeof target !== "object") {263throw new TypeError("the target of promisifyAll must be an object or a function\u000a\u000a See http://goo.gl/9ITlV0\u000a");264}265options = Object(options);266var suffix = options.suffix;267if (typeof suffix !== "string") suffix = defaultSuffix;268var filter = options.filter;269if (typeof filter !== "function") filter = defaultFilter;270var promisifier = options.promisifier;271if (typeof promisifier !== "function") promisifier = makeNodePromisified;272273if (!util.isIdentifier(suffix)) {274throw new RangeError("suffix must be a valid identifier\u000a\u000a See http://goo.gl/8FZo5V\u000a");275}276277var keys = util.inheritedDataKeys(target);278for (var i = 0; i < keys.length; ++i) {279var value = target[keys[i]];280if (keys[i] !== "constructor" &&281util.isClass(value)) {282promisifyAll(value.prototype, suffix, filter, promisifier);283promisifyAll(value, suffix, filter, promisifier);284}285}286287return promisifyAll(target, suffix, filter, promisifier);288};289};290291292293