diff --git a/src/node/ext/byte_buffer.cc b/src/node/ext/byte_buffer.cc index 142951475a1cec9a69cbe9751d7cace172829296..695ecedd3447518fdfde638b5e37b44bcc4e7ae5 100644 --- a/src/node/ext/byte_buffer.cc +++ b/src/node/ext/byte_buffer.cc @@ -39,13 +39,17 @@ #include "grpc/grpc.h" #include "grpc/support/slice.h" +#include "byte_buffer.h" + namespace grpc { namespace node { -#include "byte_buffer.h" - using ::node::Buffer; +using v8::Context; +using v8::Function; using v8::Handle; +using v8::Object; +using v8::Number; using v8::Value; grpc_byte_buffer *BufferToByteBuffer(Handle<Value> buffer) { @@ -73,7 +77,19 @@ Handle<Value> ByteBufferToBuffer(grpc_byte_buffer *buffer) { memcpy(result + offset, GPR_SLICE_START_PTR(next), GPR_SLICE_LENGTH(next)); offset += GPR_SLICE_LENGTH(next); } - return NanEscapeScope(NanNewBufferHandle(result, length)); + return NanEscapeScope(MakeFastBuffer(NanNewBufferHandle(result, length))); +} + +Handle<Value> MakeFastBuffer(Handle<Value> slowBuffer) { + NanEscapableScope(); + Handle<Object> globalObj = Context::GetCurrent()->Global(); + Handle<Function> bufferConstructor = Handle<Function>::Cast( + globalObj->Get(NanNew("Buffer"))); + Handle<Value> consArgs[3] = { slowBuffer, + NanNew<Number>(Buffer::Length(slowBuffer)), + NanNew<Number>(0) }; + Handle<Object> fastBuffer = bufferConstructor->NewInstance(3, consArgs); + return NanEscapeScope(fastBuffer); } } // namespace node } // namespace grpc diff --git a/src/node/ext/byte_buffer.h b/src/node/ext/byte_buffer.h index ee2b4c0d158a4d16417b31facb8d645f989fb9d6..5f1903a42ebc82f1a43d2d9f250cbeacc13bb006 100644 --- a/src/node/ext/byte_buffer.h +++ b/src/node/ext/byte_buffer.h @@ -50,6 +50,10 @@ grpc_byte_buffer *BufferToByteBuffer(v8::Handle<v8::Value> buffer); /* Convert a grpc_byte_buffer to a Node.js Buffer */ v8::Handle<v8::Value> ByteBufferToBuffer(grpc_byte_buffer *buffer); +/* Convert a ::node::Buffer to a fast Buffer, as defined in the Node + Buffer documentation */ +v8::Handle<v8::Value> MakeFastBuffer(v8::Handle<v8::Value> slowBuffer); + } // namespace node } // namespace grpc diff --git a/src/node/ext/event.cc b/src/node/ext/event.cc index fcf046b6978390d0a590cd1b67514545644781a0..b9446062d71f8b9339e22cfe79b015429594be5f 100644 --- a/src/node/ext/event.cc +++ b/src/node/ext/event.cc @@ -80,7 +80,8 @@ Handle<Value> ParseMetadata(grpc_metadata *metadata_elements, size_t length) { metadata_object->Set(key_string, array); } array->Set(index_map[elem->key], - NanNewBufferHandle(elem->value, elem->value_length)); + MakeFastBuffer( + NanNewBufferHandle(elem->value, elem->value_length))); index_map[elem->key] += 1; } return NanEscapeScope(metadata_object);