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/daemon/ipcServer.js
CHANGED
|
@@ -1,26 +1,36 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Daemon IPC Server
|
|
2
|
+
* Daemon IPC Server
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
4
|
+
* Coordinates socket server, worker manager, and request/response handlers.
|
|
5
|
+
* Responsibilities:
|
|
6
|
+
* - Socket lifecycle management
|
|
7
|
+
* - Message routing
|
|
8
|
+
* - Delegation to specialized handlers
|
|
8
9
|
*/
|
|
9
|
-
import {
|
|
10
|
+
import { unlinkSync } from 'fs';
|
|
11
|
+
import { getErrorMessage } from '../connection/errors.js';
|
|
12
|
+
import { PendingRequestManager } from '../daemon/handlers/pendingRequests.js';
|
|
13
|
+
import { RequestHandlers } from '../daemon/handlers/requestHandlers.js';
|
|
14
|
+
import { ResponseHandler } from '../daemon/handlers/responseHandler.js';
|
|
10
15
|
import { SocketServer } from '../daemon/server/SocketServer.js';
|
|
11
16
|
import { WorkerManager } from '../daemon/server/WorkerManager.js';
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import { IPCErrorCode } from '../ipc/types.js';
|
|
15
|
-
import { cleanupSession } from '../session/cleanup.js';
|
|
17
|
+
import { SessionService } from '../daemon/services/SessionService.js';
|
|
18
|
+
import { isCommandRequest } from '../ipc/index.js';
|
|
16
19
|
import { releaseDaemonLock } from '../session/lock.js';
|
|
17
|
-
import { readSessionMetadata } from '../session/metadata.js';
|
|
18
20
|
import { ensureSessionDir, getSessionFilePath, getDaemonSocketPath } from '../session/paths.js';
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
import { readPidFromFile } from '../session/pid.js';
|
|
22
|
+
import { createLogger } from '../ui/logging/index.js';
|
|
23
|
+
import { AtomicFileWriter } from '../utils/atomicFile.js';
|
|
24
|
+
const log = createLogger('daemon');
|
|
25
|
+
/**
|
|
26
|
+
* Type guard to validate parsed JSON has expected message structure.
|
|
27
|
+
*/
|
|
28
|
+
function isValidIPCMessage(obj) {
|
|
29
|
+
if (typeof obj !== 'object' || obj === null) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
return 'type' in obj && typeof obj.type === 'string' && 'sessionId' in obj;
|
|
33
|
+
}
|
|
24
34
|
/**
|
|
25
35
|
* Simple JSONL IPC server for daemon communication.
|
|
26
36
|
*/
|
|
@@ -28,10 +38,24 @@ export class IPCServer {
|
|
|
28
38
|
startTime = Date.now();
|
|
29
39
|
socketServer = new SocketServer();
|
|
30
40
|
workerManager = new WorkerManager();
|
|
31
|
-
|
|
41
|
+
pendingRequests = new PendingRequestManager();
|
|
42
|
+
sessionService = new SessionService();
|
|
43
|
+
// Delegate handlers
|
|
44
|
+
requestHandlers;
|
|
45
|
+
responseHandler;
|
|
32
46
|
constructor() {
|
|
33
|
-
|
|
34
|
-
this.workerManager.
|
|
47
|
+
// Initialize handlers with dependencies
|
|
48
|
+
this.requestHandlers = new RequestHandlers(this.workerManager, this.pendingRequests, this.sessionService, (socket, response) => this.sendResponse(socket, response), this.startTime);
|
|
49
|
+
this.responseHandler = new ResponseHandler(this.pendingRequests, this.sessionService, (socket, response) => this.sendResponse(socket, response));
|
|
50
|
+
// Wire up worker events
|
|
51
|
+
this.workerManager.on('message', (message) => this.responseHandler.handleWorkerResponse(message));
|
|
52
|
+
this.workerManager.on('exit', (code, signal) => this.responseHandler.handleWorkerExit(code, signal));
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Send a JSONL response to client socket.
|
|
56
|
+
*/
|
|
57
|
+
sendResponse(socket, response) {
|
|
58
|
+
socket.write(JSON.stringify(response) + '\n');
|
|
35
59
|
}
|
|
36
60
|
/**
|
|
37
61
|
* Start the IPC server on Unix domain socket.
|
|
@@ -68,662 +92,59 @@ export class IPCServer {
|
|
|
68
92
|
});
|
|
69
93
|
}
|
|
70
94
|
/**
|
|
71
|
-
* Handle incoming JSONL message.
|
|
95
|
+
* Handle incoming JSONL message - route to appropriate handler.
|
|
72
96
|
*/
|
|
73
97
|
handleMessage(socket, line) {
|
|
74
98
|
console.error('[daemon] Raw frame:', line);
|
|
75
99
|
try {
|
|
76
100
|
// Parse message - could be either IPC message or command request
|
|
77
|
-
const
|
|
101
|
+
const parsed = JSON.parse(line);
|
|
102
|
+
if (!isValidIPCMessage(parsed)) {
|
|
103
|
+
console.error('[daemon] Invalid message structure:', parsed);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const message = parsed;
|
|
78
107
|
// Check if this is a command request
|
|
79
108
|
if (isCommandRequest(message.type)) {
|
|
80
|
-
this.handleCommandRequest(socket, message);
|
|
109
|
+
this.requestHandlers.handleCommandRequest(socket, message);
|
|
81
110
|
return;
|
|
82
111
|
}
|
|
112
|
+
// Filter out response messages (should never be received from client)
|
|
113
|
+
if (message.type.endsWith('_response')) {
|
|
114
|
+
console.error(`[daemon] Unexpected response message from client: ${message.type}`);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
// Route to appropriate handler
|
|
83
118
|
switch (message.type) {
|
|
84
119
|
case 'handshake_request':
|
|
85
|
-
this.handleHandshake(socket, message);
|
|
86
|
-
break;
|
|
87
|
-
case 'handshake_response':
|
|
88
|
-
// Response messages are sent by daemon, not received
|
|
89
|
-
console.error('[daemon] Unexpected handshake response from client');
|
|
120
|
+
this.requestHandlers.handleHandshake(socket, message);
|
|
90
121
|
break;
|
|
91
122
|
case 'status_request':
|
|
92
|
-
this.handleStatusRequest(socket, message);
|
|
93
|
-
break;
|
|
94
|
-
case 'status_response':
|
|
95
|
-
// Response messages are sent by daemon, not received
|
|
96
|
-
console.error('[daemon] Unexpected status response from client');
|
|
123
|
+
this.requestHandlers.handleStatusRequest(socket, message);
|
|
97
124
|
break;
|
|
98
125
|
case 'peek_request':
|
|
99
|
-
this.handlePeekRequest(socket, message);
|
|
100
|
-
break;
|
|
101
|
-
case 'peek_response':
|
|
102
|
-
// Response messages are sent by daemon, not received
|
|
103
|
-
console.error('[daemon] Unexpected peek response from client');
|
|
126
|
+
this.requestHandlers.handlePeekRequest(socket, message);
|
|
104
127
|
break;
|
|
105
128
|
case 'start_session_request':
|
|
106
|
-
void this.handleStartSessionRequest(socket, message);
|
|
107
|
-
break;
|
|
108
|
-
case 'start_session_response':
|
|
109
|
-
// Response messages are sent by daemon, not received
|
|
110
|
-
console.error('[daemon] Unexpected start session response from client');
|
|
129
|
+
void this.requestHandlers.handleStartSessionRequest(socket, message);
|
|
111
130
|
break;
|
|
112
131
|
case 'stop_session_request':
|
|
113
|
-
this.handleStopSessionRequest(socket, message);
|
|
132
|
+
this.requestHandlers.handleStopSessionRequest(socket, message);
|
|
114
133
|
break;
|
|
134
|
+
case 'handshake_response':
|
|
135
|
+
case 'status_response':
|
|
136
|
+
case 'peek_response':
|
|
137
|
+
case 'start_session_response':
|
|
115
138
|
case 'stop_session_response':
|
|
116
|
-
//
|
|
117
|
-
console.error('[daemon] Unexpected
|
|
139
|
+
// Already filtered above, but keeping cases for exhaustiveness check
|
|
140
|
+
console.error('[daemon] Unexpected response message (should have been filtered)');
|
|
118
141
|
break;
|
|
119
|
-
// NOTE: DOM command responses are now handled via command system (see commands.ts)
|
|
120
142
|
}
|
|
121
143
|
}
|
|
122
144
|
catch (error) {
|
|
123
145
|
console.error('[daemon] Failed to parse message:', error);
|
|
124
146
|
}
|
|
125
147
|
}
|
|
126
|
-
/**
|
|
127
|
-
* Handle handshake request.
|
|
128
|
-
*/
|
|
129
|
-
handleHandshake(socket, request) {
|
|
130
|
-
console.error(`[daemon] Handshake request received (sessionId: ${request.sessionId})`);
|
|
131
|
-
const response = {
|
|
132
|
-
type: 'handshake_response',
|
|
133
|
-
sessionId: request.sessionId,
|
|
134
|
-
status: 'ok',
|
|
135
|
-
message: 'Handshake successful',
|
|
136
|
-
};
|
|
137
|
-
// Send JSONL response (JSON + newline)
|
|
138
|
-
socket.write(JSON.stringify(response) + '\n');
|
|
139
|
-
console.error('[daemon] Handshake response sent');
|
|
140
|
-
}
|
|
141
|
-
/**
|
|
142
|
-
* Handle status request.
|
|
143
|
-
*/
|
|
144
|
-
handleStatusRequest(socket, request) {
|
|
145
|
-
console.error(`[daemon] Status request received (sessionId: ${request.sessionId})`);
|
|
146
|
-
try {
|
|
147
|
-
// Gather daemon metadata
|
|
148
|
-
const data = {
|
|
149
|
-
daemonPid: process.pid,
|
|
150
|
-
daemonStartTime: this.startTime,
|
|
151
|
-
socketPath: getSessionFilePath('DAEMON_SOCKET'),
|
|
152
|
-
};
|
|
153
|
-
// Check for active session
|
|
154
|
-
const sessionPid = readPid();
|
|
155
|
-
if (sessionPid && isProcessAlive(sessionPid)) {
|
|
156
|
-
data.sessionPid = sessionPid;
|
|
157
|
-
// Try to read session metadata
|
|
158
|
-
const metadata = readSessionMetadata({ warnOnCorruption: true });
|
|
159
|
-
if (metadata) {
|
|
160
|
-
data.sessionMetadata = filterDefined({
|
|
161
|
-
bdgPid: metadata.bdgPid,
|
|
162
|
-
chromePid: metadata.chromePid,
|
|
163
|
-
startTime: metadata.startTime,
|
|
164
|
-
port: metadata.port,
|
|
165
|
-
targetId: metadata.targetId,
|
|
166
|
-
webSocketDebuggerUrl: metadata.webSocketDebuggerUrl,
|
|
167
|
-
activeTelemetry: metadata.activeTelemetry,
|
|
168
|
-
});
|
|
169
|
-
}
|
|
170
|
-
// Query worker for live activity data if worker is available
|
|
171
|
-
if (this.workerManager.hasActiveWorker()) {
|
|
172
|
-
const requestId = `worker_status_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
173
|
-
// Set timeout for worker response
|
|
174
|
-
const timeout = setTimeout(() => {
|
|
175
|
-
this.pendingDomRequests.delete(requestId);
|
|
176
|
-
// Send response without activity data if worker times out
|
|
177
|
-
const response = {
|
|
178
|
-
type: 'status_response',
|
|
179
|
-
sessionId: request.sessionId,
|
|
180
|
-
status: 'ok',
|
|
181
|
-
data,
|
|
182
|
-
};
|
|
183
|
-
socket.write(JSON.stringify(response) + '\n');
|
|
184
|
-
console.error('[daemon] Status response sent (worker timeout)');
|
|
185
|
-
}, 5000);
|
|
186
|
-
// Track pending request with special handling for status
|
|
187
|
-
this.pendingDomRequests.set(requestId, {
|
|
188
|
-
socket,
|
|
189
|
-
sessionId: request.sessionId,
|
|
190
|
-
timeout,
|
|
191
|
-
statusData: data, // Store base status data
|
|
192
|
-
commandName: 'worker_status',
|
|
193
|
-
});
|
|
194
|
-
// Forward to worker
|
|
195
|
-
const workerRequest = {
|
|
196
|
-
type: 'worker_status_request',
|
|
197
|
-
requestId,
|
|
198
|
-
};
|
|
199
|
-
try {
|
|
200
|
-
this.workerManager.send(workerRequest);
|
|
201
|
-
console.error(`[daemon] Forwarded worker_status_request to worker (requestId: ${requestId})`);
|
|
202
|
-
return; // Will send response when worker responds
|
|
203
|
-
}
|
|
204
|
-
catch (error) {
|
|
205
|
-
clearTimeout(timeout);
|
|
206
|
-
this.pendingDomRequests.delete(requestId);
|
|
207
|
-
console.error(`[daemon] Failed to forward worker_status_request: ${getErrorMessage(error)}`);
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
// Send response immediately if no worker
|
|
212
|
-
const response = {
|
|
213
|
-
type: 'status_response',
|
|
214
|
-
sessionId: request.sessionId,
|
|
215
|
-
status: 'ok',
|
|
216
|
-
data,
|
|
217
|
-
};
|
|
218
|
-
socket.write(JSON.stringify(response) + '\n');
|
|
219
|
-
console.error('[daemon] Status response sent');
|
|
220
|
-
}
|
|
221
|
-
catch (error) {
|
|
222
|
-
const response = {
|
|
223
|
-
type: 'status_response',
|
|
224
|
-
sessionId: request.sessionId,
|
|
225
|
-
status: 'error',
|
|
226
|
-
error: `Failed to gather status: ${getErrorMessage(error)}`,
|
|
227
|
-
};
|
|
228
|
-
socket.write(JSON.stringify(response) + '\n');
|
|
229
|
-
console.error('[daemon] Status error response sent');
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
/**
|
|
233
|
-
* Handle peek request - forward to worker via IPC.
|
|
234
|
-
*/
|
|
235
|
-
handlePeekRequest(socket, request) {
|
|
236
|
-
console.error(`[daemon] Peek request received (sessionId: ${request.sessionId})`);
|
|
237
|
-
// Check for active worker process
|
|
238
|
-
if (!this.workerManager.hasActiveWorker()) {
|
|
239
|
-
const response = {
|
|
240
|
-
type: 'peek_response',
|
|
241
|
-
sessionId: request.sessionId,
|
|
242
|
-
status: 'error',
|
|
243
|
-
error: 'No active worker process',
|
|
244
|
-
};
|
|
245
|
-
socket.write(JSON.stringify(response) + '\n');
|
|
246
|
-
console.error('[daemon] Peek error response sent (no worker)');
|
|
247
|
-
return;
|
|
248
|
-
}
|
|
249
|
-
// Generate unique request ID
|
|
250
|
-
const requestId = `worker_peek_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
251
|
-
// Set timeout for worker response
|
|
252
|
-
const timeout = setTimeout(() => {
|
|
253
|
-
this.pendingDomRequests.delete(requestId);
|
|
254
|
-
const response = {
|
|
255
|
-
type: 'peek_response',
|
|
256
|
-
sessionId: request.sessionId,
|
|
257
|
-
status: 'error',
|
|
258
|
-
error: 'Worker response timeout (5s)',
|
|
259
|
-
};
|
|
260
|
-
socket.write(JSON.stringify(response) + '\n');
|
|
261
|
-
console.error('[daemon] Peek timeout response sent');
|
|
262
|
-
}, 5000);
|
|
263
|
-
// Track pending request
|
|
264
|
-
this.pendingDomRequests.set(requestId, {
|
|
265
|
-
socket,
|
|
266
|
-
sessionId: request.sessionId,
|
|
267
|
-
timeout,
|
|
268
|
-
commandName: 'worker_peek',
|
|
269
|
-
});
|
|
270
|
-
// Forward to worker
|
|
271
|
-
const workerRequest = {
|
|
272
|
-
type: 'worker_peek_request',
|
|
273
|
-
requestId,
|
|
274
|
-
lastN: 10, // Default limit for preview items (PeekRequest doesn't include lastN)
|
|
275
|
-
};
|
|
276
|
-
try {
|
|
277
|
-
this.workerManager.send(workerRequest);
|
|
278
|
-
console.error(`[daemon] Forwarded worker_peek_request to worker (requestId: ${requestId})`);
|
|
279
|
-
}
|
|
280
|
-
catch (error) {
|
|
281
|
-
clearTimeout(timeout);
|
|
282
|
-
this.pendingDomRequests.delete(requestId);
|
|
283
|
-
const response = {
|
|
284
|
-
type: 'peek_response',
|
|
285
|
-
sessionId: request.sessionId,
|
|
286
|
-
status: 'error',
|
|
287
|
-
error: getErrorMessage(error),
|
|
288
|
-
};
|
|
289
|
-
socket.write(JSON.stringify(response) + '\n');
|
|
290
|
-
console.error(`[daemon] Failed to forward worker_peek_request: ${getErrorMessage(error)}`);
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
/**
|
|
294
|
-
* Handle start session request.
|
|
295
|
-
*/
|
|
296
|
-
async handleStartSessionRequest(socket, request) {
|
|
297
|
-
console.error(`[daemon] Start session request received (sessionId: ${request.sessionId}, url: ${request.url})`);
|
|
298
|
-
try {
|
|
299
|
-
// Check for existing session (concurrency guard)
|
|
300
|
-
const sessionPid = readPid();
|
|
301
|
-
if (sessionPid && isProcessAlive(sessionPid)) {
|
|
302
|
-
// Read session metadata to provide helpful error context
|
|
303
|
-
const metadata = readSessionMetadata({ warnOnCorruption: false });
|
|
304
|
-
const startTime = metadata?.startTime;
|
|
305
|
-
const duration = startTime ? Math.floor((Date.now() - startTime) / 1000) : undefined;
|
|
306
|
-
// Try to get target URL from CDP
|
|
307
|
-
let targetUrl;
|
|
308
|
-
if (metadata?.port && metadata?.targetId) {
|
|
309
|
-
try {
|
|
310
|
-
const targets = await fetchCDPTargets(metadata.port);
|
|
311
|
-
const target = targets.find((t) => t.id === metadata.targetId);
|
|
312
|
-
if (target) {
|
|
313
|
-
targetUrl = target.url;
|
|
314
|
-
}
|
|
315
|
-
}
|
|
316
|
-
catch {
|
|
317
|
-
// Ignore CDP fetch errors
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
const response = {
|
|
321
|
-
type: 'start_session_response',
|
|
322
|
-
sessionId: request.sessionId,
|
|
323
|
-
status: 'error',
|
|
324
|
-
message: `Session already running (PID ${sessionPid}). Stop it first with stop_session_request.`,
|
|
325
|
-
errorCode: IPCErrorCode.SESSION_ALREADY_RUNNING,
|
|
326
|
-
existingSession: {
|
|
327
|
-
pid: sessionPid,
|
|
328
|
-
...(targetUrl && { targetUrl }),
|
|
329
|
-
...(startTime && { startTime }),
|
|
330
|
-
...(duration !== undefined && { duration }),
|
|
331
|
-
},
|
|
332
|
-
};
|
|
333
|
-
socket.write(JSON.stringify(response) + '\n');
|
|
334
|
-
console.error('[daemon] Start session error response sent (session already running)');
|
|
335
|
-
return;
|
|
336
|
-
}
|
|
337
|
-
// Launch worker
|
|
338
|
-
console.error('[daemon] Launching worker...');
|
|
339
|
-
try {
|
|
340
|
-
const metadata = await this.workerManager.launch(request.url, filterDefined({
|
|
341
|
-
port: request.port,
|
|
342
|
-
timeout: request.timeout,
|
|
343
|
-
telemetry: request.telemetry,
|
|
344
|
-
includeAll: request.includeAll,
|
|
345
|
-
userDataDir: request.userDataDir,
|
|
346
|
-
maxBodySize: request.maxBodySize,
|
|
347
|
-
headless: request.headless,
|
|
348
|
-
chromeWsUrl: request.chromeWsUrl,
|
|
349
|
-
}));
|
|
350
|
-
console.error('[daemon] Worker launched successfully');
|
|
351
|
-
// Build response data
|
|
352
|
-
const data = {
|
|
353
|
-
workerPid: metadata.workerPid,
|
|
354
|
-
chromePid: metadata.chromePid,
|
|
355
|
-
port: metadata.port,
|
|
356
|
-
targetUrl: metadata.targetUrl,
|
|
357
|
-
...(metadata.targetTitle !== undefined && { targetTitle: metadata.targetTitle }),
|
|
358
|
-
};
|
|
359
|
-
const response = {
|
|
360
|
-
type: 'start_session_response',
|
|
361
|
-
sessionId: request.sessionId,
|
|
362
|
-
status: 'ok',
|
|
363
|
-
data,
|
|
364
|
-
message: 'Session started successfully',
|
|
365
|
-
};
|
|
366
|
-
socket.write(JSON.stringify(response) + '\n');
|
|
367
|
-
console.error('[daemon] Start session response sent');
|
|
368
|
-
}
|
|
369
|
-
catch (error) {
|
|
370
|
-
// Map worker errors to IPC error codes
|
|
371
|
-
let errorCode = IPCErrorCode.WORKER_START_FAILED;
|
|
372
|
-
let errorMessage = 'Failed to start worker';
|
|
373
|
-
if (error instanceof WorkerStartError) {
|
|
374
|
-
// Include error details (contains worker stderr) for debugging
|
|
375
|
-
errorMessage = error.details ? `${error.message}\n${error.details}` : error.message;
|
|
376
|
-
switch (error.code) {
|
|
377
|
-
case 'SPAWN_FAILED':
|
|
378
|
-
case 'WORKER_CRASH':
|
|
379
|
-
case 'INVALID_READY_MESSAGE':
|
|
380
|
-
errorCode = IPCErrorCode.WORKER_START_FAILED;
|
|
381
|
-
break;
|
|
382
|
-
case 'READY_TIMEOUT':
|
|
383
|
-
errorCode = IPCErrorCode.CDP_TIMEOUT;
|
|
384
|
-
break;
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
else {
|
|
388
|
-
errorMessage = getErrorMessage(error);
|
|
389
|
-
}
|
|
390
|
-
const response = {
|
|
391
|
-
type: 'start_session_response',
|
|
392
|
-
sessionId: request.sessionId,
|
|
393
|
-
status: 'error',
|
|
394
|
-
message: errorMessage,
|
|
395
|
-
errorCode,
|
|
396
|
-
};
|
|
397
|
-
socket.write(JSON.stringify(response) + '\n');
|
|
398
|
-
console.error(`[daemon] Start session error response sent (${errorCode})`);
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
catch (error) {
|
|
402
|
-
const response = {
|
|
403
|
-
type: 'start_session_response',
|
|
404
|
-
sessionId: request.sessionId,
|
|
405
|
-
status: 'error',
|
|
406
|
-
message: `Daemon error: ${getErrorMessage(error)}`,
|
|
407
|
-
errorCode: IPCErrorCode.DAEMON_ERROR,
|
|
408
|
-
};
|
|
409
|
-
socket.write(JSON.stringify(response) + '\n');
|
|
410
|
-
console.error('[daemon] Start session error response sent (daemon error)');
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
/**
|
|
414
|
-
* Handle stop session request.
|
|
415
|
-
*/
|
|
416
|
-
handleStopSessionRequest(socket, request) {
|
|
417
|
-
console.error(`[daemon] Stop session request received (sessionId: ${request.sessionId})`);
|
|
418
|
-
try {
|
|
419
|
-
// Check for active session
|
|
420
|
-
const sessionPid = readPid();
|
|
421
|
-
if (!sessionPid || !isProcessAlive(sessionPid)) {
|
|
422
|
-
const response = {
|
|
423
|
-
type: 'stop_session_response',
|
|
424
|
-
sessionId: request.sessionId,
|
|
425
|
-
status: 'error',
|
|
426
|
-
message: 'No active session found',
|
|
427
|
-
errorCode: IPCErrorCode.NO_SESSION,
|
|
428
|
-
};
|
|
429
|
-
socket.write(JSON.stringify(response) + '\n');
|
|
430
|
-
console.error('[daemon] Stop session error response sent (no session)');
|
|
431
|
-
return;
|
|
432
|
-
}
|
|
433
|
-
// Capture Chrome PID BEFORE cleanup (so CLI can kill Chrome if needed)
|
|
434
|
-
const metadata = readSessionMetadata({ warnOnCorruption: true });
|
|
435
|
-
const chromePid = metadata?.chromePid;
|
|
436
|
-
if (chromePid) {
|
|
437
|
-
console.error(`[daemon] Captured Chrome PID ${chromePid} before cleanup`);
|
|
438
|
-
}
|
|
439
|
-
// Kill the session process (use SIGTERM for graceful shutdown)
|
|
440
|
-
try {
|
|
441
|
-
process.kill(sessionPid, 'SIGTERM');
|
|
442
|
-
console.error(`[daemon] Sent SIGTERM to session process (PID ${sessionPid})`);
|
|
443
|
-
}
|
|
444
|
-
catch (killError) {
|
|
445
|
-
const errorMessage = killError instanceof Error ? killError.message : String(killError);
|
|
446
|
-
const response = {
|
|
447
|
-
type: 'stop_session_response',
|
|
448
|
-
sessionId: request.sessionId,
|
|
449
|
-
status: 'error',
|
|
450
|
-
message: `Failed to kill session process: ${errorMessage}`,
|
|
451
|
-
errorCode: IPCErrorCode.SESSION_KILL_FAILED,
|
|
452
|
-
};
|
|
453
|
-
socket.write(JSON.stringify(response) + '\n');
|
|
454
|
-
console.error('[daemon] Stop session error response sent (kill failed)');
|
|
455
|
-
return;
|
|
456
|
-
}
|
|
457
|
-
// Clean up session files
|
|
458
|
-
cleanupSession();
|
|
459
|
-
console.error('[daemon] Cleaned up session files');
|
|
460
|
-
// Clear worker process reference
|
|
461
|
-
this.workerManager.dispose();
|
|
462
|
-
console.error('[daemon] Cleared worker process reference');
|
|
463
|
-
const response = {
|
|
464
|
-
type: 'stop_session_response',
|
|
465
|
-
sessionId: request.sessionId,
|
|
466
|
-
status: 'ok',
|
|
467
|
-
message: 'Session stopped successfully',
|
|
468
|
-
...(chromePid !== undefined && { chromePid }),
|
|
469
|
-
};
|
|
470
|
-
socket.write(JSON.stringify(response) + '\n');
|
|
471
|
-
console.error('[daemon] Stop session response sent');
|
|
472
|
-
// Release lock immediately so new sessions can start
|
|
473
|
-
releaseDaemonLock();
|
|
474
|
-
console.error('[daemon] Daemon lock released');
|
|
475
|
-
// Shutdown daemon after successful stop
|
|
476
|
-
// Give socket time to flush response, then exit gracefully
|
|
477
|
-
setTimeout(() => {
|
|
478
|
-
console.error('[daemon] Shutting down daemon after successful stop');
|
|
479
|
-
process.exit(0);
|
|
480
|
-
}, 100);
|
|
481
|
-
}
|
|
482
|
-
catch (error) {
|
|
483
|
-
const response = {
|
|
484
|
-
type: 'stop_session_response',
|
|
485
|
-
sessionId: request.sessionId,
|
|
486
|
-
status: 'error',
|
|
487
|
-
message: `Failed to stop session: ${getErrorMessage(error)}`,
|
|
488
|
-
errorCode: IPCErrorCode.DAEMON_ERROR,
|
|
489
|
-
};
|
|
490
|
-
socket.write(JSON.stringify(response) + '\n');
|
|
491
|
-
console.error('[daemon] Stop session error response sent');
|
|
492
|
-
}
|
|
493
|
-
}
|
|
494
|
-
/**
|
|
495
|
-
* Handle response from worker (lifecycle signals or command responses).
|
|
496
|
-
*/
|
|
497
|
-
handleWorkerResponse(message) {
|
|
498
|
-
console.error(`[daemon] Received worker response: ${message.type} (requestId: ${message.requestId})`);
|
|
499
|
-
// Check for ready signal (not a command response)
|
|
500
|
-
if (message.type === 'worker_ready') {
|
|
501
|
-
console.error('[daemon] Worker ready signal (already processed during launch)');
|
|
502
|
-
return;
|
|
503
|
-
}
|
|
504
|
-
// Check if this is a command response
|
|
505
|
-
if (isCommandResponse(message.type)) {
|
|
506
|
-
// Look up pending request
|
|
507
|
-
const pending = this.pendingDomRequests.get(message.requestId);
|
|
508
|
-
if (!pending) {
|
|
509
|
-
console.error(`[daemon] No pending request found for requestId: ${message.requestId}`);
|
|
510
|
-
return;
|
|
511
|
-
}
|
|
512
|
-
// Clear timeout and remove from pending
|
|
513
|
-
clearTimeout(pending.timeout);
|
|
514
|
-
this.pendingDomRequests.delete(message.requestId);
|
|
515
|
-
// Forward response to client (pass pending data for special handling)
|
|
516
|
-
this.forwardCommandResponse(pending.socket, pending.sessionId, message, pending);
|
|
517
|
-
}
|
|
518
|
-
}
|
|
519
|
-
handleWorkerExit(code, signal) {
|
|
520
|
-
console.error(`[daemon] Worker exit detected (code: ${code ?? 'null'}, signal: ${signal ?? 'null'})`);
|
|
521
|
-
if (this.pendingDomRequests.size === 0) {
|
|
522
|
-
return;
|
|
523
|
-
}
|
|
524
|
-
const errorMessage = 'Worker process exited before responding';
|
|
525
|
-
for (const [requestId, pending] of this.pendingDomRequests.entries()) {
|
|
526
|
-
clearTimeout(pending.timeout);
|
|
527
|
-
this.pendingDomRequests.delete(requestId);
|
|
528
|
-
if (pending.commandName === 'worker_status') {
|
|
529
|
-
const statusResponse = {
|
|
530
|
-
type: 'status_response',
|
|
531
|
-
sessionId: pending.sessionId,
|
|
532
|
-
status: 'error',
|
|
533
|
-
...(pending.statusData && { data: pending.statusData }),
|
|
534
|
-
error: errorMessage,
|
|
535
|
-
};
|
|
536
|
-
pending.socket.write(JSON.stringify(statusResponse) + '\n');
|
|
537
|
-
continue;
|
|
538
|
-
}
|
|
539
|
-
if (pending.commandName === 'worker_peek') {
|
|
540
|
-
const peekResponse = {
|
|
541
|
-
type: 'peek_response',
|
|
542
|
-
sessionId: pending.sessionId,
|
|
543
|
-
status: 'error',
|
|
544
|
-
error: errorMessage,
|
|
545
|
-
};
|
|
546
|
-
pending.socket.write(JSON.stringify(peekResponse) + '\n');
|
|
547
|
-
continue;
|
|
548
|
-
}
|
|
549
|
-
if (pending.commandName) {
|
|
550
|
-
const response = {
|
|
551
|
-
type: `${pending.commandName}_response`,
|
|
552
|
-
sessionId: pending.sessionId,
|
|
553
|
-
status: 'error',
|
|
554
|
-
error: errorMessage,
|
|
555
|
-
};
|
|
556
|
-
pending.socket.write(JSON.stringify(response) + '\n');
|
|
557
|
-
continue;
|
|
558
|
-
}
|
|
559
|
-
const fallback = {
|
|
560
|
-
type: 'status_response',
|
|
561
|
-
sessionId: pending.sessionId,
|
|
562
|
-
status: 'error',
|
|
563
|
-
error: errorMessage,
|
|
564
|
-
};
|
|
565
|
-
pending.socket.write(JSON.stringify(fallback) + '\n');
|
|
566
|
-
}
|
|
567
|
-
}
|
|
568
|
-
/**
|
|
569
|
-
* Generic forwarder for all command responses.
|
|
570
|
-
*/
|
|
571
|
-
forwardCommandResponse(socket, sessionId, workerResponse, pendingRequest) {
|
|
572
|
-
const commandName = getCommandName(workerResponse.type);
|
|
573
|
-
if (!commandName) {
|
|
574
|
-
console.error(`[daemon] Invalid worker response type: ${workerResponse.type}`);
|
|
575
|
-
return;
|
|
576
|
-
}
|
|
577
|
-
// Special handling for worker_status - merge with base status data
|
|
578
|
-
if (commandName === 'worker_status') {
|
|
579
|
-
this.forwardWorkerStatusResponse(socket, sessionId, workerResponse, pendingRequest);
|
|
580
|
-
return;
|
|
581
|
-
}
|
|
582
|
-
// Special handling for worker_peek - transform to PeekResponse format
|
|
583
|
-
if (commandName === 'worker_peek') {
|
|
584
|
-
const { requestId: _requestId, success, data, error, } = workerResponse;
|
|
585
|
-
const peekResponse = {
|
|
586
|
-
type: 'peek_response',
|
|
587
|
-
sessionId,
|
|
588
|
-
status: success ? 'ok' : 'error',
|
|
589
|
-
...(success &&
|
|
590
|
-
data && {
|
|
591
|
-
data: {
|
|
592
|
-
sessionPid: readPid() ?? 0,
|
|
593
|
-
preview: {
|
|
594
|
-
version: data.version,
|
|
595
|
-
success: true,
|
|
596
|
-
timestamp: new Date(data.startTime).toISOString(),
|
|
597
|
-
duration: data.duration,
|
|
598
|
-
target: data.target,
|
|
599
|
-
data: {
|
|
600
|
-
network: data.network,
|
|
601
|
-
console: data.console,
|
|
602
|
-
},
|
|
603
|
-
partial: true,
|
|
604
|
-
},
|
|
605
|
-
},
|
|
606
|
-
}),
|
|
607
|
-
...(error && { error }),
|
|
608
|
-
};
|
|
609
|
-
socket.write(JSON.stringify(peekResponse) + '\n');
|
|
610
|
-
console.error('[daemon] Forwarded worker_peek_response to client (transformed to PeekResponse)');
|
|
611
|
-
return;
|
|
612
|
-
}
|
|
613
|
-
// Default handling for other commands
|
|
614
|
-
const { requestId: _requestId, success, ...rest } = workerResponse;
|
|
615
|
-
const response = {
|
|
616
|
-
...rest,
|
|
617
|
-
type: `${commandName}_response`,
|
|
618
|
-
sessionId,
|
|
619
|
-
status: success ? 'ok' : 'error',
|
|
620
|
-
};
|
|
621
|
-
socket.write(JSON.stringify(response) + '\n');
|
|
622
|
-
console.error(`[daemon] Forwarded ${commandName}_response to client`);
|
|
623
|
-
}
|
|
624
|
-
forwardWorkerStatusResponse(socket, sessionId, workerResponse, pendingRequest) {
|
|
625
|
-
const { success, data, error } = workerResponse;
|
|
626
|
-
const baseStatusData = pendingRequest?.statusData;
|
|
627
|
-
if (success && data && baseStatusData) {
|
|
628
|
-
const enrichedData = {
|
|
629
|
-
...baseStatusData,
|
|
630
|
-
activity: data.activity,
|
|
631
|
-
pageState: data.target,
|
|
632
|
-
};
|
|
633
|
-
const statusResponse = {
|
|
634
|
-
type: 'status_response',
|
|
635
|
-
sessionId,
|
|
636
|
-
status: 'ok',
|
|
637
|
-
data: enrichedData,
|
|
638
|
-
};
|
|
639
|
-
socket.write(JSON.stringify(statusResponse) + '\n');
|
|
640
|
-
console.error('[daemon] Forwarded worker_status_response to client (enriched with activity data)');
|
|
641
|
-
return;
|
|
642
|
-
}
|
|
643
|
-
if (baseStatusData) {
|
|
644
|
-
const statusResponse = {
|
|
645
|
-
type: 'status_response',
|
|
646
|
-
sessionId,
|
|
647
|
-
status: error ? 'error' : 'ok',
|
|
648
|
-
data: baseStatusData,
|
|
649
|
-
...(error && { error }),
|
|
650
|
-
};
|
|
651
|
-
socket.write(JSON.stringify(statusResponse) + '\n');
|
|
652
|
-
console.error('[daemon] Forwarded status_response to client (worker query failed, using base data only)');
|
|
653
|
-
return;
|
|
654
|
-
}
|
|
655
|
-
const fallback = {
|
|
656
|
-
type: 'status_response',
|
|
657
|
-
sessionId,
|
|
658
|
-
status: 'error',
|
|
659
|
-
error: error ?? 'Failed to retrieve status data',
|
|
660
|
-
};
|
|
661
|
-
socket.write(JSON.stringify(fallback) + '\n');
|
|
662
|
-
console.error('[daemon] Forwarded status_response error (no base data available)');
|
|
663
|
-
}
|
|
664
|
-
/**
|
|
665
|
-
* Generic handler for all command requests.
|
|
666
|
-
*/
|
|
667
|
-
handleCommandRequest(socket, request) {
|
|
668
|
-
const commandName = getCommandName(request.type);
|
|
669
|
-
if (!commandName) {
|
|
670
|
-
console.error(`[daemon] Invalid command type: ${request.type}`);
|
|
671
|
-
return;
|
|
672
|
-
}
|
|
673
|
-
console.error(`[daemon] ${commandName} request received (sessionId: ${request.sessionId})`);
|
|
674
|
-
if (!this.workerManager.hasActiveWorker()) {
|
|
675
|
-
const response = {
|
|
676
|
-
type: `${commandName}_response`,
|
|
677
|
-
sessionId: request.sessionId,
|
|
678
|
-
status: 'error',
|
|
679
|
-
error: 'No active worker process',
|
|
680
|
-
};
|
|
681
|
-
socket.write(JSON.stringify(response) + '\n');
|
|
682
|
-
console.error(`[daemon] ${commandName} error response sent (no worker)`);
|
|
683
|
-
return;
|
|
684
|
-
}
|
|
685
|
-
const requestId = `${commandName}_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
686
|
-
const timeout = setTimeout(() => {
|
|
687
|
-
this.pendingDomRequests.delete(requestId);
|
|
688
|
-
const response = {
|
|
689
|
-
type: `${commandName}_response`,
|
|
690
|
-
sessionId: request.sessionId,
|
|
691
|
-
status: 'error',
|
|
692
|
-
error: 'Worker response timeout (10s)',
|
|
693
|
-
};
|
|
694
|
-
socket.write(JSON.stringify(response) + '\n');
|
|
695
|
-
console.error(`[daemon] ${commandName} timeout response sent`);
|
|
696
|
-
}, 10000);
|
|
697
|
-
this.pendingDomRequests.set(requestId, {
|
|
698
|
-
socket,
|
|
699
|
-
sessionId: request.sessionId,
|
|
700
|
-
timeout,
|
|
701
|
-
commandName,
|
|
702
|
-
});
|
|
703
|
-
// Extract only sessionId, keep all other fields including 'type' param if it exists
|
|
704
|
-
const { sessionId: _sessionId, type: _ipcType, ...params } = request;
|
|
705
|
-
const workerRequest = {
|
|
706
|
-
type: `${commandName}_request`,
|
|
707
|
-
requestId,
|
|
708
|
-
...params,
|
|
709
|
-
};
|
|
710
|
-
try {
|
|
711
|
-
this.workerManager.send(workerRequest);
|
|
712
|
-
console.error(`[daemon] Forwarded ${commandName}_request to worker (requestId: ${requestId})`);
|
|
713
|
-
}
|
|
714
|
-
catch (error) {
|
|
715
|
-
clearTimeout(timeout);
|
|
716
|
-
this.pendingDomRequests.delete(requestId);
|
|
717
|
-
const response = {
|
|
718
|
-
type: `${commandName}_response`,
|
|
719
|
-
sessionId: request.sessionId,
|
|
720
|
-
status: 'error',
|
|
721
|
-
error: getErrorMessage(error),
|
|
722
|
-
};
|
|
723
|
-
socket.write(JSON.stringify(response) + '\n');
|
|
724
|
-
console.error(`[daemon] Failed to forward ${commandName}_request to worker: ${getErrorMessage(error)}`);
|
|
725
|
-
}
|
|
726
|
-
}
|
|
727
148
|
/**
|
|
728
149
|
* Stop the IPC server and cleanup.
|
|
729
150
|
*/
|
|
@@ -735,24 +156,28 @@ export class IPCServer {
|
|
|
735
156
|
try {
|
|
736
157
|
unlinkSync(socketPath);
|
|
737
158
|
}
|
|
738
|
-
catch {
|
|
739
|
-
|
|
159
|
+
catch (error) {
|
|
160
|
+
log.debug(`Failed to remove socket file: ${getErrorMessage(error)}`);
|
|
740
161
|
}
|
|
741
162
|
const pidPath = getSessionFilePath('DAEMON_PID');
|
|
742
163
|
try {
|
|
743
164
|
unlinkSync(pidPath);
|
|
744
165
|
}
|
|
745
|
-
catch {
|
|
746
|
-
|
|
166
|
+
catch (error) {
|
|
167
|
+
log.debug(`Failed to remove PID file: ${getErrorMessage(error)}`);
|
|
747
168
|
}
|
|
748
169
|
}
|
|
749
170
|
/**
|
|
750
171
|
* Write daemon PID to file for tracking.
|
|
172
|
+
*
|
|
173
|
+
* Uses AtomicFileWriter to prevent corruption from crashes during write,
|
|
174
|
+
* ensuring daemon.pid is never left in a truncated/corrupt state that
|
|
175
|
+
* would cause parseInt errors during cleanup.
|
|
751
176
|
*/
|
|
752
177
|
writePidFile() {
|
|
753
178
|
const pidPath = getSessionFilePath('DAEMON_PID');
|
|
754
179
|
try {
|
|
755
|
-
|
|
180
|
+
AtomicFileWriter.writeSync(pidPath, process.pid.toString(), { encoding: 'utf-8' });
|
|
756
181
|
releaseDaemonLock(); // Release lock after PID is written (P0 Fix #1)
|
|
757
182
|
console.error(`[daemon] PID file written: ${pidPath}`);
|
|
758
183
|
}
|
|
@@ -765,13 +190,16 @@ export class IPCServer {
|
|
|
765
190
|
*/
|
|
766
191
|
static isRunning() {
|
|
767
192
|
const pidPath = getSessionFilePath('DAEMON_PID');
|
|
193
|
+
const pid = readPidFromFile(pidPath);
|
|
194
|
+
if (pid === null) {
|
|
195
|
+
return false;
|
|
196
|
+
}
|
|
768
197
|
try {
|
|
769
|
-
const pid = parseInt(readFileSync(pidPath, 'utf-8').trim(), 10);
|
|
770
|
-
// Check if process is alive
|
|
771
198
|
process.kill(pid, 0);
|
|
772
199
|
return true;
|
|
773
200
|
}
|
|
774
|
-
catch {
|
|
201
|
+
catch (error) {
|
|
202
|
+
log.debug(`Process ${pid} not alive: ${getErrorMessage(error)}`);
|
|
775
203
|
return false;
|
|
776
204
|
}
|
|
777
205
|
}
|