@@ -390,6 +390,7 @@ SocketAddressBlockList::SocketAddressBlockList(
390
390
391
391
void SocketAddressBlockList::AddSocketAddress (
392
392
const SocketAddress& address) {
393
+ Mutex::ScopedLock lock (mutex_);
393
394
std::unique_ptr<Rule> rule =
394
395
std::make_unique<SocketAddressRule>(address);
395
396
rules_.emplace_front (std::move (rule));
@@ -398,6 +399,7 @@ void SocketAddressBlockList::AddSocketAddress(
398
399
399
400
void SocketAddressBlockList::RemoveSocketAddress (
400
401
const SocketAddress& address) {
402
+ Mutex::ScopedLock lock (mutex_);
401
403
auto it = address_rules_.find (address);
402
404
if (it != std::end (address_rules_)) {
403
405
rules_.erase (it->second );
@@ -408,6 +410,7 @@ void SocketAddressBlockList::RemoveSocketAddress(
408
410
void SocketAddressBlockList::AddSocketAddressRange (
409
411
const SocketAddress& start,
410
412
const SocketAddress& end) {
413
+ Mutex::ScopedLock lock (mutex_);
411
414
std::unique_ptr<Rule> rule =
412
415
std::make_unique<SocketAddressRangeRule>(start, end);
413
416
rules_.emplace_front (std::move (rule));
@@ -416,12 +419,14 @@ void SocketAddressBlockList::AddSocketAddressRange(
416
419
void SocketAddressBlockList::AddSocketAddressMask (
417
420
const SocketAddress& network,
418
421
int prefix) {
422
+ Mutex::ScopedLock lock (mutex_);
419
423
std::unique_ptr<Rule> rule =
420
424
std::make_unique<SocketAddressMaskRule>(network, prefix);
421
425
rules_.emplace_front (std::move (rule));
422
426
}
423
427
424
428
bool SocketAddressBlockList::Apply (const SocketAddress& address) {
429
+ Mutex::ScopedLock lock (mutex_);
425
430
for (const auto & rule : rules_) {
426
431
if (rule->Apply (address))
427
432
return true ;
@@ -488,14 +493,25 @@ std::string SocketAddressBlockList::SocketAddressMaskRule::ToString() {
488
493
}
489
494
490
495
MaybeLocal<Array> SocketAddressBlockList::ListRules (Environment* env) {
496
+ Mutex::ScopedLock lock (mutex_);
491
497
std::vector<Local<Value>> rules;
498
+ if (!ListRules (env, &rules))
499
+ return MaybeLocal<Array>();
500
+ return Array::New (env->isolate (), rules.data (), rules.size ());
501
+ }
502
+
503
+ bool SocketAddressBlockList::ListRules (
504
+ Environment* env,
505
+ std::vector<v8::Local<v8::Value>>* rules) {
506
+ if (parent_ && !parent_->ListRules (env, rules))
507
+ return false ;
492
508
for (const auto & rule : rules_) {
493
509
Local<Value> str;
494
510
if (!rule->ToV8String (env).ToLocal (&str))
495
- return MaybeLocal<Array>() ;
496
- rules. push_back (str);
511
+ return false ;
512
+ rules-> push_back (str);
497
513
}
498
- return Array::New (env-> isolate (), rules. data (), rules. size ()) ;
514
+ return true ;
499
515
}
500
516
501
517
void SocketAddressBlockList::MemoryInfo (node::MemoryTracker* tracker) const {
@@ -519,20 +535,42 @@ void SocketAddressBlockList::SocketAddressMaskRule::MemoryInfo(
519
535
}
520
536
521
537
SocketAddressBlockListWrap::SocketAddressBlockListWrap (
522
- Environment* env, Local<Object> wrap)
523
- : BaseObject(env, wrap) {
538
+ Environment* env,
539
+ Local<Object> wrap,
540
+ std::shared_ptr<SocketAddressBlockList> blocklist)
541
+ : BaseObject(env, wrap),
542
+ blocklist_(std::move(blocklist)) {
524
543
MakeWeak ();
525
544
}
526
545
527
546
BaseObjectPtr<SocketAddressBlockListWrap> SocketAddressBlockListWrap::New (
528
547
Environment* env) {
529
548
Local<Object> obj;
530
- if (!env->blocklist_instance_template ()
549
+ if (!env->blocklist_constructor_template ()
550
+ ->InstanceTemplate ()
551
+ ->NewInstance (env->context ()).ToLocal (&obj)) {
552
+ return BaseObjectPtr<SocketAddressBlockListWrap>();
553
+ }
554
+ BaseObjectPtr<SocketAddressBlockListWrap> wrap =
555
+ MakeBaseObject<SocketAddressBlockListWrap>(env, obj);
556
+ CHECK (wrap);
557
+ return wrap;
558
+ }
559
+
560
+ BaseObjectPtr<SocketAddressBlockListWrap> SocketAddressBlockListWrap::New (
561
+ Environment* env,
562
+ std::shared_ptr<SocketAddressBlockList> blocklist) {
563
+ Local<Object> obj;
564
+ if (!env->blocklist_constructor_template ()
565
+ ->InstanceTemplate ()
531
566
->NewInstance (env->context ()).ToLocal (&obj)) {
532
- return {} ;
567
+ return BaseObjectPtr<SocketAddressBlockListWrap>() ;
533
568
}
534
569
BaseObjectPtr<SocketAddressBlockListWrap> wrap =
535
- MakeDetachedBaseObject<SocketAddressBlockListWrap>(env, obj);
570
+ MakeBaseObject<SocketAddressBlockListWrap>(
571
+ env,
572
+ obj,
573
+ std::move (blocklist));
536
574
CHECK (wrap);
537
575
return wrap;
538
576
}
@@ -562,7 +600,7 @@ void SocketAddressBlockListWrap::AddAddress(
562
600
if (!SocketAddress::ToSockAddr (family, *value, 0 , &address))
563
601
return ;
564
602
565
- wrap->AddSocketAddress (
603
+ wrap->blocklist_ -> AddSocketAddress (
566
604
SocketAddress (reinterpret_cast <const sockaddr*>(&address)));
567
605
568
606
args.GetReturnValue ().Set (true );
@@ -597,7 +635,7 @@ void SocketAddressBlockListWrap::AddRange(
597
635
if (start_addr > end_addr)
598
636
return args.GetReturnValue ().Set (false );
599
637
600
- wrap->AddSocketAddressRange (start_addr, end_addr);
638
+ wrap->blocklist_ -> AddSocketAddressRange (start_addr, end_addr);
601
639
602
640
args.GetReturnValue ().Set (true );
603
641
}
@@ -628,7 +666,7 @@ void SocketAddressBlockListWrap::AddSubnet(
628
666
CHECK_IMPLIES (family == AF_INET6, prefix <= 128 );
629
667
CHECK_GE (prefix, 0 );
630
668
631
- wrap->AddSocketAddressMask (
669
+ wrap->blocklist_ -> AddSocketAddressMask (
632
670
SocketAddress (reinterpret_cast <const sockaddr*>(&address)),
633
671
prefix);
634
672
@@ -654,7 +692,8 @@ void SocketAddressBlockListWrap::Check(
654
692
return ;
655
693
656
694
args.GetReturnValue ().Set (
657
- wrap->Apply (SocketAddress (reinterpret_cast <const sockaddr*>(&address))));
695
+ wrap->blocklist_ ->Apply (
696
+ SocketAddress (reinterpret_cast <const sockaddr*>(&address))));
658
697
}
659
698
660
699
void SocketAddressBlockListWrap::GetRules (
@@ -663,34 +702,72 @@ void SocketAddressBlockListWrap::GetRules(
663
702
SocketAddressBlockListWrap* wrap;
664
703
ASSIGN_OR_RETURN_UNWRAP (&wrap, args.Holder ());
665
704
Local<Array> rules;
666
- if (wrap->ListRules (env).ToLocal (&rules))
705
+ if (wrap->blocklist_ -> ListRules (env).ToLocal (&rules))
667
706
args.GetReturnValue ().Set (rules);
668
707
}
669
708
709
+ void SocketAddressBlockListWrap::MemoryInfo (MemoryTracker* tracker) const {
710
+ blocklist_->MemoryInfo (tracker);
711
+ }
712
+
713
+ std::unique_ptr<worker::TransferData>
714
+ SocketAddressBlockListWrap::CloneForMessaging () const {
715
+ return std::make_unique<TransferData>(this );
716
+ }
717
+
718
+ bool SocketAddressBlockListWrap::HasInstance (
719
+ Environment* env,
720
+ Local<Value> value) {
721
+ return GetConstructorTemplate (env)->HasInstance (value);
722
+ }
723
+
724
+ Local<FunctionTemplate> SocketAddressBlockListWrap::GetConstructorTemplate (
725
+ Environment* env) {
726
+ Local<FunctionTemplate> tmpl = env->blocklist_constructor_template ();
727
+ if (tmpl.IsEmpty ()) {
728
+ tmpl = env->NewFunctionTemplate (SocketAddressBlockListWrap::New);
729
+ tmpl->SetClassName (FIXED_ONE_BYTE_STRING (env->isolate (), " BlockList" ));
730
+ tmpl->Inherit (BaseObject::GetConstructorTemplate (env));
731
+ tmpl->InstanceTemplate ()->SetInternalFieldCount (kInternalFieldCount );
732
+ env->SetProtoMethod (tmpl, " addAddress" , AddAddress);
733
+ env->SetProtoMethod (tmpl, " addRange" , AddRange);
734
+ env->SetProtoMethod (tmpl, " addSubnet" , AddSubnet);
735
+ env->SetProtoMethod (tmpl, " check" , Check);
736
+ env->SetProtoMethod (tmpl, " getRules" , GetRules);
737
+ env->set_blocklist_constructor_template (tmpl);
738
+ }
739
+ return tmpl;
740
+ }
741
+
670
742
void SocketAddressBlockListWrap::Initialize (
671
743
Local<Object> target,
672
744
Local<Value> unused,
673
745
Local<Context> context,
674
746
void * priv) {
675
747
Environment* env = Environment::GetCurrent (context);
676
748
677
- Local<FunctionTemplate> t =
678
- env->NewFunctionTemplate (SocketAddressBlockListWrap::New);
679
- t->InstanceTemplate ()->SetInternalFieldCount (BaseObject::kInternalFieldCount );
680
-
681
- env->SetProtoMethod (t, " addAddress" , SocketAddressBlockListWrap::AddAddress);
682
- env->SetProtoMethod (t, " addRange" , SocketAddressBlockListWrap::AddRange);
683
- env->SetProtoMethod (t, " addSubnet" , SocketAddressBlockListWrap::AddSubnet);
684
- env->SetProtoMethod (t, " check" , SocketAddressBlockListWrap::Check);
685
- env->SetProtoMethod (t, " getRules" , SocketAddressBlockListWrap::GetRules);
686
-
687
- env->set_blocklist_instance_template (t->InstanceTemplate ());
688
- env->SetConstructorFunction (target, " BlockList" , t);
749
+ env->SetConstructorFunction (
750
+ target,
751
+ " BlockList" ,
752
+ GetConstructorTemplate (env),
753
+ Environment::SetConstructorFunctionFlag::NONE);
689
754
690
755
NODE_DEFINE_CONSTANT (target, AF_INET);
691
756
NODE_DEFINE_CONSTANT (target, AF_INET6);
692
757
}
693
758
759
+ BaseObjectPtr<BaseObject> SocketAddressBlockListWrap::TransferData::Deserialize (
760
+ Environment* env,
761
+ Local<Context> context,
762
+ std::unique_ptr<worker::TransferData> self) {
763
+ return New (env, std::move (blocklist_));
764
+ }
765
+
766
+ void SocketAddressBlockListWrap::TransferData::MemoryInfo (
767
+ MemoryTracker* tracker) const {
768
+ blocklist_->MemoryInfo (tracker);
769
+ }
770
+
694
771
} // namespace node
695
772
696
773
NODE_MODULE_CONTEXT_AWARE_INTERNAL (
0 commit comments