@johnhenry/wsh 0.23.0 → 0.23.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/package.json +1 -1
- package/src/qmux-connection.mjs +6 -0
package/README.md
CHANGED
|
@@ -543,7 +543,7 @@ the host to find it:
|
|
|
543
543
|
| Current stock client | `@johnhenry/wsh/server` (advertises `stream-announce`) | The client's transport announces the stream with an empty STREAM frame. **No primer is written.** |
|
|
544
544
|
| Current stock client | Host without `stream-announce` (e.g. the Rust `wsh-server`, older vendored hosts) | The client writes a one-byte primer (`0x00`) on the new stream so the host sees it; that host strips it. `primer: false` disables this (then such a host never binds the stream and the output is lost). |
|
|
545
545
|
| A client that primes anyway (older stock client, `primer` forced, other implementations) | `@johnhenry/wsh/server` | **The leading `0x00` is dropped:** if the first data on an exec stream is exactly one `0x00` byte it is discarded, never forwarded to the process's stdin. Only that first chunk is inspected; a later `0x00`, or a first chunk that is longer than one byte, is delivered untouched. The cost: a client whose genuine first stdin chunk is a lone NUL loses it. |
|
|
546
|
-
| A client that neither announces nor primes | `@johnhenry/wsh/server` | The host waits `bindTimeoutMs` (default 3000) for the stream, then drops the output and logs it. |
|
|
546
|
+
| A client that neither announces nor primes (a third-party QMux client; the stock client always does one or the other) | `@johnhenry/wsh/server` | The host waits `bindTimeoutMs` (default 3000) for the stream, then drops the output and logs it. This cannot be fixed host-side: nothing about the stream has been sent, so there is nothing to bind. Such a client must send `QMuxStream.announce()` (an empty STREAM frame) or any first write -- a zero-length `write()` now does the same. |
|
|
547
547
|
|
|
548
548
|
## Attach and Resume
|
|
549
549
|
|
package/package.json
CHANGED
package/src/qmux-connection.mjs
CHANGED
|
@@ -116,6 +116,12 @@ class QMuxStream {
|
|
|
116
116
|
if (this.#sendState === SEND_STATE.DATA_SENT) {
|
|
117
117
|
throw new Error(`Cannot write to stream ${this.id}: already closed (FIN sent)`);
|
|
118
118
|
}
|
|
119
|
+
if (bytes.byteLength === 0) {
|
|
120
|
+
// Nothing to send, but a first write is still the caller saying "this
|
|
121
|
+
// stream exists": announce it (a no-op once anything has been sent).
|
|
122
|
+
this.announce();
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
119
125
|
this.#sendState = SEND_STATE.SEND;
|
|
120
126
|
|
|
121
127
|
let offset = 0;
|