'use strict'; const { Boolean, ObjectSetPrototypeOf, Symbol, } = primordials; const { BlockList: BlockListHandle, } = internalBinding('block_list'); const { customInspectSymbol: kInspect, } = require('internal/util'); const { SocketAddress, kHandle: kSocketAddressHandle, } = require('internal/socketaddress'); const { JSTransferable, kClone, kDeserialize, } = require('internal/worker/js_transferable'); const { inspect } = require('internal/util/inspect'); const kHandle = Symbol('kHandle'); const { owner_symbol } = internalBinding('symbols'); const { ERR_INVALID_ARG_VALUE, } = require('internal/errors').codes; const { validateInt32, validateString } = require('internal/validators'); class BlockList extends JSTransferable { constructor() { super(); this[kHandle] = new BlockListHandle(); this[kHandle][owner_symbol] = this; } [kInspect](depth, options) { if (depth < 0) return this; const opts = { ...options, depth: options.depth == null ? null : options.depth - 1, }; return `BlockList ${inspect({ rules: this.rules, }, opts)}`; } addAddress(address, family = 'ipv4') { if (!SocketAddress.isSocketAddress(address)) { validateString(address, 'address'); validateString(family, 'family'); address = new SocketAddress({ address, family, }); } this[kHandle].addAddress(address[kSocketAddressHandle]); } addRange(start, end, family = 'ipv4') { if (!SocketAddress.isSocketAddress(start)) { validateString(start, 'start'); validateString(family, 'family'); start = new SocketAddress({ address: start, family, }); } if (!SocketAddress.isSocketAddress(end)) { validateString(end, 'end'); validateString(family, 'family'); end = new SocketAddress({ address: end, family, }); } const ret = this[kHandle].addRange( start[kSocketAddressHandle], end[kSocketAddressHandle]); if (ret === false) throw new ERR_INVALID_ARG_VALUE('start', start, 'must come before end'); } addSubnet(network, prefix, family = 'ipv4') { if (!SocketAddress.isSocketAddress(network)) { validateString(network, 'network'); validateString(family, 'family'); network = new SocketAddress({ address: network, family, }); } switch (network.family) { case 'ipv4': validateInt32(prefix, 'prefix', 0, 32); break; case 'ipv6': validateInt32(prefix, 'prefix', 0, 128); break; } this[kHandle].addSubnet(network[kSocketAddressHandle], prefix); } check(address, family = 'ipv4') { if (!SocketAddress.isSocketAddress(address)) { validateString(address, 'address'); validateString(family, 'family'); try { address = new SocketAddress({ address, family, }); } catch { // Ignore the error. If it's not a valid address, return false. return false; } } return Boolean(this[kHandle].check(address[kSocketAddressHandle])); } get rules() { return this[kHandle].getRules(); } [kClone]() { const handle = this[kHandle]; return { data: { handle }, deserializeInfo: 'internal/blocklist:InternalBlockList', }; } [kDeserialize]({ handle }) { this[kHandle] = handle; this[kHandle][owner_symbol] = this; } } class InternalBlockList extends JSTransferable { constructor(handle) { super(); this[kHandle] = handle; if (handle !== undefined) handle[owner_symbol] = this; } } InternalBlockList.prototype.constructor = BlockList.prototype.constructor; ObjectSetPrototypeOf(InternalBlockList.prototype, BlockList.prototype); module.exports = { BlockList, InternalBlockList, };