{"id":13474938,"url":"https://github.com/koute/stdweb","last_synced_at":"2025-05-13T00:13:02.710Z","repository":{"id":42041155,"uuid":"84753809","full_name":"koute/stdweb","owner":"koute","description":"A standard library for the client-side Web","archived":false,"fork":false,"pushed_at":"2024-02-28T12:11:10.000Z","size":1142,"stargazers_count":3449,"open_issues_count":134,"forks_count":176,"subscribers_count":62,"default_branch":"master","last_synced_at":"2025-05-13T00:12:55.453Z","etag":null,"topics":["asmjs","emscripten","gui","javascript","rust","web","webasm","webassembly"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/koute.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE-APACHE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2017-03-12T20:07:37.000Z","updated_at":"2025-05-12T18:40:22.000Z","dependencies_parsed_at":"2023-01-24T14:30:55.801Z","dependency_job_id":"fcb8ee30-1299-4533-aa16-3e4c00f74a34","html_url":"https://github.com/koute/stdweb","commit_stats":{"total_commits":517,"total_committers":65,"mean_commits":7.953846153846154,"dds":0.276595744680851,"last_synced_commit":"9b418d98df6fafaa4d4b87b04c304d0220292055"},"previous_names":[],"tags_count":20,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/koute%2Fstdweb","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/koute%2Fstdweb/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/koute%2Fstdweb/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/koute%2Fstdweb/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/koute","download_url":"https://codeload.github.com/koute/stdweb/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253843222,"owners_count":21972874,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["asmjs","emscripten","gui","javascript","rust","web","webasm","webassembly"],"created_at":"2024-07-31T16:01:16.087Z","updated_at":"2025-05-13T00:13:02.676Z","avatar_url":"https://github.com/koute.png","language":"Rust","readme":"\u003cp align=\"center\"\u003e\n    \u003cimg src=\"info/logo.png\"\u003e\n\u003c/p\u003e\n\n[![Build Status](https://api.travis-ci.org/koute/stdweb.svg)](https://travis-ci.org/koute/stdweb)\n[![Join the chat at https://gitter.im/stdweb-rs/stdweb](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/stdweb-rs/stdweb?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=badge)\n\n# A standard library for the client-side Web\n\n[![Documentation](https://docs.rs/stdweb/badge.svg)](https://docs.rs/stdweb/*/stdweb/)\n\nThe goal of this crate is to provide Rust bindings to the Web APIs and to allow\na high degree of interoperability between Rust and JavaScript.\n\n## Donate\n\n[![Become a patron](https://koute.github.io/img/become_a_patron_button.png)](https://www.patreon.com/koute)\n\n## Patrons\n\nThis software was brought to you thanks to these wonderful people:\n  * Embark Studios\n  * Joe Narvaez\n  * Eduard Knyshov\n  * Anselm Eickhoff\n  * Johan Andersson\n  * Stephen Sugden\n  * is8ac\n\nThank you!\n\n## Examples\n\nYou can directly embed JavaScript code into Rust:\n\n```rust\nlet message = \"Hello, 世界!\";\nlet result = js! {\n    alert( @{message} );\n    return 2 + 2 * 2;\n};\n\nprintln!( \"2 + 2 * 2 = {:?}\", result );\n```\n\nClosures are also supported:\n\n```rust\nlet print_hello = |name: String| {\n    println!( \"Hello, {}!\", name );\n};\n\njs! {\n    var print_hello = @{print_hello};\n    print_hello( \"Bob\" );\n    print_hello.drop(); // Necessary to clean up the closure on Rust's side.\n}\n```\n\nYou can also pass arbitrary structures thanks to [serde]:\n\n```rust\n#[derive(Serialize)]\nstruct Person {\n    name: String,\n    age: i32\n}\n\njs_serializable!( Person );\n\njs! {\n    var person = @{person};\n    console.log( person.name + \" is \" + person.age + \" years old.\" );\n};\n```\n\n[serde]: https://serde.rs/\n\nThis crate also exposes a number of Web APIs, for example:\n\n```rust\nlet button = document().query_selector( \"#hide-button\" ).unwrap().unwrap();\nbutton.add_event_listener( move |_: ClickEvent| {\n    for anchor in document().query_selector_all( \"#main a\" ) {\n        js!( @{anchor}.style = \"display: none;\"; );\n    }\n});\n```\n\nExposing Rust functions to JavaScript is supported too:\n\n```rust\n#[js_export]\nfn hash( string: String ) -\u003e String {\n    let mut hasher = Sha1::new();\n    hasher.update( string.as_bytes() );\n    hasher.digest().to_string()\n}\n```\n\nThen you can do this from Node.js:\n\n```js\nvar hasher = require( \"hasher.js\" ); // Where `hasher.js` is generated from Rust code.\nconsole.log( hasher.hash( \"Hello world!\" ) );\n```\n\nOr you can take the same `.js` file and use it in a web browser:\n\n```html\n\u003cscript src=\"hasher.js\"\u003e\u003c/script\u003e\n\u003cscript\u003e\n    Rust.hasher.then( function( hasher ) {\n        console.log( hasher.hash( \"Hello world!\" ) );\n    });\n\u003c/script\u003e\n```\n\nIf you're using [Parcel] you can also use our [experimental Parcel plugin];\nfirst do this in your existing Parcel project:\n\n    $ npm install --save parcel-plugin-cargo-web\n\nAnd then simply:\n\n```js\nimport hasher from \"./hasher/Cargo.toml\";\nconsole.log( hasher.hash( \"Hello world!\" ) );\n```\n\n[Parcel]: https://parceljs.org/\n[experimental Parcel plugin]: https://github.com/koute/parcel-plugin-cargo-web\n\n## Design goals\n\n  * Expose a full suite of Web APIs as exposed by web browsers.\n  * Try to follow the original JavaScript conventions and structure as much as possible,\n    except in cases where doing otherwise results in a clearly superior design.\n  * Be a building block from which higher level frameworks and libraries\n    can be built.\n  * Make it convenient and easy to embed JavaScript code directly into Rust\n    and to marshal data between the two.\n  * Integrate with the wider Rust ecosystem, e.g. support marshaling of structs\n    which implement serde's Serializable.\n  * Put Rust in the driver's seat where a non-trivial Web application can be\n    written without touching JavaScript at all.\n  * Allow Rust to take part in the upcoming WebAssembly (re)volution.\n  * Make it possible to trivially create standalone libraries which are\n    easily callable from JavaScript.\n\n## Getting started\n\nTake a look at some of the examples:\n\n  * `examples/minimal` - a totally minimal example which calls [alert]\n  * `examples/todomvc` - a naively implemented [TodoMVC] application; shows how to call into the DOM\n  * `examples/hasher` - shows how to export Rust functions to JavaScript and how to call them from\n                        a vanilla web browser environment or from Nodejs\n  * `examples/hasher-parcel` - shows how to import and call exported Rust functions in a [Parcel] project\n  * [`pinky-web`] - an NES emulator; you can play with the [precompiled version here](http://koute.github.io/pinky-web/)\n\n[The API documentation](https://docs.rs/stdweb/*/stdweb/) is also available for you to look at.\n\n[alert]: https://developer.mozilla.org/en-US/docs/Web/API/Window/alert\n[TodoMVC]: http://todomvc.com/\n[`pinky-web`]: https://github.com/koute/pinky/tree/master/pinky-web\n\n## Running the examples\n\n1. Install [cargo-web]:\n\n       $ cargo install -f cargo-web\n\n3. Go into `examples/todomvc` and start the example using one of these commands:\n\n    * Compile to [WebAssembly] using Rust's native WebAssembly backend:\n\n          $ cargo web start --target=wasm32-unknown-unknown\n\n    * Compile to [asm.js] using Emscripten:\n\n          $ cargo web start --target=asmjs-unknown-emscripten\n\n    * Compile to [WebAssembly] using Emscripten:\n\n          $ cargo web start --target=wasm32-unknown-emscripten\n\n4. Visit `http://localhost:8000` with your browser.\n\nFor the `*-emscripten` targets `cargo-web` is not necessary, however\nthe native `wasm32-unknown-unknown` which doesn't need Emscripten\n**requires** `cargo-web` to work!\n\n[cargo-web]: https://github.com/koute/cargo-web\n[asm.js]: https://en.wikipedia.org/wiki/Asm.js\n[WebAssembly]: https://en.wikipedia.org/wiki/WebAssembly\n\n## Changelog\n   * `stdweb 0.4.20`\n      * Compatibility with the newest `wasm-bindgen`\n      * New events:\n         * `FullscreenChangeEvent`\n   * `stdweb 0.4.19`\n      * New methods:\n         * `Document::fullscreen_enabled`\n         * `Document::fullscreen_element`\n         * `InputElement::selection_start`\n         * `InputElement::selection_end`\n         * `InputElement::set_selection_start`\n         * `InputElement::set_selection_end`\n         * `Object::to_iter`\n         * `Window::confirm`\n      * `\u0026Array`s can now be converted to `Vec`s through `TryFrom`\n      * The runtime should now be compatible with newer versions of Emscripten\n      * The unstable `futures`-related APIs were updated to work with the latest nightlies\n      * The `syn` dependency was updated to version 1\n   * `stdweb 0.4.18`\n      * The `js!` macro can now be imported with an `use`\n      * New events:\n         * `BeforeUnloadEvent`\n         * `UnloadEvent`\n      * New methods:\n         * `IBlob::slice`\n         * `IBlob::slice_with_content_type`\n         * `IWindowOrWorker::set_clearable_timeout`\n   * `stdweb 0.4.17`\n      * The unstable `futures`-related APIs were updated to work with the latest nightlies\n   * `stdweb 0.4.16`\n      * Initial `wasm-bindgen` compatibility; you can now use `stdweb` in projects\n        using `wasm-bindgen`\n      * Minimum supported Rust version is now 1.33.0\n      * Minimum required `cargo-web` version is now 0.6.24\n   * `stdweb 0.4.15`\n      * The unstable `futures`-related APIs were updated to work with the latest nightlies\n      * New types:\n         * `FormData`\n         * `FormDataEntry`\n         * `MouseButtonsState`\n      * New methods:\n         * `Blob::new`\n   * `stdweb 0.4.14`\n      * The `js!` macro now generates slightly more efficient code\n        if you're not returning anything from your JS snippet. This makes\n        it unnecessary to add the `@(no_return)` annotation in the vast\n        majority of cases.\n      * New types:\n         * `File`\n   * `stdweb 0.4.13`\n      * Fixed the procedural `js!` macro's whitespace handling\n      * New types:\n         * `ITouchEvent`\n         * `Touch`\n         * `TouchType`\n      * New events:\n         * `TouchEvent`\n         * `TouchMove`\n         * `TouchLeave`\n         * `TouchEnter`\n         * `TouchEnd`\n         * `TouchCancel`\n         * `TouchStart`\n      * New methods:\n         * `XmlHttpRequest::set_response_type`\n   * `stdweb 0.4.12`\n      * Improved diagnostics when trying to compile for the `wasm32-unknown-unknown` target without `cargo-web`\n   * `stdweb 0.4.11`\n      * The minimum required Rust version is now 1.30.1\n      * The minimum required `cargo-web` version is now 0.6.22\n      * `wasm32-unknown-unknown` is now officially supported on stable Rust\n      * Debug builds on `wasm32-unknown-unknown` are now supported\n      * The `js!` macro is now partially implemented using a procedural macro\n      * String decoding/encoding is now a lot faster due to the use of native codec APIs\n      * New methods:\n        * `Document::import_node`\n        * `IElement::slot`\n        * `IElement::attach_shadow`\n        * `IElement::shadow_root`\n      * New types:\n        * `ISlotable`\n        * `ShadowRoot`\n        * `ShadowRootMode`\n        * `TemplateElement`\n        * `SlotElement`\n      * New events:\n        * `SlotChangeEvent`\n      * `IParentNode::query_selector` and `IParentNode::query_selector_all` now return a proper error type\n   * `stdweb 0.4.10`, `stdweb-derive 0.5.1`\n      * New methods:\n        * `IElement::insert_adjacent_html`\n        * `IElement::insert_html_before`\n        * `IElement::insert_html_after`\n        * `IElement::prepend_html`\n        * `IElement::append_html`\n        * `IElement::namespace_uri`\n        * `IElement::closest`\n        * `Document::create_element_ns`\n        * `Window::get_selection`\n      * New types:\n        * `AbortError`\n        * `SelectionType`\n        * `Selection`\n        * `Range`\n      * The error messages for failed type conversions are now improved\n      * The error type of failed conversions (when using `.try_into()`/`.try_from()`) is now convertible into a `TypeError`\n      * Aggregate error types (like, e.g. `DrawImageError`) are now serializable through the `js!` macro\n      * `TypeError` is now fixed (it was incorrectly treated as a `DOMException`)\n      * `Number` can now be converted into `f64` with `.into()`/`.from()`\n      * Added `Mut`, which is a new wrapper type for safely passing `FnMut` closures into the `js!` macro;\n        it is optional for now, however the usage of this wrapper type **will be mandatory** in the future!\n      * `FnMut` closures cannot be called recursively anymore\n      * `#[derive(ReferenceType)]` now supports a limited subset of generic types\n      * Asynchronous unit tests are now supported with a new `#[async_test]` attribute macro (nightly only)\n      * Updated to `futures 0.3` (nightly only)\n   * `stdweb 0.4.9`, `stdweb-derive 0.5.0`\n      * Performance improvements; serialization through serde is now twice as fast\n      * New events:\n        * `ScrollEvent`\n        * `DragRelatedEvent`\n        * `DragEvent`\n        * `DragStartEvent`\n        * `DragEndEvent`\n        * `DragEnterEvent`\n        * `DragLeaveEvent`\n        * `DragOverEvent`\n        * `DragExitEvent`\n        * `DragDropEvent`\n      * New types:\n        * `DataTransfer`\n        * `EffectAllowed`\n        * `DropEffect`\n        * `DataTransferItemList`\n        * `DataTransferItem`\n        * `DataTransferItemKind`\n        * `IDragEvent`\n      * `Value`s can now be converted to `Option\u003c Serde\u003c T \u003e \u003e` with `try_into`\n      * Deserialization of numbers through serde now works in the majority of cases\n        allowing types other than `i32` and `f64` to be used\n      * All of the events are now more strongly-typed\n          * Previously in was possible to deserialize e.g. a `keyup` event\n            as a `KeyDownEvent` since only the event's JS type was checked\n            and both `keyup` and `keydown` share the same JS type (`KeyboardEvent`).\n            From now on the `type` field of the event is also checked, so\n            such conversions are not allowed anymore.\n   * `0.4.8`\n      * Fixed compilation on the newest nightly when targeting `wasm32-unknown-unknown`\n      * New events:\n        * `PointerLockChangeEvent`\n        * `PointerLockErrorEvent`\n        * `MouseWheelEvent`\n      * New types:\n        * `MouseWheelDeltaMode`\n        * `XhrResponseType`\n      * New methods:\n        * `XmlHttpRequest::raw_response`\n        * `Window::device_pixel_ratio`\n        * `Document::pointer_lock_element`\n        * `Document::exit_pointer_lock`\n   * `0.4.7`\n      * New events:\n         * `AuxClickEvent`\n         * `MouseEnterEvent`\n         * `MouseLeaveEvent`\n         * `ContextMenuEvent`\n         * `SelectionChangeEvent`\n      * New types:\n        * `FileList`\n        * `FileReaderReadyState`\n      * Implement gamepad APIs:\n         * `Gamepad`\n         * `GamepadButton`\n         * `GamepadButtonMapping`\n         * `GamepadEvent`\n      * Fixed `CanvasRenderingContext2d::clear_rect`\n      * Fixed a leak when creating `TypedArray`s from\n        `Vec`s and `ArrayBuffer`s.\n   * `0.4.6`\n      * Fix `docs.rs` again\n      * New types:\n         * `SubmitEvent`\n         * `IChildNode`\n      * Fix `CanvasElement::to_data_url`\n   * `0.4.5`\n      * New types:\n         * `DocumentFragment`\n         * `SelectElement`\n         * `OptionElement`\n         * `HtmlCollection`\n      * New methods:\n         * `Node::from_html`\n         * `Value::is_null`\n      * Expose enums:\n         * `SocketMessageData`\n         * `NodeType`\n      * Update to `futures` 0.2\n   * `0.4.4`\n      * Fix `docs.rs` (hopefully).\n      * New methods:\n         * `Location::origin`\n         * `Location::protocol`\n         * `Location::host`\n         * `Location::hostname`\n         * `Location::port`\n         * `Location::pathname`\n         * `Location::search`\n      * These now return `SecurityError` in the error case:\n         * `Location::hash`\n         * `Location::href`\n   * `0.4.3`\n      * Objects which cannot be used as keys in a `WeakMap`\n        should be supported now (e.g. some of the WebGL-related objects under Firefox)\n      * New methods:\n         * `Element::get_bounding_client_rect`\n         * `Element::scroll_top`\n         * `Element::scroll_left`\n         * `Window::page_x_offset`\n         * `Window::page_y_offset`\n         * `NodeList::item`\n         * `Document::body`\n         * `Document::head`\n         * `Document::title`\n         * `Document::set_title`\n         * `IMouseEvent::offset_x`\n         * `IMouseEvent::offset_y`\n      * Expose more canvas related types:\n         * `CompositeOperation`\n         * `LineCap`\n         * `LineJoin`\n         * `Repetition`\n         * `TextAlign`\n         * `TextBaseline`\n      * Expose canvas related error types: `AddColorStopError`, `DrawImageError`, `GetImageDataError`\n      * New events:\n         * `MouseOverEvent`\n         * `MouseOutEvent`\n         * `PointerOverEvent`\n         * `PointerEnterEvent`\n         * `PointerDownEvent`\n         * `PointerMoveEvent`\n         * `PointerUpEvent`\n         * `PointerCancelEvent`\n         * `PointerOutEvent`\n         * `PointerLeaveEvent`\n         * `GotPointerCaptureEvent`\n         * `LostPointerCaptureEvent`\n      * New interface for pointer events: `IPointerEvent`\n   * `0.4.2`\n      * Fixed a leak when deserializing references\n      * Fixed `CanvasRenderingContext2d::get_canvas`\n      * Exposed `FillRule` and `SocketReadyState`\n      * New attribute related methods added to `IElement`\n      * New `Date` bindings\n   * `0.4.1`\n      * Support for newest nightly Rust on `wasm32-unknown-unknown`\n      * Exposed `SocketBinaryType` enum\n      * New canvas APIs:\n         * Numerous new methods for `CanvasRenderingContext2d`\n         * New types: `CanvasGradient`, `CanvasPattern`, `CanvasStyle`, `ImageData`, `TextMetrics`\n      * New error types: `IndexSizeError`, `NotSupportedError`, `TypeError`\n   * `0.4`\n      * (breaking change) Removed `Array` and `Object` variants from `Value`; these are now treated as `Reference`s\n      * (breaking change) The `Value` has an extra variant: `Symbol`\n      * (breaking change) Removed:\n         * `InputElement::set_kind`\n         * `InputElement::files`\n      * (breaking change) Renamed:\n         * `KeydownEvent` -\u003e `KeyDownEvent`\n         * `KeyupEvent` -\u003e `KeyUpEvent`\n         * `KeypressEvent` -\u003e `KeyPressEvent`\n         * `ReadyState` -\u003e `FileReaderReadyState`\n         * `InputElement::value` -\u003e `InputElement::raw_value`\n         * `InputElement::set_value` -\u003e `InputElement::set_raw_value`\n      * (breaking change) `ArrayBuffer::new` now takes an `u64` argument\n      * (breaking change) `InputElement::set_raw_value` now takes `\u0026str` instead of `Into\u003c Value \u003e`\n      * (breaking change) Changed return types:\n         * Every method which returned `usize` now returns `u32`\n         * `INode::remove_child` now returns `Node` in the `Ok` case\n         * The following now return an `u64`:\n            * `ArrayBuffer::len`\n         * The following now return an `i32` instead of `f64`:\n            * `IMouseEvent::client_x`\n            * `IMouseEvent::client_y`\n            * `IMouseEvent::movement_x`\n            * `IMouseEvent::movement_y`\n            * `IMouseEvent::screen_x`\n            * `IMouseEvent::screen_y`\n         * The following now return a `Result`:\n            * `INode::insert_before`\n            * `INode::replace_child`\n            * `INode::clone_node`\n            * `StringMap::insert`\n            * `TokenList::add`\n            * `TokenList::remove`\n            * `Document::create_element`\n            * `IEventTarget::dispatch_event`\n            * `FileReader::read_as_text`\n            * `FileReader::read_as_array_buffer`\n            * `FileReader::read_as_text`\n            * `History::replace_state`\n            * `History::go`\n            * `History::back`\n            * `History::forward`\n            * `Location::href`\n            * `Location::hash`\n            * `CanvasElement::to_data_url`\n            * `CanvasElement::to_blob`\n            * `ArrayBuffer::new`\n        * `INode::base_uri` now returns a `String` instead of `Option\u003c String \u003e`\n        * `InputElement::raw_value` now returns a `String` instead of `Value`\n      * (breaking change) `INode::inner_text` was moved to `IHtmlElement::inner_text`\n      * (breaking change) `Document::query_selector` and `Document::query_selector_all` were moved to `IParentNode`\n      * (breaking change) `IElement::query_selector` and `IElement::query_selector_all` were moved to `IParentNode`\n      * (breaking change) `Document::get_element_by_id` was moved to `INonElementParentNode`\n      * (breaking change) A blanket impl for converting between arbitrary reference-like objects using\n        `TryFrom`/`TryInto` has been removed\n      * When building using a recent `cargo-web` it's not necessary to call\n        `stdweb::initialize` nor `stdweb::event_loop` anymore\n      * Support for `cdylib` crates on `wasm32-unknown-unknown`\n      * New bindings:\n         * `XmlHttpRequest`\n         * `WebSocket`\n         * `MutationObserver`\n         * `History`\n         * `TextAreaElement`\n         * `CanvasElement`\n      * New event types:\n         * `MouseDownEvent`\n         * `MouseUpEvent`\n         * `MouseMoveEvent`\n         * `PopStateEvent`\n         * `ResizeEvent`\n         * `ReadyStateChange`\n         * `SocketCloseEvent`\n         * `SocketErrorEvent`\n         * `SocketOpenEvent`\n         * `SocketMessageEvent`\n      * Initial support for the Canvas APIs\n      * New traits: `ReferenceType` and `InstanceOf`\n      * Add `#[derive(ReferenceType)]` in `stdweb-derive` crate; it's now possible\n        to define custom API bindings outside of `stdweb`\n      * Add `#[js_export]` procedural attribute (`wasm32-unknown-unknown` only)\n      * Add `DomException` and subtypes for passing around JavaScript exceptions\n      * `IElement` now inherits from `INode`\n      * Every interface now inherits from `ReferenceType`\n      * Add `stdweb::traits` module to act as a prelude for `use`-ing all of our interface traits\n      * Add `console!` macro\n      * Most types now implement `PartialEq` and `Eq`\n\n   * `0.3`\n      * (breaking change) Deleted `ErrorEvent` methods\n      * (breaking change) Renamed:\n         * `LoadEvent` -\u003e `ResourceLoadEvent`\n         * `AbortEvent` -\u003e `ResourceAbortEvent`\n         * `ErrorEvent` -\u003e `ResourceErrorEvent`\n      * Add `UnsafeTypedArray` for zero cost slice passing to `js!`\n      * Add `Once` for passing `FnOnce` closures to `js!`\n\n## License\n\nLicensed under either of\n\n  * Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)\n  * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)\n\nat your option.\n\nSnippets of documentation which come from [Mozilla Developer Network] are covered under the [CC-BY-SA, version 2.5] or later.\n\n[Mozilla Developer Network]: https://developer.mozilla.org/en-US/\n[CC-BY-SA, version 2.5]: https://developer.mozilla.org/en-US/docs/MDN/About#Copyrights_and_licenses\n\n### Contributing\n\nSee [CONTRIBUTING.md](https://github.com/koute/stdweb/blob/master/CONTRIBUTING.md)\n","funding_links":["https://www.patreon.com/koute"],"categories":["Rust","Libraries","Crates"],"sub_categories":["Web programming","Wasm"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkoute%2Fstdweb","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkoute%2Fstdweb","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkoute%2Fstdweb/lists"}