Commit Graph

110 Commits

Author SHA1 Message Date
lilleman db02f0058d Tell a refused PDU apart from a session that failed (#82)
* 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
2026-09-05 23:16:59 +02:00
lilleman afe188eecd Retry the first connect and bind on reconnect fromStart (#80)
* 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
2026-09-05 22:47:06 +02:00
lilleman 45d2f5548e Read a delivery receipt's body as the octets that arrived (#81)
* Regression tests for a receipt body read under a data_coding it is not written in

* Read a delivery receipt's body as the octets that arrived, not by its data_coding

* Assert SMPPSim's UCS2 receipt body parses like every other segment's

* Record the receipt-body defect as fixed

* Retain a multipart segment's octets once, not twice

* Sort the new type import into its file's order
2026-09-05 22:37:05 +02:00
lilleman ea42bc6d20 Refuse a single unreadable PDU instead of the whole link (#79)
* Regression tests: a PDU the codec cannot read costs that PDU, not the link

* Refuse a single unreadable PDU instead of the whole link

* smscsim interop asserts the first attempt gets every DLR

* Record the smscsim sequence number defect as fixed

* One framing rule and one response-command lookup, per the architecture review

* Apply the stability review's nits: honest sessionError docs and one link-survives assertion
2026-09-05 21:00:52 +02:00
lilleman fec4fda082 Run SMPPSim 2.6.11 as the SMSC with nine fault-injection variants: 25 scenarios pass, two defects recorded 2026-09-05 20:08:39 +02:00
lilleman 05ea90afeb Run Kannel 1.4.5 as the ESME against our server: 21 scenarios pass, no defects found 2026-09-05 20:03:58 +02:00
lilleman 9c4939f5cf Fix every defect a phase finds before the next phase runs 2026-09-05 18:48:57 +02:00
lilleman 1723a0381c Add the interoperability harness and the smscsim experiment, which confirms the one-bad-PDU link drop 2026-09-05 18:40:56 +02:00
lilleman 7d855cfa5d Set the conventions the interoperability experiments run and record under 2026-09-05 17:53:33 +02:00
lilleman 8a565cf557 Plan the interoperability tests against real-world SMPP peers before 1.0.0 2026-09-05 17:31:02 +02:00
lilleman 9ca83ac05c Order the README by what a first read needs, and drop the pre-release notice 2026-09-04 11:59:05 +02:00
lilleman 2e422c7584 Contain a throw from the application's logger instead of letting it escape 2026-09-04 11:33:20 +02:00
lilleman 80530c6265 Ignore a delivery receipt for a part the send never registered 2026-09-04 11:33:17 +02:00
lilleman 8c46e925a1 Record the branch renames: master to v0.4.0, typescript to main as default 2026-09-04 11:16:54 +02:00
lilleman 4d91240e62 Merge pull request #78 from larvit/intermediate-delivery-reports
Read an intermediate delivery notification as a report, and keep it out of the merge
2026-09-04 10:47:50 +02:00
lilleman 8717cedfb6 Merge pull request #76 from larvit/hold-until-answered
Release a message's hold when the response goes out, or when its listener failed
2026-09-04 10:43:44 +02:00
lilleman 144567c294 Claim an error only where the state failed, and freeze the two state lists 2026-09-04 08:51:13 +02:00
lilleman 54493c12b2 Write a transient state as an intermediate delivery notification 2026-09-04 08:38:29 +02:00
lilleman 2936c7060d Justify the state test by what peers write, not by what this library happens to write 2026-09-03 21:17:39 +02:00
lilleman e28b219a4f Record that message_state 0 is read as the transient state 5.0 names it 2026-09-03 21:05:40 +02:00
lilleman fa40bb486c Re-wrap the decision paragraphs and cut the narration from the finality record 2026-09-03 19:39:53 +02:00
lilleman 42e6e97447 Read a receipt reporting a transient state as non-final too, so the merge waits for the real one 2026-09-03 19:28:08 +02:00
lilleman dd458bfa53 Say only what the SMSC marked, and trim the comments the review found redundant 2026-09-03 19:16:13 +02:00
lilleman 50679ec2fe Read an intermediate delivery notification as a report, and keep it out of the merge 2026-09-03 17:30:09 +02:00
lilleman 94184a9c63 Re-wrap the shutdown paragraph and leave the throw-versus-rejection note in one place 2026-09-02 12:40:51 +02:00
lilleman 0d30864886 Say in goal 7 that the scope floor covers the seam too, and decline merge-state persistence 2026-09-02 12:36:06 +02:00
lilleman 3eeb0b82c0 Give a message up only once every listener has, and only count a response the wire took 2026-09-02 12:36:01 +02:00
lilleman 3aadb64df8 Release a message's hold when the response goes out, or when its listener failed 2026-09-02 08:15:26 +02:00
lilleman 6cb186d38a Merge pull request #75 from larvit/receipt-field-separators
Separate a receipt's fields on any whitespace, not only a space
2026-09-01 22:15:04 +02:00
lilleman 66fac3768d Merge remote-tracking branch 'origin/typescript' into receipt-field-separators 2026-09-01 22:14:00 +02:00
lilleman 8de65fd0e4 Merge pull request #74 from larvit/answer-without-a-link
Refuse to answer a message whose link went, instead of reporting it delivered
2026-09-01 22:13:37 +02:00
lilleman f10c8e58cb Read a valueless count as unstated, and pin a CRLF receipt end to end
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Csos3Vfm66NrAywQUe3e4V
2026-09-01 21:48:07 +02:00
lilleman 0fd6da1542 Separate a receipt's fields on any whitespace, not only a space
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Csos3Vfm66NrAywQUe3e4V
2026-09-01 21:37:19 +02:00
lilleman 471923a7b6 Log the dropped request, and scope the receipt sentence to a reconnect 2026-09-01 20:53:58 +02:00
lilleman e6250ef44e Drop a request whose link went while onRequest ran, and pin the wire in the test 2026-09-01 20:40:17 +02:00
lilleman c8d265d5fa Tie the refusal to the link, not to the hold, so a released message is refused too 2026-09-01 20:25:57 +02:00
lilleman 82a95593bd Refuse to answer a message whose link went, instead of reporting it delivered 2026-09-01 19:20:06 +02:00
lilleman a91c55cc64 Merge pull request #72 from larvit/sms-id-format
Read a peer's submit and receipt message ids into one notation before comparing them
2026-09-01 18:20:09 +02:00
lilleman 8a8d6faccf Merge pull request #73 from larvit/reconnect-by-default
Re-bind a dropped client link by default, and hold the sends it could not carry
2026-09-01 18:19:19 +02:00
lilleman f0327044b1 Cover the receipt refusal and the sweep that wakes a drain 2026-09-01 18:13:35 +02:00
lilleman 042a62be97 Sweep held messages before each hold, so expiry needs no live timer 2026-09-01 18:02:15 +02:00
lilleman 61985fb914 Say what a peer did with each receipt segment, and leave no drop unlogged 2026-09-01 17:59:37 +02:00
lilleman 67c0402def Bound the messages held for a shutdown, and report a partial receipt 2026-09-01 17:42:22 +02:00
lilleman 1e7e113bd7 Put a receipt's segments on the wire together, like a message's 2026-09-01 17:03:33 +02:00
lilleman 8becbc0ab6 Give the gate, the window and the pending map one owner 2026-09-01 16:52:15 +02:00
lilleman 3bcea108e3 Wait out the messages the application holds before shutting a session down 2026-09-01 13:58:28 +02:00
lilleman a99e1227ac Give the project ordered goals and let them decide what a decision record is 2026-09-01 12:21:58 +02:00
lilleman 2fe36fa4e8 Say once why the hold timer is not unref'd 2026-09-01 10:48:20 +02:00
lilleman 2c0dfd172f Keep the process alive while a send waits for a link 2026-09-01 10:38:16 +02:00
lilleman 58817eebbf Loop a held send on the gate's own answer, not on the socket too 2026-09-01 10:15:07 +02:00