@vforsh/argus-watcher 0.5.0 → 0.5.2
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.
- package/dist/.tsbuildinfo +1 -1
- package/dist/artifacts.d.ts +6 -0
- package/dist/artifacts.d.ts.map +1 -1
- package/dist/artifacts.js +6 -0
- package/dist/artifacts.js.map +1 -1
- package/dist/cdp/health.d.ts +65 -0
- package/dist/cdp/health.d.ts.map +1 -0
- package/dist/cdp/health.js +89 -0
- package/dist/cdp/health.js.map +1 -0
- package/dist/cdp/keyboard.d.ts +8 -1
- package/dist/cdp/keyboard.d.ts.map +1 -1
- package/dist/cdp/keyboard.js +56 -14
- package/dist/cdp/keyboard.js.map +1 -1
- package/dist/cdp/pageFocus.d.ts +26 -0
- package/dist/cdp/pageFocus.d.ts.map +1 -0
- package/dist/cdp/pageFocus.js +54 -0
- package/dist/cdp/pageFocus.js.map +1 -0
- package/dist/cdp/watcher.d.ts +7 -0
- package/dist/cdp/watcher.d.ts.map +1 -1
- package/dist/cdp/watcher.js +7 -0
- package/dist/cdp/watcher.js.map +1 -1
- package/dist/cdp/watcherTargets.d.ts +8 -0
- package/dist/cdp/watcherTargets.d.ts.map +1 -1
- package/dist/cdp/watcherTargets.js +12 -3
- package/dist/cdp/watcherTargets.js.map +1 -1
- package/dist/http/httpUtils.d.ts +13 -0
- package/dist/http/httpUtils.d.ts.map +1 -1
- package/dist/http/httpUtils.js +24 -0
- package/dist/http/httpUtils.js.map +1 -1
- package/dist/http/routes/defineRoute.js +2 -2
- package/dist/http/routes/defineRoute.js.map +1 -1
- package/dist/http/routes/postDomKeydown.d.ts.map +1 -1
- package/dist/http/routes/postDomKeydown.js +5 -0
- package/dist/http/routes/postDomKeydown.js.map +1 -1
- package/dist/http/routes/postEval.d.ts.map +1 -1
- package/dist/http/routes/postEval.js +9 -1
- package/dist/http/routes/postEval.js.map +1 -1
- package/dist/http/server.d.ts +8 -0
- package/dist/http/server.d.ts.map +1 -1
- package/dist/http/server.js.map +1 -1
- package/dist/sources/cdp-source.d.ts +1 -1
- package/dist/sources/cdp-source.d.ts.map +1 -1
- package/dist/sources/cdp-source.js +31 -0
- package/dist/sources/cdp-source.js.map +1 -1
- package/dist/sources/types.d.ts +10 -0
- package/dist/sources/types.d.ts.map +1 -1
- package/dist/startWatcherRuntime.d.ts.map +1 -1
- package/dist/startWatcherRuntime.js +13 -0
- package/dist/startWatcherRuntime.js.map +1 -1
- package/package.json +1 -1
package/dist/artifacts.d.ts
CHANGED
|
@@ -5,6 +5,12 @@ export declare const ensureParentDir: (filePath: string) => Promise<void>;
|
|
|
5
5
|
* - If `outFile` is an absolute path, use it directly (no restriction).
|
|
6
6
|
* - If `outFile` is relative, resolve it under `artifactsDir`.
|
|
7
7
|
* - If `outFile` is empty/undefined, use `defaultName` under `artifactsDir`.
|
|
8
|
+
*
|
|
9
|
+
* The watcher is a separate process whose cwd is unrelated to the caller's, so a relative path
|
|
10
|
+
* can only be resolved against something the watcher owns. Callers that want cwd-relative
|
|
11
|
+
* semantics resolve the path on their side first — the CLI does exactly that for
|
|
12
|
+
* `screenshot`/`record`/`trace` (`resolveArtifactOutFile`), so a relative `--out` lands next to
|
|
13
|
+
* the user rather than in this temp directory.
|
|
8
14
|
*/
|
|
9
15
|
export declare const resolveArtifactPath: (artifactsDir: string, outFile: string | undefined, defaultName: string) => string;
|
|
10
16
|
/**
|
package/dist/artifacts.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../src/artifacts.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,kBAAkB,GAAU,KAAK,MAAM,KAAG,OAAO,CAAC,IAAI,CAElE,CAAA;AAED,eAAO,MAAM,eAAe,GAAU,UAAU,MAAM,KAAG,OAAO,CAAC,IAAI,CAGpE,CAAA;AAED
|
|
1
|
+
{"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../src/artifacts.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,kBAAkB,GAAU,KAAK,MAAM,KAAG,OAAO,CAAC,IAAI,CAElE,CAAA;AAED,eAAO,MAAM,eAAe,GAAU,UAAU,MAAM,KAAG,OAAO,CAAC,IAAI,CAGpE,CAAA;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,mBAAmB,GAAI,cAAc,MAAM,EAAE,SAAS,MAAM,GAAG,SAAS,EAAE,aAAa,MAAM,KAAG,MAS5G,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,GAAU,MAAM,MAAM,EAAE,IAAI,MAAM,KAAG,OAAO,CAAC,IAAI,CAY7E,CAAA"}
|
package/dist/artifacts.js
CHANGED
|
@@ -12,6 +12,12 @@ export const ensureParentDir = async (filePath) => {
|
|
|
12
12
|
* - If `outFile` is an absolute path, use it directly (no restriction).
|
|
13
13
|
* - If `outFile` is relative, resolve it under `artifactsDir`.
|
|
14
14
|
* - If `outFile` is empty/undefined, use `defaultName` under `artifactsDir`.
|
|
15
|
+
*
|
|
16
|
+
* The watcher is a separate process whose cwd is unrelated to the caller's, so a relative path
|
|
17
|
+
* can only be resolved against something the watcher owns. Callers that want cwd-relative
|
|
18
|
+
* semantics resolve the path on their side first — the CLI does exactly that for
|
|
19
|
+
* `screenshot`/`record`/`trace` (`resolveArtifactOutFile`), so a relative `--out` lands next to
|
|
20
|
+
* the user rather than in this temp directory.
|
|
15
21
|
*/
|
|
16
22
|
export const resolveArtifactPath = (artifactsDir, outFile, defaultName) => {
|
|
17
23
|
const trimmed = outFile?.trim();
|
package/dist/artifacts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../src/artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAEjC,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EAAE,GAAW,EAAiB,EAAE;IACtE,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;AACzC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,QAAgB,EAAiB,EAAE;IACxE,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAClC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;AACzC,CAAC,CAAA;AAED
|
|
1
|
+
{"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../src/artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAEjC,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EAAE,GAAW,EAAiB,EAAE;IACtE,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;AACzC,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,QAAgB,EAAiB,EAAE;IACxE,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAClC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;AACzC,CAAC,CAAA;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,YAAoB,EAAE,OAA2B,EAAE,WAAmB,EAAU,EAAE;IACrH,MAAM,OAAO,GAAG,OAAO,EAAE,IAAI,EAAE,CAAA;IAE/B,IAAI,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IAC7B,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;IAC1C,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,IAAI,WAAW,CAAC,CAAA;AACrD,CAAC,CAAA;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EAAE,IAAY,EAAE,EAAU,EAAiB,EAAE;IACjF,MAAM,eAAe,CAAC,EAAE,CAAC,CAAA;IACzB,IAAI,CAAC;QACJ,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAK,KAA+B,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACvD,MAAM,KAAK,CAAA;QACZ,CAAC;QAED,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;QAC3B,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACtB,CAAC;AACF,CAAC,CAAA"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { ArgusErrorCode, DialogStatus } from '@vforsh/argus-core';
|
|
2
|
+
import { type CodedError } from '../errors.js';
|
|
3
|
+
import type { CdpSessionHandle } from './connection.js';
|
|
4
|
+
/**
|
|
5
|
+
* How long a health probe may take.
|
|
6
|
+
*
|
|
7
|
+
* Kept short — it runs *after* something already timed out, and the caller is still waiting.
|
|
8
|
+
* Transport checks share the budget so a diagnosis cannot outlast the request it explains.
|
|
9
|
+
*/
|
|
10
|
+
export declare const CDP_HEALTH_PROBE_TIMEOUT_MS = 2000;
|
|
11
|
+
/** A layered explanation for a CDP command that ran out of time. */
|
|
12
|
+
export type CdpHealthDiagnosis = {
|
|
13
|
+
/** The layer that swallowed the command, in the same vocabulary the wire envelope uses. */
|
|
14
|
+
code: ArgusErrorCode;
|
|
15
|
+
/** One line: what failed, and what to do about it. */
|
|
16
|
+
message: string;
|
|
17
|
+
};
|
|
18
|
+
/** Transport-level verdict for the connection carrying CDP commands. */
|
|
19
|
+
export type CdpTransportCheck = {
|
|
20
|
+
state: 'ok';
|
|
21
|
+
} | {
|
|
22
|
+
state: 'unreachable';
|
|
23
|
+
detail: string;
|
|
24
|
+
} | {
|
|
25
|
+
state: 'target_gone';
|
|
26
|
+
detail: string;
|
|
27
|
+
};
|
|
28
|
+
/** The per-layer checks {@link diagnoseCdpHealth} runs, supplied by whichever source is attached. */
|
|
29
|
+
export type CdpHealthProbe = {
|
|
30
|
+
/** Watcher id, so hints can name the exact command to run. */
|
|
31
|
+
watcherId?: string;
|
|
32
|
+
isAttached: () => boolean;
|
|
33
|
+
/** Cheap page round-trip: `true` when the renderer answered within the probe budget. */
|
|
34
|
+
probeRenderer: () => Promise<boolean>;
|
|
35
|
+
/** Transport check. Omitted by transports with no out-of-band endpoint to ask. */
|
|
36
|
+
checkTransport?: () => Promise<CdpTransportCheck>;
|
|
37
|
+
/** Modal dialogs block the renderer without breaking anything; report them as their own layer. */
|
|
38
|
+
getBlockingDialog?: () => DialogStatus | null;
|
|
39
|
+
/** Invoked when the transport reports the attached target is gone, to start reattachment. */
|
|
40
|
+
onTargetGone?: () => void;
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Work out which layer swallowed a CDP command, from the outside in.
|
|
44
|
+
*
|
|
45
|
+
* A stalled command used to surface as "eval may need more time" no matter what actually broke, so
|
|
46
|
+
* the standard recovery — raise the timeout — reliably bought a slower version of the same failure.
|
|
47
|
+
* Each layer is checked in the order it can fail: no attachment, then the browser, then the target,
|
|
48
|
+
* then a dialog, then the renderer, and only then the expression itself.
|
|
49
|
+
*
|
|
50
|
+
* Every probe is short and failure-tolerant: this runs on an already-failed request, and must not
|
|
51
|
+
* become a second thing that hangs.
|
|
52
|
+
*/
|
|
53
|
+
export declare const diagnoseCdpHealth: (probe: CdpHealthProbe) => Promise<CdpHealthDiagnosis>;
|
|
54
|
+
/** Turn a diagnosis into the coded error routes already know how to serialize. */
|
|
55
|
+
export declare const toDiagnosedError: (diagnosis: CdpHealthDiagnosis, original: unknown) => CodedError;
|
|
56
|
+
/**
|
|
57
|
+
* True for the "no answer came back in time" errors both transports raise.
|
|
58
|
+
*
|
|
59
|
+
* Matched on message because that is where the timeout is decided — {@link CdpSessionHandle}'s own
|
|
60
|
+
* pending-request timer and the native-messaging bridge both reject with a plain `Error`.
|
|
61
|
+
*/
|
|
62
|
+
export declare const isCdpTimeoutError: (error: unknown) => boolean;
|
|
63
|
+
/** A renderer probe backed by a CDP session: one trivial evaluation, short deadline, never throws. */
|
|
64
|
+
export declare const createSessionRendererProbe: (session: CdpSessionHandle) => () => Promise<boolean>;
|
|
65
|
+
//# sourceMappingURL=health.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/cdp/health.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtE,OAAO,EAAc,KAAK,UAAU,EAAE,MAAM,cAAc,CAAA;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B,OAAQ,CAAA;AAEhD,oEAAoE;AACpE,MAAM,MAAM,kBAAkB,GAAG;IAChC,2FAA2F;IAC3F,IAAI,EAAE,cAAc,CAAA;IACpB,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAA;CACf,CAAA;AAED,wEAAwE;AACxE,MAAM,MAAM,iBAAiB,GAAG;IAAE,KAAK,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAA;AAErI,qGAAqG;AACrG,MAAM,MAAM,cAAc,GAAG;IAC5B,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,OAAO,CAAA;IACzB,wFAAwF;IACxF,aAAa,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;IACrC,kFAAkF;IAClF,cAAc,CAAC,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAA;IACjD,kGAAkG;IAClG,iBAAiB,CAAC,EAAE,MAAM,YAAY,GAAG,IAAI,CAAA;IAC7C,6FAA6F;IAC7F,YAAY,CAAC,EAAE,MAAM,IAAI,CAAA;CACzB,CAAA;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,iBAAiB,GAAU,OAAO,cAAc,KAAG,OAAO,CAAC,kBAAkB,CAqDzF,CAAA;AAED,kFAAkF;AAClF,eAAO,MAAM,gBAAgB,GAAI,WAAW,kBAAkB,EAAE,UAAU,OAAO,KAAG,UAGnF,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,GAAI,OAAO,OAAO,KAAG,OAC2C,CAAA;AAE9F,sGAAsG;AACtG,eAAO,MAAM,0BAA0B,GAAI,SAAS,gBAAgB,WAAe,OAAO,CAAC,OAAO,CAQjG,CAAA"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { codedError } from '../errors.js';
|
|
2
|
+
/**
|
|
3
|
+
* How long a health probe may take.
|
|
4
|
+
*
|
|
5
|
+
* Kept short — it runs *after* something already timed out, and the caller is still waiting.
|
|
6
|
+
* Transport checks share the budget so a diagnosis cannot outlast the request it explains.
|
|
7
|
+
*/
|
|
8
|
+
export const CDP_HEALTH_PROBE_TIMEOUT_MS = 2_000;
|
|
9
|
+
/**
|
|
10
|
+
* Work out which layer swallowed a CDP command, from the outside in.
|
|
11
|
+
*
|
|
12
|
+
* A stalled command used to surface as "eval may need more time" no matter what actually broke, so
|
|
13
|
+
* the standard recovery — raise the timeout — reliably bought a slower version of the same failure.
|
|
14
|
+
* Each layer is checked in the order it can fail: no attachment, then the browser, then the target,
|
|
15
|
+
* then a dialog, then the renderer, and only then the expression itself.
|
|
16
|
+
*
|
|
17
|
+
* Every probe is short and failure-tolerant: this runs on an already-failed request, and must not
|
|
18
|
+
* become a second thing that hangs.
|
|
19
|
+
*/
|
|
20
|
+
export const diagnoseCdpHealth = async (probe) => {
|
|
21
|
+
const id = probe.watcherId ?? '<id>';
|
|
22
|
+
if (!probe.isAttached()) {
|
|
23
|
+
return {
|
|
24
|
+
code: 'cdp_not_attached',
|
|
25
|
+
message: `The watcher is not attached to a target. Check \`argus watcher status ${id}\` and \`argus doctor\`.`,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
// A source with no out-of-band endpoint to ask cannot fail these two layers; treat it as healthy
|
|
29
|
+
// transport rather than repeating an optional-call dance at every check below.
|
|
30
|
+
const transport = (await probe.checkTransport?.()) ?? { state: 'ok' };
|
|
31
|
+
if (transport.state === 'unreachable') {
|
|
32
|
+
return {
|
|
33
|
+
code: 'chrome_unreachable',
|
|
34
|
+
message: `Chrome's CDP endpoint did not answer (${transport.detail}). Restart the browser, then \`argus doctor\`.`,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
if (transport.state === 'target_gone') {
|
|
38
|
+
probe.onTargetGone?.();
|
|
39
|
+
return {
|
|
40
|
+
code: 'cdp_target_replaced',
|
|
41
|
+
message: `The attached page target is gone (${transport.detail}) — a navigation replaced it. ` +
|
|
42
|
+
`Argus is reattaching; retry the command, or check \`argus watcher status ${id}\`.`,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
const dialog = probe.getBlockingDialog?.();
|
|
46
|
+
if (dialog) {
|
|
47
|
+
return {
|
|
48
|
+
code: 'dialog_blocking',
|
|
49
|
+
message: `A ${dialog.type} dialog is open and blocking the page. ` +
|
|
50
|
+
`Dismiss it with \`argus dialog accept ${id}\` or \`argus dialog dismiss ${id}\`, then retry.`,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
if (!(await probe.probeRenderer())) {
|
|
54
|
+
return {
|
|
55
|
+
code: 'cdp_renderer_unresponsive',
|
|
56
|
+
message: `The page's renderer did not answer a trivial evaluation within ${CDP_HEALTH_PROBE_TIMEOUT_MS}ms — its main thread is ` +
|
|
57
|
+
`blocked, or a cross-origin navigation stranded it. A longer timeout will not help: reload with \`argus reload ${id}\`, ` +
|
|
58
|
+
'or restart Chrome.',
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
code: 'cdp_timeout',
|
|
63
|
+
message: 'The watcher, target, and renderer all answered, so the expression itself exceeded its deadline. Pass a longer timeout.',
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
/** Turn a diagnosis into the coded error routes already know how to serialize. */
|
|
67
|
+
export const toDiagnosedError = (diagnosis, original) => {
|
|
68
|
+
const detail = original instanceof Error ? original.message : String(original);
|
|
69
|
+
return codedError(diagnosis.code, `${detail}. ${diagnosis.message}`);
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* True for the "no answer came back in time" errors both transports raise.
|
|
73
|
+
*
|
|
74
|
+
* Matched on message because that is where the timeout is decided — {@link CdpSessionHandle}'s own
|
|
75
|
+
* pending-request timer and the native-messaging bridge both reject with a plain `Error`.
|
|
76
|
+
*/
|
|
77
|
+
export const isCdpTimeoutError = (error) => error instanceof Error && /\b(?:CDP|Bridge|Control) request timed out\b/i.test(error.message);
|
|
78
|
+
/** A renderer probe backed by a CDP session: one trivial evaluation, short deadline, never throws. */
|
|
79
|
+
export const createSessionRendererProbe = (session) => async () => {
|
|
80
|
+
try {
|
|
81
|
+
const params = { expression: '1', returnByValue: true, silent: true };
|
|
82
|
+
await session.sendAndWait('Runtime.evaluate', params, { timeoutMs: CDP_HEALTH_PROBE_TIMEOUT_MS });
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
//# sourceMappingURL=health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/cdp/health.ts"],"names":[],"mappings":"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"}
|
package/dist/cdp/keyboard.d.ts
CHANGED
|
@@ -5,6 +5,8 @@ type KeyDefinition = {
|
|
|
5
5
|
code: string;
|
|
6
6
|
keyCode: number;
|
|
7
7
|
text?: string;
|
|
8
|
+
/** `key` value produced when Shift is held (US layout). Absent for keys Shift does not change. */
|
|
9
|
+
shiftKey?: string;
|
|
8
10
|
};
|
|
9
11
|
/**
|
|
10
12
|
* Resolve a key name to its CDP key definition.
|
|
@@ -44,7 +46,12 @@ export declare const resolveKeyboardEvent: (options: ResolveKeyboardEventOptions
|
|
|
44
46
|
*
|
|
45
47
|
* 1. If `selector` provided: resolve → error if 0 or >1 match → focus
|
|
46
48
|
* 2. Resolve key definition
|
|
47
|
-
* 3. Dispatch:
|
|
49
|
+
* 3. Dispatch: keys that carry text → keyDown(text)+keyUp; the rest → rawKeyDown+keyUp
|
|
50
|
+
*
|
|
51
|
+
* A `keyDown` carrying `text` already produces the character, so no separate `char` event is
|
|
52
|
+
* sent. Sending one used to double every printable key: the page saw one `keydown`, but two
|
|
53
|
+
* `keypress`/`beforeinput`/`input` rounds, and a focused field ended up with "99" for a single
|
|
54
|
+
* `--key 9`. Chrome's own automation clients (Playwright) dispatch the same two events.
|
|
48
55
|
*/
|
|
49
56
|
export declare const dispatchKeydown: (session: CdpSessionHandle, options: DispatchKeydownOptions) => Promise<DispatchKeydownResult>;
|
|
50
57
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyboard.d.ts","sourceRoot":"","sources":["../../src/cdp/keyboard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAOvD,KAAK,aAAa,GAAG;IACpB,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"keyboard.d.ts","sourceRoot":"","sources":["../../src/cdp/keyboard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAOvD,KAAK,aAAa,GAAG;IACpB,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,kGAAkG;IAClG,QAAQ,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAgGD;;;GAGG;AACH,eAAO,MAAM,oBAAoB,GAAI,KAAK,MAAM,KAAG,aAAa,GAAG,SAElE,CAAA;AAED,uEAAuE;AACvE,eAAO,MAAM,qBAAqB,GAAI,MAAM,MAAM,KAAG,aAAa,GAAG,SAEpE,CAAA;AAiBD;;;;GAIG;AACH,eAAO,MAAM,cAAc,GAAI,QAAQ,MAAM,KAAG,MAoB/C,CAAA;AAMD,MAAM,MAAM,sBAAsB,GAAG;IACpC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,qBAAqB,GAAG;IACnC,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,eAAe,CAAA;CACtB,CAAA;AAED,KAAK,2BAA2B,GAAG;IAClC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,oFAAoF;AACpF,eAAO,MAAM,oBAAoB,GAAI,SAAS,2BAA2B,KAAG,eAqC3E,CAAA;AA8BD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,eAAe,GAAU,SAAS,gBAAgB,EAAE,SAAS,sBAAsB,KAAG,OAAO,CAAC,qBAAqB,CAmD/H,CAAA"}
|
package/dist/cdp/keyboard.js
CHANGED
|
@@ -7,6 +7,12 @@ const buildKeyMaps = () => {
|
|
|
7
7
|
byKey.set(lookup.toLowerCase(), def);
|
|
8
8
|
byCode.set(def.code.toLowerCase(), def);
|
|
9
9
|
};
|
|
10
|
+
// Lets `--key ~` resolve to the same physical key as `--key \`` without overriding its code lookup.
|
|
11
|
+
const putShiftAlias = (def) => {
|
|
12
|
+
if (def.shiftKey) {
|
|
13
|
+
byKey.set(def.shiftKey.toLowerCase(), def);
|
|
14
|
+
}
|
|
15
|
+
};
|
|
10
16
|
// Letters a-z
|
|
11
17
|
for (let i = 0; i < 26; i++) {
|
|
12
18
|
const lower = String.fromCharCode(97 + i);
|
|
@@ -16,11 +22,33 @@ const buildKeyMaps = () => {
|
|
|
16
22
|
put(lower, { key: lower, code, keyCode, text: lower });
|
|
17
23
|
}
|
|
18
24
|
// Digits 0-9
|
|
25
|
+
const DIGIT_SHIFT_KEYS = ')!@#$%^&*(';
|
|
19
26
|
for (let i = 0; i < 10; i++) {
|
|
20
27
|
const digit = String(i);
|
|
21
28
|
const code = `Digit${digit}`;
|
|
22
29
|
const keyCode = 48 + i;
|
|
23
|
-
|
|
30
|
+
const def = { key: digit, code, keyCode, text: digit, shiftKey: DIGIT_SHIFT_KEYS[i] };
|
|
31
|
+
put(digit, def);
|
|
32
|
+
putShiftAlias(def);
|
|
33
|
+
}
|
|
34
|
+
// Punctuation (US layout): standard KeyboardEvent.code values with their legacy keyCodes
|
|
35
|
+
const PUNCTUATION = [
|
|
36
|
+
['Backquote', '`', '~', 192],
|
|
37
|
+
['Minus', '-', '_', 189],
|
|
38
|
+
['Equal', '=', '+', 187],
|
|
39
|
+
['BracketLeft', '[', '{', 219],
|
|
40
|
+
['BracketRight', ']', '}', 221],
|
|
41
|
+
['Backslash', '\\', '|', 220],
|
|
42
|
+
['Semicolon', ';', ':', 186],
|
|
43
|
+
['Quote', "'", '"', 222],
|
|
44
|
+
['Comma', ',', '<', 188],
|
|
45
|
+
['Period', '.', '>', 190],
|
|
46
|
+
['Slash', '/', '?', 191],
|
|
47
|
+
];
|
|
48
|
+
for (const [code, key, shiftKey, keyCode] of PUNCTUATION) {
|
|
49
|
+
const def = { key, code, keyCode, text: key, shiftKey };
|
|
50
|
+
put(key, def);
|
|
51
|
+
putShiftAlias(def);
|
|
24
52
|
}
|
|
25
53
|
// Special keys
|
|
26
54
|
put('Enter', { key: 'Enter', code: 'Enter', keyCode: 13, text: '\r' });
|
|
@@ -118,7 +146,7 @@ export const resolveKeyboardEvent = (options) => {
|
|
|
118
146
|
const text = resolveEventText(key, baseDef);
|
|
119
147
|
const event = {
|
|
120
148
|
key,
|
|
121
|
-
code: codeInput ?? baseDef.code,
|
|
149
|
+
code: codeDef?.code ?? codeInput ?? baseDef.code,
|
|
122
150
|
keyCode: baseDef.keyCode,
|
|
123
151
|
modifiers,
|
|
124
152
|
altKey: (modifiers & MODIFIER_BITS.alt) !== 0,
|
|
@@ -140,6 +168,10 @@ const resolveEventKey = (keyInput, def, modifiers) => {
|
|
|
140
168
|
if (isSingleLetter(semanticKey)) {
|
|
141
169
|
return isShift(modifiers) ? semanticKey.toUpperCase() : semanticKey.toLowerCase();
|
|
142
170
|
}
|
|
171
|
+
// Only shift the unshifted form: an explicit `--key ~` already names the shifted character.
|
|
172
|
+
if (isShift(modifiers) && def.shiftKey && semanticKey === def.key) {
|
|
173
|
+
return def.shiftKey;
|
|
174
|
+
}
|
|
143
175
|
return semanticKey;
|
|
144
176
|
};
|
|
145
177
|
const resolveEventText = (key, def) => {
|
|
@@ -155,7 +187,12 @@ const isShift = (modifiers) => (modifiers & MODIFIER_BITS.shift) !== 0;
|
|
|
155
187
|
*
|
|
156
188
|
* 1. If `selector` provided: resolve → error if 0 or >1 match → focus
|
|
157
189
|
* 2. Resolve key definition
|
|
158
|
-
* 3. Dispatch:
|
|
190
|
+
* 3. Dispatch: keys that carry text → keyDown(text)+keyUp; the rest → rawKeyDown+keyUp
|
|
191
|
+
*
|
|
192
|
+
* A `keyDown` carrying `text` already produces the character, so no separate `char` event is
|
|
193
|
+
* sent. Sending one used to double every printable key: the page saw one `keydown`, but two
|
|
194
|
+
* `keypress`/`beforeinput`/`input` rounds, and a focused field ended up with "99" for a single
|
|
195
|
+
* `--key 9`. Chrome's own automation clients (Playwright) dispatch the same two events.
|
|
159
196
|
*/
|
|
160
197
|
export const dispatchKeydown = async (session, options) => {
|
|
161
198
|
const { selector } = options;
|
|
@@ -174,24 +211,29 @@ export const dispatchKeydown = async (session, options) => {
|
|
|
174
211
|
await session.sendAndWait('DOM.focus', { nodeId });
|
|
175
212
|
focused = true;
|
|
176
213
|
}
|
|
177
|
-
|
|
214
|
+
// `rawKeyDown` is Chrome's "this key produces no character" type: it suppresses `keypress` and
|
|
215
|
+
// every default text action. Enter carries text (`\r`) but was excluded from this split, so
|
|
216
|
+
// `--key Enter` reached the page as a bare keydown/keyup pair — no newline in a textarea, no
|
|
217
|
+
// form submission. The split is simply whether the key produces text, as Playwright decides it.
|
|
218
|
+
const carriesText = event.text != null;
|
|
178
219
|
// 3. Dispatch key events
|
|
220
|
+
//
|
|
221
|
+
// `nativeVirtualKeyCode` is deliberately absent: it means the *platform's* key code — a Carbon
|
|
222
|
+
// keycode on macOS, an X11 keysym on Linux — and Argus only knows the Windows one, so the value
|
|
223
|
+
// was always wrong off Windows. Chrome 152 headless turns that into a hang, repeating the key
|
|
224
|
+
// thousands of times a second until the renderer stops answering CDP. `windowsVirtualKeyCode`
|
|
225
|
+
// alone is what reaches the page as `KeyboardEvent.keyCode`, and it is all Playwright sends.
|
|
179
226
|
const baseParams = {
|
|
180
227
|
code: event.code,
|
|
181
228
|
key: event.key,
|
|
182
229
|
windowsVirtualKeyCode: event.keyCode,
|
|
183
|
-
nativeVirtualKeyCode: event.keyCode,
|
|
184
230
|
modifiers: event.modifiers,
|
|
185
231
|
};
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
}
|
|
191
|
-
else {
|
|
192
|
-
await session.sendAndWait('Input.dispatchKeyEvent', { ...baseParams, type: 'rawKeyDown', text: event.text });
|
|
193
|
-
await session.sendAndWait('Input.dispatchKeyEvent', { ...baseParams, type: 'keyUp' });
|
|
194
|
-
}
|
|
232
|
+
const keyDownParams = carriesText
|
|
233
|
+
? { ...baseParams, type: 'keyDown', text: event.text, unmodifiedText: event.text }
|
|
234
|
+
: { ...baseParams, type: 'rawKeyDown' };
|
|
235
|
+
await session.sendAndWait('Input.dispatchKeyEvent', keyDownParams);
|
|
236
|
+
await session.sendAndWait('Input.dispatchKeyEvent', { ...baseParams, type: 'keyUp' });
|
|
195
237
|
return { key: event.key, code: event.code, modifiers: event.modifiers, focused, event };
|
|
196
238
|
};
|
|
197
239
|
//# sourceMappingURL=keyboard.js.map
|
package/dist/cdp/keyboard.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyboard.js","sourceRoot":"","sources":["../../src/cdp/keyboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAGzC,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"keyboard.js","sourceRoot":"","sources":["../../src/cdp/keyboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAGzC,OAAO,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAA;AAoBtD,MAAM,YAAY,GAAG,GAAY,EAAE;IAClC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAyB,CAAA;IAC9C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAyB,CAAA;IAE/C,MAAM,GAAG,GAAG,CAAC,MAAc,EAAE,GAAkB,EAAQ,EAAE;QACxD,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,CAAA;QACpC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,CAAA;IACxC,CAAC,CAAA;IAED,oGAAoG;IACpG,MAAM,aAAa,GAAG,CAAC,GAAkB,EAAQ,EAAE;QAClD,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;YAClB,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,CAAA;QAC3C,CAAC;IACF,CAAC,CAAA;IAED,cAAc;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QACzC,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,CAAC,CAAC,CAAA;QACzC,MAAM,IAAI,GAAG,MAAM,KAAK,EAAE,CAAA;QAC1B,MAAM,OAAO,GAAG,EAAE,GAAG,CAAC,CAAA;QACtB,GAAG,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IACvD,CAAC;IAED,aAAa;IACb,MAAM,gBAAgB,GAAG,YAAY,CAAA;IACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACvB,MAAM,IAAI,GAAG,QAAQ,KAAK,EAAE,CAAA;QAC5B,MAAM,OAAO,GAAG,EAAE,GAAG,CAAC,CAAA;QACtB,MAAM,GAAG,GAAkB,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAA;QACpG,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;QACf,aAAa,CAAC,GAAG,CAAC,CAAA;IACnB,CAAC;IAED,yFAAyF;IACzF,MAAM,WAAW,GAA0E;QAC1F,CAAC,WAAW,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;QAC5B,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;QACxB,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;QACxB,CAAC,aAAa,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;QAC9B,CAAC,cAAc,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;QAC/B,CAAC,WAAW,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC;QAC7B,CAAC,WAAW,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;QAC5B,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;QACxB,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;QACxB,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;QACzB,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;KACxB,CAAA;IACD,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,IAAI,WAAW,EAAE,CAAC;QAC1D,MAAM,GAAG,GAAkB,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAA;QACtE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;QACb,aAAa,CAAC,GAAG,CAAC,CAAA;IACnB,CAAC;IAED,eAAe;IACf,GAAG,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IACtE,GAAG,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAA;IACnD,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAA;IAC7D,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAA;IACrE,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAA;IAC7D,GAAG,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAA;IACjE,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAA;IAE7D,SAAS;IACT,GAAG,CAAC,SAAS,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAA;IAChE,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAA;IACtE,GAAG,CAAC,WAAW,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAA;IACtE,GAAG,CAAC,YAAY,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAA;IAEzE,aAAa;IACb,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAA;IACvD,GAAG,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAA;IACpD,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAA;IAC7D,GAAG,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAA;IACnE,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAA;IAE7D,SAAS;IACT,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAA;QACpB,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC,CAAA;IACvD,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;AACzB,CAAC,CAAA;AAED,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAA;AAE/B;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,GAAW,EAA6B,EAAE;IAC9E,OAAO,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAA;AAC7C,CAAC,CAAA;AAED,uEAAuE;AACvE,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,IAAY,EAA6B,EAAE;IAChF,OAAO,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAA;AAC/C,CAAC,CAAA;AAED,gFAAgF;AAChF,kBAAkB;AAClB,gFAAgF;AAEhF,mCAAmC;AACnC,MAAM,aAAa,GAA2B;IAC7C,GAAG,EAAE,CAAC;IACN,IAAI,EAAE,CAAC;IACP,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,CAAC;IACP,GAAG,EAAE,CAAC;IACN,OAAO,EAAE,CAAC;IACV,KAAK,EAAE,CAAC;CACR,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAc,EAAU,EAAE;IACxD,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACnC,OAAO,CAAC,CAAA;IACT,CAAC;IAED,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QACtC,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;YACjB,SAAQ;QACT,CAAC;QACD,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;QAC/B,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,sBAAsB,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;QACtD,CAAC;QACD,IAAI,IAAI,GAAG,CAAA;IACZ,CAAC;IAED,OAAO,IAAI,CAAA;AACZ,CAAC,CAAA;AA2BD,oFAAoF;AACpF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,OAAoC,EAAmB,EAAE;IAC7F,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,CAAA;IACxC,MAAM,QAAQ,GAAG,uBAAuB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IACrD,MAAM,SAAS,GAAG,uBAAuB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAEvD,IAAI,CAAC,QAAQ,IAAI,CAAC,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;IAC3C,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACpE,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACxE,MAAM,OAAO,GAAG,OAAO,IAAI,MAAM,CAAA;IAEjC,IAAI,CAAC,OAAO,EAAE,CAAC;QACd,IAAI,SAAS,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,kBAAkB,SAAS,GAAG,CAAC,CAAA;QAChD,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,iBAAiB,QAAQ,GAAG,CAAC,CAAA;IAC9C,CAAC;IAED,MAAM,GAAG,GAAG,eAAe,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA;IACzD,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IAE3C,MAAM,KAAK,GAAoB;QAC9B,GAAG;QACH,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,SAAS,IAAI,OAAO,CAAC,IAAI;QAChD,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,SAAS;QACT,MAAM,EAAE,CAAC,SAAS,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;QAC7C,OAAO,EAAE,CAAC,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;QAC/C,OAAO,EAAE,CAAC,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;QAC/C,QAAQ,EAAE,CAAC,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC;KACjD,CAAA;IACD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;IACD,OAAO,KAAK,CAAA;AACb,CAAC,CAAA;AAED,MAAM,uBAAuB,GAAG,CAAC,KAAyB,EAAsB,EAAE;IACjF,MAAM,UAAU,GAAG,KAAK,EAAE,IAAI,EAAE,CAAA;IAChC,OAAO,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAA;AAC3C,CAAC,CAAA;AAED,MAAM,eAAe,GAAG,CAAC,QAA4B,EAAE,GAAkB,EAAE,SAAiB,EAAU,EAAE;IACvG,MAAM,WAAW,GAAG,QAAQ,IAAI,GAAG,CAAC,GAAG,CAAA;IACvC,IAAI,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,CAAA;IAClF,CAAC;IACD,4FAA4F;IAC5F,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,QAAQ,IAAI,WAAW,KAAK,GAAG,CAAC,GAAG,EAAE,CAAC;QACnE,OAAO,GAAG,CAAC,QAAQ,CAAA;IACpB,CAAC;IACD,OAAO,WAAW,CAAA;AACnB,CAAC,CAAA;AAED,MAAM,gBAAgB,GAAG,CAAC,GAAW,EAAE,GAAkB,EAAsB,EAAE;IAChF,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,GAAG,CAAA;IACX,CAAC;IACD,OAAO,GAAG,CAAC,IAAI,CAAA;AAChB,CAAC,CAAA;AAED,MAAM,cAAc,GAAG,CAAC,KAAa,EAAW,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAEzE,MAAM,OAAO,GAAG,CAAC,SAAiB,EAAW,EAAE,CAAC,CAAC,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;AAEvF;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,OAAyB,EAAE,OAA+B,EAAkC,EAAE;IACnI,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAA;IAC5B,MAAM,KAAK,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAA;IAE3C,IAAI,OAAO,GAAG,KAAK,CAAA;IAEnB,gCAAgC;IAChC,IAAI,QAAQ,EAAE,CAAC;QACd,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,MAAM,yBAAyB,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;QAEzF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,kCAAkC,QAAQ,EAAE,CAAC,CAAA;QAC9D,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,UAAU,CAAC,kBAAkB,EAAE,oBAAoB,UAAU,CAAC,MAAM,gDAAgD,CAAC,CAAA;QAC5H,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;QACzB,MAAM,OAAO,CAAC,WAAW,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;QAClD,OAAO,GAAG,IAAI,CAAA;IACf,CAAC;IAED,+FAA+F;IAC/F,4FAA4F;IAC5F,6FAA6F;IAC7F,gGAAgG;IAChG,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,IAAI,IAAI,CAAA;IAEtC,yBAAyB;IACzB,EAAE;IACF,+FAA+F;IAC/F,gGAAgG;IAChG,8FAA8F;IAC9F,8FAA8F;IAC9F,6FAA6F;IAC7F,MAAM,UAAU,GAAG;QAClB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,qBAAqB,EAAE,KAAK,CAAC,OAAO;QACpC,SAAS,EAAE,KAAK,CAAC,SAAS;KAC1B,CAAA;IAED,MAAM,aAAa,GAAG,WAAW;QAChC,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,IAAI,EAAE,SAAkB,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,CAAC,IAAI,EAAE;QAC3F,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,IAAI,EAAE,YAAqB,EAAE,CAAA;IAEjD,MAAM,OAAO,CAAC,WAAW,CAAC,wBAAwB,EAAE,aAAa,CAAC,CAAA;IAClE,MAAM,OAAO,CAAC,WAAW,CAAC,wBAAwB,EAAE,EAAE,GAAG,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;IAErF,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;AACxF,CAAC,CAAA"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { CdpSessionHandle } from './connection.js';
|
|
2
|
+
import type { VisibilityController } from '../visibility/VisibilityController.js';
|
|
3
|
+
/** Result of making a page accept synthetic keyboard input. */
|
|
4
|
+
export type PageInputActivation = {
|
|
5
|
+
/** Whether we had to activate the page (focus emulation) to get there. */
|
|
6
|
+
activated: boolean;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Make sure the attached page will actually receive `Input.dispatchKeyEvent`.
|
|
10
|
+
*
|
|
11
|
+
* Chrome routes keyboard input to the *focused* widget. A hidden page — headless, a background
|
|
12
|
+
* tab, a covered window — has none, so the renderer drops the event and CDP still acks the
|
|
13
|
+
* command: the caller sees success for a key the page never saw. `document.hasFocus()` is the
|
|
14
|
+
* cheapest honest signal for that state.
|
|
15
|
+
*
|
|
16
|
+
* When the page is not focused this locks it into the same shown+focused state `argus page show`
|
|
17
|
+
* produces, through the same controller, so the change is visible in `page hide`/reattach rather
|
|
18
|
+
* than being invisible session state. When even that fails (a transport with no `Emulation`
|
|
19
|
+
* domain, for instance) it throws rather than dispatching into a void.
|
|
20
|
+
*
|
|
21
|
+
* @param pageSession Top-level page session — focus is a page-level concept, never iframe-scoped.
|
|
22
|
+
* @param visibility Controller owning the sticky show lock.
|
|
23
|
+
* @throws {CodedError} `target_not_focused` when the page cannot be activated.
|
|
24
|
+
*/
|
|
25
|
+
export declare const ensurePageInputFocus: (pageSession: CdpSessionHandle, visibility: VisibilityController) => Promise<PageInputActivation>;
|
|
26
|
+
//# sourceMappingURL=pageFocus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pageFocus.d.ts","sourceRoot":"","sources":["../../src/cdp/pageFocus.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAA;AAMjF,+DAA+D;AAC/D,MAAM,MAAM,mBAAmB,GAAG;IACjC,0EAA0E;IAC1E,SAAS,EAAE,OAAO,CAAA;CAClB,CAAA;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,oBAAoB,GAAU,aAAa,gBAAgB,EAAE,YAAY,oBAAoB,KAAG,OAAO,CAAC,mBAAmB,CAqBvI,CAAA"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { formatError } from '@vforsh/argus-core';
|
|
2
|
+
import { codedError } from '../errors.js';
|
|
3
|
+
import { tryEvaluateInPage } from './pageState.js';
|
|
4
|
+
/** How long the focus probe may take before we give up and treat focus as unknown. */
|
|
5
|
+
const FOCUS_PROBE_TIMEOUT_MS = 3_000;
|
|
6
|
+
/**
|
|
7
|
+
* Make sure the attached page will actually receive `Input.dispatchKeyEvent`.
|
|
8
|
+
*
|
|
9
|
+
* Chrome routes keyboard input to the *focused* widget. A hidden page — headless, a background
|
|
10
|
+
* tab, a covered window — has none, so the renderer drops the event and CDP still acks the
|
|
11
|
+
* command: the caller sees success for a key the page never saw. `document.hasFocus()` is the
|
|
12
|
+
* cheapest honest signal for that state.
|
|
13
|
+
*
|
|
14
|
+
* When the page is not focused this locks it into the same shown+focused state `argus page show`
|
|
15
|
+
* produces, through the same controller, so the change is visible in `page hide`/reattach rather
|
|
16
|
+
* than being invisible session state. When even that fails (a transport with no `Emulation`
|
|
17
|
+
* domain, for instance) it throws rather than dispatching into a void.
|
|
18
|
+
*
|
|
19
|
+
* @param pageSession Top-level page session — focus is a page-level concept, never iframe-scoped.
|
|
20
|
+
* @param visibility Controller owning the sticky show lock.
|
|
21
|
+
* @throws {CodedError} `target_not_focused` when the page cannot be activated.
|
|
22
|
+
*/
|
|
23
|
+
export const ensurePageInputFocus = async (pageSession, visibility) => {
|
|
24
|
+
if (!pageSession.isAttached()) {
|
|
25
|
+
// Dispatch itself will fail with the attachment error; don't mask it with a focus error.
|
|
26
|
+
return { activated: false };
|
|
27
|
+
}
|
|
28
|
+
if (await hasPageFocus(pageSession)) {
|
|
29
|
+
return { activated: false };
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
await visibility.setLock(pageSession, 'shown');
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
throw notFocusedError(`activating it failed: ${formatError(error)}`);
|
|
36
|
+
}
|
|
37
|
+
if (!(await hasPageFocus(pageSession))) {
|
|
38
|
+
throw notFocusedError('activating it did not give it focus');
|
|
39
|
+
}
|
|
40
|
+
return { activated: true };
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Read `document.hasFocus()` from the page.
|
|
44
|
+
*
|
|
45
|
+
* An unreadable page (navigating, no `Runtime` yet) counts as focused: a probe that cannot answer
|
|
46
|
+
* must not turn a working dispatch into a failure.
|
|
47
|
+
*/
|
|
48
|
+
const hasPageFocus = async (pageSession) => {
|
|
49
|
+
const focused = await tryEvaluateInPage(pageSession, 'document.hasFocus()', { timeoutMs: FOCUS_PROBE_TIMEOUT_MS });
|
|
50
|
+
return focused !== false;
|
|
51
|
+
};
|
|
52
|
+
const notFocusedError = (reason) => codedError('target_not_focused', `The page is not focused, so Chrome would drop the keyboard event — ${reason}. ` +
|
|
53
|
+
'Run `argus page show <id>` and retry, or start the watcher against a visible page.');
|
|
54
|
+
//# sourceMappingURL=pageFocus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pageFocus.js","sourceRoot":"","sources":["../../src/cdp/pageFocus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAmB,MAAM,cAAc,CAAA;AAG1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAElD,sFAAsF;AACtF,MAAM,sBAAsB,GAAG,KAAK,CAAA;AAQpC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,EAAE,WAA6B,EAAE,UAAgC,EAAgC,EAAE;IAC3I,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,EAAE,CAAC;QAC/B,yFAAyF;QACzF,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAA;IAC5B,CAAC;IAED,IAAI,MAAM,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC;QACrC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAA;IAC5B,CAAC;IAED,IAAI,CAAC;QACJ,MAAM,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,eAAe,CAAC,yBAAyB,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;IACrE,CAAC;IAED,IAAI,CAAC,CAAC,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;QACxC,MAAM,eAAe,CAAC,qCAAqC,CAAC,CAAA;IAC7D,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAA;AAC3B,CAAC,CAAA;AAED;;;;;GAKG;AACH,MAAM,YAAY,GAAG,KAAK,EAAE,WAA6B,EAAoB,EAAE;IAC9E,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAU,WAAW,EAAE,qBAAqB,EAAE,EAAE,SAAS,EAAE,sBAAsB,EAAE,CAAC,CAAA;IAC3H,OAAO,OAAO,KAAK,KAAK,CAAA;AACzB,CAAC,CAAA;AAED,MAAM,eAAe,GAAG,CAAC,MAAc,EAAc,EAAE,CACtD,UAAU,CACT,oBAAoB,EACpB,sEAAsE,MAAM,IAAI;IAC/E,oFAAoF,CACrF,CAAA"}
|
package/dist/cdp/watcher.d.ts
CHANGED
|
@@ -39,6 +39,13 @@ export type CdpWatcherHandle = {
|
|
|
39
39
|
session: CdpSessionHandle;
|
|
40
40
|
stop: () => Promise<void>;
|
|
41
41
|
getTarget: () => CdpTarget | null;
|
|
42
|
+
/**
|
|
43
|
+
* Drop the current socket so the connect loop re-selects a target.
|
|
44
|
+
*
|
|
45
|
+
* The only way back from a target Chrome has replaced under us: the loop already reconnects on
|
|
46
|
+
* socket close, and `findTarget` re-runs the match, so closing is the whole reattachment.
|
|
47
|
+
*/
|
|
48
|
+
reconnect: () => void;
|
|
42
49
|
};
|
|
43
50
|
/** Start CDP polling + websocket subscriptions for console/exception events. */
|
|
44
51
|
export declare const startCdpWatcher: (options: CdpWatcherOptions) => CdpWatcherHandle;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/cdp/watcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAG/E,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAC7E,OAAO,EAAiB,KAAK,YAAY,EAAoC,MAAM,oBAAoB,CAAA;AACvG,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAA;AAG3E,qCAAqC;AACrC,MAAM,MAAM,SAAS,GAAG;IACvB,QAAQ,EAAE,OAAO,CAAA;IACjB,MAAM,EAAE;QACP,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;QACpB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;QAClB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;QACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;KACvB,GAAG,IAAI,CAAA;IACR,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB,CAAA;AAED,yCAAyC;AACzC,MAAM,MAAM,iBAAiB,GAAG;IAC/B,MAAM,EAAE,aAAa,CAAA;IACrB,KAAK,CAAC,EAAE,YAAY,CAAA;IACpB,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,IAAI,CAAA;IAC5C,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,CAAA;IACrC,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,KAAK,IAAI,CAAA;IACxE,UAAU,CAAC,EAAE,MAAM,IAAI,CAAA;IACvB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAA;IACzC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACjF,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,aAAa,CAAC,EAAE,oBAAoB,CAAA;IACpC,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAAA;IACpC,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,UAAU,EAAE,iBAAiB,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC9B,OAAO,EAAE,gBAAgB,CAAA;IACzB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IACzB,SAAS,EAAE,MAAM,SAAS,GAAG,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/cdp/watcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAG/E,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAA;AAC7E,OAAO,EAAiB,KAAK,YAAY,EAAoC,MAAM,oBAAoB,CAAA;AACvG,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAA;AAG3E,qCAAqC;AACrC,MAAM,MAAM,SAAS,GAAG;IACvB,QAAQ,EAAE,OAAO,CAAA;IACjB,MAAM,EAAE;QACP,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;QACpB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;QAClB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;QACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;KACvB,GAAG,IAAI,CAAA;IACR,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACtB,CAAA;AAED,yCAAyC;AACzC,MAAM,MAAM,iBAAiB,GAAG;IAC/B,MAAM,EAAE,aAAa,CAAA;IACrB,KAAK,CAAC,EAAE,YAAY,CAAA;IACpB,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,IAAI,CAAA;IAC5C,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,CAAA;IACrC,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,KAAK,IAAI,CAAA;IACxE,UAAU,CAAC,EAAE,MAAM,IAAI,CAAA;IACvB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAA;IACzC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;IACjF,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,aAAa,CAAC,EAAE,oBAAoB,CAAA;IACpC,aAAa,CAAC,EAAE,aAAa,GAAG,IAAI,CAAA;IACpC,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,UAAU,EAAE,iBAAiB,CAAA;CAC7B,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC9B,OAAO,EAAE,gBAAgB,CAAA;IACzB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IACzB,SAAS,EAAE,MAAM,SAAS,GAAG,IAAI,CAAA;IACjC;;;;;OAKG;IACH,SAAS,EAAE,MAAM,IAAI,CAAA;CACrB,CAAA;AAED,gFAAgF;AAChF,eAAO,MAAM,eAAe,GAAI,SAAS,iBAAiB,KAAG,gBAqI5D,CAAA"}
|
package/dist/cdp/watcher.js
CHANGED
|
@@ -15,6 +15,12 @@ export const startCdpWatcher = (options) => {
|
|
|
15
15
|
socket.close();
|
|
16
16
|
}
|
|
17
17
|
};
|
|
18
|
+
const reconnect = () => {
|
|
19
|
+
if (stopped) {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
socket?.close();
|
|
23
|
+
};
|
|
18
24
|
void runLoop();
|
|
19
25
|
session.onEvent('Runtime.consoleAPICalled', (params) => {
|
|
20
26
|
if (!currentTarget) {
|
|
@@ -47,6 +53,7 @@ export const startCdpWatcher = (options) => {
|
|
|
47
53
|
});
|
|
48
54
|
return {
|
|
49
55
|
stop,
|
|
56
|
+
reconnect,
|
|
50
57
|
session,
|
|
51
58
|
getTarget: () => (currentTarget ? { ...currentTarget } : null),
|
|
52
59
|
};
|
package/dist/cdp/watcher.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/cdp/watcher.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAA;AAExD,OAAO,EAAE,aAAa,EAAqB,cAAc,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AACvG,OAAO,EAAE,UAAU,EAAkB,MAAM,qBAAqB,CAAA;AAEhE,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/cdp/watcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,4 +15,12 @@ export type CdpTarget = {
|
|
|
15
15
|
parentId: string | null;
|
|
16
16
|
};
|
|
17
17
|
export declare const findTarget: (chrome: WatcherChrome, match?: WatcherMatch) => Promise<CdpTarget>;
|
|
18
|
+
/**
|
|
19
|
+
* List Chrome's debuggable targets.
|
|
20
|
+
*
|
|
21
|
+
* @param chrome DevTools endpoint to query.
|
|
22
|
+
* @param timeoutMs Abort budget for the request. Health probes pass a shorter one.
|
|
23
|
+
* @throws {Error} When the endpoint is unreachable, times out, or answers with a non-2xx status.
|
|
24
|
+
*/
|
|
25
|
+
export declare const fetchCdpTargets: (chrome: WatcherChrome, timeoutMs?: number) => Promise<CdpTarget[]>;
|
|
18
26
|
//# sourceMappingURL=watcherTargets.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watcherTargets.d.ts","sourceRoot":"","sources":["../../src/cdp/watcherTargets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAErE,yDAAyD;AACzD,MAAM,MAAM,SAAS,GAAG;IACvB,oDAAoD;IACpD,EAAE,EAAE,MAAM,CAAA;IAEV,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAA;IAEb,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAA;IAEX,oFAAoF;IACpF,oBAAoB,EAAE,MAAM,CAAA;IAE5B,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAA;IAEZ,kGAAkG;IAClG,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB,CAAA;AAED,eAAO,MAAM,UAAU,GAAU,QAAQ,aAAa,EAAE,QAAQ,YAAY,KAAG,OAAO,CAAC,SAAS,CA6B/F,CAAA"}
|
|
1
|
+
{"version":3,"file":"watcherTargets.d.ts","sourceRoot":"","sources":["../../src/cdp/watcherTargets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAErE,yDAAyD;AACzD,MAAM,MAAM,SAAS,GAAG;IACvB,oDAAoD;IACpD,EAAE,EAAE,MAAM,CAAA;IAEV,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAA;IAEb,+BAA+B;IAC/B,GAAG,EAAE,MAAM,CAAA;IAEX,oFAAoF;IACpF,oBAAoB,EAAE,MAAM,CAAA;IAE5B,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAA;IAEZ,kGAAkG;IAClG,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB,CAAA;AAED,eAAO,MAAM,UAAU,GAAU,QAAQ,aAAa,EAAE,QAAQ,YAAY,KAAG,OAAO,CAAC,SAAS,CA6B/F,CAAA;AAoDD;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAAU,QAAQ,aAAa,EAAE,kBAAkC,KAAG,OAAO,CAAC,SAAS,EAAE,CAqBpH,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export const findTarget = async (chrome, match) => {
|
|
2
|
-
const targets = await
|
|
2
|
+
const targets = await fetchCdpTargets(chrome);
|
|
3
3
|
if (targets.length === 0) {
|
|
4
4
|
throw new Error('No CDP targets available');
|
|
5
5
|
}
|
|
@@ -56,8 +56,17 @@ const matchesTarget = (target, match, targetById, urlRegex, titleRegex) => {
|
|
|
56
56
|
}
|
|
57
57
|
return true;
|
|
58
58
|
};
|
|
59
|
-
|
|
60
|
-
|
|
59
|
+
/** Default budget for the `/json` round-trip, so a wedged browser cannot stall the connect loop. */
|
|
60
|
+
const TARGET_LIST_TIMEOUT_MS = 5_000;
|
|
61
|
+
/**
|
|
62
|
+
* List Chrome's debuggable targets.
|
|
63
|
+
*
|
|
64
|
+
* @param chrome DevTools endpoint to query.
|
|
65
|
+
* @param timeoutMs Abort budget for the request. Health probes pass a shorter one.
|
|
66
|
+
* @throws {Error} When the endpoint is unreachable, times out, or answers with a non-2xx status.
|
|
67
|
+
*/
|
|
68
|
+
export const fetchCdpTargets = async (chrome, timeoutMs = TARGET_LIST_TIMEOUT_MS) => {
|
|
69
|
+
const response = await fetch(`http://${chrome.host}:${chrome.port}/json`, { signal: AbortSignal.timeout(timeoutMs) });
|
|
61
70
|
if (!response.ok) {
|
|
62
71
|
throw new Error(`Failed to fetch CDP targets (status ${response.status})`);
|
|
63
72
|
}
|