@oharness/engine 0.7.1 → 0.8.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.
Files changed (72) hide show
  1. package/dist/agent/agent.d.ts +1 -0
  2. package/dist/agent/agent.js +5 -0
  3. package/dist/agent/agent.js.map +1 -1
  4. package/dist/agent/permissions.js +8 -0
  5. package/dist/agent/permissions.js.map +1 -1
  6. package/dist/browser/cdp.d.ts +75 -0
  7. package/dist/browser/cdp.js +136 -0
  8. package/dist/browser/cdp.js.map +1 -0
  9. package/dist/browser/chrome.d.ts +19 -0
  10. package/dist/browser/chrome.js +306 -0
  11. package/dist/browser/chrome.js.map +1 -0
  12. package/dist/browser/extension.d.ts +35 -0
  13. package/dist/browser/extension.js +297 -0
  14. package/dist/browser/extension.js.map +1 -0
  15. package/dist/browser/host-manifest.d.ts +78 -0
  16. package/dist/browser/host-manifest.js +166 -0
  17. package/dist/browser/host-manifest.js.map +1 -0
  18. package/dist/browser/host.d.ts +27 -0
  19. package/dist/browser/host.js +311 -0
  20. package/dist/browser/host.js.map +1 -0
  21. package/dist/browser/index.d.ts +26 -0
  22. package/dist/browser/index.js +15 -0
  23. package/dist/browser/index.js.map +1 -0
  24. package/dist/browser/login-import.d.ts +98 -0
  25. package/dist/browser/login-import.js +244 -0
  26. package/dist/browser/login-import.js.map +1 -0
  27. package/dist/browser/plugin.d.ts +109 -0
  28. package/dist/browser/plugin.js +22 -0
  29. package/dist/browser/plugin.js.map +1 -0
  30. package/dist/browser/presence.d.ts +29 -0
  31. package/dist/browser/presence.js +54 -0
  32. package/dist/browser/presence.js.map +1 -0
  33. package/dist/browser/provider.d.ts +17 -0
  34. package/dist/browser/provider.js +13 -0
  35. package/dist/browser/provider.js.map +1 -0
  36. package/dist/browser/screencast.d.ts +42 -0
  37. package/dist/browser/screencast.js +99 -0
  38. package/dist/browser/screencast.js.map +1 -0
  39. package/dist/browser/session.d.ts +320 -0
  40. package/dist/browser/session.js +837 -0
  41. package/dist/browser/session.js.map +1 -0
  42. package/dist/browser/snapshot.d.ts +49 -0
  43. package/dist/browser/snapshot.js +145 -0
  44. package/dist/browser/snapshot.js.map +1 -0
  45. package/dist/browser/socket.d.ts +15 -0
  46. package/dist/browser/socket.js +32 -0
  47. package/dist/browser/socket.js.map +1 -0
  48. package/dist/browser/target.d.ts +112 -0
  49. package/dist/browser/target.js +20 -0
  50. package/dist/browser/target.js.map +1 -0
  51. package/dist/browser/tools.d.ts +3 -0
  52. package/dist/browser/tools.js +537 -0
  53. package/dist/browser/tools.js.map +1 -0
  54. package/dist/config.d.ts +14 -0
  55. package/dist/config.js.map +1 -1
  56. package/dist/core/errors.d.ts +12 -0
  57. package/dist/core/errors.js +14 -1
  58. package/dist/core/errors.js.map +1 -1
  59. package/dist/harness.d.ts +49 -0
  60. package/dist/harness.js +97 -1
  61. package/dist/harness.js.map +1 -1
  62. package/dist/index.d.ts +1 -0
  63. package/dist/index.js +1 -0
  64. package/dist/index.js.map +1 -1
  65. package/dist/providers/piai.js +7 -2
  66. package/dist/providers/piai.js.map +1 -1
  67. package/dist/tools/define.d.ts +1 -0
  68. package/dist/tools/define.js +3 -0
  69. package/dist/tools/define.js.map +1 -1
  70. package/dist/tools/types.d.ts +11 -0
  71. package/dist/tools/types.js.map +1 -1
  72. package/package.json +2 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.js","sourceRoot":"","sources":["../../src/browser/extension.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Registering the native messaging host.
