browser-debugger-cli 0.3.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__/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/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 +12 -15
- package/dist/commands/cleanup.js.map +1 -1
- package/dist/commands/dom.d.ts.map +1 -1
- package/dist/commands/dom.js +13 -19
- package/dist/commands/dom.js.map +1 -1
- package/dist/commands/domEvalHelpers.d.ts +1 -1
- package/dist/commands/domEvalHelpers.d.ts.map +1 -1
- package/dist/commands/domEvalHelpers.js +56 -7
- 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/shared/CommandRunner.d.ts.map +1 -1
- package/dist/commands/shared/CommandRunner.js +2 -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 +9 -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.js +1 -1
- 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 -55
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/stop.d.ts.map +1 -1
- package/dist/commands/stop.js +11 -25
- 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/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 +130 -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 +4 -2
- 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 +206 -529
- 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 +3 -1
- package/dist/ipc/client.d.ts.map +1 -1
- package/dist/ipc/client.js +27 -14
- package/dist/ipc/client.js.map +1 -1
- package/dist/ipc/commands.d.ts +1 -0
- package/dist/ipc/commands.d.ts.map +1 -1
- 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 +2 -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/formatters/status.d.ts.map +1 -1
- package/dist/ui/formatters/status.js +1 -1
- package/dist/ui/formatters/status.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 +50 -1
- package/dist/ui/messages/chrome.d.ts.map +1 -1
- package/dist/ui/messages/chrome.js +77 -0
- package/dist/ui/messages/chrome.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/preview.js +1 -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/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 +54 -0
- package/dist/utils/filters.js.map +1 -1
- package/dist/utils/pageReadiness.js +24 -25
- 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.map +1 -1
- package/dist/utils/url.js +10 -0
- 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 +2 -1
- 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,445 +15,77 @@
|
|
|
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 {
|
|
32
|
-
import { waitForPageReady } from '../utils/pageReadiness.js';
|
|
35
|
+
import { filterDefined } from '../utils/objects.js';
|
|
33
36
|
import { normalizeUrl } from '../utils/url.js';
|
|
34
|
-
import { VERSION } from '../utils/version.js';
|
|
35
37
|
const log = createLogger('worker');
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
*/
|
|
39
|
-
const HIGHLIGHT_COLORS = {
|
|
40
|
-
red: { r: 255, g: 0, b: 0, a: 0.5 },
|
|
41
|
-
blue: { r: 0, g: 0, b: 255, a: 0.5 },
|
|
42
|
-
green: { r: 0, g: 255, b: 0, a: 0.5 },
|
|
43
|
-
yellow: { r: 255, g: 255, b: 0, a: 0.5 },
|
|
44
|
-
orange: { r: 255, g: 165, b: 0, a: 0.5 },
|
|
45
|
-
purple: { r: 128, g: 0, b: 128, a: 0.5 },
|
|
46
|
-
};
|
|
47
|
-
// Global state for cleanup
|
|
38
|
+
const telemetryStore = new TelemetryStore();
|
|
39
|
+
const commandRegistry = createCommandRegistry(telemetryStore);
|
|
48
40
|
let chrome = null;
|
|
49
41
|
let cdp = null;
|
|
50
42
|
let cleanupFunctions = [];
|
|
51
|
-
// Telemetry data storage
|
|
52
|
-
const networkRequests = [];
|
|
53
|
-
const consoleMessages = [];
|
|
54
|
-
let domData = null;
|
|
55
|
-
// Session metadata
|
|
56
|
-
let sessionStartTime = Date.now();
|
|
57
|
-
let targetInfo = null;
|
|
58
|
-
let activeTelemetry = [];
|
|
59
43
|
/**
|
|
60
44
|
* Parse worker configuration from environment variables or argv.
|
|
61
45
|
*/
|
|
62
46
|
function parseWorkerConfig() {
|
|
63
|
-
// For MVP: parse from argv (future: could use env vars or stdin)
|
|
64
47
|
const args = process.argv.slice(2);
|
|
65
48
|
if (args.length === 0) {
|
|
66
49
|
throw new Error('Worker requires configuration arguments');
|
|
67
50
|
}
|
|
68
|
-
// Parse simple JSON config from first argument
|
|
69
51
|
try {
|
|
70
52
|
const configArg = args[0];
|
|
71
53
|
if (!configArg) {
|
|
72
54
|
throw new Error('Missing configuration argument');
|
|
73
55
|
}
|
|
74
56
|
const config = JSON.parse(configArg);
|
|
75
|
-
|
|
57
|
+
const normalized = {
|
|
76
58
|
url: config.url,
|
|
77
59
|
port: config.port ?? 9222,
|
|
78
|
-
timeout: config.timeout ?? undefined,
|
|
79
60
|
telemetry: config.telemetry ?? ['network', 'console', 'dom'],
|
|
80
61
|
includeAll: config.includeAll ?? false,
|
|
81
|
-
|
|
82
|
-
maxBodySize: config.maxBodySize ?? undefined,
|
|
62
|
+
headless: config.headless ?? false,
|
|
83
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;
|
|
84
77
|
}
|
|
85
78
|
catch (error) {
|
|
86
79
|
throw new Error(`Failed to parse worker config: ${getErrorMessage(error)}`);
|
|
87
80
|
}
|
|
88
81
|
}
|
|
89
|
-
|
|
90
|
-
* Activate telemetry modules based on configuration.
|
|
91
|
-
*/
|
|
92
|
-
async function activateCollectors(config) {
|
|
93
|
-
if (!cdp) {
|
|
94
|
-
throw new Error('CDP connection not initialized');
|
|
95
|
-
}
|
|
96
|
-
activeTelemetry = config.telemetry ?? ['network', 'console', 'dom'];
|
|
97
|
-
for (const collector of activeTelemetry) {
|
|
98
|
-
log.debug(workerActivatingCollector(collector));
|
|
99
|
-
switch (collector) {
|
|
100
|
-
case 'network':
|
|
101
|
-
{
|
|
102
|
-
const networkOptions = {
|
|
103
|
-
includeAll: config.includeAll ?? false,
|
|
104
|
-
...(config.maxBodySize !== undefined && { maxBodySize: config.maxBodySize }),
|
|
105
|
-
};
|
|
106
|
-
const cleanup = await startNetworkCollection(cdp, networkRequests, networkOptions);
|
|
107
|
-
cleanupFunctions.push(cleanup);
|
|
108
|
-
}
|
|
109
|
-
break;
|
|
110
|
-
case 'console':
|
|
111
|
-
{
|
|
112
|
-
const cleanup = await startConsoleCollection(cdp, consoleMessages, config.includeAll ?? false);
|
|
113
|
-
cleanupFunctions.push(cleanup);
|
|
114
|
-
}
|
|
115
|
-
break;
|
|
116
|
-
case 'dom':
|
|
117
|
-
{
|
|
118
|
-
const cleanup = await prepareDOMCollection(cdp);
|
|
119
|
-
cleanupFunctions.push(cleanup);
|
|
120
|
-
}
|
|
121
|
-
break;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
log.debug(workerCollectorsActivated(activeTelemetry));
|
|
125
|
-
}
|
|
126
|
-
/**
|
|
127
|
-
* Command handler registry - maps command names to their business logic.
|
|
128
|
-
*/
|
|
129
|
-
const commandHandlers = {
|
|
130
|
-
/**
|
|
131
|
-
* DOM Query Handler - Find elements by CSS selector
|
|
132
|
-
*/
|
|
133
|
-
dom_query: async (cdp, params) => {
|
|
134
|
-
// Ensure DOM is enabled
|
|
135
|
-
await cdp.send('DOM.enable');
|
|
136
|
-
// Query elements
|
|
137
|
-
const nodeIds = await queryBySelector(cdp, params.selector);
|
|
138
|
-
// Get information for each node
|
|
139
|
-
const nodes = [];
|
|
140
|
-
for (let i = 0; i < nodeIds.length; i++) {
|
|
141
|
-
const nodeId = nodeIds[i];
|
|
142
|
-
if (nodeId === undefined)
|
|
143
|
-
continue;
|
|
144
|
-
const nodeInfo = await getNodeInfo(cdp, nodeId);
|
|
145
|
-
nodes.push({
|
|
146
|
-
index: i + 1,
|
|
147
|
-
nodeId: nodeInfo.nodeId,
|
|
148
|
-
...(nodeInfo.tag !== undefined && { tag: nodeInfo.tag }),
|
|
149
|
-
...(nodeInfo.classes !== undefined && { classes: nodeInfo.classes }),
|
|
150
|
-
preview: createNodePreview(nodeInfo),
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
// Write cache for index-based lookups
|
|
154
|
-
writeQueryCache({
|
|
155
|
-
selector: params.selector,
|
|
156
|
-
timestamp: new Date().toISOString(),
|
|
157
|
-
nodes,
|
|
158
|
-
});
|
|
159
|
-
return {
|
|
160
|
-
selector: params.selector,
|
|
161
|
-
count: nodes.length,
|
|
162
|
-
nodes,
|
|
163
|
-
};
|
|
164
|
-
},
|
|
165
|
-
/**
|
|
166
|
-
* DOM Highlight Handler - Highlight elements in browser
|
|
167
|
-
*/
|
|
168
|
-
dom_highlight: async (cdp, params) => {
|
|
169
|
-
// Ensure DOM and Overlay are enabled
|
|
170
|
-
await cdp.send('DOM.enable');
|
|
171
|
-
await cdp.send('Overlay.enable');
|
|
172
|
-
let nodeIds = [];
|
|
173
|
-
// Direct nodeId provided
|
|
174
|
-
if (params.nodeId !== undefined) {
|
|
175
|
-
nodeIds = [params.nodeId];
|
|
176
|
-
}
|
|
177
|
-
else if (params.index !== undefined) {
|
|
178
|
-
// Look up nodeId from cache
|
|
179
|
-
const nodeId = getNodeIdByIndex(params.index);
|
|
180
|
-
if (!nodeId) {
|
|
181
|
-
throw new Error(`No cached element at index ${params.index}. Run 'bdg dom query <selector>' first.`);
|
|
182
|
-
}
|
|
183
|
-
nodeIds = [nodeId];
|
|
184
|
-
}
|
|
185
|
-
else if (params.selector) {
|
|
186
|
-
// Query by selector
|
|
187
|
-
nodeIds = await queryBySelector(cdp, params.selector);
|
|
188
|
-
if (nodeIds.length === 0) {
|
|
189
|
-
throw new Error(`No elements found matching "${params.selector}"`);
|
|
190
|
-
}
|
|
191
|
-
// Apply selector filters
|
|
192
|
-
if (params.first) {
|
|
193
|
-
const firstNode = nodeIds[0];
|
|
194
|
-
if (firstNode === undefined) {
|
|
195
|
-
throw new Error('No elements found');
|
|
196
|
-
}
|
|
197
|
-
nodeIds = [firstNode];
|
|
198
|
-
}
|
|
199
|
-
else if (params.nth !== undefined) {
|
|
200
|
-
if (params.nth < 1 || params.nth > nodeIds.length) {
|
|
201
|
-
throw new Error(`--nth ${params.nth} out of range (found ${nodeIds.length} elements)`);
|
|
202
|
-
}
|
|
203
|
-
const nthNode = nodeIds[params.nth - 1];
|
|
204
|
-
if (nthNode === undefined) {
|
|
205
|
-
throw new Error(`Element at index ${params.nth} not found`);
|
|
206
|
-
}
|
|
207
|
-
nodeIds = [nthNode];
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
else {
|
|
211
|
-
throw new Error('Either selector, index, or nodeId must be provided');
|
|
212
|
-
}
|
|
213
|
-
// Prepare highlight color
|
|
214
|
-
const colorName = (params.color ?? 'red');
|
|
215
|
-
const color = HIGHLIGHT_COLORS[colorName] ?? HIGHLIGHT_COLORS.red;
|
|
216
|
-
const opacity = params.opacity ?? color.a;
|
|
217
|
-
// Highlight each node
|
|
218
|
-
for (const nodeId of nodeIds) {
|
|
219
|
-
await cdp.send('Overlay.highlightNode', {
|
|
220
|
-
highlightConfig: {
|
|
221
|
-
contentColor: { ...color, a: opacity },
|
|
222
|
-
},
|
|
223
|
-
nodeId,
|
|
224
|
-
});
|
|
225
|
-
}
|
|
226
|
-
return {
|
|
227
|
-
highlighted: nodeIds.length,
|
|
228
|
-
nodeIds,
|
|
229
|
-
};
|
|
230
|
-
},
|
|
231
|
-
/**
|
|
232
|
-
* DOM Get Handler - Get full HTML and attributes for elements
|
|
233
|
-
*/
|
|
234
|
-
dom_get: async (cdp, params) => {
|
|
235
|
-
// Ensure DOM is enabled
|
|
236
|
-
await cdp.send('DOM.enable');
|
|
237
|
-
let nodeIds = [];
|
|
238
|
-
// Direct nodeId provided
|
|
239
|
-
if (params.nodeId !== undefined) {
|
|
240
|
-
nodeIds = [params.nodeId];
|
|
241
|
-
}
|
|
242
|
-
else if (params.index !== undefined) {
|
|
243
|
-
// Look up nodeId from cache
|
|
244
|
-
const nodeId = getNodeIdByIndex(params.index);
|
|
245
|
-
if (!nodeId) {
|
|
246
|
-
throw new Error(`No cached element at index ${params.index}. Run 'bdg dom query <selector>' first.`);
|
|
247
|
-
}
|
|
248
|
-
nodeIds = [nodeId];
|
|
249
|
-
}
|
|
250
|
-
else if (params.selector) {
|
|
251
|
-
// Query by selector
|
|
252
|
-
nodeIds = await queryBySelector(cdp, params.selector);
|
|
253
|
-
if (nodeIds.length === 0) {
|
|
254
|
-
throw new Error(`No elements found matching "${params.selector}"`);
|
|
255
|
-
}
|
|
256
|
-
// Apply selector filters
|
|
257
|
-
if (params.nth !== undefined) {
|
|
258
|
-
if (params.nth < 1 || params.nth > nodeIds.length) {
|
|
259
|
-
throw new Error(`--nth ${params.nth} out of range (found ${nodeIds.length} elements)`);
|
|
260
|
-
}
|
|
261
|
-
const nthNode = nodeIds[params.nth - 1];
|
|
262
|
-
if (nthNode === undefined) {
|
|
263
|
-
throw new Error(`Element at index ${params.nth} not found`);
|
|
264
|
-
}
|
|
265
|
-
nodeIds = [nthNode];
|
|
266
|
-
}
|
|
267
|
-
else if (!params.all) {
|
|
268
|
-
// Default: first match only
|
|
269
|
-
const firstNode = nodeIds[0];
|
|
270
|
-
if (firstNode === undefined) {
|
|
271
|
-
throw new Error('No elements found');
|
|
272
|
-
}
|
|
273
|
-
nodeIds = [firstNode];
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
else {
|
|
277
|
-
throw new Error('Either selector, index, or nodeId must be provided');
|
|
278
|
-
}
|
|
279
|
-
// Get information for each node
|
|
280
|
-
const nodes = [];
|
|
281
|
-
for (const nodeId of nodeIds) {
|
|
282
|
-
const info = await getNodeInfo(cdp, nodeId);
|
|
283
|
-
nodes.push({
|
|
284
|
-
nodeId: info.nodeId,
|
|
285
|
-
...(info.tag !== undefined && { tag: info.tag }),
|
|
286
|
-
...(info.attributes !== undefined && { attributes: info.attributes }),
|
|
287
|
-
...(info.classes !== undefined && { classes: info.classes }),
|
|
288
|
-
...(info.outerHTML !== undefined && { outerHTML: info.outerHTML }),
|
|
289
|
-
});
|
|
290
|
-
}
|
|
291
|
-
return {
|
|
292
|
-
nodes,
|
|
293
|
-
};
|
|
294
|
-
},
|
|
295
|
-
/**
|
|
296
|
-
* DOM Screenshot Handler - Capture page screenshot
|
|
297
|
-
*/
|
|
298
|
-
dom_screenshot: async (cdp, params) => {
|
|
299
|
-
const fs = await import('node:fs/promises');
|
|
300
|
-
const path = await import('node:path');
|
|
301
|
-
// Validate path
|
|
302
|
-
const absolutePath = path.resolve(params.path);
|
|
303
|
-
// Ensure parent directory exists
|
|
304
|
-
const parentDir = path.dirname(absolutePath);
|
|
305
|
-
try {
|
|
306
|
-
await fs.mkdir(parentDir, { recursive: true });
|
|
307
|
-
}
|
|
308
|
-
catch (error) {
|
|
309
|
-
if (error && typeof error === 'object' && 'code' in error && error.code !== 'EEXIST') {
|
|
310
|
-
throw new Error(`Cannot create directory ${parentDir}: ${getErrorMessage(error)}`);
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
// Set defaults
|
|
314
|
-
const format = params.format ?? 'png';
|
|
315
|
-
const quality = params.quality;
|
|
316
|
-
const fullPage = params.fullPage ?? true;
|
|
317
|
-
// Validate quality for JPEG
|
|
318
|
-
if (format === 'jpeg' && quality !== undefined && (quality < 0 || quality > 100)) {
|
|
319
|
-
throw new Error('JPEG quality must be between 0 and 100');
|
|
320
|
-
}
|
|
321
|
-
// Capture screenshot via CDP
|
|
322
|
-
const screenshotParams = {
|
|
323
|
-
format,
|
|
324
|
-
...(format === 'jpeg' && quality !== undefined && { quality }),
|
|
325
|
-
...(fullPage && { captureBeyondViewport: true }),
|
|
326
|
-
};
|
|
327
|
-
const response = (await cdp.send('Page.captureScreenshot', screenshotParams));
|
|
328
|
-
const imageData = Buffer.from(response.data, 'base64');
|
|
329
|
-
// Write file
|
|
330
|
-
await fs.writeFile(absolutePath, imageData);
|
|
331
|
-
// Get file stats
|
|
332
|
-
const stats = await fs.stat(absolutePath);
|
|
333
|
-
// Get viewport dimensions if not full page
|
|
334
|
-
let viewport;
|
|
335
|
-
if (!fullPage) {
|
|
336
|
-
const metrics = (await cdp.send('Page.getLayoutMetrics'));
|
|
337
|
-
viewport = {
|
|
338
|
-
width: metrics.layoutViewport.clientWidth,
|
|
339
|
-
height: metrics.layoutViewport.clientHeight,
|
|
340
|
-
};
|
|
341
|
-
}
|
|
342
|
-
const layoutMetrics = (await cdp.send('Page.getLayoutMetrics'));
|
|
343
|
-
return {
|
|
344
|
-
path: absolutePath,
|
|
345
|
-
format,
|
|
346
|
-
...(format === 'jpeg' && quality !== undefined && { quality }),
|
|
347
|
-
width: layoutMetrics.contentSize.width,
|
|
348
|
-
height: layoutMetrics.contentSize.height,
|
|
349
|
-
size: stats.size,
|
|
350
|
-
...(viewport && { viewport }),
|
|
351
|
-
fullPage,
|
|
352
|
-
};
|
|
353
|
-
},
|
|
354
|
-
/**
|
|
355
|
-
* Worker Peek Handler - Return lightweight preview of collected data
|
|
356
|
-
*/
|
|
357
|
-
worker_peek: async (_cdp, params) => {
|
|
358
|
-
const lastN = Math.min(params.lastN ?? 10, 100); // Cap at 100
|
|
359
|
-
const duration = Date.now() - sessionStartTime;
|
|
360
|
-
// Get last N items (slice from end)
|
|
361
|
-
const recentNetwork = networkRequests.slice(-lastN).map((req) => ({
|
|
362
|
-
requestId: req.requestId,
|
|
363
|
-
timestamp: req.timestamp,
|
|
364
|
-
method: req.method,
|
|
365
|
-
url: req.url,
|
|
366
|
-
...(req.status !== undefined && { status: req.status }),
|
|
367
|
-
...(req.mimeType !== undefined && { mimeType: req.mimeType }),
|
|
368
|
-
}));
|
|
369
|
-
const recentConsole = consoleMessages.slice(-lastN).map((msg) => ({
|
|
370
|
-
timestamp: msg.timestamp,
|
|
371
|
-
type: msg.type,
|
|
372
|
-
text: msg.text,
|
|
373
|
-
}));
|
|
374
|
-
// Return as resolved Promise to satisfy async handler contract
|
|
375
|
-
return Promise.resolve({
|
|
376
|
-
version: VERSION,
|
|
377
|
-
startTime: sessionStartTime,
|
|
378
|
-
duration,
|
|
379
|
-
target: {
|
|
380
|
-
url: targetInfo?.url ?? '',
|
|
381
|
-
title: targetInfo?.title ?? '',
|
|
382
|
-
},
|
|
383
|
-
activeTelemetry,
|
|
384
|
-
network: recentNetwork,
|
|
385
|
-
console: recentConsole,
|
|
386
|
-
});
|
|
387
|
-
},
|
|
388
|
-
/**
|
|
389
|
-
* Worker Details Handler - Return full object for specific item
|
|
390
|
-
*/
|
|
391
|
-
worker_details: async (_cdp, params) => {
|
|
392
|
-
if (params.itemType === 'network') {
|
|
393
|
-
const request = networkRequests.find((r) => r.requestId === params.id);
|
|
394
|
-
if (!request) {
|
|
395
|
-
return Promise.reject(new Error(`Network request not found: ${params.id}`));
|
|
396
|
-
}
|
|
397
|
-
return Promise.resolve({ item: request });
|
|
398
|
-
}
|
|
399
|
-
else if (params.itemType === 'console') {
|
|
400
|
-
const index = parseInt(params.id, 10);
|
|
401
|
-
if (isNaN(index) || index < 0 || index >= consoleMessages.length) {
|
|
402
|
-
return Promise.reject(new Error(`Console message not found at index: ${params.id} (available: 0-${consoleMessages.length - 1})`));
|
|
403
|
-
}
|
|
404
|
-
return Promise.resolve({ item: consoleMessages[index] });
|
|
405
|
-
}
|
|
406
|
-
// Unreachable due to type narrowing, but TypeScript doesn't see it
|
|
407
|
-
return Promise.reject(new Error(`Unknown itemType: ${String(params.itemType)}. Expected 'network' or 'console'.`));
|
|
408
|
-
},
|
|
409
|
-
/**
|
|
410
|
-
* Worker Status Handler - Return live activity metrics and session state
|
|
411
|
-
*
|
|
412
|
-
* Provides comprehensive status information including activity counts,
|
|
413
|
-
* last activity timestamps, current page state, and active telemetry modules.
|
|
414
|
-
* Used by the status command to show detailed session information.
|
|
415
|
-
*/
|
|
416
|
-
worker_status: async (_cdp, _params) => {
|
|
417
|
-
const duration = Date.now() - sessionStartTime;
|
|
418
|
-
// Get last activity timestamps
|
|
419
|
-
const lastNetworkRequest = networkRequests[networkRequests.length - 1];
|
|
420
|
-
const lastConsoleMessage = consoleMessages[consoleMessages.length - 1];
|
|
421
|
-
const result = {
|
|
422
|
-
startTime: sessionStartTime,
|
|
423
|
-
duration,
|
|
424
|
-
target: {
|
|
425
|
-
url: targetInfo?.url ?? '',
|
|
426
|
-
title: targetInfo?.title ?? '',
|
|
427
|
-
},
|
|
428
|
-
activeTelemetry,
|
|
429
|
-
activity: {
|
|
430
|
-
networkRequestsCaptured: networkRequests.length,
|
|
431
|
-
consoleMessagesCaptured: consoleMessages.length,
|
|
432
|
-
...(lastNetworkRequest?.timestamp !== undefined && {
|
|
433
|
-
lastNetworkRequestAt: lastNetworkRequest.timestamp,
|
|
434
|
-
}),
|
|
435
|
-
...(lastConsoleMessage?.timestamp !== undefined && {
|
|
436
|
-
lastConsoleMessageAt: lastConsoleMessage.timestamp,
|
|
437
|
-
}),
|
|
438
|
-
},
|
|
439
|
-
};
|
|
440
|
-
return Promise.resolve(result);
|
|
441
|
-
},
|
|
442
|
-
/**
|
|
443
|
-
* CDP Call Handler - Execute arbitrary CDP method
|
|
444
|
-
*/
|
|
445
|
-
cdp_call: async (cdp, params) => {
|
|
446
|
-
// Execute CDP method with provided parameters
|
|
447
|
-
const result = await cdp.send(params.method, params.params ?? {});
|
|
448
|
-
return { result };
|
|
449
|
-
},
|
|
450
|
-
};
|
|
82
|
+
// Command handlers are defined via createCommandRegistry for modularity.
|
|
451
83
|
/**
|
|
452
84
|
* Handle incoming IPC message from daemon via stdin.
|
|
453
85
|
*/
|
|
454
86
|
async function handleWorkerIPC(message) {
|
|
455
87
|
const commandName = message.type.replace('_request', '');
|
|
456
|
-
const handler =
|
|
88
|
+
const handler = commandRegistry[commandName];
|
|
457
89
|
if (!handler) {
|
|
458
90
|
log.debug(workerUnknownCommand(commandName));
|
|
459
91
|
return;
|
|
@@ -462,9 +94,7 @@ async function handleWorkerIPC(message) {
|
|
|
462
94
|
try {
|
|
463
95
|
if (!cdp)
|
|
464
96
|
throw new Error('CDP connection not initialized');
|
|
465
|
-
// Extract params by removing IPC metadata fields
|
|
466
97
|
const { type: _type, requestId: _requestId, ...params } = message;
|
|
467
|
-
// Call handler with properly typed params
|
|
468
98
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument
|
|
469
99
|
const data = await handler(cdp, params);
|
|
470
100
|
const response = {
|
|
@@ -494,7 +124,6 @@ function setupStdinListener() {
|
|
|
494
124
|
let buffer = '';
|
|
495
125
|
process.stdin.on('data', (chunk) => {
|
|
496
126
|
buffer += chunk.toString('utf-8');
|
|
497
|
-
// Process complete JSONL frames (separated by newlines)
|
|
498
127
|
const lines = buffer.split('\n');
|
|
499
128
|
buffer = lines.pop() ?? ''; // Keep incomplete line in buffer
|
|
500
129
|
for (const line of lines) {
|
|
@@ -518,74 +147,59 @@ function setupStdinListener() {
|
|
|
518
147
|
* Send worker_ready signal to parent via stdout.
|
|
519
148
|
*/
|
|
520
149
|
function sendReadySignal(config) {
|
|
521
|
-
|
|
522
|
-
|
|
150
|
+
const targetInfo = telemetryStore.targetInfo;
|
|
151
|
+
if (!targetInfo) {
|
|
152
|
+
throw new Error('Cannot send ready signal: Target not initialized');
|
|
523
153
|
}
|
|
154
|
+
const chromePid = chrome?.pid ?? 0;
|
|
524
155
|
const message = {
|
|
525
156
|
type: 'worker_ready',
|
|
526
157
|
requestId: 'ready', // Special requestId for ready signal
|
|
527
158
|
workerPid: process.pid,
|
|
528
|
-
chromePid
|
|
159
|
+
chromePid,
|
|
529
160
|
port: config.port,
|
|
530
161
|
target: {
|
|
531
162
|
url: targetInfo.url,
|
|
532
163
|
title: targetInfo.title,
|
|
533
164
|
},
|
|
534
165
|
};
|
|
535
|
-
// Send JSON line to stdout for parent to parse
|
|
536
166
|
console.log(JSON.stringify(message));
|
|
537
|
-
log.debug(workerReadySignalSent(process.pid,
|
|
167
|
+
log.debug(workerReadySignalSent(process.pid, chromePid));
|
|
538
168
|
}
|
|
539
169
|
/**
|
|
540
|
-
*
|
|
170
|
+
* Graceful shutdown: collect final DOM, write session.json, cleanup.
|
|
541
171
|
*/
|
|
542
|
-
function buildOutput(partial = false) {
|
|
543
|
-
const duration = Date.now() - sessionStartTime;
|
|
544
|
-
const data = {};
|
|
545
|
-
if (networkRequests.length > 0) {
|
|
546
|
-
data.network = networkRequests;
|
|
547
|
-
}
|
|
548
|
-
if (consoleMessages.length > 0) {
|
|
549
|
-
data.console = consoleMessages;
|
|
550
|
-
}
|
|
551
|
-
if (domData) {
|
|
552
|
-
data.dom = domData;
|
|
553
|
-
}
|
|
554
|
-
return {
|
|
555
|
-
version: VERSION,
|
|
556
|
-
success: true,
|
|
557
|
-
timestamp: new Date(sessionStartTime).toISOString(),
|
|
558
|
-
duration,
|
|
559
|
-
target: {
|
|
560
|
-
url: targetInfo?.url ?? '',
|
|
561
|
-
title: targetInfo?.title ?? '',
|
|
562
|
-
},
|
|
563
|
-
data,
|
|
564
|
-
...(partial && { partial: true }),
|
|
565
|
-
};
|
|
566
|
-
}
|
|
567
172
|
/**
|
|
568
|
-
*
|
|
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
|
|
569
179
|
*/
|
|
570
|
-
async function
|
|
571
|
-
log.debug(
|
|
180
|
+
async function cleanupWorker(reason) {
|
|
181
|
+
log.debug(`[worker] Cleanup started (reason: ${reason})`);
|
|
572
182
|
try {
|
|
573
|
-
|
|
574
|
-
if (
|
|
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) {
|
|
575
194
|
log.debug(workerCollectingDOM());
|
|
576
195
|
try {
|
|
577
|
-
|
|
196
|
+
telemetryStore.setDomData(await collectDOM(cdp));
|
|
578
197
|
log.debug(workerDOMCollected());
|
|
579
198
|
}
|
|
580
199
|
catch (error) {
|
|
581
200
|
log.debug(workerDOMCollectionFailed(getErrorMessage(error)));
|
|
582
201
|
}
|
|
583
202
|
}
|
|
584
|
-
// Write final output
|
|
585
|
-
log.debug(workerWritingOutput());
|
|
586
|
-
const finalOutput = buildOutput(false);
|
|
587
|
-
writeSessionOutput(finalOutput);
|
|
588
|
-
// Run cleanup functions
|
|
589
203
|
log.debug(workerRunningCleanup());
|
|
590
204
|
for (const cleanup of cleanupFunctions) {
|
|
591
205
|
try {
|
|
@@ -595,23 +209,79 @@ async function gracefulShutdown() {
|
|
|
595
209
|
console.error(`[worker] Cleanup function error: ${getErrorMessage(error)}`);
|
|
596
210
|
}
|
|
597
211
|
}
|
|
598
|
-
// Close CDP connection
|
|
599
212
|
if (cdp) {
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
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
|
+
}
|
|
603
221
|
}
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
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()}`);
|
|
260
|
+
}
|
|
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
|
+
}
|
|
609
280
|
}
|
|
610
281
|
log.debug(workerShutdownComplete());
|
|
611
282
|
}
|
|
612
283
|
catch (error) {
|
|
613
|
-
console.error(`[worker] Error during
|
|
614
|
-
throw error;
|
|
284
|
+
console.error(`[worker] Error during cleanup: ${getErrorMessage(error)}`);
|
|
615
285
|
}
|
|
616
286
|
}
|
|
617
287
|
/**
|
|
@@ -621,130 +291,137 @@ async function main() {
|
|
|
621
291
|
console.error(`[worker] Starting (PID ${process.pid})`);
|
|
622
292
|
let config;
|
|
623
293
|
try {
|
|
624
|
-
// Parse configuration
|
|
625
294
|
config = parseWorkerConfig();
|
|
626
295
|
console.error(`[worker] Config: ${JSON.stringify(config)}`);
|
|
627
|
-
|
|
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);
|
|
628
302
|
writePid(process.pid);
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
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()}`);
|
|
316
|
+
}
|
|
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');
|
|
661
346
|
}
|
|
662
|
-
targetInfo = target;
|
|
663
|
-
console.error(`[worker] Found target: ${target.title} (${target.url})`);
|
|
664
|
-
// Establish CDP connection
|
|
665
347
|
cdp = new CDPConnection();
|
|
666
|
-
await cdp.connect(
|
|
348
|
+
await cdp.connect(telemetryStore.targetInfo.webSocketDebuggerUrl, {
|
|
667
349
|
autoReconnect: false,
|
|
668
350
|
maxRetries: 10,
|
|
669
|
-
// P1.1:
|
|
670
|
-
// WHY: Prevents zombie worker processes
|
|
351
|
+
// P1.1: Run cleanup if Chrome dies unexpectedly
|
|
352
|
+
// WHY: Prevents zombie worker processes and ensures Chrome cleanup
|
|
671
353
|
onDisconnect: (code, reason) => {
|
|
672
354
|
console.error(`[worker] Chrome connection lost (code: ${code}, reason: ${reason})`);
|
|
673
355
|
log.debug(workerExitingConnectionLoss());
|
|
674
|
-
process.exit(
|
|
356
|
+
void cleanupWorker('crash').then(() => process.exit(1));
|
|
675
357
|
},
|
|
676
358
|
});
|
|
677
359
|
console.error(`[worker] CDP connection established`);
|
|
678
360
|
// CRITICAL: Activate telemetry modules BEFORE navigating to target URL
|
|
679
361
|
// WHY: Network/Console events are only captured for requests that start
|
|
680
|
-
// AFTER Network.enable/Runtime.enable are called. If we navigate first,
|
|
681
|
-
// we miss all initial page load requests and console messages.
|
|
682
362
|
console.error(`[worker] Activating collectors before navigation...`);
|
|
683
|
-
await
|
|
363
|
+
const telemetryCleanups = await startTelemetryCollectors(cdp, config, telemetryStore, log);
|
|
364
|
+
cleanupFunctions.push(...telemetryCleanups);
|
|
684
365
|
console.error(`[worker] Collectors active and ready to capture telemetry`);
|
|
685
|
-
// NOW navigate to the target URL
|
|
686
366
|
const normalizedUrl = normalizeUrl(config.url);
|
|
687
367
|
console.error(`[worker] Navigating to ${normalizedUrl}...`);
|
|
688
368
|
await cdp.send('Page.navigate', { url: normalizedUrl });
|
|
689
|
-
// Wait for page to be ready using smart detection
|
|
690
369
|
await waitForPageReady(cdp, {
|
|
691
370
|
maxWaitMs: DEFAULT_PAGE_READINESS_TIMEOUT_MS,
|
|
692
371
|
});
|
|
693
372
|
console.error(`[worker] Page ready`);
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
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
|
+
}
|
|
700
381
|
}
|
|
701
|
-
// Write session metadata for status command
|
|
702
382
|
writeSessionMetadata({
|
|
703
383
|
bdgPid: process.pid,
|
|
704
|
-
chromePid: chrome
|
|
705
|
-
startTime: sessionStartTime,
|
|
384
|
+
chromePid: chrome?.pid ?? 0, // 0 indicates external Chrome (not managed by bdg)
|
|
385
|
+
startTime: telemetryStore.sessionStartTime,
|
|
706
386
|
port: config.port,
|
|
707
|
-
targetId:
|
|
708
|
-
webSocketDebuggerUrl:
|
|
709
|
-
activeTelemetry,
|
|
387
|
+
targetId: telemetryStore.targetInfo?.id,
|
|
388
|
+
webSocketDebuggerUrl: telemetryStore.targetInfo?.webSocketDebuggerUrl,
|
|
389
|
+
activeTelemetry: telemetryStore.activeTelemetry,
|
|
710
390
|
});
|
|
711
391
|
console.error(`[worker] Session metadata written`);
|
|
712
|
-
// Send ready signal to parent
|
|
713
392
|
sendReadySignal(config);
|
|
714
|
-
// Set up stdin listener for IPC commands from daemon
|
|
715
393
|
setupStdinListener();
|
|
716
|
-
// Set up shutdown handlers
|
|
717
394
|
process.on('SIGTERM', () => {
|
|
718
395
|
log.debug(workerReceivedSIGTERM());
|
|
719
|
-
void
|
|
396
|
+
void (async () => {
|
|
397
|
+
await cleanupWorker('normal');
|
|
398
|
+
process.exit(0);
|
|
399
|
+
})();
|
|
720
400
|
});
|
|
721
401
|
process.on('SIGINT', () => {
|
|
722
402
|
log.debug(workerReceivedSIGINT());
|
|
723
|
-
void
|
|
403
|
+
void (async () => {
|
|
404
|
+
await cleanupWorker('normal');
|
|
405
|
+
process.exit(0);
|
|
406
|
+
})();
|
|
724
407
|
});
|
|
725
|
-
// Handle timeout if specified
|
|
726
408
|
if (config.timeout) {
|
|
727
409
|
console.error(`[worker] Auto-stop after ${config.timeout}s`);
|
|
728
410
|
setTimeout(() => {
|
|
729
411
|
log.debug(workerTimeoutReached());
|
|
730
|
-
void
|
|
412
|
+
void (async () => {
|
|
413
|
+
await cleanupWorker('timeout');
|
|
414
|
+
process.exit(0);
|
|
415
|
+
})();
|
|
731
416
|
}, config.timeout * 1000);
|
|
732
417
|
}
|
|
733
|
-
// Keep process alive
|
|
734
418
|
log.debug(workerSessionActive());
|
|
735
419
|
}
|
|
736
420
|
catch (error) {
|
|
737
421
|
console.error(`[worker] Fatal error: ${getErrorMessage(error)}`);
|
|
738
|
-
|
|
739
|
-
if (cdp) {
|
|
740
|
-
cdp.close();
|
|
741
|
-
}
|
|
742
|
-
if (chrome) {
|
|
743
|
-
await chrome.kill();
|
|
744
|
-
}
|
|
422
|
+
await cleanupWorker('crash');
|
|
745
423
|
process.exit(1);
|
|
746
424
|
}
|
|
747
425
|
}
|
|
748
|
-
// Start worker
|
|
749
426
|
void main();
|
|
750
427
|
//# sourceMappingURL=worker.js.map
|