mirror of https://github.com/grpc/grpc-node.git
175 lines
5.5 KiB
TypeScript
175 lines
5.5 KiB
TypeScript
/*
|
|
* Copyright 2019 gRPC authors.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*
|
|
*/
|
|
|
|
import { ChannelCredentials } from './channel-credentials';
|
|
import { ChannelOptions } from './channel-options';
|
|
import { ServerSurfaceCall } from './server-call';
|
|
|
|
import { ConnectivityState } from './connectivity-state';
|
|
import type { ChannelRef } from './channelz';
|
|
import { Call } from './call-interface';
|
|
import { InternalChannel } from './internal-channel';
|
|
import { Deadline } from './deadline';
|
|
|
|
/**
|
|
* An interface that represents a communication channel to a server specified
|
|
* by a given address.
|
|
*/
|
|
export interface Channel {
|
|
/**
|
|
* Close the channel. This has the same functionality as the existing
|
|
* grpc.Client.prototype.close
|
|
*/
|
|
close(): void;
|
|
/**
|
|
* Return the target that this channel connects to
|
|
*/
|
|
getTarget(): string;
|
|
/**
|
|
* Get the channel's current connectivity state. This method is here mainly
|
|
* because it is in the existing internal Channel class, and there isn't
|
|
* another good place to put it.
|
|
* @param tryToConnect If true, the channel will start connecting if it is
|
|
* idle. Otherwise, idle channels will only start connecting when a
|
|
* call starts.
|
|
*/
|
|
getConnectivityState(tryToConnect: boolean): ConnectivityState;
|
|
/**
|
|
* Watch for connectivity state changes. This is also here mainly because
|
|
* it is in the existing external Channel class.
|
|
* @param currentState The state to watch for transitions from. This should
|
|
* always be populated by calling getConnectivityState immediately
|
|
* before.
|
|
* @param deadline A deadline for waiting for a state change
|
|
* @param callback Called with no error when a state change, or with an
|
|
* error if the deadline passes without a state change.
|
|
*/
|
|
watchConnectivityState(
|
|
currentState: ConnectivityState,
|
|
deadline: Date | number,
|
|
callback: (error?: Error) => void
|
|
): void;
|
|
/**
|
|
* Get the channelz reference object for this channel. A request to the
|
|
* channelz service for the id in this object will provide information
|
|
* about this channel.
|
|
*/
|
|
getChannelzRef(): ChannelRef;
|
|
/**
|
|
* Create a call object. Call is an opaque type that is used by the Client
|
|
* class. This function is called by the gRPC library when starting a
|
|
* request. Implementers should return an instance of Call that is returned
|
|
* from calling createCall on an instance of the provided Channel class.
|
|
* @param method The full method string to request.
|
|
* @param deadline The call deadline
|
|
* @param host A host string override for making the request
|
|
* @param parentCall A server call to propagate some information from
|
|
* @param propagateFlags A bitwise combination of elements of grpc.propagate
|
|
* that indicates what information to propagate from parentCall.
|
|
*/
|
|
createCall(
|
|
method: string,
|
|
deadline: Deadline,
|
|
host: string | null | undefined,
|
|
parentCall: ServerSurfaceCall | null,
|
|
propagateFlags: number | null | undefined
|
|
): Call;
|
|
}
|
|
|
|
export class ChannelImplementation implements Channel {
|
|
private internalChannel: InternalChannel;
|
|
|
|
constructor(
|
|
target: string,
|
|
credentials: ChannelCredentials,
|
|
options: ChannelOptions
|
|
) {
|
|
if (typeof target !== 'string') {
|
|
throw new TypeError('Channel target must be a string');
|
|
}
|
|
if (!(credentials instanceof ChannelCredentials)) {
|
|
throw new TypeError(
|
|
'Channel credentials must be a ChannelCredentials object'
|
|
);
|
|
}
|
|
if (options) {
|
|
if (typeof options !== 'object') {
|
|
throw new TypeError('Channel options must be an object');
|
|
}
|
|
}
|
|
|
|
this.internalChannel = new InternalChannel(target, credentials, options);
|
|
}
|
|
|
|
close() {
|
|
this.internalChannel.close();
|
|
}
|
|
|
|
getTarget() {
|
|
return this.internalChannel.getTarget();
|
|
}
|
|
|
|
getConnectivityState(tryToConnect: boolean) {
|
|
return this.internalChannel.getConnectivityState(tryToConnect);
|
|
}
|
|
|
|
watchConnectivityState(
|
|
currentState: ConnectivityState,
|
|
deadline: Date | number,
|
|
callback: (error?: Error) => void
|
|
): void {
|
|
this.internalChannel.watchConnectivityState(
|
|
currentState,
|
|
deadline,
|
|
callback
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Get the channelz reference object for this channel. The returned value is
|
|
* garbage if channelz is disabled for this channel.
|
|
* @returns
|
|
*/
|
|
getChannelzRef() {
|
|
return this.internalChannel.getChannelzRef();
|
|
}
|
|
|
|
createCall(
|
|
method: string,
|
|
deadline: Deadline,
|
|
host: string | null | undefined,
|
|
parentCall: ServerSurfaceCall | null,
|
|
propagateFlags: number | null | undefined
|
|
): Call {
|
|
if (typeof method !== 'string') {
|
|
throw new TypeError('Channel#createCall: method must be a string');
|
|
}
|
|
if (!(typeof deadline === 'number' || deadline instanceof Date)) {
|
|
throw new TypeError(
|
|
'Channel#createCall: deadline must be a number or Date'
|
|
);
|
|
}
|
|
return this.internalChannel.createCall(
|
|
method,
|
|
deadline,
|
|
host,
|
|
parentCall,
|
|
propagateFlags
|
|
);
|
|
}
|
|
}
|