@monoes/monobrowse 1.0.11 → 1.0.13

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 (380) hide show
  1. package/dist/src/__tests__/adapters.test.js +5 -2
  2. package/dist/src/__tests__/adapters.test.js.map +1 -1
  3. package/dist/src/__tests__/batch-eval-parsing.test.js +4 -2
  4. package/dist/src/__tests__/batch-eval-parsing.test.js.map +1 -1
  5. package/dist/src/__tests__/box-model.test.js +9 -5
  6. package/dist/src/__tests__/box-model.test.js.map +1 -1
  7. package/dist/src/__tests__/browser-launch.test.d.ts +10 -0
  8. package/dist/src/__tests__/browser-launch.test.d.ts.map +1 -1
  9. package/dist/src/__tests__/browser-launch.test.js +17 -10
  10. package/dist/src/__tests__/browser-launch.test.js.map +1 -1
  11. package/dist/src/__tests__/cdp-client.test.js +9 -3
  12. package/dist/src/__tests__/cdp-client.test.js.map +1 -1
  13. package/dist/src/__tests__/close-browser.test.d.ts +13 -0
  14. package/dist/src/__tests__/close-browser.test.d.ts.map +1 -1
  15. package/dist/src/__tests__/close-browser.test.js +5 -5
  16. package/dist/src/__tests__/close-browser.test.js.map +1 -1
  17. package/dist/src/__tests__/console-log.test.js +17 -6
  18. package/dist/src/__tests__/console-log.test.js.map +1 -1
  19. package/dist/src/__tests__/find.test.js +26 -6
  20. package/dist/src/__tests__/find.test.js.map +1 -1
  21. package/dist/src/__tests__/frame-command.test.js +9 -3
  22. package/dist/src/__tests__/frame-command.test.js.map +1 -1
  23. package/dist/src/__tests__/open-url-navigate-error.test.js +1 -3
  24. package/dist/src/__tests__/open-url-navigate-error.test.js.map +1 -1
  25. package/dist/src/__tests__/output.test.js +1 -1
  26. package/dist/src/__tests__/output.test.js.map +1 -1
  27. package/dist/src/__tests__/profiler-heap.test.d.ts +2 -0
  28. package/dist/src/__tests__/profiler-heap.test.d.ts.map +1 -0
  29. package/dist/src/__tests__/profiler-heap.test.js +154 -0
  30. package/dist/src/__tests__/profiler-heap.test.js.map +1 -0
  31. package/dist/src/__tests__/reap-idle-browser.test.d.ts +15 -0
  32. package/dist/src/__tests__/reap-idle-browser.test.d.ts.map +1 -0
  33. package/dist/src/__tests__/reap-idle-browser.test.js +238 -0
  34. package/dist/src/__tests__/reap-idle-browser.test.js.map +1 -0
  35. package/dist/src/__tests__/ref-cache.test.js +18 -10
  36. package/dist/src/__tests__/ref-cache.test.js.map +1 -1
  37. package/dist/src/__tests__/report-a11y.test.d.ts +2 -0
  38. package/dist/src/__tests__/report-a11y.test.d.ts.map +1 -0
  39. package/dist/src/__tests__/report-a11y.test.js +147 -0
  40. package/dist/src/__tests__/report-a11y.test.js.map +1 -0
  41. package/dist/src/__tests__/report-analyze.test.d.ts +2 -0
  42. package/dist/src/__tests__/report-analyze.test.d.ts.map +1 -0
  43. package/dist/src/__tests__/report-analyze.test.js +157 -0
  44. package/dist/src/__tests__/report-analyze.test.js.map +1 -0
  45. package/dist/src/__tests__/report-budget.test.d.ts +2 -0
  46. package/dist/src/__tests__/report-budget.test.d.ts.map +1 -0
  47. package/dist/src/__tests__/report-budget.test.js +80 -0
  48. package/dist/src/__tests__/report-budget.test.js.map +1 -0
  49. package/dist/src/__tests__/report-diff.test.d.ts +2 -0
  50. package/dist/src/__tests__/report-diff.test.d.ts.map +1 -0
  51. package/dist/src/__tests__/report-diff.test.js +231 -0
  52. package/dist/src/__tests__/report-diff.test.js.map +1 -0
  53. package/dist/src/__tests__/report-evidence.test.d.ts +2 -0
  54. package/dist/src/__tests__/report-evidence.test.d.ts.map +1 -0
  55. package/dist/src/__tests__/report-evidence.test.js +214 -0
  56. package/dist/src/__tests__/report-evidence.test.js.map +1 -0
  57. package/dist/src/__tests__/report-flake.test.d.ts +2 -0
  58. package/dist/src/__tests__/report-flake.test.d.ts.map +1 -0
  59. package/dist/src/__tests__/report-flake.test.js +182 -0
  60. package/dist/src/__tests__/report-flake.test.js.map +1 -0
  61. package/dist/src/__tests__/report-history.test.d.ts +2 -0
  62. package/dist/src/__tests__/report-history.test.d.ts.map +1 -0
  63. package/dist/src/__tests__/report-history.test.js +229 -0
  64. package/dist/src/__tests__/report-history.test.js.map +1 -0
  65. package/dist/src/__tests__/report-output.test.d.ts +2 -0
  66. package/dist/src/__tests__/report-output.test.d.ts.map +1 -0
  67. package/dist/src/__tests__/report-output.test.js +169 -0
  68. package/dist/src/__tests__/report-output.test.js.map +1 -0
  69. package/dist/src/__tests__/report-png.test.d.ts +2 -0
  70. package/dist/src/__tests__/report-png.test.d.ts.map +1 -0
  71. package/dist/src/__tests__/report-png.test.js +84 -0
  72. package/dist/src/__tests__/report-png.test.js.map +1 -0
  73. package/dist/src/__tests__/report-render-extras.test.d.ts +2 -0
  74. package/dist/src/__tests__/report-render-extras.test.d.ts.map +1 -0
  75. package/dist/src/__tests__/report-render-extras.test.js +285 -0
  76. package/dist/src/__tests__/report-render-extras.test.js.map +1 -0
  77. package/dist/src/__tests__/report-render.test.d.ts +2 -0
  78. package/dist/src/__tests__/report-render.test.d.ts.map +1 -0
  79. package/dist/src/__tests__/report-render.test.js +143 -0
  80. package/dist/src/__tests__/report-render.test.js.map +1 -0
  81. package/dist/src/__tests__/report-run.test.d.ts +2 -0
  82. package/dist/src/__tests__/report-run.test.d.ts.map +1 -0
  83. package/dist/src/__tests__/report-run.test.js +234 -0
  84. package/dist/src/__tests__/report-run.test.js.map +1 -0
  85. package/dist/src/__tests__/session-state.test.d.ts +8 -0
  86. package/dist/src/__tests__/session-state.test.d.ts.map +1 -1
  87. package/dist/src/__tests__/session-state.test.js +10 -10
  88. package/dist/src/__tests__/session-state.test.js.map +1 -1
  89. package/dist/src/__tests__/snapshot.test.js +44 -14
  90. package/dist/src/__tests__/snapshot.test.js.map +1 -1
  91. package/dist/src/__tests__/storage-eval.test.js +14 -6
  92. package/dist/src/__tests__/storage-eval.test.js.map +1 -1
  93. package/dist/src/__tests__/tabs.test.js +25 -9
  94. package/dist/src/__tests__/tabs.test.js.map +1 -1
  95. package/dist/src/browser/action-builder/analyzer.d.ts +1 -1
  96. package/dist/src/browser/action-builder/analyzer.d.ts.map +1 -1
  97. package/dist/src/browser/action-builder/analyzer.js +25 -9
  98. package/dist/src/browser/action-builder/analyzer.js.map +1 -1
  99. package/dist/src/browser/action-builder/types.d.ts.map +1 -1
  100. package/dist/src/browser/actions.d.ts +1 -1
  101. package/dist/src/browser/actions.d.ts.map +1 -1
  102. package/dist/src/browser/actions.js +16 -6
  103. package/dist/src/browser/actions.js.map +1 -1
  104. package/dist/src/browser/adapters/gemini.d.ts.map +1 -1
  105. package/dist/src/browser/adapters/gemini.js.map +1 -1
  106. package/dist/src/browser/adapters/google.d.ts.map +1 -1
  107. package/dist/src/browser/adapters/google.js.map +1 -1
  108. package/dist/src/browser/adapters/index.d.ts.map +1 -1
  109. package/dist/src/browser/adapters/index.js +3 -3
  110. package/dist/src/browser/adapters/index.js.map +1 -1
  111. package/dist/src/browser/adapters/instagram.d.ts.map +1 -1
  112. package/dist/src/browser/adapters/instagram.js.map +1 -1
  113. package/dist/src/browser/adapters/linkedin.d.ts.map +1 -1
  114. package/dist/src/browser/adapters/linkedin.js.map +1 -1
  115. package/dist/src/browser/adapters/microsoft.d.ts.map +1 -1
  116. package/dist/src/browser/adapters/microsoft.js.map +1 -1
  117. package/dist/src/browser/adapters/x.d.ts.map +1 -1
  118. package/dist/src/browser/adapters/x.js.map +1 -1
  119. package/dist/src/browser/browser.d.ts +30 -0
  120. package/dist/src/browser/browser.d.ts.map +1 -1
  121. package/dist/src/browser/browser.js +122 -15
  122. package/dist/src/browser/browser.js.map +1 -1
  123. package/dist/src/browser/cdp.d.ts.map +1 -1
  124. package/dist/src/browser/cdp.js +21 -8
  125. package/dist/src/browser/cdp.js.map +1 -1
  126. package/dist/src/browser/console-log.d.ts.map +1 -1
  127. package/dist/src/browser/console-log.js +2 -2
  128. package/dist/src/browser/console-log.js.map +1 -1
  129. package/dist/src/browser/dashboard/server.d.ts.map +1 -1
  130. package/dist/src/browser/dashboard/server.js +29 -19
  131. package/dist/src/browser/dashboard/server.js.map +1 -1
  132. package/dist/src/browser/dashboard/ui.html +153 -165
  133. package/dist/src/browser/dialog.d.ts.map +1 -1
  134. package/dist/src/browser/dialog.js +3 -1
  135. package/dist/src/browser/dialog.js.map +1 -1
  136. package/dist/src/browser/emulation.d.ts.map +1 -1
  137. package/dist/src/browser/emulation.js +21 -6
  138. package/dist/src/browser/emulation.js.map +1 -1
  139. package/dist/src/browser/find.d.ts +4 -4
  140. package/dist/src/browser/find.d.ts.map +1 -1
  141. package/dist/src/browser/find.js +14 -6
  142. package/dist/src/browser/find.js.map +1 -1
  143. package/dist/src/browser/har.d.ts.map +1 -1
  144. package/dist/src/browser/har.js +14 -7
  145. package/dist/src/browser/har.js.map +1 -1
  146. package/dist/src/browser/index.d.ts +17 -16
  147. package/dist/src/browser/index.d.ts.map +1 -1
  148. package/dist/src/browser/index.js +17 -16
  149. package/dist/src/browser/index.js.map +1 -1
  150. package/dist/src/browser/network.d.ts.map +1 -1
  151. package/dist/src/browser/network.js +14 -4
  152. package/dist/src/browser/network.js.map +1 -1
  153. package/dist/src/browser/pdf.d.ts.map +1 -1
  154. package/dist/src/browser/pdf.js +3 -3
  155. package/dist/src/browser/pdf.js.map +1 -1
  156. package/dist/src/browser/profiler.d.ts.map +1 -1
  157. package/dist/src/browser/profiler.js +22 -20
  158. package/dist/src/browser/profiler.js.map +1 -1
  159. package/dist/src/browser/record.d.ts +1 -1
  160. package/dist/src/browser/record.d.ts.map +1 -1
  161. package/dist/src/browser/record.js +18 -7
  162. package/dist/src/browser/record.js.map +1 -1
  163. package/dist/src/browser/ref-cache.d.ts.map +1 -1
  164. package/dist/src/browser/ref-cache.js +9 -4
  165. package/dist/src/browser/ref-cache.js.map +1 -1
  166. package/dist/src/browser/screenshot.d.ts.map +1 -1
  167. package/dist/src/browser/screenshot.js +11 -7
  168. package/dist/src/browser/screenshot.js.map +1 -1
  169. package/dist/src/browser/session.d.ts +1 -1
  170. package/dist/src/browser/session.d.ts.map +1 -1
  171. package/dist/src/browser/session.js +27 -8
  172. package/dist/src/browser/session.js.map +1 -1
  173. package/dist/src/browser/snapshot.d.ts +1 -1
  174. package/dist/src/browser/snapshot.d.ts.map +1 -1
  175. package/dist/src/browser/snapshot.js +8 -4
  176. package/dist/src/browser/snapshot.js.map +1 -1
  177. package/dist/src/browser/storage.d.ts.map +1 -1
  178. package/dist/src/browser/storage.js.map +1 -1
  179. package/dist/src/browser/tabs.d.ts.map +1 -1
  180. package/dist/src/browser/tabs.js +9 -3
  181. package/dist/src/browser/tabs.js.map +1 -1
  182. package/dist/src/browser/trace.d.ts.map +1 -1
  183. package/dist/src/browser/trace.js +3 -3
  184. package/dist/src/browser/trace.js.map +1 -1
  185. package/dist/src/browser/types.d.ts.map +1 -1
  186. package/dist/src/browser/types.js +23 -4
  187. package/dist/src/browser/types.js.map +1 -1
  188. package/dist/src/browser/vitals.d.ts.map +1 -1
  189. package/dist/src/browser/vitals.js +1 -1
  190. package/dist/src/browser/vitals.js.map +1 -1
  191. package/dist/src/browser/wait.d.ts.map +1 -1
  192. package/dist/src/browser/wait.js +11 -5
  193. package/dist/src/browser/wait.js.map +1 -1
  194. package/dist/src/cli/action.d.ts.map +1 -1
  195. package/dist/src/cli/action.js +14 -11
  196. package/dist/src/cli/action.js.map +1 -1
  197. package/dist/src/cli/commands.d.ts.map +1 -1
  198. package/dist/src/cli/commands.js +707 -159
  199. package/dist/src/cli/commands.js.map +1 -1
  200. package/dist/src/cli/output.js +5 -5
  201. package/dist/src/cli/output.js.map +1 -1
  202. package/dist/src/cli/platform.d.ts.map +1 -1
  203. package/dist/src/cli/platform.js +15 -11
  204. package/dist/src/cli/platform.js.map +1 -1
  205. package/dist/src/cli/types.d.ts +1 -1
  206. package/dist/src/cli/types.d.ts.map +1 -1
  207. package/dist/src/cli.js +21 -9
  208. package/dist/src/cli.js.map +1 -1
  209. package/dist/src/index.d.ts +2 -2
  210. package/dist/src/index.d.ts.map +1 -1
  211. package/dist/src/index.js +2 -2
  212. package/dist/src/index.js.map +1 -1
  213. package/dist/src/report/a11y.d.ts +52 -0
  214. package/dist/src/report/a11y.d.ts.map +1 -0
  215. package/dist/src/report/a11y.js +231 -0
  216. package/dist/src/report/a11y.js.map +1 -0
  217. package/dist/src/report/analyze.d.ts +20 -0
  218. package/dist/src/report/analyze.d.ts.map +1 -0
  219. package/dist/src/report/analyze.js +136 -0
  220. package/dist/src/report/analyze.js.map +1 -0
  221. package/dist/src/report/budget.d.ts +27 -0
  222. package/dist/src/report/budget.d.ts.map +1 -0
  223. package/dist/src/report/budget.js +143 -0
  224. package/dist/src/report/budget.js.map +1 -0
  225. package/dist/src/report/collect-a11y.d.ts +25 -0
  226. package/dist/src/report/collect-a11y.d.ts.map +1 -0
  227. package/dist/src/report/collect-a11y.js +154 -0
  228. package/dist/src/report/collect-a11y.js.map +1 -0
  229. package/dist/src/report/collect.d.ts +45 -0
  230. package/dist/src/report/collect.d.ts.map +1 -0
  231. package/dist/src/report/collect.js +275 -0
  232. package/dist/src/report/collect.js.map +1 -0
  233. package/dist/src/report/evidence.d.ts +80 -0
  234. package/dist/src/report/evidence.d.ts.map +1 -0
  235. package/dist/src/report/evidence.js +279 -0
  236. package/dist/src/report/evidence.js.map +1 -0
  237. package/dist/src/report/flake.d.ts +88 -0
  238. package/dist/src/report/flake.d.ts.map +1 -0
  239. package/dist/src/report/flake.js +232 -0
  240. package/dist/src/report/flake.js.map +1 -0
  241. package/dist/src/report/history.d.ts +85 -0
  242. package/dist/src/report/history.d.ts.map +1 -0
  243. package/dist/src/report/history.js +176 -0
  244. package/dist/src/report/history.js.map +1 -0
  245. package/dist/src/report/index.d.ts +102 -0
  246. package/dist/src/report/index.d.ts.map +1 -0
  247. package/dist/src/report/index.js +216 -0
  248. package/dist/src/report/index.js.map +1 -0
  249. package/dist/src/report/pixel-diff.d.ts +30 -0
  250. package/dist/src/report/pixel-diff.d.ts.map +1 -0
  251. package/dist/src/report/pixel-diff.js +175 -0
  252. package/dist/src/report/pixel-diff.js.map +1 -0
  253. package/dist/src/report/png.d.ts +28 -0
  254. package/dist/src/report/png.d.ts.map +1 -0
  255. package/dist/src/report/png.js +259 -0
  256. package/dist/src/report/png.js.map +1 -0
  257. package/dist/src/report/render-evidence.d.ts +16 -0
  258. package/dist/src/report/render-evidence.d.ts.map +1 -0
  259. package/dist/src/report/render-evidence.js +174 -0
  260. package/dist/src/report/render-evidence.js.map +1 -0
  261. package/dist/src/report/render-trend.d.ts +16 -0
  262. package/dist/src/report/render-trend.d.ts.map +1 -0
  263. package/dist/src/report/render-trend.js +194 -0
  264. package/dist/src/report/render-trend.js.map +1 -0
  265. package/dist/src/report/render.d.ts +21 -0
  266. package/dist/src/report/render.d.ts.map +1 -0
  267. package/dist/src/report/render.js +286 -0
  268. package/dist/src/report/render.js.map +1 -0
  269. package/dist/src/report/run-diff.d.ts +18 -0
  270. package/dist/src/report/run-diff.d.ts.map +1 -0
  271. package/dist/src/report/run-diff.js +51 -0
  272. package/dist/src/report/run-diff.js.map +1 -0
  273. package/dist/src/report/structure.d.ts +41 -0
  274. package/dist/src/report/structure.d.ts.map +1 -0
  275. package/dist/src/report/structure.js +210 -0
  276. package/dist/src/report/structure.js.map +1 -0
  277. package/dist/src/report/trend.d.ts +26 -0
  278. package/dist/src/report/trend.d.ts.map +1 -0
  279. package/dist/src/report/trend.js +164 -0
  280. package/dist/src/report/trend.js.map +1 -0
  281. package/dist/src/report/types.d.ts +320 -0
  282. package/dist/src/report/types.d.ts.map +1 -0
  283. package/dist/src/report/types.js +11 -0
  284. package/dist/src/report/types.js.map +1 -0
  285. package/dist/src/report/util.d.ts +17 -0
  286. package/dist/src/report/util.d.ts.map +1 -0
  287. package/dist/src/report/util.js +45 -0
  288. package/dist/src/report/util.js.map +1 -0
  289. package/dist/tsconfig.tsbuildinfo +1 -1
  290. package/package.json +1 -1
  291. package/src/__tests__/adapters.test.ts +15 -8
  292. package/src/__tests__/batch-eval-parsing.test.ts +4 -2
  293. package/src/__tests__/box-model.test.ts +9 -5
  294. package/src/__tests__/browser-launch.test.ts +26 -15
  295. package/src/__tests__/cdp-client.test.ts +25 -9
  296. package/src/__tests__/close-browser.test.ts +11 -6
  297. package/src/__tests__/console-log.test.ts +36 -13
  298. package/src/__tests__/find.test.ts +58 -20
  299. package/src/__tests__/frame-command.test.ts +12 -6
  300. package/src/__tests__/open-url-navigate-error.test.ts +2 -4
  301. package/src/__tests__/output.test.ts +1 -1
  302. package/src/__tests__/profiler-heap.test.ts +191 -0
  303. package/src/__tests__/reap-idle-browser.test.ts +276 -0
  304. package/src/__tests__/ref-cache.test.ts +25 -12
  305. package/src/__tests__/report-a11y.test.ts +180 -0
  306. package/src/__tests__/report-analyze.test.ts +202 -0
  307. package/src/__tests__/report-budget.test.ts +92 -0
  308. package/src/__tests__/report-diff.test.ts +272 -0
  309. package/src/__tests__/report-evidence.test.ts +276 -0
  310. package/src/__tests__/report-flake.test.ts +214 -0
  311. package/src/__tests__/report-history.test.ts +293 -0
  312. package/src/__tests__/report-output.test.ts +210 -0
  313. package/src/__tests__/report-png.test.ts +95 -0
  314. package/src/__tests__/report-render-extras.test.ts +315 -0
  315. package/src/__tests__/report-render.test.ts +175 -0
  316. package/src/__tests__/report-run.test.ts +264 -0
  317. package/src/__tests__/session-state.test.ts +40 -28
  318. package/src/__tests__/snapshot.test.ts +60 -21
  319. package/src/__tests__/storage-eval.test.ts +30 -16
  320. package/src/__tests__/tabs.test.ts +26 -10
  321. package/src/browser/action-builder/analyzer.ts +39 -15
  322. package/src/browser/action-builder/types.ts +45 -8
  323. package/src/browser/actions.ts +288 -123
  324. package/src/browser/adapters/gemini.ts +7 -3
  325. package/src/browser/adapters/google.ts +5 -3
  326. package/src/browser/adapters/index.ts +5 -4
  327. package/src/browser/adapters/instagram.ts +4 -2
  328. package/src/browser/adapters/linkedin.ts +4 -2
  329. package/src/browser/adapters/microsoft.ts +9 -5
  330. package/src/browser/adapters/x.ts +7 -3
  331. package/src/browser/browser.ts +188 -42
  332. package/src/browser/cdp.ts +43 -11
  333. package/src/browser/console-log.ts +24 -7
  334. package/src/browser/dashboard/server.ts +44 -25
  335. package/src/browser/dashboard/ui.html +153 -165
  336. package/src/browser/dialog.ts +25 -8
  337. package/src/browser/emulation.ts +86 -36
  338. package/src/browser/find.ts +110 -47
  339. package/src/browser/har.ts +58 -26
  340. package/src/browser/index.ts +17 -16
  341. package/src/browser/network.ts +147 -46
  342. package/src/browser/pdf.ts +4 -4
  343. package/src/browser/profiler.ts +39 -19
  344. package/src/browser/record.ts +38 -19
  345. package/src/browser/ref-cache.ts +38 -17
  346. package/src/browser/screenshot.ts +58 -32
  347. package/src/browser/session.ts +51 -18
  348. package/src/browser/snapshot.ts +34 -20
  349. package/src/browser/storage.ts +73 -17
  350. package/src/browser/tabs.ts +29 -17
  351. package/src/browser/trace.ts +14 -10
  352. package/src/browser/types.ts +23 -4
  353. package/src/browser/vitals.ts +33 -16
  354. package/src/browser/wait.ts +47 -21
  355. package/src/cli/action.ts +52 -21
  356. package/src/cli/commands.ts +1365 -385
  357. package/src/cli/output.ts +5 -5
  358. package/src/cli/platform.ts +44 -23
  359. package/src/cli/types.ts +1 -1
  360. package/src/cli.ts +34 -18
  361. package/src/index.ts +2 -2
  362. package/src/report/a11y.ts +242 -0
  363. package/src/report/analyze.ts +181 -0
  364. package/src/report/budget.ts +155 -0
  365. package/src/report/collect-a11y.ts +200 -0
  366. package/src/report/collect.ts +408 -0
  367. package/src/report/evidence.ts +379 -0
  368. package/src/report/flake.ts +303 -0
  369. package/src/report/history.ts +219 -0
  370. package/src/report/index.ts +307 -0
  371. package/src/report/pixel-diff.ts +197 -0
  372. package/src/report/png.ts +290 -0
  373. package/src/report/render-evidence.ts +194 -0
  374. package/src/report/render-trend.ts +225 -0
  375. package/src/report/render.ts +314 -0
  376. package/src/report/run-diff.ts +63 -0
  377. package/src/report/structure.ts +212 -0
  378. package/src/report/trend.ts +189 -0
  379. package/src/report/types.ts +356 -0
  380. package/src/report/util.ts +48 -0
