add onmessage, onend, onerror
This commit is contained in:
parent
46f3b57751
commit
48d50210fb
84
index.js
84
index.js
|
@ -1,8 +1,19 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
module.exports.create = function (opts) {
|
module.exports.create = function (opts) {
|
||||||
|
var machine;
|
||||||
|
|
||||||
|
if (!opts.onMessage && !opts.onmessage) {
|
||||||
|
machine = new (require('events').EventEmitter)();
|
||||||
|
}
|
||||||
|
|
||||||
|
machine.onMessage = opts.onmessage || opts.onMessage;
|
||||||
|
machine.onmessage = opts.onmessage || opts.onMessage;
|
||||||
|
machine.onError = opts.onerror || opts.onError;
|
||||||
|
machine.onerror = opts.onerror || opts.onError;
|
||||||
|
machine.onEnd = opts.onend || opts.onEnd;
|
||||||
|
machine.onend = opts.onend || opts.onEnd;
|
||||||
|
|
||||||
var machine = { onMessage: opts.onMessage };
|
|
||||||
machine._version = 1;
|
machine._version = 1;
|
||||||
machine.state = 0;
|
machine.state = 0;
|
||||||
machine.states = { 0: 'version', 1: 'headerLength', 2: 'header', 3: 'data'/*, 4: 'error'*/ };
|
machine.states = { 0: 'version', 1: 'headerLength', 2: 'header', 3: 'data'/*, 4: 'error'*/ };
|
||||||
|
@ -95,6 +106,7 @@ module.exports.create = function (opts) {
|
||||||
//console.log('curSize:', curSize);
|
//console.log('curSize:', curSize);
|
||||||
//console.log('bodyLen:', machine.bodyLen, typeof machine.bodyLen);
|
//console.log('bodyLen:', machine.bodyLen, typeof machine.bodyLen);
|
||||||
var partLen = 0;
|
var partLen = 0;
|
||||||
|
var msg;
|
||||||
|
|
||||||
partLen = Math.min(machine.bodyLen - machine.bufIndex, chunk.length - machine.chunkIndex);
|
partLen = Math.min(machine.bodyLen - machine.bufIndex, chunk.length - machine.chunkIndex);
|
||||||
|
|
||||||
|
@ -125,13 +137,69 @@ module.exports.create = function (opts) {
|
||||||
}
|
}
|
||||||
machine.bufIndex += partLen;
|
machine.bufIndex += partLen;
|
||||||
|
|
||||||
machine.onMessage({
|
machine.service = machine.service || machine.type;
|
||||||
family: machine.family
|
machine.type = machine.type || machine.service;
|
||||||
, address: machine.address
|
|
||||||
, port: machine.port
|
|
||||||
, data: machine.buf.slice(0, machine.bufIndex)
|
//
|
||||||
, service: machine.service
|
// data, end, error
|
||||||
});
|
//
|
||||||
|
if ('end' === machine.type) {
|
||||||
|
msg = {};
|
||||||
|
|
||||||
|
msg.family = machine.family;
|
||||||
|
msg.address = machine.address;
|
||||||
|
msg.port = machine.port;
|
||||||
|
msg.service = 'end';
|
||||||
|
msg.type = msg.type || 'end';
|
||||||
|
|
||||||
|
if (machine.emit) {
|
||||||
|
machine.emit('tunnelEnd', msg);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
(machine.onend||machine.onmessage)(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ('error' === machine.type) {
|
||||||
|
try {
|
||||||
|
msg = JSON.parse(machine.data.toString());
|
||||||
|
} catch(e) {
|
||||||
|
msg = new Error('unknown error');
|
||||||
|
}
|
||||||
|
|
||||||
|
msg.family = machine.family;
|
||||||
|
msg.address = machine.address;
|
||||||
|
msg.port = machine.port;
|
||||||
|
msg.service = 'error';
|
||||||
|
msg.type = msg.type || 'error';
|
||||||
|
|
||||||
|
if (machine.emit) {
|
||||||
|
machine.emit('tunnelError', msg);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
(machine.onerror||machine.onError)(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
msg = {
|
||||||
|
data: machine.buf.slice(0, machine.bufIndex)
|
||||||
|
, service: machine.service
|
||||||
|
, type: machine.type
|
||||||
|
};
|
||||||
|
|
||||||
|
msg.family = machine.family;
|
||||||
|
msg.address = machine.address;
|
||||||
|
msg.port = machine.port;
|
||||||
|
msg.service = machine.service;
|
||||||
|
msg.type = machine.type || 'data';
|
||||||
|
|
||||||
|
if (machine.emit) {
|
||||||
|
machine.emit('tunnelData', msg);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
machine.onmessage(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
machine.chunkIndex += partLen; // === chunk.length
|
machine.chunkIndex += partLen; // === chunk.length
|
||||||
machine.buf = null; // reset to null
|
machine.buf = null; // reset to null
|
||||||
|
|
Loading…
Reference in New Issue