kyoto-client
Version:
Client for Kyoto Tycoon
82 lines • 2.62 kB
JavaScript
var RpcClient, assert, base64, csv, http;
csv = require('csv');
assert = require('assert');
http = require('http');
base64 = require('base64');
RpcClient = (function() {
function RpcClient(port, host) {
this.port = port;
this.host = host;
this;
}
RpcClient.prototype.call = function(procedure, args, callback) {
var body, key, options, value;
body = ((function() {
var _results;
_results = [];
for (key in args) {
value = args[key];
_results.push([encodeURIComponent(key), encodeURIComponent(value)].join("\t"));
}
return _results;
})()).join("\n");
options = {
host: this.host,
port: this.port,
method: 'POST',
path: "/rpc/" + procedure,
headers: {
'Connection': 'keep-alive',
'Content-Length': typeof body === 'string' ? Buffer.byteLength(body) : body.length,
'Content-Type': 'text/tab-separated-values; colenc=U'
}
};
return http.request(options, function(response) {
var colenc, content_type, data, tsv, _ref;
data = {};
tsv = csv().fromStream(response, {
delimiter: "\t",
escape: "",
encoding: 'ascii'
}).on('data', function(row, index) {
assert.ok(row.length >= 2);
return data[row[0]] = row[1];
});
_ref = response.headers['content-type'].split('; '), content_type = _ref[0], colenc = _ref[1];
assert.ok(content_type === "text/tab-separated-values", "response not in expected TSV format: " + response.statusCode + " " + content_type);
if (colenc != null) {
colenc = colenc.substr(-1, 1);
}
switch (colenc) {
case 'U':
tsv.transform(function(row, index) {
var col, _i, _len, _results;
_results = [];
for (_i = 0, _len = row.length; _i < _len; _i++) {
col = row[_i];
_results.push(decodeURIComponent(col));
}
return _results;
});
break;
case 'B':
tsv.transform(function(row, index) {
var col, _i, _len, _results;
_results = [];
for (_i = 0, _len = row.length; _i < _len; _i++) {
col = row[_i];
_results.push(base64.decode(col));
}
return _results;
});
}
return response.on('end', function() {
return callback(void 0, response.statusCode, data);
});
}).on('error', function(error) {
return callback(error);
}).end(body);
};
return RpcClient;
})();
module.exports = RpcClient;