You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
338 lines
7.4 KiB
338 lines
7.4 KiB
var test = require('tape') |
|
var websocket = require('./') |
|
var echo = require("./echo-server") |
|
var WebSocketServer = require('ws').Server |
|
var http = require('http') |
|
var concat = require('concat-stream') |
|
var Buffer = require('safe-buffer').Buffer |
|
var ts = require('typescript') |
|
|
|
test('echo server', function(t) { |
|
|
|
echo.start(function() { |
|
var client = websocket(echo.url) |
|
|
|
client.on('error', console.error) |
|
|
|
client.on('data', function(data) { |
|
t.ok(Buffer.isBuffer(data), 'is a buffer') |
|
t.equal(data.toString(), 'hello world') |
|
client.end() |
|
echo.stop(function() { |
|
t.end() |
|
}) |
|
}) |
|
|
|
client.write('hello world') |
|
}) |
|
|
|
}) |
|
|
|
test('emitting not connected errors', function(t) { |
|
|
|
echo.start(function() { |
|
var client = websocket(echo.url) |
|
|
|
client.on('error', function() { |
|
echo.stop(function() { |
|
t.true(true, 'should emit error') |
|
t.end() |
|
}) |
|
}) |
|
|
|
client.once('data', function(data) { |
|
client.end() |
|
client.write('abcde') |
|
}) |
|
|
|
client.write('hello world') |
|
}) |
|
|
|
}) |
|
|
|
test('passes options to websocket constructor', function(t) { |
|
t.plan(3) |
|
|
|
opts = { |
|
verifyClient: function verifyClient(info) { |
|
t.equal(info.req.headers['x-custom-header'], 'Custom Value') |
|
return true |
|
} |
|
} |
|
echo.start(opts, function() { |
|
var options = {headers: {'x-custom-header': 'Custom Value'}} |
|
var client = websocket(echo.url, options) |
|
|
|
client.on('error', console.error) |
|
|
|
client.on('data', function(data) { |
|
t.ok(Buffer.isBuffer(data), 'is a buffer') |
|
t.equal(data.toString(), 'hello world') |
|
client.end() |
|
echo.stop(function() {}) |
|
}) |
|
|
|
client.write('hello world') |
|
}) |
|
|
|
}) |
|
|
|
|
|
test('destroy', function(t) { |
|
t.plan(1) |
|
|
|
echo.start(function() { |
|
var client = websocket(echo.url, echo.options) |
|
|
|
client.on('close', function() { |
|
echo.stop(function() { |
|
t.pass('destroyed') |
|
}) |
|
}) |
|
|
|
setTimeout(function() { |
|
client.destroy() |
|
}, 200) |
|
}) |
|
|
|
}) |
|
|
|
test('drain', function(t) { |
|
t.plan(1) |
|
|
|
echo.start(function() { |
|
var client = websocket(echo.url, echo.options) |
|
|
|
client.on('drain', function() { |
|
client.destroy() |
|
echo.stop(function() { |
|
t.pass('drained') |
|
}) |
|
}) |
|
|
|
// write until buffer is full |
|
while (client.write('foobar')) {} |
|
}) |
|
|
|
}) |
|
|
|
test('emit sending errors if the socket is closed by the other party', function(t) { |
|
|
|
var server = http.createServer() |
|
var wss = new WebSocketServer({ server: server }) |
|
|
|
server.listen(8344, function() { |
|
var client = websocket('ws://localhost:8344') |
|
|
|
wss.on('connection', function(ws) { |
|
var stream = websocket(ws) |
|
|
|
client.destroy() |
|
|
|
setTimeout(function() { |
|
stream.write('hello world') |
|
}, 50) |
|
|
|
stream.on('error', function(err) { |
|
t.ok(err, 'client errors') |
|
server.close(t.end.bind(t)) |
|
}) |
|
}) |
|
}) |
|
}) |
|
|
|
test('destroy client pipe should close server pipe', function(t) { |
|
t.plan(1) |
|
|
|
var clientDestroy = function() { |
|
var client = websocket(echo.url, echo.options) |
|
client.on('data', function(o) { |
|
client.destroy() |
|
}) |
|
client.write(Buffer.from('hello')) |
|
} |
|
|
|
var opts = {} |
|
var server = http.createServer() |
|
opts.server = server |
|
var wss = new WebSocketServer(opts) |
|
wss.on('connection', function(ws) { |
|
var stream = websocket(ws) |
|
stream.on('close', function() { |
|
server.close(function() { |
|
t.pass('close is called') |
|
}) |
|
}) |
|
stream.pipe(stream) |
|
}) |
|
server.listen(echo.port, clientDestroy) |
|
}) |
|
|
|
|
|
test('error on socket should forward it to pipe', function(t) { |
|
t.plan(1) |
|
|
|
var clientConnect = function() { |
|
websocket(echo.url, echo.options) |
|
} |
|
|
|
var opts = {} |
|
var server = http.createServer() |
|
opts.server = server |
|
var wss = new WebSocketServer(opts) |
|
wss.on('connection', function(ws) { |
|
var stream = websocket(ws) |
|
stream.on('error', function() { |
|
server.close(function() { |
|
t.pass('error is called') |
|
}) |
|
}) |
|
stream.socket.emit('error', new Error('Fake error')) |
|
}) |
|
server.listen(echo.port, clientConnect) |
|
}) |
|
|
|
test('stream end', function(t) { |
|
t.plan(1) |
|
|
|
var server = http.createServer() |
|
websocket.createServer({ server: server }, handle) |
|
|
|
function handle (stream) { |
|
stream.pipe(concat(function (body) { |
|
t.equal(body.toString(), 'pizza cats\n') |
|
server.close() |
|
})) |
|
} |
|
server.listen(0, function () { |
|
var w = websocket('ws://localhost:' + server.address().port) |
|
w.end('pizza cats\n') |
|
}) |
|
}) |
|
|
|
test('stream handlers should fire once per connection', function(t) { |
|
t.plan(2) |
|
|
|
var server = http.createServer() |
|
var wss = websocket.createServer({ server: server }, function() { |
|
server.close(function() { |
|
t.equal(m, 1) |
|
}) |
|
}) |
|
|
|
var m = 0 |
|
wss.on('stream', function(stream, request) { |
|
t.ok(request instanceof http.IncomingMessage) |
|
m++ |
|
}) |
|
server.listen(0, function() { |
|
var w = websocket('ws://localhost:' + server.address().port) |
|
w.end('pizza cats\n') |
|
}) |
|
}) |
|
|
|
test('client with writev', function(t) { |
|
var server = http.createServer() |
|
|
|
var str = '' |
|
var wss = websocket.createServer({ |
|
server: server |
|
}, function (stream) { |
|
stream.once('data', function(data) { |
|
t.ok(Buffer.isBuffer(data), 'is a buffer') |
|
t.equal(data.toString(), 'hello world') |
|
|
|
stream.once('data', function(data) { |
|
t.ok(Buffer.isBuffer(data), 'is a buffer') |
|
t.equal(data.toString(), str) |
|
stream.end() |
|
server.close() |
|
t.end() |
|
}) |
|
}) |
|
}) |
|
|
|
server.listen(8352, function () { |
|
var client = websocket('ws://localhost:8352', { |
|
objectMode: false |
|
}) |
|
|
|
client.on('error', console.error) |
|
|
|
client.once('connect', function () { |
|
client.cork() |
|
do { |
|
str += 'foobar' |
|
} while (client.write('foobar')) |
|
client.uncork() |
|
}) |
|
|
|
client.write('hello world') |
|
}) |
|
}) |
|
|
|
test('server with writev', function(t) { |
|
var server = http.createServer() |
|
|
|
var str = '' |
|
var wss = websocket.createServer({ |
|
server: server, |
|
objectMode: false |
|
}, function (stream) { |
|
stream.cork() |
|
do { |
|
str += 'foobar' |
|
} while (stream.write('foobar')) |
|
stream.uncork() |
|
}) |
|
|
|
server.listen(8352, function () { |
|
var client = websocket('ws://localhost:8352') |
|
|
|
client.on('error', console.error) |
|
|
|
client.once('data', function(data) { |
|
t.ok(Buffer.isBuffer(data), 'is a buffer') |
|
t.equal(data.toString(), str) |
|
client.end() |
|
server.close() |
|
t.end() |
|
}) |
|
}) |
|
}) |
|
|
|
test('stop echo', function(t) { |
|
echo.stop(function() { |
|
t.end() |
|
}) |
|
}) |
|
|
|
test('typescript compilation', function(t) { |
|
function compile(fileNames, options) { |
|
const program = ts.createProgram(fileNames, options) |
|
const emitResult = program.emit() |
|
|
|
const allDiagnostics = ts.getPreEmitDiagnostics(program).concat(emitResult.diagnostics) |
|
|
|
return allDiagnostics.map(diagnostic => { |
|
if (diagnostic.file) { |
|
let { line, character } = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start) |
|
let message = ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n") |
|
return `${diagnostic.file.fileName} (${line + 1},${character + 1}): ${message}` |
|
} else { |
|
return `${ts.flattenDiagnosticMessageText(diagnostic.messageText, "\n")}` |
|
} |
|
}); |
|
} |
|
|
|
const messages = compile(['./ts-tests.ts'], { |
|
noEmit: true, |
|
noImplicitAny: true, |
|
target: ts.ScriptTarget.ES5, |
|
module: ts.ModuleKind.CommonJS |
|
}) |
|
|
|
t.equal(messages.length, 0, 'no errors emitted') |
|
t.end() |
|
}) |
|
|
|
|