/**
 * Minified by jsDelivr using Terser v5.39.0.
 * Original file: /npm/@hapi/catbox-memory@6.0.2/lib/index.js
 *
 * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files
 */
"use strict";const Boom=require("@hapi/boom"),Hoek=require("@hapi/hoek"),internals={maxTimer:2147483647,entrySize:144,defaults:{maxByteSize:104857600,minCleanupIntervalMsec:1e3,cloneBuffersOnGet:!1}};exports.Engine=class{constructor(e={}){Hoek.assert(void 0===e.maxByteSize||e.maxByteSize>=0,"Invalid cache maxByteSize value"),Hoek.assert(void 0===e.allowMixedContent,"allowMixedContent no longer supported"),Hoek.assert(void 0===e.minCleanupIntervalMsec||e.minCleanupIntervalMsec<internals.maxTimer,"Invalid cache minCleanupIntervalMsec value"),Hoek.assert(void 0===e.cloneBuffersOnGet||"boolean"==typeof e.cloneBuffersOnGet,"Invalid cloneBuffersOnGet value"),this.settings=Hoek.applyToDefaults(internals.defaults,e),this.cache=null,this._timer=null,this._timerDue=null}start(){this.cache||(this.cache=new Map,this.byteSize=0)}_scheduleCleanup(e){const t=Date.now(),i=Math.min(Math.max(this.settings.minCleanupIntervalMsec,e),internals.maxTimer);if(this._timer){if(this._timerDue-t<e)return;clearTimeout(this._timer)}this._timerDue=t+i,this._timer=setTimeout((()=>{this._timer=null,this._timerDue=null;const e=Date.now();let t=1/0;for(const[,i]of this.cache)for(const[n,s]of i){const o=s.stored+s.ttl-e;o<=0?(i.delete(n),this.byteSize-=s.byteSize):t=Math.min(t,o)}t!==1/0&&this._scheduleCleanup(t)}),i)}stop(){clearTimeout(this._timer),this._timer=null,this._timerDue=null,this.cache=null,this.byteSize=0}isReady(){return!!this.cache}validateSegmentName(e){if(!e)throw new Boom.Boom("Empty string");if(-1!==e.indexOf("\0"))throw new Boom.Boom("Includes null character");return null}get(e){if(!this.cache)throw new Boom.Boom("Connection not started");const t=this.cache.get(e.segment);if(!t)return null;const i=t.get(e.id);if(!i)return null;if(i.stored+i.ttl<Date.now())return this.drop(e),null;let n=null;if(Buffer.isBuffer(i.item)){if(n=i.item,this.settings.cloneBuffersOnGet){const e=Buffer.alloc(n.length);n.copy(e),n=e}}else try{n=JSON.parse(i.item)}catch(e){throw new Boom.Boom("Bad value content")}return{item:n,stored:i.stored,ttl:i.ttl}}set(e,t,i){if(!this.cache)throw new Boom.Boom("Connection not started");const n=new internals.MemoryCacheEntry(e,t,i);let s=this.cache.get(e.segment);s||(s=new Map,this.cache.set(e.segment,s));const o=s.get(e.id);if(o&&(this.byteSize-=o.byteSize),this.settings.maxByteSize&&this.byteSize+n.byteSize>this.settings.maxByteSize)throw new Boom.Boom("Cache size limit reached");this._scheduleCleanup(i),s.set(e.id,n),this.byteSize+=n.byteSize}drop(e){if(!this.cache)throw new Boom.Boom("Connection not started");const t=this.cache.get(e.segment);if(t){const i=t.get(e.id);i&&(this.byteSize-=i.byteSize,t.delete(e.id))}}},internals.MemoryCacheEntry=class{constructor(e,t,i){let n=0;Buffer.isBuffer(t)?(this.item=Buffer.alloc(t.length),t.copy(this.item),n=this.item.length):(this.item=JSON.stringify(t),n=Buffer.byteLength(this.item)),this.stored=Date.now(),this.ttl=i,this.byteSize=internals.entrySize+n+Buffer.byteLength(e.segment)+Buffer.byteLength(e.id),this.timeoutId=null}};
//# sourceMappingURL=/sm/64b8ee540c5ddab81c5fff0514e539ca331d8aed85422ee1f1e94ccd1e8df608.map