@webhands/core 0.4.0 → 0.6.0

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 (59) hide show
  1. package/README.md +69 -6
  2. package/dist/errors.d.ts +112 -1
  3. package/dist/errors.d.ts.map +1 -1
  4. package/dist/errors.js +121 -0
  5. package/dist/errors.js.map +1 -1
  6. package/dist/hand-host.d.ts +198 -5
  7. package/dist/hand-host.d.ts.map +1 -1
  8. package/dist/hand-host.js +664 -21
  9. package/dist/hand-host.js.map +1 -1
  10. package/dist/index.d.ts +5 -4
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +4 -3
  13. package/dist/index.js.map +1 -1
  14. package/dist/playwright-attach-transport.d.ts +8 -1
  15. package/dist/playwright-attach-transport.d.ts.map +1 -1
  16. package/dist/playwright-attach-transport.js +19 -4
  17. package/dist/playwright-attach-transport.js.map +1 -1
  18. package/dist/playwright-launch-transport.d.ts +23 -0
  19. package/dist/playwright-launch-transport.d.ts.map +1 -1
  20. package/dist/playwright-launch-transport.js +40 -6
  21. package/dist/playwright-launch-transport.js.map +1 -1
  22. package/dist/profile-location.d.ts +19 -0
  23. package/dist/profile-location.d.ts.map +1 -1
  24. package/dist/profile-location.js +21 -0
  25. package/dist/profile-location.js.map +1 -1
  26. package/dist/seam.d.ts +501 -7
  27. package/dist/seam.d.ts.map +1 -1
  28. package/dist/seam.js +31 -0
  29. package/dist/seam.js.map +1 -1
  30. package/dist/session-rpc.d.ts +63 -1
  31. package/dist/session-rpc.d.ts.map +1 -1
  32. package/dist/session-rpc.js +174 -11
  33. package/dist/session-rpc.js.map +1 -1
  34. package/dist/socks-proxy.d.ts +61 -0
  35. package/dist/socks-proxy.d.ts.map +1 -0
  36. package/dist/socks-proxy.js +84 -0
  37. package/dist/socks-proxy.js.map +1 -0
  38. package/dist/stub-transport.d.ts.map +1 -1
  39. package/dist/stub-transport.js +74 -6
  40. package/dist/stub-transport.js.map +1 -1
  41. package/dist/test-fixtures/fixture-pages.d.ts.map +1 -1
  42. package/dist/test-fixtures/fixture-pages.js +994 -0
  43. package/dist/test-fixtures/fixture-pages.js.map +1 -1
  44. package/dist/test-fixtures/fixture-server.d.ts.map +1 -1
  45. package/dist/test-fixtures/fixture-server.js +33 -3
  46. package/dist/test-fixtures/fixture-server.js.map +1 -1
  47. package/package.json +1 -1
  48. package/src/errors.ts +164 -1
  49. package/src/hand-host.ts +797 -21
  50. package/src/index.ts +27 -1
  51. package/src/playwright-attach-transport.ts +25 -3
  52. package/src/playwright-launch-transport.ts +63 -4
  53. package/src/profile-location.ts +25 -0
  54. package/src/seam.ts +535 -7
  55. package/src/session-rpc.ts +276 -14
  56. package/src/socks-proxy.ts +127 -0
  57. package/src/stub-transport.ts +83 -6
  58. package/src/test-fixtures/fixture-pages.ts +1010 -0
  59. package/src/test-fixtures/fixture-server.ts +32 -3
@@ -1,4 +1,4 @@
1
- import { type Cookie, type WaitCondition } from './seam.js';
1
+ import { type ActionOptions, type Cookie, type MouseInput, type QueryOptions, type ScreenshotOptions, type ScrollTarget, type SelectChoice, type WaitCondition } from './seam.js';
2
2
  import type { WebHandsPage } from './seam.js';
