arise-browser 0.1.2 → 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.
@@ -1,31 +1,26 @@
1
1
  /**
2
- * VirtualDisplayManager — manages Xvfb, PulseAudio, Openbox, Chrome, and Neko
3
- * as child processes for Linux cloud server deployment.
2
+ * VirtualDisplayManager — manages a Docker container running Neko
3
+ * (Xvfb + PulseAudio + Openbox + Chrome + Neko WebRTC) for cloud server deployment.
4
4
  *
5
- * arise-browser is the single entry process; no supervisord needed.
5
+ * arise-browser controls the container via `docker` CLI and connects to Chrome via CDP.
6
6
  */
7
7
  export interface VirtualDisplayConfig {
8
- /** X11 display number (default ":99") */
9
- display: string;
10
- /** Screen resolution+depth (default "1920x1080x24") */
11
- screen: string;
12
- /** Neko HTTP/WS port (default 6090) */
8
+ /** Neko HTTP/WS port on host (default 6090) */
13
9
  nekoPort: number;
14
10
  /** Neko user password (default "neko") */
15
11
  nekoPassword: string;
16
12
  /** Neko admin password (default "admin") */
17
13
  nekoAdminPassword: string;
18
- /** Chrome remote debugging port (default 9222) */
14
+ /** Chrome CDP port on host (default 9222) */
19
15
  chromeDebugPort: number;
20
- /** Path to Chrome binary (auto-detected if omitted) */
21
- chromePath: string;
16
+ /** Screen resolution (default "1920x1080@30") */
17
+ screen: string;
18
+ /** Docker container name (default "arise-neko") */
19
+ containerName: string;
20
+ /** Docker image name (default "arise-neko") */
21
+ imageName: string;
22
22
  }
23
23
  export declare class VirtualDisplayManager {
24
- private _xvfb;
25
- private _pulseaudio;
26
- private _openbox;
27
- private _chrome;
28
- private _neko;
29
24
  private _started;
30
25
  private readonly _config;
31
26
  constructor(config?: Partial<VirtualDisplayConfig>);
@@ -1 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/virtual-display/manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAwBH,MAAM,WAAW,oBAAoB;IACnC,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kDAAkD;IAClD,eAAe,EAAE,MAAM,CAAC;IACxB,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;CACpB;AAmCD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,KAAK,CAA8B;IAC3C,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,KAAK,CAA8B;IAC3C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;gBAEnC,MAAM,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC;IAOlD,IAAI,MAAM,IAAI,oBAAoB,CAEjC;IAED,SAAS,IAAI,OAAO;IAId,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAoItB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAiC5B"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../../src/virtual-display/manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAwBH,MAAM,WAAW,oBAAoB;IACnC,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,0CAA0C;IAC1C,YAAY,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,iBAAiB,EAAE,MAAM,CAAC;IAC1B,6CAA6C;IAC7C,eAAe,EAAE,MAAM,CAAC;IACxB,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,mDAAmD;IACnD,aAAa,EAAE,MAAM,CAAC;IACtB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;CACnB;AAiDD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;gBAEnC,MAAM,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC;IAIlD,IAAI,MAAM,IAAI,oBAAoB,CAEjC;IAED,SAAS,IAAI,OAAO;IAId,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAkGtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAqB5B"}
@@ -1,18 +1,18 @@
1
1
  /**
2
- * VirtualDisplayManager — manages Xvfb, PulseAudio, Openbox, Chrome, and Neko
3
- * as child processes for Linux cloud server deployment.
2
+ * VirtualDisplayManager — manages a Docker container running Neko
3
+ * (Xvfb + PulseAudio + Openbox + Chrome + Neko WebRTC) for cloud server deployment.
4
4
  *
5
- * arise-browser is the single entry process; no supervisord needed.
5
+ * arise-browser controls the container via `docker` CLI and connects to Chrome via CDP.
6
6
  */
7
- import { existsSync } from "node:fs";
7
+ import { execFile } from "node:child_process";
8
8
  import { resolve, dirname, join } from "node:path";
9
+ import { existsSync } from "node:fs";
9
10
  import { fileURLToPath } from "node:url";
10
11
  import { createLogger } from "../logger.js";
11
- import { ProcessRunner } from "./process-runner.js";
12
12
  const __dirname = dirname(fileURLToPath(import.meta.url));
