summaryrefslogtreecommitdiff
path: root/src/node.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/node.cc')
-rw-r--r--src/node.cc29
1 files changed, 23 insertions, 6 deletions
diff --git a/src/node.cc b/src/node.cc
index 0c69ece87a..6c1b11d4ca 100644
--- a/src/node.cc
+++ b/src/node.cc
@@ -1156,8 +1156,19 @@ bool ShouldAbortOnUncaughtException(Isolate* isolate) {
}
+Local<Value> GetDomainProperty(Environment* env, Local<Object> object) {
+ Local<Value> domain_v =
+ object->GetPrivate(env->context(), env->domain_private_symbol())
+ .ToLocalChecked();
+ if (domain_v->IsObject()) {
+ return domain_v;
+ }
+ return object->Get(env->context(), env->domain_string()).ToLocalChecked();
+}
+
+
void DomainEnter(Environment* env, Local<Object> object) {
- Local<Value> domain_v = object->Get(env->domain_string());
+ Local<Value> domain_v = GetDomainProperty(env, object);
if (domain_v->IsObject()) {
Local<Object> domain = domain_v.As<Object>();
Local<Value> enter_v = domain->Get(env->enter_string());
@@ -1172,7 +1183,7 @@ void DomainEnter(Environment* env, Local<Object> object) {
void DomainExit(Environment* env, v8::Local<v8::Object> object) {
- Local<Value> domain_v = object->Get(env->domain_string());
+ Local<Value> domain_v = GetDomainProperty(env, object);
if (domain_v->IsObject()) {
Local<Object> domain = domain_v.As<Object>();
Local<Value> exit_v = domain->Get(env->exit_string());
@@ -1194,10 +1205,16 @@ void DomainPromiseHook(PromiseHookType type,
Local<Context> context = env->context();
if (type == PromiseHookType::kInit && env->in_domain()) {
- promise->Set(context,
- env->domain_string(),
- env->domain_array()->Get(context,
- 0).ToLocalChecked()).FromJust();
+ Local<Value> domain_obj =
+ env->domain_array()->Get(context, 0).ToLocalChecked();
+ if (promise->CreationContext() == context) {
+ promise->Set(context, env->domain_string(), domain_obj).FromJust();
+ } else {
+ // Do not expose object from another context publicly in promises created
+ // in non-main contexts.
+ promise->SetPrivate(context, env->domain_private_symbol(), domain_obj)
+ .FromJust();
+ }
return;
}