1 var grpc = require('grpc');
2 var Chess = require(__dirname + '/chess.min.js').Chess;
4 var PROTO_PATH = __dirname + '/hashprobe.proto';
5 var hashprobe_proto = grpc.load(PROTO_PATH).hashprobe;
7 // TODO: Make destination configurable.
8 var client = new hashprobe_proto.HashProbe('localhost:50051', grpc.credentials.createInsecure());
10 var handle_request = function(fen, response) {
11 client.probe({fen: fen}, function(err, probe_response) {
13 response.writeHead(500, {});
16 handle_response(fen, response, probe_response);
20 exports.handle_request = handle_request;
22 var handle_response = function(fen, response, probe_response) {
23 var board = new Chess();
27 var root = translate_line(board, fen, probe_response['root'], true);
28 for (var i = 0; i < probe_response['line'].length; ++i) {
29 var line = probe_response['line'][i];
30 var uci_move = line['move']['from_sq'] + line['move']['to_sq'] + line['move']['promotion'];
31 lines[uci_move] = translate_line(board, fen, line, false);
34 var text = JSON.stringify({
39 'Content-Type': 'text/json; charset=utf-8'
40 //'Content-Length': text.length
42 response.writeHead(200, headers);
47 var translate_line = function(board, fen, line, pretty_score) {
50 var toplay = board.turn();
52 if (line['move'] && line['move']['from_sq']) {
53 r['pretty_move'] = board.move({ from: line['move']['from_sq'], to: line['move']['to_sq'], promotion: line['move']['promotion'] }).san;
55 r['pretty_move'] = '';
57 r['sort_key'] = r['pretty_move'];
60 r['score_sort_key'] = -100000000;
63 r['depth'] = line['depth'];
67 if (r['pretty_move']) {
68 pv.push(r['pretty_move']);
70 for (var j = 0; j < line['pv'].length; ++j) {
71 var move = line['pv'][j];
72 var decoded = board.move({ from: move['from_sq'], to: move['to_sq'], promotion: move['promotion'] });
73 if (decoded === null) {
80 // Write out the pretty score.
82 var score = pretty_score ? 'Score: ' : '';
84 if (line['bound'] === 'BOUND_UPPER') {
86 } else if (line['bound'] === 'BOUND_LOWER') {
90 var value = line['value']['score_cp'];
92 score += '+' + (value / 100.0).toFixed(2);
93 } else if (value < 0) {
94 score += (value / 100.0).toFixed(2);
95 } else if (value == 0) {
100 r['pretty_score'] = score;
101 r['score_sort_key'] = score_sort_key(line['value'], toplay === 'b') * 200 + r['depth'];
106 var score_sort_key = function(score, invert) {
107 if (score['score_type'] === 'SCORE_MATE') {
108 var mate = score['score_mate'];
111 // Side to move mates
112 score = 99999 - mate;
114 // Side to move is getting mated (note the double negative for mate)
115 score = -99999 - mate;
121 } else if (score['score_type'] === 'SCORE_CP') {
122 var score = score['score_cp'];