@amalgm/browser 0.1.2-preview.37158931600 → 0.1.2-preview.37260290026
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/src/chrome/cookie-changes.d.ts +1 -1
- package/dist/src/chrome/cookie-changes.js +17 -9
- package/dist/src/chrome/cookie-changes.js.map +1 -1
- package/dist/src/chrome/cookie-observer.js +10 -3
- package/dist/src/chrome/cookie-observer.js.map +1 -1
- package/dist/src/chrome/launch.js +18 -2
- package/dist/src/chrome/launch.js.map +1 -1
- package/dist/src/electron/surface-controller.js +5 -2
- package/dist/src/electron/surface-controller.js.map +1 -1
- package/dist/src/electron.cjs +2 -2
- package/dist/src/process.js +74 -53
- package/dist/src/process.js.map +1 -1
- package/docs/CHROME.md +15 -7
- package/docs/ELECTRON_INTEGRATION.md +4 -1
- package/docs/TESTING.md +3 -2
- package/package.json +6 -5
|
@@ -2,7 +2,7 @@ import { type CdpClient } from '../cdp/client.js';
|
|
|
2
2
|
import type { BrowserCookieChange } from '../cookies/types.js';
|
|
3
3
|
/**
|
|
4
4
|
* One trusted extension worker on the existing control socket, independent of page count.
|
|
5
|
-
* Chrome stops and restarts the worker on its own; each
|
|
5
|
+
* Chrome stops and restarts the worker on its own; each restarted worker announces itself and resumes delivery.
|
|
6
6
|
*/
|
|
7
7
|
export declare function observeChromeCookies(input: {
|
|
8
8
|
control: CdpClient;
|
|
@@ -2,7 +2,7 @@ import { deadline } from '../cdp/client.js';
|
|
|
2
2
|
import { cookieObserverDirectory } from './cookie-observer.js';
|
|
3
3
|
/**
|
|
4
4
|
* One trusted extension worker on the existing control socket, independent of page count.
|
|
5
|
-
* Chrome stops and restarts the worker on its own; each
|
|
5
|
+
* Chrome stops and restarts the worker on its own; each restarted worker announces itself and resumes delivery.
|
|
6
6
|
*/
|
|
7
7
|
export async function observeChromeCookies(input) {
|
|
8
8
|
let extensionId;
|
|
@@ -16,17 +16,22 @@ export async function observeChromeCookies(input) {
|
|
|
16
16
|
const initialized = new Promise((resolve, reject) => { ready = resolve; failed = reject; });
|
|
17
17
|
void initialized.catch(() => undefined); // Discovery may fail before the admission await is reached.
|
|
18
18
|
const fail = (error) => { failed(error); input.failed(); };
|
|
19
|
-
//
|
|
19
|
+
// The worker announces each start. Every start after the first restarted a worker, so a
|
|
20
20
|
// snapshot covers anything it could not deliver while stopped.
|
|
21
|
-
const
|
|
21
|
+
const observed = () => {
|
|
22
22
|
if (started)
|
|
23
23
|
input.changed(undefined);
|
|
24
24
|
started = true;
|
|
25
|
-
const result = await current.call('Runtime.evaluate', { expression: 'amalgmObserveCookies()' });
|
|
26
|
-
if (result.exceptionDetails)
|
|
27
|
-
throw new Error('Chrome cookie observer did not initialize.');
|
|
28
25
|
ready();
|
|
29
26
|
};
|
|
27
|
+
// Chrome reports a worker context before its script runs. A script that already ran before
|
|
28
|
+
// the bindings existed starts here; one that runs later starts itself and announces it.
|
|
29
|
+
const start = async (current) => {
|
|
30
|
+
const result = await current.call('Runtime.evaluate', { expression: 'globalThis.amalgmObserveCookies?.()' });
|
|
31
|
+
const failure = result.exceptionDetails;
|
|
32
|
+
if (failure)
|
|
33
|
+
throw new Error(`Chrome cookie observer did not initialize: ${(failure.exception?.description ?? failure.text ?? '').split('\n')[0]}`);
|
|
34
|
+
};
|
|
30
35
|
const attach = async (target) => {
|
|
31
36
|
if (closed || target.type !== 'service_worker' || !extensionId
|
|
32
37
|
|| !target.url?.startsWith(`chrome-extension://${extensionId}/`) || !target.targetId || observing === target.targetId)
|
|
@@ -43,12 +48,15 @@ export async function observeChromeCookies(input) {
|
|
|
43
48
|
session = current;
|
|
44
49
|
sessionId = attached.sessionId;
|
|
45
50
|
current.on('Runtime.bindingCalled', ({ name, payload }) => {
|
|
46
|
-
if (name === '
|
|
51
|
+
if (name === 'amalgmCookiesObserving')
|
|
52
|
+
observed();
|
|
53
|
+
else if (name === 'amalgmCookieEvent' && typeof payload === 'string')
|
|
47
54
|
input.changed(fromChrome(JSON.parse(payload)));
|
|
48
55
|
});
|
|
49
|
-
current.on('Runtime.executionContextCreated', () => { void
|
|
50
|
-
//
|
|
56
|
+
current.on('Runtime.executionContextCreated', () => { void start(current).catch(fail); });
|
|
57
|
+
// Both bindings exist before Runtime.enable reports the worker's current context.
|
|
51
58
|
await current.call('Runtime.addBinding', { name: 'amalgmCookieEvent' });
|
|
59
|
+
await current.call('Runtime.addBinding', { name: 'amalgmCookiesObserving' });
|
|
52
60
|
await current.call('Runtime.enable');
|
|
53
61
|
};
|
|
54
62
|
const created = input.control.on('Target.targetCreated', ({ targetInfo }) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cookie-changes.js","sourceRoot":"","sources":["../../../src/chrome/cookie-changes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAkB,MAAM,kBAAkB,CAAC;AAE5D,OAAO,EAAE,uBAAuB,EAA0B,MAAM,sBAAsB,CAAC;AAEvF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,KAK1C;IACC,IAAI,WAA+B,CAAC;IACpC,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,SAA6B,CAAC;IAClC,IAAI,SAA6B,CAAC;IAClC,IAAI,OAA8B,CAAC;IACnC,IAAI,KAAiB,CAAC;IACtB,IAAI,MAAgC,CAAC;IACrC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,KAAK,GAAG,OAAO,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAClG,KAAK,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,4DAA4D;IACrG,MAAM,IAAI,GAAG,CAAC,KAAc,EAAQ,EAAE,GAAG,MAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3E,
|
|
1
|
+
{"version":3,"file":"cookie-changes.js","sourceRoot":"","sources":["../../../src/chrome/cookie-changes.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,11 +4,11 @@ import path from 'node:path';
|
|
|
4
4
|
function worker() {
|
|
5
5
|
const scope = globalThis;
|
|
6
6
|
const pending = new Map();
|
|
7
|
-
let
|
|
7
|
+
let observing = false;
|
|
8
8
|
scope.chrome.cookies.onChanged.addListener(event => {
|
|
9
9
|
if (event.removed && event.cause === 'overwrite')
|
|
10
10
|
return;
|
|
11
|
-
if (
|
|
11
|
+
if (observing)
|
|
12
12
|
scope.amalgmCookieEvent(JSON.stringify(event));
|
|
13
13
|
else {
|
|
14
14
|
const cookie = event.cookie;
|
|
@@ -16,12 +16,19 @@ function worker() {
|
|
|
16
16
|
pending.set(key, event);
|
|
17
17
|
}
|
|
18
18
|
});
|
|
19
|
+
// Chrome reports a worker context before it runs this script, so the controller's bindings
|
|
20
|
+
// may arrive before or after it. Both sides call this; whichever comes second starts delivery
|
|
21
|
+
// once and announces it.
|
|
19
22
|
scope.amalgmObserveCookies = () => {
|
|
20
|
-
|
|
23
|
+
if (observing || !scope.amalgmCookiesObserving || !scope.amalgmCookieEvent)
|
|
24
|
+
return;
|
|
25
|
+
observing = true;
|
|
26
|
+
scope.amalgmCookiesObserving('');
|
|
21
27
|
for (const event of pending.values())
|
|
22
28
|
scope.amalgmCookieEvent(JSON.stringify(event));
|
|
23
29
|
pending.clear();
|
|
24
30
|
};
|
|
31
|
+
scope.amalgmObserveCookies();
|
|
25
32
|
}
|
|
26
33
|
export function cookieObserverDirectory(root) {
|
|
27
34
|
const directory = path.join(root, 'cookie-observer');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cookie-observer.js","sourceRoot":"","sources":["../../../src/chrome/cookie-observer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAU7B,8FAA8F;AAC9F,SAAS,MAAM;IACb,MAAM,KAAK,GAAG,
|
|
1
|
+
{"version":3,"file":"cookie-observer.js","sourceRoot":"","sources":["../../../src/chrome/cookie-observer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAU7B,8FAA8F;AAC9F,SAAS,MAAM;IACb,MAAM,KAAK,GAAG,UAKb,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,GAAG,EAA6B,CAAC;IACrD,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE;QACjD,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,KAAK,WAAW;YAAE,OAAO;QACzD,IAAI,SAAS;YAAE,KAAK,CAAC,iBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;aAC1D,CAAC;YACJ,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;YAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;YAC3F,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC,CAAC;IACH,2FAA2F;IAC3F,8FAA8F;IAC9F,yBAAyB;IACzB,KAAK,CAAC,oBAAoB,GAAG,GAAG,EAAE;QAChC,IAAI,SAAS,IAAI,CAAC,KAAK,CAAC,sBAAsB,IAAI,CAAC,KAAK,CAAC,iBAAiB;YAAE,OAAO;QACnF,SAAS,GAAG,IAAI,CAAC;QACjB,KAAK,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;QACjC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE;YAAE,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QACrF,OAAO,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC,CAAC;IACF,KAAK,CAAC,oBAAoB,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;IACrD,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC1D,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC;QACrE,gBAAgB,EAAE,CAAC,EAAE,IAAI,EAAE,wBAAwB,EAAE,OAAO,EAAE,KAAK;QACnE,WAAW,EAAE,CAAC,SAAS,CAAC,EAAE,gBAAgB,EAAE,CAAC,YAAY,CAAC;QAC1D,UAAU,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE;KAC5C,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACrB,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,IAAI,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAClG,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -40,16 +40,20 @@ export async function launchChrome(input) {
|
|
|
40
40
|
const killOnExit = () => { child.kill('SIGKILL'); };
|
|
41
41
|
process.once('exit', killOnExit);
|
|
42
42
|
void exited.then(() => process.removeListener('exit', killOnExit));
|
|
43
|
+
let browserUrl;
|
|
44
|
+
// Chrome writes its profile, cookies included, only when it closes itself. A signal skips that,
|
|
45
|
+
// and on Windows every signal is a hard kill, so Chrome is asked over CDP and forced only if it stays.
|
|
43
46
|
const kill = async () => {
|
|
44
47
|
if (child.exitCode !== null || child.signalCode !== null)
|
|
45
48
|
return;
|
|
46
|
-
child.kill('SIGTERM');
|
|
47
49
|
const forced = setTimeout(() => child.kill('SIGKILL'), 3_000);
|
|
50
|
+
if (!browserUrl || !await requestClose(browserUrl))
|
|
51
|
+
child.kill('SIGTERM');
|
|
48
52
|
await exited;
|
|
49
53
|
clearTimeout(forced);
|
|
50
54
|
};
|
|
51
55
|
try {
|
|
52
|
-
|
|
56
|
+
browserUrl = await deadline(listening, input.timeoutMs || 20_000, 'Chrome start');
|
|
53
57
|
return { pid: child.pid, browserUrl, exited, kill };
|
|
54
58
|
}
|
|
55
59
|
catch {
|
|
@@ -85,6 +89,18 @@ function readPortFile(file) {
|
|
|
85
89
|
return null;
|
|
86
90
|
}
|
|
87
91
|
}
|
|
92
|
+
async function requestClose(endpoint) {
|
|
93
|
+
const control = await connectCdp(endpoint, AbortSignal.timeout(2_000)).catch(() => null);
|
|
94
|
+
if (!control)
|
|
95
|
+
return false;
|
|
96
|
+
try {
|
|
97
|
+
await control.call('Browser.close', {}, 2_000).catch(() => undefined);
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
finally {
|
|
101
|
+
control.close();
|
|
102
|
+
}
|
|
103
|
+
}
|
|
88
104
|
// The old profile publishes an unguessable browser endpoint. After obtaining
|
|
89
105
|
// the lease, retire that exact Chrome through CDP; never signal a reused PID.
|
|
90
106
|
async function closeOrphan(userDataDir) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launch.js","sourceRoot":"","sources":["../../../src/chrome/launch.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"launch.js","sourceRoot":"","sources":["../../../src/chrome/launch.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,10 @@ import { createSurfaceRecord } from './surface/create.js';
|
|
|
5
5
|
import { configureSurfaceEvents } from './surface/events.js';
|
|
6
6
|
import { SurfacePresentation } from './surface/presentation.js';
|
|
7
7
|
import { normalizeBounds, stateFor, validSurfaceId, withDeadline } from './surface/state.js';
|
|
8
|
-
|
|
8
|
+
// capturePage can stall on a view that is not painting; this only bounds that stall. The first
|
|
9
|
+
// frame after a move or resize takes a few hundred milliseconds, and how long a person waits
|
|
10
|
+
// for it is the renderer's decision.
|
|
11
|
+
const CAPTURE_STALL_MS = 2_000;
|
|
9
12
|
export function createBrowserSurfaceController(options) {
|
|
10
13
|
const surfaces = new Map();
|
|
11
14
|
const ownerSurfaceIds = new Map();
|
|
@@ -104,7 +107,7 @@ export function createBrowserSurfaceController(options) {
|
|
|
104
107
|
if (!record || record.view.webContents.isDestroyed())
|
|
105
108
|
return null;
|
|
106
109
|
try {
|
|
107
|
-
const image = await withDeadline(record.view.webContents.capturePage(),
|
|
110
|
+
const image = await withDeadline(record.view.webContents.capturePage(), CAPTURE_STALL_MS);
|
|
108
111
|
if (image.isEmpty())
|
|
109
112
|
return null;
|
|
110
113
|
const size = image.getSize();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"surface-controller.js","sourceRoot":"","sources":["../../../src/electron/surface-controller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAoB,MAAM,UAAU,CAAC;AACrD,OAAO,EACL,WAAW,GAKZ,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAS7F,MAAM,
|
|
1
|
+
{"version":3,"file":"surface-controller.js","sourceRoot":"","sources":["../../../src/electron/surface-controller.ts"],"names":[],"mappings":"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"}
|
package/dist/src/electron.cjs
CHANGED
|
@@ -12059,7 +12059,7 @@ var SurfacePresentation = class {
|
|
|
12059
12059
|
};
|
|
12060
12060
|
|
|
12061
12061
|
// src/electron/surface-controller.ts
|
|
12062
|
-
var
|
|
12062
|
+
var CAPTURE_STALL_MS = 2e3;
|
|
12063
12063
|
function createBrowserSurfaceController(options) {
|
|
12064
12064
|
const surfaces = /* @__PURE__ */ new Map();
|
|
12065
12065
|
const ownerSurfaceIds = /* @__PURE__ */ new Map();
|
|
@@ -12151,7 +12151,7 @@ function createBrowserSurfaceController(options) {
|
|
|
12151
12151
|
const record = ownedSurface(event.sender, surfaceId);
|
|
12152
12152
|
if (!record || record.view.webContents.isDestroyed()) return null;
|
|
12153
12153
|
try {
|
|
12154
|
-
const image = await withDeadline(record.view.webContents.capturePage(),
|
|
12154
|
+
const image = await withDeadline(record.view.webContents.capturePage(), CAPTURE_STALL_MS);
|
|
12155
12155
|
if (image.isEmpty()) return null;
|
|
12156
12156
|
const size = image.getSize();
|
|
12157
12157
|
const targetWidth = Math.min(size.width, Math.max(1, record.bounds.width || size.width));
|
package/dist/src/process.js
CHANGED
|
@@ -1,65 +1,86 @@
|
|
|
1
1
|
import { spawn } from 'node:child_process';
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import os from 'node:os';
|
|
5
|
+
import path from 'node:path';
|
|
2
6
|
import { BrowserError } from './errors.js';
|
|
7
|
+
// A process is done when it exits. Its output goes to files rather than pipes: a daemon it
|
|
8
|
+
// starts can inherit its output handles (agent-browser's does on Windows) and would hold a
|
|
9
|
+
// pipe open for the daemon's whole life.
|
|
3
10
|
export class NodeProcessLauncher {
|
|
4
11
|
async run(input) {
|
|
5
12
|
if (input.signal?.aborted)
|
|
6
13
|
throw new BrowserError('ABORTED', 'Browser operation was cancelled.');
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
14
|
+
const stdout = outputFile();
|
|
15
|
+
const stderr = outputFile();
|
|
16
|
+
try {
|
|
17
|
+
const { code, signal, timedOut } = await new Promise((resolve, reject) => {
|
|
18
|
+
const child = spawn(input.command, input.args, {
|
|
19
|
+
cwd: input.cwd,
|
|
20
|
+
env: input.env,
|
|
21
|
+
shell: false,
|
|
22
|
+
stdio: [input.stdin === undefined ? 'ignore' : 'pipe', stdout.fd, stderr.fd],
|
|
23
|
+
});
|
|
24
|
+
let timedOut = false;
|
|
25
|
+
let forceTimer;
|
|
26
|
+
if (input.stdin !== undefined)
|
|
27
|
+
child.stdin.end(input.stdin);
|
|
28
|
+
const terminate = () => {
|
|
29
|
+
child.kill('SIGTERM');
|
|
30
|
+
forceTimer = setTimeout(() => child.kill('SIGKILL'), 2_000);
|
|
31
|
+
forceTimer.unref();
|
|
32
|
+
};
|
|
33
|
+
const timeout = setTimeout(() => { timedOut = true; terminate(); }, input.timeoutMs);
|
|
34
|
+
const abort = () => terminate();
|
|
35
|
+
input.signal?.addEventListener('abort', abort, { once: true });
|
|
36
|
+
const settle = () => {
|
|
37
|
+
clearTimeout(timeout);
|
|
38
|
+
if (forceTimer)
|
|
39
|
+
clearTimeout(forceTimer);
|
|
40
|
+
input.signal?.removeEventListener('abort', abort);
|
|
41
|
+
};
|
|
42
|
+
child.once('error', (error) => { settle(); reject(error); });
|
|
43
|
+
child.once('exit', (code, signal) => { settle(); resolve({ code, signal, timedOut }); });
|
|
13
44
|
});
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
input.signal?.addEventListener('abort', abort, { once: true });
|
|
32
|
-
const finish = (error, result) => {
|
|
33
|
-
if (settled)
|
|
34
|
-
return;
|
|
35
|
-
settled = true;
|
|
36
|
-
clearTimeout(timeout);
|
|
37
|
-
if (forceTimer)
|
|
38
|
-
clearTimeout(forceTimer);
|
|
39
|
-
input.signal?.removeEventListener('abort', abort);
|
|
40
|
-
if (error)
|
|
41
|
-
reject(error);
|
|
42
|
-
else
|
|
43
|
-
resolve(result);
|
|
44
|
-
};
|
|
45
|
-
child.on('error', (error) => finish(error));
|
|
46
|
-
child.on('close', (code, signal) => {
|
|
47
|
-
if (input.signal?.aborted) {
|
|
48
|
-
finish(new BrowserError('ABORTED', 'Browser operation was cancelled.'));
|
|
49
|
-
}
|
|
50
|
-
else if (timedOut) {
|
|
51
|
-
finish(new BrowserError('TIMEOUT', `Browser process exceeded ${input.timeoutMs}ms.`));
|
|
52
|
-
}
|
|
53
|
-
else if (signal || code === null) {
|
|
54
|
-
finish(new BrowserError('PROCESS_FAILED', `Browser process terminated by ${signal || 'an unknown signal'}.`));
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
finish(undefined, { code, stdout, stderr });
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
});
|
|
45
|
+
if (input.signal?.aborted)
|
|
46
|
+
throw new BrowserError('ABORTED', 'Browser operation was cancelled.');
|
|
47
|
+
if (timedOut)
|
|
48
|
+
throw new BrowserError('TIMEOUT', `Browser process exceeded ${input.timeoutMs}ms.`);
|
|
49
|
+
if (signal || code === null) {
|
|
50
|
+
throw new BrowserError('PROCESS_FAILED', `Browser process terminated by ${signal || 'an unknown signal'}.`);
|
|
51
|
+
}
|
|
52
|
+
return { code, stdout: stdout.tail(input.outputLimit), stderr: stderr.tail(input.outputLimit) };
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
try {
|
|
56
|
+
stdout.remove();
|
|
57
|
+
}
|
|
58
|
+
finally {
|
|
59
|
+
stderr.remove();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
61
62
|
}
|
|
62
63
|
}
|
|
64
|
+
function outputFile() {
|
|
65
|
+
const file = path.join(os.tmpdir(), `amalgm-browser-process-${randomUUID()}`);
|
|
66
|
+
const fd = fs.openSync(file, 'wx+', 0o600);
|
|
67
|
+
return {
|
|
68
|
+
fd,
|
|
69
|
+
tail(limit) {
|
|
70
|
+
// A UTF-8 character is at most four bytes, so this many bytes hold the last `limit` characters.
|
|
71
|
+
const size = fs.fstatSync(fd).size;
|
|
72
|
+
const length = Math.min(size, limit * 4);
|
|
73
|
+
const bytes = Buffer.alloc(length);
|
|
74
|
+
fs.readSync(fd, bytes, 0, length, size - length);
|
|
75
|
+
return bytes.toString().slice(-limit);
|
|
76
|
+
},
|
|
77
|
+
remove() {
|
|
78
|
+
fs.closeSync(fd);
|
|
79
|
+
// A daemon may still hold the file; the system frees it when that handle closes.
|
|
80
|
+
fs.rmSync(file, { force: true });
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
}
|
|
63
84
|
export function pidIsRunning(pid) {
|
|
64
85
|
if (!Number.isInteger(pid) || pid <= 0)
|
|
65
86
|
return false;
|
package/dist/src/process.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/process.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,MAAM,OAAO,mBAAmB;IAC9B,KAAK,CAAC,GAAG,CAAC,KAA4C;QACpD,IAAI,KAAK,CAAC,MAAM,EAAE,OAAO;YAAE,MAAM,IAAI,YAAY,CAAC,SAAS,EAAE,kCAAkC,CAAC,CAAC;QACjG,
|
|
1
|
+
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/process.ts"],"names":[],"mappings":"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"}
|
package/docs/CHROME.md
CHANGED
|
@@ -33,9 +33,13 @@ Chrome's native debugging-listening event admits the process, within a
|
|
|
33
33
|
20-second deadline. Browser attaches its private cookie extension to the
|
|
34
34
|
account's default profile and reconciles it with the encrypted jar
|
|
35
35
|
(see [cookies](./COOKIES.md)). The extension uses one session on the existing
|
|
36
|
-
control connection, independently of the number of pages. Chrome
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
control connection, independently of the number of pages. Chrome reports a
|
|
37
|
+
worker's context before it runs the worker script, so Browser's bindings can
|
|
38
|
+
arrive before or after that script. Both sides ask to start delivery, and
|
|
39
|
+
whichever comes second starts it; the worker then announces that it is
|
|
40
|
+
observing. Chrome stops an idle extension worker and restarts it for the next
|
|
41
|
+
cookie change; the new worker announces itself again, and that second
|
|
42
|
+
announcement brings one snapshot to cover the stop. Chrome keeps its
|
|
39
43
|
normal platform credential storage; Browser does not request the basic password
|
|
40
44
|
store or mock keychain.
|
|
41
45
|
|
|
@@ -111,8 +115,11 @@ does not poll history, and closing it releases its observation connection.
|
|
|
111
115
|
|
|
112
116
|
`browser.close()` stops admission, cancels and drains in-flight operations,
|
|
113
117
|
then stops recordings, detaches every daemon, drains queued cookie changes,
|
|
114
|
-
|
|
115
|
-
|
|
118
|
+
asks Chrome to close over CDP, and closes the registry. Chrome writes its
|
|
119
|
+
profile only when it closes itself; a signal skips that, and on Windows every
|
|
120
|
+
signal is a hard kill. A cookie Chrome had not yet reported is therefore on its
|
|
121
|
+
disk, and the next start reconciles it. Chrome is killed if it has not exited
|
|
122
|
+
3 seconds after the request, or if the Node process exits.
|
|
116
123
|
|
|
117
124
|
## Configuration
|
|
118
125
|
|
|
@@ -133,7 +140,8 @@ is killed, and that loopback cookies never enter the account. It also measures
|
|
|
133
140
|
zero cookie scans and history reads while idle, including with a live viewer,
|
|
134
141
|
and verifies background cookie writes and tab-switch history updates. The busy
|
|
135
142
|
page examination starts with 1000 cookies and requires 60 edits to cause zero
|
|
136
|
-
full-store scans,
|
|
137
|
-
|
|
143
|
+
full-store scans, one encrypted row write per commit (edits that arrive during a
|
|
144
|
+
commit coalesce, so at most 60), and under 120 KB of encoded state. Observer
|
|
145
|
+
reload, worker restart, HttpOnly and partitioned events are exercised in real
|
|
138
146
|
Chrome. Timing/CPU observations describe this local workload, not a universal
|
|
139
147
|
website latency guarantee.
|
|
@@ -48,7 +48,10 @@ the nearest whole window point, the only positions a native view can take.
|
|
|
48
48
|
The view paints its own white page background, so the box under it paints
|
|
49
49
|
nothing. A hidden tab's view stays in its window, invisible. Only the
|
|
50
50
|
renderer that created a tab can update, command, capture, or destroy it, and
|
|
51
|
-
its tabs close when that renderer navigates away or is destroyed.
|
|
51
|
+
its tabs close when that renderer navigates away or is destroyed. Capture
|
|
52
|
+
returns the tab's current frame as a JPEG, or `null` when the tab paints no
|
|
53
|
+
frame within two seconds. The first frame after a move or resize takes a few
|
|
54
|
+
hundred milliseconds; the renderer decides how long to wait for it. Commands are
|
|
52
55
|
navigate, back, forward, reload, focus, find, stop-find, and zoom. The preload
|
|
53
56
|
reports `capabilities.version` 2 for this contract.
|
|
54
57
|
|
package/docs/TESTING.md
CHANGED
|
@@ -51,8 +51,9 @@ through the MCP adapter against a public site. It checks that:
|
|
|
51
51
|
- repeated login activation preserves the page, terminal states remain final,
|
|
52
52
|
and recorded imagery can be decoded.
|
|
53
53
|
|
|
54
|
-
CI provisions Chrome for Testing
|
|
55
|
-
|
|
54
|
+
CI runs this suite on Linux and Windows and provisions Chrome for Testing
|
|
55
|
+
through the locked `agent-browser` dependency first. Mocks cannot validate
|
|
56
|
+
these paths.
|
|
56
57
|
|
|
57
58
|
UI's `test:browser` source examination additionally drives its canonical web
|
|
58
59
|
and Electron browser surfaces through the actual UI routes and Shell gateway.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@amalgm/browser",
|
|
3
|
-
"version": "0.1.2-preview.
|
|
3
|
+
"version": "0.1.2-preview.37260290026",
|
|
4
4
|
"description": "The amalgm runtime's browser: one Chrome, a session per chat, and the account's cookies in every view.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -126,7 +126,8 @@
|
|
|
126
126
|
"workflow": "verify.yml",
|
|
127
127
|
"jobs": [
|
|
128
128
|
"verify",
|
|
129
|
-
"real-browser"
|
|
129
|
+
"real-browser (ubuntu-latest)",
|
|
130
|
+
"real-browser (windows-latest)"
|
|
130
131
|
],
|
|
131
132
|
"verify": "verify",
|
|
132
133
|
"cli": [
|
|
@@ -150,11 +151,11 @@
|
|
|
150
151
|
"@amalgm/core"
|
|
151
152
|
]
|
|
152
153
|
},
|
|
153
|
-
"gitHead": "
|
|
154
|
+
"gitHead": "5b9405b042dd733fff2508c41011e674b004e85c",
|
|
154
155
|
"amalgmSource": {
|
|
155
156
|
"repository": "amalgm-inc/amalgm-browser",
|
|
156
157
|
"branch": "preview",
|
|
157
|
-
"commit": "
|
|
158
|
-
"occurrence": "
|
|
158
|
+
"commit": "5b9405b042dd733fff2508c41011e674b004e85c",
|
|
159
|
+
"occurrence": "37260290026"
|
|
159
160
|
}
|
|
160
161
|
}
|