diff --git a/ext/call.cc b/ext/call.cc index 7e79a612..b08a9f96 100644 --- a/ext/call.cc +++ b/ext/call.cc @@ -184,6 +184,9 @@ Local Op::GetOpType() const { return scope.Escape(Nan::New(GetTypeString()).ToLocalChecked()); } +Op::~Op() { +} + class SendMetadataOp : public Op { public: Local GetNodeValue() const { @@ -359,7 +362,7 @@ class ReadMessageOp : public Op { } ~ReadMessageOp() { if (recv_message != NULL) { - gpr_free(recv_message); + grpc_byte_buffer_destroy(recv_message); } } Local GetNodeValue() const { diff --git a/ext/call.h b/ext/call.h index 1f387edc..2f8e1f17 100644 --- a/ext/call.h +++ b/ext/call.h @@ -78,6 +78,7 @@ class Op { virtual v8::Local GetNodeValue() const = 0; virtual bool ParseOp(v8::Local value, grpc_op *out, shared_ptr resources) = 0; + virtual ~Op(); v8::Local GetOpType() const; protected: @@ -85,7 +86,6 @@ class Op { }; typedef std::vector> OpVec; - struct tag { tag(Nan::Callback *callback, OpVec *ops, shared_ptr resources); diff --git a/src/server.js b/src/server.js index b6f162ad..70b4a9d8 100644 --- a/src/server.js +++ b/src/server.js @@ -276,6 +276,7 @@ function ServerWritableStream(call, serialize) { function _write(chunk, encoding, callback) { /* jshint validthis: true */ var batch = {}; + var self = this; if (!this.call.metadataSent) { batch[grpc.opType.SEND_INITIAL_METADATA] = (new Metadata())._getCoreRepresentation(); @@ -290,7 +291,7 @@ function _write(chunk, encoding, callback) { batch[grpc.opType.SEND_MESSAGE] = message; this.call.startBatch(batch, function(err, value) { if (err) { - this.emit('error', err); + self.emit('error', err); return; } callback(); @@ -305,6 +306,7 @@ ServerWritableStream.prototype._write = _write; */ function sendMetadata(responseMetadata) { /* jshint validthis: true */ + var self = this; if (!this.call.metadataSent) { this.call.metadataSent = true; var batch = []; @@ -312,7 +314,7 @@ function sendMetadata(responseMetadata) { responseMetadata._getCoreRepresentation(); this.call.startBatch(batch, function(err) { if (err) { - this.emit('error', err); + self.emit('error', err); return; } });