web: Switch from console_log to tracing-wasm

This commit is contained in:
Nathan Adams 2023-01-04 13:54:21 +01:00
parent eec68365a6
commit e2b9f6c1c4
3 changed files with 50 additions and 20 deletions

26
Cargo.lock generated
View File

@ -623,16 +623,6 @@ dependencies = [
"wasm-bindgen",
]
[[package]]
name = "console_log"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "501a375961cef1a0d44767200e66e4a559283097e91d0730b1d75dfb2f8a1494"
dependencies = [
"log",
"web-sys",
]
[[package]]
name = "convert_case"
version = "0.6.0"
@ -2347,7 +2337,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
dependencies = [
"cfg-if 1.0.0",
"serde",
]
[[package]]
@ -3601,11 +3590,9 @@ dependencies = [
"base64 0.20.0",
"chrono",
"console_error_panic_hook",
"console_log",
"generational-arena",
"getrandom",
"js-sys",
"log",
"ruffle_core",
"ruffle_render_canvas",
"ruffle_render_webgl",
@ -3616,6 +3603,8 @@ dependencies = [
"serde-wasm-bindgen",
"thiserror",
"tracing",
"tracing-subscriber",
"tracing-wasm",
"url",
"wasm-bindgen",
"wasm-bindgen-futures",
@ -4447,6 +4436,17 @@ dependencies = [
"tracing-log",
]
[[package]]
name = "tracing-wasm"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4575c663a174420fa2d78f4108ff68f65bf2fbb7dd89f33749b6e826b3626e07"
dependencies = [
"tracing",
"tracing-subscriber",
"wasm-bindgen",
]
[[package]]
name = "transpose"
version = "0.2.2"

View File

@ -13,7 +13,7 @@ publish = false # This crate is useless alone, people should use the npm package
crate-type = ["cdylib", "rlib"]
[features]
default = ["canvas", "console_error_panic_hook", "console_log", "webgl"]
default = ["canvas", "console_error_panic_hook", "webgl"]
# core features
avm_debug = ["ruffle_core/avm_debug"]
@ -27,11 +27,11 @@ wgpu-webgl = ["ruffle_render_wgpu", "ruffle_render_wgpu/webgl"]
[dependencies]
console_error_panic_hook = { version = "0.1.7", optional = true }
console_log = { version = "0.2", optional = true }
generational-arena = "0.2.8"
js-sys = "0.3.60"
log = { version = "0.4", features = ["serde"] }
tracing = { version = "0.1.37", features = ["log"] }
tracing-subscriber = { version = "0.3.16", default-features = false, features = ["registry"] }
tracing-wasm = "0.2.1"
ruffle_render_canvas = { path = "../render/canvas", optional = true }
ruffle_web_common = { path = "common" }
ruffle_render_webgl = { path = "../render/webgl", optional = true }

View File

@ -19,10 +19,14 @@ use ruffle_video_software::backend::SoftwareVideoBackend;
use ruffle_web_common::JsResult;
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
use std::str::FromStr;
use std::sync::Once;
use std::sync::{Arc, Mutex};
use std::time::Duration;
use std::{cell::RefCell, error::Error, num::NonZeroI32};
use tracing_subscriber::layer::{Layered, SubscriberExt};
use tracing_subscriber::registry::Registry;
use tracing_wasm::{WASMLayer, WASMLayerConfigBuilder};
use wasm_bindgen::{prelude::*, JsCast, JsValue};
use web_sys::{
AddEventListenerOptions, Element, Event, EventTarget, HtmlCanvasElement, HtmlElement,
@ -66,6 +70,7 @@ struct RuffleInstance {
unload_callback: Option<Closure<dyn FnMut(Event)>>,
has_focus: bool,
trace_observer: Arc<RefCell<JsValue>>,
log_subscriber: Arc<Layered<WASMLayer, Registry>>,
}
#[wasm_bindgen]
@ -115,7 +120,16 @@ struct JavascriptInterface {
js_player: JavascriptPlayer,
}
#[derive(Serialize, Deserialize)]
fn deserialize_log_level<'de, D>(deserializer: D) -> Result<tracing::Level, D::Error>
where
D: serde::Deserializer<'de>,
{
use serde::de::Error;
let value: String = serde::Deserialize::deserialize(deserializer)?;
tracing::Level::from_str(&value).map_err(D::Error::custom)
}
#[derive(Deserialize)]
struct Config {
#[serde(rename = "allowScriptAccess")]
allow_script_access: bool,
@ -145,8 +159,8 @@ struct Config {
#[serde(rename = "warnOnUnsupportedContent")]
warn_on_unsupported_content: bool,
#[serde(rename = "logLevel")]
log_level: log::Level,
#[serde(rename = "logLevel", deserialize_with = "deserialize_log_level")]
log_level: tracing::Level,
#[serde(rename = "maxExecutionDuration")]
max_execution_duration: Duration,
@ -454,7 +468,14 @@ impl Ruffle {
js_player: JavascriptPlayer,
config: Config,
) -> Result<Ruffle, Box<dyn Error>> {
let _ = console_log::init_with_level(config.log_level);
let log_subscriber = Arc::new(
Registry::default().with(WASMLayer::new(
WASMLayerConfigBuilder::new()
.set_max_level(config.log_level)
.build(),
)),
);
let _subscriber = tracing::subscriber::set_default(log_subscriber.clone());
let allow_script_access = config.allow_script_access;
let window = web_sys::window().ok_or("Expected window")?;
@ -540,6 +561,7 @@ impl Ruffle {
timestamp: None,
has_focus: false,
trace_observer,
log_subscriber,
};
// Prevent touch-scrolling on canvas.
@ -822,6 +844,8 @@ impl Ruffle {
let instances = instances.try_borrow()?;
if let Some(instance) = instances.get(self.0) {
let instance = instance.try_borrow()?;
let _subscriber =
tracing::subscriber::set_default(instance.log_subscriber.clone());
Ok(f(&instance))
} else {
Err(RuffleInstanceError::InstanceNotFound)
@ -845,6 +869,8 @@ impl Ruffle {
let instances = instances.try_borrow()?;
if let Some(instance) = instances.get(self.0) {
let mut instance = instance.try_borrow_mut()?;
let _subscriber =
tracing::subscriber::set_default(instance.log_subscriber.clone());
Ok(f(&mut instance))
} else {
Err(RuffleInstanceError::InstanceNotFound)
@ -868,6 +894,8 @@ impl Ruffle {
let instances = instances.try_borrow()?;
if let Some(instance) = instances.get(self.0) {
let instance = instance.try_borrow()?;
let _subscriber =
tracing::subscriber::set_default(instance.log_subscriber.clone());
// This clone lets us drop the instance borrow to avoid potential double-borrows.
let core = instance.core.clone();
drop(instance);
@ -897,6 +925,8 @@ impl Ruffle {
let instances = instances.try_borrow()?;
if let Some(instance) = instances.get(self.0) {
let instance = instance.try_borrow()?;
let _subscriber =
tracing::subscriber::set_default(instance.log_subscriber.clone());
// This clone lets us drop the instance to avoid potential double-borrows.
let core = instance.core.clone();
drop(instance);