Commit Graph

181 Commits

Author SHA1 Message Date
lilleman cbd1190b96 Record what the smppload bind actually does, and what is still untested
Test / lint (pull_request) Successful in 21s
Test / test (18) (pull_request) Successful in 29s
Test / test (20) (pull_request) Successful in 29s
Test / test (22) (pull_request) Successful in 29s
Test / test (24) (pull_request) Successful in 29s
Test / test (26) (pull_request) Successful in 29s
Mirror / push (push) Successful in 5s
2026-09-20 23:48:09 +02:00
lilleman b85d1f1dab Compare throughput against jsmpp and Cloudhopper on one sink
Test / lint (pull_request) Successful in 21s
Test / test (18) (pull_request) Successful in 29s
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 29s
Mirror / push (push) Has been cancelled
2026-09-20 23:45:09 +02:00
lilleman c5ed25f915 Make throughput goal 6, with floors a release has to clear
Test / lint (pull_request) Successful in 21s
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 30s
Test / test (26) (pull_request) Successful in 31s
Mirror / push (push) Successful in 5s
2026-09-20 23:23:08 +02:00
lilleman 4c43f6748d Measure what this library sustains, and against Jasmin and SMPPSim
Mirror / push (push) Has been cancelled
Test / lint (pull_request) Successful in 22s
Test / test (18) (pull_request) Successful in 29s
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 29s
2026-09-20 23:11:48 +02:00
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 92fbd6a9f2 Wait the default out for real, since node:test mock timers postdate the Node 18 floor
Test / lint (pull_request) Successful in 21s
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 32s
Test / test (26) (pull_request) Successful in 30s
Mirror / push (push) Successful in 4s
2026-09-20 20:52:32 +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 656bbae500 Move the decisions to docs/decisions.md and index them in AGENTS.md
Test / lint (pull_request) Successful in 23s
Test / test (18) (pull_request) Successful in 20s
Test / test (20) (pull_request) Successful in 21s
Test / test (22) (pull_request) Successful in 20s
Test / test (24) (pull_request) Successful in 20s
Test / test (26) (pull_request) Successful in 21s
Mirror / push (push) Successful in 6s
2026-09-19 01:04:08 +02:00
lilleman c90b855958 Drop the anti-mention from the audience
Test / lint (pull_request) Successful in 22s
Test / test (18) (pull_request) Successful in 23s
Test / test (20) (pull_request) Successful in 20s
Test / test (22) (pull_request) Successful in 20s
Test / test (24) (pull_request) Successful in 21s
Test / test (26) (pull_request) Successful in 20s
Mirror / push (push) Successful in 6s
2026-09-19 00:59:29 +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 aab74e4cb3 Fixed CLAUDE.md
Test / lint (pull_request) Successful in 22s
Test / test (18) (pull_request) Successful in 20s
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 19s
Mirror / push (push) Successful in 5s
2026-09-19 00:15:07 +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 c5adfd8e39 Say what the mirror's concurrency group does, and name every way a stale ref survives
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 18s
Test / test (24) (pull_request) Successful in 17s
Test / test (26) (pull_request) Successful in 17s
Mirror / push (push) Successful in 3s
2026-09-14 20:54:04 +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
v0.5.0
2026-09-14 14:09:58 +02:00
lilleman e8558aa471 Release as 0.5.0, and file issues on the GitHub mirror 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 793839d0e0 Point the package and README at Gitea 2026-09-13 17:57:10 +02:00
lilleman 68cd8e3f31 Run CI, releases and Renovate on Gitea 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 311ee7c677 Name the branches as the rename leaves them 2026-09-13 16:31:07 +02:00
lilleman e3062066c1 Pin the Node version the lint and release jobs run on 2026-09-13 16:30:58 +02:00
lilleman 7310634d7d Rewrite the README task-first for 1.0.0 and move the 0.4.0 guide to MIGRATION.md (#102)
Test / lint (push) Successful in 20s
Test / test (18) (push) Successful in 18s
Test / test (20) (push) Successful in 18s
Test / test (22) (push) Successful in 18s
Test / test (24) (push) Successful in 24s
Test / test (26) (push) Successful in 18s
2026-09-13 12:05:13 +02:00
lilleman 549b3260c9 Record the smsIds decision under the surface it changes 2026-09-12 22:41:02 +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 cced03767e Cover a multi-segment Latin-1 message against a real peer, and correct the flash row it left stale 2026-09-09 17:26:40 +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 ff6ba9f825 Assert 0xF0 is flash, now that it is read as the spec puts it 2026-09-09 16:43:39 +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 9673af67b6 Close the interoperability plan and leave the one open decision on it 2026-09-08 19:45:28 +02:00
lilleman 079d833ea8 Fix what the product-owner pass found in the README, and log an unmergeable receipt (#94)
* Log an unmergeable receipt and correct the README where it overclaims

* Name decodeMessage's arguments and pin the hook's keepalive and unbind

* Let the test name carry what its comment restated
2026-09-08 19:43:23 +02:00
lilleman 7937534677 Close the scope decision and add the last two questions for the product-owner pass 2026-09-08 18:58:46 +02:00
lilleman 5a0cf56754 Fixtures for the receipt bodies operator documentation publishes (#93)
* Fixtures for the receipt bodies operator documentation publishes

* Read the stat:FAILED several operators write as UNDELIVERABLE

* Cover the 16-bit UDH concatenation element with a fixture

* Record phase 9 of the interoperability plan

* Share the dummy SMSC and tighten the operator fixtures

* Correct what the test conventions claim about the doubles and the tree

* Read a receipt date that carries its century

* Read the stat spelling CM.com publishes

* Say what the receipt status table actually holds
2026-09-08 18:56:57 +02:00