3
3
  /**
4
4
  * The wire protocol for driving the long-lived session over HTTP (ADR-0005).
@@ -59,13 +59,28 @@ export type SessionRpcBuiltInRequest = {
59
59
  } | {
60
60
  readonly verb: 'click';
61
61
  readonly locator: string;
62
+ /**
63
+ * Optional {@link ActionOptions}: `{byRef: true}` marks `locator` as a
64
+ * durable `query` `ref` so the server resolves it with the loud-stale
65
+ * EXACTLY-ONE contract ({@link StaleRefError}). Omitted == plain locator
66
+ * click (additive, R1).
67
+ */
68
+ readonly options?: ActionOptions;
62
69
  } | {
63
70
  readonly verb: 'type';
64
71
  readonly locator: string;
65
72
  readonly text: string;
73
+ /** Optional {@link ActionOptions} (`{byRef}`); see the `click` request. */
74
+ readonly options?: ActionOptions;
66
75
  } | {
67
76
  readonly verb: 'eval';
68
77
  readonly expression: string;
78
+ /**
79
+ * Optional SAME-ORIGIN child-frame selector to evaluate in (Tier-3 frame
80
+ * scope). A plain string on the wire; the server passes it as the seam
81
+ * {@link EvalOptions.frame}. Omitted == top-document `eval`.
82
+ */
83
+ readonly frame?: string;
69
84
  } | {
70
85
  readonly verb: 'wait';
71
86
  readonly condition: WaitCondition;
@@ -74,6 +89,53 @@ export type SessionRpcBuiltInRequest = {
74
89
  } | {
75
90
  readonly verb: 'setCookies';
76
91
  readonly cookies: readonly Cookie[];
92
+ } | {
93
+ readonly verb: 'query';
94
+ readonly locator: string;
95
+ readonly options?: QueryOptions;
96
+ } | {
97
+ readonly verb: 'count';
98
+ readonly locator: string;
99
+ } | {
100
+ readonly verb: 'exists';
101
+ readonly locator: string;
102
+ } | {
103
+ readonly verb: 'isVisible';
104
+ readonly locator: string;
105
+ } | {
106
+ readonly verb: 'getAttribute';
107
+ readonly locator: string;
108
+ readonly name: string;
109
+ } | {
110
+ readonly verb: 'press';
111
+ readonly key: string;
112
+ readonly locator?: string;
113
+ } | {
114
+ readonly verb: 'hover';
115
+ readonly locator: string;
116
+ } | {
117
+ readonly verb: 'select';
118
+ readonly locator: string;
119
+ readonly choice: SelectChoice;
120
+ } | {
121
+ readonly verb: 'scroll';
122
+ readonly target: ScrollTarget;
123
+ } | {
124
+ readonly verb: 'drag';
125
+ readonly source: string;
126
+ readonly target: string;
127
+ } | {
128
+ readonly verb: 'mouse';
129
+ readonly input: MouseInput;
130
+ } | {
131
+ readonly verb: 'screenshot';
132
+ /**
133
+ * The {@link ScreenshotOptions}, flattened onto the request. `locator`
134
+ * (the `element` scope's clip target) is a branded {@link LocatorString}
135
+ * that JSON flattens to a plain string; the server re-brands it with
136
+ * {@link locator}. No image bytes ever cross — only the path comes back.
137
+ */
138
+ readonly options?: ScreenshotOptions;
77
139
  };
78
140
  /**
79
141
  * The OPEN escape for a dynamically-loaded third-party hand verb (Phase 2,
@@ -1 +1 @@
1
- {"version":3,"file":"session-rpc.d.ts","sourceRoot":"","sources":["../src/session-rpc.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,MAAM,EAEX,KAAK,aAAa,EAClB,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,WAAW,CAAC;AAE5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,6EAA6E;AAC7E,eAAO,MAAM,gBAAgB,kBAAkB,CAAC;AAEhD,8DAA8D;AAC9D,MAAM,MAAM,iBAAiB,GAC1B,wBAAwB,GACxB,qBAAqB,CAAC;AAEzB;;;;GAIG;AACH,MAAM,MAAM,wBAAwB,GACjC;IAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAC,GACjD;IAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAC,GACpD;IAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAC,GAClD;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAC,GACxE;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAC,GACpD;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAA;CAAC,GAC1D;IAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAC,GAC1B;IAAC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;CAAC,CAAC;AAEtE;;;;;;;;;;GAUG;AACH,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,8EAA8E;IAC9E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,0EAA0E;IAC1E,QAAQ,CAAC,IAAI,EAAE,SAAS,OAAO,EAAE,CAAC;CAClC;AAED;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAC3B;IAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAC,GAC7C;IAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAC,CAAC;AAEhD;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CACpC,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,iBAAiB,GACxB,OAAO,CAAC,OAAO,CAAC,CA0BlB;AAmCD;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAC1B,IAAI,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,OAAO,CAAC,OAAO,CAAC,GACpD,YAAY,CA8Bd;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,YAAY,CACjC,IAAI,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,OAAO,CAAC,OAAO,CAAC,EACtD,IAAI,EAAE,MAAM,EACZ,GAAG,IAAI,EAAE,SAAS,OAAO,EAAE,GACzB,OAAO,CAAC,OAAO,CAAC,CAElB"}
1
+ {"version":3,"file":"session-rpc.d.ts","sourceRoot":"","sources":["../src/session-rpc.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { locator, } from './seam.js';
1
+ import { locator, validateSnapshotOptions, } from './seam.js';
2
2
  /**
3
3
  * The wire protocol for driving the long-lived session over HTTP (ADR-0005).
4
4
  *
@@ -58,15 +58,25 @@ export async function applySessionRpc(page, request) {
58
58
  await page.navigate(request.url);
59
59
  return undefined;
60
60
  case 'snapshot':
61
- return page.snapshot({ full: request.full });
61
+ // Validate on the SERVER side so a malformed request from ANY client
62
+ // (not just the typed `makeRpcPage`) is rejected faithfully across the
63
+ // seam, mirroring how a page/eval throw rejects. A raw client could POST
64
+ // e.g. `{verb: 'snapshot', view: 'full'}`; we rebuild the snapshot
65
+ // options from the request's non-`verb` keys and reject unknown ones
66
+ // rather than silently dropping them and returning the wrong view.
67
+ return page.snapshot(snapshotOptionsFromRequest(request));
62
68
  case 'click':
63
- await page.click(locator(request.locator));
69
+ // Forward the optional ActionOptions only when given, so a plain-locator
70
+ // click stays `click(target)` (the byRef path is opt-in).
71
+ await page.click(locator(request.locator), request.options !== undefined ? request.options : undefined);
64
72
  return undefined;
65
73
  case 'type':
66
- await page.type(locator(request.locator), request.text);
74
+ await page.type(locator(request.locator), request.text, request.options !== undefined ? request.options : undefined);
67
75
  return undefined;
68
76
  case 'eval':
69
- return page.eval(request.expression);
77
+ // Forward the optional frame selector only when present, so a bare
78
+ // top-document eval stays `eval(expression)` (no options object).
79
+ return page.eval(request.expression, request.frame !== undefined ? { frame: request.frame } : undefined);
70
80
  case 'wait':
71
81
  await page.wait(rebrandWait(request.condition));
72
82
  return undefined;
@@ -75,10 +85,64 @@ export async function applySessionRpc(page, request) {
75
85
  case 'setCookies':
76
86
  await page.setCookies(request.cookies);
77
87
  return undefined;
88
+ case 'query':
89
+ return page.query(locator(request.locator), request.options);
90
+ case 'count':
91
+ return page.count(locator(request.locator));
92
+ case 'exists':
93
+ return page.exists(locator(request.locator));
94
+ case 'isVisible':
95
+ return page.isVisible(locator(request.locator));
96
+ case 'getAttribute':
97
+ return page.getAttribute(locator(request.locator), request.name);
98
+ case 'press':
99
+ await page.press(request.key, request.locator !== undefined ? locator(request.locator) : undefined);
100
+ return undefined;
101
+ case 'hover':
102
+ await page.hover(locator(request.locator));
103
+ return undefined;
104
+ case 'select':
105
+ await page.select(locator(request.locator), request.choice);
106
+ return undefined;
107
+ case 'scroll':
108
+ await page.scroll(rebrandScroll(request.target));
109
+ return undefined;
110
+ case 'drag':
111
+ await page.drag(locator(request.source), locator(request.target));
112
+ return undefined;
113
+ case 'mouse':
114
+ await page.mouse(request.input);
115
+ return undefined;
116
+ case 'screenshot':
117
+ // Re-brand the `element`-scope clip locator (plain string over the wire)
118
+ // before it reaches the page; the rest of the options are plain. Only the
119
+ // returned {path,width,height} crosses back — never image bytes.
120
+ return page.screenshot(rebrandScreenshot(request.options));
78
121
  case 'hand':
79
122
  return applyHandVerb(page, request);
80
123
  }
81
124
  }
125
+ /**
126
+ * Rebuild and validate the {@link SnapshotOptions} carried by a wire `snapshot`
127
+ * request. The wire flattens `{full}` onto the request alongside `verb`; a raw
128
+ * (untyped) client may also send a misspelled key such as `view`. We collect
129
+ * every non-`verb` key into an options object and run it through the shared
130
+ * {@link validateSnapshotOptions} so the server rejects an unknown/misshapen
131
+ * option exactly as the in-process host does. Returns `undefined` when no
132
+ * options were sent (the bare `snapshot()` case).
133
+ */
134
+ function snapshotOptionsFromRequest(request) {
135
+ const { verb: _verb, ...rest } = request;
136
+ // Drop an explicitly-absent `full` (the typed client always sends the key,
137
+ // even as `undefined`) so a bare `snapshot()` stays `undefined`.
138
+ if ('full' in rest && rest.full === undefined) {
139
+ delete rest.full;
140
+ }
141
+ if (Object.keys(rest).length === 0) {
142
+ return undefined;
143
+ }
144
+ return validateSnapshotOptions(rest);
145
+ }
82
146
  /**
83
147
  * Invoke a dynamically-loaded hand verb by name against the live composed page.
84
148
  *
@@ -118,19 +182,41 @@ export function makeRpcPage(send) {
118
182
  await send({ verb: 'navigate', url });
119
183
  },
120
184
  async snapshot(options) {
185
+ // Fail fast on the client too, so a typed caller's mistake (e.g.
186
+ // `{view: 'full'}`) is caught before a round-trip. The server
187
+ // re-validates as the load-bearing check for untyped clients.
188
+ validateSnapshotOptions(options);
121
189
  return (await send({
122
190
  verb: 'snapshot',
123
191
  full: options?.full,
124
192
  }));
125
193
  },
126
- async click(target) {
127
- await send({ verb: 'click', locator: target });
194
+ async click(target, options) {
195
+ // Carry the optional ActionOptions only when given, so a plain click sends
196
+ // no `options` key (mirrors `eval`'s optional frame).
197
+ await send({
198
+ verb: 'click',
199
+ locator: target,
200
+ ...(options !== undefined ? { options } : {}),
201
+ });
128
202
  },
129
- async type(target, text) {
130
- await send({ verb: 'type', locator: target, text });
203
+ async type(target, text, options) {
204
+ await send({
205
+ verb: 'type',
206
+ locator: target,
207
+ text,
208
+ ...(options !== undefined ? { options } : {}),
209
+ });
131
210
  },
132
- async eval(expression) {
133
- return send({ verb: 'eval', expression });
211
+ async eval(expression, options) {
212
+ // Carry the optional frame selector only when given, so the focused
213
+ // top-document form sends no `frame` key (mirrors `press`'s optional
214
+ // locator).
215
+ return send({
216
+ verb: 'eval',
217
+ expression,
218
+ ...(options?.frame !== undefined ? { frame: options.frame } : {}),
219
+ });
134
220
  },
135
221
  async wait(condition) {
136
222
  await send({ verb: 'wait', condition });
@@ -141,6 +227,59 @@ export function makeRpcPage(send) {
141
227
  async setCookies(cookies) {
142
228
  await send({ verb: 'setCookies', cookies });
143
229
  },
230
+ async query(target, options) {
231
+ return (await send({
232
+ verb: 'query',
233
+ locator: target,
234
+ options,
235
+ }));
236
+ },
237
+ async count(target) {
238
+ return (await send({ verb: 'count', locator: target }));
239
+ },
240
+ async exists(target) {
241
+ return (await send({ verb: 'exists', locator: target }));
242
+ },
243
+ async isVisible(target) {
244
+ return (await send({ verb: 'isVisible', locator: target }));
245
+ },
246
+ async getAttribute(target, name) {
247
+ return (await send({
248
+ verb: 'getAttribute',
249
+ locator: target,
250
+ name,
251
+ }));
252
+ },
253
+ async press(key, target) {
254
+ // Forward the optional locator only when given, so the wire request stays
255
+ // minimal (the focused-element form carries no locator key).
256
+ await send({
257
+ verb: 'press',
258
+ key,
259
+ ...(target !== undefined ? { locator: target } : {}),
260
+ });
261
+ },
262
+ async hover(target) {
263
+ await send({ verb: 'hover', locator: target });
264
+ },
265
+ async select(target, choice) {
266
+ await send({ verb: 'select', locator: target, choice });
267
+ },
268
+ async scroll(target) {
269
+ await send({ verb: 'scroll', target });
270
+ },
271
+ async drag(source, target) {
272
+ await send({ verb: 'drag', source, target });
273
+ },
274
+ async mouse(input) {
275
+ await send({ verb: 'mouse', input });
276
+ },
277
+ async screenshot(options) {
278
+ return (await send({
279
+ verb: 'screenshot',
280
+ ...(options !== undefined ? { options } : {}),
281
+ }));
282
+ },
144
283
  };
145
284
  }
146
285
  /**
@@ -172,4 +311,28 @@ function rebrandWait(condition) {
172
311
  }
173
312
  return condition;
174
313
  }
314
+ /**
315
+ * Re-brand a {@link ScrollTarget} that arrived as plain JSON: only the `to` form
316
+ * carries a branded {@link LocatorString}, flattened to a plain `string` over
317
+ * the wire, so we re-tag it before it reaches the page (mirrors
318
+ * {@link rebrandWait}). The `by` form carries only plain numbers.
319
+ */
320
+ function rebrandScroll(target) {
321
+ if ('to' in target) {
322
+ return { to: locator(target.to) };
323
+ }
324
+ return target;
325
+ }
326
+ /**
327
+ * Re-brand a {@link ScreenshotOptions} that arrived as plain JSON: only the
328
+ * `element`-scope `locator` carries a branded {@link LocatorString}, flattened
329
+ * to a plain `string` over the wire, so we re-tag it before it reaches the page
330
+ * (mirrors {@link rebrandWait}/{@link rebrandScroll}). `scope`/`out` are plain.
331
+ */
332
+ function rebrandScreenshot(options) {
333
+ if (options?.locator === undefined) {
334
+ return options;
335
+ }
336
+ return { ...options, locator: locator(options.locator) };
337
+ }
175
338
  //# sourceMappingURL=session-rpc.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-rpc.js","sourceRoot":"","sources":["../src/session-rpc.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-rpc.js","sourceRoot":"","sources":["../src/session-rpc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * A parsed SOCKS proxy ready to hand to Playwright/Chromium.
3
+ *
4
+ * This is the SINGLE place webhands turns a user-facing `--proxy` SOCKS URL into
5
+ * the concrete launch inputs Chromium needs: the `proxy.server`/credentials
6
+ * Playwright forwards, plus the extra command-line arg that forces DNS through
7
+ * the proxy (no DNS leak). Keeping the brittle parsing + Chromium-flag knowledge
8
+ * in one module mirrors how the launch transport confines its other
9
+ * Playwright/Chromium details.
10
+ */
11
+ export interface ParsedSocksProxy {
12
+ /**
13
+ * The Playwright `proxy.server` value, always normalized to `socks5://host:port`.
14
+ *
15
+ * Chromium's `--proxy-server` understands `socks5://` but NOT the `socks5h://`
16
+ * convention, so we normalize the scheme here and carry the "resolve DNS at
17
+ * the proxy / block local DNS" intent separately in {@link noLeak} instead of
18
+ * in the scheme string.
19
+ */
20
+ readonly server: string;
21
+ /** Optional proxy username (from a `user:pass@` userinfo component). */
22
+ readonly username?: string;
23
+ /** Optional proxy password (from a `user:pass@` userinfo component). */
24
+ readonly password?: string;
25
+ /** The proxy host, used to build the DNS catch-all EXCLUDE rule. */
26
+ readonly host: string;
27
+ /**
28
+ * Whether to enforce NO local DNS (force every hostname to resolve at the
29
+ * proxy). When `true`, the transport adds a `--host-resolver-rules` catch-all
30
+ * so even Chromium components that bypass `--proxy-server` (DNS prefetcher,
31
+ * etc.) cannot leak a raw DNS query (see {@link hostResolverRulesArg}).
32
+ */
33
+ readonly noLeak: boolean;
34
+ }
35
+ /**
36
+ * Parse a user-facing `--proxy` SOCKS URL into a {@link ParsedSocksProxy}.
37
+ *
38
+ * Accepts `socks5h://`, `socks5://`, or `socks://` with a host and port and an
39
+ * optional `user:pass@` userinfo. Anything else (missing host/port, an http(s)
40
+ * proxy, a bare host with no scheme) is a typed {@link InvalidProxyError} so the
41
+ * caller refuses LOUDLY rather than launching unproxied.
42
+ *
43
+ * `forceNoLeak`, when set, overrides the scheme's implied DNS behaviour: pass
44
+ * `true` to enforce no local DNS even for a plain `socks5://` URL, or `false` to
45
+ * allow local DNS even for `socks5h://`. When omitted, the SCHEME decides
46
+ * (`socks5h` => no-leak, `socks5`/`socks` => local DNS allowed).
47
+ */
48
+ export declare function parseSocksProxy(value: string, forceNoLeak?: boolean): ParsedSocksProxy;
49
+ /**
50
+ * Build the Chromium `--host-resolver-rules` argument that prevents ANY local
51
+ * DNS resolution, the catch-all the Chromium SOCKS design doc prescribes for a
52
+ * leak-free SOCKS proxy.
53
+ *
54
+ * `MAP * ~NOTFOUND` maps every hostname to an invalid address so Chromium never
55
+ * issues a real local DNS query; `EXCLUDE <host>` lets Chromium still resolve
56
+ * the proxy server's own address (otherwise every request fails with
57
+ * PROXY_CONNECTION_FAILED). URL loads themselves resolve at the proxy via
58
+ * `--proxy-server`; this arg closes the side channels (DNS prefetcher, etc.).
59
+ */
60
+ export declare function hostResolverRulesArg(host: string): string;
61
+ //# sourceMappingURL=socks-proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socks-proxy.d.ts","sourceRoot":"","sources":["../src/socks-proxy.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,WAAW,gBAAgB;IAChC;;;;;;;OAOG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,oEAAoE;IACpE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CACzB;AAqBD;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAC9B,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,OAAO,GACnB,gBAAgB,CAuClB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzD"}
@@ -0,0 +1,84 @@
1
+ import { InvalidProxyError } from './errors.js';
2
+ /**
3
+ * The SOCKS schemes we accept on a `--proxy` value.
4
+ *
5
+ * - `socks5h://` is the widely-used convention meaning "resolve DNS at the
6
+ * proxy" (no local DNS, no leak). We map it to {@link ParsedSocksProxy.noLeak}
7
+ * `true`.
8
+ * - `socks5://` means "SOCKS5, local DNS allowed" by the same convention. NOTE:
9
+ * Chromium ALREADY resolves URL hostnames at the proxy under `--proxy-server`,
10
+ * but other components (the DNS prefetcher) can still issue raw local DNS, so
11
+ * plain `socks5://` does NOT by itself guarantee no leak.
12
+ *
13
+ * `socks://` is accepted as an alias for `socks5://` (some tools emit it).
14
+ */
15
+ const SCHEME_NO_LEAK = {
16
+ 'socks5h:': true,
17
+ 'socks5:': false,
18
+ 'socks:': false,
19
+ };
20
+ /**
21
+ * Parse a user-facing `--proxy` SOCKS URL into a {@link ParsedSocksProxy}.
22
+ *
23
+ * Accepts `socks5h://`, `socks5://`, or `socks://` with a host and port and an
24
+ * optional `user:pass@` userinfo. Anything else (missing host/port, an http(s)
25
+ * proxy, a bare host with no scheme) is a typed {@link InvalidProxyError} so the
26
+ * caller refuses LOUDLY rather than launching unproxied.
27
+ *
28
+ * `forceNoLeak`, when set, overrides the scheme's implied DNS behaviour: pass
29
+ * `true` to enforce no local DNS even for a plain `socks5://` URL, or `false` to
30
+ * allow local DNS even for `socks5h://`. When omitted, the SCHEME decides
31
+ * (`socks5h` => no-leak, `socks5`/`socks` => local DNS allowed).
32
+ */
33
+ export function parseSocksProxy(value, forceNoLeak) {
34
+ const trimmed = value.trim();
35
+ if (trimmed === '') {
36
+ throw new InvalidProxyError(value);
37
+ }
38
+ let url;
39
+ try {
40
+ url = new URL(trimmed);
41
+ }
42
+ catch (cause) {
43
+ throw new InvalidProxyError(value, undefined, { cause });
44
+ }
45
+ const schemeNoLeak = SCHEME_NO_LEAK[url.protocol];
46
+ if (schemeNoLeak === undefined) {
47
+ // Not a SOCKS scheme (e.g. http://, https://, socks4://, or no scheme).
48
+ throw new InvalidProxyError(value);
49
+ }
50
+ if (url.hostname === '' || url.port === '') {
51
+ // A host AND an explicit port are both required: Chromium's --proxy-server
52
+ // needs the port, and we will not guess a default.
53
+ throw new InvalidProxyError(value);
54
+ }
55
+ const noLeak = forceNoLeak ?? schemeNoLeak;
56
+ const server = `socks5://${url.hostname}:${url.port}`;
57
+ const proxy = {
58
+ server,
59
+ host: url.hostname,
60
+ noLeak,
61
+ ...(url.username !== ''
62
+ ? { username: decodeURIComponent(url.username) }
63
+ : {}),
64
+ ...(url.password !== ''
65
+ ? { password: decodeURIComponent(url.password) }
66
+ : {}),
67
+ };
68
+ return proxy;
69
+ }
70
+ /**
71
+ * Build the Chromium `--host-resolver-rules` argument that prevents ANY local
72
+ * DNS resolution, the catch-all the Chromium SOCKS design doc prescribes for a
73
+ * leak-free SOCKS proxy.
74
+ *
75
+ * `MAP * ~NOTFOUND` maps every hostname to an invalid address so Chromium never
76
+ * issues a real local DNS query; `EXCLUDE <host>` lets Chromium still resolve
77
+ * the proxy server's own address (otherwise every request fails with
78
+ * PROXY_CONNECTION_FAILED). URL loads themselves resolve at the proxy via
79
+ * `--proxy-server`; this arg closes the side channels (DNS prefetcher, etc.).
80
+ */
81
+ export function hostResolverRulesArg(host) {
82
+ return `--host-resolver-rules=MAP * ~NOTFOUND , EXCLUDE ${host}`;
83
+ }
84
+ //# sourceMappingURL=socks-proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socks-proxy.js","sourceRoot":"","sources":["../src/socks-proxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,iBAAiB,EAAC,MAAM,aAAa,CAAC;AAqC9C;;;;;;;;;;;;GAYG;AACH,MAAM,cAAc,GAAsC;IACzD,UAAU,EAAE,IAAI;IAChB,SAAS,EAAE,KAAK;IAChB,QAAQ,EAAE,KAAK;CACf,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,eAAe,CAC9B,KAAa,EACb,WAAqB;IAErB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,OAAO,KAAK,EAAE,EAAE,CAAC;QACpB,MAAM,IAAI,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,GAAQ,CAAC;IACb,IAAI,CAAC;QACJ,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,IAAI,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,EAAC,KAAK,EAAC,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,YAAY,GAAG,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAClD,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAChC,wEAAwE;QACxE,MAAM,IAAI,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,IAAI,GAAG,CAAC,IAAI,KAAK,EAAE,EAAE,CAAC;QAC5C,2EAA2E;QAC3E,mDAAmD;QACnD,MAAM,IAAI,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,MAAM,GAAG,WAAW,IAAI,YAAY,CAAC;IAC3C,MAAM,MAAM,GAAG,YAAY,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;IAEtD,MAAM,KAAK,GAAqB;QAC/B,MAAM;QACN,IAAI,EAAE,GAAG,CAAC,QAAQ;QAClB,MAAM;QACN,GAAG,CAAC,GAAG,CAAC,QAAQ,KAAK,EAAE;YACtB,CAAC,CAAC,EAAC,QAAQ,EAAE,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAC;YAC9C,CAAC,CAAC,EAAE,CAAC;QACN,GAAG,CAAC,GAAG,CAAC,QAAQ,KAAK,EAAE;YACtB,CAAC,CAAC,EAAC,QAAQ,EAAE,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAC;YAC9C,CAAC,CAAC,EAAE,CAAC;KACN,CAAC;IACF,OAAO,KAAK,CAAC;AACd,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAChD,OAAO,mDAAmD,IAAI,EAAE,CAAC;AAClE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"stub-transport.d.ts","sourceRoot":"","sources":["../src/stub-transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEX,UAAU,EACV,YAAY,EACZ,OAAO,EAGP,SAAS,EAET,MAAM,WAAW,CAAC;AAEnB;;GAEG;AACH,MAAM,WAAW,QAAQ;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,YAAY,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,SAAS,OAAO,EAAE,CAAC;CAClC;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,aAAc,YAAW,SAAS;IAC9C,4EAA4E;IAC5E,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAM;IAE1B,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;CA4EhD"}
1
+ {"version":3,"file":"stub-transport.d.ts","sourceRoot":"","sources":["../src/stub-transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAKX,UAAU,EACV,YAAY,EAOZ,OAAO,EAGP,SAAS,EAET,MAAM,WAAW,CAAC;AAGnB;;GAEG;AACH,MAAM,WAAW,QAAQ;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,YAAY,CAAC;IAClC,QAAQ,CAAC,IAAI,EAAE,SAAS,OAAO,EAAE,CAAC;CAClC;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,aAAc,YAAW,SAAS;IAC9C,4EAA4E;IAC5E,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAM;IAE1B,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC;CA+IhD"}
@@ -1,3 +1,4 @@
1
+ import { validateSnapshotOptions } from './seam.js';
1
2
  /**
2
3
  * An in-process, no-op {@link Transport} used to exercise the SEAM SHAPE
3
4
  * without a real browser. It is NOT the Playwright transport (that lands in a
@@ -35,6 +36,7 @@ export class StubTransport {
35
36
  },
36
37
  async snapshot(options) {
37
38
  ensureOpen();
39
+ validateSnapshotOptions(options);
38
40
  calls.push({ verb: 'snapshot', args: [options] });
39
41
  return {
40
42
  url,
@@ -42,17 +44,26 @@ export class StubTransport {
42
44
  content: '',
43
45
  };
44
46
  },
45
- async click(t) {
47
+ async click(t, options) {
46
48
  ensureOpen();
47
- calls.push({ verb: 'click', args: [t] });
49
+ // Record the ActionOptions only when given, so a plain-locator click
50
+ // stays `[t]` (the existing seam assertions) and a `{byRef}` click
51
+ // records `[t, {byRef: true}]`.
52
+ calls.push({
53
+ verb: 'click',
54
+ args: options !== undefined ? [t, options] : [t],
55
+ });
48
56
  },
49
- async type(t, text) {
57
+ async type(t, text, options) {
50
58
  ensureOpen();
51
- calls.push({ verb: 'type', args: [t, text] });
59
+ calls.push({
60
+ verb: 'type',
61
+ args: options !== undefined ? [t, text, options] : [t, text],
62
+ });
52
63
  },
53
- async eval(expression) {
64
+ async eval(expression, options) {
54
65
  ensureOpen();
55
- calls.push({ verb: 'eval', args: [expression] });
66
+ calls.push({ verb: 'eval', args: [expression, options] });
56
67
  return undefined;
57
68
  },
58
69
  async wait(condition) {
@@ -68,6 +79,63 @@ export class StubTransport {
68
79
  ensureOpen();
69
80
  calls.push({ verb: 'setCookies', args: [cookies] });
70
81
  },
82
+ async query(t, options) {
83
+ ensureOpen();
84
+ calls.push({ verb: 'query', args: [t, options] });
85
+ return [];
86
+ },
87
+ async count(t) {
88
+ ensureOpen();
89
+ calls.push({ verb: 'count', args: [t] });
90
+ return 0;
91
+ },
92
+ async exists(t) {
93
+ ensureOpen();
94
+ calls.push({ verb: 'exists', args: [t] });
95
+ return false;
96
+ },
97
+ async isVisible(t) {
98
+ ensureOpen();
99
+ calls.push({ verb: 'isVisible', args: [t] });
100
+ return false;
101
+ },
102
+ async getAttribute(t, name) {
103
+ ensureOpen();
104
+ calls.push({ verb: 'getAttribute', args: [t, name] });
105
+ return null;
106
+ },
107
+ async press(key, t) {
108
+ ensureOpen();
109
+ calls.push({ verb: 'press', args: [key, t] });
110
+ },
111
+ async hover(t) {
112
+ ensureOpen();
113
+ calls.push({ verb: 'hover', args: [t] });
114
+ },
115
+ async select(t, choice) {
116
+ ensureOpen();
117
+ calls.push({ verb: 'select', args: [t, choice] });
118
+ },
119
+ async scroll(t) {
120
+ ensureOpen();
121
+ calls.push({ verb: 'scroll', args: [t] });
122
+ },
123
+ async drag(source, t) {
124
+ ensureOpen();
125
+ calls.push({ verb: 'drag', args: [source, t] });
126
+ },
127
+ async mouse(input) {
128
+ ensureOpen();
129
+ calls.push({ verb: 'mouse', args: [input] });
130
+ },
131
+ async screenshot(options) {
132
+ ensureOpen();
133
+ calls.push({ verb: 'screenshot', args: [options] });
134
+ // A deterministic stand-in path/dimensions so a wiring test can assert
135
+ // the verb round-trip + the attachment-capable `path` field WITHOUT a
136
+ // real browser (no PNG is written; the stub implements no behaviour).
137
+ return { path: 'stub://screenshot.png', width: 0, height: 0 };
138
+ },
71
139
  };
72
140
  return {
73
141
  page,
@@ -1 +1 @@
1
- {"version":3,"file":"stub-transport.js","sourceRoot":"","sources":["../src/stub-transport.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stub-transport.js","sourceRoot":"","sources":["../src/stub-transport.ts"],"names":[],"mappings":"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"}