Add transaction support to kyber triples

This commit is contained in:
Fedor Indutny
2025-09-30 15:53:46 -07:00
committed by GitHub
parent b2f1639146
commit c25ba3f2a4
3 changed files with 88 additions and 18 deletions

View File

@@ -397,6 +397,8 @@ export const DataReader: ServerReadableInterface = {
getAllSessions,
getAllKyberTriples,
getConversationCount,
getConversationById,
@@ -532,7 +534,6 @@ export const DataWriter: ServerWritableInterface = {
bulkAddKyberPreKeys,
removeKyberPreKeyById,
removeKyberPreKeysByServiceId,
markKyberTripleSeenOrFail,
removeAllKyberPreKeys,
createOrUpdatePreKey,
@@ -1080,7 +1081,7 @@ function removeKyberPreKeysByServiceId(
function markKyberTripleSeenOrFail(
db: WritableDB,
{ id, signedPreKeyId, baseKey }: KyberPreKeyTripleType
): 'seen' | 'fail' {
): void {
// Notes that `kyberPreKey_triples` has
// - Unique constraint on id, signedPreKeyId, baseKey so that we can't insert
// two identical rows
@@ -1095,10 +1096,9 @@ function markKyberTripleSeenOrFail(
try {
db.prepare(query).run(parameters);
return 'seen';
} catch (error) {
if (error.code === 'SQLITE_CONSTRAINT_UNIQUE') {
return 'fail';
throw new Error(`Duplicate kyber triple ${id}:${signedPreKeyId}`);
}
// Unexpected error
@@ -1699,12 +1699,14 @@ function commitDecryptResult(
senderKeys,
sessions,
unprocessed,
kyberTriples,
}: {
kyberPreKeysToRemove: Array<PreKeyIdType>;
preKeysToRemove: Array<PreKeyIdType>;
senderKeys: Array<SenderKeyType>;
sessions: Array<SessionType>;
unprocessed: Array<UnprocessedType>;
kyberTriples: Array<KyberPreKeyTripleType>;
}
): void {
db.transaction(() => {
@@ -1745,6 +1747,10 @@ function commitDecryptResult(
for (const item of unprocessed) {
saveUnprocessed(db, item);
}
for (const item of kyberTriples) {
markKyberTripleSeenOrFail(db, item);
}
})();
}
@@ -1783,6 +1789,9 @@ function removeAllSessions(db: WritableDB): number {
function getAllSessions(db: ReadableDB): Array<SessionType> {
return db.prepare('SELECT * FROM sessions').all();
}
function getAllKyberTriples(db: ReadableDB): Array<KyberPreKeyTripleType> {
return db.prepare('SELECT * FROM kyberPreKey_triples').all();
}
// Conversations
function getConversationCount(db: ReadableDB): number {