diff --git a/packages/grpc-native-core/ext/call.cc b/packages/grpc-native-core/ext/call.cc index 26095a78..f73a70d2 100644 --- a/packages/grpc-native-core/ext/call.cc +++ b/packages/grpc-native-core/ext/call.cc @@ -446,13 +446,18 @@ class ServerCloseResponseOp : public Op { }; tag::tag(Callback *callback, OpVec *ops, Call *call, Local call_value) - : callback(callback), ops(ops), call(call) { + : callback(callback), + async_resource(NULL), + ops(ops), + call(call) { HandleScope scope; + async_resource = new Nan::AsyncResource("grpc:tag"); // Needs handle scope. call_persist.Reset(call_value); } tag::~tag() { delete callback; + delete async_resource; delete ops; } @@ -468,10 +473,10 @@ void CompleteTag(void *tag, const char *error_message) { Nan::Set(tag_obj, op_ptr->GetOpType(), op_ptr->GetNodeValue()); } Local argv[] = {Nan::Null(), tag_obj}; - callback->Call(2, argv); + callback->Call(2, argv, tag_struct->async_resource); } else { Local argv[] = {Nan::Error(error_message)}; - callback->Call(1, argv); + callback->Call(1, argv, tag_struct->async_resource); } bool success = (error_message == NULL); bool is_final_op = false; diff --git a/packages/grpc-native-core/ext/call.h b/packages/grpc-native-core/ext/call.h index 50248c0b..5bf83a42 100644 --- a/packages/grpc-native-core/ext/call.h +++ b/packages/grpc-native-core/ext/call.h @@ -103,6 +103,7 @@ struct tag { v8::Local call_value); ~tag(); Nan::Callback *callback; + Nan::AsyncResource *async_resource; OpVec *ops; Call *call; Nan::Persistent> diff --git a/packages/grpc-native-core/ext/call_credentials.cc b/packages/grpc-native-core/ext/call_credentials.cc index 2b1cb35f..a4f8bb2c 100644 --- a/packages/grpc-native-core/ext/call_credentials.cc +++ b/packages/grpc-native-core/ext/call_credentials.cc @@ -233,7 +233,7 @@ NAUV_WORK_CB(SendPluginCallback) { // Get Local from Nan::Callback* **plugin_callback}; Nan::Callback *callback = state->callback; - callback->Call(argc, argv); + callback->Call(argc, argv, data->async_resource); delete data; } } @@ -245,11 +245,10 @@ int plugin_get_metadata( grpc_metadata creds_md[GRPC_METADATA_CREDENTIALS_PLUGIN_SYNC_MAX], size_t *num_creds_md, grpc_status_code *status, const char **error_details) { + HandleScope scope; plugin_state *p_state = reinterpret_cast(state); - plugin_callback_data *data = new plugin_callback_data; - data->service_url = context.service_url; - data->cb = cb; - data->user_data = user_data; + plugin_callback_data *data = + new plugin_callback_data(context.service_url, cb, user_data); uv_mutex_lock(&p_state->plugin_mutex); p_state->pending_callbacks->push(data); diff --git a/packages/grpc-native-core/ext/call_credentials.h b/packages/grpc-native-core/ext/call_credentials.h index 323eb4f2..9eb89340 100644 --- a/packages/grpc-native-core/ext/call_credentials.h +++ b/packages/grpc-native-core/ext/call_credentials.h @@ -62,9 +62,24 @@ class CallCredentials : public Nan::ObjectWrap { /* Auth metadata plugin functionality */ typedef struct plugin_callback_data { + plugin_callback_data(const char *service_url_, + grpc_credentials_plugin_metadata_cb cb_, + void *user_data_) + : service_url(service_url_), + cb(cb_), + user_data(user_data_), + async_resource(NULL) { + Nan::HandleScope scope; + async_resource = new Nan::AsyncResource("grpc:plugin_callback_data"); + } + ~plugin_callback_data() { + delete async_resource; + } + const char *service_url; grpc_credentials_plugin_metadata_cb cb; void *user_data; + Nan::AsyncResource *async_resource; } plugin_callback_data; typedef struct plugin_state { diff --git a/packages/grpc-native-core/ext/node_grpc.cc b/packages/grpc-native-core/ext/node_grpc.cc index 6ba5f1a1..1ecd952d 100644 --- a/packages/grpc-native-core/ext/node_grpc.cc +++ b/packages/grpc-native-core/ext/node_grpc.cc @@ -57,6 +57,7 @@ typedef struct log_args { typedef struct logger_state { Nan::Callback *callback; + Nan::AsyncResource *async_resource; std::queue *pending_args; uv_mutex_t mutex; uv_async_t async; @@ -202,7 +203,7 @@ NAUV_WORK_CB(LogMessagesCallback) { .ToLocalChecked(); const int argc = 5; Local argv[argc] = {file, line, severity, message, timestamp}; - grpc_logger_state.callback->Call(argc, argv); + grpc_logger_state.callback->Call(argc, argv, grpc_logger_state.async_resource); delete[] arg->core_args.message; delete arg; } @@ -252,6 +253,7 @@ NAN_METHOD(SetDefaultLoggerCallback) { grpc_logger_state.logger_set = true; } grpc_logger_state.callback = new Nan::Callback(info[0].As()); + grpc_logger_state.async_resource = new Nan::AsyncResource("grpc:logger"); } NAN_METHOD(SetLogVerbosity) { diff --git a/packages/grpc-native-core/package.json b/packages/grpc-native-core/package.json index 0a8d3f82..4b378eb1 100644 --- a/packages/grpc-native-core/package.json +++ b/packages/grpc-native-core/package.json @@ -29,7 +29,7 @@ ], "dependencies": { "lodash": "^4.15.0", - "nan": "^2.0.0", + "nan": "^2.10.0", "node-pre-gyp": "0.7.0", "protobufjs": "^5.0.0" },