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