@mercuryo-ai/agentbrowse 0.2.60 → 0.2.61
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/README.md +30 -5
- package/dist/browser-session-state.d.ts +39 -0
- package/dist/browser-session-state.d.ts.map +1 -1
- package/dist/browser-session-state.js +63 -1
- package/dist/commands/act.d.ts.map +1 -1
- package/dist/commands/act.js +539 -535
- package/dist/commands/attach.d.ts.map +1 -1
- package/dist/commands/attach.js +5 -10
- package/dist/commands/browser-connection-failure.d.ts +9 -0
- package/dist/commands/browser-connection-failure.d.ts.map +1 -0
- package/dist/commands/browser-connection-failure.js +15 -0
- package/dist/commands/browser-status.d.ts.map +1 -1
- package/dist/commands/browser-status.js +26 -30
- package/dist/commands/close.d.ts.map +1 -1
- package/dist/commands/close.js +5 -0
- package/dist/commands/extract.d.ts.map +1 -1
- package/dist/commands/extract.js +147 -144
- package/dist/commands/launch.d.ts.map +1 -1
- package/dist/commands/launch.js +11 -8
- package/dist/commands/navigate.d.ts.map +1 -1
- package/dist/commands/navigate.js +79 -73
- package/dist/commands/observe-inventory.d.ts +1 -0
- package/dist/commands/observe-inventory.d.ts.map +1 -1
- package/dist/commands/observe-inventory.js +15 -3
- package/dist/commands/observe.d.ts.map +1 -1
- package/dist/commands/observe.js +260 -272
- package/dist/commands/screenshot.d.ts.map +1 -1
- package/dist/commands/screenshot.js +50 -64
- package/dist/library.d.ts +2 -1
- package/dist/library.d.ts.map +1 -1
- package/dist/library.js +2 -1
- package/dist/protected-fill.d.ts.map +1 -1
- package/dist/protected-fill.js +46 -7
- package/dist/sticky-owner-host-entry.d.ts +2 -0
- package/dist/sticky-owner-host-entry.d.ts.map +1 -0
- package/dist/sticky-owner-host-entry.js +97 -0
- package/dist/sticky-owner.d.ts +15 -0
- package/dist/sticky-owner.d.ts.map +1 -0
- package/dist/sticky-owner.js +431 -0
- package/docs/configuration.md +36 -4
- package/docs/getting-started.md +28 -4
- package/docs/troubleshooting.md +42 -6
- package/package.json +1 -1
- package/dist/protected-fill-browser.d.ts +0 -22
- package/dist/protected-fill-browser.d.ts.map +0 -1
- package/dist/protected-fill-browser.js +0 -52
|
@@ -6,8 +6,10 @@ import { getProtectedExposure } from '../runtime-protected-state.js';
|
|
|
6
6
|
import { saveSession } from '../session.js';
|
|
7
7
|
import { outputFailure, outputJSON, outputContractFailure, info } from '../output.js';
|
|
8
8
|
import { captureDiagnosticSnapshotBestEffort, finishDiagnosticStepBestEffort, recordCommandLifecycleEventBestEffort, startDiagnosticStep, } from '../diagnostics.js';
|
|
9
|
-
import {
|
|
9
|
+
import { resolveCurrentPageContext, syncSessionPage } from '../playwright-runtime.js';
|
|
10
10
|
import { buildProtectedScreenshotBlockedResult, } from '../secrets/protected-artifact-guard.js';
|
|
11
|
+
import { describeBrowserConnectionFailure } from './browser-connection-failure.js';
|
|
12
|
+
import { withStickyOwnerBrowser } from '../sticky-owner.js';
|
|
11
13
|
/** Stable top-level error codes returned by `screenshot(...)`. */
|
|
12
14
|
export const SCREENSHOT_ERROR_CODES = [
|
|
13
15
|
'browser_connection_failed',
|
|
@@ -172,81 +174,65 @@ export async function screenshotBrowser(session, filePath) {
|
|
|
172
174
|
protectedStep: Boolean(initialProtectedExposure),
|
|
173
175
|
},
|
|
174
176
|
});
|
|
175
|
-
let browser = null;
|
|
176
|
-
let failureMessage = null;
|
|
177
|
-
let page = null;
|
|
178
177
|
try {
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
178
|
+
return await withStickyOwnerBrowser(session, async (browser) => {
|
|
179
|
+
try {
|
|
180
|
+
const resolvedPage = await resolveCurrentPageContext(browser, session);
|
|
181
|
+
pageRef = resolvedPage.pageRef;
|
|
182
|
+
const page = resolvedPage.page;
|
|
183
|
+
const recoveredProtectedExposure = getProtectedExposure(session, pageRef) ?? (!page ? initialProtectedExposure : null);
|
|
184
|
+
if (recoveredProtectedExposure) {
|
|
185
|
+
if (page && pageRef !== initialPageRef) {
|
|
186
|
+
setCurrentPage(session, pageRef);
|
|
187
|
+
}
|
|
188
|
+
return buildScreenshotFailureResult(session, {
|
|
189
|
+
step: screenshotStepHandle,
|
|
190
|
+
...buildProtectedScreenshotBlockedResult(recoveredProtectedExposure),
|
|
191
|
+
runId: session.activeRunId,
|
|
192
|
+
stepId: screenshotStep?.stepId,
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
if (!page) {
|
|
196
|
+
throw new Error('no_open_pages');
|
|
197
|
+
}
|
|
198
|
+
await page.screenshot({ path: outputPath });
|
|
199
|
+
const { url, title } = await syncSessionPage(session, pageRef, page);
|
|
200
|
+
setCurrentPage(session, pageRef);
|
|
201
|
+
return buildScreenshotSuccessResult({
|
|
202
|
+
session,
|
|
203
|
+
step: screenshotStepHandle,
|
|
204
|
+
runId: session.activeRunId,
|
|
205
|
+
stepId: screenshotStep?.stepId,
|
|
206
|
+
pageRef,
|
|
207
|
+
path: outputPath,
|
|
208
|
+
url,
|
|
209
|
+
title,
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
throw new Error(`screenshot_failed:${error instanceof Error ? error.message : String(error)}`);
|
|
214
|
+
}
|
|
190
215
|
});
|
|
191
216
|
}
|
|
192
|
-
try {
|
|
193
|
-
const resolvedPage = await resolveCurrentPageContext(browser, session);
|
|
194
|
-
pageRef = resolvedPage.pageRef;
|
|
195
|
-
page = resolvedPage.page;
|
|
196
|
-
}
|
|
197
217
|
catch (err) {
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
setCurrentPage(session, pageRef);
|
|
204
|
-
}
|
|
205
|
-
if (browser) {
|
|
206
|
-
await disconnectPlaywright(browser);
|
|
207
|
-
browser = null;
|
|
208
|
-
}
|
|
209
|
-
return buildScreenshotFailureResult(session, {
|
|
210
|
-
step: screenshotStepHandle,
|
|
211
|
-
...buildProtectedScreenshotBlockedResult(recoveredProtectedExposure),
|
|
212
|
-
runId: session.activeRunId,
|
|
213
|
-
stepId: screenshotStep?.stepId,
|
|
218
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
219
|
+
const isCommandFailure = reason.startsWith('screenshot_failed:');
|
|
220
|
+
const browserConnectionFailure = describeBrowserConnectionFailure(err, {
|
|
221
|
+
defaultMessage: 'Screenshot capture could not start because AgentBrowse failed to connect to the browser.',
|
|
222
|
+
unrecoverableSessionMessage: 'Screenshot capture could not start because the previous browser session is no longer reachable.',
|
|
214
223
|
});
|
|
215
|
-
}
|
|
216
|
-
try {
|
|
217
|
-
if (!page) {
|
|
218
|
-
throw new Error(failureMessage?.replace(/^Screenshot failed:\s*/, '') ?? 'no_open_pages');
|
|
219
|
-
}
|
|
220
|
-
await page.screenshot({ path: outputPath });
|
|
221
|
-
const { url, title } = await syncSessionPage(session, pageRef, page);
|
|
222
|
-
setCurrentPage(session, pageRef);
|
|
223
|
-
return buildScreenshotSuccessResult({
|
|
224
|
-
session,
|
|
225
|
-
step: screenshotStepHandle,
|
|
226
|
-
runId: session.activeRunId,
|
|
227
|
-
stepId: screenshotStep?.stepId,
|
|
228
|
-
pageRef,
|
|
229
|
-
path: outputPath,
|
|
230
|
-
url,
|
|
231
|
-
title,
|
|
232
|
-
});
|
|
233
|
-
}
|
|
234
|
-
catch (err) {
|
|
235
224
|
return buildScreenshotContractFailureResult(session, {
|
|
236
225
|
step: screenshotStepHandle,
|
|
237
|
-
error: 'screenshot_failed',
|
|
226
|
+
error: isCommandFailure ? 'screenshot_failed' : 'browser_connection_failed',
|
|
238
227
|
outcomeType: 'blocked',
|
|
239
|
-
message: 'Screenshot capture failed.',
|
|
240
|
-
reason:
|
|
228
|
+
message: isCommandFailure ? 'Screenshot capture failed.' : browserConnectionFailure.message,
|
|
229
|
+
reason: isCommandFailure
|
|
230
|
+
? reason.replace(/^screenshot_failed:/, '')
|
|
231
|
+
: browserConnectionFailure.reason,
|
|
241
232
|
runId: session.activeRunId,
|
|
242
233
|
stepId: screenshotStep?.stepId,
|
|
243
234
|
});
|
|
244
235
|
}
|
|
245
|
-
finally {
|
|
246
|
-
if (browser) {
|
|
247
|
-
await disconnectPlaywright(browser);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
236
|
}
|
|
251
237
|
/** CLI wrapper for `screenshotBrowser(...)` that persists session changes and writes JSON output. */
|
|
252
238
|
export async function screenshot(session, filePath) {
|
package/dist/library.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { createBrowserSessionStore, deleteBrowserSession, getSessionPort, isAttachedSession, isOwnedSession, isSessionAlive, loadBrowserSession, resolveBrowserSessionId, saveBrowserSession, serializeBrowserSession, supportsCaptchaSolve, buildAttachedSession, buildOwnedSession, type BrowserSessionCapabilities, type BrowserSessionStore, type BrowserSessionState, type BrowseSessionIdentity, type BrowseSessionTransport, } from './browser-session-state.js';
|
|
1
|
+
export { createBrowserSessionStore, deleteBrowserSession, getSessionPort, isAttachedSession, isOwnedSession, isSessionAlive, loadBrowserSession, resolveBrowserSessionId, saveBrowserSession, serializeBrowserSession, supportsCaptchaSolve, buildAttachedSession, buildOwnedSession, buildStickyOwnerMetadata, canPersistStickyOwnerMetadata, type BrowserSessionCapabilities, type BrowserSessionStore, type BrowserSessionState, type BrowseSessionIdentity, type BrowseSessionTransport, type StickyOwnerInProcessTransport, type StickyOwnerMetadata, type StickyOwnerPlaywrightBindTransport, type StickyOwnerState, type StickyOwnerTransport, STICKY_OWNER_SCHEMA_VERSION, } from './browser-session-state.js';
|
|
2
2
|
export { attach, ATTACH_ERROR_CODES, ATTACH_OUTCOME_TYPES, type AttachErrorCode, type AttachFailureResult, type AttachOutcomeType, type AttachOptions, type AttachResult, type AttachSuccessResult, } from './commands/attach.js';
|
|
3
3
|
export { AgentbrowseAssistiveRuntimeMissingError, AssistiveStructuredOutputTruncatedError, configureAgentbrowseAssistiveRuntime, resetAgentbrowseAssistiveRuntime, type AgentbrowseAssistiveChatCompletionOptions, type AgentbrowseAssistiveChatCompletionRequest, type AgentbrowseAssistiveChatCompletionResult, type AgentbrowseAssistiveChatMessage, type AgentbrowseAssistiveImageInput, type AgentbrowseAssistiveLlmClient, type AgentbrowseAssistiveLlmUsage, type AgentbrowseAssistiveMessageContentPart, type AgentbrowseAssistiveResponseModel, type AgentbrowseAssistiveRuntime, } from './assistive-runtime.js';
|
|
4
4
|
export { createAgentbrowseClient, type AgentbrowseClient, type AgentbrowseClientOptions, } from './client.js';
|
|
@@ -13,6 +13,7 @@ export { observeBrowser as observe, OBSERVE_ERROR_CODES, OBSERVE_OUTCOME_TYPES,
|
|
|
13
13
|
export { classifyObservePageState, shouldSuppressFillableFormsForObserve, type ObservePageState, } from './commands/observe-page-state.js';
|
|
14
14
|
export { resolveObservedField, type ObservedFieldCandidate, type ObservedFieldValueSource, type ObservedFieldValueType, type ResolveObservedFieldOptions, type ResolveObservedFieldResult, } from './secrets/observed-field-resolution.js';
|
|
15
15
|
export { close, CLOSE_ERROR_CODES, CLOSE_OUTCOME_TYPES, type CloseErrorCode, type CloseFailureResult, type CloseOutcomeType, type CloseResult, type CloseSuccessResult, } from './commands/close.js';
|
|
16
|
+
export { restoreBrowserSessionOwner, type RestoreBrowserSessionOwnerResult, } from './sticky-owner.js';
|
|
16
17
|
export { launch, LAUNCH_ERROR_CODES, LAUNCH_OUTCOME_TYPES, type LaunchErrorCode, type LaunchOptions, type LaunchFailureResult, type LaunchOutcomeType, type LaunchResult, type LaunchSuccessResult, } from './commands/launch.js';
|
|
17
18
|
export { navigateBrowser as navigate, NAVIGATE_ERROR_CODES, NAVIGATE_OUTCOME_TYPES, type NavigateErrorCode, type NavigateFailureResult, type NavigateOutcomeType, type NavigateResult, type NavigateSuccessResult, } from './commands/navigate.js';
|
|
18
19
|
export { screenshotBrowser as screenshot, SCREENSHOT_ERROR_CODES, SCREENSHOT_OUTCOME_TYPES, type ScreenshotErrorCode, type ScreenshotFailureResult, type ScreenshotOutcomeType, type ScreenshotResult, type ScreenshotSuccessResult, } from './commands/screenshot.js';
|
package/dist/library.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"library.d.ts","sourceRoot":"","sources":["../src/library.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"library.d.ts","sourceRoot":"","sources":["../src/library.ts"],"names":[],"mappings":"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"}
|
package/dist/library.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { createBrowserSessionStore, deleteBrowserSession, getSessionPort, isAttachedSession, isOwnedSession, isSessionAlive, loadBrowserSession, resolveBrowserSessionId, saveBrowserSession, serializeBrowserSession, supportsCaptchaSolve, buildAttachedSession, buildOwnedSession, } from './browser-session-state.js';
|
|
1
|
+
export { createBrowserSessionStore, deleteBrowserSession, getSessionPort, isAttachedSession, isOwnedSession, isSessionAlive, loadBrowserSession, resolveBrowserSessionId, saveBrowserSession, serializeBrowserSession, supportsCaptchaSolve, buildAttachedSession, buildOwnedSession, buildStickyOwnerMetadata, canPersistStickyOwnerMetadata, STICKY_OWNER_SCHEMA_VERSION, } from './browser-session-state.js';
|
|
2
2
|
export { attach, ATTACH_ERROR_CODES, ATTACH_OUTCOME_TYPES, } from './commands/attach.js';
|
|
3
3
|
export { AgentbrowseAssistiveRuntimeMissingError, AssistiveStructuredOutputTruncatedError, configureAgentbrowseAssistiveRuntime, resetAgentbrowseAssistiveRuntime, } from './assistive-runtime.js';
|
|
4
4
|
export { createAgentbrowseClient, } from './client.js';
|
|
@@ -11,6 +11,7 @@ export { observeBrowser as observe, OBSERVE_ERROR_CODES, OBSERVE_OUTCOME_TYPES,
|
|
|
11
11
|
export { classifyObservePageState, shouldSuppressFillableFormsForObserve, } from './commands/observe-page-state.js';
|
|
12
12
|
export { resolveObservedField, } from './secrets/observed-field-resolution.js';
|
|
13
13
|
export { close, CLOSE_ERROR_CODES, CLOSE_OUTCOME_TYPES, } from './commands/close.js';
|
|
14
|
+
export { restoreBrowserSessionOwner, } from './sticky-owner.js';
|
|
14
15
|
export { launch, LAUNCH_ERROR_CODES, LAUNCH_OUTCOME_TYPES, } from './commands/launch.js';
|
|
15
16
|
export { navigateBrowser as navigate, NAVIGATE_ERROR_CODES, NAVIGATE_OUTCOME_TYPES, } from './commands/navigate.js';
|
|
16
17
|
export { screenshotBrowser as screenshot, SCREENSHOT_ERROR_CODES, SCREENSHOT_OUTCOME_TYPES, } from './commands/screenshot.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"protected-fill.d.ts","sourceRoot":"","sources":["../src/protected-fill.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"protected-fill.d.ts","sourceRoot":"","sources":["../src/protected-fill.ts"],"names":[],"mappings":"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"}
|
package/dist/protected-fill.js
CHANGED
|
@@ -1,13 +1,52 @@
|
|
|
1
|
-
import { fillProtectedFormBrowser, } from './protected-fill-browser.js';
|
|
2
1
|
import { buildProtectedExactValueProfile as buildProtectedExactValueProfileInternal } from './secrets/protected-exact-value-redaction.js';
|
|
2
|
+
import { executeProtectedFill } from './secrets/protected-fill.js';
|
|
3
|
+
import { resolvePageByRef, syncSessionPage } from './playwright-runtime.js';
|
|
4
|
+
import { withStickyOwnerBrowser } from './sticky-owner.js';
|
|
3
5
|
/** Fills a previously observed protected form with caller-provided protected values. */
|
|
4
6
|
export async function fillProtectedForm(params) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
try {
|
|
8
|
+
return await withStickyOwnerBrowser(params.session, async (browser) => {
|
|
9
|
+
try {
|
|
10
|
+
const page = await resolvePageByRef(browser, params.session, params.fillableForm.pageRef).catch((error) => {
|
|
11
|
+
throw new Error(error instanceof Error ? error.message : String(error));
|
|
12
|
+
});
|
|
13
|
+
const { url, title } = await syncSessionPage(params.session, params.fillableForm.pageRef, page);
|
|
14
|
+
const execution = await executeProtectedFill({
|
|
15
|
+
session: params.session,
|
|
16
|
+
page,
|
|
17
|
+
fillableForm: params.fillableForm,
|
|
18
|
+
protectedValues: Object.fromEntries(Object.entries(params.protectedValues).filter((entry) => {
|
|
19
|
+
const value = entry[1];
|
|
20
|
+
return typeof value === 'string' && value.length > 0;
|
|
21
|
+
})),
|
|
22
|
+
fieldPolicies: params.fieldPolicies,
|
|
23
|
+
});
|
|
24
|
+
return {
|
|
25
|
+
success: true,
|
|
26
|
+
pageRef: params.fillableForm.pageRef,
|
|
27
|
+
url,
|
|
28
|
+
title,
|
|
29
|
+
execution,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
return {
|
|
34
|
+
success: false,
|
|
35
|
+
error: 'page_resolution_failed',
|
|
36
|
+
message: 'Protected fill could not resolve the target page in the browser.',
|
|
37
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
return {
|
|
44
|
+
success: false,
|
|
45
|
+
error: 'browser_connection_failed',
|
|
46
|
+
message: 'Protected fill could not reach the browser session.',
|
|
47
|
+
reason: error instanceof Error ? error.message : String(error),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
11
50
|
}
|
|
12
51
|
export function buildProtectedExposureArtifacts(params) {
|
|
13
52
|
const filteredProtectedValues = Object.fromEntries(Object.entries(params.protectedValues).filter((entry) => {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sticky-owner-host-entry.d.ts","sourceRoot":"","sources":["../src/sticky-owner-host-entry.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { existsSync, rmSync, statSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { connectPlaywright, disconnectPlaywright } from './playwright-runtime.js';
|
|
3
|
+
function readArgValue(argv, name) {
|
|
4
|
+
const index = argv.indexOf(name);
|
|
5
|
+
const value = index >= 0 ? argv[index + 1] : undefined;
|
|
6
|
+
if (!value || value.startsWith('--')) {
|
|
7
|
+
throw new Error(`Missing ${name} argument.`);
|
|
8
|
+
}
|
|
9
|
+
return value;
|
|
10
|
+
}
|
|
11
|
+
function parseArgs(argv = process.argv) {
|
|
12
|
+
const ttlRaw = readArgValue(argv, '--ttl-ms');
|
|
13
|
+
const ttlMs = Number(ttlRaw);
|
|
14
|
+
if (!Number.isFinite(ttlMs) || ttlMs <= 0) {
|
|
15
|
+
throw new Error('Invalid --ttl-ms argument.');
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
manifestPath: readArgValue(argv, '--manifest'),
|
|
19
|
+
cdpUrl: readArgValue(argv, '--cdp-url'),
|
|
20
|
+
hostId: readArgValue(argv, '--host-id'),
|
|
21
|
+
browserSessionId: readArgValue(argv, '--browser-session-id'),
|
|
22
|
+
touchPath: readArgValue(argv, '--touch-path'),
|
|
23
|
+
ttlMs,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function touchLeaseFile(path) {
|
|
27
|
+
writeFileSync(path, new Date().toISOString());
|
|
28
|
+
}
|
|
29
|
+
function readLeaseAgeMs(path) {
|
|
30
|
+
if (!existsSync(path)) {
|
|
31
|
+
return Number.POSITIVE_INFINITY;
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
return Math.max(0, Date.now() - statSync(path).mtimeMs);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return Number.POSITIVE_INFINITY;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
async function main() {
|
|
41
|
+
const args = parseArgs();
|
|
42
|
+
const browser = await connectPlaywright(args.cdpUrl);
|
|
43
|
+
const binding = await browser.bind(args.hostId, {
|
|
44
|
+
metadata: {
|
|
45
|
+
hostId: args.hostId,
|
|
46
|
+
browserSessionId: args.browserSessionId,
|
|
47
|
+
pid: process.pid,
|
|
48
|
+
startedAt: new Date().toISOString(),
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
touchLeaseFile(args.touchPath);
|
|
52
|
+
writeFileSync(args.manifestPath, JSON.stringify({
|
|
53
|
+
endpoint: binding.endpoint,
|
|
54
|
+
pid: process.pid,
|
|
55
|
+
startedAt: new Date().toISOString(),
|
|
56
|
+
}, null, 2));
|
|
57
|
+
let shuttingDown = false;
|
|
58
|
+
let ttlInterval = null;
|
|
59
|
+
const shutdown = async () => {
|
|
60
|
+
if (shuttingDown) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
shuttingDown = true;
|
|
64
|
+
if (ttlInterval) {
|
|
65
|
+
clearInterval(ttlInterval);
|
|
66
|
+
ttlInterval = null;
|
|
67
|
+
}
|
|
68
|
+
await browser.unbind().catch(() => undefined);
|
|
69
|
+
await disconnectPlaywright(browser).catch(() => undefined);
|
|
70
|
+
rmSync(args.touchPath, { force: true });
|
|
71
|
+
process.exit(0);
|
|
72
|
+
};
|
|
73
|
+
const reapExpiredOwner = () => {
|
|
74
|
+
if (readLeaseAgeMs(args.touchPath) >= args.ttlMs) {
|
|
75
|
+
void shutdown();
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
browser.on('disconnected', () => {
|
|
79
|
+
void shutdown();
|
|
80
|
+
});
|
|
81
|
+
process.on('SIGINT', () => {
|
|
82
|
+
void shutdown();
|
|
83
|
+
});
|
|
84
|
+
process.on('SIGTERM', () => {
|
|
85
|
+
void shutdown();
|
|
86
|
+
});
|
|
87
|
+
const ttlCheckMs = Math.max(5_000, Math.min(Math.floor(args.ttlMs / 6), 60_000));
|
|
88
|
+
ttlInterval = setInterval(reapExpiredOwner, ttlCheckMs);
|
|
89
|
+
ttlInterval.unref?.();
|
|
90
|
+
reapExpiredOwner();
|
|
91
|
+
await new Promise(() => { });
|
|
92
|
+
}
|
|
93
|
+
void main().catch((error) => {
|
|
94
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
95
|
+
console.error(message);
|
|
96
|
+
process.exit(1);
|
|
97
|
+
});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type Browser } from 'playwright-core';
|
|
2
|
+
import { type BrowserSessionState } from './browser-session-state.js';
|
|
3
|
+
export type RestoreBrowserSessionOwnerResult = {
|
|
4
|
+
success: true;
|
|
5
|
+
session: BrowserSessionState;
|
|
6
|
+
restored: boolean;
|
|
7
|
+
} | {
|
|
8
|
+
success: false;
|
|
9
|
+
reason: 'sticky_owner_unrecoverable';
|
|
10
|
+
};
|
|
11
|
+
export declare function initializeBrowserSessionOwner(session: BrowserSessionState): Promise<BrowserSessionState>;
|
|
12
|
+
export declare function terminateBrowserSessionOwner(session: BrowserSessionState | null): Promise<void>;
|
|
13
|
+
export declare function restoreBrowserSessionOwner(session: BrowserSessionState): Promise<RestoreBrowserSessionOwnerResult>;
|
|
14
|
+
export declare function withStickyOwnerBrowser<TResult>(session: BrowserSessionState, operation: (browser: Browser) => Promise<TResult>): Promise<TResult>;
|
|
15
|
+
//# sourceMappingURL=sticky-owner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sticky-owner.d.ts","sourceRoot":"","sources":["../src/sticky-owner.ts"],"names":[],"mappings":"AAMA,OAAO,EAAY,KAAK,OAAO,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAIL,KAAK,mBAAmB,EAGzB,MAAM,4BAA4B,CAAC;AAWpC,MAAM,MAAM,gCAAgC,GACxC;IACE,OAAO,EAAE,IAAI,CAAC;IACd,OAAO,EAAE,mBAAmB,CAAC;IAC7B,QAAQ,EAAE,OAAO,CAAC;CACnB,GACD;IACE,OAAO,EAAE,KAAK,CAAC;IACf,MAAM,EAAE,4BAA4B,CAAC;CACtC,CAAC;AAyVN,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,mBAAmB,CAAC,CAU9B;AAED,wBAAsB,4BAA4B,CAChD,OAAO,EAAE,mBAAmB,GAAG,IAAI,GAClC,OAAO,CAAC,IAAI,CAAC,CA2Bf;AAED,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,gCAAgC,CAAC,CAiG3C;AAED,wBAAsB,sBAAsB,CAAC,OAAO,EAClD,OAAO,EAAE,mBAAmB,EAC5B,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,GAChD,OAAO,CAAC,OAAO,CAAC,CA0BlB"}
|