brave-real-launcher 1.2.31 → 1.2.33

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,323 @@
1
+ /**
2
+ * @license Copyright 2024 Brave Real Launcher Contributors.
3
+ * Licensed under the Apache License, Version 2.0
4
+ *
5
+ * Brave Browser Installer
6
+ * Auto-installs Brave browser on Windows, Linux, and macOS
7
+ */
8
+ 'use strict';
9
+ import * as fs from 'fs';
10
+ import * as path from 'path';
11
+ import * as https from 'https';
12
+ import * as http from 'http';
13
+ import { execSync } from 'child_process';
14
+ import { homedir } from 'os';
15
+ import log from './logger.mjs';
16
+ import { getPlatform } from './utils.mjs';
17
+ const BRAVE_DOWNLOAD_URLS = {
18
+ win32: {
19
+ release: 'https://laptop-updates.brave.com/latest/winx64',
20
+ beta: 'https://laptop-updates.brave.com/latest/winx64-beta',
21
+ nightly: 'https://laptop-updates.brave.com/latest/winx64-nightly'
22
+ },
23
+ darwin: {
24
+ release: 'https://laptop-updates.brave.com/latest/osx',
25
+ beta: 'https://laptop-updates.brave.com/latest/osx-beta',
26
+ nightly: 'https://laptop-updates.brave.com/latest/osx-nightly'
27
+ }
28
+ };
29
+ export class BraveInstaller {
30
+ constructor(options = {}) {
31
+ this.silent = options.silent || false;
32
+ this.downloadDir = options.downloadDir || path.join(homedir(), '.brave-real-launcher', 'downloads');
33
+ this.channel = options.channel || 'release';
34
+ if (!fs.existsSync(this.downloadDir)) {
35
+ fs.mkdirSync(this.downloadDir, { recursive: true });
36
+ }
37
+ }
38
+ /**
39
+ * Install Brave browser on the current platform
40
+ */
41
+ async install() {
42
+ const platform = getPlatform();
43
+ if (!this.silent) {
44
+ log.log('BraveInstaller', `Installing Brave Browser on ${platform}...`);
45
+ }
46
+ try {
47
+ switch (platform) {
48
+ case 'win32':
49
+ return await this.installWindows();
50
+ case 'linux':
51
+ return await this.installLinux();
52
+ case 'darwin':
53
+ return await this.installMacOS();
54
+ default:
55
+ return { success: false, error: `Unsupported platform: ${platform}` };
56
+ }
57
+ }
58
+ catch (error) {
59
+ return { success: false, error: error.message };
60
+ }
61
+ }
62
+ /**
63
+ * Install Brave on Windows
64
+ */
65
+ async installWindows() {
66
+ const installerPath = path.join(this.downloadDir, 'BraveBrowserSetup.exe');
67
+ const downloadUrl = BRAVE_DOWNLOAD_URLS.win32[this.channel];
68
+ if (!this.silent) {
69
+ log.log('BraveInstaller', 'Downloading Brave installer for Windows...');
70
+ }
71
+ // Download installer
72
+ await this.downloadFile(downloadUrl, installerPath);
73
+ if (!this.silent) {
74
+ log.log('BraveInstaller', 'Running Brave installer (silent mode)...');
75
+ }
76
+ // Run installer silently
77
+ try {
78
+ execSync(`"${installerPath}" /silent /install`, {
79
+ stdio: 'ignore',
80
+ timeout: 300000 // 5 minutes timeout
81
+ });
82
+ }
83
+ catch (error) {
84
+ // Try alternative silent flags
85
+ try {
86
+ execSync(`"${installerPath}" --system-level --do-not-launch-chrome`, {
87
+ stdio: 'ignore',
88
+ timeout: 300000
89
+ });
90
+ }
91
+ catch (e) {
92
+ // Installation might still succeed, continue checking
93
+ }
94
+ }
95
+ // Wait for installation to complete
96
+ await this.delay(5000);
97
+ // Find Brave installation
98
+ const bravePath = this.findBraveWindows();
99
+ if (bravePath) {
100
+ if (!this.silent) {
101
+ log.log('BraveInstaller', `Brave installed successfully at: ${bravePath}`);
102
+ }
103
+ // Cleanup installer
104
+ try {
105
+ fs.unlinkSync(installerPath);
106
+ }
107
+ catch (e) { }
108
+ return { success: true, bravePath };
109
+ }
110
+ return { success: false, error: 'Installation completed but Brave not found' };
111
+ }
112
+ /**
113
+ * Install Brave on Linux
114
+ */
115
+ async installLinux() {
116
+ if (!this.silent) {
117
+ log.log('BraveInstaller', 'Installing Brave on Linux...');
118
+ }
119
+ // Detect package manager
120
+ const packageManager = this.detectLinuxPackageManager();
121
+ try {
122
+ if (packageManager === 'apt') {
123
+ // Debian/Ubuntu based
124
+ execSync('sudo apt install -y curl', { stdio: 'ignore' });
125
+ execSync('sudo curl -fsSLo /usr/share/keyrings/brave-browser-archive-keyring.gpg https://brave-browser-apt-release.s3.brave.com/brave-browser-archive-keyring.gpg', { stdio: 'ignore' });
126
+ execSync('echo "deb [signed-by=/usr/share/keyrings/brave-browser-archive-keyring.gpg] https://brave-browser-apt-release.s3.brave.com/ stable main" | sudo tee /etc/apt/sources.list.d/brave-browser-release.list', { stdio: 'ignore' });
127
+ execSync('sudo apt update', { stdio: 'ignore' });
128
+ execSync('sudo apt install -y brave-browser', { stdio: 'ignore' });
129
+ }
130
+ else if (packageManager === 'dnf' || packageManager === 'yum') {
131
+ // Fedora/RHEL based
132
+ execSync('sudo dnf install -y dnf-plugins-core', { stdio: 'ignore' });
133
+ execSync('sudo dnf config-manager --add-repo https://brave-browser-rpm-release.s3.brave.com/brave-browser.repo', { stdio: 'ignore' });
134
+ execSync('sudo rpm --import https://brave-browser-rpm-release.s3.brave.com/brave-core.asc', { stdio: 'ignore' });
135
+ execSync('sudo dnf install -y brave-browser', { stdio: 'ignore' });
136
+ }
137
+ else if (packageManager === 'pacman') {
138
+ // Arch based
139
+ execSync('yay -S --noconfirm brave-bin', { stdio: 'ignore' });
140
+ }
141
+ else {
142
+ return { success: false, error: `Unsupported package manager. Please install Brave manually.` };
143
+ }
144
+ // Find Brave installation
145
+ const bravePath = this.findBraveLinux();
146
+ if (bravePath) {
147
+ if (!this.silent) {
148
+ log.log('BraveInstaller', `Brave installed successfully at: ${bravePath}`);
149
+ }
150
+ return { success: true, bravePath };
151
+ }
152
+ return { success: false, error: 'Installation completed but Brave not found' };
153
+ }
154
+ catch (error) {
155
+ return { success: false, error: `Linux installation failed: ${error.message}` };
156
+ }
157
+ }
158
+ /**
159
+ * Install Brave on macOS
160
+ */
161
+ async installMacOS() {
162
+ var _a;
163
+ const dmgPath = path.join(this.downloadDir, 'Brave-Browser.dmg');
164
+ const downloadUrl = BRAVE_DOWNLOAD_URLS.darwin[this.channel];
165
+ if (!this.silent) {
166
+ log.log('BraveInstaller', 'Downloading Brave for macOS...');
167
+ }
168
+ // Download DMG
169
+ await this.downloadFile(downloadUrl, dmgPath);
170
+ if (!this.silent) {
171
+ log.log('BraveInstaller', 'Installing Brave...');
172
+ }
173
+ try {
174
+ // Mount DMG
175
+ const mountOutput = execSync(`hdiutil attach "${dmgPath}" -nobrowse`, { encoding: 'utf-8' });
176
+ const mountPoint = ((_a = mountOutput.split('\t').pop()) === null || _a === void 0 ? void 0 : _a.trim()) || '/Volumes/Brave Browser';
177
+ // Copy to Applications
178
+ execSync(`cp -R "${mountPoint}/Brave Browser.app" /Applications/`, { stdio: 'ignore' });
179
+ // Unmount DMG
180
+ execSync(`hdiutil detach "${mountPoint}"`, { stdio: 'ignore' });
181
+ // Cleanup
182
+ try {
183
+ fs.unlinkSync(dmgPath);
184
+ }
185
+ catch (e) { }
186
+ const bravePath = '/Applications/Brave Browser.app/Contents/MacOS/Brave Browser';
187
+ if (fs.existsSync(bravePath)) {
188
+ if (!this.silent) {
189
+ log.log('BraveInstaller', `Brave installed successfully at: ${bravePath}`);
190
+ }
191
+ return { success: true, bravePath };
192
+ }
193
+ return { success: false, error: 'Installation completed but Brave not found' };
194
+ }
195
+ catch (error) {
196
+ return { success: false, error: `macOS installation failed: ${error.message}` };
197
+ }
198
+ }
199
+ /**
200
+ * Download file from URL
201
+ */
202
+ downloadFile(url, destPath) {
203
+ return new Promise((resolve, reject) => {
204
+ const followRedirect = (url, redirectCount = 0) => {
205
+ if (redirectCount > 10) {
206
+ reject(new Error('Too many redirects'));
207
+ return;
208
+ }
209
+ const protocol = url.startsWith('https') ? https : http;
210
+ protocol.get(url, {
211
+ headers: { 'User-Agent': 'brave-real-launcher' }
212
+ }, (response) => {
213
+ if (response.statusCode === 301 || response.statusCode === 302 || response.statusCode === 307 || response.statusCode === 308) {
214
+ const redirectUrl = response.headers.location;
215
+ if (redirectUrl) {
216
+ followRedirect(redirectUrl, redirectCount + 1);
217
+ return;
218
+ }
219
+ }
220
+ if (response.statusCode !== 200) {
221
+ reject(new Error(`Download failed: ${response.statusCode}`));
222
+ return;
223
+ }
224
+ const file = fs.createWriteStream(destPath);
225
+ response.pipe(file);
226
+ file.on('finish', () => {
227
+ file.close();
228
+ resolve();
229
+ });
230
+ file.on('error', (err) => {
231
+ fs.unlinkSync(destPath);
232
+ reject(err);
233
+ });
234
+ }).on('error', reject);
235
+ };
236
+ followRedirect(url);
237
+ });
238
+ }
239
+ /**
240
+ * Detect Linux package manager
241
+ */
242
+ detectLinuxPackageManager() {
243
+ try {
244
+ execSync('which apt', { stdio: 'ignore' });
245
+ return 'apt';
246
+ }
247
+ catch (e) { }
248
+ try {
249
+ execSync('which dnf', { stdio: 'ignore' });
250
+ return 'dnf';
251
+ }
252
+ catch (e) { }
253
+ try {
254
+ execSync('which yum', { stdio: 'ignore' });
255
+ return 'yum';
256
+ }
257
+ catch (e) { }
258
+ try {
259
+ execSync('which pacman', { stdio: 'ignore' });
260
+ return 'pacman';
261
+ }
262
+ catch (e) { }
263
+ return 'unknown';
264
+ }
265
+ /**
266
+ * Find Brave on Windows
267
+ */
268
+ findBraveWindows() {
269
+ const paths = [
270
+ `${process.env.LOCALAPPDATA}\\BraveSoftware\\Brave-Browser\\Application\\brave.exe`,
271
+ `${process.env.PROGRAMFILES}\\BraveSoftware\\Brave-Browser\\Application\\brave.exe`,
272
+ `${process.env['PROGRAMFILES(X86)']}\\BraveSoftware\\Brave-Browser\\Application\\brave.exe`,
273
+ ];
274
+ for (const p of paths) {
275
+ if (p && fs.existsSync(p)) {
276
+ return p;
277
+ }
278
+ }
279
+ return null;
280
+ }
281
+ /**
282
+ * Find Brave on Linux
283
+ */
284
+ findBraveLinux() {
285
+ const paths = [
286
+ '/usr/bin/brave-browser',
287
+ '/usr/bin/brave-browser-stable',
288
+ '/opt/brave.com/brave/brave',
289
+ '/snap/bin/brave'
290
+ ];
291
+ for (const p of paths) {
292
+ if (fs.existsSync(p)) {
293
+ return p;
294
+ }
295
+ }
296
+ return null;
297
+ }
298
+ /**
299
+ * Delay helper
300
+ */
301
+ delay(ms) {
302
+ return new Promise(resolve => setTimeout(resolve, ms));
303
+ }
304
+ /**
305
+ * Check if Brave is installed
306
+ */
307
+ static isInstalled() {
308
+ const platform = getPlatform();
309
+ const installer = new BraveInstaller({ silent: true });
310
+ switch (platform) {
311
+ case 'win32':
312
+ return installer.findBraveWindows() !== null;
313
+ case 'linux':
314
+ return installer.findBraveLinux() !== null;
315
+ case 'darwin':
316
+ return fs.existsSync('/Applications/Brave Browser.app/Contents/MacOS/Brave Browser');
317
+ default:
318
+ return false;
319
+ }
320
+ }
321
+ }
322
+ export default BraveInstaller;
323
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJhdmUtaW5zdGFsbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2JyYXZlLWluc3RhbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFDSCxZQUFZLENBQUM7QUFFYixPQUFPLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQztBQUN6QixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUM3QixPQUFPLEVBQUUsUUFBUSxFQUFTLE1BQU0sZUFBZSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDN0IsT0FBTyxHQUFHLE1BQU0sYUFBYSxDQUFDO0FBQzlCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFjekMsTUFBTSxtQkFBbUIsR0FBRztJQUN4QixLQUFLLEVBQUU7UUFDSCxPQUFPLEVBQUUsZ0RBQWdEO1FBQ3pELElBQUksRUFBRSxxREFBcUQ7UUFDM0QsT0FBTyxFQUFFLHdEQUF3RDtLQUNwRTtJQUNELE1BQU0sRUFBRTtRQUNKLE9BQU8sRUFBRSw2Q0FBNkM7UUFDdEQsSUFBSSxFQUFFLGtEQUFrRDtRQUN4RCxPQUFPLEVBQUUscURBQXFEO0tBQ2pFO0NBQ0osQ0FBQztBQUVGLE1BQU0sT0FBTyxjQUFjO0lBS3ZCLFlBQVksVUFBNEIsRUFBRTtRQUN0QyxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksS0FBSyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLHNCQUFzQixFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3BHLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFD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
@@ -5,6 +5,7 @@ import * as childProcess from 'child_process';
5
5
  import * as fs from 'fs';
