@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,266 @@
1
+ // Runtime cache: download ShardX engine + Widevine CDM + fingerprint
2
+ // library from the ProxyShard CDN, extract into a per-user cache dir,
3
+ // place Widevine inside the engine bundle, remember etags so subsequent
4
+ // runs are zero-network. Mirrors src-tauri/src/runtime.rs in the launcher.
5
+ import { createWriteStream, existsSync, mkdirSync, readdirSync, readFileSync, renameSync, rmSync, statSync, writeFileSync, chmodSync, copyFileSync } from "node:fs";
6
+ import { homedir, platform as osPlatform, arch as osArch } from "node:os";
7
+ import { join, dirname, resolve } from "node:path";
8
+ import { pipeline } from "node:stream/promises";
9
+ import { Readable } from "node:stream";
10
+ import { spawnSync } from "node:child_process";
11
+ import AdmZip from "adm-zip";
12
+ export const PUB_BASE = "https://pub-e57a7c60f6934eb09a6600bf2fc59cdc.r2.dev";
13
+ export const CHROMIUM_VERSION = "148.0.7778.216";
14
+ export function defaultCacheDir() {
15
+ const plat = osPlatform();
16
+ if (plat === "darwin")
17
+ return join(homedir(), "Library", "Application Support", "shardx-sdk");
18
+ if (plat === "win32")
19
+ return join(process.env.LOCALAPPDATA ?? homedir(), "shardx-sdk");
20
+ return join(process.env.XDG_CACHE_HOME ?? join(homedir(), ".cache"), "shardx-sdk");
21
+ }
22
+ export function hostSpec() {
23
+ const plat = osPlatform();
24
+ const arch = osArch();
25
+ if (plat === "darwin" && arch === "arm64") {
26
+ return {
27
+ browser: { key: "ShardX-Mac-arm64.zip", label: "ShardX browser (macOS arm64)" },
28
+ widevine: { key: "ShardX-Widevine-Mac-arm64.zip", label: "Widevine CDM" },
29
+ binarySubpath: ["ShardX-Mac-arm64", "ShardX.app", "Contents", "MacOS", "ShardX"],
30
+ widevineSubpath: ["ShardX-Mac-arm64", "ShardX.app", "Contents", "Frameworks",
31
+ "ShardX Framework.framework", "Versions", CHROMIUM_VERSION,
32
+ "Libraries", "WidevineCdm"],
33
+ };
34
+ }
35
+ if (plat === "win32" && arch === "x64") {
36
+ return {
37
+ browser: { key: "ShardX-Windows.zip", label: "ShardX browser (Windows x64)" },
38
+ widevine: { key: "ShardX-Widevine-Win.zip", label: "Widevine CDM" },
39
+ binarySubpath: ["ShardX-Windows", "chrome.exe"],
40
+ widevineSubpath: ["ShardX-Windows", "WidevineCdm"],
41
+ };
42
+ }
43
+ if (plat === "linux" && arch === "x64") {
44
+ return {
45
+ browser: { key: "ShardX-Linux.zip", label: "ShardX browser (Linux x64)" },
46
+ widevine: { key: "ShardX-Widevine-Linux.zip", label: "Widevine CDM" },
47
+ binarySubpath: ["ShardX-Linux", "chrome"],
48
+ widevineSubpath: ["ShardX-Linux", "WidevineCdm"],
49
+ };
50
+ }
51
+ throw new Error(`Unsupported host: ${plat}/${arch}. ShardX ships mac-arm64, win-x64, linux-x64.`);
52
+ }
53
+ export const FINGERPRINTS_ARCHIVE = {
54
+ key: "ShardX-Fingerprints.zip",
55
+ label: "Fingerprint library",
56
+ };
57
+ const FINGERPRINTS_TOP_DIR = "shardx-fingerprints";
58
+ export class Runtime {
59
+ root;
60
+ spec;
61
+ progress;
62
+ _profilesRoot;
63
+ /** Set after a successful in-process install() so subsequent launches
64
+ * skip the R2 HEAD round-trip (~1 s over a clean connection). Cleared
65
+ * by `install({force: true})`. */
66
+ _checkedInProcess = false;
67
+ constructor(opts = {}) {
68
+ this.root = opts.cacheDir ?? defaultCacheDir();
69
+ mkdirSync(this.root, { recursive: true });
70
+ this._profilesRoot = opts.profilesDir ? resolve(opts.profilesDir) : undefined;
71
+ this.progress = opts.progress;
72
+ this.spec = hostSpec();
73
+ }
74
+ get manifestPath() { return join(this.root, "manifest.json"); }
75
+ get binaryPath() { return join(this.root, ...this.spec.binarySubpath); }
76
+ get fingerprintsDir() {
77
+ const d = join(this.root, "fingerprints");
78
+ mkdirSync(d, { recursive: true });
79
+ return d;
80
+ }
81
+ /** Per-profile user-data-dir root. Defaults to `<cacheDir>/profiles/`;
82
+ * override via `new ShardX({ profilesDir })` or per-launch
83
+ * `userDataDir`. Resolved path is logged at launch time. */
84
+ get profilesRoot() {
85
+ const d = this._profilesRoot ?? join(this.root, "profiles");
86
+ mkdirSync(d, { recursive: true });
87
+ return d;
88
+ }
89
+ get installed() { return existsSync(this.binaryPath); }
90
+ // ---- manifest ----
91
+ loadManifest() {
92
+ try {
93
+ return JSON.parse(readFileSync(this.manifestPath, "utf8"));
94
+ }
95
+ catch {
96
+ return {};
97
+ }
98
+ }
99
+ saveManifest(m) {
100
+ writeFileSync(this.manifestPath, JSON.stringify(m, null, 2));
101
+ }
102
+ // ---- install ----
103
+ async install(opts = {}) {
104
+ const force = !!opts.force;
105
+ if (this._checkedInProcess && !force)
106
+ return;
107
+ const local = this.loadManifest();
108
+ const remoteBrowser = await this.headEtag(this.spec.browser.key);
109
+ const needBrowser = force || !this.installed || local.browser_etag !== remoteBrowser;
110
+ if (needBrowser) {
111
+ const etag = await this.downloadAndExtract(this.spec.browser, this.root);
112
+ local.browser_etag = etag;
113
+ }
114
+ if (this.spec.widevine && (needBrowser || !local.widevine_etag)) {
115
+ const etag = await this.downloadAndExtract(this.spec.widevine, this.root);
116
+ this.placeWidevine();
117
+ local.widevine_etag = etag;
118
+ }
119
+ const remoteFp = await this.headEtag(FINGERPRINTS_ARCHIVE.key);
120
+ const fpDirHasJson = readdirSync(this.fingerprintsDir).some((f) => f.endsWith(".json"));
121
+ if (force || local.fingerprints_etag !== remoteFp || !fpDirHasJson) {
122
+ await this.installFingerprints(force);
123
+ if (remoteFp)
124
+ local.fingerprints_etag = remoteFp;
125
+ }
126
+ this.saveManifest(local);
127
+ if (osPlatform() !== "win32" && existsSync(this.binaryPath)) {
128
+ const m = statSync(this.binaryPath).mode;
129
+ chmodSync(this.binaryPath, m | 0o111);
130
+ }
131
+ this._checkedInProcess = true;
132
+ }
133
+ // ---- helpers ----
134
+ async headEtag(key) {
135
+ try {
136
+ const r = await fetch(`${PUB_BASE}/${key}`, { method: "HEAD" });
137
+ if (!r.ok)
138
+ return undefined;
139
+ return r.headers.get("etag")?.replace(/^"|"$/g, "") ?? undefined;
140
+ }
141
+ catch {
142
+ return undefined;
143
+ }
144
+ }
145
+ async downloadAndExtract(arch, dest) {
146
+ const url = `${PUB_BASE}/${arch.key}`;
147
+ mkdirSync(dest, { recursive: true });
148
+ const tmp = join(dest, `.${arch.key}.tmp`);
149
+ const r = await fetch(url);
150
+ if (!r.ok || !r.body)
151
+ throw new Error(`download ${arch.key}: HTTP ${r.status}`);
152
+ const etag = r.headers.get("etag")?.replace(/^"|"$/g, "") ?? "";
153
+ const total = Number(r.headers.get("content-length") ?? 0);
154
+ let received = 0;
155
+ const reader = r.body.getReader();
156
+ const out = createWriteStream(tmp);
157
+ const stream = new Readable({
158
+ async read() {
159
+ const { value, done } = await reader.read();
160
+ if (done) {
161
+ this.push(null);
162
+ return;
163
+ }
164
+ received += value.byteLength;
165
+ if (arch.label) { /* throttle: rounded percent */ }
166
+ this.push(Buffer.from(value));
167
+ },
168
+ });
169
+ // Wire progress in a parallel listener so pipeline stays clean.
170
+ if (this.progress) {
171
+ stream.on("data", () => this.progress(arch.label, received, total));
172
+ }
173
+ await pipeline(stream, out);
174
+ // Extract. IMPORTANT: on macOS/Linux shell out to the system
175
+ // `unzip` instead of adm-zip — adm-zip writes symlinks as ordinary
176
+ // text files (every `Versions/Current/...` link in a `.app`
177
+ // framework becomes a 24-byte regular file) and drops the +x bit
178
+ // on every helper executable. The result extracts cleanly but
179
+ // fails to launch — GPU helper can't find the framework dylib.
180
+ if (osPlatform() === "win32") {
181
+ new AdmZip(tmp).extractAllTo(dest, /*overwrite*/ true);
182
+ }
183
+ else {
184
+ systemUnzip(tmp, dest);
185
+ }
186
+ rmSync(tmp, { force: true });
187
+ return etag;
188
+ }
189
+ placeWidevine() {
190
+ if (!this.spec.widevine)
191
+ return;
192
+ const wrapper = this.spec.widevine.key.replace(/\.zip$/, "");
193
+ const src = join(this.root, wrapper, "WidevineCdm");
194
+ if (!existsSync(src))
195
+ return;
196
+ const dst = join(this.root, ...this.spec.widevineSubpath);
197
+ if (existsSync(dst))
198
+ rmSync(dst, { recursive: true, force: true });
199
+ mkdirSync(dirname(dst), { recursive: true });
200
+ renameSync(src, dst);
201
+ rmSync(join(this.root, wrapper), { recursive: true, force: true });
202
+ }
203
+ async installFingerprints(force) {
204
+ const url = `${PUB_BASE}/${FINGERPRINTS_ARCHIVE.key}`;
205
+ const staging = join(this.fingerprintsDir, ".staging");
206
+ if (existsSync(staging))
207
+ rmSync(staging, { recursive: true, force: true });
208
+ mkdirSync(staging, { recursive: true });
209
+ const tmp = join(staging, "bundle.zip");
210
+ const r = await fetch(url);
211
+ if (!r.ok || !r.body)
212
+ throw new Error(`download fingerprints: HTTP ${r.status}`);
213
+ const total = Number(r.headers.get("content-length") ?? 0);
214
+ let received = 0;
215
+ const reader = r.body.getReader();
216
+ const out = createWriteStream(tmp);
217
+ const stream = new Readable({
218
+ async read() {
219
+ const { value, done } = await reader.read();
220
+ if (done) {
221
+ this.push(null);
222
+ return;
223
+ }
224
+ received += value.byteLength;
225
+ this.push(Buffer.from(value));
226
+ },
227
+ });
228
+ if (this.progress) {
229
+ stream.on("data", () => this.progress(FINGERPRINTS_ARCHIVE.label, received, total));
230
+ }
231
+ await pipeline(stream, out);
232
+ // Fingerprints bundle is plain JSON files — adm-zip is fine here
233
+ // (no symlinks / exec bits to preserve).
234
+ new AdmZip(tmp).extractAllTo(staging, true);
235
+ const srcDir = join(staging, FINGERPRINTS_TOP_DIR);
236
+ const walk = existsSync(srcDir) ? srcDir : staging;
237
+ for (const name of readdirSync(walk)) {
238
+ if (!name.endsWith(".json"))
239
+ continue;
240
+ const dst = join(this.fingerprintsDir, name);
241
+ if (force || !existsSync(dst))
242
+ copyFileSync(join(walk, name), dst);
243
+ }
244
+ rmSync(staging, { recursive: true, force: true });
245
+ }
246
+ }
247
+ /** Extract via /usr/bin/unzip — preserves symlinks and permission
248
+ * bits that adm-zip silently drops. Required for any macOS .app
249
+ * bundle (Versions/Current symlinks + Helper exec bits). */
250
+ function systemUnzip(archive, dest) {
251
+ mkdirSync(dest, { recursive: true });
252
+ const r = spawnSync("unzip", ["-q", "-o", archive, "-d", dest], {
253
+ stdio: ["ignore", "ignore", "pipe"],
254
+ });
255
+ if (r.error) {
256
+ if (r.error.code === "ENOENT") {
257
+ throw new Error("system `unzip` not found — required for symlink-preserving extraction on macOS / Linux");
258
+ }
259
+ throw r.error;
260
+ }
261
+ if (r.status !== 0) {
262
+ const err = r.stderr?.toString().slice(0, 400) ?? `exit ${r.status}`;
263
+ throw new Error(`unzip failed for ${archive}: ${err}`);
264
+ }
265
+ }
266
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export type ScreenStrategy = "profile" | "cap_to_host" | "use_host";
2
+ export declare function applyScreenStrategy(cfg: Record<string, unknown>, mode: ScreenStrategy | string): void;
3
+ /** Map `navigator.platform` → the launcher's default screen mode. */
4
+ export declare function defaultScreenModeFor(platform: string): ScreenStrategy;
5
+ //# sourceMappingURL=screen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen.d.ts","sourceRoot":"","sources":["../src/screen.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,aAAa,GAAG,UAAU,CAAC;AAEpE,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,cAAc,GAAG,MAAM,GAAG,IAAI,CAOrG;AAuDD,qEAAqE;AACrE,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAIrE"}
package/dist/screen.js ADDED
@@ -0,0 +1,82 @@
1
+ // Screen strategies — three modes that match what the launcher does in
2
+ // `clamp_screen_to_real_display` (`src-tauri/src/lib.rs`):
3
+ //
4
+ // "profile" — keep whatever the fingerprint claims.
5
+ // "cap_to_host" — macOS default. Scale screen/window down if host is
6
+ // smaller than the FP claim; no-op otherwise.
7
+ // "use_host" — Win/Linux default. Overwrite screen/window with the
8
+ // host display, subtract a taskbar inset for avail_h.
9
+ //
10
+ // All modes leave DPR / color_depth / orientation / etc. untouched.
11
+ import { platform as osPlatform } from "node:os";
12
+ import { hostScreenSize } from "./host.js";
13
+ export function applyScreenStrategy(cfg, mode) {
14
+ if (mode === "profile")
15
+ return;
16
+ const host = hostScreenSize();
17
+ if (!host)
18
+ return;
19
+ const [hw, hh] = host;
20
+ if (mode === "cap_to_host")
21
+ capToHost(cfg, hw, hh);
22
+ else if (mode === "use_host")
23
+ useHost(cfg, hw, hh);
24
+ }
25
+ function asInt(v) {
26
+ const n = typeof v === "number" ? v : Number(v);
27
+ return Number.isFinite(n) ? Math.floor(n) : 0;
28
+ }
29
+ function capToHost(cfg, hw, hh) {
30
+ const scr = cfg["screen"];
31
+ if (!scr || typeof scr !== "object")
32
+ return;
33
+ const fpW = asInt(scr["width"]);
34
+ const fpH = asInt(scr["height"]);
35
+ if (fpW <= 0 || fpH <= 0)
36
+ return;
37
+ if (hw >= fpW && hh >= fpH)
38
+ return;
39
+ const ratio = Math.min(hw / fpW, hh / fpH);
40
+ const newW = Math.max(1, Math.round(fpW * ratio));
41
+ const newH = Math.max(1, Math.round(fpH * ratio));
42
+ const fpAw = asInt(scr["avail_width"]) || fpW;
43
+ const fpAh = asInt(scr["avail_height"]) || fpH;
44
+ const newAw = Math.max(1, Math.round(fpAw * ratio));
45
+ const newAh = Math.max(1, Math.round(fpAh * ratio));
46
+ scr["width"] = newW;
47
+ scr["height"] = newH;
48
+ scr["avail_width"] = newAw;
49
+ scr["avail_height"] = newAh;
50
+ const win = cfg["window"];
51
+ if (win && typeof win === "object") {
52
+ for (const k of ["outer_width", "inner_width", "outer_height", "inner_height"]) {
53
+ const v = asInt(win[k]);
54
+ if (v > 0)
55
+ win[k] = Math.max(1, Math.round(v * ratio));
56
+ }
57
+ }
58
+ }
59
+ function useHost(cfg, hw, hh) {
60
+ const taskbar = osPlatform() === "win32" ? 40 : 0;
61
+ const availW = hw;
62
+ const availH = Math.max(1, hh - taskbar);
63
+ const scr = (cfg["screen"] ??= {});
64
+ scr["width"] = hw;
65
+ scr["height"] = hh;
66
+ scr["avail_width"] = availW;
67
+ scr["avail_height"] = availH;
68
+ const win = (cfg["window"] ??= {});
69
+ win["outer_width"] = availW;
70
+ win["outer_height"] = Math.max(1, availH - 1);
71
+ win["inner_width"] = availW;
72
+ win["inner_height"] = Math.max(1, availH - 88);
73
+ }
74
+ /** Map `navigator.platform` → the launcher's default screen mode. */
75
+ export function defaultScreenModeFor(platform) {
76
+ if (platform === "macOS")
77
+ return "cap_to_host";
78
+ if (platform === "Windows" || platform === "Linux")
79
+ return "use_host";
80
+ return "profile";
81
+ }
82
+ //# sourceMappingURL=screen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen.js","sourceRoot":"","sources":["../src/screen.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "@proxyshard/shardx",
3
+ "version": "0.1.1",
4
+ "description": "Self-contained Node SDK for the ShardX anti-detect browser — downloads the engine + Widevine + fingerprint library on first use, launches isolated profiles.",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "module": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "default": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "README.md"
18
+ ],
19
+ "scripts": {
20
+ "build": "tsc",
21
+ "prepublishOnly": "npm run build"
22
+ },
23
+ "engines": {
24
+ "node": ">=18"
25
+ },
26
+ "keywords": [
27
+ "anti-detect",
28
+ "browser",
29
+ "fingerprint",
30
+ "chromium",
31
+ "scraping",
32
+ "multi-accounting",
33
+ "automation",
34
+ "playwright",
35
+ "cdp"
36
+ ],
37
+ "author": "ProxyShard",
38
+ "license": "MIT",
39
+ "homepage": "https://github.com/ProxyShard/ShardBrowser",
40
+ "repository": {
41
+ "type": "git",
42
+ "url": "git+https://github.com/ProxyShard/ShardBrowser.git",
43
+ "directory": "sdks/node"
44
+ },
45
+ "bugs": "https://github.com/ProxyShard/ShardBrowser/issues",
46
+ "publishConfig": {
47
+ "access": "public"
48
+ },
49
+ "dependencies": {
50
+ "adm-zip": "^0.5.16",
51
+ "patchright": "^1.49.0",
52
+ "socks-proxy-agent": "^8.0.4",
53
+ "undici": "^6.19.0"
54
+ },
55
+ "devDependencies": {
56
+ "@types/adm-zip": "^0.5.7",
57
+ "@types/node": "^20",
58
+ "typescript": "^5.4"
59
+ }
60
+ }