endpoints.rs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. mod cmd;
  2. use web_view::WebView;
  3. use crate::TauriResult;
  4. #[allow(unused_variables)]
  5. pub(crate) fn handle<T: 'static>(webview: &mut WebView<'_, T>, arg: &str) -> TauriResult<bool> {
  6. use cmd::Cmd::*;
  7. match serde_json::from_str(arg) {
  8. Err(_) => Ok(false),
  9. Ok(command) => {
  10. match command {
  11. Init {} => {
  12. #[cfg(not(any(feature = "all-api", feature = "event")))]
  13. let event_init = "";
  14. #[cfg(any(feature = "all-api", feature = "event"))]
  15. let event_init = format!(
  16. "
  17. window['{queue}'] = [];
  18. window['{fn}'] = function (payload, salt, ignoreQueue) {{
  19. const listeners = (window['{listeners}'] && window['{listeners}'][payload.type]) || []
  20. if (!ignoreQueue && listeners.length === 0) {{
  21. window['{queue}'].push({{
  22. payload: payload,
  23. salt: salt
  24. }})
  25. }}
  26. if (listeners.length > 0) {{
  27. window.tauri.promisified({{
  28. cmd: 'validateSalt',
  29. salt: salt
  30. }}).then(function () {{
  31. for (let i = listeners.length - 1; i >= 0; i--) {{
  32. const listener = listeners[i]
  33. if (listener.once)
  34. listeners.splice(i, 1)
  35. listener.handler(payload)
  36. }}
  37. }})
  38. }}
  39. }}
  40. ",
  41. fn = crate::event::emit_function_name(),
  42. listeners = crate::event::event_listeners_object_name(),
  43. queue = crate::event::event_queue_object_name()
  44. );
  45. webview.eval(&format!(
  46. r#"{event_init}
  47. window.external.invoke('{{"cmd":"__initialized"}}')
  48. "#,
  49. event_init = event_init
  50. ))?;
  51. }
  52. #[cfg(any(feature = "all-api", feature = "readTextFile"))]
  53. ReadTextFile {
  54. path,
  55. callback,
  56. error,
  57. } => {
  58. crate::file_system::read_text_file(webview, path, callback, error);
  59. }
  60. #[cfg(any(feature = "all-api", feature = "readBinaryFile"))]
  61. ReadBinaryFile {
  62. path,
  63. callback,
  64. error,
  65. } => {
  66. crate::file_system::read_binary_file(webview, path, callback, error);
  67. }
  68. #[cfg(any(feature = "all-api", feature = "writeFile"))]
  69. WriteFile {
  70. file,
  71. contents,
  72. callback,
  73. error,
  74. } => {
  75. crate::file_system::write_file(webview, file, contents, callback, error);
  76. }
  77. #[cfg(any(feature = "all-api", feature = "listDirs"))]
  78. ListDirs {
  79. path,
  80. callback,
  81. error,
  82. } => {
  83. crate::file_system::list_dirs(webview, path, callback, error);
  84. }
  85. #[cfg(any(feature = "all-api", feature = "listFiles"))]
  86. ListFiles {
  87. path,
  88. callback,
  89. error,
  90. } => {
  91. crate::file_system::list(webview, path, callback, error);
  92. }
  93. #[cfg(any(feature = "all-api", feature = "setTitle"))]
  94. SetTitle { title } => {
  95. webview.set_title(&title)?;
  96. }
  97. #[cfg(any(feature = "all-api", feature = "execute"))]
  98. Execute {
  99. command,
  100. args,
  101. callback,
  102. error,
  103. } => {
  104. crate::call(webview, command, args, callback, error);
  105. }
  106. #[cfg(any(feature = "all-api", feature = "open"))]
  107. Open { uri } => {
  108. crate::spawn(move || {
  109. webbrowser::open(&uri).expect("Failed to open webbrowser with uri");
  110. });
  111. }
  112. ValidateSalt {
  113. salt,
  114. callback,
  115. error,
  116. } => {
  117. crate::salt::validate(webview, salt, callback, error);
  118. }
  119. #[cfg(any(feature = "all-api", feature = "event"))]
  120. Listen {
  121. event,
  122. handler,
  123. once,
  124. } => {
  125. webview
  126. .eval(&format!(
  127. "
  128. if (window['{listeners}'] === void 0) {{
  129. window['{listeners}'] = {{}}
  130. }}
  131. if (window['{listeners}']['{evt}'] === void 0) {{
  132. window['{listeners}']['{evt}'] = []
  133. }}
  134. window['{listeners}']['{evt}'].push({{
  135. handler: window['{handler}'],
  136. once: {once_flag}
  137. }});
  138. for (let i = 0; i < (window['{queue}'] || []).length; i++) {{
  139. const e = window['{queue}'][i];
  140. window['{emit}'](e.payload, e.salt, true)
  141. }}
  142. ",
  143. listeners = crate::event::event_listeners_object_name(),
  144. queue = crate::event::event_queue_object_name(),
  145. emit = crate::event::emit_function_name(),
  146. evt = event,
  147. handler = handler,
  148. once_flag = if once { "true" } else { "false" }
  149. ))
  150. .expect("failed to call webview.eval from listen");
  151. }
  152. #[cfg(any(feature = "all-api", feature = "event"))]
  153. Emit { event, payload } => {
  154. crate::event::on_event(event, payload);
  155. }
  156. #[cfg(not(any(feature = "dev-server", feature = "embedded-server")))]
  157. LoadAsset {
  158. asset,
  159. asset_type,
  160. callback,
  161. error,
  162. } => {
  163. let handle = webview.handle();
  164. crate::execute_promise(
  165. webview,
  166. move || {
  167. let read_asset = crate::assets::ASSETS.get(&format!(
  168. "{}{}{}",
  169. env!("TAURI_DIST_DIR"),
  170. if asset.starts_with("/") { "" } else { "/" },
  171. asset
  172. ));
  173. if read_asset.is_err() {
  174. return Err(r#""Asset not found""#.to_string());
  175. }
  176. if asset_type == "image" {
  177. let ext = if asset.ends_with("gif") {
  178. "gif"
  179. } else if asset.ends_with("png") {
  180. "png"
  181. } else {
  182. "jpeg"
  183. };
  184. Ok(format!(
  185. "`data:image/{};base64,{}`",
  186. ext,
  187. base64::encode(&read_asset.expect("Failed to read asset type").into_owned())
  188. ))
  189. } else {
  190. handle
  191. .dispatch(move |_webview| {
  192. _webview.eval(
  193. &std::str::from_utf8(
  194. &read_asset.expect("Failed to read asset type").into_owned(),
  195. )
  196. .expect("failed to convert asset bytes to u8 slice"),
  197. )
  198. })
  199. .map_err(|err| format!("`{}`", err))
  200. .map(|_| r#""Asset loaded successfully""#.to_string())
  201. }
  202. },
  203. callback,
  204. error,
  205. );
  206. }
  207. }
  208. Ok(true)
  209. }
  210. }
  211. }