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
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
lilleman
35dd1e7678
Count every request that went out unanswered, and gate a send on a bound link
2026-09-01 10:08:56 +02:00
lilleman
8d9656b4e0
Hold a send with no link for the next one, and count the rest as unanswered
2026-09-01 08:02:37 +02:00
lilleman
b1c790b9a0
Retry a stream we cannot read, and cover the framer reset on attach
...
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.
2026-08-31 22:27:16 +02:00
lilleman
b2d121b4f3
Emit exactly one close, and read the socket through a PduTransport
...
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.
2026-08-31 21:53:11 +02:00
lilleman
880454b4f4
Split a retried drop out of close, and range-check the backoff
...
`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.
2026-08-31 21:11:19 +02:00
lilleman
706b61d6ca
Leave an unknown notation alone and read a receipt's TLV as the id the submit answered
2026-08-30 23:01:39 +02:00
lilleman
696e018b77
Derive the notation names from one table and refuse an smsIdFormat that is not the pair
2026-08-30 22:45:02 +02:00
lilleman
8e5b9bb556
Read a peer's submit and receipt message ids into one notation before comparing them
2026-08-30 22:35:09 +02:00
lilleman
fa720e244a
Drop the line count that drifts and reuse the delay helper
2026-08-30 21:09:19 +02:00
lilleman
7e8af3c308
Tear down at once on a peer unbind and stop reporting a reconnect after close
2026-08-30 21:01:46 +02:00
lilleman
66b7d90bbf
Let onClose end the session through the same path as every other close
2026-08-30 20:30:40 +02:00
lilleman
5c618e0061
Stop accepting before the drain and report the link that dropped during it
2026-08-30 20:27:38 +02:00
lilleman
bebd74b42b
Drain the requests already on the wire before close() and unbind() tear down
2026-08-30 20:08:36 +02:00
lilleman
8a71dbbc87
Drop the arrangement comment and record the review's DlrMerger findings
2026-08-28 15:09:47 +02:00
lilleman
f4e55909a1
Keep the delivery-receipt merges across a reconnect instead of dropping them
2026-08-28 14:44:32 +02:00
lilleman
344249b080
Accept an async listener in the types and normalise any rejection reason
2026-08-27 23:07:48 +02:00
lilleman
a5fe43d7a9
Normalise a listener's rejection reason before routing it to sessionError
2026-08-27 22:41:26 +02:00
lilleman
0e8f298957
Route a rejecting async listener to sessionError instead of the process
2026-08-27 22:22:51 +02:00
lilleman
366fa26b1c
Enforce bind direction, cap segments per message and pin the README examples
2026-08-27 14:07:42 +02:00
lilleman
8d245c82c4
Declare the logger contract in the library instead of depending on @larvit/log
2026-08-27 13:42:58 +02:00
lilleman
ff3667e120
Reject a renumbered multipart total and check abort before the send window
2026-08-27 12:43:17 +02:00
lilleman
8a182604b7
Address the CodeRabbit review: inbound SMS, binary payloads and untrusted input
2026-08-27 11:52:43 +02:00
lilleman
884afdb87b
Stop a thrown listener escaping, bound what a peer can pin, and drop the body from failure responses
2026-08-27 10:55:34 +02:00
lilleman
5af75a3c57
Close the stability findings and settle the sendResp, sendSms and unbind contracts
2026-08-27 00:17:48 +02:00
lilleman
435fa42708
Decompose the codec, document the session surface and record the review decisions
2026-08-26 22:59:39 +02:00
lilleman
6d842a8539
Split the session, gate optional parameters on the peer version, own the SMPP version in defs
2026-08-26 22:41:28 +02:00
lilleman
b671ebafb2
Fix merged DLR counting and close event, cover reconnect and reassembly
2026-08-25 16:58:13 +02:00
lilleman
fd2f98464f
Add session, client and server with the promise result API
2026-08-25 16:46:32 +02:00