recv method

Future<RecvResult<T>> recv()
inherited

Implementation

Future<RecvResult<T>> recv() async {
  if (localRecvChannel case final lc?) return lc.recv();

  if (isRecvClosed) return const RecvErrorDisconnected();
  final t0 = mx.startRecvTimer();

  final v0 = buf.tryPop();
  if (v0 != null) {
    mx.recvOk(t0);
    return RecvOk<T>(v0);
  }

  if (recvDisconnected) return const RecvErrorDisconnected();

  while (true) {
    final c = buf.addPopWaiter();
    if (recvDisconnected) {
      buf.removePopWaiter(c);
      return const RecvErrorDisconnected();
    }
    try {
      final v1 = await c.future;
      mx.recvOk(t0);
      return RecvOk<T>(v1);
    } catch (e) {
      return (e is RecvError) ? e : RecvErrorFailed(e);
    }
  }
}