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
package/dist/daemon/worker.js
CHANGED
|
@@ -15,395 +15,86 @@
|
|
|
15
15
|
* - Worker handles SIGTERM for graceful shutdown
|
|
16
16
|
*/
|
|
17
17
|
import { CDPConnection } from '../connection/cdp.js';
|
|
18
|
-
import { queryBySelector, getNodeInfo, createNodePreview } from '../connection/domOperations.js';
|
|
19
18
|
import { launchChrome } from '../connection/launcher.js';
|
|
19
|
+
import { waitForPageReady } from '../connection/pageReadiness.js';
|
|
20
20
|
import { DEFAULT_PAGE_READINESS_TIMEOUT_MS } from '../constants.js';
|
|
21
|
+
import { TelemetryStore } from '../daemon/worker/TelemetryStore.js';
|
|
22
|
+
import { startTelemetryCollectors } from '../daemon/worker/collectors.js';
|
|
23
|
+
import { createCommandRegistry } from '../daemon/worker/commandRegistry.js';
|
|
24
|
+
import { writeChromePid } from '../session/chrome.js';
|
|
21
25
|
import { writeSessionMetadata } from '../session/metadata.js';
|
|
22
26
|
import { writeSessionOutput } from '../session/output.js';
|
|
23
27
|
import { writePid } from '../session/pid.js';
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
26
|
-
import {
|
|
27
|
-
import {
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
28
|
+
import { isProcessAlive, killChromeProcess } from '../session/process.js';
|
|
29
|
+
import { collectDOM } from '../telemetry/dom.js';
|
|
30
|
+
import { getErrorMessage } from '../ui/errors/index.js';
|
|
31
|
+
import { createLogger } from '../ui/logging/index.js';
|
|
32
|
+
import { chromeExternalConnectionMessage, chromeExternalWebSocketMessage, chromeExternalNoPidMessage, chromeExternalSkipTerminationMessage, noPageTargetFoundError, } from '../ui/messages/chrome.js';
|
|
33
|
+
import { workerUnknownCommand, workerHandlingCommand, workerCommandResponse, workerIPCParseError, workerStdinClosed, workerStdinListenerSetup, workerReadySignalSent, workerCollectingDOM, workerDOMCollected, workerDOMCollectionFailed, workerWritingOutput, workerRunningCleanup, workerClosingCDP, workerShutdownComplete, workerExitingConnectionLoss, workerReceivedSIGTERM, workerReceivedSIGINT, workerTimeoutReached, workerSessionActive, } from '../ui/messages/debug.js';
|
|
30
34
|
import { fetchCDPTargets } from '../utils/http.js';
|
|
31
|
-
import {
|
|
35
|
+
import { filterDefined } from '../utils/objects.js';
|
|
32
36
|
import { normalizeUrl } from '../utils/url.js';
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
*/
|
|
37
|
-
const HIGHLIGHT_COLORS = {
|
|
38
|
-
red: { r: 255, g: 0, b: 0, a: 0.5 },
|
|
39
|
-
blue: { r: 0, g: 0, b: 255, a: 0.5 },
|
|
40
|
-
green: { r: 0, g: 255, b: 0, a: 0.5 },
|
|
41
|
-
yellow: { r: 255, g: 255, b: 0, a: 0.5 },
|
|
42
|
-
orange: { r: 255, g: 165, b: 0, a: 0.5 },
|
|
43
|
-
purple: { r: 128, g: 0, b: 128, a: 0.5 },
|
|
44
|
-
};
|
|
45
|
-
// Global state for cleanup
|
|
37
|
+
const log = createLogger('worker');
|
|
38
|
+
const telemetryStore = new TelemetryStore();
|
|
39
|
+
const commandRegistry = createCommandRegistry(telemetryStore);
|
|
46
40
|
let chrome = null;
|
|
47
41
|
let cdp = null;
|
|
48
42
|
let cleanupFunctions = [];
|
|
49
|
-
// Telemetry data storage
|
|
50
|
-
const networkRequests = [];
|
|
51
|
-
const consoleMessages = [];
|
|
52
|
-
let domData = null;
|
|
53
|
-
// Session metadata
|
|
54
|
-
let sessionStartTime = Date.now();
|
|
55
|
-
let targetInfo = null;
|
|
56
|
-
let activeTelemetry = [];
|
|
57
43
|
/**
|
|
58
44
|
* Parse worker configuration from environment variables or argv.
|
|
59
45
|
*/
|
|
60
46
|
function parseWorkerConfig() {
|
|
61
|
-
// For MVP: parse from argv (future: could use env vars or stdin)
|
|
62
47
|
const args = process.argv.slice(2);
|
|
63
48
|
if (args.length === 0) {
|
|
64
49
|
throw new Error('Worker requires configuration arguments');
|
|
65
50
|
}
|
|
66
|
-
// Parse simple JSON config from first argument
|
|
67
51
|
try {
|
|
68
52
|
const configArg = args[0];
|
|
69
53
|
if (!configArg) {
|
|
70
54
|
throw new Error('Missing configuration argument');
|
|
71
55
|
}
|
|
72
56
|
const config = JSON.parse(configArg);
|
|
73
|
-
|
|
57
|
+
const normalized = {
|
|
74
58
|
url: config.url,
|
|
75
59
|
port: config.port ?? 9222,
|
|
76
|
-
timeout: config.timeout ?? undefined,
|
|
77
60
|
telemetry: config.telemetry ?? ['network', 'console', 'dom'],
|
|
78
61
|
includeAll: config.includeAll ?? false,
|
|
79
|
-
|
|
80
|
-
maxBodySize: config.maxBodySize ?? undefined,
|
|
62
|
+
headless: config.headless ?? false,
|
|
81
63
|
};
|
|
64
|
+
if (config.timeout !== undefined) {
|
|
65
|
+
normalized.timeout = config.timeout;
|
|
66
|
+
}
|
|
67
|
+
if (config.userDataDir !== undefined) {
|
|
68
|
+
normalized.userDataDir = config.userDataDir;
|
|
69
|
+
}
|
|
70
|
+
if (config.maxBodySize !== undefined) {
|
|
71
|
+
normalized.maxBodySize = config.maxBodySize;
|
|
72
|
+
}
|
|
73
|
+
if (config.chromeWsUrl !== undefined) {
|
|
74
|
+
normalized.chromeWsUrl = config.chromeWsUrl;
|
|
75
|
+
}
|
|
76
|
+
return normalized;
|
|
82
77
|
}
|
|
83
78
|
catch (error) {
|
|
84
79
|
throw new Error(`Failed to parse worker config: ${getErrorMessage(error)}`);
|
|
85
80
|
}
|
|
86
81
|
}
|
|
87
|
-
|
|
88
|
-
* Activate telemetry modules based on configuration.
|
|
89
|
-
*/
|
|
90
|
-
async function activateCollectors(config) {
|
|
91
|
-
if (!cdp) {
|
|
92
|
-
throw new Error('CDP connection not initialized');
|
|
93
|
-
}
|
|
94
|
-
activeTelemetry = config.telemetry ?? ['network', 'console', 'dom'];
|
|
95
|
-
for (const collector of activeTelemetry) {
|
|
96
|
-
console.error(workerActivatingCollector(collector));
|
|
97
|
-
switch (collector) {
|
|
98
|
-
case 'network':
|
|
99
|
-
{
|
|
100
|
-
const networkOptions = {
|
|
101
|
-
includeAll: config.includeAll ?? false,
|
|
102
|
-
...(config.maxBodySize !== undefined && { maxBodySize: config.maxBodySize }),
|
|
103
|
-
};
|
|
104
|
-
const cleanup = await startNetworkCollection(cdp, networkRequests, networkOptions);
|
|
105
|
-
cleanupFunctions.push(cleanup);
|
|
106
|
-
}
|
|
107
|
-
break;
|
|
108
|
-
case 'console':
|
|
109
|
-
{
|
|
110
|
-
const cleanup = await startConsoleCollection(cdp, consoleMessages, config.includeAll ?? false);
|
|
111
|
-
cleanupFunctions.push(cleanup);
|
|
112
|
-
}
|
|
113
|
-
break;
|
|
114
|
-
case 'dom':
|
|
115
|
-
{
|
|
116
|
-
const cleanup = await prepareDOMCollection(cdp);
|
|
117
|
-
cleanupFunctions.push(cleanup);
|
|
118
|
-
}
|
|
119
|
-
break;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
console.error(workerCollectorsActivated(activeTelemetry));
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Command handler registry - maps command names to their business logic.
|
|
126
|
-
*/
|
|
127
|
-
const commandHandlers = {
|
|
128
|
-
/**
|
|
129
|
-
* DOM Query Handler - Find elements by CSS selector
|
|
130
|
-
*/
|
|
131
|
-
dom_query: async (cdp, params) => {
|
|
132
|
-
// Ensure DOM is enabled
|
|
133
|
-
await cdp.send('DOM.enable');
|
|
134
|
-
// Query elements
|
|
135
|
-
const nodeIds = await queryBySelector(cdp, params.selector);
|
|
136
|
-
// Get information for each node
|
|
137
|
-
const nodes = [];
|
|
138
|
-
for (let i = 0; i < nodeIds.length; i++) {
|
|
139
|
-
const nodeId = nodeIds[i];
|
|
140
|
-
if (nodeId === undefined)
|
|
141
|
-
continue;
|
|
142
|
-
const nodeInfo = await getNodeInfo(cdp, nodeId);
|
|
143
|
-
nodes.push({
|
|
144
|
-
index: i + 1,
|
|
145
|
-
nodeId: nodeInfo.nodeId,
|
|
146
|
-
...(nodeInfo.tag !== undefined && { tag: nodeInfo.tag }),
|
|
147
|
-
...(nodeInfo.classes !== undefined && { classes: nodeInfo.classes }),
|
|
148
|
-
preview: createNodePreview(nodeInfo),
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
// Write cache for index-based lookups
|
|
152
|
-
writeQueryCache({
|
|
153
|
-
selector: params.selector,
|
|
154
|
-
timestamp: new Date().toISOString(),
|
|
155
|
-
nodes,
|
|
156
|
-
});
|
|
157
|
-
return {
|
|
158
|
-
selector: params.selector,
|
|
159
|
-
count: nodes.length,
|
|
160
|
-
nodes,
|
|
161
|
-
};
|
|
162
|
-
},
|
|
163
|
-
/**
|
|
164
|
-
* DOM Highlight Handler - Highlight elements in browser
|
|
165
|
-
*/
|
|
166
|
-
dom_highlight: async (cdp, params) => {
|
|
167
|
-
// Ensure DOM and Overlay are enabled
|
|
168
|
-
await cdp.send('DOM.enable');
|
|
169
|
-
await cdp.send('Overlay.enable');
|
|
170
|
-
let nodeIds = [];
|
|
171
|
-
// Direct nodeId provided
|
|
172
|
-
if (params.nodeId !== undefined) {
|
|
173
|
-
nodeIds = [params.nodeId];
|
|
174
|
-
}
|
|
175
|
-
else if (params.index !== undefined) {
|
|
176
|
-
// Look up nodeId from cache
|
|
177
|
-
const nodeId = getNodeIdByIndex(params.index);
|
|
178
|
-
if (!nodeId) {
|
|
179
|
-
throw new Error(`No cached element at index ${params.index}. Run 'bdg dom query <selector>' first.`);
|
|
180
|
-
}
|
|
181
|
-
nodeIds = [nodeId];
|
|
182
|
-
}
|
|
183
|
-
else if (params.selector) {
|
|
184
|
-
// Query by selector
|
|
185
|
-
nodeIds = await queryBySelector(cdp, params.selector);
|
|
186
|
-
if (nodeIds.length === 0) {
|
|
187
|
-
throw new Error(`No elements found matching "${params.selector}"`);
|
|
188
|
-
}
|
|
189
|
-
// Apply selector filters
|
|
190
|
-
if (params.first) {
|
|
191
|
-
const firstNode = nodeIds[0];
|
|
192
|
-
if (firstNode === undefined) {
|
|
193
|
-
throw new Error('No elements found');
|
|
194
|
-
}
|
|
195
|
-
nodeIds = [firstNode];
|
|
196
|
-
}
|
|
197
|
-
else if (params.nth !== undefined) {
|
|
198
|
-
if (params.nth < 1 || params.nth > nodeIds.length) {
|
|
199
|
-
throw new Error(`--nth ${params.nth} out of range (found ${nodeIds.length} elements)`);
|
|
200
|
-
}
|
|
201
|
-
const nthNode = nodeIds[params.nth - 1];
|
|
202
|
-
if (nthNode === undefined) {
|
|
203
|
-
throw new Error(`Element at index ${params.nth} not found`);
|
|
204
|
-
}
|
|
205
|
-
nodeIds = [nthNode];
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
else {
|
|
209
|
-
throw new Error('Either selector, index, or nodeId must be provided');
|
|
210
|
-
}
|
|
211
|
-
// Prepare highlight color
|
|
212
|
-
const colorName = (params.color ?? 'red');
|
|
213
|
-
const color = HIGHLIGHT_COLORS[colorName] ?? HIGHLIGHT_COLORS.red;
|
|
214
|
-
const opacity = params.opacity ?? color.a;
|
|
215
|
-
// Highlight each node
|
|
216
|
-
for (const nodeId of nodeIds) {
|
|
217
|
-
await cdp.send('Overlay.highlightNode', {
|
|
218
|
-
highlightConfig: {
|
|
219
|
-
contentColor: { ...color, a: opacity },
|
|
220
|
-
},
|
|
221
|
-
nodeId,
|
|
222
|
-
});
|
|
223
|
-
}
|
|
224
|
-
return {
|
|
225
|
-
highlighted: nodeIds.length,
|
|
226
|
-
nodeIds,
|
|
227
|
-
};
|
|
228
|
-
},
|
|
229
|
-
/**
|
|
230
|
-
* DOM Get Handler - Get full HTML and attributes for elements
|
|
231
|
-
*/
|
|
232
|
-
dom_get: async (cdp, params) => {
|
|
233
|
-
// Ensure DOM is enabled
|
|
234
|
-
await cdp.send('DOM.enable');
|
|
235
|
-
let nodeIds = [];
|
|
236
|
-
// Direct nodeId provided
|
|
237
|
-
if (params.nodeId !== undefined) {
|
|
238
|
-
nodeIds = [params.nodeId];
|
|
239
|
-
}
|
|
240
|
-
else if (params.index !== undefined) {
|
|
241
|
-
// Look up nodeId from cache
|
|
242
|
-
const nodeId = getNodeIdByIndex(params.index);
|
|
243
|
-
if (!nodeId) {
|
|
244
|
-
throw new Error(`No cached element at index ${params.index}. Run 'bdg dom query <selector>' first.`);
|
|
245
|
-
}
|
|
246
|
-
nodeIds = [nodeId];
|
|
247
|
-
}
|
|
248
|
-
else if (params.selector) {
|
|
249
|
-
// Query by selector
|
|
250
|
-
nodeIds = await queryBySelector(cdp, params.selector);
|
|
251
|
-
if (nodeIds.length === 0) {
|
|
252
|
-
throw new Error(`No elements found matching "${params.selector}"`);
|
|
253
|
-
}
|
|
254
|
-
// Apply selector filters
|
|
255
|
-
if (params.nth !== undefined) {
|
|
256
|
-
if (params.nth < 1 || params.nth > nodeIds.length) {
|
|
257
|
-
throw new Error(`--nth ${params.nth} out of range (found ${nodeIds.length} elements)`);
|
|
258
|
-
}
|
|
259
|
-
const nthNode = nodeIds[params.nth - 1];
|
|
260
|
-
if (nthNode === undefined) {
|
|
261
|
-
throw new Error(`Element at index ${params.nth} not found`);
|
|
262
|
-
}
|
|
263
|
-
nodeIds = [nthNode];
|
|
264
|
-
}
|
|
265
|
-
else if (!params.all) {
|
|
266
|
-
// Default: first match only
|
|
267
|
-
const firstNode = nodeIds[0];
|
|
268
|
-
if (firstNode === undefined) {
|
|
269
|
-
throw new Error('No elements found');
|
|
270
|
-
}
|
|
271
|
-
nodeIds = [firstNode];
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
else {
|
|
275
|
-
throw new Error('Either selector, index, or nodeId must be provided');
|
|
276
|
-
}
|
|
277
|
-
// Get information for each node
|
|
278
|
-
const nodes = [];
|
|
279
|
-
for (const nodeId of nodeIds) {
|
|
280
|
-
const info = await getNodeInfo(cdp, nodeId);
|
|
281
|
-
nodes.push({
|
|
282
|
-
nodeId: info.nodeId,
|
|
283
|
-
...(info.tag !== undefined && { tag: info.tag }),
|
|
284
|
-
...(info.attributes !== undefined && { attributes: info.attributes }),
|
|
285
|
-
...(info.classes !== undefined && { classes: info.classes }),
|
|
286
|
-
...(info.outerHTML !== undefined && { outerHTML: info.outerHTML }),
|
|
287
|
-
});
|
|
288
|
-
}
|
|
289
|
-
return {
|
|
290
|
-
nodes,
|
|
291
|
-
};
|
|
292
|
-
},
|
|
293
|
-
/**
|
|
294
|
-
* Worker Peek Handler - Return lightweight preview of collected data
|
|
295
|
-
*/
|
|
296
|
-
worker_peek: async (_cdp, params) => {
|
|
297
|
-
const lastN = Math.min(params.lastN ?? 10, 100); // Cap at 100
|
|
298
|
-
const duration = Date.now() - sessionStartTime;
|
|
299
|
-
// Get last N items (slice from end)
|
|
300
|
-
const recentNetwork = networkRequests.slice(-lastN).map((req) => ({
|
|
301
|
-
requestId: req.requestId,
|
|
302
|
-
timestamp: req.timestamp,
|
|
303
|
-
method: req.method,
|
|
304
|
-
url: req.url,
|
|
305
|
-
...(req.status !== undefined && { status: req.status }),
|
|
306
|
-
...(req.mimeType !== undefined && { mimeType: req.mimeType }),
|
|
307
|
-
}));
|
|
308
|
-
const recentConsole = consoleMessages.slice(-lastN).map((msg) => ({
|
|
309
|
-
timestamp: msg.timestamp,
|
|
310
|
-
type: msg.type,
|
|
311
|
-
text: msg.text,
|
|
312
|
-
}));
|
|
313
|
-
// Return as resolved Promise to satisfy async handler contract
|
|
314
|
-
return Promise.resolve({
|
|
315
|
-
version: VERSION,
|
|
316
|
-
startTime: sessionStartTime,
|
|
317
|
-
duration,
|
|
318
|
-
target: {
|
|
319
|
-
url: targetInfo?.url ?? '',
|
|
320
|
-
title: targetInfo?.title ?? '',
|
|
321
|
-
},
|
|
322
|
-
activeTelemetry,
|
|
323
|
-
network: recentNetwork,
|
|
324
|
-
console: recentConsole,
|
|
325
|
-
});
|
|
326
|
-
},
|
|
327
|
-
/**
|
|
328
|
-
* Worker Details Handler - Return full object for specific item
|
|
329
|
-
*/
|
|
330
|
-
worker_details: async (_cdp, params) => {
|
|
331
|
-
if (params.itemType === 'network') {
|
|
332
|
-
const request = networkRequests.find((r) => r.requestId === params.id);
|
|
333
|
-
if (!request) {
|
|
334
|
-
return Promise.reject(new Error(`Network request not found: ${params.id}`));
|
|
335
|
-
}
|
|
336
|
-
return Promise.resolve({ item: request });
|
|
337
|
-
}
|
|
338
|
-
else if (params.itemType === 'console') {
|
|
339
|
-
const index = parseInt(params.id, 10);
|
|
340
|
-
if (isNaN(index) || index < 0 || index >= consoleMessages.length) {
|
|
341
|
-
return Promise.reject(new Error(`Console message not found at index: ${params.id} (available: 0-${consoleMessages.length - 1})`));
|
|
342
|
-
}
|
|
343
|
-
return Promise.resolve({ item: consoleMessages[index] });
|
|
344
|
-
}
|
|
345
|
-
// Unreachable due to type narrowing, but TypeScript doesn't see it
|
|
346
|
-
return Promise.reject(new Error(`Unknown itemType: ${String(params.itemType)}. Expected 'network' or 'console'.`));
|
|
347
|
-
},
|
|
348
|
-
/**
|
|
349
|
-
* Worker Status Handler - Return live activity metrics and session state
|
|
350
|
-
*
|
|
351
|
-
* Provides comprehensive status information including activity counts,
|
|
352
|
-
* last activity timestamps, current page state, and active telemetry modules.
|
|
353
|
-
* Used by the status command to show detailed session information.
|
|
354
|
-
*/
|
|
355
|
-
worker_status: async (_cdp, _params) => {
|
|
356
|
-
const duration = Date.now() - sessionStartTime;
|
|
357
|
-
// Get last activity timestamps
|
|
358
|
-
const lastNetworkRequest = networkRequests[networkRequests.length - 1];
|
|
359
|
-
const lastConsoleMessage = consoleMessages[consoleMessages.length - 1];
|
|
360
|
-
const result = {
|
|
361
|
-
startTime: sessionStartTime,
|
|
362
|
-
duration,
|
|
363
|
-
target: {
|
|
364
|
-
url: targetInfo?.url ?? '',
|
|
365
|
-
title: targetInfo?.title ?? '',
|
|
366
|
-
},
|
|
367
|
-
activeTelemetry,
|
|
368
|
-
activity: {
|
|
369
|
-
networkRequestsCaptured: networkRequests.length,
|
|
370
|
-
consoleMessagesCaptured: consoleMessages.length,
|
|
371
|
-
...(lastNetworkRequest?.timestamp !== undefined && {
|
|
372
|
-
lastNetworkRequestAt: lastNetworkRequest.timestamp,
|
|
373
|
-
}),
|
|
374
|
-
...(lastConsoleMessage?.timestamp !== undefined && {
|
|
375
|
-
lastConsoleMessageAt: lastConsoleMessage.timestamp,
|
|
376
|
-
}),
|
|
377
|
-
},
|
|
378
|
-
};
|
|
379
|
-
return Promise.resolve(result);
|
|
380
|
-
},
|
|
381
|
-
/**
|
|
382
|
-
* CDP Call Handler - Execute arbitrary CDP method
|
|
383
|
-
*/
|
|
384
|
-
cdp_call: async (cdp, params) => {
|
|
385
|
-
// Execute CDP method with provided parameters
|
|
386
|
-
const result = await cdp.send(params.method, params.params ?? {});
|
|
387
|
-
return { result };
|
|
388
|
-
},
|
|
389
|
-
};
|
|
82
|
+
// Command handlers are defined via createCommandRegistry for modularity.
|
|
390
83
|
/**
|
|
391
84
|
* Handle incoming IPC message from daemon via stdin.
|
|
392
85
|
*/
|
|
393
86
|
async function handleWorkerIPC(message) {
|
|
394
87
|
const commandName = message.type.replace('_request', '');
|
|
395
|
-
const handler =
|
|
88
|
+
const handler = commandRegistry[commandName];
|
|
396
89
|
if (!handler) {
|
|
397
|
-
|
|
90
|
+
log.debug(workerUnknownCommand(commandName));
|
|
398
91
|
return;
|
|
399
92
|
}
|
|
400
|
-
|
|
93
|
+
log.debug(workerHandlingCommand(commandName));
|
|
401
94
|
try {
|
|
402
95
|
if (!cdp)
|
|
403
96
|
throw new Error('CDP connection not initialized');
|
|
404
|
-
// Extract params by removing IPC metadata fields
|
|
405
97
|
const { type: _type, requestId: _requestId, ...params } = message;
|
|
406
|
-
// Call handler with properly typed params
|
|
407
98
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument
|
|
408
99
|
const data = await handler(cdp, params);
|
|
409
100
|
const response = {
|
|
@@ -413,7 +104,7 @@ async function handleWorkerIPC(message) {
|
|
|
413
104
|
data,
|
|
414
105
|
};
|
|
415
106
|
console.log(JSON.stringify(response));
|
|
416
|
-
|
|
107
|
+
log.debug(workerCommandResponse(commandName, true));
|
|
417
108
|
}
|
|
418
109
|
catch (error) {
|
|
419
110
|
const response = {
|
|
@@ -423,7 +114,7 @@ async function handleWorkerIPC(message) {
|
|
|
423
114
|
error: getErrorMessage(error),
|
|
424
115
|
};
|
|
425
116
|
console.log(JSON.stringify(response));
|
|
426
|
-
|
|
117
|
+
log.debug(workerCommandResponse(commandName, false, response.error));
|
|
427
118
|
}
|
|
428
119
|
}
|
|
429
120
|
/**
|
|
@@ -433,7 +124,6 @@ function setupStdinListener() {
|
|
|
433
124
|
let buffer = '';
|
|
434
125
|
process.stdin.on('data', (chunk) => {
|
|
435
126
|
buffer += chunk.toString('utf-8');
|
|
436
|
-
// Process complete JSONL frames (separated by newlines)
|
|
437
127
|
const lines = buffer.split('\n');
|
|
438
128
|
buffer = lines.pop() ?? ''; // Keep incomplete line in buffer
|
|
439
129
|
for (const line of lines) {
|
|
@@ -443,89 +133,74 @@ function setupStdinListener() {
|
|
|
443
133
|
void handleWorkerIPC(message);
|
|
444
134
|
}
|
|
445
135
|
catch (error) {
|
|
446
|
-
|
|
136
|
+
log.debug(workerIPCParseError(getErrorMessage(error)));
|
|
447
137
|
}
|
|
448
138
|
}
|
|
449
139
|
}
|
|
450
140
|
});
|
|
451
141
|
process.stdin.on('end', () => {
|
|
452
|
-
|
|
142
|
+
log.debug(workerStdinClosed());
|
|
453
143
|
});
|
|
454
|
-
|
|
144
|
+
log.debug(workerStdinListenerSetup());
|
|
455
145
|
}
|
|
456
146
|
/**
|
|
457
147
|
* Send worker_ready signal to parent via stdout.
|
|
458
148
|
*/
|
|
459
149
|
function sendReadySignal(config) {
|
|
460
|
-
|
|
461
|
-
|
|
150
|
+
const targetInfo = telemetryStore.targetInfo;
|
|
151
|
+
if (!targetInfo) {
|
|
152
|
+
throw new Error('Cannot send ready signal: Target not initialized');
|
|
462
153
|
}
|
|
154
|
+
const chromePid = chrome?.pid ?? 0;
|
|
463
155
|
const message = {
|
|
464
156
|
type: 'worker_ready',
|
|
465
157
|
requestId: 'ready', // Special requestId for ready signal
|
|
466
158
|
workerPid: process.pid,
|
|
467
|
-
chromePid
|
|
159
|
+
chromePid,
|
|
468
160
|
port: config.port,
|
|
469
161
|
target: {
|
|
470
162
|
url: targetInfo.url,
|
|
471
163
|
title: targetInfo.title,
|
|
472
164
|
},
|
|
473
165
|
};
|
|
474
|
-
// Send JSON line to stdout for parent to parse
|
|
475
166
|
console.log(JSON.stringify(message));
|
|
476
|
-
|
|
167
|
+
log.debug(workerReadySignalSent(process.pid, chromePid));
|
|
477
168
|
}
|
|
478
169
|
/**
|
|
479
|
-
*
|
|
170
|
+
* Graceful shutdown: collect final DOM, write session.json, cleanup.
|
|
480
171
|
*/
|
|
481
|
-
function buildOutput(partial = false) {
|
|
482
|
-
const duration = Date.now() - sessionStartTime;
|
|
483
|
-
const data = {};
|
|
484
|
-
if (networkRequests.length > 0) {
|
|
485
|
-
data.network = networkRequests;
|
|
486
|
-
}
|
|
487
|
-
if (consoleMessages.length > 0) {
|
|
488
|
-
data.console = consoleMessages;
|
|
489
|
-
}
|
|
490
|
-
if (domData) {
|
|
491
|
-
data.dom = domData;
|
|
492
|
-
}
|
|
493
|
-
return {
|
|
494
|
-
version: VERSION,
|
|
495
|
-
success: true,
|
|
496
|
-
timestamp: new Date(sessionStartTime).toISOString(),
|
|
497
|
-
duration,
|
|
498
|
-
target: {
|
|
499
|
-
url: targetInfo?.url ?? '',
|
|
500
|
-
title: targetInfo?.title ?? '',
|
|
501
|
-
},
|
|
502
|
-
data,
|
|
503
|
-
...(partial && { partial: true }),
|
|
504
|
-
};
|
|
505
|
-
}
|
|
506
172
|
/**
|
|
507
|
-
*
|
|
173
|
+
* Unified cleanup handler for all exit scenarios.
|
|
174
|
+
*
|
|
175
|
+
* Handles cleanup for normal shutdown, crashes, and timeouts.
|
|
176
|
+
* Ensures Chrome is always killed and verified dead.
|
|
177
|
+
*
|
|
178
|
+
* @param reason - Why cleanup is happening
|
|
508
179
|
*/
|
|
509
|
-
async function
|
|
510
|
-
|
|
180
|
+
async function cleanupWorker(reason) {
|
|
181
|
+
log.debug(`[worker] Cleanup started (reason: ${reason})`);
|
|
511
182
|
try {
|
|
512
|
-
|
|
513
|
-
if (
|
|
514
|
-
|
|
183
|
+
const chromePid = chrome?.pid;
|
|
184
|
+
if (chromePid) {
|
|
185
|
+
try {
|
|
186
|
+
writeChromePid(chromePid);
|
|
187
|
+
log.debug(`[worker] Chrome PID ${chromePid} cached for cleanup`);
|
|
188
|
+
}
|
|
189
|
+
catch (error) {
|
|
190
|
+
console.error(`[worker] Failed to cache Chrome PID: ${getErrorMessage(error)}`);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
if (reason === 'normal' && telemetryStore.activeTelemetry.includes('dom') && cdp) {
|
|
194
|
+
log.debug(workerCollectingDOM());
|
|
515
195
|
try {
|
|
516
|
-
|
|
517
|
-
|
|
196
|
+
telemetryStore.setDomData(await collectDOM(cdp));
|
|
197
|
+
log.debug(workerDOMCollected());
|
|
518
198
|
}
|
|
519
199
|
catch (error) {
|
|
520
|
-
|
|
200
|
+
log.debug(workerDOMCollectionFailed(getErrorMessage(error)));
|
|
521
201
|
}
|
|
522
202
|
}
|
|
523
|
-
|
|
524
|
-
console.error(workerWritingOutput());
|
|
525
|
-
const finalOutput = buildOutput(false);
|
|
526
|
-
writeSessionOutput(finalOutput);
|
|
527
|
-
// Run cleanup functions
|
|
528
|
-
console.error(workerRunningCleanup());
|
|
203
|
+
log.debug(workerRunningCleanup());
|
|
529
204
|
for (const cleanup of cleanupFunctions) {
|
|
530
205
|
try {
|
|
531
206
|
cleanup();
|
|
@@ -534,23 +209,79 @@ async function gracefulShutdown() {
|
|
|
534
209
|
console.error(`[worker] Cleanup function error: ${getErrorMessage(error)}`);
|
|
535
210
|
}
|
|
536
211
|
}
|
|
537
|
-
// Close CDP connection
|
|
538
212
|
if (cdp) {
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
213
|
+
try {
|
|
214
|
+
log.debug(workerClosingCDP());
|
|
215
|
+
cdp.close();
|
|
216
|
+
cdp = null;
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
console.error(`[worker] Error closing CDP: ${getErrorMessage(error)}`);
|
|
220
|
+
}
|
|
542
221
|
}
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
222
|
+
if (chrome && chromePid) {
|
|
223
|
+
try {
|
|
224
|
+
console.error(`[worker] Terminating Chrome (PID ${chromePid})...`);
|
|
225
|
+
await chrome.kill();
|
|
226
|
+
let attempts = 0;
|
|
227
|
+
const maxAttempts = 10;
|
|
228
|
+
while (attempts < maxAttempts) {
|
|
229
|
+
if (!isProcessAlive(chromePid)) {
|
|
230
|
+
log.debug(`[worker] Chrome process ${chromePid} confirmed dead`);
|
|
231
|
+
break;
|
|
232
|
+
}
|
|
233
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
234
|
+
attempts++;
|
|
235
|
+
}
|
|
236
|
+
if (isProcessAlive(chromePid)) {
|
|
237
|
+
console.error(`[worker] Chrome did not die gracefully, force killing...`);
|
|
238
|
+
try {
|
|
239
|
+
killChromeProcess(chromePid, 'SIGKILL');
|
|
240
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
241
|
+
if (isProcessAlive(chromePid)) {
|
|
242
|
+
console.error(`[worker] WARNING: Chrome process ${chromePid} survived SIGKILL`);
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
log.debug(`[worker] Chrome process ${chromePid} force killed successfully`);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
catch (error) {
|
|
249
|
+
console.error(`[worker] Failed to force kill Chrome: ${getErrorMessage(error)}`);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
chrome = null;
|
|
253
|
+
}
|
|
254
|
+
catch (error) {
|
|
255
|
+
console.error(`[worker] Error killing Chrome: ${getErrorMessage(error)}`);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
else if (!chrome) {
|
|
259
|
+
console.error(`[worker] ${chromeExternalSkipTerminationMessage()}`);
|
|
548
260
|
}
|
|
549
|
-
|
|
261
|
+
if (reason === 'normal') {
|
|
262
|
+
try {
|
|
263
|
+
log.debug(workerWritingOutput());
|
|
264
|
+
const finalOutput = telemetryStore.buildOutput(false);
|
|
265
|
+
writeSessionOutput(finalOutput);
|
|
266
|
+
}
|
|
267
|
+
catch (error) {
|
|
268
|
+
console.error(`[worker] Error writing final output: ${getErrorMessage(error)}`);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
try {
|
|
273
|
+
log.debug(`[worker] Writing partial output (reason: ${reason})`);
|
|
274
|
+
const partialOutput = telemetryStore.buildOutput(true); // partial=true
|
|
275
|
+
writeSessionOutput(partialOutput);
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
console.error(`[worker] Error writing partial output: ${getErrorMessage(error)}`);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
log.debug(workerShutdownComplete());
|
|
550
282
|
}
|
|
551
283
|
catch (error) {
|
|
552
|
-
console.error(`[worker] Error during
|
|
553
|
-
throw error;
|
|
284
|
+
console.error(`[worker] Error during cleanup: ${getErrorMessage(error)}`);
|
|
554
285
|
}
|
|
555
286
|
}
|
|
556
287
|
/**
|
|
@@ -560,120 +291,137 @@ async function main() {
|
|
|
560
291
|
console.error(`[worker] Starting (PID ${process.pid})`);
|
|
561
292
|
let config;
|
|
562
293
|
try {
|
|
563
|
-
// Parse configuration
|
|
564
294
|
config = parseWorkerConfig();
|
|
565
295
|
console.error(`[worker] Config: ${JSON.stringify(config)}`);
|
|
566
|
-
|
|
296
|
+
telemetryStore.resetSessionStart();
|
|
297
|
+
telemetryStore.setDomData(null);
|
|
298
|
+
telemetryStore.networkRequests.length = 0;
|
|
299
|
+
telemetryStore.consoleMessages.length = 0;
|
|
300
|
+
telemetryStore.navigationEvents.length = 0;
|
|
301
|
+
telemetryStore.setTargetInfo(null);
|
|
567
302
|
writePid(process.pid);
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
console.error(`[worker] Connecting to Chrome via CDP...`);
|
|
582
|
-
const targets = await fetchCDPTargets(config.port);
|
|
583
|
-
// Find target by exact URL match, fallback to hostname match
|
|
584
|
-
let target = targets.find((t) => t.url === normalizedUrl);
|
|
585
|
-
if (!target) {
|
|
586
|
-
const urlObj = new URL(normalizedUrl);
|
|
587
|
-
target = targets.find((t) => t.url.includes(urlObj.hostname));
|
|
303
|
+
if (config.chromeWsUrl) {
|
|
304
|
+
console.error(`[worker] ${chromeExternalConnectionMessage()}`);
|
|
305
|
+
console.error(`[worker] ${chromeExternalWebSocketMessage(config.chromeWsUrl)}`);
|
|
306
|
+
chrome = null;
|
|
307
|
+
const targetId = config.chromeWsUrl.split('/').pop() ?? 'external';
|
|
308
|
+
telemetryStore.setTargetInfo({
|
|
309
|
+
id: targetId,
|
|
310
|
+
type: 'page',
|
|
311
|
+
title: 'External Chrome',
|
|
312
|
+
url: config.url,
|
|
313
|
+
webSocketDebuggerUrl: config.chromeWsUrl,
|
|
314
|
+
});
|
|
315
|
+
console.error(`[worker] ${chromeExternalNoPidMessage()}`);
|
|
588
316
|
}
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
const
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
317
|
+
else {
|
|
318
|
+
console.error(`[worker] Launching Chrome on port ${config.port}...`);
|
|
319
|
+
const launchOptions = {
|
|
320
|
+
port: config.port,
|
|
321
|
+
...filterDefined({
|
|
322
|
+
userDataDir: config.userDataDir,
|
|
323
|
+
headless: config.headless,
|
|
324
|
+
}),
|
|
325
|
+
};
|
|
326
|
+
chrome = await launchChrome(launchOptions);
|
|
327
|
+
console.error(`[worker] Chrome launched (PID ${chrome.pid})`);
|
|
328
|
+
writeChromePid(chrome.pid);
|
|
329
|
+
console.error(`[worker] Chrome PID ${chrome.pid} cached for emergency cleanup`);
|
|
330
|
+
console.error(`[worker] Connecting to Chrome via CDP...`);
|
|
331
|
+
const targets = await fetchCDPTargets(config.port);
|
|
332
|
+
const foundTarget = targets.find((t) => t.type === 'page');
|
|
333
|
+
if (!foundTarget) {
|
|
334
|
+
const availableTargets = targets.length
|
|
335
|
+
? targets
|
|
336
|
+
.map((t, i) => ` ${i + 1}. ${t.title || '(no title)'}\n URL: ${t.url}\n Type: ${t.type}`)
|
|
337
|
+
.join('\n')
|
|
338
|
+
: null;
|
|
339
|
+
throw new Error(noPageTargetFoundError(config.port, availableTargets));
|
|
340
|
+
}
|
|
341
|
+
telemetryStore.setTargetInfo(foundTarget);
|
|
342
|
+
console.error(`[worker] Found target: ${foundTarget.title} (${foundTarget.url})`);
|
|
343
|
+
}
|
|
344
|
+
if (!telemetryStore.targetInfo) {
|
|
345
|
+
throw new Error('Failed to obtain target information');
|
|
607
346
|
}
|
|
608
|
-
targetInfo = target;
|
|
609
|
-
console.error(`[worker] Found target: ${target.title} (${target.url})`);
|
|
610
|
-
// Establish CDP connection
|
|
611
347
|
cdp = new CDPConnection();
|
|
612
|
-
await cdp.connect(
|
|
348
|
+
await cdp.connect(telemetryStore.targetInfo.webSocketDebuggerUrl, {
|
|
613
349
|
autoReconnect: false,
|
|
614
350
|
maxRetries: 10,
|
|
615
|
-
// P1.1:
|
|
616
|
-
// WHY: Prevents zombie worker processes
|
|
351
|
+
// P1.1: Run cleanup if Chrome dies unexpectedly
|
|
352
|
+
// WHY: Prevents zombie worker processes and ensures Chrome cleanup
|
|
617
353
|
onDisconnect: (code, reason) => {
|
|
618
354
|
console.error(`[worker] Chrome connection lost (code: ${code}, reason: ${reason})`);
|
|
619
|
-
|
|
620
|
-
process.exit(
|
|
355
|
+
log.debug(workerExitingConnectionLoss());
|
|
356
|
+
void cleanupWorker('crash').then(() => process.exit(1));
|
|
621
357
|
},
|
|
622
358
|
});
|
|
623
359
|
console.error(`[worker] CDP connection established`);
|
|
624
|
-
//
|
|
360
|
+
// CRITICAL: Activate telemetry modules BEFORE navigating to target URL
|
|
361
|
+
// WHY: Network/Console events are only captured for requests that start
|
|
362
|
+
console.error(`[worker] Activating collectors before navigation...`);
|
|
363
|
+
const telemetryCleanups = await startTelemetryCollectors(cdp, config, telemetryStore, log);
|
|
364
|
+
cleanupFunctions.push(...telemetryCleanups);
|
|
365
|
+
console.error(`[worker] Collectors active and ready to capture telemetry`);
|
|
366
|
+
const normalizedUrl = normalizeUrl(config.url);
|
|
367
|
+
console.error(`[worker] Navigating to ${normalizedUrl}...`);
|
|
368
|
+
await cdp.send('Page.navigate', { url: normalizedUrl });
|
|
625
369
|
await waitForPageReady(cdp, {
|
|
626
370
|
maxWaitMs: DEFAULT_PAGE_READINESS_TIMEOUT_MS,
|
|
627
371
|
});
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
372
|
+
console.error(`[worker] Page ready`);
|
|
373
|
+
if (chrome && telemetryStore.targetInfo) {
|
|
374
|
+
const currentTargetId = telemetryStore.targetInfo.id;
|
|
375
|
+
const updatedTargets = await fetchCDPTargets(config.port);
|
|
376
|
+
const updatedTarget = updatedTargets.find((t) => t.id === currentTargetId);
|
|
377
|
+
if (updatedTarget) {
|
|
378
|
+
telemetryStore.setTargetInfo(updatedTarget);
|
|
379
|
+
console.error(`[worker] Target updated: ${updatedTarget.title} (${updatedTarget.url})`);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
631
382
|
writeSessionMetadata({
|
|
632
383
|
bdgPid: process.pid,
|
|
633
|
-
chromePid: chrome
|
|
634
|
-
startTime: sessionStartTime,
|
|
384
|
+
chromePid: chrome?.pid ?? 0, // 0 indicates external Chrome (not managed by bdg)
|
|
385
|
+
startTime: telemetryStore.sessionStartTime,
|
|
635
386
|
port: config.port,
|
|
636
|
-
targetId:
|
|
637
|
-
webSocketDebuggerUrl:
|
|
638
|
-
activeTelemetry,
|
|
387
|
+
targetId: telemetryStore.targetInfo?.id,
|
|
388
|
+
webSocketDebuggerUrl: telemetryStore.targetInfo?.webSocketDebuggerUrl,
|
|
389
|
+
activeTelemetry: telemetryStore.activeTelemetry,
|
|
639
390
|
});
|
|
640
391
|
console.error(`[worker] Session metadata written`);
|
|
641
|
-
// Send ready signal to parent
|
|
642
392
|
sendReadySignal(config);
|
|
643
|
-
// Set up stdin listener for IPC commands from daemon
|
|
644
393
|
setupStdinListener();
|
|
645
|
-
// Set up shutdown handlers
|
|
646
394
|
process.on('SIGTERM', () => {
|
|
647
|
-
|
|
648
|
-
void
|
|
395
|
+
log.debug(workerReceivedSIGTERM());
|
|
396
|
+
void (async () => {
|
|
397
|
+
await cleanupWorker('normal');
|
|
398
|
+
process.exit(0);
|
|
399
|
+
})();
|
|
649
400
|
});
|
|
650
401
|
process.on('SIGINT', () => {
|
|
651
|
-
|
|
652
|
-
void
|
|
402
|
+
log.debug(workerReceivedSIGINT());
|
|
403
|
+
void (async () => {
|
|
404
|
+
await cleanupWorker('normal');
|
|
405
|
+
process.exit(0);
|
|
406
|
+
})();
|
|
653
407
|
});
|
|
654
|
-
// Handle timeout if specified
|
|
655
408
|
if (config.timeout) {
|
|
656
409
|
console.error(`[worker] Auto-stop after ${config.timeout}s`);
|
|
657
410
|
setTimeout(() => {
|
|
658
|
-
|
|
659
|
-
void
|
|
411
|
+
log.debug(workerTimeoutReached());
|
|
412
|
+
void (async () => {
|
|
413
|
+
await cleanupWorker('timeout');
|
|
414
|
+
process.exit(0);
|
|
415
|
+
})();
|
|
660
416
|
}, config.timeout * 1000);
|
|
661
417
|
}
|
|
662
|
-
|
|
663
|
-
console.error(workerSessionActive());
|
|
418
|
+
log.debug(workerSessionActive());
|
|
664
419
|
}
|
|
665
420
|
catch (error) {
|
|
666
421
|
console.error(`[worker] Fatal error: ${getErrorMessage(error)}`);
|
|
667
|
-
|
|
668
|
-
if (cdp) {
|
|
669
|
-
cdp.close();
|
|
670
|
-
}
|
|
671
|
-
if (chrome) {
|
|
672
|
-
await chrome.kill();
|
|
673
|
-
}
|
|
422
|
+
await cleanupWorker('crash');
|
|
674
423
|
process.exit(1);
|
|
675
424
|
}
|
|
676
425
|
}
|
|
677
|
-
// Start worker
|
|
678
426
|
void main();
|
|
679
427
|
//# sourceMappingURL=worker.js.map
|