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