diff --git a/src/bson.cc b/src/bson.cc index 5b2f7db..3a87c9c 100644 --- a/src/bson.cc +++ b/src/bson.cc @@ -114,6 +114,16 @@ typedef struct writer_s { // fprintf(stderr, "write array[%d] (len=%d)\n", i, len); write(arr->Get(i)); } + } else if (node::Buffer::HasInstance(value)) { + *(current++) = bson::Buffer; + char *data = node::Buffer::Data(value); + uint32_t len = node::Buffer::Length(value); + ensureCapacity(sizeof(uint32_t) + len); + *reinterpret_cast(current) = len; + current += sizeof(uint32_t); + for(uint32_t i = 0; i < len; i++) { + *(current++) = data[i]; + } } else { // TODO: support for other object types *(current++) = bson::Object; Local names = obj->GetOwnPropertyNames(); @@ -216,6 +226,18 @@ static v8::Local parse(const uint8_t*& data, object_wrapper_t*& objec } return curr->object; } + case bson::Buffer: + len = *reinterpret_cast(data); + data += sizeof(uint32_t); + { + char *retval = new char[len]; + for(uint32_t i = 0; i < len; i++) { + retval[i] = data[i]; + } + + Local obj = Nan::NewBuffer(retval, len).ToLocalChecked(); + return obj; + } } assert("should not reach here"); return Local(); diff --git a/src/bson.h b/src/bson.h index 48a3445..d09531d 100644 --- a/src/bson.h +++ b/src/bson.h @@ -14,7 +14,8 @@ namespace bson { String, Array, Object, - ObjectRef + ObjectRef, + Buffer } TYPES; class BSONValue {