| author | Stephen Paul Weber
<singpolyma@singpolyma.net> 2023-10-04 14:38:36 UTC |
| committer | Stephen Paul Weber
<singpolyma@singpolyma.net> 2023-10-04 14:38:36 UTC |
| parent | 8e17b0cba1af1c66c667d061361f858ad26b2bfc |
| 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) {