class DebounceTimers{ constructor(cb , defaultDelay){ this.cb = cb; this.delay = defaultDelay; this.timers = { }; this.pausers = {}; } setDelay(delay){ if ( delay >= 0) this.delay = delay; } pause(key){ this.pausers[key] = this.pausers[key]|| 0; this.pausers[key]++; } unpause(key){ var count = this.pausers[key] || 0; if (count>0) count--; this.pausers[key] = count; } unpauseAndTime(key){ this.unpause(key); this.time(key); } time(key){ var self = this; var timers = this.timers; var timer = this.timers[key]; if (this.pausers[key] > 0) return; if (timer) clearTimeout(timer); timers[key] = setTimeout(function onTimer(){ self.cb(key); delete timers[key]; } , self.delay) } } class ERR_INVALID_ARG_TYPE extends TypeError{ constructor(name, expected, actual){ const type = name.includes('.') ? 'property' : 'argument'; let msg = `The "${name}" ${type} ${determiner} ${expected}`; } } function assertIsObject(value, name, types = 'Object') { if (value !== undefined && (value === null || typeof value !== 'object' || Array.isArray(value))) { const err = new ERR_INVALID_ARG_TYPE(name, types, value); Error.captureStackTrace(err, assertIsObject); throw err; } } module.exports = { ERR_INVALID_ARG_TYPE, assertIsObject, DebounceTimers }