6
6
  import { XvfbManager, XvfbOptions } from './utils.js';
7
7
  import { ChildProcess } from 'child_process';
8
+ import { ExtensionInfo } from './extension-manager.js';
8
9
  type JSONLike = {
9
10
  [property: string]: JSONLike;
10
11
  } | readonly JSONLike[] | string | number | boolean | null;
@@ -27,6 +28,11 @@ export interface Options {
27
28
  launchMode?: 'auto' | 'headless' | 'gui';
28
29
  xvfbOptions?: XvfbOptions;
29
30
  enableXvfb?: boolean;
31
+ extensions?: string[];
32
+ autoLoadUBlock?: boolean;
33
+ autoInstall?: boolean;
34
+ enableStealth?: boolean;
35
+ userAgent?: string;
30
36
  }
31
37
  export interface RemoteDebuggingPipes {
32
38
  incoming: NodeJS.ReadableStream;
@@ -39,6 +45,7 @@ export interface LaunchedBrave {
39
45
  remoteDebuggingPipes: RemoteDebuggingPipes | null;
40
46
  kill: () => void;
41
47
  xvfbManager?: XvfbManager;
48
+ extensions?: ExtensionInfo[];
42
49
  }
43
50
  export interface ModuleOverrides {
44
51
  fs?: typeof fs;
@@ -71,6 +78,13 @@ declare class Launcher {
71
78
  private launchMode;
72
79
  private enableXvfb;
73
80
  private xvfbOptions;
81
+ private extensions;
82
+ private autoLoadUBlock;
83
+ private autoInstall;
84
+ private enableStealth;
85
+ private userAgent?;
86
+ private extensionManager?;
87
+ loadedExtensions: ExtensionInfo[];
74
88
  braveProcess?: childProcess.ChildProcess;
75
89
  userDataDir?: string;
76
90
  port?: number;
@@ -79,6 +93,7 @@ declare class Launcher {
79
93
  xvfbManager?: XvfbManager;
80
94
  constructor(opts?: Options, moduleOverrides?: ModuleOverrides);
81
95
  private get flags();
96
+ private getExtensionPaths;
82
97
  private determineEffectiveLaunchMode;
83
98
  static defaultFlags(): string[];
84
99
  /** Returns the highest priority brave installation. */
@@ -87,8 +102,14 @@ declare class Launcher {
87
102
  static getInstallations(): string[];
88
103
  makeTmpDir(): string;
89
104
  private setupXvfb;
105
+ /**
106
+ * Load uBlock Origin extension
107
+ */
108
+ private loadUBlockOrigin;
90
109
  prepare(): void;
91
110
  private setBrowserPrefs;
111
+ private setLocalStatePrefs;
112
+ private deepMerge;
92
113
  launch(): Promise<void>;
93
114
  private spawnProcess;
94
115
  private cleanup;