camou 0.4.0 → 0.6.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.
@@ -0,0 +1,554 @@
1
+ import { z } from 'zod';
2
+ import { ValidationError } from '../util/errors.js';
3
+ export const fingerprintLocalesValueSchema = z.union([z.string().min(1), z.array(z.string().min(1)).min(1)]);
4
+ export const fingerprintScreenSchema = z.object({
5
+ profile: z.string().optional(),
6
+ width: z.number().int().positive().optional(),
7
+ height: z.number().int().positive().optional(),
8
+ availWidth: z.number().int().positive().optional(),
9
+ availHeight: z.number().int().positive().optional(),
10
+ availTop: z.number().int().nonnegative().optional(),
11
+ availLeft: z.number().int().nonnegative().optional(),
12
+ colorDepth: z.number().int().positive().optional(),
13
+ pixelDepth: z.number().int().positive().optional(),
14
+ devicePixelRatio: z.number().positive().optional(),
15
+ });
16
+ export const fingerprintWindowSchema = z.object({
17
+ profile: z.string().optional(),
18
+ width: z.number().int().positive().optional(),
19
+ height: z.number().int().positive().optional(),
20
+ innerWidth: z.number().int().positive().optional(),
21
+ innerHeight: z.number().int().positive().optional(),
22
+ outerWidth: z.number().int().positive().optional(),
23
+ outerHeight: z.number().int().positive().optional(),
24
+ screenX: z.number().int().optional(),
25
+ screenY: z.number().int().optional(),
26
+ devicePixelRatio: z.number().positive().optional(),
27
+ historyLength: z.number().int().positive().optional(),
28
+ });
29
+ export const fingerprintGeolocationSchema = z.object({
30
+ latitude: z.number().min(-90).max(90),
31
+ longitude: z.number().min(-180).max(180),
32
+ accuracy: z.number().positive().optional(),
33
+ timezone: z.string().optional(),
34
+ region: z.string().optional(),
35
+ webrtcIpv4: z.string().optional(),
36
+ webrtcIpv6: z.string().optional(),
37
+ });
38
+ export const fingerprintHelperSchema = z.object({
39
+ locales: fingerprintLocalesValueSchema.optional(),
40
+ region: z.string().optional(),
41
+ geolocation: fingerprintGeolocationSchema.optional(),
42
+ screenProfile: z.string().optional(),
43
+ screen: z.union([z.string().min(1), fingerprintScreenSchema]).optional(),
44
+ windowProfile: z.string().optional(),
45
+ window: z.union([z.string().min(1), fingerprintWindowSchema]).optional(),
46
+ fonts: z.array(z.string().min(1)).optional(),
47
+ fontSpacingSeed: z.number().int().nonnegative().optional(),
48
+ blockImages: z.boolean().optional(),
49
+ blockWebRtc: z.boolean().optional(),
50
+ blockWebGl: z.boolean().optional(),
51
+ disableCoop: z.boolean().optional(),
52
+ });
53
+ const SCREEN_PROFILES = {
54
+ 'laptop-hd': {
55
+ width: 1366,
56
+ height: 768,
57
+ availWidth: 1366,
58
+ availHeight: 728,
59
+ availTop: 0,
60
+ availLeft: 0,
61
+ colorDepth: 24,
62
+ pixelDepth: 24,
63
+ devicePixelRatio: 1,
64
+ suggestedWindow: {
65
+ innerWidth: 1366,
66
+ innerHeight: 728,
67
+ outerWidth: 1366,
68
+ outerHeight: 768,
69
+ screenX: 0,
70
+ screenY: 0,
71
+ devicePixelRatio: 1,
72
+ historyLength: 1,
73
+ },
74
+ },
75
+ 'desktop-fhd': {
76
+ width: 1920,
77
+ height: 1080,
78
+ availWidth: 1920,
79
+ availHeight: 1040,
80
+ availTop: 0,
81
+ availLeft: 0,
82
+ colorDepth: 24,
83
+ pixelDepth: 24,
84
+ devicePixelRatio: 1,
85
+ suggestedWindow: {
86
+ innerWidth: 1600,
87
+ innerHeight: 940,
88
+ outerWidth: 1600,
89
+ outerHeight: 1020,
90
+ screenX: 160,
91
+ screenY: 20,
92
+ devicePixelRatio: 1,
93
+ historyLength: 1,
94
+ },
95
+ },
96
+ 'desktop-qhd': {
97
+ width: 2560,
98
+ height: 1440,
99
+ availWidth: 2560,
100
+ availHeight: 1400,
101
+ availTop: 0,
102
+ availLeft: 0,
103
+ colorDepth: 24,
104
+ pixelDepth: 24,
105
+ devicePixelRatio: 1,
106
+ suggestedWindow: {
107
+ innerWidth: 1728,
108
+ innerHeight: 1117,
109
+ outerWidth: 1728,
110
+ outerHeight: 1197,
111
+ screenX: 120,
112
+ screenY: 20,
113
+ devicePixelRatio: 1,
114
+ historyLength: 1,
115
+ },
116
+ },
117
+ 'retina-mac': {
118
+ width: 1440,
119
+ height: 900,
120
+ availWidth: 1440,
121
+ availHeight: 860,
122
+ availTop: 0,
123
+ availLeft: 0,
124
+ colorDepth: 24,
125
+ pixelDepth: 24,
126
+ devicePixelRatio: 2,
127
+ suggestedWindow: {
128
+ innerWidth: 1440,
129
+ innerHeight: 780,
130
+ outerWidth: 1440,
131
+ outerHeight: 860,
132
+ screenX: 0,
133
+ screenY: 23,
134
+ devicePixelRatio: 2,
135
+ historyLength: 1,
136
+ },
137
+ },
138
+ };
139
+ const WINDOW_PROFILES = {
140
+ laptop: {
141
+ innerWidth: 1280,
142
+ innerHeight: 688,
143
+ outerWidth: 1366,
144
+ outerHeight: 768,
145
+ screenX: 0,
146
+ screenY: 0,
147
+ devicePixelRatio: 1,
148
+ historyLength: 1,
149
+ },
150
+ desktop: {
151
+ innerWidth: 1440,
152
+ innerHeight: 900,
153
+ outerWidth: 1536,
154
+ outerHeight: 980,
155
+ screenX: 40,
156
+ screenY: 20,
157
+ devicePixelRatio: 1,
158
+ historyLength: 1,
159
+ },
160
+ 'desktop-large': {
161
+ innerWidth: 1600,
162
+ innerHeight: 920,
163
+ outerWidth: 1680,
164
+ outerHeight: 1000,
165
+ screenX: 60,
166
+ screenY: 20,
167
+ devicePixelRatio: 1,
168
+ historyLength: 1,
169
+ },
170
+ retina: {
171
+ innerWidth: 1440,
172
+ innerHeight: 797,
173
+ outerWidth: 1440,
174
+ outerHeight: 875,
175
+ screenX: 0,
176
+ screenY: 23,
177
+ devicePixelRatio: 2,
178
+ historyLength: 1,
179
+ },
180
+ };
181
+ const REGION_PROFILES = {
182
+ AU: { description: 'Australia east coast desktop traffic', locales: ['en-AU', 'en'], timezone: 'Australia/Sydney', latitude: -33.8688, longitude: 151.2093, accuracy: 25 },
183
+ BR: { description: 'Brazil southeast traffic', locales: ['pt-BR', 'pt'], timezone: 'America/Sao_Paulo', latitude: -23.5505, longitude: -46.6333, accuracy: 25 },
184
+ CA: { description: 'Canada central traffic', locales: ['en-CA', 'fr-CA', 'en'], timezone: 'America/Toronto', latitude: 43.6532, longitude: -79.3832, accuracy: 25 },
185
+ CH: { description: 'Switzerland central europe traffic', locales: ['de-CH', 'fr-CH', 'it-CH', 'de'], timezone: 'Europe/Zurich', latitude: 47.3769, longitude: 8.5417, accuracy: 20 },
186
+ DE: { description: 'Germany central europe traffic', locales: ['de-DE', 'de'], timezone: 'Europe/Berlin', latitude: 52.52, longitude: 13.405, accuracy: 20 },
187
+ ES: { description: 'Spain iberian traffic', locales: ['es-ES', 'ca-ES', 'es'], timezone: 'Europe/Madrid', latitude: 40.4168, longitude: -3.7038, accuracy: 20 },
188
+ FR: { description: 'France western europe traffic', locales: ['fr-FR', 'fr'], timezone: 'Europe/Paris', latitude: 48.8566, longitude: 2.3522, accuracy: 20 },
189
+ GB: { description: 'United Kingdom traffic', locales: ['en-GB', 'en'], timezone: 'Europe/London', latitude: 51.5072, longitude: -0.1276, accuracy: 20 },
190
+ HK: { description: 'Hong Kong traffic', locales: ['zh-HK', 'en-HK', 'zh'], timezone: 'Asia/Hong_Kong', latitude: 22.3193, longitude: 114.1694, accuracy: 15 },
191
+ IE: { description: 'Ireland traffic', locales: ['en-IE', 'en'], timezone: 'Europe/Dublin', latitude: 53.3498, longitude: -6.2603, accuracy: 20 },
192
+ IN: { description: 'India metro traffic', locales: ['en-IN', 'hi-IN', 'en'], timezone: 'Asia/Kolkata', latitude: 28.6139, longitude: 77.209, accuracy: 30 },
193
+ IT: { description: 'Italy traffic', locales: ['it-IT', 'it'], timezone: 'Europe/Rome', latitude: 41.9028, longitude: 12.4964, accuracy: 20 },
194
+ JP: { description: 'Japan metro traffic', locales: ['ja-JP', 'ja'], timezone: 'Asia/Tokyo', latitude: 35.6764, longitude: 139.6500, accuracy: 20 },
195
+ KR: { description: 'South Korea metro traffic', locales: ['ko-KR', 'ko'], timezone: 'Asia/Seoul', latitude: 37.5665, longitude: 126.978, accuracy: 20 },
196
+ MX: { description: 'Mexico city traffic', locales: ['es-MX', 'es'], timezone: 'America/Mexico_City', latitude: 19.4326, longitude: -99.1332, accuracy: 25 },
197
+ NL: { description: 'Netherlands traffic', locales: ['nl-NL', 'en-NL', 'nl'], timezone: 'Europe/Amsterdam', latitude: 52.3676, longitude: 4.9041, accuracy: 20 },
198
+ NZ: { description: 'New Zealand traffic', locales: ['en-NZ', 'en'], timezone: 'Pacific/Auckland', latitude: -36.8485, longitude: 174.7633, accuracy: 25 },
199
+ PT: { description: 'Portugal traffic', locales: ['pt-PT', 'pt'], timezone: 'Europe/Lisbon', latitude: 38.7223, longitude: -9.1393, accuracy: 20 },
200
+ SG: { description: 'Singapore traffic', locales: ['en-SG', 'zh-SG', 'ms-SG', 'en'], timezone: 'Asia/Singapore', latitude: 1.3521, longitude: 103.8198, accuracy: 10 },
201
+ TW: { description: 'Taiwan traffic', locales: ['zh-TW', 'zh'], timezone: 'Asia/Taipei', latitude: 25.033, longitude: 121.5654, accuracy: 15 },
202
+ US: { description: 'United States east coast traffic', locales: ['en-US', 'es-US', 'en'], timezone: 'America/New_York', latitude: 40.7128, longitude: -74.006, accuracy: 25 },
203
+ };
204
+ function cloneWindowTemplate(template) {
205
+ return { ...template };
206
+ }
207
+ function cloneScreenTemplate(template) {
208
+ return {
209
+ ...template,
210
+ suggestedWindow: cloneWindowTemplate(template.suggestedWindow),
211
+ };
212
+ }
213
+ function splitListValue(value) {
214
+ if (!value) {
215
+ return undefined;
216
+ }
217
+ const items = (Array.isArray(value) ? value : value.split(','))
218
+ .map((entry) => entry.trim())
219
+ .filter(Boolean);
220
+ return items.length > 0 ? [...new Set(items)] : undefined;
221
+ }
222
+ function expandLocaleChain(locales) {
223
+ const expanded = [];
224
+ for (const locale of locales) {
225
+ if (!expanded.includes(locale)) {
226
+ expanded.push(locale);
227
+ }
228
+ const normalized = new Intl.Locale(locale).baseName;
229
+ if (!expanded.includes(normalized)) {
230
+ expanded.push(normalized);
231
+ }
232
+ const language = new Intl.Locale(locale).language;
233
+ if (!expanded.includes(language)) {
234
+ expanded.push(language);
235
+ }
236
+ }
237
+ return expanded;
238
+ }
239
+ function formatAcceptLanguage(locales) {
240
+ return locales
241
+ .map((locale, index) => {
242
+ if (index === 0) {
243
+ return `${locale};q=1.0`;
244
+ }
245
+ const quality = Math.max(0.1, 1 - index * 0.1).toFixed(1);
246
+ return `${locale};q=${quality}`;
247
+ })
248
+ .join(', ');
249
+ }
250
+ function normalizeRegionCode(value) {
251
+ const trimmed = value?.trim().toUpperCase();
252
+ return trimmed ? trimmed : undefined;
253
+ }
254
+ function resolveRegionProfile(regionInput) {
255
+ const regionCode = normalizeRegionCode(regionInput);
256
+ if (!regionCode) {
257
+ return undefined;
258
+ }
259
+ const profile = REGION_PROFILES[regionCode];
260
+ if (!profile) {
261
+ throw new ValidationError(`Unknown region profile: ${regionCode}. Available regions: ${Object.keys(REGION_PROFILES).join(', ')}`);
262
+ }
263
+ return profile;
264
+ }
265
+ function resolveLocaleHelpers(localesInput) {
266
+ const locales = splitListValue(localesInput);
267
+ if (!locales || locales.length === 0) {
268
+ return {
269
+ camouConfig: {},
270
+ };
271
+ }
272
+ for (const locale of locales) {
273
+ if (Intl.DateTimeFormat.supportedLocalesOf([locale]).length === 0) {
274
+ throw new ValidationError(`Invalid locale: ${locale}`);
275
+ }
276
+ }
277
+ const expandedLocales = expandLocaleChain(locales);
278
+ const primaryLocaleValue = locales[0];
279
+ if (!primaryLocaleValue) {
280
+ throw new ValidationError('At least one locale is required when using locale helpers.');
281
+ }
282
+ const primaryLocale = new Intl.Locale(primaryLocaleValue).maximize();
283
+ return {
284
+ locale: primaryLocaleValue,
285
+ camouConfig: {
286
+ 'navigator.language': primaryLocaleValue,
287
+ 'navigator.languages': expandedLocales,
288
+ 'locale:language': primaryLocale.language,
289
+ ...(primaryLocale.region ? { 'locale:region': primaryLocale.region } : {}),
290
+ ...(primaryLocale.script ? { 'locale:script': primaryLocale.script } : {}),
291
+ 'locale:all': expandedLocales.join(', '),
292
+ 'headers.Accept-Language': formatAcceptLanguage(expandedLocales),
293
+ },
294
+ };
295
+ }
296
+ function resolveGeolocationHelpers(input) {
297
+ const regionProfile = resolveRegionProfile(input.region ?? input.geolocation?.region);
298
+ const latitude = input.geolocation?.latitude ?? regionProfile?.latitude;
299
+ const longitude = input.geolocation?.longitude ?? regionProfile?.longitude;
300
+ const accuracy = input.geolocation?.accuracy ?? regionProfile?.accuracy;
301
+ const timezone = input.geolocation?.timezone ?? regionProfile?.timezone;
302
+ const regionCode = normalizeRegionCode(input.geolocation?.region ?? input.region);
303
+ if ((latitude !== undefined && longitude === undefined) || (latitude === undefined && longitude !== undefined)) {
304
+ throw new ValidationError('Both geolocation latitude and longitude are required when setting geolocation helpers.');
305
+ }
306
+ if (timezone) {
307
+ try {
308
+ new Intl.DateTimeFormat('en-US', { timeZone: timezone }).format(new Date());
309
+ }
310
+ catch (error) {
311
+ throw new ValidationError(`Invalid timezone: ${timezone}`, undefined, error);
312
+ }
313
+ }
314
+ if (regionCode && !regionProfile && (latitude !== undefined || timezone !== undefined)) {
315
+ throw new ValidationError(`Unknown region profile: ${regionCode}.`);
316
+ }
317
+ return {
318
+ timezoneId: timezone,
319
+ camouConfig: {
320
+ ...(latitude !== undefined ? { 'geolocation:latitude': latitude } : {}),
321
+ ...(longitude !== undefined ? { 'geolocation:longitude': longitude } : {}),
322
+ ...(accuracy !== undefined ? { 'geolocation:accuracy': accuracy } : {}),
323
+ ...(timezone ? { timezone } : {}),
324
+ ...(input.geolocation?.webrtcIpv4 ? { 'webrtc:ipv4': input.geolocation.webrtcIpv4 } : {}),
325
+ ...(input.geolocation?.webrtcIpv6 ? { 'webrtc:ipv6': input.geolocation.webrtcIpv6 } : {}),
326
+ },
327
+ };
328
+ }
329
+ function asScreenProfileName(value) {
330
+ if (!value) {
331
+ return undefined;
332
+ }
333
+ if (!(value in SCREEN_PROFILES)) {
334
+ throw new ValidationError(`Unknown screen profile: ${value}. Available screen profiles: ${Object.keys(SCREEN_PROFILES).join(', ')}`);
335
+ }
336
+ return value;
337
+ }
338
+ function asWindowProfileName(value) {
339
+ if (!value) {
340
+ return undefined;
341
+ }
342
+ if (!(value in WINDOW_PROFILES)) {
343
+ throw new ValidationError(`Unknown window profile: ${value}. Available window profiles: ${Object.keys(WINDOW_PROFILES).join(', ')}`);
344
+ }
345
+ return value;
346
+ }
347
+ function isScreenObject(value) {
348
+ return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
349
+ }
350
+ function isWindowObject(value) {
351
+ return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
352
+ }
353
+ function resolveScreenTemplate(input) {
354
+ const profileName = asScreenProfileName(input.screenProfile ?? (typeof input.screen === 'string' ? input.screen : input.screen?.profile));
355
+ const profile = profileName ? cloneScreenTemplate(SCREEN_PROFILES[profileName]) : undefined;
356
+ if (!isScreenObject(input.screen)) {
357
+ return profile;
358
+ }
359
+ const width = input.screen.width ?? profile?.width;
360
+ const height = input.screen.height ?? profile?.height;
361
+ if ((input.screen.width !== undefined || input.screen.height !== undefined) && (!width || !height)) {
362
+ throw new ValidationError('Both screen width and height are required when overriding screen dimensions.');
363
+ }
364
+ if (!width || !height) {
365
+ return profile;
366
+ }
367
+ const availWidth = input.screen.availWidth ?? profile?.availWidth ?? width;
368
+ const availHeight = input.screen.availHeight ?? profile?.availHeight ?? Math.max(1, height - 40);
369
+ return {
370
+ width,
371
+ height,
372
+ availWidth,
373
+ availHeight,
374
+ availTop: input.screen.availTop ?? profile?.availTop ?? 0,
375
+ availLeft: input.screen.availLeft ?? profile?.availLeft ?? 0,
376
+ colorDepth: input.screen.colorDepth ?? profile?.colorDepth ?? 24,
377
+ pixelDepth: input.screen.pixelDepth ?? input.screen.colorDepth ?? profile?.pixelDepth ?? profile?.colorDepth ?? 24,
378
+ devicePixelRatio: input.screen.devicePixelRatio ?? profile?.devicePixelRatio ?? 1,
379
+ suggestedWindow: profile?.suggestedWindow ?? {
380
+ innerWidth: availWidth,
381
+ innerHeight: availHeight,
382
+ outerWidth: width,
383
+ outerHeight: height,
384
+ screenX: 0,
385
+ screenY: Math.max(0, height - availHeight),
386
+ devicePixelRatio: input.screen.devicePixelRatio ?? profile?.devicePixelRatio ?? 1,
387
+ historyLength: 1,
388
+ },
389
+ };
390
+ }
391
+ function resolveWindowTemplate(input, screen) {
392
+ const profileName = asWindowProfileName(input.windowProfile ?? (typeof input.window === 'string' ? input.window : input.window?.profile));
393
+ const base = profileName
394
+ ? cloneWindowTemplate(WINDOW_PROFILES[profileName])
395
+ : screen
396
+ ? cloneWindowTemplate(screen.suggestedWindow)
397
+ : undefined;
398
+ if (!isWindowObject(input.window)) {
399
+ return base;
400
+ }
401
+ const innerWidth = input.window.innerWidth ?? input.window.width ?? base?.innerWidth;
402
+ const innerHeight = input.window.innerHeight ?? input.window.height ?? base?.innerHeight;
403
+ const outerWidth = input.window.outerWidth ?? base?.outerWidth ?? innerWidth;
404
+ const outerHeight = input.window.outerHeight ?? base?.outerHeight ?? (innerHeight ? innerHeight + 80 : undefined);
405
+ if ((input.window.width !== undefined || input.window.height !== undefined) && (!innerWidth || !innerHeight)) {
406
+ throw new ValidationError('Both window width and height are required when overriding window dimensions.');
407
+ }
408
+ if (!innerWidth || !innerHeight || !outerWidth || !outerHeight) {
409
+ return base;
410
+ }
411
+ return {
412
+ innerWidth,
413
+ innerHeight,
414
+ outerWidth,
415
+ outerHeight,
416
+ screenX: input.window.screenX ?? base?.screenX ?? 0,
417
+ screenY: input.window.screenY ?? base?.screenY ?? 0,
418
+ devicePixelRatio: input.window.devicePixelRatio ?? base?.devicePixelRatio ?? screen?.devicePixelRatio ?? 1,
419
+ historyLength: input.window.historyLength ?? base?.historyLength ?? 1,
420
+ };
421
+ }
422
+ function buildScreenCamouConfig(screen) {
423
+ if (!screen) {
424
+ return {};
425
+ }
426
+ return {
427
+ 'screen.width': screen.width,
428
+ 'screen.height': screen.height,
429
+ 'screen.availWidth': screen.availWidth,
430
+ 'screen.availHeight': screen.availHeight,
431
+ 'screen.availTop': screen.availTop,
432
+ 'screen.availLeft': screen.availLeft,
433
+ 'screen.colorDepth': screen.colorDepth,
434
+ 'screen.pixelDepth': screen.pixelDepth,
435
+ 'window.devicePixelRatio': screen.devicePixelRatio,
436
+ };
437
+ }
438
+ function buildWindowCamouConfig(window) {
439
+ if (!window) {
440
+ return {};
441
+ }
442
+ return {
443
+ 'window.outerWidth': window.outerWidth,
444
+ 'window.outerHeight': window.outerHeight,
445
+ 'window.innerWidth': window.innerWidth,
446
+ 'window.innerHeight': window.innerHeight,
447
+ 'window.screenX': window.screenX,
448
+ 'window.screenY': window.screenY,
449
+ 'window.devicePixelRatio': window.devicePixelRatio,
450
+ 'window.history.length': window.historyLength,
451
+ };
452
+ }
453
+ export function mergeFingerprintHelpers(base, override) {
454
+ if (!base) {
455
+ return override;
456
+ }
457
+ if (!override) {
458
+ return base;
459
+ }
460
+ return {
461
+ ...base,
462
+ ...override,
463
+ ...(base.geolocation && override.geolocation
464
+ ? { geolocation: { ...base.geolocation, ...override.geolocation } }
465
+ : {}),
466
+ ...(base.screen && override.screen && isScreenObject(base.screen) && isScreenObject(override.screen)
467
+ ? { screen: { ...base.screen, ...override.screen } }
468
+ : {}),
469
+ ...(base.window && override.window && isWindowObject(base.window) && isWindowObject(override.window)
470
+ ? { window: { ...base.window, ...override.window } }
471
+ : {}),
472
+ };
473
+ }
474
+ export function resolveFingerprintHelpers(input) {
475
+ if (!input) {
476
+ return {
477
+ camouConfig: {},
478
+ firefoxUserPrefs: {},
479
+ };
480
+ }
481
+ const regionProfile = resolveRegionProfile(input.region ?? input.geolocation?.region);
482
+ const localeHelpers = resolveLocaleHelpers(input.locales ?? regionProfile?.locales);
483
+ const geolocationHelpers = resolveGeolocationHelpers(input);
484
+ const screen = resolveScreenTemplate(input);
485
+ const window = resolveWindowTemplate(input, screen);
486
+ const firefoxUserPrefs = {
487
+ ...(input.blockImages ? { 'permissions.default.image': 2 } : {}),
488
+ ...(input.blockWebRtc ? { 'media.peerconnection.enabled': false } : {}),
489
+ ...(input.blockWebGl ? { 'webgl.disabled': true } : {}),
490
+ ...(input.disableCoop ? { 'browser.tabs.remote.useCrossOriginOpenerPolicy': false } : {}),
491
+ };
492
+ return {
493
+ camouConfig: {
494
+ ...localeHelpers.camouConfig,
495
+ ...geolocationHelpers.camouConfig,
496
+ ...buildScreenCamouConfig(screen),
497
+ ...buildWindowCamouConfig(window),
498
+ ...(input.fonts && input.fonts.length > 0 ? { fonts: [...new Set(input.fonts)] } : {}),
499
+ ...(input.fontSpacingSeed !== undefined ? { 'fonts:spacing_seed': input.fontSpacingSeed } : {}),
500
+ },
501
+ firefoxUserPrefs,
502
+ locale: localeHelpers.locale,
503
+ timezoneId: geolocationHelpers.timezoneId,
504
+ viewport: window
505
+ ? {
506
+ width: window.innerWidth,
507
+ height: window.innerHeight,
508
+ }
509
+ : undefined,
510
+ };
511
+ }
512
+ export function listFingerprintScreenProfiles() {
513
+ return Object.keys(SCREEN_PROFILES);
514
+ }
515
+ export function listFingerprintWindowProfiles() {
516
+ return Object.keys(WINDOW_PROFILES);
517
+ }
518
+ export function describeFingerprintScreenProfiles() {
519
+ return Object.entries(SCREEN_PROFILES).map(([name, profile]) => ({
520
+ name,
521
+ width: profile.width,
522
+ height: profile.height,
523
+ availWidth: profile.availWidth,
524
+ availHeight: profile.availHeight,
525
+ devicePixelRatio: profile.devicePixelRatio,
526
+ suggestedWindow: {
527
+ innerWidth: profile.suggestedWindow.innerWidth,
528
+ innerHeight: profile.suggestedWindow.innerHeight,
529
+ outerWidth: profile.suggestedWindow.outerWidth,
530
+ outerHeight: profile.suggestedWindow.outerHeight,
531
+ },
532
+ }));
533
+ }
534
+ export function describeFingerprintWindowProfiles() {
535
+ return Object.entries(WINDOW_PROFILES).map(([name, profile]) => ({
536
+ name,
537
+ innerWidth: profile.innerWidth,
538
+ innerHeight: profile.innerHeight,
539
+ outerWidth: profile.outerWidth,
540
+ outerHeight: profile.outerHeight,
541
+ devicePixelRatio: profile.devicePixelRatio,
542
+ }));
543
+ }
544
+ export function describeFingerprintRegionProfiles() {
545
+ return Object.entries(REGION_PROFILES).map(([region, profile]) => ({
546
+ region,
547
+ description: profile.description,
548
+ locales: [...profile.locales],
549
+ timezone: profile.timezone,
550
+ latitude: profile.latitude,
551
+ longitude: profile.longitude,
552
+ }));
553
+ }
554
+ //# sourceMappingURL=fingerprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../../src/camoufox/fingerprint.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,9 @@ export interface ResolvedRelease {
9
9
  assetUrl: string;
