promisify receiveUnaryMessage server-call

This commit is contained in:
Cedric Kassen 2023-07-12 13:32:35 +02:00
parent 1cc36e8df8
commit 14b18a4bba
2 changed files with 116 additions and 127 deletions

View File

@ -553,13 +553,8 @@ export class Http2ServerCallStream<
return metadata; return metadata;
} }
receiveUnaryMessage( receiveUnaryMessage(encoding: string): Promise<RequestType | void> {
encoding: string, return new Promise((resolve, reject) => {
next: (
err: Partial<ServerStatusResponse> | null,
request?: RequestType
) => void
): void {
const { stream } = this; const { stream } = this;
let receivedLength = 0; let receivedLength = 0;
@ -569,18 +564,19 @@ export class Http2ServerCallStream<
const body: Buffer[] = []; const body: Buffer[] = [];
const limit = this.maxReceiveMessageSize; const limit = this.maxReceiveMessageSize;
stream.on('data', onData); this.stream.on('data', onData);
stream.on('end', onEnd); this.stream.on('end', onEnd);
stream.on('error', onEnd); this.stream.on('error', onEnd);
function onData(chunk: Buffer) { async function onData(chunk: Buffer) {
receivedLength += chunk.byteLength; receivedLength += chunk.byteLength;
if (limit !== -1 && receivedLength > limit) { if (limit !== -1 && receivedLength > limit) {
stream.removeListener('data', onData); stream.removeListener('data', onData);
stream.removeListener('end', onEnd); stream.removeListener('end', onEnd);
stream.removeListener('error', onEnd); stream.removeListener('error', onEnd);
next({
reject({
code: Status.RESOURCE_EXHAUSTED, code: Status.RESOURCE_EXHAUSTED,
details: `Received message larger than max (${receivedLength} vs. ${limit})`, details: `Received message larger than max (${receivedLength} vs. ${limit})`,
}); });
@ -590,18 +586,18 @@ export class Http2ServerCallStream<
body.push(chunk); body.push(chunk);
} }
function onEnd(err?: Error) { async function onEnd(err?: Error) {
stream.removeListener('data', onData); stream.removeListener('data', onData);
stream.removeListener('end', onEnd); stream.removeListener('end', onEnd);
stream.removeListener('error', onEnd); stream.removeListener('error', onEnd);
if (err !== undefined) { if (err !== undefined) {
next({ code: Status.INTERNAL, details: err.message }); reject({ code: Status.INTERNAL, details: err.message });
return; return;
} }
if (receivedLength === 0) { if (receivedLength === 0) {
next({ reject({
code: Status.INTERNAL, code: Status.INTERNAL,
details: 'received empty unary message', details: 'received empty unary message',
}); });
@ -619,14 +615,15 @@ export class Http2ServerCallStream<
); );
if (Buffer.isBuffer(decompressedMessage)) { if (Buffer.isBuffer(decompressedMessage)) {
call.safeDeserializeMessage(decompressedMessage, next); call.safeDeserializeMessage(decompressedMessage, resolve, reject);
return; return;
} }
decompressedMessage.then( decompressedMessage.then(
decompressed => call.safeDeserializeMessage(decompressed, next), decompressed =>
call.safeDeserializeMessage(decompressed, resolve, reject),
(err: any) => (err: any) =>
next( reject(
err.code err.code
? err ? err
: { : {
@ -636,19 +633,20 @@ export class Http2ServerCallStream<
) )
); );
} }
});
} }
private safeDeserializeMessage( private safeDeserializeMessage(
buffer: Buffer, buffer: Buffer,
next: ( resolve: (
err: Partial<ServerStatusResponse> | null, value: void | RequestType | PromiseLike<void | RequestType>
request?: RequestType ) => void,
) => void reject: (reason: any) => void
) { ) {
try { try {
next(null, this.deserializeMessage(buffer)); resolve(this.deserializeMessage(buffer));
} catch (err) { } catch (err) {
next({ reject({
details: getErrorMessage(err), details: getErrorMessage(err),
code: Status.INTERNAL, code: Status.INTERNAL,
}); });

View File

@ -96,6 +96,7 @@ function getUnimplementedStatusResponse(
return { return {
code: Status.UNIMPLEMENTED, code: Status.UNIMPLEMENTED,
details: `The server does not implement the method ${methodName}`, details: `The server does not implement the method ${methodName}`,
metadata: new Metadata(),
}; };
} }
@ -1176,17 +1177,13 @@ export class Server {
} }
} }
function handleUnary<RequestType, ResponseType>( async function handleUnary<RequestType, ResponseType>(
call: Http2ServerCallStream<RequestType, ResponseType>, call: Http2ServerCallStream<RequestType, ResponseType>,
handler: UnaryHandler<RequestType, ResponseType>, handler: UnaryHandler<RequestType, ResponseType>,
metadata: Metadata, metadata: Metadata,
encoding: string encoding: string
): void { ): Promise<void> {
call.receiveUnaryMessage(encoding, (err, request) => { const request = await call.receiveUnaryMessage(encoding);
if (err) {
call.sendError(err);
return;
}
if (request === undefined || call.cancelled) { if (request === undefined || call.cancelled) {
return; return;
@ -1209,7 +1206,6 @@ function handleUnary<RequestType, ResponseType>(
call.sendUnaryMessage(err, value, trailer, flags); call.sendUnaryMessage(err, value, trailer, flags);
} }
); );
});
} }
function handleClientStreaming<RequestType, ResponseType>( function handleClientStreaming<RequestType, ResponseType>(
@ -1243,17 +1239,13 @@ function handleClientStreaming<RequestType, ResponseType>(
handler.func(stream, respond); handler.func(stream, respond);
} }
function handleServerStreaming<RequestType, ResponseType>( async function handleServerStreaming<RequestType, ResponseType>(
call: Http2ServerCallStream<RequestType, ResponseType>, call: Http2ServerCallStream<RequestType, ResponseType>,
handler: ServerStreamingHandler<RequestType, ResponseType>, handler: ServerStreamingHandler<RequestType, ResponseType>,
metadata: Metadata, metadata: Metadata,
encoding: string encoding: string
): void { ): Promise<void> {
call.receiveUnaryMessage(encoding, (err, request) => { const request = await call.receiveUnaryMessage(encoding);
if (err) {
call.sendError(err);
return;
}
if (request === undefined || call.cancelled) { if (request === undefined || call.cancelled) {
return; return;
@ -1267,7 +1259,6 @@ function handleServerStreaming<RequestType, ResponseType>(
); );
handler.func(stream); handler.func(stream);
});
} }
function handleBidiStreaming<RequestType, ResponseType>( function handleBidiStreaming<RequestType, ResponseType>(