-
Notifications
You must be signed in to change notification settings - Fork 23
/
CommandBase.js
58 lines (42 loc) · 1.38 KB
/
CommandBase.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
var parser = require("../connection/parser");
var command = function() {
this.step = 0;
this.steps = [];
this.steps.push(command.skipByte);
this.steps.push(command.skipInt);
this.result = {};
this.error = null;
};
command.prototype.done = function() {
return this.step >= this.steps.length;
};
command.prototype.read = function(buf) {
var bytesRead = 0,
bytesLingering = (this.lingeringBuffer && this.lingeringBuffer.length) || 0,
totalBytesRead = bytesRead,
localBuffer = new Buffer(buf.length + bytesLingering);
if (bytesLingering) this.lingeringBuffer.copy(localBuffer);
buf.copy(localBuffer, bytesLingering);
while (!this.done() && (bytesRead = this.steps[this.step].call(this, localBuffer, totalBytesRead))) {
totalBytesRead += bytesRead;
}
this.lingeringBuffer = new Buffer(localBuffer.length - totalBytesRead);
localBuffer.copy(this.lingeringBuffer, 0, totalBytesRead);
// Give back the remaining buffer to the caller
return this.lingeringBuffer;
};
command.skipByte = function(buf, offset) {
if (!parser.canReadByte(buf, offset)) {
return 0;
}
this.step++;
return parser.BYTES_BYTE;
};
command.skipInt = function(buf, offset) {
if (!parser.canReadInt(buf, offset)) {
return 0;
}
this.step++;
return parser.BYTES_INT;
};
module.exports = command;