browser-debugger-cli 0.2.0 → 0.5.1
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 +137 -126
- package/dist/__tests__/fixtures/schema-v0.2.1.golden.json +47 -0
- package/dist/__tests__/schema.contract.test.d.ts +19 -0
- package/dist/__tests__/schema.contract.test.d.ts.map +1 -0
- package/dist/__tests__/schema.contract.test.js +236 -0
- package/dist/__tests__/schema.contract.test.js.map +1 -0
- package/dist/__tests__/smoke/error-handling.smoke.test.d.ts +8 -0
- package/dist/__tests__/smoke/error-handling.smoke.test.d.ts.map +1 -0
- package/dist/__tests__/smoke/error-handling.smoke.test.js +106 -0
- package/dist/__tests__/smoke/error-handling.smoke.test.js.map +1 -0
- package/dist/__tests__/smoke/session-lifecycle.smoke.test.d.ts +8 -0
- package/dist/__tests__/smoke/session-lifecycle.smoke.test.d.ts.map +1 -0
- package/dist/__tests__/smoke/session-lifecycle.smoke.test.js +109 -0
- package/dist/__tests__/smoke/session-lifecycle.smoke.test.js.map +1 -0
- package/dist/__testutils__/commandRunner.d.ts +45 -0
- package/dist/__testutils__/commandRunner.d.ts.map +1 -0
- package/dist/__testutils__/commandRunner.js +108 -0
- package/dist/__testutils__/commandRunner.js.map +1 -0
- package/dist/__testutils__/daemonHelpers.d.ts +81 -0
- package/dist/__testutils__/daemonHelpers.d.ts.map +1 -0
- package/dist/__testutils__/daemonHelpers.js +206 -0
- package/dist/__testutils__/daemonHelpers.js.map +1 -0
- package/dist/__testutils__/index.d.ts +1 -0
- package/dist/__testutils__/index.d.ts.map +1 -1
- package/dist/__testutils__/index.js +1 -0
- package/dist/__testutils__/index.js.map +1 -1
- package/dist/__testutils__/testCleanup.d.ts +45 -0
- package/dist/__testutils__/testCleanup.d.ts.map +1 -0
- package/dist/__testutils__/testCleanup.js +87 -0
- package/dist/__testutils__/testCleanup.js.map +1 -0
- package/dist/__testutils__/testHome.d.ts +26 -0
- package/dist/__testutils__/testHome.d.ts.map +1 -0
- package/dist/__testutils__/testHome.js +57 -0
- package/dist/__testutils__/testHome.js.map +1 -0
- package/dist/__testutils__/testProcess.d.ts.map +1 -1
- package/dist/__testutils__/testProcess.js +11 -3
- package/dist/__testutils__/testProcess.js.map +1 -1
- package/dist/cli/commands/__tests__/start.unit.test.d.ts +2 -0
- package/dist/cli/commands/__tests__/start.unit.test.d.ts.map +1 -0
- package/dist/cli/commands/__tests__/start.unit.test.js +131 -0
- package/dist/cli/commands/__tests__/start.unit.test.js.map +1 -0
- package/dist/cli/commands/cleanup.d.ts +1 -0
- package/dist/cli/commands/cleanup.d.ts.map +1 -1
- package/dist/cli/commands/cleanup.js +80 -61
- package/dist/cli/commands/cleanup.js.map +1 -1
- package/dist/cli/commands/details.d.ts +2 -1
- package/dist/cli/commands/details.d.ts.map +1 -1
- package/dist/cli/commands/details.js +104 -52
- package/dist/cli/commands/details.js.map +1 -1
- package/dist/cli/commands/peek.d.ts +2 -1
- package/dist/cli/commands/peek.d.ts.map +1 -1
- package/dist/cli/commands/peek.js +22 -67
- package/dist/cli/commands/peek.js.map +1 -1
- package/dist/cli/commands/query.d.ts +9 -0
- package/dist/cli/commands/query.d.ts.map +1 -0
- package/dist/cli/commands/query.js +125 -0
- package/dist/cli/commands/query.js.map +1 -0
- package/dist/cli/commands/start.d.ts +74 -0
- package/dist/cli/commands/start.d.ts.map +1 -1
- package/dist/cli/commands/start.js +147 -38
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +37 -49
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/stop.d.ts +1 -0
- package/dist/cli/commands/stop.d.ts.map +1 -1
- package/dist/cli/commands/stop.js +106 -120
- package/dist/cli/commands/stop.js.map +1 -1
- package/dist/cli/formatters/detailsFormatter.d.ts +1 -1
- package/dist/cli/formatters/previewFormatter.d.ts +7 -7
- package/dist/cli/formatters/previewFormatter.d.ts.map +1 -1
- package/dist/cli/formatters/previewFormatter.js +5 -10
- package/dist/cli/formatters/previewFormatter.js.map +1 -1
- package/dist/cli/formatters/statusFormatter.d.ts +13 -10
- package/dist/cli/formatters/statusFormatter.d.ts.map +1 -1
- package/dist/cli/formatters/statusFormatter.js +26 -53
- package/dist/cli/formatters/statusFormatter.js.map +1 -1
- package/dist/cli/handlers/ChromeBootstrap.d.ts +24 -0
- package/dist/cli/handlers/ChromeBootstrap.d.ts.map +1 -0
- package/dist/cli/handlers/ChromeBootstrap.js +50 -0
- package/dist/cli/handlers/ChromeBootstrap.js.map +1 -0
- package/dist/cli/handlers/OutputBuilder.d.ts +2 -3
- package/dist/cli/handlers/OutputBuilder.d.ts.map +1 -1
- package/dist/cli/handlers/OutputBuilder.js +2 -4
- package/dist/cli/handlers/OutputBuilder.js.map +1 -1
- package/dist/cli/handlers/OutputWriter.d.ts +15 -0
- package/dist/cli/handlers/OutputWriter.d.ts.map +1 -0
- package/dist/cli/handlers/OutputWriter.js +34 -0
- package/dist/cli/handlers/OutputWriter.js.map +1 -0
- package/dist/cli/handlers/PreviewWriter.d.ts +52 -0
- package/dist/cli/handlers/PreviewWriter.d.ts.map +1 -0
- package/dist/cli/handlers/PreviewWriter.js +118 -0
- package/dist/cli/handlers/PreviewWriter.js.map +1 -0
- package/dist/cli/handlers/SessionLock.d.ts +16 -0
- package/dist/cli/handlers/SessionLock.d.ts.map +1 -0
- package/dist/cli/handlers/SessionLock.js +35 -0
- package/dist/cli/handlers/SessionLock.js.map +1 -0
- package/dist/cli/handlers/SessionLoop.d.ts +19 -0
- package/dist/cli/handlers/SessionLoop.d.ts.map +1 -0
- package/dist/cli/handlers/SessionLoop.js +47 -0
- package/dist/cli/handlers/SessionLoop.js.map +1 -0
- package/dist/cli/handlers/ShutdownController.d.ts +41 -0
- package/dist/cli/handlers/ShutdownController.d.ts.map +1 -0
- package/dist/cli/handlers/ShutdownController.js +94 -0
- package/dist/cli/handlers/ShutdownController.js.map +1 -0
- package/dist/cli/handlers/SignalHandler.d.ts +35 -0
- package/dist/cli/handlers/SignalHandler.d.ts.map +1 -0
- package/dist/cli/handlers/SignalHandler.js +81 -0
- package/dist/cli/handlers/SignalHandler.js.map +1 -0
- package/dist/cli/handlers/TargetSetup.d.ts +42 -0
- package/dist/cli/handlers/TargetSetup.d.ts.map +1 -0
- package/dist/cli/handlers/TargetSetup.js +87 -0
- package/dist/cli/handlers/TargetSetup.js.map +1 -0
- package/dist/cli/handlers/sessionController.d.ts +41 -0
- package/dist/cli/handlers/sessionController.d.ts.map +1 -1
- package/dist/cli/handlers/sessionController.js +266 -5
- package/dist/cli/handlers/sessionController.js.map +1 -1
- package/dist/cli/registry.d.ts +2 -2
- package/dist/cli/registry.d.ts.map +1 -1
- package/dist/cli/registry.js +12 -37
- package/dist/cli/registry.js.map +1 -1
- package/dist/collectors/console.d.ts +1 -1
- package/dist/collectors/console.js +2 -2
- package/dist/collectors/console.js.map +1 -1
- package/dist/collectors/dom.d.ts +1 -1
- package/dist/collectors/network.d.ts +1 -2
- package/dist/collectors/network.d.ts.map +1 -1
- package/dist/collectors/network.js +3 -3
- package/dist/collectors/network.js.map +1 -1
- package/dist/commands/__tests__/cdp.contract.test.d.ts.map +1 -1
- package/dist/commands/__tests__/cdp.contract.test.js +0 -1
- package/dist/commands/__tests__/cdp.contract.test.js.map +1 -1
- package/dist/commands/__tests__/domEval.contract.test.d.ts +17 -0
- package/dist/commands/__tests__/domEval.contract.test.d.ts.map +1 -0
- package/dist/commands/__tests__/domEval.contract.test.js +231 -0
- package/dist/commands/__tests__/domEval.contract.test.js.map +1 -0
- package/dist/commands/cdp.js +1 -1
- package/dist/commands/cdp.js.map +1 -1
- package/dist/commands/cleanup.d.ts.map +1 -1
- package/dist/commands/cleanup.js +51 -13
- package/dist/commands/cleanup.js.map +1 -1
- package/dist/commands/console.d.ts.map +1 -1
- package/dist/commands/console.js +8 -8
- package/dist/commands/console.js.map +1 -1
- package/dist/commands/details.js +2 -2
- package/dist/commands/details.js.map +1 -1
- package/dist/commands/dom.d.ts.map +1 -1
- package/dist/commands/dom.js +114 -128
- package/dist/commands/dom.js.map +1 -1
- package/dist/commands/domEvalHelpers.d.ts +7 -11
- package/dist/commands/domEvalHelpers.d.ts.map +1 -1
- package/dist/commands/domEvalHelpers.js +67 -22
- package/dist/commands/domEvalHelpers.js.map +1 -1
- package/dist/commands/domOptionsBuilder.d.ts +32 -0
- package/dist/commands/domOptionsBuilder.d.ts.map +1 -1
- package/dist/commands/domOptionsBuilder.js +35 -0
- package/dist/commands/domOptionsBuilder.js.map +1 -1
- package/dist/commands/machineReadableHelp.d.ts +98 -0
- package/dist/commands/machineReadableHelp.d.ts.map +1 -0
- package/dist/commands/machineReadableHelp.js +137 -0
- package/dist/commands/machineReadableHelp.js.map +1 -0
- package/dist/commands/network.d.ts.map +1 -1
- package/dist/commands/network.js +2 -4
- package/dist/commands/network.js.map +1 -1
- package/dist/commands/peek.d.ts.map +1 -1
- package/dist/commands/peek.js +3 -2
- package/dist/commands/peek.js.map +1 -1
- package/dist/commands/shared/CommandRunner.d.ts +4 -2
- package/dist/commands/shared/CommandRunner.d.ts.map +1 -1
- package/dist/commands/shared/CommandRunner.js +18 -3
- package/dist/commands/shared/CommandRunner.js.map +1 -1
- package/dist/commands/shared/OutputBuilder.js +1 -1
- package/dist/commands/shared/OutputBuilder.js.map +1 -1
- package/dist/commands/shared/commonOptions.d.ts.map +1 -1
- package/dist/commands/shared/commonOptions.js +10 -3
- package/dist/commands/shared/commonOptions.js.map +1 -1
- package/dist/commands/shared/daemonSessionController.d.ts +2 -0
- package/dist/commands/shared/daemonSessionController.d.ts.map +1 -1
- package/dist/commands/shared/daemonSessionController.js +13 -16
- package/dist/commands/shared/daemonSessionController.js.map +1 -1
- package/dist/commands/shared/sessionController.d.ts.map +1 -1
- package/dist/commands/shared/sessionController.js +8 -9
- package/dist/commands/shared/sessionController.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +16 -1
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +72 -54
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/stop.d.ts.map +1 -1
- package/dist/commands/stop.js +16 -28
- package/dist/commands/stop.js.map +1 -1
- package/dist/commands/tail.d.ts +11 -0
- package/dist/commands/tail.d.ts.map +1 -0
- package/dist/commands/tail.js +114 -0
- package/dist/commands/tail.js.map +1 -0
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +2 -0
- package/dist/commands.js.map +1 -1
- package/dist/connection/__tests__/cdp.contract.test.d.ts.map +1 -1
- package/dist/connection/__tests__/cdp.contract.test.js +0 -1
- package/dist/connection/__tests__/cdp.contract.test.js.map +1 -1
- package/dist/connection/cdp.d.ts +46 -2
- package/dist/connection/cdp.d.ts.map +1 -1
- package/dist/connection/cdp.js +71 -5
- package/dist/connection/cdp.js.map +1 -1
- package/dist/connection/diagnostics.d.ts +16 -0
- package/dist/connection/diagnostics.d.ts.map +1 -0
- package/dist/connection/diagnostics.js +37 -0
- package/dist/connection/diagnostics.js.map +1 -0
- package/dist/connection/errors.d.ts +74 -0
- package/dist/connection/errors.d.ts.map +1 -0
- package/dist/connection/errors.js +83 -0
- package/dist/connection/errors.js.map +1 -0
- package/dist/connection/handlers.d.ts +31 -0
- package/dist/connection/handlers.d.ts.map +1 -0
- package/dist/connection/handlers.js +38 -0
- package/dist/connection/handlers.js.map +1 -0
- package/dist/connection/launcher.d.ts +3 -20
- package/dist/connection/launcher.d.ts.map +1 -1
- package/dist/connection/launcher.js +140 -32
- package/dist/connection/launcher.js.map +1 -1
- package/dist/connection/pageReadiness.d.ts +46 -0
- package/dist/connection/pageReadiness.d.ts.map +1 -0
- package/dist/connection/pageReadiness.js +270 -0
- package/dist/connection/pageReadiness.js.map +1 -0
- package/dist/connection/tabs.d.ts +52 -0
- package/dist/connection/tabs.d.ts.map +1 -0
- package/dist/connection/tabs.js +227 -0
- package/dist/connection/tabs.js.map +1 -0
- package/dist/constants.d.ts +20 -40
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +26 -40
- package/dist/constants.js.map +1 -1
- package/dist/daemon/ipcServer.d.ts +5 -7
- package/dist/daemon/ipcServer.d.ts.map +1 -1
- package/dist/daemon/ipcServer.js +178 -143
- package/dist/daemon/ipcServer.js.map +1 -1
- package/dist/daemon/launcher.js +1 -1
- package/dist/daemon/launcher.js.map +1 -1
- package/dist/daemon/server/SocketServer.d.ts +22 -0
- package/dist/daemon/server/SocketServer.d.ts.map +1 -0
- package/dist/daemon/server/SocketServer.js +67 -0
- package/dist/daemon/server/SocketServer.js.map +1 -0
- package/dist/daemon/server/WorkerManager.d.ts +36 -0
- package/dist/daemon/server/WorkerManager.d.ts.map +1 -0
- package/dist/daemon/server/WorkerManager.js +98 -0
- package/dist/daemon/server/WorkerManager.js.map +1 -0
- package/dist/daemon/startSession.d.ts +2 -0
- package/dist/daemon/startSession.d.ts.map +1 -1
- package/dist/daemon/startSession.js +9 -5
- package/dist/daemon/startSession.js.map +1 -1
- package/dist/daemon/worker/TelemetryStore.d.ts +18 -0
- package/dist/daemon/worker/TelemetryStore.d.ts.map +1 -0
- package/dist/daemon/worker/TelemetryStore.js +49 -0
- package/dist/daemon/worker/TelemetryStore.js.map +1 -0
- package/dist/daemon/worker/collectors.d.ts +8 -0
- package/dist/daemon/worker/collectors.d.ts.map +1 -0
- package/dist/daemon/worker/collectors.js +19 -0
- package/dist/daemon/worker/collectors.js.map +1 -0
- package/dist/daemon/worker/commandRegistry.d.ts +10 -0
- package/dist/daemon/worker/commandRegistry.d.ts.map +1 -0
- package/dist/daemon/worker/commandRegistry.js +289 -0
- package/dist/daemon/worker/commandRegistry.js.map +1 -0
- package/dist/daemon/worker/plugins.d.ts +21 -0
- package/dist/daemon/worker/plugins.d.ts.map +1 -0
- package/dist/daemon/worker/plugins.js +71 -0
- package/dist/daemon/worker/plugins.js.map +1 -0
- package/dist/daemon/worker/types.d.ts +13 -0
- package/dist/daemon/worker/types.d.ts.map +1 -0
- package/dist/daemon/worker/types.js +2 -0
- package/dist/daemon/worker/types.js.map +1 -0
- package/dist/daemon/worker.js +232 -484
- package/dist/daemon/worker.js.map +1 -1
- package/dist/help/machineReadableHelp.d.ts +100 -0
- package/dist/help/machineReadableHelp.d.ts.map +1 -0
- package/dist/help/machineReadableHelp.js +139 -0
- package/dist/help/machineReadableHelp.js.map +1 -0
- package/dist/index.js +18 -9
- package/dist/index.js.map +1 -1
- package/dist/ipc/__tests__/client.contract.test.js +2 -2
- package/dist/ipc/__tests__/client.contract.test.js.map +1 -1
- package/dist/ipc/client.d.ts +16 -1
- package/dist/ipc/client.d.ts.map +1 -1
- package/dist/ipc/client.js +40 -11
- package/dist/ipc/client.js.map +1 -1
- package/dist/ipc/commands.d.ts +20 -0
- package/dist/ipc/commands.d.ts.map +1 -1
- package/dist/ipc/commands.js +4 -0
- package/dist/ipc/commands.js.map +1 -1
- package/dist/ipc/types.d.ts +2 -0
- package/dist/ipc/types.d.ts.map +1 -1
- package/dist/session/BdgSession.d.ts +91 -0
- package/dist/session/BdgSession.d.ts.map +1 -0
- package/dist/session/BdgSession.js +230 -0
- package/dist/session/BdgSession.js.map +1 -0
- package/dist/session/cleanup.d.ts.map +1 -1
- package/dist/session/cleanup.js +67 -65
- package/dist/session/cleanup.js.map +1 -1
- package/dist/session/fileOps.d.ts +25 -0
- package/dist/session/fileOps.d.ts.map +1 -0
- package/dist/session/fileOps.js +39 -0
- package/dist/session/fileOps.js.map +1 -0
- package/dist/session/metadata.js +2 -2
- package/dist/session/metadata.js.map +1 -1
- package/dist/session/paths.d.ts +2 -7
- package/dist/session/paths.d.ts.map +1 -1
- package/dist/session/paths.js +8 -8
- package/dist/session/paths.js.map +1 -1
- package/dist/session/queryCache.js +1 -1
- package/dist/session/queryCache.js.map +1 -1
- package/dist/telemetry/__tests__/filters.unit.test.d.ts +2 -0
- package/dist/telemetry/__tests__/filters.unit.test.d.ts.map +1 -0
- package/dist/telemetry/__tests__/filters.unit.test.js +239 -0
- package/dist/telemetry/__tests__/filters.unit.test.js.map +1 -0
- package/dist/telemetry/console.d.ts +1 -1
- package/dist/telemetry/console.d.ts.map +1 -1
- package/dist/telemetry/console.js +5 -3
- package/dist/telemetry/console.js.map +1 -1
- package/dist/telemetry/dialogs.d.ts +27 -0
- package/dist/telemetry/dialogs.d.ts.map +1 -0
- package/dist/telemetry/dialogs.js +51 -0
- package/dist/telemetry/dialogs.js.map +1 -0
- package/dist/telemetry/filters.d.ts +148 -0
- package/dist/telemetry/filters.d.ts.map +1 -0
- package/dist/telemetry/filters.js +358 -0
- package/dist/telemetry/filters.js.map +1 -0
- package/dist/telemetry/navigation.d.ts +49 -0
- package/dist/telemetry/navigation.d.ts.map +1 -0
- package/dist/telemetry/navigation.js +69 -0
- package/dist/telemetry/navigation.js.map +1 -0
- package/dist/telemetry/network.d.ts +1 -0
- package/dist/telemetry/network.d.ts.map +1 -1
- package/dist/telemetry/network.js +23 -34
- package/dist/telemetry/network.js.map +1 -1
- package/dist/types.d.ts +26 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/errors/CommandError.d.ts +39 -0
- package/dist/ui/errors/CommandError.d.ts.map +1 -0
- package/dist/ui/errors/CommandError.js +48 -0
- package/dist/ui/errors/CommandError.js.map +1 -0
- package/dist/ui/errors/SystemErrors.d.ts +22 -0
- package/dist/ui/errors/SystemErrors.d.ts.map +1 -0
- package/dist/ui/errors/SystemErrors.js +23 -0
- package/dist/ui/errors/SystemErrors.js.map +1 -0
- package/dist/ui/errors/index.d.ts +9 -0
- package/dist/ui/errors/index.d.ts.map +1 -0
- package/dist/ui/errors/index.js +12 -0
- package/dist/ui/errors/index.js.map +1 -0
- package/dist/ui/errors/utils.d.ts +24 -0
- package/dist/ui/errors/utils.d.ts.map +1 -0
- package/dist/ui/errors/utils.js +28 -0
- package/dist/ui/errors/utils.js.map +1 -0
- package/dist/ui/errors.d.ts +39 -0
- package/dist/ui/errors.d.ts.map +1 -0
- package/dist/ui/errors.js +48 -0
- package/dist/ui/errors.js.map +1 -0
- package/dist/ui/formatters/cookies.d.ts.map +1 -1
- package/dist/ui/formatters/cookies.js +18 -21
- package/dist/ui/formatters/cookies.js.map +1 -1
- package/dist/ui/formatters/details.d.ts.map +1 -1
- package/dist/ui/formatters/details.js +34 -36
- package/dist/ui/formatters/details.js.map +1 -1
- package/dist/ui/formatters/dom.d.ts +135 -0
- package/dist/ui/formatters/dom.d.ts.map +1 -0
- package/dist/ui/formatters/dom.js +193 -0
- package/dist/ui/formatters/dom.js.map +1 -0
- package/dist/ui/formatters/index.d.ts +1 -0
- package/dist/ui/formatters/index.d.ts.map +1 -1
- package/dist/ui/formatters/index.js +1 -0
- package/dist/ui/formatters/index.js.map +1 -1
- package/dist/ui/formatters/preview.js +43 -38
- package/dist/ui/formatters/preview.js.map +1 -1
- package/dist/ui/formatters/status.d.ts.map +1 -1
- package/dist/ui/formatters/status.js +45 -45
- package/dist/ui/formatters/status.js.map +1 -1
- package/dist/ui/formatting.d.ts +104 -1
- package/dist/ui/formatting.d.ts.map +1 -1
- package/dist/ui/formatting.js +138 -2
- package/dist/ui/formatting.js.map +1 -1
- package/dist/ui/logging/index.d.ts +7 -0
- package/dist/ui/logging/index.d.ts.map +1 -0
- package/dist/ui/logging/index.js +7 -0
- package/dist/ui/logging/index.js.map +1 -0
- package/dist/ui/logging/logger.d.ts +98 -0
- package/dist/ui/logging/logger.d.ts.map +1 -0
- package/dist/ui/logging/logger.js +93 -0
- package/dist/ui/logging/logger.js.map +1 -0
- package/dist/ui/messages/chrome.d.ts +120 -1
- package/dist/ui/messages/chrome.d.ts.map +1 -1
- package/dist/ui/messages/chrome.js +168 -0
- package/dist/ui/messages/chrome.js.map +1 -1
- package/dist/ui/messages/debug.d.ts +4 -2
- package/dist/ui/messages/debug.d.ts.map +1 -1
- package/dist/ui/messages/debug.js +31 -29
- package/dist/ui/messages/debug.js.map +1 -1
- package/dist/ui/messages/deprecation.d.ts +30 -0
- package/dist/ui/messages/deprecation.d.ts.map +1 -0
- package/dist/ui/messages/deprecation.js +49 -0
- package/dist/ui/messages/deprecation.js.map +1 -0
- package/dist/ui/messages/errors.d.ts +11 -0
- package/dist/ui/messages/errors.d.ts.map +1 -1
- package/dist/ui/messages/errors.js +13 -0
- package/dist/ui/messages/errors.js.map +1 -1
- package/dist/ui/messages/preview.d.ts +24 -0
- package/dist/ui/messages/preview.d.ts.map +1 -1
- package/dist/ui/messages/preview.js +32 -1
- package/dist/ui/messages/preview.js.map +1 -1
- package/dist/ui/messages/session.d.ts.map +1 -1
- package/dist/ui/messages/session.js +21 -7
- package/dist/ui/messages/session.js.map +1 -1
- package/dist/ui/messages/validation.d.ts +14 -0
- package/dist/ui/messages/validation.d.ts.map +1 -1
- package/dist/ui/messages/validation.js +16 -0
- package/dist/ui/messages/validation.js.map +1 -1
- package/dist/utils/__tests__/session.contract.test.js +15 -1
- package/dist/utils/__tests__/session.contract.test.js.map +1 -1
- package/dist/utils/filters.d.ts +40 -0
- package/dist/utils/filters.d.ts.map +1 -1
- package/dist/utils/filters.js +55 -1
- package/dist/utils/filters.js.map +1 -1
- package/dist/utils/pageReadiness.d.ts +9 -14
- package/dist/utils/pageReadiness.d.ts.map +1 -1
- package/dist/utils/pageReadiness.js +40 -41
- package/dist/utils/pageReadiness.js.map +1 -1
- package/dist/utils/session.d.ts +200 -0
- package/dist/utils/session.d.ts.map +1 -0
- package/dist/utils/session.js +498 -0
- package/dist/utils/session.js.map +1 -0
- package/dist/utils/url.d.ts +58 -6
- package/dist/utils/url.d.ts.map +1 -1
- package/dist/utils/url.js +137 -20
- package/dist/utils/url.js.map +1 -1
- package/dist/utils/validation.d.ts +12 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +20 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +3 -5
- package/dist/cli/commands/__tests__/cdp.contract.test.d.ts +0 -24
- package/dist/cli/commands/__tests__/cdp.contract.test.d.ts.map +0 -1
- package/dist/cli/commands/__tests__/cdp.contract.test.js +0 -467
- package/dist/cli/commands/__tests__/cdp.contract.test.js.map +0 -1
- package/dist/cli/commands/cdp.d.ts +0 -8
- package/dist/cli/commands/cdp.d.ts.map +0 -1
- package/dist/cli/commands/cdp.js +0 -45
- package/dist/cli/commands/cdp.js.map +0 -1
- package/dist/cli/commands/console.d.ts +0 -8
- package/dist/cli/commands/console.d.ts.map +0 -1
- package/dist/cli/commands/console.js +0 -97
- package/dist/cli/commands/console.js.map +0 -1
- package/dist/cli/commands/dom/helpers/domCache.d.ts +0 -36
- package/dist/cli/commands/dom/helpers/domCache.d.ts.map +0 -1
- package/dist/cli/commands/dom/helpers/domCache.js +0 -65
- package/dist/cli/commands/dom/helpers/domCache.js.map +0 -1
- package/dist/cli/commands/dom/helpers/domQuery.d.ts +0 -48
- package/dist/cli/commands/dom/helpers/domQuery.d.ts.map +0 -1
- package/dist/cli/commands/dom/helpers/domQuery.js +0 -104
- package/dist/cli/commands/dom/helpers/domQuery.js.map +0 -1
- package/dist/cli/commands/dom/helpers/errorHandler.d.ts +0 -45
- package/dist/cli/commands/dom/helpers/errorHandler.d.ts.map +0 -1
- package/dist/cli/commands/dom/helpers/errorHandler.js +0 -71
- package/dist/cli/commands/dom/helpers/errorHandler.js.map +0 -1
- package/dist/cli/commands/dom/helpers/evalHelpers.d.ts +0 -52
- package/dist/cli/commands/dom/helpers/evalHelpers.d.ts.map +0 -1
- package/dist/cli/commands/dom/helpers/evalHelpers.js +0 -75
- package/dist/cli/commands/dom/helpers/evalHelpers.js.map +0 -1
- package/dist/cli/commands/dom/helpers/optionsBuilder.d.ts +0 -35
- package/dist/cli/commands/dom/helpers/optionsBuilder.d.ts.map +0 -1
- package/dist/cli/commands/dom/helpers/optionsBuilder.js +0 -51
- package/dist/cli/commands/dom/helpers/optionsBuilder.js.map +0 -1
- package/dist/cli/commands/dom/helpers/selectorParser.d.ts +0 -20
- package/dist/cli/commands/dom/helpers/selectorParser.d.ts.map +0 -1
- package/dist/cli/commands/dom/helpers/selectorParser.js +0 -20
- package/dist/cli/commands/dom/helpers/selectorParser.js.map +0 -1
- package/dist/cli/commands/dom/index.d.ts +0 -8
- package/dist/cli/commands/dom/index.d.ts.map +0 -1
- package/dist/cli/commands/dom/index.js +0 -257
- package/dist/cli/commands/dom/index.js.map +0 -1
- package/dist/cli/commands/dom.d.ts +0 -8
- package/dist/cli/commands/dom.d.ts.map +0 -1
- package/dist/cli/commands/dom.js +0 -257
- package/dist/cli/commands/dom.js.map +0 -1
- package/dist/cli/commands/domErrorHandler.d.ts +0 -45
- package/dist/cli/commands/domErrorHandler.d.ts.map +0 -1
- package/dist/cli/commands/domErrorHandler.js +0 -71
- package/dist/cli/commands/domErrorHandler.js.map +0 -1
- package/dist/cli/commands/domEvalHelpers.d.ts +0 -52
- package/dist/cli/commands/domEvalHelpers.d.ts.map +0 -1
- package/dist/cli/commands/domEvalHelpers.js +0 -76
- package/dist/cli/commands/domEvalHelpers.js.map +0 -1
- package/dist/cli/commands/domOptionsBuilder.d.ts +0 -35
- package/dist/cli/commands/domOptionsBuilder.d.ts.map +0 -1
- package/dist/cli/commands/domOptionsBuilder.js +0 -51
- package/dist/cli/commands/domOptionsBuilder.js.map +0 -1
- package/dist/cli/commands/domSelectorParser.d.ts +0 -20
- package/dist/cli/commands/domSelectorParser.d.ts.map +0 -1
- package/dist/cli/commands/domSelectorParser.js +0 -20
- package/dist/cli/commands/domSelectorParser.js.map +0 -1
- package/dist/cli/commands/network.d.ts +0 -8
- package/dist/cli/commands/network.d.ts.map +0 -1
- package/dist/cli/commands/network.js +0 -43
- package/dist/cli/commands/network.js.map +0 -1
- package/dist/cli/handlers/CommandRunner.d.ts +0 -60
- package/dist/cli/handlers/CommandRunner.d.ts.map +0 -1
- package/dist/cli/handlers/CommandRunner.js +0 -81
- package/dist/cli/handlers/CommandRunner.js.map +0 -1
- package/dist/cli/handlers/commonOptions.d.ts +0 -54
- package/dist/cli/handlers/commonOptions.d.ts.map +0 -1
- package/dist/cli/handlers/commonOptions.js +0 -64
- package/dist/cli/handlers/commonOptions.js.map +0 -1
- package/dist/cli/handlers/daemonSessionController.d.ts +0 -23
- package/dist/cli/handlers/daemonSessionController.d.ts.map +0 -1
- package/dist/cli/handlers/daemonSessionController.js +0 -79
- package/dist/cli/handlers/daemonSessionController.js.map +0 -1
- package/dist/cli/handlers/landingPage.d.ts +0 -8
- package/dist/cli/handlers/landingPage.d.ts.map +0 -1
- package/dist/cli/handlers/landingPage.js +0 -8
- package/dist/cli/handlers/landingPage.js.map +0 -1
- package/dist/collectors/__tests__/network.contract.test.d.ts +0 -28
- package/dist/collectors/__tests__/network.contract.test.d.ts.map +0 -1
- package/dist/collectors/__tests__/network.contract.test.js +0 -540
- package/dist/collectors/__tests__/network.contract.test.js.map +0 -1
- package/dist/commandRegistry.d.ts +0 -11
- package/dist/commandRegistry.d.ts.map +0 -1
- package/dist/commandRegistry.js +0 -45
- package/dist/commandRegistry.js.map +0 -1
- package/dist/commands/domErrorHandler.d.ts +0 -45
- package/dist/commands/domErrorHandler.d.ts.map +0 -1
- package/dist/commands/domErrorHandler.js +0 -71
- package/dist/commands/domErrorHandler.js.map +0 -1
- package/dist/dom/cache.d.ts +0 -36
- package/dist/dom/cache.d.ts.map +0 -1
- package/dist/dom/cache.js +0 -65
- package/dist/dom/cache.js.map +0 -1
- package/dist/dom/index.d.ts +0 -9
- package/dist/dom/index.d.ts.map +0 -1
- package/dist/dom/index.js +0 -9
- package/dist/dom/index.js.map +0 -1
- package/dist/dom/query.d.ts +0 -48
- package/dist/dom/query.d.ts.map +0 -1
- package/dist/dom/query.js +0 -104
- package/dist/dom/query.js.map +0 -1
- package/dist/utils/formatters/network.d.ts +0 -23
- package/dist/utils/formatters/network.d.ts.map +0 -1
- package/dist/utils/formatters/network.js +0 -35
- package/dist/utils/formatters/network.js.map +0 -1
- package/dist/utils/ui.d.ts +0 -36
- package/dist/utils/ui.d.ts.map +0 -1
- package/dist/utils/ui.js +0 -47
- package/dist/utils/ui.js.map +0 -1
- package/dist/utils/url/safeParseUrl.d.ts +0 -63
- package/dist/utils/url/safeParseUrl.d.ts.map +0 -1
- package/dist/utils/url/safeParseUrl.js +0 -84
- package/dist/utils/url/safeParseUrl.js.map +0 -1
|
@@ -4,7 +4,7 @@ import type { LaunchedChrome } from '../types';
|
|
|
4
4
|
* Options that control how Chrome is launched for CDP sessions.
|
|
5
5
|
* Extended to support chrome-launcher advanced features.
|
|
6
6
|
*/
|
|
7
|
-
export interface LaunchOptions extends Pick<ChromeLaunchOptions, 'logLevel' | 'connectionPollInterval' | 'maxConnectionRetries' | 'portStrictMode' | 'envVars' | 'handleSIGINT' | 'ignoreDefaultFlags' | 'chromeFlags'> {
|
|
7
|
+
export interface LaunchOptions extends Pick<ChromeLaunchOptions, 'logLevel' | 'connectionPollInterval' | 'maxConnectionRetries' | 'portStrictMode' | 'envVars' | 'handleSIGINT' | 'ignoreDefaultFlags' | 'chromeFlags' | 'chromePath'> {
|
|
8
8
|
/** Remote debugging port (defaults to 9222 when omitted) */
|
|
9
9
|
port?: number;
|
|
10
10
|
/** Directory for Chrome profile data. Falls back to persistent ~/.bdg/chrome-profile directory */
|
|
@@ -17,25 +17,8 @@ export interface LaunchOptions extends Pick<ChromeLaunchOptions, 'logLevel' | 'c
|
|
|
17
17
|
prefs?: Record<string, unknown> | undefined;
|
|
18
18
|
/** Path to JSON file containing Chrome preferences */
|
|
19
19
|
prefsFile?: string | undefined;
|
|
20
|
+
/** Override Chrome binary detection with an explicit path */
|
|
21
|
+
chromePath?: string;
|
|
20
22
|
}
|
|
21
|
-
/**
|
|
22
|
-
* Launch Chrome with remote debugging enabled using chrome-launcher.
|
|
23
|
-
*
|
|
24
|
-
* Supports macOS, Linux, and Windows. Chrome will be launched with
|
|
25
|
-
* the specified debugging port and user data directory.
|
|
26
|
-
*
|
|
27
|
-
* Validates Chrome process is alive after launch to detect immediate crashes
|
|
28
|
-
* or port conflicts. Includes Chrome installation diagnostics in error messages
|
|
29
|
-
* to aid troubleshooting.
|
|
30
|
-
*
|
|
31
|
-
* @param options - Launch configuration options
|
|
32
|
-
* @returns LaunchedChrome instance with PID and kill method
|
|
33
|
-
* @throws ChromeLaunchError if Chrome fails to launch, process dies immediately, or CDP doesn't become available
|
|
34
|
-
* @throws Error if user data directory cannot be created
|
|
35
|
-
*
|
|
36
|
-
* @remarks
|
|
37
|
-
* Chrome 136+ requires --user-data-dir with a non-default directory.
|
|
38
|
-
* Uses chrome-launcher for cross-platform Chrome detection and launching.
|
|
39
|
-
*/
|
|
40
23
|
export declare function launchChrome(options?: LaunchOptions): Promise<LaunchedChrome>;
|
|
41
24
|
//# sourceMappingURL=launcher.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launcher.d.ts","sourceRoot":"","sources":["../../src/connection/launcher.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"launcher.d.ts","sourceRoot":"","sources":["../../src/connection/launcher.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AActE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AA0D9C;;;GAGG;AACH,MAAM,WAAW,aACf,SAAQ,IAAI,CACV,mBAAmB,EACjB,UAAU,GACV,wBAAwB,GACxB,sBAAsB,GACtB,gBAAgB,GAChB,SAAS,GACT,cAAc,GACd,oBAAoB,GACpB,aAAa,GACb,YAAY,CACf;IACD,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kGAAkG;IAClG,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,4FAA4F;IAC5F,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,kGAAkG;IAClG,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;IAC5C,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,6DAA6D;IAC7D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAiED,wBAAsB,YAAY,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,cAAc,CAAC,CA4FvF"}
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import * as fs from 'fs';
|
|
2
|
-
import * as
|
|
2
|
+
import * as net from 'net';
|
|
3
3
|
import * as path from 'path';
|
|
4
4
|
import * as chromeLauncher from 'chrome-launcher';
|
|
5
|
-
import { BDG_CHROME_FLAGS, BDG_CHROME_PREFS, DEFAULT_CDP_PORT, DEFAULT_CHROME_LOG_LEVEL, DEFAULT_CHROME_HANDLE_SIGINT, CHROME_PROFILE_DIR, HEADLESS_FLAG, } from '../constants.js';
|
|
5
|
+
import { BDG_CHROME_FLAGS, BDG_CHROME_PREFS, DEFAULT_CDP_PORT, DEFAULT_CHROME_LOG_LEVEL, DEFAULT_CHROME_HANDLE_SIGINT, CHROME_PROFILE_DIR, HEADLESS_FLAG, DOCKER_CHROME_FLAGS, } from '../constants.js';
|
|
6
|
+
import { ensureSessionDir, getSessionDir } from '../session/paths.js';
|
|
6
7
|
import { isProcessAlive } from '../session/process.js';
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import { ChromeLaunchError, getErrorMessage } from '../utils/errors.js';
|
|
10
|
-
import { createLogger } from '../utils/logger.js';
|
|
8
|
+
import { createLogger } from '../ui/logging/index.js';
|
|
9
|
+
import { formatDiagnosticsForError, chromeLaunchStartMessage, chromeLaunchSuccessMessage, chromeUserDataDirMessage, invalidPortError, userDataDirError, prefsFileNotFoundError, invalidPrefsFormatError, prefsLoadError, chromeLaunchFailedError, chromeBinaryOverrideNotFound, chromeBinaryOverrideNotExecutable, } from '../ui/messages/chrome.js';
|
|
11
10
|
import { filterDefined } from '../utils/objects.js';
|
|
11
|
+
import { getChromeDiagnostics } from './diagnostics.js';
|
|
12
|
+
import { ChromeLaunchError, getErrorMessage } from './errors.js';
|
|
12
13
|
const log = createLogger('chrome');
|
|
13
14
|
/**
|
|
14
15
|
* Get formatted Chrome diagnostics for error messages.
|
|
@@ -45,12 +46,56 @@ const REMOTE_DEBUGGING_FLAG = (port) => `--remote-debugging-port=${port}`;
|
|
|
45
46
|
* Chrome 136+ requires --user-data-dir with a non-default directory.
|
|
46
47
|
* Uses chrome-launcher for cross-platform Chrome detection and launching.
|
|
47
48
|
*/
|
|
49
|
+
/**
|
|
50
|
+
* Atomically reserve a port to prevent race conditions during Chrome launch.
|
|
51
|
+
*
|
|
52
|
+
* Creates a temporary TCP server on the port, which prevents other processes
|
|
53
|
+
* from binding to it. Returns a release function to free the port.
|
|
54
|
+
*
|
|
55
|
+
* @param port - Port number to reserve
|
|
56
|
+
* @returns Promise resolving to reservation object with release function
|
|
57
|
+
* @throws ChromeLaunchError If port is already in use
|
|
58
|
+
*/
|
|
59
|
+
async function reservePort(port) {
|
|
60
|
+
return new Promise((resolve, reject) => {
|
|
61
|
+
const server = net.createServer();
|
|
62
|
+
server.once('error', (err) => {
|
|
63
|
+
if (err.code === 'EADDRINUSE') {
|
|
64
|
+
// Port is already in use - provide helpful error message
|
|
65
|
+
reject(new ChromeLaunchError(`Port ${port} is already in use.\n\n` +
|
|
66
|
+
`This usually means Chrome is still running from a previous session.\n\n` +
|
|
67
|
+
`Try:\n` +
|
|
68
|
+
` - bdg cleanup --aggressive (kills all Chrome processes)\n` +
|
|
69
|
+
` - bdg cleanup --force (removes session files + kills Chrome on port ${port})\n` +
|
|
70
|
+
` - lsof -ti:${port} | xargs kill -9 (force kill process on port)\n` +
|
|
71
|
+
` - Use different port: bdg <url> --port ${port + 1}`));
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
reject(err);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
server.listen(port, '127.0.0.1', () => {
|
|
78
|
+
// Port successfully reserved - return release function
|
|
79
|
+
resolve({
|
|
80
|
+
release: () => {
|
|
81
|
+
server.close();
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
}
|
|
48
87
|
export async function launchChrome(options = {}) {
|
|
49
88
|
const port = options.port ?? DEFAULT_CDP_PORT;
|
|
50
89
|
// Validate port range
|
|
51
90
|
if (port < 1 || port > 65535) {
|
|
52
91
|
throw new ChromeLaunchError(invalidPortError(port));
|
|
53
92
|
}
|
|
93
|
+
// Atomically check if port is available
|
|
94
|
+
// We must release BEFORE launching Chrome so Chrome can bind to it
|
|
95
|
+
const reservation = await reservePort(port);
|
|
96
|
+
// Immediately release - we just wanted to atomically check availability
|
|
97
|
+
// Chrome needs to bind to this port, so we can't hold the reservation
|
|
98
|
+
reservation.release();
|
|
54
99
|
const userDataDir = options.userDataDir ?? getPersistentUserDataDir();
|
|
55
100
|
log.info(chromeLaunchStartMessage(port));
|
|
56
101
|
log.debug(chromeUserDataDirMessage(userDataDir));
|
|
@@ -62,36 +107,24 @@ export async function launchChrome(options = {}) {
|
|
|
62
107
|
await launcher.waitUntilReady();
|
|
63
108
|
const launchDurationMs = Date.now() - launchStart;
|
|
64
109
|
const chromeProcessPid = launcher.pid ?? 0;
|
|
65
|
-
// Validate PID
|
|
66
|
-
if (!chromeProcessPid || chromeProcessPid <= 0) {
|
|
110
|
+
// Validate PID and process liveness before success
|
|
111
|
+
if (!chromeProcessPid || chromeProcessPid <= 0 || !isProcessAlive(chromeProcessPid)) {
|
|
67
112
|
launcher.kill();
|
|
68
113
|
launcher.destroyTmp();
|
|
69
|
-
// Get Chrome diagnostics
|
|
114
|
+
// Get Chrome diagnostics once for error context
|
|
70
115
|
const diagnosticLines = getFormattedDiagnostics();
|
|
71
|
-
|
|
116
|
+
const errorType = !chromeProcessPid || chromeProcessPid <= 0
|
|
117
|
+
? 'failed to launch'
|
|
118
|
+
: 'died immediately after launch';
|
|
119
|
+
throw new ChromeLaunchError(`Chrome ${errorType} (PID: ${chromeProcessPid})\n\n` +
|
|
72
120
|
`Possible causes:\n` +
|
|
73
|
-
` - Port ${port}
|
|
121
|
+
` - Port ${port} conflict (check: lsof -ti:${port})\n` +
|
|
74
122
|
` - Chrome binary not found\n` +
|
|
75
|
-
` - Insufficient permissions\n
|
|
123
|
+
` - Insufficient permissions\n` +
|
|
124
|
+
` - Chrome crashed on startup\n\n` +
|
|
76
125
|
`${diagnosticLines.join('\n')}\n\n` +
|
|
77
126
|
`Try:\n` +
|
|
78
127
|
` - bdg cleanup\n` +
|
|
79
|
-
` - Use different port: bdg <url> --port ${port + 1}`);
|
|
80
|
-
}
|
|
81
|
-
// Verify Chrome process is actually running (Issue #4 fix)
|
|
82
|
-
if (!isProcessAlive(chromeProcessPid)) {
|
|
83
|
-
launcher.kill();
|
|
84
|
-
launcher.destroyTmp();
|
|
85
|
-
throw new ChromeLaunchError(`Chrome process died immediately after launch (PID: ${chromeProcessPid})\n\n` +
|
|
86
|
-
`This usually indicates:\n` +
|
|
87
|
-
` - Port ${port} conflict (another process is using this port)\n` +
|
|
88
|
-
` - Chrome crashed on startup\n` +
|
|
89
|
-
` - Insufficient system resources\n\n` +
|
|
90
|
-
`Diagnostics:\n` +
|
|
91
|
-
` → Check port usage: lsof -ti:${port}\n` +
|
|
92
|
-
` → Check Chrome logs for crash details\n\n` +
|
|
93
|
-
`Try:\n` +
|
|
94
|
-
` - bdg cleanup\n` +
|
|
95
128
|
` - Kill conflicting process: kill $(lsof -ti:${port})\n` +
|
|
96
129
|
` - Use different port: bdg <url> --port ${port + 1}`);
|
|
97
130
|
}
|
|
@@ -133,8 +166,9 @@ export async function launchChrome(options = {}) {
|
|
|
133
166
|
* @throws Error if user data directory cannot be created due to permission issues
|
|
134
167
|
*/
|
|
135
168
|
function getPersistentUserDataDir() {
|
|
136
|
-
|
|
137
|
-
const
|
|
169
|
+
ensureSessionDir();
|
|
170
|
+
const baseDir = getSessionDir();
|
|
171
|
+
const userDataDir = path.join(baseDir, CHROME_PROFILE_DIR);
|
|
138
172
|
if (!fs.existsSync(userDataDir)) {
|
|
139
173
|
try {
|
|
140
174
|
fs.mkdirSync(userDataDir, { recursive: true });
|
|
@@ -179,6 +213,66 @@ function loadChromePrefs(options) {
|
|
|
179
213
|
}
|
|
180
214
|
return options.prefs;
|
|
181
215
|
}
|
|
216
|
+
/**
|
|
217
|
+
* Resolve Chrome binary override from LaunchOptions or CHROME_PATH.
|
|
218
|
+
*
|
|
219
|
+
* When users explicitly set a Chrome binary we skip chrome-launcher's fallback
|
|
220
|
+
* auto-detection to ensure mismatched paths fail fast with actionable errors.
|
|
221
|
+
*
|
|
222
|
+
* @param options - Launch options which may include chromePath
|
|
223
|
+
* @returns Validated Chrome binary path or undefined if no override
|
|
224
|
+
* @throws ChromeLaunchError if override path is invalid or not executable
|
|
225
|
+
*/
|
|
226
|
+
function resolveChromeBinaryOverride(options) {
|
|
227
|
+
const override = options.chromePath ?? process.env['CHROME_PATH'];
|
|
228
|
+
if (!override) {
|
|
229
|
+
return undefined;
|
|
230
|
+
}
|
|
231
|
+
const chromePath = override.trim();
|
|
232
|
+
if (!chromePath) {
|
|
233
|
+
return undefined;
|
|
234
|
+
}
|
|
235
|
+
const sourceLabel = options.chromePath ? 'chromePath option' : 'CHROME_PATH';
|
|
236
|
+
if (!fs.existsSync(chromePath)) {
|
|
237
|
+
const diagnostics = getFormattedDiagnostics();
|
|
238
|
+
throw new ChromeLaunchError(`${chromeBinaryOverrideNotFound(chromePath, sourceLabel)}\n\n${diagnostics.join('\n')}`);
|
|
239
|
+
}
|
|
240
|
+
try {
|
|
241
|
+
const stats = fs.statSync(chromePath);
|
|
242
|
+
if (stats.isDirectory()) {
|
|
243
|
+
throw new ChromeLaunchError(chromeBinaryOverrideNotExecutable(chromePath, sourceLabel));
|
|
244
|
+
}
|
|
245
|
+
fs.accessSync(chromePath, fs.constants.X_OK);
|
|
246
|
+
}
|
|
247
|
+
catch (error) {
|
|
248
|
+
if (error instanceof ChromeLaunchError) {
|
|
249
|
+
throw error;
|
|
250
|
+
}
|
|
251
|
+
throw new ChromeLaunchError(`${chromeBinaryOverrideNotExecutable(chromePath, sourceLabel)}\n\n${getErrorMessage(error)}`, error instanceof Error ? error : undefined);
|
|
252
|
+
}
|
|
253
|
+
return chromePath;
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Check if running inside a Docker container
|
|
257
|
+
* @returns true if running in Docker, false otherwise
|
|
258
|
+
*/
|
|
259
|
+
function isDocker() {
|
|
260
|
+
try {
|
|
261
|
+
// Check for /.dockerenv file (most reliable indicator)
|
|
262
|
+
if (fs.existsSync('/.dockerenv')) {
|
|
263
|
+
return true;
|
|
264
|
+
}
|
|
265
|
+
// Check /proc/self/cgroup for docker/containerd indicators
|
|
266
|
+
if (fs.existsSync('/proc/self/cgroup')) {
|
|
267
|
+
const cgroup = fs.readFileSync('/proc/self/cgroup', 'utf8');
|
|
268
|
+
return cgroup.includes('docker') || cgroup.includes('containerd');
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
catch {
|
|
272
|
+
// If we can't read these files, assume not Docker
|
|
273
|
+
}
|
|
274
|
+
return false;
|
|
275
|
+
}
|
|
182
276
|
/**
|
|
183
277
|
* Build Chrome flags array from launch options.
|
|
184
278
|
*
|
|
@@ -186,6 +280,9 @@ function loadChromePrefs(options) {
|
|
|
186
280
|
* and layers bdg-specific overrides on top. Headless mode uses the new headless
|
|
187
281
|
* implementation for better compatibility.
|
|
188
282
|
*
|
|
283
|
+
* When running in Docker, automatically adds GPU-disabling flags to work around
|
|
284
|
+
* graphics limitations in containerized environments.
|
|
285
|
+
*
|
|
189
286
|
* @param options - Launch options containing flag preferences
|
|
190
287
|
* @returns Array of Chrome command-line flags
|
|
191
288
|
*/
|
|
@@ -193,10 +290,19 @@ function buildChromeFlags(options) {
|
|
|
193
290
|
const port = options.port ?? DEFAULT_CDP_PORT;
|
|
194
291
|
const baseFlags = options.ignoreDefaultFlags ? [] : chromeLauncher.Launcher.defaultFlags();
|
|
195
292
|
const bdgFlags = [REMOTE_DEBUGGING_FLAG(port), ...BDG_CHROME_FLAGS];
|
|
293
|
+
// Add Docker-specific flags if running in a container
|
|
294
|
+
const dockerFlags = isDocker() ? DOCKER_CHROME_FLAGS : [];
|
|
295
|
+
// Headless flag must come first to ensure it's not overridden by other flags
|
|
196
296
|
if (options.headless) {
|
|
197
|
-
|
|
297
|
+
return [
|
|
298
|
+
HEADLESS_FLAG,
|
|
299
|
+
...baseFlags,
|
|
300
|
+
...bdgFlags,
|
|
301
|
+
...dockerFlags,
|
|
302
|
+
...(options.chromeFlags ?? []),
|
|
303
|
+
];
|
|
198
304
|
}
|
|
199
|
-
return [...baseFlags, ...bdgFlags, ...(options.chromeFlags ?? [])];
|
|
305
|
+
return [...baseFlags, ...bdgFlags, ...dockerFlags, ...(options.chromeFlags ?? [])];
|
|
200
306
|
}
|
|
201
307
|
/**
|
|
202
308
|
* Type-safe conversion for Chrome preferences from unknown to JSONLike.
|
|
@@ -229,6 +335,7 @@ function ensureJSONCompatiblePrefs(prefs) {
|
|
|
229
335
|
function buildChromeOptions(options) {
|
|
230
336
|
const userPrefs = loadChromePrefs(options);
|
|
231
337
|
const userDataDir = options.userDataDir ?? getPersistentUserDataDir();
|
|
338
|
+
const chromePathOverride = resolveChromeBinaryOverride(options);
|
|
232
339
|
// User preferences take precedence over bdg defaults
|
|
233
340
|
const mergedPrefs = userPrefs ? { ...BDG_CHROME_PREFS, ...userPrefs } : BDG_CHROME_PREFS;
|
|
234
341
|
return {
|
|
@@ -245,6 +352,7 @@ function buildChromeOptions(options) {
|
|
|
245
352
|
portStrictMode: options.portStrictMode,
|
|
246
353
|
prefs: ensureJSONCompatiblePrefs(mergedPrefs),
|
|
247
354
|
envVars: options.envVars,
|
|
355
|
+
chromePath: chromePathOverride,
|
|
248
356
|
}),
|
|
249
357
|
};
|
|
250
358
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launcher.js","sourceRoot":"","sources":["../../src/connection/launcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"launcher.js","sourceRoot":"","sources":["../../src/connection/launcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart page readiness detection using self-tuning thresholds
|
|
3
|
+
*
|
|
4
|
+
* This module provides adaptive page load detection that works for any page type
|
|
5
|
+
* without configuration. It uses a three-phase approach:
|
|
6
|
+
* 1. Load event (baseline readiness)
|
|
7
|
+
* 2. Network stability (adapts to request patterns)
|
|
8
|
+
* 3. DOM stability (adapts to mutation rate)
|
|
9
|
+
*/
|
|
10
|
+
import type { CDPConnection } from '../connection/cdp.js';
|
|
11
|
+
/**
|
|
12
|
+
* Options for page readiness detection
|
|
13
|
+
*/
|
|
14
|
+
export interface PageReadinessOptions {
|
|
15
|
+
/**
|
|
16
|
+
* Maximum wait time before proceeding anyway
|
|
17
|
+
* Default: 5000ms (5 seconds)
|
|
18
|
+
*/
|
|
19
|
+
maxWaitMs?: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Wait for page to be ready using self-tuning detection
|
|
23
|
+
*
|
|
24
|
+
* Strategy (always applied):
|
|
25
|
+
* 1. Wait for load event (baseline readiness)
|
|
26
|
+
* 2. Wait for network to stabilize (adaptive 200ms idle)
|
|
27
|
+
* 3. Wait for DOM to stabilize (adaptive 300ms idle)
|
|
28
|
+
*
|
|
29
|
+
* All thresholds adapt to observed page behavior.
|
|
30
|
+
* No framework detection, no configuration needed.
|
|
31
|
+
* Works for static HTML, SPAs, and everything in between.
|
|
32
|
+
*
|
|
33
|
+
* @param cdp - CDP connection
|
|
34
|
+
* @param options - Optional configuration
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```typescript
|
|
38
|
+
* // Default: Wait up to 5s for full stability
|
|
39
|
+
* await waitForPageReady(cdp);
|
|
40
|
+
*
|
|
41
|
+
* // Custom timeout for very slow apps
|
|
42
|
+
* await waitForPageReady(cdp, { maxWaitMs: 15000 });
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export declare function waitForPageReady(cdp: CDPConnection, options?: PageReadinessOptions): Promise<void>;
|
|
46
|
+
//# sourceMappingURL=pageReadiness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pageReadiness.d.ts","sourceRoot":"","sources":["../../src/connection/pageReadiness.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,aAAa,EAClB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,IAAI,CAAC,CAuBf"}
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Smart page readiness detection using self-tuning thresholds
|
|
3
|
+
*
|
|
4
|
+
* This module provides adaptive page load detection that works for any page type
|
|
5
|
+
* without configuration. It uses a three-phase approach:
|
|
6
|
+
* 1. Load event (baseline readiness)
|
|
7
|
+
* 2. Network stability (adapts to request patterns)
|
|
8
|
+
* 3. DOM stability (adapts to mutation rate)
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Wait for page to be ready using self-tuning detection
|
|
12
|
+
*
|
|
13
|
+
* Strategy (always applied):
|
|
14
|
+
* 1. Wait for load event (baseline readiness)
|
|
15
|
+
* 2. Wait for network to stabilize (adaptive 200ms idle)
|
|
16
|
+
* 3. Wait for DOM to stabilize (adaptive 300ms idle)
|
|
17
|
+
*
|
|
18
|
+
* All thresholds adapt to observed page behavior.
|
|
19
|
+
* No framework detection, no configuration needed.
|
|
20
|
+
* Works for static HTML, SPAs, and everything in between.
|
|
21
|
+
*
|
|
22
|
+
* @param cdp - CDP connection
|
|
23
|
+
* @param options - Optional configuration
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* // Default: Wait up to 5s for full stability
|
|
28
|
+
* await waitForPageReady(cdp);
|
|
29
|
+
*
|
|
30
|
+
* // Custom timeout for very slow apps
|
|
31
|
+
* await waitForPageReady(cdp, { maxWaitMs: 15000 });
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export async function waitForPageReady(cdp, options = {}) {
|
|
35
|
+
const maxWaitMs = options.maxWaitMs ?? 5000;
|
|
36
|
+
const deadline = Date.now() + maxWaitMs;
|
|
37
|
+
try {
|
|
38
|
+
// Phase 1: Wait for load event (baseline)
|
|
39
|
+
await waitForLoadEvent(cdp, deadline);
|
|
40
|
+
console.error('[readiness] ✓ Load event');
|
|
41
|
+
// Phase 2: Wait for network stability (always - modern web is async)
|
|
42
|
+
const networkIdleMs = await waitForNetworkStable(cdp, deadline);
|
|
43
|
+
console.error(`[readiness] ✓ Network stable (${networkIdleMs}ms idle)`);
|
|
44
|
+
// Phase 3: Wait for DOM stability (always - SPAs mutate after load)
|
|
45
|
+
const domIdleMs = await waitForDOMStable(cdp, deadline);
|
|
46
|
+
console.error(`[readiness] ✓ DOM stable (${domIdleMs}ms idle)`);
|
|
47
|
+
console.error('[readiness] ✓ Page ready');
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
51
|
+
console.error(`[readiness] ${message}, proceeding anyway`);
|
|
52
|
+
// Don't rethrow - allow session to continue
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Wait for Page.loadEventFired (window.onload equivalent)
|
|
57
|
+
*
|
|
58
|
+
* This is the browser's native load event - fires when:
|
|
59
|
+
* - Document is fully loaded
|
|
60
|
+
* - All synchronous scripts executed
|
|
61
|
+
* - DOMContentLoaded already fired
|
|
62
|
+
*
|
|
63
|
+
* Framework-agnostic baseline.
|
|
64
|
+
*
|
|
65
|
+
* Handles edge case where load event already fired (Chrome navigates during launch).
|
|
66
|
+
*
|
|
67
|
+
* @param cdp - CDP connection
|
|
68
|
+
* @param deadline - Timestamp when to timeout
|
|
69
|
+
* @throws Error if deadline exceeded
|
|
70
|
+
*/
|
|
71
|
+
async function waitForLoadEvent(cdp, deadline) {
|
|
72
|
+
await cdp.send('Page.enable');
|
|
73
|
+
// Check if page already loaded (handles Chrome pre-navigation)
|
|
74
|
+
try {
|
|
75
|
+
const result = await cdp.send('Runtime.evaluate', {
|
|
76
|
+
expression: 'document.readyState',
|
|
77
|
+
returnByValue: true,
|
|
78
|
+
});
|
|
79
|
+
if (result.result?.value === 'complete') {
|
|
80
|
+
// Load event already fired
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// Ignore evaluation errors, proceed to wait for event
|
|
86
|
+
}
|
|
87
|
+
return new Promise((resolve, reject) => {
|
|
88
|
+
let timeout;
|
|
89
|
+
let handlerId;
|
|
90
|
+
const cleanup = () => {
|
|
91
|
+
clearTimeout(timeout);
|
|
92
|
+
if (handlerId !== undefined) {
|
|
93
|
+
cdp.off('Page.loadEventFired', handlerId);
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
const checkDeadline = () => {
|
|
97
|
+
if (Date.now() >= deadline) {
|
|
98
|
+
cleanup();
|
|
99
|
+
reject(new Error('Load event timeout'));
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
timeout = setTimeout(checkDeadline, 100);
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
const loadHandler = () => {
|
|
106
|
+
cleanup();
|
|
107
|
+
resolve();
|
|
108
|
+
};
|
|
109
|
+
handlerId = cdp.on('Page.loadEventFired', loadHandler);
|
|
110
|
+
checkDeadline();
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Wait for network to stabilize
|
|
115
|
+
*
|
|
116
|
+
* Uses a fixed 200ms idle threshold which works well for most pages:
|
|
117
|
+
* - Fast enough for quick sites (avoids unnecessary waiting)
|
|
118
|
+
* - Patient enough for API-heavy apps (catches late requests)
|
|
119
|
+
* - Simpler and more predictable than adaptive learning
|
|
120
|
+
*
|
|
121
|
+
* Network is considered stable when there are zero active requests
|
|
122
|
+
* for at least 200ms continuously.
|
|
123
|
+
*
|
|
124
|
+
* Why this works:
|
|
125
|
+
* - Catches initial request bursts (CSS, JS, images)
|
|
126
|
+
* - Waits for lazy-loaded resources
|
|
127
|
+
* - Detects API calls triggered by hydration
|
|
128
|
+
* - Framework-agnostic - based on actual network activity
|
|
129
|
+
*
|
|
130
|
+
* @param cdp - CDP connection
|
|
131
|
+
* @param deadline - Timestamp when to timeout
|
|
132
|
+
* @returns Actual idle duration detected
|
|
133
|
+
* @throws Error if deadline exceeded
|
|
134
|
+
*/
|
|
135
|
+
async function waitForNetworkStable(cdp, deadline) {
|
|
136
|
+
await cdp.send('Network.enable');
|
|
137
|
+
let activeRequests = 0;
|
|
138
|
+
let lastActivity = Date.now();
|
|
139
|
+
const intervals = [];
|
|
140
|
+
let lastRequestTime = Date.now();
|
|
141
|
+
// Track request patterns
|
|
142
|
+
const requestHandler = () => {
|
|
143
|
+
const now = Date.now();
|
|
144
|
+
const interval = now - lastRequestTime;
|
|
145
|
+
if (interval < 5000)
|
|
146
|
+
intervals.push(interval);
|
|
147
|
+
lastRequestTime = now;
|
|
148
|
+
activeRequests++;
|
|
149
|
+
lastActivity = now;
|
|
150
|
+
};
|
|
151
|
+
const finishHandler = () => {
|
|
152
|
+
activeRequests--;
|
|
153
|
+
if (activeRequests === 0) {
|
|
154
|
+
lastActivity = Date.now();
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
const requestHandlerId = cdp.on('Network.requestWillBeSent', requestHandler);
|
|
158
|
+
const loadingFinishedId = cdp.on('Network.loadingFinished', finishHandler);
|
|
159
|
+
const loadingFailedId = cdp.on('Network.loadingFailed', finishHandler);
|
|
160
|
+
try {
|
|
161
|
+
// Use fixed threshold for immediate detection
|
|
162
|
+
const idleThreshold = 200; // 200ms idle = network stable
|
|
163
|
+
// Detection phase: wait for stability
|
|
164
|
+
while (Date.now() < deadline) {
|
|
165
|
+
if (activeRequests === 0) {
|
|
166
|
+
const idleTime = Date.now() - lastActivity;
|
|
167
|
+
if (idleTime >= idleThreshold) {
|
|
168
|
+
return idleTime; // Success!
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
await delay(50); // Check every 50ms
|
|
172
|
+
}
|
|
173
|
+
throw new Error('Network stability timeout');
|
|
174
|
+
}
|
|
175
|
+
finally {
|
|
176
|
+
// Cleanup handlers
|
|
177
|
+
cdp.off('Network.requestWillBeSent', requestHandlerId);
|
|
178
|
+
cdp.off('Network.loadingFinished', loadingFinishedId);
|
|
179
|
+
cdp.off('Network.loadingFailed', loadingFailedId);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Wait for DOM to stabilize
|
|
184
|
+
*
|
|
185
|
+
* Uses a MutationObserver to detect when the DOM stops changing.
|
|
186
|
+
* DOM is considered stable when there are no mutations for 300ms continuously.
|
|
187
|
+
*
|
|
188
|
+
* HOW IT WORKS:
|
|
189
|
+
* 1. Inject MutationObserver into page to track all DOM changes
|
|
190
|
+
* 2. Monitor childList, attributes, subtree, and characterData changes
|
|
191
|
+
* 3. Wait for 300ms of continuous no-change activity
|
|
192
|
+
* 4. Clean up observer when complete
|
|
193
|
+
*
|
|
194
|
+
* Why this works:
|
|
195
|
+
* - SSR hydration causes DOM mutations (React, Vue, Svelte)
|
|
196
|
+
* - Client-side rendering creates DOM elements
|
|
197
|
+
* - When mutations stop, framework initialization is complete
|
|
198
|
+
* - 300ms is long enough to catch batched updates, short enough to be responsive
|
|
199
|
+
*
|
|
200
|
+
* Framework-agnostic - detects actual mutations regardless of framework.
|
|
201
|
+
*
|
|
202
|
+
* @param cdp - CDP connection
|
|
203
|
+
* @param deadline - Timestamp when to timeout
|
|
204
|
+
* @returns Actual stable duration detected
|
|
205
|
+
* @throws Error if deadline exceeded
|
|
206
|
+
*/
|
|
207
|
+
async function waitForDOMStable(cdp, deadline) {
|
|
208
|
+
// Inject mutation observer
|
|
209
|
+
await cdp.send('Runtime.evaluate', {
|
|
210
|
+
expression: `
|
|
211
|
+
window.__bdg_mutations = 0;
|
|
212
|
+
window.__bdg_lastMutation = Date.now();
|
|
213
|
+
|
|
214
|
+
const observer = new MutationObserver(() => {
|
|
215
|
+
window.__bdg_mutations++;
|
|
216
|
+
window.__bdg_lastMutation = Date.now();
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
observer.observe(document.body, {
|
|
220
|
+
childList: true,
|
|
221
|
+
subtree: true,
|
|
222
|
+
attributes: true,
|
|
223
|
+
characterData: true
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
window.__bdg_observer = observer;
|
|
227
|
+
`,
|
|
228
|
+
});
|
|
229
|
+
try {
|
|
230
|
+
// Use fixed threshold for immediate detection
|
|
231
|
+
const stableThreshold = 300; // 300ms no mutations = DOM stable
|
|
232
|
+
// Detection phase: wait for stability
|
|
233
|
+
while (Date.now() < deadline) {
|
|
234
|
+
const checkResult = await cdp.send('Runtime.evaluate', {
|
|
235
|
+
expression: 'Date.now() - window.__bdg_lastMutation',
|
|
236
|
+
returnByValue: true,
|
|
237
|
+
});
|
|
238
|
+
const timeSinceLastMutation = checkResult.result?.value ?? 0;
|
|
239
|
+
if (timeSinceLastMutation >= stableThreshold) {
|
|
240
|
+
return timeSinceLastMutation; // Success!
|
|
241
|
+
}
|
|
242
|
+
await delay(100); // Check every 100ms
|
|
243
|
+
}
|
|
244
|
+
throw new Error('DOM stability timeout');
|
|
245
|
+
}
|
|
246
|
+
finally {
|
|
247
|
+
// Cleanup observer
|
|
248
|
+
await cdp
|
|
249
|
+
.send('Runtime.evaluate', {
|
|
250
|
+
expression: `
|
|
251
|
+
window.__bdg_observer?.disconnect();
|
|
252
|
+
delete window.__bdg_observer;
|
|
253
|
+
delete window.__bdg_mutations;
|
|
254
|
+
delete window.__bdg_lastMutation;
|
|
255
|
+
`,
|
|
256
|
+
})
|
|
257
|
+
.catch(() => {
|
|
258
|
+
// Ignore cleanup errors
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Delay utility
|
|
264
|
+
*
|
|
265
|
+
* @param ms - Milliseconds to delay
|
|
266
|
+
*/
|
|
267
|
+
function delay(ms) {
|
|
268
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
269
|
+
}
|
|
270
|
+
//# sourceMappingURL=pageReadiness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pageReadiness.js","sourceRoot":"","sources":["../../src/connection/pageReadiness.ts"],"names":[],"mappings":"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"}
|