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