async-factory-worker

0.0.1 • Public • Published

async-factory-worker

Asyncronously construct arbitrary C++ objects and classes even without a public copy constructor

NPM

Build Status Build status

async-factory-worker is a header package for building c++ native addons for node.js that is meant to complement nan

Usage

Simply add nan and async-factory-worker as dependencies in the package.json of your Node addon:

$ npm install --save nan
$ npm install --save async-factory-worker

Pull in the paths to nan and async-factory-worker in your binding.gyp so that you can use #include <async_factory_worker.h> in your .cpp files:

"include_dirs" : [ 
    "<!(node -e \"require('nan')\")", 
    "<!(node -e \"require('async-factory-worker')\")"
]

This works like a -I<path-to-async-factory-worker> when compiling your addon.

API

AsyncFactoryWorker is an abstract class that you can subclass to have much of the annoying asynchronous queuing and handling taken care of for you. It can even store arbitrary V8 objects for you and have them persist while the asynchronous work is in progress.

This class internally handles the details of creating an AsyncResource, and running the callback in the correct async context. To be able to identify the async resources created by this class in async-hooks, provide a resource_name to the constructor. It is recommended that the module name be used as a prefix to the resource_name to avoid collisions in the names. For more details see AsyncResource documentation. The resource_name needs to stay valid for the lifetime of the worker instance.

AsyncFactoryWorker is an abstract class template that extends Nan::AsyncWorker and adds additional progress reporting callbacks that can be used during the asynchronous work execution to provide progress data back to JavaScript.

AsyncFactoryWorker behaves exactly the same as Nan::AsyncProgressQueueWorker, except AsyncFactoryWorker avoids the copy. Data is constructed once and delivered to the receiving thread. Just as Nan::AsyncProgressQueueWorker, all events are queued and delivered to the main thread.

Definition:

template<class Ttypename... Targs>
class AsyncFactoryWorker<T, Targs...> : public AsyncWorker {
 public:
  explicit AsyncFactoryWorker(Callback *callback_, const char* resource_name = "nan:mkrufky:AsyncFactoryWorker");
 
  virtual ~AsyncFactoryWorker();
 
  void WorkProgress();
 
  class ExecutionProgress {
   public:
    void Construct(Targs... Fargs) const;
  };
 
  virtual void Execute(const ExecutionProgress& progress) = 0;
 
  virtual void HandleProgressCallback(const T *data, size_t count) = 0;
 
  virtual void Destroy();
};

This works just like the Nan::AsyncProgressQueueWorker, but instead of std::copying the data, the progress.Construct function passes along the object constructor arguments, constructing and delivering the object to the main thread.

It allows us to asyncronously construct C++ objects even if they lack a public copy constructor, although it also does support copy constructors.

Sure, the constructor arguments end up getting copied, but not the entire object, which only gets constructed once. Depending on the code being built around this worker, this could make things much more efficient.

Since AsyncFactoryWorker uses a variadic template, one can use it in many different ways. Pass no constructor arguments to use the default constructor. One can even use &&T as the constructor arguments and the worker will use the move constructor!!

Tests

To run the async-factory-worker tests do:

npm install
npm run-script rebuild-tests
npm test

Or just:

npm install
make test

Licence & copyright

Copyright (c) 2018 Michael Ira Krufky

async-factory-worker is licensed under an MIT license. All rights not explicitly granted in the MIT license are reserved. See the included LICENSE file for more details.

Package Sidebar

Install

npm i async-factory-worker

Weekly Downloads

2

Version

0.0.1

License

MIT

Unpacked Size

10.5 kB

Total Files

6

Last publish

Collaborators

  • mkrufky