У меня есть часть приложения, которое иногда считывает ввод из файла, иногда через сокет, а иногда из другой части той же программы, которая создает буфер или строку.
И сокеты, и файлы в качестве источников данных могут обрабатываться с помощью потокового API узла, и я пытался придумать какую-нибудь оболочку для буфера и строк, имитирующую это; Я не хочу писать две версии кода «потребителя» только для обработки строк в качестве входных данных, а когда данные уже находятся в памяти, мне не нужно записывать их на диск и читать снова.
Большинство вещей, кажется, работают просто отлично, но что-то нарушает мою реализацию 'pipe':
MemoryStream.prototype = new process.EventEmitter;
MemoryStream.prototype.pipe = function(dest,opts){
var that=this;
function pipe_mem(data){
if(!dest.write(data)){
that.pause();
dest.once('drain',function(){
if(pipe_mem(data)){that.resume();}
});
return false;
}
return true;
}
this.on('data',pipe_mem);
if(!opts || opts.end){this.on('end',dest.end);}
this.resume();
};
MemoryStream.prototype.resume = function(){
var i,l,encoder;
if(this.active) return;
this.active = true;
l = this.buffer.length-1;
if(l>=0){
encoder = this.encoding?emit_string:emit_buffer;
for(i=0;i<l;i++){encoder(this,this.buffer[i],this.encoding);}
if(this.buffer[i]===''){
this.emit('end');
this.destroy();
}else{encoder(this,this.buffer[i],encoding);}
this.buffer = [];
}
};
Всякий раз, когда я вызываю 'pipe', я получаю странную ошибку:
TypeError: Object #<EventEmitter> has no method '_implicitHeader'
at EventEmitter.<anonymous> (http.js:651:10)
at EventEmitter.emit (events.js:61:17)
at EventEmitter.resume (/MemoryStream.js:36:9)
Где /MemoryStream.js строка 36: this.emit('end');
Есть идеи, что происходит? Как я могу это исправить или есть лучший способ сделать то, что я хочу?