johanhelsing / matchbox

Painless peer-to-peer WebRTC networking for rust wasm (and native!)
Apache License 2.0
911 stars 75 forks source link

Handle binary data #106

Open simbleau opened 1 year ago

simbleau commented 1 year ago

Currently there's no handler for binary data, but it could be added quite trivially with bincode. I think this is an easy-win.

https://github.com/johanhelsing/matchbox/blob/c9d10cbab8b29eafa81422ec4784e1ea84b10dac/matchbox_socket/src/webrtc_socket/native/signalling_loop.rs#L42

johanhelsing commented 1 year ago

Yeah, agree. I also thought I'd look into using msgpack.

This is my (very rough impression, and perhaps also wrong (?), list of pros and cons).

json

Pros

cons

bincode

Pros

Cons

msgpack

Pros

Cons

garryod commented 1 year ago

It may be worth either having a set of pick-one-of feature flags for serialisation (e..g., 'json', 'bincode' or 'msgpack') or operating a bring your own serialiser model and supplying a few common ones. The trade off between serialisation speed, serialisation speed & message size is going to depend on the network topology and data size, whilst json may be nice for debugging

johanhelsing commented 1 year ago

Yes, assuming it won't add too much complexity, I think feature flags would be a good idea.

One downside is that you now have to take care that the server and peers is configured in a compatible way (i.e. potential footgun if you only configure the socket side), or have the server support multiple formats (more bloated protocol and implementation). We should at least take care that we produce some meaningful error that will put people on the right track.

Perhaps it would make sense to default to msgpack in the cli and socket, and then leave the other formats as feature flags for more advanced users?

Also, I think I like the bring-your-own serializer idea, as long as we can keep it optional for less advanced users... So I guess we could probably do both? A default-signalling-msgpack feature flag enabled by default?

simbleau commented 1 year ago

re: binary data -

https://github.com/bincode-org/bincode/issues/629#issuecomment-1490857437

Seems like bincode is wasm compat.

Does that make it the top contender?

Also, re "need to make sure client and server is using the same version of bincode" - i'm not sure that's an issue? Since we have the same problem for serde_json. I'd assume matching those versions is up to the user and how they want their clients to update.

garryod commented 1 year ago

Seems like a solid contender, though kind of wondering if this is premature optimisation, how much does serialising to json cost us when it's just for signalling?

simbleau commented 1 year ago

I guess it's a good topic to discuses. Do we want to do this at all?

I am fine with closing this as a "won't do." or as a very low priority task to eventually do.

garryod commented 1 year ago

Feel like we should first write some benchmarks? And see what we determine from there. I've noticed that establishing a connection can take quite a while on Wasm, but don't know why

simbleau commented 1 year ago

Noticed that too, but I figured that was just JavaScript being JavaScript.

johanhelsing commented 1 year ago

iirc, even though we implement ice trickle, there is a theoretically unnecessary wait for ice completion in there. However, in practice nat hole punching doesn't work if we remove it. I'm not sure what that's about, though.

Made an issue to track it: #192

johanhelsing commented 1 year ago

re: binary data -

bincode-org/bincode#629 (comment)

Seems like bincode is wasm compat.

Does that make it the top contender?

Also, re "need to make sure client and server is using the same version of bincode" - i'm not sure that's an issue? Since we have the same problem for serde_json. I'd assume matching those versions is up to the user and how they want their clients to update.

Not the same thing i think. Json will always be json, so it doesn't matter if the client is on another version or not, could even be another language. Unless I'm misunderstanding something.

Bincode needs to be on the same major version and "use the same configuration" or you might not be able to deserialize. Not sure what configuration means exactly. See faq in bincode readme.