* Regression tests for the messaging mode on sendSms()
* Let sendSms() name the esm_class messaging mode
* Document the messaging mode option and the decision behind it
* Name the constants move for migrating consumers and share the refusal's value naming
* Cover the messaging-mode refusals through submitSms()
* Refuse transaction mode and a report under datagram mode on sendSms()
* Narrow the mode checker and name the default mode once
* Regression tests for aborting a send queued behind a full window
* Let a signal abort a send queued behind a full send window
* Log a queued send, tighten its regression tests and settle the decision record
* Take the send window's queue off an array so an abort cannot stall the loop
---------
Co-authored-by: Mikael Göransson <mikael.goransson@timewave.se>
* Regression tests for an onRequest hook on server()
* Compose the application's onRequest hook into server() past bind
* Document the server's onRequest hook and record the composition decision
* Pin that a re-bind and a pre-bind unbind never reach the hook, and that a non-function hook is refused at startup
* Keep every bind and all pre-bind traffic out of the application's hook
* Make the hook's published promises exact, and record the src layout deferral
* Trim the record to what the tests do not already forbid
* Pin that nothing answers a request whose hook failed
* Answer nothing for a request whose hook failed, on both surfaces alike
* State the hook's failure policy as it now behaves
* Name the request a failed handler left unanswered, and say what a wedged hook reports
* Regression tests for a body in message_payload and for data_sm
* Read a body from message_payload and accept data_sm
* Assert the fixed message_payload and data_sm behaviour against Jasmin
* Record the message_payload and data_sm fixes in the Jasmin findings
* Read an inbound data_sm as the direction it travelled, and export messageOctets
* Refuse a segment with the code its stand-in command defines
* Name the stand-in the refusal status is read from
* Regression tests for telling a refused PDU from a failed session
* Export PduRefusedError so a refusal can be told from a session failure
* Document telling a refused PDU from a session failure
* Share the malformed-PDU fixtures and pin that a dead stream is no refusal
* Say once what a refusal is, and why the header type is published
* Fold the refused-response test into the one that already staged it
* Drop the refusal-rate claim the interop finding does not support
* Build a raw PDU one way, sequence number included
* Follow PduRefusedError into pdu-refusal.ts
* Regression tests for a client that retries its first connect and bind
* Retry the first connect and bind on reconnect: { fromStart: true }
* Pin that the signal bounding the first bind also closes the session
* Name a failed connect once, default the backoff where it lives, and fix the deadline advice
* Carry the failure that started the retries on the abort that ends them
* Pin one retry announcement per attempt when a link drops mid-bind
* Announce a retry when its wait is over, not when it is scheduled
* Say what the process-hold assertion expects, not what a failure would mean
A framing or codec error tears the link down rather than the session, so
the loop retries it on a fresh socket with a fresh framer — which is what
a desynced stream needs. Removing that reset failed nothing before; the
reconnect test now leaves half a PDU on the dying link, and does.
`disconnected` counts failed links rather than outages, which the README
now says, and the transport wires its socket as it is built.
Ending a session while the link was down emitted nothing: the retried
drop had already torn it down, so close() found nothing left to do. The
terminal event is now guarded by its own flag rather than by `closed`.
The socket, the framer and the parse move to PduTransport, which is what
takes session.ts back under its line cap; `session.sock` reads through a
getter. The backoff also refuses an inverted pair and an unknown key.
`close` fires only where nothing will bring the session back; a drop the
reconnect loop will retry is `disconnected`, pairing with `reconnected`.
`minDelay: 0` never doubles, so the backoff never started — both delays
are range-checked now, and only `false` spells reconnect off.