How to convert a Dart Html client web socket response from Blob to Uint8List?

dart

Solution

According to this article, you need to use a FileReader to do this.

This example seems to work, the result type is a Uint8List when I tested this in Chrome.

  var blob = new Blob(['abc']);  
  var r = new FileReader();
  r.readAsArrayBuffer(blob);
  r.onLoadEnd.listen((e) {
    var data = r.result;
    print(data.runtimeType);
  });

Another option is to set WebSocket.binaryType to "arraybuffer". Then MessageEvent.data will return a ByteBuffer which can be turned into a Uint8List. See the example below.

import 'dart:html';
import 'dart:typed_data';

void main() {      

  var ws = new WebSocket('...')..binaryType = 'arraybuffer';

  ws.onMessage.listen((MessageEvent e) {
    ByteBuffer buf = e.data;
    var data = buf.asUint8List();
    // ...
  });
}

Problem

I’ve implemented my own binary message protocol for simple request/response objects from a Dart client to a Java server. These are encoded in Dart as an Uint8List and on the remote server in Java as a ByteBuffer. The round trip works for the WebSocket in [dart:io] because the websocket.listen stream handler in the Dart client command app is passed data typed as Uint8List. In [dart:html] the response data in MessageEvent.data received from the websocket.onMessage stream is typed as Blob. I’m not finding a way to convert the Blob to Uint8List. Because the response will often be a large binary array of numbers (double) that will be supplying data to a virtual scrolling context, I want to minimize copying. Could someone please point me in the right direction.

Original source