arn-browser 0.0.2 → 0.0.3
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/dist/__main__.d.ts +2 -0
- package/dist/__main__.js +127 -0
- package/dist/__version__.d.ts +11 -0
- package/dist/__version__.js +16 -0
- package/dist/addons.d.ts +17 -0
- package/dist/addons.js +70 -0
- package/dist/data-files/territoryInfo.xml +2024 -0
- package/dist/data-files/webgl_data.db +0 -0
- package/dist/exceptions.d.ts +76 -0
- package/dist/exceptions.js +153 -0
- package/dist/fingerprints.d.ts +4 -0
- package/dist/fingerprints.js +82 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -0
- package/dist/ip.d.ts +25 -0
- package/dist/ip.js +90 -0
- package/dist/locale.d.ts +26 -0
- package/dist/locale.js +280 -0
- package/dist/mappings/browserforge.config.d.ts +47 -0
- package/dist/mappings/browserforge.config.js +72 -0
- package/dist/mappings/fonts.config.d.ts +6 -0
- package/dist/mappings/fonts.config.js +822 -0
- package/dist/mappings/warnings.config.d.ts +16 -0
- package/dist/mappings/warnings.config.js +28 -0
- package/dist/pkgman.d.ts +62 -0
- package/dist/pkgman.js +347 -0
- package/dist/server.d.ts +6 -0
- package/dist/server.js +9 -0
- package/dist/sync_api.d.ts +7 -0
- package/dist/sync_api.js +27 -0
- package/dist/utils.d.ts +88 -0
- package/dist/utils.js +500 -0
- package/dist/virtdisplay.d.ts +20 -0
- package/dist/virtdisplay.js +123 -0
- package/dist/warnings.d.ts +4 -0
- package/dist/warnings.js +30 -0
- package/dist/webgl/db-compat.d.ts +9 -0
- package/dist/webgl/db-compat.js +44 -0
- package/dist/webgl/sample.d.ts +19 -0
- package/dist/webgl/sample.js +85 -0
- package/package.json +2 -1
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// Database compatibility layer for Bun and Node.js
|
|
2
|
+
// Bun has built-in SQLite support, while Node.js uses better-sqlite3
|
|
3
|
+
// Check if we're running in Bun
|
|
4
|
+
const isBun = typeof globalThis.Bun !== "undefined";
|
|
5
|
+
export function openDatabase(dbPath) {
|
|
6
|
+
if (isBun) {
|
|
7
|
+
// Use Bun's built-in SQLite
|
|
8
|
+
// @ts-ignore - Bun's sqlite module
|
|
9
|
+
const { Database } = require("bun:sqlite");
|
|
10
|
+
const db = new Database(dbPath, { readonly: true });
|
|
11
|
+
return {
|
|
12
|
+
prepare(sql) {
|
|
13
|
+
const stmt = db.prepare(sql);
|
|
14
|
+
return {
|
|
15
|
+
all(...params) {
|
|
16
|
+
return stmt.all(...params);
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
},
|
|
20
|
+
close() {
|
|
21
|
+
db.close();
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
// Use better-sqlite3 for Node.js
|
|
27
|
+
// Dynamic import to avoid bundling issues
|
|
28
|
+
const Database = require("better-sqlite3");
|
|
29
|
+
const db = new Database(dbPath, { readonly: true });
|
|
30
|
+
return {
|
|
31
|
+
prepare(sql) {
|
|
32
|
+
const stmt = db.prepare(sql);
|
|
33
|
+
return {
|
|
34
|
+
all(...params) {
|
|
35
|
+
return stmt.all(...params);
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
},
|
|
39
|
+
close() {
|
|
40
|
+
db.close();
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
interface WebGLData {
|
|
2
|
+
vendor: string;
|
|
3
|
+
renderer: string;
|
|
4
|
+
data: string;
|
|
5
|
+
win: number;
|
|
6
|
+
mac: number;
|
|
7
|
+
lin: number;
|
|
8
|
+
webGl2Enabled: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function sampleWebGL(os: "win" | "mac" | "lin", vendor?: string, renderer?: string): Promise<WebGLData>;
|
|
11
|
+
interface VendorRenderer {
|
|
12
|
+
vendor: string;
|
|
13
|
+
renderer: string;
|
|
14
|
+
}
|
|
15
|
+
interface PossiblePairs {
|
|
16
|
+
[key: string]: Array<VendorRenderer>;
|
|
17
|
+
}
|
|
18
|
+
export declare function getPossiblePairs(): Promise<PossiblePairs>;
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { openDatabase } from "./db-compat.js";
|
|
3
|
+
import { OS_ARCH_MATRIX } from "../pkgman.js";
|
|
4
|
+
// Get database path relative to this file
|
|
5
|
+
const DB_PATH = path.join(import.meta.dirname, "..", "data-files", "webgl_data.db");
|
|
6
|
+
export async function sampleWebGL(os, vendor, renderer) {
|
|
7
|
+
if (!OS_ARCH_MATRIX[os]) {
|
|
8
|
+
throw new Error(`Invalid OS: ${os}. Must be one of: win, mac, lin`);
|
|
9
|
+
}
|
|
10
|
+
const db = openDatabase(DB_PATH);
|
|
11
|
+
let query = "";
|
|
12
|
+
let params = [];
|
|
13
|
+
if (vendor && renderer) {
|
|
14
|
+
query = `SELECT vendor, renderer, data, ${os} FROM webgl_fingerprints WHERE vendor = ? AND renderer = ?`;
|
|
15
|
+
params = [vendor, renderer];
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
query = `SELECT vendor, renderer, data, ${os} FROM webgl_fingerprints WHERE ${os} > 0`;
|
|
19
|
+
}
|
|
20
|
+
return new Promise((resolve, reject) => {
|
|
21
|
+
try {
|
|
22
|
+
const rows = db.prepare(query).all(...params);
|
|
23
|
+
if (rows.length === 0) {
|
|
24
|
+
reject(new Error(`No WebGL data found for OS: ${os}`));
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
if (vendor && renderer) {
|
|
28
|
+
const result = rows[0];
|
|
29
|
+
if (result[os] <= 0) {
|
|
30
|
+
const pairs = db
|
|
31
|
+
.prepare(`SELECT DISTINCT vendor, renderer FROM webgl_fingerprints WHERE ${os} > 0`)
|
|
32
|
+
.all();
|
|
33
|
+
reject(new Error(`Vendor "${vendor}" and renderer "${renderer}" combination not valid for ${os}. Possible pairs: ${pairs.map((pair) => `${pair.vendor}, ${pair.renderer}`).join(", ")}`));
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
resolve(JSON.parse(result.data));
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
const dataStrs = rows.map((row) => row.data);
|
|
40
|
+
const probs = rows.map((row) => row[os]);
|
|
41
|
+
const probsArray = probs.map((p) => p / probs.reduce((a, b) => a + b, 0));
|
|
42
|
+
function weightedRandomChoice(weights) {
|
|
43
|
+
const sum = weights.reduce((acc, weight) => acc + weight, 0);
|
|
44
|
+
const threshold = Math.random() * sum;
|
|
45
|
+
let cumulativeSum = 0;
|
|
46
|
+
for (let i = 0; i < weights.length; i++) {
|
|
47
|
+
cumulativeSum += weights[i];
|
|
48
|
+
if (cumulativeSum >= threshold) {
|
|
49
|
+
return i;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return weights.length - 1; // Fallback in case of rounding errors
|
|
53
|
+
}
|
|
54
|
+
const idx = weightedRandomChoice(probsArray);
|
|
55
|
+
resolve(JSON.parse(dataStrs[idx]));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
reject(err);
|
|
60
|
+
}
|
|
61
|
+
}).finally(() => {
|
|
62
|
+
db.close();
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
export async function getPossiblePairs() {
|
|
66
|
+
const db = openDatabase(DB_PATH);
|
|
67
|
+
const result = {};
|
|
68
|
+
return new Promise((resolve, reject) => {
|
|
69
|
+
try {
|
|
70
|
+
const osTypes = Object.keys(OS_ARCH_MATRIX);
|
|
71
|
+
osTypes.forEach((os_type) => {
|
|
72
|
+
const rows = db
|
|
73
|
+
.prepare(`SELECT DISTINCT vendor, renderer FROM webgl_fingerprints WHERE ${os_type} > 0 ORDER BY ${os_type} DESC`)
|
|
74
|
+
.all();
|
|
75
|
+
result[os_type] = rows;
|
|
76
|
+
});
|
|
77
|
+
resolve(result);
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
reject(err);
|
|
81
|
+
}
|
|
82
|
+
}).finally(() => {
|
|
83
|
+
db.close();
|
|
84
|
+
});
|
|
85
|
+
}
|
package/package.json
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "arn-browser",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"author": "",
|
|
5
5
|
"license": "MPL-2.0",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
8
|
+
"bin": "dist/__main__.js",
|
|
8
9
|
"scripts": {
|
|
9
10
|
"build": "rimraf dist && tsc && npm run copy-files",
|
|
10
11
|
"test": "vitest",
|