mirror of https://github.com/grpc/grpc-node.git
Resolve comments
This commit is contained in:
parent
57e78eb9d6
commit
f012088ecc
|
|
@ -7,7 +7,7 @@ import {Status} from './constants';
|
|||
import {Metadata} from './metadata';
|
||||
import {ObjectDuplex} from './object-stream';
|
||||
import {Filter} from './filter'
|
||||
import {FilterStackFactory} from './filter-stack'
|
||||
import {FilterStackFactory} from './filter-stack';
|
||||
|
||||
const {
|
||||
HTTP2_HEADER_STATUS,
|
||||
|
|
@ -119,7 +119,7 @@ export class Http2CallStream extends stream.Duplex implements CallStream {
|
|||
}
|
||||
|
||||
private endCall(status: StatusObject): void {
|
||||
if (!this.finalStatus === null) {
|
||||
if (this.finalStatus === null) {
|
||||
this.finalStatus = status;
|
||||
this.emit('status', status);
|
||||
}
|
||||
|
|
@ -190,11 +190,7 @@ export class Http2CallStream extends stream.Duplex implements CallStream {
|
|||
} catch (e) {
|
||||
metadata = new Metadata();
|
||||
}
|
||||
let status: StatusObject = {
|
||||
code: code,
|
||||
details: details,
|
||||
metadata: metadata
|
||||
};
|
||||
let status: StatusObject = { code, details, metadata };
|
||||
this.filterStack.receiveTrailers(Promise.resolve(status)).then((finalStatus) => {
|
||||
this.endCall(finalStatus);
|
||||
}, (error) => {
|
||||
|
|
@ -213,6 +209,7 @@ export class Http2CallStream extends stream.Duplex implements CallStream {
|
|||
switch(this.readState) {
|
||||
case ReadState.NO_DATA:
|
||||
this.readCompressFlag = (data.readUInt8(readHead) !== 0);
|
||||
readHead += 1;
|
||||
this.readState = ReadState.READING_SIZE;
|
||||
this.readPartialSize.fill(0);
|
||||
this.readSizeRemaining = 4;
|
||||
|
|
@ -240,7 +237,7 @@ export class Http2CallStream extends stream.Duplex implements CallStream {
|
|||
// readMessageRemaining >=0 here
|
||||
if (this.readMessageRemaining === 0) {
|
||||
// At this point, we have read a full message
|
||||
let messageBytes = Buffer.concat(this.readPartialMessage, this.readMessageSize);
|
||||
const messageBytes = Buffer.concat(this.readPartialMessage, this.readMessageSize);
|
||||
// TODO(murgatroid99): Add receive message filters
|
||||
if (canPush) {
|
||||
if (!this.push(messageBytes)) {
|
||||
|
|
@ -250,6 +247,7 @@ export class Http2CallStream extends stream.Duplex implements CallStream {
|
|||
} else {
|
||||
this.unpushedReadMessages.push(messageBytes);
|
||||
}
|
||||
this.readState = ReadState.NO_DATA;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -295,6 +293,18 @@ export class Http2CallStream extends stream.Duplex implements CallStream {
|
|||
metadata: new Metadata()
|
||||
});
|
||||
});
|
||||
if (!this.pendingRead) {
|
||||
stream.pause();
|
||||
}
|
||||
if (this.pendingWrite) {
|
||||
if (!this.pendingWriteCallback) {
|
||||
throw new Error('Invalid state in write handling code');
|
||||
}
|
||||
stream.write(this.pendingWrite, this.pendingWriteCallback);
|
||||
}
|
||||
if (this.pendingFinalCallback) {
|
||||
stream.end(this.pendingFinalCallback);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -328,8 +338,8 @@ export class Http2CallStream extends stream.Duplex implements CallStream {
|
|||
this.pendingRead = true;
|
||||
} else {
|
||||
while (this.unpushedReadMessages.length > 0) {
|
||||
let nextMessage = this.unpushedReadMessages.shift();
|
||||
let keepPushing = this.push(nextMessage);
|
||||
const nextMessage = this.unpushedReadMessages.shift();
|
||||
const keepPushing = this.push(nextMessage);
|
||||
if (nextMessage === null || (!keepPushing)) {
|
||||
return;
|
||||
}
|
||||
|
|
@ -345,7 +355,7 @@ export class Http2CallStream extends stream.Duplex implements CallStream {
|
|||
private encodeMessage(message: WriteObject): Buffer {
|
||||
/* allocUnsafe doesn't initiate the bytes in the buffer. We are explicitly
|
||||
* overwriting every single byte, so that should be fine */
|
||||
let output: Buffer = Buffer.allocUnsafe(message.message.length + 5);
|
||||
const output: Buffer = Buffer.allocUnsafe(message.message.length + 5);
|
||||
// TODO(murgatroid99): handle compressed flag appropriately
|
||||
output.writeUInt8(0, 0);
|
||||
output.writeUInt32BE(message.message.length, 1);
|
||||
|
|
@ -355,7 +365,7 @@ export class Http2CallStream extends stream.Duplex implements CallStream {
|
|||
|
||||
_write(chunk: WriteObject, encoding: string, cb: Function) {
|
||||
// TODO(murgatroid99): Add send message filters
|
||||
let encodedMessage = this.encodeMessage(chunk);
|
||||
const encodedMessage = this.encodeMessage(chunk);
|
||||
if (this.http2Stream === null) {
|
||||
this.pendingWrite = encodedMessage;
|
||||
this.pendingWriteCallback = cb;
|
||||
|
|
|
|||
|
|
@ -103,8 +103,7 @@ class SecureChannelCredentialsImpl extends ChannelCredentialsImpl {
|
|||
}
|
||||
|
||||
compose(callCredentials: CallCredentials) : ChannelCredentialsImpl {
|
||||
const combinedCallCredentials =
|
||||
this.callCredentials.compose(callCredentials);
|
||||
const combinedCallCredentials = this.callCredentials.compose(callCredentials);
|
||||
return new SecureChannelCredentialsImpl(this.secureContext,
|
||||
combinedCallCredentials);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -82,12 +82,14 @@ export class Http2Channel extends EventEmitter implements Channel {
|
|||
} else {
|
||||
this.subChannel = http2.connect(this.address, {secureContext});
|
||||
}
|
||||
this.subChannel.on('connect', () => {
|
||||
this.subChannel.once('connect', () => {
|
||||
this.transitionToState(ConnectivityState.READY);
|
||||
});
|
||||
this.subChannel.setTimeout(IDLE_TIMEOUT_MS, () => {
|
||||
this.goIdle();
|
||||
});
|
||||
/* TODO(murgatroid99): add connection-level error handling with exponential
|
||||
* reconnection backoff */
|
||||
}
|
||||
|
||||
private goIdle(): void {
|
||||
|
|
@ -155,9 +157,8 @@ export class Http2Channel extends EventEmitter implements Channel {
|
|||
}
|
||||
let finalOptions: CallStreamOptions = {
|
||||
deadline: options.deadline === undefined ? Infinity : options.deadline,
|
||||
credentials: options.credentials === undefined ?
|
||||
CallCredentials.createEmpty() : options.credentials,
|
||||
flags: options.flags === undefined ? 0 : options.flags
|
||||
credentials: options.credentials || CallCredentials.createEmpty(),
|
||||
flags: options.flags || 0
|
||||
}
|
||||
let stream: Http2CallStream = new Http2CallStream(methodName, finalOptions, this.filterStackFactory);
|
||||
this.startHttp2Stream(methodName, stream, metadata);
|
||||
|
|
@ -169,7 +170,7 @@ export class Http2Channel extends EventEmitter implements Channel {
|
|||
if (this.connectivityState === ConnectivityState.READY) {
|
||||
setImmediate(callback);
|
||||
} else {
|
||||
this.on('connectivityStateChanged', (newState) => {
|
||||
this.once('connectivityStateChanged', (newState) => {
|
||||
if (newState === ConnectivityState.READY) {
|
||||
callback();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,19 +4,16 @@ import {Filter, BaseFilter, FilterFactory} from './filter'
|
|||
import {Metadata} from './metadata'
|
||||
|
||||
export class CompressionFilter extends BaseFilter implements Filter {
|
||||
constructor() {
|
||||
super();
|
||||
}
|
||||
|
||||
async sendMetadata(metadata: Promise<Metadata>): Promise<Metadata> {
|
||||
let headers: Metadata = await metadata;
|
||||
const headers: Metadata = await metadata;
|
||||
headers.set('grpc-encoding', 'identity');
|
||||
headers.set('grpc-accept-encoding', 'identity');
|
||||
return headers;
|
||||
}
|
||||
|
||||
async receiveMetadata(metadata: Promise<Metadata>): Promise<Metadata> {
|
||||
let headers: Metadata = await metadata;
|
||||
const headers: Metadata = await metadata;
|
||||
headers.remove('grpc-encoding');
|
||||
headers.remove('grpc-accept-encoding');
|
||||
return headers;
|
||||
|
|
|
|||
|
|
@ -6,16 +6,16 @@ import {Filter, FilterFactory} from './filter';
|
|||
export class FilterStack implements Filter {
|
||||
constructor(private readonly filters: Filter[]) {}
|
||||
|
||||
async sendMetadata(metadata: Promise<Metadata>) {
|
||||
return await flow(map(this.filters, (filter) => filter.sendMetadata.bind(filter)))(metadata);
|
||||
sendMetadata(metadata: Promise<Metadata>) {
|
||||
return flow(map(this.filters, (filter) => filter.sendMetadata.bind(filter)))(metadata);
|
||||
}
|
||||
|
||||
async receiveMetadata(metadata: Promise<Metadata>) {
|
||||
return await flowRight(map(this.filters, (filter) => filter.receiveMetadata.bind(filter)))(metadata);
|
||||
receiveMetadata(metadata: Promise<Metadata>) {
|
||||
return flowRight(map(this.filters, (filter) => filter.receiveMetadata.bind(filter)))(metadata);
|
||||
}
|
||||
|
||||
async receiveTrailers(status: Promise<StatusObject>): Promise<StatusObject> {
|
||||
return await flowRight(map(this.filters, (filter) => filter.receiveTrailers.bind(filter)))(status);
|
||||
receiveTrailers(status: Promise<StatusObject>): Promise<StatusObject> {
|
||||
return flowRight(map(this.filters, (filter) => filter.receiveTrailers.bind(filter)))(status);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,9 @@
|
|||
import {Metadata} from './metadata'
|
||||
import {StatusObject, CallStream} from './call-stream'
|
||||
|
||||
/**
|
||||
* Filter classes represent related per-call logic and state that is primarily
|
||||
* used to modify incoming and outgoing data */
|
||||
export interface Filter {
|
||||
sendMetadata(metadata: Promise<Metadata>): Promise<Metadata>;
|
||||
|
||||
|
|
|
|||
|
|
@ -13,4 +13,4 @@
|
|||
"exclude": [
|
||||
"node_modules"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue