UNPKG

relay-runtime

Version:

A core runtime for building GraphQL-driven applications.

75 lines (74 loc) 2.89 kB
'use strict'; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"]; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2")); var _require = require('../util/stableCopy'), stableCopy = _require.stableCopy; var invariant = require('invariant'); var RelayQueryResponseCache = /*#__PURE__*/function () { function RelayQueryResponseCache(_ref) { var size = _ref.size, ttl = _ref.ttl; !(size > 0) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayQueryResponseCache: Expected the max cache size to be > 0, got ' + '`%s`.', size) : invariant(false) : void 0; !(ttl > 0) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayQueryResponseCache: Expected the max ttl to be > 0, got `%s`.', ttl) : invariant(false) : void 0; this._responses = new Map(); this._size = size; this._ttl = ttl; } var _proto = RelayQueryResponseCache.prototype; _proto.clear = function clear() { this._responses.clear(); }; _proto.get = function get(queryID, variables) { var _this = this; var cacheKey = getCacheKey(queryID, variables); this._responses.forEach(function (response, key) { if (!isCurrent(response.fetchTime, _this._ttl)) { _this._responses["delete"](key); } }); var response = this._responses.get(cacheKey); if (response == null) { return null; } if (Array.isArray(response.payload)) { return response.payload.map(function (payload) { return (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, payload), {}, { extensions: (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, payload.extensions), {}, { cacheTimestamp: response.fetchTime }) }); }); } return (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, response.payload), {}, { extensions: (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, response.payload.extensions), {}, { cacheTimestamp: response.fetchTime }) }); }; _proto.set = function set(queryID, variables, payload) { var fetchTime = Date.now(); var cacheKey = getCacheKey(queryID, variables); this._responses["delete"](cacheKey); this._responses.set(cacheKey, { fetchTime: fetchTime, payload: payload }); if (this._responses.size > this._size) { var firstKey = this._responses.keys().next(); if (!firstKey.done) { this._responses["delete"](firstKey.value); } } }; return RelayQueryResponseCache; }(); function getCacheKey(queryID, variables) { return JSON.stringify(stableCopy({ queryID: queryID, variables: variables })); } function isCurrent(fetchTime, ttl) { return fetchTime + ttl >= Date.now(); } module.exports = RelayQueryResponseCache;