@monoes/monobrowse 1.0.6 → 1.0.7

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 (248) hide show
  1. package/README.md +68 -0
  2. package/dist/src/__tests__/adapters.test.d.ts +2 -0
  3. package/dist/src/__tests__/adapters.test.d.ts.map +1 -0
  4. package/dist/src/__tests__/adapters.test.js +104 -0
  5. package/dist/src/__tests__/adapters.test.js.map +1 -0
  6. package/dist/src/__tests__/batch-eval-parsing.test.d.ts +0 -0
  7. package/dist/src/__tests__/batch-eval-parsing.test.d.ts.map +0 -0
  8. package/dist/src/__tests__/batch-eval-parsing.test.js +0 -0
  9. package/dist/src/__tests__/batch-eval-parsing.test.js.map +0 -0
  10. package/dist/src/__tests__/box-model.test.d.ts +0 -0
  11. package/dist/src/__tests__/box-model.test.d.ts.map +0 -0
  12. package/dist/src/__tests__/box-model.test.js +0 -0
  13. package/dist/src/__tests__/box-model.test.js.map +0 -0
  14. package/dist/src/__tests__/browser-launch.test.d.ts +0 -0
  15. package/dist/src/__tests__/browser-launch.test.d.ts.map +0 -0
  16. package/dist/src/__tests__/browser-launch.test.js +0 -0
  17. package/dist/src/__tests__/browser-launch.test.js.map +0 -0
  18. package/dist/src/__tests__/cdp-client.test.d.ts +2 -0
  19. package/dist/src/__tests__/cdp-client.test.d.ts.map +1 -0
  20. package/dist/src/__tests__/cdp-client.test.js +326 -0
  21. package/dist/src/__tests__/cdp-client.test.js.map +1 -0
  22. package/dist/src/__tests__/close-browser.test.d.ts +2 -0
  23. package/dist/src/__tests__/close-browser.test.d.ts.map +1 -0
  24. package/dist/src/__tests__/close-browser.test.js +128 -0
  25. package/dist/src/__tests__/close-browser.test.js.map +1 -0
  26. package/dist/src/__tests__/console-log.test.d.ts +2 -0
  27. package/dist/src/__tests__/console-log.test.d.ts.map +1 -0
  28. package/dist/src/__tests__/console-log.test.js +195 -0
  29. package/dist/src/__tests__/console-log.test.js.map +1 -0
  30. package/dist/src/__tests__/find.test.d.ts +2 -0
  31. package/dist/src/__tests__/find.test.d.ts.map +1 -0
  32. package/dist/src/__tests__/find.test.js +299 -0
  33. package/dist/src/__tests__/find.test.js.map +1 -0
  34. package/dist/src/__tests__/frame-command.test.d.ts +2 -0
  35. package/dist/src/__tests__/frame-command.test.d.ts.map +1 -0
  36. package/dist/src/__tests__/frame-command.test.js +85 -0
  37. package/dist/src/__tests__/frame-command.test.js.map +1 -0
  38. package/dist/src/__tests__/output.test.d.ts +0 -0
  39. package/dist/src/__tests__/output.test.d.ts.map +0 -0
  40. package/dist/src/__tests__/output.test.js +0 -0
  41. package/dist/src/__tests__/output.test.js.map +0 -0
  42. package/dist/src/__tests__/ref-cache.test.d.ts +0 -0
  43. package/dist/src/__tests__/ref-cache.test.d.ts.map +0 -0
  44. package/dist/src/__tests__/ref-cache.test.js +43 -2
  45. package/dist/src/__tests__/ref-cache.test.js.map +1 -1
  46. package/dist/src/__tests__/session-state.test.d.ts +2 -0
  47. package/dist/src/__tests__/session-state.test.d.ts.map +1 -0
  48. package/dist/src/__tests__/session-state.test.js +203 -0
  49. package/dist/src/__tests__/session-state.test.js.map +1 -0
  50. package/dist/src/__tests__/snapshot.test.d.ts +2 -0
  51. package/dist/src/__tests__/snapshot.test.d.ts.map +1 -0
  52. package/dist/src/__tests__/snapshot.test.js +262 -0
  53. package/dist/src/__tests__/snapshot.test.js.map +1 -0
  54. package/dist/src/__tests__/storage-eval.test.d.ts +2 -0
  55. package/dist/src/__tests__/storage-eval.test.d.ts.map +1 -0
  56. package/dist/src/__tests__/storage-eval.test.js +133 -0
  57. package/dist/src/__tests__/storage-eval.test.js.map +1 -0
  58. package/dist/src/__tests__/tabs.test.d.ts +2 -0
  59. package/dist/src/__tests__/tabs.test.d.ts.map +1 -0
  60. package/dist/src/__tests__/tabs.test.js +161 -0
  61. package/dist/src/__tests__/tabs.test.js.map +1 -0
  62. package/dist/src/browser/action-builder/analyzer.d.ts +0 -0
  63. package/dist/src/browser/action-builder/analyzer.d.ts.map +0 -0
  64. package/dist/src/browser/action-builder/analyzer.js +0 -0
  65. package/dist/src/browser/action-builder/analyzer.js.map +0 -0
  66. package/dist/src/browser/action-builder/types.d.ts +0 -0
  67. package/dist/src/browser/action-builder/types.d.ts.map +0 -0
  68. package/dist/src/browser/action-builder/types.js +0 -0
  69. package/dist/src/browser/action-builder/types.js.map +0 -0
  70. package/dist/src/browser/actions.d.ts +0 -0
  71. package/dist/src/browser/actions.d.ts.map +0 -0
  72. package/dist/src/browser/actions.js +0 -0
  73. package/dist/src/browser/actions.js.map +0 -0
  74. package/dist/src/browser/adapters/gemini.d.ts +0 -0
  75. package/dist/src/browser/adapters/gemini.d.ts.map +0 -0
  76. package/dist/src/browser/adapters/gemini.js +0 -0
  77. package/dist/src/browser/adapters/gemini.js.map +0 -0
  78. package/dist/src/browser/adapters/google.d.ts +0 -0
  79. package/dist/src/browser/adapters/google.d.ts.map +0 -0
  80. package/dist/src/browser/adapters/google.js +0 -0
  81. package/dist/src/browser/adapters/google.js.map +0 -0
  82. package/dist/src/browser/adapters/index.d.ts +0 -0
  83. package/dist/src/browser/adapters/index.d.ts.map +0 -0
  84. package/dist/src/browser/adapters/index.js +0 -0
  85. package/dist/src/browser/adapters/index.js.map +0 -0
  86. package/dist/src/browser/adapters/instagram.d.ts +0 -0
  87. package/dist/src/browser/adapters/instagram.d.ts.map +0 -0
  88. package/dist/src/browser/adapters/instagram.js +0 -0
  89. package/dist/src/browser/adapters/instagram.js.map +0 -0
  90. package/dist/src/browser/adapters/linkedin.d.ts +0 -0
  91. package/dist/src/browser/adapters/linkedin.d.ts.map +0 -0
  92. package/dist/src/browser/adapters/linkedin.js +0 -0
  93. package/dist/src/browser/adapters/linkedin.js.map +0 -0
  94. package/dist/src/browser/adapters/microsoft.d.ts +0 -0
  95. package/dist/src/browser/adapters/microsoft.d.ts.map +0 -0
  96. package/dist/src/browser/adapters/microsoft.js +0 -0
  97. package/dist/src/browser/adapters/microsoft.js.map +0 -0
  98. package/dist/src/browser/adapters/x.d.ts +0 -0
  99. package/dist/src/browser/adapters/x.d.ts.map +0 -0
  100. package/dist/src/browser/adapters/x.js +0 -0
  101. package/dist/src/browser/adapters/x.js.map +0 -0
  102. package/dist/src/browser/batch.d.ts +0 -0
  103. package/dist/src/browser/batch.d.ts.map +0 -0
  104. package/dist/src/browser/batch.js +0 -0
  105. package/dist/src/browser/batch.js.map +0 -0
  106. package/dist/src/browser/browser.d.ts +4 -0
  107. package/dist/src/browser/browser.d.ts.map +1 -1
  108. package/dist/src/browser/browser.js +55 -7
  109. package/dist/src/browser/browser.js.map +1 -1
  110. package/dist/src/browser/cdp.d.ts +4 -1
  111. package/dist/src/browser/cdp.d.ts.map +1 -1
  112. package/dist/src/browser/cdp.js +45 -16
  113. package/dist/src/browser/cdp.js.map +1 -1
  114. package/dist/src/browser/console-log.d.ts +0 -0
  115. package/dist/src/browser/console-log.d.ts.map +0 -0
  116. package/dist/src/browser/console-log.js +0 -0
  117. package/dist/src/browser/console-log.js.map +0 -0
  118. package/dist/src/browser/dashboard/api-types.d.ts +0 -0
  119. package/dist/src/browser/dashboard/api-types.d.ts.map +0 -0
  120. package/dist/src/browser/dashboard/api-types.js +0 -0
  121. package/dist/src/browser/dashboard/api-types.js.map +0 -0
  122. package/dist/src/browser/dashboard/server.d.ts +0 -0
  123. package/dist/src/browser/dashboard/server.d.ts.map +0 -0
  124. package/dist/src/browser/dashboard/server.js +0 -0
  125. package/dist/src/browser/dashboard/server.js.map +0 -0
  126. package/dist/src/browser/dialog.d.ts +0 -0
  127. package/dist/src/browser/dialog.d.ts.map +0 -0
  128. package/dist/src/browser/dialog.js +0 -0
  129. package/dist/src/browser/dialog.js.map +0 -0
  130. package/dist/src/browser/emulation.d.ts +0 -0
  131. package/dist/src/browser/emulation.d.ts.map +0 -0
  132. package/dist/src/browser/emulation.js +0 -0
  133. package/dist/src/browser/emulation.js.map +0 -0
  134. package/dist/src/browser/find.d.ts +0 -0
  135. package/dist/src/browser/find.d.ts.map +0 -0
  136. package/dist/src/browser/find.js +0 -0
  137. package/dist/src/browser/find.js.map +0 -0
  138. package/dist/src/browser/har.d.ts +0 -0
  139. package/dist/src/browser/har.d.ts.map +0 -0
  140. package/dist/src/browser/har.js +0 -0
  141. package/dist/src/browser/har.js.map +0 -0
  142. package/dist/src/browser/index.d.ts +0 -0
  143. package/dist/src/browser/index.d.ts.map +0 -0
  144. package/dist/src/browser/index.js +0 -0
  145. package/dist/src/browser/index.js.map +0 -0
  146. package/dist/src/browser/network.d.ts +0 -0
  147. package/dist/src/browser/network.d.ts.map +0 -0
  148. package/dist/src/browser/network.js +0 -0
  149. package/dist/src/browser/network.js.map +0 -0
  150. package/dist/src/browser/pdf.d.ts +0 -0
  151. package/dist/src/browser/pdf.d.ts.map +0 -0
  152. package/dist/src/browser/pdf.js +0 -0
  153. package/dist/src/browser/pdf.js.map +0 -0
  154. package/dist/src/browser/profiler.d.ts +0 -0
  155. package/dist/src/browser/profiler.d.ts.map +0 -0
  156. package/dist/src/browser/profiler.js +0 -0
  157. package/dist/src/browser/profiler.js.map +0 -0
  158. package/dist/src/browser/record.d.ts +0 -0
  159. package/dist/src/browser/record.d.ts.map +0 -0
  160. package/dist/src/browser/record.js +0 -0
  161. package/dist/src/browser/record.js.map +0 -0
  162. package/dist/src/browser/ref-cache.d.ts +6 -1
  163. package/dist/src/browser/ref-cache.d.ts.map +1 -1
  164. package/dist/src/browser/ref-cache.js +21 -3
  165. package/dist/src/browser/ref-cache.js.map +1 -1
  166. package/dist/src/browser/screenshot.d.ts +0 -0
  167. package/dist/src/browser/screenshot.d.ts.map +0 -0
  168. package/dist/src/browser/screenshot.js +0 -0
  169. package/dist/src/browser/screenshot.js.map +0 -0
  170. package/dist/src/browser/session.d.ts +0 -0
  171. package/dist/src/browser/session.d.ts.map +0 -0
  172. package/dist/src/browser/session.js +0 -0
  173. package/dist/src/browser/session.js.map +0 -0
  174. package/dist/src/browser/snapshot.d.ts +0 -0
  175. package/dist/src/browser/snapshot.d.ts.map +0 -0
  176. package/dist/src/browser/snapshot.js +0 -0
  177. package/dist/src/browser/snapshot.js.map +0 -0
  178. package/dist/src/browser/storage.d.ts +0 -0
  179. package/dist/src/browser/storage.d.ts.map +0 -0
  180. package/dist/src/browser/storage.js +0 -0
  181. package/dist/src/browser/storage.js.map +0 -0
  182. package/dist/src/browser/tabs.d.ts +5 -1
  183. package/dist/src/browser/tabs.d.ts.map +1 -1
  184. package/dist/src/browser/tabs.js +4 -3
  185. package/dist/src/browser/tabs.js.map +1 -1
  186. package/dist/src/browser/trace.d.ts +0 -0
  187. package/dist/src/browser/trace.d.ts.map +0 -0
  188. package/dist/src/browser/trace.js +0 -0
  189. package/dist/src/browser/trace.js.map +0 -0
  190. package/dist/src/browser/types.d.ts +4 -0
  191. package/dist/src/browser/types.d.ts.map +1 -1
  192. package/dist/src/browser/types.js +0 -0
  193. package/dist/src/browser/types.js.map +1 -1
  194. package/dist/src/browser/vitals.d.ts +0 -0
  195. package/dist/src/browser/vitals.d.ts.map +0 -0
  196. package/dist/src/browser/vitals.js +0 -0
  197. package/dist/src/browser/vitals.js.map +0 -0
  198. package/dist/src/browser/wait.d.ts +0 -0
  199. package/dist/src/browser/wait.d.ts.map +0 -0
  200. package/dist/src/browser/wait.js +0 -0
  201. package/dist/src/browser/wait.js.map +0 -0
  202. package/dist/src/cli/action.d.ts +0 -0
  203. package/dist/src/cli/action.d.ts.map +0 -0
  204. package/dist/src/cli/action.js +0 -0
  205. package/dist/src/cli/action.js.map +0 -0
  206. package/dist/src/cli/commands.d.ts +0 -0
  207. package/dist/src/cli/commands.d.ts.map +1 -1
  208. package/dist/src/cli/commands.js +96 -4
  209. package/dist/src/cli/commands.js.map +1 -1
  210. package/dist/src/cli/output.d.ts +0 -0
  211. package/dist/src/cli/output.d.ts.map +0 -0
  212. package/dist/src/cli/output.js +0 -0
  213. package/dist/src/cli/output.js.map +0 -0
  214. package/dist/src/cli/platform.d.ts +0 -0
  215. package/dist/src/cli/platform.d.ts.map +0 -0
  216. package/dist/src/cli/platform.js +0 -0
  217. package/dist/src/cli/platform.js.map +0 -0
  218. package/dist/src/cli/types.d.ts +0 -0
  219. package/dist/src/cli/types.d.ts.map +0 -0
  220. package/dist/src/cli/types.js +0 -0
  221. package/dist/src/cli/types.js.map +0 -0
  222. package/dist/src/cli.d.ts +0 -0
  223. package/dist/src/cli.d.ts.map +0 -0
  224. package/dist/src/cli.js +0 -0
  225. package/dist/src/cli.js.map +0 -0
  226. package/dist/src/index.d.ts +0 -0
  227. package/dist/src/index.d.ts.map +0 -0
  228. package/dist/src/index.js +0 -0
  229. package/dist/src/index.js.map +0 -0
  230. package/dist/tsconfig.tsbuildinfo +1 -1
  231. package/package.json +9 -5
  232. package/src/__tests__/adapters.test.ts +125 -0
  233. package/src/__tests__/cdp-client.test.ts +375 -0
  234. package/src/__tests__/close-browser.test.ts +141 -0
  235. package/src/__tests__/console-log.test.ts +250 -0
  236. package/src/__tests__/find.test.ts +354 -0
  237. package/src/__tests__/frame-command.test.ts +98 -0
  238. package/src/__tests__/ref-cache.test.ts +47 -2
  239. package/src/__tests__/session-state.test.ts +251 -0
  240. package/src/__tests__/snapshot.test.ts +331 -0
  241. package/src/__tests__/storage-eval.test.ts +171 -0
  242. package/src/__tests__/tabs.test.ts +183 -0
  243. package/src/browser/browser.ts +59 -7
  244. package/src/browser/cdp.ts +52 -15
  245. package/src/browser/ref-cache.ts +29 -6
  246. package/src/browser/tabs.ts +12 -4
  247. package/src/browser/types.ts +4 -0
  248. package/src/cli/commands.ts +90 -4
