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.
Files changed (89) hide show
  1. package/README.md +229 -0
  2. package/dist/browser/actions.d.ts +4 -0
  3. package/dist/browser/actions.js +15 -0
  4. package/dist/browser/actions.js.map +1 -0
  5. package/dist/browser/manager.d.ts +85 -0
  6. package/dist/browser/manager.js +300 -0
  7. package/dist/browser/manager.js.map +1 -0
  8. package/dist/browser/snapshot.d.ts +17 -0
  9. package/dist/browser/snapshot.js +93 -0
  10. package/dist/browser/snapshot.js.map +1 -0
  11. package/dist/browser/tabs.d.ts +24 -0
  12. package/dist/browser/tabs.js +8 -0
  13. package/dist/browser/tabs.js.map +1 -0
  14. package/dist/camoufox/config.d.ts +67 -0
  15. package/dist/camoufox/config.js +121 -0
  16. package/dist/camoufox/config.js.map +1 -0
  17. package/dist/camoufox/env.d.ts +3 -0
  18. package/dist/camoufox/env.js +27 -0
  19. package/dist/camoufox/env.js.map +1 -0
  20. package/dist/camoufox/installer.d.ts +24 -0
  21. package/dist/camoufox/installer.js +291 -0
  22. package/dist/camoufox/installer.js.map +1 -0
  23. package/dist/camoufox/launcher.d.ts +22 -0
  24. package/dist/camoufox/launcher.js +105 -0
  25. package/dist/camoufox/launcher.js.map +1 -0
  26. package/dist/camoufox/prefs.d.ts +5 -0
  27. package/dist/camoufox/prefs.js +27 -0
  28. package/dist/camoufox/prefs.js.map +1 -0
  29. package/dist/camoufox/presets.d.ts +14 -0
  30. package/dist/camoufox/presets.js +73 -0
  31. package/dist/camoufox/presets.js.map +1 -0
  32. package/dist/camoufox/registry.d.ts +30 -0
  33. package/dist/camoufox/registry.js +195 -0
  34. package/dist/camoufox/registry.js.map +1 -0
  35. package/dist/camoufox/validation.d.ts +4 -0
  36. package/dist/camoufox/validation.js +103 -0
  37. package/dist/camoufox/validation.js.map +1 -0
  38. package/dist/cli/daemon.d.ts +2 -0
  39. package/dist/cli/daemon.js +59 -0
  40. package/dist/cli/daemon.js.map +1 -0
  41. package/dist/cli/main.d.ts +2 -0
  42. package/dist/cli/main.js +147 -0
  43. package/dist/cli/main.js.map +1 -0
  44. package/dist/cli/output.d.ts +1 -0
  45. package/dist/cli/output.js +108 -0
  46. package/dist/cli/output.js.map +1 -0
  47. package/dist/cli/program.d.ts +42 -0
  48. package/dist/cli/program.js +214 -0
  49. package/dist/cli/program.js.map +1 -0
  50. package/dist/daemon/daemon.d.ts +12 -0
  51. package/dist/daemon/daemon.js +36 -0
  52. package/dist/daemon/daemon.js.map +1 -0
  53. package/dist/daemon/main.d.ts +2 -0
  54. package/dist/daemon/main.js +28 -0
  55. package/dist/daemon/main.js.map +1 -0
  56. package/dist/daemon/router.d.ts +7 -0
  57. package/dist/daemon/router.js +43 -0
  58. package/dist/daemon/router.js.map +1 -0
  59. package/dist/daemon/runtime.d.ts +11 -0
  60. package/dist/daemon/runtime.js +54 -0
  61. package/dist/daemon/runtime.js.map +1 -0
  62. package/dist/doctor/diagnostics.d.ts +38 -0
  63. package/dist/doctor/diagnostics.js +152 -0
  64. package/dist/doctor/diagnostics.js.map +1 -0
  65. package/dist/ipc/client.d.ts +6 -0
  66. package/dist/ipc/client.js +63 -0
  67. package/dist/ipc/client.js.map +1 -0
  68. package/dist/ipc/protocol.d.ts +775 -0
  69. package/dist/ipc/protocol.js +128 -0
  70. package/dist/ipc/protocol.js.map +1 -0
  71. package/dist/ipc/server.d.ts +10 -0
  72. package/dist/ipc/server.js +99 -0
  73. package/dist/ipc/server.js.map +1 -0
  74. package/dist/state/paths.d.ts +32 -0
  75. package/dist/state/paths.js +121 -0
  76. package/dist/state/paths.js.map +1 -0
  77. package/dist/state/store.d.ts +4 -0
  78. package/dist/state/store.js +30 -0
  79. package/dist/state/store.js.map +1 -0
  80. package/dist/util/errors.d.ts +45 -0
  81. package/dist/util/errors.js +82 -0
  82. package/dist/util/errors.js.map +1 -0
  83. package/dist/util/log.d.ts +19 -0
  84. package/dist/util/log.js +71 -0
  85. package/dist/util/log.js.map +1 -0
  86. package/dist/util/platform.d.ts +12 -0
  87. package/dist/util/platform.js +44 -0
  88. package/dist/util/platform.js.map +1 -0
  89. package/package.json +58 -0
