git » sdk » commit 689959f

Persist SM outbound queue

author Stephen Paul Weber
2023-11-15 03:58:47 UTC
committer Stephen Paul Weber
2023-11-15 17:48:29 UTC
parent 0dad51e7cdd36ae56ae5060897614c5b4705cc8c

Persist SM outbound queue

xmpp/Client.hx +3 -3
xmpp/GenericStream.hx +1 -1
xmpp/Persistence.hx +2 -2
xmpp/persistence/browser.js +3 -3
xmpp/streams/XmppJsStream.hx +5 -3

diff --git a/xmpp/Client.hx b/xmpp/Client.hx
index 1a7b510..2464947 100644
--- a/xmpp/Client.hx
+++ b/xmpp/Client.hx
@@ -53,7 +53,7 @@ class Client extends xmpp.EventEmitter {
 		stream = new Stream();
 		stream.on("status/online", this.onConnected);
 		stream.on("sm/update", (data) -> {
-			persistence.storeStreamManagement(accountId(), data.id, data.outbound, data.inbound);
+			persistence.storeStreamManagement(accountId(), data.id, data.outbound, data.inbound, data.outbound_q);
 			return EventHandled;
 		});
 
@@ -373,7 +373,7 @@ class Client extends xmpp.EventEmitter {
 				chats.sort((a, b) -> -Reflect.compare(a.lastMessageTimestamp() ?? "0", b.lastMessageTimestamp() ?? "0"));
 				this.trigger("chats/update", chats);
 
-				persistence.getStreamManagement(accountId(), (smId, smOut, smIn) -> {
+				persistence.getStreamManagement(accountId(), (smId, smOut, smIn, smOutQ) -> {
 					persistence.getLogin(jid, (login) -> {
 						var ajid = jid;
 						if (login.clientId != null) ajid = JID.parse(jid).asBare().asString() + "/" + login.clientId;
@@ -382,7 +382,7 @@ class Client extends xmpp.EventEmitter {
 						} else {
 							stream.on("auth/password-needed", (data)->this.stream.trigger("auth/password", { password: login.token }));
 						}
-						stream.connect(ajid, smId == null || smId == "" ? null : { id: smId, outbound: smOut, inbound: smIn });
+						stream.connect(ajid, smId == null || smId == "" ? null : { id: smId, outbound: smOut, inbound: smIn, outbound_q: smOutQ });
 					});
 				});
 			});
diff --git a/xmpp/GenericStream.hx b/xmpp/GenericStream.hx
index c7e1f9d..edfa3e3 100644
--- a/xmpp/GenericStream.hx
+++ b/xmpp/GenericStream.hx
@@ -17,7 +17,7 @@ abstract class GenericStream extends EventEmitter {
 	
 	/* Connections and streams */
 
-	abstract public function connect(jid:String, sm:Null<{id:String,outbound:Int,inbound:Int}>):Void;
+	abstract public function connect(jid:String, sm:Null<{id:String,outbound:Int,inbound:Int,outbound_q:Array<String>}>):Void;
 	abstract public function sendStanza(stanza:Stanza):Void;
 	abstract public function newId():String;
 	abstract public function onIq(type:IqRequestType, tag:String, xmlns:String, handler:(Stanza)->IqResult):Void;
diff --git a/xmpp/Persistence.hx b/xmpp/Persistence.hx
index 609061d..50c5fb8 100644
--- a/xmpp/Persistence.hx
+++ b/xmpp/Persistence.hx
@@ -19,6 +19,6 @@ abstract class Persistence {
 	abstract public function getCaps(ver:String, callback: (Caps)->Void):Void;
 	abstract public function storeLogin(login:String, clientId:String, token:Null<String>):Void;
 	abstract public function getLogin(login:String, callback:({ ?clientId: String, ?token: String })->Void):Void;
-	abstract public function storeStreamManagement(accountId:String, smId:String, outboundCount:Int, inboundCount:Int):Void;
-	abstract public function getStreamManagement(accountId:String, callback: (smId:String, outboundCount:Int, inboundCount:Int)->Void):Void;
+	abstract public function storeStreamManagement(accountId:String, smId:String, outboundCount:Int, inboundCount:Int, outboundQueue:Array<String>):Void;
+	abstract public function getStreamManagement(accountId:String, callback: (smId:String, outboundCount:Int, inboundCount:Int, outboundQueue:Array<String>)->Void):Void;
 }
diff --git a/xmpp/persistence/browser.js b/xmpp/persistence/browser.js
index fb6ab76..0130cda 100644
--- a/xmpp/persistence/browser.js
+++ b/xmpp/persistence/browser.js
@@ -367,10 +367,10 @@ exports.xmpp.persistence = {
 				if (token != null) store.put(token, "login:token:" + login).onerror = console.error;
 			},
 
-			storeStreamManagement: function(account, id, outbound, inbound) {
+			storeStreamManagement: function(account, id, outbound, inbound, outbound_q) {
 				const tx = db.transaction(["keyvaluepairs"], "readwrite");
 				const store = tx.objectStore("keyvaluepairs");
-				store.put({ id: id, outbound: outbound, inbound: inbound }, "sm:" + account).onerror = console.error;
+				store.put({ id: id, outbound: outbound, inbound: inbound, outbound_q }, "sm:" + account).onerror = console.error;
 			},
 
 			getStreamManagement: function(account, callback) {
@@ -378,7 +378,7 @@ exports.xmpp.persistence = {
 				const store = tx.objectStore("keyvaluepairs");
 				promisifyRequest(store.get("sm:" + account)).then(
 					(v) => {
-						callback(v?.id, v?.outbound, v?.inbound);
+						callback(v?.id, v?.outbound, v?.inbound, v?.outbound_q || []);
 					},
 					(e) => {
 						console.error(e);
diff --git a/xmpp/streams/XmppJsStream.hx b/xmpp/streams/XmppJsStream.hx
index 5638cbc..b0810e1 100644
--- a/xmpp/streams/XmppJsStream.hx
+++ b/xmpp/streams/XmppJsStream.hx
@@ -20,7 +20,7 @@ extern class XmppJsClient {
 		get: (String, String, ({stanza: XmppJsXml})->Any)->Void,
 		set: (String, String, ({stanza: XmppJsXml})->Any)->Void,
 	};
-	var streamManagement: { id:String, outbound: Int, inbound: Int, enabled: Bool, allowResume: Bool };
+	var streamManagement: { id:String, outbound: Int, inbound: Int, outbound_q: Array<XmppJsXml>, enabled: Bool, allowResume: Bool };
 }
 
 @:jsRequire("@xmpp/jid", "jid")
@@ -46,6 +46,7 @@ extern class XmppJsXml {
 	function new();
 	@:overload(function(textContent:String):Void { })
 	function append(el:XmppJsXml):Void;
+	function toString():String;
 
 	var name:String;
 	var attrs:Dynamic;
@@ -82,7 +83,7 @@ class XmppJsStream extends GenericStream {
 	private var state:FSM;
 	private var pending:Array<XmppJsXml> = [];
 	private var pendingOnIq:Array<{type:IqRequestType,tag:String,xmlns:String,handler:(Stanza)->IqResult}> = [];
-	private var initialSM: Null<{id:String,outbound:Int,inbound:Int}> = null;
+	private var initialSM: Null<{id:String,outbound:Int,inbound:Int,outbound_q:Array<String>}> = null;
 	private var resumed = false;
 
 	override public function new() {
@@ -149,6 +150,7 @@ class XmppJsStream extends GenericStream {
 				xmpp.streamManagement.id = initialSM.id;
 				xmpp.streamManagement.outbound = initialSM.outbound;
 				xmpp.streamManagement.inbound = initialSM.inbound;
+				xmpp.streamManagement.outbound_q = (initialSM.outbound_q ?? []).map(XmppJsLtx.parse);
 				initialSM = null;
 			}
 
@@ -198,7 +200,7 @@ class XmppJsStream extends GenericStream {
 		this.trigger("auth/password-needed", {});
 	}
 
-	public function connect(jid:String, sm:Null<{id:String,outbound:Int,inbound:Int}>) {
+	public function connect(jid:String, sm:Null<{id:String,outbound:Int,inbound:Int,outbound_q:Array<String>}>) {
 		this.state.event("connect-requested");
 		this.jid = new XmppJsJID(jid);
 		this.initialSM = sm;