#include "stream_decode_worker.h" using namespace v8; StreamDecodeWorker::StreamDecodeWorker(Nan::Callback *callback, StreamDecode* obj) : Nan::AsyncWorker(callback), obj(obj) {} StreamDecodeWorker::~StreamDecodeWorker() { } void StreamDecodeWorker::Execute() { BrotliDecoderResult res; do { size_t available_out = 0; res = BrotliDecoderDecompressStream(obj->state, &obj->available_in, &obj->next_in, &available_out, NULL, NULL); if (res == BROTLI_DECODER_RESULT_ERROR) { return SetErrorMessage("Brotli failed to decompress."); } while (BrotliDecoderHasMoreOutput(obj->state) == BROTLI_TRUE) { size_t size = 0; const uint8_t* output = BrotliDecoderTakeOutput(obj->state, &size); void* buf = obj->alloc.Alloc(size); if (!buf) { return SetErrorMessage("Brotli failed to decompress."); } memcpy(buf, output, size); obj->pending_output.push_back(static_cast<uint8_t*>(buf)); } } while (res == BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT); } void StreamDecodeWorker::HandleOKCallback() { Local<Value> argv[] = { Nan::Null(), obj->PendingChunksAsArray() }; callback->Call(2, argv, async_resource); obj->alloc.ReportMemoryToV8(); }