/** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * * @format */ "use strict"; /** * A promise-like object that only creates the underlying value lazily * when requested. */ exports.LazyPromise = class LazyPromise { constructor(factory) { //$FlowIssue #16209141 Object.defineProperty(this, "_promise", { configurable: true, enumerable: true, get: () => (this._promise = factory()), set: value => Object.defineProperty(this, "_promise", { value }) }); } then(fulfilled, rejected) { return this._promise.then(fulfilled, rejected); } catch(rejected) { return this._promise.catch(rejected); } }; /** * A promise-like object that allows only one `.then()` handler to access * the wrapped value simultaneously. Can be used to lock resources that do * asynchronous work. */ exports.LockingPromise = class LockingPromise { constructor(promise) { this._gate = this._promise = promise; } then(fulfilled, rejected) { const whenUnlocked = () => { const promise = this._promise.then(fulfilled, rejected); this._gate = promise.then(empty); // avoid retaining the result of promise return promise; }; return this._gate.then(whenUnlocked, whenUnlocked); } catch(rejected) { return this._promise.catch(rejected); } }; function empty() {}