Web-сокеты, web-воркеры и пулл соединений

Недавно стало интересно, а что если для передачи данных между javascript-частью web-приложения и backend-ом использовать пулл websocket-соединений, например, возможно, это будет интересным вариантом увеличения производительности какого-то очень толстого javascript-браузерного-приложения (например, игрушки типа Warcraft 3 прямо в браузере, где куча юнитов что-то постоянно делает и с чем-то взаимодействует).

Для полноты неординарности решения, было интересно использовать web-воркер, как посредника между пулом вебсокетов и основной частью приложения. Как оказалось (issue, спасибо, @_prefer), так можно делать далеко не везде, например, Firefox вообще не позволяет использовать web-сокеты из web-воркеров. Чтож, зато так можно делать по крайней мере в Google Chrome. Приступим.

1. Транспорт на web-воркере и пуле web-сокетов.

<script id="worker" type="text/js-worker">
    var createSocket = function(){
        var ws = new WebSocket('wss://echo.websocket.org');
        ws.onmessage = function(e) {
            this.postMessage(e.data);
        }.bind(this);
    
        return ws;
    }.bind(this);
    
    var requestsPool = [];
    var socketsPool = [
        createSocket(), createSocket(), createSocket()
    ];
    
    this.onmessage = function (e) {
        requestsPool.push(e.data);
    };
    
    this.setInterval(function(){
        var ws = socketsPool[Math.floor(Math.random() * socketsPool.length)];
        if (requestsPool.length && ws.readyState == 1) {
            ws.send(requestsPool.pop());
        }
    }, 0);
</script>

2. Использование транспорта.

var workerBlob = new Blob(
    [document.querySelector('#worker').textContent], 
    {type: "text/javascript"}
),
    worker = new Worker(window.URL.createObjectURL(workerBlob));

var messagesPerSecond = 0;
window.setInterval(function(){
    console.log('Messages per second: ', messagesPerSecond);
    messagesPerSecond = 0;
}, 1000);

worker.onmessage = function (e) {
    messagesPerSecond++;
};

window.setInterval(function(){
    worker.postMessage('hello-' + Math.random());
}, 0);

Вот примеры этого велосипеда на jsfiddle: медленно и очень быстро.