3
+ *
4
+ * Chrome will only start a host it has a manifest for, and will only let the
5
+ * named extensions talk to it. The manifest is a small JSON file in a
6
+ * per-browser directory — except on Windows, where a registry value points at
7
+ * the file.
8
+ *
9
+ * What the manifest names is a launcher this writes, never the host script
10
+ * itself. Chrome starts hosts with almost no environment: from the Dock on a
11
+ * Mac, `PATH` has no Homebrew in it, so a script beginning `#!/usr/bin/env node`
12
+ * fails with nothing but "native host has exited". Nor can a script inside a
13
+ * packaged app's archive be run at all. The launcher names the runtime by its
14
+ * absolute path — the Node running the install, or the desktop app's own
15
+ * executable told to behave as Node — and is the one file here that has to be
16
+ * executable.
17
+ */
18
+ export declare const HOST_NAME = "ai.oharness.browser";
19
+ /**
20
+ * The extension's id, pinned by the `key` in its manifest.
21
+ *
22
+ * Without a key an unpacked extension's id is derived from the directory it
23
+ * was loaded from, so it differs per machine and every install needed the
24
+ * person to copy it across by hand. The key makes it the same everywhere, so
25
+ * registering needs no argument and the desktop app can do it unasked.
26
+ */
27
+ export declare const EXTENSION_ID = "ccflolhofpnacaokjapodnphjjgiddmi";
28
+ /**
29
+ * Where somebody gets the extension, for the settings page to send them.
30
+ *
31
+ * PLACEHOLDER until the store listing exists. When it does, this becomes the
32
+ * listing's URL and EXTENSION_ID above becomes the listing's id.
33
+ */
34
+ export declare const EXTENSION_INSTALL_URL = "https://oharness.ai/extension";
35
+ interface BrowserSlot {
36
+ id: string;
37
+ label: string;
38
+ dir: string;
39
+ }
40
+ /** Every Chromium the manifest can be installed for, on this platform. */
41
+ export declare function nativeHostTargets(platform?: NodeJS.Platform, home?: string): BrowserSlot[];
42
+ /** Where each Chromium on Windows looks for a host, under HKEY_CURRENT_USER. */
43
+ export declare function windowsRegistryKeys(): string[];
44
+ export interface NativeHostManifest {
45
+ name: string;
46
+ description: string;
47
+ path: string;
48
+ type: "stdio";
49
+ allowed_origins: string[];
50
+ }
51
+ export declare function nativeHostManifest(executable: string, extensionIds: string[]): NativeHostManifest;
52
+ export interface InstallResult {
53
+ /** The launcher, then every manifest written. */
54
+ written: string[];
55
+ /** Set only when something could not be finished here, with what is left to run. */
56
+ manual?: string;
57
+ }
58
+ export interface InstallOptions {
59
+ /** An absolute path to Node, or to an Electron app that runs scripts as Node. */
60
+ runtime: string;
61
+ /** The host entry script the runtime is given. */
62
+ script: string;
63
+ /** The runtime is Electron: tell it to be Node rather than open a window. */
64
+ runAsNode?: boolean;
65
+ /** Extensions allowed to start the host. Defaults to the published one. */
66
+ extensionIds?: string[];
67
+ platform?: NodeJS.Platform;
68
+ home?: string;
69
+ /** Where the launcher and the Windows manifest go. Defaults to the user directory. */
70
+ dir?: string;
71
+ /** Restrict to these browser ids; default is every one this platform knows. */
72
+ browsers?: string[];
73
+ /** Writes one registry default value. Replaceable so tests never touch a registry. */
74
+ setRegistry?: (key: string, value: string) => Promise<void>;
75
+ }
76
+ export declare function hostLauncher(opts: Pick<InstallOptions, "runtime" | "script" | "runAsNode">, platform: NodeJS.Platform): string;
77
+ export declare function installNativeHost(opts: InstallOptions): Promise<InstallResult>;
78
+ export {};
@@ -0,0 +1,166 @@
1
+ import { execFile } from "node:child_process";
2
+ import { chmod, mkdir, writeFile } from "node:fs/promises";
3
+ import { homedir } from "node:os";
4
+ import path from "node:path";
5
+ import { BrowserError } from "../core/errors.js";
6
+ import { userDir } from "../paths.js";
7
+ /**
8
+ * Registering the native messaging host.
9
+ *
10
+ * Chrome will only start a host it has a manifest for, and will only let the
11
+ * named extensions talk to it. The manifest is a small JSON file in a
12
+ * per-browser directory — except on Windows, where a registry value points at
13
+ * the file.
14
+ *
15
+ * What the manifest names is a launcher this writes, never the host script
16
+ * itself. Chrome starts hosts with almost no environment: from the Dock on a
17
+ * Mac, `PATH` has no Homebrew in it, so a script beginning `#!/usr/bin/env node`
18
+ * fails with nothing but "native host has exited". Nor can a script inside a
19
+ * packaged app's archive be run at all. The launcher names the runtime by its
20
+ * absolute path — the Node running the install, or the desktop app's own
21
+ * executable told to behave as Node — and is the one file here that has to be
22
+ * executable.
23
+ */
24
+ export const HOST_NAME = "ai.oharness.browser";
25
+ /**
26
+ * The extension's id, pinned by the `key` in its manifest.
27
+ *
28
+ * Without a key an unpacked extension's id is derived from the directory it
29
+ * was loaded from, so it differs per machine and every install needed the
30
+ * person to copy it across by hand. The key makes it the same everywhere, so
31
+ * registering needs no argument and the desktop app can do it unasked.
32
+ */
33
+ export const EXTENSION_ID = "ccflolhofpnacaokjapodnphjjgiddmi";
34
+ /**
35
+ * Where somebody gets the extension, for the settings page to send them.
36
+ *
37
+ * PLACEHOLDER until the store listing exists. When it does, this becomes the
38
+ * listing's URL and EXTENSION_ID above becomes the listing's id.
39
+ */
40
+ export const EXTENSION_INSTALL_URL = "https://oharness.ai/extension";
41
+ /** Every Chromium the manifest can be installed for, on this platform. */
42
+ export function nativeHostTargets(platform = process.platform, home = homedir()) {
43
+ if (platform === "darwin") {
44
+ const support = path.join(home, "Library", "Application Support");
45
+ return [
46
+ { id: "chrome", label: "Google Chrome", dir: path.join(support, "Google", "Chrome", "NativeMessagingHosts") },
47
+ { id: "chrome-beta", label: "Chrome Beta", dir: path.join(support, "Google", "Chrome Beta", "NativeMessagingHosts") },
48
+ { id: "chromium", label: "Chromium", dir: path.join(support, "Chromium", "NativeMessagingHosts") },
49
+ { id: "edge", label: "Microsoft Edge", dir: path.join(support, "Microsoft Edge", "NativeMessagingHosts") },
50
+ { id: "brave", label: "Brave", dir: path.join(support, "BraveSoftware", "Brave-Browser", "NativeMessagingHosts") },
51
+ ];
52
+ }
53
+ if (platform === "linux") {
54
+ const config = process.env["XDG_CONFIG_HOME"] || path.join(home, ".config");
55
+ return [
56
+ { id: "chrome", label: "Google Chrome", dir: path.join(config, "google-chrome", "NativeMessagingHosts") },
57
+ { id: "chromium", label: "Chromium", dir: path.join(config, "chromium", "NativeMessagingHosts") },
58
+ { id: "edge", label: "Microsoft Edge", dir: path.join(config, "microsoft-edge", "NativeMessagingHosts") },
59
+ { id: "brave", label: "Brave", dir: path.join(config, "BraveSoftware", "brave-browser", "NativeMessagingHosts") },
60
+ ];
61
+ }
62
+ // Windows reads a registry value rather than a directory; see windowsRegistryKeys.
63
+ return [];
64
+ }
65
+ /** Where each Chromium on Windows looks for a host, under HKEY_CURRENT_USER. */
66
+ export function windowsRegistryKeys() {
67
+ return [
68
+ "Google\\Chrome",
69
+ "Chromium",
70
+ "Microsoft\\Edge",
71
+ "BraveSoftware\\Brave-Browser",
72
+ ].map((vendor) => `HKCU\\Software\\${vendor}\\NativeMessagingHosts\\${HOST_NAME}`);
73
+ }
74
+ export function nativeHostManifest(executable, extensionIds) {
75
+ if (extensionIds.length === 0) {
76
+ throw new BrowserError("an extension id is required: Chrome will not let an unlisted extension start a host");
77
+ }
78
+ for (const id of extensionIds) {
79
+ // Chrome ids are 32 characters of a-p. A wrong one fails silently at
80
+ // connect time, which is a miserable thing to debug, so it is caught here.
81
+ if (!/^[a-p]{32}$/.test(id)) {
82
+ throw new BrowserError(`"${id}" is not a Chrome extension id (32 letters a-p, shown on chrome://extensions)`);
83
+ }
84
+ }
85
+ return {
86
+ name: HOST_NAME,
87
+ description: "OHarness browser bridge",
88
+ path: executable,
89
+ type: "stdio",
90
+ allowed_origins: extensionIds.map((id) => `chrome-extension://${id}/`),
91
+ };
92
+ }
93
+ /** A path inside single quotes, for sh. */
94
+ function shellQuote(value) {
95
+ return `'${value.replace(/'/g, "'\\''")}'`;
96
+ }
97
+ export function hostLauncher(opts, platform) {
98
+ if (platform === "win32") {
99
+ // Nothing may reach stdout but the protocol, so the batch file echoes nothing.
100
+ return [
101
+ "@echo off",
102
+ ...(opts.runAsNode ? ["set ELECTRON_RUN_AS_NODE=1"] : []),
103
+ `"${opts.runtime}" "${opts.script}" %*`,
104
+ "",
105
+ ].join("\r\n");
106
+ }
107
+ return [
108
+ "#!/bin/sh",
109
+ "# Written by OHarness. Chrome runs this to reach the harness; see host-manifest.ts.",
110
+ `${opts.runAsNode ? "ELECTRON_RUN_AS_NODE=1 " : ""}exec ${shellQuote(opts.runtime)} ${shellQuote(opts.script)} "$@"`,
111
+ "",
112
+ ].join("\n");
113
+ }
114
+ function regAdd(key, value) {
115
+ return new Promise((resolve, reject) => {
116
+ execFile("reg", ["add", key, "/ve", "/t", "REG_SZ", "/d", value, "/f"], { windowsHide: true }, (err) => err ? reject(err) : resolve());
117
+ });
118
+ }
119
+ export async function installNativeHost(opts) {
120
+ const platform = opts.platform ?? process.platform;
121
+ const dir = opts.dir ?? (opts.home ? path.join(opts.home, ".oharness") : userDir());
122
+ const manifestFor = (launcher) => `${JSON.stringify(nativeHostManifest(launcher, opts.extensionIds ?? [EXTENSION_ID]), null, 2)}\n`;
123
+ const launcher = path.join(dir, platform === "win32" ? "browser-host.bat" : "browser-host");
124
+ await mkdir(dir, { recursive: true });
125
+ await writeFile(launcher, hostLauncher(opts, platform), "utf8");
126
+ if (platform !== "win32")
127
+ await chmod(launcher, 0o755);
128
+ const body = manifestFor(launcher);
129
+ if (platform === "win32") {
130
+ const file = path.join(dir, `${HOST_NAME}.json`);
131
+ await writeFile(file, body, "utf8");
132
+ const setRegistry = opts.setRegistry ?? regAdd;
133
+ const failed = [];
134
+ for (const key of windowsRegistryKeys()) {
135
+ await setRegistry(key, file).catch(() => failed.push(key));
136
+ }
137
+ if (failed.length === windowsRegistryKeys().length) {
138
+ return {
139
+ written: [launcher, file],
140
+ manual: `The registry could not be written. Run:\n reg add "${failed[0]}" /ve /t REG_SZ /d "${file}" /f`,
141
+ };
142
+ }
143
+ return { written: [launcher, file] };
144
+ }
145
+ const slots = nativeHostTargets(platform, opts.home).filter((slot) => !opts.browsers || opts.browsers.includes(slot.id));
146
+ const written = [launcher];
147
+ for (const slot of slots) {
148
+ // Written for every browser this platform knows, whether or not it is
149
+ // installed: the directory is created either way, and a manifest for a
150
+ // browser somebody installs next week costs a few hundred bytes now.
151
+ const file = path.join(slot.dir, `${HOST_NAME}.json`);
152
+ try {
153
+ await mkdir(slot.dir, { recursive: true });
154
+ await writeFile(file, body, "utf8");
155
+ written.push(file);
156
+ }
157
+ catch {
158
+ /* a browser whose support directory cannot be written is simply skipped */
159
+ }
160
+ }
161
+ if (written.length === 1) {
162
+ throw new BrowserError("could not write the host manifest for any browser");
163
+ }
164
+ return { written };
165
+ }
166
+ //# sourceMappingURL=host-manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-manifest.js","sourceRoot":"","sources":["../../src/browser/host-manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export interface HostOptions {
2
+ /** Chrome's messages in. Required: the engine owns no process streams. */
3
+ input: NodeJS.ReadableStream;
4
+ /** Chrome's messages out — the protocol itself, never a log. */
5
+ output: NodeJS.WritableStream;
6
+ socketPath?: string;
7
+ /** Told what went wrong. Dropped if the caller does not want to know. */
8
+ warn?: (message: string) => void;
9
+ }
10
+ export interface RunningHost {
11
+ readonly socketPath: string;
12
+ /**
13
+ * Settles once the host has shut down — Chrome closed its stdin, or `close`
14
+ * was called. The process running it should then exit explicitly: left to
15
+ * wind down on its own, Node closes every handle on the way out, and closing
16
+ * a unix socket server deletes its path even when a newer host owns it now.
17
+ */
18
+ readonly closed: Promise<void>;
19
+ close(): Promise<void>;
20
+ }
21
+ /** Split Chrome's length-prefixed stream into messages. */
22
+ export declare class NativeMessageFramer {
23
+ private buffer;
24
+ push(chunk: Buffer, onMessage: (message: unknown) => void, onError?: (reason: string) => void): void;
25
+ }
26
+ export declare function encodeNativeMessage(message: unknown): Buffer;
27
+ export declare function runBrowserHost(opts: HostOptions): Promise<RunningHost>;
@@ -0,0 +1,311 @@
1
+ import { createServer } from "node:net";
2
+ import { mkdir, stat, unlink } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { extensionSocketPath } from "./socket.js";
5
+ /**
6
+ * The native messaging host: a relay, and deliberately nothing more.
7
+ *
8
+ * Chrome starts this process when the extension connects to it, hands it the
9
+ * extension's messages on stdin, and reads replies from stdout. The harness is
10
+ * somewhere else entirely and may not be running yet, so this end listens on a
11
+ * local socket and the harness connects when a browser tool is first called.
12
+ * That direction matters: Chrome decides when the host exists, so the host
13
+ * cannot be the one doing the connecting.
14
+ *
15
+ * It knows CDP only as envelopes. The relay itself stays in the extension; what
16
+ * lives here is the one thing the extension cannot do, which is tell several
17
+ * harnesses apart. A desktop window, a web server and a terminal can each have
18
+ * conversations driving the same browser, and each numbers its requests from
19
+ * one. So every request is renumbered on the way in and put back on the way
20
+ * out, and a tab's events go to the harnesses attached to that tab. Nothing
21
+ * else about a message is read.
22
+ *
23
+ * Framing differs on the two sides and that is the whole of the work here.
24
+ * Chrome uses a four-byte little-endian length ahead of each UTF-8 JSON
25
+ * document; the socket side uses newline-delimited JSON, because a socket
26
+ * consumer in the harness is already reading lines.
27
+ *
28
+ * The streams are arguments rather than `process.stdin`/`process.stdout`, and
29
+ * that is not a testing convenience. stdout here *is* the protocol, and the
30
+ * engine is not allowed to own a process's standard streams — a library that
31
+ * printed to them could not be driven by a web UI or a scheduled run. So the
32
+ * binary in the CLI package hands its own streams in, and this stays mechanism.
33
+ */
34
+ /** Chrome refuses anything larger, in either direction. */
35
+ const MAX_MESSAGE = 64 * 1024 * 1024;
36
+ /** What Chrome itself accepts from a host. Frames have to fit inside it. */
37
+ const CHROME_LIMIT = 1024 * 1024;
38
+ /** Split Chrome's length-prefixed stream into messages. */
39
+ export class NativeMessageFramer {
40
+ buffer = Buffer.alloc(0);
41
+ push(chunk, onMessage, onError) {
42
+ this.buffer = this.buffer.length === 0 ? Buffer.from(chunk) : Buffer.concat([this.buffer, chunk]);
43
+ for (;;) {
44
+ if (this.buffer.length < 4)
45
+ return;
46
+ const length = this.buffer.readUInt32LE(0);
47
+ if (length > MAX_MESSAGE) {
48
+ // Unrecoverable: the stream position is no longer trustworthy.
49
+ onError?.(`native message of ${length} bytes is beyond anything Chrome sends`);
50
+ this.buffer = Buffer.alloc(0);
51
+ return;
52
+ }
53
+ if (this.buffer.length < 4 + length)
54
+ return;
55
+ const body = this.buffer.subarray(4, 4 + length).toString("utf8");
56
+ this.buffer = this.buffer.subarray(4 + length);
57
+ try {
58
+ onMessage(JSON.parse(body));
59
+ }
60
+ catch {
61
+ onError?.("the extension sent something that is not JSON");
62
+ }
63
+ }
64
+ }
65
+ }
66
+ export function encodeNativeMessage(message) {
67
+ const body = Buffer.from(JSON.stringify(message), "utf8");
68
+ const header = Buffer.alloc(4);
69
+ header.writeUInt32LE(body.length, 0);
70
+ return Buffer.concat([header, body]);
71
+ }
72
+ export async function runBrowserHost(opts) {
73
+ const socketPath = opts.socketPath ?? extensionSocketPath();
74
+ const { input, output } = opts;
75
+ const warn = opts.warn ?? (() => { });
76
+ // A socket left behind by a host that was killed would refuse to bind. It is
77
+ // safe to remove: only one host can be useful at a time, and Chrome starts a
78
+ // fresh one each time the extension connects.
79
+ if (!socketPath.startsWith("\\\\")) {
80
+ await unlink(socketPath).catch(() => { });
81
+ // Chrome may start the host before OHarness has ever run and made its
82
+ // directory, and a socket cannot be created in a directory that is not there.
83
+ await mkdir(path.dirname(socketPath), { recursive: true });
84
+ }
85
+ const clients = new Set();
86
+ /**
87
+ * The OHarness servers that said where they are (see presence.ts), for the
88
+ * extension's side panel. Held only in memory, like the tokens in them.
89
+ */
90
+ const servers = new Map();
91
+ /** Keyed by the id the extension sees, which is never one a harness chose. */
92
+ const inFlight = new Map();
93
+ /** Which harnesses are attached to which tab, so a tab's events reach them all. */
94
+ const tabs = new Map();
95
+ let nextId = 1;
96
+ const framer = new NativeMessageFramer();
97
+ const toExtension = (message) => {
98
+ const encoded = encodeNativeMessage(message);
99
+ if (encoded.length > CHROME_LIMIT) {
100
+ warn(`dropping a ${encoded.length} byte message: Chrome's limit is ${CHROME_LIMIT}`);
101
+ return;
102
+ }
103
+ output.write(encoded);
104
+ };
105
+ const toClient = (client, message) => {
106
+ if (!client.destroyed)
107
+ client.write(`${JSON.stringify(message)}\n`);
108
+ };
109
+ // So the extension can say whether anything is using it, and where the
110
+ // OHarness pages are. Informational: an extension that predates it ignores
111
+ // a message type it does not know.
112
+ const announce = () => toExtension({ t: "host", clients: clients.size, servers: [...servers.values()] });
113
+ const holders = (tabId) => {
114
+ let set = tabs.get(tabId);
115
+ if (!set)
116
+ tabs.set(tabId, (set = new Set()));
117
+ return set;
118
+ };
119
+ /** Let go of a tab for one harness; the debugger stays while anyone still holds it. */
120
+ const release = (client, tabId) => {
121
+ const set = tabs.get(tabId);
122
+ if (!set)
123
+ return true;
124
+ set.delete(client);
125
+ if (set.size > 0)
126
+ return false;
127
+ tabs.delete(tabId);
128
+ return true;
129
+ };
130
+ const fromClient = (client, message) => {
131
+ if (typeof message !== "object" || message === null)
132
+ return;
133
+ const envelope = message;
134
+ const { t, id } = envelope;
135
+ if (t === "register") {
136
+ const { url, token, kind, pid } = envelope;
137
+ if (typeof url !== "string" || typeof token !== "string")
138
+ return;
139
+ // Loopback only: this is a page the extension will open with a token
140
+ // in it, and nothing but this machine's own OHarness belongs there.
141
+ if (!/^http:\/\/(?:127\.0\.0\.1|localhost|\[::1\])(?::\d+)?\/?$/.test(url))
142
+ return;
143
+ servers.set(client, {
144
+ url: url.replace(/\/$/, ""),
145
+ token,
146
+ kind: kind === "desktop" ? "desktop" : "web",
147
+ ...(typeof pid === "number" ? { pid } : {}),
148
+ });
149
+ announce();
150
+ return;
151
+ }
152
+ if (t !== "cdp" && t !== "ctl")
153
+ return;
154
+ if (t === "ctl") {
155
+ const op = typeof envelope["op"] === "string" ? envelope["op"] : "";
156
+ const tabId = envelope["tabId"] === undefined ? undefined : String(envelope["tabId"]);
157
+ // A tab another harness already attached needs no second debugger —
158
+ // Chrome would refuse one anyway. This harness just starts hearing it.
159
+ if (op === "attach" && tabId && (tabs.get(tabId)?.size ?? 0) > 0) {
160
+ holders(tabId).add(client);
161
+ toClient(client, { t: "ctl", id, result: { ok: true } });
162
+ return;
163
+ }
164
+ if (op === "detach" && tabId && !release(client, tabId)) {
165
+ toClient(client, { t: "ctl", id, result: { ok: true } });
166
+ return;
167
+ }
168
+ if (op === "closeTab" && tabId)
169
+ tabs.delete(tabId);
170
+ const hostId = nextId++;
171
+ inFlight.set(hostId, { client, id, op, ...(tabId ? { tabId } : {}) });
172
+ toExtension({ ...envelope, id: hostId });
173
+ return;
174
+ }
175
+ // CDP without an id is an event, and harnesses do not send events.
176
+ if (id === undefined)
177
+ return;
178
+ const hostId = nextId++;
179
+ inFlight.set(hostId, { client, id });
180
+ toExtension({ ...envelope, id: hostId });
181
+ };
182
+ const fromExtension = (message) => {
183
+ if (typeof message !== "object" || message === null)
184
+ return;
185
+ const envelope = message;
186
+ const { t, id } = envelope;
187
+ if (typeof id === "number" && (t === "cdp" || t === "ctl")) {
188
+ const request = inFlight.get(id);
189
+ if (!request)
190
+ return;
191
+ inFlight.delete(id);
192
+ const { client } = request;
193
+ if (!client)
194
+ return;
195
+ if (t === "ctl" && request.op === "attach" && request.tabId && envelope["error"] === undefined) {
196
+ holders(request.tabId).add(client);
197
+ }
198
+ toClient(client, { ...envelope, id: request.id });
199
+ return;
200
+ }
201
+ if (t === "cdp") {
202
+ const sessionId = envelope["sessionId"];
203
+ if (sessionId === undefined) {
204
+ for (const client of clients)
205
+ toClient(client, envelope);
206
+ return;
207
+ }
208
+ const tabId = String(sessionId);
209
+ const set = tabs.get(tabId);
210
+ if (!set)
211
+ return;
212
+ for (const client of set)
213
+ toClient(client, envelope);
214
+ // The debugger is gone — the person closed the banner or the tab — so
215
+ // nobody holds this tab any more.
216
+ if (envelope["method"] === "Inspector.detached")
217
+ tabs.delete(tabId);
218
+ }
219
+ };
220
+ input.on("data", (chunk) => framer.push(chunk, fromExtension, warn));
221
+ const server = createServer((socket) => {
222
+ clients.add(socket);
223
+ announce();
224
+ let buffer = "";
225
+ socket.setEncoding("utf8");
226
+ socket.on("data", (chunk) => {
227
+ buffer += chunk;
228
+ let newline;
229
+ while ((newline = buffer.indexOf("\n")) !== -1) {
230
+ const line = buffer.slice(0, newline).trim();
231
+ buffer = buffer.slice(newline + 1);
232
+ if (line === "")
233
+ continue;
234
+ let parsed;
235
+ try {
236
+ parsed = JSON.parse(line);
237
+ }
238
+ catch {
239
+ warn("the harness sent something that is not JSON");
240
+ continue;
241
+ }
242
+ fromClient(socket, parsed);
243
+ }
244
+ });
245
+ let gone = false;
246
+ const drop = () => {
247
+ if (gone)
248
+ return;
249
+ gone = true;
250
+ clients.delete(socket);
251
+ servers.delete(socket);
252
+ for (const [hostId, request] of inFlight) {
253
+ if (request.client === socket)
254
+ inFlight.delete(hostId);
255
+ }
256
+ // A harness that went away without detaching — killed, crashed, its
257
+ // laptop lid shut — must not leave a banner on the person's tabs.
258
+ for (const tabId of [...tabs.keys()]) {
259
+ if (!tabs.get(tabId)?.has(socket))
260
+ continue;
261
+ if (!release(socket, tabId))
262
+ continue;
263
+ const hostId = nextId++;
264
+ inFlight.set(hostId, { client: undefined, id: undefined });
265
+ toExtension({ t: "ctl", id: hostId, op: "detach", tabId: Number(tabId) });
266
+ }
267
+ announce();
268
+ };
269
+ socket.on("close", drop);
270
+ socket.on("error", drop);
271
+ });
272
+ await new Promise((resolve, reject) => {
273
+ server.once("error", reject);
274
+ server.listen(socketPath, () => {
275
+ server.removeListener("error", reject);
276
+ resolve();
277
+ });
278
+ });
279
+ // Which file is ours. Chrome starts a new host whenever the extension's
280
+ // worker restarts, often before the old one has noticed its stdin close; the
281
+ // new one takes the path over, and the old one must not delete it on the way
282
+ // out, or the host that is still running becomes one nobody can reach.
283
+ const ours = socketPath.startsWith("\\\\") ? undefined : await stat(socketPath).then((s) => s.ino, () => undefined);
284
+ // The first thing the extension hears, and its sign the host really started:
285
+ // connecting a native port succeeds even when the host then fails to launch.
286
+ announce();
287
+ // Chrome closing stdin is how a host is told the extension went away.
288
+ let stopping;
289
+ const shutdown = () => (stopping ??= (async () => {
290
+ for (const client of clients)
291
+ client.end();
292
+ const current = ours === undefined ? undefined : await stat(socketPath).then((s) => s.ino, () => undefined);
293
+ if (ours !== undefined && current !== ours) {
294
+ // Closing a unix socket server unlinks its path, and the path is now
295
+ // the newer host's. Stop listening without closing; the process running
296
+ // this exits explicitly (see RunningHost.closed), which leaves it be.
297
+ server.unref();
298
+ return;
299
+ }
300
+ await new Promise((resolve) => server.close(() => resolve()));
301
+ if (ours !== undefined)
302
+ await unlink(socketPath).catch(() => { });
303
+ })());
304
+ let settle;
305
+ const closed = new Promise((resolve) => (settle = resolve));
306
+ const close = () => shutdown().then(settle);
307
+ input.on("end", () => void close());
308
+ input.on("close", () => void close());
309
+ return { socketPath, closed, close };
310
+ }
311
+ //# sourceMappingURL=host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/browser/host.ts"],"names":[],"mappings":"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"}