Simon Priet e69a613a37 feat: Created a mini nodeJS server with NewMan for testing without PostMan GUI.
This will mimic a run in a CD/CI environment or docker container.
2021-09-08 14:01:19 +02:00

73 lines
1.9 KiB
JavaScript

// ETA calculation
class ETA{
constructor(length, initTime, initValue){
// size of eta buffer
this.etaBufferLength = length || 100;
// eta buffer with initial values
this.valueBuffer = [initValue];
this.timeBuffer = [initTime];
// eta time value
this.eta = '0';
}
// add new values to calculation buffer
update(time, value, total){
this.valueBuffer.push(value);
this.timeBuffer.push(time);
// trigger recalculation
this.calculate(total-value);
}
// fetch estimated time
getTime(){
return this.eta;
}
// eta calculation - request number of remaining events
calculate(remaining){
// get number of samples in eta buffer
const currentBufferSize = this.valueBuffer.length;
const buffer = Math.min(this.etaBufferLength, currentBufferSize);
const v_diff = this.valueBuffer[currentBufferSize - 1] - this.valueBuffer[currentBufferSize - buffer];
const t_diff = this.timeBuffer[currentBufferSize - 1] - this.timeBuffer[currentBufferSize - buffer];
// get progress per ms
const vt_rate = v_diff/t_diff;
// strip past elements
this.valueBuffer = this.valueBuffer.slice(-this.etaBufferLength);
this.timeBuffer = this.timeBuffer.slice(-this.etaBufferLength);
// eq: vt_rate *x = total
const eta = Math.ceil(remaining/vt_rate/1000);
// check values
if (isNaN(eta)){
this.eta = 'NULL';
// +/- Infinity --- NaN already handled
}else if (!isFinite(eta)){
this.eta = 'INF';
// > 10M s ? - set upper display limit ~115days (1e7/60/60/24)
}else if (eta > 1e7){
this.eta = 'INF';
// negative ?
}else if (eta < 0){
this.eta = 0;
}else{
// assign
this.eta = eta;
}
}
}
module.exports = ETA;