peer-emitter
Version:
acknowledgeable events
206 lines (143 loc) • 4.32 kB
JavaScript
var test = require('tap').test;
var DuplexPair = require('./utils/duplex-pair');
var PeerEmitter = require('..');
function xtest() {}
function rand() { return Math.random().toString(); }
test('blind streaming', function(t) {
var pair = DuplexPair();
var apple = rand();
receiver(pair.a);
sender(pair.b);
function sender(duplexStream) {
var emitter = PeerEmitter(duplexStream);
var stream = emitter.WriteStream('apples');
stream.write(apple);
}
function receiver(duplexStream) {
var emitter = PeerEmitter(duplexStream);
var stream = emitter.ReadStream('apples');
stream.on('data', function(d) {
t.equals(d, apple, 'data is correct');
t.end();
});
}
});
test('sender ack stream', function(t) {
var pair = DuplexPair();
var apple = rand();
receiver(pair.a);
sender(pair.b);
function sender(duplexStream) {
var emitter = PeerEmitter(duplexStream);
var stream = emitter.WriteStream('apples');
var ackStream = stream.AckStream();
var apple = rand();
stream.write(apple);
ackStream.on('data', function(d) {
t.equals(d, apple, 'ack provides sent objects');
t.end();
});
}
function receiver(duplexStream) {
var emitter = PeerEmitter(duplexStream);
var stream = emitter.ReadStream('apples');
stream.on('data', function(_) {
// nothing to do here :/
});
}
});
test('sender timeout stream', function(t) {
var pair = DuplexPair();
var apple = rand();
sender(pair.b);
function sender(duplexStream) {
var emitter = PeerEmitter(duplexStream, { timeout: 20 });
var stream = emitter.WriteStream('apples');
var timeoutStream = stream.TimeoutStream();
var apple = rand();
stream.write(apple);
timeoutStream.on('data', function(d) {
t.equals(d, apple, 'ack provides sent objects');
t.end();
});
}
});
test('can only get one ack and on timeout stream per stream', function(t) {
var pair = DuplexPair();
var emitter = PeerEmitter(pair.a);
var writeStream = emitter.WriteStream('apples');
var readStream = emitter.ReadStream('apples');
writeStream.AckStream();
try {
writeStream.AckStream();
t.fail('should have thrown an error');
} catch (e) {}
writeStream.TimeoutStream();
try {
writeStream.TimeoutStream();
t.fail('should have thrown an error');
} catch (e) {}
readStream.AckStream();
try {
readStream.AckStream();
t.fail('should have thrown an error');
} catch (e) {}
t.end();
});
test('stream specific timeout', function(t) {
var pair = DuplexPair();
var emitter = PeerEmitter(pair.a);
var stream = emitter.WriteStream('apples');
var timeoutStream = stream.TimeoutStream({ timeout: 20 });
timeoutStream.on('data', function(d) {
t.end();
});
stream.write(rand());
setTimeout(function() { t.fail('took too long to timeout'); t.end(); }, 80);
});
test('receiver semantic ack stream', function(t) {
var pair = DuplexPair();
var ackedApple = rand();
var timeoutApple = rand();
receiver(pair.a);
sender(pair.b);
function sender(duplexStream) {
var emitter = PeerEmitter(duplexStream);
var stream = emitter.WriteStream('apples');
var ackStream = stream.AckStream();
var timeoutStream = stream.TimeoutStream({ timeout: 20 });
var acked;
stream.write(ackedApple)
stream.write(timeoutApple);
ackStream.on('data', function(d) {
t.equals(d, ackedApple, 'acked correct data');
acked = true;
});
timeoutStream.on('data', function(d) {
t.ok(acked, 'did ack');
t.equals(d, timeoutApple, 'timedout correct data');
t.end();
});
}
function receiver(duplexStream) {
var emitter = PeerEmitter(duplexStream);
var stream = emitter.ReadStream('apples');
var ackStream = stream.AckStream();
stream.on('data', function(d) {
if (d === timeoutApple)
return;
ackStream.write(d);
});
}
});
test('receiver throws on unknown object', function(t) {
var pair = DuplexPair();
var emitter = PeerEmitter(pair.a);
var readStream = emitter.ReadStream('apples');
var ackStream = readStream.AckStream();
try {
ackStream.write(rand());
t.fail('should have thrown an error');
} catch (e) {}
t.end();
});