|
|
|
@ -35,9 +35,6 @@ |
|
|
|
|
|
|
|
|
|
var _ = require('underscore'); |
|
|
|
|
|
|
|
|
|
var capitalize = require('underscore.string/capitalize'); |
|
|
|
|
var decapitalize = require('underscore.string/decapitalize'); |
|
|
|
|
|
|
|
|
|
var grpc = require('bindings')('grpc.node'); |
|
|
|
|
|
|
|
|
|
var common = require('./common'); |
|
|
|
@ -532,26 +529,20 @@ Server.prototype.bind = function(port, creds) { |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Creates a constructor for servers with a service defined by the methods |
|
|
|
|
* object. The methods object has string keys and values of this form: |
|
|
|
|
* {serialize: function, deserialize: function, client_stream: bool, |
|
|
|
|
* server_stream: bool} |
|
|
|
|
* @param {Object} methods Method descriptor for each method the server should |
|
|
|
|
* expose |
|
|
|
|
* @param {string} prefix The prefex to prepend to each method name |
|
|
|
|
* @return {function(Object, Object)} New server constructor |
|
|
|
|
* Create a constructor for servers with services defined by service_attr_map. |
|
|
|
|
* That is an object that maps (namespaced) service names to objects that in |
|
|
|
|
* turn map method names to objects with the following keys: |
|
|
|
|
* path: The path on the server for accessing the method. For example, for |
|
|
|
|
* protocol buffers, we use "/service_name/method_name" |
|
|
|
|
* requestStream: bool indicating whether the client sends a stream |
|
|
|
|
* resonseStream: bool indicating whether the server sends a stream |
|
|
|
|
* requestDeserialize: function to deserialize request objects |
|
|
|
|
* responseSerialize: function to serialize response objects |
|
|
|
|
* @param {Object} service_attr_map An object mapping service names to method |
|
|
|
|
* attribute map objects |
|
|
|
|
* @return {function(Object, function, Object=)} New server constructor |
|
|
|
|
*/ |
|
|
|
|
function makeServerConstructor(services) { |
|
|
|
|
var qual_names = []; |
|
|
|
|
_.each(services, function(service) { |
|
|
|
|
_.each(service.children, function(method) { |
|
|
|
|
var name = common.fullyQualifiedName(method); |
|
|
|
|
if (_.indexOf(qual_names, name) !== -1) { |
|
|
|
|
throw new Error('Method ' + name + ' exposed by more than one service'); |
|
|
|
|
} |
|
|
|
|
qual_names.push(name); |
|
|
|
|
}); |
|
|
|
|
}); |
|
|
|
|
function makeServerConstructor(service_attr_map) { |
|
|
|
|
/** |
|
|
|
|
* Create a server with the given handlers for all of the methods. |
|
|
|
|
* @constructor |
|
|
|
@ -565,41 +556,34 @@ function makeServerConstructor(services) { |
|
|
|
|
function SurfaceServer(service_handlers, getMetadata, options) { |
|
|
|
|
var server = new Server(getMetadata, options); |
|
|
|
|
this.inner_server = server; |
|
|
|
|
_.each(services, function(service) { |
|
|
|
|
var service_name = common.fullyQualifiedName(service); |
|
|
|
|
_.each(service_attr_map, function(service_attrs, service_name) { |
|
|
|
|
if (service_handlers[service_name] === undefined) { |
|
|
|
|
throw new Error('Handlers for service ' + |
|
|
|
|
service_name + ' not provided.'); |
|
|
|
|
} |
|
|
|
|
var prefix = '/' + common.fullyQualifiedName(service) + '/'; |
|
|
|
|
_.each(service.children, function(method) { |
|
|
|
|
_.each(service_attrs, function(attrs, name) { |
|
|
|
|
var method_type; |
|
|
|
|
if (method.requestStream) { |
|
|
|
|
if (method.responseStream) { |
|
|
|
|
if (attrs.requestStream) { |
|
|
|
|
if (attrs.responseStream) { |
|
|
|
|
method_type = 'bidi'; |
|
|
|
|
} else { |
|
|
|
|
method_type = 'client_stream'; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
if (method.responseStream) { |
|
|
|
|
if (attrs.responseStream) { |
|
|
|
|
method_type = 'server_stream'; |
|
|
|
|
} else { |
|
|
|
|
method_type = 'unary'; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (service_handlers[service_name][decapitalize(method.name)] === |
|
|
|
|
undefined) { |
|
|
|
|
throw new Error('Method handler for ' + |
|
|
|
|
common.fullyQualifiedName(method) + ' not provided.'); |
|
|
|
|
if (service_handlers[service_name][name] === undefined) { |
|
|
|
|
throw new Error('Method handler for ' + attrs.path + |
|
|
|
|
' not provided.'); |
|
|
|
|
} |
|
|
|
|
var serialize = common.serializeCls( |
|
|
|
|
method.resolvedResponseType.build()); |
|
|
|
|
var deserialize = common.deserializeCls( |
|
|
|
|
method.resolvedRequestType.build()); |
|
|
|
|
server.register( |
|
|
|
|
prefix + capitalize(method.name), |
|
|
|
|
service_handlers[service_name][decapitalize(method.name)], |
|
|
|
|
serialize, deserialize, method_type); |
|
|
|
|
var serialize = attrs.responseSerialize; |
|
|
|
|
var deserialize = attrs.requestDeserialize; |
|
|
|
|
server.register(attrs.path, service_handlers[service_name][name], |
|
|
|
|
serialize, deserialize, method_type); |
|
|
|
|
}); |
|
|
|
|
}, this); |
|
|
|
|
} |
|
|
|
@ -635,7 +619,40 @@ function makeServerConstructor(services) { |
|
|
|
|
return SurfaceServer; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Create a constructor for servers that serve the given services. |
|
|
|
|
* @param {Array<ProtoBuf.Reflect.Service>} services The services that the |
|
|
|
|
* servers will serve |
|
|
|
|
* @return {function(Object, function, Object=)} New server constructor |
|
|
|
|
*/ |
|
|
|
|
function makeProtobufServerConstructor(services) { |
|
|
|
|
var qual_names = []; |
|
|
|
|
var service_attr_map = {}; |
|
|
|
|
_.each(services, function(service) { |
|
|
|
|
var service_name = common.fullyQualifiedName(service); |
|
|
|
|
_.each(service.children, function(method) { |
|
|
|
|
var name = common.fullyQualifiedName(method); |
|
|
|
|
if (_.indexOf(qual_names, name) !== -1) { |
|
|
|
|
throw new Error('Method ' + name + ' exposed by more than one service'); |
|
|
|
|
} |
|
|
|
|
qual_names.push(name); |
|
|
|
|
}); |
|
|
|
|
var method_attrs = common.getProtobufServiceAttrs(service); |
|
|
|
|
if (!service_attr_map.hasOwnProperty(service_name)) { |
|
|
|
|
service_attr_map[service_name] = {}; |
|
|
|
|
} |
|
|
|
|
service_attr_map[service_name] = _.extend(service_attr_map[service_name], |
|
|
|
|
method_attrs); |
|
|
|
|
}); |
|
|
|
|
return makeServerConstructor(service_attr_map); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* See documentation for makeServerConstructor |
|
|
|
|
*/ |
|
|
|
|
exports.makeServerConstructor = makeServerConstructor; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* See documentation for makeProtobufServerConstructor |
|
|
|
|
*/ |
|
|
|
|
exports.makeProtobufServerConstructor = makeProtobufServerConstructor; |
|
|
|
|