src: allow instances of net.BlockList to be created internally

Initial PR had it so that user code would create BlockList
instances. This sets it up so that instances can be created
internally by Node.js

PR-URL: https://github.com/nodejs/node/pull/34741
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Rich Trott <rtrott@gmail.com>
This commit is contained in:
James M Snell
2020-08-11 15:45:26 -07:00
parent bfc35354c1
commit 1c14810edc
5 changed files with 25 additions and 2 deletions

View File

@@ -26,8 +26,13 @@ const {
} = require('internal/errors').codes;
class BlockList {
constructor() {
this[kHandle] = new BlockListHandle();
constructor(handle = new BlockListHandle()) {
// The handle argument is an intentionally undocumented
// internal API. User code will not be able to create
// a BlockListHandle object directly.
if (!(handle instanceof BlockListHandle))
throw new ERR_INVALID_ARG_TYPE('handle', 'BlockListHandle', handle);
this[kHandle] = handle;
this[kHandle][owner_symbol] = this;
}

View File

@@ -182,6 +182,7 @@ constexpr size_t kFsStatsBufferLength =
V(asn1curve_string, "asn1Curve") \
V(async_ids_stack_string, "async_ids_stack") \
V(bits_string, "bits") \
V(block_list_string, "blockList") \
V(buffer_string, "buffer") \
V(bytes_parsed_string, "bytesParsed") \
V(bytes_read_string, "bytesRead") \
@@ -423,6 +424,7 @@ constexpr size_t kFsStatsBufferLength =
V(async_wrap_object_ctor_template, v8::FunctionTemplate) \
V(base_object_ctor_template, v8::FunctionTemplate) \
V(binding_data_ctor_template, v8::FunctionTemplate) \
V(blocklist_instance_template, v8::ObjectTemplate) \
V(compiled_fn_entry_template, v8::ObjectTemplate) \
V(dir_instance_template, v8::ObjectTemplate) \
V(fd_constructor_template, v8::ObjectTemplate) \

View File

@@ -524,6 +524,19 @@ SocketAddressBlockListWrap::SocketAddressBlockListWrap(
MakeWeak();
}
BaseObjectPtr<SocketAddressBlockListWrap> SocketAddressBlockListWrap::New(
Environment* env) {
Local<Object> obj;
if (!env->blocklist_instance_template()
->NewInstance(env->context()).ToLocal(&obj)) {
return {};
}
BaseObjectPtr<SocketAddressBlockListWrap> wrap =
MakeDetachedBaseObject<SocketAddressBlockListWrap>(env, obj);
CHECK(wrap);
return wrap;
}
void SocketAddressBlockListWrap::New(
const FunctionCallbackInfo<Value>& args) {
CHECK(args.IsConstructCall());
@@ -673,6 +686,7 @@ void SocketAddressBlockListWrap::Initialize(
env->SetProtoMethod(t, "check", SocketAddressBlockListWrap::Check);
env->SetProtoMethod(t, "getRules", SocketAddressBlockListWrap::GetRules);
env->set_blocklist_instance_template(t->InstanceTemplate());
target->Set(env->context(), name,
t->GetFunction(env->context()).ToLocalChecked()).FromJust();

View File

@@ -280,6 +280,7 @@ class SocketAddressBlockListWrap :
v8::Local<v8::Context> context,
void* priv);
static BaseObjectPtr<SocketAddressBlockListWrap> New(Environment* env);
static void New(const v8::FunctionCallbackInfo<v8::Value>& args);
static void AddAddress(const v8::FunctionCallbackInfo<v8::Value>& args);
static void AddRange(const v8::FunctionCallbackInfo<v8::Value>& args);

View File

@@ -122,6 +122,7 @@ const customTypesMap = {
'require': 'modules.html#modules_require_id',
'Handle': 'net.html#net_server_listen_handle_backlog_callback',
'net.BlockList': 'net.html#net_class_net_blocklist',
'net.Server': 'net.html#net_class_net_server',
'net.Socket': 'net.html#net_class_net_socket',