@vforsh/argus-watcher 0.1.7 → 0.1.9

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 (101) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/cdp/dom/selector.d.ts +10 -0
  3. package/dist/cdp/dom/selector.d.ts.map +1 -1
  4. package/dist/cdp/dom/selector.js +12 -0
  5. package/dist/cdp/dom/selector.js.map +1 -1
  6. package/dist/cdp/mouse.d.ts.map +1 -1
  7. package/dist/cdp/mouse.js +2 -11
  8. package/dist/cdp/mouse.js.map +1 -1
  9. package/dist/cdp/pageIndicator.d.ts +1 -1
  10. package/dist/cdp/pageIndicator.d.ts.map +1 -1
  11. package/dist/cdp/text-filter.js.map +1 -1
  12. package/dist/cdp/watcher.d.ts +3 -21
  13. package/dist/cdp/watcher.d.ts.map +1 -1
  14. package/dist/cdp/watcher.js +2 -278
  15. package/dist/cdp/watcher.js.map +1 -1
  16. package/dist/cdp/watcherEvents.d.ts +18 -0
  17. package/dist/cdp/watcherEvents.d.ts.map +1 -0
  18. package/dist/cdp/watcherEvents.js +169 -0
  19. package/dist/cdp/watcherEvents.js.map +1 -0
  20. package/dist/cdp/watcherTargets.d.ts +18 -0
  21. package/dist/cdp/watcherTargets.d.ts.map +1 -0
  22. package/dist/cdp/watcherTargets.js +95 -0
  23. package/dist/cdp/watcherTargets.js.map +1 -0
  24. package/dist/http/router.d.ts.map +1 -1
  25. package/dist/http/router.js +3 -77
  26. package/dist/http/router.js.map +1 -1
  27. package/dist/http/routes/domSelectorRoute.d.ts +16 -0
  28. package/dist/http/routes/domSelectorRoute.d.ts.map +1 -0
  29. package/dist/http/routes/domSelectorRoute.js +31 -0
  30. package/dist/http/routes/domSelectorRoute.js.map +1 -0
  31. package/dist/http/routes/index.d.ts +9 -0
  32. package/dist/http/routes/index.d.ts.map +1 -0
  33. package/dist/http/routes/index.js +78 -0
  34. package/dist/http/routes/index.js.map +1 -0
  35. package/dist/http/routes/postDomClick.d.ts.map +1 -1
  36. package/dist/http/routes/postDomClick.js +11 -21
  37. package/dist/http/routes/postDomClick.js.map +1 -1
  38. package/dist/http/routes/postDomFill.d.ts.map +1 -1
  39. package/dist/http/routes/postDomFill.js +9 -23
  40. package/dist/http/routes/postDomFill.js.map +1 -1
  41. package/dist/http/routes/postDomFocus.d.ts.map +1 -1
  42. package/dist/http/routes/postDomFocus.js +6 -17
  43. package/dist/http/routes/postDomFocus.js.map +1 -1
  44. package/dist/http/routes/postDomHover.d.ts.map +1 -1
  45. package/dist/http/routes/postDomHover.js +6 -17
  46. package/dist/http/routes/postDomHover.js.map +1 -1
  47. package/dist/http/routes/postDomInfo.d.ts.map +1 -1
  48. package/dist/http/routes/postDomInfo.js +6 -18
  49. package/dist/http/routes/postDomInfo.js.map +1 -1
  50. package/dist/http/routes/postDomRemove.d.ts.map +1 -1
  51. package/dist/http/routes/postDomRemove.js +6 -17
  52. package/dist/http/routes/postDomRemove.js.map +1 -1
  53. package/dist/http/routes/postDomScroll.d.ts.map +1 -1
  54. package/dist/http/routes/postDomScroll.js +2 -7
  55. package/dist/http/routes/postDomScroll.js.map +1 -1
  56. package/dist/http/routes/postDomScrollTo.d.ts.map +1 -1
  57. package/dist/http/routes/postDomScrollTo.js +2 -7
  58. package/dist/http/routes/postDomScrollTo.js.map +1 -1
  59. package/dist/http/routes/postDomSetFile.d.ts.map +1 -1
  60. package/dist/http/routes/postDomSetFile.js +9 -23
  61. package/dist/http/routes/postDomSetFile.js.map +1 -1
  62. package/dist/http/routes/postDomTree.d.ts.map +1 -1
  63. package/dist/http/routes/postDomTree.js +6 -18
  64. package/dist/http/routes/postDomTree.js.map +1 -1
  65. package/dist/index.d.ts +1 -1
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +3 -396
  68. package/dist/index.js.map +1 -1
  69. package/dist/runtime/watcherInject.d.ts +15 -0
  70. package/dist/runtime/watcherInject.d.ts.map +1 -0
  71. package/dist/runtime/watcherInject.js +21 -0
  72. package/dist/runtime/watcherInject.js.map +1 -0
  73. package/dist/runtime/watcherServices.d.ts +32 -0
  74. package/dist/runtime/watcherServices.d.ts.map +1 -0
  75. package/dist/runtime/watcherServices.js +64 -0
  76. package/dist/runtime/watcherServices.js.map +1 -0
  77. package/dist/runtime/watcherSetup.d.ts +35 -0
  78. package/dist/runtime/watcherSetup.d.ts.map +1 -0
  79. package/dist/runtime/watcherSetup.js +96 -0
  80. package/dist/runtime/watcherSetup.js.map +1 -0
  81. package/dist/sources/extension-delegating-session.d.ts +21 -0
  82. package/dist/sources/extension-delegating-session.d.ts.map +1 -0
  83. package/dist/sources/extension-delegating-session.js +62 -0
  84. package/dist/sources/extension-delegating-session.js.map +1 -0
  85. package/dist/sources/extension-frame-runtime.d.ts +11 -0
  86. package/dist/sources/extension-frame-runtime.d.ts.map +1 -0
  87. package/dist/sources/extension-frame-runtime.js +129 -0
  88. package/dist/sources/extension-frame-runtime.js.map +1 -0
  89. package/dist/sources/extension-session-events.d.ts +21 -0
  90. package/dist/sources/extension-session-events.d.ts.map +1 -0
  91. package/dist/sources/extension-session-events.js +103 -0
  92. package/dist/sources/extension-session-events.js.map +1 -0
  93. package/dist/sources/extension-source.d.ts +0 -4
  94. package/dist/sources/extension-source.d.ts.map +1 -1
  95. package/dist/sources/extension-source.js +39 -285
  96. package/dist/sources/extension-source.js.map +1 -1
  97. package/dist/startWatcherRuntime.d.ts +6 -0
  98. package/dist/startWatcherRuntime.d.ts.map +1 -0
  99. package/dist/startWatcherRuntime.js +251 -0
  100. package/dist/startWatcherRuntime.js.map +1 -0
  101. package/package.json +1 -1
