@luminati-io/luminati-proxy
Version:
A configurable local proxy for luminati.io
70 lines (67 loc) • 2.25 kB
JavaScript
// LICENSE_CODE ZON
'use strict'; /*jslint node:true*/
require('./config.js');
const array = require('./array.js');
const conv = require('./conv.js');
const zcounter = require('./zcounter.js');
const {env} = process;
const KB = 1024, MB = 1024*KB;
class BufPool {
constructor(max_free_size, free_ttl, name){
this.max_free_size = max_free_size;
this.free_ttl = free_ttl||3E+5;
this.name = name ? name+'_' : '';
this.pool = {};
this.free_size = 0;
this.overflow_ts = 0;
}
create(max_free_size, free_ttl, name){
return new BufPool(max_free_size, free_ttl, name);
}
counter(bp){
if (env.AGENT_NUM && !zcounter.is_debug('bp'))
return;
let name = zcounter.to_valid_id('bp_'+this.name+bp.name+'_');
zcounter.set_level(name+'used', bp.used.length);
zcounter.set_level(name+'free', bp.free.length);
}
alloc(bytes){
let bp = this.pool[bytes] = this.pool[bytes]||{bytes,
created: new Error().stack, free: [], used: [],
name: conv.scaled_number(bytes, {base: KB})};
let b = !bp.free.length ? Buffer.alloc(bytes) : bp.free.pop();
bp.used.push(b);
this.counter(bp);
return b;
}
free(buf){
let bp = this.pool[buf.length];
bp.free.push(buf);
array.rm_elm(bp.used, buf);
this.free_size += buf.length;
if (this.max_free_size)
this.cut_free();
else
this.counter(bp);
}
cut_free(){
if (this.free_size<=this.max_free_size)
return void (this.overflow_ts = 0);
let now = Date.now();
if (!this.overflow_ts)
return void (this.overflow_ts = now);
if (now-this.overflow_ts<=this.free_ttl)
return;
let fraction = this.max_free_size/this.free_size;
for (let name in this.pool)
{
let bp = this.pool[name];
let new_length = Math.floor(bp.free.length*fraction);
this.free_size -= bp.bytes*(bp.free.length-new_length);
bp.free.length = new_length;
this.counter(bp);
}
this.overflow_ts = 0;
}
}
module.exports = new BufPool(50*MB);