mirror of https://github.com/grpc/grpc-node.git
				
				
				
			Merge remote-tracking branch 'upstream/v1.12.x' into v1.12.x_upmerge
This commit is contained in:
		
						commit
						233d04e7af
					
				|  | @ -380,19 +380,18 @@ function Client(address, credentials, options) { | |||
|   options['grpc.primary_user_agent'] += 'grpc-node/' + version; | ||||
| 
 | ||||
|   // Resolve interceptor options and assign interceptors to each method
 | ||||
|   var interceptor_providers = options.interceptor_providers || []; | ||||
|   var interceptors = options.interceptors || []; | ||||
|   if (interceptor_providers.length && interceptors.length) { | ||||
|   if (_.isArray(options.interceptor_providers) && _.isArray(options.interceptors)) { | ||||
|     throw new client_interceptors.InterceptorConfigurationError( | ||||
|       'Both interceptors and interceptor_providers were passed as options ' + | ||||
|       'to the client constructor. Only one of these is allowed.'); | ||||
|   } | ||||
|   self.$interceptors = options.interceptors || []; | ||||
|   self.$interceptor_providers = options.interceptor_providers || []; | ||||
|   _.each(self.$method_definitions, function(method_definition, method_name) { | ||||
|     self[method_name].interceptors = client_interceptors | ||||
|       .resolveInterceptorProviders(interceptor_providers, method_definition) | ||||
|       .concat(interceptors); | ||||
|       .resolveInterceptorProviders(self.$interceptor_providers, method_definition) | ||||
|       .concat(self.$interceptors); | ||||
|   }); | ||||
| 
 | ||||
|   // Exclude interceptor options which have already been consumed
 | ||||
|   var channel_options = _.omit(options, | ||||
|      ['interceptors', 'interceptor_providers']); | ||||
|  | @ -403,6 +402,21 @@ function Client(address, credentials, options) { | |||
| 
 | ||||
| exports.Client = Client; | ||||
| 
 | ||||
| Client.prototype.resolveCallInterceptors = function(method_definition, interceptors, interceptor_providers) { | ||||
|   if (_.isArray(interceptors) && _.isArray(interceptor_providers)) { | ||||
|     throw new client_interceptors.InterceptorConfigurationError( | ||||
|       'Both interceptors and interceptor_providers were passed as call ' + | ||||
|       'options. Only one of these is allowed.'); | ||||
|   } | ||||
|   if (_.isArray(interceptors) || _.isArray(interceptor_providers)) { | ||||
|     interceptors = interceptors || []; | ||||
|     interceptor_providers = interceptor_providers || []; | ||||
|     return client_interceptors.resolveInterceptorProviders(interceptor_providers, method_definition).concat(interceptors); | ||||
|   } else { | ||||
|     return client_interceptors.resolveInterceptorProviders(this.$interceptor_providers, method_definition).concat(this.$interceptors); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * @callback grpc.Client~requestCallback | ||||
|  * @param {?grpc~ServiceError} error The error, if the call | ||||
|  | @ -454,10 +468,6 @@ Client.prototype.makeUnaryRequest = function(path, serialize, deserialize, | |||
|     throw new Error('Argument mismatch in makeUnaryRequest'); | ||||
|   } | ||||
| 
 | ||||
|   var method_name = this.$method_names[path]; | ||||
|   var constructor_interceptors = this[method_name] ? | ||||
|     this[method_name].interceptors : | ||||
|     null; | ||||
|   var method_definition = options.method_definition = { | ||||
|     path: path, | ||||
|     requestStream: false, | ||||
|  | @ -471,7 +481,7 @@ Client.prototype.makeUnaryRequest = function(path, serialize, deserialize, | |||
|   var intercepting_call = client_interceptors.getInterceptingCall( | ||||
|     method_definition, | ||||
|     options, | ||||
|     constructor_interceptors, | ||||
|     Client.prototype.resolveCallInterceptors.call(this, method_definition, options.interceptors, options.interceptor_providers), | ||||
|     this.$channel, | ||||
|     callback | ||||
|   ); | ||||
|  | @ -533,10 +543,6 @@ Client.prototype.makeClientStreamRequest = function(path, serialize, | |||
|     throw new Error('Argument mismatch in makeClientStreamRequest'); | ||||
|   } | ||||
| 
 | ||||
|   var method_name = this.$method_names[path]; | ||||
|   var constructor_interceptors = this[method_name] ? | ||||
|     this[method_name].interceptors : | ||||
|     null; | ||||
|   var method_definition = options.method_definition = { | ||||
|     path: path, | ||||
|     requestStream: true, | ||||
|  | @ -550,7 +556,7 @@ Client.prototype.makeClientStreamRequest = function(path, serialize, | |||
|   var intercepting_call = client_interceptors.getInterceptingCall( | ||||
|     method_definition, | ||||
|     options, | ||||
|     constructor_interceptors, | ||||
|     Client.prototype.resolveCallInterceptors.call(this, method_definition, options.interceptors, options.interceptor_providers), | ||||
|     this.$channel, | ||||
|     callback | ||||
|   ); | ||||
|  | @ -595,10 +601,6 @@ Client.prototype.makeServerStreamRequest = function(path, serialize, | |||
|     throw new Error('Argument mismatch in makeServerStreamRequest'); | ||||
|   } | ||||
| 
 | ||||
|   var method_name = this.$method_names[path]; | ||||
|   var constructor_interceptors = this[method_name] ? | ||||
|     this[method_name].interceptors : | ||||
|     null; | ||||
|   var method_definition = options.method_definition = { | ||||
|     path: path, | ||||
|     requestStream: false, | ||||
|  | @ -613,7 +615,7 @@ Client.prototype.makeServerStreamRequest = function(path, serialize, | |||
|   var intercepting_call = client_interceptors.getInterceptingCall( | ||||
|     method_definition, | ||||
|     options, | ||||
|     constructor_interceptors, | ||||
|     Client.prototype.resolveCallInterceptors.call(this, method_definition, options.interceptors, options.interceptor_providers), | ||||
|     this.$channel, | ||||
|     emitter | ||||
|   ); | ||||
|  | @ -655,10 +657,6 @@ Client.prototype.makeBidiStreamRequest = function(path, serialize, | |||
|     throw new Error('Argument mismatch in makeBidiStreamRequest'); | ||||
|   } | ||||
| 
 | ||||
|   var method_name = this.$method_names[path]; | ||||
|   var constructor_interceptors = this[method_name] ? | ||||
|     this[method_name].interceptors : | ||||
|     null; | ||||
|   var method_definition = options.method_definition = { | ||||
|     path: path, | ||||
|     requestStream: true, | ||||
|  | @ -673,7 +671,7 @@ Client.prototype.makeBidiStreamRequest = function(path, serialize, | |||
|   var intercepting_call = client_interceptors.getInterceptingCall( | ||||
|     method_definition, | ||||
|     options, | ||||
|     constructor_interceptors, | ||||
|     Client.prototype.resolveCallInterceptors.call(this, method_definition, options.interceptors, options.interceptor_providers), | ||||
|     this.$channel, | ||||
|     emitter | ||||
|   ); | ||||
|  |  | |||
|  | @ -367,32 +367,6 @@ var resolveInterceptorProviders = function(providers, method_definition) { | |||
|   return interceptors; | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * Resolves interceptor options at call invocation time | ||||
|  * @param {grpc.Client~CallOptions} options The call options passed to a gRPC | ||||
|  * call. | ||||
|  * @param {Interceptor[]} [options.interceptors] | ||||
|  * @param {InterceptorProvider[]} [options.interceptor_providers] | ||||
|  * @param {grpc~MethodDefinition} method_definition | ||||
|  * @return {null|function[]} | ||||
|  */ | ||||
| var resolveInterceptorOptions = function(options, method_definition) { | ||||
|   var provided = resolveInterceptorProviders(options.interceptor_providers, | ||||
|     method_definition); | ||||
|   if (_.isArray(options.interceptors) && _.isArray(provided)) { | ||||
|     throw new InterceptorConfigurationError( | ||||
|       'Both interceptors and interceptor_providers were passed as options ' + | ||||
|       'to the call invocation. Only one of these is allowed.'); | ||||
|   } | ||||
|   if (_.isArray(options.interceptors)) { | ||||
|     return options.interceptors; | ||||
|   } | ||||
|   if (_.isArray(provided)) { | ||||
|     return provided; | ||||
|   } | ||||
|   return null; | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * A chainable gRPC call proxy which will delegate to an optional requester | ||||
|  * object. By default, interceptor methods will chain to next_call. If a | ||||
|  | @ -1360,17 +1334,12 @@ function getLastListener(method_definition, emitter, callback) { | |||
|  * | ||||
|  * @param {grpc~MethodDefinition} method_definition | ||||
|  * @param {grpc.Client~CallOptions} options | ||||
|  * @param {Interceptor[]} constructor_interceptors | ||||
|  * @param {Interceptor[]} interceptors | ||||
|  * @param {grpc.Channel} channel | ||||
|  * @param {function|EventEmitter} responder | ||||
|  */ | ||||
| function getInterceptingCall(method_definition, options, | ||||
|                              constructor_interceptors, channel, responder) { | ||||
|   var interceptors = _processInterceptorLayers( | ||||
|     options, | ||||
|     constructor_interceptors, | ||||
|     method_definition | ||||
|   ); | ||||
|                              interceptors, channel, responder) { | ||||
|   var last_interceptor = _getLastInterceptor(method_definition, channel, | ||||
|                                             responder); | ||||
|   var all_interceptors = interceptors.concat(last_interceptor); | ||||
|  | @ -1416,29 +1385,6 @@ function _buildChain(interceptors, options) { | |||
|   return new InterceptingCall(chain); | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Process call options and the interceptor override layers to get the final set | ||||
|  * of interceptors. | ||||
|  * @private | ||||
|  * @param {grpc.Client~CallOptions} call_options The options passed to the gRPC | ||||
|  * call. | ||||
|  * @param {Interceptor[]} constructor_interceptors Interceptors passed to the | ||||
|  * client constructor. | ||||
|  * @param {grpc~MethodDefinition} method_definition Details of the RPC method. | ||||
|  * @return {Interceptor[]|null} The final set of interceptors. | ||||
|  */ | ||||
| function _processInterceptorLayers(call_options, | ||||
|                                    constructor_interceptors, | ||||
|                                    method_definition) { | ||||
|   var calltime_interceptors = resolveInterceptorOptions(call_options, | ||||
|     method_definition); | ||||
|   var interceptor_overrides = [ | ||||
|     calltime_interceptors, | ||||
|     constructor_interceptors | ||||
|   ]; | ||||
|   return _resolveInterceptorOverrides(interceptor_overrides); | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Wraps a plain listener object in an InterceptingListener if it isn't an | ||||
|  * InterceptingListener already. | ||||
|  | @ -1464,23 +1410,6 @@ function _isInterceptingListener(listener) { | |||
|   return listener && listener.constructor.name === 'InterceptingListener'; | ||||
| } | ||||
| 
 | ||||
| /** | ||||
|  * Chooses the first valid array of interceptors or returns null. | ||||
|  * @param {Interceptor[][]} interceptor_lists A list of interceptor lists in | ||||
|  * descending override priority order. | ||||
|  * @return {Interceptor[]|null} The resulting interceptors | ||||
|  * @private | ||||
|  */ | ||||
| function _resolveInterceptorOverrides(interceptor_lists) { | ||||
|   for (var i = 0; i < interceptor_lists.length; i++) { | ||||
|     var interceptor_list = interceptor_lists[i]; | ||||
|     if (_.isArray(interceptor_list)) { | ||||
|       return interceptor_list; | ||||
|     } | ||||
|   } | ||||
|   return null; | ||||
| } | ||||
| 
 | ||||
| exports.resolveInterceptorProviders = resolveInterceptorProviders; | ||||
| 
 | ||||
| exports.InterceptingCall = InterceptingCall; | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue