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)]
174#[serde(tag = "command", rename_all = "snake_case")]
175pub enum PluginCommand {
176    LaunchBrowser {
177        browser_kind: BrowserKind,
178        browser_binary: Option<String>,
179    },
180    OpenPage {
181        browser_session: BrowserSessionHandle,
182    },
183    ClosePage {
184        browser_session: BrowserSessionHandle,
185        page_session: PageSessionHandle,
186    },
187    NavigatePage {
188        browser_session: BrowserSessionHandle,
189        page_session: PageSessionHandle,
190        url: String,
191    },
192    ClickElement {
193        browser_session: BrowserSessionHandle,
194        page_session: PageSessionHandle,
195        css_selector: String,
196    },
197    CountElements {
198        browser_session: BrowserSessionHandle,
199        page_session: PageSessionHandle,
200        css_selector: String,
201    },
202    HighlightElements {
203        browser_session: BrowserSessionHandle,
204        page_session: PageSessionHandle,
205        css_selector: String,
206        duration_ms: u64,
207    },
208    FocusElement {
209        browser_session: BrowserSessionHandle,
210        page_session: PageSessionHandle,
211        css_selector: String,
212    },
213    FillElement {
214        browser_session: BrowserSessionHandle,
215        page_session: PageSessionHandle,
216        css_selector: String,
217        value: String,
218    },
219    HoverElement {
220        browser_session: BrowserSessionHandle,
221        page_session: PageSessionHandle,
222        css_selector: String,
223    },
224    PressKey {
225        browser_session: BrowserSessionHandle,
226        page_session: PageSessionHandle,
227        css_selector: String,
228        key: String,
229        text: Option<String>,
230    },
231    GetTextContent {
232        browser_session: BrowserSessionHandle,
233        page_session: PageSessionHandle,
234        css_selector: String,
235    },
236    GetInnerText {
237        browser_session: BrowserSessionHandle,
238        page_session: PageSessionHandle,
239        css_selector: String,
240    },
241    WaitForSelector {
242        browser_session: BrowserSessionHandle,
243        page_session: PageSessionHandle,
244        css_selector: String,
245        visible: bool,
246    },
247    OpenChromeWindow {
248        chrome_binary: Option<String>,
249    },
250    DiscoverInitialTab {
251        cdp_websocket_url: String,
252    },
253    OpenChromeTab {
254        cdp_websocket_url: String,
255    },
256    CloseBrowserProcess {
257        process_id: u32,
258    },
259    CloseChromeTab {
260        cdp_websocket_url: String,
261        target_id: String,
262    },
263    NavigateChromeTab {
264        cdp_websocket_url: String,
265        target_id: String,
266        url: String,
267    },
268    InjectChromiumBidiMapper {
269        cdp_websocket_url: String,
270    },
271    ResolveBidiContextForTab {
272        cdp_websocket_url: String,
273        mapper_target_id: Option<String>,
274        browsing_context_id: Option<String>,
275        url: Option<String>,
276    },
277    ClickElementViaCdp {
278        cdp_websocket_url: String,
279        target_id: String,
280        css_selector: String,
281    },
282    CountElementsViaCdp {
283        cdp_websocket_url: String,
284        target_id: String,
285        css_selector: String,
286    },
287    HighlightElementsViaCdp {
288        cdp_websocket_url: String,
289        target_id: String,
290        css_selector: String,
291        duration_ms: u64,
292    },
293    FocusElementViaCdp {
294        cdp_websocket_url: String,
295        target_id: String,
296        css_selector: String,
297    },
298    FillElementViaCdp {
299        cdp_websocket_url: String,
300        target_id: String,
301        css_selector: String,
302        value: String,
303    },
304    HoverElementViaCdp {
305        cdp_websocket_url: String,
306        target_id: String,
307        css_selector: String,
308    },
309    PressKeyViaCdp {
310        cdp_websocket_url: String,
311        target_id: String,
312        css_selector: String,
313        key: String,
314        text: Option<String>,
315    },
316    GetTextContentViaCdp {
317        cdp_websocket_url: String,
318        target_id: String,
319        css_selector: String,
320    },
321    GetInnerTextViaCdp {
322        cdp_websocket_url: String,
323        target_id: String,
324        css_selector: String,
325    },
326    WaitForSelectorViaCdp {
327        cdp_websocket_url: String,
328        target_id: String,
329        css_selector: String,
330        visible: bool,
331    },
332}
333
334#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
335#[serde(tag = "result", rename_all = "snake_case")]
336pub enum PluginResult {
337    LaunchBrowser(BrowserLaunchInfo),
338    OpenPage(PageInfo),
339    ClosePage,
340    NavigatePage(TabNavigationInfo),
341    ClickElement(ClickInfo),
342    CountElements(ElementCountInfo),
343    HighlightElements(HighlightElementsInfo),
344    FocusElement(FocusInfo),
345    FillElement(FillInfo),
346    HoverElement(HoverInfo),
347    PressKey(PressKeyInfo),
348    GetTextContent(TextInfo),
349    GetInnerText(TextInfo),
350    WaitForSelector(WaitForSelectorInfo),
351    OpenChromeWindow(ChromeLaunchInfo),
352    DiscoverInitialTab(ChromeTabInfo),
353    OpenChromeTab(ChromeTabInfo),
354    CloseBrowserProcess,
355    CloseChromeTab,
356    NavigateChromeTab(TabNavigationInfo),
357    InjectChromiumBidiMapper(ChromiumBidiMapperInfo),
358    ResolveBidiContextForTab {
359        browsing_context_id: String,
360        mapper: ChromiumBidiMapperInfo,
361    },
362    ClickElementViaCdp(ClickInfo),
363    CountElementsViaCdp(ElementCountInfo),
364    HighlightElementsViaCdp(HighlightElementsInfo),
365    FocusElementViaCdp(FocusInfo),
366    FillElementViaCdp(FillInfo),
367    HoverElementViaCdp(HoverInfo),
368    PressKeyViaCdp(PressKeyInfo),
369    GetTextContentViaCdp(TextInfo),
370    GetInnerTextViaCdp(TextInfo),
371    WaitForSelectorViaCdp(WaitForSelectorInfo),
372}
373
374#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
375pub struct PluginEnvelope {
376    pub ok: bool,
377    pub result: Option<PluginResult>,
378    pub error: Option<String>,
379}