UNPKG

graphql-hooks-memcache

Version:
333 lines (327 loc) 9.03 kB
'use strict'; function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function _createForOfIteratorHelperLoose(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (it) return (it = it.call(o)).next.bind(it); if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; return function () { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } /** * tiny-lru * * @copyright 2023 Jason Mulligan <jason.mulligan@avoidwork.com> * @license BSD-3-Clause * @version 11.2.5 */ var LRU = /*#__PURE__*/function () { function LRU(max, ttl, resetTtl) { if (max === void 0) { max = 0; } if (ttl === void 0) { ttl = 0; } if (resetTtl === void 0) { resetTtl = false; } this.first = null; this.items = Object.create(null); this.last = null; this.max = max; this.resetTtl = resetTtl; this.size = 0; this.ttl = ttl; } var _proto = LRU.prototype; _proto.clear = function clear() { this.first = null; this.items = Object.create(null); this.last = null; this.size = 0; return this; }; _proto.delete = function _delete(key) { if (this.has(key)) { var item = this.items[key]; delete this.items[key]; this.size--; if (item.prev !== null) { item.prev.next = item.next; } if (item.next !== null) { item.next.prev = item.prev; } if (this.first === item) { this.first = item.next; } if (this.last === item) { this.last = item.prev; } } return this; }; _proto.entries = function entries(keys) { var _this = this; if (keys === void 0) { keys = this.keys(); } return keys.map(function (key) { return [key, _this.get(key)]; }); }; _proto.evict = function evict(bypass) { if (bypass === void 0) { bypass = false; } if (bypass || this.size > 0) { var item = this.first; delete this.items[item.key]; if (--this.size === 0) { this.first = null; this.last = null; } else { this.first = item.next; this.first.prev = null; } } return this; }; _proto.expiresAt = function expiresAt(key) { var result; if (this.has(key)) { result = this.items[key].expiry; } return result; }; _proto.get = function get(key) { var result; if (this.has(key)) { var item = this.items[key]; if (this.ttl > 0 && item.expiry <= Date.now()) { this.delete(key); } else { result = item.value; this.set(key, result, true); } } return result; }; _proto.has = function has(key) { return key in this.items; }; _proto.keys = function keys() { var result = []; var x = this.first; while (x !== null) { result.push(x.key); x = x.next; } return result; }; _proto.set = function set(key, value, bypass, resetTtl) { if (bypass === void 0) { bypass = false; } if (resetTtl === void 0) { resetTtl = this.resetTtl; } var item; if (bypass || this.has(key)) { item = this.items[key]; item.value = value; if (bypass === false && resetTtl) { item.expiry = this.ttl > 0 ? Date.now() + this.ttl : this.ttl; } if (this.last !== item) { var last = this.last, next = item.next, prev = item.prev; if (this.first === item) { this.first = item.next; } item.next = null; item.prev = this.last; last.next = item; if (prev !== null) { prev.next = next; } if (next !== null) { next.prev = prev; } } } else { if (this.max > 0 && this.size === this.max) { this.evict(true); } item = this.items[key] = { expiry: this.ttl > 0 ? Date.now() + this.ttl : this.ttl, key: key, prev: this.last, next: null, value: value }; if (++this.size === 1) { this.first = item; } else { this.last.next = item; } } this.last = item; return this; }; _proto.values = function values(keys) { var _this2 = this; if (keys === void 0) { keys = this.keys(); } return keys.map(function (key) { return _this2.get(key); }); }; return LRU; }(); function lru(max, ttl, resetTtl) { if (max === void 0) { max = 1000; } if (ttl === void 0) { ttl = 0; } if (resetTtl === void 0) { resetTtl = false; } if (isNaN(max) || max < 0) { throw new TypeError("Invalid max value"); } if (isNaN(ttl) || ttl < 0) { throw new TypeError("Invalid ttl value"); } if (typeof resetTtl !== "boolean") { throw new TypeError("Invalid resetTtl value"); } return new LRU(max, ttl, resetTtl); } var OFFSET_BASIS_32 = 2166136261; function fnv1aString(string) { var hash = OFFSET_BASIS_32; for (var i = 0; i < string.length; i++) { hash ^= string.charCodeAt(i); hash += (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24); } return hash >>> 0; } function fnv1a(input) { if (typeof input === "string") { return fnv1aString(input); } else { throw new Error("input must be a string"); } } var __defProp = Object.defineProperty; var __defProps = Object.defineProperties; var __getOwnPropDescs = Object.getOwnPropertyDescriptors; var __getOwnPropSymbols = Object.getOwnPropertySymbols; var __hasOwnProp = Object.prototype.hasOwnProperty; var __propIsEnum = Object.prototype.propertyIsEnumerable; var __defNormalProp = function __defNormalProp(obj, key, value) { return key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value: value }) : obj[key] = value; }; var __spreadValues = function __spreadValues(a, b) { for (var prop in b || (b = {})) if (__hasOwnProp.call(b, prop)) __defNormalProp(a, prop, b[prop]); if (__getOwnPropSymbols) { for (var _iterator = _createForOfIteratorHelperLoose(__getOwnPropSymbols(b)), _step; !(_step = _iterator()).done;) { var prop = _step.value; if (__propIsEnum.call(b, prop)) __defNormalProp(a, prop, b[prop]); } } return a; }; var __spreadProps = function __spreadProps(a, b) { return __defProps(a, __getOwnPropDescs(b)); }; function generateKey(keyObj) { return fnv1a(JSON.stringify(keyObj)).toString(36); } function memCache(_temp) { var _ref = _temp === void 0 ? {} : _temp, _ref$size = _ref.size, size = _ref$size === void 0 ? 100 : _ref$size, _ref$ttl = _ref.ttl, ttl = _ref$ttl === void 0 ? 0 : _ref$ttl, _ref$debug = _ref.debug, debug = _ref$debug === void 0 ? false : _ref$debug, initialState = _ref.initialState; var lru$1 = lru(size, ttl); var debugLru = debug ? lru(size, ttl) : void 0; if (initialState) { Object.keys(initialState).map(function (k) { lru$1.set(k, initialState[k]); }); } return { get: function get(keyObj) { return lru$1.get(generateKey(keyObj)); }, rawGet: function rawGet(rawKey) { return lru$1.get(rawKey); }, rawToKey: function rawToKey(rawKey) { if (!debugLru) { throw "not allowed unless in debug mode"; } return debugLru.get(rawKey); }, set: function set(keyObj, data) { var key = generateKey(keyObj); lru$1.set(key, data); if (debugLru) { debugLru.set(key, keyObj); } }, delete: function _delete(keyObj) { return lru$1.delete(generateKey(keyObj)); }, clear: function clear() { return lru$1.clear(); }, keys: function keys() { return [].concat(lru$1.keys()); }, getInitialState: function getInitialState() { return [].concat(lru$1.keys()).reduce(function (initialState2, key) { var _spreadProps; return __spreadProps(__spreadValues({}, initialState2), (_spreadProps = {}, _spreadProps[key] = lru$1.get(key), _spreadProps)); }, {}); } }; } module.exports = memCache;