62 lines
1.5 KiB
JavaScript
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; |