-
-
Notifications
You must be signed in to change notification settings - Fork 23
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
feat: packet handling functions #771
base: main
Are you sure you want to change the base?
Conversation
// transmute to bypass lifetime issue with Decode | ||
// packet is dropped at end of scope and references in handlers are locked to the scope of the handler | ||
let mut bytes = unsafe { std::mem::transmute(bytes) }; | ||
let mut packet = P::decode(&mut bytes)?; | ||
// packet is always non-null, swap to NonNull::from_mut after stabilization | ||
let ptr = unsafe { NonNull::new_unchecked(&mut packet).cast::<u8>() }; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This creates an unsafe situation where handlers receive a pointer to packet
which is dropped when it goes out of scope, while the handlers may still try to access it. This leads to undefined behavior. Consider using Arc<P>
to safely share ownership of the packet data between handlers, ensuring the data remains valid for the duration of handler execution. The transmute can also be avoided by properly handling lifetimes through Arc
.
Spotted by Graphite Reviewer
Is this helpful? React 👍 or 👎 to let us know.
I think it makes a lot of sense to have the ability to add handlers for any packets. Why is this useful? There are a couple of reasons. First, we want people to have as much access as possible, as close to the server as possible. If we’re creating events that rely on ingress packets but aren't 1:1 (lose some information), it restricts the ability of the engine.
Examples where handlers could be nice:
Potential global handler on top of specific handlers
I believe it could be viable to also have single handler for every packet that implements serialization—or to mandate that all packets implement serialization. Packets already implement encode and decode in the current code, so this approach would be quite natural. As the project evolves, we might want to revisit how events are handled. Perhaps providing no default events and implementing them as standalone modules would be more efficient. We could refactor the event system in the server and assign a dedicated handler for each function.
Events and lifetimes
As part of this refactoring, ensuring events are handled safely is critical. Currently, the code converts bytes to a 'static lifetime, but ideally, the handler should use bytes with a lifetime 'a, and the event sender should also produce events tied to 'a rather than 'static. This may require some changes to how decode and encode traits are defined in Valence, but I’m open to adjustments if they align with the broader design goals. Thank you.