84 lines
2.6 KiB
JavaScript
84 lines
2.6 KiB
JavaScript
const BaseController = require('./BaseController');
|
|
const WorkerState = require('../core/WorkerState');//singleton
|
|
const utils = require('../core/utils');
|
|
|
|
class WorkerController extends BaseController {
|
|
constructor(config) {
|
|
super(config);
|
|
this.workerState = new WorkerState();
|
|
}
|
|
|
|
async getState(req, res) {
|
|
const request = req.body;
|
|
let error = '';
|
|
try {
|
|
if (!request.workerId)
|
|
throw new Error(`key 'workerId' is wrong`);
|
|
|
|
const state = this.workerState.getState(request.workerId);
|
|
|
|
return (state ? state : {});
|
|
} catch (e) {
|
|
error = e.message;
|
|
}
|
|
//bad request
|
|
res.status(400).send({error});
|
|
return false;
|
|
}
|
|
|
|
async getStateFinish(req, res) {
|
|
const request = req.body;
|
|
let error = '';
|
|
try {
|
|
if (!request.workerId)
|
|
throw new Error(`key 'workerId' is wrong`);
|
|
|
|
res.writeHead(200, {
|
|
'Content-Type': 'text/json; charset=utf-8',
|
|
});
|
|
|
|
const splitter = '-- aod2t5hDXU32bUFyqlFE next status --';
|
|
const refreshPause = 300;
|
|
let i = 0;
|
|
let prevProgress = -1;
|
|
let prevState = '';
|
|
let state;
|
|
while (1) {// eslint-disable-line no-constant-condition
|
|
state = this.workerState.getState(request.workerId);
|
|
if (!state) break;
|
|
|
|
res.write(splitter + JSON.stringify(state));
|
|
res.flush();
|
|
|
|
if (state.state != 'finish' && state.state != 'error')
|
|
await utils.sleep(refreshPause);
|
|
else
|
|
break;
|
|
|
|
i++;
|
|
if (i > 2*60*1000/refreshPause) {//2 мин ждем телодвижений воркера
|
|
res.write(splitter + JSON.stringify({state: 'error', error: 'Слишком долгое время ожидания'}));
|
|
break;
|
|
}
|
|
i = (prevProgress != state.progress || prevState != state.state ? 1 : i);
|
|
prevProgress = state.progress;
|
|
prevState = state.state;
|
|
}
|
|
|
|
if (!state) {
|
|
res.write(splitter + JSON.stringify({}));
|
|
}
|
|
|
|
res.end();
|
|
return false;
|
|
} catch (e) {
|
|
error = e.message;
|
|
}
|
|
//bad request
|
|
res.status(400).send({error});
|
|
return false;
|
|
}
|
|
}
|
|
|
|
module.exports = WorkerController;
|