Отправить JSON и большой двоичный объект вместе

Я пишу простой потоковый сервис.

Браузер открывает веб-сокет для сервера, затем другой браузер открывает новый сокет для того же сервера.

Браузер A регистрирует видео своей камерой (MediaRecorder API) и отправляет его на сервер.

Сервер транслировал это видео на другие подключенные браузеры.

У меня есть рабочая версия с Socket.IO, но я хотел бы сделать это на ванильном JavaScript (WebSocket.Server на сервере Node.js и webSocket на клиенте).

Это проблема:

С socket.io можно написать что-то вроде этого:

  this.socket.emit('broadcast', {
    stream: new Blob(stream, {'type': `video/webm${MEDIA_CHARSET}`}),
    from: {id: this.socket.id}
  });

Поток исходит из mediarecorder -> прослушиватель событий доступных данных

Но с собственным веб-сокетом я не могу отправить BLOB-объект, встроенный в объект JSON, потому что веб-сокет может отправлять только строку или буфер массива.

Я пробовал много разных способов, чтобы отправить JSON и большой двоичный объект вместе, но ничего не работает.

Любая помощь?

Можно ли использовать только Engine.IO на стороне клиента, чтобы упаковать сообщение с blob и JSON вместе? Есть идеи по этому поводу?


person wiulma    schedule 04.07.2018    source источник


Ответы (1)


Существует множество способов сериализации ваших данных для отправки через двоичный веб-сокет. Я бы порекомендовал рассмотреть CBOR, который сериализуется в двоичный, а также поддерживает двоичные данные внутри него.

В NPM есть несколько библиотек CBOR на выбор.

person Brad    schedule 04.07.2018
comment
Я проверил github.com/paroga/cbor-js, но, кажется, все еще могу' t отправлять большой двоичный объект или буфер массива. Кажется, библиотека не управляет типом данных ArrayBuffer и отправляет пустой объект. По этому поводу также открыт вопрос. - person wiulma; 06.07.2018
comment
@wiulma Похоже, вам просто нужно использовать вместо этого Uint8Array ... В любом случае, есть несколько других пакетов для CBOR. - person Brad; 06.07.2018