Message reader
A message reader reads messages from one or more message boxes, and passes them to a delegate for further processing.
Instance creation
InQueueReader inQueueReader = new InQueueReader(keyPair, delegate);
var inQueueReader = new cn.InQueueReader(keyPair, delegate);
my $inQueueReader = CN::InQueueReader->new($keyPair, $delegate);
Creates a message reader for reading messages addressed to the key pair.
Reading messages
inQueueReader.read(accountWithKey);
inQueueReader.read(accountWithKey);
$inQueueReader->read($accountWithKey);
Starts reading the message box of account with key, unless a read operation for that account is already ongoing.
A read operation first lists the message box. If listing fails, onInQueueListFailed is called on the delegate, and the read operation stops immediately.
The reader then processes each message. Up to approximately 4 messages are processed in parallel.
For each message, the envelope is retrieved from the store and parsed. If the envelope is complete, onInQueueVerifyStore is called on the delegate to resolve the sender's store. If the delegate returns nullundef, the message is treated as invalid.
Otherwise, the sender's public key is retrieved from the store, the signature is verified, the AES key decrypted, and the content retrieved.
Once everything is ready onInQueueMessage is called for further processing.
When a read operation starts, on the delegate, indicating the store. Similarly, onInQueueReadingStarts is called when the
boolean isReading = inQueueReader.isReading(store);
var isReading = inQueueReader.isReading(store);
my $isReading = $inQueueReader->isReading($store);
Indicates whether a read operation for the indicated store is ongoing.
Implementing a delegate
@Override public boolean onInQueueVerifyStore(HashReference source, Record envelope, String storeUrl) { // Allow HTTP stores return storeUrl.startsWith("http://") || storeUrl.startsWith("https://"); } @Override void onInQueueMessage(ReceivedMessage message) { // Process the message, and call one of the following message.processed(); message.remove(); message.failed(error); message.postpone(Duration.MINUTE * 10); } @Override void onInQueueMessageInvalid(HashReference source, String reason) { // An invalid message was found. Such messages are deleted. // This could be shown on the user interface, or logged. } @Override void onInQueueMessageFailed(HashReference source, String error) { // A message could not be retrieved due to a store error. // Such messages are put on hold, and will be tried later. // This could be shown on the user interface, or logged. } @Override void onInQueueListFailed(AccountWithKey accountWithKey, String error) { // Listing failed. This could be shown on the user interface. } @Override void onInQueueReadingDone(AccountWithKey accountWithKey) { // All messages have been read. This could be shown on the user interface. }