| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076 | // vim:ts=4:sts=4:sw=4:/*! * * Copyright 2009-2017 Kris Kowal under the terms of the MIT * license found at https://github.com/kriskowal/q/blob/v1/LICENSE * * With parts by Tyler Close * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found * at http://www.opensource.org/licenses/mit-license.html * Forked at ref_send.js version: 2009-05-11 * * With parts by Mark Miller * Copyright (C) 2011 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */(function (definition) {    "use strict";    // This file will function properly as a <script> tag, or a module    // using CommonJS and NodeJS or RequireJS module formats.  In    // Common/Node/RequireJS, the module exports the Q API and when    // executed as a simple <script>, it creates a Q global instead.    // Montage Require    if (typeof bootstrap === "function") {        bootstrap("promise", definition);    // CommonJS    } else if (typeof exports === "object" && typeof module === "object") {        module.exports = definition();    // RequireJS    } else if (typeof define === "function" && define.amd) {        define(definition);    // SES (Secure EcmaScript)    } else if (typeof ses !== "undefined") {        if (!ses.ok()) {            return;        } else {            ses.makeQ = definition;        }    // <script>    } else if (typeof window !== "undefined" || typeof self !== "undefined") {        // Prefer window over self for add-on scripts. Use self for        // non-windowed contexts.        var global = typeof window !== "undefined" ? window : self;        // Get the `window` object, save the previous Q global        // and initialize Q as a global.        var previousQ = global.Q;        global.Q = definition();        // Add a noConflict function so Q can be removed from the        // global namespace.        global.Q.noConflict = function () {            global.Q = previousQ;            return this;        };    } else {        throw new Error("This environment was not anticipated by Q. Please file a bug.");    }})(function () {"use strict";var hasStacks = false;try {    throw new Error();} catch (e) {    hasStacks = !!e.stack;}// All code after this point will be filtered from stack traces reported// by Q.var qStartingLine = captureLine();var qFileName;// shims// used for fallback in "allResolved"var noop = function () {};// Use the fastest possible means to execute a task in a future turn// of the event loop.var nextTick =(function () {    // linked list of tasks (single, with head node)    var head = {task: void 0, next: null};    var tail = head;    var flushing = false;    var requestTick = void 0;    var isNodeJS = false;    // queue for late tasks, used by unhandled rejection tracking    var laterQueue = [];    function flush() {        /* jshint loopfunc: true */        var task, domain;        while (head.next) {            head = head.next;            task = head.task;            head.task = void 0;            domain = head.domain;            if (domain) {                head.domain = void 0;                domain.enter();            }            runSingle(task, domain);        }        while (laterQueue.length) {            task = laterQueue.pop();            runSingle(task);        }        flushing = false;    }    // runs a single function in the async queue    function runSingle(task, domain) {        try {            task();        } catch (e) {            if (isNodeJS) {                // In node, uncaught exceptions are considered fatal errors.                // Re-throw them synchronously to interrupt flushing!                // Ensure continuation if the uncaught exception is suppressed                // listening "uncaughtException" events (as domains does).                // Continue in next event to avoid tick recursion.                if (domain) {                    domain.exit();                }                setTimeout(flush, 0);                if (domain) {                    domain.enter();                }                throw e;            } else {                // In browsers, uncaught exceptions are not fatal.                // Re-throw them asynchronously to avoid slow-downs.                setTimeout(function () {                    throw e;                }, 0);            }        }        if (domain) {            domain.exit();        }    }    nextTick = function (task) {        tail = tail.next = {            task: task,            domain: isNodeJS && process.domain,            next: null        };        if (!flushing) {            flushing = true;            requestTick();        }    };    if (typeof process === "object" &&        process.toString() === "[object process]" && process.nextTick) {        // Ensure Q is in a real Node environment, with a `process.nextTick`.        // To see through fake Node environments:        // * Mocha test runner - exposes a `process` global without a `nextTick`        // * Browserify - exposes a `process.nexTick` function that uses        //   `setTimeout`. In this case `setImmediate` is preferred because        //    it is faster. Browserify's `process.toString()` yields        //   "[object Object]", while in a real Node environment        //   `process.toString()` yields "[object process]".        isNodeJS = true;        requestTick = function () {            process.nextTick(flush);        };    } else if (typeof setImmediate === "function") {        // In IE10, Node.js 0.9+, or https://github.com/NobleJS/setImmediate        if (typeof window !== "undefined") {            requestTick = setImmediate.bind(window, flush);        } else {            requestTick = function () {                setImmediate(flush);            };        }    } else if (typeof MessageChannel !== "undefined") {        // modern browsers        // http://www.nonblocking.io/2011/06/windownexttick.html        var channel = new MessageChannel();        // At least Safari Version 6.0.5 (8536.30.1) intermittently cannot create        // working message ports the first time a page loads.        channel.port1.onmessage = function () {            requestTick = requestPortTick;            channel.port1.onmessage = flush;            flush();        };        var requestPortTick = function () {            // Opera requires us to provide a message payload, regardless of            // whether we use it.            channel.port2.postMessage(0);        };        requestTick = function () {            setTimeout(flush, 0);            requestPortTick();        };    } else {        // old browsers        requestTick = function () {            setTimeout(flush, 0);        };    }    // runs a task after all other tasks have been run    // this is useful for unhandled rejection tracking that needs to happen    // after all `then`d tasks have been run.    nextTick.runAfter = function (task) {        laterQueue.push(task);        if (!flushing) {            flushing = true;            requestTick();        }    };    return nextTick;})();// Attempt to make generics safe in the face of downstream// modifications.// There is no situation where this is necessary.// If you need a security guarantee, these primordials need to be// deeply frozen anyway, and if you don’t need a security guarantee,// this is just plain paranoid.// However, this **might** have the nice side-effect of reducing the size of// the minified code by reducing x.call() to merely x()// See Mark Miller’s explanation of what this does.// http://wiki.ecmascript.org/doku.php?id=conventions:safe_meta_programmingvar call = Function.call;function uncurryThis(f) {    return function () {        return call.apply(f, arguments);    };}// This is equivalent, but slower:// uncurryThis = Function_bind.bind(Function_bind.call);// http://jsperf.com/uncurrythisvar array_slice = uncurryThis(Array.prototype.slice);var array_reduce = uncurryThis(    Array.prototype.reduce || function (callback, basis) {        var index = 0,            length = this.length;        // concerning the initial value, if one is not provided        if (arguments.length === 1) {            // seek to the first value in the array, accounting            // for the possibility that is is a sparse array            do {                if (index in this) {                    basis = this[index++];                    break;                }                if (++index >= length) {                    throw new TypeError();                }            } while (1);        }        // reduce        for (; index < length; index++) {            // account for the possibility that the array is sparse            if (index in this) {                basis = callback(basis, this[index], index);            }        }        return basis;    });var array_indexOf = uncurryThis(    Array.prototype.indexOf || function (value) {        // not a very good shim, but good enough for our one use of it        for (var i = 0; i < this.length; i++) {            if (this[i] === value) {                return i;            }        }        return -1;    });var array_map = uncurryThis(    Array.prototype.map || function (callback, thisp) {        var self = this;        var collect = [];        array_reduce(self, function (undefined, value, index) {            collect.push(callback.call(thisp, value, index, self));        }, void 0);        return collect;    });var object_create = Object.create || function (prototype) {    function Type() { }    Type.prototype = prototype;    return new Type();};var object_defineProperty = Object.defineProperty || function (obj, prop, descriptor) {    obj[prop] = descriptor.value;    return obj;};var object_hasOwnProperty = uncurryThis(Object.prototype.hasOwnProperty);var object_keys = Object.keys || function (object) {    var keys = [];    for (var key in object) {        if (object_hasOwnProperty(object, key)) {            keys.push(key);        }    }    return keys;};var object_toString = uncurryThis(Object.prototype.toString);function isObject(value) {    return value === Object(value);}// generator related shims// FIXME: Remove this function once ES6 generators are in SpiderMonkey.function isStopIteration(exception) {    return (        object_toString(exception) === "[object StopIteration]" ||        exception instanceof QReturnValue    );}// FIXME: Remove this helper and Q.return once ES6 generators are in// SpiderMonkey.var QReturnValue;if (typeof ReturnValue !== "undefined") {    QReturnValue = ReturnValue;} else {    QReturnValue = function (value) {        this.value = value;    };}// long stack tracesvar STACK_JUMP_SEPARATOR = "From previous event:";function makeStackTraceLong(error, promise) {    // If possible, transform the error stack trace by removing Node and Q    // cruft, then concatenating with the stack trace of `promise`. See #57.    if (hasStacks &&        promise.stack &&        typeof error === "object" &&        error !== null &&        error.stack    ) {        var stacks = [];        for (var p = promise; !!p; p = p.source) {            if (p.stack && (!error.__minimumStackCounter__ || error.__minimumStackCounter__ > p.stackCounter)) {                object_defineProperty(error, "__minimumStackCounter__", {value: p.stackCounter, configurable: true});                stacks.unshift(p.stack);            }        }        stacks.unshift(error.stack);        var concatedStacks = stacks.join("\n" + STACK_JUMP_SEPARATOR + "\n");        var stack = filterStackString(concatedStacks);        object_defineProperty(error, "stack", {value: stack, configurable: true});    }}function filterStackString(stackString) {    var lines = stackString.split("\n");    var desiredLines = [];    for (var i = 0; i < lines.length; ++i) {        var line = lines[i];        if (!isInternalFrame(line) && !isNodeFrame(line) && line) {            desiredLines.push(line);        }    }    return desiredLines.join("\n");}function isNodeFrame(stackLine) {    return stackLine.indexOf("(module.js:") !== -1 ||           stackLine.indexOf("(node.js:") !== -1;}function getFileNameAndLineNumber(stackLine) {    // Named functions: "at functionName (filename:lineNumber:columnNumber)"    // In IE10 function name can have spaces ("Anonymous function") O_o    var attempt1 = /at .+ \((.+):(\d+):(?:\d+)\)$/.exec(stackLine);    if (attempt1) {        return [attempt1[1], Number(attempt1[2])];    }    // Anonymous functions: "at filename:lineNumber:columnNumber"    var attempt2 = /at ([^ ]+):(\d+):(?:\d+)$/.exec(stackLine);    if (attempt2) {        return [attempt2[1], Number(attempt2[2])];    }    // Firefox style: "function@filename:lineNumber or @filename:lineNumber"    var attempt3 = /.*@(.+):(\d+)$/.exec(stackLine);    if (attempt3) {        return [attempt3[1], Number(attempt3[2])];    }}function isInternalFrame(stackLine) {    var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);    if (!fileNameAndLineNumber) {        return false;    }    var fileName = fileNameAndLineNumber[0];    var lineNumber = fileNameAndLineNumber[1];    return fileName === qFileName &&        lineNumber >= qStartingLine &&        lineNumber <= qEndingLine;}// discover own file name and line number range for filtering stack// tracesfunction captureLine() {    if (!hasStacks) {        return;    }    try {        throw new Error();    } catch (e) {        var lines = e.stack.split("\n");        var firstLine = lines[0].indexOf("@") > 0 ? lines[1] : lines[2];        var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);        if (!fileNameAndLineNumber) {            return;        }        qFileName = fileNameAndLineNumber[0];        return fileNameAndLineNumber[1];    }}function deprecate(callback, name, alternative) {    return function () {        if (typeof console !== "undefined" &&            typeof console.warn === "function") {            console.warn(name + " is deprecated, use " + alternative +                         " instead.", new Error("").stack);        }        return callback.apply(callback, arguments);    };}// end of shims// beginning of real work/** * Constructs a promise for an immediate reference, passes promises through, or * coerces promises from different systems. * @param value immediate reference or promise */function Q(value) {    // If the object is already a Promise, return it directly.  This enables    // the resolve function to both be used to created references from objects,    // but to tolerably coerce non-promises to promises.    if (value instanceof Promise) {        return value;    }    // assimilate thenables    if (isPromiseAlike(value)) {        return coerce(value);    } else {        return fulfill(value);    }}Q.resolve = Q;/** * Performs a task in a future turn of the event loop. * @param {Function} task */Q.nextTick = nextTick;/** * Controls whether or not long stack traces will be on */Q.longStackSupport = false;/** * The counter is used to determine the stopping point for building * long stack traces. In makeStackTraceLong we walk backwards through * the linked list of promises, only stacks which were created before * the rejection are concatenated. */var longStackCounter = 1;// enable long stacks if Q_DEBUG is setif (typeof process === "object" && process && process.env && process.env.Q_DEBUG) {    Q.longStackSupport = true;}/** * Constructs a {promise, resolve, reject} object. * * `resolve` is a callback to invoke with a more resolved value for the * promise. To fulfill the promise, invoke `resolve` with any value that is * not a thenable. To reject the promise, invoke `resolve` with a rejected * thenable, or invoke `reject` with the reason directly. To resolve the * promise to another thenable, thus putting it in the same state, invoke * `resolve` with that other thenable. */Q.defer = defer;function defer() {    // if "messages" is an "Array", that indicates that the promise has not yet    // been resolved.  If it is "undefined", it has been resolved.  Each    // element of the messages array is itself an array of complete arguments to    // forward to the resolved promise.  We coerce the resolution value to a    // promise using the `resolve` function because it handles both fully    // non-thenable values and other thenables gracefully.    var messages = [], progressListeners = [], resolvedPromise;    var deferred = object_create(defer.prototype);    var promise = object_create(Promise.prototype);    promise.promiseDispatch = function (resolve, op, operands) {        var args = array_slice(arguments);        if (messages) {            messages.push(args);            if (op === "when" && operands[1]) { // progress operand                progressListeners.push(operands[1]);            }        } else {            Q.nextTick(function () {                resolvedPromise.promiseDispatch.apply(resolvedPromise, args);            });        }    };    // XXX deprecated    promise.valueOf = function () {        if (messages) {            return promise;        }        var nearerValue = nearer(resolvedPromise);        if (isPromise(nearerValue)) {            resolvedPromise = nearerValue; // shorten chain        }        return nearerValue;    };    promise.inspect = function () {        if (!resolvedPromise) {            return { state: "pending" };        }        return resolvedPromise.inspect();    };    if (Q.longStackSupport && hasStacks) {        try {            throw new Error();        } catch (e) {            // NOTE: don't try to use `Error.captureStackTrace` or transfer the            // accessor around; that causes memory leaks as per GH-111. Just            // reify the stack trace as a string ASAP.            //            // At the same time, cut off the first line; it's always just            // "[object Promise]\n", as per the `toString`.            promise.stack = e.stack.substring(e.stack.indexOf("\n") + 1);            promise.stackCounter = longStackCounter++;        }    }    // NOTE: we do the checks for `resolvedPromise` in each method, instead of    // consolidating them into `become`, since otherwise we'd create new    // promises with the lines `become(whatever(value))`. See e.g. GH-252.    function become(newPromise) {        resolvedPromise = newPromise;        if (Q.longStackSupport && hasStacks) {            // Only hold a reference to the new promise if long stacks            // are enabled to reduce memory usage            promise.source = newPromise;        }        array_reduce(messages, function (undefined, message) {            Q.nextTick(function () {                newPromise.promiseDispatch.apply(newPromise, message);            });        }, void 0);        messages = void 0;        progressListeners = void 0;    }    deferred.promise = promise;    deferred.resolve = function (value) {        if (resolvedPromise) {            return;        }        become(Q(value));    };    deferred.fulfill = function (value) {        if (resolvedPromise) {            return;        }        become(fulfill(value));    };    deferred.reject = function (reason) {        if (resolvedPromise) {            return;        }        become(reject(reason));    };    deferred.notify = function (progress) {        if (resolvedPromise) {            return;        }        array_reduce(progressListeners, function (undefined, progressListener) {            Q.nextTick(function () {                progressListener(progress);            });        }, void 0);    };    return deferred;}/** * Creates a Node-style callback that will resolve or reject the deferred * promise. * @returns a nodeback */defer.prototype.makeNodeResolver = function () {    var self = this;    return function (error, value) {        if (error) {            self.reject(error);        } else if (arguments.length > 2) {            self.resolve(array_slice(arguments, 1));        } else {            self.resolve(value);        }    };};/** * @param resolver {Function} a function that returns nothing and accepts * the resolve, reject, and notify functions for a deferred. * @returns a promise that may be resolved with the given resolve and reject * functions, or rejected by a thrown exception in resolver */Q.Promise = promise; // ES6Q.promise = promise;function promise(resolver) {    if (typeof resolver !== "function") {        throw new TypeError("resolver must be a function.");    }    var deferred = defer();    try {        resolver(deferred.resolve, deferred.reject, deferred.notify);    } catch (reason) {        deferred.reject(reason);    }    return deferred.promise;}promise.race = race; // ES6promise.all = all; // ES6promise.reject = reject; // ES6promise.resolve = Q; // ES6// XXX experimental.  This method is a way to denote that a local value is// serializable and should be immediately dispatched to a remote upon request,// instead of passing a reference.Q.passByCopy = function (object) {    //freeze(object);    //passByCopies.set(object, true);    return object;};Promise.prototype.passByCopy = function () {    //freeze(object);    //passByCopies.set(object, true);    return this;};/** * If two promises eventually fulfill to the same value, promises that value, * but otherwise rejects. * @param x {Any*} * @param y {Any*} * @returns {Any*} a promise for x and y if they are the same, but a rejection * otherwise. * */Q.join = function (x, y) {    return Q(x).join(y);};Promise.prototype.join = function (that) {    return Q([this, that]).spread(function (x, y) {        if (x === y) {            // TODO: "===" should be Object.is or equiv            return x;        } else {            throw new Error("Q can't join: not the same: " + x + " " + y);        }    });};/** * Returns a promise for the first of an array of promises to become settled. * @param answers {Array[Any*]} promises to race * @returns {Any*} the first promise to be settled */Q.race = race;function race(answerPs) {    return promise(function (resolve, reject) {        // Switch to this once we can assume at least ES5        // answerPs.forEach(function (answerP) {        //     Q(answerP).then(resolve, reject);        // });        // Use this in the meantime        for (var i = 0, len = answerPs.length; i < len; i++) {            Q(answerPs[i]).then(resolve, reject);        }    });}Promise.prototype.race = function () {    return this.then(Q.race);};/** * Constructs a Promise with a promise descriptor object and optional fallback * function.  The descriptor contains methods like when(rejected), get(name), * set(name, value), post(name, args), and delete(name), which all * return either a value, a promise for a value, or a rejection.  The fallback * accepts the operation name, a resolver, and any further arguments that would * have been forwarded to the appropriate method above had a method been * provided with the proper name.  The API makes no guarantees about the nature * of the returned object, apart from that it is usable whereever promises are * bought and sold. */Q.makePromise = Promise;function Promise(descriptor, fallback, inspect) {    if (fallback === void 0) {        fallback = function (op) {            return reject(new Error(                "Promise does not support operation: " + op            ));        };    }    if (inspect === void 0) {        inspect = function () {            return {state: "unknown"};        };    }    var promise = object_create(Promise.prototype);    promise.promiseDispatch = function (resolve, op, args) {        var result;        try {            if (descriptor[op]) {                result = descriptor[op].apply(promise, args);            } else {                result = fallback.call(promise, op, args);            }        } catch (exception) {            result = reject(exception);        }        if (resolve) {            resolve(result);        }    };    promise.inspect = inspect;    // XXX deprecated `valueOf` and `exception` support    if (inspect) {        var inspected = inspect();        if (inspected.state === "rejected") {            promise.exception = inspected.reason;        }        promise.valueOf = function () {            var inspected = inspect();            if (inspected.state === "pending" ||                inspected.state === "rejected") {                return promise;            }            return inspected.value;        };    }    return promise;}Promise.prototype.toString = function () {    return "[object Promise]";};Promise.prototype.then = function (fulfilled, rejected, progressed) {    var self = this;    var deferred = defer();    var done = false;   // ensure the untrusted promise makes at most a                        // single call to one of the callbacks    function _fulfilled(value) {        try {            return typeof fulfilled === "function" ? fulfilled(value) : value;        } catch (exception) {            return reject(exception);        }    }    function _rejected(exception) {        if (typeof rejected === "function") {            makeStackTraceLong(exception, self);            try {                return rejected(exception);            } catch (newException) {                return reject(newException);            }        }        return reject(exception);    }    function _progressed(value) {        return typeof progressed === "function" ? progressed(value) : value;    }    Q.nextTick(function () {        self.promiseDispatch(function (value) {            if (done) {                return;            }            done = true;            deferred.resolve(_fulfilled(value));        }, "when", [function (exception) {            if (done) {                return;            }            done = true;            deferred.resolve(_rejected(exception));        }]);    });    // Progress propagator need to be attached in the current tick.    self.promiseDispatch(void 0, "when", [void 0, function (value) {        var newValue;        var threw = false;        try {            newValue = _progressed(value);        } catch (e) {            threw = true;            if (Q.onerror) {                Q.onerror(e);            } else {                throw e;            }        }        if (!threw) {            deferred.notify(newValue);        }    }]);    return deferred.promise;};Q.tap = function (promise, callback) {    return Q(promise).tap(callback);};/** * Works almost like "finally", but not called for rejections. * Original resolution value is passed through callback unaffected. * Callback may return a promise that will be awaited for. * @param {Function} callback * @returns {Q.Promise} * @example * doSomething() *   .then(...) *   .tap(console.log) *   .then(...); */Promise.prototype.tap = function (callback) {    callback = Q(callback);    return this.then(function (value) {        return callback.fcall(value).thenResolve(value);    });};/** * Registers an observer on a promise. * * Guarantees: * * 1. that fulfilled and rejected will be called only once. * 2. that either the fulfilled callback or the rejected callback will be *    called, but not both. * 3. that fulfilled and rejected will not be called in this turn. * * @param value      promise or immediate reference to observe * @param fulfilled  function to be called with the fulfilled value * @param rejected   function to be called with the rejection exception * @param progressed function to be called on any progress notifications * @return promise for the return value from the invoked callback */Q.when = when;function when(value, fulfilled, rejected, progressed) {    return Q(value).then(fulfilled, rejected, progressed);}Promise.prototype.thenResolve = function (value) {    return this.then(function () { return value; });};Q.thenResolve = function (promise, value) {    return Q(promise).thenResolve(value);};Promise.prototype.thenReject = function (reason) {    return this.then(function () { throw reason; });};Q.thenReject = function (promise, reason) {    return Q(promise).thenReject(reason);};/** * If an object is not a promise, it is as "near" as possible. * If a promise is rejected, it is as "near" as possible too. * If it’s a fulfilled promise, the fulfillment value is nearer. * If it’s a deferred promise and the deferred has been resolved, the * resolution is "nearer". * @param object * @returns most resolved (nearest) form of the object */// XXX should we re-do this?Q.nearer = nearer;function nearer(value) {    if (isPromise(value)) {        var inspected = value.inspect();        if (inspected.state === "fulfilled") {            return inspected.value;        }    }    return value;}/** * @returns whether the given object is a promise. * Otherwise it is a fulfilled value. */Q.isPromise = isPromise;function isPromise(object) {    return object instanceof Promise;}Q.isPromiseAlike = isPromiseAlike;function isPromiseAlike(object) {    return isObject(object) && typeof object.then === "function";}/** * @returns whether the given object is a pending promise, meaning not * fulfilled or rejected. */Q.isPending = isPending;function isPending(object) {    return isPromise(object) && object.inspect().state === "pending";}Promise.prototype.isPending = function () {    return this.inspect().state === "pending";};/** * @returns whether the given object is a value or fulfilled * promise. */Q.isFulfilled = isFulfilled;function isFulfilled(object) {    return !isPromise(object) || object.inspect().state === "fulfilled";}Promise.prototype.isFulfilled = function () {    return this.inspect().state === "fulfilled";};/** * @returns whether the given object is a rejected promise. */Q.isRejected = isRejected;function isRejected(object) {    return isPromise(object) && object.inspect().state === "rejected";}Promise.prototype.isRejected = function () {    return this.inspect().state === "rejected";};//// BEGIN UNHANDLED REJECTION TRACKING// This promise library consumes exceptions thrown in handlers so they can be// handled by a subsequent promise.  The exceptions get added to this array when// they are created, and removed when they are handled.  Note that in ES6 or// shimmed environments, this would naturally be a `Set`.var unhandledReasons = [];var unhandledRejections = [];var reportedUnhandledRejections = [];var trackUnhandledRejections = true;function resetUnhandledRejections() {    unhandledReasons.length = 0;    unhandledRejections.length = 0;    if (!trackUnhandledRejections) {        trackUnhandledRejections = true;    }}function trackRejection(promise, reason) {    if (!trackUnhandledRejections) {        return;    }    if (typeof process === "object" && typeof process.emit === "function") {        Q.nextTick.runAfter(function () {            if (array_indexOf(unhandledRejections, promise) !== -1) {                process.emit("unhandledRejection", reason, promise);                reportedUnhandledRejections.push(promise);            }        });    }    unhandledRejections.push(promise);    if (reason && typeof reason.stack !== "undefined") {        unhandledReasons.push(reason.stack);    } else {        unhandledReasons.push("(no stack) " + reason);    }}function untrackRejection(promise) {    if (!trackUnhandledRejections) {        return;    }    var at = array_indexOf(unhandledRejections, promise);    if (at !== -1) {        if (typeof process === "object" && typeof process.emit === "function") {            Q.nextTick.runAfter(function () {                var atReport = array_indexOf(reportedUnhandledRejections, promise);                if (atReport !== -1) {                    process.emit("rejectionHandled", unhandledReasons[at], promise);                    reportedUnhandledRejections.splice(atReport, 1);                }            });        }        unhandledRejections.splice(at, 1);        unhandledReasons.splice(at, 1);    }}Q.resetUnhandledRejections = resetUnhandledRejections;Q.getUnhandledReasons = function () {    // Make a copy so that consumers can't interfere with our internal state.    return unhandledReasons.slice();};Q.stopUnhandledRejectionTracking = function () {    resetUnhandledRejections();    trackUnhandledRejections = false;};resetUnhandledRejections();//// END UNHANDLED REJECTION TRACKING/** * Constructs a rejected promise. * @param reason value describing the failure */Q.reject = reject;function reject(reason) {    var rejection = Promise({        "when": function (rejected) {            // note that the error has been handled            if (rejected) {                untrackRejection(this);            }            return rejected ? rejected(reason) : this;        }    }, function fallback() {        return this;    }, function inspect() {        return { state: "rejected", reason: reason };    });    // Note that the reason has not been handled.    trackRejection(rejection, reason);    return rejection;}/** * Constructs a fulfilled promise for an immediate reference. * @param value immediate reference */Q.fulfill = fulfill;function fulfill(value) {    return Promise({        "when": function () {            return value;        },        "get": function (name) {            return value[name];        },        "set": function (name, rhs) {            value[name] = rhs;        },        "delete": function (name) {            delete value[name];        },        "post": function (name, args) {            // Mark Miller proposes that post with no name should apply a            // promised function.            if (name === null || name === void 0) {                return value.apply(void 0, args);            } else {                return value[name].apply(value, args);            }        },        "apply": function (thisp, args) {            return value.apply(thisp, args);        },        "keys": function () {            return object_keys(value);        }    }, void 0, function inspect() {        return { state: "fulfilled", value: value };    });}/** * Converts thenables to Q promises. * @param promise thenable promise * @returns a Q promise */function coerce(promise) {    var deferred = defer();    Q.nextTick(function () {        try {            promise.then(deferred.resolve, deferred.reject, deferred.notify);        } catch (exception) {            deferred.reject(exception);        }    });    return deferred.promise;}/** * Annotates an object such that it will never be * transferred away from this process over any promise * communication channel. * @param object * @returns promise a wrapping of that object that * additionally responds to the "isDef" message * without a rejection. */Q.master = master;function master(object) {    return Promise({        "isDef": function () {}    }, function fallback(op, args) {        return dispatch(object, op, args);    }, function () {        return Q(object).inspect();    });}/** * Spreads the values of a promised array of arguments into the * fulfillment callback. * @param fulfilled callback that receives variadic arguments from the * promised array * @param rejected callback that receives the exception if the promise * is rejected. * @returns a promise for the return value or thrown exception of * either callback. */Q.spread = spread;function spread(value, fulfilled, rejected) {    return Q(value).spread(fulfilled, rejected);}Promise.prototype.spread = function (fulfilled, rejected) {    return this.all().then(function (array) {        return fulfilled.apply(void 0, array);    }, rejected);};/** * The async function is a decorator for generator functions, turning * them into asynchronous generators.  Although generators are only part * of the newest ECMAScript 6 drafts, this code does not cause syntax * errors in older engines.  This code should continue to work and will * in fact improve over time as the language improves. * * ES6 generators are currently part of V8 version 3.19 with the * --harmony-generators runtime flag enabled.  SpiderMonkey has had them * for longer, but under an older Python-inspired form.  This function * works on both kinds of generators. * * Decorates a generator function such that: *  - it may yield promises *  - execution will continue when that promise is fulfilled *  - the value of the yield expression will be the fulfilled value *  - it returns a promise for the return value (when the generator *    stops iterating) *  - the decorated function returns a promise for the return value *    of the generator or the first rejected promise among those *    yielded. *  - if an error is thrown in the generator, it propagates through *    every following yield until it is caught, or until it escapes *    the generator function altogether, and is translated into a *    rejection for the promise returned by the decorated generator. */Q.async = async;function async(makeGenerator) {    return function () {        // when verb is "send", arg is a value        // when verb is "throw", arg is an exception        function continuer(verb, arg) {            var result;            // Until V8 3.19 / Chromium 29 is released, SpiderMonkey is the only            // engine that has a deployed base of browsers that support generators.            // However, SM's generators use the Python-inspired semantics of            // outdated ES6 drafts.  We would like to support ES6, but we'd also            // like to make it possible to use generators in deployed browsers, so            // we also support Python-style generators.  At some point we can remove            // this block.            if (typeof StopIteration === "undefined") {                // ES6 Generators                try {                    result = generator[verb](arg);                } catch (exception) {                    return reject(exception);                }                if (result.done) {                    return Q(result.value);                } else {                    return when(result.value, callback, errback);                }            } else {                // SpiderMonkey Generators                // FIXME: Remove this case when SM does ES6 generators.                try {                    result = generator[verb](arg);                } catch (exception) {                    if (isStopIteration(exception)) {                        return Q(exception.value);                    } else {                        return reject(exception);                    }                }                return when(result, callback, errback);            }        }        var generator = makeGenerator.apply(this, arguments);        var callback = continuer.bind(continuer, "next");        var errback = continuer.bind(continuer, "throw");        return callback();    };}/** * The spawn function is a small wrapper around async that immediately * calls the generator and also ends the promise chain, so that any * unhandled errors are thrown instead of forwarded to the error * handler. This is useful because it's extremely common to run * generators at the top-level to work with libraries. */Q.spawn = spawn;function spawn(makeGenerator) {    Q.done(Q.async(makeGenerator)());}// FIXME: Remove this interface once ES6 generators are in SpiderMonkey./** * Throws a ReturnValue exception to stop an asynchronous generator. * * This interface is a stop-gap measure to support generator return * values in older Firefox/SpiderMonkey.  In browsers that support ES6 * generators like Chromium 29, just use "return" in your generator * functions. * * @param value the return value for the surrounding generator * @throws ReturnValue exception with the value. * @example * // ES6 style * Q.async(function* () { *      var foo = yield getFooPromise(); *      var bar = yield getBarPromise(); *      return foo + bar; * }) * // Older SpiderMonkey style * Q.async(function () { *      var foo = yield getFooPromise(); *      var bar = yield getBarPromise(); *      Q.return(foo + bar); * }) */Q["return"] = _return;function _return(value) {    throw new QReturnValue(value);}/** * The promised function decorator ensures that any promise arguments * are settled and passed as values (`this` is also settled and passed * as a value).  It will also ensure that the result of a function is * always a promise. * * @example * var add = Q.promised(function (a, b) { *     return a + b; * }); * add(Q(a), Q(B)); * * @param {function} callback The function to decorate * @returns {function} a function that has been decorated. */Q.promised = promised;function promised(callback) {    return function () {        return spread([this, all(arguments)], function (self, args) {            return callback.apply(self, args);        });    };}/** * sends a message to a value in a future turn * @param object* the recipient * @param op the name of the message operation, e.g., "when", * @param args further arguments to be forwarded to the operation * @returns result {Promise} a promise for the result of the operation */Q.dispatch = dispatch;function dispatch(object, op, args) {    return Q(object).dispatch(op, args);}Promise.prototype.dispatch = function (op, args) {    var self = this;    var deferred = defer();    Q.nextTick(function () {        self.promiseDispatch(deferred.resolve, op, args);    });    return deferred.promise;};/** * Gets the value of a property in a future turn. * @param object    promise or immediate reference for target object * @param name      name of property to get * @return promise for the property value */Q.get = function (object, key) {    return Q(object).dispatch("get", [key]);};Promise.prototype.get = function (key) {    return this.dispatch("get", [key]);};/** * Sets the value of a property in a future turn. * @param object    promise or immediate reference for object object * @param name      name of property to set * @param value     new value of property * @return promise for the return value */Q.set = function (object, key, value) {    return Q(object).dispatch("set", [key, value]);};Promise.prototype.set = function (key, value) {    return this.dispatch("set", [key, value]);};/** * Deletes a property in a future turn. * @param object    promise or immediate reference for target object * @param name      name of property to delete * @return promise for the return value */Q.del = // XXX legacyQ["delete"] = function (object, key) {    return Q(object).dispatch("delete", [key]);};Promise.prototype.del = // XXX legacyPromise.prototype["delete"] = function (key) {    return this.dispatch("delete", [key]);};/** * Invokes a method in a future turn. * @param object    promise or immediate reference for target object * @param name      name of method to invoke * @param value     a value to post, typically an array of *                  invocation arguments for promises that *                  are ultimately backed with `resolve` values, *                  as opposed to those backed with URLs *                  wherein the posted value can be any *                  JSON serializable object. * @return promise for the return value */// bound locally because it is used by other methodsQ.mapply = // XXX As proposed by "Redsandro"Q.post = function (object, name, args) {    return Q(object).dispatch("post", [name, args]);};Promise.prototype.mapply = // XXX As proposed by "Redsandro"Promise.prototype.post = function (name, args) {    return this.dispatch("post", [name, args]);};/** * Invokes a method in a future turn. * @param object    promise or immediate reference for target object * @param name      name of method to invoke * @param ...args   array of invocation arguments * @return promise for the return value */Q.send = // XXX Mark Miller's proposed parlanceQ.mcall = // XXX As proposed by "Redsandro"Q.invoke = function (object, name /*...args*/) {    return Q(object).dispatch("post", [name, array_slice(arguments, 2)]);};Promise.prototype.send = // XXX Mark Miller's proposed parlancePromise.prototype.mcall = // XXX As proposed by "Redsandro"Promise.prototype.invoke = function (name /*...args*/) {    return this.dispatch("post", [name, array_slice(arguments, 1)]);};/** * Applies the promised function in a future turn. * @param object    promise or immediate reference for target function * @param args      array of application arguments */Q.fapply = function (object, args) {    return Q(object).dispatch("apply", [void 0, args]);};Promise.prototype.fapply = function (args) {    return this.dispatch("apply", [void 0, args]);};/** * Calls the promised function in a future turn. * @param object    promise or immediate reference for target function * @param ...args   array of application arguments */Q["try"] =Q.fcall = function (object /* ...args*/) {    return Q(object).dispatch("apply", [void 0, array_slice(arguments, 1)]);};Promise.prototype.fcall = function (/*...args*/) {    return this.dispatch("apply", [void 0, array_slice(arguments)]);};/** * Binds the promised function, transforming return values into a fulfilled * promise and thrown errors into a rejected one. * @param object    promise or immediate reference for target function * @param ...args   array of application arguments */Q.fbind = function (object /*...args*/) {    var promise = Q(object);    var args = array_slice(arguments, 1);    return function fbound() {        return promise.dispatch("apply", [            this,            args.concat(array_slice(arguments))        ]);    };};Promise.prototype.fbind = function (/*...args*/) {    var promise = this;    var args = array_slice(arguments);    return function fbound() {        return promise.dispatch("apply", [            this,            args.concat(array_slice(arguments))        ]);    };};/** * Requests the names of the owned properties of a promised * object in a future turn. * @param object    promise or immediate reference for target object * @return promise for the keys of the eventually settled object */Q.keys = function (object) {    return Q(object).dispatch("keys", []);};Promise.prototype.keys = function () {    return this.dispatch("keys", []);};/** * Turns an array of promises into a promise for an array.  If any of * the promises gets rejected, the whole array is rejected immediately. * @param {Array*} an array (or promise for an array) of values (or * promises for values) * @returns a promise for an array of the corresponding values */// By Mark Miller// http://wiki.ecmascript.org/doku.php?id=strawman:concurrency&rev=1308776521#allfulfilledQ.all = all;function all(promises) {    return when(promises, function (promises) {        var pendingCount = 0;        var deferred = defer();        array_reduce(promises, function (undefined, promise, index) {            var snapshot;            if (                isPromise(promise) &&                (snapshot = promise.inspect()).state === "fulfilled"            ) {                promises[index] = snapshot.value;            } else {                ++pendingCount;                when(                    promise,                    function (value) {                        promises[index] = value;                        if (--pendingCount === 0) {                            deferred.resolve(promises);                        }                    },                    deferred.reject,                    function (progress) {                        deferred.notify({ index: index, value: progress });                    }                );            }        }, void 0);        if (pendingCount === 0) {            deferred.resolve(promises);        }        return deferred.promise;    });}Promise.prototype.all = function () {    return all(this);};/** * Returns the first resolved promise of an array. Prior rejected promises are * ignored.  Rejects only if all promises are rejected. * @param {Array*} an array containing values or promises for values * @returns a promise fulfilled with the value of the first resolved promise, * or a rejected promise if all promises are rejected. */Q.any = any;function any(promises) {    if (promises.length === 0) {        return Q.resolve();    }    var deferred = Q.defer();    var pendingCount = 0;    array_reduce(promises, function (prev, current, index) {        var promise = promises[index];        pendingCount++;        when(promise, onFulfilled, onRejected, onProgress);        function onFulfilled(result) {            deferred.resolve(result);        }        function onRejected(err) {            pendingCount--;            if (pendingCount === 0) {                var rejection = err || new Error("" + err);                rejection.message = ("Q can't get fulfillment value from any promise, all " +                    "promises were rejected. Last error message: " + rejection.message);                deferred.reject(rejection);            }        }        function onProgress(progress) {            deferred.notify({                index: index,                value: progress            });        }    }, undefined);    return deferred.promise;}Promise.prototype.any = function () {    return any(this);};/** * Waits for all promises to be settled, either fulfilled or * rejected.  This is distinct from `all` since that would stop * waiting at the first rejection.  The promise returned by * `allResolved` will never be rejected. * @param promises a promise for an array (or an array) of promises * (or values) * @return a promise for an array of promises */Q.allResolved = deprecate(allResolved, "allResolved", "allSettled");function allResolved(promises) {    return when(promises, function (promises) {        promises = array_map(promises, Q);        return when(all(array_map(promises, function (promise) {            return when(promise, noop, noop);        })), function () {            return promises;        });    });}Promise.prototype.allResolved = function () {    return allResolved(this);};/** * @see Promise#allSettled */Q.allSettled = allSettled;function allSettled(promises) {    return Q(promises).allSettled();}/** * Turns an array of promises into a promise for an array of their states (as * returned by `inspect`) when they have all settled. * @param {Array[Any*]} values an array (or promise for an array) of values (or * promises for values) * @returns {Array[State]} an array of states for the respective values. */Promise.prototype.allSettled = function () {    return this.then(function (promises) {        return all(array_map(promises, function (promise) {            promise = Q(promise);            function regardless() {                return promise.inspect();            }            return promise.then(regardless, regardless);        }));    });};/** * Captures the failure of a promise, giving an oportunity to recover * with a callback.  If the given promise is fulfilled, the returned * promise is fulfilled. * @param {Any*} promise for something * @param {Function} callback to fulfill the returned promise if the * given promise is rejected * @returns a promise for the return value of the callback */Q.fail = // XXX legacyQ["catch"] = function (object, rejected) {    return Q(object).then(void 0, rejected);};Promise.prototype.fail = // XXX legacyPromise.prototype["catch"] = function (rejected) {    return this.then(void 0, rejected);};/** * Attaches a listener that can respond to progress notifications from a * promise's originating deferred. This listener receives the exact arguments * passed to ``deferred.notify``. * @param {Any*} promise for something * @param {Function} callback to receive any progress notifications * @returns the given promise, unchanged */Q.progress = progress;function progress(object, progressed) {    return Q(object).then(void 0, void 0, progressed);}Promise.prototype.progress = function (progressed) {    return this.then(void 0, void 0, progressed);};/** * Provides an opportunity to observe the settling of a promise, * regardless of whether the promise is fulfilled or rejected.  Forwards * the resolution to the returned promise when the callback is done. * The callback can return a promise to defer completion. * @param {Any*} promise * @param {Function} callback to observe the resolution of the given * promise, takes no arguments. * @returns a promise for the resolution of the given promise when * ``fin`` is done. */Q.fin = // XXX legacyQ["finally"] = function (object, callback) {    return Q(object)["finally"](callback);};Promise.prototype.fin = // XXX legacyPromise.prototype["finally"] = function (callback) {    if (!callback || typeof callback.apply !== "function") {        throw new Error("Q can't apply finally callback");    }    callback = Q(callback);    return this.then(function (value) {        return callback.fcall().then(function () {            return value;        });    }, function (reason) {        // TODO attempt to recycle the rejection with "this".        return callback.fcall().then(function () {            throw reason;        });    });};/** * Terminates a chain of promises, forcing rejections to be * thrown as exceptions. * @param {Any*} promise at the end of a chain of promises * @returns nothing */Q.done = function (object, fulfilled, rejected, progress) {    return Q(object).done(fulfilled, rejected, progress);};Promise.prototype.done = function (fulfilled, rejected, progress) {    var onUnhandledError = function (error) {        // forward to a future turn so that ``when``        // does not catch it and turn it into a rejection.        Q.nextTick(function () {            makeStackTraceLong(error, promise);            if (Q.onerror) {                Q.onerror(error);            } else {                throw error;            }        });    };    // Avoid unnecessary `nextTick`ing via an unnecessary `when`.    var promise = fulfilled || rejected || progress ?        this.then(fulfilled, rejected, progress) :        this;    if (typeof process === "object" && process && process.domain) {        onUnhandledError = process.domain.bind(onUnhandledError);    }    promise.then(void 0, onUnhandledError);};/** * Causes a promise to be rejected if it does not get fulfilled before * some milliseconds time out. * @param {Any*} promise * @param {Number} milliseconds timeout * @param {Any*} custom error message or Error object (optional) * @returns a promise for the resolution of the given promise if it is * fulfilled before the timeout, otherwise rejected. */Q.timeout = function (object, ms, error) {    return Q(object).timeout(ms, error);};Promise.prototype.timeout = function (ms, error) {    var deferred = defer();    var timeoutId = setTimeout(function () {        if (!error || "string" === typeof error) {            error = new Error(error || "Timed out after " + ms + " ms");            error.code = "ETIMEDOUT";        }        deferred.reject(error);    }, ms);    this.then(function (value) {        clearTimeout(timeoutId);        deferred.resolve(value);    }, function (exception) {        clearTimeout(timeoutId);        deferred.reject(exception);    }, deferred.notify);    return deferred.promise;};/** * Returns a promise for the given value (or promised value), some * milliseconds after it resolved. Passes rejections immediately. * @param {Any*} promise * @param {Number} milliseconds * @returns a promise for the resolution of the given promise after milliseconds * time has elapsed since the resolution of the given promise. * If the given promise rejects, that is passed immediately. */Q.delay = function (object, timeout) {    if (timeout === void 0) {        timeout = object;        object = void 0;    }    return Q(object).delay(timeout);};Promise.prototype.delay = function (timeout) {    return this.then(function (value) {        var deferred = defer();        setTimeout(function () {            deferred.resolve(value);        }, timeout);        return deferred.promise;    });};/** * Passes a continuation to a Node function, which is called with the given * arguments provided as an array, and returns a promise. * *      Q.nfapply(FS.readFile, [__filename]) *      .then(function (content) { *      }) * */Q.nfapply = function (callback, args) {    return Q(callback).nfapply(args);};Promise.prototype.nfapply = function (args) {    var deferred = defer();    var nodeArgs = array_slice(args);    nodeArgs.push(deferred.makeNodeResolver());    this.fapply(nodeArgs).fail(deferred.reject);    return deferred.promise;};/** * Passes a continuation to a Node function, which is called with the given * arguments provided individually, and returns a promise. * @example * Q.nfcall(FS.readFile, __filename) * .then(function (content) { * }) * */Q.nfcall = function (callback /*...args*/) {    var args = array_slice(arguments, 1);    return Q(callback).nfapply(args);};Promise.prototype.nfcall = function (/*...args*/) {    var nodeArgs = array_slice(arguments);    var deferred = defer();    nodeArgs.push(deferred.makeNodeResolver());    this.fapply(nodeArgs).fail(deferred.reject);    return deferred.promise;};/** * Wraps a NodeJS continuation passing function and returns an equivalent * version that returns a promise. * @example * Q.nfbind(FS.readFile, __filename)("utf-8") * .then(console.log) * .done() */Q.nfbind =Q.denodeify = function (callback /*...args*/) {    if (callback === undefined) {        throw new Error("Q can't wrap an undefined function");    }    var baseArgs = array_slice(arguments, 1);    return function () {        var nodeArgs = baseArgs.concat(array_slice(arguments));        var deferred = defer();        nodeArgs.push(deferred.makeNodeResolver());        Q(callback).fapply(nodeArgs).fail(deferred.reject);        return deferred.promise;    };};Promise.prototype.nfbind =Promise.prototype.denodeify = function (/*...args*/) {    var args = array_slice(arguments);    args.unshift(this);    return Q.denodeify.apply(void 0, args);};Q.nbind = function (callback, thisp /*...args*/) {    var baseArgs = array_slice(arguments, 2);    return function () {        var nodeArgs = baseArgs.concat(array_slice(arguments));        var deferred = defer();        nodeArgs.push(deferred.makeNodeResolver());        function bound() {            return callback.apply(thisp, arguments);        }        Q(bound).fapply(nodeArgs).fail(deferred.reject);        return deferred.promise;    };};Promise.prototype.nbind = function (/*thisp, ...args*/) {    var args = array_slice(arguments, 0);    args.unshift(this);    return Q.nbind.apply(void 0, args);};/** * Calls a method of a Node-style object that accepts a Node-style * callback with a given array of arguments, plus a provided callback. * @param object an object that has the named method * @param {String} name name of the method of object * @param {Array} args arguments to pass to the method; the callback * will be provided by Q and appended to these arguments. * @returns a promise for the value or error */Q.nmapply = // XXX As proposed by "Redsandro"Q.npost = function (object, name, args) {    return Q(object).npost(name, args);};Promise.prototype.nmapply = // XXX As proposed by "Redsandro"Promise.prototype.npost = function (name, args) {    var nodeArgs = array_slice(args || []);    var deferred = defer();    nodeArgs.push(deferred.makeNodeResolver());    this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);    return deferred.promise;};/** * Calls a method of a Node-style object that accepts a Node-style * callback, forwarding the given variadic arguments, plus a provided * callback argument. * @param object an object that has the named method * @param {String} name name of the method of object * @param ...args arguments to pass to the method; the callback will * be provided by Q and appended to these arguments. * @returns a promise for the value or error */Q.nsend = // XXX Based on Mark Miller's proposed "send"Q.nmcall = // XXX Based on "Redsandro's" proposalQ.ninvoke = function (object, name /*...args*/) {    var nodeArgs = array_slice(arguments, 2);    var deferred = defer();    nodeArgs.push(deferred.makeNodeResolver());    Q(object).dispatch("post", [name, nodeArgs]).fail(deferred.reject);    return deferred.promise;};Promise.prototype.nsend = // XXX Based on Mark Miller's proposed "send"Promise.prototype.nmcall = // XXX Based on "Redsandro's" proposalPromise.prototype.ninvoke = function (name /*...args*/) {    var nodeArgs = array_slice(arguments, 1);    var deferred = defer();    nodeArgs.push(deferred.makeNodeResolver());    this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);    return deferred.promise;};/** * If a function would like to support both Node continuation-passing-style and * promise-returning-style, it can end its internal promise chain with * `nodeify(nodeback)`, forwarding the optional nodeback argument.  If the user * elects to use a nodeback, the result will be sent there.  If they do not * pass a nodeback, they will receive the result promise. * @param object a result (or a promise for a result) * @param {Function} nodeback a Node.js-style callback * @returns either the promise or nothing */Q.nodeify = nodeify;function nodeify(object, nodeback) {    return Q(object).nodeify(nodeback);}Promise.prototype.nodeify = function (nodeback) {    if (nodeback) {        this.then(function (value) {            Q.nextTick(function () {                nodeback(null, value);            });        }, function (error) {            Q.nextTick(function () {                nodeback(error);            });        });    } else {        return this;    }};Q.noConflict = function() {    throw new Error("Q.noConflict only works when Q is used as a global");};// All code before this point will be filtered from stack traces.var qEndingLine = captureLine();return Q;});
 |