package/README.md ADDED
@@ -0,0 +1,68 @@
1
+ <p align="center">
2
+ <img src="https://raw.githubusercontent.com/monoes/monomind/main/assets/packages/monobrowse.png" alt="@monoes/monobrowse" width="600" />
3
+ </p>
4
+
5
+ # @monoes/monobrowse
6
+
7
+ [![npm version](https://img.shields.io/npm/v/@monoes/monobrowse?style=flat-square)](https://www.npmjs.com/package/@monoes/monobrowse)
8
+ [![license](https://img.shields.io/npm/l/@monoes/monobrowse?style=flat-square)](https://github.com/monoes/monomind/blob/main/LICENSE)
9
+ [![node](https://img.shields.io/badge/node-%3E%3D20-339933?style=flat-square&logo=node.js&logoColor=white)](https://nodejs.org)
10
+
11
+ **Browser automation via Chrome DevTools Protocol** — navigate, click, fill forms, take screenshots, and evaluate JavaScript in a real Chrome browser. No Puppeteer, no Playwright, no external binaries — just CDP over WebSocket.
12
+
13
+ > Part of the [Monomind](https://github.com/monoes/monomind) ecosystem. Powers `monomind browse`.
14
+
15
+ ## Install
16
+
17
+ ```bash
18
+ npm install @monoes/monobrowse
19
+ ```
20
+
21
+ ## CLI usage
22
+
23
+ ```bash
24
+ # Via monomind
25
+ monomind browse open https://example.com
26
+ monomind browse screenshot --output page.png
27
+ monomind browse click "button.submit"
28
+ monomind browse eval "document.title"
29
+ ```
30
+
31
+ ## Programmatic usage
32
+
33
+ ```typescript
34
+ import { Browser } from '@monoes/monobrowse';
35
+
36
+ const browser = new Browser();
37
+ await browser.connect();
38
+
39
+ await browser.navigate('https://example.com');
40
+ await browser.click('button.login');
41
+ await browser.fill('input[name="email"]', 'user@example.com');
42
+ await browser.screenshot({ path: 'result.png' });
43
+
44
+ const title = await browser.evaluate('document.title');
45
+ await browser.close();
46
+ ```
47
+
48
+ ## Features
49
+
50
+ - **Zero dependencies** on browser automation frameworks
51
+ - Direct CDP WebSocket connection to Chrome/Chromium
52
+ - Navigate, click, type, screenshot, evaluate JS
53
+ - Session management for multi-page workflows
54
+ - Headless and headed modes
55
+
56
+ ## Why not Puppeteer/Playwright?
57
+
58
+ Monobrowse talks CDP directly — no 50+ MB framework download, no binary management, no version pinning against Chrome releases. It does what AI agents need (navigate, interact, screenshot, evaluate) without the weight.
59
+
60
+ ## Links
61
+
62
+ - [GitHub](https://github.com/monoes/monomind)
63
+ - [Documentation](https://monoes.github.io/monomind/)
64
+ - [Issues](https://github.com/monoes/monomind/issues)
65
+
66
+ ## License
67
+
68
+ MIT
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=adapters.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/adapters.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Platform adapters are pure declarations plus two tiny page-probing methods.
3
+ * A fake PageInterface (evaluate + url) is all that's needed — no browser.
4
+ */
5
+ import { describe, it, expect, vi } from 'vitest';
6
+ import { adapters, getAdapter } from '../browser/adapters/index.js';
7
+ const PLATFORMS = ['linkedin', 'instagram', 'x', 'gemini', 'google', 'microsoft'];
8
+ function fakePage(opts = {}) {
9
+ const evaluated = [];
10
+ return {
11
+ evaluated,
12
+ async evaluate(expression) {
13
+ evaluated.push(expression);
14
+ return opts.evaluate;
15
+ },
16
+ async url() {
17
+ return opts.url ?? 'https://example.test/';
18
+ },
19
+ };
20
+ }
21
+ describe('getAdapter', () => {
22
+ it('returns the adapter whose `platform` matches its registry key', () => {
23
+ for (const key of PLATFORMS) {
24
+ expect(getAdapter(key).platform).toBe(key);
25
+ }
26
+ });
27
+ it('throws for an unknown platform, listing the supported ones', () => {
28
+ expect(() => getAdapter('myspace')).toThrow(`Unknown platform: myspace. Supported: ${PLATFORMS.join(', ')}`);
29
+ });
30
+ it('is case-sensitive (no silent normalization)', () => {
31
+ expect(() => getAdapter('LinkedIn')).toThrow(/Unknown platform/);
32
+ });
33
+ it('registers exactly the documented platform set', () => {
34
+ expect([...adapters.keys()]).toEqual([...PLATFORMS]);
35
+ });
36
+ });
37
+ describe('adapter invariants', () => {
38
+ for (const key of PLATFORMS) {
39
+ describe(key, () => {
40
+ const a = getAdapter(key);
41
+ it('exposes an https baseURL with no trailing slash', () => {
42
+ expect(a.baseURL).toMatch(/^https:\/\//);
43
+ expect(a.baseURL.endsWith('/')).toBe(false);
44
+ expect(() => new URL(a.baseURL)).not.toThrow();
45
+ });
46
+ it('exposes a parseable https loginURL', () => {
47
+ const login = a.loginURL();
48
+ expect(login).toMatch(/^https:\/\//);
49
+ expect(() => new URL(login)).not.toThrow();
50
+ });
51
+ it('lists reservedPaths as non-empty root-anchored paths', () => {
52
+ expect(a.reservedPaths.length).toBeGreaterThan(0);
53
+ for (const p of a.reservedPaths)
54
+ expect(p.startsWith('/')).toBe(true);
55
+ });
56
+ });
57
+ }
58
+ });
59
+ describe('isLoggedIn', () => {
60
+ it('coerces the page probe to the boolean the caller expects', async () => {
61
+ await expect(getAdapter('linkedin').isLoggedIn(fakePage({ evaluate: true }))).resolves.toBe(true);
62
+ await expect(getAdapter('linkedin').isLoggedIn(fakePage({ evaluate: false }))).resolves.toBe(false);
63
+ });
64
+ it('google short-circuits to false on the sign-in page without probing the DOM', async () => {
65
+ const page = fakePage({ url: 'https://accounts.google.com/signin/v2/identifier', evaluate: true });
66
+ await expect(getAdapter('google').isLoggedIn(page)).resolves.toBe(false);
67
+ expect(page.evaluated).toEqual([]);
68
+ });
69
+ it('google probes the DOM once past the sign-in page', async () => {
70
+ const page = fakePage({ url: 'https://mail.google.com/mail/u/0/', evaluate: true });
71
+ await expect(getAdapter('google').isLoggedIn(page)).resolves.toBe(true);
72
+ expect(page.evaluated).toHaveLength(1);
73
+ });
74
+ it('microsoft short-circuits on both login hostnames', async () => {
75
+ for (const url of [
76
+ 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize',
77
+ 'https://login.microsoft.com/whatever',
78
+ ]) {
79
+ const page = fakePage({ url, evaluate: true });
80
+ await expect(getAdapter('microsoft').isLoggedIn(page)).resolves.toBe(false);
81
+ expect(page.evaluated).toEqual([]);
82
+ }
83
+ });
84
+ it('microsoft probes the DOM elsewhere', async () => {
85
+ const page = fakePage({ url: 'https://teams.microsoft.com/', evaluate: true });
86
+ await expect(getAdapter('microsoft').isLoggedIn(page)).resolves.toBe(true);
87
+ expect(page.evaluated).toHaveLength(1);
88
+ });
89
+ });
90
+ describe('extractUsername', () => {
91
+ it('returns whatever the page evaluation yields', async () => {
92
+ for (const key of PLATFORMS) {
93
+ await expect(getAdapter(key).extractUsername(fakePage({ evaluate: 'someuser' }))).resolves.toBe('someuser');
94
+ }
95
+ });
96
+ it('propagates evaluation failures so callers can apply their own fallback', async () => {
97
+ const page = {
98
+ evaluate: vi.fn().mockRejectedValue(new Error('detached frame')),
99
+ url: async () => '',
100
+ };
101
+ await expect(getAdapter('x').extractUsername(page)).rejects.toThrow('detached frame');
102
+ });
103
+ });
104
+ //# sourceMappingURL=adapters.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.test.js","sourceRoot":"","sources":["../../../src/__tests__/adapters.test.ts"],"names":[],"mappings":"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"}
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=cdp-client.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdp-client.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/cdp-client.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,326 @@
1
+ /**
2
+ * CdpClient dispatch/guard logic and the two HTTP endpoint helpers.
3
+ *
4
+ * No browser and no WebSocket server: `connect()` is exercised against a fake
5
+ * `ws` module (so we can drive 'message'/'close'/'error' by hand), and
6
+ * fetchTargets/fetchNewTarget run against a stubbed global fetch.
7
+ */
8
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
9
+ // --- fake `ws` -------------------------------------------------------------
10
+ // Captures the most recently constructed socket so tests can drive its events.
11
+ let lastSocket = null;
12
+ class FakeWs {
13
+ url;
14
+ handlers = new Map();
15
+ sent = [];
16
+ closed = false;
17
+ /** When set, the `send` callback receives this error instead of success. */
18
+ sendError = null;
19
+ constructor(url) {
20
+ this.url = url;
21
+ lastSocket = this;
22
+ }
23
+ on(event, fn) {
24
+ if (!this.handlers.has(event))
25
+ this.handlers.set(event, []);
26
+ this.handlers.get(event).push(fn);
27
+ }
28
+ emit(event, ...args) {
29
+ for (const fn of [...(this.handlers.get(event) ?? [])])
30
+ fn(...args);
31
+ }
32
+ send(data, cb) {
33
+ this.sent.push(data);
34
+ cb?.(this.sendError ?? undefined);
35
+ }
36
+ close() {
37
+ this.closed = true;
38
+ }
39
+ /** Convenience: deliver a CDP frame as the ws 'message' event does. */
40
+ deliver(msg) {
41
+ this.emit('message', Buffer.from(JSON.stringify(msg)));
42
+ }
43
+ }
44
+ vi.mock('ws', () => ({ WebSocket: FakeWs }));
45
+ const { CdpClient, fetchTargets, fetchNewTarget } = await import('../browser/cdp.js');
46
+ /** Build a connected client plus its fake socket. */
47
+ async function connected() {
48
+ const client = new CdpClient();
49
+ const p = client.connect('ws://127.0.0.1:9222/devtools/page/ABC');
50
+ lastSocket.emit('open');
51
+ await p;
52
+ return { client, ws: lastSocket };
53
+ }
54
+ beforeEach(() => {
55
+ lastSocket = null;
56
+ });
57
+ describe('connect', () => {
58
+ it('resolves on open and reports connected', async () => {
59
+ const { client, ws } = await connected();
60
+ expect(ws.url).toBe('ws://127.0.0.1:9222/devtools/page/ABC');
61
+ expect(client.isConnected()).toBe(true);
62
+ });
63
+ it('rejects when the socket errors before ever opening', async () => {
64
+ const client = new CdpClient();
65
+ const p = client.connect('ws://127.0.0.1:1/devtools');
66
+ lastSocket.emit('error', new Error('ECONNREFUSED'));
67
+ await expect(p).rejects.toThrow('ECONNREFUSED');
68
+ expect(client.isConnected()).toBe(false);
69
+ });
70
+ });
71
+ describe('send', () => {
72
+ it('rejects when not connected rather than queueing forever', async () => {
73
+ await expect(new CdpClient().send('Page.enable')).rejects.toThrow('CDP not connected');
74
+ });
75
+ it('serializes id/method/params and omits sessionId when not given', async () => {
76
+ const { client, ws } = await connected();
77
+ void client.send('Page.navigate', { url: 'https://x.test' });
78
+ expect(JSON.parse(ws.sent[0])).toEqual({
79
+ id: 1,
80
+ method: 'Page.navigate',
81
+ params: { url: 'https://x.test' },
82
+ });
83
+ });
84
+ it('attaches sessionId when supplied and increments ids monotonically', async () => {
85
+ const { client, ws } = await connected();
86
+ void client.send('A', {}, 'S1');
87
+ void client.send('B', {}, 'S1');
88
+ expect(JSON.parse(ws.sent[0]).id).toBe(1);
89
+ expect(JSON.parse(ws.sent[1])).toMatchObject({ id: 2, method: 'B', sessionId: 'S1' });
90
+ });
91
+ it('resolves with the response result matched by id', async () => {
92
+ const { client, ws } = await connected();
93
+ const a = client.send('A');
94
+ const b = client.send('B');
95
+ // Answer out of order to prove id matching, not FIFO.
96
+ ws.deliver({ id: 2, result: { v: 'second' } });
97
+ ws.deliver({ id: 1, result: { v: 'first' } });
98
+ expect(await a).toEqual({ v: 'first' });
99
+ expect(await b).toEqual({ v: 'second' });
100
+ });
101
+ it('resolves with {} when the response carries no result', async () => {
102
+ const { client, ws } = await connected();
103
+ const p = client.send('A');
104
+ ws.deliver({ id: 1 });
105
+ expect(await p).toEqual({});
106
+ });
107
+ it('rejects with the CDP error code and message', async () => {
108
+ const { client, ws } = await connected();
109
+ const p = client.send('Bad.method');
110
+ ws.deliver({ id: 1, error: { code: -32601, message: 'method not found' } });
111
+ await expect(p).rejects.toThrow('CDP error -32601: method not found');
112
+ });
113
+ it('rejects and forgets the command when the socket send callback errors', async () => {
114
+ const { client, ws } = await connected();
115
+ ws.sendError = new Error('socket write failed');
116
+ await expect(client.send('A')).rejects.toThrow('socket write failed');
117
+ // Not left pending: a later close() must not try to reject it a second time.
118
+ ws.sendError = null;
119
+ expect(() => client.close()).not.toThrow();
120
+ });
121
+ it('refuses to exceed the 1000 in-flight command cap', async () => {
122
+ const { client } = await connected();
123
+ const inflight = Array.from({ length: 1000 }, () => client.send('A').catch(() => { }));
124
+ await expect(client.send('A')).rejects.toThrow('CDP command queue full (>1000 in-flight commands)');
125
+ client.close();
126
+ await Promise.all(inflight);
127
+ });
128
+ describe('#115: default timeout (a response that never arrives must not hang forever)', () => {
129
+ beforeEach(() => vi.useFakeTimers());
130
+ afterEach(() => vi.useRealTimers());
131
+ it('rejects a command with no response after the default 30s timeout', async () => {
132
+ const { client } = await connected();
133
+ const p = client.send('Runtime.evaluate');
134
+ const assertion = expect(p).rejects.toThrow('CDP command "Runtime.evaluate" timed out after 30000ms');
135
+ await vi.advanceTimersByTimeAsync(30_000);
136
+ await assertion;
137
+ });
138
+ it('honors a caller-supplied timeout shorter than the default', async () => {
139
+ const { client } = await connected();
140
+ const p = client.send('Runtime.evaluate', {}, undefined, 500);
141
+ const assertion = expect(p).rejects.toThrow('timed out after 500ms');
142
+ await vi.advanceTimersByTimeAsync(500);
143
+ await assertion;
144
+ });
145
+ it('timeoutMs: 0 disables the timeout entirely', async () => {
146
+ const { client, ws } = await connected();
147
+ const p = client.send('A', {}, undefined, 0);
148
+ await vi.advanceTimersByTimeAsync(60_000);
149
+ // Still pending — no timeout fired.
150
+ let settled = false;
151
+ void p.then(() => { settled = true; }).catch(() => { settled = true; });
152
+ await Promise.resolve();
153
+ expect(settled).toBe(false);
154
+ ws.deliver({ id: 1, result: {} });
155
+ await expect(p).resolves.toEqual({});
156
+ });
157
+ it('a response arriving before the timeout clears the timer (does not also reject later)', async () => {
158
+ const { client, ws } = await connected();
159
+ const p = client.send('A');
160
+ ws.deliver({ id: 1, result: { ok: true } });
161
+ await expect(p).resolves.toEqual({ ok: true });
162
+ // Advancing past the timeout window must not throw/reject anything further.
163
+ await vi.advanceTimersByTimeAsync(30_000);
164
+ });
165
+ });
166
+ describe('#115: Target.targetCrashed / targetDestroyed flush pending commands', () => {
167
+ it('targetCrashed rejects in-flight commands instead of leaving them pending', async () => {
168
+ const { client, ws } = await connected();
169
+ const p = client.send('Runtime.evaluate');
170
+ ws.deliver({ method: 'Target.targetCrashed', params: {} });
171
+ await expect(p).rejects.toThrow('CDP target crashed');
172
+ expect(client.isConnected()).toBe(false);
173
+ });
174
+ it('targetDestroyed rejects in-flight commands', async () => {
175
+ const { client, ws } = await connected();
176
+ const p = client.send('Runtime.evaluate');
177
+ ws.deliver({ method: 'Target.targetDestroyed', params: {} });
178
+ await expect(p).rejects.toThrow('CDP target destroyed');
179
+ });
180
+ });
181
+ });
182
+ describe('event dispatch', () => {
183
+ it('routes events to listeners with params and sessionId', async () => {
184
+ const { client, ws } = await connected();
185
+ const seen = [];
186
+ client.on('Page.loadEventFired', (params, sid) => seen.push([params, sid]));
187
+ ws.deliver({ method: 'Page.loadEventFired', params: { timestamp: 5 }, sessionId: 'S1' });
188
+ expect(seen).toEqual([[{ timestamp: 5 }, 'S1']]);
189
+ });
190
+ it('passes {} when the event has no params', async () => {
191
+ const { client, ws } = await connected();
192
+ const seen = [];
193
+ client.on('E', (p) => seen.push(p));
194
+ ws.deliver({ method: 'E' });
195
+ expect(seen).toEqual([{}]);
196
+ });
197
+ it('the returned off() unsubscribes', async () => {
198
+ const { client, ws } = await connected();
199
+ let count = 0;
200
+ const off = client.on('E', () => count++);
201
+ ws.deliver({ method: 'E' });
202
+ off();
203
+ ws.deliver({ method: 'E' });
204
+ expect(count).toBe(1);
205
+ });
206
+ it('isolates a throwing listener so siblings still run', async () => {
207
+ const { client, ws } = await connected();
208
+ let reached = false;
209
+ client.on('E', () => {
210
+ throw new Error('listener blew up');
211
+ });
212
+ client.on('E', () => {
213
+ reached = true;
214
+ });
215
+ expect(() => ws.deliver({ method: 'E' })).not.toThrow();
216
+ expect(reached).toBe(true);
217
+ });
218
+ it('swallows malformed frames instead of crashing the socket', async () => {
219
+ const { client, ws } = await connected();
220
+ expect(() => ws.emit('message', Buffer.from('{not json'))).not.toThrow();
221
+ expect(client.isConnected()).toBe(true);
222
+ });
223
+ it('caps listeners per event at 100', async () => {
224
+ const { client } = await connected();
225
+ for (let i = 0; i < 100; i++)
226
+ client.on('E', () => { });
227
+ expect(() => client.on('E', () => { })).toThrow('CDP event listener limit reached for event: E');
228
+ // The cap is per event name, not global.
229
+ expect(() => client.on('OtherEvent', () => { })).not.toThrow();
230
+ });
231
+ });
232
+ describe('once / onceWithOff', () => {
233
+ it('resolves on the first matching event and self-unsubscribes', async () => {
234
+ const { client, ws } = await connected();
235
+ const p = client.once('E');
236
+ ws.deliver({ method: 'E', params: { n: 1 } });
237
+ ws.deliver({ method: 'E', params: { n: 2 } });
238
+ expect(await p).toEqual({ n: 1 });
239
+ });
240
+ it('filters by sessionId when one is given', async () => {
241
+ const { client, ws } = await connected();
242
+ const p = client.once('E', 'S1');
243
+ ws.deliver({ method: 'E', params: { from: 'S2' }, sessionId: 'S2' });
244
+ ws.deliver({ method: 'E', params: { from: 'S1' }, sessionId: 'S1' });
245
+ expect(await p).toEqual({ from: 'S1' });
246
+ });
247
+ it('onceWithOff returns a canceller that stops the waiter from firing', async () => {
248
+ const { client, ws } = await connected();
249
+ let settled = false;
250
+ const [promise, off] = client.onceWithOff('E');
251
+ void promise.then(() => {
252
+ settled = true;
253
+ });
254
+ off();
255
+ ws.deliver({ method: 'E' });
256
+ await Promise.resolve();
257
+ expect(settled).toBe(false);
258
+ });
259
+ });
260
+ describe('teardown paths', () => {
261
+ it('close() rejects every pending command, drops listeners and closes the socket', async () => {
262
+ const { client, ws } = await connected();
263
+ const pending = client.send('A');
264
+ let events = 0;
265
+ client.on('E', () => events++);
266
+ client.close();
267
+ await expect(pending).rejects.toThrow('CDP connection closed');
268
+ expect(ws.closed).toBe(true);
269
+ expect(client.isConnected()).toBe(false);
270
+ ws.deliver({ method: 'E' });
271
+ expect(events).toBe(0);
272
+ });
273
+ it('a socket "close" event rejects pending commands', async () => {
274
+ const { client, ws } = await connected();
275
+ const pending = client.send('A');
276
+ ws.emit('close');
277
+ await expect(pending).rejects.toThrow('CDP connection closed');
278
+ expect(client.isConnected()).toBe(false);
279
+ });
280
+ it('a post-connect "error" flushes pending commands with that error', async () => {
281
+ const { client, ws } = await connected();
282
+ const pending = client.send('A');
283
+ ws.emit('error', new Error('EPIPE'));
284
+ await expect(pending).rejects.toThrow('EPIPE');
285
+ expect(client.isConnected()).toBe(false);
286
+ });
287
+ });
288
+ describe('fetchTargets / fetchNewTarget', () => {
289
+ const realFetch = globalThis.fetch;
290
+ afterEach(() => {
291
+ globalThis.fetch = realFetch;
292
+ });
293
+ function stubFetch(impl) {
294
+ const fn = vi.fn((url, init) => Promise.resolve(impl(url, init)));
295
+ globalThis.fetch = fn;
296
+ return fn;
297
+ }
298
+ it('fetchTargets hits /json/list on the given port', async () => {
299
+ const fn = stubFetch(() => new Response(JSON.stringify([{ id: 'T1', type: 'page' }]), { status: 200 }));
300
+ await expect(fetchTargets(9333)).resolves.toEqual([{ id: 'T1', type: 'page' }]);
301
+ expect(fn.mock.calls[0][0]).toBe('http://127.0.0.1:9333/json/list');
302
+ });
303
+ it('fetchTargets throws on a non-OK response', async () => {
304
+ stubFetch(() => new Response('nope', { status: 500, statusText: 'Internal Server Error' }));
305
+ await expect(fetchTargets(9222)).rejects.toThrow('Failed to fetch targets: Internal Server Error');
306
+ });
307
+ it('fetchNewTarget uses PUT and percent-encodes the URL', async () => {
308
+ const fn = stubFetch(() => new Response(JSON.stringify({ id: 'T2' }), { status: 200 }));
309
+ await expect(fetchNewTarget(9222, 'https://x.test/a?b=1&c=2')).resolves.toEqual({ id: 'T2' });
310
+ const [url, init] = fn.mock.calls[0];
311
+ expect(init.method).toBe('PUT');
312
+ expect(url).toBe('http://127.0.0.1:9222/json/new?' + encodeURIComponent('https://x.test/a?b=1&c=2'));
313
+ // The query separators of the target URL must not leak into Chrome's own query.
314
+ expect(url.split('?').length).toBe(2);
315
+ });
316
+ it('fetchNewTarget throws on a non-OK response', async () => {
317
+ stubFetch(() => new Response('', { status: 405, statusText: 'Method Not Allowed' }));
318
+ await expect(fetchNewTarget(9222, 'about:blank')).rejects.toThrow('Failed to create target: Method Not Allowed');
319
+ });
320
+ it('rejects responses over the 10 MB body cap instead of parsing them', async () => {
321
+ const huge = JSON.stringify([{ pad: 'x'.repeat(11 * 1024 * 1024) }]);
322
+ stubFetch(() => new Response(huge, { status: 200 }));
323
+ await expect(fetchTargets(9222)).rejects.toThrow(/CDP response too large: \d+ bytes/);
324
+ });
325
+ });
326
+ //# sourceMappingURL=cdp-client.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdp-client.test.js","sourceRoot":"","sources":["../../../src/__tests__/cdp-client.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=close-browser.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"close-browser.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/close-browser.test.ts"],"names":[],"mappings":""}