Switched extension to return faster sliceable Buffers
diff --git a/src/node/ext/byte_buffer.cc b/src/node/ext/byte_buffer.cc
index 1429514..695eced 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 @@
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 ee2b4c0..5f1903a 100644
--- a/src/node/ext/byte_buffer.h
+++ b/src/node/ext/byte_buffer.h
@@ -50,6 +50,10 @@
/* 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 fcf046b..b944606 100644
--- a/src/node/ext/event.cc
+++ b/src/node/ext/event.cc
@@ -80,7 +80,8 @@
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);
diff --git a/src/node/interop/interop_client.js b/src/node/interop/interop_client.js
index ce18f77..6978480 100644
--- a/src/node/interop/interop_client.js
+++ b/src/node/interop/interop_client.js
@@ -178,6 +178,7 @@
payload: {body: zeroBuffer(payload_sizes[index])}
});
call.on('data', function(response) {
+ debugger;
assert.strictEqual(response.payload.type,
testProto.PayloadType.COMPRESSABLE);
assert.equal(response.payload.body.limit - response.payload.body.offset,