CH-J ToolsSSH를 통한 서버 관리
메뉴
공개된 소스

CH-J Tools

특정 애플리케이션 릴리스의 디렉터리와 파일을 살펴보세요.

소스 ZIP 다운로드
CH-J / Server Manager 1704 개 파일
0.1.2-beta 추가됨: · 빌드됨:
smoke.rs 추가됨: 날짜 기록 없음 3.7 KB · 67 줄
코드 파일 다운로드
1//! Test-only UI automation sink (cargo feature `smoke`, never in release builds).
3use serde_json::Value;
4use std::io::Write;
5use tauri::Manager;
7#[tauri::command]
8pub fn smoke_report(webview: tauri::Webview, payload: Option<Value>) -> Result<Value, crate::core::error::CoreError> {
9 let Ok(path) = std::env::var("CHJ_SMOKE_OUT") else { return Ok(Value::Null) };
10 let line = serde_json::json!({ "window": webview.label(), "at": chrono::Utc::now().to_rfc3339(), "report": payload });
11 if let Ok(mut file) = std::fs::OpenOptions::new().create(true).append(true).open(path) {
12 let _ = writeln!(file, "{line}");
13 }
14 if payload.as_ref().and_then(|p| p.get("exit")).and_then(Value::as_bool) == Some(true) {
15 webview.app_handle().exit(0);
16 }
17 Ok(Value::Null)
20/// PNG of this window's web content, without any screen-recording permission and also when the
21/// window is covered. Writes only below `CHJ_SMOKE_SHOTS`.
22#[tauri::command]
23pub async fn smoke_snapshot(webview: tauri::Webview, window: tauri::Window, payload: Option<Value>) -> Result<Value, crate::core::error::CoreError> {
24 use crate::core::error::CoreError;
25 let payload = payload.unwrap_or_default();
26 let root = std::env::var("CHJ_SMOKE_SHOTS").map_err(|_| CoreError::plain("CHJ_SMOKE_SHOTS is not set."))?;
27 let name = payload["name"].as_str().filter(|n| !n.is_empty() && !n.contains("..") && !n.starts_with('/')).ok_or_else(|| CoreError::plain("Invalid snapshot name."))?;
28 let path = std::path::Path::new(&root).join(name);
29 if let Some(parent) = path.parent() {
30 std::fs::create_dir_all(parent)?;
31 }
32 if let (Some(width), Some(height)) = (payload["width"].as_f64(), payload["height"].as_f64()) {
33 let _ = window.set_size(tauri::LogicalSize::new(width, height));
34 tokio::time::sleep(std::time::Duration::from_millis(500)).await;
35 }
36 capture(&webview, path).await
39#[cfg(target_os = "macos")]
40async fn capture(webview: &tauri::Webview, path: std::path::PathBuf) -> Result<Value, crate::core::error::CoreError> {
41 use crate::core::error::CoreError;
42 use objc2_app_kit::{NSBitmapImageFileType, NSBitmapImageRep, NSImage};
43 use objc2_foundation::{NSDictionary, NSError};
44 use objc2_web_kit::WKWebView;
45 let (sender, receiver) = tokio::sync::oneshot::channel::<Result<Vec<u8>, String>>();
46 let sender = std::sync::Mutex::new(Some(sender));
47 webview
48 .with_webview(move |platform| unsafe {
49 let view: &WKWebView = &*platform.inner().cast::<WKWebView>();
50 let block = block2::RcBlock::new(move |image: *mut NSImage, _error: *mut NSError| {
51 let png = image.as_ref().and_then(|image| image.TIFFRepresentation()).and_then(|tiff| NSBitmapImageRep::imageRepWithData(&tiff)).and_then(|rep| rep.representationUsingType_properties(NSBitmapImageFileType::PNG, &NSDictionary::new())).map(|data| data.to_vec());
52 if let Some(sender) = sender.lock().unwrap().take() {
53 let _ = sender.send(png.ok_or_else(|| "The web view returned no image.".to_string()));
54 }
55 });
56 view.takeSnapshotWithConfiguration_completionHandler(None, &block);
57 })
58 .map_err(|error| CoreError::plain(&error.to_string()))?;
59 let bytes = receiver.await.map_err(|_| CoreError::plain("The snapshot was not delivered."))?.map_err(|message| CoreError::plain(&message))?;
60 std::fs::write(&path, &bytes)?;
61 Ok(serde_json::json!({ "bytes": bytes.len() }))
64#[cfg(not(target_os = "macos"))]
65async fn capture(_webview: &tauri::Webview, _path: std::path::PathBuf) -> Result<Value, crate::core::error::CoreError> {
66 Err(crate::core::error::CoreError::plain("Screenshots are taken on macOS."))
SHA-256009fa0eb4f57bcc71dd99b5aa4317ce31902a301f473dd75a89eea151b060b78

CH-J Proprietary Software License 1.14 · 소스는 CH-J Proprietary Software License 1.14에 따라 제공됩니다. 소스를 공개한다고 해서 라이선스 조항이 바뀌거나 추가 권리가 부여되지는 않습니다.

압축 파일 SHA-256ac8fe790f4ba60fc098f8c985fc2656cfcc6cdc21fb34b30e308a2b54e62258f
파일