recv method
Decode the next response into resp. EndOfStreamError means the call completed OK; StatusException reports the trailers status.
Implementation
Future<void> recv(Unmarshaler resp) async {
while (true) {
final StreamEvent? event;
if (deadline != null) {
try {
event = await _input
.get()
.timeout(deadline!.difference(DateTime.now()));
} on TimeoutException {
_terminated = true;
_endpoint.cancelStream(streamId);
throw StatusException(
Wire.codeDeadlineExceeded, 'deadline exceeded');
}
} else {
event = await _input.get();
}
if (event == null) {
_terminated = true;
throw StatusException(Wire.codeUnavailable, 'data channel closed');
}
switch (event.kind) {
case EventKind.headers:
headers = event.headers;
break;
case EventKind.data:
resp.unmarshalDc(event.payload!);
return;
case EventKind.trailers:
_terminated = true;
final status = event.status;
trailers = status?.trailers;
endTrace(Wire.statusName(status?.code ?? Wire.codeOk));
if (status != null && status.code != Wire.codeOk) {
throw status;
}
throw EndOfStreamError();
case EventKind.rst:
_terminated = true;
final status =
event.status ?? StatusException(Wire.codeUnavailable, 'stream reset');
trailers = status.trailers;
endTrace(Wire.statusName(status.code));
throw status;
default:
break;
}
}
}