browser-debugger-cli 0.6.0 → 0.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +65 -6
- package/dist/__tests__/smoke/error-handling.smoke.test.js +23 -52
- package/dist/__tests__/smoke/error-handling.smoke.test.js.map +1 -1
- package/dist/__tests__/smoke/session-lifecycle.smoke.test.js +27 -24
- package/dist/__tests__/smoke/session-lifecycle.smoke.test.js.map +1 -1
- package/dist/__testutils__/daemonHelpers.d.ts +13 -1
- package/dist/__testutils__/daemonHelpers.d.ts.map +1 -1
- package/dist/__testutils__/daemonHelpers.js +54 -5
- package/dist/__testutils__/daemonHelpers.js.map +1 -1
- package/dist/__testutils__/testCleanup.js +1 -1
- package/dist/__testutils__/testCleanup.js.map +1 -1
- package/dist/cdp/protocol.d.ts +0 -48
- package/dist/cdp/protocol.d.ts.map +1 -1
- package/dist/cdp/protocol.js +9 -101
- package/dist/cdp/protocol.js.map +1 -1
- package/dist/commands/__tests__/cdp.contract.test.js +2 -2
- package/dist/commands/__tests__/cdp.contract.test.js.map +1 -1
- package/dist/commands/__tests__/domEval.contract.test.js +8 -4
- package/dist/commands/__tests__/domEval.contract.test.js.map +1 -1
- package/dist/commands/cdp.d.ts.map +1 -1
- package/dist/commands/cdp.js +4 -37
- package/dist/commands/cdp.js.map +1 -1
- package/dist/commands/cleanup.d.ts.map +1 -1
- package/dist/commands/cleanup.js +25 -23
- package/dist/commands/cleanup.js.map +1 -1
- package/dist/commands/console.d.ts.map +1 -1
- package/dist/commands/console.js +3 -8
- package/dist/commands/console.js.map +1 -1
- package/dist/commands/details.d.ts.map +1 -1
- package/dist/commands/details.js +1 -1
- package/dist/commands/details.js.map +1 -1
- package/dist/commands/dom/a11y.d.ts +18 -0
- package/dist/commands/dom/a11y.d.ts.map +1 -0
- package/dist/commands/dom/a11y.js +134 -0
- package/dist/commands/dom/a11y.js.map +1 -0
- package/dist/commands/{domEvalHelpers.d.ts → dom/evalHelpers.d.ts} +8 -5
- package/dist/commands/dom/evalHelpers.d.ts.map +1 -0
- package/dist/commands/{domEvalHelpers.js → dom/evalHelpers.js} +14 -13
- package/dist/commands/dom/evalHelpers.js.map +1 -0
- package/dist/commands/dom/formFillHelpers.d.ts +47 -0
- package/dist/commands/dom/formFillHelpers.d.ts.map +1 -0
- package/dist/commands/dom/formFillHelpers.js +185 -0
- package/dist/commands/dom/formFillHelpers.js.map +1 -0
- package/dist/commands/dom/formInteraction.d.ts +17 -0
- package/dist/commands/dom/formInteraction.d.ts.map +1 -0
- package/dist/commands/dom/formInteraction.js +239 -0
- package/dist/commands/dom/formInteraction.js.map +1 -0
- package/dist/commands/dom/formSubmitHelpers.d.ts +58 -0
- package/dist/commands/dom/formSubmitHelpers.d.ts.map +1 -0
- package/dist/commands/dom/formSubmitHelpers.js +176 -0
- package/dist/commands/dom/formSubmitHelpers.js.map +1 -0
- package/dist/commands/dom/helpers.d.ts +34 -0
- package/dist/commands/dom/helpers.d.ts.map +1 -0
- package/dist/commands/dom/helpers.js +244 -0
- package/dist/commands/dom/helpers.js.map +1 -0
- package/dist/commands/{dom.d.ts → dom/index.d.ts} +1 -1
- package/dist/commands/dom/index.d.ts.map +1 -0
- package/dist/commands/dom/index.js +175 -0
- package/dist/commands/dom/index.js.map +1 -0
- package/dist/commands/dom/reactEventHelpers.d.ts +80 -0
- package/dist/commands/dom/reactEventHelpers.d.ts.map +1 -0
- package/dist/commands/dom/reactEventHelpers.js +274 -0
- package/dist/commands/dom/reactEventHelpers.js.map +1 -0
- package/dist/commands/network.js +1 -1
- package/dist/commands/network.js.map +1 -1
- package/dist/commands/peek.d.ts.map +1 -1
- package/dist/commands/peek.js +49 -52
- package/dist/commands/peek.js.map +1 -1
- package/dist/commands/shared/CommandRunner.d.ts.map +1 -1
- package/dist/commands/shared/CommandRunner.js +3 -2
- package/dist/commands/shared/CommandRunner.js.map +1 -1
- package/dist/commands/shared/commonOptions.d.ts.map +1 -1
- package/dist/commands/shared/commonOptions.js +3 -1
- package/dist/commands/shared/commonOptions.js.map +1 -1
- package/dist/commands/shared/daemonErrorHandler.d.ts +30 -0
- package/dist/commands/shared/daemonErrorHandler.d.ts.map +1 -0
- package/dist/commands/shared/daemonErrorHandler.js +32 -0
- package/dist/commands/shared/daemonErrorHandler.js.map +1 -0
- package/dist/commands/shared/{daemonSessionController.d.ts → startHelpers.d.ts} +7 -1
- package/dist/commands/shared/startHelpers.d.ts.map +1 -0
- package/dist/commands/shared/{daemonSessionController.js → startHelpers.js} +13 -5
- package/dist/commands/shared/startHelpers.js.map +1 -0
- package/dist/commands/shared/validation.d.ts +44 -0
- package/dist/commands/shared/validation.d.ts.map +1 -0
- package/dist/commands/shared/validation.js +68 -0
- package/dist/commands/shared/validation.js.map +1 -0
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +9 -25
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +6 -4
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/stop.d.ts.map +1 -1
- package/dist/commands/stop.js +16 -19
- package/dist/commands/stop.js.map +1 -1
- package/dist/commands/tail.d.ts.map +1 -1
- package/dist/commands/tail.js +49 -44
- package/dist/commands/tail.js.map +1 -1
- package/dist/commands/types.d.ts +46 -0
- package/dist/commands/types.d.ts.map +1 -0
- package/dist/commands/types.js +8 -0
- package/dist/commands/types.js.map +1 -0
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +3 -1
- package/dist/commands.js.map +1 -1
- package/dist/connection/__tests__/cdp.contract.test.js +7 -7
- package/dist/connection/__tests__/cdp.contract.test.js.map +1 -1
- package/dist/connection/__tests__/handlers.unit.test.d.ts +11 -0
- package/dist/connection/__tests__/handlers.unit.test.d.ts.map +1 -0
- package/dist/connection/__tests__/handlers.unit.test.js +220 -0
- package/dist/connection/__tests__/handlers.unit.test.js.map +1 -0
- package/dist/connection/__tests__/pageReadiness.contract.test.d.ts +14 -0
- package/dist/connection/__tests__/pageReadiness.contract.test.d.ts.map +1 -0
- package/dist/connection/__tests__/pageReadiness.contract.test.js +382 -0
- package/dist/connection/__tests__/pageReadiness.contract.test.js.map +1 -0
- package/dist/connection/__tests__/portReservation.contract.test.d.ts +14 -0
- package/dist/connection/__tests__/portReservation.contract.test.d.ts.map +1 -0
- package/dist/connection/__tests__/portReservation.contract.test.js +250 -0
- package/dist/connection/__tests__/portReservation.contract.test.js.map +1 -0
- package/dist/connection/cdp.d.ts +34 -11
- package/dist/connection/cdp.d.ts.map +1 -1
- package/dist/connection/cdp.js +61 -45
- package/dist/connection/cdp.js.map +1 -1
- package/dist/connection/config.d.ts +63 -0
- package/dist/connection/config.d.ts.map +1 -0
- package/dist/connection/config.js +46 -0
- package/dist/connection/config.js.map +1 -0
- package/dist/connection/errors.d.ts +6 -21
- package/dist/connection/errors.d.ts.map +1 -1
- package/dist/connection/errors.js +7 -26
- package/dist/connection/errors.js.map +1 -1
- package/dist/connection/events.d.ts +30 -0
- package/dist/connection/events.d.ts.map +1 -0
- package/dist/connection/events.js +8 -0
- package/dist/connection/events.js.map +1 -0
- package/dist/connection/handlers.d.ts +3 -5
- package/dist/connection/handlers.d.ts.map +1 -1
- package/dist/connection/handlers.js +10 -12
- package/dist/connection/handlers.js.map +1 -1
- package/dist/connection/launcher/binaryResolver.d.ts +40 -0
- package/dist/connection/launcher/binaryResolver.d.ts.map +1 -0
- package/dist/connection/launcher/binaryResolver.js +78 -0
- package/dist/connection/launcher/binaryResolver.js.map +1 -0
- package/dist/connection/launcher/flagsBuilder.d.ts +64 -0
- package/dist/connection/launcher/flagsBuilder.d.ts.map +1 -0
- package/dist/connection/launcher/flagsBuilder.js +84 -0
- package/dist/connection/launcher/flagsBuilder.js.map +1 -0
- package/dist/connection/launcher/preferencesLoader.d.ts +74 -0
- package/dist/connection/launcher/preferencesLoader.d.ts.map +1 -0
- package/dist/connection/launcher/preferencesLoader.js +89 -0
- package/dist/connection/launcher/preferencesLoader.js.map +1 -0
- package/dist/connection/launcher.d.ts +24 -1
- package/dist/connection/launcher.d.ts.map +1 -1
- package/dist/connection/launcher.js +30 -205
- package/dist/connection/launcher.js.map +1 -1
- package/dist/connection/pageReadiness.d.ts +8 -8
- package/dist/connection/pageReadiness.d.ts.map +1 -1
- package/dist/connection/pageReadiness.js +36 -52
- package/dist/connection/pageReadiness.js.map +1 -1
- package/dist/connection/portReservation.d.ts +40 -0
- package/dist/connection/portReservation.d.ts.map +1 -0
- package/dist/connection/portReservation.js +55 -0
- package/dist/connection/portReservation.js.map +1 -0
- package/dist/connection/typed-cdp.d.ts +2 -1
- package/dist/connection/typed-cdp.d.ts.map +1 -1
- package/dist/connection/typed-cdp.js.map +1 -1
- package/dist/connection/types.d.ts +103 -0
- package/dist/connection/types.d.ts.map +1 -0
- package/dist/connection/types.js +8 -0
- package/dist/connection/types.js.map +1 -0
- package/dist/constants.d.ts +6 -83
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +6 -83
- package/dist/constants.js.map +1 -1
- package/dist/daemon/__tests__/JsonlParser.unit.test.d.ts +8 -0
- package/dist/daemon/__tests__/JsonlParser.unit.test.d.ts.map +1 -0
- package/dist/daemon/__tests__/JsonlParser.unit.test.js +140 -0
- package/dist/daemon/__tests__/JsonlParser.unit.test.js.map +1 -0
- package/dist/daemon/__tests__/PendingRequestManager.unit.test.d.ts +8 -0
- package/dist/daemon/__tests__/PendingRequestManager.unit.test.d.ts.map +1 -0
- package/dist/daemon/__tests__/PendingRequestManager.unit.test.js +276 -0
- package/dist/daemon/__tests__/PendingRequestManager.unit.test.js.map +1 -0
- package/dist/daemon/__tests__/TelemetryStore.unit.test.d.ts +8 -0
- package/dist/daemon/__tests__/TelemetryStore.unit.test.d.ts.map +1 -0
- package/dist/daemon/__tests__/TelemetryStore.unit.test.js +290 -0
- package/dist/daemon/__tests__/TelemetryStore.unit.test.js.map +1 -0
- package/dist/daemon/__tests__/commandRegistry.contract.test.d.ts +8 -0
- package/dist/daemon/__tests__/commandRegistry.contract.test.d.ts.map +1 -0
- package/dist/daemon/__tests__/commandRegistry.contract.test.js +384 -0
- package/dist/daemon/__tests__/commandRegistry.contract.test.js.map +1 -0
- package/dist/daemon/__tests__/ipcServer.cleanup.unit.test.d.ts +19 -0
- package/dist/daemon/__tests__/ipcServer.cleanup.unit.test.d.ts.map +1 -0
- package/dist/daemon/__tests__/ipcServer.cleanup.unit.test.js +212 -0
- package/dist/daemon/__tests__/ipcServer.cleanup.unit.test.js.map +1 -0
- package/dist/daemon/__tests__/ipcServer.contract.test.js +2 -1
- package/dist/daemon/__tests__/ipcServer.contract.test.js.map +1 -1
- package/dist/daemon/errors.d.ts +65 -0
- package/dist/daemon/errors.d.ts.map +1 -0
- package/dist/daemon/errors.js +82 -0
- package/dist/daemon/errors.js.map +1 -0
- package/dist/daemon/handlers/CommandHandlers.d.ts +32 -0
- package/dist/daemon/handlers/CommandHandlers.d.ts.map +1 -0
- package/dist/daemon/handlers/CommandHandlers.js +93 -0
- package/dist/daemon/handlers/CommandHandlers.js.map +1 -0
- package/dist/daemon/handlers/QueryHandlers.d.ts +35 -0
- package/dist/daemon/handlers/QueryHandlers.d.ts.map +1 -0
- package/dist/daemon/handlers/QueryHandlers.js +176 -0
- package/dist/daemon/handlers/QueryHandlers.js.map +1 -0
- package/dist/daemon/handlers/SessionHandlers.d.ts +32 -0
- package/dist/daemon/handlers/SessionHandlers.d.ts.map +1 -0
- package/dist/daemon/handlers/SessionHandlers.js +227 -0
- package/dist/daemon/handlers/SessionHandlers.js.map +1 -0
- package/dist/daemon/handlers/pendingRequests.d.ts +50 -0
- package/dist/daemon/handlers/pendingRequests.d.ts.map +1 -0
- package/dist/daemon/handlers/pendingRequests.js +57 -0
- package/dist/daemon/handlers/pendingRequests.js.map +1 -0
- package/dist/daemon/handlers/requestHandlers.d.ts +51 -0
- package/dist/daemon/handlers/requestHandlers.d.ts.map +1 -0
- package/dist/daemon/handlers/requestHandlers.js +61 -0
- package/dist/daemon/handlers/requestHandlers.js.map +1 -0
- package/dist/daemon/handlers/responseHandler.d.ts +42 -0
- package/dist/daemon/handlers/responseHandler.d.ts.map +1 -0
- package/dist/daemon/handlers/responseHandler.js +195 -0
- package/dist/daemon/handlers/responseHandler.js.map +1 -0
- package/dist/daemon/ipcServer.d.ts +19 -41
- package/dist/daemon/ipcServer.d.ts.map +1 -1
- package/dist/daemon/ipcServer.js +83 -655
- package/dist/daemon/ipcServer.js.map +1 -1
- package/dist/daemon/launcher.d.ts.map +1 -1
- package/dist/daemon/launcher.js +10 -6
- package/dist/daemon/launcher.js.map +1 -1
- package/dist/daemon/lifecycle/cdpSetup.d.ts +24 -0
- package/dist/daemon/lifecycle/cdpSetup.d.ts.map +1 -0
- package/dist/daemon/lifecycle/cdpSetup.js +59 -0
- package/dist/daemon/lifecycle/cdpSetup.js.map +1 -0
- package/dist/daemon/lifecycle/chromeConnection.d.ts +17 -0
- package/dist/daemon/lifecycle/chromeConnection.d.ts.map +1 -0
- package/dist/daemon/lifecycle/chromeConnection.js +80 -0
- package/dist/daemon/lifecycle/chromeConnection.js.map +1 -0
- package/dist/daemon/lifecycle/signalHandlers.d.ts +14 -0
- package/dist/daemon/lifecycle/signalHandlers.d.ts.map +1 -0
- package/dist/daemon/lifecycle/signalHandlers.js +35 -0
- package/dist/daemon/lifecycle/signalHandlers.js.map +1 -0
- package/dist/daemon/lifecycle/workerCleanup.d.ts +27 -0
- package/dist/daemon/lifecycle/workerCleanup.d.ts.map +1 -0
- package/dist/daemon/lifecycle/workerCleanup.js +144 -0
- package/dist/daemon/lifecycle/workerCleanup.js.map +1 -0
- package/dist/daemon/lifecycle/workerConfig.d.ts +14 -0
- package/dist/daemon/lifecycle/workerConfig.d.ts.map +1 -0
- package/dist/daemon/lifecycle/workerConfig.js +66 -0
- package/dist/daemon/lifecycle/workerConfig.js.map +1 -0
- package/dist/daemon/lifecycle/workerIpc.d.ts +14 -0
- package/dist/daemon/lifecycle/workerIpc.d.ts.map +1 -0
- package/dist/daemon/lifecycle/workerIpc.js +87 -0
- package/dist/daemon/lifecycle/workerIpc.js.map +1 -0
- package/dist/daemon/server/JsonlParser.d.ts +31 -0
- package/dist/daemon/server/JsonlParser.d.ts.map +1 -0
- package/dist/daemon/server/JsonlParser.js +57 -0
- package/dist/daemon/server/JsonlParser.js.map +1 -0
- package/dist/daemon/server/SocketServer.d.ts.map +1 -1
- package/dist/daemon/server/SocketServer.js +2 -2
- package/dist/daemon/server/SocketServer.js.map +1 -1
- package/dist/daemon/server/WorkerManager.d.ts +3 -3
- package/dist/daemon/server/WorkerManager.d.ts.map +1 -1
- package/dist/daemon/server/WorkerManager.js +10 -19
- package/dist/daemon/server/WorkerManager.js.map +1 -1
- package/dist/daemon/services/SessionService.d.ts +87 -0
- package/dist/daemon/services/SessionService.d.ts.map +1 -0
- package/dist/daemon/services/SessionService.js +45 -0
- package/dist/daemon/services/SessionService.js.map +1 -0
- package/dist/daemon/startSession.d.ts.map +1 -1
- package/dist/daemon/startSession.js +54 -31
- package/dist/daemon/startSession.js.map +1 -1
- package/dist/daemon/worker/commandRegistry.d.ts +1 -1
- package/dist/daemon/worker/commandRegistry.d.ts.map +1 -1
- package/dist/daemon/worker/commandRegistry.js +20 -215
- package/dist/daemon/worker/commandRegistry.js.map +1 -1
- package/dist/daemon/worker.d.ts +3 -12
- package/dist/daemon/worker.d.ts.map +1 -1
- package/dist/daemon/worker.js +47 -367
- package/dist/daemon/worker.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/ipc/__tests__/client.contract.test.d.ts +0 -15
- package/dist/ipc/__tests__/client.contract.test.d.ts.map +1 -1
- package/dist/ipc/__tests__/client.contract.test.js +259 -42
- package/dist/ipc/__tests__/client.contract.test.js.map +1 -1
- package/dist/ipc/__tests__/errors.unit.test.d.ts +7 -0
- package/dist/ipc/__tests__/errors.unit.test.d.ts.map +1 -0
- package/dist/ipc/__tests__/errors.unit.test.js +77 -0
- package/dist/ipc/__tests__/errors.unit.test.js.map +1 -0
- package/dist/ipc/__tests__/guards.unit.test.d.ts +7 -0
- package/dist/ipc/__tests__/guards.unit.test.d.ts.map +1 -0
- package/dist/ipc/__tests__/guards.unit.test.js +73 -0
- package/dist/ipc/__tests__/guards.unit.test.js.map +1 -0
- package/dist/ipc/__tests__/jsonl.unit.test.d.ts +7 -0
- package/dist/ipc/__tests__/jsonl.unit.test.d.ts.map +1 -0
- package/dist/ipc/__tests__/jsonl.unit.test.js +103 -0
- package/dist/ipc/__tests__/jsonl.unit.test.js.map +1 -0
- package/dist/ipc/__tests__/validation.unit.test.d.ts +7 -0
- package/dist/ipc/__tests__/validation.unit.test.d.ts.map +1 -0
- package/dist/ipc/__tests__/validation.unit.test.js +60 -0
- package/dist/ipc/__tests__/validation.unit.test.js.map +1 -0
- package/dist/ipc/client.d.ts +93 -84
- package/dist/ipc/client.d.ts.map +1 -1
- package/dist/ipc/client.js +121 -192
- package/dist/ipc/client.js.map +1 -1
- package/dist/ipc/index.d.ts +17 -0
- package/dist/ipc/index.d.ts.map +1 -0
- package/dist/ipc/index.js +23 -0
- package/dist/ipc/index.js.map +1 -0
- package/dist/ipc/protocol/commands.d.ts +144 -0
- package/dist/ipc/protocol/commands.d.ts.map +1 -0
- package/dist/ipc/protocol/commands.js +23 -0
- package/dist/ipc/protocol/commands.js.map +1 -0
- package/dist/ipc/protocol/guards.d.ts +47 -0
- package/dist/ipc/protocol/guards.d.ts.map +1 -0
- package/dist/ipc/protocol/guards.js +62 -0
- package/dist/ipc/protocol/guards.js.map +1 -0
- package/dist/ipc/protocol/index.d.ts +9 -0
- package/dist/ipc/protocol/index.d.ts.map +1 -0
- package/dist/ipc/protocol/index.js +8 -0
- package/dist/ipc/protocol/index.js.map +1 -0
- package/dist/ipc/protocol/messages.d.ts +64 -0
- package/dist/ipc/protocol/messages.d.ts.map +1 -0
- package/dist/ipc/protocol/messages.js +8 -0
- package/dist/ipc/protocol/messages.js.map +1 -0
- package/dist/ipc/session/errors.d.ts +25 -0
- package/dist/ipc/session/errors.d.ts.map +1 -0
- package/dist/ipc/{types.js → session/errors.js} +11 -6
- package/dist/ipc/session/errors.js.map +1 -0
- package/dist/ipc/session/index.d.ts +16 -0
- package/dist/ipc/session/index.d.ts.map +1 -0
- package/dist/ipc/session/index.js +7 -0
- package/dist/ipc/session/index.js.map +1 -0
- package/dist/ipc/session/lifecycle.d.ts +125 -0
- package/dist/ipc/session/lifecycle.d.ts.map +1 -0
- package/dist/ipc/session/lifecycle.js +7 -0
- package/dist/ipc/session/lifecycle.js.map +1 -0
- package/dist/ipc/session/queries.d.ts +94 -0
- package/dist/ipc/session/queries.d.ts.map +1 -0
- package/dist/ipc/session/queries.js +7 -0
- package/dist/ipc/session/queries.js.map +1 -0
- package/dist/ipc/session/types.d.ts +28 -0
- package/dist/ipc/session/types.d.ts.map +1 -0
- package/dist/ipc/session/types.js +7 -0
- package/dist/ipc/session/types.js.map +1 -0
- package/dist/ipc/transport/IPCError.d.ts +82 -0
- package/dist/ipc/transport/IPCError.d.ts.map +1 -0
- package/dist/ipc/transport/IPCError.js +109 -0
- package/dist/ipc/transport/IPCError.js.map +1 -0
- package/dist/ipc/transport/errors.d.ts +11 -0
- package/dist/ipc/transport/errors.d.ts.map +1 -0
- package/dist/ipc/transport/errors.js +28 -0
- package/dist/ipc/transport/errors.js.map +1 -0
- package/dist/ipc/transport/index.d.ts +16 -0
- package/dist/ipc/transport/index.d.ts.map +1 -0
- package/dist/ipc/transport/index.js +77 -0
- package/dist/ipc/transport/index.js.map +1 -0
- package/dist/ipc/transport/jsonl.d.ts +39 -0
- package/dist/ipc/transport/jsonl.d.ts.map +1 -0
- package/dist/ipc/transport/jsonl.js +61 -0
- package/dist/ipc/transport/jsonl.js.map +1 -0
- package/dist/ipc/transport/socket.d.ts +27 -0
- package/dist/ipc/transport/socket.d.ts.map +1 -0
- package/dist/ipc/transport/socket.js +49 -0
- package/dist/ipc/transport/socket.js.map +1 -0
- package/dist/ipc/transport/validation.d.ts +21 -0
- package/dist/ipc/transport/validation.d.ts.map +1 -0
- package/dist/ipc/transport/validation.js +23 -0
- package/dist/ipc/transport/validation.js.map +1 -0
- package/dist/ipc/utils/errors.d.ts +25 -0
- package/dist/ipc/utils/errors.d.ts.map +1 -0
- package/dist/ipc/utils/errors.js +29 -0
- package/dist/ipc/utils/errors.js.map +1 -0
- package/dist/ipc/utils/index.d.ts +12 -0
- package/dist/ipc/utils/index.d.ts.map +1 -0
- package/dist/ipc/utils/index.js +11 -0
- package/dist/ipc/utils/index.js.map +1 -0
- package/dist/ipc/utils/requestId.d.ts +23 -0
- package/dist/ipc/utils/requestId.d.ts.map +1 -0
- package/dist/ipc/utils/requestId.js +27 -0
- package/dist/ipc/utils/requestId.js.map +1 -0
- package/dist/ipc/utils/responseValidator.d.ts.map +1 -0
- package/dist/ipc/{responseValidator.js → utils/responseValidator.js} +2 -1
- package/dist/ipc/utils/responseValidator.js.map +1 -0
- package/dist/ipc/utils/session.d.ts +36 -0
- package/dist/ipc/utils/session.d.ts.map +1 -0
- package/dist/ipc/utils/session.js +37 -0
- package/dist/ipc/utils/session.js.map +1 -0
- package/dist/ipc/utils/types.d.ts +17 -0
- package/dist/ipc/utils/types.d.ts.map +1 -0
- package/dist/ipc/utils/types.js +7 -0
- package/dist/ipc/utils/types.js.map +1 -0
- package/dist/session/__tests__/chrome-cache.contract.test.d.ts +7 -0
- package/dist/session/__tests__/chrome-cache.contract.test.d.ts.map +1 -0
- package/dist/session/__tests__/chrome-cache.contract.test.js +77 -0
- package/dist/session/__tests__/chrome-cache.contract.test.js.map +1 -0
- package/dist/session/__tests__/cleanup.contract.test.d.ts +7 -0
- package/dist/session/__tests__/cleanup.contract.test.d.ts.map +1 -0
- package/dist/session/__tests__/cleanup.contract.test.js +84 -0
- package/dist/session/__tests__/cleanup.contract.test.js.map +1 -0
- package/dist/session/__tests__/lock.contract.test.d.ts +7 -0
- package/dist/session/__tests__/lock.contract.test.d.ts.map +1 -0
- package/dist/session/__tests__/lock.contract.test.js +77 -0
- package/dist/session/__tests__/lock.contract.test.js.map +1 -0
- package/dist/session/__tests__/metadata.contract.test.d.ts +7 -0
- package/dist/session/__tests__/metadata.contract.test.d.ts.map +1 -0
- package/dist/session/__tests__/metadata.contract.test.js +87 -0
- package/dist/session/__tests__/metadata.contract.test.js.map +1 -0
- package/dist/session/chrome.d.ts +20 -0
- package/dist/session/chrome.d.ts.map +1 -1
- package/dist/session/chrome.js +81 -17
- package/dist/session/chrome.js.map +1 -1
- package/dist/session/cleanup.d.ts +36 -2
- package/dist/session/cleanup.d.ts.map +1 -1
- package/dist/session/cleanup.js +201 -73
- package/dist/session/cleanup.js.map +1 -1
- package/dist/session/lock.d.ts.map +1 -1
- package/dist/session/lock.js +102 -91
- package/dist/session/lock.js.map +1 -1
- package/dist/session/metadata.d.ts +10 -3
- package/dist/session/metadata.d.ts.map +1 -1
- package/dist/session/metadata.js +24 -6
- package/dist/session/metadata.js.map +1 -1
- package/dist/session/paths.d.ts +0 -9
- package/dist/session/paths.d.ts.map +1 -1
- package/dist/session/paths.js +0 -11
- package/dist/session/paths.js.map +1 -1
- package/dist/session/pid.d.ts +15 -0
- package/dist/session/pid.d.ts.map +1 -1
- package/dist/session/pid.js +39 -21
- package/dist/session/pid.js.map +1 -1
- package/dist/session/process.d.ts +4 -41
- package/dist/session/process.d.ts.map +1 -1
- package/dist/session/process.js +4 -85
- package/dist/session/process.js.map +1 -1
- package/dist/session/statusData.d.ts +50 -0
- package/dist/session/statusData.d.ts.map +1 -0
- package/dist/session/statusData.js +51 -0
- package/dist/session/statusData.js.map +1 -0
- package/dist/telemetry/__tests__/a11y.unit.test.d.ts +10 -0
- package/dist/telemetry/__tests__/a11y.unit.test.d.ts.map +1 -0
- package/dist/telemetry/__tests__/a11y.unit.test.js +265 -0
- package/dist/telemetry/__tests__/a11y.unit.test.js.map +1 -0
- package/dist/telemetry/__tests__/navigation.contract.test.d.ts +8 -0
- package/dist/telemetry/__tests__/navigation.contract.test.d.ts.map +1 -0
- package/dist/telemetry/__tests__/navigation.contract.test.js +211 -0
- package/dist/telemetry/__tests__/navigation.contract.test.js.map +1 -0
- package/dist/telemetry/__tests__/network.contract.test.d.ts +0 -20
- package/dist/telemetry/__tests__/network.contract.test.d.ts.map +1 -1
- package/dist/telemetry/__tests__/network.contract.test.js +2 -64
- package/dist/telemetry/__tests__/network.contract.test.js.map +1 -1
- package/dist/telemetry/__tests__/utils.unit.test.d.ts +7 -0
- package/dist/telemetry/__tests__/utils.unit.test.d.ts.map +1 -0
- package/dist/telemetry/__tests__/utils.unit.test.js +91 -0
- package/dist/telemetry/__tests__/utils.unit.test.js.map +1 -0
- package/dist/telemetry/a11y.d.ts +78 -0
- package/dist/telemetry/a11y.d.ts.map +1 -0
- package/dist/telemetry/a11y.js +280 -0
- package/dist/telemetry/a11y.js.map +1 -0
- package/dist/telemetry/console.d.ts.map +1 -1
- package/dist/telemetry/console.js +19 -28
- package/dist/telemetry/console.js.map +1 -1
- package/dist/telemetry/dialogs.d.ts.map +1 -1
- package/dist/telemetry/dialogs.js +4 -8
- package/dist/telemetry/dialogs.js.map +1 -1
- package/dist/telemetry/dom.d.ts +1 -1
- package/dist/telemetry/dom.d.ts.map +1 -1
- package/dist/telemetry/dom.js +83 -60
- package/dist/telemetry/dom.js.map +1 -1
- package/dist/telemetry/filters.d.ts +5 -18
- package/dist/telemetry/filters.d.ts.map +1 -1
- package/dist/telemetry/filters.js +36 -56
- package/dist/telemetry/filters.js.map +1 -1
- package/dist/telemetry/navigation.d.ts.map +1 -1
- package/dist/telemetry/navigation.js +5 -8
- package/dist/telemetry/navigation.js.map +1 -1
- package/dist/telemetry/network.d.ts.map +1 -1
- package/dist/telemetry/network.js +105 -104
- package/dist/telemetry/network.js.map +1 -1
- package/dist/telemetry/utils.d.ts +85 -0
- package/dist/telemetry/utils.d.ts.map +1 -0
- package/dist/telemetry/utils.js +138 -0
- package/dist/telemetry/utils.js.map +1 -0
- package/dist/types/dom.d.ts +66 -0
- package/dist/types/dom.d.ts.map +1 -0
- package/dist/types/dom.js +8 -0
- package/dist/types/dom.js.map +1 -0
- package/dist/types.d.ts +86 -77
- package/dist/types.d.ts.map +1 -1
- package/dist/{commands/shared → ui}/OutputBuilder.d.ts +10 -2
- package/dist/ui/OutputBuilder.d.ts.map +1 -0
- package/dist/{commands/shared → ui}/OutputBuilder.js +8 -2
- package/dist/ui/OutputBuilder.js.map +1 -0
- package/dist/ui/errors/CommandError.d.ts +16 -2
- package/dist/ui/errors/CommandError.d.ts.map +1 -1
- package/dist/ui/errors/CommandError.js +2 -1
- package/dist/ui/errors/CommandError.js.map +1 -1
- package/dist/ui/errors/index.d.ts +2 -3
- package/dist/ui/errors/index.d.ts.map +1 -1
- package/dist/ui/errors/index.js +1 -3
- package/dist/ui/errors/index.js.map +1 -1
- package/dist/ui/errors/utils.d.ts +6 -0
- package/dist/ui/errors/utils.d.ts.map +1 -1
- package/dist/ui/errors/utils.js +8 -3
- package/dist/ui/errors/utils.js.map +1 -1
- package/dist/ui/formatters/__tests__/semantic.unit.test.d.ts +2 -0
- package/dist/ui/formatters/__tests__/semantic.unit.test.d.ts.map +1 -0
- package/dist/ui/formatters/__tests__/semantic.unit.test.js +111 -0
- package/dist/ui/formatters/__tests__/semantic.unit.test.js.map +1 -0
- package/dist/ui/formatters/a11y.d.ts +30 -0
- package/dist/ui/formatters/a11y.d.ts.map +1 -0
- package/dist/ui/formatters/a11y.js +178 -0
- package/dist/ui/formatters/a11y.js.map +1 -0
- package/dist/ui/formatters/dom.d.ts +3 -18
- package/dist/ui/formatters/dom.d.ts.map +1 -1
- package/dist/ui/formatters/dom.js +4 -27
- package/dist/ui/formatters/dom.js.map +1 -1
- package/dist/ui/formatters/preview.d.ts +10 -8
- package/dist/ui/formatters/preview.d.ts.map +1 -1
- package/dist/ui/formatters/preview.js +45 -17
- package/dist/ui/formatters/preview.js.map +1 -1
- package/dist/ui/formatters/semantic.d.ts +36 -0
- package/dist/ui/formatters/semantic.d.ts.map +1 -0
- package/dist/ui/formatters/semantic.js +98 -0
- package/dist/ui/formatters/semantic.js.map +1 -0
- package/dist/ui/formatters/status.d.ts +1 -1
- package/dist/ui/formatters/status.d.ts.map +1 -1
- package/dist/ui/formatters/status.js +9 -31
- package/dist/ui/formatters/status.js.map +1 -1
- package/dist/ui/formatting.d.ts +2 -270
- package/dist/ui/formatting.d.ts.map +1 -1
- package/dist/ui/formatting.js +8 -331
- package/dist/ui/formatting.js.map +1 -1
- package/dist/ui/logging/index.d.ts +1 -1
- package/dist/ui/logging/index.d.ts.map +1 -1
- package/dist/ui/logging/index.js +1 -1
- package/dist/ui/logging/index.js.map +1 -1
- package/dist/ui/logging/logger.d.ts +3 -23
- package/dist/ui/logging/logger.d.ts.map +1 -1
- package/dist/ui/logging/logger.js +2 -27
- package/dist/ui/logging/logger.js.map +1 -1
- package/dist/ui/messages/chrome.d.ts +15 -7
- package/dist/ui/messages/chrome.d.ts.map +1 -1
- package/dist/ui/messages/chrome.js +23 -32
- package/dist/ui/messages/chrome.js.map +1 -1
- package/dist/ui/messages/commands.d.ts +9 -19
- package/dist/ui/messages/commands.d.ts.map +1 -1
- package/dist/ui/messages/commands.js +14 -51
- package/dist/ui/messages/commands.js.map +1 -1
- package/dist/ui/messages/consoleMessages.d.ts +1 -1
- package/dist/ui/messages/consoleMessages.d.ts.map +1 -1
- package/dist/ui/messages/consoleMessages.js +3 -6
- package/dist/ui/messages/consoleMessages.js.map +1 -1
- package/dist/ui/messages/debug.d.ts +0 -14
- package/dist/ui/messages/debug.d.ts.map +1 -1
- package/dist/ui/messages/debug.js +0 -18
- package/dist/ui/messages/debug.js.map +1 -1
- package/dist/ui/messages/errors.d.ts +0 -34
- package/dist/ui/messages/errors.d.ts.map +1 -1
- package/dist/ui/messages/errors.js +3 -81
- package/dist/ui/messages/errors.js.map +1 -1
- package/dist/ui/messages/internal.d.ts +0 -7
- package/dist/ui/messages/internal.d.ts.map +1 -1
- package/dist/ui/messages/internal.js +0 -12
- package/dist/ui/messages/internal.js.map +1 -1
- package/dist/ui/messages/preview.d.ts +14 -1
- package/dist/ui/messages/preview.d.ts.map +1 -1
- package/dist/ui/messages/preview.js +24 -7
- package/dist/ui/messages/preview.js.map +1 -1
- package/dist/ui/messages/session.d.ts.map +1 -1
- package/dist/ui/messages/session.js +7 -23
- package/dist/ui/messages/session.js.map +1 -1
- package/dist/ui/messages/validation.d.ts.map +1 -1
- package/dist/ui/messages/validation.js +7 -8
- package/dist/ui/messages/validation.js.map +1 -1
- package/dist/utils/__tests__/atomicFile.test.d.ts +2 -0
- package/dist/utils/__tests__/atomicFile.test.d.ts.map +1 -0
- package/dist/utils/__tests__/atomicFile.test.js +43 -0
- package/dist/utils/__tests__/atomicFile.test.js.map +1 -0
- package/dist/utils/__tests__/errors.unit.test.d.ts +12 -0
- package/dist/utils/__tests__/errors.unit.test.d.ts.map +1 -0
- package/dist/utils/__tests__/errors.unit.test.js +255 -0
- package/dist/utils/__tests__/errors.unit.test.js.map +1 -0
- package/dist/utils/__tests__/http.unit.test.d.ts +12 -0
- package/dist/utils/__tests__/http.unit.test.d.ts.map +1 -0
- package/dist/utils/__tests__/http.unit.test.js +218 -0
- package/dist/utils/__tests__/http.unit.test.js.map +1 -0
- package/dist/utils/__tests__/objects.test.d.ts +2 -0
- package/dist/utils/__tests__/objects.test.d.ts.map +1 -0
- package/dist/utils/__tests__/objects.test.js +50 -0
- package/dist/utils/__tests__/objects.test.js.map +1 -0
- package/dist/utils/__tests__/process.unit.test.d.ts +14 -0
- package/dist/utils/__tests__/process.unit.test.d.ts.map +1 -0
- package/dist/utils/__tests__/process.unit.test.js +124 -0
- package/dist/utils/__tests__/process.unit.test.js.map +1 -0
- package/dist/utils/__tests__/session.contract.test.js +14 -4
- package/dist/utils/__tests__/session.contract.test.js.map +1 -1
- package/dist/utils/__tests__/url.test.d.ts +2 -0
- package/dist/utils/__tests__/url.test.d.ts.map +1 -0
- package/dist/utils/__tests__/url.test.js +42 -0
- package/dist/utils/__tests__/url.test.js.map +1 -0
- package/dist/utils/atomicFile.d.ts +31 -5
- package/dist/utils/atomicFile.d.ts.map +1 -1
- package/dist/utils/atomicFile.js +52 -13
- package/dist/utils/atomicFile.js.map +1 -1
- package/dist/utils/concurrency.d.ts +54 -0
- package/dist/utils/concurrency.d.ts.map +1 -0
- package/dist/utils/concurrency.js +78 -0
- package/dist/utils/concurrency.js.map +1 -0
- package/dist/utils/daemonErrors.d.ts +60 -0
- package/dist/utils/daemonErrors.d.ts.map +1 -0
- package/dist/utils/daemonErrors.js +58 -0
- package/dist/utils/daemonErrors.js.map +1 -0
- package/dist/utils/errors.d.ts +28 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +33 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/exitCodes.d.ts +41 -5
- package/dist/utils/exitCodes.d.ts.map +1 -1
- package/dist/utils/exitCodes.js +43 -9
- package/dist/utils/exitCodes.js.map +1 -1
- package/dist/utils/http.d.ts +9 -4
- package/dist/utils/http.d.ts.map +1 -1
- package/dist/utils/http.js +44 -10
- package/dist/utils/http.js.map +1 -1
- package/dist/utils/levenshtein.d.ts +45 -0
- package/dist/utils/levenshtein.d.ts.map +1 -0
- package/dist/utils/levenshtein.js +85 -0
- package/dist/utils/levenshtein.js.map +1 -0
- package/dist/utils/objects.d.ts +16 -1
- package/dist/utils/objects.d.ts.map +1 -1
- package/dist/utils/objects.js +16 -1
- package/dist/utils/objects.js.map +1 -1
- package/dist/utils/process.d.ts +45 -0
- package/dist/utils/process.d.ts.map +1 -0
- package/dist/utils/process.js +91 -0
- package/dist/utils/process.js.map +1 -0
- package/dist/utils/url.d.ts +10 -3
- package/dist/utils/url.d.ts.map +1 -1
- package/dist/utils/url.js +42 -29
- package/dist/utils/url.js.map +1 -1
- package/dist/utils/validation.d.ts +101 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +131 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +22 -1
- package/dist/commands/dom.d.ts.map +0 -1
- package/dist/commands/dom.js +0 -244
- package/dist/commands/dom.js.map +0 -1
- package/dist/commands/domEvalHelpers.d.ts.map +0 -1
- package/dist/commands/domEvalHelpers.js.map +0 -1
- package/dist/commands/domOptionsBuilder.d.ts +0 -67
- package/dist/commands/domOptionsBuilder.d.ts.map +0 -1
- package/dist/commands/domOptionsBuilder.js +0 -86
- package/dist/commands/domOptionsBuilder.js.map +0 -1
- package/dist/commands/domSelectorParser.d.ts +0 -20
- package/dist/commands/domSelectorParser.d.ts.map +0 -1
- package/dist/commands/domSelectorParser.js +0 -20
- package/dist/commands/domSelectorParser.js.map +0 -1
- package/dist/commands/shared/OutputBuilder.d.ts.map +0 -1
- package/dist/commands/shared/OutputBuilder.js.map +0 -1
- package/dist/commands/shared/daemonSessionController.d.ts.map +0 -1
- package/dist/commands/shared/daemonSessionController.js.map +0 -1
- package/dist/commands/shared/sessionController.d.ts +0 -21
- package/dist/commands/shared/sessionController.d.ts.map +0 -1
- package/dist/commands/shared/sessionController.js +0 -54
- package/dist/commands/shared/sessionController.js.map +0 -1
- package/dist/connection/__tests__/finder.contract.test.d.ts +0 -2
- package/dist/connection/__tests__/finder.contract.test.d.ts.map +0 -1
- package/dist/connection/__tests__/finder.contract.test.js +0 -239
- package/dist/connection/__tests__/finder.contract.test.js.map +0 -1
- package/dist/connection/domOperations.d.ts +0 -48
- package/dist/connection/domOperations.d.ts.map +0 -1
- package/dist/connection/domOperations.js +0 -106
- package/dist/connection/domOperations.js.map +0 -1
- package/dist/connection/finder.d.ts +0 -12
- package/dist/connection/finder.d.ts.map +0 -1
- package/dist/connection/finder.js +0 -17
- package/dist/connection/finder.js.map +0 -1
- package/dist/ipc/commands.d.ts +0 -260
- package/dist/ipc/commands.d.ts.map +0 -1
- package/dist/ipc/commands.js +0 -77
- package/dist/ipc/commands.js.map +0 -1
- package/dist/ipc/responseValidator.d.ts.map +0 -1
- package/dist/ipc/responseValidator.js.map +0 -1
- package/dist/ipc/types.d.ts +0 -226
- package/dist/ipc/types.d.ts.map +0 -1
- package/dist/ipc/types.js.map +0 -1
- package/dist/session/fileOps.d.ts +0 -25
- package/dist/session/fileOps.d.ts.map +0 -1
- package/dist/session/fileOps.js +0 -39
- package/dist/session/fileOps.js.map +0 -1
- package/dist/session/queryCache.d.ts +0 -36
- package/dist/session/queryCache.d.ts.map +0 -1
- package/dist/session/queryCache.js +0 -66
- package/dist/session/queryCache.js.map +0 -1
- /package/dist/ipc/{responseValidator.d.ts → utils/responseValidator.d.ts} +0 -0
package/dist/session/cleanup.js
CHANGED
|
@@ -4,36 +4,23 @@
|
|
|
4
4
|
* Handles cleanup of session files (PID, metadata, lock, socket).
|
|
5
5
|
* WHY: Centralized cleanup logic ensures consistent cleanup across error paths and normal shutdown.
|
|
6
6
|
*/
|
|
7
|
+
import { execSync } from 'child_process';
|
|
7
8
|
import * as fs from 'fs';
|
|
8
|
-
import { getErrorMessage } from '../
|
|
9
|
+
import { getErrorMessage } from '../connection/errors.js';
|
|
9
10
|
import { createLogger } from '../ui/logging/index.js';
|
|
11
|
+
import { isProcessAlive, killChromeProcess } from '../utils/process.js';
|
|
10
12
|
import { readChromePid, clearChromePid } from './chrome.js';
|
|
11
|
-
import { safeDeleteFile } from './fileOps.js';
|
|
12
13
|
import { acquireSessionLock, releaseSessionLock } from './lock.js';
|
|
13
14
|
import { getSessionFilePath, ensureSessionDir } from './paths.js';
|
|
14
|
-
import { readPid, cleanupPidFile } from './pid.js';
|
|
15
|
-
import { isProcessAlive, killChromeProcess } from './process.js';
|
|
15
|
+
import { readPid, cleanupPidFile, readPidFromFile } from './pid.js';
|
|
16
16
|
const log = createLogger('cleanup');
|
|
17
|
-
function readPidFromFile(filePath) {
|
|
18
|
-
if (!fs.existsSync(filePath)) {
|
|
19
|
-
return null;
|
|
20
|
-
}
|
|
21
|
-
try {
|
|
22
|
-
const pidStr = fs.readFileSync(filePath, 'utf-8').trim();
|
|
23
|
-
const pid = parseInt(pidStr, 10);
|
|
24
|
-
return Number.isNaN(pid) ? null : pid;
|
|
25
|
-
}
|
|
26
|
-
catch {
|
|
27
|
-
return null;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
17
|
function killOrphanedWorker(pid) {
|
|
31
18
|
try {
|
|
32
19
|
process.kill(pid, 'SIGKILL');
|
|
33
|
-
log(`Force killed orphaned worker process ${pid}`);
|
|
20
|
+
log.info(`Force killed orphaned worker process ${pid}`);
|
|
34
21
|
}
|
|
35
22
|
catch (error) {
|
|
36
|
-
log(`Failed to kill orphaned worker process ${pid}: ${getErrorMessage(error)}`);
|
|
23
|
+
log.info(`Failed to kill orphaned worker process ${pid}: ${getErrorMessage(error)}`);
|
|
37
24
|
}
|
|
38
25
|
}
|
|
39
26
|
function killCachedChromeProcess(reason) {
|
|
@@ -41,14 +28,14 @@ function killCachedChromeProcess(reason) {
|
|
|
41
28
|
if (!chromePid) {
|
|
42
29
|
return;
|
|
43
30
|
}
|
|
44
|
-
log(`Killing cached Chrome process ${chromePid} (${reason})`);
|
|
31
|
+
log.info(`Killing cached Chrome process ${chromePid} (${reason})`);
|
|
45
32
|
let killSucceeded = false;
|
|
46
33
|
try {
|
|
47
34
|
killChromeProcess(chromePid, 'SIGKILL');
|
|
48
35
|
killSucceeded = true;
|
|
49
36
|
}
|
|
50
37
|
catch (error) {
|
|
51
|
-
log(`Failed to kill Chrome process ${chromePid}: ${getErrorMessage(error)}`);
|
|
38
|
+
log.info(`Failed to kill Chrome process ${chromePid}: ${getErrorMessage(error)}`);
|
|
52
39
|
}
|
|
53
40
|
finally {
|
|
54
41
|
if (killSucceeded || !isProcessAlive(chromePid)) {
|
|
@@ -56,6 +43,65 @@ function killCachedChromeProcess(reason) {
|
|
|
56
43
|
}
|
|
57
44
|
}
|
|
58
45
|
}
|
|
46
|
+
/**
|
|
47
|
+
* Find all orphaned daemon processes and return their PIDs.
|
|
48
|
+
*
|
|
49
|
+
* Orphaned daemons are node processes running dist/daemon.js that are not
|
|
50
|
+
* the currently tracked daemon in the PID file.
|
|
51
|
+
*
|
|
52
|
+
* @returns Array of orphaned daemon PIDs
|
|
53
|
+
*/
|
|
54
|
+
function findOrphanedDaemons() {
|
|
55
|
+
const orphanedPids = [];
|
|
56
|
+
try {
|
|
57
|
+
// Get currently tracked daemon PID (if any)
|
|
58
|
+
const daemonPidPath = getSessionFilePath('DAEMON_PID');
|
|
59
|
+
const currentDaemonPid = readPidFromFile(daemonPidPath);
|
|
60
|
+
// Find all node processes running dist/daemon.js
|
|
61
|
+
// Platform-specific ps command
|
|
62
|
+
const psCommand = process.platform === 'win32'
|
|
63
|
+
? 'wmic process where "commandline like \'%dist/daemon.js%\'" get processid'
|
|
64
|
+
: 'ps aux | grep -E "node.*dist/daemon\\.js" | grep -v grep';
|
|
65
|
+
const output = execSync(psCommand, { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'ignore'] });
|
|
66
|
+
// Parse PIDs from output
|
|
67
|
+
const lines = output.trim().split('\n');
|
|
68
|
+
for (const line of lines) {
|
|
69
|
+
// Extract PID based on platform
|
|
70
|
+
let pid;
|
|
71
|
+
if (process.platform === 'win32') {
|
|
72
|
+
// Windows: ProcessId column
|
|
73
|
+
const match = line.trim().match(/(\d+)/);
|
|
74
|
+
if (!match?.[1]) {
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
pid = parseInt(match[1], 10);
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
// Unix/macOS: Second column in ps output
|
|
81
|
+
const parts = line.trim().split(/\s+/);
|
|
82
|
+
if (parts.length < 2 || !parts[1]) {
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
pid = parseInt(parts[1], 10);
|
|
86
|
+
}
|
|
87
|
+
if (Number.isNaN(pid)) {
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
// Skip if this is the current daemon
|
|
91
|
+
if (currentDaemonPid && pid === currentDaemonPid) {
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
// Verify process is still alive
|
|
95
|
+
if (isProcessAlive(pid)) {
|
|
96
|
+
orphanedPids.push(pid);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
log.debug(`Failed to find orphaned daemons: ${getErrorMessage(error)}`);
|
|
102
|
+
}
|
|
103
|
+
return orphanedPids;
|
|
104
|
+
}
|
|
59
105
|
/**
|
|
60
106
|
* Cleanup stale session files if no active session is running.
|
|
61
107
|
*
|
|
@@ -78,36 +124,29 @@ function killCachedChromeProcess(reason) {
|
|
|
78
124
|
*/
|
|
79
125
|
export function cleanupStaleSession() {
|
|
80
126
|
ensureSessionDir();
|
|
81
|
-
// Try to acquire the session lock
|
|
82
127
|
const lockAcquired = acquireSessionLock();
|
|
83
128
|
if (!lockAcquired) {
|
|
84
|
-
// Lock is held by another process - check if it's still alive
|
|
85
129
|
const lockPath = getSessionFilePath('LOCK');
|
|
86
130
|
try {
|
|
87
131
|
const lockPidStr = fs.readFileSync(lockPath, 'utf-8').trim();
|
|
88
132
|
const lockPid = parseInt(lockPidStr, 10);
|
|
89
|
-
if (!isNaN(lockPid) && isProcessAlive(lockPid)) {
|
|
90
|
-
// Active session is running - don't clean up
|
|
133
|
+
if (!Number.isNaN(lockPid) && isProcessAlive(lockPid)) {
|
|
91
134
|
return false;
|
|
92
135
|
}
|
|
93
136
|
}
|
|
94
|
-
catch {
|
|
95
|
-
|
|
137
|
+
catch (error) {
|
|
138
|
+
log.debug(`Failed to read stale session lock: ${getErrorMessage(error)}`);
|
|
96
139
|
}
|
|
97
|
-
// Lock exists but process is dead - force acquire
|
|
98
140
|
try {
|
|
99
|
-
fs.
|
|
141
|
+
fs.rmSync(lockPath, { force: true });
|
|
100
142
|
}
|
|
101
|
-
catch {
|
|
102
|
-
|
|
143
|
+
catch (error) {
|
|
144
|
+
log.debug(`Failed to remove stale session lock: ${getErrorMessage(error)}`);
|
|
103
145
|
}
|
|
104
|
-
// Try to acquire lock again
|
|
105
146
|
if (!acquireSessionLock()) {
|
|
106
|
-
// Still can't acquire - another process may have grabbed it
|
|
107
147
|
return false;
|
|
108
148
|
}
|
|
109
149
|
}
|
|
110
|
-
// We now hold the lock - check if session and daemon processes are alive
|
|
111
150
|
try {
|
|
112
151
|
const sessionPid = readPid();
|
|
113
152
|
let sessionAlive = sessionPid !== null && isProcessAlive(sessionPid);
|
|
@@ -115,7 +154,7 @@ export function cleanupStaleSession() {
|
|
|
115
154
|
const daemonPid = readPidFromFile(daemonPidPath);
|
|
116
155
|
const daemonAlive = daemonPid !== null && isProcessAlive(daemonPid);
|
|
117
156
|
if (sessionAlive && !daemonAlive && sessionPid !== null) {
|
|
118
|
-
log(`Detected orphaned worker process (PID ${sessionPid}) with no daemon - forcing cleanup`);
|
|
157
|
+
log.info(`Detected orphaned worker process (PID ${sessionPid}) with no daemon - forcing cleanup`);
|
|
119
158
|
killCachedChromeProcess('orphaned worker cleanup');
|
|
120
159
|
killOrphanedWorker(sessionPid);
|
|
121
160
|
sessionAlive = isProcessAlive(sessionPid);
|
|
@@ -126,44 +165,99 @@ export function cleanupStaleSession() {
|
|
|
126
165
|
if (daemonAlive) {
|
|
127
166
|
return false;
|
|
128
167
|
}
|
|
129
|
-
|
|
130
|
-
log('Removing stale session files...');
|
|
168
|
+
log.info('Removing stale session files...');
|
|
131
169
|
killCachedChromeProcess('stale session cleanup');
|
|
132
|
-
// Remove session PID
|
|
133
170
|
cleanupPidFile();
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
171
|
+
try {
|
|
172
|
+
fs.rmSync(getSessionFilePath('METADATA'), { force: true });
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
log.debug(`Failed to remove metadata file: ${getErrorMessage(error)}`);
|
|
176
|
+
}
|
|
177
|
+
try {
|
|
178
|
+
fs.rmSync(daemonPidPath, { force: true });
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
log.debug(`Failed to remove daemon PID file: ${getErrorMessage(error)}`);
|
|
182
|
+
}
|
|
183
|
+
try {
|
|
184
|
+
fs.rmSync(getSessionFilePath('DAEMON_SOCKET'), { force: true });
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
log.debug(`Failed to remove daemon socket: ${getErrorMessage(error)}`);
|
|
188
|
+
}
|
|
189
|
+
try {
|
|
190
|
+
fs.rmSync(getSessionFilePath('DAEMON_LOCK'), { force: true });
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
log.debug(`Failed to remove daemon lock: ${getErrorMessage(error)}`);
|
|
194
|
+
}
|
|
195
|
+
log.info('Stale session cleanup complete');
|
|
140
196
|
return true;
|
|
141
197
|
}
|
|
142
198
|
finally {
|
|
143
|
-
// Always release the lock
|
|
144
199
|
releaseSessionLock();
|
|
145
200
|
}
|
|
146
201
|
}
|
|
147
202
|
/**
|
|
148
203
|
* Cleanup all session files after a session ends.
|
|
149
204
|
*
|
|
150
|
-
* Removes
|
|
205
|
+
* Removes session-specific files while preserving chrome-profile directory
|
|
206
|
+
* which contains user preferences, cookies, and cached data.
|
|
207
|
+
*
|
|
208
|
+
* Files removed:
|
|
209
|
+
* - session.pid (worker PID)
|
|
210
|
+
* - session.lock (session lock)
|
|
211
|
+
* - session.meta.json (session metadata)
|
|
212
|
+
* - daemon.pid, daemon.sock, daemon.lock (daemon files)
|
|
213
|
+
*
|
|
214
|
+
* Files preserved:
|
|
215
|
+
* - session.json (output file - user needs to read it)
|
|
216
|
+
* - chrome.pid (for emergency cleanup - auto-removed if Chrome is dead)
|
|
217
|
+
* - chrome-profile/ directory (cookies, preferences, cache)
|
|
218
|
+
*
|
|
151
219
|
* Safe to call multiple times (idempotent).
|
|
152
220
|
*
|
|
153
|
-
* WHY: Ensures clean slate for next session
|
|
221
|
+
* WHY: Ensures clean slate for next session while preserving user preferences.
|
|
154
222
|
*/
|
|
155
223
|
export function cleanupSession() {
|
|
224
|
+
// Clean up worker session files
|
|
156
225
|
cleanupPidFile();
|
|
157
226
|
releaseSessionLock();
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
227
|
+
// Remove session metadata
|
|
228
|
+
try {
|
|
229
|
+
fs.rmSync(getSessionFilePath('METADATA'), { force: true });
|
|
230
|
+
}
|
|
231
|
+
catch (error) {
|
|
232
|
+
log.debug(`Failed to remove metadata file: ${getErrorMessage(error)}`);
|
|
233
|
+
}
|
|
234
|
+
// NOTE: chrome.pid is intentionally NOT removed here
|
|
235
|
+
// It's used for emergency cleanup (bdg cleanup --chrome)
|
|
236
|
+
// and is automatically cleaned when Chrome process dies (via readChromePid)
|
|
237
|
+
// Remove daemon files
|
|
238
|
+
try {
|
|
239
|
+
fs.rmSync(getSessionFilePath('DAEMON_PID'), { force: true });
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
log.debug(`Failed to remove daemon PID file: ${getErrorMessage(error)}`);
|
|
243
|
+
}
|
|
244
|
+
try {
|
|
245
|
+
fs.rmSync(getSessionFilePath('DAEMON_SOCKET'), { force: true });
|
|
246
|
+
}
|
|
247
|
+
catch (error) {
|
|
248
|
+
log.debug(`Failed to remove daemon socket: ${getErrorMessage(error)}`);
|
|
249
|
+
}
|
|
250
|
+
try {
|
|
251
|
+
fs.rmSync(getSessionFilePath('DAEMON_LOCK'), { force: true });
|
|
252
|
+
}
|
|
253
|
+
catch (error) {
|
|
254
|
+
log.debug(`Failed to remove daemon lock: ${getErrorMessage(error)}`);
|
|
166
255
|
}
|
|
256
|
+
// NOTE: session.json (OUTPUT) is intentionally NOT removed
|
|
257
|
+
// User needs to read the output file after session ends
|
|
258
|
+
// They can manually delete it or use `bdg cleanup` to remove all files
|
|
259
|
+
// NOTE: chrome-profile/ directory is intentionally NOT removed
|
|
260
|
+
// to preserve user preferences, cookies, and cached data across sessions
|
|
167
261
|
}
|
|
168
262
|
/**
|
|
169
263
|
* Cleanup stale daemon PID file if daemon process is dead.
|
|
@@ -180,48 +274,42 @@ export function cleanupStaleDaemonPid() {
|
|
|
180
274
|
try {
|
|
181
275
|
const daemonPidStr = fs.readFileSync(daemonPidPath, 'utf-8').trim();
|
|
182
276
|
const daemonPid = parseInt(daemonPidStr, 10);
|
|
183
|
-
|
|
184
|
-
if (!isNaN(daemonPid) && isProcessAlive(daemonPid)) {
|
|
277
|
+
if (!Number.isNaN(daemonPid) && isProcessAlive(daemonPid)) {
|
|
185
278
|
return false;
|
|
186
279
|
}
|
|
187
|
-
|
|
188
|
-
log(`Daemon not running (stale PID ${daemonPid}), cleaning up...`);
|
|
189
|
-
// Remove daemon PID
|
|
280
|
+
log.info(`Daemon not running (stale PID ${daemonPid}), cleaning up...`);
|
|
190
281
|
try {
|
|
191
|
-
fs.
|
|
192
|
-
log('Removed stale daemon PID file');
|
|
282
|
+
fs.rmSync(daemonPidPath, { force: true });
|
|
283
|
+
log.info('Removed stale daemon PID file');
|
|
193
284
|
}
|
|
194
285
|
catch (error) {
|
|
195
|
-
log(`Failed to remove daemon PID: ${getErrorMessage(error)}`);
|
|
286
|
+
log.info(`Failed to remove daemon PID: ${getErrorMessage(error)}`);
|
|
196
287
|
}
|
|
197
|
-
// Remove daemon socket
|
|
198
288
|
const socketPath = getSessionFilePath('DAEMON_SOCKET');
|
|
199
289
|
if (fs.existsSync(socketPath)) {
|
|
200
290
|
try {
|
|
201
|
-
fs.
|
|
202
|
-
log('Removed stale daemon socket');
|
|
291
|
+
fs.rmSync(socketPath, { force: true });
|
|
292
|
+
log.info('Removed stale daemon socket');
|
|
203
293
|
}
|
|
204
294
|
catch (error) {
|
|
205
|
-
log(`Failed to remove daemon socket: ${getErrorMessage(error)}`);
|
|
295
|
+
log.info(`Failed to remove daemon socket: ${getErrorMessage(error)}`);
|
|
206
296
|
}
|
|
207
297
|
}
|
|
208
|
-
// Remove daemon lock
|
|
209
298
|
const lockPath = getSessionFilePath('DAEMON_LOCK');
|
|
210
299
|
if (fs.existsSync(lockPath)) {
|
|
211
300
|
try {
|
|
212
|
-
fs.
|
|
213
|
-
log('Removed stale daemon lock');
|
|
301
|
+
fs.rmSync(lockPath, { force: true });
|
|
302
|
+
log.info('Removed stale daemon lock');
|
|
214
303
|
}
|
|
215
304
|
catch (error) {
|
|
216
|
-
log(`Failed to remove daemon lock: ${getErrorMessage(error)}`);
|
|
305
|
+
log.info(`Failed to remove daemon lock: ${getErrorMessage(error)}`);
|
|
217
306
|
}
|
|
218
307
|
}
|
|
219
308
|
return true;
|
|
220
309
|
}
|
|
221
310
|
catch {
|
|
222
|
-
// Can't read daemon PID - will clean it up
|
|
223
311
|
try {
|
|
224
|
-
fs.
|
|
312
|
+
fs.rmSync(daemonPidPath, { force: true });
|
|
225
313
|
return true;
|
|
226
314
|
}
|
|
227
315
|
catch {
|
|
@@ -229,4 +317,44 @@ export function cleanupStaleDaemonPid() {
|
|
|
229
317
|
}
|
|
230
318
|
}
|
|
231
319
|
}
|
|
320
|
+
/**
|
|
321
|
+
* Aggressively cleanup orphaned daemon processes.
|
|
322
|
+
*
|
|
323
|
+
* Finds and kills all node processes running dist/daemon.js that are not
|
|
324
|
+
* the currently tracked daemon. This prevents accumulation of zombie daemon
|
|
325
|
+
* processes from test failures, timeouts, or crashes.
|
|
326
|
+
*
|
|
327
|
+
* WHY: Stale daemon processes accumulate from test runs and failures, causing
|
|
328
|
+
* resource leaks and confusion. Aggressive cleanup prevents this.
|
|
329
|
+
*
|
|
330
|
+
* @returns Number of orphaned daemons killed
|
|
331
|
+
*
|
|
332
|
+
* @example
|
|
333
|
+
* ```typescript
|
|
334
|
+
* const killedCount = cleanupOrphanedDaemons();
|
|
335
|
+
* if (killedCount > 0) {
|
|
336
|
+
* console.log(`Killed ${killedCount} orphaned daemon process(es)`);
|
|
337
|
+
* }
|
|
338
|
+
* ```
|
|
339
|
+
*/
|
|
340
|
+
export function cleanupOrphanedDaemons() {
|
|
341
|
+
const orphanedPids = findOrphanedDaemons();
|
|
342
|
+
if (orphanedPids.length === 0) {
|
|
343
|
+
log.debug('No orphaned daemon processes found');
|
|
344
|
+
return 0;
|
|
345
|
+
}
|
|
346
|
+
log.info(`Found ${orphanedPids.length} orphaned daemon process(es): ${orphanedPids.join(', ')}`);
|
|
347
|
+
let killedCount = 0;
|
|
348
|
+
for (const pid of orphanedPids) {
|
|
349
|
+
try {
|
|
350
|
+
process.kill(pid, 'SIGKILL');
|
|
351
|
+
log.info(`Killed orphaned daemon process ${pid}`);
|
|
352
|
+
killedCount++;
|
|
353
|
+
}
|
|
354
|
+
catch (error) {
|
|
355
|
+
log.debug(`Failed to kill orphaned daemon ${pid}: ${getErrorMessage(error)}`);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
return killedCount;
|
|
359
|
+
}
|
|
232
360
|
//# sourceMappingURL=cleanup.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../src/session/cleanup.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB,OAAO,EAAE,eAAe,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../src/session/cleanup.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../src/session/lock.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../src/session/lock.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAkHH;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAE5C;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC"}
|
package/dist/session/lock.js
CHANGED
|
@@ -5,8 +5,105 @@
|
|
|
5
5
|
* WHY: Prevents race conditions when multiple bdg processes try to start simultaneously.
|
|
6
6
|
*/
|
|
7
7
|
import * as fs from 'fs';
|
|
8
|
+
import { getErrorMessage } from '../connection/errors.js';
|
|
9
|
+
import { createLogger } from '../ui/logging/index.js';
|
|
10
|
+
import { isProcessAlive } from '../utils/process.js';
|
|
8
11
|
import { getSessionFilePath, ensureSessionDir } from './paths.js';
|
|
9
|
-
|
|
12
|
+
const log = createLogger('session');
|
|
13
|
+
/**
|
|
14
|
+
* Type guard for NodeJS errno exceptions.
|
|
15
|
+
*
|
|
16
|
+
* @param e - Unknown error to check
|
|
17
|
+
* @returns True if error has errno code property
|
|
18
|
+
*/
|
|
19
|
+
function isErrnoException(e) {
|
|
20
|
+
return typeof e === 'object' && e !== null && 'code' in e;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Read PID from lock file.
|
|
24
|
+
*
|
|
25
|
+
* @param lockPath - Path to lock file
|
|
26
|
+
* @returns Parsed PID or null if file doesn't exist or is invalid
|
|
27
|
+
*/
|
|
28
|
+
function readLockPid(lockPath) {
|
|
29
|
+
try {
|
|
30
|
+
const lockPidStr = fs.readFileSync(lockPath, 'utf-8').trim();
|
|
31
|
+
const lockPid = parseInt(lockPidStr, 10);
|
|
32
|
+
return Number.isNaN(lockPid) ? null : lockPid;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Try to remove stale lock file.
|
|
40
|
+
*
|
|
41
|
+
* @param lockPath - Path to lock file to remove
|
|
42
|
+
* @returns True if removal succeeded, false otherwise
|
|
43
|
+
*/
|
|
44
|
+
function removeStaleLock(lockPath) {
|
|
45
|
+
try {
|
|
46
|
+
fs.rmSync(lockPath, { force: true });
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Handle existing lock file by checking if owner process is still alive.
|
|
55
|
+
*
|
|
56
|
+
* @param lockPath - Path to existing lock file
|
|
57
|
+
* @param file - Lock file type for retry
|
|
58
|
+
* @returns True if lock was acquired after removing stale lock, false if active lock exists
|
|
59
|
+
*/
|
|
60
|
+
function handleExistingLock(lockPath, file) {
|
|
61
|
+
const lockPid = readLockPid(lockPath);
|
|
62
|
+
if (lockPid !== null && isProcessAlive(lockPid)) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
if (!removeStaleLock(lockPath)) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
return acquireLock(file);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Acquire a lock file atomically.
|
|
72
|
+
*
|
|
73
|
+
* Uses exclusive file creation (wx flag) to ensure only one process can hold the lock.
|
|
74
|
+
* If lock exists but owner process is dead, automatically removes stale lock and retries.
|
|
75
|
+
*
|
|
76
|
+
* @param file - Lock file type to acquire
|
|
77
|
+
* @returns True if lock was acquired, false if another process holds it
|
|
78
|
+
*/
|
|
79
|
+
function acquireLock(file) {
|
|
80
|
+
ensureSessionDir();
|
|
81
|
+
const lockPath = getSessionFilePath(file);
|
|
82
|
+
try {
|
|
83
|
+
fs.writeFileSync(lockPath, process.pid.toString(), { flag: 'wx' });
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
if (isErrnoException(error) && error.code === 'EEXIST') {
|
|
88
|
+
return handleExistingLock(lockPath, file);
|
|
89
|
+
}
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Release a lock file.
|
|
95
|
+
*
|
|
96
|
+
* @param file - Lock file type to release
|
|
97
|
+
*/
|
|
98
|
+
function releaseLock(file) {
|
|
99
|
+
const lockPath = getSessionFilePath(file);
|
|
100
|
+
try {
|
|
101
|
+
fs.rmSync(lockPath, { force: true });
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
log.debug(`Failed to release lock file ${file}: ${getErrorMessage(error)}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
10
107
|
/**
|
|
11
108
|
* Acquire session lock atomically.
|
|
12
109
|
*
|
|
@@ -24,42 +121,7 @@ import { isProcessAlive } from './process.js';
|
|
|
24
121
|
* ```
|
|
25
122
|
*/
|
|
26
123
|
export function acquireSessionLock() {
|
|
27
|
-
|
|
28
|
-
const lockPath = getSessionFilePath('LOCK');
|
|
29
|
-
try {
|
|
30
|
-
// 'wx' flag creates file exclusively - fails if exists
|
|
31
|
-
fs.writeFileSync(lockPath, process.pid.toString(), { flag: 'wx' });
|
|
32
|
-
return true;
|
|
33
|
-
}
|
|
34
|
-
catch (error) {
|
|
35
|
-
if (error instanceof Error && 'code' in error && error.code === 'EEXIST') {
|
|
36
|
-
// Lock file exists - check if process is still alive
|
|
37
|
-
try {
|
|
38
|
-
const lockPidStr = fs.readFileSync(lockPath, 'utf-8').trim();
|
|
39
|
-
const lockPid = parseInt(lockPidStr, 10);
|
|
40
|
-
if (!isNaN(lockPid) && isProcessAlive(lockPid)) {
|
|
41
|
-
// Lock is held by active process
|
|
42
|
-
return false;
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
45
|
-
// Stale lock file - remove it and try again
|
|
46
|
-
fs.unlinkSync(lockPath);
|
|
47
|
-
return acquireSessionLock();
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
catch {
|
|
51
|
-
// Can't read lock file - assume it's stale
|
|
52
|
-
try {
|
|
53
|
-
fs.unlinkSync(lockPath);
|
|
54
|
-
return acquireSessionLock();
|
|
55
|
-
}
|
|
56
|
-
catch {
|
|
57
|
-
return false;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
return false;
|
|
62
|
-
}
|
|
124
|
+
return acquireLock('LOCK');
|
|
63
125
|
}
|
|
64
126
|
/**
|
|
65
127
|
* Release session lock.
|
|
@@ -68,15 +130,7 @@ export function acquireSessionLock() {
|
|
|
68
130
|
* Safe to call multiple times (idempotent).
|
|
69
131
|
*/
|
|
70
132
|
export function releaseSessionLock() {
|
|
71
|
-
|
|
72
|
-
try {
|
|
73
|
-
if (fs.existsSync(lockPath)) {
|
|
74
|
-
fs.unlinkSync(lockPath);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
catch {
|
|
78
|
-
// Ignore errors during cleanup
|
|
79
|
-
}
|
|
133
|
+
releaseLock('LOCK');
|
|
80
134
|
}
|
|
81
135
|
/**
|
|
82
136
|
* Acquire daemon lock atomically.
|
|
@@ -97,42 +151,7 @@ export function releaseSessionLock() {
|
|
|
97
151
|
* ```
|
|
98
152
|
*/
|
|
99
153
|
export function acquireDaemonLock() {
|
|
100
|
-
|
|
101
|
-
const lockPath = getSessionFilePath('DAEMON_LOCK');
|
|
102
|
-
try {
|
|
103
|
-
// 'wx' flag creates file exclusively - fails if exists
|
|
104
|
-
fs.writeFileSync(lockPath, process.pid.toString(), { flag: 'wx' });
|
|
105
|
-
return true;
|
|
106
|
-
}
|
|
107
|
-
catch (error) {
|
|
108
|
-
if (error instanceof Error && 'code' in error && error.code === 'EEXIST') {
|
|
109
|
-
// Lock file exists - check if process is still alive
|
|
110
|
-
try {
|
|
111
|
-
const lockPidStr = fs.readFileSync(lockPath, 'utf-8').trim();
|
|
112
|
-
const lockPid = parseInt(lockPidStr, 10);
|
|
113
|
-
if (!isNaN(lockPid) && isProcessAlive(lockPid)) {
|
|
114
|
-
// Lock is held by active process
|
|
115
|
-
return false;
|
|
116
|
-
}
|
|
117
|
-
else {
|
|
118
|
-
// Stale lock file - remove it and try again
|
|
119
|
-
fs.unlinkSync(lockPath);
|
|
120
|
-
return acquireDaemonLock();
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
catch {
|
|
124
|
-
// Can't read lock file - assume it's stale
|
|
125
|
-
try {
|
|
126
|
-
fs.unlinkSync(lockPath);
|
|
127
|
-
return acquireDaemonLock();
|
|
128
|
-
}
|
|
129
|
-
catch {
|
|
130
|
-
return false;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
return false;
|
|
135
|
-
}
|
|
154
|
+
return acquireLock('DAEMON_LOCK');
|
|
136
155
|
}
|
|
137
156
|
/**
|
|
138
157
|
* Release daemon lock.
|
|
@@ -141,14 +160,6 @@ export function acquireDaemonLock() {
|
|
|
141
160
|
* Safe to call multiple times (idempotent).
|
|
142
161
|
*/
|
|
143
162
|
export function releaseDaemonLock() {
|
|
144
|
-
|
|
145
|
-
try {
|
|
146
|
-
if (fs.existsSync(lockPath)) {
|
|
147
|
-
fs.unlinkSync(lockPath);
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
catch {
|
|
151
|
-
// Ignore errors during cleanup
|
|
152
|
-
}
|
|
163
|
+
releaseLock('DAEMON_LOCK');
|
|
153
164
|
}
|
|
154
165
|
//# sourceMappingURL=lock.js.map
|