UNPKG

@warriorjs/core

Version:
75 lines (62 loc) 2.03 kB
'use strict'; 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;