in packages/dubbo-web/src/grpc-web-transport.ts [159:209]
next: async (req: UnaryRequest<I, O>): Promise<UnaryResponse<I, O>> => {
const response = await fetch(req.url, {
...req.init,
headers: req.header,
signal: req.signal,
body: encodeEnvelope(0, serialize(req.message)),
});
validateResponse(response.status, response.headers);
if (!response.body) {
throw "missing response body";
}
const reader = createEnvelopeReadableStream(
response.body
).getReader();
let trailer: Headers | undefined;
let message: O | undefined;
for (;;) {
const r = await reader.read();
if (r.done) {
break;
}
const { flags, data } = r.value;
if (flags === trailerFlag) {
if (trailer !== undefined) {
throw "extra trailer";
}
// Unary responses require exactly one response message, but in
// case of an error, it is perfectly valid to have a response body
// that only contains error trailers.
trailer = trailerParse(data);
continue;
}
if (message !== undefined) {
throw "extra message";
}
message = parse(data);
}
if (trailer === undefined) {
throw "missing trailer";
}
validateTrailer(trailer);
if (message === undefined) {
throw "missing message";
}
return <UnaryResponse<I, O>>{
stream: false,
header: response.headers,
message,
trailer,
};
},