v0.3.0
This release contains massive optimizations as well as a few bug fixes and building improvements:
-
Distribute both un-bundled cjs and es6 source #54
-
Produce a commonjs build artifact #53
-
Update build instructions in README.md #52
-
Remove dist folder from source tree #50
-
Cosmetics: fix rule matching when hostname is empty #49
-
Optimizations #46
- Requests can now use
typeas a string or number (e.g.:scriptor2).
// Both are equivalent new Request({ type: 2, url, sourceUrl }) new Request({ type: 'script', url, sourceUrl })
- [BREAKING] format of serialized engine has been changed to store less data
- [BREAKING]
idattribute from filters has been remove, usegetId()instead (please note that theidis not stored internally anymore, but generated every timegetId()is called).
// Bad filter.id // Good filter.getId()
- [BREAKING] values returned by
getId()will differ from values stored in
theidattribute for identical filters (the algorithm is now different
and will do less work). - [BREAKING] domains specified in
$domains=option are now stored hashed
instead of as string, and can only be retried in their original form if
debugflag is used inFiltersEngine - [BREAKING]
fastTokenizerwill now only consider tokens longer than 1 - [BREAKING]
fastTokenizerwill now only tokenize up to 2048 characters from URLs - [BREAKING] hashes produced by
fastHashandfastHashBetweenwill not
match what was produced by the same function before this change (the seed
and hashing algorithm was slightly changed for speed). - [BREAKING] un-initialized attributes of filters instances
(CosmeticFilterandNetworkFilter) will have valueundefined
instead ofnullor empty string like before. It is recommended
to use accessors (e.g.:filter.getHostname()instead of
filter.hostname) to access internal attributes, as they will
always return consistent types and fall-back to meaningful defaults.
// Bad filter.redirect filter.filter filter.hostname // Good filter.getRedirect() filter.getFilter() filter.getHostname()
- [BREAKING] a new
Requestabstraction supersedesIRequestand
IRawRequest. This new class offers a more consistent experience to work
will requests.
new Request({ url }) new Request({ url, sourceUrl }) new Request({ url, sourceUrl, type: 'string' }) new Request({ url, hostname, domain, type: 'string' })
- [BREAKING] remove support for
hostsformat (e.g.:127.0.0.1 domain),
since servers blocklists can also be exported in hostname anchored format
(e.g.:||domain^$third-party). This simplifies the parsing logic. - [BREAKING] remove the following unused legacy request types:
fromFetchfromDTDfromXLSTfromBeaconfromCSP
- [BREAKING]
cpt(Content Policy Type of requests) is now calledtype,
to match the terminology of the WebRequestAPI.
// Bad request.cpt new Request({ cpt }) // Good request.type new Request({ type })
- Optimized and simplified implementation of
parseJSResource(~4 times faster) - Optimized matching of some kinds of filters to prevent any string copy (reduced the number of calls to
slice,substrandsubstring) - Optimized buckets ordering by moving matching filters towards the
beginning of the array. This results in generic filter being tried first. - Optimized some classes of filters sharing the same pattern and options,
with different domains. They are now fused into a single filter. For
example, the following filters:|https://$script,domain=downloadpirate.com|https://$script,domain=dwindly.io|https://$script,domain=intoupload.net|https://$script,domain=linkshrink.net|https://$script,domain=movpod.in|https://$script,domain=povw1deo.com|povwideo.net|powvideo.net|https://$script,domain=sendit.cloud|https://$script,domain=sfiles.org|suprafiles.me|suprafiles.net|suprafiles.org|https://$script,domain=streamplay.to|https://$script,domain=userscloud.com|https://$script,domain=yourporn.sexy
will be optimized into:|https://$script,domain=dwindly.io|movpod.in|...|yourporn.sexy
tokenizewill now allow%as part of tokens for filtersCosmeticFilternow support the new+js()syntax to inject scriptsNetworkFilter'sgetTokens()method will now return more tokens in some
cases. For example, if only one domain is specified in the$domain=
option, then it can be used as a token (before we would only use the pattern part of each filter to extract tokens).- In case a
NetworkFilterhas no token available (e.g.:
$image,domain=ads.com), then it can be indexed using the domains
specified in the$domain=option, if any. - Filters of the form
*pattern(regex) are now optimized intopattern(plain) - Filters of the form
|http://or|https://or|http*://are now
optimized using the newly introducedhttpandhttpsoptions. The
Requestinstances will now say if they arehttporhttps, and this
saves string comparisons while matching. - Fixed a bug where javascript resources were serialized twice
- Serialization can now be performed even after
enginehas been optimized - Addition of a
serializemethod onFiltersEngineclass - Reverse Index is now created using only one
Mapinstead of two - optDomains and optNotDomains are now stored in a compact typed array
instead ofSetand a binary search is used for lookups. - Prevent filters from being checked twice for requests by remembering which
request last checked a given bucket in reverse index (i.e.:magicfield)
- Requests can now use