13
+ const log = createLogger("virtual-display");
13
14
  /**
14
15
  * Find the package root by walking up from __dirname to find package.json.
15
- * Works both in src/ (dev) and dist/ (compiled).
16
16
  */
17
17
  function findPackageRoot() {
18
18
  let dir = __dirname;
@@ -21,49 +21,52 @@ function findPackageRoot() {
21
21
  return dir;
22
22
  dir = dirname(dir);
23
23
  }
24
- // Fallback: assume 2 levels up from src/virtual-display or dist/src/virtual-display
25
24
  return resolve(__dirname, "../..");
26
25
  }
27
26
  const DEFAULT_CONFIG = {
28
- display: ":99",
29
- screen: "1920x1080x24",
30
27
  nekoPort: 6090,
31
28
  nekoPassword: "neko",
32
29
  nekoAdminPassword: "admin",
33
30
  chromeDebugPort: 9222,
34
- chromePath: "",
31
+ screen: "1920x1080@30",
32
+ containerName: "arise-neko",
33
+ imageName: "arise-neko",
35
34
  };
36
- const CHROME_CANDIDATES = [
37
- "/usr/bin/google-chrome-stable",
38
- "/usr/bin/google-chrome",
39
- "/usr/bin/chromium-browser",
40
- "/usr/bin/chromium",
41
- ];
42
- function findChrome() {
43
- for (const candidate of CHROME_CANDIDATES) {
44
- if (existsSync(candidate))
45
- return candidate;
46
- }
47
- throw new Error(`Chrome not found. Tried: ${CHROME_CANDIDATES.join(", ")}. Install Chrome or set chromePath.`);
35
+ /** Run a command and return stdout. Rejects on non-zero exit. */
36
+ function exec(cmd, args, timeoutMs = 30_000) {
37
+ return new Promise((resolve, reject) => {
38
+ execFile(cmd, args, { timeout: timeoutMs }, (err, stdout, stderr) => {
39
+ if (err) {
40
+ const msg = stderr?.trim() || stdout?.trim() || err.message;
41
+ reject(new Error(`${cmd} ${args[0]}: ${msg}`));
42
+ }
43
+ else {
44
+ resolve(stdout.trim());
45
+ }
46
+ });
47
+ });
48
48
  }
49
- /** Resolve path to deploy/neko/ config files */
50
- function deployPath(filename) {
51
- return resolve(findPackageRoot(), "deploy/neko", filename);
49
+ /** Poll a URL until it returns 2xx or timeout. */
50
+ async function waitForHttp(url, timeoutMs, intervalMs = 500) {
51
+ const deadline = Date.now() + timeoutMs;
52
+ while (Date.now() < deadline) {
53
+ try {
54
+ const res = await fetch(url);
55
+ if (res.ok)
56
+ return;
57
+ }
58
+ catch {
59
+ // not ready yet
60
+ }
61
+ await new Promise((r) => setTimeout(r, intervalMs));
62
+ }
63
+ throw new Error(`Timed out waiting for ${url} (${timeoutMs}ms)`);
52
64
  }
53
- const log = createLogger("virtual-display");
54
65
  export class VirtualDisplayManager {
55
- _xvfb = null;
56
- _pulseaudio = null;
57
- _openbox = null;
58
- _chrome = null;
59
- _neko = null;
60
66
  _started = false;
61
67
  _config;
62
68
  constructor(config) {
63
69
  this._config = { ...DEFAULT_CONFIG, ...config };
64
- if (!this._config.chromePath) {
65
- this._config.chromePath = findChrome();
66
- }
67
70
  }
68
71
  get config() {
69
72
  return { ...this._config };
@@ -74,151 +77,100 @@ export class VirtualDisplayManager {
74
77
  async start() {
75
78
  if (this._started)
76
79
  return;
77
- const { display, screen, nekoPort, nekoPassword, nekoAdminPassword, chromeDebugPort, chromePath } = this._config;
78
- // Extract display number: ":99" → "99", ":99.0" → "99"
79
- const displayNum = display.replace(/^:/, "").split(".")[0];
80
- const displayEnv = { DISPLAY: display };
81
- log.info(`Starting virtual display environment (display=${display}, chrome=${chromePath}, neko=:${nekoPort})`);
80
+ const { nekoPort, nekoPassword, nekoAdminPassword, chromeDebugPort, screen, containerName, imageName, } = this._config;
81
+ log.info(`Starting Docker container "${containerName}" (neko=:${nekoPort}, cdp=:${chromeDebugPort})`);
82
+ // Ensure no stale container exists
83
+ try {
84
+ await exec("docker", ["rm", "-f", containerName]);
85
+ }
86
+ catch {
87
+ // container didn't exist, fine
88
+ }
89
+ // Build image if not present
90
+ const deployDir = resolve(findPackageRoot(), "deploy/neko");
82
91
  try {
83
- // 1. Xvfb — does NOT support -config (that's Xorg, not Xvfb)
84
- // Xvfb has a built-in dummy driver, no xorg.conf needed
85
- const xvfbArgs = [display, "-screen", "0", screen, "-nolisten", "tcp"];
86
- this._xvfb = new ProcessRunner({
87
- name: "xvfb",
88
- command: "/usr/bin/Xvfb",
89
- args: xvfbArgs,
90
- readiness: {
91
- type: "file",
92
- target: `/tmp/.X11-unix/X${displayNum}`,
93
- timeoutMs: 10_000,
94
- },
95
- });
96
- await this._xvfb.start();
97
- // 2. PulseAudio
98
- const pulseConf = deployPath("pulseaudio.pa");
99
- this._pulseaudio = new ProcessRunner({
100
- name: "pulseaudio",
101
- command: "/usr/bin/pulseaudio",
102
- args: [
103
- "--disallow-exit",
104
- "--disallow-module-loading",
105
- "-n",
106
- "-F",
107
- pulseConf,
108
- "--exit-idle-time=-1",
109
- ],
110
- readiness: {
111
- type: "file",
112
- target: "/tmp/pulseaudio.socket",
113
- timeoutMs: 10_000,
114
- },
115
- });
116
- await this._pulseaudio.start();
117
- // 3. Openbox
118
- const openboxConf = deployPath("openbox.xml");
119
- this._openbox = new ProcessRunner({
120
- name: "openbox",
121
- command: "/usr/bin/openbox",
122
- args: existsSync(openboxConf)
123
- ? ["--config-file", openboxConf]
124
- : [],
125
- env: displayEnv,
126
- });
127
- await this._openbox.start();
128
- // Small delay for window manager to initialize
129
- await new Promise((r) => setTimeout(r, 500));
130
- // 4. Chrome
131
- this._chrome = new ProcessRunner({
132
- name: "chrome",
133
- command: chromePath,
134
- args: [
135
- `--remote-debugging-port=${chromeDebugPort}`,
136
- `--display=${display}`,
137
- "--window-position=0,0",
138
- "--no-first-run",
139
- "--start-maximized",
140
- "--bwsi",
141
- "--force-dark-mode",
142
- "--disable-file-system",
143
- "--disable-gpu",
144
- "--disable-software-rasterizer",
145
- "--disable-dev-shm-usage",
146
- "--no-sandbox",
147
- "--disable-setuid-sandbox",
148
- ],
149
- env: {
150
- ...displayEnv,
151
- PULSE_SERVER: "unix:/tmp/pulseaudio.socket",
152
- },
153
- readiness: {
154
- type: "http",
155
- target: `http://localhost:${chromeDebugPort}/json/version`,
156
- timeoutMs: 15_000,
157
- },
158
- });
159
- await this._chrome.start();
160
- // 5. Neko Server
161
- this._neko = new ProcessRunner({
162
- name: "neko",
163
- command: "/usr/local/bin/neko",
164
- args: ["serve", "--bind", `0.0.0.0:${nekoPort}`],
165
- env: {
166
- ...displayEnv,
167
- PULSE_SERVER: "unix:/tmp/pulseaudio.socket",
168
- // Convert Xvfb format "1920x1080x24" → Neko format "1920x1080@30"
169
- NEKO_DESKTOP_SCREEN: screen.replace(/x\d+$/, "@30"),
170
- NEKO_MEMBER_PROVIDER: "multiuser",
171
- NEKO_MEMBER_MULTIUSER_ADMIN_PASSWORD: nekoAdminPassword,
172
- NEKO_MEMBER_MULTIUSER_USER_PASSWORD: nekoPassword,
173
- NEKO_SESSION_IMPLICIT_HOSTING: "true",
174
- NEKO_SESSION_MERCIFUL_RECONNECT: "true",
175
- },
176
- readiness: {
177
- type: "http",
178
- target: `http://localhost:${nekoPort}/health`,
179
- timeoutMs: 15_000,
180
- intervalMs: 500,
181
- },
182
- });
183
- await this._neko.start();
92
+ await exec("docker", ["image", "inspect", imageName]);
93
+ log.info(`Docker image "${imageName}" found`);
94
+ }
95
+ catch {
96
+ log.info(`Building Docker image "${imageName}" from ${deployDir}...`);
97
+ await exec("docker", ["build", "-t", imageName, deployDir], 120_000);
98
+ log.info(`Docker image "${imageName}" built`);
99
+ }
100
+ // docker run
101
+ const runArgs = [
102
+ "run",
103
+ "-d",
104
+ "--name",
105
+ containerName,
106
+ "--shm-size=2gb",
107
+ // Port mappings
108
+ "-p",
109
+ `${nekoPort}:8080`,
110
+ "-p",
111
+ `127.0.0.1:${chromeDebugPort}:9223`,
112
+ "-p",
113
+ "52000-52100:52000-52100/udp",
114
+ // Persistent Chrome profile via named volume
115
+ "-v",
116
+ `${containerName}-profile:/home/neko/.config/arise-chrome`,
117
+ // Neko environment
118
+ "-e",
119
+ `NEKO_DESKTOP_SCREEN=${screen}`,
120
+ "-e",
121
+ `NEKO_MEMBER_MULTIUSER_USER_PASSWORD=${nekoPassword}`,
122
+ "-e",
123
+ `NEKO_MEMBER_MULTIUSER_ADMIN_PASSWORD=${nekoAdminPassword}`,
124
+ "-e",
125
+ "NEKO_WEBRTC_EPR=52000-52100",
126
+ "-e",
127
+ "NEKO_WEBRTC_ICELITE=1",
128
+ "-e",
129
+ "NEKO_SESSION_IMPLICIT_HOSTING=true",
130
+ imageName,
131
+ ];
132
+ try {
133
+ const containerId = await exec("docker", runArgs, 30_000);
134
+ log.info(`Container started: ${containerId.slice(0, 12)}`);
135
+ // Wait for Neko health
136
+ log.info("Waiting for Neko health...");
137
+ await waitForHttp(`http://localhost:${nekoPort}/health`, 30_000);
138
+ log.info("Neko is healthy");
139
+ // Wait for Chrome CDP
140
+ log.info("Waiting for Chrome CDP...");
141
+ await waitForHttp(`http://localhost:${chromeDebugPort}/json/version`, 30_000);
142
+ log.info("Chrome CDP is ready");
184
143
  this._started = true;
185
144
  log.info("Virtual display environment started successfully");
186
145
  }
187
146
  catch (err) {
188
- // Clean up any processes that started before the failure
189
- log.error({ err }, "Failed to start virtual display environment, cleaning up");
190
- this._started = true; // Allow stop() to run
191
- await this.stop();
147
+ log.error({ err }, "Failed to start virtual display, cleaning up");
148
+ try {
149
+ await exec("docker", ["rm", "-f", containerName]);
150
+ }
151
+ catch {
152
+ // best effort
153
+ }
192
154
  throw err;
193
155
  }
194
156
  }
195
157
  async stop() {
196
158
  if (!this._started)
197
159
  return;
198
- log.info("Stopping virtual display environment...");
199
- // Stop in reverse order
200
- const processes = [
201
- this._neko,
202
- this._chrome,
203
- this._openbox,
204
- this._pulseaudio,
205
- this._xvfb,
206
- ];
207
- for (const proc of processes) {
208
- if (proc) {
209
- try {
210
- await proc.stop();
211
- }
212
- catch (err) {
213
- log.error({ err }, "Error stopping process");
214
- }
215
- }
160
+ const { containerName } = this._config;
161
+ log.info(`Stopping container "${containerName}"...`);
162
+ try {
163
+ await exec("docker", ["stop", "-t", "10", containerName], 20_000);
164
+ }
165
+ catch (err) {
166
+ log.error({ err }, "Error stopping container");
167
+ }
168
+ try {
169
+ await exec("docker", ["rm", "-f", containerName]);
170
+ }
171
+ catch (err) {
172
+ log.error({ err }, "Error removing container");
216
173
  }
217
- this._neko = null;
218
- this._chrome = null;
219
- this._openbox = null;
220
- this._pulseaudio = null;
221
- this._xvfb = null;
222
174
  this._started = false;
223
175
  log.info("Virtual display environment stopped");
224
176
  }
@@ -1 +1 @@
1
- {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/virtual-display/manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/virtual-display/manager.ts"],"names":[],"mappings":"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"}