anchor.diff:  
   class HttpComms extends Comms {
       Http.Client _client;
  +    _ReadBuffer _readBuffer;
   
       HttpComms(String myserver) : super(myserver) {
           if (server.endsWith("/")) server = server.substring(0, server.length - 1);
  +
  +        final int bytesPerPoint = 3 * 4 /* + 4*4 */;
  +        final int pointsPerTile = 1024 * 64;
  +        _readBuffer = new _ReadBuffer(bytesPerPoint * pointsPerTile);
       }
   
       @override
  
positive.code: 
      void close() {
          flush(force: true);
      }
  
      void append(ByteBuffer src, int p, int amt) {
          Uint8List src8 = new Uint8List.view(src);
          assert(used + amt <= maxsize);
          if (buf == null) {
              assert(used == 0);
              buf = new Uint8List(maxsize);
          }
          for (int i = p; i < p + amt; i++) {
              buf[used] = src8[i];
              used++;
          }
      }
  
      void flush({bool force: false}) {
          if (buf == null || used == 0) return;
          if (used < maxsize && !force) return;
          flushfunc(buf.buffer, used);
          buf = null;
          used = 0;
      }
  }
  
  
negative.code:     Future<bool> readAsBytes(String webpath, FlushFunc handler) {
          Completer c = new Completer();
  
          _readBuffer.open(handler);
  
          WebSocket ws = new WebSocket('ws://localhost:12345/points/');
          ws.onOpen.listen((_) {
  