@warriorjs/core
Version:
WarriorJS core
75 lines (62 loc) • 2.03 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
var _assert = require('assert');
var _assert2 = _interopRequireDefault(_assert);
var _vm = require('vm');
var _vm2 = _interopRequireDefault(_vm);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const playerCodeFilename = 'Player.js';
const playerCodeTimeout = 3000;
/**
* Loads the player code and returns the playTurn function.
*
* @param {string} playerCode The code of the player.
*
* @returns {Function} The playTurn function.
*/
function loadPlayer(playerCode) {
const sandbox = _vm2.default.createContext();
// Do not collect stack frames for errors in the player code.
_vm2.default.runInContext('Error.stackTraceLimit = 0;', sandbox);
try {
_vm2.default.runInContext(playerCode, sandbox, {
filename: playerCodeFilename,
timeout: playerCodeTimeout
});
} catch (err) {
const error = new Error(`Check your syntax and try again!\n\n${err.stack}`);
error.code = 'InvalidPlayerCode';
throw error;
}
try {
const player = _vm2.default.runInContext('new Player();', sandbox, {
timeout: playerCodeTimeout
});
(0, _assert2.default)(typeof player.playTurn === 'function', 'playTurn is not defined');
const playTurn = turn => {
try {
player.playTurn(turn);
} catch (err) {
const error = new Error(err.message);
error.code = 'InvalidPlayerCode';
throw error;
}
};
return playTurn;
} catch (err) {
if (err.message === 'Player is not defined') {
const error = new Error('You must define a Player class!');
error.code = 'InvalidPlayerCode';
throw error;
} else if (err.message === 'playTurn is not defined') {
const error = new Error('Your Player class must define a playTurn method!');
error.code = 'InvalidPlayerCode';
throw error;
}
throw err;
}
}
exports.default = loadPlayer;
module.exports = exports.default;
;