UNPKG

relay-runtime

Version:

A core runtime for building GraphQL-driven applications.

154 lines (153 loc) 6.17 kB
'use strict'; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"]; var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/createForOfIteratorHelper")); var invariant = require('invariant'); var RelayOperationTracker = /*#__PURE__*/function () { function RelayOperationTracker() { this._ownersToPendingOperations = new Map(); this._pendingOperationsToOwners = new Map(); this._ownersToPendingPromise = new Map(); } var _proto = RelayOperationTracker.prototype; _proto.update = function update(pendingOperation, affectedOwners) { if (affectedOwners.size === 0) { return; } var pendingOperationIdentifier = pendingOperation.identifier; var newlyAffectedOwnersIdentifier = new Set(); var _iterator = (0, _createForOfIteratorHelper2["default"])(affectedOwners), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var owner = _step.value; var ownerIdentifier = owner.identifier; var pendingOperationsAffectingOwner = this._ownersToPendingOperations.get(ownerIdentifier); if (pendingOperationsAffectingOwner != null) { if (!pendingOperationsAffectingOwner.has(pendingOperationIdentifier)) { pendingOperationsAffectingOwner.set(pendingOperationIdentifier, pendingOperation); newlyAffectedOwnersIdentifier.add(ownerIdentifier); } } else { this._ownersToPendingOperations.set(ownerIdentifier, new Map([[pendingOperationIdentifier, pendingOperation]])); newlyAffectedOwnersIdentifier.add(ownerIdentifier); } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } if (newlyAffectedOwnersIdentifier.size === 0) { return; } var ownersAffectedByPendingOperation = this._pendingOperationsToOwners.get(pendingOperationIdentifier) || new Set(); var _iterator2 = (0, _createForOfIteratorHelper2["default"])(newlyAffectedOwnersIdentifier), _step2; try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { var _ownerIdentifier = _step2.value; this._resolveOwnerResolvers(_ownerIdentifier); ownersAffectedByPendingOperation.add(_ownerIdentifier); } } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } this._pendingOperationsToOwners.set(pendingOperationIdentifier, ownersAffectedByPendingOperation); }; _proto.complete = function complete(pendingOperation) { var pendingOperationIdentifier = pendingOperation.identifier; var affectedOwnersIdentifier = this._pendingOperationsToOwners.get(pendingOperationIdentifier); if (affectedOwnersIdentifier == null) { return; } var completedOwnersIdentifier = new Set(); var updatedOwnersIdentifier = new Set(); var _iterator3 = (0, _createForOfIteratorHelper2["default"])(affectedOwnersIdentifier), _step3; try { for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) { var ownerIdentifier = _step3.value; var pendingOperationsAffectingOwner = this._ownersToPendingOperations.get(ownerIdentifier); if (!pendingOperationsAffectingOwner) { continue; } pendingOperationsAffectingOwner["delete"](pendingOperationIdentifier); if (pendingOperationsAffectingOwner.size > 0) { updatedOwnersIdentifier.add(ownerIdentifier); } else { completedOwnersIdentifier.add(ownerIdentifier); } } } catch (err) { _iterator3.e(err); } finally { _iterator3.f(); } var _iterator4 = (0, _createForOfIteratorHelper2["default"])(completedOwnersIdentifier), _step4; try { for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) { var _ownerIdentifier2 = _step4.value; this._resolveOwnerResolvers(_ownerIdentifier2); this._ownersToPendingOperations["delete"](_ownerIdentifier2); } } catch (err) { _iterator4.e(err); } finally { _iterator4.f(); } var _iterator5 = (0, _createForOfIteratorHelper2["default"])(updatedOwnersIdentifier), _step5; try { for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) { var _ownerIdentifier3 = _step5.value; this._resolveOwnerResolvers(_ownerIdentifier3); } } catch (err) { _iterator5.e(err); } finally { _iterator5.f(); } this._pendingOperationsToOwners["delete"](pendingOperationIdentifier); }; _proto._resolveOwnerResolvers = function _resolveOwnerResolvers(ownerIdentifier) { var promiseEntry = this._ownersToPendingPromise.get(ownerIdentifier); if (promiseEntry != null) { promiseEntry.resolve(); } this._ownersToPendingPromise["delete"](ownerIdentifier); }; _proto.getPendingOperationsAffectingOwner = function getPendingOperationsAffectingOwner(owner) { var ownerIdentifier = owner.identifier; var pendingOperationsForOwner = this._ownersToPendingOperations.get(ownerIdentifier); if (pendingOperationsForOwner == null || pendingOperationsForOwner.size === 0) { return null; } var cachedPromiseEntry = this._ownersToPendingPromise.get(ownerIdentifier); if (cachedPromiseEntry != null) { return { promise: cachedPromiseEntry.promise, pendingOperations: cachedPromiseEntry.pendingOperations }; } var resolve; var promise = new Promise(function (r) { resolve = r; }); !(resolve != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayOperationTracker: Expected resolver to be defined. If you' + 'are seeing this, it is likely a bug in Relay.') : invariant(false) : void 0; var pendingOperations = Array.from(pendingOperationsForOwner.values()); this._ownersToPendingPromise.set(ownerIdentifier, { promise: promise, resolve: resolve, pendingOperations: pendingOperations }); return { promise: promise, pendingOperations: pendingOperations }; }; return RelayOperationTracker; }(); module.exports = RelayOperationTracker;