Объединение двух потоков SSE на клиенте, асинхронно

Есть два SSE-стрима. Нужно собрать данные из обоих, отфильтровать, соединить, выкинуть лишнее, навести красоту и выдать пользователю по вебсокетам.

Примерный схематичный код:

var resultArray = [];
var source = new EventSource('https://example.com/stream1,stream2');
source.onmessage = function(e) {
// если 1-й массив уже пришёл
    if (resultArray.hasOwnProperty(e.data.id]))
        // тут много работы над пришедшим 2-м массивом
        // объединяем массивы
        resultArray[e.data.id] = resultArray[e.data.id].concat(e.data);
        // отправка
        ws.send(resultArray[e.data.id]);
        // удаляем
        delete resultArray[e.data.id]
// если 1-й массив ещё не приходил
   } else {
       // тут много работы над пришедшим 1-м массивом
        resultArray[e.data.id] = e.data
   }

Всё работает замечательно. За исключением того, что в итоговом массиве какая-то белиберда и мешанина. Подозреваю, что это из-за асинхронного доступа к массиву — функции не успевают отработать до поступления массива со второго стрима.

Как лучше сделать, господа? Может, есть вообще какие-то уже готовые решения для создания такого вот «SSE-прокси»? Мне только всякий ад приходит в голову — запись массивов по отдельности с ключами id-уник.ключ и id-уник.ключ и пытаться по истечению допустим 10 секунд их отыскать и с ними работать, если оба на месте.


Ответы (0 шт):