* feat: native MTProto TCP fallback and CF-proxy domains, after Flowseal/tg-ws-proxy; 2.0.0-beta.17
Two routes Flowseal/tg-ws-proxy has and TGLock lacked.
Native TCP fallback. When every WebSocket route for a DC fails, TGLock now
tries plain obfuscated2 MTProto to the DC's primary address, which the
CDN203 route already used. Measured from a Russian ISP: TLS to .51, .91,
.50, .100 and .5 was cut, while native TCP to each answered req_pq_multi,
for main and media DCs alike. 149.154.167.220 is a WebSocket frontend only
and gets no TCP route. TCP opens before Telegram answers, so it is raced
only after all other routes failed; it can never displace a slower working
WebSocket. Raw TCP stays restricted to the pinned Telegram addresses.
CF proxy. A user's own Cloudflare domain with kws1..kws5/kws203 records
pointing at Telegram proxies the WebSocket without a Worker or its limits
(--cf-proxy, cf_proxy in tglock.toml, a GUI field; docs/CF_PROXY.md).
GUI settings now deserialize with serde(default): a file written before a
field existed used to fail to parse and silently reset to defaults.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* style: cargo fmt
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: babin <Thartewerner536e@engineer.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* worker: set binaryType = "arraybuffer" to fix 1003 "binary messages required"
Since compatibility date 2026-03-17 Cloudflare delivers binary WebSocket messages as Blob (websocket_standard_binary_type). The message handler accepts only ArrayBuffer and closes every tunnel with 1003. Setting binaryType before accept() restores ArrayBuffer delivery regardless of the compatibility date.
* fix(worker): accept Blob frames and name an outdated Worker in the log; 2.0.0-beta.16
Since compatibility date 2026-03-17 Cloudflare delivers binary WebSocket
frames as Blob unless binaryType is "arraybuffer", and the Worker closed
every tunnel with 1003 right after the handshake. wrangler.toml itself pins
2026-09-19, so every fresh deployment was broken (#58, #50, #53).
On top of #61 (binaryType before accept) the Worker now also relays Blob
frames in order, and the client log tells the user to redeploy the script
when a Worker closes with "1003 binary messages required".
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Dmitry Sankevich <16187308+avost@users.noreply.github.com>
Co-authored-by: babin <Thartewerner536e@engineer.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
* fix: address routing, media, worker and platform issues
* ci: use available Android tools and verify Windows CLI artifact
* fix(gui): return a result from asynchronous stop command
* test(android): verify installed APK and proxy lifecycle on emulator
* fix(media): use native MTProto for CDN203 and retain recent diagnostics
* Fix owned WebSocket split after transport boxing
* Clarify CDN transport and connection status guarantees
* Recognize accessible Android power button labels
* chore(release): prepare 2.0.0-beta.15 with verified draft publication
---------
Co-authored-by: babin <Thartewerner536e@engineer.com>