Skip to content

Instantly share code, notes, and snippets.

@swcho
Created September 8, 2017 03:35
Show Gist options
  • Save swcho/0d154b02a48053da33bb8291510cef78 to your computer and use it in GitHub Desktop.
Save swcho/0d154b02a48053da33bb8291510cef78 to your computer and use it in GitHub Desktop.
Nan Simple Callback Helper
typedef void (*callback_helper_cb)(void* self, v8::Isolate* isolate, const v8::Persistent<v8::Function>& callback);
struct callback_helper_data {
v8::Persistent<v8::Function> callback;
void* self;
callback_helper_cb cb;
};
#define CALLBACK_HELPER_CALL(A, B) v8::Local<v8::Function>::New(isolate, callback)->Call(isolate->GetCurrentContext()->Global(), A, B)
uv_async_t* callback_helper(v8::Isolate* isolate, const v8::Local<v8::Function>& func, void* self, callback_helper_cb cb = NULL) {
uv_async_t* async = new uv_async_t();
callback_helper_data* data = new callback_helper_data();
data->callback.Reset(isolate, func);
data->self = self;
data->cb = cb;
async->data = data;
uv_async_init(uv_default_loop(), async, [](uv_async_t* handle){
LOG("event loop callback");
auto isolate = v8::Isolate::GetCurrent();
v8::HandleScope handleScope(isolate);
callback_helper_data* data = (callback_helper_data*)handle->data;
if (data->cb != NULL) {
data->cb(data->self, isolate, data->callback);
} else {
v8::Local<v8::Function>::New(isolate, data->callback)->Call(isolate->GetCurrentContext()->Global(), 0, 0);
}
data->callback.Reset();
delete data;
delete handle;
});
return async;
}
NAN_METHOD(MyClient::Open) {
v8::Isolate* isolate = info.GetIsolate();
auto self = SELF(MyClient);
auto nodeFunc = info[0].As<v8::Function>();
auto async = callback_helper(isolate, nodeFunc, self, [](void* s, v8::Isolate* isolate, const v8::Persistent<v8::Function>& callback) {
MyClient* self = (MyClient*)s;
const char* state = self->client->getStateAsString();
v8::Handle<v8::Value> argv[] = { STR(state) };
// v8::Local<v8::Function>::New(isolate, callback)->Call(isolate->GetCurrentContext()->Global(), 0, 0);
CALLBACK_HELPER_CALL(1, argv);
});
self->client->open([async](ClientResult result) {
LOG("Client open");
uv_async_send(async);
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment