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,239 @@
|
|
|
1
|
+
import * as assert from 'node:assert/strict';
|
|
2
|
+
import { describe, it } from 'node:test';
|
|
3
|
+
import { matchesWildcard, shouldFetchBody, shouldExcludeUrl, shouldExcludeDomain, shouldExcludeConsoleMessage, DEFAULT_SKIP_BODY_PATTERNS, DEFAULT_EXCLUDED_DOMAINS, DEFAULT_EXCLUDED_CONSOLE_PATTERNS, } from '../filters.js';
|
|
4
|
+
void describe('filters - matchesWildcard', () => {
|
|
5
|
+
void it('should match exact strings', () => {
|
|
6
|
+
assert.equal(matchesWildcard('api.example.com', 'api.example.com'), true);
|
|
7
|
+
assert.equal(matchesWildcard('api.example.com/users', 'api.example.com/users'), true);
|
|
8
|
+
assert.equal(matchesWildcard('api.example.com', 'cdn.example.com'), false);
|
|
9
|
+
});
|
|
10
|
+
void it('should match wildcards at start', () => {
|
|
11
|
+
assert.equal(matchesWildcard('logo.png', '*.png'), true);
|
|
12
|
+
assert.equal(matchesWildcard('images/logo.png', '*.png'), true);
|
|
13
|
+
assert.equal(matchesWildcard('logo.jpg', '*.png'), false);
|
|
14
|
+
});
|
|
15
|
+
void it('should match wildcards at end', () => {
|
|
16
|
+
assert.equal(matchesWildcard('api.example.com', 'api.*'), true);
|
|
17
|
+
assert.equal(matchesWildcard('api.test.com', 'api.*'), true);
|
|
18
|
+
assert.equal(matchesWildcard('cdn.example.com', 'api.*'), false);
|
|
19
|
+
});
|
|
20
|
+
void it('should match wildcards in middle', () => {
|
|
21
|
+
assert.equal(matchesWildcard('analytics.google.com', '*analytics*'), true);
|
|
22
|
+
assert.equal(matchesWildcard('google-analytics.com', '*analytics*'), true);
|
|
23
|
+
assert.equal(matchesWildcard('example.com/api/users', '*/api/*'), true);
|
|
24
|
+
assert.equal(matchesWildcard('example.com/v1/data', '*/api/*'), false);
|
|
25
|
+
});
|
|
26
|
+
void it('should be case-insensitive', () => {
|
|
27
|
+
assert.equal(matchesWildcard('API.EXAMPLE.COM', 'api.example.com'), true);
|
|
28
|
+
assert.equal(matchesWildcard('api.example.com', 'API.EXAMPLE.COM'), true);
|
|
29
|
+
assert.equal(matchesWildcard('Logo.PNG', '*.png'), true);
|
|
30
|
+
});
|
|
31
|
+
void it('should match multiple wildcards', () => {
|
|
32
|
+
assert.equal(matchesWildcard('api.example.com/users', '*api*/*'), true);
|
|
33
|
+
assert.equal(matchesWildcard('example.com/api/users', '*/api/*'), true);
|
|
34
|
+
assert.equal(matchesWildcard('example.com/v1/data', '*example*/v1/*'), true);
|
|
35
|
+
});
|
|
36
|
+
void it('should match empty pattern', () => {
|
|
37
|
+
assert.equal(matchesWildcard('anything', ''), false);
|
|
38
|
+
assert.equal(matchesWildcard('', ''), true);
|
|
39
|
+
});
|
|
40
|
+
void it('should match just wildcard', () => {
|
|
41
|
+
assert.equal(matchesWildcard('anything', '*'), true);
|
|
42
|
+
assert.equal(matchesWildcard('', '*'), true);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
void describe('filters - shouldFetchBody', () => {
|
|
46
|
+
void it('should fetch bodies by default', () => {
|
|
47
|
+
assert.equal(shouldFetchBody('https://api.example.com/users', 'application/json'), true);
|
|
48
|
+
assert.equal(shouldFetchBody('https://example.com/app.js', 'application/javascript'), true);
|
|
49
|
+
});
|
|
50
|
+
void it('should skip bodies matching DEFAULT_SKIP_BODY_PATTERNS', () => {
|
|
51
|
+
// Images
|
|
52
|
+
assert.equal(shouldFetchBody('https://example.com/logo.png', 'image/png'), false);
|
|
53
|
+
assert.equal(shouldFetchBody('https://example.com/photo.jpg', 'image/jpeg'), false);
|
|
54
|
+
assert.equal(shouldFetchBody('https://example.com/icon.svg', 'image/svg+xml'), false);
|
|
55
|
+
// Fonts
|
|
56
|
+
assert.equal(shouldFetchBody('https://example.com/font.woff2', 'font/woff2'), false);
|
|
57
|
+
assert.equal(shouldFetchBody('https://example.com/font.ttf', 'font/ttf'), false);
|
|
58
|
+
// CSS
|
|
59
|
+
assert.equal(shouldFetchBody('https://example.com/styles.css', 'text/css'), false);
|
|
60
|
+
// Source maps
|
|
61
|
+
assert.equal(shouldFetchBody('https://example.com/app.js.map', 'application/json'), false);
|
|
62
|
+
assert.equal(shouldFetchBody('https://example.com/styles.css.map', 'application/json'), false);
|
|
63
|
+
});
|
|
64
|
+
void it('should respect includePatterns (trumps exclude and defaults)', () => {
|
|
65
|
+
const options = {
|
|
66
|
+
includePatterns: ['*/api/*'],
|
|
67
|
+
excludePatterns: ['*example.com*'],
|
|
68
|
+
};
|
|
69
|
+
// Include pattern matches, so fetch despite exclude pattern
|
|
70
|
+
assert.equal(shouldFetchBody('https://example.com/api/users', 'application/json', options), true);
|
|
71
|
+
// Include pattern matches, so fetch despite default skip pattern
|
|
72
|
+
const optionsWithImage = {
|
|
73
|
+
includePatterns: ['*.png'],
|
|
74
|
+
};
|
|
75
|
+
assert.equal(shouldFetchBody('https://example.com/logo.png', 'image/png', optionsWithImage), true);
|
|
76
|
+
});
|
|
77
|
+
void it('should treat includePatterns as whitelist (skip non-matching URLs)', () => {
|
|
78
|
+
const options = {
|
|
79
|
+
includePatterns: ['*/api/*', '*/graphql'],
|
|
80
|
+
};
|
|
81
|
+
// Matches include pattern → fetch
|
|
82
|
+
assert.equal(shouldFetchBody('https://example.com/api/users', 'application/json', options), true);
|
|
83
|
+
assert.equal(shouldFetchBody('https://example.com/graphql', 'application/json', options), true);
|
|
84
|
+
// Doesn't match include pattern → skip (whitelist mode)
|
|
85
|
+
assert.equal(shouldFetchBody('https://example.com/app.js', 'application/javascript', options), false);
|
|
86
|
+
assert.equal(shouldFetchBody('https://example.com/index.html', 'text/html', options), false);
|
|
87
|
+
assert.equal(shouldFetchBody('https://example.com/data.json', 'application/json', options), false);
|
|
88
|
+
});
|
|
89
|
+
void it('should respect excludePatterns', () => {
|
|
90
|
+
const options = {
|
|
91
|
+
excludePatterns: ['*tracking*', '*analytics*'],
|
|
92
|
+
};
|
|
93
|
+
assert.equal(shouldFetchBody('https://tracking.example.com/collect', 'application/json', options), false);
|
|
94
|
+
assert.equal(shouldFetchBody('https://analytics.example.com/event', 'application/json', options), false);
|
|
95
|
+
assert.equal(shouldFetchBody('https://api.example.com/users', 'application/json', options), true);
|
|
96
|
+
});
|
|
97
|
+
void it('should respect fetchAllBodies flag', () => {
|
|
98
|
+
const options = {
|
|
99
|
+
fetchAllBodies: true,
|
|
100
|
+
};
|
|
101
|
+
// Fetch even images when fetchAllBodies is true
|
|
102
|
+
assert.equal(shouldFetchBody('https://example.com/logo.png', 'image/png', options), true);
|
|
103
|
+
assert.equal(shouldFetchBody('https://example.com/styles.css', 'text/css', options), true);
|
|
104
|
+
assert.equal(shouldFetchBody('https://example.com/app.js.map', 'application/json', options), true);
|
|
105
|
+
});
|
|
106
|
+
void it('should combine patterns with correct precedence: include > exclude > fetchAllBodies > defaults', () => {
|
|
107
|
+
// Include trumps everything
|
|
108
|
+
assert.equal(shouldFetchBody('https://example.com/logo.png', 'image/png', {
|
|
109
|
+
includePatterns: ['*.png'],
|
|
110
|
+
excludePatterns: ['*example.com*'],
|
|
111
|
+
fetchAllBodies: false,
|
|
112
|
+
}), true);
|
|
113
|
+
// Exclude trumps fetchAllBodies and defaults
|
|
114
|
+
assert.equal(shouldFetchBody('https://tracking.com/pixel.png', 'image/png', {
|
|
115
|
+
excludePatterns: ['*tracking*'],
|
|
116
|
+
fetchAllBodies: true,
|
|
117
|
+
}), false);
|
|
118
|
+
// fetchAllBodies trumps defaults
|
|
119
|
+
assert.equal(shouldFetchBody('https://example.com/logo.png', 'image/png', {
|
|
120
|
+
fetchAllBodies: true,
|
|
121
|
+
}), true);
|
|
122
|
+
// Defaults apply when no options
|
|
123
|
+
assert.equal(shouldFetchBody('https://example.com/logo.png', 'image/png'), false);
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
void describe('filters - shouldExcludeUrl', () => {
|
|
127
|
+
void it('should not exclude by default', () => {
|
|
128
|
+
assert.equal(shouldExcludeUrl('https://api.example.com/users'), false);
|
|
129
|
+
assert.equal(shouldExcludeUrl('https://example.com/logo.png'), false);
|
|
130
|
+
});
|
|
131
|
+
void it('should respect includePatterns (trumps exclude)', () => {
|
|
132
|
+
const options = {
|
|
133
|
+
includePatterns: ['api.example.com'],
|
|
134
|
+
excludePatterns: ['*example.com*'],
|
|
135
|
+
};
|
|
136
|
+
// Include pattern matches, so don't exclude despite exclude pattern
|
|
137
|
+
assert.equal(shouldExcludeUrl('https://api.example.com/users', options), false);
|
|
138
|
+
// Exclude pattern matches but no include match (includePatterns act as whitelist)
|
|
139
|
+
assert.equal(shouldExcludeUrl('https://cdn.example.com/logo.png', options), true);
|
|
140
|
+
// Neither pattern matches (includePatterns act as whitelist, so exclude)
|
|
141
|
+
assert.equal(shouldExcludeUrl('https://other.com/data', options), true);
|
|
142
|
+
});
|
|
143
|
+
void it('should respect excludePatterns', () => {
|
|
144
|
+
const options = {
|
|
145
|
+
excludePatterns: ['*analytics*', '*tracking*', '*ads*'],
|
|
146
|
+
};
|
|
147
|
+
assert.equal(shouldExcludeUrl('https://analytics.google.com/collect', options), true);
|
|
148
|
+
assert.equal(shouldExcludeUrl('https://tracking.example.com/pixel', options), true);
|
|
149
|
+
assert.equal(shouldExcludeUrl('https://ads.example.com/banner', options), true);
|
|
150
|
+
assert.equal(shouldExcludeUrl('https://api.example.com/users', options), false);
|
|
151
|
+
});
|
|
152
|
+
void it('should match bare hostname patterns without requiring wildcards', () => {
|
|
153
|
+
const options = {
|
|
154
|
+
includePatterns: ['api.example.com'],
|
|
155
|
+
};
|
|
156
|
+
// Should match all URLs on api.example.com regardless of path
|
|
157
|
+
assert.equal(shouldExcludeUrl('https://api.example.com/users', options), false);
|
|
158
|
+
assert.equal(shouldExcludeUrl('https://api.example.com/posts', options), false);
|
|
159
|
+
assert.equal(shouldExcludeUrl('https://api.example.com/', options), false);
|
|
160
|
+
// Should not match other hosts
|
|
161
|
+
assert.equal(shouldExcludeUrl('https://cdn.example.com/users', options), true);
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
void describe('filters - shouldExcludeDomain', () => {
|
|
165
|
+
void it('should not exclude by default when includeAll is true', () => {
|
|
166
|
+
assert.equal(shouldExcludeDomain('https://analytics.google.com/collect', true), false);
|
|
167
|
+
assert.equal(shouldExcludeDomain('https://facebook.com/tracking', true), false);
|
|
168
|
+
});
|
|
169
|
+
void it('should exclude DEFAULT_EXCLUDED_DOMAINS', () => {
|
|
170
|
+
// Sample from DEFAULT_EXCLUDED_DOMAINS
|
|
171
|
+
assert.equal(shouldExcludeDomain('https://analytics.google.com/collect'), true);
|
|
172
|
+
assert.equal(shouldExcludeDomain('https://googletagmanager.com/gtm.js'), true);
|
|
173
|
+
assert.equal(shouldExcludeDomain('https://facebook.com/tracking'), true);
|
|
174
|
+
assert.equal(shouldExcludeDomain('https://doubleclick.net/ads'), true);
|
|
175
|
+
assert.equal(shouldExcludeDomain('https://fullstory.com/rec'), true);
|
|
176
|
+
});
|
|
177
|
+
void it('should not exclude non-tracking domains', () => {
|
|
178
|
+
assert.equal(shouldExcludeDomain('https://api.example.com/users'), false);
|
|
179
|
+
assert.equal(shouldExcludeDomain('https://cdn.example.com/app.js'), false);
|
|
180
|
+
assert.equal(shouldExcludeDomain('https://example.com/'), false);
|
|
181
|
+
});
|
|
182
|
+
void it('should handle subdomains correctly', () => {
|
|
183
|
+
// Should match if domain is contained in hostname
|
|
184
|
+
assert.equal(shouldExcludeDomain('https://www.analytics.google.com/collect'), true);
|
|
185
|
+
assert.equal(shouldExcludeDomain('https://subdomain.facebook.com/pixel'), true);
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
void describe('filters - shouldExcludeConsoleMessage', () => {
|
|
189
|
+
void it('should not exclude by default when includeAll is true', () => {
|
|
190
|
+
assert.equal(shouldExcludeConsoleMessage('webpack-dev-server: Hot Module Replacement', 'log', true), false);
|
|
191
|
+
assert.equal(shouldExcludeConsoleMessage('[HMR] Waiting for update signal', 'log', true), false);
|
|
192
|
+
});
|
|
193
|
+
void it('should exclude DEFAULT_EXCLUDED_CONSOLE_PATTERNS', () => {
|
|
194
|
+
assert.equal(shouldExcludeConsoleMessage('webpack-dev-server: Hot Module Replacement', 'log'), true);
|
|
195
|
+
assert.equal(shouldExcludeConsoleMessage('[HMR] Waiting for update signal from WDS...', 'log'), true);
|
|
196
|
+
assert.equal(shouldExcludeConsoleMessage('[WDS] Live Reloading enabled.', 'log'), true);
|
|
197
|
+
assert.equal(shouldExcludeConsoleMessage('Download the React DevTools for a better development experience', 'log'), true);
|
|
198
|
+
});
|
|
199
|
+
void it('should exclude group message types', () => {
|
|
200
|
+
assert.equal(shouldExcludeConsoleMessage('Some group', 'startGroupCollapsed'), true);
|
|
201
|
+
assert.equal(shouldExcludeConsoleMessage('', 'endGroup'), true);
|
|
202
|
+
assert.equal(shouldExcludeConsoleMessage('Normal log', 'log'), false);
|
|
203
|
+
});
|
|
204
|
+
void it('should not exclude non-dev-server messages', () => {
|
|
205
|
+
assert.equal(shouldExcludeConsoleMessage('User clicked button', 'log'), false);
|
|
206
|
+
assert.equal(shouldExcludeConsoleMessage('API request failed', 'error'), false);
|
|
207
|
+
assert.equal(shouldExcludeConsoleMessage('Error: Invalid input', 'error'), false);
|
|
208
|
+
});
|
|
209
|
+
void it('should be case-insensitive', () => {
|
|
210
|
+
assert.equal(shouldExcludeConsoleMessage('WEBPACK-DEV-SERVER: Hot Module Replacement', 'log'), true);
|
|
211
|
+
assert.equal(shouldExcludeConsoleMessage('[hmr] waiting for update signal', 'log'), true);
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
void describe('filters - constants', () => {
|
|
215
|
+
void it('DEFAULT_SKIP_BODY_PATTERNS should include common asset patterns', () => {
|
|
216
|
+
// Verify key patterns exist
|
|
217
|
+
assert.ok(DEFAULT_SKIP_BODY_PATTERNS.includes('*.png'));
|
|
218
|
+
assert.ok(DEFAULT_SKIP_BODY_PATTERNS.includes('*.jpg'));
|
|
219
|
+
assert.ok(DEFAULT_SKIP_BODY_PATTERNS.includes('*.woff2'));
|
|
220
|
+
assert.ok(DEFAULT_SKIP_BODY_PATTERNS.includes('*.css'));
|
|
221
|
+
assert.ok(DEFAULT_SKIP_BODY_PATTERNS.includes('*.map'));
|
|
222
|
+
assert.ok(DEFAULT_SKIP_BODY_PATTERNS.includes('*.js.map'));
|
|
223
|
+
assert.ok(DEFAULT_SKIP_BODY_PATTERNS.includes('*.css.map'));
|
|
224
|
+
});
|
|
225
|
+
void it('DEFAULT_EXCLUDED_DOMAINS should include common tracking domains', () => {
|
|
226
|
+
// Verify key domains exist
|
|
227
|
+
assert.ok(DEFAULT_EXCLUDED_DOMAINS.includes('analytics.google.com'));
|
|
228
|
+
assert.ok(DEFAULT_EXCLUDED_DOMAINS.includes('googletagmanager.com'));
|
|
229
|
+
assert.ok(DEFAULT_EXCLUDED_DOMAINS.includes('facebook.com'));
|
|
230
|
+
assert.ok(DEFAULT_EXCLUDED_DOMAINS.includes('doubleclick.net'));
|
|
231
|
+
});
|
|
232
|
+
void it('DEFAULT_EXCLUDED_CONSOLE_PATTERNS should include dev server noise', () => {
|
|
233
|
+
// Verify key patterns exist
|
|
234
|
+
assert.ok(DEFAULT_EXCLUDED_CONSOLE_PATTERNS.includes('webpack-dev-server'));
|
|
235
|
+
assert.ok(DEFAULT_EXCLUDED_CONSOLE_PATTERNS.includes('[HMR]'));
|
|
236
|
+
assert.ok(DEFAULT_EXCLUDED_CONSOLE_PATTERNS.includes('[WDS]'));
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
//# sourceMappingURL=filters.unit.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filters.unit.test.js","sourceRoot":"","sources":["../../../src/utils/__tests__/filters.unit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.contract.test.d.ts","sourceRoot":"","sources":["../../../src/utils/__tests__/session.contract.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import * as fs from 'node:fs';
|
|
3
|
+
import * as os from 'node:os';
|
|
4
|
+
import * as path from 'node:path';
|
|
5
|
+
import { afterEach, beforeEach, describe, it } from 'node:test';
|
|
6
|
+
import { mockProcessAlive, restoreProcessAlive } from '../../__testutils__/testProcess.js';
|
|
7
|
+
import { cleanupStaleSession } from '../../session/cleanup.js';
|
|
8
|
+
import { acquireSessionLock, releaseSessionLock } from '../../session/lock.js';
|
|
9
|
+
import { writeSessionMetadata } from '../../session/metadata.js';
|
|
10
|
+
import { getSessionFilePath } from '../../session/paths.js';
|
|
11
|
+
import { readPid, writePid } from '../../session/pid.js';
|
|
12
|
+
import { isProcessAlive } from '../../session/process.js';
|
|
13
|
+
/**
|
|
14
|
+
* Session Utilities Contract Tests
|
|
15
|
+
*
|
|
16
|
+
* Week 1 Note: Using real temp directories instead of FakeFileSystem
|
|
17
|
+
* because mocking built-in Node modules is complex. This still validates
|
|
18
|
+
* the contracts while keeping tests simple and fast.
|
|
19
|
+
*/
|
|
20
|
+
void describe('Session Utilities Contract Tests', () => {
|
|
21
|
+
let tmpDir;
|
|
22
|
+
let originalHome;
|
|
23
|
+
let originalUserProfile;
|
|
24
|
+
let originalProcessPid;
|
|
25
|
+
beforeEach(() => {
|
|
26
|
+
// Create temp directory for each test
|
|
27
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'bdg-test-'));
|
|
28
|
+
// Mock process.pid for predictable tests
|
|
29
|
+
originalProcessPid = process.pid;
|
|
30
|
+
Object.defineProperty(process, 'pid', {
|
|
31
|
+
value: 12345,
|
|
32
|
+
writable: true,
|
|
33
|
+
configurable: true,
|
|
34
|
+
});
|
|
35
|
+
// Override HOME environment variable to point to temp directory
|
|
36
|
+
// os.homedir() uses this on Unix systems
|
|
37
|
+
originalHome = process.env['HOME'];
|
|
38
|
+
originalUserProfile = process.env['USERPROFILE'];
|
|
39
|
+
process.env['HOME'] = tmpDir;
|
|
40
|
+
if (process.platform === 'win32') {
|
|
41
|
+
process.env['USERPROFILE'] = tmpDir;
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
afterEach(() => {
|
|
45
|
+
// Restore process.pid
|
|
46
|
+
Object.defineProperty(process, 'pid', {
|
|
47
|
+
value: originalProcessPid,
|
|
48
|
+
writable: true,
|
|
49
|
+
configurable: true,
|
|
50
|
+
});
|
|
51
|
+
// Restore process.kill mock
|
|
52
|
+
restoreProcessAlive();
|
|
53
|
+
// Restore HOME environment variable
|
|
54
|
+
process.env['HOME'] = originalHome;
|
|
55
|
+
if (process.platform === 'win32') {
|
|
56
|
+
process.env['USERPROFILE'] = originalUserProfile;
|
|
57
|
+
}
|
|
58
|
+
// ⚠️ CRITICAL: Clean up temp directory
|
|
59
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
60
|
+
});
|
|
61
|
+
void describe('PID Management', () => {
|
|
62
|
+
void it('should write PID to file with correct content', () => {
|
|
63
|
+
writePid(12345);
|
|
64
|
+
const pidPath = getSessionFilePath('PID');
|
|
65
|
+
const content = fs.readFileSync(pidPath, 'utf-8');
|
|
66
|
+
assert.equal(content, '12345');
|
|
67
|
+
});
|
|
68
|
+
void it('should read PID from existing file', () => {
|
|
69
|
+
writePid(67890);
|
|
70
|
+
const pid = readPid();
|
|
71
|
+
assert.equal(pid, 67890);
|
|
72
|
+
});
|
|
73
|
+
void it('should return null when PID file does not exist', () => {
|
|
74
|
+
// Ensure PID file doesn't exist (cleanup from previous test)
|
|
75
|
+
const pidPath = getSessionFilePath('PID');
|
|
76
|
+
if (fs.existsSync(pidPath)) {
|
|
77
|
+
fs.unlinkSync(pidPath);
|
|
78
|
+
}
|
|
79
|
+
const pid = readPid();
|
|
80
|
+
assert.equal(pid, null);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
void describe('Lock Management', () => {
|
|
84
|
+
void it('should create lock file with current process PID', () => {
|
|
85
|
+
const acquired = acquireSessionLock();
|
|
86
|
+
assert.equal(acquired, true);
|
|
87
|
+
const lockPath = getSessionFilePath('LOCK');
|
|
88
|
+
const content = fs.readFileSync(lockPath, 'utf-8');
|
|
89
|
+
assert.equal(content, '12345'); // process.pid from beforeEach
|
|
90
|
+
});
|
|
91
|
+
void it('should return false if lock is held by alive process', () => {
|
|
92
|
+
// Setup: Create lock file held by alive process
|
|
93
|
+
const lockPath = getSessionFilePath('LOCK');
|
|
94
|
+
const sessionDir = path.join(tmpDir, '.bdg');
|
|
95
|
+
fs.mkdirSync(sessionDir, { recursive: true });
|
|
96
|
+
fs.writeFileSync(lockPath, '99999');
|
|
97
|
+
// Mock process 99999 as alive
|
|
98
|
+
mockProcessAlive([99999]);
|
|
99
|
+
// Act
|
|
100
|
+
const acquired = acquireSessionLock();
|
|
101
|
+
// Assert
|
|
102
|
+
assert.equal(acquired, false);
|
|
103
|
+
});
|
|
104
|
+
void it('should remove stale lock and acquire if holder PID is dead', () => {
|
|
105
|
+
// Setup: Create lock file held by dead process
|
|
106
|
+
const lockPath = getSessionFilePath('LOCK');
|
|
107
|
+
const sessionDir = path.join(tmpDir, '.bdg');
|
|
108
|
+
fs.mkdirSync(sessionDir, { recursive: true });
|
|
109
|
+
fs.writeFileSync(lockPath, '88888');
|
|
110
|
+
// Mock process 88888 as dead (not in alive list)
|
|
111
|
+
mockProcessAlive([]);
|
|
112
|
+
// Act
|
|
113
|
+
const acquired = acquireSessionLock();
|
|
114
|
+
// Assert
|
|
115
|
+
assert.equal(acquired, true, 'Should acquire lock after removing stale one');
|
|
116
|
+
const newContent = fs.readFileSync(lockPath, 'utf-8');
|
|
117
|
+
assert.equal(newContent, '12345', 'Should write current PID');
|
|
118
|
+
});
|
|
119
|
+
void it('should remove lock file when released', () => {
|
|
120
|
+
// Setup: Acquire lock first
|
|
121
|
+
acquireSessionLock();
|
|
122
|
+
const lockPath = getSessionFilePath('LOCK');
|
|
123
|
+
assert.equal(fs.existsSync(lockPath), true, 'Lock file should exist');
|
|
124
|
+
// Act
|
|
125
|
+
releaseSessionLock();
|
|
126
|
+
// Assert
|
|
127
|
+
assert.equal(fs.existsSync(lockPath), false, 'Lock file should be removed');
|
|
128
|
+
});
|
|
129
|
+
void it('should handle concurrent acquisition via exclusive create flag', () => {
|
|
130
|
+
// Setup: Acquire lock first
|
|
131
|
+
acquireSessionLock();
|
|
132
|
+
// Mock current process as alive
|
|
133
|
+
mockProcessAlive([12345]);
|
|
134
|
+
// Act: Try to acquire again from same process (simulates race condition)
|
|
135
|
+
const secondAttempt = acquireSessionLock();
|
|
136
|
+
// Assert: Should fail because file exists and process is alive
|
|
137
|
+
assert.equal(secondAttempt, false, 'Should not acquire lock twice');
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
void describe('Process Alive Checks', () => {
|
|
141
|
+
void it('should return true for alive process', () => {
|
|
142
|
+
mockProcessAlive([12345, 67890]);
|
|
143
|
+
assert.equal(isProcessAlive(12345), true);
|
|
144
|
+
assert.equal(isProcessAlive(67890), true);
|
|
145
|
+
});
|
|
146
|
+
void it('should return false for dead process', () => {
|
|
147
|
+
mockProcessAlive([12345]);
|
|
148
|
+
assert.equal(isProcessAlive(99999), false);
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
void describe('Stale Session Cleanup', () => {
|
|
152
|
+
void it('should remove stale session files when process is dead', () => {
|
|
153
|
+
// Setup: Create stale session files
|
|
154
|
+
const sessionDir = path.join(tmpDir, '.bdg');
|
|
155
|
+
fs.mkdirSync(sessionDir, { recursive: true });
|
|
156
|
+
writePid(88888);
|
|
157
|
+
writeSessionMetadata({
|
|
158
|
+
bdgPid: 88888,
|
|
159
|
+
chromePid: 77777,
|
|
160
|
+
startTime: Date.now(),
|
|
161
|
+
port: 9222,
|
|
162
|
+
});
|
|
163
|
+
fs.writeFileSync(getSessionFilePath('DAEMON_PID'), '66666');
|
|
164
|
+
fs.writeFileSync(getSessionFilePath('DAEMON_SOCKET'), '');
|
|
165
|
+
// Mock all processes as dead
|
|
166
|
+
mockProcessAlive([]);
|
|
167
|
+
// Act
|
|
168
|
+
const cleaned = cleanupStaleSession();
|
|
169
|
+
// Assert
|
|
170
|
+
assert.equal(cleaned, true, 'Should return true when cleanup was performed');
|
|
171
|
+
assert.equal(fs.existsSync(getSessionFilePath('PID')), false, 'PID file should be removed');
|
|
172
|
+
assert.equal(fs.existsSync(getSessionFilePath('DAEMON_PID')), false, 'Daemon PID should be removed');
|
|
173
|
+
assert.equal(fs.existsSync(getSessionFilePath('DAEMON_SOCKET')), false, 'Daemon socket should be removed');
|
|
174
|
+
});
|
|
175
|
+
void it('should not remove files when session process is alive', () => {
|
|
176
|
+
// Setup: Create session files with alive process
|
|
177
|
+
const sessionDir = path.join(tmpDir, '.bdg');
|
|
178
|
+
fs.mkdirSync(sessionDir, { recursive: true });
|
|
179
|
+
writePid(88888);
|
|
180
|
+
writeSessionMetadata({
|
|
181
|
+
bdgPid: 88888,
|
|
182
|
+
chromePid: 77777,
|
|
183
|
+
startTime: Date.now(),
|
|
184
|
+
port: 9222,
|
|
185
|
+
});
|
|
186
|
+
// Mock process 88888 as alive
|
|
187
|
+
mockProcessAlive([88888]);
|
|
188
|
+
// Act
|
|
189
|
+
const cleaned = cleanupStaleSession();
|
|
190
|
+
// Assert
|
|
191
|
+
assert.equal(cleaned, false, 'Should return false when session is active');
|
|
192
|
+
assert.equal(fs.existsSync(getSessionFilePath('PID')), true, 'PID file should still exist');
|
|
193
|
+
});
|
|
194
|
+
void it('should not remove files when daemon process is alive', () => {
|
|
195
|
+
// Setup: Create session files with dead session but alive daemon
|
|
196
|
+
const sessionDir = path.join(tmpDir, '.bdg');
|
|
197
|
+
fs.mkdirSync(sessionDir, { recursive: true });
|
|
198
|
+
writePid(88888);
|
|
199
|
+
fs.writeFileSync(getSessionFilePath('DAEMON_PID'), '66666');
|
|
200
|
+
// Mock only daemon as alive (session process is dead)
|
|
201
|
+
mockProcessAlive([66666]);
|
|
202
|
+
// Act
|
|
203
|
+
const cleaned = cleanupStaleSession();
|
|
204
|
+
// Assert
|
|
205
|
+
assert.equal(cleaned, false, 'Should return false when daemon is still alive');
|
|
206
|
+
assert.equal(fs.existsSync(getSessionFilePath('PID')), true, 'PID file should still exist');
|
|
207
|
+
assert.equal(fs.existsSync(getSessionFilePath('DAEMON_PID')), true, 'Daemon PID should still exist');
|
|
208
|
+
});
|
|
209
|
+
void it('should cleanup daemon artifacts when daemon process is dead', () => {
|
|
210
|
+
// Setup: Create daemon files with dead process
|
|
211
|
+
const sessionDir = path.join(tmpDir, '.bdg');
|
|
212
|
+
fs.mkdirSync(sessionDir, { recursive: true });
|
|
213
|
+
fs.writeFileSync(getSessionFilePath('DAEMON_PID'), '66666');
|
|
214
|
+
fs.writeFileSync(getSessionFilePath('DAEMON_SOCKET'), '');
|
|
215
|
+
// Mock process as dead
|
|
216
|
+
mockProcessAlive([]);
|
|
217
|
+
// Act
|
|
218
|
+
const cleaned = cleanupStaleSession();
|
|
219
|
+
// Assert
|
|
220
|
+
assert.equal(cleaned, true, 'Should cleanup when daemon is dead');
|
|
221
|
+
assert.equal(fs.existsSync(getSessionFilePath('DAEMON_PID')), false, 'Daemon PID should be removed');
|
|
222
|
+
assert.equal(fs.existsSync(getSessionFilePath('DAEMON_SOCKET')), false, 'Daemon socket should be removed');
|
|
223
|
+
});
|
|
224
|
+
void it('should handle missing files gracefully', () => {
|
|
225
|
+
// Setup: No files exist
|
|
226
|
+
mockProcessAlive([]);
|
|
227
|
+
// Act - should not throw
|
|
228
|
+
const cleaned = cleanupStaleSession();
|
|
229
|
+
// Assert
|
|
230
|
+
assert.equal(cleaned, true, 'Should succeed even with no files');
|
|
231
|
+
});
|
|
232
|
+
});
|
|
233
|
+
});
|
|
234
|
+
//# sourceMappingURL=session.contract.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.contract.test.js","sourceRoot":"","sources":["../../../src/utils/__tests__/session.contract.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Atomic file operations using tmp-file-then-rename pattern.
|
|
3
|
+
*
|
|
4
|
+
* Provides safe file writing that prevents corruption from interrupted writes
|
|
5
|
+
* or concurrent access by using a temporary file and atomic rename operation.
|
|
6
|
+
*/
|
|
7
|
+
export declare class AtomicFileWriter {
|
|
8
|
+
/**
|
|
9
|
+
* Write data to a file atomically (synchronous).
|
|
10
|
+
*
|
|
11
|
+
* Creates a temporary file, writes the data, then atomically renames it to the target path.
|
|
12
|
+
* This ensures the target file is never in a partially written state.
|
|
13
|
+
*
|
|
14
|
+
* @param filePath - Target file path
|
|
15
|
+
* @param data - Data to write
|
|
16
|
+
* @param options - Write options
|
|
17
|
+
* @throws Error if write operation fails
|
|
18
|
+
*/
|
|
19
|
+
static writeSync(filePath: string, data: string, options?: {
|
|
20
|
+
encoding?: BufferEncoding;
|
|
21
|
+
}): void;
|
|
22
|
+
/**
|
|
23
|
+
* Write data to a file atomically (asynchronous).
|
|
24
|
+
*
|
|
25
|
+
* Creates a temporary file, writes the data, then atomically renames it to the target path.
|
|
26
|
+
* This ensures the target file is never in a partially written state.
|
|
27
|
+
*
|
|
28
|
+
* @param filePath - Target file path
|
|
29
|
+
* @param data - Data to write
|
|
30
|
+
* @param options - Write options
|
|
31
|
+
* @returns Promise that resolves when write completes
|
|
32
|
+
* @throws Error if write operation fails
|
|
33
|
+
*/
|
|
34
|
+
static writeAsync(filePath: string, data: string, options?: {
|
|
35
|
+
encoding?: BufferEncoding;
|
|
36
|
+
}): Promise<void>;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=atomicFile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atomicFile.d.ts","sourceRoot":"","sources":["../../src/utils/atomicFile.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,qBAAa,gBAAgB;IAC3B;;;;;;;;;;OAUG;IACH,MAAM,CAAC,SAAS,CACd,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;QAAE,QAAQ,CAAC,EAAE,cAAc,CAAA;KAAO,GAC1C,IAAI;IAoBP;;;;;;;;;;;OAWG;WACU,UAAU,CACrB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;QAAE,QAAQ,CAAC,EAAE,cAAc,CAAA;KAAO,GAC1C,OAAO,CAAC,IAAI,CAAC;CAmBjB"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
/**
|
|
3
|
+
* Atomic file operations using tmp-file-then-rename pattern.
|
|
4
|
+
*
|
|
5
|
+
* Provides safe file writing that prevents corruption from interrupted writes
|
|
6
|
+
* or concurrent access by using a temporary file and atomic rename operation.
|
|
7
|
+
*/
|
|
8
|
+
export class AtomicFileWriter {
|
|
9
|
+
/**
|
|
10
|
+
* Write data to a file atomically (synchronous).
|
|
11
|
+
*
|
|
12
|
+
* Creates a temporary file, writes the data, then atomically renames it to the target path.
|
|
13
|
+
* This ensures the target file is never in a partially written state.
|
|
14
|
+
*
|
|
15
|
+
* @param filePath - Target file path
|
|
16
|
+
* @param data - Data to write
|
|
17
|
+
* @param options - Write options
|
|
18
|
+
* @throws Error if write operation fails
|
|
19
|
+
*/
|
|
20
|
+
static writeSync(filePath, data, options = {}) {
|
|
21
|
+
const tmpPath = filePath + '.tmp';
|
|
22
|
+
try {
|
|
23
|
+
// Write to temporary file first
|
|
24
|
+
fs.writeFileSync(tmpPath, data, { encoding: options.encoding ?? 'utf-8' });
|
|
25
|
+
// Atomically rename to target path
|
|
26
|
+
fs.renameSync(tmpPath, filePath);
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
// Clean up temporary file on error
|
|
30
|
+
try {
|
|
31
|
+
fs.unlinkSync(tmpPath);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// Ignore cleanup errors
|
|
35
|
+
}
|
|
36
|
+
throw error;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Write data to a file atomically (asynchronous).
|
|
41
|
+
*
|
|
42
|
+
* Creates a temporary file, writes the data, then atomically renames it to the target path.
|
|
43
|
+
* This ensures the target file is never in a partially written state.
|
|
44
|
+
*
|
|
45
|
+
* @param filePath - Target file path
|
|
46
|
+
* @param data - Data to write
|
|
47
|
+
* @param options - Write options
|
|
48
|
+
* @returns Promise that resolves when write completes
|
|
49
|
+
* @throws Error if write operation fails
|
|
50
|
+
*/
|
|
51
|
+
static async writeAsync(filePath, data, options = {}) {
|
|
52
|
+
const tmpPath = filePath + '.tmp';
|
|
53
|
+
try {
|
|
54
|
+
// Write to temporary file first
|
|
55
|
+
await fs.promises.writeFile(tmpPath, data, { encoding: options.encoding ?? 'utf-8' });
|
|
56
|
+
// Atomically rename to target path
|
|
57
|
+
await fs.promises.rename(tmpPath, filePath);
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
// Clean up temporary file on error
|
|
61
|
+
try {
|
|
62
|
+
await fs.promises.unlink(tmpPath);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// Ignore cleanup errors
|
|
66
|
+
}
|
|
67
|
+
throw error;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=atomicFile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atomicFile.js","sourceRoot":"","sources":["../../src/utils/atomicFile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB;;;;;GAKG;AACH,MAAM,OAAO,gBAAgB;IAC3B;;;;;;;;;;OAUG;IACH,MAAM,CAAC,SAAS,CACd,QAAgB,EAChB,IAAY,EACZ,UAAyC,EAAE;QAE3C,MAAM,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;QAElC,IAAI,CAAC;YACH,gCAAgC;YAChC,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,OAAO,EAAE,CAAC,CAAC;YAE3E,mCAAmC;YACnC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,mCAAmC;YACnC,IAAI,CAAC;gBACH,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACzB,CAAC;YAAC,MAAM,CAAC;gBACP,wBAAwB;YAC1B,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,KAAK,CAAC,UAAU,CACrB,QAAgB,EAChB,IAAY,EACZ,UAAyC,EAAE;QAE3C,MAAM,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;QAElC,IAAI,CAAC;YACH,gCAAgC;YAChC,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,OAAO,EAAE,CAAC,CAAC;YAEtF,mCAAmC;YACnC,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,mCAAmC;YACnC,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACpC,CAAC;YAAC,MAAM,CAAC;gBACP,wBAAwB;YAC1B,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
|