@vforsh/argus-watcher 0.1.2 → 0.1.3

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 (327) hide show
  1. package/README.md +66 -14
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/artifacts.d.ts +13 -0
  4. package/dist/artifacts.d.ts.map +1 -0
  5. package/dist/artifacts.js +27 -0
  6. package/dist/artifacts.js.map +1 -0
  7. package/dist/buffer/LogBuffer.d.ts +8 -3
  8. package/dist/buffer/LogBuffer.d.ts.map +1 -1
  9. package/dist/buffer/LogBuffer.js +9 -1
  10. package/dist/buffer/LogBuffer.js.map +1 -1
  11. package/dist/buffer/NetBuffer.d.ts +29 -0
  12. package/dist/buffer/NetBuffer.d.ts.map +1 -0
  13. package/dist/buffer/NetBuffer.js +85 -0
  14. package/dist/buffer/NetBuffer.js.map +1 -0
  15. package/dist/cdp/accessibility.d.ts +18 -0
  16. package/dist/cdp/accessibility.d.ts.map +1 -0
  17. package/dist/cdp/accessibility.js +300 -0
  18. package/dist/cdp/accessibility.js.map +1 -0
  19. package/dist/cdp/connection.d.ts +24 -0
  20. package/dist/cdp/connection.d.ts.map +1 -0
  21. package/dist/cdp/connection.js +131 -0
  22. package/dist/cdp/connection.js.map +1 -0
  23. package/dist/cdp/dom/fill.d.ts +22 -0
  24. package/dist/cdp/dom/fill.d.ts.map +1 -0
  25. package/dist/cdp/dom/fill.js +59 -0
  26. package/dist/cdp/dom/fill.js.map +1 -0
  27. package/dist/cdp/dom/info.d.ts +14 -0
  28. package/dist/cdp/dom/info.d.ts.map +1 -0
  29. package/dist/cdp/dom/info.js +52 -0
  30. package/dist/cdp/dom/info.js.map +1 -0
  31. package/dist/cdp/dom/insert.d.ts +19 -0
  32. package/dist/cdp/dom/insert.d.ts.map +1 -0
  33. package/dist/cdp/dom/insert.js +30 -0
  34. package/dist/cdp/dom/insert.js.map +1 -0
  35. package/dist/cdp/dom/modify.d.ts +50 -0
  36. package/dist/cdp/dom/modify.d.ts.map +1 -0
  37. package/dist/cdp/dom/modify.js +100 -0
  38. package/dist/cdp/dom/modify.js.map +1 -0
  39. package/dist/cdp/dom/remove.d.ts +17 -0
  40. package/dist/cdp/dom/remove.d.ts.map +1 -0
  41. package/dist/cdp/dom/remove.js +27 -0
  42. package/dist/cdp/dom/remove.js.map +1 -0
  43. package/dist/cdp/dom/selector.d.ts +19 -0
  44. package/dist/cdp/dom/selector.d.ts.map +1 -0
  45. package/dist/cdp/dom/selector.js +64 -0
  46. package/dist/cdp/dom/selector.js.map +1 -0
  47. package/dist/cdp/dom/setFile.d.ts +21 -0
  48. package/dist/cdp/dom/setFile.d.ts.map +1 -0
  49. package/dist/cdp/dom/setFile.js +82 -0
  50. package/dist/cdp/dom/setFile.js.map +1 -0
  51. package/dist/cdp/dom/submit.d.ts +15 -0
  52. package/dist/cdp/dom/submit.d.ts.map +1 -0
  53. package/dist/cdp/dom/submit.js +130 -0
  54. package/dist/cdp/dom/submit.js.map +1 -0
  55. package/dist/cdp/dom/tree.d.ts +16 -0
  56. package/dist/cdp/dom/tree.d.ts.map +1 -0
  57. package/dist/cdp/dom/tree.js +100 -0
  58. package/dist/cdp/dom/tree.js.map +1 -0
  59. package/dist/cdp/dom/types.d.ts +16 -0
  60. package/dist/cdp/dom/types.d.ts.map +1 -0
  61. package/dist/cdp/dom/types.js +2 -0
  62. package/dist/cdp/dom/types.js.map +1 -0
  63. package/dist/cdp/dom.d.ts +17 -0
  64. package/dist/cdp/dom.d.ts.map +1 -0
  65. package/dist/cdp/dom.js +10 -0
  66. package/dist/cdp/dom.js.map +1 -0
  67. package/dist/cdp/emulation.d.ts +16 -0
  68. package/dist/cdp/emulation.d.ts.map +1 -0
  69. package/dist/cdp/emulation.js +40 -0
  70. package/dist/cdp/emulation.js.map +1 -0
  71. package/dist/cdp/eval.d.ts +10 -0
  72. package/dist/cdp/eval.d.ts.map +1 -0
  73. package/dist/cdp/eval.js +34 -0
  74. package/dist/cdp/eval.js.map +1 -0
  75. package/dist/cdp/keyboard.d.ts +38 -0
  76. package/dist/cdp/keyboard.d.ts.map +1 -0
  77. package/dist/cdp/keyboard.js +148 -0
  78. package/dist/cdp/keyboard.js.map +1 -0
  79. package/dist/cdp/mouse.d.ts +49 -0
  80. package/dist/cdp/mouse.d.ts.map +1 -0
  81. package/dist/cdp/mouse.js +199 -0
  82. package/dist/cdp/mouse.js.map +1 -0
  83. package/dist/cdp/networkCapture.d.ts +11 -0
  84. package/dist/cdp/networkCapture.d.ts.map +1 -0
  85. package/dist/cdp/networkCapture.js +99 -0
  86. package/dist/cdp/networkCapture.js.map +1 -0
  87. package/dist/cdp/pageIndicator.d.ts +41 -0
  88. package/dist/cdp/pageIndicator.d.ts.map +1 -0
  89. package/dist/cdp/pageIndicator.js +395 -0
  90. package/dist/cdp/pageIndicator.js.map +1 -0
  91. package/dist/cdp/redaction.d.ts +3 -0
  92. package/dist/cdp/redaction.d.ts.map +1 -0
  93. package/dist/cdp/redaction.js +35 -0
  94. package/dist/cdp/redaction.js.map +1 -0
  95. package/dist/cdp/remoteObject.d.ts +6 -0
  96. package/dist/cdp/remoteObject.d.ts.map +1 -0
  97. package/dist/cdp/remoteObject.js +94 -0
  98. package/dist/cdp/remoteObject.js.map +1 -0
  99. package/dist/cdp/screenshot.d.ts +10 -0
  100. package/dist/cdp/screenshot.d.ts.map +1 -0
  101. package/dist/cdp/screenshot.js +87 -0
  102. package/dist/cdp/screenshot.js.map +1 -0
  103. package/dist/cdp/storageLocal.d.ts +8 -0
  104. package/dist/cdp/storageLocal.d.ts.map +1 -0
  105. package/dist/cdp/storageLocal.js +70 -0
  106. package/dist/cdp/storageLocal.js.map +1 -0
  107. package/dist/cdp/text-filter.d.ts +19 -0
  108. package/dist/cdp/text-filter.d.ts.map +1 -0
  109. package/dist/cdp/text-filter.js +54 -0
  110. package/dist/cdp/text-filter.js.map +1 -0
  111. package/dist/cdp/throttle.d.ts +6 -0
  112. package/dist/cdp/throttle.d.ts.map +1 -0
  113. package/dist/cdp/throttle.js +9 -0
  114. package/dist/cdp/throttle.js.map +1 -0
  115. package/dist/cdp/tracing.d.ts +14 -0
  116. package/dist/cdp/tracing.d.ts.map +1 -0
  117. package/dist/cdp/tracing.js +115 -0
  118. package/dist/cdp/tracing.js.map +1 -0
  119. package/dist/cdp/watcher.d.ts +17 -2
  120. package/dist/cdp/watcher.d.ts.map +1 -1
  121. package/dist/cdp/watcher.js +124 -175
  122. package/dist/cdp/watcher.js.map +1 -1
  123. package/dist/emulation/EmulationController.d.ts +12 -0
  124. package/dist/emulation/EmulationController.d.ts.map +1 -0
  125. package/dist/emulation/EmulationController.js +83 -0
  126. package/dist/emulation/EmulationController.js.map +1 -0
  127. package/dist/events.d.ts +86 -0
  128. package/dist/events.d.ts.map +1 -0
  129. package/dist/events.js +2 -0
  130. package/dist/events.js.map +1 -0
  131. package/dist/fileLogs/WatcherFileLogger.d.ts +5 -2
  132. package/dist/fileLogs/WatcherFileLogger.d.ts.map +1 -1
  133. package/dist/fileLogs/WatcherFileLogger.js +30 -12
  134. package/dist/fileLogs/WatcherFileLogger.js.map +1 -1
  135. package/dist/http/httpUtils.d.ts +25 -0
  136. package/dist/http/httpUtils.d.ts.map +1 -0
  137. package/dist/http/httpUtils.js +170 -0
  138. package/dist/http/httpUtils.js.map +1 -0
  139. package/dist/http/router.d.ts +5 -0
  140. package/dist/http/router.d.ts.map +1 -0
  141. package/dist/http/router.js +81 -0
  142. package/dist/http/router.js.map +1 -0
  143. package/dist/http/routes/getEmulation.d.ts +3 -0
  144. package/dist/http/routes/getEmulation.d.ts.map +1 -0
  145. package/dist/http/routes/getEmulation.js +8 -0
  146. package/dist/http/routes/getEmulation.js.map +1 -0
  147. package/dist/http/routes/getLogs.d.ts +3 -0
  148. package/dist/http/routes/getLogs.d.ts.map +1 -0
  149. package/dist/http/routes/getLogs.js +28 -0
  150. package/dist/http/routes/getLogs.js.map +1 -0
  151. package/dist/http/routes/getNet.d.ts +3 -0
  152. package/dist/http/routes/getNet.d.ts.map +1 -0
  153. package/dist/http/routes/getNet.js +17 -0
  154. package/dist/http/routes/getNet.js.map +1 -0
  155. package/dist/http/routes/getNetTail.d.ts +3 -0
  156. package/dist/http/routes/getNetTail.d.ts.map +1 -0
  157. package/dist/http/routes/getNetTail.js +18 -0
  158. package/dist/http/routes/getNetTail.js.map +1 -0
  159. package/dist/http/routes/getStatus.d.ts +3 -0
  160. package/dist/http/routes/getStatus.d.ts.map +1 -0
  161. package/dist/http/routes/getStatus.js +21 -0
  162. package/dist/http/routes/getStatus.js.map +1 -0
  163. package/dist/http/routes/getTail.d.ts +3 -0
  164. package/dist/http/routes/getTail.d.ts.map +1 -0
  165. package/dist/http/routes/getTail.js +28 -0
  166. package/dist/http/routes/getTail.js.map +1 -0
  167. package/dist/http/routes/getTargets.d.ts +3 -0
  168. package/dist/http/routes/getTargets.d.ts.map +1 -0
  169. package/dist/http/routes/getTargets.js +16 -0
  170. package/dist/http/routes/getTargets.js.map +1 -0
  171. package/dist/http/routes/getThrottle.d.ts +3 -0
  172. package/dist/http/routes/getThrottle.d.ts.map +1 -0
  173. package/dist/http/routes/getThrottle.js +8 -0
  174. package/dist/http/routes/getThrottle.js.map +1 -0
  175. package/dist/http/routes/postAttach.d.ts +3 -0
  176. package/dist/http/routes/postAttach.d.ts.map +1 -0
  177. package/dist/http/routes/postAttach.js +23 -0
  178. package/dist/http/routes/postAttach.js.map +1 -0
  179. package/dist/http/routes/postDetach.d.ts +3 -0
  180. package/dist/http/routes/postDetach.d.ts.map +1 -0
  181. package/dist/http/routes/postDetach.js +23 -0
  182. package/dist/http/routes/postDetach.js.map +1 -0
  183. package/dist/http/routes/postDomAdd.d.ts +7 -0
  184. package/dist/http/routes/postDomAdd.d.ts.map +1 -0
  185. package/dist/http/routes/postDomAdd.js +97 -0
  186. package/dist/http/routes/postDomAdd.js.map +1 -0
  187. package/dist/http/routes/postDomClick.d.ts +3 -0
  188. package/dist/http/routes/postDomClick.d.ts.map +1 -0
  189. package/dist/http/routes/postDomClick.js +85 -0
  190. package/dist/http/routes/postDomClick.js.map +1 -0
  191. package/dist/http/routes/postDomFill.d.ts +3 -0
  192. package/dist/http/routes/postDomFill.d.ts.map +1 -0
  193. package/dist/http/routes/postDomFill.js +58 -0
  194. package/dist/http/routes/postDomFill.js.map +1 -0
  195. package/dist/http/routes/postDomFocus.d.ts +3 -0
  196. package/dist/http/routes/postDomFocus.d.ts.map +1 -0
  197. package/dist/http/routes/postDomFocus.js +40 -0
  198. package/dist/http/routes/postDomFocus.js.map +1 -0
  199. package/dist/http/routes/postDomHover.d.ts +3 -0
  200. package/dist/http/routes/postDomHover.d.ts.map +1 -0
  201. package/dist/http/routes/postDomHover.js +40 -0
  202. package/dist/http/routes/postDomHover.js.map +1 -0
  203. package/dist/http/routes/postDomInfo.d.ts +3 -0
  204. package/dist/http/routes/postDomInfo.d.ts.map +1 -0
  205. package/dist/http/routes/postDomInfo.js +40 -0
  206. package/dist/http/routes/postDomInfo.js.map +1 -0
  207. package/dist/http/routes/postDomKeydown.d.ts +3 -0
  208. package/dist/http/routes/postDomKeydown.d.ts.map +1 -0
  209. package/dist/http/routes/postDomKeydown.js +36 -0
  210. package/dist/http/routes/postDomKeydown.js.map +1 -0
  211. package/dist/http/routes/postDomModify.d.ts +3 -0
  212. package/dist/http/routes/postDomModify.d.ts.map +1 -0
  213. package/dist/http/routes/postDomModify.js +45 -0
  214. package/dist/http/routes/postDomModify.js.map +1 -0
  215. package/dist/http/routes/postDomRemove.d.ts +3 -0
  216. package/dist/http/routes/postDomRemove.d.ts.map +1 -0
  217. package/dist/http/routes/postDomRemove.js +39 -0
  218. package/dist/http/routes/postDomRemove.js.map +1 -0
  219. package/dist/http/routes/postDomScroll.d.ts +3 -0
  220. package/dist/http/routes/postDomScroll.d.ts.map +1 -0
  221. package/dist/http/routes/postDomScroll.js +75 -0
  222. package/dist/http/routes/postDomScroll.js.map +1 -0
  223. package/dist/http/routes/postDomScrollTo.d.ts +3 -0
  224. package/dist/http/routes/postDomScrollTo.d.ts.map +1 -0
  225. package/dist/http/routes/postDomScrollTo.js +69 -0
  226. package/dist/http/routes/postDomScrollTo.js.map +1 -0
  227. package/dist/http/routes/postDomSetFile.d.ts +3 -0
  228. package/dist/http/routes/postDomSetFile.d.ts.map +1 -0
  229. package/dist/http/routes/postDomSetFile.js +67 -0
  230. package/dist/http/routes/postDomSetFile.js.map +1 -0
  231. package/dist/http/routes/postDomSubmit.d.ts +3 -0
  232. package/dist/http/routes/postDomSubmit.d.ts.map +1 -0
  233. package/dist/http/routes/postDomSubmit.js +49 -0
  234. package/dist/http/routes/postDomSubmit.js.map +1 -0
  235. package/dist/http/routes/postDomTree.d.ts +3 -0
  236. package/dist/http/routes/postDomTree.d.ts.map +1 -0
  237. package/dist/http/routes/postDomTree.js +41 -0
  238. package/dist/http/routes/postDomTree.js.map +1 -0
  239. package/dist/http/routes/postEmulation.d.ts +3 -0
  240. package/dist/http/routes/postEmulation.d.ts.map +1 -0
  241. package/dist/http/routes/postEmulation.js +70 -0
  242. package/dist/http/routes/postEmulation.js.map +1 -0
  243. package/dist/http/routes/postEval.d.ts +3 -0
  244. package/dist/http/routes/postEval.d.ts.map +1 -0
  245. package/dist/http/routes/postEval.js +26 -0
  246. package/dist/http/routes/postEval.js.map +1 -0
  247. package/dist/http/routes/postReload.d.ts +3 -0
  248. package/dist/http/routes/postReload.d.ts.map +1 -0
  249. package/dist/http/routes/postReload.js +20 -0
  250. package/dist/http/routes/postReload.js.map +1 -0
  251. package/dist/http/routes/postScreenshot.d.ts +3 -0
  252. package/dist/http/routes/postScreenshot.d.ts.map +1 -0
  253. package/dist/http/routes/postScreenshot.js +17 -0
  254. package/dist/http/routes/postScreenshot.js.map +1 -0
  255. package/dist/http/routes/postShutdown.d.ts +3 -0
  256. package/dist/http/routes/postShutdown.d.ts.map +1 -0
  257. package/dist/http/routes/postShutdown.js +13 -0
  258. package/dist/http/routes/postShutdown.js.map +1 -0
  259. package/dist/http/routes/postSnapshot.d.ts +3 -0
  260. package/dist/http/routes/postSnapshot.d.ts.map +1 -0
  261. package/dist/http/routes/postSnapshot.js +28 -0
  262. package/dist/http/routes/postSnapshot.js.map +1 -0
  263. package/dist/http/routes/postStorageLocal.d.ts +3 -0
  264. package/dist/http/routes/postStorageLocal.d.ts.map +1 -0
  265. package/dist/http/routes/postStorageLocal.js +31 -0
  266. package/dist/http/routes/postStorageLocal.js.map +1 -0
  267. package/dist/http/routes/postThrottle.d.ts +3 -0
  268. package/dist/http/routes/postThrottle.d.ts.map +1 -0
  269. package/dist/http/routes/postThrottle.js +38 -0
  270. package/dist/http/routes/postThrottle.js.map +1 -0
  271. package/dist/http/routes/postTraceStart.d.ts +3 -0
  272. package/dist/http/routes/postTraceStart.d.ts.map +1 -0
  273. package/dist/http/routes/postTraceStart.js +17 -0
  274. package/dist/http/routes/postTraceStart.js.map +1 -0
  275. package/dist/http/routes/postTraceStop.d.ts +3 -0
  276. package/dist/http/routes/postTraceStop.d.ts.map +1 -0
  277. package/dist/http/routes/postTraceStop.js +17 -0
  278. package/dist/http/routes/postTraceStop.js.map +1 -0
  279. package/dist/http/routes/types.d.ts +9 -0
  280. package/dist/http/routes/types.d.ts.map +1 -0
  281. package/dist/http/routes/types.js +10 -0
  282. package/dist/http/routes/types.js.map +1 -0
  283. package/dist/http/server.d.ts +40 -1
  284. package/dist/http/server.d.ts.map +1 -1
  285. package/dist/http/server.js +3 -82
  286. package/dist/http/server.js.map +1 -1
  287. package/dist/index.d.ts +117 -14
  288. package/dist/index.d.ts.map +1 -1
  289. package/dist/index.js +330 -44
  290. package/dist/index.js.map +1 -1
  291. package/dist/native-messaging/messaging.d.ts +18 -0
  292. package/dist/native-messaging/messaging.d.ts.map +1 -0
  293. package/dist/native-messaging/messaging.js +94 -0
  294. package/dist/native-messaging/messaging.js.map +1 -0
  295. package/dist/native-messaging/session-manager.d.ts +105 -0
  296. package/dist/native-messaging/session-manager.d.ts.map +1 -0
  297. package/dist/native-messaging/session-manager.js +259 -0
  298. package/dist/native-messaging/session-manager.js.map +1 -0
  299. package/dist/native-messaging/types.d.ts +79 -0
  300. package/dist/native-messaging/types.d.ts.map +1 -0
  301. package/dist/native-messaging/types.js +6 -0
  302. package/dist/native-messaging/types.js.map +1 -0
  303. package/dist/registry/registry.d.ts +9 -2
  304. package/dist/registry/registry.d.ts.map +1 -1
  305. package/dist/registry/registry.js +53 -9
  306. package/dist/registry/registry.js.map +1 -1
  307. package/dist/scripts/install-host.d.ts +10 -0
  308. package/dist/scripts/install-host.d.ts.map +1 -0
  309. package/dist/scripts/install-host.js +189 -0
  310. package/dist/scripts/install-host.js.map +1 -0
  311. package/dist/sources/cdp-source.d.ts +24 -0
  312. package/dist/sources/cdp-source.d.ts.map +1 -0
  313. package/dist/sources/cdp-source.js +48 -0
  314. package/dist/sources/cdp-source.js.map +1 -0
  315. package/dist/sources/extension-source.d.ts +15 -0
  316. package/dist/sources/extension-source.d.ts.map +1 -0
  317. package/dist/sources/extension-source.js +256 -0
  318. package/dist/sources/extension-source.js.map +1 -0
  319. package/dist/sources/types.d.ts +92 -0
  320. package/dist/sources/types.d.ts.map +1 -0
  321. package/dist/sources/types.js +7 -0
  322. package/dist/sources/types.js.map +1 -0
  323. package/dist/throttle/ThrottleController.d.ts +12 -0
  324. package/dist/throttle/ThrottleController.d.ts.map +1 -0
  325. package/dist/throttle/ThrottleController.js +67 -0
  326. package/dist/throttle/ThrottleController.js.map +1 -0
  327. package/package.json +3 -2