@@ -1,23 +1,24 @@
1
- export * from './types.js';
2
- export * from './cdp.js';
3
- export * from './browser.js';
4
- export * from './snapshot.js';
1
+ export * from '../report/index.js';
5
2
  export * from './actions.js';
6
- export * from './wait.js';
7
- export * from './network.js';
8
- export * from './screenshot.js';
9
- export * from './session.js';
10
- export * from './tabs.js';
11
- export * from './dialog.js';
3
+ export * from './batch.js';
4
+ export * from './browser.js';
5
+ export * from './cdp.js';
12
6
  export * from './console-log.js';
13
- export * from './storage.js';
7
+ export * from './dialog.js';
8
+ export * from './emulation.js';
14
9
  export * from './find.js';
10
+ export * from './har.js';
11
+ export * from './network.js';
15
12
  export * from './pdf.js';
16
- export * from './emulation.js';
17
- export * from './batch.js';
13
+ export * from './profiler.js';
18
14
  export * from './record.js';
15
+ export * from './ref-cache.js';
16
+ export * from './screenshot.js';
17
+ export * from './session.js';
18
+ export * from './snapshot.js';
19
+ export * from './storage.js';
20
+ export * from './tabs.js';
19
21
  export * from './trace.js';
20
- export * from './profiler.js';
22
+ export * from './types.js';
21
23
  export * from './vitals.js';
