|
@@ -61,6 +61,17 @@
|
|
|
|
|
|
/**
|
|
|
* Client module
|
|
|
+ *
|
|
|
+ * This module contains the factory method for creating Client classes, and the
|
|
|
+ * method calling code for all types of methods.
|
|
|
+ *
|
|
|
+ * For example, to create a client and call a method on it:
|
|
|
+ *
|
|
|
+ * var proto_obj = grpc.load(proto_file_path);
|
|
|
+ * var Client = proto_obj.package.subpackage.ServiceName;
|
|
|
+ * var client = new Client(server_address, client_credentials);
|
|
|
+ * var call = client.unaryMethod(arguments, callback);
|
|
|
+ *
|
|
|
* @module
|
|
|
*/
|
|
|
|
|
@@ -68,7 +79,7 @@
|
|
|
|
|
|
var _ = require('lodash');
|
|
|
|
|
|
-var grpc = require('bindings')('grpc.node');
|
|
|
+var grpc = require('bindings')('grpc_node');
|
|
|
|
|
|
var common = require('./common');
|
|
|
|
|
@@ -82,7 +93,7 @@ var Readable = stream.Readable;
|
|
|
var Writable = stream.Writable;
|
|
|
var Duplex = stream.Duplex;
|
|
|
var util = require('util');
|
|
|
-var version = require('../package.json').version;
|
|
|
+var version = require('../../../package.json').version;
|
|
|
|
|
|
util.inherits(ClientWritableStream, Writable);
|
|
|
|
|
@@ -261,17 +272,23 @@ function getCall(channel, method, options) {
|
|
|
var host;
|
|
|
var parent;
|
|
|
var propagate_flags;
|
|
|
+ var credentials;
|
|
|
if (options) {
|
|
|
deadline = options.deadline;
|
|
|
host = options.host;
|
|
|
parent = _.get(options, 'parent.call');
|
|
|
propagate_flags = options.propagate_flags;
|
|
|
+ credentials = options.credentials;
|
|
|
}
|
|
|
if (deadline === undefined) {
|
|
|
deadline = Infinity;
|
|
|
}
|
|
|
- return new grpc.Call(channel, method, deadline, host,
|
|
|
- parent, propagate_flags);
|
|
|
+ var call = new grpc.Call(channel, method, deadline, host,
|
|
|
+ parent, propagate_flags);
|
|
|
+ if (credentials) {
|
|
|
+ call.setCredentials(credentials);
|
|
|
+ }
|
|
|
+ return call;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -310,60 +327,53 @@ function makeUnaryRequestFunction(method, serialize, deserialize) {
|
|
|
emitter.getPeer = function getPeer() {
|
|
|
return call.getPeer();
|
|
|
};
|
|
|
- this.$updateMetadata(this.$auth_uri, metadata, function(error, metadata) {
|
|
|
- if (error) {
|
|
|
- call.cancel();
|
|
|
- callback(error);
|
|
|
- return;
|
|
|
- }
|
|
|
- var client_batch = {};
|
|
|
- var message = serialize(argument);
|
|
|
- if (options) {
|
|
|
- message.grpcWriteFlags = options.flags;
|
|
|
- }
|
|
|
- client_batch[grpc.opType.SEND_INITIAL_METADATA] =
|
|
|
- metadata._getCoreRepresentation();
|
|
|
- client_batch[grpc.opType.SEND_MESSAGE] = message;
|
|
|
- client_batch[grpc.opType.SEND_CLOSE_FROM_CLIENT] = true;
|
|
|
- client_batch[grpc.opType.RECV_INITIAL_METADATA] = true;
|
|
|
- client_batch[grpc.opType.RECV_MESSAGE] = true;
|
|
|
- client_batch[grpc.opType.RECV_STATUS_ON_CLIENT] = true;
|
|
|
- call.startBatch(client_batch, function(err, response) {
|
|
|
- response.status.metadata = Metadata._fromCoreRepresentation(
|
|
|
- response.status.metadata);
|
|
|
- var status = response.status;
|
|
|
- var error;
|
|
|
- var deserialized;
|
|
|
- if (status.code === grpc.status.OK) {
|
|
|
- if (err) {
|
|
|
- // Got a batch error, but OK status. Something went wrong
|
|
|
- callback(err);
|
|
|
- return;
|
|
|
- } else {
|
|
|
- try {
|
|
|
- deserialized = deserialize(response.read);
|
|
|
- } catch (e) {
|
|
|
- /* Change status to indicate bad server response. This will result
|
|
|
- * in passing an error to the callback */
|
|
|
- status = {
|
|
|
- code: grpc.status.INTERNAL,
|
|
|
- details: 'Failed to parse server response'
|
|
|
- };
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- if (status.code !== grpc.status.OK) {
|
|
|
- error = new Error(response.status.details);
|
|
|
- error.code = status.code;
|
|
|
- error.metadata = status.metadata;
|
|
|
- callback(error);
|
|
|
+ var client_batch = {};
|
|
|
+ var message = serialize(argument);
|
|
|
+ if (options) {
|
|
|
+ message.grpcWriteFlags = options.flags;
|
|
|
+ }
|
|
|
+ client_batch[grpc.opType.SEND_INITIAL_METADATA] =
|
|
|
+ metadata._getCoreRepresentation();
|
|
|
+ client_batch[grpc.opType.SEND_MESSAGE] = message;
|
|
|
+ client_batch[grpc.opType.SEND_CLOSE_FROM_CLIENT] = true;
|
|
|
+ client_batch[grpc.opType.RECV_INITIAL_METADATA] = true;
|
|
|
+ client_batch[grpc.opType.RECV_MESSAGE] = true;
|
|
|
+ client_batch[grpc.opType.RECV_STATUS_ON_CLIENT] = true;
|
|
|
+ call.startBatch(client_batch, function(err, response) {
|
|
|
+ response.status.metadata = Metadata._fromCoreRepresentation(
|
|
|
+ response.status.metadata);
|
|
|
+ var status = response.status;
|
|
|
+ var error;
|
|
|
+ var deserialized;
|
|
|
+ if (status.code === grpc.status.OK) {
|
|
|
+ if (err) {
|
|
|
+ // Got a batch error, but OK status. Something went wrong
|
|
|
+ callback(err);
|
|
|
+ return;
|
|
|
} else {
|
|
|
- callback(null, deserialized);
|
|
|
+ try {
|
|
|
+ deserialized = deserialize(response.read);
|
|
|
+ } catch (e) {
|
|
|
+ /* Change status to indicate bad server response. This will result
|
|
|
+ * in passing an error to the callback */
|
|
|
+ status = {
|
|
|
+ code: grpc.status.INTERNAL,
|
|
|
+ details: 'Failed to parse server response'
|
|
|
+ };
|
|
|
+ }
|
|
|
}
|
|
|
- emitter.emit('status', status);
|
|
|
- emitter.emit('metadata', Metadata._fromCoreRepresentation(
|
|
|
- response.metadata));
|
|
|
- });
|
|
|
+ }
|
|
|
+ if (status.code !== grpc.status.OK) {
|
|
|
+ error = new Error(response.status.details);
|
|
|
+ error.code = status.code;
|
|
|
+ error.metadata = status.metadata;
|
|
|
+ callback(error);
|
|
|
+ } else {
|
|
|
+ callback(null, deserialized);
|
|
|
+ }
|
|
|
+ emitter.emit('status', status);
|
|
|
+ emitter.emit('metadata', Metadata._fromCoreRepresentation(
|
|
|
+ response.metadata));
|
|
|
});
|
|
|
return emitter;
|
|
|
}
|
|
@@ -399,62 +409,55 @@ function makeClientStreamRequestFunction(method, serialize, deserialize) {
|
|
|
metadata = metadata.clone();
|
|
|
}
|
|
|
var stream = new ClientWritableStream(call, serialize);
|
|
|
- this.$updateMetadata(this.$auth_uri, metadata, function(error, metadata) {
|
|
|
- if (error) {
|
|
|
- call.cancel();
|
|
|
- callback(error);
|
|
|
+ var metadata_batch = {};
|
|
|
+ metadata_batch[grpc.opType.SEND_INITIAL_METADATA] =
|
|
|
+ metadata._getCoreRepresentation();
|
|
|
+ metadata_batch[grpc.opType.RECV_INITIAL_METADATA] = true;
|
|
|
+ call.startBatch(metadata_batch, function(err, response) {
|
|
|
+ if (err) {
|
|
|
+ // The call has stopped for some reason. A non-OK status will arrive
|
|
|
+ // in the other batch.
|
|
|
return;
|
|
|
}
|
|
|
- var metadata_batch = {};
|
|
|
- metadata_batch[grpc.opType.SEND_INITIAL_METADATA] =
|
|
|
- metadata._getCoreRepresentation();
|
|
|
- metadata_batch[grpc.opType.RECV_INITIAL_METADATA] = true;
|
|
|
- call.startBatch(metadata_batch, function(err, response) {
|
|
|
+ stream.emit('metadata', Metadata._fromCoreRepresentation(
|
|
|
+ response.metadata));
|
|
|
+ });
|
|
|
+ var client_batch = {};
|
|
|
+ client_batch[grpc.opType.RECV_MESSAGE] = true;
|
|
|
+ client_batch[grpc.opType.RECV_STATUS_ON_CLIENT] = true;
|
|
|
+ call.startBatch(client_batch, function(err, response) {
|
|
|
+ response.status.metadata = Metadata._fromCoreRepresentation(
|
|
|
+ response.status.metadata);
|
|
|
+ var status = response.status;
|
|
|
+ var error;
|
|
|
+ var deserialized;
|
|
|
+ if (status.code === grpc.status.OK) {
|
|
|
if (err) {
|
|
|
- // The call has stopped for some reason. A non-OK status will arrive
|
|
|
- // in the other batch.
|
|
|
+ // Got a batch error, but OK status. Something went wrong
|
|
|
+ callback(err);
|
|
|
return;
|
|
|
- }
|
|
|
- stream.emit('metadata', Metadata._fromCoreRepresentation(
|
|
|
- response.metadata));
|
|
|
- });
|
|
|
- var client_batch = {};
|
|
|
- client_batch[grpc.opType.RECV_MESSAGE] = true;
|
|
|
- client_batch[grpc.opType.RECV_STATUS_ON_CLIENT] = true;
|
|
|
- call.startBatch(client_batch, function(err, response) {
|
|
|
- response.status.metadata = Metadata._fromCoreRepresentation(
|
|
|
- response.status.metadata);
|
|
|
- var status = response.status;
|
|
|
- var error;
|
|
|
- var deserialized;
|
|
|
- if (status.code === grpc.status.OK) {
|
|
|
- if (err) {
|
|
|
- // Got a batch error, but OK status. Something went wrong
|
|
|
- callback(err);
|
|
|
- return;
|
|
|
- } else {
|
|
|
- try {
|
|
|
- deserialized = deserialize(response.read);
|
|
|
- } catch (e) {
|
|
|
- /* Change status to indicate bad server response. This will result
|
|
|
- * in passing an error to the callback */
|
|
|
- status = {
|
|
|
- code: grpc.status.INTERNAL,
|
|
|
- details: 'Failed to parse server response'
|
|
|
- };
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- if (status.code !== grpc.status.OK) {
|
|
|
- error = new Error(response.status.details);
|
|
|
- error.code = status.code;
|
|
|
- error.metadata = status.metadata;
|
|
|
- callback(error);
|
|
|
} else {
|
|
|
- callback(null, deserialized);
|
|
|
+ try {
|
|
|
+ deserialized = deserialize(response.read);
|
|
|
+ } catch (e) {
|
|
|
+ /* Change status to indicate bad server response. This will result
|
|
|
+ * in passing an error to the callback */
|
|
|
+ status = {
|
|
|
+ code: grpc.status.INTERNAL,
|
|
|
+ details: 'Failed to parse server response'
|
|
|
+ };
|
|
|
+ }
|
|
|
}
|
|
|
- stream.emit('status', status);
|
|
|
- });
|
|
|
+ }
|
|
|
+ if (status.code !== grpc.status.OK) {
|
|
|
+ error = new Error(response.status.details);
|
|
|
+ error.code = status.code;
|
|
|
+ error.metadata = status.metadata;
|
|
|
+ callback(error);
|
|
|
+ } else {
|
|
|
+ callback(null, deserialized);
|
|
|
+ }
|
|
|
+ stream.emit('status', status);
|
|
|
});
|
|
|
return stream;
|
|
|
}
|
|
@@ -490,51 +493,44 @@ function makeServerStreamRequestFunction(method, serialize, deserialize) {
|
|
|
metadata = metadata.clone();
|
|
|
}
|
|
|
var stream = new ClientReadableStream(call, deserialize);
|
|
|
- this.$updateMetadata(this.$auth_uri, metadata, function(error, metadata) {
|
|
|
- if (error) {
|
|
|
- call.cancel();
|
|
|
- stream.emit('error', error);
|
|
|
+ var start_batch = {};
|
|
|
+ var message = serialize(argument);
|
|
|
+ if (options) {
|
|
|
+ message.grpcWriteFlags = options.flags;
|
|
|
+ }
|
|
|
+ start_batch[grpc.opType.SEND_INITIAL_METADATA] =
|
|
|
+ metadata._getCoreRepresentation();
|
|
|
+ start_batch[grpc.opType.RECV_INITIAL_METADATA] = true;
|
|
|
+ start_batch[grpc.opType.SEND_MESSAGE] = message;
|
|
|
+ start_batch[grpc.opType.SEND_CLOSE_FROM_CLIENT] = true;
|
|
|
+ call.startBatch(start_batch, function(err, response) {
|
|
|
+ if (err) {
|
|
|
+ // The call has stopped for some reason. A non-OK status will arrive
|
|
|
+ // in the other batch.
|
|
|
return;
|
|
|
}
|
|
|
- var start_batch = {};
|
|
|
- var message = serialize(argument);
|
|
|
- if (options) {
|
|
|
- message.grpcWriteFlags = options.flags;
|
|
|
- }
|
|
|
- start_batch[grpc.opType.SEND_INITIAL_METADATA] =
|
|
|
- metadata._getCoreRepresentation();
|
|
|
- start_batch[grpc.opType.RECV_INITIAL_METADATA] = true;
|
|
|
- start_batch[grpc.opType.SEND_MESSAGE] = message;
|
|
|
- start_batch[grpc.opType.SEND_CLOSE_FROM_CLIENT] = true;
|
|
|
- call.startBatch(start_batch, function(err, response) {
|
|
|
+ stream.emit('metadata', Metadata._fromCoreRepresentation(
|
|
|
+ response.metadata));
|
|
|
+ });
|
|
|
+ var status_batch = {};
|
|
|
+ status_batch[grpc.opType.RECV_STATUS_ON_CLIENT] = true;
|
|
|
+ call.startBatch(status_batch, function(err, response) {
|
|
|
+ response.status.metadata = Metadata._fromCoreRepresentation(
|
|
|
+ response.status.metadata);
|
|
|
+ stream.emit('status', response.status);
|
|
|
+ if (response.status.code !== grpc.status.OK) {
|
|
|
+ var error = new Error(response.status.details);
|
|
|
+ error.code = response.status.code;
|
|
|
+ error.metadata = response.status.metadata;
|
|
|
+ stream.emit('error', error);
|
|
|
+ return;
|
|
|
+ } else {
|
|
|
if (err) {
|
|
|
- // The call has stopped for some reason. A non-OK status will arrive
|
|
|
- // in the other batch.
|
|
|
+ // Got a batch error, but OK status. Something went wrong
|
|
|
+ stream.emit('error', err);
|
|
|
return;
|
|
|
}
|
|
|
- stream.emit('metadata', Metadata._fromCoreRepresentation(
|
|
|
- response.metadata));
|
|
|
- });
|
|
|
- var status_batch = {};
|
|
|
- status_batch[grpc.opType.RECV_STATUS_ON_CLIENT] = true;
|
|
|
- call.startBatch(status_batch, function(err, response) {
|
|
|
- response.status.metadata = Metadata._fromCoreRepresentation(
|
|
|
- response.status.metadata);
|
|
|
- stream.emit('status', response.status);
|
|
|
- if (response.status.code !== grpc.status.OK) {
|
|
|
- var error = new Error(response.status.details);
|
|
|
- error.code = response.status.code;
|
|
|
- error.metadata = response.status.metadata;
|
|
|
- stream.emit('error', error);
|
|
|
- return;
|
|
|
- } else {
|
|
|
- if (err) {
|
|
|
- // Got a batch error, but OK status. Something went wrong
|
|
|
- stream.emit('error', err);
|
|
|
- return;
|
|
|
- }
|
|
|
- }
|
|
|
- });
|
|
|
+ }
|
|
|
});
|
|
|
return stream;
|
|
|
}
|
|
@@ -568,45 +564,38 @@ function makeBidiStreamRequestFunction(method, serialize, deserialize) {
|
|
|
metadata = metadata.clone();
|
|
|
}
|
|
|
var stream = new ClientDuplexStream(call, serialize, deserialize);
|
|
|
- this.$updateMetadata(this.$auth_uri, metadata, function(error, metadata) {
|
|
|
- if (error) {
|
|
|
- call.cancel();
|
|
|
- stream.emit('error', error);
|
|
|
+ var start_batch = {};
|
|
|
+ start_batch[grpc.opType.SEND_INITIAL_METADATA] =
|
|
|
+ metadata._getCoreRepresentation();
|
|
|
+ start_batch[grpc.opType.RECV_INITIAL_METADATA] = true;
|
|
|
+ call.startBatch(start_batch, function(err, response) {
|
|
|
+ if (err) {
|
|
|
+ // The call has stopped for some reason. A non-OK status will arrive
|
|
|
+ // in the other batch.
|
|
|
return;
|
|
|
}
|
|
|
- var start_batch = {};
|
|
|
- start_batch[grpc.opType.SEND_INITIAL_METADATA] =
|
|
|
- metadata._getCoreRepresentation();
|
|
|
- start_batch[grpc.opType.RECV_INITIAL_METADATA] = true;
|
|
|
- call.startBatch(start_batch, function(err, response) {
|
|
|
+ stream.emit('metadata', Metadata._fromCoreRepresentation(
|
|
|
+ response.metadata));
|
|
|
+ });
|
|
|
+ var status_batch = {};
|
|
|
+ status_batch[grpc.opType.RECV_STATUS_ON_CLIENT] = true;
|
|
|
+ call.startBatch(status_batch, function(err, response) {
|
|
|
+ response.status.metadata = Metadata._fromCoreRepresentation(
|
|
|
+ response.status.metadata);
|
|
|
+ stream.emit('status', response.status);
|
|
|
+ if (response.status.code !== grpc.status.OK) {
|
|
|
+ var error = new Error(response.status.details);
|
|
|
+ error.code = response.status.code;
|
|
|
+ error.metadata = response.status.metadata;
|
|
|
+ stream.emit('error', error);
|
|
|
+ return;
|
|
|
+ } else {
|
|
|
if (err) {
|
|
|
- // The call has stopped for some reason. A non-OK status will arrive
|
|
|
- // in the other batch.
|
|
|
+ // Got a batch error, but OK status. Something went wrong
|
|
|
+ stream.emit('error', err);
|
|
|
return;
|
|
|
}
|
|
|
- stream.emit('metadata', Metadata._fromCoreRepresentation(
|
|
|
- response.metadata));
|
|
|
- });
|
|
|
- var status_batch = {};
|
|
|
- status_batch[grpc.opType.RECV_STATUS_ON_CLIENT] = true;
|
|
|
- call.startBatch(status_batch, function(err, response) {
|
|
|
- response.status.metadata = Metadata._fromCoreRepresentation(
|
|
|
- response.status.metadata);
|
|
|
- stream.emit('status', response.status);
|
|
|
- if (response.status.code !== grpc.status.OK) {
|
|
|
- var error = new Error(response.status.details);
|
|
|
- error.code = response.status.code;
|
|
|
- error.metadata = response.status.metadata;
|
|
|
- stream.emit('error', error);
|
|
|
- return;
|
|
|
- } else {
|
|
|
- if (err) {
|
|
|
- // Got a batch error, but OK status. Something went wrong
|
|
|
- stream.emit('error', err);
|
|
|
- return;
|
|
|
- }
|
|
|
- }
|
|
|
- });
|
|
|
+ }
|
|
|
});
|
|
|
return stream;
|
|
|
}
|
|
@@ -646,27 +635,23 @@ exports.makeClientConstructor = function(methods, serviceName) {
|
|
|
* @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, credentials, options, updateMetadata) {
|
|
|
- if (!updateMetadata) {
|
|
|
- updateMetadata = function(uri, metadata, callback) {
|
|
|
- callback(null, metadata);
|
|
|
- };
|
|
|
- }
|
|
|
+ function Client(address, credentials, options) {
|
|
|
if (!options) {
|
|
|
options = {};
|
|
|
}
|
|
|
- options['grpc.primary_user_agent'] = 'grpc-node/' + version;
|
|
|
+ /* Append the grpc-node user agent string after the application user agent
|
|
|
+ * string, and put the combination at the beginning of the user agent string
|
|
|
+ */
|
|
|
+ if (options['grpc.primary_user_agent']) {
|
|
|
+ options['grpc.primary_user_agent'] += ' ';
|
|
|
+ } else {
|
|
|
+ options['grpc.primary_user_agent'] = '';
|
|
|
+ }
|
|
|
+ options['grpc.primary_user_agent'] += 'grpc-node/' + version;
|
|
|
/* Private fields use $ as a prefix instead of _ because it is an invalid
|
|
|
* prefix of a method name */
|
|
|
this.$channel = new grpc.Channel(address, credentials, options);
|
|
|
- // Remove the optional DNS scheme, trailing port, and trailing backslash
|
|
|
- address = address.replace(/^(dns:\/{3})?([^:\/]+)(:\d+)?\/?$/, '$2');
|
|
|
- this.$server_address = address;
|
|
|
- this.$auth_uri = 'https://' + this.$server_address + '/' + serviceName;
|
|
|
- this.$updateMetadata = updateMetadata;
|
|
|
}
|
|
|
|
|
|
_.each(methods, function(attrs, name) {
|
|
@@ -723,6 +708,7 @@ exports.waitForClientReady = function(client, deadline, callback) {
|
|
|
var checkState = function(err) {
|
|
|
if (err) {
|
|
|
callback(new Error('Failed to connect before the deadline'));
|
|
|
+ return;
|
|
|
}
|
|
|
var new_state = client.$channel.getConnectivityState(true);
|
|
|
if (new_state === grpc.connectivityState.READY) {
|
|
@@ -769,13 +755,13 @@ exports.callError = grpc.callError;
|
|
|
</div>
|
|
|
|
|
|
<nav>
|
|
|
- <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-src_client.html">src/client</a></li><li><a href="module-src_common.html">src/common</a></li><li><a href="module-src_metadata.html">src/metadata</a></li><li><a href="module-src_server.html">src/server</a></li></ul><h3>Classes</h3><ul><li><a href="module-src_client.makeClientConstructor-Client.html">Client</a></li><li><a href="module-src_client-ClientDuplexStream.html">ClientDuplexStream</a></li><li><a href="module-src_client-ClientReadableStream.html">ClientReadableStream</a></li><li><a href="module-src_client-ClientWritableStream.html">ClientWritableStream</a></li><li><a href="module-src_metadata-Metadata.html">Metadata</a></li><li><a href="module-src_server-Server.html">Server</a></li><li><a href="module-src_server-ServerDuplexStream.html">ServerDuplexStream</a></li><li><a href="module-src_server-ServerReadableStream.html">ServerReadableStream</a></li><li><a href="module-src_server-ServerWritableStream.html">ServerWritableStream</a></li></ul><h3>Global</h3><ul><li><a href="global.html#callError">callError</a></li><li><a href="global.html#Credentials">Credentials</a></li><li><a href="global.html#getClientChannel">getClientChannel</a></li><li><a href="global.html#getGoogleAuthDelegate">getGoogleAuthDelegate</a></li><li><a href="global.html#load">load</a></li><li><a href="global.html#loadObject">loadObject</a></li><li><a href="global.html#makeGenericClientConstructor">makeGenericClientConstructor</a></li><li><a href="global.html#Metadata">Metadata</a></li><li><a href="global.html#propagate">propagate</a></li><li><a href="global.html#Server">Server</a></li><li><a href="global.html#ServerCredentials">ServerCredentials</a></li><li><a href="global.html#status">status</a></li><li><a href="global.html#waitForClientReady">waitForClientReady</a></li><li><a href="global.html#writeFlags">writeFlags</a></li></ul>
|
|
|
+ <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-src_client.html">src/client</a></li><li><a href="module-src_common.html">src/common</a></li><li><a href="module-src_credentials.html">src/credentials</a></li><li><a href="module-src_metadata.html">src/metadata</a></li><li><a href="module-src_server.html">src/server</a></li></ul><h3>Classes</h3><ul><li><a href="module-src_client.makeClientConstructor-Client.html">Client</a></li><li><a href="module-src_client-ClientDuplexStream.html">ClientDuplexStream</a></li><li><a href="module-src_client-ClientReadableStream.html">ClientReadableStream</a></li><li><a href="module-src_client-ClientWritableStream.html">ClientWritableStream</a></li><li><a href="module-src_metadata-Metadata.html">Metadata</a></li><li><a href="module-src_server-Server.html">Server</a></li><li><a href="module-src_server-ServerDuplexStream.html">ServerDuplexStream</a></li><li><a href="module-src_server-ServerReadableStream.html">ServerReadableStream</a></li><li><a href="module-src_server-ServerWritableStream.html">ServerWritableStream</a></li></ul><h3>Global</h3><ul><li><a href="global.html#callError">callError</a></li><li><a href="global.html#credentials">credentials</a></li><li><a href="global.html#getClientChannel">getClientChannel</a></li><li><a href="global.html#load">load</a></li><li><a href="global.html#loadObject">loadObject</a></li><li><a href="global.html#makeGenericClientConstructor">makeGenericClientConstructor</a></li><li><a href="global.html#Metadata">Metadata</a></li><li><a href="global.html#propagate">propagate</a></li><li><a href="global.html#Server">Server</a></li><li><a href="global.html#ServerCredentials">ServerCredentials</a></li><li><a href="global.html#status">status</a></li><li><a href="global.html#waitForClientReady">waitForClientReady</a></li><li><a href="global.html#writeFlags">writeFlags</a></li></ul>
|
|
|
</nav>
|
|
|
|
|
|
<br class="clear">
|
|
|
|
|
|
<footer>
|
|
|
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.3.3</a> on Thu Oct 29 2015 13:07:25 GMT-0700 (PDT)
|
|
|
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.4.0</a> on Thu Jan 14 2016 16:17:15 GMT-0800 (PST)
|
|
|
</footer>
|
|
|
|
|
|
<script> prettyPrint(); </script>
|