camou 0.1.0
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 +229 -0
- package/dist/browser/actions.d.ts +4 -0
- package/dist/browser/actions.js +15 -0
- package/dist/browser/actions.js.map +1 -0
- package/dist/browser/manager.d.ts +85 -0
- package/dist/browser/manager.js +300 -0
- package/dist/browser/manager.js.map +1 -0
- package/dist/browser/snapshot.d.ts +17 -0
- package/dist/browser/snapshot.js +93 -0
- package/dist/browser/snapshot.js.map +1 -0
- package/dist/browser/tabs.d.ts +24 -0
- package/dist/browser/tabs.js +8 -0
- package/dist/browser/tabs.js.map +1 -0
- package/dist/camoufox/config.d.ts +67 -0
- package/dist/camoufox/config.js +121 -0
- package/dist/camoufox/config.js.map +1 -0
- package/dist/camoufox/env.d.ts +3 -0
- package/dist/camoufox/env.js +27 -0
- package/dist/camoufox/env.js.map +1 -0
- package/dist/camoufox/installer.d.ts +24 -0
- package/dist/camoufox/installer.js +291 -0
- package/dist/camoufox/installer.js.map +1 -0
- package/dist/camoufox/launcher.d.ts +22 -0
- package/dist/camoufox/launcher.js +105 -0
- package/dist/camoufox/launcher.js.map +1 -0
- package/dist/camoufox/prefs.d.ts +5 -0
- package/dist/camoufox/prefs.js +27 -0
- package/dist/camoufox/prefs.js.map +1 -0
- package/dist/camoufox/presets.d.ts +14 -0
- package/dist/camoufox/presets.js +73 -0
- package/dist/camoufox/presets.js.map +1 -0
- package/dist/camoufox/registry.d.ts +30 -0
- package/dist/camoufox/registry.js +195 -0
- package/dist/camoufox/registry.js.map +1 -0
- package/dist/camoufox/validation.d.ts +4 -0
- package/dist/camoufox/validation.js +103 -0
- package/dist/camoufox/validation.js.map +1 -0
- package/dist/cli/daemon.d.ts +2 -0
- package/dist/cli/daemon.js +59 -0
- package/dist/cli/daemon.js.map +1 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.js +147 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/output.d.ts +1 -0
- package/dist/cli/output.js +108 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/program.d.ts +42 -0
- package/dist/cli/program.js +214 -0
- package/dist/cli/program.js.map +1 -0
- package/dist/daemon/daemon.d.ts +12 -0
- package/dist/daemon/daemon.js +36 -0
- package/dist/daemon/daemon.js.map +1 -0
- package/dist/daemon/main.d.ts +2 -0
- package/dist/daemon/main.js +28 -0
- package/dist/daemon/main.js.map +1 -0
- package/dist/daemon/router.d.ts +7 -0
- package/dist/daemon/router.js +43 -0
- package/dist/daemon/router.js.map +1 -0
- package/dist/daemon/runtime.d.ts +11 -0
- package/dist/daemon/runtime.js +54 -0
- package/dist/daemon/runtime.js.map +1 -0
- package/dist/doctor/diagnostics.d.ts +38 -0
- package/dist/doctor/diagnostics.js +152 -0
- package/dist/doctor/diagnostics.js.map +1 -0
- package/dist/ipc/client.d.ts +6 -0
- package/dist/ipc/client.js +63 -0
- package/dist/ipc/client.js.map +1 -0
- package/dist/ipc/protocol.d.ts +775 -0
- package/dist/ipc/protocol.js +128 -0
- package/dist/ipc/protocol.js.map +1 -0
- package/dist/ipc/server.d.ts +10 -0
- package/dist/ipc/server.js +99 -0
- package/dist/ipc/server.js.map +1 -0
- package/dist/state/paths.d.ts +32 -0
- package/dist/state/paths.js +121 -0
- package/dist/state/paths.js.map +1 -0
- package/dist/state/store.d.ts +4 -0
- package/dist/state/store.js +30 -0
- package/dist/state/store.js.map +1 -0
- package/dist/util/errors.d.ts +45 -0
- package/dist/util/errors.js +82 -0
- package/dist/util/errors.js.map +1 -0
- package/dist/util/log.d.ts +19 -0
- package/dist/util/log.js +71 -0
- package/dist/util/log.js.map +1 -0
- package/dist/util/platform.d.ts +12 -0
- package/dist/util/platform.js +44 -0
- package/dist/util/platform.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import { createWriteStream } from 'node:fs';
|
|
2
|
+
import { chmod, cp, mkdtemp, readdir, rename, rm, stat, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { createRequire } from 'node:module';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { Writable } from 'node:stream';
|
|
6
|
+
import extract from 'extract-zip';
|
|
7
|
+
import { buildDoctorHints, buildDoctorVersionChecks, inspectBrowserBundle, inspectSharedLibraries } from '../doctor/diagnostics.js';
|
|
8
|
+
import { ensureDir } from '../state/store.js';
|
|
9
|
+
import { InstallError } from '../util/errors.js';
|
|
10
|
+
import { buildExpectedAssetName, getPlatformTarget, normalizeReleaseVersion } from '../util/platform.js';
|
|
11
|
+
import { probeCamoufoxLaunch } from './launcher.js';
|
|
12
|
+
import { listInstalledBrowsers, removeInstalledBrowser, resolveInstalledBrowser, setInstalledBrowser } from './registry.js';
|
|
13
|
+
const DEFAULT_RELEASE_REPOS = ['daijro/camoufox', 'camoufox/camoufox'];
|
|
14
|
+
const require = createRequire(import.meta.url);
|
|
15
|
+
async function fetchJson(url) {
|
|
16
|
+
const headers = {
|
|
17
|
+
'user-agent': 'camou',
|
|
18
|
+
accept: 'application/vnd.github+json',
|
|
19
|
+
};
|
|
20
|
+
if (process.env.GITHUB_TOKEN) {
|
|
21
|
+
headers.authorization = `Bearer ${process.env.GITHUB_TOKEN}`;
|
|
22
|
+
}
|
|
23
|
+
const response = await fetch(url, { headers });
|
|
24
|
+
if (!response.ok) {
|
|
25
|
+
throw new InstallError(`GitHub request failed with ${response.status} for ${url}.`);
|
|
26
|
+
}
|
|
27
|
+
return response.json();
|
|
28
|
+
}
|
|
29
|
+
export async function resolveRelease(version) {
|
|
30
|
+
const target = getPlatformTarget();
|
|
31
|
+
const normalizedVersion = version ? normalizeReleaseVersion(version) : undefined;
|
|
32
|
+
const expectedAssetName = normalizedVersion
|
|
33
|
+
? buildExpectedAssetName(normalizedVersion, target)
|
|
34
|
+
: undefined;
|
|
35
|
+
for (const repo of DEFAULT_RELEASE_REPOS) {
|
|
36
|
+
const apiUrl = version
|
|
37
|
+
? `https://api.github.com/repos/${repo}/releases`
|
|
38
|
+
: `https://api.github.com/repos/${repo}/releases/latest`;
|
|
39
|
+
const payload = await fetchJson(apiUrl);
|
|
40
|
+
const releases = Array.isArray(payload) ? payload : [payload];
|
|
41
|
+
for (const release of releases) {
|
|
42
|
+
const releaseVersion = normalizeReleaseVersion(release.tag_name);
|
|
43
|
+
if (normalizedVersion && releaseVersion !== normalizedVersion) {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const assetName = expectedAssetName ?? buildExpectedAssetName(releaseVersion, target);
|
|
47
|
+
const asset = release.assets.find((candidate) => candidate.name === assetName);
|
|
48
|
+
if (!asset) {
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
repo,
|
|
53
|
+
tag: release.tag_name,
|
|
54
|
+
version: releaseVersion,
|
|
55
|
+
assetName: asset.name,
|
|
56
|
+
assetUrl: asset.browser_download_url,
|
|
57
|
+
prerelease: release.prerelease ?? false,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
throw new InstallError(version
|
|
62
|
+
? `Unable to find Camoufox release ${version} for this platform.`
|
|
63
|
+
: 'Unable to find a compatible Camoufox release for this platform.');
|
|
64
|
+
}
|
|
65
|
+
function splitReleaseVersion(version) {
|
|
66
|
+
const separatorIndex = version.lastIndexOf('-');
|
|
67
|
+
if (separatorIndex <= 0 || separatorIndex === version.length - 1) {
|
|
68
|
+
throw new InstallError(`Unable to split Camoufox release version: ${version}`);
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
version: version.slice(0, separatorIndex),
|
|
72
|
+
build: version.slice(separatorIndex + 1),
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
async function writeVersionMetadata(rootDir, release) {
|
|
76
|
+
const parsed = splitReleaseVersion(release.version);
|
|
77
|
+
await writeFile(path.join(rootDir, 'version.json'), `${JSON.stringify({
|
|
78
|
+
version: parsed.version,
|
|
79
|
+
build: parsed.build,
|
|
80
|
+
prerelease: release.prerelease,
|
|
81
|
+
}, null, 2)}\n`, 'utf8');
|
|
82
|
+
}
|
|
83
|
+
async function downloadAsset(url, targetFile, logger) {
|
|
84
|
+
const headers = { 'user-agent': 'camou' };
|
|
85
|
+
if (process.env.GITHUB_TOKEN) {
|
|
86
|
+
headers.authorization = `Bearer ${process.env.GITHUB_TOKEN}`;
|
|
87
|
+
}
|
|
88
|
+
const response = await fetch(url, { headers });
|
|
89
|
+
if (!response.ok || !response.body) {
|
|
90
|
+
throw new InstallError(`Failed to download ${url}.`, { status: response.status });
|
|
91
|
+
}
|
|
92
|
+
logger?.info('Downloading Camoufox release', { url });
|
|
93
|
+
const stream = createWriteStream(targetFile);
|
|
94
|
+
await response.body.pipeTo(Writable.toWeb(stream));
|
|
95
|
+
}
|
|
96
|
+
async function findExecutablePath(rootDir, expectedRelativePath) {
|
|
97
|
+
const directPath = path.join(rootDir, expectedRelativePath);
|
|
98
|
+
try {
|
|
99
|
+
await stat(directPath);
|
|
100
|
+
return directPath;
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// Continue into recursive search.
|
|
104
|
+
}
|
|
105
|
+
const queue = [rootDir];
|
|
106
|
+
while (queue.length > 0) {
|
|
107
|
+
const current = queue.shift();
|
|
108
|
+
if (!current) {
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
const entries = await readdir(current, { withFileTypes: true });
|
|
112
|
+
for (const entry of entries) {
|
|
113
|
+
const fullPath = path.join(current, entry.name);
|
|
114
|
+
if (entry.isDirectory()) {
|
|
115
|
+
queue.push(fullPath);
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
if (path.basename(expectedRelativePath) === entry.name) {
|
|
119
|
+
return fullPath;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
throw new InstallError(`Unable to find extracted Camoufox executable inside ${rootDir}.`);
|
|
124
|
+
}
|
|
125
|
+
async function makeExecutable(filePath) {
|
|
126
|
+
if (process.platform !== 'win32') {
|
|
127
|
+
await chmod(filePath, 0o755);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
async function moveDirectory(sourceDir, targetDir) {
|
|
131
|
+
try {
|
|
132
|
+
await rename(sourceDir, targetDir);
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
if (!(error instanceof Error) || !('code' in error) || error.code !== 'EXDEV') {
|
|
136
|
+
throw error;
|
|
137
|
+
}
|
|
138
|
+
await cp(sourceDir, targetDir, { recursive: true });
|
|
139
|
+
await rm(sourceDir, { recursive: true, force: true });
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
export async function installCamoufox(paths, options) {
|
|
143
|
+
const target = getPlatformTarget();
|
|
144
|
+
const logger = options?.logger;
|
|
145
|
+
const release = await resolveRelease(options?.version);
|
|
146
|
+
const existing = await resolveInstalledBrowser(paths, release.version);
|
|
147
|
+
if (existing && !options?.force) {
|
|
148
|
+
logger?.info('Camoufox version already installed', { version: release.version });
|
|
149
|
+
return release;
|
|
150
|
+
}
|
|
151
|
+
await ensureDir(path.join(paths.browsersDir, 'official'));
|
|
152
|
+
const tempRoot = await mkdtemp(path.join(paths.camoufoxCacheDir, 'install-'));
|
|
153
|
+
const archivePath = path.join(tempRoot, release.assetName);
|
|
154
|
+
const extractDir = path.join(tempRoot, 'extract');
|
|
155
|
+
const finalDir = path.join(paths.browsersDir, 'official', release.version);
|
|
156
|
+
try {
|
|
157
|
+
await downloadAsset(release.assetUrl, archivePath, logger);
|
|
158
|
+
await ensureDir(extractDir);
|
|
159
|
+
logger?.info('Extracting Camoufox release', { archivePath });
|
|
160
|
+
await extract(archivePath, { dir: extractDir });
|
|
161
|
+
const executablePath = await findExecutablePath(extractDir, target.executableRelativePath);
|
|
162
|
+
if (options?.force) {
|
|
163
|
+
await rm(finalDir, { recursive: true, force: true });
|
|
164
|
+
}
|
|
165
|
+
await moveDirectory(extractDir, finalDir);
|
|
166
|
+
await writeVersionMetadata(finalDir, release);
|
|
167
|
+
const finalExecutablePath = path.join(finalDir, path.relative(extractDir, executablePath));
|
|
168
|
+
await makeExecutable(finalExecutablePath);
|
|
169
|
+
await setInstalledBrowser(paths, {
|
|
170
|
+
version: release.version,
|
|
171
|
+
tag: release.tag,
|
|
172
|
+
sourceRepo: release.repo,
|
|
173
|
+
assetName: release.assetName,
|
|
174
|
+
assetUrl: release.assetUrl,
|
|
175
|
+
rootDir: finalDir,
|
|
176
|
+
executablePath: finalExecutablePath,
|
|
177
|
+
installedAt: new Date().toISOString(),
|
|
178
|
+
platform: target.os,
|
|
179
|
+
arch: target.arch,
|
|
180
|
+
}, true);
|
|
181
|
+
logger?.info('Installed Camoufox release', { version: release.version, executablePath: finalExecutablePath });
|
|
182
|
+
return release;
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
throw error instanceof InstallError
|
|
186
|
+
? error
|
|
187
|
+
: new InstallError('Failed to install Camoufox.', undefined, error);
|
|
188
|
+
}
|
|
189
|
+
finally {
|
|
190
|
+
await rm(tempRoot, { recursive: true, force: true });
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
export async function removeCamoufox(paths, version, logger) {
|
|
194
|
+
const existing = await resolveInstalledBrowser(paths, version);
|
|
195
|
+
if (!existing) {
|
|
196
|
+
throw new InstallError(`Camoufox version ${version} is not installed.`);
|
|
197
|
+
}
|
|
198
|
+
await rm(existing.rootDir, { recursive: true, force: true });
|
|
199
|
+
await removeInstalledBrowser(paths, version);
|
|
200
|
+
logger?.info('Removed Camoufox release', { version });
|
|
201
|
+
}
|
|
202
|
+
function getPlaywrightCoreVersion() {
|
|
203
|
+
try {
|
|
204
|
+
const playwrightPackage = require('playwright-core/package.json');
|
|
205
|
+
return playwrightPackage.version;
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
return undefined;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
export async function inspectCamoufoxInstall(paths, version, logger) {
|
|
212
|
+
try {
|
|
213
|
+
return {
|
|
214
|
+
playwrightCoreVersion: getPlaywrightCoreVersion(),
|
|
215
|
+
launchCheck: await probeCamoufoxLaunch(paths, version, logger),
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
return {
|
|
220
|
+
playwrightCoreVersion: getPlaywrightCoreVersion(),
|
|
221
|
+
launchCheck: {
|
|
222
|
+
attempted: false,
|
|
223
|
+
success: false,
|
|
224
|
+
version,
|
|
225
|
+
error: {
|
|
226
|
+
message: error instanceof Error ? error.message : String(error),
|
|
227
|
+
},
|
|
228
|
+
},
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
export async function doctorCamoufox(paths, logger) {
|
|
233
|
+
const installedBrowsers = await listInstalledBrowsers(paths);
|
|
234
|
+
const platform = getPlatformTarget();
|
|
235
|
+
const inspections = new Map();
|
|
236
|
+
for (const install of installedBrowsers.installs) {
|
|
237
|
+
inspections.set(install.version, await inspectCamoufoxInstall(paths, install.version, logger));
|
|
238
|
+
}
|
|
239
|
+
const currentBrowser = installedBrowsers.currentVersion
|
|
240
|
+
? installedBrowsers.installs.find((install) => install.version === installedBrowsers.currentVersion)
|
|
241
|
+
: undefined;
|
|
242
|
+
const currentInspection = currentBrowser
|
|
243
|
+
? inspections.get(currentBrowser.version)
|
|
244
|
+
: {
|
|
245
|
+
playwrightCoreVersion: getPlaywrightCoreVersion(),
|
|
246
|
+
launchCheck: {
|
|
247
|
+
attempted: false,
|
|
248
|
+
success: false,
|
|
249
|
+
error: {
|
|
250
|
+
message: 'No active Camoufox version selected.',
|
|
251
|
+
},
|
|
252
|
+
},
|
|
253
|
+
};
|
|
254
|
+
const bundleCheck = await inspectBrowserBundle(currentBrowser, platform);
|
|
255
|
+
const sharedLibraryCheck = await inspectSharedLibraries(currentBrowser, platform);
|
|
256
|
+
const installedVersions = buildDoctorVersionChecks({
|
|
257
|
+
installedVersions: installedBrowsers.installs,
|
|
258
|
+
currentVersion: installedBrowsers.currentVersion,
|
|
259
|
+
probes: new Map(Array.from(inspections.entries()).map(([version, inspection]) => [version, inspection.launchCheck])),
|
|
260
|
+
});
|
|
261
|
+
const hints = buildDoctorHints({
|
|
262
|
+
platform,
|
|
263
|
+
installed: installedBrowsers.installs.length > 0,
|
|
264
|
+
currentVersion: currentBrowser?.version,
|
|
265
|
+
launchCheck: currentInspection?.launchCheck,
|
|
266
|
+
bundleCheck,
|
|
267
|
+
sharedLibraryCheck,
|
|
268
|
+
});
|
|
269
|
+
return {
|
|
270
|
+
platform,
|
|
271
|
+
playwrightCoreVersion: currentInspection?.playwrightCoreVersion,
|
|
272
|
+
camoufoxCacheDir: paths.camoufoxCacheDir,
|
|
273
|
+
installed: installedBrowsers.installs.length > 0,
|
|
274
|
+
healthy: installedBrowsers.installs.length > 0 &&
|
|
275
|
+
Boolean(currentInspection?.launchCheck.success) &&
|
|
276
|
+
bundleCheck.missingRequiredFiles.length === 0 &&
|
|
277
|
+
sharedLibraryCheck.missingLibraries.length === 0,
|
|
278
|
+
currentVersion: currentBrowser?.version,
|
|
279
|
+
executablePath: currentBrowser?.executablePath,
|
|
280
|
+
installedVersions,
|
|
281
|
+
launchCheck: currentInspection?.launchCheck,
|
|
282
|
+
bundleCheck,
|
|
283
|
+
sharedLibraryCheck,
|
|
284
|
+
hints,
|
|
285
|
+
runtimeDir: paths.runtimeDir,
|
|
286
|
+
socketPath: paths.daemonSocketPath,
|
|
287
|
+
host: paths.daemonHost,
|
|
288
|
+
port: paths.daemonPort,
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
//# sourceMappingURL=installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/camoufox/installer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC5F,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,OAAO,OAAO,MAAM,aAAa,CAAC;AAGlC,OAAO,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AACpI,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAEzG,OAAO,EAAE,mBAAmB,EAA2B,MAAM,eAAe,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAE5H,MAAM,qBAAqB,GAAG,CAAC,iBAAiB,EAAE,mBAAmB,CAAU,CAAC;AAChF,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AA2B/C,KAAK,UAAU,SAAS,CAAI,GAAW;IACrC,MAAM,OAAO,GAAgB;QAC3B,YAAY,EAAE,OAAO;QACrB,MAAM,EAAE,6BAA6B;KACtC,CAAC;IACF,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC7B,OAAO,CAAC,aAAa,GAAG,UAAU,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC/D,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,YAAY,CAAC,8BAA8B,QAAQ,CAAC,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,EAAgB,CAAC;AACvC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAgB;IACnD,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACnC,MAAM,iBAAiB,GAAG,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACjF,MAAM,iBAAiB,GAAG,iBAAiB;QACzC,CAAC,CAAC,sBAAsB,CAAC,iBAAiB,EAAE,MAAM,CAAC;QACnD,CAAC,CAAC,SAAS,CAAC;IAEd,KAAK,MAAM,IAAI,IAAI,qBAAqB,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,OAAO;YACpB,CAAC,CAAC,gCAAgC,IAAI,WAAW;YACjD,CAAC,CAAC,gCAAgC,IAAI,kBAAkB,CAAC;QAC3D,MAAM,OAAO,GAAG,MAAM,SAAS,CAAkC,MAAM,CAAC,CAAC;QACzE,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAE9D,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,cAAc,GAAG,uBAAuB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACjE,IAAI,iBAAiB,IAAI,cAAc,KAAK,iBAAiB,EAAE,CAAC;gBAC9D,SAAS;YACX,CAAC;YAED,MAAM,SAAS,GAAG,iBAAiB,IAAI,sBAAsB,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;YACtF,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;YAC/E,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,SAAS;YACX,CAAC;YAED,OAAO;gBACL,IAAI;gBACJ,GAAG,EAAE,OAAO,CAAC,QAAQ;gBACrB,OAAO,EAAE,cAAc;gBACvB,SAAS,EAAE,KAAK,CAAC,IAAI;gBACrB,QAAQ,EAAE,KAAK,CAAC,oBAAoB;gBACpC,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,KAAK;aACxC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,IAAI,YAAY,CACpB,OAAO;QACL,CAAC,CAAC,mCAAmC,OAAO,qBAAqB;QACjE,CAAC,CAAC,iEAAiE,CACtE,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAe;IAC1C,MAAM,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAChD,IAAI,cAAc,IAAI,CAAC,IAAI,cAAc,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjE,MAAM,IAAI,YAAY,CAAC,6CAA6C,OAAO,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC;QACzC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC;KACzC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,OAAe,EAAE,OAAwB;IAC3E,MAAM,MAAM,GAAG,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,SAAS,CACb,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,EAClC,GAAG,IAAI,CAAC,SAAS,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,UAAU,EAAE,OAAO,CAAC,UAAU;KAC/B,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EACf,MAAM,CACP,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,GAAW,EAAE,UAAkB,EAAE,MAAe;IAC3E,MAAM,OAAO,GAAgB,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;IACvD,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC7B,OAAO,CAAC,aAAa,GAAG,UAAU,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;IAC/D,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/C,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,IAAI,YAAY,CAAC,sBAAsB,GAAG,GAAG,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACpF,CAAC;IAED,MAAM,EAAE,IAAI,CAAC,8BAA8B,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAC7C,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,OAAe,EAAE,oBAA4B;IAC7E,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;IAC5D,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC;QACvB,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,kCAAkC;IACpC,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,CAAC;IACxB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAChD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACrB,SAAS;YACX,CAAC;YAED,IAAI,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;gBACvD,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,IAAI,YAAY,CAAC,uDAAuD,OAAO,GAAG,CAAC,CAAC;AAC5F,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,QAAgB;IAC5C,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,MAAM,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,SAAiB,EAAE,SAAiB;IAC/D,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC9E,MAAM,KAAK,CAAC;QACd,CAAC;QAED,MAAM,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAAoB,EACpB,OAAoG;IAEpG,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,CAAC;IAC/B,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,MAAM,uBAAuB,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACvE,IAAI,QAAQ,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QAChC,MAAM,EAAE,IAAI,CAAC,oCAAoC,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACjF,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC,CAAC;IAC9E,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAE3E,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;QAC3D,MAAM,SAAS,CAAC,UAAU,CAAC,CAAC;QAC5B,MAAM,EAAE,IAAI,CAAC,6BAA6B,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;QAC7D,MAAM,OAAO,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC;QAEhD,MAAM,cAAc,GAAG,MAAM,kBAAkB,CAAC,UAAU,EAAE,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAE3F,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;YACnB,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,CAAC;QAED,MAAM,aAAa,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC1C,MAAM,oBAAoB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAE9C,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC;QAC3F,MAAM,cAAc,CAAC,mBAAmB,CAAC,CAAC;QAE1C,MAAM,mBAAmB,CACvB,KAAK,EACL;YACE,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,UAAU,EAAE,OAAO,CAAC,IAAI;YACxB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,OAAO,EAAE,QAAQ;YACjB,cAAc,EAAE,mBAAmB;YACnC,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACrC,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,IAAI,EAAE,MAAM,CAAC,IAAI;SAClB,EACD,IAAI,CACL,CAAC;QAEF,MAAM,EAAE,IAAI,CAAC,4BAA4B,EAAE,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAC9G,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,KAAK,YAAY,YAAY;YACjC,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,IAAI,YAAY,CAAC,6BAA6B,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;IACxE,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAAoB,EACpB,OAAe,EACf,MAA2B;IAE3B,MAAM,QAAQ,GAAG,MAAM,uBAAuB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC/D,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,YAAY,CAAC,oBAAoB,OAAO,oBAAoB,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,EAAE,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,MAAM,sBAAsB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,EAAE,IAAI,CAAC,0BAA0B,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,wBAAwB;IAC/B,IAAI,CAAC;QACH,MAAM,iBAAiB,GAAG,OAAO,CAAC,8BAA8B,CAAyB,CAAC;QAC1F,OAAO,iBAAiB,CAAC,OAAO,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,KAAoB,EACpB,OAAgB,EAChB,MAAe;IAEf,IAAI,CAAC;QACH,OAAO;YACL,qBAAqB,EAAE,wBAAwB,EAAE;YACjD,WAAW,EAAE,MAAM,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC;SAC/D,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,qBAAqB,EAAE,wBAAwB,EAAE;YACjD,WAAW,EAAE;gBACX,SAAS,EAAE,KAAK;gBAChB,OAAO,EAAE,KAAK;gBACd,OAAO;gBACP,KAAK,EAAE;oBACL,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAChE;aACF;SACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAoB,EAAE,MAAe;IACxE,MAAM,iBAAiB,GAAG,MAAM,qBAAqB,CAAC,KAAK,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,iBAAiB,EAAE,CAAC;IACrC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAqC,CAAC;IAEjE,KAAK,MAAM,OAAO,IAAI,iBAAiB,CAAC,QAAQ,EAAE,CAAC;QACjD,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,sBAAsB,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IACjG,CAAC;IAED,MAAM,cAAc,GAAG,iBAAiB,CAAC,cAAc;QACrD,CAAC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,KAAK,iBAAiB,CAAC,cAAc,CAAC;QACpG,CAAC,CAAC,SAAS,CAAC;IACd,MAAM,iBAAiB,GAAG,cAAc;QACtC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC;QACzC,CAAC,CAAC;YACE,qBAAqB,EAAE,wBAAwB,EAAE;YACjD,WAAW,EAAE;gBACX,SAAS,EAAE,KAAK;gBAChB,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE;oBACL,OAAO,EAAE,sCAAsC;iBAChD;aACF;SACF,CAAC;IACN,MAAM,WAAW,GAAG,MAAM,oBAAoB,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IACzE,MAAM,kBAAkB,GAAG,MAAM,sBAAsB,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IAClF,MAAM,iBAAiB,GAAG,wBAAwB,CAAC;QACjD,iBAAiB,EAAE,iBAAiB,CAAC,QAAQ;QAC7C,cAAc,EAAE,iBAAiB,CAAC,cAAc;QAChD,MAAM,EAAE,IAAI,GAAG,CACb,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC,CACpG;KACF,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,gBAAgB,CAAC;QAC7B,QAAQ;QACR,SAAS,EAAE,iBAAiB,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;QAChD,cAAc,EAAE,cAAc,EAAE,OAAO;QACvC,WAAW,EAAE,iBAAiB,EAAE,WAAW;QAC3C,WAAW;QACX,kBAAkB;KACnB,CAAC,CAAC;IAEH,OAAO;QACL,QAAQ;QACR,qBAAqB,EAAE,iBAAiB,EAAE,qBAAqB;QAC/D,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,SAAS,EAAE,iBAAiB,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;QAChD,OAAO,EACL,iBAAiB,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;YACrC,OAAO,CAAC,iBAAiB,EAAE,WAAW,CAAC,OAAO,CAAC;YAC/C,WAAW,CAAC,oBAAoB,CAAC,MAAM,KAAK,CAAC;YAC7C,kBAAkB,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC;QAClD,cAAc,EAAE,cAAc,EAAE,OAAO;QACvC,cAAc,EAAE,cAAc,EAAE,cAAc;QAC9C,iBAAiB;QACjB,WAAW,EAAE,iBAAiB,EAAE,WAAW;QAC3C,WAAW;QACX,kBAAkB;QAClB,KAAK;QACL,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,UAAU,EAAE,KAAK,CAAC,gBAAgB;QAClC,IAAI,EAAE,KAAK,CAAC,UAAU;QACtB,IAAI,EAAE,KAAK,CAAC,UAAU;KACvB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type BrowserContext } from 'playwright-core';
|
|
2
|
+
import type { CamoucliPaths, SessionPaths } from '../state/paths.js';
|
|
3
|
+
import type { Logger } from '../util/log.js';
|
|
4
|
+
import { type LaunchInput, type ResolvedLaunchConfig } from './config.js';
|
|
5
|
+
export interface LaunchedSession {
|
|
6
|
+
context: BrowserContext;
|
|
7
|
+
browserVersion: string;
|
|
8
|
+
installPath: string;
|
|
9
|
+
sessionPaths: SessionPaths;
|
|
10
|
+
resolvedConfig: ResolvedLaunchConfig;
|
|
11
|
+
}
|
|
12
|
+
export interface BrowserLaunchProbe {
|
|
13
|
+
attempted: boolean;
|
|
14
|
+
success: boolean;
|
|
15
|
+
version?: string | undefined;
|
|
16
|
+
executablePath?: string | undefined;
|
|
17
|
+
error?: {
|
|
18
|
+
message: string;
|
|
19
|
+
} | undefined;
|
|
20
|
+
}
|
|
21
|
+
export declare function launchPersistentCamoufox(paths: CamoucliPaths, sessionName: string, input: LaunchInput, logger?: Logger): Promise<LaunchedSession>;
|
|
22
|
+
export declare function probeCamoufoxLaunch(paths: CamoucliPaths, version?: string, logger?: Logger): Promise<BrowserLaunchProbe>;
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { mkdtemp, rm } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { firefox } from 'playwright-core';
|
|
4
|
+
import { ensureSessionPaths } from '../state/paths.js';
|
|
5
|
+
import { SessionError } from '../util/errors.js';
|
|
6
|
+
import { requireInstalledBrowser, resolveInstalledBrowser } from './registry.js';
|
|
7
|
+
import { buildCamouConfigEnv } from './env.js';
|
|
8
|
+
import { resolveLaunchConfig } from './config.js';
|
|
9
|
+
import { validateCamouConfig } from './validation.js';
|
|
10
|
+
function stripAnsi(input) {
|
|
11
|
+
return input.replace(/\u001B\[[0-9;]*m/g, '');
|
|
12
|
+
}
|
|
13
|
+
function summarizeLaunchError(error) {
|
|
14
|
+
const message = stripAnsi(error instanceof Error ? error.message : String(error));
|
|
15
|
+
return (message
|
|
16
|
+
.split('\n')
|
|
17
|
+
.map((line) => line.trim())
|
|
18
|
+
.find(Boolean) ?? 'Unknown launch error.');
|
|
19
|
+
}
|
|
20
|
+
export async function launchPersistentCamoufox(paths, sessionName, input, logger) {
|
|
21
|
+
const browser = await requireInstalledBrowser(paths, input.browser);
|
|
22
|
+
const sessionPaths = await ensureSessionPaths(paths, sessionName);
|
|
23
|
+
const resolvedConfig = await resolveLaunchConfig(input);
|
|
24
|
+
await validateCamouConfig(resolvedConfig.camouConfig, browser.rootDir);
|
|
25
|
+
const options = {
|
|
26
|
+
executablePath: browser.executablePath,
|
|
27
|
+
headless: resolvedConfig.headless,
|
|
28
|
+
env: buildCamouConfigEnv(resolvedConfig.camouConfig),
|
|
29
|
+
firefoxUserPrefs: resolvedConfig.firefoxUserPrefs,
|
|
30
|
+
downloadsPath: sessionPaths.downloadsDir,
|
|
31
|
+
...(resolvedConfig.proxy ? { proxy: resolvedConfig.proxy } : {}),
|
|
32
|
+
...(resolvedConfig.locale ? { locale: resolvedConfig.locale } : {}),
|
|
33
|
+
...(resolvedConfig.timezoneId ? { timezoneId: resolvedConfig.timezoneId } : {}),
|
|
34
|
+
...(resolvedConfig.viewport ? { viewport: resolvedConfig.viewport } : {}),
|
|
35
|
+
};
|
|
36
|
+
logger?.info('Launching persistent Camoufox session', {
|
|
37
|
+
sessionName,
|
|
38
|
+
executablePath: browser.executablePath,
|
|
39
|
+
headless: resolvedConfig.headless,
|
|
40
|
+
});
|
|
41
|
+
try {
|
|
42
|
+
const context = await firefox.launchPersistentContext(sessionPaths.profileDir, options);
|
|
43
|
+
return {
|
|
44
|
+
context,
|
|
45
|
+
browserVersion: browser.version,
|
|
46
|
+
installPath: browser.executablePath,
|
|
47
|
+
sessionPaths,
|
|
48
|
+
resolvedConfig,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
53
|
+
if (/profile|lock|in use|access denied/i.test(message)) {
|
|
54
|
+
throw new SessionError(`Browser profile for session ${sessionName} appears to be locked by another process. Stop the other browser or use a different session name.`, { sessionName, profileDir: sessionPaths.profileDir }, error);
|
|
55
|
+
}
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export async function probeCamoufoxLaunch(paths, version, logger) {
|
|
60
|
+
const browser = await resolveInstalledBrowser(paths, version);
|
|
61
|
+
if (!browser) {
|
|
62
|
+
return {
|
|
63
|
+
attempted: false,
|
|
64
|
+
success: false,
|
|
65
|
+
error: {
|
|
66
|
+
message: 'No installed Camoufox browser found.',
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
const profileDir = await mkdtemp(path.join(paths.camoufoxCacheDir, 'doctor-profile-'));
|
|
71
|
+
try {
|
|
72
|
+
logger?.info('Running Camoufox launch probe', {
|
|
73
|
+
version: browser.version,
|
|
74
|
+
executablePath: browser.executablePath,
|
|
75
|
+
});
|
|
76
|
+
const context = await firefox.launchPersistentContext(profileDir, {
|
|
77
|
+
executablePath: browser.executablePath,
|
|
78
|
+
headless: true,
|
|
79
|
+
env: buildCamouConfigEnv({}),
|
|
80
|
+
firefoxUserPrefs: {},
|
|
81
|
+
});
|
|
82
|
+
await context.close();
|
|
83
|
+
return {
|
|
84
|
+
attempted: true,
|
|
85
|
+
success: true,
|
|
86
|
+
version: browser.version,
|
|
87
|
+
executablePath: browser.executablePath,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
return {
|
|
92
|
+
attempted: true,
|
|
93
|
+
success: false,
|
|
94
|
+
version: browser.version,
|
|
95
|
+
executablePath: browser.executablePath,
|
|
96
|
+
error: {
|
|
97
|
+
message: summarizeLaunchError(error),
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
finally {
|
|
102
|
+
await rm(profileDir, { recursive: true, force: true });
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=launcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launcher.js","sourceRoot":"","sources":["../../src/camoufox/launcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const firefoxUserPrefsSchema: z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>>;
|
|
3
|
+
export type FirefoxUserPrefs = z.infer<typeof firefoxUserPrefsSchema>;
|
|
4
|
+
export declare function parseFirefoxUserPrefs(input: unknown): FirefoxUserPrefs;
|
|
5
|
+
export declare function mergeFirefoxUserPrefs(...prefs: Array<FirefoxUserPrefs | undefined>): FirefoxUserPrefs;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ValidationError } from '../util/errors.js';
|
|
3
|
+
const prefValueSchema = z.union([
|
|
4
|
+
z.string(),
|
|
5
|
+
z.number(),
|
|
6
|
+
z.boolean(),
|
|
7
|
+
]);
|
|
8
|
+
export const firefoxUserPrefsSchema = z.record(z.string(), prefValueSchema);
|
|
9
|
+
export function parseFirefoxUserPrefs(input) {
|
|
10
|
+
const parsed = firefoxUserPrefsSchema.safeParse(input);
|
|
11
|
+
if (!parsed.success) {
|
|
12
|
+
throw new ValidationError('Firefox user prefs must be a JSON object.');
|
|
13
|
+
}
|
|
14
|
+
return parsed.data;
|
|
15
|
+
}
|
|
16
|
+
export function mergeFirefoxUserPrefs(...prefs) {
|
|
17
|
+
return prefs.reduce((accumulator, current) => {
|
|
18
|
+
if (!current) {
|
|
19
|
+
return accumulator;
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
...accumulator,
|
|
23
|
+
...current,
|
|
24
|
+
};
|
|
25
|
+
}, {});
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=prefs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefs.js","sourceRoot":"","sources":["../../src/camoufox/prefs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC;IAC9B,CAAC,CAAC,MAAM,EAAE;IACV,CAAC,CAAC,MAAM,EAAE;IACV,CAAC,CAAC,OAAO,EAAE;CACZ,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC;AAI5E,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,MAAM,MAAM,GAAG,sBAAsB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACvD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,eAAe,CAAC,2CAA2C,CAAC,CAAC;IACzE,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAG,KAA0C;IACjF,OAAO,KAAK,CAAC,MAAM,CAAmB,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE;QAC7D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,OAAO;YACL,GAAG,WAAW;YACd,GAAG,OAAO;SACX,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { FirefoxUserPrefs } from './prefs.js';
|
|
2
|
+
export interface CamoufoxPresetDefinition {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
camouConfig: Record<string, unknown>;
|
|
6
|
+
firefoxUserPrefs: FirefoxUserPrefs;
|
|
7
|
+
}
|
|
8
|
+
export interface ResolvedPresetBundle {
|
|
9
|
+
presetNames: string[];
|
|
10
|
+
camouConfig: Record<string, unknown>;
|
|
11
|
+
firefoxUserPrefs: FirefoxUserPrefs;
|
|
12
|
+
}
|
|
13
|
+
export declare function listCamoufoxPresets(): CamoufoxPresetDefinition[];
|
|
14
|
+
export declare function resolveCamoufoxPresets(presetNames: string[] | undefined): ResolvedPresetBundle;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { ValidationError } from '../util/errors.js';
|
|
2
|
+
const CACHE_PREFS = {
|
|
3
|
+
'browser.cache.disk.smart_size.enabled': true,
|
|
4
|
+
'browser.cache.disk_cache_ssl': true,
|
|
5
|
+
'browser.cache.memory.enable': true,
|
|
6
|
+
'browser.sessionhistory.max_entries': 10,
|
|
7
|
+
'browser.sessionhistory.max_total_viewers': -1,
|
|
8
|
+
};
|
|
9
|
+
const PRESETS = {
|
|
10
|
+
default: {
|
|
11
|
+
name: 'default',
|
|
12
|
+
description: 'Baseline Camoufox launch with no additional config overrides.',
|
|
13
|
+
camouConfig: {},
|
|
14
|
+
firefoxUserPrefs: {},
|
|
15
|
+
},
|
|
16
|
+
cache: {
|
|
17
|
+
name: 'cache',
|
|
18
|
+
description: 'Enable Firefox cache/session history prefs used by the Python library.',
|
|
19
|
+
camouConfig: {},
|
|
20
|
+
firefoxUserPrefs: CACHE_PREFS,
|
|
21
|
+
},
|
|
22
|
+
'low-bandwidth': {
|
|
23
|
+
name: 'low-bandwidth',
|
|
24
|
+
description: 'Reduce network-heavy assets by blocking images and speculative requests.',
|
|
25
|
+
camouConfig: {},
|
|
26
|
+
firefoxUserPrefs: {
|
|
27
|
+
'network.http.speculative-parallel-limit': 0,
|
|
28
|
+
'permissions.default.image': 2,
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
'disable-coop': {
|
|
32
|
+
name: 'disable-coop',
|
|
33
|
+
description: 'Relax Cross-Origin-Opener-Policy isolation for troublesome embedded flows.',
|
|
34
|
+
camouConfig: {},
|
|
35
|
+
firefoxUserPrefs: {
|
|
36
|
+
'browser.tabs.remote.useCrossOriginOpenerPolicy': false,
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
export function listCamoufoxPresets() {
|
|
41
|
+
return Object.values(PRESETS);
|
|
42
|
+
}
|
|
43
|
+
export function resolveCamoufoxPresets(presetNames) {
|
|
44
|
+
if (!presetNames || presetNames.length === 0) {
|
|
45
|
+
return {
|
|
46
|
+
presetNames: [],
|
|
47
|
+
camouConfig: {},
|
|
48
|
+
firefoxUserPrefs: {},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
const normalizedNames = [...new Set(presetNames.map((presetName) => presetName.trim()).filter(Boolean))];
|
|
52
|
+
const bundle = {
|
|
53
|
+
presetNames: normalizedNames,
|
|
54
|
+
camouConfig: {},
|
|
55
|
+
firefoxUserPrefs: {},
|
|
56
|
+
};
|
|
57
|
+
for (const presetName of normalizedNames) {
|
|
58
|
+
const preset = PRESETS[presetName];
|
|
59
|
+
if (!preset) {
|
|
60
|
+
throw new ValidationError(`Unknown preset: ${presetName}. Available presets: ${listCamoufoxPresets().map((item) => item.name).join(', ')}`);
|
|
61
|
+
}
|
|
62
|
+
bundle.camouConfig = {
|
|
63
|
+
...bundle.camouConfig,
|
|
64
|
+
...preset.camouConfig,
|
|
65
|
+
};
|
|
66
|
+
bundle.firefoxUserPrefs = {
|
|
67
|
+
...bundle.firefoxUserPrefs,
|
|
68
|
+
...preset.firefoxUserPrefs,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
return bundle;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=presets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presets.js","sourceRoot":"","sources":["../../src/camoufox/presets.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAepD,MAAM,WAAW,GAAqB;IACpC,uCAAuC,EAAE,IAAI;IAC7C,8BAA8B,EAAE,IAAI;IACpC,6BAA6B,EAAE,IAAI;IACnC,oCAAoC,EAAE,EAAE;IACxC,0CAA0C,EAAE,CAAC,CAAC;CAC/C,CAAC;AAEF,MAAM,OAAO,GAA6C;IACxD,OAAO,EAAE;QACP,IAAI,EAAE,SAAS;QACf,WAAW,EAAE,+DAA+D;QAC5E,WAAW,EAAE,EAAE;QACf,gBAAgB,EAAE,EAAE;KACrB;IACD,KAAK,EAAE;QACL,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,wEAAwE;QACrF,WAAW,EAAE,EAAE;QACf,gBAAgB,EAAE,WAAW;KAC9B;IACD,eAAe,EAAE;QACf,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,0EAA0E;QACvF,WAAW,EAAE,EAAE;QACf,gBAAgB,EAAE;YAChB,yCAAyC,EAAE,CAAC;YAC5C,2BAA2B,EAAE,CAAC;SAC/B;KACF;IACD,cAAc,EAAE;QACd,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,4EAA4E;QACzF,WAAW,EAAE,EAAE;QACf,gBAAgB,EAAE;YAChB,gDAAgD,EAAE,KAAK;SACxD;KACF;CACF,CAAC;AAEF,MAAM,UAAU,mBAAmB;IACjC,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,WAAiC;IACtE,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7C,OAAO;YACL,WAAW,EAAE,EAAE;YACf,WAAW,EAAE,EAAE;YACf,gBAAgB,EAAE,EAAE;SACrB,CAAC;IACJ,CAAC;IAED,MAAM,eAAe,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACzG,MAAM,MAAM,GAAyB;QACnC,WAAW,EAAE,eAAe;QAC5B,WAAW,EAAE,EAAE;QACf,gBAAgB,EAAE,EAAE;KACrB,CAAC;IAEF,KAAK,MAAM,UAAU,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,eAAe,CACvB,mBAAmB,UAAU,wBAAwB,mBAAmB,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACjH,CAAC;QACJ,CAAC;QAED,MAAM,CAAC,WAAW,GAAG;YACnB,GAAG,MAAM,CAAC,WAAW;YACrB,GAAG,MAAM,CAAC,WAAW;SACtB,CAAC;QACF,MAAM,CAAC,gBAAgB,GAAG;YACxB,GAAG,MAAM,CAAC,gBAAgB;YAC1B,GAAG,MAAM,CAAC,gBAAgB;SAC3B,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { CamoucliPaths } from '../state/paths.js';
|
|
2
|
+
import { type PlatformArch, type PlatformOs } from '../util/platform.js';
|
|
3
|
+
export interface BrowserInstallRecord {
|
|
4
|
+
version: string;
|
|
5
|
+
tag: string;
|
|
6
|
+
sourceRepo: string;
|
|
7
|
+
assetName: string;
|
|
8
|
+
assetUrl: string;
|
|
9
|
+
rootDir: string;
|
|
10
|
+
executablePath: string;
|
|
11
|
+
installedAt: string;
|
|
12
|
+
platform: PlatformOs;
|
|
13
|
+
arch: PlatformArch;
|
|
14
|
+
}
|
|
15
|
+
export interface BrowserRegistry {
|
|
16
|
+
currentVersion?: string | undefined;
|
|
17
|
+
installs: Record<string, BrowserInstallRecord>;
|
|
18
|
+
}
|
|
19
|
+
export interface BrowserInstallListing {
|
|
20
|
+
currentVersion?: string | undefined;
|
|
21
|
+
installs: BrowserInstallRecord[];
|
|
22
|
+
}
|
|
23
|
+
export declare function loadBrowserRegistry(paths: CamoucliPaths): Promise<BrowserRegistry>;
|
|
24
|
+
export declare function saveBrowserRegistry(paths: CamoucliPaths, registry: BrowserRegistry): Promise<void>;
|
|
25
|
+
export declare function setInstalledBrowser(paths: CamoucliPaths, record: BrowserInstallRecord, makeCurrent?: boolean): Promise<BrowserRegistry>;
|
|
26
|
+
export declare function setCurrentBrowser(paths: CamoucliPaths, version: string): Promise<BrowserRegistry>;
|
|
27
|
+
export declare function removeInstalledBrowser(paths: CamoucliPaths, version: string): Promise<BrowserRegistry>;
|
|
28
|
+
export declare function resolveInstalledBrowser(paths: CamoucliPaths, version?: string): Promise<BrowserInstallRecord | undefined>;
|
|
29
|
+
export declare function listInstalledBrowsers(paths: CamoucliPaths): Promise<BrowserInstallListing>;
|
|
30
|
+
export declare function requireInstalledBrowser(paths: CamoucliPaths, version?: string): Promise<BrowserInstallRecord>;
|