Replies: 3 comments
|
Verified against the latest master ( Source confirmation (rc.8 == rc.2, unfixed)
Family closure: #3520 (Node) + #3912 (browser) = one missing feature-detectIn #3520 I fingerprinted the Node side: Fix design (feature-detect + graceful degradation, ~6 lines)In const requestSignal = timeoutPolicy === 'default'
? signal === undefined
? AbortSignal.timeout(this.timeoutMs)
: typeof AbortSignal.any === 'function'
? AbortSignal.any([AbortSignal.timeout(this.timeoutMs), signal])
: signal // old browser: keep caller cancellation, drop the transport deadline
: signalNotes:
Your polyfill workaround is the right user-side stopgapInjection before the module graph loads is the correct interception point; the official fix (feature-detect) makes the polyfill unnecessary. Worth noting for maintainers: the two-ended family means a regression test should exercise the no- |
|
感谢!非常有用!公司电脑的chrome版本太低,也碰到这个问题了! |
|
Another data point, this time WebKit — and a stricter one: Safari ≤ 17.3 never reaches "connected" at all; the failure happens earlier than the Env: dsh New call site that kills the whole connection, not just message sending: async pumpEvents(signal, ready) {
const failed = new AbortController();
const generationSignal = AbortSignal.any([signal, failed.signal]); // ← throws on Safari <17.4, before the first WS frame
const source = this.openStream(REMOTE_EVENT_STREAM_ENDPOINT, REMOTE_EVENT_STREAM_PAYLOAD, generationSignal)On Safari 16.6 the generation throws before the Evidence: nginx byte-level logging showed every attempt from the iPad ≈ handshake-only upstream bytes, while a still-open tab running the older cached bundle (same device, pre-update build) held normal multi-minute connections with frames flowing — a natural A/B pinning it to the client bundle. A minimal WS probe through the same nginx proxy also passed on the device, exonerating network/TLS/proxy.
Extending the boot polyfill suggested above with (See also the community patch thread #1050.) |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Environment
AbortSignal.any); browser version unchanged during the whole perioddsh webon 127.0.0.1:3080Symptom
The Web UI loads and renders normally on the phone, but sending a chat message does nothing. Console shows:
A desktop browser with a recent Chrome works fine.
Root cause
@deepseek-ai/dsh-client-connection/lib/client.jscallsAbortSignal.any()/AbortSignal.timeout()without feature detection inpostJson()(the shared POST leg of the C→S RPC carrier).AbortSignal.anyrequires Chromium 116+ / Safari 17.4+, so on older mobile browsers/WebViews the very first RPC that carries a caller signal (i.e. sending a message) throws, breaking the chat composer while the rest of the UI keeps rendering. Passive calls without a caller signal only needAbortSignal.timeout(Chromium 103+), which is why browsing sessions still worked on the same browser.What I ruled out
AbortSignal.anyuses are either host-side Node code (dshmarketlib/gist.js) or guarded withtypeof AbortSignal.any == 'function'(dsh-genui's bundled three.js). None of their browser bundles call it unguarded.Remaining puzzle
On the same dsh version (0.1.0-rc.6) and the same phone browser, sending reportedly worked at first and broke later — possibly a stale cached frontend bundle masking the issue initially. Mentioning in case it hints at a second variable (bundle caching / service worker?).
Workaround (confirmed working)
Injecting a small polyfill for
AbortSignal.any/AbortSignal.timeoutbefore the module entry in the servedindex.htmlfully restores mobile use:Suggestion
Ship the polyfill at build time, or feature-detect and fall back, so older mobile browsers keep working.
All reactions