@proxyshard/shardx 0.1.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.
@@ -0,0 +1,89 @@
1
+ // Profile = a fingerprint JSON + a per-launch working dir. Wraps the
2
+ // bundled fingerprint library and lets callers override fields before
3
+ // launch.
4
+ import { existsSync, mkdirSync, readdirSync, readFileSync } from "node:fs";
5
+ import { join } from "node:path";
6
+ export class Profile {
7
+ id;
8
+ config;
9
+ constructor(config, id) {
10
+ this.config = JSON.parse(JSON.stringify(config)); // deep clone
11
+ this.id = id ?? config["name"] ?? "anonymous";
12
+ }
13
+ static fromFile(path) {
14
+ const cfg = JSON.parse(readFileSync(path, "utf8"));
15
+ const id = path.split(/[\\/]/).pop().replace(/\.json$/, "");
16
+ return new Profile(cfg, id);
17
+ }
18
+ /** Shallow merge: object values are merged one level deep, scalars replaced. */
19
+ withOverride(overrides) {
20
+ const out = JSON.parse(JSON.stringify(this.config));
21
+ for (const [k, v] of Object.entries(overrides)) {
22
+ if (v && typeof v === "object" && !Array.isArray(v)
23
+ && out[k] && typeof out[k] === "object" && !Array.isArray(out[k])) {
24
+ out[k] = { ...out[k], ...v };
25
+ }
26
+ else {
27
+ out[k] = v;
28
+ }
29
+ }
30
+ return new Profile(out, overrides["name"] ?? this.id);
31
+ }
32
+ get platform() {
33
+ const nav = this.config["navigator"];
34
+ return nav?.["platform"] ?? "";
35
+ }
36
+ get hasWebGPU() {
37
+ const wgp = this.config["webgpu"];
38
+ if (!wgp)
39
+ return false;
40
+ const limits = wgp["limits"];
41
+ return !!(limits && typeof limits === "object" && Object.keys(limits).length > 0);
42
+ }
43
+ }
44
+ export class FingerprintLibrary {
45
+ runtime;
46
+ constructor(runtime) {
47
+ this.runtime = runtime;
48
+ }
49
+ ids() {
50
+ return readdirSync(this.runtime.fingerprintsDir)
51
+ .filter((f) => f.endsWith(".json"))
52
+ .map((f) => f.replace(/\.json$/, ""))
53
+ .sort();
54
+ }
55
+ *filter(opts = {}) {
56
+ for (const id of this.ids()) {
57
+ if (opts.platform) {
58
+ try {
59
+ const p = this.load(id);
60
+ if (!p.platform.toLowerCase().includes(opts.platform.toLowerCase()))
61
+ continue;
62
+ }
63
+ catch {
64
+ continue;
65
+ }
66
+ }
67
+ yield id;
68
+ }
69
+ }
70
+ load(fingerprintId) {
71
+ const path = join(this.runtime.fingerprintsDir, `${fingerprintId}.json`);
72
+ if (!existsSync(path)) {
73
+ const sample = this.ids().slice(0, 10).join(", ");
74
+ throw new Error(`Fingerprint '${fingerprintId}' not found. Available: ${sample}…`);
75
+ }
76
+ return Profile.fromFile(path);
77
+ }
78
+ }
79
+ /** Per-profile state (cookies / IndexedDB / cache) — preserved across
80
+ * launches. Defaults to `./shardx-profiles/<id>/` next to the running
81
+ * script. Override per launch with `userDataDir` or per SDK with
82
+ * `new ShardX({ profilesDir })`. */
83
+ export function userDataDir(runtime, profileId, base) {
84
+ const root = base ?? runtime.profilesRoot;
85
+ const d = join(root, profileId);
86
+ mkdirSync(d, { recursive: true });
87
+ return d;
88
+ }
89
+ //# sourceMappingURL=profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.js","sourceRoot":"","sources":["../src/profile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ export interface ParsedProxy {
2
+ scheme: "socks5" | "http" | "https";
3
+ host: string;
4
+ port: number;
5
+ username?: string;
6
+ password?: string;
7
+ }
8
+ export declare function parseProxy(url: string): ParsedProxy;
9
+ /** Format as the ShardX engine's `--proxy-server` argument. Includes
10
+ * URL-encoded `user:pass@` when present — the ShardX fork honours
11
+ * inline credentials in `--proxy-server` (stock Chromium does not)
12
+ * so this is the only mechanism the SDK needs to authenticate
13
+ * SOCKS5 / HTTP-proxy traffic. Mirrors the launcher's Rust
14
+ * `ProxyEntry::to_proxy_server_arg` exactly. */
15
+ export declare function proxyToArg(p: ParsedProxy): string;
16
+ /** Return UDP RTT (ms) through the SOCKS5 relay, or null if unavailable. */
17
+ export declare function probeUdp(p: ParsedProxy, timeoutMs?: number): Promise<number | null>;
18
+ //# sourceMappingURL=proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAiBA,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAgBnD;AAED;;;;;iDAKiD;AACjD,wBAAgB,UAAU,CAAC,CAAC,EAAE,WAAW,GAAG,MAAM,CAQjD;AAED,4EAA4E;AAC5E,wBAAsB,QAAQ,CAAC,CAAC,EAAE,WAAW,EAAE,SAAS,SAAO,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAkIvF"}
package/dist/proxy.js ADDED
@@ -0,0 +1,212 @@
1
+ // Proxy URL parsing + SOCKS5 UDP_ASSOCIATE probe. Mirrors the launcher's
2
+ // pre-launch UDP check that gates whether to enable QUIC and which
3
+ // WebRTC policy to apply.
4
+ import { createConnection } from "node:net";
5
+ import { createSocket } from "node:dgram";
6
+ import { randomBytes } from "node:crypto";
7
+ // Cloudflare anycast + Google + Nextcloud — IP literals so the relay
8
+ // doesn't have to resolve a hostname. We try them in order and take
9
+ // the first STUN Binding Success Response that comes back.
10
+ const STUN_TARGETS = [
11
+ ["162.159.207.55", 3478], // stun.cloudflare.com
12
+ ["74.125.250.129", 19302], // one of stun.l.google.com
13
+ ["18.197.99.114", 3478], // stun.nextcloud.com
14
+ ];
15
+ const STUN_MAGIC = Buffer.from([0x21, 0x12, 0xa4, 0x42]);
16
+ export function parseProxy(url) {
17
+ const u = new URL(url);
18
+ const scheme = (u.protocol.replace(":", "") || "socks5").toLowerCase();
19
+ if (scheme !== "socks5" && scheme !== "http" && scheme !== "https") {
20
+ throw new Error(`Unsupported proxy scheme: ${scheme}`);
21
+ }
22
+ if (!u.hostname || !u.port) {
23
+ throw new Error(`Proxy URL must include host and port: ${url}`);
24
+ }
25
+ return {
26
+ scheme: scheme,
27
+ host: u.hostname,
28
+ port: Number(u.port),
29
+ username: u.username ? decodeURIComponent(u.username) : undefined,
30
+ password: u.password ? decodeURIComponent(u.password) : undefined,
31
+ };
32
+ }
33
+ /** Format as the ShardX engine's `--proxy-server` argument. Includes
34
+ * URL-encoded `user:pass@` when present — the ShardX fork honours
35
+ * inline credentials in `--proxy-server` (stock Chromium does not)
36
+ * so this is the only mechanism the SDK needs to authenticate
37
+ * SOCKS5 / HTTP-proxy traffic. Mirrors the launcher's Rust
38
+ * `ProxyEntry::to_proxy_server_arg` exactly. */
39
+ export function proxyToArg(p) {
40
+ const hostPort = `${p.host}:${p.port}`;
41
+ if (p.username || p.password) {
42
+ const u = encodeURIComponent(p.username ?? "");
43
+ const pw = encodeURIComponent(p.password ?? "");
44
+ return `${p.scheme}://${u}:${pw}@${hostPort}`;
45
+ }
46
+ return `${p.scheme}://${hostPort}`;
47
+ }
48
+ /** Return UDP RTT (ms) through the SOCKS5 relay, or null if unavailable. */
49
+ export async function probeUdp(p, timeoutMs = 6000) {
50
+ if (p.scheme !== "socks5")
51
+ return null;
52
+ const started = Date.now();
53
+ return await new Promise((resolve) => {
54
+ let tcp = null;
55
+ let finished = false;
56
+ const done = (val) => {
57
+ if (finished)
58
+ return;
59
+ finished = true;
60
+ try {
61
+ tcp?.destroy();
62
+ }
63
+ catch { /* ignore */ }
64
+ resolve(val);
65
+ };
66
+ const overall = setTimeout(() => done(null), timeoutMs);
67
+ tcp = createConnection({ host: p.host, port: p.port }, () => {
68
+ // Greet: ver=5, nmethods=2, methods=[0x00 no-auth, 0x02 user/pass]
69
+ tcp.write(Buffer.from([0x05, 0x02, 0x00, 0x02]));
70
+ });
71
+ tcp.setTimeout(timeoutMs);
72
+ tcp.on("timeout", () => done(null));
73
+ tcp.on("error", () => done(null));
74
+ let state = "greet";
75
+ let buf = Buffer.alloc(0);
76
+ tcp.on("data", async (chunk) => {
77
+ buf = Buffer.concat([buf, chunk]);
78
+ if (state === "greet" && buf.length >= 2) {
79
+ const method = buf[1];
80
+ buf = buf.subarray(2);
81
+ if (method === 0x02) {
82
+ if (!p.username || !p.password)
83
+ return done(null);
84
+ const u = Buffer.from(p.username);
85
+ const pw = Buffer.from(p.password);
86
+ tcp.write(Buffer.concat([
87
+ Buffer.from([0x01, u.length]), u,
88
+ Buffer.from([pw.length]), pw,
89
+ ]));
90
+ state = "auth";
91
+ }
92
+ else if (method === 0x00) {
93
+ tcp.write(Buffer.from([0x05, 0x03, 0x00, 0x01, 0, 0, 0, 0, 0, 0]));
94
+ state = "assoc";
95
+ }
96
+ else {
97
+ return done(null);
98
+ }
99
+ }
100
+ if (state === "auth" && buf.length >= 2) {
101
+ if (buf[1] !== 0x00)
102
+ return done(null);
103
+ buf = buf.subarray(2);
104
+ tcp.write(Buffer.from([0x05, 0x03, 0x00, 0x01, 0, 0, 0, 0, 0, 0]));
105
+ state = "assoc";
106
+ }
107
+ if (state === "assoc" && buf.length >= 10) {
108
+ if (buf[1] !== 0x00)
109
+ return done(null);
110
+ const atyp = buf[3];
111
+ let relayHost;
112
+ let relayPort;
113
+ if (atyp === 0x01) {
114
+ relayHost = `${buf[4]}.${buf[5]}.${buf[6]}.${buf[7]}`;
115
+ relayPort = buf.readUInt16BE(8);
116
+ }
117
+ else if (atyp === 0x04 && buf.length >= 22) {
118
+ relayHost = Array.from(buf.subarray(4, 20))
119
+ .map((b) => b.toString(16).padStart(2, "0"))
120
+ .reduce((acc, h, i) => acc + (i > 0 && i % 2 === 0 ? ":" : "") + h, "");
121
+ relayPort = buf.readUInt16BE(20);
122
+ }
123
+ else {
124
+ return done(null);
125
+ }
126
+ if (relayHost === "0.0.0.0" || relayHost === "::")
127
+ relayHost = p.host;
128
+ // Send a wrapped STUN Binding Request (RFC 5389) through the relay
129
+ // to a public STUN server. Same UDP shape WebRTC actually uses.
130
+ const udp = createSocket("udp4");
131
+ let stunIdx = 0;
132
+ let currentTxn = Buffer.alloc(0);
133
+ const udpTimer = setTimeout(() => { try {
134
+ udp.close();
135
+ }
136
+ catch { } done(null); }, timeoutMs);
137
+ const sendNextStun = () => {
138
+ if (stunIdx >= STUN_TARGETS.length) {
139
+ clearTimeout(udpTimer);
140
+ try {
141
+ udp.close();
142
+ }
143
+ catch { }
144
+ done(null);
145
+ return;
146
+ }
147
+ const [stunIp, stunPort] = STUN_TARGETS[stunIdx++];
148
+ currentTxn = randomBytes(12);
149
+ const stunReq = Buffer.concat([
150
+ Buffer.from([0x00, 0x01, 0x00, 0x00]), // type=Binding Request, length=0
151
+ STUN_MAGIC,
152
+ currentTxn,
153
+ ]);
154
+ const ipParts = stunIp.split(".").map(Number);
155
+ const portBuf = Buffer.alloc(2);
156
+ portBuf.writeUInt16BE(stunPort, 0);
157
+ const wrap = Buffer.concat([
158
+ Buffer.from([0x00, 0x00, 0x00, 0x01, ...ipParts]), // RSV(2) FRAG(1) ATYP=IPv4
159
+ portBuf,
160
+ stunReq,
161
+ ]);
162
+ udp.send(wrap, relayPort, relayHost, (err) => {
163
+ if (err) {
164
+ clearTimeout(udpTimer);
165
+ try {
166
+ udp.close();
167
+ }
168
+ catch { }
169
+ done(null);
170
+ }
171
+ });
172
+ };
173
+ udp.on("error", () => { clearTimeout(udpTimer); try {
174
+ udp.close();
175
+ }
176
+ catch { } done(null); });
177
+ udp.on("message", (msg) => {
178
+ // SOCKS5 UDP wrapper: RSV(2)=0 FRAG(1)=0 ATYP + addr + port + payload.
179
+ if (msg.length < 10 || msg[0] !== 0 || msg[1] !== 0 || msg[2] !== 0) {
180
+ sendNextStun();
181
+ return;
182
+ }
183
+ const atyp2 = msg[3];
184
+ const offset = atyp2 === 0x01 ? 10 : atyp2 === 0x04 ? 22 : -1;
185
+ if (offset < 0 || msg.length < offset + 20) {
186
+ sendNextStun();
187
+ return;
188
+ }
189
+ const stunResp = msg.subarray(offset);
190
+ // Binding Success Response (0x0101) + matching magic + txn.
191
+ if (stunResp[0] === 0x01 && stunResp[1] === 0x01
192
+ && stunResp.subarray(4, 8).equals(STUN_MAGIC)
193
+ && stunResp.subarray(8, 20).equals(currentTxn)) {
194
+ clearTimeout(udpTimer);
195
+ clearTimeout(overall);
196
+ try {
197
+ udp.close();
198
+ }
199
+ catch { }
200
+ done(Date.now() - started);
201
+ }
202
+ else {
203
+ sendNextStun();
204
+ }
205
+ });
206
+ sendNextStun();
207
+ }
208
+ });
209
+ tcp.on("close", () => done(null));
210
+ }).finally(() => { });
211
+ }
212
+ //# sourceMappingURL=proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export declare const MACOS_PLATFORM_VERSIONS: readonly string[];
2
+ export declare const WINDOWS_PLATFORM_VERSIONS: readonly string[];
3
+ export declare const LINUX_PLATFORM_VERSIONS: readonly string[];
4
+ type HwPair = readonly [cores: number, gib: number];
5
+ export declare const MAC_HW_CONFIGS: Readonly<Record<string, readonly HwPair[]>>;
6
+ /** Real x86 logical-core counts (SMT + Intel hybrid). Same array as lib.rs. */
7
+ export declare const X86_CORES: readonly number[];
8
+ /** Mutates in-place: pick fresh `navigator.platform_version` (+ mirror to client_hints). */
9
+ export declare function randomizePlatformVersion(cfg: Record<string, unknown>): void;
10
+ /**
11
+ * Mutates in-place: pick fresh (hardware_concurrency, device_memory).
12
+ *
13
+ * macOS: curated MAC_HW_CONFIGS table by profile id.
14
+ * Windows / Linux: bracket the host CPU count within [C-4, C+2] from
15
+ * X86_CORES; floor device_memory by core count (>=12 → 16, else 8) and
16
+ * cap by `hostRamBucketGb()`.
17
+ */
18
+ export declare function randomizeHardware(cfg: Record<string, unknown>, profileId?: string): void;
19
+ export {};
20
+ //# sourceMappingURL=randomize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"randomize.d.ts","sourceRoot":"","sources":["../src/randomize.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,uBAAuB,EAAE,SAAS,MAAM,EAIpD,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EAOtD,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,SAAS,MAAM,EAIpD,CAAC;AAEF,KAAK,MAAM,GAAG,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;AAEpD,eAAO,MAAM,cAAc,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAgCtE,CAAC;AAEF,+EAA+E;AAC/E,eAAO,MAAM,SAAS,EAAE,SAAS,MAAM,EAAsC,CAAC;AAW9E,4FAA4F;AAC5F,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAY3E;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CA6BxF"}
@@ -0,0 +1,123 @@
1
+ // Per-launch randomisation of hardware_concurrency / device_memory /
2
+ // platform_version. Mirrors `randomize_hardware` and
3
+ // `randomize_platform_version` in `src-tauri/src/lib.rs`.
4
+ //
5
+ // Mac profiles use the curated MAC_HW_CONFIGS table. Windows / Linux
6
+ // profiles use the launcher's host-bracketed logic: real x86 logical-core
7
+ // counts filtered to [host_cores-4, host_cores+2], device_memory floored
8
+ // by core count and ceilinged by hostRamBucketGb().
9
+ import { hostLogicalCores, hostRamBucketGb } from "./host.js";
10
+ export const MACOS_PLATFORM_VERSIONS = [
11
+ "14.6.1", "14.7", "14.7.1", "14.7.2",
12
+ "15.4", "15.4.1", "15.5", "15.6", "15.6.1", "15.7",
13
+ "26.0", "26.0.1", "26.1",
14
+ ];
15
+ export const WINDOWS_PLATFORM_VERSIONS = [
16
+ "10.0.0",
17
+ "13.0.0",
18
+ "14.0.0", "14.0.0", "14.0.0",
19
+ "15.0.0", "15.0.0", "15.0.0", "15.0.0",
20
+ "16.0.0", "16.0.0", "16.0.0",
21
+ "17.0.0",
22
+ ];
23
+ export const LINUX_PLATFORM_VERSIONS = [
24
+ "5.15.0", "6.1.0", "6.5.0",
25
+ "6.6.0", "6.8.0", "6.10.0", "6.11.0", "6.12.0",
26
+ "6.14.0", "6.15.0", "6.16.0",
27
+ ];
28
+ export const MAC_HW_CONFIGS = {
29
+ "mac-m1-air13": [[8, 8], [8, 16]],
30
+ "mac-m1-mbp13": [[8, 8], [8, 16]],
31
+ "mac-m1-imac24": [[8, 8], [8, 16]],
32
+ "mac-m1-pro-mbp14": [[8, 16], [10, 16], [10, 32]],
33
+ "mac-m1-pro-mbp16": [[8, 16], [10, 16], [10, 32]],
34
+ "mac-m1-max-mbp14": [[10, 32]],
35
+ "mac-m1-max-mbp16": [[10, 32]],
36
+ "mac-m2-air13": [[8, 8], [8, 16]],
37
+ "mac-m2-air15": [[8, 8], [8, 16]],
38
+ "mac-m2-mbp13": [[8, 8], [8, 16]],
39
+ "mac-m2-pro-mbp14": [[10, 16], [12, 16], [12, 32]],
40
+ "mac-m2-pro-mbp16": [[10, 16], [12, 16], [12, 32]],
41
+ "mac-m2-max-mbp14": [[12, 32]],
42
+ "mac-m2-max-mbp16": [[12, 32]],
43
+ "mac-m3-air13": [[8, 8], [8, 16]],
44
+ "mac-m3-air15": [[8, 8], [8, 16]],
45
+ "mac-m3-mbp14": [[8, 8], [8, 16]],
46
+ "mac-m3-imac24": [[8, 8], [8, 16]],
47
+ "mac-m3-pro-mbp14": [[11, 16], [12, 16], [12, 32]],
48
+ "mac-m3-pro-mbp16": [[11, 16], [12, 16], [12, 32]],
49
+ "mac-m3-max-mbp14": [[14, 32], [16, 32]],
50
+ "mac-m3-max-mbp16": [[14, 32], [16, 32]],
51
+ "mac-m4-air13": [[10, 16], [10, 32]],
52
+ "mac-m4-air15": [[10, 16], [10, 32]],
53
+ "mac-m4-mbp14": [[10, 16], [10, 32]],
54
+ "mac-m4-imac24": [[10, 16], [10, 32]],
55
+ "mac-m4-pro-mbp14": [[12, 16], [14, 16], [14, 32]],
56
+ "mac-m4-pro-mbp16": [[12, 16], [14, 16], [14, 32]],
57
+ "mac-m4-max-mbp14": [[14, 32], [16, 32]],
58
+ "mac-m4-max-mbp16": [[14, 32], [16, 32]],
59
+ "mac-m5-mbp14": [[10, 16], [10, 32]],
60
+ };
61
+ /** Real x86 logical-core counts (SMT + Intel hybrid). Same array as lib.rs. */
62
+ export const X86_CORES = [4, 6, 8, 12, 16, 20, 24, 28, 32];
63
+ function pickRandom(pool) {
64
+ return pool[Math.floor(Math.random() * pool.length)];
65
+ }
66
+ function platformOf(cfg) {
67
+ const nav = cfg["navigator"];
68
+ return nav?.["platform"] ?? "";
69
+ }
70
+ /** Mutates in-place: pick fresh `navigator.platform_version` (+ mirror to client_hints). */
71
+ export function randomizePlatformVersion(cfg) {
72
+ const plat = platformOf(cfg);
73
+ const pool = plat === "macOS" ? MACOS_PLATFORM_VERSIONS :
74
+ plat === "Windows" ? WINDOWS_PLATFORM_VERSIONS :
75
+ plat === "Linux" ? LINUX_PLATFORM_VERSIONS : null;
76
+ if (!pool)
77
+ return;
78
+ const v = pickRandom(pool);
79
+ const nav = (cfg["navigator"] ??= {});
80
+ nav["platform_version"] = v;
81
+ const ch = cfg["client_hints"];
82
+ if (ch && typeof ch === "object")
83
+ ch["platform_version"] = v;
84
+ }
85
+ /**
86
+ * Mutates in-place: pick fresh (hardware_concurrency, device_memory).
87
+ *
88
+ * macOS: curated MAC_HW_CONFIGS table by profile id.
89
+ * Windows / Linux: bracket the host CPU count within [C-4, C+2] from
90
+ * X86_CORES; floor device_memory by core count (>=12 → 16, else 8) and
91
+ * cap by `hostRamBucketGb()`.
92
+ */
93
+ export function randomizeHardware(cfg, profileId) {
94
+ const plat = platformOf(cfg);
95
+ let cores;
96
+ let mem;
97
+ if (plat === "macOS" && profileId && profileId in MAC_HW_CONFIGS) {
98
+ [cores, mem] = pickRandom(MAC_HW_CONFIGS[profileId]);
99
+ }
100
+ else if (plat === "Windows" || plat === "Linux") {
101
+ const c = hostLogicalCores();
102
+ const lo = Math.max(0, c - 4);
103
+ const hi = c + 2;
104
+ const candidates = X86_CORES.filter((n) => n >= lo && n <= hi);
105
+ if (candidates.length > 0) {
106
+ cores = pickRandom(candidates);
107
+ }
108
+ else {
109
+ cores = X86_CORES.reduce((best, n) => Math.abs(n - c) < Math.abs(best - c) ? n : best, X86_CORES[0]);
110
+ }
111
+ const real = hostRamBucketGb();
112
+ const floor = cores >= 12 ? 16 : 8;
113
+ const memCand = [8, 16, 32].filter((m) => m >= floor && m <= real);
114
+ mem = memCand.length > 0 ? pickRandom(memCand) : real;
115
+ }
116
+ else {
117
+ return;
118
+ }
119
+ const nav = (cfg["navigator"] ??= {});
120
+ nav["hardware_concurrency"] = cores;
121
+ nav["device_memory"] = mem;
122
+ }
123
+ //# sourceMappingURL=randomize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"randomize.js","sourceRoot":"","sources":["../src/randomize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ export declare const PUB_BASE = "https://pub-e57a7c60f6934eb09a6600bf2fc59cdc.r2.dev";
2
+ export declare const CHROMIUM_VERSION = "148.0.7778.216";
3
+ export declare function defaultCacheDir(): string;
4
+ export interface Archive {
5
+ key: string;
6
+ label: string;
7
+ }
8
+ export interface HostSpec {
9
+ browser: Archive;
10
+ widevine: Archive | null;
11
+ binarySubpath: string[];
12
+ widevineSubpath: string[];
13
+ }
14
+ export declare function hostSpec(): HostSpec;
15
+ export declare const FINGERPRINTS_ARCHIVE: Archive;
16
+ export type ProgressCb = (label: string, received: number, total: number) => void;
17
+ export declare class Runtime {
18
+ readonly root: string;
19
+ readonly spec: HostSpec;
20
+ private readonly progress?;
21
+ private readonly _profilesRoot?;
22
+ /** Set after a successful in-process install() so subsequent launches
23
+ * skip the R2 HEAD round-trip (~1 s over a clean connection). Cleared
24
+ * by `install({force: true})`. */
25
+ private _checkedInProcess;
26
+ constructor(opts?: {
27
+ cacheDir?: string;
28
+ progress?: ProgressCb;
29
+ profilesDir?: string;
30
+ });
31
+ get manifestPath(): string;
32
+ get binaryPath(): string;
33
+ get fingerprintsDir(): string;
34
+ /** Per-profile user-data-dir root. Defaults to `<cacheDir>/profiles/`;
35
+ * override via `new ShardX({ profilesDir })` or per-launch
36
+ * `userDataDir`. Resolved path is logged at launch time. */
37
+ get profilesRoot(): string;
38
+ get installed(): boolean;
39
+ private loadManifest;
40
+ private saveManifest;
41
+ install(opts?: {
42
+ force?: boolean;
43
+ }): Promise<void>;
44
+ private headEtag;
45
+ private downloadAndExtract;
46
+ private placeWidevine;
47
+ private installFingerprints;
48
+ }
49
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,QAAQ,wDAAwD,CAAC;AAC9E,eAAO,MAAM,gBAAgB,mBAAmB,CAAC;AAEjD,wBAAgB,eAAe,IAAI,MAAM,CAKxC;AAED,MAAM,WAAW,OAAO;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;CAAE;AAExD,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,wBAAgB,QAAQ,IAAI,QAAQ,CA8BnC;AAED,eAAO,MAAM,oBAAoB,EAAE,OAGlC,CAAC;AAGF,MAAM,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;AAQlF,qBAAa,OAAO;IAClB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAa;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAS;IACxC;;uCAEmC;IACnC,OAAO,CAAC,iBAAiB,CAAS;gBAEtB,IAAI,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,UAAU,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO;IAQzF,IAAI,YAAY,IAAI,MAAM,CAA8C;IACxE,IAAI,UAAU,IAAI,MAAM,CAA2D;IACnF,IAAI,eAAe,IAAI,MAAM,CAI5B;IACD;;iEAE6D;IAC7D,IAAI,YAAY,IAAI,MAAM,CAIzB;IACD,IAAI,SAAS,IAAI,OAAO,CAA2C;IAInE,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,YAAY;IAMd,OAAO,CAAC,IAAI,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,IAAI,CAAC;YAiC9C,QAAQ;YAQR,kBAAkB;IA2ChC,OAAO,CAAC,aAAa;YAYP,mBAAmB;CAwClC"}