void MakeCallback(uv_work_t* req) { Nan::HandleScope scope; Nan::TryCatch try_catch; sass_context_wrapper* ctx_w = static_cast<sass_context_wrapper*>(req->data); struct Sass_Context* ctx; if (ctx_w->dctx) { ctx = sass_data_context_get_context(ctx_w->dctx); } else { ctx = sass_file_context_get_context(ctx_w->fctx); } int status = GetResult(ctx_w, ctx); if (status == 0 && ctx_w->success_callback) { // if no error, do callback(null, result) ctx_w->success_callback->Call(0, 0); } else if (ctx_w->error_callback) { // if error, do callback(error) const char* err = sass_context_get_error_json(ctx); v8::Local<v8::Value> argv[] = { Nan::New<v8::String>(err).ToLocalChecked() }; ctx_w->error_callback->Call(1, argv); } if (try_catch.HasCaught()) { Nan::FatalException(try_catch); } sass_free_context_wrapper(ctx_w); }
int GetResult(sass_context_wrapper* ctx_w, Sass_Context* ctx, bool is_sync = false) { Nan::HandleScope scope; v8::Local<v8::Object> result; int status = sass_context_get_error_status(ctx); result = Nan::New(ctx_w->result); assert(result->IsObject()); if (status == 0) { const char* css = sass_context_get_output_string(ctx); const char* map = sass_context_get_source_map_string(ctx); Nan::Set(result, Nan::New("css").ToLocalChecked(), Nan::CopyBuffer(css, static_cast<uint32_t>(strlen(css))).ToLocalChecked()); GetStats(ctx_w, ctx); if (map) { Nan::Set(result, Nan::New("map").ToLocalChecked(), Nan::CopyBuffer(map, static_cast<uint32_t>(strlen(map))).ToLocalChecked()); } } else if (is_sync) { Nan::Set(result, Nan::New("error").ToLocalChecked(), Nan::New<v8::String>(sass_context_get_error_json(ctx)).ToLocalChecked()); } return status; }
int get_result(sass_context_wrapper* ctx_w, Sass_Context* ctx, bool is_sync = false) { NanScope(); int status = sass_context_get_error_status(ctx); if (status == 0) { NanNew(ctx_w->result)->Set(NanNew("css"), NanNew<String>(sass_context_get_output_string(ctx))); get_stats(ctx_w, ctx); get_source_map(ctx_w, ctx); } else if (is_sync) { NanNew(ctx_w->result)->Set(NanNew("error"), NanNew<String>(sass_context_get_error_json(ctx))); } return status; }
void make_callback(uv_work_t* req) { NanScope(); TryCatch try_catch; sass_context_wrapper* ctx_w = static_cast<sass_context_wrapper*>(req->data); struct Sass_Context* ctx; if (ctx_w->dctx) { ctx = sass_data_context_get_context(ctx_w->dctx); } else { ctx = sass_file_context_get_context(ctx_w->fctx); } int status = GetResult(ctx_w, ctx); if (status == 0 && ctx_w->success_callback) { // if no error, do callback(null, result) ctx_w->success_callback->Call(0, 0); } else if(ctx_w->error_callback) { // if error, do callback(error) const char* err = sass_context_get_error_json(ctx); Local<Value> argv[] = { NanNew<String>(err), NanNew<Integer>(status) }; ctx_w->error_callback->Call(2, argv); } if (try_catch.HasCaught()) { node::FatalException(try_catch); } if (ctx_w->importer_callback) { uv_close((uv_handle_t*)&ctx_w->async, NULL); } sass_free_context_wrapper(ctx_w); }