forked from node-inspector/node-inspector
/
debugger.js
106 lines (93 loc) · 2.1 KB
/
debugger.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
var net = require('net'),
events = require('events');
function makeMessage() {
return {
headersDone: false,
headers: null,
contentLength: 0
};
}
///////////////////////////////////////////////////////////
// exports
exports.attachDebugger = function (port) {
var connected = false,
buffer = '',
msg = false,
conn = net.createConnection(port),
debugr,
offset,
m;
conn.setEncoding('ascii');
function parse() {
if (msg && msg.headersDone) {
//parse body
if (buffer.length >= msg.contentLength) {
msg.body = buffer.slice(0, msg.contentLength);
buffer = buffer.slice(msg.contentLength);
if (msg.body.length > 0) {
var obj = JSON.parse(msg.body);
debugr.emit('data', obj);
}
msg = false;
parse();
}
return;
}
if (!msg) {
msg = makeMessage();
}
offset = buffer.indexOf('\r\n\r\n');
if (offset > 0) {
msg.headersDone = true;
msg.headers = buffer.substr(0, offset + 4);
m = /Content-Length: (\d+)/.exec(msg.headers);
if (m[1]) {
msg.contentLength = parseInt(m[1], 10);
}
else {
console.warn('no Content-Length');
}
buffer = buffer.slice(offset + 4);
parse();
}
}
debugr = Object.create(events.EventEmitter.prototype, {
request: {
value: function (data)
{
if (connected) {
var message = 'Content-Length: ' + data.length + '\r\n\r\n' + data;
conn.write(message);
}
}
},
close: {
value: function ()
{
conn.end();
}
},
connected: {
get: function() { return connected; }
}
});
conn.on('connect', function () {
connected = true;
debugr.emit('connect');
});
conn.on('data', function (data) {
buffer += data;
parse();
});
conn.on('error', function(e) {
debugr.emit('error', e);
});
conn.on('end', function () {
debugr.close();
});
conn.on('close', function () {
connected = false;
debugr.emit('close');
});
return debugr;
};