| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 | var assert = require('assert');var net = require('net');var streamPair = require('stream-pair');var thing = require('handle-thing');var Buffer = require('buffer').Buffer;var fixtures = require('./fixtures');var hose = require('../');describe('Select Hose', function() {  var pair;  var socket;  beforeEach(function() {    pair = streamPair.create();    var handle = thing.create(pair.other);    socket = new net.Socket({ handle: handle });    // For v0.8    socket.readable = true;    socket.writable = true;  });  it('should select handler using first byte', function(done) {    var filter = hose.create(socket, function filter(data, callback) {      if (data[0] === 0x80)        return callback(null, 'spdy');      else        return callback(null, 'http');    });    filter.on('select', function(protocol, socket) {      assert.equal(protocol, 'spdy');      socket.on('data', function(chunk) {        assert.equal(chunk.toString('hex'), '80030001');        done();      });    });    pair.write(new Buffer('80030001', 'hex'));  });  it('should select handler using two packets', function(done) {    var filter = hose.create(socket, function filter(data, callback) {      if (data.length < 2)        return;      if (data[0] === 0x80 && data[1] === 0x03)        return callback(null, 'spdy');      else        return callback(null, 'http');    });    filter.on('select', function(protocol, socket) {      assert.equal(protocol, 'spdy');      socket.on('data', function(chunk) {        assert.equal(chunk.toString('hex'), '80030001');        done();      });    });    pair.write(new Buffer('80', 'hex'));    setTimeout(function() {      pair.write(new Buffer('030001', 'hex'));    }, 20);  });  it('should read excessive packets', function(done) {    var filter = hose.create(socket, function filter(data, callback) {      if (data.length < 2)        return;      if (data[0] === 0x61 && data[1] === 0x62)        return callback(null, 'spdy');      else        return callback(null, 'http');    });    filter.on('select', function(protocol, socket) {      assert.equal(protocol, 'spdy');      fixtures.expectData(socket, 'abcd', done);    });    pair.write('a');    setTimeout(function() {      pair.write('b');      setTimeout(function() {        pair.end('cd');      }, 20);    }, 20);  });  it('should re-emit errors', function(done) {    var filter = hose.create(socket, function filter(data, callback) {      if (data.length < 2)        return;      if (data[0] === 0x61 && data[1] === 0x62)        return callback(null, 'spdy');      else        return callback(null, 'http');    });    filter.on('error', function(err) {      done();    });    socket.emit('error', new Error(123));  });});
 |