diff options
author | 2015-01-28 15:36:27 -0800 | |
---|---|---|
committer | 2015-01-28 15:36:27 -0800 | |
commit | 7625db4697bab2e8ba9a7013a8a090ce9b006a79 (patch) | |
tree | 5d2b1799a2a782282d00133d376b101303f39305 /src/node/ext/event.cc | |
parent | 7f791669df8a7728bc5aa3c52246a15d7aebe370 (diff) |
Changed low-level metadata API to be more reasonable
Diffstat (limited to 'src/node/ext/event.cc')
-rw-r--r-- | src/node/ext/event.cc | 61 |
1 files changed, 36 insertions, 25 deletions
diff --git a/src/node/ext/event.cc b/src/node/ext/event.cc index 2ca38b7448..fcf046b697 100644 --- a/src/node/ext/event.cc +++ b/src/node/ext/event.cc @@ -31,6 +31,8 @@ * */ +#include <map> + #include <node.h> #include <nan.h> #include "grpc/grpc.h" @@ -43,6 +45,7 @@ namespace grpc { namespace node { +using ::node::Buffer; using v8::Array; using v8::Date; using v8::Handle; @@ -53,6 +56,36 @@ using v8::Persistent; using v8::String; using v8::Value; +Handle<Value> ParseMetadata(grpc_metadata *metadata_elements, size_t length) { + NanEscapableScope(); + std::map<char*, size_t> size_map; + std::map<char*, size_t> index_map; + + for (unsigned int i = 0; i < length; i++) { + char *key = metadata_elements[i].key; + if (size_map.count(key)) { + size_map[key] += 1; + } + index_map[key] = 0; + } + Handle<Object> metadata_object = NanNew<Object>(); + for (unsigned int i = 0; i < length; i++) { + grpc_metadata* elem = &metadata_elements[i]; + Handle<String> key_string = String::New(elem->key); + Handle<Array> array; + if (metadata_object->Has(key_string)) { + array = Handle<Array>::Cast(metadata_object->Get(key_string)); + } else { + array = NanNew<Array>(size_map[elem->key]); + metadata_object->Set(key_string, array); + } + array->Set(index_map[elem->key], + NanNewBufferHandle(elem->value, elem->value_length)); + index_map[elem->key] += 1; + } + return NanEscapeScope(metadata_object); +} + Handle<Value> GetEventData(grpc_event *event) { NanEscapableScope(); size_t count; @@ -72,18 +105,7 @@ Handle<Value> GetEventData(grpc_event *event) { case GRPC_CLIENT_METADATA_READ: count = event->data.client_metadata_read.count; items = event->data.client_metadata_read.elements; - metadata = NanNew<Array>(static_cast<int>(count)); - for (unsigned int i = 0; i < count; i++) { - Handle<Object> item_obj = NanNew<Object>(); - item_obj->Set(NanNew<String, const char *>("key"), - NanNew<String, char *>(items[i].key)); - item_obj->Set( - NanNew<String, const char *>("value"), - NanNew<String, char *>(items[i].value, - static_cast<int>(items[i].value_length))); - metadata->Set(i, item_obj); - } - return NanEscapeScope(metadata); + return NanEscapeScope(ParseMetadata(items, count)); case GRPC_FINISHED: status = NanNew<Object>(); status->Set(NanNew("code"), NanNew<Number>(event->data.finished.status)); @@ -93,18 +115,7 @@ Handle<Value> GetEventData(grpc_event *event) { } count = event->data.finished.metadata_count; items = event->data.finished.metadata_elements; - metadata = NanNew<Array>(static_cast<int>(count)); - for (unsigned int i = 0; i < count; i++) { - Handle<Object> item_obj = NanNew<Object>(); - item_obj->Set(NanNew<String, const char *>("key"), - NanNew<String, char *>(items[i].key)); - item_obj->Set( - NanNew<String, const char *>("value"), - NanNew<String, char *>(items[i].value, - static_cast<int>(items[i].value_length))); - metadata->Set(i, item_obj); - } - status->Set(NanNew("metadata"), metadata); + status->Set(NanNew("metadata"), ParseMetadata(items, count)); return NanEscapeScope(status); case GRPC_SERVER_RPC_NEW: rpc_new = NanNew<Object>(); @@ -133,7 +144,7 @@ Handle<Value> GetEventData(grpc_event *event) { static_cast<int>(items[i].value_length))); metadata->Set(i, item_obj); } - rpc_new->Set(NanNew<String, const char *>("metadata"), metadata); + rpc_new->Set(NanNew("metadata"), ParseMetadata(items, count)); return NanEscapeScope(rpc_new); default: return NanEscapeScope(NanNull()); |