lilleman
36d32591c3
Plan 0.6.0 as the quality cut the comprehension panel and architecture review ask for
Test / lint (pull_request) Successful in 22s
Test / test (18) (pull_request) Successful in 30s
Test / test (20) (pull_request) Successful in 29s
Test / test (22) (pull_request) Successful in 30s
Test / test (24) (pull_request) Successful in 29s
Test / test (26) (pull_request) Successful in 30s
Mirror / push (push) Has been cancelled
2026-09-20 22:42:07 +02:00
lilleman
45171c2697
Bound the wait in the default test, and pin the boolean a refusal prints
Mirror / push (push) Successful in 4s
Test / lint (pull_request) Successful in 21s
Test / test (18) (pull_request) Failing after 18s
Test / test (20) (pull_request) Successful in 22s
Test / test (22) (pull_request) Successful in 19s
Test / test (24) (pull_request) Successful in 19s
Test / test (26) (pull_request) Successful in 19s
2026-09-20 20:46:45 +02:00
lilleman
a24f350b7a
Prove the default bound is wired, and name the option on the failure a consumer reads
Mirror / push (push) Successful in 4s
Test / lint (pull_request) Successful in 22s
Test / test (18) (pull_request) Failing after 19s
Test / test (20) (pull_request) Successful in 19s
Test / test (22) (pull_request) Successful in 24s
Test / test (24) (pull_request) Successful in 20s
Test / test (26) (pull_request) Successful in 19s
2026-09-20 20:41:45 +02:00
lilleman
1416615ca3
Bound every connect attempt at 10 s by default, with false the way to opt out
Mirror / push (push) Successful in 5s
Test / lint (pull_request) Successful in 21s
Test / test (18) (pull_request) Successful in 19s
Test / test (20) (pull_request) Successful in 19s
Test / test (22) (pull_request) Successful in 19s
Test / test (24) (pull_request) Successful in 20s
Test / test (26) (pull_request) Successful in 19s
2026-09-20 20:34:53 +02:00
lilleman
8f416c2bc4
Name the peer and the stalled phase on a connect timeout, and quote an untyped value
Mirror / push (push) Successful in 5s
Test / lint (pull_request) Successful in 21s
Test / test (18) (pull_request) Successful in 19s
Test / test (20) (pull_request) Successful in 19s
Test / test (22) (pull_request) Successful in 24s
Test / test (24) (pull_request) Successful in 18s
Test / test (26) (pull_request) Successful in 19s
2026-09-20 18:17:39 +02:00
lilleman
84174b4a5b
Refuse a connectTimeout Node's timers cannot hold, and pin the refusals the tests missed
Mirror / push (push) Successful in 5s
Test / lint (pull_request) Successful in 20s
Test / test (18) (pull_request) Successful in 26s
Test / test (20) (pull_request) Successful in 19s
Test / test (22) (pull_request) Successful in 20s
Test / test (24) (pull_request) Successful in 19s
Test / test (26) (pull_request) Successful in 20s
2026-09-20 18:12:39 +02:00
lilleman
17447bbe3a
Give up a connect after connectTimeout instead of waiting the OS out
Mirror / push (push) Successful in 4s
Test / lint (pull_request) Successful in 21s
Test / test (18) (pull_request) Successful in 22s
Test / test (20) (pull_request) Successful in 18s
Test / test (22) (pull_request) Successful in 18s
Test / test (24) (pull_request) Successful in 19s
Test / test (26) (pull_request) Successful in 27s
2026-09-20 00:42:09 +02:00
lilleman
d874448273
Plan a connectTimeout option, found comparing 0.5.0 with the larvitsmpp forks
Test / lint (pull_request) Successful in 21s
Test / test (18) (pull_request) Successful in 20s
Test / test (20) (pull_request) Successful in 18s
Test / test (22) (pull_request) Successful in 27s
Test / test (24) (pull_request) Successful in 19s
Test / test (26) (pull_request) Successful in 28s
Mirror / push (push) Successful in 4s
2026-09-20 00:23:06 +02:00
lilleman
0f13951e8c
Move the goals to README.md and state the audience
Mirror / push (push) Successful in 5s
Test / lint (pull_request) Successful in 21s
Test / test (18) (pull_request) Successful in 21s
Test / test (20) (pull_request) Successful in 19s
Test / test (22) (pull_request) Successful in 20s
Test / test (24) (pull_request) Successful in 20s
Test / test (26) (pull_request) Successful in 20s
2026-09-19 00:48:21 +02:00
lilleman
1c0b4bef34
Tick off the 0.5.0 cleanup in todo.md, and decline a token expiry check
Test / lint (pull_request) Successful in 20s
Test / test (18) (pull_request) Successful in 18s
Test / test (20) (pull_request) Successful in 17s
Test / test (22) (pull_request) Successful in 18s
Test / test (24) (pull_request) Successful in 18s
Test / test (26) (pull_request) Successful in 18s
Mirror / push (push) Successful in 4s
2026-09-14 21:19:17 +02:00
lilleman
14b114afda
Split the GitHub mirror so Gitea creates its runs and no delete is dropped
Mirror / push (push) Successful in 5s
Test / lint (pull_request) Successful in 20s
Test / test (18) (pull_request) Successful in 18s
Test / test (20) (pull_request) Successful in 18s
Test / test (22) (pull_request) Successful in 22s
Test / test (24) (pull_request) Successful in 17s
Test / test (26) (pull_request) Successful in 17s
2026-09-14 20:40:38 +02:00
lilleman
27e8f288ec
Mirror every branch and tag to GitHub from CI, keeping what only GitHub has
2026-09-14 20:40:38 +02:00
lilleman
e1999a7305
Let a registered encoding claim a data_coding a built-in already uses, in todo.md
Test / lint (pull_request) Successful in 20s
Test / test (18) (pull_request) Successful in 17s
Test / test (20) (pull_request) Successful in 18s
Test / test (22) (pull_request) Successful in 18s
Test / test (24) (pull_request) Successful in 17s
Test / test (26) (pull_request) Successful in 19s
2026-09-14 20:38:02 +02:00
lilleman
baa0ad553a
Set failover's options, and decide to test on Linux only while keeping macOS and Windows unbroken
Test / lint (pull_request) Successful in 19s
Test / test (18) (pull_request) Successful in 17s
Test / test (20) (pull_request) Successful in 17s
Test / test (22) (pull_request) Successful in 17s
Test / test (24) (pull_request) Successful in 17s
Test / test (26) (pull_request) Successful in 17s
2026-09-14 17:26:46 +02:00
lilleman
e32f9ccf46
Plan failover, an optional store for pooling and restarts, shipping src, and Gitea runners for macOS and Windows
Test / lint (pull_request) Successful in 19s
Test / test (18) (pull_request) Successful in 18s
Test / test (20) (pull_request) Successful in 18s
Test / test (22) (pull_request) Successful in 19s
Test / test (24) (pull_request) Successful in 17s
Test / test (26) (pull_request) Successful in 18s
2026-09-14 17:08:54 +02:00
lilleman
b3cbbba615
Record the gaps found against other SMPP libraries, and make configurable and extendable a goal
Test / lint (pull_request) Successful in 1m4s
Test / test (18) (pull_request) Successful in 17s
Test / test (20) (pull_request) Successful in 17s
Test / test (22) (pull_request) Successful in 18s
Test / test (24) (pull_request) Successful in 25s
Test / test (26) (pull_request) Successful in 56s
2026-09-14 16:32:23 +02:00
lilleman
95e1f910a3
Track the peer's address on every log message in todo.md, and keep Renovate's dashboard open
Test / lint (pull_request) Successful in 24s
Test / test (18) (pull_request) Successful in 19s
Test / test (20) (pull_request) Successful in 19s
Test / test (22) (pull_request) Successful in 19s
Test / test (24) (pull_request) Successful in 18s
Test / test (26) (pull_request) Successful in 20s
2026-09-14 15:04:12 +02:00
lilleman
0f14ca85c2
Plan 0.5.0 in todo.md, holding the GitHub work until it is published
Test / lint (pull_request) Successful in 21s
Test / test (18) (pull_request) Successful in 19s
Test / test (20) (pull_request) Successful in 24s
Test / test (22) (pull_request) Successful in 19s
Test / test (24) (pull_request) Successful in 18s
Test / test (26) (pull_request) Successful in 19s
Release / publish (push) Successful in 37s
2026-09-14 14:09:58 +02:00
lilleman
773db43305
Record the move to Gitea and the GitHub retirement in todo.md
Test / lint (pull_request) Successful in 20s
Test / test (18) (pull_request) Successful in 18s
Test / test (20) (pull_request) Successful in 17s
Test / test (22) (pull_request) Successful in 17s
Test / test (24) (pull_request) Successful in 18s
Test / test (26) (pull_request) Successful in 19s
2026-09-13 17:57:10 +02:00
lilleman
8315f1882a
Keep todo.md, and plan the backlog close-out and the move to Gitea in it
Test / lint (push) Successful in 20s
Test / test (18) (push) Successful in 19s
Test / test (20) (push) Successful in 19s
Test / test (22) (push) Successful in 19s
Test / test (24) (push) Successful in 18s
Test / test (26) (push) Successful in 29s
2026-09-13 16:31:07 +02:00
lilleman
13e3ff8f1f
Say undefined where the SMSC named no id for a segment it took ( #101 )
...
* Cover the ids a send gets back where the SMSC named only some of them
* Say undefined where the SMSC named no id for a segment it took
* Record why the merger takes the wider type, and de-duplicate the interop narrowing
* Guard the numbering hole the merger must refuse, and correct the phase record
2026-09-12 22:37:55 +02:00
lilleman
ca1a7473ed
Declare the alphabet a GSM message is actually written in ( #100 )
...
* Regression tests for the alphabet a GSM message declares
* Declare the alphabet a GSM message is actually written in
* Reflow the composing-by-hand paragraph
* Drop the ASCII alias SMPP's flat table shares with the option's own
* Bound the receipt test's wait and tighten the notes around it
2026-09-09 21:30:55 +02:00
lilleman
989eb01763
Name the refusal rule, and refuse a period the encoder cannot spell ( #99 )
...
* Refuse a relative validity period the SMPP time format cannot hold
* Export unencodableText(), so a caller can word a refusal as the library does
* Name the refusal rule in the README, and correct what it claims
* Word the period refusal by what the encoder spells, and keep unencodableText() internal
* Correct the decision bullet premise about what the relative format holds
* Close the stability nits on the time guard and its tests
2026-09-09 20:36:13 +02:00
lilleman
ef13290230
Refuse a body the PDU's own data_coding cannot carry ( #98 )
...
* Regression tests for a body the PDU's own data_coding cannot carry
* Refuse a body the PDU's own data_coding cannot carry, in the codec both send paths build through
* Record the codec's body refusal, and drop two todo entries it and the interop run close
* Regression tests for the aliased body TLV and the data_coding short_message settles
* Find the body TLV by tag id, leave data_coding to the field that will be read, and correct the record
* Record the two architecture findings this change does not close
* Regression tests for a duplicated body tag and a short_message the wire never carries
* Resolve every body TLV against the field that will be read, and move TLV writing to its table
* Regression tests for a body only the TLV carries and an empty short_message
* Let only octets the command writes settle the alphabet, and stop shadowing the TLV table
2026-09-09 19:33:36 +02:00
lilleman
c06cc0648b
Refuse what we cannot send: an alphabet that cannot carry the message, and a time nobody can read ( #97 )
...
* Regression tests for a named alphabet and a time that cannot carry the send
* Refuse a message the named alphabet cannot carry, and a time nobody can read
* Close the architecture review: a builder that cannot drop a time, and docs that hold
* Refuse a time of no known kind, and clamp a relative period to what the format holds
* Reflow the decision record and name the clamp in its test
2026-09-09 18:16:08 +02:00
lilleman
7d6039796d
Fit every concatenated segment in an SMS, and close the encoding helpers' throw ( #96 )
...
* Regression tests for the concatenated segment budget and the encoding-name door
* Budget unpacked segments at 134 octets, and export isEncodingName
* Name the length a Latin-1 message starts costing more segments at
* Fold the totality clause into hard rule 1, and log the unrepresentable-alphabet finding
* Make the maxSegments regression discriminate, and drop the narrating comments
* State the per-alphabet capacities accurately, and log the invalid-date path
2026-09-09 17:21:51 +02:00
lilleman
e80b07167c
Read the GSM 03.38 message class where the spec puts it ( #95 )
...
* Regression tests for the GSM 03.38 message class behind sms.flash
* Read the GSM 03.38 message class where the spec puts it, and refuse a flash message no alphabet can carry
* Keep the code span in the message-class decision on one line
* Stop offering the flash message class as an alphabet, and check the encoding option by name
* Settle every refusable send option in one check, and record what the review left open
* Say what the flash refusal and the encoding option actually do
* Keep the README off the alphabet whose long messages do not fit
2026-09-09 16:40:32 +02:00
lilleman
bd466d393a
Turn the interoperability plan into the suite's README now that every phase has run
2026-09-09 14:06:34 +02:00
lilleman
ad094b3897
Record the two version-gate asks left open on the rewrite PR
2026-09-06 17:26:44 +02:00
lilleman
d21df7c04b
Plan one product-owner pass over the surface the interoperability fixes moved
2026-09-06 17:24:50 +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
8c46e925a1
Record the branch renames: master to v0.4.0, typescript to main as default
2026-09-04 11:16:54 +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
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
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
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
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
66fac3768d
Merge remote-tracking branch 'origin/typescript' into receipt-field-separators
2026-09-01 22:14:00 +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
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
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