git » sdk » commit be7902f

Make SM data opaque

author Stephen Paul Weber
2024-09-24 03:37:30 UTC
committer Stephen Paul Weber
2024-09-24 03:53:14 UTC
parent 6bd4e8bc555e1f981545feba48c0d03b3abb9786

Make SM data opaque

snikket/Client.hx +4 -4
snikket/GenericStream.hx +2 -1
snikket/Persistence.hx +2 -2
snikket/persistence/Dummy.hx +3 -3
snikket/persistence/Sqlite.hx +3 -3
snikket/persistence/browser.js +8 -4
snikket/streams/XmppJsStream.hx +16 -11
snikket/streams/XmppStropheStream.hx +3 -1

diff --git a/snikket/Client.hx b/snikket/Client.hx
index 4519de3..6f7b0c7 100644
--- a/snikket/Client.hx
+++ b/snikket/Client.hx
@@ -98,7 +98,7 @@ class Client extends EventEmitter {
 		});
 
 		stream.on("sm/update", (data) -> {
-			persistence.storeStreamManagement(accountId(), data.id, data.outbound, data.inbound, data.outbound_q);
+			persistence.storeStreamManagement(accountId(), data.sm);
 			return EventHandled;
 		});
 
@@ -457,7 +457,7 @@ class Client extends EventEmitter {
 	public function start() {
 		persistence.getLogin(accountId(), (clientId, loadedToken, fastCount, displayName) -> {
 			token = loadedToken;
-			persistence.getStreamManagement(accountId(), (smId, smOut, smIn, smOutQ) -> {
+			persistence.getStreamManagement(accountId(), (sm) -> {
 				stream.clientId = clientId ?? ID.long();
 				jid = jid.withResource(stream.clientId);
 				if (!updateDisplayName(displayName) && clientId == null) {
@@ -490,13 +490,13 @@ class Client extends EventEmitter {
 						stream.on("auth/fail", (data) -> {
 							if (token != null) {
 								token = null;
-								stream.connect(jid.asString(), smId == null || smId == "" ? null : { id: smId, outbound: smOut, inbound: smIn, outbound_q: smOutQ });
+								stream.connect(jid.asString(), sm);
 							} else {
 								this.trigger("auth/fail", data);
 							}
 							return EventHandled;
 						});
-						stream.connect(jid.asString(), smId == null || smId == "" ? null : { id: smId, outbound: smOut, inbound: smIn, outbound_q: smOutQ });
+						stream.connect(jid.asString(), sm);
 					});
 				});
 			});
diff --git a/snikket/GenericStream.hx b/snikket/GenericStream.hx
index c21a17e..5fe7b63 100644
--- a/snikket/GenericStream.hx
+++ b/snikket/GenericStream.hx
@@ -1,5 +1,6 @@
 package snikket;
 
+import haxe.io.BytesData;
 import snikket.Stanza;
 import snikket.EventEmitter;
 
@@ -19,7 +20,7 @@ abstract class GenericStream extends EventEmitter {
 	
 	/* Connections and streams */
 
-	abstract public function connect(jid:String, sm:Null<{id:String,outbound:Int,inbound:Int,outbound_q:Array<String>}>):Void;
+	abstract public function connect(jid:String, sm:Null<BytesData>):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/snikket/Persistence.hx b/snikket/Persistence.hx
index 8f945e3..66edb53 100644
--- a/snikket/Persistence.hx
+++ b/snikket/Persistence.hx
@@ -24,8 +24,8 @@ interface Persistence {
 	public function getCaps(ver:String, callback: (Null<Caps>)->Void):Void;
 	public function storeLogin(login:String, clientId:String, displayName:String, token:Null<String>):Void;
 	public function getLogin(login:String, callback:(clientId:Null<String>, token:Null<String>, fastCount: Int, displayName:Null<String>)->Void):Void;
-	public function storeStreamManagement(accountId:String, smId:String, outboundCount:Int, inboundCount:Int, outboundQueue:Array<String>):Void;
-	public function getStreamManagement(accountId:String, callback: (smId:Null<String>, outboundCount:Int, inboundCount:Int, outboundQueue:Array<String>)->Void):Void;
+	public function storeStreamManagement(accountId:String, data:BytesData):Void;
+	public function getStreamManagement(accountId:String, callback: (Null<BytesData>)->Void):Void;
 	public function storeService(accountId:String, serviceId:String, name:Null<String>, node:Null<String>, caps:Caps):Void;
 	@HaxeCBridge.noemit
 	public function findServicesWithFeature(accountId:String, feature:String, callback:(Array<{serviceId:String, name:Null<String>, node:Null<String>, caps: Caps}>)->Void):Void;
diff --git a/snikket/persistence/Dummy.hx b/snikket/persistence/Dummy.hx
index 19147ea..6d91ffa 100644
--- a/snikket/persistence/Dummy.hx
+++ b/snikket/persistence/Dummy.hx
@@ -88,11 +88,11 @@ class Dummy implements Persistence {
 	}
 
 	@HaxeCBridge.noemit
-	public function storeStreamManagement(accountId:String, smId:String, outboundCount:Int, inboundCount:Int, outboundQueue:Array<String>) { }
+	public function storeStreamManagement(accountId:String, sm:BytesData) { }
 
 	@HaxeCBridge.noemit
-	public function getStreamManagement(accountId:String, callback: (Null<String>, Int, Int, Array<String>)->Void) {
-		callback(null, -1, -1, []);
+	public function getStreamManagement(accountId:String, callback: (Null<BytesData>)->Void) {
+		callback(null);
 	}
 
 	@HaxeCBridge.noemit
diff --git a/snikket/persistence/Sqlite.hx b/snikket/persistence/Sqlite.hx
index e3b01ed..bd70b66 100644
--- a/snikket/persistence/Sqlite.hx
+++ b/snikket/persistence/Sqlite.hx
@@ -395,13 +395,13 @@ class Sqlite implements Persistence {
 	}
 
 	@HaxeCBridge.noemit
-	public function storeStreamManagement(accountId:String, smId:String, outboundCount:Int, inboundCount:Int, outboundQueue:Array<String>) {
+	public function storeStreamManagement(accountId:String, sm:BytesData) {
 		// TODO
 	}
 
 	@HaxeCBridge.noemit
-	public function getStreamManagement(accountId:String, callback: (Null<String>, Int, Int, Array<String>)->Void) {
-		callback(null, -1, -1, []); // TODO
+	public function getStreamManagement(accountId:String, callback: (Null<BytesData>)->Void) {
+		callback(null); // TODO
 	}
 
 	@HaxeCBridge.noemit
diff --git a/snikket/persistence/browser.js b/snikket/persistence/browser.js
index acea1f3..35936c0 100644
--- a/snikket/persistence/browser.js
+++ b/snikket/persistence/browser.js
@@ -508,10 +508,10 @@ const browser = (dbname, tokenize, stemmer) => {
 			}
 		},
 
-		storeStreamManagement: function(account, id, outbound, inbound, outbound_q) {
+		storeStreamManagement: function(account, sm) {
 			const tx = db.transaction(["keyvaluepairs"], "readwrite");
 			const store = tx.objectStore("keyvaluepairs");
-			store.put({ id: id, outbound: outbound, inbound: inbound, outbound_q }, "sm:" + account).onerror = console.error;
+			store.put(sm, "sm:" + account).onerror = console.error;
 		},
 
 		getStreamManagement: function(account, callback) {
@@ -519,11 +519,15 @@ const browser = (dbname, tokenize, stemmer) => {
 			const store = tx.objectStore("keyvaluepairs");
 			promisifyRequest(store.get("sm:" + account)).then(
 				(v) => {
-					callback(v?.id, v?.outbound, v?.inbound, v?.outbound_q || []);
+					if (v instanceof ArrayBuffer) {
+						callback(v);
+					} else {
+						new Blob([JSON.stringify(v)], {type: "text/plain; charset=utf-8"}).arrayBuffer().then(callback);
+					}
 				},
 				(e) => {
 					console.error(e);
-					callback(null, -1, -1, []);
+					callback(null);
 				}
 			);
 		},
diff --git a/snikket/streams/XmppJsStream.hx b/snikket/streams/XmppJsStream.hx
index 1364128..e1f08c5 100644
--- a/snikket/streams/XmppJsStream.hx
+++ b/snikket/streams/XmppJsStream.hx
@@ -1,8 +1,10 @@
 package snikket.streams;
 
-import js.lib.Promise;
 import haxe.Http;
 import haxe.Json;
+import haxe.io.Bytes;
+import haxe.io.BytesData;
+import js.lib.Promise;
 using Lambda;
 
 import snikket.FSM;
@@ -101,7 +103,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,outbound_q:Array<String>}> = null;
+	private var initialSM: Null<BytesData> = null;
 	private var resumed = false;
 
 	override public function new() {
@@ -187,10 +189,11 @@ class XmppJsStream extends GenericStream {
 		}
 
 		if (initialSM != null) {
-			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);
+			final parsedSM = haxe.Json.parse(Bytes.ofData(initialSM).toString());
+			xmpp.streamManagement.id = parsedSM.id;
+			xmpp.streamManagement.outbound = parsedSM.outbound;
+			xmpp.streamManagement.inbound = parsedSM.inbound;
+			xmpp.streamManagement.outbound_q = (parsedSM.outbound_q ?? []).map(XmppJsLtx.parse);
 			initialSM = null;
 		}
 
@@ -255,7 +258,7 @@ class XmppJsStream extends GenericStream {
 		});
 	}
 
-	public function connect(jid:String, sm:Null<{id:String,outbound:Int,inbound:Int,outbound_q:Array<String>}>) {
+	public function connect(jid:String, sm:Null<BytesData>) {
 		this.state.event("connect-requested");
 		this.jid = new XmppJsJID(jid);
 		this.initialSM = sm;
@@ -311,10 +314,12 @@ class XmppJsStream extends GenericStream {
 		this.trigger(
 			"sm/update",
 			{
-				id: client.streamManagement.id,
-				outbound: client.streamManagement.outbound,
-				inbound: client.streamManagement.inbound,
-				outbound_q: (client.streamManagement.outbound_q ?? []).map((stanza) -> stanza.toString()),
+				sm: Bytes.ofString(haxe.Json.stringify({
+					id: client.streamManagement.id,
+					outbound: client.streamManagement.outbound,
+					inbound: client.streamManagement.inbound,
+					outbound_q: (client.streamManagement.outbound_q ?? []).map((stanza) -> stanza.toString()),
+				})).getData()
 			}
 		);
 	}
diff --git a/snikket/streams/XmppStropheStream.hx b/snikket/streams/XmppStropheStream.hx
index e6aa44f..0c9fe85 100644
--- a/snikket/streams/XmppStropheStream.hx
+++ b/snikket/streams/XmppStropheStream.hx
@@ -1,6 +1,8 @@
 package snikket.streams;
 
 import haxe.DynamicAccess;
+import haxe.io.Bytes;
+import haxe.io.BytesData;
 
 import cpp.Char;
 import cpp.ConstPointer;
@@ -246,7 +248,7 @@ class XmppStropheStream extends GenericStream {
 		}
 	}
 
-	public function connect(jid:String, sm:Null<{id:String,outbound:Int,inbound:Int,outbound_q:Array<String>}>) {
+	public function connect(jid:String, sm:Null<BytesData>) {
 		StropheConn.set_jid(conn, NativeString.c_str(jid));
 		this.on("auth/password", function (event) {
 			var o = this;