@screeps/engine
Version:
This is a module for Screeps standalone server. See [main repository](https://github.com/screeps/screeps) for more info.
89 lines (70 loc) • 2.74 kB
JavaScript
var q = require('q'),
_ = require('lodash'),
util = require('util'),
utils = require('./utils'),
driver = utils.getDriver(),
C = driver.constants;
function runUser(userId) {
driver.config.emit('runnerLoopStage','runUser', userId);
//driver.influxAccumulator.resetTime();
return driver.makeRuntime(userId)
.then(saveResult, saveResult);
function saveResult(runResult) {
driver.config.emit('runnerLoopStage','saveResultStart', runResult);
//driver.influxAccumulator.mark('endMakeRuntime');
if(runResult.console) {
driver.sendConsoleMessages(userId, runResult.console);
}
if(runResult.error) {
driver.sendConsoleError(userId, runResult.error);
}
//driver.resetUserRoomVisibility(userId);
var promises = [];
if(runResult.memory) {
promises.push(driver.saveUserMemory(userId, runResult.memory));
}
if(runResult.memorySegments) {
promises.push(driver.saveUserMemorySegments(userId, runResult.memorySegments));
}
if(runResult.interShardSegment) {
promises.push(driver.saveUserMemoryInterShardSegment(userId, runResult.interShardSegment));
}
if(runResult.intents) {
promises.push(driver.saveUserIntents(userId, runResult.intents));
}
return q.all(promises)
.then(() => {
driver.config.emit('runnerLoopStage','saveResultFinish', runResult);
//driver.influxAccumulator.mark('saveUser');
})
}
}
driver.connect('runner')
.then(() => driver.queue.create('users', 'read'))
.catch((error) => {
console.error('Error connecting to driver:', error);
process.exit(1);
})
.then(_usersQueue => {
var usersQueue = _usersQueue;
driver.startLoop('runner', function() {
var userId, fetchedUserId;
driver.config.emit('runnerLoopStage','start');
return usersQueue.fetch()
.then((_userId) => {
userId = fetchedUserId = _userId;
return runUser(userId);
})
.catch((error) => console.error('Error in runner loop:', _.isObject(error) && error.stack || error))
.then(() => usersQueue.markDone(fetchedUserId))
.finally(() => driver.config.emit('runnerLoopStage','finish', userId));
});
});
if(typeof self == 'undefined') {
setInterval(() => {
var rejections = q.getUnhandledReasons();
rejections.forEach((i) => console.error('Unhandled rejection:', i));
q.resetUnhandledRejections();
}, 1000);
}