mirror of https://github.com/grpc/grpc-node.git
Merge pull request #887 from murgatroid99/grpc-js_connect_metadata_promise
grpc-js: Change how filters access connectivity information
This commit is contained in:
commit
5eb17fc559
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue