browser-debugger-cli 0.0.1-alpha.0 → 0.1.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (421) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +167 -52
  3. package/dist/__testfixtures__/cdpMessages.d.ts +43 -0
  4. package/dist/__testfixtures__/cdpMessages.d.ts.map +1 -0
  5. package/dist/__testfixtures__/cdpMessages.js +118 -0
  6. package/dist/__testfixtures__/cdpMessages.js.map +1 -0
  7. package/dist/__testfixtures__/connectionTargets.d.ts +21 -0
  8. package/dist/__testfixtures__/connectionTargets.d.ts.map +1 -0
  9. package/dist/__testfixtures__/connectionTargets.js +59 -0
  10. package/dist/__testfixtures__/connectionTargets.js.map +1 -0
  11. package/dist/__tests__/integration/session-files.integration.test.d.ts +2 -0
  12. package/dist/__tests__/integration/session-files.integration.test.d.ts.map +1 -0
  13. package/dist/__tests__/integration/session-files.integration.test.js +66 -0
  14. package/dist/__tests__/integration/session-files.integration.test.js.map +1 -0
  15. package/dist/__testutils__/FakeClock.d.ts +67 -0
  16. package/dist/__testutils__/FakeClock.d.ts.map +1 -0
  17. package/dist/__testutils__/FakeClock.js +132 -0
  18. package/dist/__testutils__/FakeClock.js.map +1 -0
  19. package/dist/__testutils__/FakeWebSocket.d.ts +106 -0
  20. package/dist/__testutils__/FakeWebSocket.d.ts.map +1 -0
  21. package/dist/__testutils__/FakeWebSocket.js +213 -0
  22. package/dist/__testutils__/FakeWebSocket.js.map +1 -0
  23. package/dist/__testutils__/assertions.d.ts +33 -0
  24. package/dist/__testutils__/assertions.d.ts.map +1 -0
  25. package/dist/__testutils__/assertions.js +57 -0
  26. package/dist/__testutils__/assertions.js.map +1 -0
  27. package/dist/__testutils__/index.d.ts +15 -0
  28. package/dist/__testutils__/index.d.ts.map +1 -0
  29. package/dist/__testutils__/index.js +15 -0
  30. package/dist/__testutils__/index.js.map +1 -0
  31. package/dist/__testutils__/testClock.d.ts +28 -0
  32. package/dist/__testutils__/testClock.d.ts.map +1 -0
  33. package/dist/__testutils__/testClock.js +81 -0
  34. package/dist/__testutils__/testClock.js.map +1 -0
  35. package/dist/__testutils__/testFixtures.d.ts +15 -0
  36. package/dist/__testutils__/testFixtures.d.ts.map +1 -0
  37. package/dist/__testutils__/testFixtures.js +23 -0
  38. package/dist/__testutils__/testFixtures.js.map +1 -0
  39. package/dist/__testutils__/testProcess.d.ts +46 -0
  40. package/dist/__testutils__/testProcess.d.ts.map +1 -0
  41. package/dist/__testutils__/testProcess.js +77 -0
  42. package/dist/__testutils__/testProcess.js.map +1 -0
  43. package/dist/cli/collectors/dom.d.ts +8 -0
  44. package/dist/cli/collectors/dom.d.ts.map +1 -0
  45. package/dist/cli/collectors/dom.js +361 -0
  46. package/dist/cli/collectors/dom.js.map +1 -0
  47. package/dist/cli/collectors/helpers/domCache.d.ts +40 -0
  48. package/dist/cli/collectors/helpers/domCache.d.ts.map +1 -0
  49. package/dist/cli/collectors/helpers/domCache.js +79 -0
  50. package/dist/cli/collectors/helpers/domCache.js.map +1 -0
  51. package/dist/cli/collectors/helpers/domQuery.d.ts +45 -0
  52. package/dist/cli/collectors/helpers/domQuery.d.ts.map +1 -0
  53. package/dist/cli/collectors/helpers/domQuery.js +100 -0
  54. package/dist/cli/collectors/helpers/domQuery.js.map +1 -0
  55. package/dist/cli/collectors/helpers/selectorParser.d.ts +20 -0
  56. package/dist/cli/collectors/helpers/selectorParser.d.ts.map +1 -0
  57. package/dist/cli/collectors/helpers/selectorParser.js +20 -0
  58. package/dist/cli/collectors/helpers/selectorParser.js.map +1 -0
  59. package/dist/cli/commands/__tests__/cdp.contract.test.d.ts +24 -0
  60. package/dist/cli/commands/__tests__/cdp.contract.test.d.ts.map +1 -0
  61. package/dist/cli/commands/__tests__/cdp.contract.test.js +467 -0
  62. package/dist/cli/commands/__tests__/cdp.contract.test.js.map +1 -0
  63. package/dist/cli/commands/__tests__/ipcTest.test.d.ts +2 -0
  64. package/dist/cli/commands/__tests__/ipcTest.test.d.ts.map +1 -0
  65. package/dist/cli/commands/__tests__/ipcTest.test.js +37 -0
  66. package/dist/cli/commands/__tests__/ipcTest.test.js.map +1 -0
  67. package/dist/cli/commands/cdp.d.ts +8 -0
  68. package/dist/cli/commands/cdp.d.ts.map +1 -0
  69. package/dist/cli/commands/cdp.js +45 -0
  70. package/dist/cli/commands/cdp.js.map +1 -0
  71. package/dist/cli/commands/cleanup.d.ts +8 -0
  72. package/dist/cli/commands/cleanup.d.ts.map +1 -0
  73. package/dist/cli/commands/cleanup.js +130 -0
  74. package/dist/cli/commands/cleanup.js.map +1 -0
  75. package/dist/cli/commands/console.d.ts +8 -0
  76. package/dist/cli/commands/console.d.ts.map +1 -0
  77. package/dist/cli/commands/console.js +97 -0
  78. package/dist/cli/commands/console.js.map +1 -0
  79. package/dist/cli/commands/details.d.ts +8 -0
  80. package/dist/cli/commands/details.d.ts.map +1 -0
  81. package/dist/cli/commands/details.js +68 -0
  82. package/dist/cli/commands/details.js.map +1 -0
  83. package/dist/cli/commands/dom/helpers/domCache.d.ts +36 -0
  84. package/dist/cli/commands/dom/helpers/domCache.d.ts.map +1 -0
  85. package/dist/cli/commands/dom/helpers/domCache.js +65 -0
  86. package/dist/cli/commands/dom/helpers/domCache.js.map +1 -0
  87. package/dist/cli/commands/dom/helpers/domQuery.d.ts +48 -0
  88. package/dist/cli/commands/dom/helpers/domQuery.d.ts.map +1 -0
  89. package/dist/cli/commands/dom/helpers/domQuery.js +104 -0
  90. package/dist/cli/commands/dom/helpers/domQuery.js.map +1 -0
  91. package/dist/cli/commands/dom/helpers/errorHandler.d.ts +45 -0
  92. package/dist/cli/commands/dom/helpers/errorHandler.d.ts.map +1 -0
  93. package/dist/cli/commands/dom/helpers/errorHandler.js +70 -0
  94. package/dist/cli/commands/dom/helpers/errorHandler.js.map +1 -0
  95. package/dist/cli/commands/dom/helpers/evalHelpers.d.ts +52 -0
  96. package/dist/cli/commands/dom/helpers/evalHelpers.d.ts.map +1 -0
  97. package/dist/cli/commands/dom/helpers/evalHelpers.js +75 -0
  98. package/dist/cli/commands/dom/helpers/evalHelpers.js.map +1 -0
  99. package/dist/cli/commands/dom/helpers/optionsBuilder.d.ts +35 -0
  100. package/dist/cli/commands/dom/helpers/optionsBuilder.d.ts.map +1 -0
  101. package/dist/cli/commands/dom/helpers/optionsBuilder.js +51 -0
  102. package/dist/cli/commands/dom/helpers/optionsBuilder.js.map +1 -0
  103. package/dist/cli/commands/dom/helpers/selectorParser.d.ts +20 -0
  104. package/dist/cli/commands/dom/helpers/selectorParser.d.ts.map +1 -0
  105. package/dist/cli/commands/dom/helpers/selectorParser.js +20 -0
  106. package/dist/cli/commands/dom/helpers/selectorParser.js.map +1 -0
  107. package/dist/cli/commands/dom/index.d.ts +8 -0
  108. package/dist/cli/commands/dom/index.d.ts.map +1 -0
  109. package/dist/cli/commands/dom/index.js +257 -0
  110. package/dist/cli/commands/dom/index.js.map +1 -0
  111. package/dist/cli/commands/ipcTest.d.ts +23 -0
  112. package/dist/cli/commands/ipcTest.d.ts.map +1 -0
  113. package/dist/cli/commands/ipcTest.js +181 -0
  114. package/dist/cli/commands/ipcTest.js.map +1 -0
  115. package/dist/cli/commands/network.d.ts +8 -0
  116. package/dist/cli/commands/network.d.ts.map +1 -0
  117. package/dist/cli/commands/network.js +40 -0
  118. package/dist/cli/commands/network.js.map +1 -0
  119. package/dist/cli/commands/peek.d.ts +8 -0
  120. package/dist/cli/commands/peek.d.ts.map +1 -0
  121. package/dist/cli/commands/peek.js +109 -0
  122. package/dist/cli/commands/peek.js.map +1 -0
  123. package/dist/cli/commands/query.d.ts +9 -0
  124. package/dist/cli/commands/query.d.ts.map +1 -0
  125. package/dist/cli/commands/query.js +127 -0
  126. package/dist/cli/commands/query.js.map +1 -0
  127. package/dist/cli/commands/start.d.ts +9 -0
  128. package/dist/cli/commands/start.d.ts.map +1 -0
  129. package/dist/cli/commands/start.js +78 -0
  130. package/dist/cli/commands/start.js.map +1 -0
  131. package/dist/cli/commands/status.d.ts +9 -0
  132. package/dist/cli/commands/status.d.ts.map +1 -0
  133. package/dist/cli/commands/status.js +84 -0
  134. package/dist/cli/commands/status.js.map +1 -0
  135. package/dist/cli/commands/stop.d.ts +8 -0
  136. package/dist/cli/commands/stop.d.ts.map +1 -0
  137. package/dist/cli/commands/stop.js +146 -0
  138. package/dist/cli/commands/stop.js.map +1 -0
  139. package/dist/cli/formatters/detailsFormatter.d.ts +10 -0
  140. package/dist/cli/formatters/detailsFormatter.d.ts.map +1 -0
  141. package/dist/cli/formatters/detailsFormatter.js +63 -0
  142. package/dist/cli/formatters/detailsFormatter.js.map +1 -0
  143. package/dist/cli/formatters/previewFormatter.d.ts +27 -0
  144. package/dist/cli/formatters/previewFormatter.d.ts.map +1 -0
  145. package/dist/cli/formatters/previewFormatter.js +160 -0
  146. package/dist/cli/formatters/previewFormatter.js.map +1 -0
  147. package/dist/cli/formatters/statusFormatter.d.ts +34 -0
  148. package/dist/cli/formatters/statusFormatter.d.ts.map +1 -0
  149. package/dist/cli/formatters/statusFormatter.js +108 -0
  150. package/dist/cli/formatters/statusFormatter.js.map +1 -0
  151. package/dist/cli/handlers/ChromeBootstrap.d.ts +24 -0
  152. package/dist/cli/handlers/ChromeBootstrap.d.ts.map +1 -0
  153. package/dist/cli/handlers/ChromeBootstrap.js +50 -0
  154. package/dist/cli/handlers/ChromeBootstrap.js.map +1 -0
  155. package/dist/cli/handlers/CommandRunner.d.ts +60 -0
  156. package/dist/cli/handlers/CommandRunner.d.ts.map +1 -0
  157. package/dist/cli/handlers/CommandRunner.js +81 -0
  158. package/dist/cli/handlers/CommandRunner.js.map +1 -0
  159. package/dist/cli/handlers/OutputBuilder.d.ts +60 -0
  160. package/dist/cli/handlers/OutputBuilder.d.ts.map +1 -0
  161. package/dist/cli/handlers/OutputBuilder.js +138 -0
  162. package/dist/cli/handlers/OutputBuilder.js.map +1 -0
  163. package/dist/cli/handlers/OutputWriter.d.ts +15 -0
  164. package/dist/cli/handlers/OutputWriter.d.ts.map +1 -0
  165. package/dist/cli/handlers/OutputWriter.js +34 -0
  166. package/dist/cli/handlers/OutputWriter.js.map +1 -0
  167. package/dist/cli/handlers/PreviewWriter.d.ts +52 -0
  168. package/dist/cli/handlers/PreviewWriter.d.ts.map +1 -0
  169. package/dist/cli/handlers/PreviewWriter.js +119 -0
  170. package/dist/cli/handlers/PreviewWriter.js.map +1 -0
  171. package/dist/cli/handlers/SessionLock.d.ts +16 -0
  172. package/dist/cli/handlers/SessionLock.d.ts.map +1 -0
  173. package/dist/cli/handlers/SessionLock.js +38 -0
  174. package/dist/cli/handlers/SessionLock.js.map +1 -0
  175. package/dist/cli/handlers/SessionLoop.d.ts +19 -0
  176. package/dist/cli/handlers/SessionLoop.d.ts.map +1 -0
  177. package/dist/cli/handlers/SessionLoop.js +47 -0
  178. package/dist/cli/handlers/SessionLoop.js.map +1 -0
  179. package/dist/cli/handlers/ShutdownController.d.ts +38 -0
  180. package/dist/cli/handlers/ShutdownController.d.ts.map +1 -0
  181. package/dist/cli/handlers/ShutdownController.js +83 -0
  182. package/dist/cli/handlers/ShutdownController.js.map +1 -0
  183. package/dist/cli/handlers/SignalHandler.d.ts +35 -0
  184. package/dist/cli/handlers/SignalHandler.d.ts.map +1 -0
  185. package/dist/cli/handlers/SignalHandler.js +81 -0
  186. package/dist/cli/handlers/SignalHandler.js.map +1 -0
  187. package/dist/cli/handlers/TargetSetup.d.ts +42 -0
  188. package/dist/cli/handlers/TargetSetup.d.ts.map +1 -0
  189. package/dist/cli/handlers/TargetSetup.js +87 -0
  190. package/dist/cli/handlers/TargetSetup.js.map +1 -0
  191. package/dist/cli/handlers/commonOptions.d.ts +54 -0
  192. package/dist/cli/handlers/commonOptions.d.ts.map +1 -0
  193. package/dist/cli/handlers/commonOptions.js +64 -0
  194. package/dist/cli/handlers/commonOptions.js.map +1 -0
  195. package/dist/cli/handlers/daemonSessionController.d.ts +23 -0
  196. package/dist/cli/handlers/daemonSessionController.d.ts.map +1 -0
  197. package/dist/cli/handlers/daemonSessionController.js +108 -0
  198. package/dist/cli/handlers/daemonSessionController.js.map +1 -0
  199. package/dist/cli/handlers/sessionController.d.ts +21 -0
  200. package/dist/cli/handlers/sessionController.d.ts.map +1 -0
  201. package/dist/cli/handlers/sessionController.js +55 -0
  202. package/dist/cli/handlers/sessionController.js.map +1 -0
  203. package/dist/cli/registry.d.ts +11 -0
  204. package/dist/cli/registry.d.ts.map +1 -0
  205. package/dist/cli/registry.js +46 -0
  206. package/dist/cli/registry.js.map +1 -0
  207. package/dist/collectors/__tests__/network.contract.test.d.ts +28 -0
  208. package/dist/collectors/__tests__/network.contract.test.d.ts.map +1 -0
  209. package/dist/collectors/__tests__/network.contract.test.js +525 -0
  210. package/dist/collectors/__tests__/network.contract.test.js.map +1 -0
  211. package/dist/collectors/console.d.ts +5 -3
  212. package/dist/collectors/console.d.ts.map +1 -1
  213. package/dist/collectors/console.js +48 -26
  214. package/dist/collectors/console.js.map +1 -1
  215. package/dist/collectors/dom.d.ts +2 -2
  216. package/dist/collectors/dom.d.ts.map +1 -1
  217. package/dist/collectors/dom.js +23 -12
  218. package/dist/collectors/dom.js.map +1 -1
  219. package/dist/collectors/network.d.ts +18 -4
  220. package/dist/collectors/network.d.ts.map +1 -1
  221. package/dist/collectors/network.js +111 -34
  222. package/dist/collectors/network.js.map +1 -1
  223. package/dist/connection/__tests__/cdp.contract.test.d.ts +16 -0
  224. package/dist/connection/__tests__/cdp.contract.test.d.ts.map +1 -0
  225. package/dist/connection/__tests__/cdp.contract.test.js +378 -0
  226. package/dist/connection/__tests__/cdp.contract.test.js.map +1 -0
  227. package/dist/connection/__tests__/finder.contract.test.d.ts +2 -0
  228. package/dist/connection/__tests__/finder.contract.test.d.ts.map +1 -0
  229. package/dist/connection/__tests__/finder.contract.test.js +239 -0
  230. package/dist/connection/__tests__/finder.contract.test.js.map +1 -0
  231. package/dist/connection/__tests__/tabs.contract.test.d.ts +2 -0
  232. package/dist/connection/__tests__/tabs.contract.test.d.ts.map +1 -0
  233. package/dist/connection/__tests__/tabs.contract.test.js +137 -0
  234. package/dist/connection/__tests__/tabs.contract.test.js.map +1 -0
  235. package/dist/connection/cdp.d.ts +165 -16
  236. package/dist/connection/cdp.d.ts.map +1 -1
  237. package/dist/connection/cdp.js +342 -122
  238. package/dist/connection/cdp.js.map +1 -1
  239. package/dist/connection/finder.d.ts +5 -4
  240. package/dist/connection/finder.d.ts.map +1 -1
  241. package/dist/connection/finder.js +10 -16
  242. package/dist/connection/finder.js.map +1 -1
  243. package/dist/connection/launcher.d.ts +18 -11
  244. package/dist/connection/launcher.d.ts.map +1 -1
  245. package/dist/connection/launcher.js +148 -82
  246. package/dist/connection/launcher.js.map +1 -1
  247. package/dist/connection/tabs.d.ts +47 -14
  248. package/dist/connection/tabs.d.ts.map +1 -1
  249. package/dist/connection/tabs.js +493 -132
  250. package/dist/connection/tabs.js.map +1 -1
  251. package/dist/constants.d.ts +209 -0
  252. package/dist/constants.d.ts.map +1 -0
  253. package/dist/constants.js +232 -0
  254. package/dist/constants.js.map +1 -0
  255. package/dist/daemon/__tests__/ipcServer.contract.test.d.ts +23 -0
  256. package/dist/daemon/__tests__/ipcServer.contract.test.d.ts.map +1 -0
  257. package/dist/daemon/__tests__/ipcServer.contract.test.js +401 -0
  258. package/dist/daemon/__tests__/ipcServer.contract.test.js.map +1 -0
  259. package/dist/daemon/__tests__/launcher.unit.test.d.ts +8 -0
  260. package/dist/daemon/__tests__/launcher.unit.test.d.ts.map +1 -0
  261. package/dist/daemon/__tests__/launcher.unit.test.js +20 -0
  262. package/dist/daemon/__tests__/launcher.unit.test.js.map +1 -0
  263. package/dist/daemon/ipcServer.d.ts +83 -0
  264. package/dist/daemon/ipcServer.d.ts.map +1 -0
  265. package/dist/daemon/ipcServer.js +670 -0
  266. package/dist/daemon/ipcServer.js.map +1 -0
  267. package/dist/daemon/launcher.d.ts +31 -0
  268. package/dist/daemon/launcher.d.ts.map +1 -0
  269. package/dist/daemon/launcher.js +137 -0
  270. package/dist/daemon/launcher.js.map +1 -0
  271. package/dist/daemon/startSession.d.ts +51 -0
  272. package/dist/daemon/startSession.d.ts.map +1 -0
  273. package/dist/daemon/startSession.js +149 -0
  274. package/dist/daemon/startSession.js.map +1 -0
  275. package/dist/daemon/worker.d.ts +18 -0
  276. package/dist/daemon/worker.d.ts.map +1 -0
  277. package/dist/daemon/worker.js +623 -0
  278. package/dist/daemon/worker.js.map +1 -0
  279. package/dist/daemon/workerIpc.d.ts +33 -0
  280. package/dist/daemon/workerIpc.d.ts.map +1 -0
  281. package/dist/daemon/workerIpc.js +8 -0
  282. package/dist/daemon/workerIpc.js.map +1 -0
  283. package/dist/daemon.d.ts +10 -0
  284. package/dist/daemon.d.ts.map +1 -0
  285. package/dist/daemon.js +32 -0
  286. package/dist/daemon.js.map +1 -0
  287. package/dist/index.js +41 -420
  288. package/dist/index.js.map +1 -1
  289. package/dist/ipc/__tests__/client.contract.test.d.ts +23 -0
  290. package/dist/ipc/__tests__/client.contract.test.d.ts.map +1 -0
  291. package/dist/ipc/__tests__/client.contract.test.js +466 -0
  292. package/dist/ipc/__tests__/client.contract.test.js.map +1 -0
  293. package/dist/ipc/client.d.ts +109 -0
  294. package/dist/ipc/client.d.ts.map +1 -0
  295. package/dist/ipc/client.js +220 -0
  296. package/dist/ipc/client.js.map +1 -0
  297. package/dist/ipc/commands.d.ts +208 -0
  298. package/dist/ipc/commands.d.ts.map +1 -0
  299. package/dist/ipc/commands.js +69 -0
  300. package/dist/ipc/commands.js.map +1 -0
  301. package/dist/ipc/responseValidator.d.ts +40 -0
  302. package/dist/ipc/responseValidator.d.ts.map +1 -0
  303. package/dist/ipc/responseValidator.js +28 -0
  304. package/dist/ipc/responseValidator.js.map +1 -0
  305. package/dist/ipc/types.d.ts +193 -0
  306. package/dist/ipc/types.d.ts.map +1 -0
  307. package/dist/ipc/types.js +21 -0
  308. package/dist/ipc/types.js.map +1 -0
  309. package/dist/session/BdgSession.d.ts +71 -4
  310. package/dist/session/BdgSession.d.ts.map +1 -1
  311. package/dist/session/BdgSession.js +173 -75
  312. package/dist/session/BdgSession.js.map +1 -1
  313. package/dist/session/chrome.d.ts +46 -0
  314. package/dist/session/chrome.d.ts.map +1 -0
  315. package/dist/session/chrome.js +92 -0
  316. package/dist/session/chrome.js.map +1 -0
  317. package/dist/session/cleanup.d.ts +45 -0
  318. package/dist/session/cleanup.d.ts.map +1 -0
  319. package/dist/session/cleanup.js +230 -0
  320. package/dist/session/cleanup.js.map +1 -0
  321. package/dist/session/index.d.ts +15 -0
  322. package/dist/session/index.d.ts.map +1 -0
  323. package/dist/session/index.js +23 -0
  324. package/dist/session/index.js.map +1 -0
  325. package/dist/session/lock.d.ts +57 -0
  326. package/dist/session/lock.d.ts.map +1 -0
  327. package/dist/session/lock.js +154 -0
  328. package/dist/session/lock.js.map +1 -0
  329. package/dist/session/metadata.d.ts +59 -0
  330. package/dist/session/metadata.d.ts.map +1 -0
  331. package/dist/session/metadata.js +71 -0
  332. package/dist/session/metadata.js.map +1 -0
  333. package/dist/session/output.d.ts +18 -0
  334. package/dist/session/output.d.ts.map +1 -0
  335. package/dist/session/output.js +24 -0
  336. package/dist/session/output.js.map +1 -0
  337. package/dist/session/paths.d.ts +73 -0
  338. package/dist/session/paths.d.ts.map +1 -0
  339. package/dist/session/paths.js +84 -0
  340. package/dist/session/paths.js.map +1 -0
  341. package/dist/session/pid.d.ts +40 -0
  342. package/dist/session/pid.d.ts.map +1 -0
  343. package/dist/session/pid.js +73 -0
  344. package/dist/session/pid.js.map +1 -0
  345. package/dist/session/process.d.ts +45 -0
  346. package/dist/session/process.d.ts.map +1 -0
  347. package/dist/session/process.js +88 -0
  348. package/dist/session/process.js.map +1 -0
  349. package/dist/types.d.ts +114 -38
  350. package/dist/types.d.ts.map +1 -1
  351. package/dist/utils/__tests__/filters.unit.test.d.ts +2 -0
  352. package/dist/utils/__tests__/filters.unit.test.d.ts.map +1 -0
  353. package/dist/utils/__tests__/filters.unit.test.js +239 -0
  354. package/dist/utils/__tests__/filters.unit.test.js.map +1 -0
  355. package/dist/utils/__tests__/session.contract.test.d.ts +2 -0
  356. package/dist/utils/__tests__/session.contract.test.d.ts.map +1 -0
  357. package/dist/utils/__tests__/session.contract.test.js +234 -0
  358. package/dist/utils/__tests__/session.contract.test.js.map +1 -0
  359. package/dist/utils/atomicFile.d.ts +38 -0
  360. package/dist/utils/atomicFile.d.ts.map +1 -0
  361. package/dist/utils/atomicFile.js +71 -0
  362. package/dist/utils/atomicFile.js.map +1 -0
  363. package/dist/utils/cdpHandlers.d.ts +31 -0
  364. package/dist/utils/cdpHandlers.d.ts.map +1 -0
  365. package/dist/utils/cdpHandlers.js +38 -0
  366. package/dist/utils/cdpHandlers.js.map +1 -0
  367. package/dist/utils/chromeDiagnostics.d.ts +28 -0
  368. package/dist/utils/chromeDiagnostics.d.ts.map +1 -0
  369. package/dist/utils/chromeDiagnostics.js +88 -0
  370. package/dist/utils/chromeDiagnostics.js.map +1 -0
  371. package/dist/utils/errors.d.ts +82 -0
  372. package/dist/utils/errors.d.ts.map +1 -0
  373. package/dist/utils/errors.js +88 -0
  374. package/dist/utils/errors.js.map +1 -0
  375. package/dist/utils/exitCodes.d.ts +32 -0
  376. package/dist/utils/exitCodes.d.ts.map +1 -0
  377. package/dist/utils/exitCodes.js +36 -0
  378. package/dist/utils/exitCodes.js.map +1 -0
  379. package/dist/utils/filters.d.ts +108 -0
  380. package/dist/utils/filters.d.ts.map +1 -0
  381. package/dist/utils/filters.js +304 -0
  382. package/dist/utils/filters.js.map +1 -0
  383. package/dist/utils/formatters/network.d.ts +23 -0
  384. package/dist/utils/formatters/network.d.ts.map +1 -0
  385. package/dist/utils/formatters/network.js +35 -0
  386. package/dist/utils/formatters/network.js.map +1 -0
  387. package/dist/utils/http.d.ts +34 -0
  388. package/dist/utils/http.d.ts.map +1 -0
  389. package/dist/utils/http.js +48 -0
  390. package/dist/utils/http.js.map +1 -0
  391. package/dist/utils/logger.d.ts +42 -0
  392. package/dist/utils/logger.d.ts.map +1 -0
  393. package/dist/utils/logger.js +43 -0
  394. package/dist/utils/logger.js.map +1 -0
  395. package/dist/utils/objects.d.ts +23 -0
  396. package/dist/utils/objects.d.ts.map +1 -0
  397. package/dist/utils/objects.js +25 -0
  398. package/dist/utils/objects.js.map +1 -0
  399. package/dist/utils/url/safeParseUrl.d.ts +63 -0
  400. package/dist/utils/url/safeParseUrl.d.ts.map +1 -0
  401. package/dist/utils/url/safeParseUrl.js +84 -0
  402. package/dist/utils/url/safeParseUrl.js.map +1 -0
  403. package/dist/utils/url.d.ts +63 -1
  404. package/dist/utils/url.d.ts.map +1 -1
  405. package/dist/utils/url.js +152 -2
  406. package/dist/utils/url.js.map +1 -1
  407. package/dist/utils/validation.d.ts +1 -1
  408. package/dist/utils/validation.d.ts.map +1 -1
  409. package/dist/utils/version.d.ts +3 -0
  410. package/dist/utils/version.d.ts.map +1 -0
  411. package/dist/utils/version.js +27 -0
  412. package/dist/utils/version.js.map +1 -0
  413. package/package.json +57 -10
  414. package/dist/utils/pageLoad.d.ts +0 -21
  415. package/dist/utils/pageLoad.d.ts.map +0 -1
  416. package/dist/utils/pageLoad.js +0 -85
  417. package/dist/utils/pageLoad.js.map +0 -1
  418. package/dist/utils/session.d.ts +0 -104
  419. package/dist/utils/session.d.ts.map +0 -1
  420. package/dist/utils/session.js +0 -244
  421. package/dist/utils/session.js.map +0 -1
