Skip to main content

konjure_wasm/
browser.rs

1//! Low-level ABI for `konjure-web`; browser policy and clock semantics live there.
2
3use konjure_web::{FrameInput, SessionInput};
4use wasm_bindgen::prelude::*;
5
6/// Inspect browser APIs through the Rust platform adapter without starting a session.
7#[cfg(target_arch = "wasm32")]
8#[wasm_bindgen]
9pub async fn browser_capabilities() -> Result<konjure_web::BrowserCapabilities, JsValue> {
10    konjure_web::browser::discover_capabilities().await
11}
12
13/// Owned browser view clock. Call `free()` when disposing the view.
14#[wasm_bindgen]
15pub struct BrowserSession {
16    inner: konjure_web::BrowserSession,
17}
18
19#[wasm_bindgen]
20impl BrowserSession {
21    /// Start an inline visible view at scene time zero.
22    #[wasm_bindgen(constructor)]
23    pub fn new(playing: bool) -> Self {
24        Self {
25            inner: konjure_web::BrowserSession::new(playing),
26        }
27    }
28
29    /// Advance an animation callback in browser milliseconds; returns scene seconds.
30    pub fn frame(&mut self, timestamp_ms: f64) -> Result<f64, JsValue> {
31        self.inner
32            .frame(FrameInput { timestamp_ms })
33            .map(|frame| frame.time_seconds)
34            .map_err(super::json_error)
35    }
36
37    /// Whether animation is playing, including during suspension.
38    #[wasm_bindgen(getter)]
39    pub fn playing(&self) -> bool {
40        self.inner.playing()
41    }
42
43    /// Current accepted scene time in seconds.
44    #[wasm_bindgen(getter)]
45    pub fn time(&self) -> f64 {
46        self.inner.time_seconds()
47    }
48
49    /// Whether the current lifecycle permits rendering.
50    #[wasm_bindgen(getter)]
51    pub fn active(&self) -> bool {
52        self.inner.active()
53    }
54
55    /// Play or pause, resetting the browser timestamp baseline.
56    pub fn set_playing(&mut self, value: bool) -> Result<(), JsValue> {
57        self.inner
58            .apply(SessionInput::Playing(value))
59            .map_err(super::json_error)
60    }
61
62    /// Seek in scene seconds, rejecting invalid time without changing state.
63    pub fn seek(&mut self, time: f64) -> Result<(), JsValue> {
64        self.inner
65            .apply(SessionInput::Seek(time))
66            .map_err(super::json_error)
67    }
68
69    /// Supply combined document/viewport visibility from the DOM host.
70    pub fn set_visible(&mut self, value: bool) -> Result<(), JsValue> {
71        self.inner
72            .apply(SessionInput::Visible(value))
73            .map_err(super::json_error)
74    }
75
76    /// Supply context loss/restoration events from the renderer host.
77    pub fn set_context_available(&mut self, value: bool) -> Result<(), JsValue> {
78        self.inner
79            .apply(SessionInput::ContextAvailable(value))
80            .map_err(super::json_error)
81    }
82
83    /// Supply actual immersive presentation state, not inferred XR capability.
84    pub fn set_immersive(&mut self, value: bool) -> Result<(), JsValue> {
85        self.inner
86            .apply(SessionInput::Immersive(value))
87            .map_err(super::json_error)
88    }
89}