22
- export * from './har.js';
23
- export * from './ref-cache.js';
24
+ export * from './wait.js';
@@ -2,7 +2,11 @@ import type { CdpClient } from './cdp.js';
2
2
  import type { CdpCookie, NetworkRoute } from './types.js';
3
3
 
4
4
  export async function getCookies(client: CdpClient, sessionId: string): Promise<CdpCookie[]> {
5
- const result = await client.send<{ cookies: CdpCookie[] }>('Network.getAllCookies', {}, sessionId);
5
+ const result = await client.send<{ cookies: CdpCookie[] }>(
6
+ 'Network.getAllCookies',
7
+ {},
8
+ sessionId,
9
+ );
6
10
  return result.cookies ?? [];
7
11
  }
8
12
 
@@ -12,12 +16,24 @@ export async function getCookies(client: CdpClient, sessionId: string): Promise<
12
16
  * profile. Used for session save/export so we don't leak session tokens for
13
17
  * unrelated domains the user happens to be logged into.
14
18
  */
15
- export async function getCookiesForUrls(client: CdpClient, sessionId: string, urls: string[]): Promise<CdpCookie[]> {
16
- const result = await client.send<{ cookies: CdpCookie[] }>('Network.getCookies', { urls }, sessionId);
19
+ export async function getCookiesForUrls(
20
+ client: CdpClient,
21
+ sessionId: string,
22
+ urls: string[],
23
+ ): Promise<CdpCookie[]> {
24
+ const result = await client.send<{ cookies: CdpCookie[] }>(
25
+ 'Network.getCookies',
26
+ { urls },
27
+ sessionId,
28
+ );
17
29
  return result.cookies ?? [];
18
30
  }
19
31
 
20
- export async function setCookies(client: CdpClient, sessionId: string, cookies: CdpCookie[]): Promise<void> {
32
+ export async function setCookies(
33
+ client: CdpClient,
34
+ sessionId: string,
35
+ cookies: CdpCookie[],
36
+ ): Promise<void> {
21
37
  await client.send('Network.setCookies', { cookies }, sessionId);
22
38
  }
23
39
 
@@ -28,15 +44,19 @@ export async function clearCookies(client: CdpClient, sessionId: string): Promis
28
44
  export async function setExtraHeaders(
29
45
  client: CdpClient,
30
46
  sessionId: string,
31
- headers: Record<string, string>
47
+ headers: Record<string, string>,
32
48
  ): Promise<void> {
33
49
  await client.send('Network.setExtraHTTPHeaders', { headers }, sessionId);
34
50
  }
35
51
 
36
52
  export async function enableInterception(client: CdpClient, sessionId: string): Promise<void> {
37
- await client.send('Fetch.enable', {
38
- patterns: [{ requestStage: 'Request' }],
39
- }, sessionId);
53
+ await client.send(
54
+ 'Fetch.enable',
55
+ {
56
+ patterns: [{ requestStage: 'Request' }],
57
+ },
58
+ sessionId,
59
+ );
40
60
  }
41
61
 
42
62
  const _routeListeners = new Map<string, () => void>();
@@ -44,11 +64,14 @@ const _routeListeners = new Map<string, () => void>();
44
64
  export async function setupRoutes(
45
65
  client: CdpClient,
46
66
  sessionId: string,
47
- routes: NetworkRoute[]
67
+ routes: NetworkRoute[],
48
68
  ): Promise<void> {
49
69
  // Remove previous route listener for this session before registering a new one
50
70
  const prevOff = _routeListeners.get(sessionId);
51
- if (prevOff) { prevOff(); _routeListeners.delete(sessionId); }
71
+ if (prevOff) {
72
+ prevOff();
73
+ _routeListeners.delete(sessionId);
74
+ }
52
75
 
53
76
  if (routes.length === 0) {
54
77
  await client.send('Fetch.disable', {}, sessionId).catch(() => {});
@@ -77,14 +100,21 @@ export async function setupRoutes(
77
100
  await client.send('Fetch.failRequest', { requestId, errorReason: 'Failed' }, sessionId);
78
101
  break;
79
102
  case 'fulfill':
80
- await client.send('Fetch.fulfillRequest', {
81
- requestId,
82
- responseCode: matchedRoute.response?.status ?? 200,
83
- responseHeaders: Object.entries(matchedRoute.response?.headers ?? {}).map(([name, value]) => ({ name, value })),
84
- body: matchedRoute.response?.body ? Buffer.from(matchedRoute.response.body).toString('base64') : '',
85
- }, sessionId);
103
+ await client.send(
104
+ 'Fetch.fulfillRequest',
105
+ {
106
+ requestId,
107
+ responseCode: matchedRoute.response?.status ?? 200,
108
+ responseHeaders: Object.entries(matchedRoute.response?.headers ?? {}).map(
109
+ ([name, value]) => ({ name, value }),
110
+ ),
111
+ body: matchedRoute.response?.body
112
+ ? Buffer.from(matchedRoute.response.body).toString('base64')
113
+ : '',
114
+ },
115
+ sessionId,
116
+ );
86
117
  break;
87
- case 'continue':
88
118
  default:
89
119
  await client.send('Fetch.continueRequest', { requestId }, sessionId);
90
120
  break;
@@ -96,15 +126,29 @@ export async function setupRoutes(
96
126
  });
97
127
  _routeListeners.set(sessionId, off);
98
128
 
99
- await client.send('Fetch.enable', {
100
- patterns: routes.map((r) => ({ urlPattern: globToFetchPattern(r.pattern), requestStage: 'Request' })),
101
- }, sessionId);
129
+ await client.send(
130
+ 'Fetch.enable',
131
+ {
132
+ patterns: routes.map((r) => ({
133
+ urlPattern: globToFetchPattern(r.pattern),
134
+ requestStage: 'Request',
135
+ })),
136
+ },
137
+ sessionId,
138
+ );
102
139
  }
103
140
 
104
141
  type CapturedRequest = {
105
- id: string; url: string; method: string; status?: number; mimeType?: string;
106
- requestHeaders?: Record<string, string>; responseHeaders?: Record<string, string>;
107
- startTime: number; endTime?: number; encodedSize?: number;
142
+ id: string;
143
+ url: string;
144
+ method: string;
145
+ status?: number;
146
+ mimeType?: string;
147
+ requestHeaders?: Record<string, string>;
148
+ responseHeaders?: Record<string, string>;
149
+ startTime: number;
150
+ endTime?: number;
151
+ encodedSize?: number;
108
152
  };
109
153
 
110
154
  const _capturedRequests = new Map<string, Map<string, CapturedRequest>>();
@@ -121,29 +165,53 @@ export function startRequestCapture(client: CdpClient, sessionId: string): void
121
165
 
122
166
  const offReq = client.on('Network.requestWillBeSent', (params, sid) => {
123
167
  if (sid !== sessionId) return;
124
- const p = params as { requestId: string; request: { url: string; method: string; headers: Record<string, string> }; timestamp: number };
125
- idx().set(p.requestId, { id: p.requestId, url: p.request.url, method: p.request.method, requestHeaders: p.request.headers, startTime: p.timestamp * 1000 });
168
+ const p = params as {
169
+ requestId: string;
170
+ request: { url: string; method: string; headers: Record<string, string> };
171
+ timestamp: number;
172
+ };
173
+ idx().set(p.requestId, {
174
+ id: p.requestId,
175
+ url: p.request.url,
176
+ method: p.request.method,
177
+ requestHeaders: p.request.headers,
178
+ startTime: p.timestamp * 1000,
179
+ });
126
180
  });
127
181
 
128
182
  const offResp = client.on('Network.responseReceived', (params, sid) => {
129
183
  if (sid !== sessionId) return;
130
- const p = params as { requestId: string; response: { status: number; mimeType: string; headers: Record<string, string> }; timestamp: number };
184
+ const p = params as {
185
+ requestId: string;
186
+ response: { status: number; mimeType: string; headers: Record<string, string> };
187
+ timestamp: number;
188
+ };
131
189
  const entry = idx().get(p.requestId);
132
- if (entry) { entry.status = p.response.status; entry.mimeType = p.response.mimeType; entry.responseHeaders = p.response.headers; entry.endTime = p.timestamp * 1000; }
190
+ if (entry) {
191
+ entry.status = p.response.status;
192
+ entry.mimeType = p.response.mimeType;
193
+ entry.responseHeaders = p.response.headers;
194
+ entry.endTime = p.timestamp * 1000;
195
+ }
133
196
  });
134
197
 
135
198
  const offFinished = client.on('Network.loadingFinished', (params, sid) => {
136
199
  if (sid !== sessionId) return;
137
200
  const p = params as { requestId: string; encodedDataLength: number; timestamp: number };
138
201
  const entry = idx().get(p.requestId);
139
- if (entry) { entry.encodedSize = p.encodedDataLength; entry.endTime = p.timestamp * 1000; }
202
+ if (entry) {
203
+ entry.encodedSize = p.encodedDataLength;
204
+ entry.endTime = p.timestamp * 1000;
205
+ }
140
206
  });
141
207
 
142
208
  const offFailed = client.on('Network.loadingFailed', (params, sid) => {
143
209
  if (sid !== sessionId) return;
144
210
  const p = params as { requestId: string; timestamp: number };
145
211
  const entry = idx().get(p.requestId);
146
- if (entry) { entry.endTime = p.timestamp * 1000; }
212
+ if (entry) {
213
+ entry.endTime = p.timestamp * 1000;
214
+ }
147
215
  });
148
216
 
149
217
  _captureListeners.set(sessionId, [offReq, offResp, offFinished, offFailed]);
@@ -151,7 +219,10 @@ export function startRequestCapture(client: CdpClient, sessionId: string): void
151
219
 
152
220
  export function stopRequestCapture(sessionId: string): void {
153
221
  const offs = _captureListeners.get(sessionId);
154
- if (offs) { for (const off of offs) off(); _captureListeners.delete(sessionId); }
222
+ if (offs) {
223
+ for (const off of offs) off();
224
+ _captureListeners.delete(sessionId);
225
+ }
155
226
  _capturedRequests.delete(sessionId);
156
227
  }
157
228
 
@@ -165,20 +236,36 @@ export function clearCapturedRequests(sessionId: string): void {
165
236
 
166
237
  export async function disableInterception(client: CdpClient, sessionId: string): Promise<void> {
167
238
  const prevOff = _routeListeners.get(sessionId);
168
- if (prevOff) { prevOff(); _routeListeners.delete(sessionId); }
239
+ if (prevOff) {
240
+ prevOff();
241
+ _routeListeners.delete(sessionId);
242
+ }
169
243
  await client.send('Fetch.disable', {}, sessionId);
170
244
  }
171
245
 
172
246
  export function teardownRouteInterception(sessionId: string): void {
173
247
  const prevOff = _routeListeners.get(sessionId);
174
- if (prevOff) { prevOff(); _routeListeners.delete(sessionId); }
248
+ if (prevOff) {
249
+ prevOff();
250
+ _routeListeners.delete(sessionId);
251
+ }
175
252
  }
176
253
 
177
- export async function getLocalStorage(client: CdpClient, sessionId: string): Promise<Record<string, string>> {
178
- const result = await client.send<{ result: { value?: string }; exceptionDetails?: { text: string; exception?: { description?: string } } }>('Runtime.evaluate', {
179
- expression: 'JSON.stringify(Object.fromEntries(Object.entries(localStorage)))',
180
- returnByValue: true,
181
- }, sessionId);
254
+ export async function getLocalStorage(
255
+ client: CdpClient,
256
+ sessionId: string,
257
+ ): Promise<Record<string, string>> {
258
+ const result = await client.send<{
259
+ result: { value?: string };
260
+ exceptionDetails?: { text: string; exception?: { description?: string } };
261
+ }>(
262
+ 'Runtime.evaluate',
263
+ {
264
+ expression: 'JSON.stringify(Object.fromEntries(Object.entries(localStorage)))',
265
+ returnByValue: true,
266
+ },
267
+ sessionId,
268
+ );
182
269
  if (result.exceptionDetails) return {};
183
270
  try {
184
271
  return JSON.parse(result.result?.value ?? '{}');
@@ -190,7 +277,7 @@ export async function getLocalStorage(client: CdpClient, sessionId: string): Pro
190
277
  export async function setLocalStorage(
191
278
  client: CdpClient,
192
279
  sessionId: string,
193
- data: Record<string, string>
280
+ data: Record<string, string>,
194
281
  ): Promise<void> {
195
282
  const script = Object.entries(data)
196
283
  .map(([k, v]) => `localStorage.setItem(${JSON.stringify(k)}, ${JSON.stringify(v)})`)
@@ -201,16 +288,28 @@ export async function setLocalStorage(
201
288
  exceptionDetails?: { text: string; exception?: { description?: string } };
202
289
  }>('Runtime.evaluate', { expression: script, returnByValue: true }, sessionId);
203
290
  if (result.exceptionDetails) {
204
- throw new Error(`setLocalStorage failed: ${result.exceptionDetails.exception?.description ?? result.exceptionDetails.text}`);
291
+ throw new Error(
292
+ `setLocalStorage failed: ${result.exceptionDetails.exception?.description ?? result.exceptionDetails.text}`,
293
+ );
205
294
  }
206
295
  }
207
296
  }
208
297
 
209
- export async function getSessionStorage(client: CdpClient, sessionId: string): Promise<Record<string, string>> {
210
- const result = await client.send<{ result: { value?: string }; exceptionDetails?: { text: string; exception?: { description?: string } } }>('Runtime.evaluate', {
211
- expression: 'JSON.stringify(Object.fromEntries(Object.entries(sessionStorage)))',
212
- returnByValue: true,
213
- }, sessionId);
298
+ export async function getSessionStorage(
299
+ client: CdpClient,
300
+ sessionId: string,
301
+ ): Promise<Record<string, string>> {
302
+ const result = await client.send<{
303
+ result: { value?: string };
304
+ exceptionDetails?: { text: string; exception?: { description?: string } };
305
+ }>(
306
+ 'Runtime.evaluate',
307
+ {
308
+ expression: 'JSON.stringify(Object.fromEntries(Object.entries(sessionStorage)))',
309
+ returnByValue: true,
310
+ },
311
+ sessionId,
312
+ );
214
313
  if (result.exceptionDetails) return {};
215
314
  try {
216
315
  return JSON.parse(result.result?.value ?? '{}');
@@ -222,7 +321,7 @@ export async function getSessionStorage(client: CdpClient, sessionId: string): P
222
321
  export async function setSessionStorage(
223
322
  client: CdpClient,
224
323
  sessionId: string,
225
- data: Record<string, string>
324
+ data: Record<string, string>,
226
325
  ): Promise<void> {
227
326
  const script = Object.entries(data)
228
327
  .map(([k, v]) => `sessionStorage.setItem(${JSON.stringify(k)}, ${JSON.stringify(v)})`)
@@ -233,7 +332,9 @@ export async function setSessionStorage(
233
332
  exceptionDetails?: { text: string; exception?: { description?: string } };
234
333
  }>('Runtime.evaluate', { expression: script, returnByValue: true }, sessionId);
235
334
  if (result.exceptionDetails) {
236
- throw new Error(`setSessionStorage failed: ${result.exceptionDetails.exception?.description ?? result.exceptionDetails.text}`);
335
+ throw new Error(
336
+ `setSessionStorage failed: ${result.exceptionDetails.exception?.description ?? result.exceptionDetails.text}`,
337
+ );
237
338
  }
238
339
  }
239
340
  }
@@ -1,7 +1,7 @@
1
+ import { writeFile } from 'node:fs/promises';
2
+ import { tmpdir } from 'node:os';
3
+ import { join } from 'node:path';
1
4
  import type { CdpClient } from './cdp.js';
2
- import { writeFile } from 'fs/promises';
3
- import { join } from 'path';
4
- import { tmpdir } from 'os';
5
5
 
6
6
  export interface PdfOptions {
7
7
  path?: string;
@@ -19,7 +19,7 @@ export interface PdfOptions {
19
19
  export async function capturePdf(
20
20
  client: CdpClient,
21
21
  sessionId: string,
22
- options: PdfOptions = {}
22
+ options: PdfOptions = {},
23
23
  ): Promise<string> {
24
24
  const params: Record<string, unknown> = {
25
25
  landscape: options.landscape ?? false,
@@ -1,27 +1,34 @@
1
+ import { writeFile } from 'node:fs/promises';
2
+ import { tmpdir } from 'node:os';
3
+ import { join } from 'node:path';
1
4
  import type { CdpClient } from './cdp.js';
2
- import { writeFile } from 'fs/promises';
3
- import { join } from 'path';
4
- import { tmpdir } from 'os';
5
5
 
6
6
  export interface ProfilerOptions {
7
7
  path?: string;
8
8
  samplingInterval?: number;
9
9
  }
10
10
 
11
+ /** Heap snapshots on a large page take far longer than the 30s CDP default. */
12
+ const HEAP_SNAPSHOT_TIMEOUT_MS = 120_000;
13
+
11
14
  const _sessions = new Set<string>();
12
15
  const _heapSessions = new Set<string>();
13
16
 
14
17
  export async function startCpuProfile(
15
18
  client: CdpClient,
16
19
  sessionId: string,
17
- options: ProfilerOptions = {}
20
+ options: ProfilerOptions = {},
18
21
  ): Promise<void> {
19
22
  if (_sessions.has(sessionId)) {
20
23
  throw new Error('CPU profiler already running for this session');
21
24
  }
22
25
  await client.send('Profiler.enable', {}, sessionId);
23
26
  if (options.samplingInterval !== undefined) {
24
- await client.send('Profiler.setSamplingInterval', { interval: options.samplingInterval }, sessionId);
27
+ await client.send(
28
+ 'Profiler.setSamplingInterval',
29
+ { interval: options.samplingInterval },
30
+ sessionId,
31
+ );
25
32
  }
26
33
  await client.send('Profiler.start', {}, sessionId);
27
34
  _sessions.add(sessionId);
@@ -30,7 +37,7 @@ export async function startCpuProfile(
30
37
  export async function stopCpuProfile(
31
38
  client: CdpClient,
32
39
  sessionId: string,
33
- outputPath?: string
40
+ outputPath?: string,
34
41
  ): Promise<string> {
35
42
  if (!_sessions.has(sessionId)) {
36
43
  throw new Error('No active CPU profiler for this session');
@@ -57,7 +64,7 @@ export function isProfilingActive(sessionId: string): boolean {
57
64
  export async function startHeapSnapshot(
58
65
  client: CdpClient,
59
66
  sessionId: string,
60
- outputPath?: string
67
+ outputPath?: string,
61
68
  ): Promise<string> {
62
69
  if (_heapSessions.has(sessionId)) {
63
70
  throw new Error('Heap snapshot already in progress for this session');
@@ -72,24 +79,37 @@ export async function startHeapSnapshot(
72
79
  });
73
80
 
74
81
  try {
75
- await new Promise<void>((resolve, reject) => {
76
- const timeoutHandle = setTimeout(() => {
77
- off2();
78
- reject(new Error('Timeout waiting for heap snapshot (120s)'));
79
- }, 120_000);
80
- const off2 = client.on('HeapProfiler.reportHeapSnapshotProgress', (params, sid) => {
81
- if (sid !== sessionId) return;
82
- if (params.finished) { clearTimeout(timeoutHandle); off2(); resolve(); }
83
- });
84
- client.send('HeapProfiler.takeHeapSnapshot', { reportProgress: true }, sessionId)
85
- .catch((err) => { clearTimeout(timeoutHandle); off2(); reject(err); });
86
- });
82
+ // Resolve on takeHeapSnapshot's own RESPONSE, not on
83
+ // `HeapProfiler.reportHeapSnapshotProgress` with finished:true. Chrome
84
+ // emits that progress event once it has finished WALKING the heap, which
85
+ // is before it has streamed a single addHeapSnapshotChunk (verified
86
+ // against Chrome 153) — so resolving there detached the chunk listener in
87
+ // the `finally` below and wrote a 0-byte snapshot every single time. The
88
+ // command response is the only signal that every chunk has been sent.
89
+ //
90
+ // reportProgress is off for the same reason: nothing consumes those
91
+ // events any more, and they are pure noise on the wire.
92
+ await client.send(
93
+ 'HeapProfiler.takeHeapSnapshot',
94
+ { reportProgress: false },
95
+ sessionId,
96
+ HEAP_SNAPSHOT_TIMEOUT_MS,
97
+ );
87
98
  } finally {
88
99
  off();
89
100
  _heapSessions.delete(sessionId);
90
101
  await client.send('HeapProfiler.disable', {}, sessionId).catch(() => {});
91
102
  }
92
103
 
104
+ // A zero-chunk snapshot is not a snapshot. Writing the empty file anyway is
105
+ // how this bug stayed invisible — the caller got a path, and only noticed
106
+ // when DevTools refused to load it.
107
+ if (chunks.length === 0) {
108
+ throw new Error(
109
+ 'Heap snapshot produced no data — Chrome accepted HeapProfiler.takeHeapSnapshot but sent no chunks',
110
+ );
111
+ }
112
+
93
113
  const path = outputPath ?? join(tmpdir(), `monomind-heap-${Date.now()}.heapsnapshot`);
94
114
  await writeFile(path, chunks.join(''));
95
115
  return path;
@@ -1,7 +1,7 @@
1
+ import { writeFile } from 'node:fs/promises';
2
+ import { tmpdir } from 'node:os';
3
+ import { join } from 'node:path';
1
4
  import type { CdpClient } from './cdp.js';
2
- import { writeFile } from 'fs/promises';
3
- import { join } from 'path';
4
- import { tmpdir } from 'os';
5
5
 
6
6
  export interface RecordOptions {
7
7
  path?: string;
@@ -34,7 +34,7 @@ const _sessions = new Map<string, RecordingState>();
34
34
  export async function startRecording(
35
35
  client: CdpClient,
36
36
  sessionId: string,
37
- options: RecordOptions = {}
37
+ options: RecordOptions = {},
38
38
  ): Promise<void> {
39
39
  const existing = _sessions.get(sessionId);
40
40
  if (existing && !existing.autoStopped) {
@@ -48,7 +48,12 @@ export async function startRecording(
48
48
  _sessions.delete(sessionId);
49
49
  }
50
50
 
51
- const state: RecordingState = { frames: [], offScreencast: null, totalBytes: 0, autoStopped: false };
51
+ const state: RecordingState = {
52
+ frames: [],
53
+ offScreencast: null,
54
+ totalBytes: 0,
55
+ autoStopped: false,
56
+ };
52
57
  _sessions.set(sessionId, state);
53
58
 
54
59
  state.offScreencast = client.on('Page.screencastFrame', async (params, sid) => {
@@ -63,22 +68,28 @@ export async function startRecording(
63
68
  // eslint-disable-next-line no-console
64
69
  console.error(
65
70
  `[monobrowse] Screen recording auto-stopped: reached ${Math.round(MAX_SCREENCAST_BYTES / (1024 * 1024))}MB ` +
66
- `of buffered frame data (${state.frames.length} frames). Call "record stop" to save what was captured.`
71
+ `of buffered frame data (${state.frames.length} frames). Call "record stop" to save what was captured.`,
67
72
  );
68
73
  await client.send('Page.stopScreencast', {}, sessionId).catch(() => {});
69
74
  }
70
75
  }
71
- await client.send('Page.screencastFrameAck', { sessionId: frameSessionId }, sessionId).catch(() => {});
76
+ await client
77
+ .send('Page.screencastFrameAck', { sessionId: frameSessionId }, sessionId)
78
+ .catch(() => {});
72
79
  });
73
80
 
74
81
  try {
75
- await client.send('Page.startScreencast', {
76
- format: options.format ?? 'jpeg',
77
- quality: options.quality ?? 80,
78
- everyNthFrame: options.everyNthFrame ?? 1,
79
- ...(options.maxWidth ? { maxWidth: options.maxWidth } : {}),
80
- ...(options.maxHeight ? { maxHeight: options.maxHeight } : {}),
81
- }, sessionId);
82
+ await client.send(
83
+ 'Page.startScreencast',
84
+ {
85
+ format: options.format ?? 'jpeg',
86
+ quality: options.quality ?? 80,
87
+ everyNthFrame: options.everyNthFrame ?? 1,
88
+ ...(options.maxWidth ? { maxWidth: options.maxWidth } : {}),
89
+ ...(options.maxHeight ? { maxHeight: options.maxHeight } : {}),
90
+ },
91
+ sessionId,
92
+ );
82
93
  } catch (err) {
83
94
  state.offScreencast?.();
84
95
  _sessions.delete(sessionId);
@@ -89,7 +100,7 @@ export async function startRecording(
89
100
  export async function stopRecording(
90
101
  client: CdpClient,
91
102
  sessionId: string,
92
- outputPath?: string
103
+ outputPath?: string,
93
104
  ): Promise<string> {
94
105
  const state = _sessions.get(sessionId);
95
106
  if (!state) throw new Error('No active recording for this session');
@@ -110,16 +121,24 @@ export async function stopRecording(
110
121
  return path;
111
122
  }
112
123
 
113
- export function getRecordingStatus(sessionId: string): { recording: boolean; frames: number; autoStopped: boolean } {
124
+ export function getRecordingStatus(sessionId: string): {
125
+ recording: boolean;
126
+ frames: number;
127
+ autoStopped: boolean;
128
+ } {
114
129
  const state = _sessions.get(sessionId);
115
- return { recording: !!state && !state.autoStopped, frames: state?.frames.length ?? 0, autoStopped: state?.autoStopped ?? false };
130
+ return {
131
+ recording: !!state && !state.autoStopped,
132
+ frames: state?.frames.length ?? 0,
133
+ autoStopped: state?.autoStopped ?? false,
134
+ };
116
135
  }
117
136
 
118
137
  export async function saveFrameAsPng(
119
- client: CdpClient,
138
+ _client: CdpClient,
120
139
  sessionId: string,
121
140
  frameIndex: number,
122
- outputPath: string
141
+ outputPath: string,
123
142
  ): Promise<void> {
124
143
  const state = _sessions.get(sessionId);
125
144
  if (!state || frameIndex >= state.frames.length) {