@@ -1651,20 +1651,27 @@ inline Value Function::Call(napi_value recv, size_t argc, const napi_value* args
16511651}
16521652
16531653inline Value Function::MakeCallback (
1654- napi_value recv, const std::initializer_list<napi_value>& args) const {
1655- return MakeCallback (recv, args.size (), args.begin ());
1654+ napi_value recv,
1655+ const std::initializer_list<napi_value>& args,
1656+ napi_async_context context) const {
1657+ return MakeCallback (recv, args.size (), args.begin (), context);
16561658}
16571659
16581660inline Value Function::MakeCallback (
1659- napi_value recv, const std::vector<napi_value>& args) const {
1660- return MakeCallback (recv, args.size (), args.data ());
1661+ napi_value recv,
1662+ const std::vector<napi_value>& args,
1663+ napi_async_context context) const {
1664+ return MakeCallback (recv, args.size (), args.data (), context);
16611665}
16621666
16631667inline Value Function::MakeCallback (
1664- napi_value recv, size_t argc, const napi_value* args) const {
1668+ napi_value recv,
1669+ size_t argc,
1670+ const napi_value* args,
1671+ napi_async_context context) const {
16651672 napi_value result;
16661673 napi_status status = napi_make_callback (
1667- _env, nullptr , recv, _value, argc, args, &result);
1674+ _env, context , recv, _value, argc, args, &result);
16681675 NAPI_THROW_IF_FAILED (_env, status, Value ());
16691676 return Value (_env, result);
16701677}
@@ -2416,29 +2423,36 @@ inline Napi::Value FunctionReference::Call(
24162423}
24172424
24182425inline Napi::Value FunctionReference::MakeCallback (
2419- napi_value recv, const std::initializer_list<napi_value>& args) const {
2426+ napi_value recv,
2427+ const std::initializer_list<napi_value>& args,
2428+ napi_async_context context) const {
24202429 EscapableHandleScope scope (_env);
2421- Napi::Value result = Value ().MakeCallback (recv, args);
2430+ Napi::Value result = Value ().MakeCallback (recv, args, context );
24222431 if (scope.Env ().IsExceptionPending ()) {
24232432 return Value ();
24242433 }
24252434 return scope.Escape (result);
24262435}
24272436
24282437inline Napi::Value FunctionReference::MakeCallback (
2429- napi_value recv, const std::vector<napi_value>& args) const {
2438+ napi_value recv,
2439+ const std::vector<napi_value>& args,
2440+ napi_async_context context) const {
24302441 EscapableHandleScope scope (_env);
2431- Napi::Value result = Value ().MakeCallback (recv, args);
2442+ Napi::Value result = Value ().MakeCallback (recv, args, context );
24322443 if (scope.Env ().IsExceptionPending ()) {
24332444 return Value ();
24342445 }
24352446 return scope.Escape (result);
24362447}
24372448
24382449inline Napi::Value FunctionReference::MakeCallback (
2439- napi_value recv, size_t argc, const napi_value* args) const {
2450+ napi_value recv,
2451+ size_t argc,
2452+ const napi_value* args,
2453+ napi_async_context context) const {
24402454 EscapableHandleScope scope (_env);
2441- Napi::Value result = Value ().MakeCallback (recv, argc, args);
2455+ Napi::Value result = Value ().MakeCallback (recv, argc, args, context );
24422456 if (scope.Env ().IsExceptionPending ()) {
24432457 return Value ();
24442458 }
@@ -3274,6 +3288,54 @@ inline Value EscapableHandleScope::Escape(napi_value escapee) {
32743288 return Value (_env, result);
32753289}
32763290
3291+ // //////////////////////////////////////////////////////////////////////////////
3292+ // AsyncContext class
3293+ // //////////////////////////////////////////////////////////////////////////////
3294+
3295+ inline AsyncContext::AsyncContext (napi_env env, const char * resource_name)
3296+ : AsyncContext(env, resource_name, Object::New(env)) {
3297+ }
3298+
3299+ inline AsyncContext::AsyncContext (napi_env env,
3300+ const char * resource_name,
3301+ const Object& resource)
3302+ : _env(env),
3303+ _context(nullptr ) {
3304+ napi_value resource_id;
3305+ napi_status status = napi_create_string_utf8 (
3306+ _env, resource_name, NAPI_AUTO_LENGTH, &resource_id);
3307+ NAPI_THROW_IF_FAILED_VOID (_env, status);
3308+
3309+ status = napi_async_init (_env, resource, resource_id, &_context);
3310+ NAPI_THROW_IF_FAILED_VOID (_env, status);
3311+ }
3312+
3313+ inline AsyncContext::~AsyncContext () {
3314+ if (_context != nullptr ) {
3315+ napi_async_destroy (_env, _context);
3316+ _context = nullptr ;
3317+ }
3318+ }
3319+
3320+ inline AsyncContext::AsyncContext (AsyncContext&& other) {
3321+ _env = other._env ;
3322+ other._env = nullptr ;
3323+ _context = other._context ;
3324+ other._context = nullptr ;
3325+ }
3326+
3327+ inline AsyncContext& AsyncContext::operator =(AsyncContext&& other) {
3328+ _env = other._env ;
3329+ other._env = nullptr ;
3330+ _context = other._context ;
3331+ other._context = nullptr ;
3332+ return *this ;
3333+ }
3334+
3335+ inline AsyncContext::operator napi_async_context () const {
3336+ return _context;
3337+ }
3338+
32773339// //////////////////////////////////////////////////////////////////////////////
32783340// AsyncWorker class
32793341// //////////////////////////////////////////////////////////////////////////////
0 commit comments