@@ -0,0 +1,96 @@
1
+ import os from 'node:os';
2
+ import path from 'node:path';
3
+ import Emittery from 'emittery';
4
+ import { LogBuffer } from '../buffer/LogBuffer.js';
5
+ import { NetBuffer } from '../buffer/NetBuffer.js';
6
+ import { WatcherFileLogger } from '../fileLogs/WatcherFileLogger.js';
7
+ import { buildIgnoreMatcher } from '../cdp/ignoreList.js';
8
+ import { createCdpSessionHandle } from '../cdp/connection.js';
9
+ import { createEmulationController } from '../emulation/EmulationController.js';
10
+ import { createThrottleController } from '../throttle/ThrottleController.js';
11
+ export const normalizeWatcherSetup = (options, watcherId) => {
12
+ const sourceMode = options.source ?? 'cdp';
13
+ const host = options.host ?? '127.0.0.1';
14
+ const port = options.port ?? 0;
15
+ const chrome = options.chrome ?? { host: '127.0.0.1', port: 9222 };
16
+ const bufferSize = options.bufferSize ?? 50_000;
17
+ const startedAt = Date.now();
18
+ const ignoreMatcher = buildIgnoreMatcher(options.ignoreList);
19
+ const stripUrlPrefixes = options.location?.stripUrlPrefixes;
20
+ const artifactsBaseDir = resolveArtifactsBaseDir(options.artifacts?.base, watcherId);
21
+ const logsEnabled = options.artifacts?.logs?.enabled === true;
22
+ const logsDir = path.join(artifactsBaseDir, 'logs');
23
+ const includeTimestamps = options.artifacts?.logs?.includeTimestamps ?? false;
24
+ const maxFiles = resolveMaxFiles(options.artifacts?.logs?.maxFiles);
25
+ const netEnabled = options.net?.enabled === true;
26
+ const pageConsoleLogging = options.pageConsoleLogging ?? 'minimal';
27
+ const events = new Emittery();
28
+ const buffer = new LogBuffer(bufferSize);
29
+ const netBuffer = netEnabled ? new NetBuffer(bufferSize) : null;
30
+ const fileLogger = logsEnabled
31
+ ? new WatcherFileLogger({
32
+ watcherId,
33
+ startedAt,
34
+ logsDir,
35
+ chrome: sourceMode === 'cdp' ? chrome : undefined,
36
+ match: options.match,
37
+ maxFiles,
38
+ includeTimestamps,
39
+ buildFilename: options.artifacts?.logs?.buildFilename,
40
+ })
41
+ : null;
42
+ const record = {
43
+ id: watcherId,
44
+ host,
45
+ port,
46
+ pid: process.pid,
47
+ cwd: process.cwd(),
48
+ startedAt,
49
+ updatedAt: Date.now(),
50
+ match: sourceMode === 'cdp' ? options.match : undefined,
51
+ chrome: sourceMode === 'cdp' ? chrome : undefined,
52
+ includeTimestamps,
53
+ source: sourceMode,
54
+ };
55
+ return {
56
+ sourceMode,
57
+ host,
58
+ port,
59
+ chrome,
60
+ watcherId,
61
+ startedAt,
62
+ artifactsBaseDir,
63
+ includeTimestamps,
64
+ netEnabled,
65
+ pageConsoleLogging,
66
+ ignoreMatcher,
67
+ stripUrlPrefixes,
68
+ events,
69
+ buffer,
70
+ netBuffer,
71
+ record,
72
+ fileLogger,
73
+ sessionHandle: createCdpSessionHandle(),
74
+ emulationController: createEmulationController(),
75
+ throttleController: createThrottleController(),
76
+ };
77
+ };
78
+ const resolveArtifactsBaseDir = (base, watcherId) => {
79
+ if (base !== undefined && base !== null) {
80
+ if (typeof base !== 'string' || base.trim() === '') {
81
+ throw new Error('artifacts.base must be a non-empty string when provided');
82
+ }
83
+ return path.resolve(base);
84
+ }
85
+ return path.join(os.tmpdir(), 'argus', watcherId);
86
+ };
87
+ const resolveMaxFiles = (maxFiles) => {
88
+ if (maxFiles === undefined) {
89
+ return 5;
90
+ }
91
+ if (!Number.isInteger(maxFiles) || maxFiles < 1) {
92
+ throw new Error('artifacts.logs.maxFiles must be an integer >= 1');
93
+ }
94
+ return maxFiles;
95
+ };
96
+ //# sourceMappingURL=watcherSetup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcherSetup.js","sourceRoot":"","sources":["../../src/runtime/watcherSetup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { ExtensionSession } from '../native-messaging/session-manager.js';
2
+ import type { CdpSessionHandle, CdpTargetContext } from '../cdp/connection.js';
3
+ export type DelegatingSessionController = {
4
+ rebind: () => void;
5
+ dispose: () => void;
6
+ };
7
+ type CreateDelegatingSessionOptions = {
8
+ getCurrentSession: () => ExtensionSession | null;
9
+ requireCurrentSession: () => ExtensionSession;
10
+ getTargetContext: () => CdpTargetContext;
11
+ mapParams?: (method: string, params?: Record<string, unknown>) => Record<string, unknown> | undefined;
12
+ };
13
+ /**
14
+ * Keep a stable session handle while the underlying extension tab attachment changes over time.
15
+ */
16
+ export declare const createDelegatingSession: (options: CreateDelegatingSessionOptions) => {
17
+ session: CdpSessionHandle;
18
+ controller: DelegatingSessionController;
19
+ };
20
+ export {};
21
+ //# sourceMappingURL=extension-delegating-session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-delegating-session.d.ts","sourceRoot":"","sources":["../../src/sources/extension-delegating-session.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAA;AAC9E,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAS9E,MAAM,MAAM,2BAA2B,GAAG;IACzC,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,OAAO,EAAE,MAAM,IAAI,CAAA;CACnB,CAAA;AAED,KAAK,8BAA8B,GAAG;IACrC,iBAAiB,EAAE,MAAM,gBAAgB,GAAG,IAAI,CAAA;IAChD,qBAAqB,EAAE,MAAM,gBAAgB,CAAA;IAC7C,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;IACxC,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAA;CACrG,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,uBAAuB,GACnC,SAAS,8BAA8B,KACrC;IAAE,OAAO,EAAE,gBAAgB,CAAC;IAAC,UAAU,EAAE,2BAA2B,CAAA;CAsDtE,CAAA"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Keep a stable session handle while the underlying extension tab attachment changes over time.
3
+ */
4
+ export const createDelegatingSession = (options) => {
5
+ const subscriptions = new Set();
6
+ const rebindSubscriptions = () => {
7
+ // Delegating sessions are created before a tab may be attached, so event listeners
8
+ // must follow the active extension session instead of binding once and going stale.
9
+ for (const subscription of subscriptions) {
10
+ subscription.unbind();
11
+ const currentSession = options.getCurrentSession();
12
+ if (!currentSession) {
13
+ continue;
14
+ }
15
+ subscription.off = currentSession.handle.onEvent(subscription.method, subscription.handler);
16
+ }
17
+ };
18
+ const disposeSubscriptions = () => {
19
+ for (const subscription of subscriptions) {
20
+ subscription.unbind();
21
+ }
22
+ subscriptions.clear();
23
+ };
24
+ const controller = {
25
+ rebind: rebindSubscriptions,
26
+ dispose: disposeSubscriptions,
27
+ };
28
+ const session = {
29
+ isAttached: () => options.getCurrentSession()?.handle.isAttached() ?? false,
30
+ sendAndWait: async (method, params, commandOptions) => {
31
+ const currentSession = options.requireCurrentSession();
32
+ const targetContext = options.getTargetContext();
33
+ const nextParams = options.mapParams ? options.mapParams(method, params) : params;
34
+ const nextOptions = targetContext.kind === 'frame' && targetContext.sessionId
35
+ ? { ...(commandOptions ?? {}), sessionId: targetContext.sessionId }
36
+ : commandOptions;
37
+ return currentSession.handle.sendAndWait(method, nextParams, nextOptions);
38
+ },
39
+ onEvent: (method, handler) => {
40
+ const subscription = createDelegatingEventSubscription(method, handler);
41
+ subscriptions.add(subscription);
42
+ controller.rebind();
43
+ return () => {
44
+ subscription.unbind();
45
+ subscriptions.delete(subscription);
46
+ };
47
+ },
48
+ getTargetContext: options.getTargetContext,
49
+ };
50
+ controller.rebind();
51
+ return { session, controller };
52
+ };
53
+ const createDelegatingEventSubscription = (method, handler) => ({
54
+ method,
55
+ handler,
56
+ off: null,
57
+ unbind() {
58
+ this.off?.();
59
+ this.off = null;
60
+ },
61
+ });
62
+ //# sourceMappingURL=extension-delegating-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-delegating-session.js","sourceRoot":"","sources":["../../src/sources/extension-delegating-session.ts"],"names":[],"mappings":"AAsBA;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,CACtC,OAAuC,EACkC,EAAE;IAC3E,MAAM,aAAa,GAAG,IAAI,GAAG,EAA+B,CAAA;IAC5D,MAAM,mBAAmB,GAAG,GAAS,EAAE;QACtC,mFAAmF;QACnF,oFAAoF;QACpF,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;YAC1C,YAAY,CAAC,MAAM,EAAE,CAAA;YACrB,MAAM,cAAc,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAA;YAClD,IAAI,CAAC,cAAc,EAAE,CAAC;gBACrB,SAAQ;YACT,CAAC;YACD,YAAY,CAAC,GAAG,GAAG,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,CAAA;QAC5F,CAAC;IACF,CAAC,CAAA;IAED,MAAM,oBAAoB,GAAG,GAAS,EAAE;QACvC,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;YAC1C,YAAY,CAAC,MAAM,EAAE,CAAA;QACtB,CAAC;QACD,aAAa,CAAC,KAAK,EAAE,CAAA;IACtB,CAAC,CAAA;IAED,MAAM,UAAU,GAAgC;QAC/C,MAAM,EAAE,mBAAmB;QAC3B,OAAO,EAAE,oBAAoB;KAC7B,CAAA;IAED,MAAM,OAAO,GAAqB;QACjC,UAAU,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE,IAAI,KAAK;QAC3E,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE;YACrD,MAAM,cAAc,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAA;YACtD,MAAM,aAAa,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAA;YAChD,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;YACjF,MAAM,WAAW,GAChB,aAAa,CAAC,IAAI,KAAK,OAAO,IAAI,aAAa,CAAC,SAAS;gBACxD,CAAC,CAAC,EAAE,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,aAAa,CAAC,SAAS,EAAE;gBACnE,CAAC,CAAC,cAAc,CAAA;YAClB,OAAO,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,CAAA;QAC1E,CAAC;QACD,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;YAC5B,MAAM,YAAY,GAAG,iCAAiC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YACvE,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;YAC/B,UAAU,CAAC,MAAM,EAAE,CAAA;YAEnB,OAAO,GAAG,EAAE;gBACX,YAAY,CAAC,MAAM,EAAE,CAAA;gBACrB,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;YACnC,CAAC,CAAA;QACF,CAAC;QACD,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;KAC1C,CAAA;IAED,UAAU,CAAC,MAAM,EAAE,CAAA;IACnB,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,CAAA;AAC/B,CAAC,CAAA;AAED,MAAM,iCAAiC,GAAG,CAAC,MAAc,EAAE,OAAmD,EAA+B,EAAE,CAAC,CAAC;IAChJ,MAAM;IACN,OAAO;IACP,GAAG,EAAE,IAAI;IACT,MAAM;QACL,IAAI,CAAC,GAAG,EAAE,EAAE,CAAA;QACZ,IAAI,CAAC,GAAG,GAAG,IAAI,CAAA;IAChB,CAAC;CACD,CAAC,CAAA"}
@@ -0,0 +1,11 @@
1
+ import type { ExtensionSession } from '../native-messaging/session-manager.js';
2
+ import type { CdpSourceTarget } from './types.js';
3
+ import { type ExtensionFrameState } from './extension-frame-state.js';
4
+ export declare const seedExtensionFrameState: (session: ExtensionSession, state: ExtensionFrameState) => ExtensionFrameState;
5
+ export declare const getSelectedExtensionTarget: (session: ExtensionSession, state: ExtensionFrameState | undefined) => CdpSourceTarget;
6
+ export declare const setRequestedTargetSelection: (state: ExtensionFrameState, frameId: string | null) => void;
7
+ export declare const reconcileExtensionTargetSelection: (session: ExtensionSession, state: ExtensionFrameState, onTargetChanged: () => void) => boolean;
8
+ export declare const refreshExtensionFrameTree: (session: ExtensionSession, state: ExtensionFrameState, refreshFrameTitle: (frameId: string) => Promise<void>) => Promise<void>;
9
+ export declare const removeExtensionFrame: (state: ExtensionFrameState, frameId: string) => void;
10
+ export declare const refreshExtensionFrameTitle: (session: ExtensionSession, state: ExtensionFrameState, frameId: string, onActiveFrameUpdated: () => void, contextId?: number) => Promise<void>;
11
+ //# sourceMappingURL=extension-frame-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-frame-runtime.d.ts","sourceRoot":"","sources":["../../src/sources/extension-frame-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAA;AAC9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,EAON,KAAK,mBAAmB,EACxB,MAAM,4BAA4B,CAAA;AAEnC,eAAO,MAAM,uBAAuB,GAAI,SAAS,gBAAgB,EAAE,OAAO,mBAAmB,KAAG,mBAiB/F,CAAA;AAED,eAAO,MAAM,0BAA0B,GAAI,SAAS,gBAAgB,EAAE,OAAO,mBAAmB,GAAG,SAAS,KAAG,eAW9G,CAAA;AAED,eAAO,MAAM,2BAA2B,GAAI,OAAO,mBAAmB,EAAE,SAAS,MAAM,GAAG,IAAI,KAAG,IAKhG,CAAA;AAED,eAAO,MAAM,iCAAiC,GAAI,SAAS,gBAAgB,EAAE,OAAO,mBAAmB,EAAE,iBAAiB,MAAM,IAAI,KAAG,OAkBtI,CAAA;AAED,eAAO,MAAM,yBAAyB,GACrC,SAAS,gBAAgB,EACzB,OAAO,mBAAmB,EAC1B,mBAAmB,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,KACnD,OAAO,CAAC,IAAI,CAId,CAAA;AAED,eAAO,MAAM,oBAAoB,GAAI,OAAO,mBAAmB,EAAE,SAAS,MAAM,KAAG,IAmBlF,CAAA;AAED,eAAO,MAAM,0BAA0B,GACtC,SAAS,gBAAgB,EACzB,OAAO,mBAAmB,EAC1B,SAAS,MAAM,EACf,sBAAsB,MAAM,IAAI,EAChC,YAAY,MAAM,KAChB,OAAO,CAAC,IAAI,CA2Cd,CAAA"}
@@ -0,0 +1,129 @@
1
+ import { buildPageTarget, collectFrameTree, createRequestedFrameHint, frameToTarget, resolveRequestedTarget, } from './extension-frame-state.js';
2
+ export const seedExtensionFrameState = (session, state) => {
3
+ if (state.frames.size > 0 || session.frames.length === 0) {
4
+ return state;
5
+ }
6
+ state.topFrameId = session.topFrameId;
7
+ for (const frame of session.frames) {
8
+ state.frames.set(frame.frameId, {
9
+ frameId: frame.frameId,
10
+ parentFrameId: frame.parentFrameId,
11
+ url: frame.url,
12
+ title: frame.title,
13
+ sessionId: frame.sessionId,
14
+ });
15
+ }
16
+ return state;
17
+ };
18
+ export const getSelectedExtensionTarget = (session, state) => {
19
+ if (!state?.activeFrameId) {
20
+ return buildPageTarget(session, { attached: true });
21
+ }
22
+ const frame = state.frames.get(state.activeFrameId);
23
+ if (!frame) {
24
+ return buildPageTarget(session, { attached: true });
25
+ }
26
+ return frameToTarget(session.tabId, frame, { attached: true, faviconUrl: session.faviconUrl, topFrameId: state.topFrameId });
27
+ };
28
+ export const setRequestedTargetSelection = (state, frameId) => {
29
+ const frame = frameId ? state.frames.get(frameId) : null;
30
+ state.requestedFrameId = frameId;
31
+ state.requestedFrameHint = createRequestedFrameHint(frame);
32
+ state.requestedFrameDetached = false;
33
+ };
34
+ export const reconcileExtensionTargetSelection = (session, state, onTargetChanged) => {
35
+ const resolution = resolveRequestedTarget(state);
36
+ if (resolution.kind === 'page') {
37
+ state.requestedFrameDetached = false;
38
+ return activatePageTarget(state, onTargetChanged);
39
+ }
40
+ if (resolution.kind === 'pending') {
41
+ return false;
42
+ }
43
+ state.requestedFrameDetached = false;
44
+ if (state.activeFrameId === resolution.frameId) {
45
+ return false;
46
+ }
47
+ return activateFrameTarget(state, resolution.frameId, onTargetChanged);
48
+ };
49
+ export const refreshExtensionFrameTree = async (session, state, refreshFrameTitle) => {
50
+ const frameTree = (await session.handle.sendAndWait('Page.getFrameTree'));
51
+ collectFrameTree(frameTree.frameTree, state);
52
+ await Promise.all([...state.executionContexts.keys()].map((frameId) => refreshFrameTitle(frameId)));
53
+ };
54
+ export const removeExtensionFrame = (state, frameId) => {
55
+ const childIds = [...state.frames.values()].filter((frame) => frame.parentFrameId === frameId).map((frame) => frame.frameId);
56
+ for (const childId of childIds) {
57
+ removeExtensionFrame(state, childId);
58
+ }
59
+ /**
60
+ * Keep the user's requested iframe selection across reload/navigation detaches.
61
+ * Frame ids are ephemeral, so the stored frame hint lets selection survive a fresh id after reload.
62
+ */
63
+ if (state.activeFrameId === frameId) {
64
+ state.requestedFrameDetached = state.requestedFrameId === frameId;
65
+ state.activeFrameId = null;
66
+ state.activeAttachedAt = null;
67
+ }
68
+ state.frames.delete(frameId);
69
+ state.executionContexts.delete(frameId);
70
+ state.pendingTitleLoads.delete(frameId);
71
+ };
72
+ export const refreshExtensionFrameTitle = async (session, state, frameId, onActiveFrameUpdated, contextId) => {
73
+ if (frameId === state.topFrameId || state.pendingTitleLoads.has(frameId)) {
74
+ return;
75
+ }
76
+ const executionContextId = contextId ?? state.executionContexts.get(frameId);
77
+ if (executionContextId == null) {
78
+ return;
79
+ }
80
+ const frame = state.frames.get(frameId);
81
+ if (!frame) {
82
+ return;
83
+ }
84
+ state.pendingTitleLoads.add(frameId);
85
+ try {
86
+ const evaluated = (await session.handle.sendAndWait('Runtime.evaluate', {
87
+ expression: 'document.title',
88
+ contextId: executionContextId,
89
+ returnByValue: true,
90
+ silent: true,
91
+ }, frame.sessionId ? { sessionId: frame.sessionId } : undefined));
92
+ const title = typeof evaluated.result?.value === 'string' ? evaluated.result.value.trim() : '';
93
+ const latestFrame = state.frames.get(frameId);
94
+ if (!latestFrame) {
95
+ return;
96
+ }
97
+ latestFrame.title = title || null;
98
+ if (state.activeFrameId === frameId) {
99
+ onActiveFrameUpdated();
100
+ }
101
+ }
102
+ catch {
103
+ // Ignore transient frame-title lookup failures during navigation/bootstrap.
104
+ }
105
+ finally {
106
+ state.pendingTitleLoads.delete(frameId);
107
+ }
108
+ };
109
+ const activatePageTarget = (state, onTargetChanged) => {
110
+ if (state.activeFrameId == null) {
111
+ if (state.activeAttachedAt == null) {
112
+ state.activeAttachedAt = Date.now();
113
+ onTargetChanged();
114
+ return true;
115
+ }
116
+ return false;
117
+ }
118
+ state.activeFrameId = null;
119
+ state.activeAttachedAt = Date.now();
120
+ onTargetChanged();
121
+ return true;
122
+ };
123
+ const activateFrameTarget = (state, frameId, onTargetChanged) => {
124
+ state.activeFrameId = frameId;
125
+ state.activeAttachedAt = Date.now();
126
+ onTargetChanged();
127
+ return true;
128
+ };
129
+ //# sourceMappingURL=extension-frame-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-frame-runtime.js","sourceRoot":"","sources":["../../src/sources/extension-frame-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { ExtensionSession } from '../native-messaging/session-manager.js';
2
+ import type { CdpSourceEvents } from './types.js';
3
+ import { type ExtensionFrameState } from './extension-frame-state.js';
4
+ type RegisterExtensionSessionEventsOptions = {
5
+ session: ExtensionSession;
6
+ events: CdpSourceEvents;
7
+ ignoreMatcher?: ((url: string) => boolean) | null;
8
+ stripUrlPrefixes?: string[];
9
+ getOrCreateFrameState: (tabId: number) => ExtensionFrameState;
10
+ reconcileTargetSelection: (session: ExtensionSession) => boolean;
11
+ removeFrame: (tabId: number, frameId: string) => void;
12
+ refreshFrameTitle: (session: ExtensionSession, frameId: string, contextId?: number) => Promise<void>;
13
+ emitTargetChanged: (session: ExtensionSession) => void;
14
+ setCurrentSession: (session: ExtensionSession) => void;
15
+ };
16
+ /**
17
+ * Subscribe to extension-backed CDP events and funnel them back through the shared frame-state helpers.
18
+ */
19
+ export declare const registerExtensionSessionEventHandlers: ({ session, events, ignoreMatcher, stripUrlPrefixes, getOrCreateFrameState, reconcileTargetSelection, removeFrame, refreshFrameTitle, emitTargetChanged, setCurrentSession, }: RegisterExtensionSessionEventsOptions) => void;
20
+ export {};
21
+ //# sourceMappingURL=extension-session-events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-session-events.d.ts","sourceRoot":"","sources":["../../src/sources/extension-session-events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAA;AAC9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AACjD,OAAO,EAAqC,KAAK,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAGxG,KAAK,qCAAqC,GAAG;IAC5C,OAAO,EAAE,gBAAgB,CAAA;IACzB,MAAM,EAAE,eAAe,CAAA;IACvB,aAAa,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,IAAI,CAAA;IACjD,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC3B,qBAAqB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,mBAAmB,CAAA;IAC7D,wBAAwB,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAA;IAChE,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;IACrD,iBAAiB,EAAE,CAAC,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACpG,iBAAiB,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAA;IACtD,iBAAiB,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAA;CACtD,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,qCAAqC,GAAI,8KAWnD,qCAAqC,KAAG,IA2G1C,CAAA"}
@@ -0,0 +1,103 @@
1
+ import { parseExecutionContext, parseFrame } from './extension-frame-state.js';
2
+ import { toConsoleEvent, toExceptionEvent } from './extension-log-events.js';
3
+ /**
4
+ * Subscribe to extension-backed CDP events and funnel them back through the shared frame-state helpers.
5
+ */
6
+ export const registerExtensionSessionEventHandlers = ({ session, events, ignoreMatcher, stripUrlPrefixes, getOrCreateFrameState, reconcileTargetSelection, removeFrame, refreshFrameTitle, emitTargetChanged, setCurrentSession, }) => {
7
+ session.handle.onEvent('Runtime.executionContextCreated', (params, meta) => {
8
+ const context = parseExecutionContext(params);
9
+ if (!context?.isDefault || !context.frameId) {
10
+ return;
11
+ }
12
+ const state = getOrCreateFrameState(session.tabId);
13
+ state.executionContexts.set(context.frameId, context.id);
14
+ const frame = state.frames.get(context.frameId);
15
+ if (frame) {
16
+ frame.sessionId = meta.sessionId ?? null;
17
+ }
18
+ void refreshFrameTitle(session, context.frameId, context.id);
19
+ reconcileTargetSelection(session);
20
+ });
21
+ session.handle.onEvent('Runtime.executionContextsCleared', () => {
22
+ const state = getOrCreateFrameState(session.tabId);
23
+ state.executionContexts.clear();
24
+ state.pendingTitleLoads.clear();
25
+ });
26
+ session.handle.onEvent('Runtime.executionContextDestroyed', (params) => {
27
+ const record = params;
28
+ if (record.executionContextId == null) {
29
+ return;
30
+ }
31
+ const state = getOrCreateFrameState(session.tabId);
32
+ for (const [frameId, contextId] of state.executionContexts.entries()) {
33
+ if (contextId === record.executionContextId) {
34
+ state.executionContexts.delete(frameId);
35
+ state.pendingTitleLoads.delete(frameId);
36
+ }
37
+ }
38
+ });
39
+ session.handle.onEvent('Page.frameNavigated', (params, meta) => {
40
+ const frame = parseFrame(params);
41
+ if (!frame) {
42
+ return;
43
+ }
44
+ const state = getOrCreateFrameState(session.tabId);
45
+ state.frames.set(frame.frameId, frame);
46
+ frame.sessionId = meta.sessionId ?? null;
47
+ if (!frame.parentFrameId) {
48
+ if (!meta.sessionId) {
49
+ state.topFrameId = frame.frameId;
50
+ session.url = frame.url;
51
+ }
52
+ else if (state.topFrameId == null) {
53
+ state.topFrameId = frame.parentFrameId;
54
+ }
55
+ }
56
+ else if (state.executionContexts.has(frame.frameId)) {
57
+ void refreshFrameTitle(session, frame.frameId);
58
+ }
59
+ setCurrentSession(session);
60
+ if (!frame.parentFrameId && !meta.sessionId) {
61
+ events.onPageNavigation?.({ url: frame.url, title: session.title ?? null });
62
+ }
63
+ if (reconcileTargetSelection(session)) {
64
+ return;
65
+ }
66
+ if ((!frame.parentFrameId && state.activeFrameId == null) || state.activeFrameId === frame.frameId) {
67
+ emitTargetChanged(session);
68
+ }
69
+ });
70
+ session.handle.onEvent('Page.frameAttached', (params, meta) => {
71
+ const record = params;
72
+ if (!record.frameId) {
73
+ return;
74
+ }
75
+ const state = getOrCreateFrameState(session.tabId);
76
+ state.frames.set(record.frameId, {
77
+ frameId: record.frameId,
78
+ parentFrameId: record.parentFrameId ?? state.topFrameId ?? null,
79
+ url: '',
80
+ title: null,
81
+ sessionId: meta.sessionId ?? null,
82
+ });
83
+ reconcileTargetSelection(session);
84
+ });
85
+ session.handle.onEvent('Page.frameDetached', (params) => {
86
+ const record = params;
87
+ if (!record.frameId) {
88
+ return;
89
+ }
90
+ removeFrame(session.tabId, record.frameId);
91
+ reconcileTargetSelection(session);
92
+ });
93
+ session.handle.onEvent('Page.domContentEventFired', () => {
94
+ events.onPageLoad?.();
95
+ });
96
+ session.handle.onEvent('Runtime.consoleAPICalled', (params) => {
97
+ events.onLog(toConsoleEvent(params, session, { ignoreMatcher, stripUrlPrefixes }));
98
+ });
99
+ session.handle.onEvent('Runtime.exceptionThrown', (params) => {
100
+ events.onLog(toExceptionEvent(params, session, { ignoreMatcher, stripUrlPrefixes }));
101
+ });
102
+ };
103
+ //# sourceMappingURL=extension-session-events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-session-events.js","sourceRoot":"","sources":["../../src/sources/extension-session-events.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,3 @@
1
- /**
2
- * Extension source for CDP access via Chrome extension Native Messaging.
3
- * Wraps SessionManager and provides a unified source interface.
4
- */
5
1
  import type { CdpSourceHandle, CdpSourceBaseOptions } from './types.js';
6
2
  export type ExtensionSourceOptions = CdpSourceBaseOptions;
7
3
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"extension-source.d.ts","sourceRoot":"","sources":["../../src/sources/extension-source.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAmB,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAoBxF,MAAM,MAAM,sBAAsB,GAAG,oBAAoB,CAAA;AAEzD;;;GAGG;AACH,eAAO,MAAM,qBAAqB,GAAI,SAAS,sBAAsB,KAAG,eAqmBvE,CAAA"}
1
+ {"version":3,"file":"extension-source.d.ts","sourceRoot":"","sources":["../../src/sources/extension-source.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAmB,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAuBxF,MAAM,MAAM,sBAAsB,GAAG,oBAAoB,CAAA;AAEzD;;;GAGG;AACH,eAAO,MAAM,qBAAqB,GAAI,SAAS,sBAAsB,KAAG,eAiVvE,CAAA"}