mooncat-browser 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 +213 -0
- package/browser-op/backend/browserd.cjs +1004 -0
- package/browser-op/backend/rpc-client.cjs +64 -0
- package/browser-op/backend/state.cjs +51 -0
- package/browser-op/cdp/capture-inject.js +426 -0
- package/browser-op/cdp/capture-inject.ts +426 -0
- package/browser-op/cdp/capture-service.cjs +172 -0
- package/browser-op/cdp/chrome-launcher.cjs +370 -0
- package/browser-op/cdp/chrome-path.cjs +57 -0
- package/browser-op/cdp/state.cjs +89 -0
- package/browser-op/extension/extension-detect.cjs +228 -0
- package/browser-op/extension/server.cjs +197 -0
- package/browser-op/extension/service.cjs +228 -0
- package/browser-op/extension/state.cjs +78 -0
- package/browser-op/index.cjs +389 -0
- package/browser-op/package.json +17 -0
- package/browser-op/py/behavior.py +138 -0
- package/browser-op/py/browser.py +340 -0
- package/browser-op/py/captcha.py +115 -0
- package/browser-op/py/crawler.py +125 -0
- package/browser-op/py/examples/01_open_and_probe.py +48 -0
- package/browser-op/py/examples/02_reuse_and_probe.py +66 -0
- package/browser-op/py/examples/03_interact.py +66 -0
- package/browser-op/py/find.py +150 -0
- package/browser-op/py/honeypot.py +73 -0
- package/browser-op/py/humanize.py +392 -0
- package/browser-op/py/image.py +186 -0
- package/browser-op/py/interact.py +193 -0
- package/browser-op/py/markdown.py +38 -0
- package/browser-op/py/pyproject.toml +32 -0
- package/browser-op/py/ready.py +208 -0
- package/browser-op/py/scroll.py +180 -0
- package/browser-op/py/upload.py +103 -0
- package/browser-op/py/visual_target.py +47 -0
- package/browser-op/py/visualize.py +91 -0
- package/browser-op/state.cjs +63 -0
- package/browser-op/web/behavior.js +153 -0
- package/browser-op/web/browser.js +231 -0
- package/browser-op/web/captcha.js +85 -0
- package/browser-op/web/crawler.js +109 -0
- package/browser-op/web/find.js +147 -0
- package/browser-op/web/honeypot.js +68 -0
- package/browser-op/web/humanize.js +522 -0
- package/browser-op/web/image.js +177 -0
- package/browser-op/web/interact.js +169 -0
- package/browser-op/web/markdown.js +80 -0
- package/browser-op/web/ready.js +295 -0
- package/browser-op/web/scroll.js +167 -0
- package/browser-op/web/upload.js +116 -0
- package/browser-op/web/visual-runtime.inject.cjs +6 -0
- package/browser-op/webplater/.env.example +7 -0
- package/browser-op/webplater/ARCHITECTURE.md +102 -0
- package/browser-op/webplater/dist/chrome-mv3/assets/popup-BUZEUmsx.css +1 -0
- package/browser-op/webplater/dist/chrome-mv3/background.js +2 -0
- package/browser-op/webplater/dist/chrome-mv3/capture.js +310 -0
- package/browser-op/webplater/dist/chrome-mv3/chunks/_virtual_wxt-html-plugins-DPbbfBKe.js +1 -0
- package/browser-op/webplater/dist/chrome-mv3/chunks/offscreen-CFXYw9Mo.js +1 -0
- package/browser-op/webplater/dist/chrome-mv3/chunks/popup-C-lpxZZO.js +1 -0
- package/browser-op/webplater/dist/chrome-mv3/content-scripts/content.js +7 -0
- package/browser-op/webplater/dist/chrome-mv3/manifest.json +1 -0
- package/browser-op/webplater/dist/chrome-mv3/offscreen.html +16 -0
- package/browser-op/webplater/dist/chrome-mv3/popup.html +31 -0
- package/browser-op/webplater/entrypoints/background.ts +938 -0
- package/browser-op/webplater/entrypoints/content.ts +1150 -0
- package/browser-op/webplater/entrypoints/offscreen/index.html +15 -0
- package/browser-op/webplater/entrypoints/offscreen/main.ts +161 -0
- package/browser-op/webplater/entrypoints/popup/index.html +29 -0
- package/browser-op/webplater/entrypoints/popup/main.ts +61 -0
- package/browser-op/webplater/entrypoints/popup/style.css +100 -0
- package/browser-op/webplater/lib/snapshot.ts +352 -0
- package/browser-op/webplater/package.json +29 -0
- package/browser-op/webplater/pnpm-lock.yaml +3411 -0
- package/browser-op/webplater/public/capture.js +310 -0
- package/browser-op/webplater/scripts/publish-extension.mjs +176 -0
- package/browser-op/webplater/tsconfig.json +19 -0
- package/browser-op/webplater/wxt.config.ts +34 -0
- package/dist/actions.md +102 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +278 -0
- package/dist/cli.js.map +1 -0
- package/dist/client.d.ts +94 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +277 -0
- package/dist/client.js.map +1 -0
- package/dist/config.d.ts +61 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +119 -0
- package/dist/config.js.map +1 -0
- package/dist/protocol.d.ts +195 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +11 -0
- package/dist/protocol.js.map +1 -0
- package/dist/server.d.ts +66 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +259 -0
- package/dist/server.js.map +1 -0
- package/package.json +78 -0
- package/schemas/browser.clearCookies.schema.json +13 -0
- package/schemas/browser.close.schema.json +9 -0
- package/schemas/browser.getCookies.schema.json +13 -0
- package/schemas/browser.getDownload.schema.json +15 -0
- package/schemas/browser.health.schema.json +9 -0
- package/schemas/browser.listDownloads.schema.json +16 -0
- package/schemas/browser.listTabs.schema.json +9 -0
- package/schemas/browser.newTab.schema.json +15 -0
- package/schemas/browser.open.schema.json +15 -0
- package/schemas/browser.operate.schema.json +15 -0
- package/schemas/browser.reuseTab.schema.json +15 -0
- package/schemas/browser.setCookies.schema.json +15 -0
- package/schemas/browser.waitFor.schema.json +15 -0
- package/schemas/browser.waitForDownload.schema.json +15 -0
- package/skills/browser/SKILL.md +110 -0
- package/skills/browser/references/collect.md +163 -0
- package/skills/browser/references/high-risk.md +161 -0
- package/skills/browser/references/operate-actions.md +92 -0
- package/skills/browser/references/probing.md +302 -0
package/dist/client.js
ADDED
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
// -*- coding: utf-8 -*-
|
|
2
|
+
// client.ts — BrowserClient,连接 browserd(HTTP JSON-RPC)的薄 client。
|
|
3
|
+
//
|
|
4
|
+
// 这是 @mooncat/browser 的主入口。client 不持有 Chrome,只通过 HTTP RPC 与
|
|
5
|
+
// 常驻的 browserd 通信;browserd 才是真正持有 BrowserOp/Chrome 的进程。
|
|
6
|
+
//
|
|
7
|
+
// 用法:
|
|
8
|
+
// import { BrowserClient } from "@mooncat/browser";
|
|
9
|
+
// const browser = new BrowserClient({ baseUrl: "http://127.0.0.1:17322" });
|
|
10
|
+
// await browser.open({ headless: false });
|
|
11
|
+
// const tab = await browser.newTab({ url: "https://example.com" });
|
|
12
|
+
// await browser.operate({ pageHandle: tab.pageHandle, action: "click", params: { selector: "a" } });
|
|
13
|
+
//
|
|
14
|
+
// 三个铁律(与 browser co-work 模型一致):
|
|
15
|
+
// 1. handle 是纯数据,绝不判断路由(mode 是内部细节,不要 if(mode))。
|
|
16
|
+
// 2. 会话长生命周期:open() 一次跨多步复用,满意前不 close()。
|
|
17
|
+
// 3. 步进式:一步一确认,中间产物落盘。
|
|
18
|
+
import http from "node:http";
|
|
19
|
+
import { DEFAULT_RPC_PORT } from "./config.js";
|
|
20
|
+
/**
|
|
21
|
+
* 浏览器自动化 client。
|
|
22
|
+
*
|
|
23
|
+
* 通过 HTTP JSON-RPC 连接 browserd,控制宿主 Chrome。
|
|
24
|
+
* 不依赖 workspace / mooncat 发行体 / PM2 —— 只是一个 HTTP client。
|
|
25
|
+
*/
|
|
26
|
+
export class BrowserClient {
|
|
27
|
+
host;
|
|
28
|
+
port;
|
|
29
|
+
defaultTimeoutMs;
|
|
30
|
+
reqId = 0;
|
|
31
|
+
constructor(opts = {}) {
|
|
32
|
+
if (opts.baseUrl) {
|
|
33
|
+
const u = new URL(opts.baseUrl);
|
|
34
|
+
this.host = u.hostname;
|
|
35
|
+
this.port = Number(u.port) || DEFAULT_RPC_PORT;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
this.host = opts.host || "127.0.0.1";
|
|
39
|
+
this.port = opts.port || Number(process.env.MOONCAT_BROWSERD_PORT) || DEFAULT_RPC_PORT;
|
|
40
|
+
}
|
|
41
|
+
this.defaultTimeoutMs = opts.timeoutMs ?? 60000;
|
|
42
|
+
}
|
|
43
|
+
/** 当前连接的 baseUrl(用于日志/诊断)。 */
|
|
44
|
+
get baseUrl() {
|
|
45
|
+
return `http://${this.host}:${this.port}`;
|
|
46
|
+
}
|
|
47
|
+
/** 连接探测:browserd 是否活着 + 是否已 open。返回 /health 响应,或 null。 */
|
|
48
|
+
health(timeoutMs = 2000) {
|
|
49
|
+
return new Promise((resolve) => {
|
|
50
|
+
const req = http.get({
|
|
51
|
+
hostname: this.host,
|
|
52
|
+
port: this.port,
|
|
53
|
+
path: "/health",
|
|
54
|
+
timeout: timeoutMs,
|
|
55
|
+
}, (res) => {
|
|
56
|
+
let data = "";
|
|
57
|
+
res.on("data", (c) => (data += c));
|
|
58
|
+
res.on("end", () => {
|
|
59
|
+
try {
|
|
60
|
+
resolve(JSON.parse(data));
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
resolve(null);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
req.on("timeout", () => {
|
|
68
|
+
req.destroy();
|
|
69
|
+
resolve(null);
|
|
70
|
+
});
|
|
71
|
+
req.on("error", () => resolve(null));
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
/** 发一个 JSON-RPC 请求,返回 result 或 throw。 */
|
|
75
|
+
rpc(method, params = {}, timeoutMs) {
|
|
76
|
+
const timeout = timeoutMs ?? this.defaultTimeoutMs;
|
|
77
|
+
return new Promise((resolve, reject) => {
|
|
78
|
+
const id = ++this.reqId;
|
|
79
|
+
const body = JSON.stringify({ id, method, params });
|
|
80
|
+
const req = http.request({
|
|
81
|
+
hostname: this.host,
|
|
82
|
+
port: this.port,
|
|
83
|
+
path: "/rpc",
|
|
84
|
+
method: "POST",
|
|
85
|
+
headers: {
|
|
86
|
+
"Content-Type": "application/json",
|
|
87
|
+
"Content-Length": Buffer.byteLength(body),
|
|
88
|
+
},
|
|
89
|
+
timeout,
|
|
90
|
+
}, (res) => {
|
|
91
|
+
let data = "";
|
|
92
|
+
res.on("data", (c) => (data += c));
|
|
93
|
+
res.on("end", () => {
|
|
94
|
+
try {
|
|
95
|
+
const json = JSON.parse(data);
|
|
96
|
+
if (json.ok)
|
|
97
|
+
resolve(json.result);
|
|
98
|
+
else
|
|
99
|
+
reject(new Error(json.error || "rpc failed"));
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
reject(new Error(`rpc bad response: ${data.slice(0, 200)}`));
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
req.on("timeout", () => {
|
|
107
|
+
req.destroy();
|
|
108
|
+
reject(new Error(`rpc timeout: ${method} (${timeout}ms)`));
|
|
109
|
+
});
|
|
110
|
+
req.on("error", (e) => reject(e));
|
|
111
|
+
req.write(body);
|
|
112
|
+
req.end();
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
/** 打开浏览器(宿主 Chrome,双路由自动选择 extension/cdp)。 */
|
|
116
|
+
async open(options = {}) {
|
|
117
|
+
return this.rpc("open", options);
|
|
118
|
+
}
|
|
119
|
+
/** 新建标签页。默认同 host 复用已有 tab(导航+激活),force:true 强制开新 tab。 */
|
|
120
|
+
async newTab(options = {}) {
|
|
121
|
+
return this.rpc("newTab", options);
|
|
122
|
+
}
|
|
123
|
+
/** 列出所有标签页(每项 pageHandle 必有 pageId)。 */
|
|
124
|
+
async listTabs() {
|
|
125
|
+
const raw = await this.rpc("listTabs", {});
|
|
126
|
+
const arr = Array.isArray(raw) ? raw : [];
|
|
127
|
+
return arr.map((t, i) => {
|
|
128
|
+
const ph = t?.pageHandle ?? t;
|
|
129
|
+
if (!ph || !ph.pageId) {
|
|
130
|
+
throw new Error(`listTabs: 第 ${i} 个 tab 缺 pageId (raw=${JSON.stringify(t).slice(0, 150)})`);
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
pageHandle: ph,
|
|
134
|
+
url: t?.url ?? ph?.url,
|
|
135
|
+
title: t?.title,
|
|
136
|
+
active: t?.active,
|
|
137
|
+
};
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
/** 在页面上执行动作(click/fill/goto/snapshot/evaluate/...,40+ 个 action)。 */
|
|
141
|
+
async operate(params) {
|
|
142
|
+
return this.rpc("operate", params);
|
|
143
|
+
}
|
|
144
|
+
/** 获取 cookies。 */
|
|
145
|
+
async getCookies(filter = {}) {
|
|
146
|
+
return this.rpc("getCookies", filter);
|
|
147
|
+
}
|
|
148
|
+
/** 设置 cookies。 */
|
|
149
|
+
async setCookies(cookies) {
|
|
150
|
+
return this.rpc("setCookies", { cookies });
|
|
151
|
+
}
|
|
152
|
+
/** 清除 cookies。 */
|
|
153
|
+
async clearCookies(filter = {}) {
|
|
154
|
+
return this.rpc("clearCookies", filter);
|
|
155
|
+
}
|
|
156
|
+
/** 关闭浏览器(graceful,保留登录态)。 */
|
|
157
|
+
async close() {
|
|
158
|
+
return this.rpc("close", {});
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* 复用 tab:按 urlMatch 找已开的 tab,有则切过去复用,无则 newTab(url)。
|
|
162
|
+
* 高危平台频繁重开页面触发风控,已开的 tab 应复用。
|
|
163
|
+
*/
|
|
164
|
+
async reuseTab(options) {
|
|
165
|
+
return this.rpc("reuseTab", {
|
|
166
|
+
url: options.url || "",
|
|
167
|
+
urlMatch: options.urlMatch.source,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
/** 列出最近下载(chrome.downloads.search 实时查,默认最近 20 条;仅 extension 模式)。 */
|
|
171
|
+
async listDownloads(limit = 20) {
|
|
172
|
+
return this.rpc("listDownloads", { limit });
|
|
173
|
+
}
|
|
174
|
+
/** 查单个下载状态(by id;仅 extension 模式)。 */
|
|
175
|
+
async getDownload(id) {
|
|
176
|
+
return this.rpc("getDownload", { id });
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* 轮询等下载完成(基于 chrome.downloads 原生状态,不轮询目录)。
|
|
180
|
+
* 点了下载按钮后调用,按 filenameRegex + sinceMs 匹配,等 state=complete。
|
|
181
|
+
* 返回 { download, reason }:reason=complete 成功,timeout 超时。
|
|
182
|
+
*/
|
|
183
|
+
async waitForDownload(options) {
|
|
184
|
+
return this.rpc("waitForDownload", options, (options.timeoutMs ?? 60000) + 5000);
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* 通用等待:DOM 节点(selector)或文本(text)出现。
|
|
188
|
+
* 延迟重试(轮询)+ 刷新重试(检测不到刷新页面重来)+ 连续 maxRefresh 次仍未出现则返回 ok:false。
|
|
189
|
+
* 适用于 SPA 异步加载的元素,比 sleep 固定等待更稳。frameId 指定时在对应 iframe 内检测/刷新。
|
|
190
|
+
*/
|
|
191
|
+
async waitFor(options) {
|
|
192
|
+
const start = Date.now();
|
|
193
|
+
const { tab, frameId, selector, text, pollTimeoutMs = 10000, intervalMs = 1000, maxRefresh = 2, refreshSettleMs = 5000, } = options;
|
|
194
|
+
if (!selector && !text)
|
|
195
|
+
throw new Error("waitFor: 至少提供 selector 或 text");
|
|
196
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
197
|
+
// 检测一次:selector 和 text 是否满足(返回 matched 或 null)
|
|
198
|
+
const checkOnce = async (fid) => {
|
|
199
|
+
try {
|
|
200
|
+
const params = {
|
|
201
|
+
source: `(args) => {
|
|
202
|
+
const okSel = args.selector ? !!document.querySelector(args.selector) : false;
|
|
203
|
+
const okText = args.text ? (document.body && document.body.innerText.includes(args.text)) : false;
|
|
204
|
+
if (okSel) return 'selector';
|
|
205
|
+
if (okText) return 'text';
|
|
206
|
+
return null;
|
|
207
|
+
}`,
|
|
208
|
+
args: { selector: selector || null, text: text || null },
|
|
209
|
+
};
|
|
210
|
+
if (typeof fid === "number")
|
|
211
|
+
params.frameId = fid;
|
|
212
|
+
const r = (await this.operate({
|
|
213
|
+
pageHandle: tab,
|
|
214
|
+
action: "evaluate",
|
|
215
|
+
params,
|
|
216
|
+
}));
|
|
217
|
+
return r === "selector" || r === "text" ? r : null;
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
// 轮询一轮(pollTimeoutMs 内每隔 intervalMs 检测)
|
|
224
|
+
const pollRound = async (fid) => {
|
|
225
|
+
const deadline = Date.now() + pollTimeoutMs;
|
|
226
|
+
while (Date.now() < deadline) {
|
|
227
|
+
const m = await checkOnce(fid);
|
|
228
|
+
if (m)
|
|
229
|
+
return m;
|
|
230
|
+
await sleep(intervalMs);
|
|
231
|
+
}
|
|
232
|
+
return null;
|
|
233
|
+
};
|
|
234
|
+
// 第一轮(不刷新)
|
|
235
|
+
let matched = await pollRound(frameId);
|
|
236
|
+
if (matched)
|
|
237
|
+
return { ok: true, matched, refreshCount: 0, elapsedMs: Date.now() - start };
|
|
238
|
+
// 刷新重试
|
|
239
|
+
let currentFrameId = frameId;
|
|
240
|
+
for (let i = 1; i <= maxRefresh; i++) {
|
|
241
|
+
// 刷新整页
|
|
242
|
+
try {
|
|
243
|
+
await this.operate({ pageHandle: tab, action: "reload" });
|
|
244
|
+
}
|
|
245
|
+
catch {
|
|
246
|
+
// reload 失败兜底:直接返回未等到
|
|
247
|
+
}
|
|
248
|
+
await sleep(refreshSettleMs);
|
|
249
|
+
// 刷新后 frameId 可能变,重新 listFrames 解析(若原指定了 frameId)
|
|
250
|
+
if (typeof frameId === "number") {
|
|
251
|
+
try {
|
|
252
|
+
const frames = (await this.operate({
|
|
253
|
+
pageHandle: tab,
|
|
254
|
+
action: "listFrames",
|
|
255
|
+
}));
|
|
256
|
+
const f = frames.find((x) => x.parentFrameId === 0 && x.frameId !== 0);
|
|
257
|
+
currentFrameId = f?.frameId;
|
|
258
|
+
}
|
|
259
|
+
catch {
|
|
260
|
+
currentFrameId = undefined;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
matched = await pollRound(currentFrameId);
|
|
264
|
+
if (matched)
|
|
265
|
+
return { ok: true, matched, refreshCount: i, elapsedMs: Date.now() - start };
|
|
266
|
+
}
|
|
267
|
+
return { ok: false, matched: null, refreshCount: maxRefresh, elapsedMs: Date.now() - start };
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* 默认导出的便捷工厂:等价于 `new BrowserClient(opts)`。
|
|
272
|
+
* 便于 `import { browser } from "@mooncat/browser"` 后直接用。
|
|
273
|
+
*/
|
|
274
|
+
export function createBrowser(opts) {
|
|
275
|
+
return new BrowserClient(opts);
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/** 解析后的运行时配置。 */
|
|
2
|
+
export interface ResolvedConfig {
|
|
3
|
+
/** browserd RPC 端口(client 连这里)。默认 17322。 */
|
|
4
|
+
rpcPort: number;
|
|
5
|
+
/** 服务包装层 health 端口。默认 17440。 */
|
|
6
|
+
healthPort: number;
|
|
7
|
+
/** Chrome user-data-dir(绝对路径)。 */
|
|
8
|
+
profile: string;
|
|
9
|
+
/** Chrome 可执行文件路径(未指定时为 undefined,交给 browserd 自动探测)。 */
|
|
10
|
+
chromePath?: string;
|
|
11
|
+
/** 日志目录(绝对路径)。 */
|
|
12
|
+
logsDir: string;
|
|
13
|
+
/** 配置文件路径(绝对路径)。 */
|
|
14
|
+
configPath: string;
|
|
15
|
+
}
|
|
16
|
+
/** 默认端口常量。 */
|
|
17
|
+
export declare const DEFAULT_RPC_PORT = 17322;
|
|
18
|
+
export declare const DEFAULT_HEALTH_PORT = 17440;
|
|
19
|
+
/** CLI 传入的覆盖项(全部可选,未传则按优先级回退)。 */
|
|
20
|
+
export interface CliOverrides {
|
|
21
|
+
rpcPort?: number;
|
|
22
|
+
/** CLI 的 --port 别名(语义同 rpcPort:client 连接的 RPC 端口)。 */
|
|
23
|
+
port?: number;
|
|
24
|
+
healthPort?: number;
|
|
25
|
+
profile?: string;
|
|
26
|
+
chromePath?: string;
|
|
27
|
+
configPath?: string;
|
|
28
|
+
}
|
|
29
|
+
/** 跨平台 app-data 根目录(不含 mooncat-browser 子目录)。 */
|
|
30
|
+
export declare function appDataRoot(): string;
|
|
31
|
+
/** mooncat-browser 的数据根目录:<appDataRoot>/mooncat-browser。 */
|
|
32
|
+
export declare function appDataDir(): string;
|
|
33
|
+
/** 默认配置文件路径。 */
|
|
34
|
+
export declare function defaultConfigPath(): string;
|
|
35
|
+
/** 默认 profile(user-data-dir)路径。 */
|
|
36
|
+
export declare function defaultProfile(): string;
|
|
37
|
+
/** 默认日志目录。 */
|
|
38
|
+
export declare function defaultLogsDir(): string;
|
|
39
|
+
interface RawConfigFile {
|
|
40
|
+
rpcPort?: number;
|
|
41
|
+
healthPort?: number;
|
|
42
|
+
profile?: string;
|
|
43
|
+
chromePath?: string;
|
|
44
|
+
}
|
|
45
|
+
/** 读取配置文件(不存在返回空对象;解析失败返回空对象并打印警告到 stderr)。 */
|
|
46
|
+
export declare function loadConfigFile(path: string): RawConfigFile;
|
|
47
|
+
/**
|
|
48
|
+
* 解析最终配置。优先级:cli > env > configFile > default。
|
|
49
|
+
*
|
|
50
|
+
* @param cli CLI 覆盖项(可选)
|
|
51
|
+
* @param configPathHint 配置文件路径提示(默认走 defaultConfigPath)
|
|
52
|
+
*/
|
|
53
|
+
export declare function resolveConfig(cli?: CliOverrides, configPathHint?: string): ResolvedConfig;
|
|
54
|
+
/**
|
|
55
|
+
* 把解析后的配置翻译成 browserd 子进程需要的环境变量。
|
|
56
|
+
* browserd.cjs 原生读取:BROWSERD_PORT / BROWSER_OP_USERDATA / BROWSER_OP_CHROME_PATH。
|
|
57
|
+
* 这里做一次语义桥接,避免改动 browserd 核心。
|
|
58
|
+
*/
|
|
59
|
+
export declare function browserdEnv(cfg: ResolvedConfig): Record<string, string>;
|
|
60
|
+
export {};
|
|
61
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAqBA,iBAAiB;AACjB,MAAM,WAAW,cAAc;IAC7B,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,cAAc;AACd,eAAO,MAAM,gBAAgB,QAAQ,CAAC;AACtC,eAAO,MAAM,mBAAmB,QAAQ,CAAC;AAEzC,kCAAkC;AAClC,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,gDAAgD;AAChD,wBAAgB,WAAW,IAAI,MAAM,CAUpC;AAED,4DAA4D;AAC5D,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,gBAAgB;AAChB,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,mCAAmC;AACnC,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,cAAc;AACd,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,UAAU,aAAa;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,+CAA+C;AAC/C,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAU1D;AAeD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,GAAE,YAAiB,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,cAAc,CAmC7F;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQvE"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
// -*- coding: utf-8 -*-
|
|
2
|
+
// config.ts — @mooncat/browser 配置解析。
|
|
3
|
+
//
|
|
4
|
+
// 优先级(高 -> 低):CLI 参数 > 环境变量 > 配置文件 > 默认值。
|
|
5
|
+
//
|
|
6
|
+
// 环境变量:
|
|
7
|
+
// MOONCAT_BROWSERD_PORT browserd RPC 端口(client 连这里,默认 17322)
|
|
8
|
+
// MOONCAT_BROWSER_PORT 服务包装层 health 端口(默认 17440)
|
|
9
|
+
// MOONCAT_BROWSER_PROFILE Chrome user-data-dir(默认 <appData>/mooncat-browser/profile)
|
|
10
|
+
// MOONCAT_BROWSER_CHROME Chrome 可执行文件路径(可选,不传则自动探测)
|
|
11
|
+
//
|
|
12
|
+
// 配置文件(JSON):
|
|
13
|
+
// Windows: %LOCALAPPDATA%\mooncat-browser\config.json
|
|
14
|
+
// macOS: ~/Library/Application Support/mooncat-browser/config.json
|
|
15
|
+
// Linux: $XDG_DATA_HOME/mooncat-browser/config.json (~/.local/share/...)
|
|
16
|
+
// 可用 MOONCAT_BROWSER_CONFIG 覆盖路径。
|
|
17
|
+
import { existsSync, mkdirSync, readFileSync } from "node:fs";
|
|
18
|
+
import { dirname, join } from "node:path";
|
|
19
|
+
import { homedir, platform } from "node:os";
|
|
20
|
+
/** 默认端口常量。 */
|
|
21
|
+
export const DEFAULT_RPC_PORT = 17322;
|
|
22
|
+
export const DEFAULT_HEALTH_PORT = 17440;
|
|
23
|
+
/** 跨平台 app-data 根目录(不含 mooncat-browser 子目录)。 */
|
|
24
|
+
export function appDataRoot() {
|
|
25
|
+
const p = platform();
|
|
26
|
+
if (p === "win32") {
|
|
27
|
+
return process.env.LOCALAPPDATA || join(homedir(), "AppData", "Local");
|
|
28
|
+
}
|
|
29
|
+
if (p === "darwin") {
|
|
30
|
+
return join(homedir(), "Library", "Application Support");
|
|
31
|
+
}
|
|
32
|
+
// linux / 其它:XDG_DATA_HOME 或 ~/.local/share
|
|
33
|
+
return process.env.XDG_DATA_HOME || join(homedir(), ".local", "share");
|
|
34
|
+
}
|
|
35
|
+
/** mooncat-browser 的数据根目录:<appDataRoot>/mooncat-browser。 */
|
|
36
|
+
export function appDataDir() {
|
|
37
|
+
return join(appDataRoot(), "mooncat-browser");
|
|
38
|
+
}
|
|
39
|
+
/** 默认配置文件路径。 */
|
|
40
|
+
export function defaultConfigPath() {
|
|
41
|
+
return process.env.MOONCAT_BROWSER_CONFIG || join(appDataDir(), "config.json");
|
|
42
|
+
}
|
|
43
|
+
/** 默认 profile(user-data-dir)路径。 */
|
|
44
|
+
export function defaultProfile() {
|
|
45
|
+
return join(appDataDir(), "profile");
|
|
46
|
+
}
|
|
47
|
+
/** 默认日志目录。 */
|
|
48
|
+
export function defaultLogsDir() {
|
|
49
|
+
return join(appDataDir(), "logs");
|
|
50
|
+
}
|
|
51
|
+
/** 读取配置文件(不存在返回空对象;解析失败返回空对象并打印警告到 stderr)。 */
|
|
52
|
+
export function loadConfigFile(path) {
|
|
53
|
+
if (!path || !existsSync(path))
|
|
54
|
+
return {};
|
|
55
|
+
try {
|
|
56
|
+
const raw = readFileSync(path, "utf8");
|
|
57
|
+
const obj = JSON.parse(raw);
|
|
58
|
+
return obj && typeof obj === "object" ? obj : {};
|
|
59
|
+
}
|
|
60
|
+
catch (e) {
|
|
61
|
+
console.error(`[mooncat-browser] config file parse failed (${path}): ${e.message}`);
|
|
62
|
+
return {};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function firstDefined(...vals) {
|
|
66
|
+
for (const v of vals) {
|
|
67
|
+
if (v !== undefined && v !== null)
|
|
68
|
+
return v;
|
|
69
|
+
}
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
function toPort(v, fallback) {
|
|
73
|
+
const n = typeof v === "string" ? Number(v) : v;
|
|
74
|
+
if (typeof n === "number" && Number.isFinite(n) && n > 0 && n < 65536)
|
|
75
|
+
return Math.floor(n);
|
|
76
|
+
return fallback;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* 解析最终配置。优先级:cli > env > configFile > default。
|
|
80
|
+
*
|
|
81
|
+
* @param cli CLI 覆盖项(可选)
|
|
82
|
+
* @param configPathHint 配置文件路径提示(默认走 defaultConfigPath)
|
|
83
|
+
*/
|
|
84
|
+
export function resolveConfig(cli = {}, configPathHint) {
|
|
85
|
+
const configPath = configPathHint || cli.configPath || defaultConfigPath();
|
|
86
|
+
const file = loadConfigFile(configPath);
|
|
87
|
+
// rpcPort:cli.port 是 cli.rpcPort 的别名(--port 语义)
|
|
88
|
+
const rpcPort = toPort(firstDefined(cli.rpcPort, cli.port, process.env.MOONCAT_BROWSERD_PORT, file.rpcPort), DEFAULT_RPC_PORT);
|
|
89
|
+
const healthPort = toPort(firstDefined(cli.healthPort, process.env.MOONCAT_BROWSER_PORT, file.healthPort), DEFAULT_HEALTH_PORT);
|
|
90
|
+
const profile = firstDefined(cli.profile, process.env.MOONCAT_BROWSER_PROFILE, file.profile) || defaultProfile();
|
|
91
|
+
const chromePath = firstDefined(cli.chromePath, process.env.MOONCAT_BROWSER_CHROME, file.chromePath);
|
|
92
|
+
const logsDir = defaultLogsDir();
|
|
93
|
+
// 确保数据目录存在(profile/logs 父目录)
|
|
94
|
+
for (const dir of [appDataDir(), dirname(profile), logsDir]) {
|
|
95
|
+
try {
|
|
96
|
+
mkdirSync(dir, { recursive: true });
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
/* 忽略:并发创建或权限问题,后续 IO 自行报错 */
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return { rpcPort, healthPort, profile, chromePath, logsDir, configPath };
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* 把解析后的配置翻译成 browserd 子进程需要的环境变量。
|
|
106
|
+
* browserd.cjs 原生读取:BROWSERD_PORT / BROWSER_OP_USERDATA / BROWSER_OP_CHROME_PATH。
|
|
107
|
+
* 这里做一次语义桥接,避免改动 browserd 核心。
|
|
108
|
+
*/
|
|
109
|
+
export function browserdEnv(cfg) {
|
|
110
|
+
const env = {
|
|
111
|
+
BROWSERD_PORT: String(cfg.rpcPort),
|
|
112
|
+
IPC_PORT: String(cfg.rpcPort), // browserd 旧名兼容
|
|
113
|
+
BROWSER_OP_USERDATA: cfg.profile,
|
|
114
|
+
};
|
|
115
|
+
if (cfg.chromePath)
|
|
116
|
+
env.BROWSER_OP_CHROME_PATH = cfg.chromePath;
|
|
117
|
+
return env;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|