graphql-hooks-memcache
Version:
In memory cache for graphql-hooks
333 lines (327 loc) • 9.03 kB
JavaScript
'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;