git » sdk » commit 62d0e05

Retry MAM for 30 days on error

author Stephen Paul Weber
2023-10-04 14:38:36 UTC
committer Stephen Paul Weber
2023-10-04 14:38:36 UTC
parent 8e17b0cba1af1c66c667d061361f858ad26b2bfc

Retry MAM for 30 days on error

In case our newest message has already expired from the server.

xmpp/Client.hx +28 -18
xmpp/MessageSync.hx +6 -0
xmpp/queries/MAMQuery.hx +1 -1

diff --git a/xmpp/Client.hx b/xmpp/Client.hx
index a3c4253..2a2563c 100644
--- a/xmpp/Client.hx
+++ b/xmpp/Client.hx
@@ -446,27 +446,37 @@ class Client extends xmpp.EventEmitter {
 	}
 
 	private function sync(?callback: ()->Void) {
+		persistence.lastId(jid, null, (lastId) -> doSync(callback, lastId));
+	}
+
+	private function doSync(callback: Null<()->Void>, lastId: Null<String>) {
 		var thirtyDaysAgo = Date.format(
 			DateTools.delta(std.Date.now(), DateTools.days(-30))
 		);
-		persistence.lastId(jid, null, function(lastId) {
-			var sync = new MessageSync(
-				this,
-				stream,
-				lastId == null ? { startTime: thirtyDaysAgo } : { page: { after: lastId } }
-			);
-			sync.setNewestPageFirst(false);
-			sync.onMessages((messageList) -> {
-				for (message in messageList.messages) {
-					persistence.storeMessage(jid, message);
-				}
-				if (sync.hasMore()) {
-					sync.fetchNext();
-				} else {
-					if (callback != null) callback();
-				}
-			});
-			sync.fetchNext();
+		var sync = new MessageSync(
+			this,
+			stream,
+			lastId == null ? { startTime: thirtyDaysAgo } : { page: { after: lastId } }
+		);
+		sync.setNewestPageFirst(false);
+		sync.onMessages((messageList) -> {
+			for (message in messageList.messages) {
+				persistence.storeMessage(jid, message);
+			}
+			if (sync.hasMore()) {
+				sync.fetchNext();
+			} else {
+				if (callback != null) callback();
+			}
+		});
+		sync.onError((stanza) -> {
+			if (lastId != null) {
+				// Gap in sync, out newest message has expired from server
+				doSync(callback, null);
+			} else {
+				if (callback != null) callback();
+			}
 		});
+		sync.fetchNext();
 	}
 }
diff --git a/xmpp/MessageSync.hx b/xmpp/MessageSync.hx
index e965281..f22b2d9 100644
--- a/xmpp/MessageSync.hx
+++ b/xmpp/MessageSync.hx
@@ -24,6 +24,7 @@ class MessageSync {
 	private var filter:MessageFilter;
 	private var serviceJID:String;
 	private var handler:MessageListHandler;
+	private var errorHandler:(Stanza)->Void;
 	private var lastPage:ResultSetPageResult;
 	private var complete:Bool = false;
 	private var newestPageFirst:Bool = true;
@@ -89,6 +90,7 @@ class MessageSync {
 			if(result == null) {
 				trace("Error from MAM, stopping sync");
 				complete = true;
+				errorHandler(query.responseStanza);
 			} else {
 				complete = result.complete;
 				lastPage = result.page;
@@ -109,6 +111,10 @@ class MessageSync {
 		this.handler = handler;
 	}
 
+	public function onError(handler:(Stanza)->Void) {
+		this.errorHandler = handler;
+	}
+
 	public function setNewestPageFirst(newestPageFirst:Bool):Void {
 		this.newestPageFirst = newestPageFirst;
 	}
diff --git a/xmpp/queries/MAMQuery.hx b/xmpp/queries/MAMQuery.hx
index 0ea1bd6..e483fe3 100644
--- a/xmpp/queries/MAMQuery.hx
+++ b/xmpp/queries/MAMQuery.hx
@@ -31,7 +31,7 @@ typedef MAMQueryResult = {
 class MAMQuery extends GenericQuery {
 	public var xmlns(default, null) = "urn:xmpp:mam:2";
 	public var queryId:String = null;
-	private var responseStanza:Stanza;
+	public var responseStanza(default, null):Stanza;
 	private var result:MAMQueryResult;
 
 	private function addStringField(name:String, value:String) {