@@ -0,0 +1,623 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Worker Process - Chrome CDP Session Manager
4
+ *
5
+ * This process:
6
+ * 1. Spawns Chrome with remote debugging enabled
7
+ * 2. Connects to Chrome via CDP WebSocket
8
+ * 3. Activates requested collectors (network, console, DOM)
9
+ * 4. Sends readiness signal to parent daemon
10
+ * 5. Handles graceful shutdown on SIGTERM/SIGKILL
11
+ *
12
+ * Communication Protocol:
13
+ * - Parent provides config via env vars or process.argv
14
+ * - Worker sends JSON line to stdout on success: \{"type":"worker_ready",...\}
15
+ * - Worker handles SIGTERM for graceful shutdown
16
+ */
17
+ import { writeQueryCache, getNodeIdByIndex } from '../cli/commands/dom/helpers/domCache.js';
18
+ import { queryBySelector, getNodeInfo, createNodePreview, } from '../cli/commands/dom/helpers/domQuery.js';
19
+ import { startConsoleCollection } from '../collectors/console.js';
20
+ import { prepareDOMCollection, collectDOM } from '../collectors/dom.js';
21
+ import { startNetworkCollection } from '../collectors/network.js';
22
+ import { CDPConnection } from '../connection/cdp.js';
23
+ import { launchChrome } from '../connection/launcher.js';
24
+ import { writeSessionMetadata } from '../session/metadata.js';
25
+ import { writeSessionOutput } from '../session/output.js';
26
+ import { writePid } from '../session/pid.js';
27
+ import { getErrorMessage } from '../utils/errors.js';
28
+ import { fetchCDPTargets } from '../utils/http.js';
29
+ import { normalizeUrl } from '../utils/url.js';
30
+ import { VERSION } from '../utils/version.js';
31
+ /**
32
+ * Color presets for highlight overlay
33
+ */
34
+ const HIGHLIGHT_COLORS = {
35
+ red: { r: 255, g: 0, b: 0, a: 0.5 },
36
+ blue: { r: 0, g: 0, b: 255, a: 0.5 },
37
+ green: { r: 0, g: 255, b: 0, a: 0.5 },
38
+ yellow: { r: 255, g: 255, b: 0, a: 0.5 },
39
+ orange: { r: 255, g: 165, b: 0, a: 0.5 },
40
+ purple: { r: 128, g: 0, b: 128, a: 0.5 },
41
+ };
42
+ // Global state for cleanup
43
+ let chrome = null;
44
+ let cdp = null;
45
+ let cleanupFunctions = [];
46
+ // Collector data storage
47
+ const networkRequests = [];
48
+ const consoleMessages = [];
49
+ let domData = null;
50
+ // Session metadata
51
+ let sessionStartTime = Date.now();
52
+ let targetInfo = null;
53
+ let activeCollectors = [];
54
+ /**
55
+ * Parse worker configuration from environment variables or argv.
56
+ */
57
+ function parseWorkerConfig() {
58
+ // For MVP: parse from argv (future: could use env vars or stdin)
59
+ const args = process.argv.slice(2);
60
+ if (args.length === 0) {
61
+ throw new Error('Worker requires configuration arguments');
62
+ }
63
+ // Parse simple JSON config from first argument
64
+ try {
65
+ const configArg = args[0];
66
+ if (!configArg) {
67
+ throw new Error('Missing configuration argument');
68
+ }
69
+ const config = JSON.parse(configArg);
70
+ return {
71
+ url: config.url,
72
+ port: config.port ?? 9222,
73
+ timeout: config.timeout ?? undefined,
74
+ collectors: config.collectors ?? ['network', 'console', 'dom'],
75
+ includeAll: config.includeAll ?? false,
76
+ userDataDir: config.userDataDir ?? undefined,
77
+ maxBodySize: config.maxBodySize ?? undefined,
78
+ };
79
+ }
80
+ catch (error) {
81
+ throw new Error(`Failed to parse worker config: ${getErrorMessage(error)}`);
82
+ }
83
+ }
84
+ /**
85
+ * Activate collectors based on configuration.
86
+ */
87
+ async function activateCollectors(config) {
88
+ if (!cdp) {
89
+ throw new Error('CDP connection not initialized');
90
+ }
91
+ activeCollectors = config.collectors ?? ['network', 'console', 'dom'];
92
+ for (const collector of activeCollectors) {
93
+ console.error(`[worker] Activating ${collector} collector`);
94
+ switch (collector) {
95
+ case 'network':
96
+ {
97
+ const networkOptions = {
98
+ includeAll: config.includeAll ?? false,
99
+ ...(config.maxBodySize !== undefined && { maxBodySize: config.maxBodySize }),
100
+ };
101
+ const cleanup = await startNetworkCollection(cdp, networkRequests, networkOptions);
102
+ cleanupFunctions.push(cleanup);
103
+ }
104
+ break;
105
+ case 'console':
106
+ {
107
+ const cleanup = await startConsoleCollection(cdp, consoleMessages, config.includeAll ?? false);
108
+ cleanupFunctions.push(cleanup);
109
+ }
110
+ break;
111
+ case 'dom':
112
+ {
113
+ const cleanup = await prepareDOMCollection(cdp);
114
+ cleanupFunctions.push(cleanup);
115
+ }
116
+ break;
117
+ }
118
+ }
119
+ console.error(`[worker] All collectors activated: ${activeCollectors.join(', ')}`);
120
+ }
121
+ /**
122
+ * Command handler registry - maps command names to their business logic.
123
+ */
124
+ const commandHandlers = {
125
+ /**
126
+ * DOM Query Handler - Find elements by CSS selector
127
+ */
128
+ dom_query: async (cdp, params) => {
129
+ // Ensure DOM is enabled
130
+ await cdp.send('DOM.enable');
131
+ // Query elements
132
+ const nodeIds = await queryBySelector(cdp, params.selector);
133
+ // Get information for each node
134
+ const nodes = [];
135
+ for (let i = 0; i < nodeIds.length; i++) {
136
+ const nodeId = nodeIds[i];
137
+ if (nodeId === undefined)
138
+ continue;
139
+ const nodeInfo = await getNodeInfo(cdp, nodeId);
140
+ nodes.push({
141
+ index: i + 1,
142
+ nodeId: nodeInfo.nodeId,
143
+ ...(nodeInfo.tag !== undefined && { tag: nodeInfo.tag }),
144
+ ...(nodeInfo.classes !== undefined && { classes: nodeInfo.classes }),
145
+ preview: createNodePreview(nodeInfo),
146
+ });
147
+ }
148
+ // Write cache for index-based lookups
149
+ writeQueryCache({
150
+ selector: params.selector,
151
+ timestamp: new Date().toISOString(),
152
+ nodes,
153
+ });
154
+ return {
155
+ selector: params.selector,
156
+ count: nodes.length,
157
+ nodes,
158
+ };
159
+ },
160
+ /**
161
+ * DOM Highlight Handler - Highlight elements in browser
162
+ */
163
+ dom_highlight: async (cdp, params) => {
164
+ // Ensure DOM and Overlay are enabled
165
+ await cdp.send('DOM.enable');
166
+ await cdp.send('Overlay.enable');
167
+ let nodeIds = [];
168
+ // Direct nodeId provided
169
+ if (params.nodeId !== undefined) {
170
+ nodeIds = [params.nodeId];
171
+ }
172
+ else if (params.index !== undefined) {
173
+ // Look up nodeId from cache
174
+ const nodeId = getNodeIdByIndex(params.index);
175
+ if (!nodeId) {
176
+ throw new Error(`No cached element at index ${params.index}. Run 'bdg dom query <selector>' first.`);
177
+ }
178
+ nodeIds = [nodeId];
179
+ }
180
+ else if (params.selector) {
181
+ // Query by selector
182
+ nodeIds = await queryBySelector(cdp, params.selector);
183
+ if (nodeIds.length === 0) {
184
+ throw new Error(`No elements found matching "${params.selector}"`);
185
+ }
186
+ // Apply selector filters
187
+ if (params.first) {
188
+ const firstNode = nodeIds[0];
189
+ if (firstNode === undefined) {
190
+ throw new Error('No elements found');
191
+ }
192
+ nodeIds = [firstNode];
193
+ }
194
+ else if (params.nth !== undefined) {
195
+ if (params.nth < 1 || params.nth > nodeIds.length) {
196
+ throw new Error(`--nth ${params.nth} out of range (found ${nodeIds.length} elements)`);
197
+ }
198
+ const nthNode = nodeIds[params.nth - 1];
199
+ if (nthNode === undefined) {
200
+ throw new Error(`Element at index ${params.nth} not found`);
201
+ }
202
+ nodeIds = [nthNode];
203
+ }
204
+ }
205
+ else {
206
+ throw new Error('Either selector, index, or nodeId must be provided');
207
+ }
208
+ // Prepare highlight color
209
+ const colorName = (params.color ?? 'red');
210
+ const color = HIGHLIGHT_COLORS[colorName] ?? HIGHLIGHT_COLORS.red;
211
+ const opacity = params.opacity ?? color.a;
212
+ // Highlight each node
213
+ for (const nodeId of nodeIds) {
214
+ await cdp.send('Overlay.highlightNode', {
215
+ highlightConfig: {
216
+ contentColor: { ...color, a: opacity },
217
+ },
218
+ nodeId,
219
+ });
220
+ }
221
+ return {
222
+ highlighted: nodeIds.length,
223
+ nodeIds,
224
+ };
225
+ },
226
+ /**
227
+ * DOM Get Handler - Get full HTML and attributes for elements
228
+ */
229
+ dom_get: async (cdp, params) => {
230
+ // Ensure DOM is enabled
231
+ await cdp.send('DOM.enable');
232
+ let nodeIds = [];
233
+ // Direct nodeId provided
234
+ if (params.nodeId !== undefined) {
235
+ nodeIds = [params.nodeId];
236
+ }
237
+ else if (params.index !== undefined) {
238
+ // Look up nodeId from cache
239
+ const nodeId = getNodeIdByIndex(params.index);
240
+ if (!nodeId) {
241
+ throw new Error(`No cached element at index ${params.index}. Run 'bdg dom query <selector>' first.`);
242
+ }
243
+ nodeIds = [nodeId];
244
+ }
245
+ else if (params.selector) {
246
+ // Query by selector
247
+ nodeIds = await queryBySelector(cdp, params.selector);
248
+ if (nodeIds.length === 0) {
249
+ throw new Error(`No elements found matching "${params.selector}"`);
250
+ }
251
+ // Apply selector filters
252
+ if (params.nth !== undefined) {
253
+ if (params.nth < 1 || params.nth > nodeIds.length) {
254
+ throw new Error(`--nth ${params.nth} out of range (found ${nodeIds.length} elements)`);
255
+ }
256
+ const nthNode = nodeIds[params.nth - 1];
257
+ if (nthNode === undefined) {
258
+ throw new Error(`Element at index ${params.nth} not found`);
259
+ }
260
+ nodeIds = [nthNode];
261
+ }
262
+ else if (!params.all) {
263
+ // Default: first match only
264
+ const firstNode = nodeIds[0];
265
+ if (firstNode === undefined) {
266
+ throw new Error('No elements found');
267
+ }
268
+ nodeIds = [firstNode];
269
+ }
270
+ }
271
+ else {
272
+ throw new Error('Either selector, index, or nodeId must be provided');
273
+ }
274
+ // Get information for each node
275
+ const nodes = [];
276
+ for (const nodeId of nodeIds) {
277
+ const info = await getNodeInfo(cdp, nodeId);
278
+ nodes.push({
279
+ nodeId: info.nodeId,
280
+ ...(info.tag !== undefined && { tag: info.tag }),
281
+ ...(info.attributes !== undefined && { attributes: info.attributes }),
282
+ ...(info.classes !== undefined && { classes: info.classes }),
283
+ ...(info.outerHTML !== undefined && { outerHTML: info.outerHTML }),
284
+ });
285
+ }
286
+ return {
287
+ nodes,
288
+ };
289
+ },
290
+ /**
291
+ * Worker Peek Handler - Return lightweight preview of collected data
292
+ */
293
+ worker_peek: async (_cdp, params) => {
294
+ const lastN = Math.min(params.lastN ?? 10, 100); // Cap at 100
295
+ const duration = Date.now() - sessionStartTime;
296
+ // Get last N items (slice from end)
297
+ const recentNetwork = networkRequests.slice(-lastN).map((req) => ({
298
+ requestId: req.requestId,
299
+ timestamp: req.timestamp,
300
+ method: req.method,
301
+ url: req.url,
302
+ ...(req.status !== undefined && { status: req.status }),
303
+ ...(req.mimeType !== undefined && { mimeType: req.mimeType }),
304
+ }));
305
+ const recentConsole = consoleMessages.slice(-lastN).map((msg) => ({
306
+ timestamp: msg.timestamp,
307
+ type: msg.type,
308
+ text: msg.text,
309
+ }));
310
+ // Return as resolved Promise to satisfy async handler contract
311
+ return Promise.resolve({
312
+ version: VERSION,
313
+ startTime: sessionStartTime,
314
+ duration,
315
+ target: {
316
+ url: targetInfo?.url ?? '',
317
+ title: targetInfo?.title ?? '',
318
+ },
319
+ activeCollectors,
320
+ network: recentNetwork,
321
+ console: recentConsole,
322
+ });
323
+ },
324
+ /**
325
+ * Worker Details Handler - Return full object for specific item
326
+ */
327
+ worker_details: async (_cdp, params) => {
328
+ if (params.itemType === 'network') {
329
+ const request = networkRequests.find((r) => r.requestId === params.id);
330
+ if (!request) {
331
+ return Promise.reject(new Error(`Network request not found: ${params.id}`));
332
+ }
333
+ return Promise.resolve({ item: request });
334
+ }
335
+ else if (params.itemType === 'console') {
336
+ const index = parseInt(params.id, 10);
337
+ if (isNaN(index) || index < 0 || index >= consoleMessages.length) {
338
+ return Promise.reject(new Error(`Console message not found at index: ${params.id} (available: 0-${consoleMessages.length - 1})`));
339
+ }
340
+ return Promise.resolve({ item: consoleMessages[index] });
341
+ }
342
+ // Unreachable due to type narrowing, but TypeScript doesn't see it
343
+ return Promise.reject(new Error(`Unknown itemType: ${String(params.itemType)}. Expected 'network' or 'console'.`));
344
+ },
345
+ /**
346
+ * CDP Call Handler - Execute arbitrary CDP method
347
+ */
348
+ cdp_call: async (cdp, params) => {
349
+ // Execute CDP method with provided parameters
350
+ const result = await cdp.send(params.method, params.params ?? {});
351
+ return { result };
352
+ },
353
+ };
354
+ /**
355
+ * Handle incoming IPC message from daemon via stdin.
356
+ */
357
+ async function handleWorkerIPC(message) {
358
+ const commandName = message.type.replace('_request', '');
359
+ const handler = commandHandlers[commandName];
360
+ if (!handler) {
361
+ console.error(`[worker] Unknown command: ${commandName}`);
362
+ return;
363
+ }
364
+ console.error(`[worker] Handling ${commandName}_request`);
365
+ try {
366
+ if (!cdp)
367
+ throw new Error('CDP connection not initialized');
368
+ // Extract params by removing IPC metadata fields
369
+ const { type: _type, requestId: _requestId, ...params } = message;
370
+ // Call handler with properly typed params
371
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument
372
+ const data = await handler(cdp, params);
373
+ const response = {
374
+ type: `${commandName}_response`,
375
+ requestId: message.requestId,
376
+ success: true,
377
+ data,
378
+ };
379
+ console.log(JSON.stringify(response));
380
+ console.error(`[worker] Sent ${commandName}_response (success)`);
381
+ }
382
+ catch (error) {
383
+ const response = {
384
+ type: `${commandName}_response`,
385
+ requestId: message.requestId,
386
+ success: false,
387
+ error: getErrorMessage(error),
388
+ };
389
+ console.log(JSON.stringify(response));
390
+ console.error(`[worker] Sent ${commandName}_response (error: ${response.error})`);
391
+ }
392
+ }
393
+ /**
394
+ * Set up stdin listener for IPC commands from daemon.
395
+ */
396
+ function setupStdinListener() {
397
+ let buffer = '';
398
+ process.stdin.on('data', (chunk) => {
399
+ buffer += chunk.toString('utf-8');
400
+ // Process complete JSONL frames (separated by newlines)
401
+ const lines = buffer.split('\n');
402
+ buffer = lines.pop() ?? ''; // Keep incomplete line in buffer
403
+ for (const line of lines) {
404
+ if (line.trim()) {
405
+ try {
406
+ const message = JSON.parse(line);
407
+ void handleWorkerIPC(message);
408
+ }
409
+ catch (error) {
410
+ console.error(`[worker] Failed to parse IPC message: ${getErrorMessage(error)}`);
411
+ }
412
+ }
413
+ }
414
+ });
415
+ process.stdin.on('end', () => {
416
+ console.error('[worker] Stdin closed, daemon disconnected');
417
+ });
418
+ console.error('[worker] Stdin listener set up for IPC commands');
419
+ }
420
+ /**
421
+ * Send worker_ready signal to parent via stdout.
422
+ */
423
+ function sendReadySignal(config) {
424
+ if (!chrome || !targetInfo) {
425
+ throw new Error('Cannot send ready signal: Chrome or target not initialized');
426
+ }
427
+ const message = {
428
+ type: 'worker_ready',
429
+ requestId: 'ready', // Special requestId for ready signal
430
+ workerPid: process.pid,
431
+ chromePid: chrome.pid,
432
+ port: config.port,
433
+ target: {
434
+ url: targetInfo.url,
435
+ title: targetInfo.title,
436
+ },
437
+ };
438
+ // Send JSON line to stdout for parent to parse
439
+ console.log(JSON.stringify(message));
440
+ console.error(`[worker] Ready signal sent (PID ${process.pid}, Chrome PID ${chrome.pid})`);
441
+ }
442
+ /**
443
+ * Build BdgOutput structure from collected data.
444
+ */
445
+ function buildOutput(partial = false) {
446
+ const duration = Date.now() - sessionStartTime;
447
+ const data = {};
448
+ if (networkRequests.length > 0) {
449
+ data.network = networkRequests;
450
+ }
451
+ if (consoleMessages.length > 0) {
452
+ data.console = consoleMessages;
453
+ }
454
+ if (domData) {
455
+ data.dom = domData;
456
+ }
457
+ return {
458
+ version: VERSION,
459
+ success: true,
460
+ timestamp: new Date(sessionStartTime).toISOString(),
461
+ duration,
462
+ target: {
463
+ url: targetInfo?.url ?? '',
464
+ title: targetInfo?.title ?? '',
465
+ },
466
+ data,
467
+ ...(partial && { partial: true }),
468
+ };
469
+ }
470
+ /**
471
+ * Graceful shutdown: collect final DOM, write session.json, cleanup.
472
+ */
473
+ async function gracefulShutdown() {
474
+ console.error('[worker] Starting graceful shutdown...');
475
+ try {
476
+ // Collect final DOM snapshot if DOM collector is active
477
+ if (activeCollectors.includes('dom') && cdp) {
478
+ console.error('[worker] Collecting final DOM snapshot...');
479
+ try {
480
+ domData = await collectDOM(cdp);
481
+ console.error('[worker] DOM snapshot collected');
482
+ }
483
+ catch (error) {
484
+ console.error(`[worker] Failed to collect DOM: ${getErrorMessage(error)}`);
485
+ }
486
+ }
487
+ // Write final output
488
+ console.error('[worker] Writing final output...');
489
+ const finalOutput = buildOutput(false);
490
+ writeSessionOutput(finalOutput);
491
+ // Run cleanup functions
492
+ console.error('[worker] Running collector cleanup functions...');
493
+ for (const cleanup of cleanupFunctions) {
494
+ try {
495
+ cleanup();
496
+ }
497
+ catch (error) {
498
+ console.error(`[worker] Cleanup function error: ${getErrorMessage(error)}`);
499
+ }
500
+ }
501
+ // Close CDP connection
502
+ if (cdp) {
503
+ console.error('[worker] Closing CDP connection...');
504
+ cdp.close();
505
+ cdp = null;
506
+ }
507
+ // Kill Chrome
508
+ if (chrome) {
509
+ console.error(`[worker] Terminating Chrome (PID ${chrome.pid})...`);
510
+ await chrome.kill();
511
+ chrome = null;
512
+ }
513
+ console.error('[worker] Graceful shutdown complete');
514
+ }
515
+ catch (error) {
516
+ console.error(`[worker] Error during shutdown: ${getErrorMessage(error)}`);
517
+ throw error;
518
+ }
519
+ }
520
+ /**
521
+ * Main worker entry point.
522
+ */
523
+ async function main() {
524
+ console.error(`[worker] Starting (PID ${process.pid})`);
525
+ let config;
526
+ try {
527
+ // Parse configuration
528
+ config = parseWorkerConfig();
529
+ console.error(`[worker] Config: ${JSON.stringify(config)}`);
530
+ // Write worker PID immediately
531
+ writePid(process.pid);
532
+ // Normalize URL
533
+ const normalizedUrl = normalizeUrl(config.url);
534
+ console.error(`[worker] Normalized URL: ${normalizedUrl}`);
535
+ // Launch Chrome
536
+ console.error(`[worker] Launching Chrome on port ${config.port}...`);
537
+ const launchOptions = {
538
+ port: config.port,
539
+ url: normalizedUrl,
540
+ ...(config.userDataDir !== undefined && { userDataDir: config.userDataDir }),
541
+ };
542
+ chrome = await launchChrome(launchOptions);
543
+ console.error(`[worker] Chrome launched (PID ${chrome.pid})`);
544
+ // Connect to Chrome via CDP
545
+ console.error(`[worker] Connecting to Chrome via CDP...`);
546
+ const targets = await fetchCDPTargets(config.port);
547
+ // Find target by exact URL match, fallback to hostname match
548
+ let target = targets.find((t) => t.url === normalizedUrl);
549
+ if (!target) {
550
+ const urlObj = new URL(normalizedUrl);
551
+ target = targets.find((t) => t.url.includes(urlObj.hostname));
552
+ }
553
+ if (!target) {
554
+ throw new Error(`Target not found for URL: ${normalizedUrl}`);
555
+ }
556
+ targetInfo = target;
557
+ console.error(`[worker] Found target: ${target.title} (${target.url})`);
558
+ // Establish CDP connection
559
+ cdp = new CDPConnection();
560
+ await cdp.connect(target.webSocketDebuggerUrl, {
561
+ autoReconnect: false,
562
+ maxRetries: 10,
563
+ // P1.1: Exit gracefully if Chrome dies unexpectedly
564
+ // WHY: Prevents zombie worker processes when Chrome crashes/closes
565
+ onDisconnect: (code, reason) => {
566
+ console.error(`[worker] Chrome connection lost (code: ${code}, reason: ${reason})`);
567
+ console.error('[worker] Exiting due to Chrome connection loss');
568
+ process.exit(0);
569
+ },
570
+ });
571
+ console.error(`[worker] CDP connection established`);
572
+ // Activate collectors
573
+ await activateCollectors(config);
574
+ // Write session metadata for status command
575
+ writeSessionMetadata({
576
+ bdgPid: process.pid,
577
+ chromePid: chrome.pid,
578
+ startTime: sessionStartTime,
579
+ port: config.port,
580
+ targetId: target.id,
581
+ webSocketDebuggerUrl: target.webSocketDebuggerUrl,
582
+ activeCollectors,
583
+ });
584
+ console.error(`[worker] Session metadata written`);
585
+ // Send ready signal to parent
586
+ sendReadySignal(config);
587
+ // Set up stdin listener for IPC commands from daemon
588
+ setupStdinListener();
589
+ // Set up shutdown handlers
590
+ process.on('SIGTERM', () => {
591
+ console.error('[worker] Received SIGTERM');
592
+ void gracefulShutdown().then(() => process.exit(0));
593
+ });
594
+ process.on('SIGINT', () => {
595
+ console.error('[worker] Received SIGINT');
596
+ void gracefulShutdown().then(() => process.exit(0));
597
+ });
598
+ // Handle timeout if specified
599
+ if (config.timeout) {
600
+ console.error(`[worker] Auto-stop after ${config.timeout}s`);
601
+ setTimeout(() => {
602
+ console.error('[worker] Timeout reached, initiating shutdown');
603
+ void gracefulShutdown().then(() => process.exit(0));
604
+ }, config.timeout * 1000);
605
+ }
606
+ // Keep process alive
607
+ console.error('[worker] Session active, waiting for signal or timeout...');
608
+ }
609
+ catch (error) {
610
+ console.error(`[worker] Fatal error: ${getErrorMessage(error)}`);
611
+ // Cleanup on error
612
+ if (cdp) {
613
+ cdp.close();
614
+ }
615
+ if (chrome) {
616
+ await chrome.kill();
617
+ }
618
+ process.exit(1);
619
+ }
620
+ }
621
+ // Start worker
622
+ void main();
623
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/daemon/worker.ts"],"names":[],"mappings":"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"}