Skip to content

Web Worker library #18

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
fitzgen opened this issue Feb 26, 2019 · 4 comments
Closed

Web Worker library #18

fitzgen opened this issue Feb 26, 2019 · 4 comments

Comments

@fitzgen
Copy link
Member

fitzgen commented Feb 26, 2019

  • Spawning web workers
  • Communicating via postMessage

(Note: this is for when we are not using shared memory and multithreading)

@Pauan
Copy link
Contributor

Pauan commented Mar 13, 2019

this is for when we are not using shared memory and multithreading

Why not both?

@fitzgen
Copy link
Member Author

fitzgen commented Mar 15, 2019

Why not both?

Ah, yeah it is true that it could work in either situation. I expect that using a custom channel based on shared memory will be much faster than postMessage when multithreading is available but there is no technical reason why you couldn't still use postMessage. Although, the receiver thread would have to return the to event loop to be woken up by the postMessage...

@ranile
Copy link
Collaborator

ranile commented Jul 7, 2021

I think basic the implementation would like this:

struct Worker<T> {
     raw: web_sys::Worker
     _data: PhantomData<T> 
};

impl<T> Worker {
    fn new(path: impl AsRef<str>) -> Self {
        let worker = web_sys::Worker::new(path)
        Self { worker, _data: PhantomData }
    }

    fn split(self) -> (Sender<T>, Reciever<T>) { ... }
}

impl<T> Stream for Worker<T> { ...  }

impl<T> Sink for Worker<T> { ...  }

This would of course be based on futures. Once this basic implementation is in place, all the bells and whistles (if needed) could be added later.

ranile pushed a commit that referenced this issue Feb 15, 2022
* Change edition from 2021 to 2018

* Fix missing import due to edition 2021 prelude
@ranile
Copy link
Collaborator

ranile commented Feb 15, 2022

Done in #180

@ranile ranile closed this as completed Feb 15, 2022
ranile added a commit that referenced this issue Feb 16, 2022
* Initial commit

* provide a better interface for errors, rename `RequestMethod` to `Method`

* remove method for array buffer and blob in favor of as_raw

* prepare for release

* add CI, update readme

* hide JsError in the docs

* fix CI?

* Install wasm-pack in CI

* misc

* websocket API

Fixes: ranile/reqwasm#1

* add tests for websocket

* update documentation, prepare for release

* fix mistake in documentation

* Rewrite WebSockets code (#4)

* redo websockets

* docs + tests

* remove gloo-console

* fix CI

* Add getters for the underlying WebSocket fields

* better API

* better API part 2 electric boogaloo

* deserialize Blob to Vec<u8> (#9)

* Update to Rust 2021 and use JsError from gloo-utils (#10)

* Update to Rust 2021 and use JsError from gloo-utils

* use new toolchain

* Add response.binary method to obtain response as Vec<u8>

Fixes: ranile/reqwasm#7

* Remove `Clone` impl from WebSocket.

When the WebSocket is used with frameworks, passed down as props, it might be `drop`ed automatically, which closes the WebSocket connection. Initially `Clone` was added so sender and receiver can be in different `spawn_local`s but it turns out that `StreamExt::split` solves that problem very well.

See #13 for more information about the issue

* Rustfmt + ignore editor config files

* Fix onclose handling (#14)

* feat: feature gate json, websocket and http; enable them by default (#16)

* feat: feature gate json support

* feat: feature gate weboscket api

* ci: check websocket and json features seperately in CI, check no default features

* feat: feature gate the http API

* refactor: use futures-core and futures-sink instead of depending on whole of futures

* ci: test http feature seperately in CI

* fix: only compile error conversion funcs if either APIs are enabled

* fix: add futures to dev-deps for tests, fix doc test

* 0.3.0

* Fix outdated/missing docs

* 0.3.1

* Change edition from 2021 to 2018 (#18)

* Change edition from 2021 to 2018

* Fix missing import due to edition 2021 prelude

* hopefully this will fix the issue (#19)

* There's no message

* Replace `async-broadcast` with `futures-channel::mpsc` (#21)

We no longer need a multi-producer-multi-consumer channel. There's only one consumer as of ranile/reqwasm@445e9a5

* Release 0.4.0

* Fix message ordering not being preserved (#29)

The websocket specification guarantees that messages are received in the
same order they are sent. The implementation in this library can violate
this guarantee because messages are parsed in a spawn_local block before
being sent over the channel. When multiple messages are received before
the next executor tick the scheduling order of the futures is
unspecified.
We fix this by performing all operations synchronously. The only part
where async is needed is the conversion of Blob to ArrayBuffer which we
obsolete by setting the websocket to always receive binary data as
ArrayBuffer.

* 0.4.1

* move files for gloo merge

* remove licence files

* gloo-specific patches

* fix CI

* re-export net from gloo

Co-authored-by: Michael Hueschen <[email protected]>
Co-authored-by: Stepan Henek <[email protected]>
Co-authored-by: Yusuf Bera Ertan <[email protected]>
Co-authored-by: Luke Chu <[email protected]>
Co-authored-by: Valentin <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants