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,
|
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;
|
||||||
|
|
|
@ -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;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue