diff --git a/Build/build-cdn-download-conf.ts b/Build/build-cdn-download-conf.ts index 67b186d7..76f71129 100644 --- a/Build/build-cdn-download-conf.ts +++ b/Build/build-cdn-download-conf.ts @@ -6,6 +6,7 @@ import { task } from './trace'; import { SHARED_DESCRIPTION } from './lib/constants'; import { getPublicSuffixListTextPromise } from './lib/download-publicsuffixlist'; import { domainDeduper } from './lib/domain-deduper'; +import { appendArrayInPlace } from './lib/append-array-in-place'; const getS3OSSDomainsPromise = (async (): Promise> => { const trie = createTrie((await getPublicSuffixListTextPromise()).split('\n')); @@ -56,7 +57,7 @@ export const buildCdnDownloadConf = task(import.meta.path, async (span) => { readFileIntoProcessedArray(path.resolve(import.meta.dir, '../Source/domainset/steam.conf')) ]); - cdnDomainsList.push(...Array.from(S3OSSDomains).map((domain) => `.${domain}`)); + appendArrayInPlace(cdnDomainsList, Array.from(S3OSSDomains).map((domain) => `.${domain}`)); return Promise.all([ createRuleset( diff --git a/Build/build-reject-ip-list.ts b/Build/build-reject-ip-list.ts index e8cd1be4..527cbedd 100644 --- a/Build/build-reject-ip-list.ts +++ b/Build/build-reject-ip-list.ts @@ -8,6 +8,7 @@ import { isProbablyIpv4, isProbablyIpv6 } from './lib/is-fast-ip'; import { TTL, deserializeArray, fsFetchCache, serializeArray } from './lib/cache-filesystem'; import { fetchAssets } from './lib/fetch-assets'; import { processLine } from './lib/process-line'; +import { appendArrayInPlace } from './lib/append-array-in-place'; const BOGUS_NXDOMAIN_URL = 'https://raw.githubusercontent.com/felixonmars/dnsmasq-china-list/master/bogus-nxdomain.china.conf'; @@ -70,7 +71,8 @@ export const buildRejectIPList = task(import.meta.path, async (span) => { const bogusNxDomainIPs = await span.traceChildPromise('get bogus nxdomain ips', getBogusNxDomainIPsPromise); const botNetIPs = await span.traceChildPromise('get botnet ips', getBotNetFilterIPsPromise); - result.push(...bogusNxDomainIPs, ...botNetIPs); + appendArrayInPlace(result, bogusNxDomainIPs); + appendArrayInPlace(result, botNetIPs); const description = [ ...SHARED_DESCRIPTION, diff --git a/Build/lib/append-array-in-place.ts b/Build/lib/append-array-in-place.ts new file mode 100644 index 00000000..a7b2e8f7 --- /dev/null +++ b/Build/lib/append-array-in-place.ts @@ -0,0 +1,21 @@ +const MAX_BLOCK_SIZE = 65535; // max parameter array size for use in Webkit + +export function appendArrayInPlace(dest: T[], source: T[]) { + let offset = 0; + let itemsLeft = source.length; + + if (itemsLeft <= MAX_BLOCK_SIZE) { + // eslint-disable-next-line prefer-spread -- performance + dest.push.apply(dest, source); + } else { + while (itemsLeft > 0) { + const pushCount = Math.min(MAX_BLOCK_SIZE, itemsLeft); + const subSource = source.slice(offset, offset + pushCount); + // eslint-disable-next-line prefer-spread -- performance + dest.push.apply(dest, subSource); + itemsLeft -= pushCount; + offset += pushCount; + } + } + return dest; +}