|
|
|
@ -32,7 +32,7 @@ |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Server module |
|
|
|
|
* Client module |
|
|
|
|
* @module |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
@ -270,7 +270,7 @@ function makeUnaryRequestFunction(method, serialize, deserialize) { |
|
|
|
|
function makeUnaryRequest(argument, callback, metadata, options) { |
|
|
|
|
/* jshint validthis: true */ |
|
|
|
|
var emitter = new EventEmitter(); |
|
|
|
|
var call = getCall(this.channel, method, options); |
|
|
|
|
var call = getCall(this.$channel, method, options); |
|
|
|
|
if (metadata === null || metadata === undefined) { |
|
|
|
|
metadata = new Metadata(); |
|
|
|
|
} else { |
|
|
|
@ -282,7 +282,7 @@ function makeUnaryRequestFunction(method, serialize, deserialize) { |
|
|
|
|
emitter.getPeer = function getPeer() { |
|
|
|
|
return call.getPeer(); |
|
|
|
|
}; |
|
|
|
|
this.updateMetadata(this.auth_uri, metadata, function(error, metadata) { |
|
|
|
|
this.$updateMetadata(this.$auth_uri, metadata, function(error, metadata) { |
|
|
|
|
if (error) { |
|
|
|
|
call.cancel(); |
|
|
|
|
callback(error); |
|
|
|
@ -364,14 +364,14 @@ function makeClientStreamRequestFunction(method, serialize, deserialize) { |
|
|
|
|
*/ |
|
|
|
|
function makeClientStreamRequest(callback, metadata, options) { |
|
|
|
|
/* jshint validthis: true */ |
|
|
|
|
var call = getCall(this.channel, method, options); |
|
|
|
|
var call = getCall(this.$channel, method, options); |
|
|
|
|
if (metadata === null || metadata === undefined) { |
|
|
|
|
metadata = new Metadata(); |
|
|
|
|
} else { |
|
|
|
|
metadata = metadata.clone(); |
|
|
|
|
} |
|
|
|
|
var stream = new ClientWritableStream(call, serialize); |
|
|
|
|
this.updateMetadata(this.auth_uri, metadata, function(error, metadata) { |
|
|
|
|
this.$updateMetadata(this.$auth_uri, metadata, function(error, metadata) { |
|
|
|
|
if (error) { |
|
|
|
|
call.cancel(); |
|
|
|
|
callback(error); |
|
|
|
@ -455,14 +455,14 @@ function makeServerStreamRequestFunction(method, serialize, deserialize) { |
|
|
|
|
*/ |
|
|
|
|
function makeServerStreamRequest(argument, metadata, options) { |
|
|
|
|
/* jshint validthis: true */ |
|
|
|
|
var call = getCall(this.channel, method, options); |
|
|
|
|
var call = getCall(this.$channel, method, options); |
|
|
|
|
if (metadata === null || metadata === undefined) { |
|
|
|
|
metadata = new Metadata(); |
|
|
|
|
} else { |
|
|
|
|
metadata = metadata.clone(); |
|
|
|
|
} |
|
|
|
|
var stream = new ClientReadableStream(call, deserialize); |
|
|
|
|
this.updateMetadata(this.auth_uri, metadata, function(error, metadata) { |
|
|
|
|
this.$updateMetadata(this.$auth_uri, metadata, function(error, metadata) { |
|
|
|
|
if (error) { |
|
|
|
|
call.cancel(); |
|
|
|
|
stream.emit('error', error); |
|
|
|
@ -533,14 +533,14 @@ function makeBidiStreamRequestFunction(method, serialize, deserialize) { |
|
|
|
|
*/ |
|
|
|
|
function makeBidiStreamRequest(metadata, options) { |
|
|
|
|
/* jshint validthis: true */ |
|
|
|
|
var call = getCall(this.channel, method, options); |
|
|
|
|
var call = getCall(this.$channel, method, options); |
|
|
|
|
if (metadata === null || metadata === undefined) { |
|
|
|
|
metadata = new Metadata(); |
|
|
|
|
} else { |
|
|
|
|
metadata = metadata.clone(); |
|
|
|
|
} |
|
|
|
|
var stream = new ClientDuplexStream(call, serialize, deserialize); |
|
|
|
|
this.updateMetadata(this.auth_uri, metadata, function(error, metadata) { |
|
|
|
|
this.$updateMetadata(this.$auth_uri, metadata, function(error, metadata) { |
|
|
|
|
if (error) { |
|
|
|
|
call.cancel(); |
|
|
|
|
stream.emit('error', error); |
|
|
|
@ -631,45 +631,21 @@ exports.makeClientConstructor = function(methods, serviceName) { |
|
|
|
|
options = {}; |
|
|
|
|
} |
|
|
|
|
options['grpc.primary_user_agent'] = 'grpc-node/' + version; |
|
|
|
|
this.channel = new grpc.Channel(address, credentials, options); |
|
|
|
|
/* 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; |
|
|
|
|
this.$server_address = address; |
|
|
|
|
this.$auth_uri = 'https://' + this.server_address + '/' + serviceName; |
|
|
|
|
this.$updateMetadata = updateMetadata; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Wait for the client to be ready. The callback will be called when the |
|
|
|
|
* client has successfully connected to the server, and it will be called |
|
|
|
|
* with an error if the attempt to connect to the server has unrecoverablly |
|
|
|
|
* failed or if the deadline expires. This function will make the channel |
|
|
|
|
* start connecting if it has not already done so. |
|
|
|
|
* @param {(Date|Number)} deadline When to stop waiting for a connection. Pass |
|
|
|
|
* Infinity to wait forever. |
|
|
|
|
* @param {function(Error)} callback The callback to call when done attempting |
|
|
|
|
* to connect. |
|
|
|
|
*/ |
|
|
|
|
Client.prototype.$waitForReady = function(deadline, callback) { |
|
|
|
|
var self = this; |
|
|
|
|
var checkState = function(err) { |
|
|
|
|
if (err) { |
|
|
|
|
callback(new Error('Failed to connect before the deadline')); |
|
|
|
|
} |
|
|
|
|
var new_state = self.channel.getConnectivityState(true); |
|
|
|
|
if (new_state === grpc.connectivityState.READY) { |
|
|
|
|
callback(); |
|
|
|
|
} else if (new_state === grpc.connectivityState.FATAL_FAILURE) { |
|
|
|
|
callback(new Error('Failed to connect to server')); |
|
|
|
|
} else { |
|
|
|
|
self.channel.watchConnectivityState(new_state, deadline, checkState); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
checkState(); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
_.each(methods, function(attrs, name) { |
|
|
|
|
var method_type; |
|
|
|
|
if (_.startsWith(name, '$')) { |
|
|
|
|
throw new Error('Method names cannot start with $'); |
|
|
|
|
} |
|
|
|
|
if (attrs.requestStream) { |
|
|
|
|
if (attrs.responseStream) { |
|
|
|
|
method_type = 'bidi'; |
|
|
|
@ -694,6 +670,44 @@ exports.makeClientConstructor = function(methods, serviceName) { |
|
|
|
|
return Client; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Return the underlying channel object for the specified client |
|
|
|
|
* @param {Client} client |
|
|
|
|
* @return {Channel} The channel |
|
|
|
|
*/ |
|
|
|
|
exports.getClientChannel = function(client) { |
|
|
|
|
return client.$channel; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Wait for the client to be ready. The callback will be called when the |
|
|
|
|
* client has successfully connected to the server, and it will be called |
|
|
|
|
* with an error if the attempt to connect to the server has unrecoverablly |
|
|
|
|
* failed or if the deadline expires. This function will make the channel |
|
|
|
|
* start connecting if it has not already done so. |
|
|
|
|
* @param {Client} client The client to wait on |
|
|
|
|
* @param {(Date|Number)} deadline When to stop waiting for a connection. Pass |
|
|
|
|
* Infinity to wait forever. |
|
|
|
|
* @param {function(Error)} callback The callback to call when done attempting |
|
|
|
|
* to connect. |
|
|
|
|
*/ |
|
|
|
|
exports.waitForClientReady = function(client, deadline, callback) { |
|
|
|
|
var checkState = function(err) { |
|
|
|
|
if (err) { |
|
|
|
|
callback(new Error('Failed to connect before the deadline')); |
|
|
|
|
} |
|
|
|
|
var new_state = client.$channel.getConnectivityState(true); |
|
|
|
|
if (new_state === grpc.connectivityState.READY) { |
|
|
|
|
callback(); |
|
|
|
|
} else if (new_state === grpc.connectivityState.FATAL_FAILURE) { |
|
|
|
|
callback(new Error('Failed to connect to server')); |
|
|
|
|
} else { |
|
|
|
|
client.$channel.watchConnectivityState(new_state, deadline, checkState); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
checkState(); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* Creates a constructor for clients for the given service |
|
|
|
|
* @param {ProtoBuf.Reflect.Service} service The service to generate a client |
|
|
|
|