receiveMessage method

Receives a single WebSocket message.

Throws an Error on failure.

See NSURLSessionWebSocketTask.receiveMessageWithCompletionHandler:

Implementation

Future<URLSessionWebSocketMessage> receiveMessage() async {
  final completer = Completer<URLSessionWebSocketMessage>();
  final completionPort = ReceivePort();
  completionPort.listen((d) {
    final messageAndError = d as List;

    final mp = Pointer<ncb.ObjCObject>.fromAddress(messageAndError[0] as int);
    final ep = Pointer<ncb.ObjCObject>.fromAddress(messageAndError[1] as int);

    final message = mp.address == 0
        ? null
        : URLSessionWebSocketMessage._(
            ncb.NSURLSessionWebSocketMessage.castFromPointer(linkedLibs, mp,
                retain: false, release: true));
    final error = ep.address == 0
        ? null
        : Error._(ncb.NSError.castFromPointer(linkedLibs, ep,
            retain: false, release: true));

    if (error != null) {
      completer.completeError(error);
    } else {
      completer.complete(message!);
    }
    completionPort.close();
  });

  helperLibs.CUPHTTPReceiveMessage(
      _urlSessionWebSocketTask, completionPort.sendPort.nativePort);
  return completer.future;
}