mooncat-browser 0.1.0 → 0.2.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,144 @@
1
+ // -*- coding: utf-8 -*-
2
+ // prepare-extension.ts — 为实例生成 unpacked 扩展目录。
3
+ //
4
+ // 多实例 extension 隔离靠:独立 profileDir + 独立 extensionDir + 独立 extensionPort。
5
+ // 包内 browser-op/webplater/dist/chrome-mv3 是只 build 一次的模板(含占位符)。
6
+ // 本模块在 prepare-extension <name> 时:
7
+ // 1. copy 模板 → 实例 extensionDir
8
+ // 2. 替换所有产物里的 __MOONCAT_BROWSER_HOST_WS_URL__ → ws://127.0.0.1:<extensionPort>
9
+ // 3. 写 metadata(.mooncat-instance.json)
10
+ //
11
+ // 用户随后手动 load unpacked 这个实例 extensionDir 到实例 profileDir 的 Chrome。
12
+ // 共享同一 key/extensionId:不同 profileDir 里的同 id 扩展互不冲突。
13
+ import { cpSync, existsSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from "node:fs";
14
+ import { join } from "node:path";
15
+ import { fileURLToPath } from "node:url";
16
+ const __dirname = fileURLToPath(new URL(".", import.meta.url));
17
+ /** 源码 offscreen/main.ts 里的占位符,wxt build 保留字符串字面量。 */
18
+ export const HOST_WS_URL_PLACEHOLDER = "__MOONCAT_BROWSER_HOST_WS_URL__";
19
+ /** 包内 webplater 扩展模板目录。dist/cli.js -> ../../browser-op/webplater/dist/chrome-mv3。 */
20
+ export function extensionTemplateDir() {
21
+ return (process.env.MOONCAT_BROWSER_EXTENSION_TEMPLATE ||
22
+ join(__dirname, "..", "browser-op", "webplater", "dist", "chrome-mv3"));
23
+ }
24
+ /** 实例扩展目录内的 metadata 文件名。 */
25
+ export const METADATA_FILENAME = ".mooncat-instance.json";
26
+ /** 读模板 manifest 的 version(build 时间戳)。 */
27
+ function readTemplateManifestVersion(templateDir) {
28
+ try {
29
+ const m = JSON.parse(readFileSync(join(templateDir, "manifest.json"), "utf8"));
30
+ return m.version || "unknown";
31
+ }
32
+ catch {
33
+ return "unknown";
34
+ }
35
+ }
36
+ /** 递归遍历 dir,对所有 .js/.html/.json 文件做字符串替换。返回被改写的文件数。 */
37
+ function replaceInDir(dir, from, to) {
38
+ let touched = 0;
39
+ const walk = (d) => {
40
+ for (const entry of readdirSync(d)) {
41
+ const p = join(d, entry);
42
+ const st = statSync(p);
43
+ if (st.isDirectory()) {
44
+ walk(p);
45
+ continue;
46
+ }
47
+ if (/\.(js|html|json|mjs|css)$/.test(entry)) {
48
+ const original = readFileSync(p, "utf8");
49
+ if (original.includes(from)) {
50
+ writeFileSync(p, original.split(from).join(to), "utf8");
51
+ touched++;
52
+ }
53
+ }
54
+ }
55
+ };
56
+ walk(dir);
57
+ return touched;
58
+ }
59
+ /**
60
+ * 为实例生成 unpacked 扩展目录。
61
+ *
62
+ * 步骤:rm 旧目录 → mkdir → copy 模板 → 替换占位符 → 写 metadata。
63
+ * 幂等:重复调用会清空重建。
64
+ *
65
+ * @returns 被替换占位符的文件数 + metadata
66
+ */
67
+ export function prepareExtension(cfg) {
68
+ const templateDir = extensionTemplateDir();
69
+ if (!existsSync(templateDir)) {
70
+ throw new Error(`extension template not found: ${templateDir}\n` +
71
+ `hint: 包发布时漏了 browser-op/webplater/dist,或跑 npm run build:extension 重建。`);
72
+ }
73
+ const targetDir = cfg.extensionDir;
74
+ // 清空重建(幂等)
75
+ rmSync(targetDir, { recursive: true, force: true });
76
+ mkdirSync(targetDir, { recursive: true });
77
+ // copy 模板 → 实例 extensionDir
78
+ cpSync(templateDir, targetDir, { recursive: true, force: true });
79
+ // 替换占位符
80
+ const hostWsUrl = `ws://127.0.0.1:${cfg.extensionPort}`;
81
+ const replacedFiles = replaceInDir(targetDir, HOST_WS_URL_PLACEHOLDER, hostWsUrl);
82
+ // 验证占位符确实被换掉了(否则扩展连不上)
83
+ if (replacedFiles === 0) {
84
+ // 扫一下目标里还有没有残留占位符
85
+ const stillHasPlaceholder = readFileSync(join(targetDir, "chunks", readdirSync(join(targetDir, "chunks")).find((f) => f.startsWith("offscreen-")) || ""), "utf8").includes(HOST_WS_URL_PLACEHOLDER);
86
+ if (stillHasPlaceholder) {
87
+ throw new Error(`placeholder ${HOST_WS_URL_PLACEHOLDER} 未被替换(模板可能不含占位符,需检查 browser-op/webplater/dist)`);
88
+ }
89
+ }
90
+ // 写 metadata
91
+ const metadata = {
92
+ instance: cfg.name,
93
+ extensionPort: cfg.extensionPort,
94
+ hostWsUrl,
95
+ generatedAt: new Date().toISOString(),
96
+ sourceBuildVersion: readTemplateManifestVersion(templateDir),
97
+ };
98
+ writeFileSync(join(targetDir, METADATA_FILENAME), JSON.stringify(metadata, null, 2) + "\n", "utf8");
99
+ return { replacedFiles, metadata, templateDir };
100
+ }
101
+ /** 读实例 extensionDir 的 metadata。不存在返回 null。 */
102
+ export function readInstanceMetadata(cfg) {
103
+ const p = join(cfg.extensionDir, METADATA_FILENAME);
104
+ if (!existsSync(p))
105
+ return null;
106
+ try {
107
+ return JSON.parse(readFileSync(p, "utf8"));
108
+ }
109
+ catch {
110
+ return null;
111
+ }
112
+ }
113
+ /**
114
+ * 校验实例 extensionDir 是否就绪(用于 start --route extension 前置检查)。
115
+ * 返回 null 表示就绪;返回字符串表示需要重 prepare 的原因。
116
+ */
117
+ export function verifyInstanceExtension(cfg) {
118
+ if (!existsSync(cfg.extensionDir)) {
119
+ return `extension dir 不存在: ${cfg.extensionDir}`;
120
+ }
121
+ if (!existsSync(join(cfg.extensionDir, METADATA_FILENAME))) {
122
+ return `metadata 缺失(.mooncat-instance.json),可能是手动建的目录`;
123
+ }
124
+ const meta = readInstanceMetadata(cfg);
125
+ if (!meta)
126
+ return `metadata 解析失败`;
127
+ if (meta.extensionPort !== cfg.extensionPort) {
128
+ return `端口已变(metadata=${meta.extensionPort}, cfg=${cfg.extensionPort})`;
129
+ }
130
+ const currentTemplateVersion = (() => {
131
+ try {
132
+ const m = JSON.parse(readFileSync(join(extensionTemplateDir(), "manifest.json"), "utf8"));
133
+ return m.version || "unknown";
134
+ }
135
+ catch {
136
+ return "unknown";
137
+ }
138
+ })();
139
+ if (meta.sourceBuildVersion !== currentTemplateVersion) {
140
+ return `包升级了(metadata=${meta.sourceBuildVersion}, current=${currentTemplateVersion})`;
141
+ }
142
+ return null;
143
+ }
144
+ //# sourceMappingURL=prepare-extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare-extension.js","sourceRoot":"","sources":["../src/prepare-extension.ts"],"names":[],"mappings":"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"}
package/dist/server.d.ts CHANGED
@@ -1,35 +1,47 @@
1
- import { type ResolvedConfig } from "./config.js";
2
- /** browserd.cjs 路径:dist/ 在包根下,browser-op 在包根下。允许用环境变量覆盖(开发态)。 */
1
+ import { type BrowserInstanceConfig } from "./config.js";
2
+ /** browserd.cjs 路径:dist/ 在包根下,browser-op 在包根下。允许用环境变量覆盖(开发态)。 */
3
3
  export declare function browserdScriptPath(): string;
4
- /** wrapper 进程状态文件路径(按 rpcPort 分隔,支持多实例)。 */
5
- export declare function serviceStatePath(rpcPort: number): string;
6
- /** wrapper 进程状态(stop 命令据此定位 healthPort)。 */
4
+ /** 实例的 wrapper 状态文件路径(放实例 stateDir)。 */
5
+ export declare function serviceStatePath(cfg: BrowserInstanceConfig): string;
6
+ /** wrapper 进程状态(stop/status 命令据此定位 healthPort)。 */
7
7
  export interface ServiceState {
8
8
  pid: number;
9
+ instance: string;
9
10
  rpcPort: number;
10
11
  healthPort: number;
11
- profile: string;
12
+ extensionPort: number;
13
+ profileDir: string;
14
+ stateDir: string;
15
+ logsDir: string;
12
16
  startedAt: string;
13
17
  }
14
- /** 服务运行状态(/health 返回的一部分)。 */
18
+ /** /health 返回结构(增强版:含 instance 标识 + browserd 真实字段)。 */
15
19
  export interface ServiceStatus {
16
20
  ok: boolean;
17
21
  status: "ok" | "degraded" | "down" | "stopping";
22
+ instance: string;
18
23
  rpcPort: number;
19
24
  healthPort: number;
25
+ extensionPort: number;
26
+ profileDir: string;
27
+ stateDir: string;
28
+ logsDir: string;
20
29
  browserd: boolean;
21
30
  browserdPid: number | null;
31
+ chromePid: number | null;
32
+ mode: string | null;
33
+ pageCount: number;
34
+ browserOpen: boolean;
22
35
  lastExit: {
23
36
  code: number | string | null;
24
37
  at: string;
25
38
  } | null;
26
- profile: string;
27
39
  }
28
40
  /**
29
41
  * browserd 服务包装器。
30
42
  *
31
- * 用 startService(cfg) 启动;返回的对象含 stop() 用于 graceful 关闭。
32
- * 进程信号(SIGINT/SIGTERM)会触发 graceful 关闭。
43
+ * 用 startService(cfg) 启动;返回的对象含 stop() 用于 graceful 关闭。
44
+ * 进程信号(SIGINT/SIGTERM)会触发 graceful 关闭。
33
45
  */
34
46
  export declare class BrowserService {
35
47
  private readonly cfg;
@@ -40,27 +52,30 @@ export declare class BrowserService {
40
52
  private restartTimer;
41
53
  private healthServer;
42
54
  private shuttingDown;
43
- constructor(cfg: ResolvedConfig);
55
+ constructor(cfg: BrowserInstanceConfig);
44
56
  private log;
45
- /** 启动 wrapperspawn browserd + 起 health server + 写 pidfile + 注册信号。 */
57
+ /** 启动 wrapper:写 pidfile + spawn browserd + 起 health server + 注册信号。 */
46
58
  start(): Promise<void>;
47
- /** spawn browserd 子进程(崩溃自动重启,除非 stopping)。 */
59
+ /** spawn browserd 子进程(崩溃自动重启,除非 stopping)。 */
48
60
  private startBrowserd;
49
- /** 查询当前状态(代理 browserd /health + wrapper 状态)。 */
61
+ /** 拉一次 browserd /health,合并 wrapper 状态成完整 status。 */
50
62
  status(): Promise<ServiceStatus>;
51
63
  /**
52
- * Graceful 关闭:
53
- * 1. 标记 stopping(阻止重启)
54
- * 2. 发 close 给 browserdbrowserd graceful 关 Chrome,保留登录态)
55
- * 3. 等 browserd 退出(最多 10s),仍未退则 kill
64
+ * Graceful 关闭:
65
+ * 1. 标记 stopping(阻止重启)
66
+ * 2. 发 close 给 browserd(browserd graceful 关 Chrome,保留登录态)
67
+ * 3. 等 browserd 退出(最多 10s),仍未退则 kill
56
68
  * 4. 关 health server + 删 pidfile + exit
57
69
  */
58
70
  stop(): Promise<void>;
59
- /** 等 browserd 子进程退出,最多 timeoutMs;超时则 SIGKILL。 */
71
+ /** 等 browserd 子进程退出,最多 timeoutMs;超时则 SIGKILL。 */
60
72
  private waitForBrowserdExit;
61
73
  }
62
- /** 便捷入口:解析配置并启动 wrapperCLI start 命令调用)。 */
63
- export declare function startService(cfg: ResolvedConfig): Promise<BrowserService>;
64
- /** 读取已运行 wrapper 的状态(用于 stop 命令定位 healthPort)。 */
65
- export declare function readServiceState(rpcPort: number): ServiceState | null;
74
+ /** 便捷入口:用实例配置启动 wrapper(CLI start 命令调用)。 */
75
+ export declare function startService(cfg: BrowserInstanceConfig): Promise<BrowserService>;
76
+ /**
77
+ * 按"项目配置 + 实例名"读取已运行 wrapper 的状态(stop/status 命令定位用)。
78
+ * state 文件在实例 stateDir/service.json。
79
+ */
80
+ export declare function readServiceState(cfg: BrowserInstanceConfig): ServiceState | null;
66
81
  //# sourceMappingURL=server.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAuBA,OAAO,EAA2B,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAI3E,iEAAiE;AACjE,wBAAgB,kBAAkB,IAAI,MAAM,CAK3C;AAED,4CAA4C;AAC5C,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,4CAA4C;AAC5C,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,8BAA8B;AAC9B,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,IAAI,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,CAAC;IAChD,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC9D,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAiB;IACrC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuC;IACjE,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,QAAQ,CAA6D;IAC7E,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,YAAY,CAAS;gBAEjB,GAAG,EAAE,cAAc;IAM/B,OAAO,CAAC,GAAG;IAUX,sEAAsE;IAChE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA2C5B,8CAA8C;IAC9C,OAAO,CAAC,aAAa;IA0BrB,gDAAgD;IAC1C,MAAM,IAAI,OAAO,CAAC,aAAa,CAAC;IA8BtC;;;;;;OAMG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA+C3B,iDAAiD;IACjD,OAAO,CAAC,mBAAmB;CAsB5B;AAED,4CAA4C;AAC5C,wBAAsB,YAAY,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAI/E;AAED,kDAAkD;AAClD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CASrE"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAe,KAAK,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAItE,iEAAiE;AACjE,wBAAgB,kBAAkB,IAAI,MAAM,CAK3C;AAED,wCAAwC;AACxC,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,qBAAqB,GAAG,MAAM,CAEnE;AAED,mDAAmD;AACnD,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAaD,uDAAuD;AACvD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,IAAI,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,CAAC;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAC/D;AAED;;;;;GAKG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAwB;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuC;IACjE,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,QAAQ,CAA6D;IAC7E,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAA+B;IACnD,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,YAAY,CAAS;gBAEjB,GAAG,EAAE,qBAAqB;IAOtC,OAAO,CAAC,GAAG;IAUX,sEAAsE;IAChE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiD5B,8CAA8C;IAC9C,OAAO,CAAC,aAAa;IA0BrB,oDAAoD;IAC9C,MAAM,IAAI,OAAO,CAAC,aAAa,CAAC;IAuCtC;;;;;;OAMG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA+C3B,iDAAiD;IACjD,OAAO,CAAC,mBAAmB;CAsB5B;AAED,4CAA4C;AAC5C,wBAAsB,YAAY,CAAC,GAAG,EAAE,qBAAqB,GAAG,OAAO,CAAC,cAAc,CAAC,CAItF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,qBAAqB,GAAG,YAAY,GAAG,IAAI,CAShF"}
package/dist/server.js CHANGED
@@ -1,41 +1,39 @@
1
1
  // -*- coding: utf-8 -*-
2
2
  // server.ts — @mooncat/browser 服务包装层。
3
3
  //
4
- // 形态(与原 mooncat services/browser/main.cjs 一致,迁移风险最低):
5
- //
6
- // mooncat-browser start
7
- // -> 启动本 wrapperhealth server on healthPort
8
- // -> wrapper spawn browserd.cjs(RPC on rpcPort)
4
+ // 形态:
5
+ // mooncat-browser start <name>
6
+ // -> 启动本 wrapper(health server on instance.healthPort)
7
+ // -> wrapper spawn browserd.cjsRPC on instance.rpcPort
9
8
  // -> GET /health 代理 browserd /health + wrapper 状态
10
9
  // -> POST /shutdown graceful:发 close 给 browserd(graceful 关 Chrome),
11
10
  // 等其退出,wrapper 退出(不重启)
12
11
  //
13
12
  // browserd 崩溃(非 shutdown)时 wrapper 自动 3s 后重启。
14
13
  //
15
- // 注意:browserd.cjs 是原 mooncat libs/browser 的核心,原样复制,不改其内部逻辑。
16
- // wrapper 通过环境变量(BROWSERD_PORT / BROWSER_OP_USERDATA / BROWSER_OP_CHROME_PATH)
17
- // 把本包的配置语义桥接给 browserd。
14
+ // 一个 browser 实例 = 一个 wrapper = 一个 browserd = 一个 Chrome = 一份 profile
15
+ // = 一组端口 + 一套 state/log,实例间在文件系统与端口上完全隔离。
18
16
  import http from "node:http";
19
17
  import { spawn } from "node:child_process";
20
18
  import { createWriteStream, existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
21
19
  import { join } from "node:path";
22
20
  import { fileURLToPath } from "node:url";
23
- import { appDataDir, browserdEnv } from "./config.js";
21
+ import { browserdEnv } from "./config.js";
24
22
  const __dirname = fileURLToPath(new URL(".", import.meta.url));
25
- /** browserd.cjs 路径:dist/ 在包根下,browser-op 在包根下。允许用环境变量覆盖(开发态)。 */
23
+ /** browserd.cjs 路径:dist/ 在包根下,browser-op 在包根下。允许用环境变量覆盖(开发态)。 */
26
24
  export function browserdScriptPath() {
27
25
  return (process.env.MOONCAT_BROWSERD_BIN ||
28
26
  join(__dirname, "..", "browser-op", "backend", "browserd.cjs"));
29
27
  }
30
- /** wrapper 进程状态文件路径(按 rpcPort 分隔,支持多实例)。 */
31
- export function serviceStatePath(rpcPort) {
32
- return join(appDataDir(), `service-${rpcPort}.json`);
28
+ /** 实例的 wrapper 状态文件路径(放实例 stateDir)。 */
29
+ export function serviceStatePath(cfg) {
30
+ return join(cfg.stateDir, "service.json");
33
31
  }
34
32
  /**
35
33
  * browserd 服务包装器。
36
34
  *
37
- * 用 startService(cfg) 启动;返回的对象含 stop() 用于 graceful 关闭。
38
- * 进程信号(SIGINT/SIGTERM)会触发 graceful 关闭。
35
+ * 用 startService(cfg) 启动;返回的对象含 stop() 用于 graceful 关闭。
36
+ * 进程信号(SIGINT/SIGTERM)会触发 graceful 关闭。
39
37
  */
40
38
  export class BrowserService {
41
39
  cfg;
@@ -49,6 +47,7 @@ export class BrowserService {
49
47
  constructor(cfg) {
50
48
  this.cfg = cfg;
51
49
  mkdirSync(this.cfg.logsDir, { recursive: true });
50
+ mkdirSync(this.cfg.stateDir, { recursive: true });
52
51
  this.logStream = createWriteStream(join(this.cfg.logsDir, "service.log"), { flags: "a" });
53
52
  }
54
53
  log(msg) {
@@ -61,17 +60,21 @@ export class BrowserService {
61
60
  /* 日志写入失败不阻塞主流程 */
62
61
  }
63
62
  }
64
- /** 启动 wrapperspawn browserd + 起 health server + 写 pidfile + 注册信号。 */
63
+ /** 启动 wrapper:写 pidfile + spawn browserd + 起 health server + 注册信号。 */
65
64
  async start() {
66
65
  const state = {
67
66
  pid: process.pid,
67
+ instance: this.cfg.name,
68
68
  rpcPort: this.cfg.rpcPort,
69
69
  healthPort: this.cfg.healthPort,
70
- profile: this.cfg.profile,
70
+ extensionPort: this.cfg.extensionPort,
71
+ profileDir: this.cfg.profileDir,
72
+ stateDir: this.cfg.stateDir,
73
+ logsDir: this.cfg.logsDir,
71
74
  startedAt: new Date().toISOString(),
72
75
  };
73
- writeFileSync(serviceStatePath(this.cfg.rpcPort), JSON.stringify(state, null, 2), "utf8");
74
- this.log(`service wrapper started pid=${process.pid} (rpc :${this.cfg.rpcPort}, health :${this.cfg.healthPort})`);
76
+ writeFileSync(serviceStatePath(this.cfg), JSON.stringify(state, null, 2), "utf8");
77
+ this.log(`service wrapper started pid=${process.pid} instance=${this.cfg.name} (rpc :${this.cfg.rpcPort}, health :${this.cfg.healthPort})`);
75
78
  this.startBrowserd();
76
79
  this.healthServer = http.createServer(async (req, res) => {
77
80
  res.setHeader("Content-Type", "application/json");
@@ -100,7 +103,7 @@ export class BrowserService {
100
103
  process.on("SIGINT", shutdownSignal("SIGINT"));
101
104
  process.on("SIGTERM", shutdownSignal("SIGTERM"));
102
105
  }
103
- /** spawn browserd 子进程(崩溃自动重启,除非 stopping)。 */
106
+ /** spawn browserd 子进程(崩溃自动重启,除非 stopping)。 */
104
107
  startBrowserd() {
105
108
  const env = { ...process.env, ...browserdEnv(this.cfg) };
106
109
  this.browserd = spawn(process.execPath, [browserdScriptPath()], {
@@ -114,7 +117,7 @@ export class BrowserService {
114
117
  this.log(`browserd exited code=${code} signal=${signal}`);
115
118
  this.browserd = null;
116
119
  if (this.stopping) {
117
- // 主动关闭触发的退出,不重启;由 stop() 继续收尾
120
+ // 主动关闭触发的退出,不重启;由 stop() 继续收尾
118
121
  return;
119
122
  }
120
123
  // 非主动退出 → 3s 后重启
@@ -126,13 +129,14 @@ export class BrowserService {
126
129
  }, 3000);
127
130
  });
128
131
  }
129
- /** 查询当前状态(代理 browserd /health + wrapper 状态)。 */
132
+ /** 拉一次 browserd /health,合并 wrapper 状态成完整 status。 */
130
133
  async status() {
131
134
  let browserdUp = false;
135
+ let bd = {};
132
136
  try {
133
137
  const resp = await fetch(`http://127.0.0.1:${this.cfg.rpcPort}/health`);
134
138
  if (resp.ok) {
135
- await resp.text();
139
+ bd = (await resp.json());
136
140
  browserdUp = true;
137
141
  }
138
142
  }
@@ -149,19 +153,27 @@ export class BrowserService {
149
153
  return {
150
154
  ok: status === "ok",
151
155
  status,
156
+ instance: this.cfg.name,
152
157
  rpcPort: this.cfg.rpcPort,
153
158
  healthPort: this.cfg.healthPort,
159
+ extensionPort: this.cfg.extensionPort,
160
+ profileDir: this.cfg.profileDir,
161
+ stateDir: this.cfg.stateDir,
162
+ logsDir: this.cfg.logsDir,
154
163
  browserd: browserdUp,
155
164
  browserdPid: this.browserd?.pid ?? null,
165
+ chromePid: bd.pid ?? null,
166
+ mode: bd.mode ?? null,
167
+ pageCount: bd.pageCount ?? 0,
168
+ browserOpen: bd.browserOpen ?? false,
156
169
  lastExit: this.lastExit,
157
- profile: this.cfg.profile,
158
170
  };
159
171
  }
160
172
  /**
161
- * Graceful 关闭:
162
- * 1. 标记 stopping(阻止重启)
163
- * 2. 发 close 给 browserdbrowserd graceful 关 Chrome,保留登录态)
164
- * 3. 等 browserd 退出(最多 10s),仍未退则 kill
173
+ * Graceful 关闭:
174
+ * 1. 标记 stopping(阻止重启)
175
+ * 2. 发 close 给 browserd(browserd graceful 关 Chrome,保留登录态)
176
+ * 3. 等 browserd 退出(最多 10s),仍未退则 kill
165
177
  * 4. 关 health server + 删 pidfile + exit
166
178
  */
167
179
  async stop() {
@@ -174,7 +186,7 @@ export class BrowserService {
174
186
  this.restartTimer = null;
175
187
  }
176
188
  this.log(`graceful shutdown begin`);
177
- // 1) 发 close 给 browserdgraceful 关 Chrome
189
+ // 1) 发 close 给 browserd(graceful 关 Chrome)
178
190
  try {
179
191
  const body = JSON.stringify({ id: 1, method: "close", params: {} });
180
192
  await fetch(`http://127.0.0.1:${this.cfg.rpcPort}/rpc`, {
@@ -197,7 +209,7 @@ export class BrowserService {
197
209
  });
198
210
  // 4) 删 pidfile + exit
199
211
  try {
200
- unlinkSync(serviceStatePath(this.cfg.rpcPort));
212
+ unlinkSync(serviceStatePath(this.cfg));
201
213
  }
202
214
  catch {
203
215
  /* ignore */
@@ -211,7 +223,7 @@ export class BrowserService {
211
223
  }
212
224
  process.exit(0);
213
225
  }
214
- /** 等 browserd 子进程退出,最多 timeoutMs;超时则 SIGKILL。 */
226
+ /** 等 browserd 子进程退出,最多 timeoutMs;超时则 SIGKILL。 */
215
227
  waitForBrowserdExit(timeoutMs) {
216
228
  return new Promise((resolve) => {
217
229
  if (!this.browserd)
@@ -237,15 +249,18 @@ export class BrowserService {
237
249
  });
238
250
  }
239
251
  }
240
- /** 便捷入口:解析配置并启动 wrapperCLI start 命令调用)。 */
252
+ /** 便捷入口:用实例配置启动 wrapper(CLI start 命令调用)。 */
241
253
  export async function startService(cfg) {
242
254
  const svc = new BrowserService(cfg);
243
255
  await svc.start();
244
256
  return svc;
245
257
  }
246
- /** 读取已运行 wrapper 的状态(用于 stop 命令定位 healthPort)。 */
247
- export function readServiceState(rpcPort) {
248
- const f = serviceStatePath(rpcPort);
258
+ /**
259
+ * 按"项目配置 + 实例名"读取已运行 wrapper 的状态(stop/status 命令定位用)
260
+ * state 文件在实例 stateDir/service.json。
261
+ */
262
+ export function readServiceState(cfg) {
263
+ const f = serviceStatePath(cfg);
249
264
  if (!existsSync(f))
250
265
  return null;
251
266
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mooncat-browser",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "浏览器自动化工具包:可独立启动的本地服务(browserd)+ JS/TS client。双路由(WebPlater 扩展 / CDP),不依赖 mooncat 总发行体。",
5
5
  "type": "module",
6
6
  "main": "./dist/client.js",
@@ -31,31 +31,44 @@ description: "Drive the user's local Chrome via @mooncat/browser (BrowserClient
31
31
 
32
32
  ## 怎么用
33
33
 
34
+ > **前置**:mooncat-browser 是实例化、项目级配置的独立包。**不写全局 appData**,
35
+ > 必须先 `init` 生成项目配置,再 `start <实例名>`。找不到配置会 fail fast。
36
+
37
+ ```bash
38
+ # 一次性:在项目目录初始化(生成 config/browser.json + .browser/<name>/ 数据目录)
39
+ npx mooncat-browser init my-task # 实例名自定义,默认 default
40
+
41
+ # 启动实例(常驻,另一个终端。实例名是主语,不是端口)
42
+ npx mooncat-browser start my-task
43
+ # 高危平台走 extension 路:先 prepare 扩展目录 + 手动 load unpacked(见 high-risk.md)
44
+ npx mooncat-browser start my-task --route-mode extension
45
+ ```
46
+
34
47
  ```ts
35
48
  import { BrowserClient } from "@mooncat/browser";
36
49
 
37
- // 连接到已启动的服务(端口要和 mooncat-browser start --port 一致,默认 17322
50
+ // 端口要和实例配置里 rpcPort 一致(默认 17322,多实例各自不同)
51
+ // 不确定时看 config/browser.json,或用 mooncat-browser list 查
38
52
  const browser = new BrowserClient({ baseUrl: "http://127.0.0.1:17322" });
39
53
 
40
- // 探测 browserd 是否就绪
41
54
  const h = await browser.health();
42
55
  if (!h?.browserOpen) await browser.open({ headless: false });
43
56
 
44
- // 打开页面 (newTab 返回 TabInfo, operate 传 tab.pageHandle)
45
57
  const tab = await browser.newTab({ url: "https://example.com" });
46
58
 
47
- // 所有页面动作走 operate (action 清单见包内 references/operate-actions 或 README)
59
+ // 所有页面动作走 operate (action 清单见 references/operate-actions)
48
60
  const snap = await browser.operate({ pageHandle: tab.pageHandle, action: "snapshot" });
49
61
  await browser.operate({ pageHandle: tab.pageHandle, action: "click", params: { selector: "#login" } });
50
62
  ```
51
63
 
52
- > 服务必须先启动:`mooncat-browser start --port 17322`(另一个终端,常驻)。
53
- > 没启动时 `health()` 返回 null,`operate` 会连接拒绝报错。CLI 一键开页验证:
54
- > `mooncat-browser open --url https://example.com`。
64
+ > 服务必须先启动:`mooncat-browser start <name>`(另一个终端,常驻)。
65
+ > 没启动时 `health()` 返回 null,`operate` 会连接拒绝报错。
66
+ > 多实例:每个实例独立 profile/端口/state,`mooncat-browser list` 查所有实例状态,
67
+ > `mooncat-browser stop <name>` / `status <name>` 按实例名管理。
55
68
 
56
- **操作清单不在本 skill 列**——`operate` 的 40+ 个 action(导航/交互/读取/等待/存储/截图)
57
- 是公开契约,查包内 `README.md` 的 "operate 的 action 清单" 或
58
- `browser-op/backend/browserd.cjs` 的 `rpcOperate`(始终权威)。
69
+ **操作清单不在本 skill 列**——`operate` 的 40+ 个 action(导航/交互/读取/等待/存储/截图)
70
+ 是公开契约,查包内 `README.md` 的 "operate 的 action 清单" 或
71
+ `browser-op/backend/browserd.cjs` 的 `rpcOperate`(始终权威)。
59
72
 
60
73
  ## 步进式 co-work 的标准节奏
61
74
 
@@ -17,9 +17,11 @@
17
17
  import { BrowserClient } from "@mooncat/browser";
18
18
 
19
19
  const SITE = "example.com";
20
+ // 端口要和实例配置 rpcPort 一致(默认 17322,多实例各自不同)
20
21
  const browser = new BrowserClient({ baseUrl: "http://127.0.0.1:17322" });
21
22
 
22
23
  // 1. 复用已有 tab (不要盲目 newTab)
24
+ // 高危平台:open({ routeMode: "extension" }),见 high-risk.md
23
25
  await browser.open({ headless: false });
24
26
  const tabs = await browser.listTabs();
25
27
  let tab = tabs.find((t) => t.url?.includes(SITE));