Files
inpx-web/server/core/WorkerState.js
2022-08-17 01:17:14 +07:00

62 lines
1.5 KiB
JavaScript

const utils = require('./utils');
const cleanInterval = 3600; //sec
const cleanAfterLastModified = cleanInterval - 60; //sec
let instance = null;
//singleton
class WorkerState {
constructor() {
if (!instance) {
this.states = {};
this.cleanStates();
instance = this;
}
return instance;
}
generateWorkerId() {
return utils.randomHexString(20);
}
getControl(workerId) {
return {
set: state => this.setState(workerId, state),
finish: state => this.finishState(workerId, state),
get: () => this.getState(workerId),
};
}
setState(workerId, state) {
this.states[workerId] = Object.assign({}, this.states[workerId], state, {
workerId,
lastModified: Date.now()
});
}
finishState(workerId, state) {
this.states[workerId] = Object.assign({}, this.states[workerId], state, {
workerId,
state: 'finish',
lastModified: Date.now()
});
}
getState(workerId) {
return this.states[workerId];
}
cleanStates() {
const now = Date.now();
for (let workerID in this.states) {
if ((now - this.states[workerID].lastModified) >= cleanAfterLastModified*1000) {
delete this.states[workerID];
}
}
setTimeout(this.cleanStates.bind(this), cleanInterval*1000);
}
}
module.exports = WorkerState;