@vforsh/argus-watcher 0.1.2 → 0.1.4
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/README.md +67 -14
- package/dist/.tsbuildinfo +1 -1
- package/dist/artifacts.d.ts +13 -0
- package/dist/artifacts.d.ts.map +1 -0
- package/dist/artifacts.js +27 -0
- package/dist/artifacts.js.map +1 -0
- package/dist/buffer/LogBuffer.d.ts +8 -3
- package/dist/buffer/LogBuffer.d.ts.map +1 -1
- package/dist/buffer/LogBuffer.js +9 -1
- package/dist/buffer/LogBuffer.js.map +1 -1
- package/dist/buffer/NetBuffer.d.ts +29 -0
- package/dist/buffer/NetBuffer.d.ts.map +1 -0
- package/dist/buffer/NetBuffer.js +85 -0
- package/dist/buffer/NetBuffer.js.map +1 -0
- package/dist/cdp/accessibility.d.ts +18 -0
- package/dist/cdp/accessibility.d.ts.map +1 -0
- package/dist/cdp/accessibility.js +300 -0
- package/dist/cdp/accessibility.js.map +1 -0
- package/dist/cdp/connection.d.ts +39 -0
- package/dist/cdp/connection.d.ts.map +1 -0
- package/dist/cdp/connection.js +131 -0
- package/dist/cdp/connection.js.map +1 -0
- package/dist/cdp/dom/fill.d.ts +22 -0
- package/dist/cdp/dom/fill.d.ts.map +1 -0
- package/dist/cdp/dom/fill.js +59 -0
- package/dist/cdp/dom/fill.js.map +1 -0
- package/dist/cdp/dom/info.d.ts +14 -0
- package/dist/cdp/dom/info.d.ts.map +1 -0
- package/dist/cdp/dom/info.js +52 -0
- package/dist/cdp/dom/info.js.map +1 -0
- package/dist/cdp/dom/insert.d.ts +19 -0
- package/dist/cdp/dom/insert.d.ts.map +1 -0
- package/dist/cdp/dom/insert.js +30 -0
- package/dist/cdp/dom/insert.js.map +1 -0
- package/dist/cdp/dom/modify.d.ts +50 -0
- package/dist/cdp/dom/modify.d.ts.map +1 -0
- package/dist/cdp/dom/modify.js +100 -0
- package/dist/cdp/dom/modify.js.map +1 -0
- package/dist/cdp/dom/remove.d.ts +17 -0
- package/dist/cdp/dom/remove.d.ts.map +1 -0
- package/dist/cdp/dom/remove.js +27 -0
- package/dist/cdp/dom/remove.js.map +1 -0
- package/dist/cdp/dom/selector.d.ts +19 -0
- package/dist/cdp/dom/selector.d.ts.map +1 -0
- package/dist/cdp/dom/selector.js +86 -0
- package/dist/cdp/dom/selector.js.map +1 -0
- package/dist/cdp/dom/setFile.d.ts +21 -0
- package/dist/cdp/dom/setFile.d.ts.map +1 -0
- package/dist/cdp/dom/setFile.js +25 -0
- package/dist/cdp/dom/setFile.js.map +1 -0
- package/dist/cdp/dom/submit.d.ts +15 -0
- package/dist/cdp/dom/submit.d.ts.map +1 -0
- package/dist/cdp/dom/submit.js +130 -0
- package/dist/cdp/dom/submit.js.map +1 -0
- package/dist/cdp/dom/tree.d.ts +16 -0
- package/dist/cdp/dom/tree.d.ts.map +1 -0
- package/dist/cdp/dom/tree.js +100 -0
- package/dist/cdp/dom/tree.js.map +1 -0
- package/dist/cdp/dom/types.d.ts +15 -0
- package/dist/cdp/dom/types.d.ts.map +1 -0
- package/dist/cdp/dom/types.js +2 -0
- package/dist/cdp/dom/types.js.map +1 -0
- package/dist/cdp/dom.d.ts +15 -0
- package/dist/cdp/dom.d.ts.map +1 -0
- package/dist/cdp/dom.js +9 -0
- package/dist/cdp/dom.js.map +1 -0
- package/dist/cdp/editor.d.ts +23 -0
- package/dist/cdp/editor.d.ts.map +1 -0
- package/dist/cdp/editor.js +266 -0
- package/dist/cdp/editor.js.map +1 -0
- package/dist/cdp/emulation.d.ts +16 -0
- package/dist/cdp/emulation.d.ts.map +1 -0
- package/dist/cdp/emulation.js +40 -0
- package/dist/cdp/emulation.js.map +1 -0
- package/dist/cdp/eval.d.ts +11 -0
- package/dist/cdp/eval.d.ts.map +1 -0
- package/dist/cdp/eval.js +79 -0
- package/dist/cdp/eval.js.map +1 -0
- package/dist/cdp/keyboard.d.ts +38 -0
- package/dist/cdp/keyboard.d.ts.map +1 -0
- package/dist/cdp/keyboard.js +148 -0
- package/dist/cdp/keyboard.js.map +1 -0
- package/dist/cdp/mouse.d.ts +49 -0
- package/dist/cdp/mouse.d.ts.map +1 -0
- package/dist/cdp/mouse.js +203 -0
- package/dist/cdp/mouse.js.map +1 -0
- package/dist/cdp/networkCapture.d.ts +11 -0
- package/dist/cdp/networkCapture.d.ts.map +1 -0
- package/dist/cdp/networkCapture.js +99 -0
- package/dist/cdp/networkCapture.js.map +1 -0
- package/dist/cdp/pageIndicator.d.ts +41 -0
- package/dist/cdp/pageIndicator.d.ts.map +1 -0
- package/dist/cdp/pageIndicator.js +395 -0
- package/dist/cdp/pageIndicator.js.map +1 -0
- package/dist/cdp/redaction.d.ts +3 -0
- package/dist/cdp/redaction.d.ts.map +1 -0
- package/dist/cdp/redaction.js +35 -0
- package/dist/cdp/redaction.js.map +1 -0
- package/dist/cdp/remoteObject.d.ts +6 -0
- package/dist/cdp/remoteObject.d.ts.map +1 -0
- package/dist/cdp/remoteObject.js +94 -0
- package/dist/cdp/remoteObject.js.map +1 -0
- package/dist/cdp/screenshot.d.ts +10 -0
- package/dist/cdp/screenshot.d.ts.map +1 -0
- package/dist/cdp/screenshot.js +83 -0
- package/dist/cdp/screenshot.js.map +1 -0
- package/dist/cdp/storageLocal.d.ts +8 -0
- package/dist/cdp/storageLocal.d.ts.map +1 -0
- package/dist/cdp/storageLocal.js +70 -0
- package/dist/cdp/storageLocal.js.map +1 -0
- package/dist/cdp/text-filter.d.ts +6 -0
- package/dist/cdp/text-filter.d.ts.map +1 -0
- package/dist/cdp/text-filter.js +36 -0
- package/dist/cdp/text-filter.js.map +1 -0
- package/dist/cdp/throttle.d.ts +6 -0
- package/dist/cdp/throttle.d.ts.map +1 -0
- package/dist/cdp/throttle.js +9 -0
- package/dist/cdp/throttle.js.map +1 -0
- package/dist/cdp/tracing.d.ts +15 -0
- package/dist/cdp/tracing.d.ts.map +1 -0
- package/dist/cdp/tracing.js +159 -0
- package/dist/cdp/tracing.js.map +1 -0
- package/dist/cdp/watcher.d.ts +17 -2
- package/dist/cdp/watcher.d.ts.map +1 -1
- package/dist/cdp/watcher.js +124 -175
- package/dist/cdp/watcher.js.map +1 -1
- package/dist/emulation/EmulationController.d.ts +12 -0
- package/dist/emulation/EmulationController.d.ts.map +1 -0
- package/dist/emulation/EmulationController.js +83 -0
- package/dist/emulation/EmulationController.js.map +1 -0
- package/dist/events.d.ts +86 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +2 -0
- package/dist/events.js.map +1 -0
- package/dist/fileLogs/WatcherFileLogger.d.ts +5 -2
- package/dist/fileLogs/WatcherFileLogger.d.ts.map +1 -1
- package/dist/fileLogs/WatcherFileLogger.js +30 -12
- package/dist/fileLogs/WatcherFileLogger.js.map +1 -1
- package/dist/http/httpUtils.d.ts +25 -0
- package/dist/http/httpUtils.d.ts.map +1 -0
- package/dist/http/httpUtils.js +170 -0
- package/dist/http/httpUtils.js.map +1 -0
- package/dist/http/router.d.ts +5 -0
- package/dist/http/router.d.ts.map +1 -0
- package/dist/http/router.js +85 -0
- package/dist/http/router.js.map +1 -0
- package/dist/http/routes/getEmulation.d.ts +3 -0
- package/dist/http/routes/getEmulation.d.ts.map +1 -0
- package/dist/http/routes/getEmulation.js +8 -0
- package/dist/http/routes/getEmulation.js.map +1 -0
- package/dist/http/routes/getLogs.d.ts +3 -0
- package/dist/http/routes/getLogs.d.ts.map +1 -0
- package/dist/http/routes/getLogs.js +28 -0
- package/dist/http/routes/getLogs.js.map +1 -0
- package/dist/http/routes/getNet.d.ts +3 -0
- package/dist/http/routes/getNet.d.ts.map +1 -0
- package/dist/http/routes/getNet.js +17 -0
- package/dist/http/routes/getNet.js.map +1 -0
- package/dist/http/routes/getNetTail.d.ts +3 -0
- package/dist/http/routes/getNetTail.d.ts.map +1 -0
- package/dist/http/routes/getNetTail.js +18 -0
- package/dist/http/routes/getNetTail.js.map +1 -0
- package/dist/http/routes/getStatus.d.ts +3 -0
- package/dist/http/routes/getStatus.d.ts.map +1 -0
- package/dist/http/routes/getStatus.js +21 -0
- package/dist/http/routes/getStatus.js.map +1 -0
- package/dist/http/routes/getTail.d.ts +3 -0
- package/dist/http/routes/getTail.d.ts.map +1 -0
- package/dist/http/routes/getTail.js +28 -0
- package/dist/http/routes/getTail.js.map +1 -0
- package/dist/http/routes/getTargets.d.ts +3 -0
- package/dist/http/routes/getTargets.d.ts.map +1 -0
- package/dist/http/routes/getTargets.js +16 -0
- package/dist/http/routes/getTargets.js.map +1 -0
- package/dist/http/routes/getThrottle.d.ts +3 -0
- package/dist/http/routes/getThrottle.d.ts.map +1 -0
- package/dist/http/routes/getThrottle.js +8 -0
- package/dist/http/routes/getThrottle.js.map +1 -0
- package/dist/http/routes/postAttach.d.ts +3 -0
- package/dist/http/routes/postAttach.d.ts.map +1 -0
- package/dist/http/routes/postAttach.js +24 -0
- package/dist/http/routes/postAttach.js.map +1 -0
- package/dist/http/routes/postCodeEdit.d.ts +3 -0
- package/dist/http/routes/postCodeEdit.d.ts.map +1 -0
- package/dist/http/routes/postCodeEdit.js +32 -0
- package/dist/http/routes/postCodeEdit.js.map +1 -0
- package/dist/http/routes/postCodeGrep.d.ts +3 -0
- package/dist/http/routes/postCodeGrep.d.ts.map +1 -0
- package/dist/http/routes/postCodeGrep.js +26 -0
- package/dist/http/routes/postCodeGrep.js.map +1 -0
- package/dist/http/routes/postCodeList.d.ts +3 -0
- package/dist/http/routes/postCodeList.d.ts.map +1 -0
- package/dist/http/routes/postCodeList.js +20 -0
- package/dist/http/routes/postCodeList.js.map +1 -0
- package/dist/http/routes/postCodeRead.d.ts +3 -0
- package/dist/http/routes/postCodeRead.d.ts.map +1 -0
- package/dist/http/routes/postCodeRead.js +30 -0
- package/dist/http/routes/postCodeRead.js.map +1 -0
- package/dist/http/routes/postDetach.d.ts +3 -0
- package/dist/http/routes/postDetach.d.ts.map +1 -0
- package/dist/http/routes/postDetach.js +24 -0
- package/dist/http/routes/postDetach.js.map +1 -0
- package/dist/http/routes/postDomAdd.d.ts +7 -0
- package/dist/http/routes/postDomAdd.d.ts.map +1 -0
- package/dist/http/routes/postDomAdd.js +97 -0
- package/dist/http/routes/postDomAdd.js.map +1 -0
- package/dist/http/routes/postDomClick.d.ts +3 -0
- package/dist/http/routes/postDomClick.d.ts.map +1 -0
- package/dist/http/routes/postDomClick.js +85 -0
- package/dist/http/routes/postDomClick.js.map +1 -0
- package/dist/http/routes/postDomFill.d.ts +3 -0
- package/dist/http/routes/postDomFill.d.ts.map +1 -0
- package/dist/http/routes/postDomFill.js +58 -0
- package/dist/http/routes/postDomFill.js.map +1 -0
- package/dist/http/routes/postDomFocus.d.ts +3 -0
- package/dist/http/routes/postDomFocus.d.ts.map +1 -0
- package/dist/http/routes/postDomFocus.js +40 -0
- package/dist/http/routes/postDomFocus.js.map +1 -0
- package/dist/http/routes/postDomHover.d.ts +3 -0
- package/dist/http/routes/postDomHover.d.ts.map +1 -0
- package/dist/http/routes/postDomHover.js +40 -0
- package/dist/http/routes/postDomHover.js.map +1 -0
- package/dist/http/routes/postDomInfo.d.ts +3 -0
- package/dist/http/routes/postDomInfo.d.ts.map +1 -0
- package/dist/http/routes/postDomInfo.js +40 -0
- package/dist/http/routes/postDomInfo.js.map +1 -0
- package/dist/http/routes/postDomKeydown.d.ts +3 -0
- package/dist/http/routes/postDomKeydown.d.ts.map +1 -0
- package/dist/http/routes/postDomKeydown.js +36 -0
- package/dist/http/routes/postDomKeydown.js.map +1 -0
- package/dist/http/routes/postDomModify.d.ts +3 -0
- package/dist/http/routes/postDomModify.d.ts.map +1 -0
- package/dist/http/routes/postDomModify.js +45 -0
- package/dist/http/routes/postDomModify.js.map +1 -0
- package/dist/http/routes/postDomRemove.d.ts +3 -0
- package/dist/http/routes/postDomRemove.d.ts.map +1 -0
- package/dist/http/routes/postDomRemove.js +39 -0
- package/dist/http/routes/postDomRemove.js.map +1 -0
- package/dist/http/routes/postDomScroll.d.ts +3 -0
- package/dist/http/routes/postDomScroll.d.ts.map +1 -0
- package/dist/http/routes/postDomScroll.js +75 -0
- package/dist/http/routes/postDomScroll.js.map +1 -0
- package/dist/http/routes/postDomScrollTo.d.ts +3 -0
- package/dist/http/routes/postDomScrollTo.d.ts.map +1 -0
- package/dist/http/routes/postDomScrollTo.js +69 -0
- package/dist/http/routes/postDomScrollTo.js.map +1 -0
- package/dist/http/routes/postDomSetFile.d.ts +3 -0
- package/dist/http/routes/postDomSetFile.d.ts.map +1 -0
- package/dist/http/routes/postDomSetFile.js +58 -0
- package/dist/http/routes/postDomSetFile.js.map +1 -0
- package/dist/http/routes/postDomSubmit.d.ts +3 -0
- package/dist/http/routes/postDomSubmit.d.ts.map +1 -0
- package/dist/http/routes/postDomSubmit.js +49 -0
- package/dist/http/routes/postDomSubmit.js.map +1 -0
- package/dist/http/routes/postDomTree.d.ts +3 -0
- package/dist/http/routes/postDomTree.d.ts.map +1 -0
- package/dist/http/routes/postDomTree.js +41 -0
- package/dist/http/routes/postDomTree.js.map +1 -0
- package/dist/http/routes/postEmulation.d.ts +3 -0
- package/dist/http/routes/postEmulation.d.ts.map +1 -0
- package/dist/http/routes/postEmulation.js +70 -0
- package/dist/http/routes/postEmulation.js.map +1 -0
- package/dist/http/routes/postEval.d.ts +3 -0
- package/dist/http/routes/postEval.d.ts.map +1 -0
- package/dist/http/routes/postEval.js +27 -0
- package/dist/http/routes/postEval.js.map +1 -0
- package/dist/http/routes/postReload.d.ts +3 -0
- package/dist/http/routes/postReload.d.ts.map +1 -0
- package/dist/http/routes/postReload.js +20 -0
- package/dist/http/routes/postReload.js.map +1 -0
- package/dist/http/routes/postScreenshot.d.ts +3 -0
- package/dist/http/routes/postScreenshot.d.ts.map +1 -0
- package/dist/http/routes/postScreenshot.js +17 -0
- package/dist/http/routes/postScreenshot.js.map +1 -0
- package/dist/http/routes/postShutdown.d.ts +3 -0
- package/dist/http/routes/postShutdown.d.ts.map +1 -0
- package/dist/http/routes/postShutdown.js +13 -0
- package/dist/http/routes/postShutdown.js.map +1 -0
- package/dist/http/routes/postSnapshot.d.ts +3 -0
- package/dist/http/routes/postSnapshot.d.ts.map +1 -0
- package/dist/http/routes/postSnapshot.js +28 -0
- package/dist/http/routes/postSnapshot.js.map +1 -0
- package/dist/http/routes/postStorageLocal.d.ts +3 -0
- package/dist/http/routes/postStorageLocal.d.ts.map +1 -0
- package/dist/http/routes/postStorageLocal.js +31 -0
- package/dist/http/routes/postStorageLocal.js.map +1 -0
- package/dist/http/routes/postThrottle.d.ts +3 -0
- package/dist/http/routes/postThrottle.d.ts.map +1 -0
- package/dist/http/routes/postThrottle.js +38 -0
- package/dist/http/routes/postThrottle.js.map +1 -0
- package/dist/http/routes/postTraceStart.d.ts +3 -0
- package/dist/http/routes/postTraceStart.d.ts.map +1 -0
- package/dist/http/routes/postTraceStart.js +17 -0
- package/dist/http/routes/postTraceStart.js.map +1 -0
- package/dist/http/routes/postTraceStop.d.ts +3 -0
- package/dist/http/routes/postTraceStop.d.ts.map +1 -0
- package/dist/http/routes/postTraceStop.js +17 -0
- package/dist/http/routes/postTraceStop.js.map +1 -0
- package/dist/http/routes/types.d.ts +9 -0
- package/dist/http/routes/types.d.ts.map +1 -0
- package/dist/http/routes/types.js +10 -0
- package/dist/http/routes/types.js.map +1 -0
- package/dist/http/server.d.ts +42 -1
- package/dist/http/server.d.ts.map +1 -1
- package/dist/http/server.js +3 -82
- package/dist/http/server.js.map +1 -1
- package/dist/index.d.ts +117 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +349 -44
- package/dist/index.js.map +1 -1
- package/dist/native-messaging/messaging.d.ts +18 -0
- package/dist/native-messaging/messaging.d.ts.map +1 -0
- package/dist/native-messaging/messaging.js +94 -0
- package/dist/native-messaging/messaging.js.map +1 -0
- package/dist/native-messaging/session-manager.d.ts +108 -0
- package/dist/native-messaging/session-manager.d.ts.map +1 -0
- package/dist/native-messaging/session-manager.js +267 -0
- package/dist/native-messaging/session-manager.js.map +1 -0
- package/dist/native-messaging/types.d.ts +112 -0
- package/dist/native-messaging/types.d.ts.map +1 -0
- package/dist/native-messaging/types.js +6 -0
- package/dist/native-messaging/types.js.map +1 -0
- package/dist/registry/registry.d.ts +9 -2
- package/dist/registry/registry.d.ts.map +1 -1
- package/dist/registry/registry.js +53 -9
- package/dist/registry/registry.js.map +1 -1
- package/dist/scripts/install-host.d.ts +10 -0
- package/dist/scripts/install-host.d.ts.map +1 -0
- package/dist/scripts/install-host.js +189 -0
- package/dist/scripts/install-host.js.map +1 -0
- package/dist/sources/cdp-source.d.ts +24 -0
- package/dist/sources/cdp-source.d.ts.map +1 -0
- package/dist/sources/cdp-source.js +49 -0
- package/dist/sources/cdp-source.js.map +1 -0
- package/dist/sources/extension-frame-state.d.ts +64 -0
- package/dist/sources/extension-frame-state.d.ts.map +1 -0
- package/dist/sources/extension-frame-state.js +117 -0
- package/dist/sources/extension-frame-state.js.map +1 -0
- package/dist/sources/extension-log-events.d.ts +15 -0
- package/dist/sources/extension-log-events.d.ts.map +1 -0
- package/dist/sources/extension-log-events.js +101 -0
- package/dist/sources/extension-log-events.js.map +1 -0
- package/dist/sources/extension-source.d.ts +15 -0
- package/dist/sources/extension-source.d.ts.map +1 -0
- package/dist/sources/extension-source.js +487 -0
- package/dist/sources/extension-source.js.map +1 -0
- package/dist/sources/types.d.ts +109 -0
- package/dist/sources/types.d.ts.map +1 -0
- package/dist/sources/types.js +7 -0
- package/dist/sources/types.js.map +1 -0
- package/dist/throttle/ThrottleController.d.ts +12 -0
- package/dist/throttle/ThrottleController.d.ts.map +1 -0
- package/dist/throttle/ThrottleController.js +67 -0
- package/dist/throttle/ThrottleController.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session manager for CDP sessions routed through the Chrome extension.
|
|
3
|
+
* Implements CdpSessionHandle interface using Native Messaging.
|
|
4
|
+
*/
|
|
5
|
+
import type { NativeMessagingHandler } from './messaging.js';
|
|
6
|
+
import type { TabInfo, FrameSnapshot } from './types.js';
|
|
7
|
+
import type { CdpSessionHandle } from '../cdp/connection.js';
|
|
8
|
+
export type ExtensionSession = {
|
|
9
|
+
tabId: number;
|
|
10
|
+
url: string;
|
|
11
|
+
title: string;
|
|
12
|
+
faviconUrl?: string;
|
|
13
|
+
attachedAt: number;
|
|
14
|
+
topFrameId: string | null;
|
|
15
|
+
frames: FrameSnapshot[];
|
|
16
|
+
handle: CdpSessionHandle;
|
|
17
|
+
enabledDomains: Set<string>;
|
|
18
|
+
};
|
|
19
|
+
export type SessionManagerEvents = {
|
|
20
|
+
onAttach: (session: ExtensionSession) => void;
|
|
21
|
+
onDetach: (tabId: number, reason: string) => void;
|
|
22
|
+
onTabsUpdated: (tabs: TabInfo[]) => void;
|
|
23
|
+
onTargetSelected: (tabId: number, frameId: string | null) => void;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Manages CDP sessions with tabs attached via the Chrome extension.
|
|
27
|
+
*/
|
|
28
|
+
export declare class SessionManager {
|
|
29
|
+
private messaging;
|
|
30
|
+
private sessions;
|
|
31
|
+
private pendingRequests;
|
|
32
|
+
private eventHandlers;
|
|
33
|
+
private events;
|
|
34
|
+
private pendingTabsRequest;
|
|
35
|
+
constructor(messaging: NativeMessagingHandler, events: SessionManagerEvents);
|
|
36
|
+
/**
|
|
37
|
+
* Set up message handling from the extension.
|
|
38
|
+
*/
|
|
39
|
+
private setupMessageHandling;
|
|
40
|
+
/**
|
|
41
|
+
* Handle a message from the extension.
|
|
42
|
+
*/
|
|
43
|
+
private handleMessage;
|
|
44
|
+
/**
|
|
45
|
+
* Handle tab attachment notification.
|
|
46
|
+
*/
|
|
47
|
+
private handleTabAttached;
|
|
48
|
+
/**
|
|
49
|
+
* Handle tab detachment notification.
|
|
50
|
+
*/
|
|
51
|
+
private handleTabDetached;
|
|
52
|
+
/**
|
|
53
|
+
* Handle CDP event from the extension.
|
|
54
|
+
*/
|
|
55
|
+
private handleCdpEvent;
|
|
56
|
+
/**
|
|
57
|
+
* Handle CDP response from the extension.
|
|
58
|
+
*/
|
|
59
|
+
private handleCdpResponse;
|
|
60
|
+
/**
|
|
61
|
+
* Handle list tabs response from the extension.
|
|
62
|
+
*/
|
|
63
|
+
private handleListTabsResponse;
|
|
64
|
+
/**
|
|
65
|
+
* Create a session for an attached tab.
|
|
66
|
+
*/
|
|
67
|
+
private createSession;
|
|
68
|
+
/**
|
|
69
|
+
* Request to attach to a tab.
|
|
70
|
+
*/
|
|
71
|
+
attachTab(tabId: number): void;
|
|
72
|
+
/**
|
|
73
|
+
* Request to detach from a tab.
|
|
74
|
+
*/
|
|
75
|
+
detachTab(tabId: number): void;
|
|
76
|
+
/**
|
|
77
|
+
* Request to enable a CDP domain for a tab.
|
|
78
|
+
*/
|
|
79
|
+
enableDomain(tabId: number, domain: string): void;
|
|
80
|
+
/**
|
|
81
|
+
* Request list of available tabs.
|
|
82
|
+
*/
|
|
83
|
+
listTabs(filter?: {
|
|
84
|
+
url?: string;
|
|
85
|
+
title?: string;
|
|
86
|
+
}): Promise<TabInfo[]>;
|
|
87
|
+
/**
|
|
88
|
+
* Get a session by tab ID.
|
|
89
|
+
*/
|
|
90
|
+
getSession(tabId: number): ExtensionSession | undefined;
|
|
91
|
+
/**
|
|
92
|
+
* Get all active sessions.
|
|
93
|
+
*/
|
|
94
|
+
listSessions(): ExtensionSession[];
|
|
95
|
+
/**
|
|
96
|
+
* Check if a tab is attached.
|
|
97
|
+
*/
|
|
98
|
+
isAttached(tabId: number): boolean;
|
|
99
|
+
/**
|
|
100
|
+
* Get the first attached session (for single-tab mode).
|
|
101
|
+
*/
|
|
102
|
+
getFirstSession(): ExtensionSession | undefined;
|
|
103
|
+
/**
|
|
104
|
+
* Create an error for when no tab is attached.
|
|
105
|
+
*/
|
|
106
|
+
private createNotAttachedError;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=session-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/native-messaging/session-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAA;AAC5D,OAAO,KAAK,EAGX,OAAO,EAIP,aAAa,EAEb,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAE5D,MAAM,MAAM,gBAAgB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,MAAM,EAAE,aAAa,EAAE,CAAA;IACvB,MAAM,EAAE,gBAAgB,CAAA;IACxB,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAC3B,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG;IAClC,QAAQ,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAA;IAC7C,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACjD,aAAa,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;IACxC,gBAAgB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAA;CACjE,CAAA;AAID;;GAEG;AACH,qBAAa,cAAc;IAC1B,OAAO,CAAC,SAAS,CAAwB;IACzC,OAAO,CAAC,QAAQ,CAAsC;IACtD,OAAO,CAAC,eAAe,CAAoC;IAC3D,OAAO,CAAC,aAAa,CAAuD;IAC5E,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,kBAAkB,CAGX;gBAEH,SAAS,EAAE,sBAAsB,EAAE,MAAM,EAAE,oBAAoB;IAM3E;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAM5B;;OAEG;IACH,OAAO,CAAC,aAAa;IA4BrB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAKzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IASzB;;OAEG;IACH,OAAO,CAAC,cAAc;IAqBtB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAgBzB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAQ9B;;OAEG;IACH,OAAO,CAAC,aAAa;IAoErB;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ9B;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ9B;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IASjD;;OAEG;IACG,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAoB7E;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS;IAIvD;;OAEG;IACH,YAAY,IAAI,gBAAgB,EAAE;IAIlC;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAIlC;;OAEG;IACH,eAAe,IAAI,gBAAgB,GAAG,SAAS;IAO/C;;OAEG;IACH,OAAO,CAAC,sBAAsB;CAK9B"}
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session manager for CDP sessions routed through the Chrome extension.
|
|
3
|
+
* Implements CdpSessionHandle interface using Native Messaging.
|
|
4
|
+
*/
|
|
5
|
+
let nextRequestId = 1;
|
|
6
|
+
/**
|
|
7
|
+
* Manages CDP sessions with tabs attached via the Chrome extension.
|
|
8
|
+
*/
|
|
9
|
+
export class SessionManager {
|
|
10
|
+
messaging;
|
|
11
|
+
sessions = new Map();
|
|
12
|
+
pendingRequests = new Map();
|
|
13
|
+
eventHandlers = new Map();
|
|
14
|
+
events;
|
|
15
|
+
pendingTabsRequest = null;
|
|
16
|
+
constructor(messaging, events) {
|
|
17
|
+
this.messaging = messaging;
|
|
18
|
+
this.events = events;
|
|
19
|
+
this.setupMessageHandling();
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Set up message handling from the extension.
|
|
23
|
+
*/
|
|
24
|
+
setupMessageHandling() {
|
|
25
|
+
this.messaging.onMessage((message) => {
|
|
26
|
+
this.handleMessage(message);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Handle a message from the extension.
|
|
31
|
+
*/
|
|
32
|
+
handleMessage(message) {
|
|
33
|
+
switch (message.type) {
|
|
34
|
+
case 'tab_attached':
|
|
35
|
+
this.handleTabAttached(message);
|
|
36
|
+
break;
|
|
37
|
+
case 'tab_detached':
|
|
38
|
+
this.handleTabDetached(message);
|
|
39
|
+
break;
|
|
40
|
+
case 'cdp_event':
|
|
41
|
+
this.handleCdpEvent(message);
|
|
42
|
+
break;
|
|
43
|
+
case 'cdp_response':
|
|
44
|
+
this.handleCdpResponse(message);
|
|
45
|
+
break;
|
|
46
|
+
case 'list_tabs_response':
|
|
47
|
+
this.handleListTabsResponse(message);
|
|
48
|
+
break;
|
|
49
|
+
case 'target_selected':
|
|
50
|
+
this.events.onTargetSelected(message.tabId, message.frameId ?? null);
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Handle tab attachment notification.
|
|
56
|
+
*/
|
|
57
|
+
handleTabAttached(message) {
|
|
58
|
+
const session = this.createSession(message);
|
|
59
|
+
this.events.onAttach(session);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Handle tab detachment notification.
|
|
63
|
+
*/
|
|
64
|
+
handleTabDetached(message) {
|
|
65
|
+
const session = this.sessions.get(message.tabId);
|
|
66
|
+
if (session) {
|
|
67
|
+
this.sessions.delete(message.tabId);
|
|
68
|
+
this.eventHandlers.delete(message.tabId);
|
|
69
|
+
}
|
|
70
|
+
this.events.onDetach(message.tabId, message.reason);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Handle CDP event from the extension.
|
|
74
|
+
*/
|
|
75
|
+
handleCdpEvent(message) {
|
|
76
|
+
const tabHandlers = this.eventHandlers.get(message.tabId);
|
|
77
|
+
if (!tabHandlers) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const methodHandlers = tabHandlers.get(message.method);
|
|
81
|
+
if (!methodHandlers || methodHandlers.size === 0) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const meta = { sessionId: message.sessionId ?? null };
|
|
85
|
+
for (const handler of methodHandlers) {
|
|
86
|
+
try {
|
|
87
|
+
handler(message.params, meta);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
// Ignore handler errors
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Handle CDP response from the extension.
|
|
96
|
+
*/
|
|
97
|
+
handleCdpResponse(message) {
|
|
98
|
+
const pending = this.pendingRequests.get(message.requestId);
|
|
99
|
+
if (!pending) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
this.pendingRequests.delete(message.requestId);
|
|
103
|
+
clearTimeout(pending.timeout);
|
|
104
|
+
if (message.error) {
|
|
105
|
+
pending.reject(new Error(message.error.message));
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
pending.resolve(message.result);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Handle list tabs response from the extension.
|
|
113
|
+
*/
|
|
114
|
+
handleListTabsResponse(message) {
|
|
115
|
+
if (this.pendingTabsRequest) {
|
|
116
|
+
this.pendingTabsRequest.resolve(message.tabs);
|
|
117
|
+
this.pendingTabsRequest = null;
|
|
118
|
+
}
|
|
119
|
+
this.events.onTabsUpdated(message.tabs);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Create a session for an attached tab.
|
|
123
|
+
*/
|
|
124
|
+
createSession(message) {
|
|
125
|
+
const { tabId, url, title, faviconUrl } = message;
|
|
126
|
+
const enabledDomains = new Set();
|
|
127
|
+
const tabHandlers = new Map();
|
|
128
|
+
this.eventHandlers.set(tabId, tabHandlers);
|
|
129
|
+
const handle = {
|
|
130
|
+
isAttached: () => this.sessions.has(tabId),
|
|
131
|
+
sendAndWait: async (method, params, options) => {
|
|
132
|
+
if (!this.sessions.has(tabId)) {
|
|
133
|
+
throw this.createNotAttachedError();
|
|
134
|
+
}
|
|
135
|
+
const requestId = nextRequestId++;
|
|
136
|
+
const timeoutMs = options?.timeoutMs ?? 30000;
|
|
137
|
+
return new Promise((resolve, reject) => {
|
|
138
|
+
const timeout = setTimeout(() => {
|
|
139
|
+
this.pendingRequests.delete(requestId);
|
|
140
|
+
reject(new Error(`CDP request timed out after ${timeoutMs}ms`));
|
|
141
|
+
}, timeoutMs);
|
|
142
|
+
this.pendingRequests.set(requestId, { requestId, resolve, reject, timeout });
|
|
143
|
+
const message = {
|
|
144
|
+
type: 'cdp_command',
|
|
145
|
+
requestId,
|
|
146
|
+
tabId,
|
|
147
|
+
method,
|
|
148
|
+
params,
|
|
149
|
+
sessionId: options?.sessionId,
|
|
150
|
+
};
|
|
151
|
+
this.messaging.send(message);
|
|
152
|
+
});
|
|
153
|
+
},
|
|
154
|
+
onEvent: (method, handler) => {
|
|
155
|
+
let methodHandlers = tabHandlers.get(method);
|
|
156
|
+
if (!methodHandlers) {
|
|
157
|
+
methodHandlers = new Set();
|
|
158
|
+
tabHandlers.set(method, methodHandlers);
|
|
159
|
+
}
|
|
160
|
+
methodHandlers.add(handler);
|
|
161
|
+
return () => {
|
|
162
|
+
methodHandlers?.delete(handler);
|
|
163
|
+
};
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
const session = {
|
|
167
|
+
tabId,
|
|
168
|
+
url,
|
|
169
|
+
title,
|
|
170
|
+
faviconUrl,
|
|
171
|
+
attachedAt: Date.now(),
|
|
172
|
+
topFrameId: message.topFrameId ?? null,
|
|
173
|
+
frames: message.frames ?? [],
|
|
174
|
+
handle,
|
|
175
|
+
enabledDomains,
|
|
176
|
+
};
|
|
177
|
+
this.sessions.set(tabId, session);
|
|
178
|
+
return session;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Request to attach to a tab.
|
|
182
|
+
*/
|
|
183
|
+
attachTab(tabId) {
|
|
184
|
+
const message = {
|
|
185
|
+
type: 'attach_tab',
|
|
186
|
+
tabId,
|
|
187
|
+
};
|
|
188
|
+
this.messaging.send(message);
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Request to detach from a tab.
|
|
192
|
+
*/
|
|
193
|
+
detachTab(tabId) {
|
|
194
|
+
const message = {
|
|
195
|
+
type: 'detach_tab',
|
|
196
|
+
tabId,
|
|
197
|
+
};
|
|
198
|
+
this.messaging.send(message);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Request to enable a CDP domain for a tab.
|
|
202
|
+
*/
|
|
203
|
+
enableDomain(tabId, domain) {
|
|
204
|
+
const message = {
|
|
205
|
+
type: 'enable_domain',
|
|
206
|
+
tabId,
|
|
207
|
+
domain,
|
|
208
|
+
};
|
|
209
|
+
this.messaging.send(message);
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Request list of available tabs.
|
|
213
|
+
*/
|
|
214
|
+
async listTabs(filter) {
|
|
215
|
+
return new Promise((resolve, reject) => {
|
|
216
|
+
this.pendingTabsRequest = { resolve, reject };
|
|
217
|
+
const message = {
|
|
218
|
+
type: 'list_tabs',
|
|
219
|
+
filter,
|
|
220
|
+
};
|
|
221
|
+
this.messaging.send(message);
|
|
222
|
+
// Timeout after 5 seconds
|
|
223
|
+
setTimeout(() => {
|
|
224
|
+
if (this.pendingTabsRequest) {
|
|
225
|
+
this.pendingTabsRequest.reject(new Error('List tabs request timed out'));
|
|
226
|
+
this.pendingTabsRequest = null;
|
|
227
|
+
}
|
|
228
|
+
}, 5000);
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Get a session by tab ID.
|
|
233
|
+
*/
|
|
234
|
+
getSession(tabId) {
|
|
235
|
+
return this.sessions.get(tabId);
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Get all active sessions.
|
|
239
|
+
*/
|
|
240
|
+
listSessions() {
|
|
241
|
+
return [...this.sessions.values()];
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Check if a tab is attached.
|
|
245
|
+
*/
|
|
246
|
+
isAttached(tabId) {
|
|
247
|
+
return this.sessions.has(tabId);
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Get the first attached session (for single-tab mode).
|
|
251
|
+
*/
|
|
252
|
+
getFirstSession() {
|
|
253
|
+
for (const session of this.sessions.values()) {
|
|
254
|
+
return session;
|
|
255
|
+
}
|
|
256
|
+
return undefined;
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Create an error for when no tab is attached.
|
|
260
|
+
*/
|
|
261
|
+
createNotAttachedError() {
|
|
262
|
+
const error = new Error('No tab attached via extension');
|
|
263
|
+
error.code = 'cdp_not_attached';
|
|
264
|
+
return error;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=session-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.js","sourceRoot":"","sources":["../../src/native-messaging/session-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Message types for Native Messaging communication between
|
|
3
|
+
* the Chrome extension and argus-watcher (extension source).
|
|
4
|
+
*/
|
|
5
|
+
export type TabAttachedMessage = {
|
|
6
|
+
type: 'tab_attached';
|
|
7
|
+
tabId: number;
|
|
8
|
+
url: string;
|
|
9
|
+
title: string;
|
|
10
|
+
faviconUrl?: string;
|
|
11
|
+
topFrameId?: string | null;
|
|
12
|
+
frames?: FrameSnapshot[];
|
|
13
|
+
};
|
|
14
|
+
export type TabDetachedMessage = {
|
|
15
|
+
type: 'tab_detached';
|
|
16
|
+
tabId: number;
|
|
17
|
+
reason: string;
|
|
18
|
+
};
|
|
19
|
+
export type CdpEventMessage = {
|
|
20
|
+
type: 'cdp_event';
|
|
21
|
+
tabId: number;
|
|
22
|
+
method: string;
|
|
23
|
+
params: unknown;
|
|
24
|
+
sessionId?: string;
|
|
25
|
+
};
|
|
26
|
+
export type CdpResponseMessage = {
|
|
27
|
+
type: 'cdp_response';
|
|
28
|
+
requestId: number;
|
|
29
|
+
result?: unknown;
|
|
30
|
+
error?: {
|
|
31
|
+
code?: number;
|
|
32
|
+
message: string;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
export type ListTabsResponseMessage = {
|
|
36
|
+
type: 'list_tabs_response';
|
|
37
|
+
tabs: TabInfo[];
|
|
38
|
+
};
|
|
39
|
+
export type TargetSelectedMessage = {
|
|
40
|
+
type: 'target_selected';
|
|
41
|
+
tabId: number;
|
|
42
|
+
frameId?: string | null;
|
|
43
|
+
};
|
|
44
|
+
export type HostInfoMessage = {
|
|
45
|
+
type: 'host_info';
|
|
46
|
+
watcherId: string;
|
|
47
|
+
watcherHost: string;
|
|
48
|
+
watcherPort: number;
|
|
49
|
+
pid: number;
|
|
50
|
+
};
|
|
51
|
+
export type TargetInfoMessage = {
|
|
52
|
+
type: 'target_info';
|
|
53
|
+
targetId: string;
|
|
54
|
+
title: string | null;
|
|
55
|
+
url: string | null;
|
|
56
|
+
attachedAt: number;
|
|
57
|
+
};
|
|
58
|
+
export type TabInfo = {
|
|
59
|
+
tabId: number;
|
|
60
|
+
url: string;
|
|
61
|
+
title: string;
|
|
62
|
+
faviconUrl?: string;
|
|
63
|
+
attached: boolean;
|
|
64
|
+
};
|
|
65
|
+
export type FrameSnapshot = {
|
|
66
|
+
frameId: string;
|
|
67
|
+
parentFrameId: string | null;
|
|
68
|
+
url: string;
|
|
69
|
+
title: string | null;
|
|
70
|
+
sessionId: string | null;
|
|
71
|
+
};
|
|
72
|
+
export type ExtensionToHost = TabAttachedMessage | TabDetachedMessage | CdpEventMessage | CdpResponseMessage | ListTabsResponseMessage | TargetSelectedMessage;
|
|
73
|
+
export type AttachTabMessage = {
|
|
74
|
+
type: 'attach_tab';
|
|
75
|
+
tabId: number;
|
|
76
|
+
};
|
|
77
|
+
export type DetachTabMessage = {
|
|
78
|
+
type: 'detach_tab';
|
|
79
|
+
tabId: number;
|
|
80
|
+
};
|
|
81
|
+
export type CdpCommandMessage = {
|
|
82
|
+
type: 'cdp_command';
|
|
83
|
+
requestId: number;
|
|
84
|
+
tabId: number;
|
|
85
|
+
method: string;
|
|
86
|
+
params?: Record<string, unknown>;
|
|
87
|
+
sessionId?: string;
|
|
88
|
+
};
|
|
89
|
+
export type ListTabsMessage = {
|
|
90
|
+
type: 'list_tabs';
|
|
91
|
+
filter?: {
|
|
92
|
+
url?: string;
|
|
93
|
+
title?: string;
|
|
94
|
+
};
|
|
95
|
+
};
|
|
96
|
+
export type EnableDomainMessage = {
|
|
97
|
+
type: 'enable_domain';
|
|
98
|
+
tabId: number;
|
|
99
|
+
domain: string;
|
|
100
|
+
};
|
|
101
|
+
export type HostToExtension = AttachTabMessage | DetachTabMessage | CdpCommandMessage | ListTabsMessage | EnableDomainMessage | HostInfoMessage | TargetInfoMessage;
|
|
102
|
+
export type PendingRequest = {
|
|
103
|
+
requestId: number;
|
|
104
|
+
resolve: (result: unknown) => void;
|
|
105
|
+
reject: (error: Error) => void;
|
|
106
|
+
timeout: ReturnType<typeof setTimeout>;
|
|
107
|
+
};
|
|
108
|
+
export type CdpEventMeta = {
|
|
109
|
+
sessionId?: string | null;
|
|
110
|
+
};
|
|
111
|
+
export type CdpEventHandler = (params: unknown, meta: CdpEventMeta) => void;
|
|
112
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/native-messaging/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/native-messaging/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
import type { WatcherRecord } from '@vforsh/argus-core';
|
|
2
|
-
/**
|
|
2
|
+
/**
|
|
3
|
+
* Resolve a unique watcher ID. If the requested ID is taken by a live watcher,
|
|
4
|
+
* appends `-2`, `-3`, etc. until a free slot is found.
|
|
5
|
+
* Stale entries (dead process) are cleaned up automatically.
|
|
6
|
+
* Returns the ID that should be used.
|
|
7
|
+
*/
|
|
8
|
+
export declare const resolveUniqueWatcherId: (id: string) => Promise<string>;
|
|
9
|
+
/** Write watcher entry to registry (locked read-modify-write). */
|
|
3
10
|
export declare const announceWatcher: (watcher: WatcherRecord) => Promise<void>;
|
|
4
11
|
/** Refresh watcher entry in registry. */
|
|
5
12
|
export declare const updateWatcherHeartbeat: (watcher: WatcherRecord) => Promise<void>;
|
|
6
|
-
/** Remove watcher entry from registry by id. */
|
|
13
|
+
/** Remove watcher entry from registry by id (locked read-modify-write). */
|
|
7
14
|
export declare const removeWatcher: (id: string) => Promise<void>;
|
|
8
15
|
/** Periodically refresh registry entry until stopped. */
|
|
9
16
|
export declare const startRegistryHeartbeat: (getWatcher: () => WatcherRecord, intervalMs?: number) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/registry/registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAEvD,
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/registry/registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,sBAAsB,GAAU,IAAI,MAAM,KAAG,OAAO,CAAC,MAAM,CAoCvE,CAAA;AAWD,kEAAkE;AAClE,eAAO,MAAM,eAAe,GAAU,SAAS,aAAa,KAAG,OAAO,CAAC,IAAI,CAE1E,CAAA;AAED,yCAAyC;AACzC,eAAO,MAAM,sBAAsB,GAAU,SAAS,aAAa,KAAG,OAAO,CAAC,IAAI,CAEjF,CAAA;AAED,2EAA2E;AAC3E,eAAO,MAAM,aAAa,GAAU,IAAI,MAAM,KAAG,OAAO,CAAC,IAAI,CAE5D,CAAA;AAED,yDAAyD;AACzD,eAAO,MAAM,sBAAsB,GAAI,YAAY,MAAM,aAAa,EAAE,mBAAmB,KAAG;IAAE,IAAI,EAAE,MAAM,IAAI,CAAA;CAU/G,CAAA"}
|
|
@@ -1,19 +1,63 @@
|
|
|
1
|
-
import { readRegistry, removeWatcherEntry, setWatcherEntry,
|
|
2
|
-
/**
|
|
3
|
-
|
|
1
|
+
import { readRegistry, removeWatcherEntry, setWatcherEntry, updateRegistry } from '@vforsh/argus-core';
|
|
2
|
+
/**
|
|
3
|
+
* Resolve a unique watcher ID. If the requested ID is taken by a live watcher,
|
|
4
|
+
* appends `-2`, `-3`, etc. until a free slot is found.
|
|
5
|
+
* Stale entries (dead process) are cleaned up automatically.
|
|
6
|
+
* Returns the ID that should be used.
|
|
7
|
+
*/
|
|
8
|
+
export const resolveUniqueWatcherId = async (id) => {
|
|
4
9
|
const { registry } = await readRegistry();
|
|
5
|
-
const
|
|
6
|
-
|
|
10
|
+
const staleIds = [];
|
|
11
|
+
const isIdAvailable = (candidate) => {
|
|
12
|
+
const existing = registry.watchers[candidate];
|
|
13
|
+
if (!existing) {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
if (existing.pid == null || !isProcessAlive(existing.pid)) {
|
|
17
|
+
staleIds.push(candidate);
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
return false;
|
|
21
|
+
};
|
|
22
|
+
let resolvedId = id;
|
|
23
|
+
if (!isIdAvailable(id)) {
|
|
24
|
+
let suffix = 2;
|
|
25
|
+
while (!isIdAvailable(`${id}-${suffix}`)) {
|
|
26
|
+
suffix++;
|
|
27
|
+
}
|
|
28
|
+
resolvedId = `${id}-${suffix}`;
|
|
29
|
+
}
|
|
30
|
+
if (staleIds.length > 0) {
|
|
31
|
+
await updateRegistry((reg) => {
|
|
32
|
+
let next = reg;
|
|
33
|
+
for (const staleId of staleIds) {
|
|
34
|
+
next = removeWatcherEntry(next, staleId);
|
|
35
|
+
}
|
|
36
|
+
return next;
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
return resolvedId;
|
|
40
|
+
};
|
|
41
|
+
const isProcessAlive = (pid) => {
|
|
42
|
+
try {
|
|
43
|
+
process.kill(pid, 0);
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
/** Write watcher entry to registry (locked read-modify-write). */
|
|
51
|
+
export const announceWatcher = async (watcher) => {
|
|
52
|
+
await updateRegistry((registry) => setWatcherEntry(registry, watcher));
|
|
7
53
|
};
|
|
8
54
|
/** Refresh watcher entry in registry. */
|
|
9
55
|
export const updateWatcherHeartbeat = async (watcher) => {
|
|
10
56
|
await announceWatcher(watcher);
|
|
11
57
|
};
|
|
12
|
-
/** Remove watcher entry from registry by id. */
|
|
58
|
+
/** Remove watcher entry from registry by id (locked read-modify-write). */
|
|
13
59
|
export const removeWatcher = async (id) => {
|
|
14
|
-
|
|
15
|
-
const next = removeWatcherEntry(registry, id);
|
|
16
|
-
await writeRegistry(next);
|
|
60
|
+
await updateRegistry((registry) => removeWatcherEntry(registry, id));
|
|
17
61
|
};
|
|
18
62
|
/** Periodically refresh registry entry until stopped. */
|
|
19
63
|
export const startRegistryHeartbeat = (getWatcher, intervalMs = 15_000) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/registry/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/registry/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
/**
|
|
3
|
+
* Install/uninstall Native Messaging host manifest for the Argus extension.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* node dist/scripts/install-host.js install <EXTENSION_ID>
|
|
7
|
+
* node dist/scripts/install-host.js uninstall
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=install-host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-host.d.ts","sourceRoot":"","sources":["../../src/scripts/install-host.ts"],"names":[],"mappings":";AACA;;;;;;GAMG"}
|