@@ -0,0 +1,128 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { z } from 'zod';
3
+ import { launchInputSchema } from '../camoufox/config.js';
4
+ const browserRequestBase = launchInputSchema.extend({
5
+ id: z.string(),
6
+ session: z.string().min(1),
7
+ tabName: z.string().min(1),
8
+ });
9
+ const pingRequestSchema = z.object({
10
+ id: z.string(),
11
+ action: z.literal('ping'),
12
+ });
13
+ const openRequestSchema = browserRequestBase.extend({
14
+ action: z.literal('open'),
15
+ url: z.string().min(1),
16
+ });
17
+ const snapshotRequestSchema = browserRequestBase.extend({
18
+ action: z.literal('snapshot'),
19
+ interactive: z.boolean().default(false),
20
+ });
21
+ const clickRequestSchema = browserRequestBase.extend({
22
+ action: z.literal('click'),
23
+ target: z.string().min(1),
24
+ });
25
+ const fillRequestSchema = browserRequestBase.extend({
26
+ action: z.literal('fill'),
27
+ target: z.string().min(1),
28
+ text: z.string(),
29
+ });
30
+ const pressRequestSchema = browserRequestBase.extend({
31
+ action: z.literal('press'),
32
+ key: z.string().min(1),
33
+ });
34
+ const screenshotRequestSchema = browserRequestBase.extend({
35
+ action: z.literal('screenshot'),
36
+ path: z.string().optional(),
37
+ });
38
+ const getUrlRequestSchema = browserRequestBase.extend({
39
+ action: z.literal('get.url'),
40
+ });
41
+ const getTitleRequestSchema = browserRequestBase.extend({
42
+ action: z.literal('get.title'),
43
+ });
44
+ const getTextRequestSchema = browserRequestBase.extend({
45
+ action: z.literal('get.text'),
46
+ target: z.string().min(1),
47
+ });
48
+ const waitRequestSchema = browserRequestBase.extend({
49
+ action: z.literal('wait'),
50
+ target: z.string().min(1),
51
+ timeoutMs: z.number().int().positive().optional(),
52
+ });
53
+ const sessionListRequestSchema = z.object({
54
+ id: z.string(),
55
+ action: z.literal('session.list'),
56
+ });
57
+ const sessionStopRequestSchema = z.object({
58
+ id: z.string(),
59
+ action: z.literal('session.stop'),
60
+ session: z.string().min(1),
61
+ });
62
+ const tabListRequestSchema = z.object({
63
+ id: z.string(),
64
+ action: z.literal('tab.list'),
65
+ session: z.string().min(1),
66
+ });
67
+ const tabNewRequestSchema = browserRequestBase.extend({
68
+ action: z.literal('tab.new'),
69
+ url: z.string().min(1).optional(),
70
+ });
71
+ const tabCloseRequestSchema = z.object({
72
+ id: z.string(),
73
+ action: z.literal('tab.close'),
74
+ session: z.string().min(1),
75
+ target: z.string().min(1),
76
+ });
77
+ export const daemonRequestSchema = z.discriminatedUnion('action', [
78
+ pingRequestSchema,
79
+ openRequestSchema,
80
+ snapshotRequestSchema,
81
+ clickRequestSchema,
82
+ fillRequestSchema,
83
+ pressRequestSchema,
84
+ screenshotRequestSchema,
85
+ getUrlRequestSchema,
86
+ getTitleRequestSchema,
87
+ getTextRequestSchema,
88
+ waitRequestSchema,
89
+ sessionListRequestSchema,
90
+ sessionStopRequestSchema,
91
+ tabListRequestSchema,
92
+ tabNewRequestSchema,
93
+ tabCloseRequestSchema,
94
+ ]);
95
+ const successResponseSchema = z.object({
96
+ id: z.string(),
97
+ success: z.literal(true),
98
+ data: z.unknown(),
99
+ });
100
+ const errorPayloadSchema = z.object({
101
+ code: z.string(),
102
+ message: z.string(),
103
+ details: z.unknown().optional(),
104
+ });
105
+ const failureResponseSchema = z.object({
106
+ id: z.string(),
107
+ success: z.literal(false),
108
+ error: errorPayloadSchema,
109
+ });
110
+ export const daemonResponseSchema = z.union([successResponseSchema, failureResponseSchema]);
111
+ export function createRequestId() {
112
+ return `req_${randomUUID()}`;
113
+ }
114
+ export function successResponse(id, data) {
115
+ return {
116
+ id,
117
+ success: true,
118
+ data,
119
+ };
120
+ }
121
+ export function failureResponse(id, error) {
122
+ return {
123
+ id,
124
+ success: false,
125
+ error,
126
+ };
127
+ }
128
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/ipc/protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type Server } from 'node:net';
2
+ import type { CamoucliPaths } from '../state/paths.js';
3
+ import type { Logger } from '../util/log.js';
4
+ import { type DaemonRequest } from './protocol.js';
5
+ export interface IpcServerHandle {
6
+ server: Server;
7
+ close: () => Promise<void>;
8
+ }
9
+ export type RequestHandler = (request: DaemonRequest) => Promise<unknown>;
10
+ export declare function createIpcServer(paths: CamoucliPaths, handler: RequestHandler, logger: Logger): Promise<IpcServerHandle>;
@@ -0,0 +1,99 @@
1
+ import net, {} from 'node:net';
2
+ import { unlink } from 'node:fs/promises';
3
+ import { isCamoucliError, toErrorPayload, ValidationError } from '../util/errors.js';
4
+ import { daemonRequestSchema, daemonResponseSchema, failureResponse, successResponse, } from './protocol.js';
5
+ const HTTP_PREFIXES = ['GET ', 'POST ', 'PUT ', 'DELETE ', 'PATCH ', 'HEAD ', 'OPTIONS '];
6
+ function isHttpTraffic(line) {
7
+ return HTTP_PREFIXES.some((prefix) => line.startsWith(prefix));
8
+ }
9
+ async function removeStaleSocket(socketPath) {
10
+ try {
11
+ await unlink(socketPath);
12
+ }
13
+ catch (error) {
14
+ if (!(error instanceof Error) || !('code' in error) || error.code !== 'ENOENT') {
15
+ throw error;
16
+ }
17
+ }
18
+ }
19
+ function respond(socket, response) {
20
+ const payload = daemonResponseSchema.parse(response);
21
+ socket.write(`${JSON.stringify(payload)}\n`);
22
+ }
23
+ export async function createIpcServer(paths, handler, logger) {
24
+ if (paths.daemonSocketPath) {
25
+ await removeStaleSocket(paths.daemonSocketPath);
26
+ }
27
+ const server = net.createServer((socket) => {
28
+ socket.setEncoding('utf8');
29
+ let buffer = '';
30
+ socket.on('data', (chunk) => {
31
+ buffer += chunk;
32
+ const lines = buffer.split('\n');
33
+ buffer = lines.pop() ?? '';
34
+ for (const line of lines) {
35
+ const trimmed = line.trim();
36
+ if (!trimmed) {
37
+ continue;
38
+ }
39
+ if (isHttpTraffic(trimmed)) {
40
+ logger.warn('Rejected accidental HTTP traffic');
41
+ socket.end('camou-daemon only accepts newline-delimited JSON\n');
42
+ return;
43
+ }
44
+ void (async () => {
45
+ let requestId = 'unknown';
46
+ try {
47
+ const parsed = JSON.parse(trimmed);
48
+ if (typeof parsed === 'object' && parsed && 'id' in parsed && typeof parsed.id === 'string') {
49
+ requestId = parsed.id;
50
+ }
51
+ const request = daemonRequestSchema.parse(parsed);
52
+ const data = await handler(request);
53
+ respond(socket, successResponse(request.id, data));
54
+ }
55
+ catch (error) {
56
+ const normalized = isCamoucliError(error)
57
+ ? error
58
+ : error instanceof Error && error.name === 'ZodError'
59
+ ? new ValidationError('Invalid daemon request payload.')
60
+ : error;
61
+ logger.error('Request handling failed', { requestId, error: toErrorPayload(normalized) });
62
+ respond(socket, failureResponse(requestId, toErrorPayload(normalized)));
63
+ }
64
+ })();
65
+ }
66
+ });
67
+ });
68
+ await new Promise((resolve, reject) => {
69
+ server.once('error', reject);
70
+ if (paths.daemonSocketPath) {
71
+ server.listen(paths.daemonSocketPath, resolve);
72
+ return;
73
+ }
74
+ server.listen(paths.daemonPort, paths.daemonHost, resolve);
75
+ });
76
+ logger.info('IPC server listening', {
77
+ socketPath: paths.daemonSocketPath,
78
+ host: paths.daemonHost,
79
+ port: paths.daemonPort,
80
+ });
81
+ return {
82
+ server,
83
+ close: async () => {
84
+ await new Promise((resolve, reject) => {
85
+ server.close((error) => {
86
+ if (error) {
87
+ reject(error);
88
+ return;
89
+ }
90
+ resolve();
91
+ });
92
+ });
93
+ if (paths.daemonSocketPath) {
94
+ await removeStaleSocket(paths.daemonSocketPath);
95
+ }
96
+ },
97
+ };
98
+ }
99
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/ipc/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export interface CamoucliPaths {
2
+ appName: string;
3
+ dataDir: string;
4
+ stateDir: string;
5
+ cacheDir: string;
6
+ camoufoxCacheDir: string;
7
+ camoufoxConfigFile: string;
8
+ runtimeDir: string;
9
+ logsDir: string;
10
+ browsersDir: string;
11
+ browserRegistryFile: string;
12
+ profilesDir: string;
13
+ presetsDir: string;
14
+ daemonSocketPath?: string | undefined;
15
+ daemonHost?: string | undefined;
16
+ daemonPort?: number | undefined;
17
+ daemonPidFile: string;
18
+ daemonLogFile: string;
19
+ }
20
+ export interface SessionPaths {
21
+ sessionName: string;
22
+ safeSessionName: string;
23
+ rootDir: string;
24
+ profileDir: string;
25
+ downloadsDir: string;
26
+ artifactsDir: string;
27
+ }
28
+ export declare function sanitizeName(value: string): string;
29
+ export declare function getCamoucliPaths(env?: NodeJS.ProcessEnv, platform?: NodeJS.Platform): CamoucliPaths;
30
+ export declare function ensureBasePaths(paths: CamoucliPaths): Promise<void>;
31
+ export declare function getSessionPaths(paths: CamoucliPaths, sessionName: string): SessionPaths;
32
+ export declare function ensureSessionPaths(paths: CamoucliPaths, sessionName: string): Promise<SessionPaths>;
@@ -0,0 +1,121 @@
1
+ import os from 'node:os';
2
+ import path from 'node:path';
3
+ import { UnsupportedPlatformError } from '../util/errors.js';
4
+ import { ensureDir } from './store.js';
5
+ function linuxBaseDirs(env, home) {
6
+ const dataRoot = env.XDG_DATA_HOME ?? path.join(home, '.local', 'share');
7
+ const stateRoot = env.XDG_STATE_HOME ?? path.join(home, '.local', 'state');
8
+ const cacheRoot = env.XDG_CACHE_HOME ?? path.join(home, '.cache');
9
+ const runtimeDir = env.XDG_RUNTIME_DIR
10
+ ? path.join(env.XDG_RUNTIME_DIR, 'camoucli')
11
+ : path.join(stateRoot, 'camoucli', 'runtime');
12
+ return {
13
+ dataDir: path.join(dataRoot, 'camoucli'),
14
+ stateDir: path.join(stateRoot, 'camoucli'),
15
+ cacheDir: path.join(cacheRoot, 'camoucli'),
16
+ runtimeDir,
17
+ };
18
+ }
19
+ function darwinBaseDirs(home) {
20
+ const dataDir = path.join(home, 'Library', 'Application Support', 'camoucli');
21
+ const stateDir = path.join(home, 'Library', 'Application Support', 'camoucli');
22
+ const cacheDir = path.join(home, 'Library', 'Caches', 'camoucli');
23
+ return {
24
+ dataDir,
25
+ stateDir,
26
+ cacheDir,
27
+ runtimeDir: path.join(stateDir, 'runtime'),
28
+ };
29
+ }
30
+ function windowsBaseDirs(env, home) {
31
+ const appData = env.APPDATA ?? path.join(home, 'AppData', 'Roaming');
32
+ const localAppData = env.LOCALAPPDATA ?? path.join(home, 'AppData', 'Local');
33
+ const dataDir = path.join(appData, 'camoucli');
34
+ const stateDir = path.join(localAppData, 'camoucli');
35
+ return {
36
+ dataDir,
37
+ stateDir,
38
+ cacheDir: path.join(localAppData, 'camoucli', 'Cache'),
39
+ runtimeDir: path.join(localAppData, 'camoucli', 'Runtime'),
40
+ };
41
+ }
42
+ export function sanitizeName(value) {
43
+ return value.replace(/[^a-zA-Z0-9._-]+/g, '-').replace(/^-+|-+$/g, '') || 'default';
44
+ }
45
+ export function getCamoucliPaths(env = process.env, platform = process.platform) {
46
+ const home = os.homedir();
47
+ let bases;
48
+ let camoufoxCacheDir;
49
+ if (platform === 'linux') {
50
+ bases = linuxBaseDirs(env, home);
51
+ camoufoxCacheDir = path.join(env.XDG_CACHE_HOME ?? path.join(home, '.cache'), 'camoufox');
52
+ }
53
+ else if (platform === 'darwin') {
54
+ bases = darwinBaseDirs(home);
55
+ camoufoxCacheDir = path.join(home, 'Library', 'Caches', 'camoufox');
56
+ }
57
+ else if (platform === 'win32') {
58
+ bases = windowsBaseDirs(env, home);
59
+ camoufoxCacheDir = path.join(env.LOCALAPPDATA ?? path.join(home, 'AppData', 'Local'), 'camoufox', 'Cache');
60
+ }
61
+ else {
62
+ throw new UnsupportedPlatformError(`Unsupported platform: ${platform}`);
63
+ }
64
+ const logsDir = path.join(bases.stateDir, 'logs');
65
+ const runtimeDir = bases.runtimeDir;
66
+ return {
67
+ appName: 'camoucli',
68
+ dataDir: bases.dataDir,
69
+ stateDir: bases.stateDir,
70
+ cacheDir: bases.cacheDir,
71
+ camoufoxCacheDir,
72
+ camoufoxConfigFile: path.join(camoufoxCacheDir, 'config.json'),
73
+ runtimeDir,
74
+ logsDir,
75
+ browsersDir: path.join(camoufoxCacheDir, 'browsers'),
76
+ browserRegistryFile: path.join(bases.dataDir, 'browsers', 'registry.json'),
77
+ profilesDir: path.join(bases.dataDir, 'profiles'),
78
+ presetsDir: path.join(bases.dataDir, 'presets'),
79
+ daemonSocketPath: platform === 'win32' ? undefined : path.join(runtimeDir, 'daemon.sock'),
80
+ daemonHost: platform === 'win32' ? '127.0.0.1' : undefined,
81
+ daemonPort: platform === 'win32' ? Number(env.CAMOUCLI_PORT ?? 43133) : undefined,
82
+ daemonPidFile: path.join(runtimeDir, 'daemon.pid'),
83
+ daemonLogFile: path.join(logsDir, 'daemon.log'),
84
+ };
85
+ }
86
+ export async function ensureBasePaths(paths) {
87
+ await Promise.all([
88
+ ensureDir(paths.dataDir),
89
+ ensureDir(paths.stateDir),
90
+ ensureDir(paths.cacheDir),
91
+ ensureDir(paths.camoufoxCacheDir),
92
+ ensureDir(paths.runtimeDir),
93
+ ensureDir(paths.logsDir),
94
+ ensureDir(paths.browsersDir),
95
+ ensureDir(paths.profilesDir),
96
+ ensureDir(paths.presetsDir),
97
+ ]);
98
+ }
99
+ export function getSessionPaths(paths, sessionName) {
100
+ const safeSessionName = sanitizeName(sessionName);
101
+ const rootDir = path.join(paths.profilesDir, safeSessionName);
102
+ return {
103
+ sessionName,
104
+ safeSessionName,
105
+ rootDir,
106
+ profileDir: path.join(rootDir, 'user-data'),
107
+ downloadsDir: path.join(rootDir, 'downloads'),
108
+ artifactsDir: path.join(rootDir, 'artifacts'),
109
+ };
110
+ }
111
+ export async function ensureSessionPaths(paths, sessionName) {
112
+ const sessionPaths = getSessionPaths(paths, sessionName);
113
+ await Promise.all([
114
+ ensureDir(sessionPaths.rootDir),
115
+ ensureDir(sessionPaths.profileDir),
116
+ ensureDir(sessionPaths.downloadsDir),
117
+ ensureDir(sessionPaths.artifactsDir),
118
+ ]);
119
+ return sessionPaths;
120
+ }
121
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/state/paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function ensureDir(path: string): Promise<void>;
2
+ export declare function readJsonFile<T>(filePath: string, fallback: T): Promise<T>;
3
+ export declare function writeJsonFile(filePath: string, value: unknown): Promise<void>;
4
+ export declare function removePath(filePath: string): Promise<void>;
@@ -0,0 +1,30 @@
1
+ import { mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises';
2
+ import { dirname } from 'node:path';
3
+ export async function ensureDir(path) {
4
+ await mkdir(path, { recursive: true, mode: 0o700 });
5
+ }
6
+ export async function readJsonFile(filePath, fallback) {
7
+ try {
8
+ const raw = await readFile(filePath, 'utf8');
9
+ return JSON.parse(raw);
10
+ }
11
+ catch (error) {
12
+ if (isFileMissing(error)) {
13
+ return fallback;
14
+ }
15
+ throw error;
16
+ }
17
+ }
18
+ export async function writeJsonFile(filePath, value) {
19
+ await ensureDir(dirname(filePath));
20
+ const tempPath = `${filePath}.tmp`;
21
+ await writeFile(tempPath, `${JSON.stringify(value, null, 2)}\n`, 'utf8');
22
+ await rename(tempPath, filePath);
23
+ }
24
+ export async function removePath(filePath) {
25
+ await rm(filePath, { recursive: true, force: true });
26
+ }
27
+ function isFileMissing(error) {
28
+ return error instanceof Error && 'code' in error && error.code === 'ENOENT';
29
+ }
30
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/state/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAY;IAC1C,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAI,QAAgB,EAAE,QAAW;IACjE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAM,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAgB,EAAE,KAAc;IAClE,MAAM,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,GAAG,QAAQ,MAAM,CAAC;IACnC,MAAM,SAAS,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzE,MAAM,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,QAAgB;IAC/C,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,45 @@
1
+ export interface ErrorPayload {
2
+ code: string;
3
+ message: string;
4
+ details?: unknown;
5
+ }
6
+ export interface CamoucliErrorOptions {
7
+ code: string;
8
+ message: string;
9
+ exitCode?: number;
10
+ details?: unknown;
11
+ cause?: unknown;
12
+ }
13
+ export declare class CamoucliError extends Error {
14
+ readonly code: string;
15
+ readonly exitCode: number;
16
+ readonly details?: unknown;
17
+ constructor(options: CamoucliErrorOptions);
18
+ }
19
+ export declare class ValidationError extends CamoucliError {
20
+ constructor(message: string, details?: unknown, cause?: unknown);
21
+ }
22
+ export declare class UnsupportedPlatformError extends CamoucliError {
23
+ constructor(message: string, details?: unknown);
24
+ }
25
+ export declare class BrowserNotInstalledError extends CamoucliError {
26
+ constructor(message?: string);
27
+ }
28
+ export declare class InstallError extends CamoucliError {
29
+ constructor(message: string, details?: unknown, cause?: unknown);
30
+ }
31
+ export declare class DaemonStartError extends CamoucliError {
32
+ constructor(message: string, details?: unknown, cause?: unknown);
33
+ }
34
+ export declare class IpcError extends CamoucliError {
35
+ constructor(message: string, details?: unknown, cause?: unknown);
36
+ }
37
+ export declare class SessionError extends CamoucliError {
38
+ constructor(message: string, details?: unknown, cause?: unknown);
39
+ }
40
+ export declare class RefNotFoundError extends CamoucliError {
41
+ constructor(ref: string);
42
+ }
43
+ export declare function isCamoucliError(error: unknown): error is CamoucliError;
44
+ export declare function toErrorPayload(error: unknown): ErrorPayload;
45
+ export declare function getExitCode(error: unknown): number;
@@ -0,0 +1,82 @@
1
+ export class CamoucliError extends Error {
2
+ code;
3
+ exitCode;
4
+ details;
5
+ constructor(options) {
6
+ super(options.message, options.cause ? { cause: options.cause } : undefined);
7
+ this.name = new.target.name;
8
+ this.code = options.code;
9
+ this.exitCode = options.exitCode ?? 1;
10
+ this.details = options.details;
11
+ }
12
+ }
13
+ export class ValidationError extends CamoucliError {
14
+ constructor(message, details, cause) {
15
+ super({ code: 'validation_error', message, details, cause, exitCode: 2 });
16
+ }
17
+ }
18
+ export class UnsupportedPlatformError extends CamoucliError {
19
+ constructor(message, details) {
20
+ super({ code: 'unsupported_platform', message, details, exitCode: 2 });
21
+ }
22
+ }
23
+ export class BrowserNotInstalledError extends CamoucliError {
24
+ constructor(message = 'Camoufox is not installed. Run `camou install`.') {
25
+ super({ code: 'browser_not_installed', message, exitCode: 3 });
26
+ }
27
+ }
28
+ export class InstallError extends CamoucliError {
29
+ constructor(message, details, cause) {
30
+ super({ code: 'install_error', message, details, cause, exitCode: 4 });
31
+ }
32
+ }
33
+ export class DaemonStartError extends CamoucliError {
34
+ constructor(message, details, cause) {
35
+ super({ code: 'daemon_start_error', message, details, cause, exitCode: 5 });
36
+ }
37
+ }
38
+ export class IpcError extends CamoucliError {
39
+ constructor(message, details, cause) {
40
+ super({ code: 'ipc_error', message, details, cause, exitCode: 6 });
41
+ }
42
+ }
43
+ export class SessionError extends CamoucliError {
44
+ constructor(message, details, cause) {
45
+ super({ code: 'session_error', message, details, cause, exitCode: 7 });
46
+ }
47
+ }
48
+ export class RefNotFoundError extends CamoucliError {
49
+ constructor(ref) {
50
+ super({
51
+ code: 'invalid_ref',
52
+ message: `Reference ${ref} is not available for the current tab. Run snapshot again.`,
53
+ exitCode: 8,
54
+ });
55
+ }
56
+ }
57
+ export function isCamoucliError(error) {
58
+ return error instanceof CamoucliError;
59
+ }
60
+ export function toErrorPayload(error) {
61
+ if (isCamoucliError(error)) {
62
+ return {
63
+ code: error.code,
64
+ message: error.message,
65
+ details: error.details,
66
+ };
67
+ }
68
+ if (error instanceof Error) {
69
+ return {
70
+ code: 'unexpected_error',
71
+ message: error.message,
72
+ };
73
+ }
74
+ return {
75
+ code: 'unexpected_error',
76
+ message: String(error),
77
+ };
78
+ }
79
+ export function getExitCode(error) {
80
+ return isCamoucliError(error) ? error.exitCode : 1;
81
+ }
82
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/util/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export interface LoggerOptions {
2
+ name: string;
3
+ filePath?: string | undefined;
4
+ verbose?: boolean;
5
+ mirrorToStderr?: boolean;
6
+ }
7
+ export declare class Logger {
8
+ readonly name: string;
9
+ readonly verbose: boolean;
10
+ private readonly mirrorToStderr;
11
+ private readonly stream?;
12
+ constructor(options: LoggerOptions);
13
+ debug(message: string, details?: unknown): void;
14
+ info(message: string, details?: unknown): void;
15
+ warn(message: string, details?: unknown): void;
16
+ error(message: string, details?: unknown): void;
17
+ close(): Promise<void>;
18
+ private write;
19
+ }