Skip to content

feat(engine): messaging, with Send via, the offline queue and kept conversations - #229

Merged
gx1400 merged 1 commit into
docs/f2.4-specfrom
feat/f2.4-messaging-engine
Oct 17, 2026
Merged

gx1400 merged 1 commit into
docs/f2.4-specfrom
feat/f2.4-messaging-engine

Conversation

@gx1400

@gx1400 gx1400 commented Oct 17, 2026

Copy link
Copy Markdown
Contributor

Engine, contract and gateway part of F2.4 (#192), stacked on the spec (#228). The Messages panel follows in a stacked PR.

  • Messenger wraps APRS.NET's MessagingStation. It adds what AprsMap needs on top: the offline queue, the route each message takes, the state of each message as the app shows it, unread counts and the kept history.
  • Send via:
    • Automatic sends over RF on the TNC that heard the correspondent in the last 30 min (and can send), otherwise over APRS-IS. When every RF try goes unacked, the message goes once more over APRS-IS.
    • Chosen sources sends on each one ticked.
    • Retries per conversation: Automatic picks APRS-IS's schedule over APRS-IS and Default over RF, or choose one.
  • Acks go back on the source the message came on, and only when that source can send. Otherwise the message is marked not acknowledged.
  • Kept per profile in messages-{profile}.json beside the settings: 500 per conversation for 90 days, plus the last message ID. A message in flight when the app closed comes back as Failed, so it can be sent again.
  • Positions now go out as = (the station takes messages).
  • Gateway: every messaging call is refused with gateway.operator-only until F2.9.
  • Bug fixed along the way: a retry doesn't change APRS.NET's state, so the attempt count and next-try time are now refreshed after each try is sent.

Tests

  • MessagingTests (11):
    • a message heard twice, shown and acked once;
    • splitting and delivery on ack;
    • Automatic over RF;
    • the APRS-IS fallback after six unacked RF tries;
    • the queue and no acks while Transmit is off;
    • restart with the IDs carrying on;
    • refusals and word splitting.
  • The gateway test covers messaging.
  • Results: Tiles 17, Gateway 110, Core 325, UI 471. All pass, and csharpier is clean.

…, the offline queue and kept conversations

docs/features/F2.4-messaging.md behaviors 1-16, engine side:
- conversations per correspondent, with unread counts, kept per profile with the last message ID (messages-{profile}.json);
- sending splits up to 300 characters into messages of at most 67, refuses what can't be sent, and queues while nothing can send;
- Send via per conversation: Automatic (RF on the TNC that heard them in the last 30 min, APRS-IS otherwise, and once more over APRS-IS when RF goes unacked) or chosen sources; retries per conversation;
- received messages shown once across sources and acked where they came on; not acked, and marked so, while the station can't send;
- positions now say the station takes messages (=);
- every messaging call is operator-only on the gateway.
@github-actions

Copy link
Copy Markdown
Contributor

Package report

Vulnerable packages

No known vulnerabilities in direct or transitive packages.

Available package updates

Package Current version Available version Note
Dock.Avalonia 12.1.0.9 12.1.0.12
Dock.Avalonia.Themes.Fluent 12.1.0.9 12.1.0.12
Dock.Model.Mvvm 12.1.0.9 12.1.0.12
Dock.Serializer.SystemTextJson 12.1.0.9 12.1.0.12
xunit.runner.visualstudio 3.1.5 4.0.1 Pinned in AprsMap.UI.Tests (see below)
xunit.v3.mtp-off 3.2.2 4.0.2 Pinned in AprsMap.UI.Tests (see below)

Pinned versions

These projects override the central version in Directory.Packages.props on purpose; updates for them are held back until the reason no longer applies.

Package Pinned version Project Reason
xunit.runner.visualstudio 3.1.5 AprsMap.UI.Tests Avalonia.Headless.XUnit 12.1 is built against xUnit v3 3.x and fails test discovery under 4.x (missing TestIntrospectionHelper overload). Pin this project only until Avalonia supports v4; see dependabot.yml.
xunit.v3.mtp-off 3.2.2 AprsMap.UI.Tests Avalonia.Headless.XUnit 12.1 is built against xUnit v3 3.x and fails test discovery under 4.x (missing TestIntrospectionHelper overload). Pin this project only until Avalonia supports v4; see dependabot.yml.

Checked at 2e0437b against nuget.org.

@gx1400
gx1400 added this pull request to stack #231 October 17, 2026 16:55
@gx1400
gx1400 merged commit 3f97813 into main Oct 17, 2026
11 checks passed
@gx1400
gx1400 deleted the feat/f2.4-messaging-engine branch October 17, 2026 17:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant