[#424] implement `unsubscribe`
Closes #424 (closed) Closes #425 (closed)
context
- we are slowly but surely bringing signalc up to feature parity with signald (for the subset of features needed by signalboost)
- this MR implements the
unsubscribe
command, and sets us up to play #473 (closed) (in which we will need to unsubscribe from channels as part of gracefully handling restarts) - as a bonus: we also make it impossible to subscribe to messages for the same account twice (#425 (closed))
changes
data model:
- add socket response types for unsubscribe success & failure
- add new
username
accessor on requests (to make it easier to call this property on an arbitrary request)
signal layer:
- modify
SignalReceiver#subscribe
:- add subscription jobs to a concurrent hash map as created (so they can be retrieved later for cancelation)
- don't create a new subscription if one already exists for a given account
- add
SignalReceiver#unsubscribe
:- shuts down the signal service message pipe
- cancels the listening job (with a custom exception to signal to
the original
subscribe
caller that it was intentionally cancelled and not unintentionally disrupted due to -- eg -- a broken connection to the signal server) - removes all resources particular to this account from hash map cashes (eg: message sender, message pipe, subscribe job, cipher)
- modify
SignalRecever#rejectUnverified
to be more generalizable, and thus suitable for use in both#subscribe
and#unsubscribe
socket layer:
- implement
SocketReceiver#unsubscribe
: handle subscribe socket requests, forward them to signal layer and signal success/error back to client - modify
SocketReceiver#subscribe
to distinguish a subscribe job cancelled on purpose from one cancelled due to connection disruption and not attempt to resubscribe in the former case