@ghostery/trackerdb 0.1.3 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -0
- package/cli.js +7 -23
- package/index.js +31 -0
- package/package.json +5 -3
- package/src/prepare.js +28 -0
package/README.md
CHANGED
|
@@ -19,6 +19,26 @@ The Tracker Database is used in [Ghostery Browser Extension](https://www.ghoster
|
|
|
19
19
|
|
|
20
20
|
It is also used by universities, journalists, and companies that want to understand the nature of the web data exchange.
|
|
21
21
|
|
|
22
|
+
## SDK
|
|
23
|
+
|
|
24
|
+
The Ghostery Tracker Database comes with a JavaScript SDK. Sample usage:
|
|
25
|
+
|
|
26
|
+
```js
|
|
27
|
+
import loadTrackerDB from '@ghostery/trackerdb';
|
|
28
|
+
|
|
29
|
+
const trackerDB = await loadTrackerDB();
|
|
30
|
+
|
|
31
|
+
const domainMatches = await trackerDB.matchDomain('google.com');
|
|
32
|
+
|
|
33
|
+
const urlMatches = await trackerDB.matchUrl({
|
|
34
|
+
url: 'https://google.com/gen_204',
|
|
35
|
+
type: 'xhr',
|
|
36
|
+
sourceUrl: 'https://google.com/'
|
|
37
|
+
}, {
|
|
38
|
+
getDomainMetadata: true,
|
|
39
|
+
});
|
|
40
|
+
```
|
|
41
|
+
|
|
22
42
|
## CLI
|
|
23
43
|
|
|
24
44
|
Ghostery Tracker Database can also be used in a commnad line, for example with:
|
package/cli.js
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
import { BASE_PATH } from './scripts/helpers.js';
|
|
3
|
+
import { readFileSync } from 'node:fs';
|
|
4
|
+
import { FiltersEngine, Request } from '@cliqz/adblocker';
|
|
5
|
+
import { generateEngine } from './src/prepare.js';
|
|
8
6
|
|
|
9
7
|
const debug = process.env.DEBUG === 'true' ? console.log : () => {};
|
|
10
8
|
|
|
@@ -17,30 +15,16 @@ const debug = process.env.DEBUG === 'true' ? console.log : () => {};
|
|
|
17
15
|
process.exit(1);
|
|
18
16
|
}
|
|
19
17
|
|
|
20
|
-
|
|
21
|
-
const trackerDBPath = path.join(BASE_PATH, 'dist', 'trackerdb.json');
|
|
22
|
-
if (!existsSync(trackerDBPath)) {
|
|
23
|
-
await import('./scripts/export-json/index.js');
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
// Generate binary engine if missing
|
|
27
|
-
const trackerEnginePath = path.join(
|
|
28
|
-
BASE_PATH,
|
|
29
|
-
'dist',
|
|
30
|
-
`trackerdb_${ENGINE_VERSION}.engine`,
|
|
31
|
-
);
|
|
32
|
-
if (!existsSync(trackerEnginePath)) {
|
|
33
|
-
const rawTrackerDB = JSON.parse(readFileSync(trackerDBPath, 'utf-8'));
|
|
34
|
-
const engine = FiltersEngine.fromTrackerDB(rawTrackerDB);
|
|
35
|
-
writeFileSync(trackerEnginePath, engine.serialize());
|
|
36
|
-
}
|
|
18
|
+
const trackerEnginePath = await generateEngine();
|
|
37
19
|
|
|
38
20
|
const loadingStart = Date.now();
|
|
39
21
|
const engine = FiltersEngine.deserialize(readFileSync(trackerEnginePath));
|
|
40
22
|
const loadingEnd = Date.now();
|
|
41
23
|
|
|
42
24
|
const matches = url.startsWith('http')
|
|
43
|
-
? engine.getPatternMetadata(Request.fromRawDetails({ url })
|
|
25
|
+
? engine.getPatternMetadata(Request.fromRawDetails({ url, type: 'xhr' }), {
|
|
26
|
+
getDomainMetadata: true,
|
|
27
|
+
})
|
|
44
28
|
: engine.metadata.fromDomain(url);
|
|
45
29
|
const matchingEnd = Date.now();
|
|
46
30
|
|
package/index.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { FiltersEngine, Request, ENGINE_VERSION } from '@cliqz/adblocker';
|
|
3
|
+
|
|
4
|
+
import { generateEngine } from './src/prepare.js';
|
|
5
|
+
|
|
6
|
+
export { Request as AdblockerRequest };
|
|
7
|
+
|
|
8
|
+
export default async function loadTrackerDBEngine() {
|
|
9
|
+
const trackerEnginePath = await generateEngine();
|
|
10
|
+
const engine = FiltersEngine.deserialize(readFileSync(trackerEnginePath));
|
|
11
|
+
return {
|
|
12
|
+
ENGINE_VERSION,
|
|
13
|
+
engine,
|
|
14
|
+
matchUrl(
|
|
15
|
+
requestArgs,
|
|
16
|
+
getPatternMetadataParams = { getDomainMetadata: true },
|
|
17
|
+
) {
|
|
18
|
+
const params = { ...requestArgs };
|
|
19
|
+
if (params.type === undefined) {
|
|
20
|
+
params.type = 'xhr';
|
|
21
|
+
}
|
|
22
|
+
return engine.getPatternMetadata(
|
|
23
|
+
Request.fromRawDetails(params),
|
|
24
|
+
getPatternMetadataParams,
|
|
25
|
+
);
|
|
26
|
+
},
|
|
27
|
+
matchDomain(domain) {
|
|
28
|
+
return engine.metadata.fromDomain(domain);
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ghostery/trackerdb",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "Ghostery Tracker Database",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
"export-engine": "node scripts/export-engine/index.js",
|
|
11
11
|
"export-json": "node scripts/export-json/index.js"
|
|
12
12
|
},
|
|
13
|
+
"main": "./index.js",
|
|
14
|
+
"exports": "./index.js",
|
|
13
15
|
"bin": {
|
|
14
16
|
"trackerdb": "./cli.js"
|
|
15
17
|
},
|
|
@@ -17,7 +19,7 @@
|
|
|
17
19
|
"type": "git",
|
|
18
20
|
"url": "git+https://github.com/ghostery/trackerdb.git"
|
|
19
21
|
},
|
|
20
|
-
"author": "Ghostery",
|
|
22
|
+
"author": "Ghostery GmbH.",
|
|
21
23
|
"license": "CC-BY-NC-SA-4.0",
|
|
22
24
|
"bugs": {
|
|
23
25
|
"url": "https://github.com/ghostery/trackerdb/issues"
|
|
@@ -27,7 +29,7 @@
|
|
|
27
29
|
"node": ">=18.0"
|
|
28
30
|
},
|
|
29
31
|
"dependencies": {
|
|
30
|
-
"@cliqz/adblocker": "^1.26.
|
|
32
|
+
"@cliqz/adblocker": "^1.26.5",
|
|
31
33
|
"enolib": "^0.8.2",
|
|
32
34
|
"iso-3166-1-alpha-2": "^1.0.0",
|
|
33
35
|
"sqlite": "^4.1.2",
|
package/src/prepare.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
3
|
+
import { FiltersEngine, ENGINE_VERSION } from '@cliqz/adblocker';
|
|
4
|
+
|
|
5
|
+
import { BASE_PATH } from '../scripts/helpers.js';
|
|
6
|
+
|
|
7
|
+
export async function generateEngine() {
|
|
8
|
+
// Generate input JSON if missing
|
|
9
|
+
const trackerDBPath = path.join(BASE_PATH, 'dist', 'trackerdb.json');
|
|
10
|
+
if (!existsSync(trackerDBPath)) {
|
|
11
|
+
await import('../scripts/export-json/index.js');
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// Generate binary engine if missing
|
|
15
|
+
const trackerEnginePath = path.join(
|
|
16
|
+
BASE_PATH,
|
|
17
|
+
'dist',
|
|
18
|
+
`trackerdb_${ENGINE_VERSION}.engine`,
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
if (!existsSync(trackerEnginePath)) {
|
|
22
|
+
const rawTrackerDB = JSON.parse(readFileSync(trackerDBPath, 'utf-8'));
|
|
23
|
+
const engine = FiltersEngine.fromTrackerDB(rawTrackerDB);
|
|
24
|
+
writeFileSync(trackerEnginePath, engine.serialize());
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return trackerEnginePath;
|
|
28
|
+
}
|