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,
metadata: Metadata
) {
const finalMetadata: Promise<Metadata> = stream.filterStack.sendMetadata(
Promise.resolve(metadata.clone())
const connectMetadata: Promise<Metadata> = this.connect().then(
() => metadata
);
Promise.all([finalMetadata, this.connect()])
.then(([metadataValue]) => {
const finalMetadata: Promise<Metadata> = stream.filterStack.sendMetadata(
connectMetadata
);
finalMetadata
.then(metadataValue => {
const headers = metadataValue.toHttp2Headers();
headers[HTTP2_HEADER_AUTHORITY] = authority;
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) {
return metadata;
}
return new Promise<Metadata>((resolve, reject) => {
if (
this.channel.getConnectivityState(false) === ConnectivityState.READY
) {
resolve(metadata);
} else {
const handleStateChange = (newState: ConnectivityState) => {
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;
});
/* The input metadata promise depends on the original channel.connect()
* promise, so when it is complete that implies that the channel is
* connected */
const finalMetadata = await metadata;
const timeoutString = getDeadline(this.deadline);
finalMetadata.set('grpc-timeout', timeoutString);
return finalMetadata;
}
}