Skip to content

Commit 7220004

Browse files
committed
Use readline to separate JSON response objects
- JSON responses are newline-delimited by c-lighting and can't contain newlines, so this achieves the same in a simpler and more efficient manner. - The previous method would break with something like { "key": "}" } - The previous method would break if a single JSON response is split across multiple `data` events (possible with large responses).
1 parent 1a8d3ba commit 7220004

File tree

1 file changed

+11
-43
lines changed

1 file changed

+11
-43
lines changed

index.js

Lines changed: 11 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
const path = require('path');
44
const net = require('net');
5+
const readline = require('readline');
6+
const {EventEmitter} = require('events');
57
const _ = require('lodash');
6-
const { EventEmitter } = require('events');
7-
88

99
class LightningClient extends EventEmitter {
1010
constructor(rpcPath) {
@@ -44,48 +44,16 @@ class LightningClient extends EventEmitter {
4444
});
4545
});
4646

47-
this.client.on('data', data => {
48-
_.each(LightningClient.splitJSON(data.toString()), str => {
49-
let dataObject = {};
50-
try {
51-
dataObject = JSON.parse(str);
52-
} catch (err) {
53-
return;
54-
}
55-
56-
_self.emit('res:'+dataObject.id, dataObject)
57-
});
58-
});
59-
}
60-
61-
static splitJSON(str) {
62-
const parts = [];
63-
64-
let openCount = 0;
65-
let lastSplit = 0;
66-
67-
for (let i = 0; i < str.length; i++) {
68-
if (i > 0 && str.charCodeAt(i - 1) === 115) { // 115 => backslash, ignore this character
69-
continue;
47+
readline.createInterface({input: this.client}).on('line', str => {
48+
let data;
49+
try {
50+
data = JSON.parse(str);
51+
} catch (err) {
52+
return _self.emit('error', 'Invalid JSON: ' + str);
7053
}
7154

72-
if (str[i] === '{') {
73-
openCount++;
74-
} else if (str[i] === '}') {
75-
openCount--;
76-
77-
if (openCount === 0) {
78-
const start = lastSplit;
79-
const end = i + 1 === str.length ? undefined : i + 1;
80-
81-
parts.push(str.slice(start, end));
82-
83-
lastSplit = end;
84-
}
85-
}
86-
}
87-
88-
return parts.length === 0 ? [str] : parts;
55+
_self.emit('res:' + data.id, data);
56+
});
8957
}
9058

9159
increaseWaitTime() {
@@ -129,7 +97,7 @@ class LightningClient extends EventEmitter {
12997
return this.clientConnectionPromise
13098
.then(() => new Promise((resolve, reject) => {
13199
// Wait for a response
132-
this.once('res:'+callInt, response => {
100+
this.once('res:' + callInt, response => {
133101
if (_.isNil(response.error)) {
134102
resolve(response.result);
135103
return;

0 commit comments

Comments
 (0)