bb-browser 0.11.0 → 0.11.2

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/dist/daemon.js CHANGED
@@ -3,7 +3,7 @@ import {
3
3
  COMMAND_TIMEOUT,
4
4
  DAEMON_HOST,
5
5
  DAEMON_PORT
6
- } from "./chunk-5WGFUZLM.js";
6
+ } from "./chunk-H2VEQBAU.js";
7
7
  import "./chunk-D4HDZEJT.js";
8
8
 
9
9
  // packages/daemon/src/index.ts
@@ -35,16 +35,13 @@ function loadBuildDomTreeScript() {
35
35
  if (cachedBuildDomTreeScript) return cachedBuildDomTreeScript;
36
36
  const currentDir = path.dirname(fileURLToPath(import.meta.url));
37
37
  const candidates = [
38
- path.resolve(currentDir, "./extension/buildDomTree.js"),
39
- path.resolve(currentDir, "../extension/buildDomTree.js"),
40
- path.resolve(currentDir, "../extension/dist/buildDomTree.js"),
41
- path.resolve(currentDir, "../packages/extension/public/buildDomTree.js"),
42
- path.resolve(currentDir, "../packages/extension/dist/buildDomTree.js"),
43
- path.resolve(currentDir, "../../../extension/buildDomTree.js"),
44
- path.resolve(currentDir, "../../../extension/dist/buildDomTree.js"),
45
- path.resolve(currentDir, "../../extension/buildDomTree.js"),
46
- path.resolve(currentDir, "../../../packages/extension/dist/buildDomTree.js"),
47
- path.resolve(currentDir, "../../../packages/extension/public/buildDomTree.js")
38
+ // Built dist: dist/daemon.js → ../packages/shared/buildDomTree.js
39
+ path.resolve(currentDir, "../packages/shared/buildDomTree.js"),
40
+ // Dev mode: packages/daemon/src/ → ../../shared/buildDomTree.js
41
+ path.resolve(currentDir, "../../shared/buildDomTree.js"),
42
+ // npm installed: dist/daemon.js → same level
43
+ path.resolve(currentDir, "./buildDomTree.js"),
44
+ path.resolve(currentDir, "../buildDomTree.js")
48
45
  ];
49
46
  for (const candidate of candidates) {
50
47
  try {
@@ -1021,11 +1018,15 @@ var HttpServer = class {
1021
1018
  (_, reject) => setTimeout(() => reject(new Error("CDP connection timeout")), COMMAND_TIMEOUT)
1022
1019
  )
1023
1020
  ]);
1024
- } catch (error) {
1021
+ } catch {
1022
+ const cdpTarget = `${this.cdp.host}:${this.cdp.port}`;
1023
+ const reason = this.cdp.lastError || "unknown";
1025
1024
  this.sendJson(res, 503, {
1026
1025
  id: request.id,
1027
1026
  success: false,
1028
- error: error instanceof Error ? error.message : "CDP not ready"
1027
+ error: `Chrome not connected (CDP at ${cdpTarget})`,
1028
+ reason,
1029
+ hint: "Make sure Chrome is running. Try: bb-browser daemon shutdown && bb-browser tab list"
1029
1030
  });
1030
1031
  return;
1031
1032
  }