@@ -0,0 +1,148 @@
1
+ import { resolveDomSelectorMatches } from './mouse.js';
2
+ const buildKeyMap = () => {
3
+ const map = new Map();
4
+ const put = (lookup, def) => {
5
+ map.set(lookup.toLowerCase(), def);
6
+ };
7
+ // Letters a-z
8
+ for (let i = 0; i < 26; i++) {
9
+ const lower = String.fromCharCode(97 + i);
10
+ const upper = String.fromCharCode(65 + i);
11
+ const code = `Key${upper}`;
12
+ const keyCode = 65 + i;
13
+ put(lower, { key: lower, code, keyCode, text: lower });
14
+ }
15
+ // Digits 0-9
16
+ for (let i = 0; i < 10; i++) {
17
+ const digit = String(i);
18
+ const code = `Digit${digit}`;
19
+ const keyCode = 48 + i;
20
+ put(digit, { key: digit, code, keyCode, text: digit });
21
+ }
22
+ // Special keys
23
+ put('Enter', { key: 'Enter', code: 'Enter', keyCode: 13, text: '\r' });
24
+ put('Tab', { key: 'Tab', code: 'Tab', keyCode: 9 });
25
+ put('Escape', { key: 'Escape', code: 'Escape', keyCode: 27 });
26
+ put('Backspace', { key: 'Backspace', code: 'Backspace', keyCode: 8 });
27
+ put('Delete', { key: 'Delete', code: 'Delete', keyCode: 46 });
28
+ put('Space', { key: ' ', code: 'Space', keyCode: 32, text: ' ' });
29
+ put(' ', { key: ' ', code: 'Space', keyCode: 32, text: ' ' });
30
+ // Arrows
31
+ put('ArrowUp', { key: 'ArrowUp', code: 'ArrowUp', keyCode: 38 });
32
+ put('ArrowDown', { key: 'ArrowDown', code: 'ArrowDown', keyCode: 40 });
33
+ put('ArrowLeft', { key: 'ArrowLeft', code: 'ArrowLeft', keyCode: 37 });
34
+ put('ArrowRight', { key: 'ArrowRight', code: 'ArrowRight', keyCode: 39 });
35
+ // Navigation
36
+ put('Home', { key: 'Home', code: 'Home', keyCode: 36 });
37
+ put('End', { key: 'End', code: 'End', keyCode: 35 });
38
+ put('PageUp', { key: 'PageUp', code: 'PageUp', keyCode: 33 });
39
+ put('PageDown', { key: 'PageDown', code: 'PageDown', keyCode: 34 });
40
+ put('Insert', { key: 'Insert', code: 'Insert', keyCode: 45 });
41
+ // F-keys
42
+ for (let i = 1; i <= 12; i++) {
43
+ const name = `F${i}`;
44
+ put(name, { key: name, code: name, keyCode: 111 + i });
45
+ }
46
+ return map;
47
+ };
48
+ const KEY_MAP = buildKeyMap();
49
+ /**
50
+ * Resolve a key name to its CDP key definition.
51
+ * Lookup is case-insensitive.
52
+ */
53
+ export const resolveKeyDefinition = (key) => {
54
+ return KEY_MAP.get(key.toLowerCase());
55
+ };
56
+ // ─────────────────────────────────────────────────────────────────────────────
57
+ // Modifier parser
58
+ // ─────────────────────────────────────────────────────────────────────────────
59
+ /** CDP modifier bitmask values. */
60
+ const MODIFIER_BITS = {
61
+ alt: 1,
62
+ ctrl: 2,
63
+ control: 2,
64
+ meta: 4,
65
+ cmd: 4,
66
+ command: 4,
67
+ shift: 8,
68
+ };
69
+ /**
70
+ * Parse a comma-separated modifier string into a CDP bitmask.
71
+ * Accepts aliases: ctrl/control, meta/cmd/command.
72
+ * Returns 0 for undefined/empty input.
73
+ */
74
+ export const parseModifiers = (input) => {
75
+ if (!input || input.trim() === '') {
76
+ return 0;
77
+ }
78
+ let mask = 0;
79
+ const parts = input.split(',');
80
+ for (const part of parts) {
81
+ const name = part.trim().toLowerCase();
82
+ if (name === '') {
83
+ continue;
84
+ }
85
+ const bit = MODIFIER_BITS[name];
86
+ if (bit == null) {
87
+ throw new Error(`Unknown modifier: "${part.trim()}"`);
88
+ }
89
+ mask |= bit;
90
+ }
91
+ return mask;
92
+ };
93
+ /**
94
+ * Dispatch a keyboard event sequence via CDP Input.dispatchKeyEvent.
95
+ *
96
+ * 1. If `selector` provided: resolve → error if 0 or >1 match → focus
97
+ * 2. Resolve key definition
98
+ * 3. Dispatch: printable → keyDown+char+keyUp; non-printable → rawKeyDown+keyUp
99
+ */
100
+ export const dispatchKeydown = async (session, options) => {
101
+ const { key, selector, modifiers = 0 } = options;
102
+ let focused = false;
103
+ // 1. Focus selector if provided
104
+ if (selector) {
105
+ const { allNodeIds, nodeIds } = await resolveDomSelectorMatches(session, selector, false);
106
+ if (allNodeIds.length === 0) {
107
+ throw new Error(`No element found for selector: ${selector}`);
108
+ }
109
+ if (allNodeIds.length > 1) {
110
+ const error = new Error(`Selector matched ${allNodeIds.length} elements; keydown requires exactly one target`);
111
+ error.code = 'multiple_matches';
112
+ throw error;
113
+ }
114
+ const nodeId = nodeIds[0];
115
+ await session.sendAndWait('DOM.focus', { nodeId });
116
+ focused = true;
117
+ }
118
+ // 2. Resolve key definition
119
+ const def = resolveKeyDefinition(key);
120
+ if (!def) {
121
+ throw new Error(`Unknown key: "${key}"`);
122
+ }
123
+ // Apply shift to text for single-character printable keys
124
+ let text = def.text;
125
+ if (text && text.length === 1 && (modifiers & 8) !== 0) {
126
+ text = text.toUpperCase();
127
+ }
128
+ const isPrintable = text != null && text !== '\r';
129
+ // 3. Dispatch key events
130
+ const baseParams = {
131
+ code: def.code,
132
+ key: def.key,
133
+ windowsVirtualKeyCode: def.keyCode,
134
+ nativeVirtualKeyCode: def.keyCode,
135
+ modifiers,
136
+ };
137
+ if (isPrintable) {
138
+ await session.sendAndWait('Input.dispatchKeyEvent', { ...baseParams, type: 'keyDown', text });
139
+ await session.sendAndWait('Input.dispatchKeyEvent', { ...baseParams, type: 'char', text });
140
+ await session.sendAndWait('Input.dispatchKeyEvent', { ...baseParams, type: 'keyUp' });
141
+ }
142
+ else {
143
+ await session.sendAndWait('Input.dispatchKeyEvent', { ...baseParams, type: 'rawKeyDown', text: def.text });
144
+ await session.sendAndWait('Input.dispatchKeyEvent', { ...baseParams, type: 'keyUp' });
145
+ }
146
+ return { key: def.key, modifiers, focused };
147
+ };
148
+ //# sourceMappingURL=keyboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyboard.js","sourceRoot":"","sources":["../../src/cdp/keyboard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type { CdpSessionHandle } from './connection.js';
2
+ type SelectorMatchResult = {
3
+ allNodeIds: number[];
4
+ nodeIds: number[];
5
+ };
6
+ type Point = {
7
+ x: number;
8
+ y: number;
9
+ };
10
+ export declare const resolveDomSelectorMatches: (session: CdpSessionHandle, selector: string, all: boolean, text?: string) => Promise<SelectorMatchResult>;
11
+ export declare const hoverDomNodes: (session: CdpSessionHandle, nodeIds: number[]) => Promise<void>;
12
+ export declare const clickAtPoint: (session: CdpSessionHandle, x: number, y: number, button?: "left" | "middle" | "right") => Promise<void>;
13
+ export declare const resolveNodeTopLeft: (session: CdpSessionHandle, nodeId: number) => Promise<Point>;
14
+ export declare const clickDomNodes: (session: CdpSessionHandle, nodeIds: number[], button?: "left" | "middle" | "right") => Promise<void>;
15
+ export declare const focusDomNodes: (session: CdpSessionHandle, nodeIds: number[]) => Promise<void>;
16
+ export declare const scrollIntoView: (session: CdpSessionHandle, nodeId: number) => Promise<void>;
17
+ type ScrollPosition = {
18
+ scrollX: number;
19
+ scrollY: number;
20
+ };
21
+ type ScrollMode = {
22
+ to?: {
23
+ x: number;
24
+ y: number;
25
+ };
26
+ by?: {
27
+ x: number;
28
+ y: number;
29
+ };
30
+ };
31
+ /**
32
+ * Scroll matched DOM elements. If mode has to/by, scrolls within the element container.
33
+ * Otherwise scrolls each element into view.
34
+ */
35
+ export declare const scrollDomNodes: (session: CdpSessionHandle, nodeIds: number[], mode: ScrollMode) => Promise<ScrollPosition>;
36
+ /** Scroll the page viewport to an absolute or relative position. */
37
+ export declare const scrollViewport: (session: CdpSessionHandle, mode: ScrollMode) => Promise<ScrollPosition>;
38
+ /** Dispatch a mouseWheel event at the given viewport coordinates. */
39
+ export declare const emulateScroll: (session: CdpSessionHandle, x: number, y: number, delta: {
40
+ x: number;
41
+ y: number;
42
+ }) => Promise<void>;
43
+ /** Emulate touch scroll gestures on resolved DOM nodes (scrolls at each element's center). */
44
+ export declare const emulateScrollOnNodes: (session: CdpSessionHandle, nodeIds: number[], delta: {
45
+ x: number;
46
+ y: number;
47
+ }) => Promise<void>;
48
+ export {};
49
+ //# sourceMappingURL=mouse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mouse.d.ts","sourceRoot":"","sources":["../../src/cdp/mouse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAGvD,KAAK,mBAAmB,GAAG;IAC1B,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,OAAO,EAAE,MAAM,EAAE,CAAA;CACjB,CAAA;AAED,KAAK,KAAK,GAAG;IACZ,CAAC,EAAE,MAAM,CAAA;IACT,CAAC,EAAE,MAAM,CAAA;CACT,CAAA;AAED,eAAO,MAAM,yBAAyB,GACrC,SAAS,gBAAgB,EACzB,UAAU,MAAM,EAChB,KAAK,OAAO,EACZ,OAAO,MAAM,KACX,OAAO,CAAC,mBAAmB,CAc7B,CAAA;AAED,eAAO,MAAM,aAAa,GAAU,SAAS,gBAAgB,EAAE,SAAS,MAAM,EAAE,KAAG,OAAO,CAAC,IAAI,CAU9F,CAAA;AAKD,eAAO,MAAM,YAAY,GAAU,SAAS,gBAAgB,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,SAAQ,MAAM,GAAG,QAAQ,GAAG,OAAgB,KAAG,OAAO,CAAC,IAAI,CAK9I,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAU,SAAS,gBAAgB,EAAE,QAAQ,MAAM,KAAG,OAAO,CAAC,KAAK,CAMjG,CAAA;AAED,eAAO,MAAM,aAAa,GAAU,SAAS,gBAAgB,EAAE,SAAS,MAAM,EAAE,EAAE,SAAQ,MAAM,GAAG,QAAQ,GAAG,OAAgB,KAAG,OAAO,CAAC,IAAI,CAa5I,CAAA;AAED,eAAO,MAAM,aAAa,GAAU,SAAS,gBAAgB,EAAE,SAAS,MAAM,EAAE,KAAG,OAAO,CAAC,IAAI,CAS9F,CAAA;AAWD,eAAO,MAAM,cAAc,GAAU,SAAS,gBAAgB,EAAE,QAAQ,MAAM,KAAG,OAAO,CAAC,IAAI,CAoB5F,CAAA;AAED,KAAK,cAAc,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAE1D,KAAK,UAAU,GAAG;IAAE,EAAE,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,EAAE,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAA;AAElF;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAU,SAAS,gBAAgB,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,UAAU,KAAG,OAAO,CAAC,cAAc,CAc3H,CAAA;AAED,oEAAoE;AACpE,eAAO,MAAM,cAAc,GAAU,SAAS,gBAAgB,EAAE,MAAM,UAAU,KAAG,OAAO,CAAC,cAAc,CAUxG,CAAA;AA2DD,qEAAqE;AACrE,eAAO,MAAM,aAAa,GAAU,SAAS,gBAAgB,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,OAAO;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,KAAG,OAAO,CAAC,IAAI,CAQlI,CAAA;AAED,8FAA8F;AAC9F,eAAO,MAAM,oBAAoB,GAAU,SAAS,gBAAgB,EAAE,SAAS,MAAM,EAAE,EAAE,OAAO;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,KAAG,OAAO,CAAC,IAAI,CAUtI,CAAA"}
@@ -0,0 +1,199 @@
1
+ import { filterNodesByText } from './text-filter.js';
2
+ export const resolveDomSelectorMatches = async (session, selector, all, text) => {
3
+ await session.sendAndWait('DOM.enable');
4
+ const rootId = await getDomRootId(session);
5
+ const result = (await session.sendAndWait('DOM.querySelectorAll', { nodeId: rootId, selector }));
6
+ let allNodeIds = result.nodeIds ?? [];
7
+ if (text != null) {
8
+ allNodeIds = await filterNodesByText(session, allNodeIds, text);
9
+ }
10
+ const nodeIds = all ? allNodeIds : allNodeIds.slice(0, 1);
11
+ return { allNodeIds, nodeIds };
12
+ };
13
+ export const hoverDomNodes = async (session, nodeIds) => {
14
+ if (nodeIds.length === 0) {
15
+ return;
16
+ }
17
+ for (const nodeId of nodeIds) {
18
+ await scrollIntoView(session, nodeId);
19
+ const point = await resolveNodeCenter(session, nodeId);
20
+ await dispatchMouseEvent(session, { type: 'mouseMoved', x: point.x, y: point.y });
21
+ }
22
+ };
23
+ /** CDP buttons bitmask per button name. */
24
+ const BUTTON_MASK = { left: 1, middle: 4, right: 2 };
25
+ export const clickAtPoint = async (session, x, y, button = 'left') => {
26
+ const mask = BUTTON_MASK[button] ?? 1;
27
+ await dispatchMouseEvent(session, { type: 'mouseMoved', x, y });
28
+ await dispatchMouseEvent(session, { type: 'mousePressed', x, y, button, buttons: mask, clickCount: 1 });
29
+ await dispatchMouseEvent(session, { type: 'mouseReleased', x, y, button, buttons: 0, clickCount: 1 });
30
+ };
31
+ export const resolveNodeTopLeft = async (session, nodeId) => {
32
+ const { x, y, w, h } = await resolveNodeRect(session, nodeId);
33
+ if (w <= 0 || h <= 0) {
34
+ throw createNotInteractableError('Element has zero area');
35
+ }
36
+ return { x, y };
37
+ };
38
+ export const clickDomNodes = async (session, nodeIds, button = 'left') => {
39
+ if (nodeIds.length === 0) {
40
+ return;
41
+ }
42
+ const mask = BUTTON_MASK[button] ?? 1;
43
+ for (const nodeId of nodeIds) {
44
+ await scrollIntoView(session, nodeId);
45
+ const point = await resolveNodeCenter(session, nodeId);
46
+ await dispatchMouseEvent(session, { type: 'mouseMoved', x: point.x, y: point.y });
47
+ await dispatchMouseEvent(session, { type: 'mousePressed', x: point.x, y: point.y, button, buttons: mask, clickCount: 1 });
48
+ await dispatchMouseEvent(session, { type: 'mouseReleased', x: point.x, y: point.y, button, buttons: 0, clickCount: 1 });
49
+ }
50
+ };
51
+ export const focusDomNodes = async (session, nodeIds) => {
52
+ if (nodeIds.length === 0) {
53
+ return;
54
+ }
55
+ for (const nodeId of nodeIds) {
56
+ await scrollIntoView(session, nodeId);
57
+ await session.sendAndWait('DOM.focus', { nodeId });
58
+ }
59
+ };
60
+ const getDomRootId = async (session) => {
61
+ const result = (await session.sendAndWait('DOM.getDocument', { depth: 1 }));
62
+ const rootId = result.root?.nodeId;
63
+ if (!rootId) {
64
+ throw new Error('Unable to resolve DOM root');
65
+ }
66
+ return rootId;
67
+ };
68
+ export const scrollIntoView = async (session, nodeId) => {
69
+ try {
70
+ await session.sendAndWait('DOM.scrollIntoViewIfNeeded', { nodeId });
71
+ return;
72
+ }
73
+ catch {
74
+ // Fallback to runtime evaluation if CDP cannot scroll directly.
75
+ }
76
+ const resolved = (await session.sendAndWait('DOM.resolveNode', { nodeId }));
77
+ const objectId = resolved.object?.objectId;
78
+ if (!objectId) {
79
+ throw createNotInteractableError('Unable to resolve node for scrolling');
80
+ }
81
+ await session.sendAndWait('Runtime.callFunctionOn', {
82
+ objectId,
83
+ functionDeclaration: 'function() { this.scrollIntoView({ block: "center", inline: "center" }); }',
84
+ awaitPromise: false,
85
+ returnByValue: true,
86
+ });
87
+ };
88
+ /**
89
+ * Scroll matched DOM elements. If mode has to/by, scrolls within the element container.
90
+ * Otherwise scrolls each element into view.
91
+ */
92
+ export const scrollDomNodes = async (session, nodeIds, mode) => {
93
+ if (nodeIds.length === 0) {
94
+ return getViewportScroll(session);
95
+ }
96
+ for (const nodeId of nodeIds) {
97
+ if (mode.to || mode.by) {
98
+ await scrollElementContainer(session, nodeId, mode);
99
+ }
100
+ else {
101
+ await scrollIntoView(session, nodeId);
102
+ }
103
+ }
104
+ return getViewportScroll(session);
105
+ };
106
+ /** Scroll the page viewport to an absolute or relative position. */
107
+ export const scrollViewport = async (session, mode) => {
108
+ const fn = mode.to ? `window.scrollTo(${mode.to.x}, ${mode.to.y})` : `window.scrollBy(${mode.by.x}, ${mode.by.y})`;
109
+ await session.sendAndWait('Runtime.evaluate', {
110
+ expression: fn,
111
+ awaitPromise: false,
112
+ returnByValue: true,
113
+ });
114
+ return getViewportScroll(session);
115
+ };
116
+ const scrollElementContainer = async (session, nodeId, mode) => {
117
+ const resolved = (await session.sendAndWait('DOM.resolveNode', { nodeId }));
118
+ const objectId = resolved.object?.objectId;
119
+ if (!objectId) {
120
+ throw createNotInteractableError('Unable to resolve node for scrolling');
121
+ }
122
+ const fn = mode.to ? `function() { this.scrollTo(${mode.to.x}, ${mode.to.y}); }` : `function() { this.scrollBy(${mode.by.x}, ${mode.by.y}); }`;
123
+ await session.sendAndWait('Runtime.callFunctionOn', {
124
+ objectId,
125
+ functionDeclaration: fn,
126
+ awaitPromise: false,
127
+ returnByValue: true,
128
+ });
129
+ };
130
+ const getViewportScroll = async (session) => {
131
+ const result = (await session.sendAndWait('Runtime.evaluate', {
132
+ expression: 'JSON.stringify({scrollX:window.scrollX,scrollY:window.scrollY})',
133
+ returnByValue: true,
134
+ }));
135
+ const parsed = result.result?.value ? JSON.parse(result.result.value) : { scrollX: 0, scrollY: 0 };
136
+ return { scrollX: parsed.scrollX, scrollY: parsed.scrollY };
137
+ };
138
+ const resolveNodeCenter = async (session, nodeId) => {
139
+ const { x, y, w, h } = await resolveNodeRect(session, nodeId);
140
+ if (w <= 0 || h <= 0) {
141
+ throw createNotInteractableError('Element has zero area');
142
+ }
143
+ return { x: x + w / 2, y: y + h / 2 };
144
+ };
145
+ /** Uses getBoundingClientRect() to get viewport-relative coordinates (no scroll-offset ambiguity). */
146
+ const resolveNodeRect = async (session, nodeId) => {
147
+ const resolved = (await session.sendAndWait('DOM.resolveNode', { nodeId }));
148
+ const objectId = resolved.object?.objectId;
149
+ if (!objectId) {
150
+ throw createNotInteractableError('Unable to resolve node');
151
+ }
152
+ const result = (await session.sendAndWait('Runtime.callFunctionOn', {
153
+ objectId,
154
+ functionDeclaration: 'function(){var r=this.getBoundingClientRect();return{x:r.x,y:r.y,w:r.width,h:r.height}}',
155
+ returnByValue: true,
156
+ }));
157
+ const rect = result.result?.value;
158
+ if (!rect || !Number.isFinite(rect.x) || !Number.isFinite(rect.y)) {
159
+ throw createNotInteractableError('Unable to compute element rect');
160
+ }
161
+ return rect;
162
+ };
163
+ /** Dispatch a mouseWheel event at the given viewport coordinates. */
164
+ export const emulateScroll = async (session, x, y, delta) => {
165
+ await session.sendAndWait('Input.dispatchMouseEvent', {
166
+ type: 'mouseWheel',
167
+ x,
168
+ y,
169
+ deltaX: delta.x,
170
+ deltaY: delta.y,
171
+ });
172
+ };
173
+ /** Emulate touch scroll gestures on resolved DOM nodes (scrolls at each element's center). */
174
+ export const emulateScrollOnNodes = async (session, nodeIds, delta) => {
175
+ if (nodeIds.length === 0) {
176
+ return;
177
+ }
178
+ for (const nodeId of nodeIds) {
179
+ await scrollIntoView(session, nodeId);
180
+ const point = await resolveNodeCenter(session, nodeId);
181
+ await emulateScroll(session, point.x, point.y, delta);
182
+ }
183
+ };
184
+ const dispatchMouseEvent = async (session, options) => {
185
+ await session.sendAndWait('Input.dispatchMouseEvent', {
186
+ type: options.type,
187
+ x: options.x,
188
+ y: options.y,
189
+ button: options.button,
190
+ buttons: options.buttons,
191
+ clickCount: options.clickCount,
192
+ });
193
+ };
194
+ const createNotInteractableError = (message) => {
195
+ const error = new Error(message);
196
+ error.code = 'not_interactable';
197
+ return error;
198
+ };
199
+ //# sourceMappingURL=mouse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mouse.js","sourceRoot":"","sources":["../../src/cdp/mouse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { NetBuffer } from '../buffer/NetBuffer.js';
2
+ import type { CdpSessionHandle } from './connection.js';
3
+ export type NetworkCaptureHandle = {
4
+ onAttached: () => Promise<void>;
5
+ onDetached: () => void;
6
+ };
7
+ export declare const createNetworkCapture: (options: {
8
+ session: CdpSessionHandle;
9
+ buffer: NetBuffer;
10
+ }) => NetworkCaptureHandle;
11
+ //# sourceMappingURL=networkCapture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"networkCapture.d.ts","sourceRoot":"","sources":["../../src/cdp/networkCapture.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAevD,MAAM,MAAM,oBAAoB,GAAG;IAClC,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/B,UAAU,EAAE,MAAM,IAAI,CAAA;CACtB,CAAA;AAED,eAAO,MAAM,oBAAoB,GAAI,SAAS;IAAE,OAAO,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE,KAAG,oBAoHhG,CAAA"}
@@ -0,0 +1,99 @@
1
+ import { redactUrl } from './redaction.js';
2
+ export const createNetworkCapture = (options) => {
3
+ const inflight = new Map();
4
+ const getOrCreate = (requestId) => {
5
+ const existing = inflight.get(requestId);
6
+ if (existing) {
7
+ return existing;
8
+ }
9
+ const next = {
10
+ requestId,
11
+ url: '',
12
+ method: 'GET',
13
+ resourceType: null,
14
+ status: null,
15
+ encodedDataLength: null,
16
+ errorText: null,
17
+ startTime: null,
18
+ endTime: null,
19
+ };
20
+ inflight.set(requestId, next);
21
+ return next;
22
+ };
23
+ const finalize = (requestId) => {
24
+ const record = inflight.get(requestId);
25
+ if (!record) {
26
+ return;
27
+ }
28
+ inflight.delete(requestId);
29
+ const durationMs = record.startTime != null && record.endTime != null
30
+ ? Math.max(0, Math.round((record.endTime - record.startTime) * 1000))
31
+ : null;
32
+ const summary = {
33
+ ts: Date.now(),
34
+ requestId: record.requestId,
35
+ url: redactUrl(record.url),
36
+ method: record.method,
37
+ resourceType: record.resourceType,
38
+ status: record.status,
39
+ encodedDataLength: record.encodedDataLength,
40
+ errorText: record.errorText,
41
+ durationMs,
42
+ };
43
+ options.buffer.add(summary);
44
+ };
45
+ options.session.onEvent('Network.requestWillBeSent', (params) => {
46
+ const payload = params;
47
+ const requestId = payload.requestId;
48
+ if (!requestId) {
49
+ return;
50
+ }
51
+ const entry = getOrCreate(requestId);
52
+ entry.url = payload.request?.url ?? entry.url;
53
+ entry.method = payload.request?.method ?? entry.method;
54
+ entry.resourceType = payload.type ?? entry.resourceType;
55
+ entry.startTime = typeof payload.timestamp === 'number' ? payload.timestamp : entry.startTime;
56
+ });
57
+ options.session.onEvent('Network.responseReceived', (params) => {
58
+ const payload = params;
59
+ const requestId = payload.requestId;
60
+ if (!requestId) {
61
+ return;
62
+ }
63
+ const entry = getOrCreate(requestId);
64
+ entry.status = typeof payload.response?.status === 'number' ? payload.response.status : entry.status;
65
+ entry.resourceType = payload.type ?? entry.resourceType;
66
+ });
67
+ options.session.onEvent('Network.loadingFinished', (params) => {
68
+ const payload = params;
69
+ const requestId = payload.requestId;
70
+ if (!requestId) {
71
+ return;
72
+ }
73
+ const entry = getOrCreate(requestId);
74
+ entry.encodedDataLength =
75
+ typeof payload.encodedDataLength === 'number' ? payload.encodedDataLength : entry.encodedDataLength;
76
+ entry.endTime = typeof payload.timestamp === 'number' ? payload.timestamp : entry.endTime;
77
+ finalize(requestId);
78
+ });
79
+ options.session.onEvent('Network.loadingFailed', (params) => {
80
+ const payload = params;
81
+ const requestId = payload.requestId;
82
+ if (!requestId) {
83
+ return;
84
+ }
85
+ const entry = getOrCreate(requestId);
86
+ entry.errorText = payload.errorText ?? entry.errorText;
87
+ entry.endTime = typeof payload.timestamp === 'number' ? payload.timestamp : entry.endTime;
88
+ finalize(requestId);
89
+ });
90
+ return {
91
+ onAttached: async () => {
92
+ await options.session.sendAndWait('Network.enable');
93
+ },
94
+ onDetached: () => {
95
+ inflight.clear();
96
+ },
97
+ };
98
+ };
99
+ //# sourceMappingURL=networkCapture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"networkCapture.js","sourceRoot":"","sources":["../../src/cdp/networkCapture.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { CdpSessionHandle } from './connection.js';
2
+ import type { CdpTarget } from './watcher.js';
3
+ export type PageIndicatorPosition = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right' | 'left-center' | 'right-center';
4
+ export type PageIndicatorOptions = {
5
+ /** Whether the in-page indicator is enabled. */
6
+ enabled?: boolean;
7
+ /** The predefined position of the indicator on the page. */
8
+ position?: PageIndicatorPosition;
9
+ /** The interval in milliseconds at which the watcher sends a heartbeat to keep the indicator alive. */
10
+ heartbeatMs?: number;
11
+ /** The time-to-live in milliseconds for the indicator. If no heartbeat is received within this time, the indicator is removed from the page. */
12
+ ttlMs?: number;
13
+ /** Background color for the indicator badge. Defaults to 'rgba(0, 0, 0, 0.75)'. */
14
+ bgColor?: string;
15
+ /** Icon color for the indicator badge. Defaults to 'rgba(255, 255, 255, 0.95)'. */
16
+ iconColor?: string;
17
+ /** Margin from the edge in pixels. Defaults to 8. */
18
+ margin?: number;
19
+ /** Icon size in pixels. Defaults to 19. */
20
+ size?: number;
21
+ };
22
+ export type PageIndicatorInfo = {
23
+ watcherId: string;
24
+ watcherHost: string;
25
+ watcherPort: number;
26
+ watcherPid: number;
27
+ targetTitle: string | null;
28
+ targetUrl: string | null;
29
+ attachedAt: number;
30
+ };
31
+ export type PageIndicatorController = {
32
+ onAttach: (session: CdpSessionHandle, target: CdpTarget, info: PageIndicatorInfo) => void;
33
+ onNavigation: (session: CdpSessionHandle, info: PageIndicatorInfo) => void;
34
+ /** Re-inject the indicator using the last known info. Use after DOM is rebuilt (e.g. domContentEventFired). */
35
+ reinstall: () => void;
36
+ onDetach: () => void;
37
+ stop: () => void;
38
+ };
39
+ export declare const validatePageIndicatorOptions: (options: PageIndicatorOptions | undefined) => void;
40
+ export declare const createPageIndicatorController: (options: PageIndicatorOptions) => PageIndicatorController;
41
+ //# sourceMappingURL=pageIndicator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pageIndicator.d.ts","sourceRoot":"","sources":["../../src/cdp/pageIndicator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAE7C,MAAM,MAAM,qBAAqB,GAC9B,UAAU,GACV,YAAY,GACZ,WAAW,GACX,aAAa,GACb,eAAe,GACf,cAAc,GACd,aAAa,GACb,cAAc,CAAA;AAEjB,MAAM,MAAM,oBAAoB,GAAG;IAClC,gDAAgD;IAChD,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,qBAAqB,CAAA;IAChC,uGAAuG;IACvG,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,gJAAgJ;IAChJ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,mFAAmF;IACnF,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,mFAAmF;IACnF,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,qDAAqD;IACrD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,UAAU,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,uBAAuB,GAAG;IACrC,QAAQ,EAAE,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAA;IACzF,YAAY,EAAE,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,iBAAiB,KAAK,IAAI,CAAA;IAC1E,+GAA+G;IAC/G,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,IAAI,EAAE,MAAM,IAAI,CAAA;CAChB,CAAA;AAOD,eAAO,MAAM,4BAA4B,GAAI,SAAS,oBAAoB,GAAG,SAAS,KAAG,IAgBxF,CAAA;AAOD,eAAO,MAAM,6BAA6B,GAAI,SAAS,oBAAoB,KAAG,uBAsF7E,CAAA"}