Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/ctron/browser-panic-hook

A panic hook for frontend applications
https://github.com/ctron/browser-panic-hook

Last synced: 2 months ago
JSON representation

A panic hook for frontend applications

Awesome Lists containing this project

README

        

# Browser Panic Hook

[![CI](https://github.com/ctron/browser-panic-hook/workflows/CI/badge.svg)](https://github.com/ctron/browser-panic-hook/actions?query=workflow%3A%22CI%22)
[![GitHub release (latest SemVer)](https://img.shields.io/github/v/tag/ctron/browser-panic-hook?sort=semver)](https://github.com/ctron/browser-panic-hook/releases)
[![crates.io](https://img.shields.io/crates/v/browser-panic-hook.svg)](https://crates.io/crates/browser-panic-hook)
[![docs.rs](https://docs.rs/browser-panic-hook/badge.svg)](https://docs.rs/browser-panic-hook)

A go-to panic handler for WebAssembly based Rust application is [console_error_panic_hook](https://github.com/rustwasm/console_error_panic_hook), which does the job, but isn't really end user-friendly.

In the case of running the WebAssembly application as a frontend application, we do have the browser which can help
interacting with the user, so why not leverage it.

That is what this crate does, failing in style:

![Screenshot of an example](docs/example1.png)

## Presentation

The panic is also always still logged to the console as a first step. As it might happen that running the panic
handler might run into trouble as well.

Next, it depends on what presentation mode you register. There is a `Basic` one, which takes over the body of the
document and renders some simple HTML structure, including some CSS class names. In combination with an existing
stylesheet, this may already be enough.

The `CustomBody` mode allow to provide a function, which renders the full body. This can be used to create more
customized output for frameworks like PatternFly or Bootstrap.

Everything boils down to a trait (`PresentationMode`), for which you can also provide a custom implementation.

Just note, your application is already panicking, so you should try to keep it simple, or rely on some basic
browser functionality.

## Usage

In any case, you need to add this crate a dependency to your project, and register the panic handler. Registering
can be as easy as:

```rust
pub fn main() -> Result<(), JsValue> {
browser_panic_hook::set_once_default();

// run your application ...
Ok(())
}
```

You can also use a more customized variant:

```rust
pub fn main() -> Result<(), JsValue> {
browser_panic_hook::set_once(|| {
browser_panic_hook::CustomBody(Box::new(|details| {
// render new body
format!("…")
}))
});

// run your application ...
Ok(())
}
```

More complete examples can be found in the [examples](examples) folder.

## Yew

Yew already sets a default panic hook. This can be overridden using:

```rust
pub fn main() -> Result<(), JsValue> {
// provide a custom panic hook
yew::set_custom_panic_hook(Basic.into_panic_hook());
// run the application
yew::Renderer::::new().render();
Ok(())
}
```

## Future improvements

Additional improvements could be done, like:

* [ ] Call a diagnostic endpoint with the panic information
* [ ] Create a mode which overlays instead of replaces the HTML body
* [ ] Allow adding additional, application specific, HTML (like "click here to report the error")
* [ ] For sure some more …