mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			62 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'use strict';
 | 
						|
 | 
						|
const { EventEmitter } = require('events');
 | 
						|
const List = require('./list');
 | 
						|
const moment = require('moment');
 | 
						|
 | 
						|
// this list must have entries with sorted ttl range
 | 
						|
module.exports = class TTLList extends EventEmitter {
 | 
						|
    constructor({
 | 
						|
        interval = 1000,
 | 
						|
        expireAmount = 1,
 | 
						|
        expireType = 'hours',
 | 
						|
    } = {}) {
 | 
						|
        super();
 | 
						|
        this.interval = interval;
 | 
						|
        this.expireAmount = expireAmount;
 | 
						|
        this.expireType = expireType;
 | 
						|
 | 
						|
        this.list = new List();
 | 
						|
 | 
						|
        this.list.on('evicted', ({ value, ttl }) => {
 | 
						|
            this.emit('expire', value, ttl);
 | 
						|
        });
 | 
						|
        this.startTimer();
 | 
						|
    }
 | 
						|
 | 
						|
    startTimer() {
 | 
						|
        if (this.list) {
 | 
						|
            this.timer = setTimeout(() => {
 | 
						|
                if (this.list) {
 | 
						|
                    this.timedCheck();
 | 
						|
                }
 | 
						|
            }, this.interval);
 | 
						|
            this.timer.unref();
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    add(value, timestamp = new Date()) {
 | 
						|
        const ttl = moment(timestamp).add(this.expireAmount, this.expireType);
 | 
						|
        if (moment().isBefore(ttl)) {
 | 
						|
            this.list.add({ ttl, value });
 | 
						|
        } else {
 | 
						|
            this.emit('expire', value, ttl);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    timedCheck() {
 | 
						|
        const now = moment();
 | 
						|
        this.list.reverseRemoveUntilTrue(({ value }) =>
 | 
						|
            now.isBefore(value.ttl)
 | 
						|
        );
 | 
						|
        this.startTimer();
 | 
						|
    }
 | 
						|
 | 
						|
    destroy() {
 | 
						|
        // https://github.com/nodejs/node/issues/9561
 | 
						|
        // clearTimeout(this.timer);
 | 
						|
        // this.timer = null;
 | 
						|
        this.list = null;
 | 
						|
    }
 | 
						|
};
 |