diff options
-rw-r--r-- | src/node/ext/event.cc | 173 | ||||
-rw-r--r-- | src/node/ext/event.h | 48 | ||||
-rw-r--r-- | src/node/ext/tag.cc | 325 | ||||
-rw-r--r-- | src/node/ext/tag.h | 72 |
4 files changed, 0 insertions, 618 deletions
diff --git a/src/node/ext/event.cc b/src/node/ext/event.cc deleted file mode 100644 index d59b68fb40..0000000000 --- a/src/node/ext/event.cc +++ /dev/null @@ -1,173 +0,0 @@ -/* - * - * Copyright 2015, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -#include <map> - -#include <node.h> -#include <nan.h> -#include "grpc/grpc.h" -#include "byte_buffer.h" -#include "call.h" -#include "event.h" -#include "tag.h" -#include "timeval.h" - -namespace grpc { -namespace node { - -using ::node::Buffer; -using v8::Array; -using v8::Date; -using v8::Handle; -using v8::HandleScope; -using v8::Number; -using v8::Object; -using v8::Persistent; -using v8::String; -using v8::Value; - -Handle<Value> ParseMetadata(grpc_metadata *metadata_elements, size_t length) { - NanEscapableScope(); - std::map<const char*, size_t> size_map; - std::map<const char*, size_t> index_map; - - for (unsigned int i = 0; i < length; i++) { - const 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], - MakeFastBuffer( - 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; - grpc_metadata *items; - Handle<Array> metadata; - Handle<Object> status; - Handle<Object> rpc_new; - switch (event->type) { - case GRPC_READ: - return NanEscapeScope(ByteBufferToBuffer(event->data.read)); - case GRPC_WRITE_ACCEPTED: - return NanEscapeScope(NanNew<Number>(event->data.write_accepted)); - case GRPC_FINISH_ACCEPTED: - return NanEscapeScope(NanNew<Number>(event->data.finish_accepted)); - case GRPC_CLIENT_METADATA_READ: - count = event->data.client_metadata_read.count; - items = event->data.client_metadata_read.elements; - return NanEscapeScope(ParseMetadata(items, count)); - case GRPC_FINISHED: - status = NanNew<Object>(); - status->Set(NanNew("code"), NanNew<Number>(event->data.finished.status)); - if (event->data.finished.details != NULL) { - status->Set(NanNew("details"), - String::New(event->data.finished.details)); - } - count = event->data.finished.metadata_count; - items = event->data.finished.metadata_elements; - status->Set(NanNew("metadata"), ParseMetadata(items, count)); - return NanEscapeScope(status); - case GRPC_SERVER_RPC_NEW: - rpc_new = NanNew<Object>(); - if (event->data.server_rpc_new.method == NULL) { - return NanEscapeScope(NanNull()); - } - rpc_new->Set( - NanNew("method"), - NanNew(event->data.server_rpc_new.method)); - rpc_new->Set( - NanNew("host"), - NanNew(event->data.server_rpc_new.host)); - rpc_new->Set(NanNew("absolute_deadline"), - NanNew<Date>(TimespecToMilliseconds( - event->data.server_rpc_new.deadline))); - count = event->data.server_rpc_new.metadata_count; - items = event->data.server_rpc_new.metadata_elements; - metadata = NanNew<Array>(static_cast<int>(count)); - for (unsigned int i = 0; i < count; i++) { - Handle<Object> item_obj = Object::New(); - item_obj->Set(NanNew("key"), - NanNew(items[i].key)); - item_obj->Set( - NanNew("value"), - NanNew(items[i].value, static_cast<int>(items[i].value_length))); - metadata->Set(i, item_obj); - } - rpc_new->Set(NanNew("metadata"), ParseMetadata(items, count)); - return NanEscapeScope(rpc_new); - default: - return NanEscapeScope(NanNull()); - } -} - -Handle<Value> CreateEventObject(grpc_event *event) { - NanEscapableScope(); - if (event == NULL) { - return NanEscapeScope(NanNull()); - } - Handle<Object> event_obj = NanNew<Object>(); - Handle<Value> call; - if (TagHasCall(event->tag)) { - call = TagGetCall(event->tag); - } else { - call = Call::WrapStruct(event->call); - } - event_obj->Set(NanNew<String, const char *>("call"), call); - event_obj->Set(NanNew<String, const char *>("type"), - NanNew<Number>(event->type)); - event_obj->Set(NanNew<String, const char *>("data"), GetEventData(event)); - - return NanEscapeScope(event_obj); -} - -} // namespace node -} // namespace grpc diff --git a/src/node/ext/event.h b/src/node/ext/event.h deleted file mode 100644 index e06d8f0168..0000000000 --- a/src/node/ext/event.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * - * Copyright 2014, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -#ifndef NET_GRPC_NODE_EVENT_H_ -#define NET_GRPC_NODE_EVENT_H_ - -#include <node.h> -#include "grpc/grpc.h" - -namespace grpc { -namespace node { - -v8::Handle<v8::Value> CreateEventObject(grpc_event *event); - -} // namespace node -} // namespace grpc - -#endif // NET_GRPC_NODE_EVENT_H_ diff --git a/src/node/ext/tag.cc b/src/node/ext/tag.cc deleted file mode 100644 index 27baa94a8e..0000000000 --- a/src/node/ext/tag.cc +++ /dev/null @@ -1,325 +0,0 @@ -/* - * - * Copyright 2014, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -#include <map> -#include <vector> - -#include <grpc/grpc.h> -#include <stdlib.h> -#include <node.h> -#include <nan.h> -#include "tag.h" -#include "call.h" - -namespace grpc { -namespace node { - -using v8::Boolean; -using v8::Function; -using v8::Handle; -using v8::HandleScope; -using v8::Persistent; -using v8::Value; - -Handle<Value> ParseMetadata(grpc_metadata_array *metadata_array) { - NanEscapableScope(); - grpc_metadata *metadata_elements = metadata_array->metadata; - size_t length = metadata_array->count; - 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], - MakeFastBuffer( - NanNewBufferHandle(elem->value, elem->value_length))); - index_map[elem->key] += 1; - } - return NanEscapeScope(metadata_object); -} - -class OpResponse { - public: - explicit OpResponse(char *name): name(name) { - } - virtual Handle<Value> GetNodeValue() const = 0; - virtual bool ParseOp() = 0; - Handle<Value> GetOpType() const { - NanEscapableScope(); - return NanEscapeScope(NanNew(name)); - } - - private: - char *name; -}; - -class SendResponse : public OpResponse { - public: - explicit SendResponse(char *name): OpResponse(name) { - } - - Handle<Value> GetNodeValue() { - NanEscapableScope(); - return NanEscapeScope(NanTrue()); - } -} - -class MetadataResponse : public OpResponse { - public: - explicit MetadataResponse(grpc_metadata_array *recv_metadata): - recv_metadata(recv_metadata), OpResponse("metadata") { - } - - Handle<Value> GetNodeValue() const { - NanEscapableScope(); - return NanEscapeScope(ParseMetadata(recv_metadata)); - } - - private: - grpc_metadata_array *recv_metadata; -}; - -class MessageResponse : public OpResponse { - public: - explicit MessageResponse(grpc_byte_buffer **recv_message): - recv_message(recv_message), OpResponse("read") { - } - - Handle<Value> GetNodeValue() const { - NanEscapableScope(); - return NanEscapeScope(ByteBufferToBuffer(*recv_message)); - } - - private: - grpc_byte_buffer **recv_message; -}; - -switch () { -case GRPC_RECV_CLIENT_STATUS: - op = new ClientStatusResponse; - break; -} - - -class ClientStatusResponse : public OpResponse { - public: - explicit ClientStatusResponse(): - OpResponse("status") { - } - - bool ParseOp(Handle<Value> obj, grpc_op *out) { - } - - Handle<Value> GetNodeValue() const { - NanEscapableScope(); - Handle<Object> status_obj = NanNew<Object>(); - status_obj->Set(NanNew("code"), NanNew<Number>(*status)); - if (event->data.finished.details != NULL) { - status_obj->Set(NanNew("details"), String::New(*status_details)); - } - status_obj->Set(NanNew("metadata"), ParseMetadata(metadata_array)); - return NanEscapeScope(status_obj); - } - private: - grpc_metadata_array metadata_array; - grpc_status_code status; - char *status_details; -}; - -class ServerCloseResponse : public OpResponse { - public: - explicit ServerCloseResponse(int *cancelled): cancelled(cancelled), - OpResponse("cancelled") { - } - - Handle<Value> GetNodeValue() const { - NanEscapableScope(); - NanEscapeScope(NanNew<Boolean>(*cancelled)); - } - - private: - int *cancelled; -}; - -class NewCallResponse : public OpResponse { - public: - explicit NewCallResponse(grpc_call **call, grpc_call_details *details, - grpc_metadata_array *request_metadata) : - call(call), details(details), request_metadata(request_metadata), - OpResponse("call"){ - } - - Handle<Value> GetNodeValue() const { - NanEscapableScope(); - if (*call == NULL) { - return NanEscapeScope(NanNull()); - } - Handle<Object> obj = NanNew<Object>(); - obj->Set(NanNew("call"), Call::WrapStruct(*call)); - obj->Set(NanNew("method"), NanNew(details->method)); - obj->Set(NanNew("host"), NanNew(details->host)); - obj->Set(NanNew("deadline"), - NanNew<Date>(TimespecToMilliseconds(details->deadline))); - obj->Set(NanNew("metadata"), ParseMetadata(request_metadata)); - return NanEscapeScope(obj); - } - private: - grpc_call **call; - grpc_call_details *details; - grpc_metadata_array *request_metadata; -} - -struct tag { - tag(NanCallback *callback, std::vector<OpResponse*> *responses, - std::vector<Persistent<Value>> *handles, - std::vector<NanUtf8String *> *strings) : - callback(callback), repsonses(responses), handles(handles), - strings(strings){ - } - ~tag() { - for (std::vector<OpResponse *>::iterator it = responses->begin(); - it != responses->end(); ++it) { - delete *it; - } - for (std::vector<NanUtf8String *>::iterator it = responses->begin(); - it != responses->end(); ++it) { - delete *it; - } - delete callback; - delete responses; - delete handles; - delete strings; - } - NanCallback *callback; - std::vector<OpResponse*> *responses; - std::vector<Persistent<Value>> *handles; - std::vector<NanUtf8String *> *strings; -}; - -void *CreateTag(Handle<Function> callback, grpc_op *ops, size_t nops, - std::vector<Persistent<Value>> *handles, - std::vector<NanUtf8String *> *strings) { - NanScope(); - NanCallback *cb = new NanCallback(callback); - vector<OpResponse*> *responses = new vector<OpResponse*>(); - for (size_t i = 0; i < nops; i++) { - grpc_op *op = &ops[i]; - OpResponse *resp; - // Switching on the TYPE of the op - switch (op->op) { - case GRPC_OP_SEND_INITIAL_METADATA: - resp = new SendResponse("send metadata"); - break; - case GRPC_OP_SEND_MESSAGE: - resp = new SendResponse("write"); - break; - case GRPC_OP_SEND_CLOSE_FROM_CLIENT: - resp = new SendResponse("client close"); - break; - case GRPC_OP_SEND_STATUS_FROM_SERVER: - resp = new SendResponse("server close"); - break; - case GRPC_OP_RECV_INITIAL_METADATA: - resp = new MetadataResponse(op->data.recv_initial_metadata); - break; - case GRPC_OP_RECV_MESSAGE: - resp = new MessageResponse(op->data.recv_message); - break; - case GRPC_OP_RECV_STATUS_ON_CLIENT: - resp = new ClientStatusResponse( - op->data.recv_status_on_client.trailing_metadata, - op->data.recv_status_on_client.status, - op->data.recv_status_on_client.status_details); - break; - case GRPC_RECV_CLOSE_ON_SERVER: - resp = new ServerCloseResponse(op->data.recv_close_on_server.cancelled); - break; - default: - continue; - } - responses->push_back(resp); - } - struct tag *tag_struct = new struct tag(cb, responses, handles, strings); - return reinterpret_cast<void *>(tag_struct); -} - -void *CreateTag(Handle<Function> callback, grpc_call **call, - grpc_call_details *details, - grpc_metadata_array *request_metadata) { - NanEscapableScope(); - NanCallback *cb = new NanCallback(callback); - vector<OpResponse*> *responses = new vector<OpResponse*>(); - OpResponse *resp = new NewCallResponse(call, details, request_metadata); - responses->push_back(resp); - struct tag *tag_struct = new struct tag(cb, responses); - return reinterpret_cast<void *>(tag_struct); -} - -NanCallback GetTagCallback(void *tag) { - NanEscapableScope(); - struct tag *tag_struct = reinterpret_cast<struct tag *>(tag); - return NanEscapeScope(*tag_struct->callback); -} - -Handle<Value> GetNodeValue(void *tag) { - NanEscapableScope(); - struct tag *tag_struct = reinterpret_cast<struct tag *>(tag); - Handle<Object> obj = NanNew<Object>(); - for (std::vector<OpResponse *>::iterator it = tag_struct->responses->begin(); - it != tag_struct->responses->end(); ++it) { - OpResponse *resp = *it; - obj->Set(resp->GetOpType(), resp->GetNodeValue()); - } - return NanEscapeScope(obj); -} - -void DestroyTag(void *tag) { delete reinterpret_cast<struct tag *>(tag); } - -} // namespace node -} // namespace grpc diff --git a/src/node/ext/tag.h b/src/node/ext/tag.h deleted file mode 100644 index 9ff8703b95..0000000000 --- a/src/node/ext/tag.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * - * Copyright 2014, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -#ifndef NET_GRPC_NODE_TAG_H_ -#define NET_GRPC_NODE_TAG_H_ - -#include <vector> - - -#include <grpc/grpc.h> -#include <node.h> -#include <nan.h> - -namespace grpc { -namespace node { - -/* Create a void* tag that can be passed to grpc_call_start_batch from a - callback function and an ops array */ -void *CreateTag(v8::Handle<v8::Function> callback, grpc_op *ops, size_t nops, - std::vector<v8::Persistent<v8::Value> > *handles, - std::vector<NanUtf8String *> *strings); - -/* Create a void* tag that can be passed to grpc_server_request_call from a - callback and the various out parameters to that function */ -void *CreateTag(v8::Handle<v8::Function> callback, grpc_call **call, - grpc_call_details *details, - grpc_metadata_array *request_metadata); - -/* Get the callback from the tag */ -NanCallback GetCallback(void *tag); - -/* Get the combined output value from the tag */ -v8::Handle<v8::Value> GetNodeValue(void *tag); - -/* Destroy the tag and all resources it is holding. It is illegal to call any - of these other functions on a tag after it has been destroyed. */ -void DestroyTag(void *tag); - -} // namespace node -} // namespace grpc - -#endif // NET_GRPC_NODE_TAG_H_ |