Merge pull request #887 from murgatroid99/grpc-js_connect_metadata_promise

grpc-js: Change how filters access connectivity information
This commit is contained in:
Michael Lumish 2019-05-29 09:53:51 -07:00 committed by GitHub
commit 5eb17fc559
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 15 additions and 36 deletions

View File

@ -329,11 +329,14 @@ export class Http2Channel extends EventEmitter implements Channel {
stream: Http2CallStream, stream: Http2CallStream,
metadata: Metadata metadata: Metadata
) { ) {
const finalMetadata: Promise<Metadata> = stream.filterStack.sendMetadata( const connectMetadata: Promise<Metadata> = this.connect().then(
Promise.resolve(metadata.clone()) () => metadata
); );
Promise.all([finalMetadata, this.connect()]) const finalMetadata: Promise<Metadata> = stream.filterStack.sendMetadata(
.then(([metadataValue]) => { connectMetadata
);
finalMetadata
.then(metadataValue => {
const headers = metadataValue.toHttp2Headers(); const headers = metadataValue.toHttp2Headers();
headers[HTTP2_HEADER_AUTHORITY] = authority; headers[HTTP2_HEADER_AUTHORITY] = authority;
headers[HTTP2_HEADER_USER_AGENT] = this.userAgent; headers[HTTP2_HEADER_USER_AGENT] = this.userAgent;

View File

@ -70,41 +70,17 @@ export class DeadlineFilter extends BaseFilter implements Filter {
} }
} }
sendMetadata(metadata: Promise<Metadata>) { async sendMetadata(metadata: Promise<Metadata>) {
if (this.deadline === Infinity) { if (this.deadline === Infinity) {
return metadata; return metadata;
} }
return new Promise<Metadata>((resolve, reject) => { /* The input metadata promise depends on the original channel.connect()
if ( * promise, so when it is complete that implies that the channel is
this.channel.getConnectivityState(false) === ConnectivityState.READY * connected */
) { const finalMetadata = await metadata;
resolve(metadata); const timeoutString = getDeadline(this.deadline);
} else { finalMetadata.set('grpc-timeout', timeoutString);
const handleStateChange = (newState: ConnectivityState) => { return finalMetadata;
if (newState === ConnectivityState.READY) {
resolve(metadata);
this.channel.removeListener(
'connectivityStateChanged',
handleStateChange
);
this.callStream.removeListener('status', handleStatus);
}
};
const handleStatus = () => {
reject(new Error('Call ended'));
this.channel.removeListener(
'connectivityStateChanged',
handleStateChange
);
};
this.channel.on('connectivityStateChanged', handleStateChange);
this.callStream.once('status', handleStatus);
}
}).then((finalMetadata: Metadata) => {
const timeoutString = getDeadline(this.deadline);
finalMetadata.set('grpc-timeout', timeoutString);
return finalMetadata;
});
} }
} }