mirror of https://github.com/grpc/grpc-node.git
Resolved merge conflicts
This commit is contained in:
commit
1fa48701fc
|
@ -41,7 +41,8 @@ var interop_server = require('../interop/interop_server.js');
|
|||
function runTest(iterations, callback) {
|
||||
var testServer = interop_server.getServer(0, false);
|
||||
testServer.server.listen();
|
||||
var client = new testProto.TestService('localhost:' + testServer.port);
|
||||
var client = new testProto.TestService('localhost:' + testServer.port,
|
||||
grpc.Credentials.createInsecure());
|
||||
|
||||
function runIterations(finish) {
|
||||
var start = process.hrtime();
|
||||
|
|
|
@ -61,7 +61,8 @@ var interop_server = require('../interop/interop_server.js');
|
|||
function runTest(concurrent_calls, seconds, callback) {
|
||||
var testServer = interop_server.getServer(0, false);
|
||||
testServer.server.listen();
|
||||
var client = new testProto.TestService('localhost:' + testServer.port);
|
||||
var client = new testProto.TestService('localhost:' + testServer.port,
|
||||
grpc.Credentials.createInsecure());
|
||||
|
||||
var warmup_num = 100;
|
||||
|
||||
|
|
|
@ -40,7 +40,8 @@ var path = require('path');
|
|||
var _ = require('lodash');
|
||||
var grpc = require('..');
|
||||
var examples = grpc.load(__dirname + '/route_guide.proto').examples;
|
||||
var client = new examples.RouteGuide('localhost:50051');
|
||||
var client = new examples.RouteGuide('localhost:50051',
|
||||
grpc.Credentials.createInsecure());
|
||||
|
||||
var COORD_FACTOR = 1e7;
|
||||
|
||||
|
|
|
@ -38,7 +38,8 @@ var examples = grpc.load(__dirname + '/stock.proto').examples;
|
|||
* This exports a client constructor for the Stock service. The usage looks like
|
||||
*
|
||||
* var StockClient = require('stock_client.js');
|
||||
* var stockClient = new StockClient(server_address);
|
||||
* var stockClient = new StockClient(server_address,
|
||||
* grpc.Credentials.createInsecure());
|
||||
* stockClient.getLastTradePrice({symbol: 'GOOG'}, function(error, response) {
|
||||
* console.log(error || response);
|
||||
* });
|
||||
|
|
|
@ -98,31 +98,30 @@ NAN_METHOD(Channel::New) {
|
|||
|
||||
if (args.IsConstructCall()) {
|
||||
if (!args[0]->IsString()) {
|
||||
return NanThrowTypeError("Channel expects a string and an object");
|
||||
return NanThrowTypeError(
|
||||
"Channel expects a string, a credential and an object");
|
||||
}
|
||||
grpc_channel *wrapped_channel;
|
||||
// Owned by the Channel object
|
||||
NanUtf8String *host = new NanUtf8String(args[0]);
|
||||
NanUtf8String *host_override = NULL;
|
||||
if (args[1]->IsUndefined()) {
|
||||
grpc_credentials *creds;
|
||||
if (!Credentials::HasInstance(args[1])) {
|
||||
return NanThrowTypeError(
|
||||
"Channel's second argument must be a credential");
|
||||
}
|
||||
Credentials *creds_object = ObjectWrap::Unwrap<Credentials>(
|
||||
args[1]->ToObject());
|
||||
creds = creds_object->GetWrappedCredentials();
|
||||
grpc_channel_args *channel_args_ptr;
|
||||
if (args[2]->IsUndefined()) {
|
||||
channel_args_ptr = NULL;
|
||||
wrapped_channel = grpc_insecure_channel_create(**host, NULL);
|
||||
} else if (args[1]->IsObject()) {
|
||||
grpc_credentials *creds = NULL;
|
||||
Handle<Object> args_hash(args[1]->ToObject()->Clone());
|
||||
} else if (args[2]->IsObject()) {
|
||||
Handle<Object> args_hash(args[2]->ToObject()->Clone());
|
||||
if (args_hash->HasOwnProperty(NanNew(GRPC_SSL_TARGET_NAME_OVERRIDE_ARG))) {
|
||||
host_override = new NanUtf8String(args_hash->Get(NanNew(GRPC_SSL_TARGET_NAME_OVERRIDE_ARG)));
|
||||
}
|
||||
if (args_hash->HasOwnProperty(NanNew("credentials"))) {
|
||||
Handle<Value> creds_value = args_hash->Get(NanNew("credentials"));
|
||||
if (!Credentials::HasInstance(creds_value)) {
|
||||
return NanThrowTypeError(
|
||||
"credentials arg must be a Credentials object");
|
||||
}
|
||||
Credentials *creds_object =
|
||||
ObjectWrap::Unwrap<Credentials>(creds_value->ToObject());
|
||||
creds = creds_object->GetWrappedCredentials();
|
||||
args_hash->Delete(NanNew("credentials"));
|
||||
}
|
||||
Handle<Array> keys(args_hash->GetOwnPropertyNames());
|
||||
grpc_channel_args channel_args;
|
||||
channel_args.num_args = keys->Length();
|
||||
|
@ -149,16 +148,19 @@ NAN_METHOD(Channel::New) {
|
|||
return NanThrowTypeError("Arg values must be strings");
|
||||
}
|
||||
}
|
||||
if (creds == NULL) {
|
||||
wrapped_channel = grpc_insecure_channel_create(**host, &channel_args);
|
||||
} else {
|
||||
wrapped_channel =
|
||||
grpc_secure_channel_create(creds, **host, &channel_args);
|
||||
}
|
||||
free(channel_args.args);
|
||||
channel_args_ptr = &channel_args;
|
||||
} else {
|
||||
return NanThrowTypeError("Channel expects a string and an object");
|
||||
}
|
||||
if (creds == NULL) {
|
||||
wrapped_channel = grpc_insecure_channel_create(**host, channel_args_ptr);
|
||||
} else {
|
||||
wrapped_channel =
|
||||
grpc_secure_channel_create(creds, **host, channel_args_ptr);
|
||||
}
|
||||
if (channel_args_ptr != NULL) {
|
||||
free(channel_args_ptr->args);
|
||||
}
|
||||
Channel *channel;
|
||||
if (host_override == NULL) {
|
||||
channel = new Channel(wrapped_channel, host);
|
||||
|
@ -168,8 +170,8 @@ NAN_METHOD(Channel::New) {
|
|||
channel->Wrap(args.This());
|
||||
NanReturnValue(args.This());
|
||||
} else {
|
||||
const int argc = 2;
|
||||
Local<Value> argv[argc] = {args[0], args[1]};
|
||||
const int argc = 3;
|
||||
Local<Value> argv[argc] = {args[0], args[1], args[2]};
|
||||
NanReturnValue(constructor->GetFunction()->NewInstance(argc, argv));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -81,6 +81,8 @@ void Credentials::Init(Handle<Object> exports) {
|
|||
NanNew<FunctionTemplate>(CreateGce)->GetFunction());
|
||||
ctr->Set(NanNew("createIam"),
|
||||
NanNew<FunctionTemplate>(CreateIam)->GetFunction());
|
||||
ctr->Set(NanNew("createInsecure"),
|
||||
NanNew<FunctionTemplate>(CreateInsecure)->GetFunction());
|
||||
constructor = new NanCallback(ctr);
|
||||
exports->Set(NanNew("Credentials"), ctr);
|
||||
}
|
||||
|
@ -92,9 +94,6 @@ bool Credentials::HasInstance(Handle<Value> val) {
|
|||
|
||||
Handle<Value> Credentials::WrapStruct(grpc_credentials *credentials) {
|
||||
NanEscapableScope();
|
||||
if (credentials == NULL) {
|
||||
return NanEscapeScope(NanNull());
|
||||
}
|
||||
const int argc = 1;
|
||||
Handle<Value> argv[argc] = {
|
||||
NanNew<External>(reinterpret_cast<void *>(credentials))};
|
||||
|
@ -128,7 +127,11 @@ NAN_METHOD(Credentials::New) {
|
|||
|
||||
NAN_METHOD(Credentials::CreateDefault) {
|
||||
NanScope();
|
||||
NanReturnValue(WrapStruct(grpc_google_default_credentials_create()));
|
||||
grpc_credentials *creds = grpc_google_default_credentials_create();
|
||||
if (creds == NULL) {
|
||||
NanReturnNull();
|
||||
}
|
||||
NanReturnValue(WrapStruct(creds));
|
||||
}
|
||||
|
||||
NAN_METHOD(Credentials::CreateSsl) {
|
||||
|
@ -152,9 +155,12 @@ NAN_METHOD(Credentials::CreateSsl) {
|
|||
return NanThrowTypeError(
|
||||
"createSSl's third argument must be a Buffer if provided");
|
||||
}
|
||||
|
||||
NanReturnValue(WrapStruct(grpc_ssl_credentials_create(
|
||||
root_certs, key_cert_pair.private_key == NULL ? NULL : &key_cert_pair)));
|
||||
grpc_credentials *creds = grpc_ssl_credentials_create(
|
||||
root_certs, key_cert_pair.private_key == NULL ? NULL : &key_cert_pair);
|
||||
if (creds == NULL) {
|
||||
NanReturnNull();
|
||||
}
|
||||
NanReturnValue(WrapStruct(creds));
|
||||
}
|
||||
|
||||
NAN_METHOD(Credentials::CreateComposite) {
|
||||
|
@ -169,13 +175,21 @@ NAN_METHOD(Credentials::CreateComposite) {
|
|||
}
|
||||
Credentials *creds1 = ObjectWrap::Unwrap<Credentials>(args[0]->ToObject());
|
||||
Credentials *creds2 = ObjectWrap::Unwrap<Credentials>(args[1]->ToObject());
|
||||
NanReturnValue(WrapStruct(grpc_composite_credentials_create(
|
||||
creds1->wrapped_credentials, creds2->wrapped_credentials)));
|
||||
grpc_credentials *creds = grpc_composite_credentials_create(
|
||||
creds1->wrapped_credentials, creds2->wrapped_credentials);
|
||||
if (creds == NULL) {
|
||||
NanReturnNull();
|
||||
}
|
||||
NanReturnValue(WrapStruct(creds));
|
||||
}
|
||||
|
||||
NAN_METHOD(Credentials::CreateGce) {
|
||||
NanScope();
|
||||
NanReturnValue(WrapStruct(grpc_compute_engine_credentials_create()));
|
||||
grpc_credentials *creds = grpc_compute_engine_credentials_create();
|
||||
if (creds == NULL) {
|
||||
NanReturnNull();
|
||||
}
|
||||
NanReturnValue(WrapStruct(creds));
|
||||
}
|
||||
|
||||
NAN_METHOD(Credentials::CreateIam) {
|
||||
|
@ -188,8 +202,17 @@ NAN_METHOD(Credentials::CreateIam) {
|
|||
}
|
||||
NanUtf8String auth_token(args[0]);
|
||||
NanUtf8String auth_selector(args[1]);
|
||||
NanReturnValue(
|
||||
WrapStruct(grpc_iam_credentials_create(*auth_token, *auth_selector)));
|
||||
grpc_credentials *creds = grpc_iam_credentials_create(*auth_token,
|
||||
*auth_selector);
|
||||
if (creds == NULL) {
|
||||
NanReturnNull();
|
||||
}
|
||||
NanReturnValue(WrapStruct(creds));
|
||||
}
|
||||
|
||||
NAN_METHOD(Credentials::CreateInsecure) {
|
||||
NanScope();
|
||||
NanReturnValue(WrapStruct(NULL));
|
||||
}
|
||||
|
||||
} // namespace node
|
||||
|
|
|
@ -68,6 +68,7 @@ class Credentials : public ::node::ObjectWrap {
|
|||
static NAN_METHOD(CreateGce);
|
||||
static NAN_METHOD(CreateFake);
|
||||
static NAN_METHOD(CreateIam);
|
||||
static NAN_METHOD(CreateInsecure);
|
||||
static NanCallback *constructor;
|
||||
// Used for typechecking instances of this javascript class
|
||||
static v8::Persistent<v8::FunctionTemplate> fun_tpl;
|
||||
|
|
|
@ -137,8 +137,10 @@ NAN_METHOD(ServerCredentials::CreateSsl) {
|
|||
return NanThrowTypeError("createSsl's third argument must be a Buffer");
|
||||
}
|
||||
key_cert_pair.cert_chain = ::node::Buffer::Data(args[2]);
|
||||
// TODO Add a force_client_auth parameter and pass it as the last parameter
|
||||
// here.
|
||||
grpc_server_credentials *creds =
|
||||
grpc_ssl_server_credentials_create(root_certs, &key_cert_pair, 1);
|
||||
grpc_ssl_server_credentials_create(root_certs, &key_cert_pair, 1, 0);
|
||||
if (creds == NULL) {
|
||||
NanReturnNull();
|
||||
}
|
||||
|
|
32
index.js
32
index.js
|
@ -48,7 +48,7 @@ var grpc = require('bindings')('grpc');
|
|||
* @param {ProtoBuf.Reflect.Namespace} value The ProtoBuf object to load.
|
||||
* @return {Object<string, *>} The resulting gRPC object
|
||||
*/
|
||||
function loadObject(value) {
|
||||
exports.loadObject = function loadObject(value) {
|
||||
var result = {};
|
||||
if (value.className === 'Namespace') {
|
||||
_.each(value.children, function(child) {
|
||||
|
@ -62,7 +62,9 @@ function loadObject(value) {
|
|||
} else {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var loadObject = exports.loadObject;
|
||||
|
||||
/**
|
||||
* Load a gRPC object from a .proto file.
|
||||
|
@ -71,7 +73,7 @@ function loadObject(value) {
|
|||
* 'json'. Defaults to 'proto'
|
||||
* @return {Object<string, *>} The resulting gRPC object
|
||||
*/
|
||||
function load(filename, format) {
|
||||
exports.load = function load(filename, format) {
|
||||
if (!format) {
|
||||
format = 'proto';
|
||||
}
|
||||
|
@ -88,7 +90,7 @@ function load(filename, format) {
|
|||
}
|
||||
|
||||
return loadObject(builder.ns);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Get a function that a client can use to update metadata with authentication
|
||||
|
@ -97,7 +99,7 @@ function load(filename, format) {
|
|||
* @param {Object} credential The credential object to use
|
||||
* @return {function(Object, callback)} Metadata updater function
|
||||
*/
|
||||
function getGoogleAuthDelegate(credential) {
|
||||
exports.getGoogleAuthDelegate = function getGoogleAuthDelegate(credential) {
|
||||
/**
|
||||
* Update a metadata object with authentication information.
|
||||
* @param {string} authURI The uri to authenticate to
|
||||
|
@ -120,20 +122,10 @@ function getGoogleAuthDelegate(credential) {
|
|||
callback(null, metadata);
|
||||
});
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* See docs for loadObject
|
||||
*/
|
||||
exports.loadObject = loadObject;
|
||||
|
||||
/**
|
||||
* See docs for load
|
||||
*/
|
||||
exports.load = load;
|
||||
|
||||
/**
|
||||
* See docs for Server
|
||||
* @see module:src/server.Server
|
||||
*/
|
||||
exports.Server = server.Server;
|
||||
|
||||
|
@ -141,6 +133,7 @@ exports.Server = server.Server;
|
|||
* Status name to code number mapping
|
||||
*/
|
||||
exports.status = grpc.status;
|
||||
|
||||
/**
|
||||
* Call error name to code number mapping
|
||||
*/
|
||||
|
@ -156,6 +149,7 @@ exports.Credentials = grpc.Credentials;
|
|||
*/
|
||||
exports.ServerCredentials = grpc.ServerCredentials;
|
||||
|
||||
exports.getGoogleAuthDelegate = getGoogleAuthDelegate;
|
||||
|
||||
/**
|
||||
* @see module:src/client.makeClientConstructor
|
||||
*/
|
||||
exports.makeGenericClientConstructor = client.makeClientConstructor;
|
||||
|
|
|
@ -397,6 +397,7 @@ var test_cases = {
|
|||
function runTest(address, host_override, test_case, tls, test_ca, done) {
|
||||
// TODO(mlumish): enable TLS functionality
|
||||
var options = {};
|
||||
var creds;
|
||||
if (tls) {
|
||||
var ca_path;
|
||||
if (test_ca) {
|
||||
|
@ -405,13 +406,14 @@ function runTest(address, host_override, test_case, tls, test_ca, done) {
|
|||
ca_path = process.env.SSL_CERT_FILE;
|
||||
}
|
||||
var ca_data = fs.readFileSync(ca_path);
|
||||
var creds = grpc.Credentials.createSsl(ca_data);
|
||||
options.credentials = creds;
|
||||
creds = grpc.Credentials.createSsl(ca_data);
|
||||
if (host_override) {
|
||||
options['grpc.ssl_target_name_override'] = host_override;
|
||||
}
|
||||
} else {
|
||||
creds = grpc.Credentials.createInsecure();
|
||||
}
|
||||
var client = new testProto.TestService(address, options);
|
||||
var client = new testProto.TestService(address, creds, options);
|
||||
|
||||
test_cases[test_case](client, done);
|
||||
}
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
"tags": {
|
||||
"allowUnknownTags": true
|
||||
},
|
||||
"source": {
|
||||
"include": [ "index.js", "src" ],
|
||||
"includePattern": ".+\\.js(doc)?$",
|
||||
"excludePattern": "(^|\\/|\\\\)_"
|
||||
},
|
||||
"opts": {
|
||||
"package": "package.json",
|
||||
"readme": "README.md"
|
||||
},
|
||||
"plugins": [],
|
||||
"templates": {
|
||||
"cleverLinks": false,
|
||||
"monospaceLinks": false,
|
||||
"default": {
|
||||
"outputSourceFiles": true
|
||||
}
|
||||
}
|
||||
}
|
|
@ -21,7 +21,8 @@
|
|||
},
|
||||
"scripts": {
|
||||
"lint": "node ./node_modules/jshint/bin/jshint src test examples interop index.js",
|
||||
"test": "node ./node_modules/mocha/bin/mocha && npm run-script lint"
|
||||
"test": "node ./node_modules/mocha/bin/mocha && npm run-script lint",
|
||||
"gen_docs": "./node_modules/.bin/jsdoc -c jsdoc_conf.json"
|
||||
},
|
||||
"dependencies": {
|
||||
"bindings": "^1.2.0",
|
||||
|
@ -32,6 +33,7 @@
|
|||
"devDependencies": {
|
||||
"async": "^0.9.0",
|
||||
"google-auth-library": "^0.9.2",
|
||||
"jsdoc": "^3.3.2",
|
||||
"jshint": "^2.5.0",
|
||||
"minimist": "^1.1.0",
|
||||
"mocha": "~1.21.0",
|
||||
|
|
|
@ -31,6 +31,11 @@
|
|||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Server module
|
||||
* @module
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var _ = require('lodash');
|
||||
|
@ -72,6 +77,7 @@ function ClientWritableStream(call, serialize) {
|
|||
/**
|
||||
* Attempt to write the given chunk. Calls the callback when done. This is an
|
||||
* implementation of a method needed for implementing stream.Writable.
|
||||
* @access private
|
||||
* @param {Buffer} chunk The chunk to write
|
||||
* @param {string} encoding Ignored
|
||||
* @param {function(Error=)} callback Called when the write is complete
|
||||
|
@ -110,6 +116,7 @@ function ClientReadableStream(call, deserialize) {
|
|||
|
||||
/**
|
||||
* Read the next object from the stream.
|
||||
* @access private
|
||||
* @param {*} size Ignored because we use objectMode=true
|
||||
*/
|
||||
function _read(size) {
|
||||
|
@ -519,16 +526,18 @@ var requester_makers = {
|
|||
* @param {string} serviceName The name of the service
|
||||
* @return {function(string, Object)} New client constructor
|
||||
*/
|
||||
function makeClientConstructor(methods, serviceName) {
|
||||
exports.makeClientConstructor = function(methods, serviceName) {
|
||||
/**
|
||||
* Create a client with the given methods
|
||||
* @constructor
|
||||
* @param {string} address The address of the server to connect to
|
||||
* @param {grpc.Credentials} credentials Credentials to use to connect
|
||||
* to the server
|
||||
* @param {Object} options Options to pass to the underlying channel
|
||||
* @param {function(string, Object, function)=} updateMetadata function to
|
||||
* update the metadata for each request
|
||||
*/
|
||||
function Client(address, options, updateMetadata) {
|
||||
function Client(address, credentials, options, updateMetadata) {
|
||||
if (!updateMetadata) {
|
||||
updateMetadata = function(uri, metadata, callback) {
|
||||
callback(null, metadata);
|
||||
|
@ -538,7 +547,7 @@ function makeClientConstructor(methods, serviceName) {
|
|||
options = {};
|
||||
}
|
||||
options['grpc.primary_user_agent'] = 'grpc-node/' + version;
|
||||
this.channel = new grpc.Channel(address, options);
|
||||
this.channel = new grpc.Channel(address, credentials, options);
|
||||
this.server_address = address.replace(/\/$/, '');
|
||||
this.auth_uri = this.server_address + '/' + serviceName;
|
||||
this.updateMetadata = updateMetadata;
|
||||
|
@ -568,7 +577,7 @@ function makeClientConstructor(methods, serviceName) {
|
|||
});
|
||||
|
||||
return Client;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Creates a constructor for clients for the given service
|
||||
|
@ -576,22 +585,18 @@ function makeClientConstructor(methods, serviceName) {
|
|||
* for
|
||||
* @return {function(string, Object)} New client constructor
|
||||
*/
|
||||
function makeProtobufClientConstructor(service) {
|
||||
exports.makeProtobufClientConstructor = function(service) {
|
||||
var method_attrs = common.getProtobufServiceAttrs(service, service.name);
|
||||
var Client = makeClientConstructor(method_attrs);
|
||||
var Client = exports.makeClientConstructor(method_attrs);
|
||||
Client.service = service;
|
||||
|
||||
return Client;
|
||||
}
|
||||
|
||||
exports.makeClientConstructor = makeClientConstructor;
|
||||
|
||||
exports.makeProtobufClientConstructor = makeProtobufClientConstructor;
|
||||
};
|
||||
|
||||
/**
|
||||
* See docs for client.status
|
||||
* Map of status code names to status codes
|
||||
*/
|
||||
exports.status = grpc.status;
|
||||
|
||||
/**
|
||||
* See docs for client.callError
|
||||
*/
|
||||
|
|
|
@ -31,6 +31,10 @@
|
|||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* @module
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var _ = require('lodash');
|
||||
|
@ -40,7 +44,7 @@ var _ = require('lodash');
|
|||
* @param {function()} cls The constructor of the message type to deserialize
|
||||
* @return {function(Buffer):cls} The deserialization function
|
||||
*/
|
||||
function deserializeCls(cls) {
|
||||
exports.deserializeCls = function deserializeCls(cls) {
|
||||
/**
|
||||
* Deserialize a buffer to a message object
|
||||
* @param {Buffer} arg_buf The buffer to deserialize
|
||||
|
@ -51,14 +55,16 @@ function deserializeCls(cls) {
|
|||
// and longs as strings (second argument)
|
||||
return cls.decode(arg_buf).toRaw(false, true);
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
var deserializeCls = exports.deserializeCls;
|
||||
|
||||
/**
|
||||
* Get a function that serializes objects to a buffer by protobuf class.
|
||||
* @param {function()} Cls The constructor of the message type to serialize
|
||||
* @return {function(Cls):Buffer} The serialization function
|
||||
*/
|
||||
function serializeCls(Cls) {
|
||||
exports.serializeCls = function serializeCls(Cls) {
|
||||
/**
|
||||
* Serialize an object to a Buffer
|
||||
* @param {Object} arg The object to serialize
|
||||
|
@ -67,14 +73,16 @@ function serializeCls(Cls) {
|
|||
return function serialize(arg) {
|
||||
return new Buffer(new Cls(arg).encode().toBuffer());
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
var serializeCls = exports.serializeCls;
|
||||
|
||||
/**
|
||||
* Get the fully qualified (dotted) name of a ProtoBuf.Reflect value.
|
||||
* @param {ProtoBuf.Reflect.Namespace} value The value to get the name of
|
||||
* @return {string} The fully qualified name of the value
|
||||
*/
|
||||
function fullyQualifiedName(value) {
|
||||
exports.fullyQualifiedName = function fullyQualifiedName(value) {
|
||||
if (value === null || value === undefined) {
|
||||
return '';
|
||||
}
|
||||
|
@ -89,7 +97,9 @@ function fullyQualifiedName(value) {
|
|||
}
|
||||
}
|
||||
return name;
|
||||
}
|
||||
};
|
||||
|
||||
var fullyQualifiedName = exports.fullyQualifiedName;
|
||||
|
||||
/**
|
||||
* Wrap a function to pass null-like values through without calling it. If no
|
||||
|
@ -97,7 +107,7 @@ function fullyQualifiedName(value) {
|
|||
* @param {?function} func The function to wrap
|
||||
* @return {function} The wrapped function
|
||||
*/
|
||||
function wrapIgnoreNull(func) {
|
||||
exports.wrapIgnoreNull = function wrapIgnoreNull(func) {
|
||||
if (!func) {
|
||||
return _.identity;
|
||||
}
|
||||
|
@ -107,14 +117,14 @@ function wrapIgnoreNull(func) {
|
|||
}
|
||||
return func(arg);
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Return a map from method names to method attributes for the service.
|
||||
* @param {ProtoBuf.Reflect.Service} service The service to get attributes for
|
||||
* @return {Object} The attributes map
|
||||
*/
|
||||
function getProtobufServiceAttrs(service) {
|
||||
exports.getProtobufServiceAttrs = function getProtobufServiceAttrs(service) {
|
||||
var prefix = '/' + fullyQualifiedName(service) + '/';
|
||||
return _.object(_.map(service.children, function(method) {
|
||||
return [_.camelCase(method.name), {
|
||||
|
@ -127,26 +137,4 @@ function getProtobufServiceAttrs(service) {
|
|||
responseDeserialize: deserializeCls(method.resolvedResponseType.build())
|
||||
}];
|
||||
}));
|
||||
}
|
||||
|
||||
/**
|
||||
* See docs for deserializeCls
|
||||
*/
|
||||
exports.deserializeCls = deserializeCls;
|
||||
|
||||
/**
|
||||
* See docs for serializeCls
|
||||
*/
|
||||
exports.serializeCls = serializeCls;
|
||||
|
||||
/**
|
||||
* See docs for fullyQualifiedName
|
||||
*/
|
||||
exports.fullyQualifiedName = fullyQualifiedName;
|
||||
|
||||
/**
|
||||
* See docs for wrapIgnoreNull
|
||||
*/
|
||||
exports.wrapIgnoreNull = wrapIgnoreNull;
|
||||
|
||||
exports.getProtobufServiceAttrs = getProtobufServiceAttrs;
|
||||
};
|
||||
|
|
|
@ -31,6 +31,11 @@
|
|||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* Server module
|
||||
* @module
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var _ = require('lodash');
|
||||
|
@ -50,6 +55,7 @@ var EventEmitter = require('events').EventEmitter;
|
|||
|
||||
/**
|
||||
* Handle an error on a call by sending it as a status
|
||||
* @access private
|
||||
* @param {grpc.Call} call The call to send the error on
|
||||
* @param {Object} error The error object
|
||||
*/
|
||||
|
@ -82,6 +88,7 @@ function handleError(call, error) {
|
|||
/**
|
||||
* Wait for the client to close, then emit a cancelled event if the client
|
||||
* cancelled.
|
||||
* @access private
|
||||
* @param {grpc.Call} call The call object to wait on
|
||||
* @param {EventEmitter} emitter The event emitter to emit the cancelled event
|
||||
* on
|
||||
|
@ -102,6 +109,7 @@ function waitForCancel(call, emitter) {
|
|||
|
||||
/**
|
||||
* Send a response to a unary or client streaming call.
|
||||
* @access private
|
||||
* @param {grpc.Call} call The call to respond on
|
||||
* @param {*} value The value to respond with
|
||||
* @param {function(*):Buffer=} serialize Serialization function for the
|
||||
|
@ -130,6 +138,7 @@ function sendUnaryResponse(call, value, serialize, metadata) {
|
|||
/**
|
||||
* Initialize a writable stream. This is used for both the writable and duplex
|
||||
* stream constructors.
|
||||
* @access private
|
||||
* @param {Writable} stream The stream to set up
|
||||
* @param {function(*):Buffer=} Serialization function for responses
|
||||
*/
|
||||
|
@ -203,6 +212,7 @@ function setUpWritable(stream, serialize) {
|
|||
/**
|
||||
* Initialize a readable stream. This is used for both the readable and duplex
|
||||
* stream constructors.
|
||||
* @access private
|
||||
* @param {Readable} stream The stream to initialize
|
||||
* @param {function(Buffer):*=} deserialize Deserialization function for
|
||||
* incoming data.
|
||||
|
@ -242,6 +252,7 @@ function ServerWritableStream(call, serialize) {
|
|||
/**
|
||||
* Start writing a chunk of data. This is an implementation of a method required
|
||||
* for implementing stream.Writable.
|
||||
* @access private
|
||||
* @param {Buffer} chunk The chunk of data to write
|
||||
* @param {string} encoding Ignored
|
||||
* @param {function(Error=)} callback Callback to indicate that the write is
|
||||
|
@ -266,6 +277,11 @@ function _write(chunk, encoding, callback) {
|
|||
|
||||
ServerWritableStream.prototype._write = _write;
|
||||
|
||||
/**
|
||||
* Send the initial metadata for a writable stream.
|
||||
* @param {Object<String, Array<(String|Buffer)>>} responseMetadata Metadata
|
||||
* to send
|
||||
*/
|
||||
function sendMetadata(responseMetadata) {
|
||||
/* jshint validthis: true */
|
||||
if (!this.call.metadataSent) {
|
||||
|
@ -281,6 +297,10 @@ function sendMetadata(responseMetadata) {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
* @alias module:src/server~ServerWritableStream#sendMetadata
|
||||
*/
|
||||
ServerWritableStream.prototype.sendMetadata = sendMetadata;
|
||||
|
||||
util.inherits(ServerReadableStream, Readable);
|
||||
|
@ -301,6 +321,7 @@ function ServerReadableStream(call, deserialize) {
|
|||
/**
|
||||
* Start reading from the gRPC data source. This is an implementation of a
|
||||
* method required for implementing stream.Readable
|
||||
* @access private
|
||||
* @param {number} size Ignored
|
||||
*/
|
||||
function _read(size) {
|
||||
|
@ -388,6 +409,7 @@ ServerDuplexStream.prototype.getPeer = getPeer;
|
|||
|
||||
/**
|
||||
* Fully handle a unary call
|
||||
* @access private
|
||||
* @param {grpc.Call} call The call to handle
|
||||
* @param {Object} handler Request handler object for the method that was called
|
||||
* @param {Object} metadata Metadata from the client
|
||||
|
@ -442,6 +464,7 @@ function handleUnary(call, handler, metadata) {
|
|||
|
||||
/**
|
||||
* Fully handle a server streaming call
|
||||
* @access private
|
||||
* @param {grpc.Call} call The call to handle
|
||||
* @param {Object} handler Request handler object for the method that was called
|
||||
* @param {Object} metadata Metadata from the client
|
||||
|
@ -470,6 +493,7 @@ function handleServerStreaming(call, handler, metadata) {
|
|||
|
||||
/**
|
||||
* Fully handle a client streaming call
|
||||
* @access private
|
||||
* @param {grpc.Call} call The call to handle
|
||||
* @param {Object} handler Request handler object for the method that was called
|
||||
* @param {Object} metadata Metadata from the client
|
||||
|
@ -504,6 +528,7 @@ function handleClientStreaming(call, handler, metadata) {
|
|||
|
||||
/**
|
||||
* Fully handle a bidirectional streaming call
|
||||
* @access private
|
||||
* @param {grpc.Call} call The call to handle
|
||||
* @param {Object} handler Request handler object for the method that was called
|
||||
* @param {Object} metadata Metadata from the client
|
||||
|
@ -587,7 +612,8 @@ function Server(options) {
|
|||
}
|
||||
server.requestCall(handleNewCall);
|
||||
};
|
||||
/** Shuts down the server.
|
||||
/**
|
||||
* Shuts down the server.
|
||||
*/
|
||||
this.shutdown = function() {
|
||||
server.shutdown();
|
||||
|
@ -621,6 +647,15 @@ Server.prototype.register = function(name, handler, serialize, deserialize,
|
|||
return true;
|
||||
};
|
||||
|
||||
/**
|
||||
* Add a service to the server, with a corresponding implementation. If you are
|
||||
* generating this from a proto file, you should instead use
|
||||
* addProtoService.
|
||||
* @param {Object<String, *>} service The service descriptor, as
|
||||
* {@link module:src/common.getProtobufServiceAttrs} returns
|
||||
* @param {Object<String, function>} implementation Map of method names to
|
||||
* method implementation for the provided service.
|
||||
*/
|
||||
Server.prototype.addService = function(service, implementation) {
|
||||
if (this.started) {
|
||||
throw new Error('Can\'t add a service to a started server.');
|
||||
|
@ -658,6 +693,12 @@ Server.prototype.addService = function(service, implementation) {
|
|||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Add a proto service to the server, with a corresponding implementation
|
||||
* @param {Protobuf.Reflect.Service} service The proto service descriptor
|
||||
* @param {Object<String, function>} implementation Map of method names to
|
||||
* method implementation for the provided service.
|
||||
*/
|
||||
Server.prototype.addProtoService = function(service, implementation) {
|
||||
this.addService(common.getProtobufServiceAttrs(service), implementation);
|
||||
};
|
||||
|
@ -677,6 +718,6 @@ Server.prototype.bind = function(port, creds) {
|
|||
};
|
||||
|
||||
/**
|
||||
* See documentation for Server
|
||||
* @see module:src/server~Server
|
||||
*/
|
||||
exports.Server = Server;
|
||||
|
|
|
@ -48,6 +48,8 @@ function getDeadline(timeout_secs) {
|
|||
return deadline;
|
||||
}
|
||||
|
||||
var insecureCreds = grpc.Credentials.createInsecure();
|
||||
|
||||
describe('call', function() {
|
||||
var channel;
|
||||
var server;
|
||||
|
@ -56,7 +58,7 @@ describe('call', function() {
|
|||
var port = server.addHttp2Port('localhost:0',
|
||||
grpc.ServerCredentials.createInsecure());
|
||||
server.start();
|
||||
channel = new grpc.Channel('localhost:' + port);
|
||||
channel = new grpc.Channel('localhost:' + port, insecureCreds);
|
||||
});
|
||||
after(function() {
|
||||
server.shutdown();
|
||||
|
@ -83,7 +85,7 @@ describe('call', function() {
|
|||
});
|
||||
});
|
||||
it('should fail with a closed channel', function() {
|
||||
var local_channel = new grpc.Channel('hostname');
|
||||
var local_channel = new grpc.Channel('hostname', insecureCreds);
|
||||
local_channel.close();
|
||||
assert.throws(function() {
|
||||
new grpc.Call(channel, 'method');
|
||||
|
|
|
@ -36,11 +36,13 @@
|
|||
var assert = require('assert');
|
||||
var grpc = require('bindings')('grpc.node');
|
||||
|
||||
var insecureCreds = grpc.Credentials.createInsecure();
|
||||
|
||||
describe('channel', function() {
|
||||
describe('constructor', function() {
|
||||
it('should require a string for the first argument', function() {
|
||||
assert.doesNotThrow(function() {
|
||||
new grpc.Channel('hostname');
|
||||
new grpc.Channel('hostname', insecureCreds);
|
||||
});
|
||||
assert.throws(function() {
|
||||
new grpc.Channel();
|
||||
|
@ -49,38 +51,49 @@ describe('channel', function() {
|
|||
new grpc.Channel(5);
|
||||
});
|
||||
});
|
||||
it('should accept an object for the second parameter', function() {
|
||||
it('should require a credential for the second argument', function() {
|
||||
assert.doesNotThrow(function() {
|
||||
new grpc.Channel('hostname', {});
|
||||
new grpc.Channel('hostname', insecureCreds);
|
||||
});
|
||||
assert.throws(function() {
|
||||
new grpc.Channel('hostname', 5);
|
||||
});
|
||||
assert.throws(function() {
|
||||
new grpc.Channel('hostname');
|
||||
});
|
||||
});
|
||||
it('should accept an object for the third argument', function() {
|
||||
assert.doesNotThrow(function() {
|
||||
new grpc.Channel('hostname', insecureCreds, {});
|
||||
});
|
||||
assert.throws(function() {
|
||||
new grpc.Channel('hostname', insecureCreds, 'abc');
|
||||
});
|
||||
});
|
||||
it('should only accept objects with string or int values', function() {
|
||||
assert.doesNotThrow(function() {
|
||||
new grpc.Channel('hostname', {'key' : 'value'});
|
||||
new grpc.Channel('hostname', insecureCreds,{'key' : 'value'});
|
||||
});
|
||||
assert.doesNotThrow(function() {
|
||||
new grpc.Channel('hostname', {'key' : 5});
|
||||
new grpc.Channel('hostname', insecureCreds, {'key' : 5});
|
||||
});
|
||||
assert.throws(function() {
|
||||
new grpc.Channel('hostname', {'key' : null});
|
||||
new grpc.Channel('hostname', insecureCreds, {'key' : null});
|
||||
});
|
||||
assert.throws(function() {
|
||||
new grpc.Channel('hostname', {'key' : new Date()});
|
||||
new grpc.Channel('hostname', insecureCreds, {'key' : new Date()});
|
||||
});
|
||||
});
|
||||
});
|
||||
describe('close', function() {
|
||||
it('should succeed silently', function() {
|
||||
var channel = new grpc.Channel('hostname', {});
|
||||
var channel = new grpc.Channel('hostname', insecureCreds, {});
|
||||
assert.doesNotThrow(function() {
|
||||
channel.close();
|
||||
});
|
||||
});
|
||||
it('should be idempotent', function() {
|
||||
var channel = new grpc.Channel('hostname', {});
|
||||
var channel = new grpc.Channel('hostname', insecureCreds, {});
|
||||
assert.doesNotThrow(function() {
|
||||
channel.close();
|
||||
channel.close();
|
||||
|
@ -89,7 +102,7 @@ describe('channel', function() {
|
|||
});
|
||||
describe('getTarget', function() {
|
||||
it('should return a string', function() {
|
||||
var channel = new grpc.Channel('localhost', {});
|
||||
var channel = new grpc.Channel('localhost', insecureCreds, {});
|
||||
assert.strictEqual(typeof channel.getTarget(), 'string');
|
||||
});
|
||||
});
|
||||
|
|
|
@ -57,6 +57,8 @@ function multiDone(done, count) {
|
|||
};
|
||||
}
|
||||
|
||||
var insecureCreds = grpc.Credentials.createInsecure();
|
||||
|
||||
describe('end-to-end', function() {
|
||||
var server;
|
||||
var channel;
|
||||
|
@ -65,7 +67,7 @@ describe('end-to-end', function() {
|
|||
var port_num = server.addHttp2Port('0.0.0.0:0',
|
||||
grpc.ServerCredentials.createInsecure());
|
||||
server.start();
|
||||
channel = new grpc.Channel('localhost:' + port_num);
|
||||
channel = new grpc.Channel('localhost:' + port_num, insecureCreds);
|
||||
});
|
||||
after(function() {
|
||||
server.shutdown();
|
||||
|
|
|
@ -57,7 +57,8 @@ describe('Health Checking', function() {
|
|||
var port_num = healthServer.bind('0.0.0.0:0',
|
||||
grpc.ServerCredentials.createInsecure());
|
||||
healthServer.start();
|
||||
healthClient = new health.Client('localhost:' + port_num);
|
||||
healthClient = new health.Client('localhost:' + port_num,
|
||||
grpc.Credentials.createInsecure());
|
||||
});
|
||||
after(function() {
|
||||
healthServer.shutdown();
|
||||
|
|
|
@ -54,7 +54,8 @@ describe('Math client', function() {
|
|||
var port_num = server.bind('0.0.0.0:0',
|
||||
grpc.ServerCredentials.createInsecure());
|
||||
server.start();
|
||||
math_client = new math.Math('localhost:' + port_num);
|
||||
math_client = new math.Math('localhost:' + port_num,
|
||||
grpc.Credentials.createInsecure());
|
||||
done();
|
||||
});
|
||||
after(function() {
|
||||
|
|
|
@ -126,7 +126,7 @@ describe('Echo service', function() {
|
|||
});
|
||||
var port = server.bind('localhost:0', server_insecure_creds);
|
||||
var Client = surface_client.makeProtobufClientConstructor(echo_service);
|
||||
client = new Client('localhost:' + port);
|
||||
client = new Client('localhost:' + port, grpc.Credentials.createInsecure());
|
||||
server.start();
|
||||
});
|
||||
after(function() {
|
||||
|
@ -171,7 +171,8 @@ describe('Generic client and server', function() {
|
|||
var port = server.bind('localhost:0', server_insecure_creds);
|
||||
server.start();
|
||||
var Client = grpc.makeGenericClientConstructor(string_service_attrs);
|
||||
client = new Client('localhost:' + port);
|
||||
client = new Client('localhost:' + port,
|
||||
grpc.Credentials.createInsecure());
|
||||
});
|
||||
after(function() {
|
||||
server.shutdown();
|
||||
|
@ -218,7 +219,7 @@ describe('Echo metadata', function() {
|
|||
});
|
||||
var port = server.bind('localhost:0', server_insecure_creds);
|
||||
var Client = surface_client.makeProtobufClientConstructor(test_service);
|
||||
client = new Client('localhost:' + port);
|
||||
client = new Client('localhost:' + port, grpc.Credentials.createInsecure());
|
||||
server.start();
|
||||
});
|
||||
after(function() {
|
||||
|
@ -262,9 +263,8 @@ describe('Echo metadata', function() {
|
|||
});
|
||||
it('shows the correct user-agent string', function(done) {
|
||||
var version = require('../package.json').version;
|
||||
var call = client.unary({}, function(err, data) {
|
||||
assert.ifError(err);
|
||||
}, {key: ['value']});
|
||||
var call = client.unary({}, function(err, data) { assert.ifError(err); },
|
||||
{key: ['value']});
|
||||
call.on('metadata', function(metadata) {
|
||||
assert(_.startsWith(metadata['user-agent'], 'grpc-node/' + version));
|
||||
done();
|
||||
|
@ -340,7 +340,7 @@ describe('Other conditions', function() {
|
|||
});
|
||||
port = server.bind('localhost:0', server_insecure_creds);
|
||||
var Client = surface_client.makeProtobufClientConstructor(test_service);
|
||||
client = new Client('localhost:' + port);
|
||||
client = new Client('localhost:' + port, grpc.Credentials.createInsecure());
|
||||
server.start();
|
||||
});
|
||||
after(function() {
|
||||
|
@ -385,7 +385,8 @@ describe('Other conditions', function() {
|
|||
};
|
||||
var Client = surface_client.makeClientConstructor(test_service_attrs,
|
||||
'TestService');
|
||||
misbehavingClient = new Client('localhost:' + port);
|
||||
misbehavingClient = new Client('localhost:' + port,
|
||||
grpc.Credentials.createInsecure());
|
||||
});
|
||||
it('should respond correctly to a unary call', function(done) {
|
||||
misbehavingClient.unary(badArg, function(err, data) {
|
||||
|
@ -605,7 +606,7 @@ describe('Cancelling surface client', function() {
|
|||
});
|
||||
var port = server.bind('localhost:0', server_insecure_creds);
|
||||
var Client = surface_client.makeProtobufClientConstructor(mathService);
|
||||
client = new Client('localhost:' + port);
|
||||
client = new Client('localhost:' + port, grpc.Credentials.createInsecure());
|
||||
server.start();
|
||||
});
|
||||
after(function() {
|
||||
|
|
Loading…
Reference in New Issue