Client Interceptors
This module describes the interceptor framework for clients. An interceptor is a function which takes an options object and a nextCall function and returns an InterceptingCall:
var interceptor = function(options, nextCall) {
return new InterceptingCall(nextCall(options));
}
The interceptor function must return an InterceptingCall object. Returning new InterceptingCall(nextCall(options))
will satisfy the contract (but provide no interceptor functionality). nextCall
is a function which will generate the next interceptor in the chain.
To implement interceptor functionality, create a requester and pass it to the InterceptingCall constructor:
return new InterceptingCall(nextCall(options), requester);
A requester is a POJO with zero or more of the following methods:
start(metadata, listener, next)
sendMessage(message, next)
halfClose(next)
cancel(message, next)
A listener is a POJO with one or more of the following methods:
onReceiveMetadata(metadata, next)
onReceiveMessage(message, next)
onReceiveStatus(status, next)
A listener is provided by the requester's start
method. The provided listener implements all the inbound interceptor methods, which can be called to short-circuit the gRPC call.
Three usage patterns are supported for listeners: 1) Pass the listener along without modification: next(metadata, listener)
. In this case the interceptor declines to intercept any inbound operations. 2) Create a new listener with one or more inbound interceptor methods and pass it to next
. In this case the interceptor will fire on the inbound operations implemented in the new listener. 3) Make direct inbound calls to the provided listener's methods. This short-circuits the interceptor stack.
Do not modify the listener passed in. Either pass it along unmodified, ignore it, or call methods on it to short-circuit the call.
To intercept errors, implement the onReceiveStatus
method and test for status.code !== grpc.status.OK
.
To intercept trailers, examine status.metadata
in the onReceiveStatus
method.
This is a trivial implementation of all interceptor methods: var interceptor = function(options, nextCall) { return new InterceptingCall(nextCall(options), { start: function(metadata, listener, next) { next(metadata, { onReceiveMetadata: function (metadata, next) { next(metadata); }, onReceiveMessage: function (message, next) { next(message); }, onReceiveStatus: function (status, next) { next(status); }, }); }, sendMessage: function(message, next) { next(message); }, halfClose: function(next) { next(); }, cancel: function(message, next) { next(); } }); };
This is an interceptor with a single method: var interceptor = function(options, nextCall) { return new InterceptingCall(nextCall(options), { sendMessage: function(message, next) { next(message); } }); };
Builders are provided for convenience: StatusBuilder, ListenerBuilder, and RequesterBuilder
gRPC client operations use this mapping to interceptor methods:
grpc.opType.SEND_INITIAL_METADATA -> start grpc.opType.SEND_MESSAGE -> sendMessage grpc.opType.SEND_CLOSE_FROM_CLIENT -> halfClose grpc.opType.RECV_INITIAL_METADATA -> onReceiveMetadata grpc.opType.RECV_MESSAGE -> onReceiveMessage grpc.opType.RECV_STATUS_ON_CLIENT -> onReceiveStatus
Get a call object built with the provided options.
Name | Type | Argument | Description |
---|---|---|---|
channel | grpc.Channel | ||
path | string | ||
options | grpc.Client~CallOptions | optional | Options object. |
Name | Type | Description | |
---|---|---|---|
method_definition | grpc~MethodDefinition | ||
options | grpc.Client~CallOptions | ||
interceptors | Array.Interceptor | ||
channel | grpc.Channel | ||
responder | function | EventEmitter |
Creates the last listener in an interceptor stack.
Name | Type | Argument | Description |
---|---|---|---|
method_definition | grpc~MethodDefinition | ||
emitter | EventEmitter | ||
callback | function | optional |
Type
grpc~Listener
Transforms a list of interceptor providers into interceptors.
Name | Type | Description |
---|---|---|
providers | Array.InterceptorProvider | |
method_definition | grpc~MethodDefinition |
Type
null | Array.Interceptor