git » sdk » commit 4f74da5

Store mime type along with media

author Stephen Paul Weber
2023-09-13 18:51:32 UTC
committer Stephen Paul Weber
2023-09-13 18:53:11 UTC
parent 8b138a608af1fe776693988a07d4a497f7310098

Store mime type along with media

Otherwise the mime sniffer kicks in and doesn't support eg SVG properly.

xmpp/Client.hx +10 -1
xmpp/Persistence.hx +1 -1
xmpp/persistence/browser.js +2 -2

diff --git a/xmpp/Client.hx b/xmpp/Client.hx
index 4bb7a20..a250fc0 100644
--- a/xmpp/Client.hx
+++ b/xmpp/Client.hx
@@ -52,8 +52,17 @@ class Client extends xmpp.EventEmitter {
 
 			final pubsubEvent = PubsubEvent.fromStanza(stanza);
 			if (pubsubEvent != null && pubsubEvent.getFrom() != null && pubsubEvent.getNode() == "urn:xmpp:avatar:metadata" && pubsubEvent.getItems().length > 0) {
+				final item = pubsubEvent.getItems()[0];
 				final avatarSha1Hex = pubsubEvent.getItems()[0].attr.get("id");
 				final avatarSha1 = Bytes.ofHex(avatarSha1Hex).getData();
+				final metadata = item.getChild("metadata", "urn:xmpp:avatar:metadata");
+				var mime = "image/png";
+				if (metadata != null) {
+					final info = metadata.getChild("info"); // should have xmlns matching metadata
+					if (info != null && info.attr.get("type") != null) {
+						mime = info.attr.get("type");
+					}
+				}
 				final chat = this.getDirectChat(JID.parse(pubsubEvent.getFrom()).asBare().asString(), false);
 				chat.setAvatarSha1(avatarSha1);
 				persistence.getMediaUri("sha-1", avatarSha1, (uri) -> {
@@ -64,7 +73,7 @@ class Client extends xmpp.EventEmitter {
 							if (item == null) return;
 							final dataNode = item.getChild("data", "urn:xmpp:avatar:data");
 							if (dataNode == null) return;
-							persistence.storeMedia(Base64.decode(dataNode.getText()).getData(), () -> {
+							persistence.storeMedia(mime, Base64.decode(StringTools.replace(dataNode.getText(), "\n", "")).getData(), () -> {
 								this.trigger("chats/update", [chat]);
 							});
 						});
diff --git a/xmpp/Persistence.hx b/xmpp/Persistence.hx
index af1396f..3698acb 100644
--- a/xmpp/Persistence.hx
+++ b/xmpp/Persistence.hx
@@ -8,5 +8,5 @@ abstract class Persistence {
 	abstract public function storeMessage(accountId: String, message: ChatMessage):Void;
 	abstract public function getMessages(accountId: String, chatId: String, beforeId: Null<String>, beforeTime: Null<String>, callback: (messages:Array<ChatMessage>)->Void):Void;
 	abstract public function getMediaUri(hashAlgorithm:String, hash:BytesData, callback: (uri:Null<String>)->Void):Void;
-	abstract public function storeMedia(bytes:BytesData, callback: ()->Void):Void;
+	abstract public function storeMedia(mime:String, bytes:BytesData, callback: ()->Void):Void;
 }
diff --git a/xmpp/persistence/browser.js b/xmpp/persistence/browser.js
index 3bc9412..0848e4d 100644
--- a/xmpp/persistence/browser.js
+++ b/xmpp/persistence/browser.js
@@ -123,13 +123,13 @@ exports.xmpp.persistence = {
 				});
 			},
 
-			storeMedia: function(buffer, callback) {
+			storeMedia: function(mime, buffer, callback) {
 				(async function() {
 					const sha256 = await crypto.subtle.digest("SHA-256", buffer);
 					const sha512 = await crypto.subtle.digest("SHA-512", buffer);
 					const sha1 = await crypto.subtle.digest("SHA-1", buffer);
 					const sha256NiUrl = mkNiUrl("sha-256", sha256);
-					await cache.put(sha256NiUrl, new Response(buffer));
+					await cache.put(sha256NiUrl, new Response(buffer, { headers: { "Content-Type": mime } }));
 					localStorage.setItem(mkNiUrl("sha-1", sha1), sha256NiUrl);
 					localStorage.setItem(mkNiUrl("sha-512", sha512), sha256NiUrl);
 				})().then(callback);