UNPKG

kyoto-client

Version:

Client for Kyoto Tycoon

82 lines 2.62 kB
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;