#include "stream_encode_worker.h"
using namespace v8;
StreamEncodeWorker::StreamEncodeWorker(Nan::Callback *callback, StreamEncode* obj, BrotliEncoderOperation op)
: Nan::AsyncWorker(callback), obj(obj), op(op) {}
StreamEncodeWorker::~StreamEncodeWorker() {
}
void StreamEncodeWorker::Execute() {
do {
size_t available_out = 0;
bool res = BrotliEncoderCompressStream(obj->state,
op,
&obj->available_in,
&obj->next_in,
&available_out,
NULL,
NULL);
if (res == BROTLI_FALSE) {
return SetErrorMessage("Brotli failed to compress.");
}
while (BrotliEncoderHasMoreOutput(obj->state) == BROTLI_TRUE) {
size_t size = 0;
const uint8_t* output = BrotliEncoderTakeOutput(obj->state, &size);
void* buf = obj->alloc.Alloc(size);
if (!buf) {
return SetErrorMessage("Brotli failed to compress.");
}
memcpy(buf, output, size);
obj->pending_output.push_back(static_cast<uint8_t*>(buf));
}
} while (obj->available_in > 0);
}
void StreamEncodeWorker::HandleOKCallback() {
Local<Value> argv[] = {
Nan::Null(),
obj->PendingChunksAsArray()
};
callback->Call(2, argv, async_resource);
obj->alloc.ReportMemoryToV8();
}