current commit
260925.46 · net: speed up BlockList.check for strings
// Flags: --allow-natives-syntax --expose-internals --no-warnings
'use strict';

const common = require('../common');
const assert = require('assert');
const { BlockList } = require('net');
const { internalBinding } = require('internal/test/binding');

// The native check() method takes a SocketAddressBase object.
// String arguments go through checkString(), which also has a fast API.
const { kHandle: kBlockListHandle } = require('internal/blocklist');
const {
  SocketAddress,
  kHandle: kSocketAddressHandle,
} = require('internal/socketaddress');
const { AF_INET } = internalBinding('block_list');

const blockList = new BlockList();
blockList.addAddress('1.1.1.1');
blockList.addSubnet('10.0.0.0', 24);

const handle = blockList[kBlockListHandle];
const addr1 = new SocketAddress({ address: '1.1.1.1' })[kSocketAddressHandle];
const addr2 = new SocketAddress({ address: '2.2.2.2' })[kSocketAddressHandle];
const addr3 = new SocketAddress({ address: '10.0.0.5' })[kSocketAddressHandle];

function testFastCheck() {
  assert.strictEqual(handle.check(addr1), true);
  assert.strictEqual(handle.check(addr2), false);
  assert.strictEqual(handle.check(addr3), true);
}

function checkString(address) {
  return handle.checkString(address, AF_INET);
}

eval('%PrepareFunctionForOptimization(testFastCheck)');
testFastCheck();
eval('%OptimizeFunctionOnNextCall(testFastCheck)');
testFastCheck();

eval('%PrepareFunctionForOptimization(checkString)');
assert.strictEqual(checkString('1.1.1.1'), true);
eval('%OptimizeFunctionOnNextCall(checkString)');
assert.strictEqual(checkString('1.1.1.1'), true);
assert.strictEqual(checkString('2.2.2.2'), false);
assert.strictEqual(checkString('10.0.0.5'), true);

if (common.isDebug) {
  const { getV8FastApiCallCount } = internalBinding('debug');
  assert.strictEqual(getV8FastApiCallCount('blocklist.check'), 3);
  assert.strictEqual(getV8FastApiCallCount('blocklist.checkString'), 3);
}