v2.3.5-beta
Wasabi v2.3.5‑beta
Agnostic compression, hardened MQTT 5, and a fully modular engine — all inside the same zero‑dependency .bas file.
This release solidifies the architectural foundations that were already running under the hood. No breaking APIs; every existing project will work exactly as before. What has changed is that the internal boundaries between transport, protocol, compression, and middleware are now officially stable and ready to be used by extension authors.
Engine Architecture: Dumb Pipe + Pluggable Everything
The core TCP / TLS / Schannel machinery ("the Dumb Pipe") is now completely decoupled from high‑level logic. Three injection points are formally exposed and documented:
WasabiUseProtocol— intercept parsed WebSocket messages (text and binary) directly, bypassing the internal queue.WasabiUseMiddleware— intercept raw byte arrays before framing (send) and after deframing (receive); multiple middlewares can be chained.WasabiUseCompression— replace or provide the compression algorithm; the engine no longer assumes any particular library.
This transforms Wasabi from a monolithic WebSocket client into a networking framework that can host custom protocols, encryption layers, and alternative compressors.
Compression Is Now Truly Optional (and Pluggable)
The previous documentation incorrectly suggested zlib1.dll was a required dependency for permessage‑deflate. In reality, the engine has always used an internal CompressionHandler interface (Inversion of Control). The built‑in deflate path is now an official extension (ExtWasabiZlib.cls) that can be swapped for LZ4, Brotli, Zstandard, or an identity pass‑through.
- The core
.basfile has zero mandatory external dependencies — exactly as designed. - If you never register a compression handler, absolutely nothing is linked or loaded.
MQTT 5.0 Support Hardened
The MQTT client now formally supports features that were already partially active in previous releases:
- User Properties:
MqttPublishacceptsmetaKey/metaValue(property identifier0x26), which are forwarded to MQTT 5 brokers. - Reason Codes & Metadata:
MqttReceiveparses and surfaces Reason Codes and optional diagnostic strings from CONNACK and DISCONNECT packets. - The internal parser correctly decodes MQTT 5 variable‑length property blocks, allowing future extension without breaking changes.
ASM Thunks & Zero‑Copy: Same Brutal Performance
The machine‑code engine (x86 / x64) that was introduced in v2.3.3 and validated in v2.3.4 remains untouched. It still drives:
ws_mask(XOR masking at C‑speed)mem_zero(hardware‑backed buffer wiping)mem_find(instant delimiter scan forTcpReceiveUntil)tick_diff(overflow‑safe tick arithmetic)
Internal Refinements (No User‑Visible Changes)
- The compression and protocol handler slots are now always initialised; calling
WasabiUseCompressionon a handle that was connected without deflate will simply leave the slot empty. - Error propagation wrapped in registered extensions is clarified: extensions must manage their own errors — the engine does not intercept exceptions thrown by middleware or protocol handlers.
CleanupHandlehas been reviewed to guarantee that extensionOnDisconnectcallbacks fire before the underlying socket is closed.