Skip to content

0.23.0

Latest

Choose a tag to compare

@dmotz dmotz released this 23 Mar 17:53
· 2 commits to main since this release

This version marks Trystero's biggest update since initial release. The internals have been completely rewritten with minimal changes to the public API. You'll find faster, more robust peering thanks to connection sharing and offer recycling behind the scenes. The test suite has been expanded and hardened and now tests server-side use too. Trystero also has a new public face at trystero.dev.

User-facing changes

  • Trystero is now split into scoped packages: @trystero-p2p/{nostr,mqtt,torrent,supabase,firebase,ipfs} plus @trystero-p2p/core. The root trystero package still defaults to Nostr.
  • trystero/<strategy> imports are now deprecated compatibility entry points; migrate to @trystero-p2p/<strategy> for non-default strategies.
  • joinRoom(config, roomId, onJoinError) is now joinRoom(config, roomId, callbacks). onJoinError moved to callbacks.onJoinError, and Nostr/Torrent’s old relay-reconnection flag moved into config.manualRelayReconnection.
  • joinRoom() gained a new admission-handshake layer via onPeerHandshake(peerId, send, receive, isInitiator) and handshakeTimeoutMs, so apps can accept or reject peers before they become visible to getPeers(), onPeerJoin(), actions, or media callbacks. You can use this to implement your own custom identity layer with crypto keys.
  • trickleIce is now a public config option and speeds up initial connections. Most strategies default to trickle ICE, while Torrent and IPFS keep it off unless explicitly enabled.
  • @trystero-p2p/core now exposes createStrategy and shared types/utilities, making custom signaling strategies a supported extension point. You can use this to run a signaling relay for Trystero on any software you want. The readme shows a basic example using a simple WebSocket server.
  • Media and event ergonomics improved: replaceTrack() can now send metadata, onPeerJoin() immediately replays already-active peers to late listeners, and the action name limit increased from 12 bytes to 32 bytes.
  • Firebase’s getOccupants() helper was removed. This was only used by a single strategy and removing it helps keep the API surface small. You can still replicate its functionality with the Firebase API directly.
  • Server-side use is now a more explicit part of the public surface: rtcPolyfill is documented/tested, and a recommended polyfill library endorsement for werift.

Performance and reliability notes

  • Peer connection reuse is the biggest runtime change: when the same remote peer appears in multiple rooms, Trystero now reuses a shared underlying RTCPeerConnection instead of renegotiating per room.
    Offer pooling/reuse was overhauled, especially for tracker-style signaling, so old offers can be reclaimed and recycled instead of constantly allocating fresh peer connections.
  • Large and binary sends are more resilient under backpressure, with fixes for stalled sends and related data-channel hangs.
  • Relay robustness new public relay lists and better handling of repeated pings/timeouts, which should reduce churn and improve matchmaking stability.

Please share feedback, ideas, and of course, what you build with Trystero, via GitHub discussions/issues. Go forth and build a decentralized web. 🤝