-
Notifications
You must be signed in to change notification settings - Fork 499
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
AsyncProgressWorker: add template types for .send
This allows for arbitrary types to be sent from .send. To achieve this, the abstract base class can be implemented with a template itself. Either at implementation or instantiation a type MUST be declared though.
- Loading branch information
1 parent
c4cf44d
commit 1242c9a
Showing
8 changed files
with
186 additions
and
26 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
/********************************************************************* | ||
* NAN - Native Abstractions for Node.js | ||
* | ||
* Copyright (c) 2016 NAN contributors | ||
* | ||
* MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md> | ||
********************************************************************/ | ||
|
||
#ifndef _WIN32 | ||
#include <unistd.h> | ||
#define Sleep(x) usleep((x)*1000) | ||
#endif | ||
#include <nan.h> | ||
|
||
using namespace Nan; // NOLINT(build/namespaces) | ||
|
||
// Custom data type: This serves as an example of how external | ||
// libraries could be hooked in, populate their objects and send them to JS. | ||
struct data_t { | ||
int index; | ||
int data; | ||
}; | ||
|
||
// Unlike test/cpp/ayncprogressworker.cpp this test is explicitly templated. | ||
template<typename T> | ||
class ProgressWorker : public AsyncProgressWorkerBase<T> { | ||
public: | ||
ProgressWorker( | ||
Callback *callback | ||
, Callback *progress | ||
, int milliseconds | ||
, int iters) | ||
: AsyncProgressWorkerBase<T>(callback), progress(progress) | ||
, milliseconds(milliseconds), iters(iters) {} | ||
~ProgressWorker() {} | ||
|
||
void Execute ( | ||
const typename AsyncProgressWorkerBase<T>::ExecutionProgress& progress) { | ||
data_t data; | ||
for (int i = 0; i < iters; ++i) { | ||
data.index = i; | ||
data.data = i * 2; | ||
progress.Send(&data, sizeof( data )); | ||
Sleep(milliseconds); | ||
} | ||
} | ||
|
||
void HandleProgressCallback(const T *data, size_t size) { | ||
HandleScope scope; | ||
v8::Local<v8::Object> obj = Nan::New<v8::Object>(); | ||
Nan::Set( | ||
obj, | ||
Nan::New("index").ToLocalChecked(), | ||
New<v8::Integer>(data->index)); | ||
Nan::Set( | ||
obj, | ||
Nan::New("data").ToLocalChecked(), | ||
New<v8::Integer>(data->data)); | ||
|
||
v8::Local<v8::Value> argv[] = { obj }; | ||
progress->Call(1, argv); | ||
} | ||
|
||
private: | ||
Callback *progress; | ||
int milliseconds; | ||
int iters; | ||
}; | ||
|
||
NAN_METHOD(DoProgress) { | ||
Callback *progress = new Callback(info[2].As<v8::Function>()); | ||
Callback *callback = new Callback(info[3].As<v8::Function>()); | ||
AsyncQueueWorker(new ProgressWorker<data_t>( | ||
callback | ||
, progress | ||
, To<uint32_t>(info[0]).FromJust() | ||
, To<uint32_t>(info[1]).FromJust())); | ||
} | ||
|
||
NAN_MODULE_INIT(Init) { | ||
Set(target | ||
, New<v8::String>("a").ToLocalChecked() | ||
, New<v8::FunctionTemplate>(DoProgress)->GetFunction()); | ||
} | ||
|
||
NODE_MODULE(asyncprogressworkerstream, Init) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
/********************************************************************* | ||
* NAN - Native Abstractions for Node.js | ||
* | ||
* Copyright (c) 2016 NAN contributors | ||
* | ||
* MIT License <https://github.com/nodejs/nan/blob/master/LICENSE.md> | ||
********************************************************************/ | ||
|
||
const test = require('tap').test | ||
, testRoot = require('path').resolve(__dirname, '..') | ||
, bindings = require('bindings')({ module_root: testRoot, bindings: 'asyncprogressworkerstream' }) | ||
, util = require('util'); | ||
|
||
const nodeVersion = process.versions.node.split('.') | ||
var Readable | ||
if (nodeVersion[0] == 0 && nodeVersion[1] <= 8) | ||
Readable = require('readable-stream') | ||
else | ||
Readable = require('stream').Readable | ||
|
||
function StreamProgressWorker(t) { | ||
Readable.call(this, {objectMode: true}) | ||
var self = this | ||
// initialize stream from cpp on next tick | ||
process.nextTick(function () { | ||
var worker = bindings.a | ||
worker(100, 5, function(i) { | ||
self.push(i) | ||
}, function () { | ||
self.push(null) | ||
}) | ||
}) | ||
} | ||
util.inherits(StreamProgressWorker, Readable) | ||
|
||
StreamProgressWorker.prototype._read = function (data) { | ||
|
||
}; | ||
|
||
|
||
test('asyncprogressworker', function (t) { | ||
var stream = new StreamProgressWorker(t) | ||
var progressed = 0; | ||
|
||
stream | ||
.on('end', function() { | ||
t.ok(progressed === 5, 'cpp should have sent 5 objects') | ||
t.end() | ||
}) | ||
.on('data', function(data) { | ||
progressed++ | ||
console.log(data); | ||
}) | ||
}) |