browser-debugger-cli 0.0.1-alpha.0 → 0.1.0-alpha.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/LICENSE +21 -0
- package/README.md +167 -52
- package/dist/__testfixtures__/cdpMessages.d.ts +43 -0
- package/dist/__testfixtures__/cdpMessages.d.ts.map +1 -0
- package/dist/__testfixtures__/cdpMessages.js +118 -0
- package/dist/__testfixtures__/cdpMessages.js.map +1 -0
- package/dist/__testfixtures__/connectionTargets.d.ts +21 -0
- package/dist/__testfixtures__/connectionTargets.d.ts.map +1 -0
- package/dist/__testfixtures__/connectionTargets.js +59 -0
- package/dist/__testfixtures__/connectionTargets.js.map +1 -0
- package/dist/__tests__/integration/session-files.integration.test.d.ts +2 -0
- package/dist/__tests__/integration/session-files.integration.test.d.ts.map +1 -0
- package/dist/__tests__/integration/session-files.integration.test.js +66 -0
- package/dist/__tests__/integration/session-files.integration.test.js.map +1 -0
- package/dist/__testutils__/FakeClock.d.ts +67 -0
- package/dist/__testutils__/FakeClock.d.ts.map +1 -0
- package/dist/__testutils__/FakeClock.js +132 -0
- package/dist/__testutils__/FakeClock.js.map +1 -0
- package/dist/__testutils__/FakeWebSocket.d.ts +106 -0
- package/dist/__testutils__/FakeWebSocket.d.ts.map +1 -0
- package/dist/__testutils__/FakeWebSocket.js +213 -0
- package/dist/__testutils__/FakeWebSocket.js.map +1 -0
- package/dist/__testutils__/assertions.d.ts +33 -0
- package/dist/__testutils__/assertions.d.ts.map +1 -0
- package/dist/__testutils__/assertions.js +57 -0
- package/dist/__testutils__/assertions.js.map +1 -0
- package/dist/__testutils__/index.d.ts +15 -0
- package/dist/__testutils__/index.d.ts.map +1 -0
- package/dist/__testutils__/index.js +15 -0
- package/dist/__testutils__/index.js.map +1 -0
- package/dist/__testutils__/testClock.d.ts +28 -0
- package/dist/__testutils__/testClock.d.ts.map +1 -0
- package/dist/__testutils__/testClock.js +81 -0
- package/dist/__testutils__/testClock.js.map +1 -0
- package/dist/__testutils__/testFixtures.d.ts +15 -0
- package/dist/__testutils__/testFixtures.d.ts.map +1 -0
- package/dist/__testutils__/testFixtures.js +23 -0
- package/dist/__testutils__/testFixtures.js.map +1 -0
- package/dist/__testutils__/testProcess.d.ts +46 -0
- package/dist/__testutils__/testProcess.d.ts.map +1 -0
- package/dist/__testutils__/testProcess.js +77 -0
- package/dist/__testutils__/testProcess.js.map +1 -0
- package/dist/cli/collectors/dom.d.ts +8 -0
- package/dist/cli/collectors/dom.d.ts.map +1 -0
- package/dist/cli/collectors/dom.js +361 -0
- package/dist/cli/collectors/dom.js.map +1 -0
- package/dist/cli/collectors/helpers/domCache.d.ts +40 -0
- package/dist/cli/collectors/helpers/domCache.d.ts.map +1 -0
- package/dist/cli/collectors/helpers/domCache.js +79 -0
- package/dist/cli/collectors/helpers/domCache.js.map +1 -0
- package/dist/cli/collectors/helpers/domQuery.d.ts +45 -0
- package/dist/cli/collectors/helpers/domQuery.d.ts.map +1 -0
- package/dist/cli/collectors/helpers/domQuery.js +100 -0
- package/dist/cli/collectors/helpers/domQuery.js.map +1 -0
- package/dist/cli/collectors/helpers/selectorParser.d.ts +20 -0
- package/dist/cli/collectors/helpers/selectorParser.d.ts.map +1 -0
- package/dist/cli/collectors/helpers/selectorParser.js +20 -0
- package/dist/cli/collectors/helpers/selectorParser.js.map +1 -0
- package/dist/cli/commands/__tests__/cdp.contract.test.d.ts +24 -0
- package/dist/cli/commands/__tests__/cdp.contract.test.d.ts.map +1 -0
- package/dist/cli/commands/__tests__/cdp.contract.test.js +467 -0
- package/dist/cli/commands/__tests__/cdp.contract.test.js.map +1 -0
- package/dist/cli/commands/__tests__/ipcTest.test.d.ts +2 -0
- package/dist/cli/commands/__tests__/ipcTest.test.d.ts.map +1 -0
- package/dist/cli/commands/__tests__/ipcTest.test.js +37 -0
- package/dist/cli/commands/__tests__/ipcTest.test.js.map +1 -0
- package/dist/cli/commands/cdp.d.ts +8 -0
- package/dist/cli/commands/cdp.d.ts.map +1 -0
- package/dist/cli/commands/cdp.js +45 -0
- package/dist/cli/commands/cdp.js.map +1 -0
- package/dist/cli/commands/cleanup.d.ts +8 -0
- package/dist/cli/commands/cleanup.d.ts.map +1 -0
- package/dist/cli/commands/cleanup.js +130 -0
- package/dist/cli/commands/cleanup.js.map +1 -0
- package/dist/cli/commands/console.d.ts +8 -0
- package/dist/cli/commands/console.d.ts.map +1 -0
- package/dist/cli/commands/console.js +97 -0
- package/dist/cli/commands/console.js.map +1 -0
- package/dist/cli/commands/details.d.ts +8 -0
- package/dist/cli/commands/details.d.ts.map +1 -0
- package/dist/cli/commands/details.js +68 -0
- package/dist/cli/commands/details.js.map +1 -0
- package/dist/cli/commands/dom/helpers/domCache.d.ts +36 -0
- package/dist/cli/commands/dom/helpers/domCache.d.ts.map +1 -0
- package/dist/cli/commands/dom/helpers/domCache.js +65 -0
- package/dist/cli/commands/dom/helpers/domCache.js.map +1 -0
- package/dist/cli/commands/dom/helpers/domQuery.d.ts +48 -0
- package/dist/cli/commands/dom/helpers/domQuery.d.ts.map +1 -0
- package/dist/cli/commands/dom/helpers/domQuery.js +104 -0
- package/dist/cli/commands/dom/helpers/domQuery.js.map +1 -0
- package/dist/cli/commands/dom/helpers/errorHandler.d.ts +45 -0
- package/dist/cli/commands/dom/helpers/errorHandler.d.ts.map +1 -0
- package/dist/cli/commands/dom/helpers/errorHandler.js +70 -0
- package/dist/cli/commands/dom/helpers/errorHandler.js.map +1 -0
- package/dist/cli/commands/dom/helpers/evalHelpers.d.ts +52 -0
- package/dist/cli/commands/dom/helpers/evalHelpers.d.ts.map +1 -0
- package/dist/cli/commands/dom/helpers/evalHelpers.js +75 -0
- package/dist/cli/commands/dom/helpers/evalHelpers.js.map +1 -0
- package/dist/cli/commands/dom/helpers/optionsBuilder.d.ts +35 -0
- package/dist/cli/commands/dom/helpers/optionsBuilder.d.ts.map +1 -0
- package/dist/cli/commands/dom/helpers/optionsBuilder.js +51 -0
- package/dist/cli/commands/dom/helpers/optionsBuilder.js.map +1 -0
- package/dist/cli/commands/dom/helpers/selectorParser.d.ts +20 -0
- package/dist/cli/commands/dom/helpers/selectorParser.d.ts.map +1 -0
- package/dist/cli/commands/dom/helpers/selectorParser.js +20 -0
- package/dist/cli/commands/dom/helpers/selectorParser.js.map +1 -0
- package/dist/cli/commands/dom/index.d.ts +8 -0
- package/dist/cli/commands/dom/index.d.ts.map +1 -0
- package/dist/cli/commands/dom/index.js +257 -0
- package/dist/cli/commands/dom/index.js.map +1 -0
- package/dist/cli/commands/ipcTest.d.ts +23 -0
- package/dist/cli/commands/ipcTest.d.ts.map +1 -0
- package/dist/cli/commands/ipcTest.js +181 -0
- package/dist/cli/commands/ipcTest.js.map +1 -0
- package/dist/cli/commands/network.d.ts +8 -0
- package/dist/cli/commands/network.d.ts.map +1 -0
- package/dist/cli/commands/network.js +40 -0
- package/dist/cli/commands/network.js.map +1 -0
- package/dist/cli/commands/peek.d.ts +8 -0
- package/dist/cli/commands/peek.d.ts.map +1 -0
- package/dist/cli/commands/peek.js +109 -0
- package/dist/cli/commands/peek.js.map +1 -0
- 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 +127 -0
- package/dist/cli/commands/query.js.map +1 -0
- package/dist/cli/commands/start.d.ts +9 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +78 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/status.d.ts +9 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +84 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/stop.d.ts +8 -0
- package/dist/cli/commands/stop.d.ts.map +1 -0
- package/dist/cli/commands/stop.js +146 -0
- package/dist/cli/commands/stop.js.map +1 -0
- package/dist/cli/formatters/detailsFormatter.d.ts +10 -0
- package/dist/cli/formatters/detailsFormatter.d.ts.map +1 -0
- package/dist/cli/formatters/detailsFormatter.js +63 -0
- package/dist/cli/formatters/detailsFormatter.js.map +1 -0
- package/dist/cli/formatters/previewFormatter.d.ts +27 -0
- package/dist/cli/formatters/previewFormatter.d.ts.map +1 -0
- package/dist/cli/formatters/previewFormatter.js +160 -0
- package/dist/cli/formatters/previewFormatter.js.map +1 -0
- package/dist/cli/formatters/statusFormatter.d.ts +34 -0
- package/dist/cli/formatters/statusFormatter.d.ts.map +1 -0
- package/dist/cli/formatters/statusFormatter.js +108 -0
- package/dist/cli/formatters/statusFormatter.js.map +1 -0
- 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/CommandRunner.d.ts +60 -0
- package/dist/cli/handlers/CommandRunner.d.ts.map +1 -0
- package/dist/cli/handlers/CommandRunner.js +81 -0
- package/dist/cli/handlers/CommandRunner.js.map +1 -0
- package/dist/cli/handlers/OutputBuilder.d.ts +60 -0
- package/dist/cli/handlers/OutputBuilder.d.ts.map +1 -0
- package/dist/cli/handlers/OutputBuilder.js +138 -0
- package/dist/cli/handlers/OutputBuilder.js.map +1 -0
- 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 +119 -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 +38 -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 +38 -0
- package/dist/cli/handlers/ShutdownController.d.ts.map +1 -0
- package/dist/cli/handlers/ShutdownController.js +83 -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/commonOptions.d.ts +54 -0
- package/dist/cli/handlers/commonOptions.d.ts.map +1 -0
- package/dist/cli/handlers/commonOptions.js +64 -0
- package/dist/cli/handlers/commonOptions.js.map +1 -0
- package/dist/cli/handlers/daemonSessionController.d.ts +23 -0
- package/dist/cli/handlers/daemonSessionController.d.ts.map +1 -0
- package/dist/cli/handlers/daemonSessionController.js +108 -0
- package/dist/cli/handlers/daemonSessionController.js.map +1 -0
- package/dist/cli/handlers/sessionController.d.ts +21 -0
- package/dist/cli/handlers/sessionController.d.ts.map +1 -0
- package/dist/cli/handlers/sessionController.js +55 -0
- package/dist/cli/handlers/sessionController.js.map +1 -0
- package/dist/cli/registry.d.ts +11 -0
- package/dist/cli/registry.d.ts.map +1 -0
- package/dist/cli/registry.js +46 -0
- package/dist/cli/registry.js.map +1 -0
- package/dist/collectors/__tests__/network.contract.test.d.ts +28 -0
- package/dist/collectors/__tests__/network.contract.test.d.ts.map +1 -0
- package/dist/collectors/__tests__/network.contract.test.js +525 -0
- package/dist/collectors/__tests__/network.contract.test.js.map +1 -0
- package/dist/collectors/console.d.ts +5 -3
- package/dist/collectors/console.d.ts.map +1 -1
- package/dist/collectors/console.js +48 -26
- package/dist/collectors/console.js.map +1 -1
- package/dist/collectors/dom.d.ts +2 -2
- package/dist/collectors/dom.d.ts.map +1 -1
- package/dist/collectors/dom.js +23 -12
- package/dist/collectors/dom.js.map +1 -1
- package/dist/collectors/network.d.ts +18 -4
- package/dist/collectors/network.d.ts.map +1 -1
- package/dist/collectors/network.js +111 -34
- package/dist/collectors/network.js.map +1 -1
- package/dist/connection/__tests__/cdp.contract.test.d.ts +16 -0
- package/dist/connection/__tests__/cdp.contract.test.d.ts.map +1 -0
- package/dist/connection/__tests__/cdp.contract.test.js +378 -0
- package/dist/connection/__tests__/cdp.contract.test.js.map +1 -0
- package/dist/connection/__tests__/finder.contract.test.d.ts +2 -0
- package/dist/connection/__tests__/finder.contract.test.d.ts.map +1 -0
- package/dist/connection/__tests__/finder.contract.test.js +239 -0
- package/dist/connection/__tests__/finder.contract.test.js.map +1 -0
- package/dist/connection/__tests__/tabs.contract.test.d.ts +2 -0
- package/dist/connection/__tests__/tabs.contract.test.d.ts.map +1 -0
- package/dist/connection/__tests__/tabs.contract.test.js +137 -0
- package/dist/connection/__tests__/tabs.contract.test.js.map +1 -0
- package/dist/connection/cdp.d.ts +165 -16
- package/dist/connection/cdp.d.ts.map +1 -1
- package/dist/connection/cdp.js +342 -122
- package/dist/connection/cdp.js.map +1 -1
- package/dist/connection/finder.d.ts +5 -4
- package/dist/connection/finder.d.ts.map +1 -1
- package/dist/connection/finder.js +10 -16
- package/dist/connection/finder.js.map +1 -1
- package/dist/connection/launcher.d.ts +18 -11
- package/dist/connection/launcher.d.ts.map +1 -1
- package/dist/connection/launcher.js +148 -82
- package/dist/connection/launcher.js.map +1 -1
- package/dist/connection/tabs.d.ts +47 -14
- package/dist/connection/tabs.d.ts.map +1 -1
- package/dist/connection/tabs.js +493 -132
- package/dist/connection/tabs.js.map +1 -1
- package/dist/constants.d.ts +209 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +232 -0
- package/dist/constants.js.map +1 -0
- package/dist/daemon/__tests__/ipcServer.contract.test.d.ts +23 -0
- package/dist/daemon/__tests__/ipcServer.contract.test.d.ts.map +1 -0
- package/dist/daemon/__tests__/ipcServer.contract.test.js +401 -0
- package/dist/daemon/__tests__/ipcServer.contract.test.js.map +1 -0
- package/dist/daemon/__tests__/launcher.unit.test.d.ts +8 -0
- package/dist/daemon/__tests__/launcher.unit.test.d.ts.map +1 -0
- package/dist/daemon/__tests__/launcher.unit.test.js +20 -0
- package/dist/daemon/__tests__/launcher.unit.test.js.map +1 -0
- package/dist/daemon/ipcServer.d.ts +83 -0
- package/dist/daemon/ipcServer.d.ts.map +1 -0
- package/dist/daemon/ipcServer.js +670 -0
- package/dist/daemon/ipcServer.js.map +1 -0
- package/dist/daemon/launcher.d.ts +31 -0
- package/dist/daemon/launcher.d.ts.map +1 -0
- package/dist/daemon/launcher.js +137 -0
- package/dist/daemon/launcher.js.map +1 -0
- package/dist/daemon/startSession.d.ts +51 -0
- package/dist/daemon/startSession.d.ts.map +1 -0
- package/dist/daemon/startSession.js +149 -0
- package/dist/daemon/startSession.js.map +1 -0
- package/dist/daemon/worker.d.ts +18 -0
- package/dist/daemon/worker.d.ts.map +1 -0
- package/dist/daemon/worker.js +623 -0
- package/dist/daemon/worker.js.map +1 -0
- package/dist/daemon/workerIpc.d.ts +33 -0
- package/dist/daemon/workerIpc.d.ts.map +1 -0
- package/dist/daemon/workerIpc.js +8 -0
- package/dist/daemon/workerIpc.js.map +1 -0
- package/dist/daemon.d.ts +10 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +32 -0
- package/dist/daemon.js.map +1 -0
- package/dist/index.js +41 -420
- package/dist/index.js.map +1 -1
- package/dist/ipc/__tests__/client.contract.test.d.ts +23 -0
- package/dist/ipc/__tests__/client.contract.test.d.ts.map +1 -0
- package/dist/ipc/__tests__/client.contract.test.js +466 -0
- package/dist/ipc/__tests__/client.contract.test.js.map +1 -0
- package/dist/ipc/client.d.ts +109 -0
- package/dist/ipc/client.d.ts.map +1 -0
- package/dist/ipc/client.js +220 -0
- package/dist/ipc/client.js.map +1 -0
- package/dist/ipc/commands.d.ts +208 -0
- package/dist/ipc/commands.d.ts.map +1 -0
- package/dist/ipc/commands.js +69 -0
- package/dist/ipc/commands.js.map +1 -0
- package/dist/ipc/responseValidator.d.ts +40 -0
- package/dist/ipc/responseValidator.d.ts.map +1 -0
- package/dist/ipc/responseValidator.js +28 -0
- package/dist/ipc/responseValidator.js.map +1 -0
- package/dist/ipc/types.d.ts +193 -0
- package/dist/ipc/types.d.ts.map +1 -0
- package/dist/ipc/types.js +21 -0
- package/dist/ipc/types.js.map +1 -0
- package/dist/session/BdgSession.d.ts +71 -4
- package/dist/session/BdgSession.d.ts.map +1 -1
- package/dist/session/BdgSession.js +173 -75
- package/dist/session/BdgSession.js.map +1 -1
- package/dist/session/chrome.d.ts +46 -0
- package/dist/session/chrome.d.ts.map +1 -0
- package/dist/session/chrome.js +92 -0
- package/dist/session/chrome.js.map +1 -0
- package/dist/session/cleanup.d.ts +45 -0
- package/dist/session/cleanup.d.ts.map +1 -0
- package/dist/session/cleanup.js +230 -0
- package/dist/session/cleanup.js.map +1 -0
- package/dist/session/index.d.ts +15 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +23 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/lock.d.ts +57 -0
- package/dist/session/lock.d.ts.map +1 -0
- package/dist/session/lock.js +154 -0
- package/dist/session/lock.js.map +1 -0
- package/dist/session/metadata.d.ts +59 -0
- package/dist/session/metadata.d.ts.map +1 -0
- package/dist/session/metadata.js +71 -0
- package/dist/session/metadata.js.map +1 -0
- package/dist/session/output.d.ts +18 -0
- package/dist/session/output.d.ts.map +1 -0
- package/dist/session/output.js +24 -0
- package/dist/session/output.js.map +1 -0
- package/dist/session/paths.d.ts +73 -0
- package/dist/session/paths.d.ts.map +1 -0
- package/dist/session/paths.js +84 -0
- package/dist/session/paths.js.map +1 -0
- package/dist/session/pid.d.ts +40 -0
- package/dist/session/pid.d.ts.map +1 -0
- package/dist/session/pid.js +73 -0
- package/dist/session/pid.js.map +1 -0
- package/dist/session/process.d.ts +45 -0
- package/dist/session/process.d.ts.map +1 -0
- package/dist/session/process.js +88 -0
- package/dist/session/process.js.map +1 -0
- package/dist/types.d.ts +114 -38
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/__tests__/filters.unit.test.d.ts +2 -0
- package/dist/utils/__tests__/filters.unit.test.d.ts.map +1 -0
- package/dist/utils/__tests__/filters.unit.test.js +239 -0
- package/dist/utils/__tests__/filters.unit.test.js.map +1 -0
- package/dist/utils/__tests__/session.contract.test.d.ts +2 -0
- package/dist/utils/__tests__/session.contract.test.d.ts.map +1 -0
- package/dist/utils/__tests__/session.contract.test.js +234 -0
- package/dist/utils/__tests__/session.contract.test.js.map +1 -0
- package/dist/utils/atomicFile.d.ts +38 -0
- package/dist/utils/atomicFile.d.ts.map +1 -0
- package/dist/utils/atomicFile.js +71 -0
- package/dist/utils/atomicFile.js.map +1 -0
- package/dist/utils/cdpHandlers.d.ts +31 -0
- package/dist/utils/cdpHandlers.d.ts.map +1 -0
- package/dist/utils/cdpHandlers.js +38 -0
- package/dist/utils/cdpHandlers.js.map +1 -0
- package/dist/utils/chromeDiagnostics.d.ts +28 -0
- package/dist/utils/chromeDiagnostics.d.ts.map +1 -0
- package/dist/utils/chromeDiagnostics.js +88 -0
- package/dist/utils/chromeDiagnostics.js.map +1 -0
- package/dist/utils/errors.d.ts +82 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +88 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/exitCodes.d.ts +32 -0
- package/dist/utils/exitCodes.d.ts.map +1 -0
- package/dist/utils/exitCodes.js +36 -0
- package/dist/utils/exitCodes.js.map +1 -0
- package/dist/utils/filters.d.ts +108 -0
- package/dist/utils/filters.d.ts.map +1 -0
- package/dist/utils/filters.js +304 -0
- package/dist/utils/filters.js.map +1 -0
- package/dist/utils/formatters/network.d.ts +23 -0
- package/dist/utils/formatters/network.d.ts.map +1 -0
- package/dist/utils/formatters/network.js +35 -0
- package/dist/utils/formatters/network.js.map +1 -0
- package/dist/utils/http.d.ts +34 -0
- package/dist/utils/http.d.ts.map +1 -0
- package/dist/utils/http.js +48 -0
- package/dist/utils/http.js.map +1 -0
- package/dist/utils/logger.d.ts +42 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +43 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/objects.d.ts +23 -0
- package/dist/utils/objects.d.ts.map +1 -0
- package/dist/utils/objects.js +25 -0
- package/dist/utils/objects.js.map +1 -0
- package/dist/utils/url/safeParseUrl.d.ts +63 -0
- package/dist/utils/url/safeParseUrl.d.ts.map +1 -0
- package/dist/utils/url/safeParseUrl.js +84 -0
- package/dist/utils/url/safeParseUrl.js.map +1 -0
- package/dist/utils/url.d.ts +63 -1
- package/dist/utils/url.d.ts.map +1 -1
- package/dist/utils/url.js +152 -2
- package/dist/utils/url.js.map +1 -1
- package/dist/utils/validation.d.ts +1 -1
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/version.d.ts +3 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +27 -0
- package/dist/utils/version.js.map +1 -0
- package/package.json +57 -10
- package/dist/utils/pageLoad.d.ts +0 -21
- package/dist/utils/pageLoad.d.ts.map +0 -1
- package/dist/utils/pageLoad.js +0 -85
- package/dist/utils/pageLoad.js.map +0 -1
- package/dist/utils/session.d.ts +0 -104
- package/dist/utils/session.d.ts.map +0 -1
- package/dist/utils/session.js +0 -244
- package/dist/utils/session.js.map +0 -1
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-floating-promises */
|
|
2
|
+
/**
|
|
3
|
+
* CDPConnection contract tests
|
|
4
|
+
*
|
|
5
|
+
* Tests the public API contracts of CDPConnection WITHOUT testing implementation details.
|
|
6
|
+
* Uses FakeWebSocket to mock the WebSocket boundary while keeping all CDP logic real.
|
|
7
|
+
*
|
|
8
|
+
* Coverage:
|
|
9
|
+
* 1. Message correlation - Request/response pairing with IDs
|
|
10
|
+
* 2. Connection lifecycle - Connect, close, error handling
|
|
11
|
+
* 3. Timeouts - Connection timeout (10s), command timeout (30s)
|
|
12
|
+
* 4. Keepalive - Ping/pong lifecycle, missed pongs detection
|
|
13
|
+
* 5. Event subscription - on/off/removeAllListeners
|
|
14
|
+
* 6. Edge cases - Close during send, stale handlers, state transitions
|
|
15
|
+
*/
|
|
16
|
+
import assert from 'node:assert/strict';
|
|
17
|
+
import { afterEach, beforeEach, describe, it } from 'node:test';
|
|
18
|
+
import { createResponse, createErrorResponse, createEvent, } from '../../__testfixtures__/cdpMessages.js';
|
|
19
|
+
import { FakeWebSocket } from '../../__testutils__/FakeWebSocket.js';
|
|
20
|
+
import { useFakeClock } from '../../__testutils__/testClock.js';
|
|
21
|
+
import { CDPConnection } from '../cdp.js';
|
|
22
|
+
// Mock the 'ws' module to return our FakeWebSocket
|
|
23
|
+
let mockWebSocket;
|
|
24
|
+
describe('CDPConnection contract', () => {
|
|
25
|
+
const TEST_URL = 'ws://localhost:9222/devtools/browser';
|
|
26
|
+
let cdp;
|
|
27
|
+
async function connectAndOpen(options) {
|
|
28
|
+
const connectPromise = cdp.connect(TEST_URL, options);
|
|
29
|
+
mockWebSocket.simulateOpen();
|
|
30
|
+
await connectPromise;
|
|
31
|
+
}
|
|
32
|
+
function parseMessage(raw) {
|
|
33
|
+
return JSON.parse(raw);
|
|
34
|
+
}
|
|
35
|
+
// Shared setup for non-timer tests
|
|
36
|
+
beforeEach(() => {
|
|
37
|
+
mockWebSocket = new FakeWebSocket();
|
|
38
|
+
cdp = new CDPConnection(() => mockWebSocket);
|
|
39
|
+
});
|
|
40
|
+
afterEach(() => {
|
|
41
|
+
// Cleanup: close connection if still open
|
|
42
|
+
if (cdp.isConnected()) {
|
|
43
|
+
cdp.close();
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
describe('Message correlation', () => {
|
|
47
|
+
it('should pair requests with responses by message ID', async () => {
|
|
48
|
+
// Arrange: Create CDP connection with fake WebSocket
|
|
49
|
+
await connectAndOpen();
|
|
50
|
+
// Act: Send a CDP command
|
|
51
|
+
const resultPromise = cdp.send('Target.getTargets');
|
|
52
|
+
// Get the sent message
|
|
53
|
+
const messages = mockWebSocket.getSentMessages();
|
|
54
|
+
assert.equal(messages.length, 1);
|
|
55
|
+
const [firstMessage] = messages;
|
|
56
|
+
assert.ok(firstMessage, 'Expected a sent message');
|
|
57
|
+
const sentMessage = parseMessage(firstMessage);
|
|
58
|
+
assert.equal(typeof sentMessage.id, 'number');
|
|
59
|
+
const requestId = sentMessage.id;
|
|
60
|
+
// Simulate response with matching ID
|
|
61
|
+
const response = createResponse(requestId, { targetInfos: [] });
|
|
62
|
+
mockWebSocket.simulateMessage(JSON.stringify(response));
|
|
63
|
+
// Assert: Promise resolves with correct result
|
|
64
|
+
const result = await resultPromise;
|
|
65
|
+
assert.deepEqual(result, { targetInfos: [] });
|
|
66
|
+
});
|
|
67
|
+
it('should reject on error responses', async () => {
|
|
68
|
+
// Arrange
|
|
69
|
+
await connectAndOpen();
|
|
70
|
+
// Act: Send command
|
|
71
|
+
const resultPromise = cdp.send('Invalid.method');
|
|
72
|
+
const messages = mockWebSocket.getSentMessages();
|
|
73
|
+
const [firstMessage] = messages;
|
|
74
|
+
assert.ok(firstMessage, 'Expected a sent message');
|
|
75
|
+
const sentMessage = parseMessage(firstMessage);
|
|
76
|
+
assert.equal(typeof sentMessage.id, 'number');
|
|
77
|
+
const requestId = sentMessage.id;
|
|
78
|
+
// Simulate error response
|
|
79
|
+
const errorResponse = createErrorResponse(requestId, 'Method not found');
|
|
80
|
+
mockWebSocket.simulateMessage(JSON.stringify(errorResponse));
|
|
81
|
+
// Assert: Promise rejects with error message
|
|
82
|
+
await assert.rejects(resultPromise, /Method not found/);
|
|
83
|
+
});
|
|
84
|
+
it('should handle multiple concurrent requests', async () => {
|
|
85
|
+
// Arrange
|
|
86
|
+
await connectAndOpen();
|
|
87
|
+
// Act: Send three commands concurrently
|
|
88
|
+
const promise1 = cdp.send('Target.getTargets');
|
|
89
|
+
const promise2 = cdp.send('Browser.getVersion');
|
|
90
|
+
const promise3 = cdp.send('Page.navigate', { url: 'http://example.com' });
|
|
91
|
+
const messages = mockWebSocket.getSentMessages();
|
|
92
|
+
assert.equal(messages.length, 3);
|
|
93
|
+
// Simulate responses in different order (3, 1, 2)
|
|
94
|
+
const [message1, message2, message3] = messages;
|
|
95
|
+
if (message1 === undefined || message2 === undefined || message3 === undefined) {
|
|
96
|
+
throw new Error('Expected three sent messages');
|
|
97
|
+
}
|
|
98
|
+
const msg1 = parseMessage(message1);
|
|
99
|
+
const msg2 = parseMessage(message2);
|
|
100
|
+
const msg3 = parseMessage(message3);
|
|
101
|
+
assert.equal(typeof msg1.id, 'number');
|
|
102
|
+
assert.equal(typeof msg2.id, 'number');
|
|
103
|
+
assert.equal(typeof msg3.id, 'number');
|
|
104
|
+
mockWebSocket.simulateMessage(JSON.stringify(createResponse(msg3.id, { frameId: 'frame1' })));
|
|
105
|
+
mockWebSocket.simulateMessage(JSON.stringify(createResponse(msg1.id, { targetInfos: [] })));
|
|
106
|
+
mockWebSocket.simulateMessage(JSON.stringify(createResponse(msg2.id, { protocolVersion: '1.3' })));
|
|
107
|
+
// Assert: All promises resolve with correct results despite out-of-order responses
|
|
108
|
+
const [result1, result2, result3] = await Promise.all([promise1, promise2, promise3]);
|
|
109
|
+
assert.deepEqual(result1, { targetInfos: [] });
|
|
110
|
+
assert.deepEqual(result2, { protocolVersion: '1.3' });
|
|
111
|
+
assert.deepEqual(result3, { frameId: 'frame1' });
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
describe('Connection lifecycle', () => {
|
|
115
|
+
it('should resolve when WebSocket opens successfully', async () => {
|
|
116
|
+
// Arrange & Act
|
|
117
|
+
const connectPromise = cdp.connect(TEST_URL);
|
|
118
|
+
// Simulate successful open
|
|
119
|
+
mockWebSocket.simulateOpen();
|
|
120
|
+
// Assert: Connect resolves without error
|
|
121
|
+
await assert.doesNotReject(connectPromise);
|
|
122
|
+
assert.equal(cdp.isConnected(), true);
|
|
123
|
+
});
|
|
124
|
+
it('should throw error if connection fails', async () => {
|
|
125
|
+
const clock = useFakeClock();
|
|
126
|
+
try {
|
|
127
|
+
mockWebSocket = new FakeWebSocket();
|
|
128
|
+
cdp = new CDPConnection(() => mockWebSocket);
|
|
129
|
+
// Arrange & Act
|
|
130
|
+
const connectPromise = cdp.connect(TEST_URL, {
|
|
131
|
+
maxRetries: 1,
|
|
132
|
+
});
|
|
133
|
+
// Simulate connection error immediately (before retry timer starts)
|
|
134
|
+
mockWebSocket.simulateError(new Error('Connection refused'));
|
|
135
|
+
// Advance time to trigger retry handling (even though maxRetries=1)
|
|
136
|
+
await clock.tickAndFlush(1000);
|
|
137
|
+
// Assert: Connect rejects with connection error
|
|
138
|
+
await assert.rejects(connectPromise, /Connection refused|Failed to connect/);
|
|
139
|
+
assert.equal(cdp.isConnected(), false);
|
|
140
|
+
}
|
|
141
|
+
finally {
|
|
142
|
+
clock.restore();
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
it('should cleanup on close and reject pending messages', async () => {
|
|
146
|
+
// Arrange
|
|
147
|
+
const connectPromise = cdp.connect(TEST_URL, {
|
|
148
|
+
maxRetries: 1,
|
|
149
|
+
});
|
|
150
|
+
mockWebSocket.simulateOpen();
|
|
151
|
+
await connectPromise;
|
|
152
|
+
// Send a command but don't respond
|
|
153
|
+
const pendingPromise = cdp.send('Target.getTargets');
|
|
154
|
+
// Act: Close connection
|
|
155
|
+
mockWebSocket.simulateClose(1000, 'Normal closure');
|
|
156
|
+
// Assert: Pending promise is rejected
|
|
157
|
+
await assert.rejects(pendingPromise, /connection closed/i);
|
|
158
|
+
});
|
|
159
|
+
it('should prevent sending commands when not connected', async () => {
|
|
160
|
+
// Arrange: No connection established
|
|
161
|
+
// Act & Assert: Sending command should throw immediately
|
|
162
|
+
await assert.rejects(() => cdp.send('Target.getTargets'), /Not connected to browser/);
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
// Timer-dependent tests: Install FakeClock in beforeEach
|
|
166
|
+
describe('Timeouts', () => {
|
|
167
|
+
let clockHelper;
|
|
168
|
+
beforeEach(() => {
|
|
169
|
+
// Install fake timers BEFORE creating CDP connection
|
|
170
|
+
clockHelper = useFakeClock();
|
|
171
|
+
mockWebSocket = new FakeWebSocket();
|
|
172
|
+
cdp = new CDPConnection(() => mockWebSocket);
|
|
173
|
+
});
|
|
174
|
+
afterEach(() => {
|
|
175
|
+
clockHelper.restore();
|
|
176
|
+
if (cdp.isConnected()) {
|
|
177
|
+
cdp.close();
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
it('should timeout connection after 10s by default', async () => {
|
|
181
|
+
// Arrange & Act: Start connection but never open WebSocket
|
|
182
|
+
const connectPromise = cdp.connect('ws://localhost:9222/devtools/browser', {
|
|
183
|
+
maxRetries: 1,
|
|
184
|
+
});
|
|
185
|
+
// Advance time by 10s (default connection timeout)
|
|
186
|
+
await clockHelper.tickAndFlush(10000);
|
|
187
|
+
// Assert: Connection times out
|
|
188
|
+
await assert.rejects(connectPromise, /Connection timeout|Failed to connect/);
|
|
189
|
+
assert.equal(clockHelper.clock.getPendingTimers(), 0);
|
|
190
|
+
assert.equal(clockHelper.clock.getPendingMicrotasks(), 0);
|
|
191
|
+
});
|
|
192
|
+
it('should timeout commands after 30s', async () => {
|
|
193
|
+
// Arrange: Establish connection
|
|
194
|
+
await connectAndOpen({ maxRetries: 1 });
|
|
195
|
+
// Act: Send command without responding
|
|
196
|
+
const commandPromise = cdp.send('Target.getTargets');
|
|
197
|
+
// Advance time by 30s (command timeout)
|
|
198
|
+
await clockHelper.tickAndFlush(30000);
|
|
199
|
+
// Assert: Command times out
|
|
200
|
+
await assert.rejects(commandPromise, /Command timeout/);
|
|
201
|
+
// Close connection to stop keepalive timers before checking pending handles
|
|
202
|
+
cdp.close();
|
|
203
|
+
assert.equal(clockHelper.clock.getPendingTimers(), 0);
|
|
204
|
+
assert.equal(clockHelper.clock.getPendingMicrotasks(), 0);
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
describe('Keepalive', () => {
|
|
208
|
+
let clockHelper;
|
|
209
|
+
beforeEach(() => {
|
|
210
|
+
// Install fake timers BEFORE creating CDP connection
|
|
211
|
+
clockHelper = useFakeClock();
|
|
212
|
+
mockWebSocket = new FakeWebSocket();
|
|
213
|
+
cdp = new CDPConnection(() => mockWebSocket);
|
|
214
|
+
});
|
|
215
|
+
afterEach(() => {
|
|
216
|
+
clockHelper.restore();
|
|
217
|
+
if (cdp.isConnected()) {
|
|
218
|
+
cdp.close();
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
it('should send ping at regular intervals', async () => {
|
|
222
|
+
// Arrange: Connect with 5s keepalive interval
|
|
223
|
+
await connectAndOpen({ keepaliveInterval: 5000, maxRetries: 1 });
|
|
224
|
+
// Act: Advance time by 5s
|
|
225
|
+
clockHelper.tick(5000);
|
|
226
|
+
// Assert: Ping sent
|
|
227
|
+
assert.equal(mockWebSocket.getPingSent(), 1);
|
|
228
|
+
// Act: Advance another 5s
|
|
229
|
+
clockHelper.tick(5000);
|
|
230
|
+
// Assert: Second ping sent
|
|
231
|
+
assert.equal(mockWebSocket.getPingSent(), 2);
|
|
232
|
+
});
|
|
233
|
+
it('should close connection after 3 missed pongs', async () => {
|
|
234
|
+
// Arrange: Connect with 1s keepalive
|
|
235
|
+
await connectAndOpen({ keepaliveInterval: 1000, maxRetries: 1 });
|
|
236
|
+
// Act: Miss 3 pongs (don't call simulatePong)
|
|
237
|
+
clockHelper.tick(1000); // 1st ping
|
|
238
|
+
clockHelper.tick(1000); // 2nd ping
|
|
239
|
+
clockHelper.tick(1000); // 3rd ping - should close
|
|
240
|
+
// Assert: Connection closed after 3 missed pongs
|
|
241
|
+
assert.equal(mockWebSocket.getCloseCode(), 1001);
|
|
242
|
+
assert.match(mockWebSocket.getCloseReason() ?? '', /No pong received/i);
|
|
243
|
+
});
|
|
244
|
+
it('should reset missed pong counter on pong received', async () => {
|
|
245
|
+
// Arrange
|
|
246
|
+
await connectAndOpen({ keepaliveInterval: 1000, maxRetries: 1 });
|
|
247
|
+
// Act: Miss 2 pongs, then receive one
|
|
248
|
+
clockHelper.tick(1000); // 1st ping
|
|
249
|
+
clockHelper.tick(1000); // 2nd ping
|
|
250
|
+
mockWebSocket.simulatePong(); // Reset counter
|
|
251
|
+
// Now miss 2 more - should NOT close (counter was reset)
|
|
252
|
+
clockHelper.tick(1000); // 3rd ping
|
|
253
|
+
clockHelper.tick(1000); // 4th ping
|
|
254
|
+
// Assert: Still connected (would close on 3rd consecutive miss)
|
|
255
|
+
assert.equal(cdp.isConnected(), true);
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
describe('Event subscription', () => {
|
|
259
|
+
it('should invoke event handlers when events arrive', async () => {
|
|
260
|
+
// Arrange
|
|
261
|
+
await connectAndOpen();
|
|
262
|
+
const receivedEvents = [];
|
|
263
|
+
cdp.on('Target.targetCreated', (params) => {
|
|
264
|
+
receivedEvents.push(params);
|
|
265
|
+
});
|
|
266
|
+
// Act: Simulate event
|
|
267
|
+
const event = createEvent('Target.targetCreated', {
|
|
268
|
+
targetInfo: { targetId: 't1', type: 'page' },
|
|
269
|
+
});
|
|
270
|
+
mockWebSocket.simulateMessage(JSON.stringify(event));
|
|
271
|
+
// Assert: Handler invoked
|
|
272
|
+
assert.equal(receivedEvents.length, 1);
|
|
273
|
+
assert.deepEqual(receivedEvents[0], { targetInfo: { targetId: 't1', type: 'page' } });
|
|
274
|
+
});
|
|
275
|
+
it('should allow multiple handlers for same event', async () => {
|
|
276
|
+
// Arrange
|
|
277
|
+
await connectAndOpen();
|
|
278
|
+
const handler1Called = [];
|
|
279
|
+
const handler2Called = [];
|
|
280
|
+
cdp.on('Network.requestWillBeSent', (params) => handler1Called.push(params));
|
|
281
|
+
cdp.on('Network.requestWillBeSent', (params) => handler2Called.push(params));
|
|
282
|
+
// Act: Simulate event
|
|
283
|
+
const event = createEvent('Network.requestWillBeSent', { requestId: 'req1' });
|
|
284
|
+
mockWebSocket.simulateMessage(JSON.stringify(event));
|
|
285
|
+
// Assert: Both handlers called
|
|
286
|
+
assert.equal(handler1Called.length, 1);
|
|
287
|
+
assert.equal(handler2Called.length, 1);
|
|
288
|
+
});
|
|
289
|
+
it('should remove handler with off()', async () => {
|
|
290
|
+
// Arrange
|
|
291
|
+
await connectAndOpen();
|
|
292
|
+
let callCount = 0;
|
|
293
|
+
const handlerId = cdp.on('Page.frameNavigated', () => callCount++);
|
|
294
|
+
// Act: Send event, then remove handler, then send again
|
|
295
|
+
const event = createEvent('Page.frameNavigated', { frame: { id: 'f1' } });
|
|
296
|
+
mockWebSocket.simulateMessage(JSON.stringify(event));
|
|
297
|
+
cdp.off('Page.frameNavigated', handlerId);
|
|
298
|
+
mockWebSocket.simulateMessage(JSON.stringify(event));
|
|
299
|
+
// Assert: Handler only called once (before removal)
|
|
300
|
+
assert.equal(callCount, 1);
|
|
301
|
+
});
|
|
302
|
+
it('should remove all handlers for event with removeAllListeners(event)', async () => {
|
|
303
|
+
// Arrange
|
|
304
|
+
await connectAndOpen();
|
|
305
|
+
let callCount1 = 0;
|
|
306
|
+
let callCount2 = 0;
|
|
307
|
+
cdp.on('Console.messageAdded', () => callCount1++);
|
|
308
|
+
cdp.on('Console.messageAdded', () => callCount2++);
|
|
309
|
+
// Act: Remove all handlers for this event
|
|
310
|
+
cdp.removeAllListeners('Console.messageAdded');
|
|
311
|
+
const event = createEvent('Console.messageAdded', { message: { text: 'test' } });
|
|
312
|
+
mockWebSocket.simulateMessage(JSON.stringify(event));
|
|
313
|
+
// Assert: No handlers called
|
|
314
|
+
assert.equal(callCount1, 0);
|
|
315
|
+
assert.equal(callCount2, 0);
|
|
316
|
+
});
|
|
317
|
+
it('should remove all handlers for all events with removeAllListeners()', async () => {
|
|
318
|
+
// Arrange
|
|
319
|
+
await connectAndOpen();
|
|
320
|
+
let callCount1 = 0;
|
|
321
|
+
let callCount2 = 0;
|
|
322
|
+
cdp.on('Network.requestWillBeSent', () => callCount1++);
|
|
323
|
+
cdp.on('Console.messageAdded', () => callCount2++);
|
|
324
|
+
// Act: Remove all handlers
|
|
325
|
+
cdp.removeAllListeners();
|
|
326
|
+
mockWebSocket.simulateMessage(JSON.stringify(createEvent('Network.requestWillBeSent', {})));
|
|
327
|
+
mockWebSocket.simulateMessage(JSON.stringify(createEvent('Console.messageAdded', {})));
|
|
328
|
+
// Assert: No handlers called
|
|
329
|
+
assert.equal(callCount1, 0);
|
|
330
|
+
assert.equal(callCount2, 0);
|
|
331
|
+
});
|
|
332
|
+
});
|
|
333
|
+
describe('Edge cases', () => {
|
|
334
|
+
it('should handle close during send (defensive copy test)', async () => {
|
|
335
|
+
// Arrange
|
|
336
|
+
await connectAndOpen();
|
|
337
|
+
// Act: Send command
|
|
338
|
+
const commandPromise = cdp.send('Target.getTargets');
|
|
339
|
+
// Capture messages snapshot before close
|
|
340
|
+
const messagesBefore = mockWebSocket.getSentMessages();
|
|
341
|
+
assert.equal(messagesBefore.length, 1);
|
|
342
|
+
// Close connection (should reject pending)
|
|
343
|
+
mockWebSocket.simulateClose(1000, 'Test close');
|
|
344
|
+
// Verify defensive copy: messagesBefore should be unchanged
|
|
345
|
+
assert.equal(messagesBefore.length, 1);
|
|
346
|
+
// Assert: Command rejected
|
|
347
|
+
await assert.rejects(commandPromise, /connection closed/i);
|
|
348
|
+
});
|
|
349
|
+
it('should return correct port from getPort()', async () => {
|
|
350
|
+
// Arrange & Act
|
|
351
|
+
const connectPromise = cdp.connect('ws://localhost:9444/devtools/browser');
|
|
352
|
+
mockWebSocket.simulateOpen();
|
|
353
|
+
await connectPromise;
|
|
354
|
+
// Assert: Port extracted correctly
|
|
355
|
+
const port = cdp.getPort();
|
|
356
|
+
assert.equal(port, 9444);
|
|
357
|
+
});
|
|
358
|
+
it('should throw if getPort() called before connect', () => {
|
|
359
|
+
// Arrange: No connection
|
|
360
|
+
// Act & Assert
|
|
361
|
+
assert.throws(() => cdp.getPort(), /Not connected/);
|
|
362
|
+
});
|
|
363
|
+
it('should handle events with sessionId', async () => {
|
|
364
|
+
// Arrange
|
|
365
|
+
const connectPromise = cdp.connect('ws://localhost:9222/devtools/browser');
|
|
366
|
+
mockWebSocket.simulateOpen();
|
|
367
|
+
await connectPromise;
|
|
368
|
+
const receivedEvents = [];
|
|
369
|
+
cdp.on('Page.frameNavigated', (params) => receivedEvents.push(params));
|
|
370
|
+
// Act: Event with sessionId
|
|
371
|
+
const event = createEvent('Page.frameNavigated', { frame: { id: 'f1' } }, 'session-123');
|
|
372
|
+
mockWebSocket.simulateMessage(JSON.stringify(event));
|
|
373
|
+
// Assert: Handler still invoked (sessionId doesn't affect event routing)
|
|
374
|
+
assert.equal(receivedEvents.length, 1);
|
|
375
|
+
});
|
|
376
|
+
});
|
|
377
|
+
});
|
|
378
|
+
//# sourceMappingURL=cdp.contract.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdp.contract.test.js","sourceRoot":"","sources":["../../../src/connection/__tests__/cdp.contract.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finder.contract.test.d.ts","sourceRoot":"","sources":["../../../src/connection/__tests__/finder.contract.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { describe, it, beforeEach, afterEach } from 'node:test';
|
|
3
|
+
import { createMockTarget, mockTargetList } from '../../__testfixtures__/connectionTargets.js';
|
|
4
|
+
import { validateTarget } from '../finder.js';
|
|
5
|
+
import { DEFAULT_CDP_PORT } from '../../constants.js';
|
|
6
|
+
// Mock fetch globally for HTTP endpoints
|
|
7
|
+
let originalFetch;
|
|
8
|
+
let fetchCallHistory;
|
|
9
|
+
let fetchMockResponses;
|
|
10
|
+
let fetchCallCount;
|
|
11
|
+
function setupFetchMock() {
|
|
12
|
+
originalFetch = global.fetch;
|
|
13
|
+
fetchCallHistory = [];
|
|
14
|
+
fetchMockResponses = [];
|
|
15
|
+
fetchCallCount = 0;
|
|
16
|
+
global.fetch = ((url, options) => {
|
|
17
|
+
fetchCallHistory.push({ url, options });
|
|
18
|
+
const responseIndex = fetchCallCount++;
|
|
19
|
+
const response = fetchMockResponses[responseIndex];
|
|
20
|
+
if (response) {
|
|
21
|
+
return response;
|
|
22
|
+
}
|
|
23
|
+
return Promise.reject(new Error(`Unexpected fetch call ${responseIndex + 1}: ${url}`));
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
function mockFetchResponse(response) {
|
|
27
|
+
fetchMockResponses.push(response);
|
|
28
|
+
}
|
|
29
|
+
function createSuccessResponse(data) {
|
|
30
|
+
return {
|
|
31
|
+
ok: true,
|
|
32
|
+
status: 200,
|
|
33
|
+
json: () => Promise.resolve(data),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function createFailureResponse(status, statusText) {
|
|
37
|
+
return {
|
|
38
|
+
ok: false,
|
|
39
|
+
status,
|
|
40
|
+
statusText,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
void describe('Target Validation Contract', () => {
|
|
44
|
+
beforeEach(() => {
|
|
45
|
+
setupFetchMock();
|
|
46
|
+
});
|
|
47
|
+
afterEach(() => {
|
|
48
|
+
global.fetch = originalFetch;
|
|
49
|
+
});
|
|
50
|
+
void describe('validateTarget', () => {
|
|
51
|
+
void it('returns true when target exists in Chrome', async () => {
|
|
52
|
+
// Arrange: Mock target list containing the target
|
|
53
|
+
const targetId = 'target-123';
|
|
54
|
+
const existingTarget = createMockTarget({ id: targetId });
|
|
55
|
+
mockFetchResponse(createSuccessResponse([existingTarget, ...mockTargetList]));
|
|
56
|
+
// Act
|
|
57
|
+
const result = await validateTarget(targetId);
|
|
58
|
+
// Assert: Target is found
|
|
59
|
+
assert.equal(result, true);
|
|
60
|
+
// Verify correct HTTP endpoint was called
|
|
61
|
+
assert.equal(fetchCallHistory.length, 1);
|
|
62
|
+
const [firstCall] = fetchCallHistory;
|
|
63
|
+
assert.ok(firstCall, 'fetchCallHistory should have at least one entry');
|
|
64
|
+
assert.ok(firstCall.url.includes('/json/list'));
|
|
65
|
+
assert.ok(firstCall.url.includes(`127.0.0.1:${DEFAULT_CDP_PORT}`));
|
|
66
|
+
});
|
|
67
|
+
void it('returns false when target does not exist', async () => {
|
|
68
|
+
// Arrange: Mock target list without the target
|
|
69
|
+
const targetId = 'missing-target-456';
|
|
70
|
+
mockFetchResponse(createSuccessResponse(mockTargetList));
|
|
71
|
+
// Act
|
|
72
|
+
const result = await validateTarget(targetId);
|
|
73
|
+
// Assert: Target is not found
|
|
74
|
+
assert.equal(result, false);
|
|
75
|
+
// Verify HTTP endpoint was called
|
|
76
|
+
assert.equal(fetchCallHistory.length, 1);
|
|
77
|
+
const [firstCall] = fetchCallHistory;
|
|
78
|
+
assert.ok(firstCall, 'fetchCallHistory should have at least one entry');
|
|
79
|
+
assert.ok(firstCall.url.includes('/json/list'));
|
|
80
|
+
});
|
|
81
|
+
void it('returns false when HTTP request fails', async () => {
|
|
82
|
+
// Arrange: Mock HTTP failure
|
|
83
|
+
const targetId = 'target-123';
|
|
84
|
+
mockFetchResponse(createFailureResponse(500, 'Internal Server Error'));
|
|
85
|
+
// Act
|
|
86
|
+
const result = await validateTarget(targetId);
|
|
87
|
+
// Assert: Failure is handled gracefully
|
|
88
|
+
assert.equal(result, false);
|
|
89
|
+
// Verify HTTP endpoint was attempted
|
|
90
|
+
assert.equal(fetchCallHistory.length, 1);
|
|
91
|
+
const [firstCall] = fetchCallHistory;
|
|
92
|
+
assert.ok(firstCall, 'fetchCallHistory should have at least one entry');
|
|
93
|
+
assert.ok(firstCall.url.includes('/json/list'));
|
|
94
|
+
});
|
|
95
|
+
void it('returns false when response is malformed', async () => {
|
|
96
|
+
// Arrange: Mock malformed JSON response
|
|
97
|
+
const targetId = 'target-123';
|
|
98
|
+
const malformedResponse = {
|
|
99
|
+
ok: true,
|
|
100
|
+
status: 200,
|
|
101
|
+
json: () => Promise.reject(new Error('Invalid JSON')),
|
|
102
|
+
};
|
|
103
|
+
mockFetchResponse(malformedResponse);
|
|
104
|
+
// Act
|
|
105
|
+
const result = await validateTarget(targetId);
|
|
106
|
+
// Assert: Malformed response handled gracefully
|
|
107
|
+
assert.equal(result, false);
|
|
108
|
+
});
|
|
109
|
+
void it('uses correct port parameter', async () => {
|
|
110
|
+
// Arrange: Test with custom port
|
|
111
|
+
const targetId = 'target-123';
|
|
112
|
+
const customPort = 9333;
|
|
113
|
+
const existingTarget = createMockTarget({ id: targetId });
|
|
114
|
+
mockFetchResponse(createSuccessResponse([existingTarget]));
|
|
115
|
+
// Act
|
|
116
|
+
const result = await validateTarget(targetId, customPort);
|
|
117
|
+
// Assert: Target found and custom port used
|
|
118
|
+
assert.equal(result, true);
|
|
119
|
+
// Verify custom port was used in HTTP call
|
|
120
|
+
assert.equal(fetchCallHistory.length, 1);
|
|
121
|
+
const [firstCall] = fetchCallHistory;
|
|
122
|
+
assert.ok(firstCall, 'fetchCallHistory should have at least one entry');
|
|
123
|
+
assert.ok(firstCall.url.includes(`127.0.0.1:${customPort}`));
|
|
124
|
+
assert.ok(!firstCall.url.includes(`127.0.0.1:${DEFAULT_CDP_PORT}`));
|
|
125
|
+
});
|
|
126
|
+
void it('uses default port when not specified', async () => {
|
|
127
|
+
// Arrange: Call without port parameter
|
|
128
|
+
const targetId = 'target-123';
|
|
129
|
+
const existingTarget = createMockTarget({ id: targetId });
|
|
130
|
+
mockFetchResponse(createSuccessResponse([existingTarget]));
|
|
131
|
+
// Act
|
|
132
|
+
const result = await validateTarget(targetId);
|
|
133
|
+
// Assert: Uses default port
|
|
134
|
+
assert.equal(result, true);
|
|
135
|
+
// Verify default port was used
|
|
136
|
+
assert.equal(fetchCallHistory.length, 1);
|
|
137
|
+
const [firstCall] = fetchCallHistory;
|
|
138
|
+
assert.ok(firstCall, 'fetchCallHistory should have at least one entry');
|
|
139
|
+
assert.ok(firstCall.url.includes(`127.0.0.1:${DEFAULT_CDP_PORT}`));
|
|
140
|
+
});
|
|
141
|
+
void it('handles network errors gracefully', async () => {
|
|
142
|
+
// Arrange: Mock network error (connection refused, etc.)
|
|
143
|
+
const targetId = 'target-123';
|
|
144
|
+
mockFetchResponse(Promise.reject(new Error('ECONNREFUSED')));
|
|
145
|
+
// Act
|
|
146
|
+
const result = await validateTarget(targetId);
|
|
147
|
+
// Assert: Network error handled gracefully
|
|
148
|
+
assert.equal(result, false);
|
|
149
|
+
});
|
|
150
|
+
void it('handles empty target list', async () => {
|
|
151
|
+
// Arrange: Mock empty target list from Chrome
|
|
152
|
+
const targetId = 'target-123';
|
|
153
|
+
mockFetchResponse(createSuccessResponse([]));
|
|
154
|
+
// Act
|
|
155
|
+
const result = await validateTarget(targetId);
|
|
156
|
+
// Assert: Empty list handled correctly
|
|
157
|
+
assert.equal(result, false);
|
|
158
|
+
});
|
|
159
|
+
void it('handles target list with multiple matching IDs', async () => {
|
|
160
|
+
// Arrange: Mock target list with duplicate IDs (edge case)
|
|
161
|
+
const targetId = 'target-123';
|
|
162
|
+
const target1 = createMockTarget({ id: targetId, url: 'http://example.com/1' });
|
|
163
|
+
const target2 = createMockTarget({ id: targetId, url: 'http://example.com/2' });
|
|
164
|
+
mockFetchResponse(createSuccessResponse([target1, target2]));
|
|
165
|
+
// Act
|
|
166
|
+
const result = await validateTarget(targetId);
|
|
167
|
+
// Assert: First match is sufficient
|
|
168
|
+
assert.equal(result, true);
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
void describe('URL Construction', () => {
|
|
172
|
+
void it('constructs correct Chrome endpoint URL', async () => {
|
|
173
|
+
// Arrange
|
|
174
|
+
const targetId = 'target-123';
|
|
175
|
+
const port = 9555;
|
|
176
|
+
mockFetchResponse(createSuccessResponse([]));
|
|
177
|
+
// Act
|
|
178
|
+
await validateTarget(targetId, port);
|
|
179
|
+
// Assert: Correct URL format
|
|
180
|
+
const expectedUrl = `http://127.0.0.1:${port}/json/list`;
|
|
181
|
+
assert.equal(fetchCallHistory.length, 1);
|
|
182
|
+
const [firstCall] = fetchCallHistory;
|
|
183
|
+
assert.ok(firstCall, 'fetchCallHistory should have at least one entry');
|
|
184
|
+
assert.equal(firstCall.url, expectedUrl);
|
|
185
|
+
});
|
|
186
|
+
void it('uses localhost IP address consistently', async () => {
|
|
187
|
+
// Arrange
|
|
188
|
+
const targetId = 'target-123';
|
|
189
|
+
mockFetchResponse(createSuccessResponse([]));
|
|
190
|
+
// Act
|
|
191
|
+
await validateTarget(targetId);
|
|
192
|
+
// Assert: Uses 127.0.0.1 (not localhost hostname)
|
|
193
|
+
assert.equal(fetchCallHistory.length, 1);
|
|
194
|
+
const [firstCall] = fetchCallHistory;
|
|
195
|
+
assert.ok(firstCall, 'fetchCallHistory should have at least one entry');
|
|
196
|
+
assert.ok(firstCall.url.includes('127.0.0.1'));
|
|
197
|
+
assert.ok(!firstCall.url.includes('localhost'));
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
void describe('Edge Cases', () => {
|
|
201
|
+
void it('handles very long target IDs', async () => {
|
|
202
|
+
// Arrange: Create large target list (performance test)
|
|
203
|
+
const targetId = 'needle-in-haystack';
|
|
204
|
+
const largeTargetList = Array.from({ length: 1000 }, (_, i) => createMockTarget({ id: `target-${i}` }));
|
|
205
|
+
largeTargetList.push(createMockTarget({ id: targetId })); // Add target at end
|
|
206
|
+
mockFetchResponse(createSuccessResponse(largeTargetList));
|
|
207
|
+
// Act
|
|
208
|
+
const result = await validateTarget(targetId);
|
|
209
|
+
// Assert: Finds target even in large list
|
|
210
|
+
assert.equal(result, true);
|
|
211
|
+
});
|
|
212
|
+
void it('handles targets with special characters in ID', async () => {
|
|
213
|
+
// Arrange: Target with special characters
|
|
214
|
+
const targetId = 'target-with-special-chars-!@#$%^&*()';
|
|
215
|
+
const specialTarget = createMockTarget({ id: targetId });
|
|
216
|
+
mockFetchResponse(createSuccessResponse([specialTarget]));
|
|
217
|
+
// Act
|
|
218
|
+
const result = await validateTarget(targetId);
|
|
219
|
+
// Assert: Special characters handled correctly
|
|
220
|
+
assert.equal(result, true);
|
|
221
|
+
});
|
|
222
|
+
void it('handles null and undefined target IDs in list', async () => {
|
|
223
|
+
// Arrange: Malformed target list with null/undefined IDs
|
|
224
|
+
const targetId = 'valid-target';
|
|
225
|
+
const validTarget = createMockTarget({ id: targetId });
|
|
226
|
+
const malformedTargets = [
|
|
227
|
+
{ ...createMockTarget(), id: null },
|
|
228
|
+
{ ...createMockTarget(), id: undefined },
|
|
229
|
+
validTarget,
|
|
230
|
+
];
|
|
231
|
+
mockFetchResponse(createSuccessResponse(malformedTargets));
|
|
232
|
+
// Act
|
|
233
|
+
const result = await validateTarget(targetId);
|
|
234
|
+
// Assert: Finds valid target despite malformed entries
|
|
235
|
+
assert.equal(result, true);
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
//# sourceMappingURL=finder.contract.test.js.map
|