react / wstein / node_modules / jest-cli / node_modules / jsdom / node_modules / request / node_modules / har-validator / node_modules / bluebird / js / main / using.js
81160 views"use strict";1module.exports = function (Promise, apiRejection, tryConvertToPromise,2createContext) {3var TypeError = require("./errors.js").TypeError;4var inherits = require("./util.js").inherits;5var PromiseInspection = Promise.PromiseInspection;67function inspectionMapper(inspections) {8var len = inspections.length;9for (var i = 0; i < len; ++i) {10var inspection = inspections[i];11if (inspection.isRejected()) {12return Promise.reject(inspection.error());13}14inspections[i] = inspection._settledValue;15}16return inspections;17}1819function thrower(e) {20setTimeout(function(){throw e;}, 0);21}2223function castPreservingDisposable(thenable) {24var maybePromise = tryConvertToPromise(thenable);25if (maybePromise !== thenable &&26typeof thenable._isDisposable === "function" &&27typeof thenable._getDisposer === "function" &&28thenable._isDisposable()) {29maybePromise._setDisposable(thenable._getDisposer());30}31return maybePromise;32}33function dispose(resources, inspection) {34var i = 0;35var len = resources.length;36var ret = Promise.defer();37function iterator() {38if (i >= len) return ret.resolve();39var maybePromise = castPreservingDisposable(resources[i++]);40if (maybePromise instanceof Promise &&41maybePromise._isDisposable()) {42try {43maybePromise = tryConvertToPromise(44maybePromise._getDisposer().tryDispose(inspection),45resources.promise);46} catch (e) {47return thrower(e);48}49if (maybePromise instanceof Promise) {50return maybePromise._then(iterator, thrower,51null, null, null);52}53}54iterator();55}56iterator();57return ret.promise;58}5960function disposerSuccess(value) {61var inspection = new PromiseInspection();62inspection._settledValue = value;63inspection._bitField = 268435456;64return dispose(this, inspection).thenReturn(value);65}6667function disposerFail(reason) {68var inspection = new PromiseInspection();69inspection._settledValue = reason;70inspection._bitField = 134217728;71return dispose(this, inspection).thenThrow(reason);72}7374function Disposer(data, promise, context) {75this._data = data;76this._promise = promise;77this._context = context;78}7980Disposer.prototype.data = function () {81return this._data;82};8384Disposer.prototype.promise = function () {85return this._promise;86};8788Disposer.prototype.resource = function () {89if (this.promise().isFulfilled()) {90return this.promise().value();91}92return null;93};9495Disposer.prototype.tryDispose = function(inspection) {96var resource = this.resource();97var context = this._context;98if (context !== undefined) context._pushContext();99var ret = resource !== null100? this.doDispose(resource, inspection) : null;101if (context !== undefined) context._popContext();102this._promise._unsetDisposable();103this._data = null;104return ret;105};106107Disposer.isDisposer = function (d) {108return (d != null &&109typeof d.resource === "function" &&110typeof d.tryDispose === "function");111};112113function FunctionDisposer(fn, promise, context) {114this.constructor$(fn, promise, context);115}116inherits(FunctionDisposer, Disposer);117118FunctionDisposer.prototype.doDispose = function (resource, inspection) {119var fn = this.data();120return fn.call(resource, resource, inspection);121};122123function maybeUnwrapDisposer(value) {124if (Disposer.isDisposer(value)) {125this.resources[this.index]._setDisposable(value);126return value.promise();127}128return value;129}130131Promise.using = function () {132var len = arguments.length;133if (len < 2) return apiRejection(134"you must pass at least 2 arguments to Promise.using");135var fn = arguments[len - 1];136if (typeof fn !== "function") return apiRejection("fn must be a function\u000a\u000a See http://goo.gl/916lJJ\u000a");137len--;138var resources = new Array(len);139for (var i = 0; i < len; ++i) {140var resource = arguments[i];141if (Disposer.isDisposer(resource)) {142var disposer = resource;143resource = resource.promise();144resource._setDisposable(disposer);145} else {146var maybePromise = tryConvertToPromise(resource);147if (maybePromise instanceof Promise) {148resource =149maybePromise._then(maybeUnwrapDisposer, null, null, {150resources: resources,151index: i152}, undefined);153}154}155resources[i] = resource;156}157158var promise = Promise.settle(resources)159.then(inspectionMapper)160.then(function(vals) {161promise._pushContext();162var ret;163try {164ret = fn.apply(undefined, vals);165} finally {166promise._popContext();167}168return ret;169})170._then(171disposerSuccess, disposerFail, undefined, resources, undefined);172resources.promise = promise;173return promise;174};175176Promise.prototype._setDisposable = function (disposer) {177this._bitField = this._bitField | 262144;178this._disposer = disposer;179};180181Promise.prototype._isDisposable = function () {182return (this._bitField & 262144) > 0;183};184185Promise.prototype._getDisposer = function () {186return this._disposer;187};188189Promise.prototype._unsetDisposable = function () {190this._bitField = this._bitField & (~262144);191this._disposer = undefined;192};193194Promise.prototype.disposer = function (fn) {195if (typeof fn === "function") {196return new FunctionDisposer(fn, this, createContext());197}198throw new TypeError();199};200201};202203204