|  | @@ -68,6 +68,8 @@ using v8::Value;
 | 
	
		
			
				|  |  |  Nan::Callback *CallCredentials::constructor;
 | 
	
		
			
				|  |  |  Persistent<FunctionTemplate> CallCredentials::fun_tpl;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +static Callback *plugin_callback;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  CallCredentials::CallCredentials(grpc_call_credentials *credentials)
 | 
	
		
			
				|  |  |      : wrapped_credentials(credentials) {}
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -88,6 +90,11 @@ void CallCredentials::Init(Local<Object> exports) {
 | 
	
		
			
				|  |  |                 Nan::New<FunctionTemplate>(CreateFromPlugin)).ToLocalChecked());
 | 
	
		
			
				|  |  |    Nan::Set(exports, Nan::New("CallCredentials").ToLocalChecked(), ctr);
 | 
	
		
			
				|  |  |    constructor = new Nan::Callback(ctr);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  Local<FunctionTemplate> callback_tpl =
 | 
	
		
			
				|  |  | +      Nan::New<FunctionTemplate>(PluginCallback);
 | 
	
		
			
				|  |  | +  plugin_callback = new Callback(
 | 
	
		
			
				|  |  | +      Nan::GetFunction(callback_tpl).ToLocalChecked());
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  bool CallCredentials::HasInstance(Local<Value> val) {
 | 
	
	
		
			
				|  | @@ -195,23 +202,28 @@ NAN_METHOD(PluginCallback) {
 | 
	
		
			
				|  |  |      return Nan::ThrowTypeError(
 | 
	
		
			
				|  |  |          "The callback's third argument must be an object");
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | +  if (!info[3]->IsObject()) {
 | 
	
		
			
				|  |  | +    return Nan::ThrowTypeError(
 | 
	
		
			
				|  |  | +        "The callback's fourth argument must be an object");
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |    shared_ptr<Resources> resources(new Resources);
 | 
	
		
			
				|  |  |    grpc_status_code code = static_cast<grpc_status_code>(
 | 
	
		
			
				|  |  |        Nan::To<uint32_t>(info[0]).FromJust());
 | 
	
		
			
				|  |  |    Utf8String details_utf8_str(info[1]);
 | 
	
		
			
				|  |  |    char *details = *details_utf8_str;
 | 
	
		
			
				|  |  |    grpc_metadata_array array;
 | 
	
		
			
				|  |  | +  Local<Object> callback_data = Nan::To<Object>(info[3]).ToLocalChecked();
 | 
	
		
			
				|  |  |    if (!CreateMetadataArray(Nan::To<Object>(info[2]).ToLocalChecked(),
 | 
	
		
			
				|  |  |                             &array, resources)){
 | 
	
		
			
				|  |  |      return Nan::ThrowError("Failed to parse metadata");
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    grpc_credentials_plugin_metadata_cb cb =
 | 
	
		
			
				|  |  |        reinterpret_cast<grpc_credentials_plugin_metadata_cb>(
 | 
	
		
			
				|  |  | -          Nan::Get(info.Callee(),
 | 
	
		
			
				|  |  | +          Nan::Get(callback_data,
 | 
	
		
			
				|  |  |                     Nan::New("cb").ToLocalChecked()
 | 
	
		
			
				|  |  |                     ).ToLocalChecked().As<External>()->Value());
 | 
	
		
			
				|  |  |    void *user_data =
 | 
	
		
			
				|  |  | -      Nan::Get(info.Callee(),
 | 
	
		
			
				|  |  | +      Nan::Get(callback_data,
 | 
	
		
			
				|  |  |                 Nan::New("user_data").ToLocalChecked()
 | 
	
		
			
				|  |  |                 ).ToLocalChecked().As<External>()->Value();
 | 
	
		
			
				|  |  |    cb(user_data, array.metadata, array.count, code, details);
 | 
	
	
		
			
				|  | @@ -227,17 +239,17 @@ NAUV_WORK_CB(SendPluginCallback) {
 | 
	
		
			
				|  |  |    while (!callbacks.empty()) {
 | 
	
		
			
				|  |  |      plugin_callback_data *data = callbacks.front();
 | 
	
		
			
				|  |  |      callbacks.pop_front();
 | 
	
		
			
				|  |  | -    // Attach cb and user_data to plugin_callback so that it can access them later
 | 
	
		
			
				|  |  | -    v8::Local<v8::Function> plugin_callback = Nan::GetFunction(
 | 
	
		
			
				|  |  | -        Nan::New<v8::FunctionTemplate>(PluginCallback)).ToLocalChecked();
 | 
	
		
			
				|  |  | -    Nan::Set(plugin_callback, Nan::New("cb").ToLocalChecked(),
 | 
	
		
			
				|  |  | +    Local<Object> callback_data = Nan::New<Object>();
 | 
	
		
			
				|  |  | +    Nan::Set(callback_data, Nan::New("cb").ToLocalChecked(),
 | 
	
		
			
				|  |  |               Nan::New<v8::External>(reinterpret_cast<void*>(data->cb)));
 | 
	
		
			
				|  |  | -    Nan::Set(plugin_callback, Nan::New("user_data").ToLocalChecked(),
 | 
	
		
			
				|  |  | +    Nan::Set(callback_data, Nan::New("user_data").ToLocalChecked(),
 | 
	
		
			
				|  |  |               Nan::New<v8::External>(data->user_data));
 | 
	
		
			
				|  |  | -    const int argc = 2;
 | 
	
		
			
				|  |  | +    const int argc = 3;
 | 
	
		
			
				|  |  |      v8::Local<v8::Value> argv[argc] = {
 | 
	
		
			
				|  |  |        Nan::New(data->service_url).ToLocalChecked(),
 | 
	
		
			
				|  |  | -      plugin_callback
 | 
	
		
			
				|  |  | +      callback_data,
 | 
	
		
			
				|  |  | +      // Get Local<Function> from Nan::Callback*
 | 
	
		
			
				|  |  | +      **plugin_callback
 | 
	
		
			
				|  |  |      };
 | 
	
		
			
				|  |  |      Nan::Callback *callback = state->callback;
 | 
	
		
			
				|  |  |      callback->Call(argc, argv);
 |