diff --git a/crates/iron-remote-desktop/src/lib.rs b/crates/iron-remote-desktop/src/lib.rs index 420ab314..016a4cd3 100644 --- a/crates/iron-remote-desktop/src/lib.rs +++ b/crates/iron-remote-desktop/src/lib.rs @@ -190,9 +190,11 @@ macro_rules! make_bridge { #[wasm_bindgen(js_name = extensionCall)] pub fn extension_call( + &self, ext: $crate::Extension, ) -> Result<$crate::internal::wasm_bindgen::JsValue, IronError> { - <<$api as $crate::RemoteDesktopApi>::Session as $crate::Session>::extension_call(ext).map_err(IronError) + <<$api as $crate::RemoteDesktopApi>::Session as $crate::Session>::extension_call(&self.0, ext) + .map_err(IronError) } } diff --git a/crates/iron-remote-desktop/src/session.rs b/crates/iron-remote-desktop/src/session.rs index efcda500..d7cb256a 100644 --- a/crates/iron-remote-desktop/src/session.rs +++ b/crates/iron-remote-desktop/src/session.rs @@ -98,7 +98,7 @@ pub trait Session { fn supports_unicode_keyboard_shortcuts(&self) -> bool; - fn extension_call(ext: Extension) -> Result; + fn extension_call(&self, ext: Extension) -> Result; } pub trait SessionTerminationInfo { diff --git a/crates/ironrdp-web/src/session.rs b/crates/ironrdp-web/src/session.rs index 39b773a6..99eca8e7 100644 --- a/crates/ironrdp-web/src/session.rs +++ b/crates/ironrdp-web/src/session.rs @@ -805,7 +805,7 @@ impl iron_remote_desktop::Session for Session { false } - fn extension_call(ext: Extension) -> Result { + fn extension_call(&self, ext: Extension) -> Result { Err( IronError::from(anyhow::Error::msg(format!("unknown extension: {}", ext.ident()))) .with_kind(IronErrorKind::General), diff --git a/web-client/iron-remote-desktop/src/interfaces/UserInteraction.ts b/web-client/iron-remote-desktop/src/interfaces/UserInteraction.ts index 7810347f..fb9d3699 100644 --- a/web-client/iron-remote-desktop/src/interfaces/UserInteraction.ts +++ b/web-client/iron-remote-desktop/src/interfaces/UserInteraction.ts @@ -4,6 +4,7 @@ import type { SessionEvent } from './session-event'; import { ConfigBuilder } from '../services/ConfigBuilder'; import type { Config } from '../services/Config'; import type { PartialObserver } from 'rxjs'; +import type { Extension } from './Extension'; export interface UserInteraction { setVisibility(state: boolean): void; @@ -29,4 +30,6 @@ export interface UserInteraction { resize(width: number, height: number, scale?: number): void; setEnableClipboard(enable: boolean): void; + + callExtension(ext: Extension): void; } diff --git a/web-client/iron-remote-desktop/src/services/PublicAPI.ts b/web-client/iron-remote-desktop/src/services/PublicAPI.ts index d58e5c79..dc50b5ec 100644 --- a/web-client/iron-remote-desktop/src/services/PublicAPI.ts +++ b/web-client/iron-remote-desktop/src/services/PublicAPI.ts @@ -6,6 +6,7 @@ import type { UserInteraction } from '../interfaces/UserInteraction'; import type { ScreenScale } from '../enums/ScreenScale'; import { ConfigBuilder } from './ConfigBuilder'; import { Config } from './Config'; +import type { Extension } from '../interfaces/Extension'; export class PublicAPI { private remoteDesktopService: RemoteDesktopService; @@ -62,6 +63,10 @@ export class PublicAPI { this.remoteDesktopService.setEnableClipboard(enable); } + private callExtension(ext: Extension) { + this.remoteDesktopService.callExtension(ext); + } + getExposedFunctions(): UserInteraction { return { setVisibility: this.setVisibility.bind(this), @@ -78,6 +83,7 @@ export class PublicAPI { setCursorStyleOverride: this.setCursorStyleOverride.bind(this), resize: this.resize.bind(this), setEnableClipboard: this.setEnableClipboard.bind(this), + callExtension: this.callExtension.bind(this), }; } } diff --git a/web-client/iron-remote-desktop/src/services/remote-desktop.service.ts b/web-client/iron-remote-desktop/src/services/remote-desktop.service.ts index 1c8fcc8a..9eeca875 100644 --- a/web-client/iron-remote-desktop/src/services/remote-desktop.service.ts +++ b/web-client/iron-remote-desktop/src/services/remote-desktop.service.ts @@ -19,6 +19,7 @@ import type { SessionTerminationInfo } from '../interfaces/SessionTerminationInf import type { RemoteDesktopModule } from '../interfaces/RemoteDesktopModule'; import { ConfigBuilder } from './ConfigBuilder'; import type { Config } from './Config'; +import type { Extension } from '../interfaces/Extension'; type OnRemoteClipboardChanged = (data: ClipboardData) => void; type OnRemoteReceivedFormatsList = () => void; @@ -280,6 +281,10 @@ export class RemoteDesktopService { } } + callExtension(ext: Extension) { + this.session?.extensionCall(ext); + } + private releaseAllInputs() { this.session?.releaseAllInputs(); }