diff --git a/src/node/client.js b/src/node/client.js
index 7007852b939c1be2c05ee9c06192cb2b7f57f663..a039b0dcfa6fbb12a09dd1d54cc605752a378244 100644
--- a/src/node/client.js
+++ b/src/node/client.js
@@ -160,6 +160,14 @@ GrpcClientStream.prototype._write = function(chunk, encoding, callback) {
   }, 0);
 };
 
+/**
+ * Cancel the ongoing call. If the call has not already finished, it will finish
+ * with status CANCELLED.
+ */
+GrpcClientStream.prototype.cancel = function() {
+  self._call.cancel();
+};
+
 /**
  * Make a request on the channel to the given method with the given arguments
  * @param {grpc.Channel} channel The channel on which to make the request
diff --git a/src/node/surface_client.js b/src/node/surface_client.js
index b63ae13e8dc2dbd7ce0871d106541d849e4cdcd9..f7123450c2b5c26c58ea63648b2aba8eb5a53b7f 100644
--- a/src/node/surface_client.js
+++ b/src/node/surface_client.js
@@ -128,6 +128,16 @@ function _write(chunk, encoding, callback) {
  */
 ClientWritableObjectStream.prototype._write = _write;
 
+/**
+ * Cancel the underlying call
+ */
+function cancel() {
+  this._stream.cancel();
+}
+
+ClientReadableObjectStream.prototype.cancel = cancel;
+ClientWritableObjectStream.prototype.cancel = cancel;
+
 /**
  * Get a function that can make unary requests to the specified method.
  * @param {string} method The name of the method to request
@@ -155,6 +165,9 @@ function makeUnaryRequestFunction(method, serialize, deserialize) {
     var stream = client.makeRequest(this.channel, method, serialize,
                                     deserialize, metadata, deadline);
     var emitter = new EventEmitter();
+    emitter.cancel = function cancel() {
+      stream.cancel();
+    };
     forwardEvent(stream, emitter, 'status');
     forwardEvent(stream, emitter, 'metadata');
     stream.write(argument);