In keeping with the typical pattern of a Node program, add-ons also implement the notion of callbacks. As one might expect in a Node program, a C++ add-on performing an expensive and time-consuming operation should comprehend the notion of asynchronously executing functions.
The following code will expose a method that will pass back the current system time to any callback it is sent:
#include <node.h> #include <ctime> using namespace v8; Handle<Value> GetTime(const Arguments& args) { HandleScope scope; Local<Function> cb = Local<Function>::Cast(args[0]); const unsigned argc = 1; time_t stamp = time(0); Local<Value> argv[argc] = { Local<Value>::New(Number::New(stamp)) }; cb->Call(Context::GetCurrent()->Global(), argc, argv); return scope.Close(Undefined()); } void Init(Handle<Object> exports, Handle<Object> module) { module->Set(String::NewSymbol("exports"),FunctionTemplate::New(GetTime)->GetFunction()); } NODE_MODULE(callback, Init)
Here we include the ctime
standard library, using its time method when setting up our GetTime
handle. The magic happens within this handle, where your function argument is properly bound and called.
Once you have created your binding file and compiled everything, go ahead and run your callback module:
var timeNow = require('./build/Release/callback'); timeNow(function(stamp){ console.log(stamp); }); // 1481315296
Beginning with these tools you can start developing some equally simple add-ons, eventually moving into deeper territory.