@web-auto/camo 0.1.18 → 0.1.20
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 +18 -19
- package/bin/browser-service.mjs +11 -0
- package/package.json +7 -2
- package/scripts/install.mjs +3 -3
- package/src/cli.mjs +8 -5
- package/src/commands/attach.mjs +141 -0
- package/src/commands/browser.mjs +5 -16
- package/src/commands/mouse.mjs +2 -12
- package/src/container/runtime-core/operations/index.mjs +6 -15
- package/src/container/subscription-registry.mjs +6 -6
- package/src/core/actions.mjs +0 -12
- package/src/core/index.mjs +0 -1
- package/src/lifecycle/lock.mjs +7 -3
- package/src/services/browser-service/index.js +651 -0
- package/src/services/browser-service/index.js.map +1 -0
- package/src/services/browser-service/internal/BrowserSession.input.test.js +322 -0
- package/src/services/browser-service/internal/BrowserSession.input.test.js.map +1 -0
- package/src/services/browser-service/internal/BrowserSession.js +304 -0
- package/src/services/browser-service/internal/BrowserSession.js.map +1 -0
- package/src/services/browser-service/internal/ElementRegistry.js +61 -0
- package/src/services/browser-service/internal/ElementRegistry.js.map +1 -0
- package/src/services/browser-service/internal/ProfileLock.js +85 -0
- package/src/services/browser-service/internal/ProfileLock.js.map +1 -0
- package/src/services/browser-service/internal/SessionManager.js +184 -0
- package/src/services/browser-service/internal/SessionManager.js.map +1 -0
- package/src/services/browser-service/internal/SessionManager.test.js +40 -0
- package/src/services/browser-service/internal/SessionManager.test.js.map +1 -0
- package/src/services/browser-service/internal/browser-session/cookies.js +145 -0
- package/src/services/browser-service/internal/browser-session/cookies.js.map +1 -0
- package/src/services/browser-service/internal/browser-session/input-ops.js +127 -0
- package/src/services/browser-service/internal/browser-session/input-ops.js.map +1 -0
- package/src/services/browser-service/internal/browser-session/input-pipeline.js +133 -0
- package/src/services/browser-service/internal/browser-session/input-pipeline.js.map +1 -0
- package/src/services/browser-service/internal/browser-session/logging.js +46 -0
- package/src/services/browser-service/internal/browser-session/navigation.js +39 -0
- package/src/services/browser-service/internal/browser-session/navigation.js.map +1 -0
- package/src/services/browser-service/internal/browser-session/page-hooks.js +443 -0
- package/src/services/browser-service/internal/browser-session/page-hooks.js.map +1 -0
- package/src/services/browser-service/internal/browser-session/page-management.js +212 -0
- package/src/services/browser-service/internal/browser-session/page-management.js.map +1 -0
- package/src/services/browser-service/internal/browser-session/recording.js +199 -0
- package/src/services/browser-service/internal/browser-session/recording.js.map +1 -0
- package/src/services/browser-service/internal/browser-session/runtime-events.js +62 -0
- package/src/services/browser-service/internal/browser-session/runtime-events.js.map +1 -0
- package/src/services/browser-service/internal/browser-session/session-core.js +85 -0
- package/src/services/browser-service/internal/browser-session/session-core.js.map +1 -0
- package/src/services/browser-service/internal/browser-session/session-state.js +39 -0
- package/src/services/browser-service/internal/browser-session/session-state.js.map +1 -0
- package/src/services/browser-service/internal/browser-session/types.js +15 -0
- package/src/services/browser-service/internal/browser-session/types.js.map +1 -0
- package/src/services/browser-service/internal/browser-session/utils.js +69 -0
- package/src/services/browser-service/internal/browser-session/utils.js.map +1 -0
- package/src/services/browser-service/internal/browser-session/viewport-manager.js +47 -0
- package/src/services/browser-service/internal/browser-session/viewport-manager.js.map +1 -0
- package/src/services/browser-service/internal/browser-session/viewport.js +216 -0
- package/src/services/browser-service/internal/browser-session/viewport.js.map +1 -0
- package/src/services/browser-service/internal/container-matcher.js +852 -0
- package/src/services/browser-service/internal/container-matcher.js.map +1 -0
- package/src/services/browser-service/internal/container-registry.js +182 -0
- package/src/services/browser-service/internal/engine-manager.js +259 -0
- package/src/services/browser-service/internal/engine-manager.js.map +1 -0
- package/src/services/browser-service/internal/fingerprint.js +203 -0
- package/src/services/browser-service/internal/fingerprint.js.map +1 -0
- package/src/services/browser-service/internal/heartbeat.js +137 -0
- package/src/services/browser-service/internal/logging.js +46 -0
- package/src/services/browser-service/internal/page-runtime/runtime.js +1317 -0
- package/src/services/browser-service/internal/pageRuntime.js +29 -0
- package/src/services/browser-service/internal/pageRuntime.js.map +1 -0
- package/src/services/browser-service/internal/runtimeInjector.js +31 -0
- package/src/services/browser-service/internal/runtimeInjector.js.map +1 -0
- package/src/services/browser-service/internal/service-process-logger.js +140 -0
- package/src/services/browser-service/internal/state-bus.js +46 -0
- package/src/services/browser-service/internal/state-bus.js.map +1 -0
- package/src/services/browser-service/internal/storage-paths.js +42 -0
- package/src/services/browser-service/internal/storage-paths.js.map +1 -0
- package/src/services/browser-service/internal/ws-server.js +1194 -0
- package/src/services/browser-service/internal/ws-server.js.map +1 -0
- package/src/services/browser-service/internal/ws-server.test.js +59 -0
- package/src/services/browser-service/internal/ws-server.test.js.map +1 -0
- package/src/services/browser-service/server.mjs +6 -0
- package/src/services/controller/cli-bridge.js +93 -0
- package/src/services/controller/container-index.js +50 -0
- package/src/services/controller/container-storage.js +36 -0
- package/src/services/controller/controller-actions.js +207 -0
- package/src/services/controller/controller.js +1138 -0
- package/src/services/controller/selectors.js +54 -0
- package/src/services/controller/transport.js +118 -0
- package/src/utils/browser-service.mjs +100 -125
- package/src/utils/config.mjs +22 -21
- package/src/utils/help.mjs +11 -9
- package/src/utils/ws-client.mjs +30 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { injectRuntimeBundle } from './runtimeInjector.js';
|
|
2
|
+
const injectedPages = new WeakSet();
|
|
3
|
+
export async function ensurePageRuntime(page, forceReinject = false) {
|
|
4
|
+
if (!page) {
|
|
5
|
+
throw new Error('page is required');
|
|
6
|
+
}
|
|
7
|
+
// 强制重新注入或首次注入
|
|
8
|
+
if (forceReinject || !injectedPages.has(page)) {
|
|
9
|
+
await injectRuntimeBundle({ page });
|
|
10
|
+
injectedPages.add(page);
|
|
11
|
+
}
|
|
12
|
+
try {
|
|
13
|
+
await page.waitForFunction(() => Boolean(window.__camoRuntime && window.__camoRuntime.ready), {
|
|
14
|
+
timeout: 4000,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
catch (err) {
|
|
18
|
+
// Runtime is best-effort for system-level mouse/keyboard commands.
|
|
19
|
+
// If injection readiness times out (common on slow/heavy pages), we must not block
|
|
20
|
+
// low-level commands like mouse:click/mouse:wheel.
|
|
21
|
+
// Higher-level operations (containers:match, overlay highlight) will handle their own retries.
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export async function evalPageRuntime(page, fn) {
|
|
26
|
+
await ensurePageRuntime(page);
|
|
27
|
+
return page.evaluate(fn);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=pageRuntime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pageRuntime.js","sourceRoot":"","sources":["../../../../../modules/camo-backend/src/internal/pageRuntime.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,aAAa,GAAG,IAAI,OAAO,EAAQ,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAU,EAAE,aAAa,GAAG,KAAK;IACvE,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACtC,CAAC;IACD,cAAc;IACd,IAAI,aAAa,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9C,MAAM,mBAAmB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QACpC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,OAAO,CAAE,MAAc,CAAC,gBAAgB,IAAK,MAAc,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE;YACpH,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,mEAAmE;QACnE,mFAAmF;QACnF,mDAAmD;QACnD,+FAA+F;QAC/F,OAAO;IACT,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAI,IAAU,EAAE,EAAoC;IACvF,MAAM,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC9B,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
let resolvedRuntimePath = null;
|
|
5
|
+
function resolveRuntime() {
|
|
6
|
+
if (resolvedRuntimePath)
|
|
7
|
+
return resolvedRuntimePath;
|
|
8
|
+
const base = path.dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
const candidates = [
|
|
10
|
+
path.join(process.cwd(), 'modules/camo-backend/src/internal/page-runtime/runtime.js'),
|
|
11
|
+
path.join(process.cwd(), 'src/services/browser-service/internal/page-runtime/runtime.js'),
|
|
12
|
+
path.join(base, 'page-runtime/runtime.js'),
|
|
13
|
+
];
|
|
14
|
+
for (const candidate of candidates) {
|
|
15
|
+
if (fs.existsSync(candidate)) {
|
|
16
|
+
resolvedRuntimePath = candidate;
|
|
17
|
+
break;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
if (!resolvedRuntimePath) {
|
|
21
|
+
throw new Error('Runtime script not found');
|
|
22
|
+
}
|
|
23
|
+
return resolvedRuntimePath;
|
|
24
|
+
}
|
|
25
|
+
export async function injectRuntimeBundle({ page }) {
|
|
26
|
+
const runtimePath = resolveRuntime();
|
|
27
|
+
console.log(`[runtimeInjector] injecting runtime from ${runtimePath}`);
|
|
28
|
+
await page.addInitScript({ path: runtimePath });
|
|
29
|
+
await page.addScriptTag({ path: runtimePath });
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=runtimeInjector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtimeInjector.js","sourceRoot":"","sources":["../../../../../modules/camo-backend/src/internal/runtimeInjector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAOpC,IAAI,mBAAmB,GAAkB,IAAI,CAAC;AAE9C,SAAS,cAAc;IACrB,IAAI,mBAAmB;QAAE,OAAO,mBAAmB,CAAC;IACpD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,2DAA2D,CAAC;QACrF,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,yBAAyB,CAAC;KAC3C,CAAC;IACF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7B,mBAAmB,GAAG,SAAS,CAAC;YAChC,MAAM;QACR,CAAC;IACH,CAAC;IACD,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,mBAAmB,CAAC;AAC7B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,EAAE,IAAI,EAAiB;IAC/D,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,4CAA4C,WAAW,EAAE,CAAC,CAAC;IACvE,MAAM,IAAI,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;IAChD,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { CONFIG_DIR, ensureDir } from '../../../utils/config.mjs';
|
|
4
|
+
|
|
5
|
+
const LOG_DIR = String(process.env.CAMO_LOG_DIR || '').trim() || path.join(CONFIG_DIR, 'logs');
|
|
6
|
+
const INSTALLED = new Set();
|
|
7
|
+
|
|
8
|
+
function safeAppend(filePath, line) {
|
|
9
|
+
try {
|
|
10
|
+
fs.appendFileSync(filePath, line, 'utf8');
|
|
11
|
+
} catch {
|
|
12
|
+
// ignore
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function formatError(err) {
|
|
17
|
+
if (!err || typeof err !== 'object') return { message: String(err) };
|
|
18
|
+
const anyErr = err;
|
|
19
|
+
return {
|
|
20
|
+
name: typeof anyErr.name === 'string' ? anyErr.name : undefined,
|
|
21
|
+
message: typeof anyErr.message === 'string' ? anyErr.message : String(err),
|
|
22
|
+
stack: typeof anyErr.stack === 'string' ? anyErr.stack : undefined,
|
|
23
|
+
code: typeof anyErr.code === 'string' ? anyErr.code : undefined,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function createConsoleTee(logFile) {
|
|
28
|
+
const kWrapped = Symbol.for('camo.consoleTeeWrapped');
|
|
29
|
+
const g = globalThis;
|
|
30
|
+
if (g[kWrapped]) return;
|
|
31
|
+
g[kWrapped] = true;
|
|
32
|
+
|
|
33
|
+
const originals = {
|
|
34
|
+
log: console.log.bind(console),
|
|
35
|
+
info: console.info.bind(console),
|
|
36
|
+
warn: console.warn.bind(console),
|
|
37
|
+
error: console.error.bind(console),
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const wrap = (level) => {
|
|
41
|
+
return (...args) => {
|
|
42
|
+
const ts = new Date().toISOString();
|
|
43
|
+
const msg = args
|
|
44
|
+
.map((a) => {
|
|
45
|
+
if (typeof a === 'string') return a;
|
|
46
|
+
try {
|
|
47
|
+
return JSON.stringify(a);
|
|
48
|
+
} catch {
|
|
49
|
+
return String(a);
|
|
50
|
+
}
|
|
51
|
+
})
|
|
52
|
+
.join(' ');
|
|
53
|
+
safeAppend(logFile, `[${ts}] [${String(level).toUpperCase()}] ${msg}\n`);
|
|
54
|
+
originals[level](...args);
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
console.log = wrap('log');
|
|
59
|
+
console.info = wrap('info');
|
|
60
|
+
console.warn = wrap('warn');
|
|
61
|
+
console.error = wrap('error');
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function installServiceProcessLogger(opts = {}) {
|
|
65
|
+
const serviceName = String(opts.serviceName || '').trim();
|
|
66
|
+
const id = `service:${serviceName}`;
|
|
67
|
+
if (!serviceName) return { logEvent: () => {} };
|
|
68
|
+
if (INSTALLED.has(id)) return { logEvent: () => {} };
|
|
69
|
+
INSTALLED.add(id);
|
|
70
|
+
|
|
71
|
+
ensureDir(LOG_DIR);
|
|
72
|
+
const crashFile = path.join(LOG_DIR, `${serviceName}.crash.jsonl`);
|
|
73
|
+
const consoleLogFile = path.join(LOG_DIR, `${serviceName}.log`);
|
|
74
|
+
|
|
75
|
+
const tee = typeof opts.teeConsoleToFile === 'boolean'
|
|
76
|
+
? opts.teeConsoleToFile
|
|
77
|
+
: !!(process.stdout.isTTY || process.stderr.isTTY);
|
|
78
|
+
if (tee) createConsoleTee(consoleLogFile);
|
|
79
|
+
|
|
80
|
+
const base = {
|
|
81
|
+
service: serviceName,
|
|
82
|
+
pid: process.pid,
|
|
83
|
+
node: process.version,
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
const logEvent = (event, data = {}) => {
|
|
87
|
+
safeAppend(
|
|
88
|
+
crashFile,
|
|
89
|
+
`${JSON.stringify({
|
|
90
|
+
ts: new Date().toISOString(),
|
|
91
|
+
...base,
|
|
92
|
+
event,
|
|
93
|
+
...data,
|
|
94
|
+
})}\n`,
|
|
95
|
+
);
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
logEvent('process_start', {
|
|
99
|
+
argv: process.argv,
|
|
100
|
+
cwd: process.cwd(),
|
|
101
|
+
ppid: process.ppid,
|
|
102
|
+
stdoutIsTTY: !!process.stdout.isTTY,
|
|
103
|
+
stderrIsTTY: !!process.stderr.isTTY,
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
process.on('uncaughtException', (err) => {
|
|
107
|
+
logEvent('uncaughtException', { error: formatError(err) });
|
|
108
|
+
process.exitCode = 1;
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
process.on('unhandledRejection', (reason) => {
|
|
112
|
+
logEvent('unhandledRejection', { reason: formatError(reason) });
|
|
113
|
+
process.exitCode = 1;
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
const tapSignal = (signal) => {
|
|
117
|
+
const hadExisting = process.listenerCount(signal) > 0;
|
|
118
|
+
const handler = () => {
|
|
119
|
+
logEvent('signal', { signal });
|
|
120
|
+
process.off(signal, handler);
|
|
121
|
+
if (!hadExisting) {
|
|
122
|
+
try {
|
|
123
|
+
process.kill(process.pid, signal);
|
|
124
|
+
} catch {
|
|
125
|
+
// ignore
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
process.on(signal, handler);
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
tapSignal('SIGINT');
|
|
133
|
+
tapSignal('SIGTERM');
|
|
134
|
+
tapSignal('SIGHUP');
|
|
135
|
+
|
|
136
|
+
process.on('beforeExit', (code) => logEvent('beforeExit', { code }));
|
|
137
|
+
process.on('exit', (code) => logEvent('exit', { code }));
|
|
138
|
+
|
|
139
|
+
return { logEvent };
|
|
140
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
class LocalStateBus {
|
|
2
|
+
state = new Map();
|
|
3
|
+
subscribers = new Map();
|
|
4
|
+
setState(key, payload) {
|
|
5
|
+
this.state.set(key, { ...payload, lastUpdate: Date.now() });
|
|
6
|
+
this.publish(`state:${key}`, this.state.get(key));
|
|
7
|
+
}
|
|
8
|
+
getState(key) {
|
|
9
|
+
if (key)
|
|
10
|
+
return this.state.get(key);
|
|
11
|
+
return Object.fromEntries(this.state);
|
|
12
|
+
}
|
|
13
|
+
publish(event, payload) {
|
|
14
|
+
const listeners = this.subscribers.get(event) || [];
|
|
15
|
+
for (const listener of listeners) {
|
|
16
|
+
try {
|
|
17
|
+
listener(payload);
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
// Keep runtime event pipeline resilient.
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
subscribe(event, listener) {
|
|
25
|
+
const current = this.subscribers.get(event) || [];
|
|
26
|
+
current.push(listener);
|
|
27
|
+
this.subscribers.set(event, current);
|
|
28
|
+
return () => {
|
|
29
|
+
const next = (this.subscribers.get(event) || []).filter((fn) => fn !== listener);
|
|
30
|
+
if (next.length === 0) {
|
|
31
|
+
this.subscribers.delete(event);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
this.subscribers.set(event, next);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
let stateBus = null;
|
|
40
|
+
export function getStateBus() {
|
|
41
|
+
if (!stateBus)
|
|
42
|
+
stateBus = new LocalStateBus();
|
|
43
|
+
return stateBus;
|
|
44
|
+
}
|
|
45
|
+
export { LocalStateBus };
|
|
46
|
+
//# sourceMappingURL=state-bus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state-bus.js","sourceRoot":"","sources":["../../../../../modules/camo-backend/src/internal/state-bus.ts"],"names":[],"mappings":"AAEA,MAAM,aAAa;IACA,KAAK,GAAG,IAAI,GAAG,EAAwB,CAAC;IACxC,WAAW,GAAG,IAAI,GAAG,EAA6C,CAAC;IAEpF,QAAQ,CAAC,GAAW,EAAE,OAAqB;QACzC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,QAAQ,CAAC,GAAY;QACnB,IAAI,GAAG;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpC,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,CAAC,KAAa,EAAE,OAAgB;QACrC,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACpD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,QAAQ,CAAC,OAAO,CAAC,CAAC;YACpB,CAAC;YAAC,MAAM,CAAC;gBACP,yCAAyC;YAC3C,CAAC;QACH,CAAC;IACH,CAAC;IAED,SAAS,CAAC,KAAa,EAAE,QAAoC;QAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACrC,OAAO,GAAG,EAAE;YACV,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;YACjF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YACpC,CAAC;QACH,CAAC,CAAC;IACJ,CAAC;CACF;AAED,IAAI,QAAQ,GAAyB,IAAI,CAAC;AAE1C,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC,QAAQ;QAAE,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;IAC9C,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,OAAO,EAAE,aAAa,EAAE,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import os from 'os';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
function resolveHomeDir() {
|
|
4
|
+
const envHome = process.platform === 'win32'
|
|
5
|
+
? String(process.env.USERPROFILE || '').trim()
|
|
6
|
+
: String(process.env.HOME || '').trim();
|
|
7
|
+
return envHome || os.homedir();
|
|
8
|
+
}
|
|
9
|
+
function resolvePortableRoot() {
|
|
10
|
+
return String(process.env.CAMO_PORTABLE_ROOT || process.env.CAMO_ROOT || '').trim();
|
|
11
|
+
}
|
|
12
|
+
function resolveDataRoot() {
|
|
13
|
+
const portableRoot = resolvePortableRoot();
|
|
14
|
+
if (portableRoot)
|
|
15
|
+
return path.join(portableRoot, '.camo');
|
|
16
|
+
return path.join(resolveHomeDir(), '.camo');
|
|
17
|
+
}
|
|
18
|
+
export function resolveProfilesRoot() {
|
|
19
|
+
const envRoot = String(process.env.CAMO_PATHS_PROFILES || '').trim();
|
|
20
|
+
if (envRoot)
|
|
21
|
+
return envRoot;
|
|
22
|
+
return path.join(resolveDataRoot(), 'profiles');
|
|
23
|
+
}
|
|
24
|
+
export function resolveCookiesRoot() {
|
|
25
|
+
const envRoot = String(process.env.CAMO_PATHS_COOKIES || '').trim();
|
|
26
|
+
if (envRoot)
|
|
27
|
+
return envRoot;
|
|
28
|
+
return path.join(resolveDataRoot(), 'cookies');
|
|
29
|
+
}
|
|
30
|
+
export function resolveLocksRoot() {
|
|
31
|
+
const envRoot = String(process.env.CAMO_PATHS_LOCKS || '').trim();
|
|
32
|
+
if (envRoot)
|
|
33
|
+
return envRoot;
|
|
34
|
+
return path.join(resolveDataRoot(), 'locks');
|
|
35
|
+
}
|
|
36
|
+
export function resolveRecordsRoot() {
|
|
37
|
+
const envRoot = String(process.env.CAMO_PATHS_RECORDS || '').trim();
|
|
38
|
+
if (envRoot)
|
|
39
|
+
return envRoot;
|
|
40
|
+
return path.join(resolveDataRoot(), 'records');
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=storage-paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storage-paths.js","sourceRoot":"","sources":["../../../../../modules/camo-backend/src/internal/storage-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,SAAS,cAAc;IACrB,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO;QAC1C,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;QAC9C,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,OAAO,OAAO,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;AACjC,CAAC;AAED,SAAS,mBAAmB;IAC1B,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAC5F,CAAC;AAED,SAAS,eAAe;IACtB,MAAM,YAAY,GAAG,mBAAmB,EAAE,CAAC;IAC3C,IAAI,YAAY;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;IAC7D,OAAO,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,UAAU,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACxE,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,UAAU,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACvE,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,SAAS,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrE,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACvE,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,SAAS,CAAC,CAAC;AACjD,CAAC"}
|