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        #[serde(default)]
92        mapper_target_id: Option<String>,
93    },
94    Firefox {
95        browsing_context_id: String,
96    },
97}
98
99#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
100pub struct PageInfo {
101    pub note: String,
102    pub page_session: PageSessionHandle,
103}
104
105#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
106pub struct AutomationSessionInfo {
107    pub bidi_session_id: String,
108    pub note: String,
109    pub mapper_target_id: Option<String>,
110    pub mapper_session_id: Option<String>,
111    pub package_version: Option<String>,
112}
113
114#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
115pub struct ClickInfo {
116    pub css_selector: String,
117    pub note: String,
118    pub bidi_session_id: String,
119}
120
121#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
122pub struct ElementCountInfo {
123    pub css_selector: String,
124    pub count: u32,
125    pub note: String,
126}
127
128#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
129pub struct HighlightElementsInfo {
130    pub css_selector: String,
131    pub count: u32,
132    pub note: String,
133}
134
135#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
136pub struct FocusInfo {
137    pub css_selector: String,
138    pub note: String,
139}
140
141#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
142pub struct FillInfo {
143    pub css_selector: String,
144    pub value: String,
145    pub note: String,
146}
147
148#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
149pub struct HoverInfo {
150    pub css_selector: String,
151    pub note: String,
152}
153
154#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
155pub struct PressKeyInfo {
156    pub css_selector: String,
157    pub key: String,
158    pub note: String,
159}
160
161#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
162pub struct TextInfo {
163    pub css_selector: String,
164    pub text: String,
165    pub note: String,
166}
167
168#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
169pub struct WaitForSelectorInfo {
170    pub css_selector: String,
171    pub visible: bool,
172    pub note: String,
173}
174
175#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
176pub struct ScreenshotInfo {
177    pub png_data: Vec<u8>,
178    pub note: String,
179}
180
181#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
182#[serde(tag = "command", rename_all = "snake_case")]
183pub enum PluginCommand {
184    LaunchBrowser {
185        browser_kind: BrowserKind,
186        browser_binary: Option<String>,
187    },
188    OpenPage {
189        browser_session: BrowserSessionHandle,
190    },
191    ClosePage {
192        browser_session: BrowserSessionHandle,
193        page_session: PageSessionHandle,
194    },
195    NavigatePage {
196        browser_session: BrowserSessionHandle,
197        page_session: PageSessionHandle,
198        url: String,
199    },
200    ClickElement {
201        browser_session: BrowserSessionHandle,
202        page_session: PageSessionHandle,
203        css_selector: String,
204    },
205    CountElements {
206        browser_session: BrowserSessionHandle,
207        page_session: PageSessionHandle,
208        css_selector: String,
209    },
210    HighlightElements {
211        browser_session: BrowserSessionHandle,
212        page_session: PageSessionHandle,
213        css_selector: String,
214        duration_ms: u64,
215    },
216    FocusElement {
217        browser_session: BrowserSessionHandle,
218        page_session: PageSessionHandle,
219        css_selector: String,
220    },
221    FillElement {
222        browser_session: BrowserSessionHandle,
223        page_session: PageSessionHandle,
224        css_selector: String,
225        value: String,
226    },
227    HoverElement {
228        browser_session: BrowserSessionHandle,
229        page_session: PageSessionHandle,
230        css_selector: String,
231    },
232    PressKey {
233        browser_session: BrowserSessionHandle,
234        page_session: PageSessionHandle,
235        css_selector: String,
236        key: String,
237        text: Option<String>,
238    },
239    GetTextContent {
240        browser_session: BrowserSessionHandle,
241        page_session: PageSessionHandle,
242        css_selector: String,
243    },
244    GetInnerText {
245        browser_session: BrowserSessionHandle,
246        page_session: PageSessionHandle,
247        css_selector: String,
248    },
249    WaitForSelector {
250        browser_session: BrowserSessionHandle,
251        page_session: PageSessionHandle,
252        css_selector: String,
253        visible: bool,
254    },
255    Screenshot {
256        browser_session: BrowserSessionHandle,
257        page_session: PageSessionHandle,
258        full_page: bool,
259    },
260    OpenChromeWindow {
261        chrome_binary: Option<String>,
262    },
263    DiscoverInitialTab {
264        cdp_websocket_url: String,
265    },
266    OpenChromeTab {
267        cdp_websocket_url: String,
268    },
269    CloseBrowserProcess {
270        process_id: u32,
271    },
272    CloseChromeTab {
273        cdp_websocket_url: String,
274        target_id: String,
275    },
276    NavigateChromeTab {
277        cdp_websocket_url: String,
278        target_id: String,
279        url: String,
280    },
281    InjectChromiumBidiMapper {
282        cdp_websocket_url: String,
283    },
284    ResolveBidiContextForTab {
285        cdp_websocket_url: String,
286        mapper_target_id: Option<String>,
287        browsing_context_id: Option<String>,
288        url: Option<String>,
289    },
290    ClickElementViaCdp {
291        cdp_websocket_url: String,
292        target_id: String,
293        css_selector: String,
294    },
295    CountElementsViaCdp {
296        cdp_websocket_url: String,
297        target_id: String,
298        css_selector: String,
299    },
300    HighlightElementsViaCdp {
301        cdp_websocket_url: String,
302        target_id: String,
303        css_selector: String,
304        duration_ms: u64,
305    },
306    FocusElementViaCdp {
307        cdp_websocket_url: String,
308        target_id: String,
309        css_selector: String,
310    },
311    FillElementViaCdp {
312        cdp_websocket_url: String,
313        target_id: String,
314        css_selector: String,
315        value: String,
316    },
317    HoverElementViaCdp {
318        cdp_websocket_url: String,
319        target_id: String,
320        css_selector: String,
321    },
322    PressKeyViaCdp {
323        cdp_websocket_url: String,
324        target_id: String,
325        css_selector: String,
326        key: String,
327        text: Option<String>,
328    },
329    GetTextContentViaCdp {
330        cdp_websocket_url: String,
331        target_id: String,
332        css_selector: String,
333    },
334    GetInnerTextViaCdp {
335        cdp_websocket_url: String,
336        target_id: String,
337        css_selector: String,
338    },
339    WaitForSelectorViaCdp {
340        cdp_websocket_url: String,
341        target_id: String,
342        css_selector: String,
343        visible: bool,
344    },
345    ScreenshotViaCdp {
346        cdp_websocket_url: String,
347        target_id: String,
348    },
349}
350
351#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
352#[serde(tag = "result", rename_all = "snake_case")]
353pub enum PluginResult {
354    LaunchBrowser(BrowserLaunchInfo),
355    OpenPage(PageInfo),
356    ClosePage,
357    NavigatePage(TabNavigationInfo),
358    ClickElement(ClickInfo),
359    CountElements(ElementCountInfo),
360    HighlightElements(HighlightElementsInfo),
361    FocusElement(FocusInfo),
362    FillElement(FillInfo),
363    HoverElement(HoverInfo),
364    PressKey(PressKeyInfo),
365    GetTextContent(TextInfo),
366    GetInnerText(TextInfo),
367    WaitForSelector(WaitForSelectorInfo),
368    Screenshot(ScreenshotInfo),
369    OpenChromeWindow(ChromeLaunchInfo),
370    DiscoverInitialTab(ChromeTabInfo),
371    OpenChromeTab(ChromeTabInfo),
372    CloseBrowserProcess,
373    CloseChromeTab,
374    NavigateChromeTab(TabNavigationInfo),
375    InjectChromiumBidiMapper(ChromiumBidiMapperInfo),
376    ResolveBidiContextForTab {
377        browsing_context_id: String,
378        mapper: ChromiumBidiMapperInfo,
379    },
380    ClickElementViaCdp(ClickInfo),
381    CountElementsViaCdp(ElementCountInfo),
382    HighlightElementsViaCdp(HighlightElementsInfo),
383    FocusElementViaCdp(FocusInfo),
384    FillElementViaCdp(FillInfo),
385    HoverElementViaCdp(HoverInfo),
386    PressKeyViaCdp(PressKeyInfo),
387    GetTextContentViaCdp(TextInfo),
388    GetInnerTextViaCdp(TextInfo),
389    WaitForSelectorViaCdp(WaitForSelectorInfo),
390    ScreenshotViaCdp(ScreenshotInfo),
391}
392
393#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
394pub struct PluginEnvelope {
395    pub ok: bool,
396    pub result: Option<PluginResult>,
397    pub error: Option<String>,
398}