var grpc = require('grpc');
-var Chess = require('../www/js/chess.min.js').Chess;
+var Chess = require('../www/js/chess.js').Chess;
var PROTO_PATH = __dirname + '/hashprobe.proto';
var hashprobe_proto = grpc.load(PROTO_PATH).hashprobe;
var board = new Chess();
var clients = [];
+var current_servers = [];
+
+var need_reinit = function(servers) {
+ if (servers.length != current_servers.length) {
+ return true;
+ }
+ for (var i = 0; i < servers.length; ++i) {
+ if (servers[i] != current_servers[i]) {
+ return true;
+ }
+ }
+ return false;
+}
+exports.need_reinit = need_reinit;
var init = function(servers) {
+ clients = [];
for (var i = 0; i < servers.length; ++i) {
clients.push(new hashprobe_proto.HashProbe(servers[i], grpc.credentials.createInsecure()));
}
+ current_servers = servers;
}
exports.init = init;
var handle_request = function(fen, response) {
- if (!board.validate_fen(fen).valid) {
+ if (fen === undefined || fen === null || fen === '' || !board.validate_fen(fen).valid) {
response.writeHead(400, {});
response.end();
return;
var probe_response = reconcile_responses(probe_responses);
var lines = {};
- var root = translate_line(board, fen, probe_response['root']);
+ var root = translate_line_use_pretty(board, fen, probe_response['root']);
for (var i = 0; i < probe_response['line'].length; ++i) {
var line = probe_response['line'][i];
var uci_move = line['move']['from_sq'] + line['move']['to_sq'] + line['move']['promotion'];
- lines[uci_move] = translate_line(board, fen, line);
+ lines[uci_move] = translate_line_use_pretty(board, fen, line);
}
var text = JSON.stringify({
if (line['move'] && line['move']['from_sq']) {
var promo = line['move']['promotion'];
if (promo) {
- r['pretty_move'] = board.move({ from: line['move']['from_sq'], to: line['move']['to_sq'], promotion: promo.toLowerCase() }).san;
+ r['move'] = board.move({ from: line['move']['from_sq'], to: line['move']['to_sq'], promotion: promo.toLowerCase() }).san;
} else {
- r['pretty_move'] = board.move({ from: line['move']['from_sq'], to: line['move']['to_sq'] }).san;
+ r['move'] = board.move({ from: line['move']['from_sq'], to: line['move']['to_sq'] }).san;
}
} else {
- r['pretty_move'] = '';
+ r['move'] = '';
}
- r['sort_key'] = r['pretty_move'];
if (!line['found']) {
- r['pv_pretty'] = [];
+ r['pv'] = [];
return r;
}
r['depth'] = line['depth'];
// Convert the PV.
var pv = [];
- if (r['pretty_move']) {
- pv.push(r['pretty_move']);
+ if (r['move']) {
+ pv.push(r['move']);
}
for (var j = 0; j < line['pv'].length; ++j) {
var move = line['pv'][j];
}
pv.push(decoded.san);
}
- r['pv_pretty'] = pv;
+ r['pv'] = pv;
+
+ // Convert the score. Use the static eval if no search.
+ var value = line['value'] || line['eval'];
+ var score = null;
+ if (value['score_type'] === 'SCORE_CP') {
+ score = ['cp', value['score_cp']];
+ } else if (value['score_type'] === 'SCORE_MATE') {
+ score = ['m', value['score_mate']];
+ }
+ if (score) {
+ if (line['bound'] === 'BOUND_UPPER') {
+ score.push('≤');
+ } else if (line['bound'] === 'BOUND_LOWER') {
+ score.push('≥');
+ }
+ }
+
+ r['score'] = score;
+
+ return r;
+}
+
+var translate_line_use_pretty = function(board, fen, line) {
+ var r = {};
+
+ if (line['move'] && line['move']['pretty']) {
+ r['move'] = line['move']['pretty']
+ } else {
+ r['move'] = '';
+ }
+ if (!line['found']) {
+ r['pv'] = [];
+ return r;
+ }
+ r['depth'] = line['depth'];
+
+ // Convert the PV.
+ var pv = [];
+ if (r['move']) {
+ pv.push(r['move']);
+ }
+ for (var j = 0; j < line['pv'].length; ++j) {
+ var move = line['pv'][j];
+ pv.push(move['pretty']);
+ }
+ r['pv'] = pv;
// Convert the score. Use the static eval if no search.
var value = line['value'] || line['eval'];