diff --git a/engine.io.js b/engine.io.js index 7caae79a..c2482c69 100644 --- a/engine.io.js +++ b/engine.io.js @@ -1932,21 +1932,6 @@ module.exports = WS; var global = require('global'); -/** - * Does the supported WebSocket standard support binary data if on browser? - */ - -var standardBinarySupport = (function() { - (!global.document || 'binaryType' in (new WebSocket('ws://0.0.0.0'))); - if (global.document) { - try { - return 'binaryType' in (new WebSocket('ws://0.0.0.0')); - } catch(e) { return false; } - } - - return true; -})(); - /** * WebSocket transport constructor. * @@ -1998,13 +1983,8 @@ WS.prototype.doOpen = function(){ var opts = { agent: this.agent }; this.ws = new WebSocket(uri, protocols, opts); - var standardBinarySupport = (function() { - try { - return 'binaryType' in this.ws; - } catch(e) { return false; } - })(); - if (!standardBinarySupport) { + if (!this.ws.binaryType) { this.supportsBinary = false; } diff --git a/test/arraybuffer.js b/test/arraybuffer.js new file mode 100644 index 00000000..98c7c8f6 --- /dev/null +++ b/test/arraybuffer.js @@ -0,0 +1,104 @@ +var expect = require('expect.js'); +var eio = require('../'); + +describe('arraybuffer', function() { + it('should be able to receive binary data when bouncing it back (polling)', function(done) { + var binaryData = new Int8Array(5); + for (var i = 0; i < 5; i++) binaryData[i] = i; + var socket = new eio.Socket({ transports: ['polling'] }); + socket.on('open', function() { + socket.send(binaryData); + socket.on('message', function (data) { + if (data === 'hi') return; + + expect(data).to.be.an(ArrayBuffer); + expect(new Int8Array(data)).to.eql(binaryData); + socket.close(); + done(); + }); + }); + }); + + it('should be able to receive binary data when forcing base64 (polling)', function(done) { + var binaryData = new Int8Array(5); + for (var i = 0; i < 5; i++) binaryData[i] = i; + var socket = new eio.Socket({ forceBase64: true }); + socket.on('open', function() { + socket.send(binaryData); + socket.on('message', function (data) { + if (typeof data === 'string') return; + + expect(data).to.be.an(ArrayBuffer); + var ia = new Int8Array(data); + expect(ia).to.eql(binaryData); + socket.close(); + done(); + }); + }); + }); + + it('should be able to receive binary data when forcing base64 and not decode it when overriding ArrayBuffer (polling)', function(done) { + var binaryData = new Int8Array(5); + for (var i = 0; i < 5; i++) binaryData[i] = i; + var socket = new eio.Socket({ forceBase64: true }); + socket.on('open', function() { + socket.send(binaryData); + var ab = global.ArrayBuffer; + global.ArrayBuffer = undefined; + var firstPacket = true; + socket.on('message', function (data) { + if (firstPacket) { + firstPacket = false; + return; + } + + expect(data.base64).to.be(true); + expect(data.data).to.equal('AAECAwQ='); + + global.ArrayBuffer = ab; + socket.close(); + done(); + }); + }); + }); + + it('should be able to receive binary data when bouncing it back (ws)', function(done) { + var binaryData = new Int8Array(5); + for (var i = 0; i < 5; i++) binaryData[i] = i; + var socket = new eio.Socket(); + socket.on('open', function() { + socket.on('upgrade', function() { + socket.send(binaryData); + socket.on('message', function (data) { + if (typeof data === 'string') return; + + expect(data).to.be.an(ArrayBuffer); + expect(new Int8Array(data)).to.eql(binaryData); + + socket.close(); + done(); + }); + }); + }); + }); + + it('should be able to receive binary data when bouncing it back and forcing base64 (ws)', function(done) { + var binaryData = new Int8Array(5); + for (var i = 0; i < 5; i++) binaryData[i] = i; + var socket = new eio.Socket({ forceBase64: true }); + socket.on('open', function() { + socket.on('upgrade', function() { + socket.send(binaryData); + socket.on('message', function (data) { + if (typeof data === 'string') return; + + expect(data).to.be.an(ArrayBuffer); + expect(new Int8Array(data)).to.eql(binaryData); + + socket.close(); + done(); + }); + }); + }); + }); +}); diff --git a/test/blob.js b/test/blob.js new file mode 100644 index 00000000..baa5df35 --- /dev/null +++ b/test/blob.js @@ -0,0 +1,102 @@ +var expect = require('expect.js'); +var eio = require('../'); + +describe('blob', function() { + it('should be able to receive binary data as blob when bouncing it back (polling)', function(done) { + var binaryData = new Int8Array(5); + for (var i = 0; i < 5; i++) binaryData[i] = i; + var socket = new eio.Socket(); + socket.binaryType = 'blob'; + socket.on('open', function() { + socket.send(binaryData); + socket.on('message', function (data) { + if (typeof data === 'string') return; + + expect(data).to.be.a(Blob); + var fr = new FileReader(); + fr.onload = function() { + var ab = this.result; + var ia = new Int8Array(ab); + expect(ia).to.eql(binaryData); + socket.close(); + done(); + }; + fr.readAsArrayBuffer(data); + }); + }); + }); + it('should be able to receive binary data as blob when bouncing it back (ws)', function(done) { + var binaryData = new Int8Array(5); + for (var i = 0; i < 5; i++) binaryData[i] = i; + var socket = new eio.Socket(); + socket.binaryType = 'blob'; + socket.on('open', function() { + socket.on('upgrade', function() { + socket.send(binaryData); + socket.on('message', function (data) { + expect(data).to.be.a(Blob); + var fr = new FileReader(); + fr.onload = function() { + var ab = this.result; + var ia = new Int8Array(ab); + expect(ia).to.eql(binaryData); + socket.close(); + done(); + }; + fr.readAsArrayBuffer(data); + }); + }); + }); + }); + + it('should be able to send data as a blob when bouncing it back (ws)', function(done) { + var binaryData = new Int8Array(5); + for (var i = 0; i < 5; i++) binaryData[i] = i; + var socket = new eio.Socket(); + socket.on('open', function() { + socket.on('upgrade', function() { + socket.send(new Blob([binaryData])); + socket.on('message', function (data) { + expect(data).to.be.an(ArrayBuffer); + expect(new Int8Array(data)).to.eql(binaryData); + socket.close(); + done(); + }); + }); + }); + }); + + it('should be able to send data as a blob when bouncing it back (polling)', function(done) { + var binaryData = new Int8Array(5); + for (var i = 0; i < 5; i++) binaryData[i] = i; + var socket = new eio.Socket(); + socket.on('open', function() { + socket.send(new Blob([binaryData])); + socket.on('message', function (data) { + if (typeof data == 'string') { return; } + + expect(data).to.be.an(ArrayBuffer); + expect(new Int8Array(data)).to.eql(binaryData); + socket.close(); + done(); + }); + }); + }); + + it('should be able to send data as a blob encoded into base64 when bouncing it back (ws)', function(done) { + var binaryData = new Int8Array(5); + for (var i = 0; i < 5; i++) binaryData[i] = i; + var socket = new eio.Socket({ forceBase64: true }); + socket.on('open', function() { + socket.on('upgrade', function() { + socket.send(new Blob([binaryData])); + socket.on('message', function (data) { + expect(data).to.be.an(ArrayBuffer); + expect(new Int8Array(data)).to.eql(binaryData); + socket.close(); + done(); + }); + }); + }); + }); +}); diff --git a/test/connection.js b/test/connection.js index c9650444..ecc64c4b 100644 --- a/test/connection.js +++ b/test/connection.js @@ -15,206 +15,6 @@ describe('connection', function() { }); }); - it('should be able to receive binary data when bouncing it back (polling)', function(done) { - var binaryData = new Int8Array(5); - for (var i = 0; i < 5; i++) binaryData[i] = i; - var socket = new eio.Socket({ transports: ['polling'] }); - socket.on('open', function() { - socket.send(binaryData); - socket.on('message', function (data) { - if (data === 'hi') return; - - expect(data).to.be.an(ArrayBuffer); - expect(new Int8Array(data)).to.eql(binaryData); - socket.close(); - done(); - }); - }); - }); - - it('should be able to receive binary data as blob when bouncing it back (polling)', function(done) { - var binaryData = new Int8Array(5); - for (var i = 0; i < 5; i++) binaryData[i] = i; - var socket = new eio.Socket(); - socket.binaryType = 'blob'; - socket.on('open', function() { - socket.send(binaryData); - socket.on('message', function (data) { - if (typeof data === 'string') return; - - expect(data).to.be.a(Blob); - var fr = new FileReader(); - fr.onload = function() { - var ab = this.result; - var ia = new Int8Array(ab); - expect(ia).to.eql(binaryData); - socket.close(); - done(); - }; - fr.readAsArrayBuffer(data); - }); - }); - }); - - it('should be able to receive binary data when forcing base64 (polling)', function(done) { - var binaryData = new Int8Array(5); - for (var i = 0; i < 5; i++) binaryData[i] = i; - var socket = new eio.Socket({ forceBase64: true }); - socket.on('open', function() { - socket.send(binaryData); - socket.on('message', function (data) { - if (typeof data === 'string') return; - - expect(data).to.be.an(ArrayBuffer); - var ia = new Int8Array(data); - expect(ia).to.eql(binaryData); - socket.close(); - done(); - }); - }); - }); - - it('should be able to receive binary data when forcing base64 and not decode it when overriding ArrayBuffer (polling)', function(done) { - var binaryData = new Int8Array(5); - for (var i = 0; i < 5; i++) binaryData[i] = i; - var socket = new eio.Socket({ forceBase64: true }); - socket.on('open', function() { - socket.send(binaryData); - var ab = global.ArrayBuffer; - global.ArrayBuffer = undefined; - var firstPacket = true; - socket.on('message', function (data) { - if (firstPacket) { - firstPacket = false; - return; - } - - expect(data.base64).to.be(true); - expect(data.data).to.equal('AAECAwQ='); - - global.ArrayBuffer = ab; - socket.close(); - done(); - }); - }); - }); - - it('should be able to receive binary data when bouncing it back (ws)', function(done) { - var binaryData = new Int8Array(5); - for (var i = 0; i < 5; i++) binaryData[i] = i; - var socket = new eio.Socket(); - socket.on('open', function() { - socket.on('upgrade', function() { - socket.send(binaryData); - socket.on('message', function (data) { - if (typeof data === 'string') return; - - expect(data).to.be.an(ArrayBuffer); - expect(new Int8Array(data)).to.eql(binaryData); - - socket.close(); - done(); - }); - }); - }); - }); - - it('should be able to receive binary data as blob when bouncing it back (ws)', function(done) { - var binaryData = new Int8Array(5); - for (var i = 0; i < 5; i++) binaryData[i] = i; - var socket = new eio.Socket(); - socket.binaryType = 'blob'; - socket.on('open', function() { - socket.on('upgrade', function() { - socket.send(binaryData); - socket.on('message', function (data) { - expect(data).to.be.a(Blob); - var fr = new FileReader(); - fr.onload = function() { - var ab = this.result; - var ia = new Int8Array(ab); - expect(ia).to.eql(binaryData); - socket.close(); - done(); - }; - fr.readAsArrayBuffer(data); - }); - }); - }); - }); - - it('should be able to send data as a blob when bouncing it back (ws)', function(done) { - var binaryData = new Int8Array(5); - for (var i = 0; i < 5; i++) binaryData[i] = i; - var socket = new eio.Socket(); - socket.on('open', function() { - socket.on('upgrade', function() { - socket.send(new Blob([binaryData])); - socket.on('message', function (data) { - expect(data).to.be.an(ArrayBuffer); - expect(new Int8Array(data)).to.eql(binaryData); - socket.close(); - done(); - }); - }); - }); - }); - - it('should be able to send data as a blob when bouncing it back (polling)', function(done) { - var binaryData = new Int8Array(5); - for (var i = 0; i < 5; i++) binaryData[i] = i; - var socket = new eio.Socket(); - socket.on('open', function() { - socket.send(new Blob([binaryData])); - socket.on('message', function (data) { - if (typeof data == 'string') { return; } - - expect(data).to.be.an(ArrayBuffer); - expect(new Int8Array(data)).to.eql(binaryData); - socket.close(); - done(); - }); - }); - }); - - it('should be able to send data as a blob encoded into base64 when bouncing it back (ws)', function(done) { - var binaryData = new Int8Array(5); - for (var i = 0; i < 5; i++) binaryData[i] = i; - var socket = new eio.Socket({ forceBase64: true }); - socket.on('open', function() { - socket.on('upgrade', function() { - socket.send(new Blob([binaryData])); - socket.on('message', function (data) { - expect(data).to.be.an(ArrayBuffer); - expect(new Int8Array(data)).to.eql(binaryData); - socket.close(); - done(); - }); - }); - }); - }); - - it('should be able to receive binary data when bouncing it back and forcing base64 (ws)', function(done) { - var binaryData = new Int8Array(5); - for (var i = 0; i < 5; i++) binaryData[i] = i; - var socket = new eio.Socket({ forceBase64: true }); - socket.on('open', function() { - socket.on('upgrade', function() { - socket.send(binaryData); - socket.on('message', function (data) { - if (typeof data === 'string') return; - - expect(data).to.be.an(ArrayBuffer); - expect(new Int8Array(data)).to.eql(binaryData); - - socket.close(); - done(); - }); - }); - }); - }); - - // no `Worker` on old IE if (global.Worker) { it('should work in a worker', function(done){ diff --git a/test/index.js b/test/index.js index 98439192..02296f10 100644 --- a/test/index.js +++ b/test/index.js @@ -16,5 +16,11 @@ require('./transport'); // browser only tests if (env.browser) { require('./connection'); - require('./browser-only-parser'); + if (global.ArrayBuffer) { + require('./browser-only-parser'); + require('./arraybuffer'); + } + if (global.Blob) { + require('./blob'); + } }