@@ -1151,6 +1152,8 @@ var CdpConnection = class {
1151
1152
  currentTargetId;
1152
1153
  connectionPromise = null;
1153
1154
  _connected = false;
1155
+ /** Last connection error (for diagnostics in 503 responses). */
1156
+ lastError = null;
1154
1157
  /** Resolvers for commands queued before CDP is ready. */
1155
1158
  readyWaiters = [];
1156
1159
  constructor(host, port, tabManager) {
@@ -1174,6 +1177,15 @@ var CdpConnection = class {
1174
1177
  this.connectionPromise = this.doConnect();
1175
1178
  try {
1176
1179
  await this.connectionPromise;
1180
+ this.lastError = null;
1181
+ } catch (err) {
1182
+ this.lastError = err instanceof Error ? err.message : String(err);
1183
+ const connErr = new Error(this.lastError);
1184
+ for (const waiter of this.readyWaiters) {
1185
+ waiter.reject(connErr);
1186
+ }
1187
+ this.readyWaiters = [];
1188
+ throw err;
1177
1189
  } finally {
1178
1190
  this.connectionPromise = null;
1179
1191
  }
@@ -1205,6 +1217,7 @@ var CdpConnection = class {
1205
1217
  /** Wait until CDP connection is established (for two-phase startup). */
1206
1218
  waitUntilReady() {
1207
1219
  if (this._connected) return Promise.resolve();
1220
+ if (this.lastError) return Promise.reject(new Error(this.lastError));
1208
1221
  return new Promise((resolve, reject) => {
1209
1222
  this.readyWaiters.push({ resolve, reject });
1210
1223
  });
@@ -1311,10 +1324,16 @@ var CdpConnection = class {
1311
1324
  ws.on("close", () => {
1312
1325
  this._connected = false;
1313
1326
  this.socket = null;
1327
+ this.lastError = "CDP WebSocket closed unexpectedly";
1314
1328
  for (const p of this.pending.values()) {
1315
1329
  p.reject(new Error("CDP connection closed"));
1316
1330
  }
1317
1331
  this.pending.clear();
1332
+ const closeErr = new Error(this.lastError);
1333
+ for (const waiter of this.readyWaiters) {
1334
+ waiter.reject(closeErr);
1335
+ }
1336
+ this.readyWaiters = [];
1318
1337
  });
1319
1338
  ws.on("error", () => {
1320
1339
  });
@@ -1822,9 +1841,8 @@ var TabStateManager = class {
1822
1841
  };
1823
1842
 
1824
1843
  // packages/daemon/src/index.ts
1825
- var PID_FILE_PATH = "/tmp/bb-browser.pid";
1826
- var DAEMON_DIR = path2.join(os.homedir(), ".bb-browser");
1827
- var TOKEN_FILE = path2.join(DAEMON_DIR, "daemon.token");
1844
+ var DAEMON_DIR = process.env.BB_BROWSER_HOME || path2.join(os.homedir(), ".bb-browser");
1845
+ var DAEMON_JSON = path2.join(DAEMON_DIR, "daemon.json");
1828
1846
  var DEFAULT_CDP_PORT = 19825;
1829
1847
  function parseOptions() {
1830
1848
  const { values } = parseArgs({
@@ -1893,28 +1911,17 @@ Endpoints:
1893
1911
  token
1894
1912
  };
1895
1913
  }
1896
- function writePidFile() {
1897
- writeFileSync(PID_FILE_PATH, String(process.pid), "utf-8");
1898
- }
1899
- function cleanupPidFile() {
1900
- if (existsSync(PID_FILE_PATH)) {
1901
- try {
1902
- unlinkSync(PID_FILE_PATH);
1903
- } catch {
1904
- }
1905
- }
1906
- }
1907
- function writeTokenFile(token) {
1914
+ function writeDaemonJson(info) {
1908
1915
  try {
1909
1916
  mkdirSync(DAEMON_DIR, { recursive: true });
1910
- writeFileSync(TOKEN_FILE, token, { mode: 384 });
1917
+ writeFileSync(DAEMON_JSON, JSON.stringify(info), { mode: 384 });
1911
1918
  } catch {
1912
1919
  }
1913
1920
  }
1914
- function cleanupTokenFile() {
1915
- if (existsSync(TOKEN_FILE)) {
1921
+ function cleanupDaemonJson() {
1922
+ if (existsSync(DAEMON_JSON)) {
1916
1923
  try {
1917
- unlinkSync(TOKEN_FILE);
1924
+ unlinkSync(DAEMON_JSON);
1918
1925
  } catch {
1919
1926
  }
1920
1927
  }
@@ -1935,7 +1942,7 @@ async function discoverCdpPort(host, port) {
1935
1942
  }
1936
1943
  } catch {
1937
1944
  }
1938
- const managedPortFile = path2.join(os.homedir(), ".bb-browser", "browser", "cdp-port");
1945
+ const managedPortFile = path2.join(DAEMON_DIR, "browser", "cdp-port");
1939
1946
  try {
1940
1947
  const rawPort = readFileSync2(managedPortFile, "utf8").trim();
1941
1948
  const managedPort = parseInt(rawPort, 10);
@@ -1982,8 +1989,7 @@ async function main() {
1982
1989
  console.error("[Daemon] Shutting down...");
1983
1990
  cdp.disconnect();
1984
1991
  await httpServer.stop();
1985
- cleanupPidFile();
1986
- cleanupTokenFile();
1992
+ cleanupDaemonJson();
1987
1993
  process.exit(0);
1988
1994
  };
1989
1995
  const httpServer = new HttpServer({
@@ -1996,8 +2002,12 @@ async function main() {
1996
2002
  process.on("SIGINT", shutdown);
1997
2003
  process.on("SIGTERM", shutdown);
1998
2004
  await httpServer.start();
1999
- writePidFile();
2000
- writeTokenFile(options.token);
2005
+ writeDaemonJson({
2006
+ pid: process.pid,
2007
+ host: options.host,
2008
+ port: options.port,
2009
+ token: options.token
2010
+ });
2001
2011
  console.error(
2002
2012
  `[Daemon] HTTP server listening on http://${options.host}:${options.port}`
2003
2013
  );
@@ -2020,8 +2030,7 @@ async function main() {
2020
2030
  }
2021
2031
  main().catch((error) => {
2022
2032
  console.error("[Daemon] Fatal error:", error);
2023
- cleanupPidFile();
2024
- cleanupTokenFile();
2033
+ cleanupDaemonJson();
2025
2034
  process.exit(1);
2026
2035
  });
2027
2036
  //# sourceMappingURL=daemon.js.map