10
10
  prerelease: boolean;
11
11
  }
12
+ export interface RemoteCamoufoxRelease extends ResolvedRelease {
13
+ }
14
+ export declare function listRemoteCamoufoxReleases(): Promise<RemoteCamoufoxRelease[]>;
12
15
  export declare function resolveRelease(version?: string): Promise<ResolvedRelease>;
13
16
  export declare function installCamoufox(paths: CamoucliPaths, options?: {
14
17
  version?: string | undefined;
@@ -26,16 +26,19 @@ async function fetchJson(url) {
26
26
  }
27
27
  return response.json();
28
28
  }
29
- export async function resolveRelease(version) {
29
+ async function scanCompatibleReleases(options) {
30
30
  const target = getPlatformTarget();
31
- const normalizedVersion = version ? normalizeReleaseVersion(version) : undefined;
31
+ const normalizedVersion = options?.version ? normalizeReleaseVersion(options.version) : undefined;
32
32
  const expectedAssetName = normalizedVersion
33
33
  ? buildExpectedAssetName(normalizedVersion, target)
34
34
  : undefined;
35
+ const compatibleReleases = new Map();
35
36
  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`;
37
+ const apiUrl = options?.latestOnly
38
+ ? `https://api.github.com/repos/${repo}/releases/latest`
39
+ : normalizedVersion
40
+ ? `https://api.github.com/repos/${repo}/releases`
41
+ : `https://api.github.com/repos/${repo}/releases`;
39
42
  const payload = await fetchJson(apiUrl);
40
43
  const releases = Array.isArray(payload) ? payload : [payload];
41
44
  for (const release of releases) {
@@ -48,7 +51,7 @@ export async function resolveRelease(version) {
48
51
  if (!asset) {
49
52
  continue;
50
53
  }
51
- return {
54
+ const resolvedRelease = {
52
55
  repo,
53
56
  tag: release.tag_name,
54
57
  version: releaseVersion,
@@ -56,8 +59,25 @@ export async function resolveRelease(version) {
56
59
  assetUrl: asset.browser_download_url,
57
60
  prerelease: release.prerelease ?? false,
58
61
  };
62
+ if (normalizedVersion || options?.latestOnly) {
63
+ return [resolvedRelease];
64
+ }
65
+ if (!compatibleReleases.has(releaseVersion)) {
66
+ compatibleReleases.set(releaseVersion, resolvedRelease);
67
+ }
59
68
  }
60
69
  }
70
+ return Array.from(compatibleReleases.values()).sort((left, right) => right.version.localeCompare(left.version, undefined, { numeric: true }));
71
+ }
72
+ export async function listRemoteCamoufoxReleases() {
73
+ return scanCompatibleReleases();
74
+ }
75
+ export async function resolveRelease(version) {
76
+ const compatibleReleases = await scanCompatibleReleases({ version, latestOnly: !version });
77
+ const release = compatibleReleases[0];
78
+ if (release) {
79
+ return release;
80
+ }
61
81
  throw new InstallError(version
62
82
  ? `Unable to find Camoufox release ${version} for this platform.`
63
83
  : 'Unable to find a compatible Camoufox release for this platform.');