12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- var net = require("net");
-
- class RPCConn {
- constructor(ip, port) {
- this.ready = false;
-
- this._callbacks = {};
- this._onready = [];
- this._listeners = {};
-
- this._id = 1;
- this.sock = new net.Socket();
- this.sock.connect(port, ip, () => {
- console.log("Connected to RPC server "+ip+":"+port+".");
- this.ready = true;
- this._onready.forEach(x => x());
- });
-
- var onjson = json => {
- var obj;
- try {
- obj = JSON.parse(json);
- } catch (err) {
- console.log("Failed to parse JSON: '"+json+"'");
- throw err;
- }
-
- if (obj.id == null) {
- var listeners = this._listeners[obj.method];
-
- if (listeners)
- listeners.forEach(l => l(obj.params));
- if (!listeners || listeners.length === 0)
- console.log("Received method '"+obj.method+"', but no listeners.");
-
- return;
- }
-
- var cb = this._callbacks[obj.id];
- if (!cb)
- return console.log("Warning: received unknown ID "+obj.id);
-
- cb(obj.error, obj.result);
- }
-
- //Digest JSON lines as they come, but only if they're a whole line
- var currdata = "";
- this.sock.on("data", d => {
- var s = d.toString();
- currdata += s;
- var arr = s.split("\n");
- while (arr[1] != null) {
- onjson(arr.shift());
- arr.shift();
- }
- currdata = arr[0] || "";
- });
- }
-
- wait() {
- return new Promise((resolve, reject) => {
- if (this.ready)
- return resolve();
-
- this._onready.push(resolve);
- });
- }
-
-
- call(name, ...params) {
- return new Promise((resolve, reject) => {
- var json = JSON.stringify({
- id: this._id,
- method: name,
- params: params
- });
- this._callbacks[this._id] = (err, res) => {
- if (err) reject(err);
- else resolve(res);
- }
-
- console.log("Sending '"+json+"'");
- this.sock.write(json+"\n");
- this._id += 1;
- });
- }
-
- on(name, fn) {
- this._listeners[name] = this._listeners[name] || [];
- this._listeners[name].push(fn);
- }
- }
-
- module.exports = RPCConn;
|