Skip to main content

allwright_plugin_sdk/
lib.rs

1use serde::{Deserialize, Serialize};
2
3pub const ALLWRIGHT_PLUGIN_API_VERSION: u32 = 1;
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
6pub enum SurfaceFamily {
7    Web,
8    Mobile,
9    Desktop,
10}
11
12#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
13#[serde(rename_all = "snake_case")]
14pub enum BrowserKind {
15    Chromium,
16    Firefox,
17}
18
19#[derive(Debug, Clone, Copy, PartialEq, Eq)]
20pub struct SurfacePluginDescriptor {
21    pub id: &'static str,
22    pub family: SurfaceFamily,
23    pub version: &'static str,
24    pub description: &'static str,
25}
26
27pub trait SurfacePlugin: Send + Sync {
28    fn descriptor(&self) -> SurfacePluginDescriptor;
29}
30
31#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
32pub struct ChromeLaunchInfo {
33    pub browser: String,
34    pub note: String,
35    pub cdp_websocket_url: String,
36    pub user_data_dir: String,
37    pub process_id: u32,
38}
39
40#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
41pub struct BrowserLaunchInfo {
42    pub browser_kind: BrowserKind,
43    pub browser: String,
44    pub note: String,
45    pub user_data_dir: String,
46    pub process_id: u32,
47    pub browser_session: BrowserSessionHandle,
48    pub initial_page: PageInfo,
49}
50
51#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
52pub struct ChromeTabInfo {
53    pub note: String,
54    pub target_id: String,
55}
56
57#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
58pub struct TabNavigationInfo {
59    pub url: String,
60    pub note: String,
61    pub page_session: PageSessionHandle,
62    pub automation: AutomationSessionInfo,
63}
64
65#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
66pub struct ChromiumBidiMapperInfo {
67    pub package_version: String,
68    pub mapper_target_id: String,
69    pub mapper_session_id: String,
70    pub note: String,
71}
72
73#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
74#[serde(tag = "kind", rename_all = "snake_case")]
75pub enum BrowserSessionHandle {
76    Chromium {
77        cdp_websocket_url: String,
78    },
79    Firefox {
80        connection_id: String,
81        bidi_session_id: String,
82    },
83}
84
85#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
86#[serde(tag = "kind", rename_all = "snake_case")]
87pub enum PageSessionHandle {
88    Chromium {
89        target_id: String,
90        browsing_context_id: Option<String>,
91    },
92    Firefox {
93        browsing_context_id: String,
94    },
95}
96
97#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
98pub struct PageInfo {
99    pub note: String,
100    pub page_session: PageSessionHandle,
101}
102
103#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
104pub struct AutomationSessionInfo {
105    pub bidi_session_id: String,
106    pub note: String,
107    pub mapper_target_id: Option<String>,
108    pub mapper_session_id: Option<String>,
109    pub package_version: Option<String>,
110}
111
112#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
113pub struct ClickInfo {
114    pub css_selector: String,
115    pub note: String,
116    pub bidi_session_id: String,
117}
118
119#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
120pub struct ElementCountInfo {
121    pub css_selector: String,
122    pub count: u32,
123    pub note: String,
124}
125
126#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
127pub struct HighlightElementsInfo {
128    pub css_selector: String,
129    pub count: u32,
130    pub note: String,
131}
132
133#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
134pub struct FocusInfo {
135    pub css_selector: String,
136    pub note: String,
137}
138
139#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
140pub struct FillInfo {
141    pub css_selector: String,
142    pub value: String,
143    pub note: String,
144}
145
146#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
147pub struct HoverInfo {
148    pub css_selector: String,
149    pub note: String,
150}
151
152#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
153pub struct PressKeyInfo {
154    pub css_selector: String,
155    pub key: String,
156    pub note: String,
157}
158
159#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
160pub struct TextInfo {
161    pub css_selector: String,
162    pub text: String,
163    pub note: String,
164}
165
166#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
167pub struct WaitForSelectorInfo {
168    pub css_selector: String,
169    pub visible: bool,
170    pub note: String,
171}
172
173#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
174pub struct ScreenshotInfo {
175    pub png_data: Vec<u8>,
176    pub note: String,
177}
178
179#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
180#[serde(tag = "command", rename_all = "snake_case")]
181pub enum PluginCommand {
182    LaunchBrowser {
183        browser_kind: BrowserKind,
184        browser_binary: Option<String>,
185    },
186    OpenPage {
187        browser_session: BrowserSessionHandle,
188    },
189    ClosePage {
190        browser_session: BrowserSessionHandle,
191        page_session: PageSessionHandle,
192    },
193    NavigatePage {
194        browser_session: BrowserSessionHandle,
195        page_session: PageSessionHandle,
196        url: String,
197    },
198    ClickElement {
199        browser_session: BrowserSessionHandle,
200        page_session: PageSessionHandle,
201        css_selector: String,
202    },
203    CountElements {
204        browser_session: BrowserSessionHandle,
205        page_session: PageSessionHandle,
206        css_selector: String,
207    },
208    HighlightElements {
209        browser_session: BrowserSessionHandle,
210        page_session: PageSessionHandle,
211        css_selector: String,
212        duration_ms: u64,
213    },
214    FocusElement {
215        browser_session: BrowserSessionHandle,
216        page_session: PageSessionHandle,
217        css_selector: String,
218    },
219    FillElement {
220        browser_session: BrowserSessionHandle,
221        page_session: PageSessionHandle,
222        css_selector: String,
223        value: String,
224    },
225    HoverElement {
226        browser_session: BrowserSessionHandle,
227        page_session: PageSessionHandle,
228        css_selector: String,
229    },
230    PressKey {
231        browser_session: BrowserSessionHandle,
232        page_session: PageSessionHandle,
233        css_selector: String,
234        key: String,
235        text: Option<String>,
236    },
237    GetTextContent {
238        browser_session: BrowserSessionHandle,
239        page_session: PageSessionHandle,
240        css_selector: String,
241    },
242    GetInnerText {
243        browser_session: BrowserSessionHandle,
244        page_session: PageSessionHandle,
245        css_selector: String,
246    },
247    WaitForSelector {
248        browser_session: BrowserSessionHandle,
249        page_session: PageSessionHandle,
250        css_selector: String,
251        visible: bool,
252    },
253    Screenshot {
254        browser_session: BrowserSessionHandle,
255        page_session: PageSessionHandle,
256    },
257    OpenChromeWindow {
258        chrome_binary: Option<String>,
259    },
260    DiscoverInitialTab {
261        cdp_websocket_url: String,
262    },
263    OpenChromeTab {
264        cdp_websocket_url: String,
265    },
266    CloseBrowserProcess {
267        process_id: u32,
268    },
269    CloseChromeTab {
270        cdp_websocket_url: String,
271        target_id: String,
272    },
273    NavigateChromeTab {
274        cdp_websocket_url: String,
275        target_id: String,
276        url: String,
277    },
278    InjectChromiumBidiMapper {
279        cdp_websocket_url: String,
280    },
281    ResolveBidiContextForTab {
282        cdp_websocket_url: String,
283        mapper_target_id: Option<String>,
284        browsing_context_id: Option<String>,
285        url: Option<String>,
286    },
287    ClickElementViaCdp {
288        cdp_websocket_url: String,
289        target_id: String,
290        css_selector: String,
291    },
292    CountElementsViaCdp {
293        cdp_websocket_url: String,
294        target_id: String,
295        css_selector: String,
296    },
297    HighlightElementsViaCdp {
298        cdp_websocket_url: String,
299        target_id: String,
300        css_selector: String,
301        duration_ms: u64,
302    },
303    FocusElementViaCdp {
304        cdp_websocket_url: String,
305        target_id: String,
306        css_selector: String,
307    },
308    FillElementViaCdp {
309        cdp_websocket_url: String,
310        target_id: String,
311        css_selector: String,
312        value: String,
313    },
314    HoverElementViaCdp {
315        cdp_websocket_url: String,
316        target_id: String,
317        css_selector: String,
318    },
319    PressKeyViaCdp {
320        cdp_websocket_url: String,
321        target_id: String,
322        css_selector: String,
323        key: String,
324        text: Option<String>,
325    },
326    GetTextContentViaCdp {
327        cdp_websocket_url: String,
328        target_id: String,
329        css_selector: String,
330    },
331    GetInnerTextViaCdp {
332        cdp_websocket_url: String,
333        target_id: String,
334        css_selector: String,
335    },
336    WaitForSelectorViaCdp {
337        cdp_websocket_url: String,
338        target_id: String,
339        css_selector: String,
340        visible: bool,
341    },
342    ScreenshotViaCdp {
343        cdp_websocket_url: String,
344        target_id: String,
345    },
346}
347
348#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
349#[serde(tag = "result", rename_all = "snake_case")]
350pub enum PluginResult {
351    LaunchBrowser(BrowserLaunchInfo),
352    OpenPage(PageInfo),
353    ClosePage,
354    NavigatePage(TabNavigationInfo),
355    ClickElement(ClickInfo),
356    CountElements(ElementCountInfo),
357    HighlightElements(HighlightElementsInfo),
358    FocusElement(FocusInfo),
359    FillElement(FillInfo),
360    HoverElement(HoverInfo),
361    PressKey(PressKeyInfo),
362    GetTextContent(TextInfo),
363    GetInnerText(TextInfo),
364    WaitForSelector(WaitForSelectorInfo),
365    Screenshot(ScreenshotInfo),
366    OpenChromeWindow(ChromeLaunchInfo),
367    DiscoverInitialTab(ChromeTabInfo),
368    OpenChromeTab(ChromeTabInfo),
369    CloseBrowserProcess,
370    CloseChromeTab,
371    NavigateChromeTab(TabNavigationInfo),
372    InjectChromiumBidiMapper(ChromiumBidiMapperInfo),
373    ResolveBidiContextForTab {
374        browsing_context_id: String,
375        mapper: ChromiumBidiMapperInfo,
376    },
377    ClickElementViaCdp(ClickInfo),
378    CountElementsViaCdp(ElementCountInfo),
379    HighlightElementsViaCdp(HighlightElementsInfo),
380    FocusElementViaCdp(FocusInfo),
381    FillElementViaCdp(FillInfo),
382    HoverElementViaCdp(HoverInfo),
383    PressKeyViaCdp(PressKeyInfo),
384    GetTextContentViaCdp(TextInfo),
385    GetInnerTextViaCdp(TextInfo),
386    WaitForSelectorViaCdp(WaitForSelectorInfo),
387    ScreenshotViaCdp(ScreenshotInfo),
388}
389
390#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
391pub struct PluginEnvelope {
392    pub ok: bool,
393    pub result: Option<PluginResult>,
394    pub error: Option<String>,
395}