git » sdk » commit 43a75ce

Implement getOmemoPreKeys

author Eric Roberts
2026-08-26 18:14:51 UTC
committer Stephen Paul Weber
2026-08-26 18:16:17 UTC
parent 163762d841fabe5488fb5e114a47420cf3fb2ce7

Implement getOmemoPreKeys

borogove/persistence/Sqlite.hx +10 -1
test/TestSqlite.hx +31 -0
test/persistence-tests.ts +38 -0

diff --git a/borogove/persistence/Sqlite.hx b/borogove/persistence/Sqlite.hx
index fc0995f..8717921 100644
--- a/borogove/persistence/Sqlite.hx
+++ b/borogove/persistence/Sqlite.hx
@@ -1547,7 +1547,16 @@ class Sqlite implements Persistence implements KeyValueStore {
 
 	@HaxeCBridge.noemit
 	public function getOmemoPreKeys(login:String): Promise<Array<PreKey>> {
-		return Promise.resolve([]);
+		return db.exec(
+			"SELECT key_id, private_key, public_key FROM omemo_prekeys WHERE account_id=? ORDER BY key_id",
+			[login],
+		).then(result -> { iterator: () -> result }.map(row -> ({
+			keyId: row.key_id,
+			keyPair: {
+				privKey: row.private_key,
+				pubKey: row.public_key,
+			},
+		})));
 	}
 
 	@HaxeCBridge.noemit
diff --git a/test/TestSqlite.hx b/test/TestSqlite.hx
index c1f6c8f..388837e 100644
--- a/test/TestSqlite.hx
+++ b/test/TestSqlite.hx
@@ -1444,6 +1444,37 @@ class TestSqlite extends utest.Test {
 			});
 	}
 
+	public function testOmemoPreKeys(async: Async) {
+		final login = "prekeys-existing@example.com";
+		final keyPair1 = {
+			privKey: Bytes.ofHex("000102").getData(),
+			pubKey: Bytes.ofHex("030405").getData(),
+		};
+		final keyPair2 = {
+			privKey: Bytes.ofHex("060708").getData(),
+			pubKey: Bytes.ofHex("090a0b").getData(),
+		};
+
+		persistence
+			.storeOmemoPreKey(login, 2, keyPair1)
+			.then(_ -> persistence.storeOmemoPreKey(login, 3, keyPair2))
+			.then(_ -> persistence.getOmemoPreKeys(login))
+			.then(result -> {
+				Assert.equals(2, result.length);
+				Assert.equals(2, result[0].keyId);
+				Assert.equals("000102", Bytes.ofData(result[0].keyPair.privKey).toHex());
+				Assert.equals("030405", Bytes.ofData(result[0].keyPair.pubKey).toHex());
+				Assert.equals(3, result[1].keyId);
+				Assert.equals("060708", Bytes.ofData(result[1].keyPair.privKey).toHex());
+				Assert.equals("090a0b", Bytes.ofData(result[1].keyPair.pubKey).toHex());
+				async.done();
+			})
+			.catchError(e -> {
+				Assert.fail(Std.string(e));
+				async.done();
+			});
+	}
+
 	public function testOmemoSignedPreKey(async: Async) {
 		final login = "signed-prekey@example.com";
 		final signedPreKey = {
diff --git a/test/persistence-tests.ts b/test/persistence-tests.ts
index 8a32158..14c751e 100644
--- a/test/persistence-tests.ts
+++ b/test/persistence-tests.ts
@@ -1649,6 +1649,44 @@ export function sharedPersistenceTests(test: PersistenceTest) {
 		expect(result.afterRemove).toBeNull();
 	});
 
+	test("getOmemoPreKeys lists stored pre-keys", async ({
+		page,
+		persistence,
+	}) => {
+		const identifier = "omemo-prekeys-existing@example.com";
+		const preKeys = [
+			{
+				keyId: 2,
+				privKey: [0, 1, 2],
+				pubKey: [3, 4, 5],
+			},
+			{
+				keyId: 3,
+				privKey: [6, 7, 8],
+				pubKey: [9, 10, 11],
+			},
+		];
+		const result = await page.evaluate(
+			async ({ persistence, identifier, preKeys }) => {
+				for (const preKey of preKeys) {
+					await persistence.storeOmemoPreKey(identifier, preKey.keyId, {
+						privKey: new Uint8Array(preKey.privKey).buffer,
+						pubKey: new Uint8Array(preKey.pubKey).buffer,
+					});
+				}
+				const loaded = await persistence.getOmemoPreKeys(identifier);
+				return loaded.map((preKey) => ({
+					keyId: preKey.keyId,
+					privKey: [...new Uint8Array(preKey.keyPair.privKey)],
+					pubKey: [...new Uint8Array(preKey.keyPair.pubKey)],
+				}));
+			},
+			{ persistence, identifier, preKeys },
+		);
+
+		expect(result).toEqual(preKeys);
+	});
+
 	test("storeOmemoSignedPreKey and getOmemoSignedPreKey", async ({
 		page,
 		persistence,