Merge pull request #2113 from PR0M3TH3AN/perf/optimize-dm-decryptor-4239688647313826826

⚡ Optimize DM decryption with parallel execution
This commit is contained in:
thePR0M3TH3AN authored and GitHub committed 2026-02-05 14:43:54 -05:00
commit 2003cd7e3d
2 files changed
+184 -41

No files matched your search

+54 -41
View File
@@ -501,53 +501,66 @@ async function decryptLegacyDm(event, decryptors, actorPubkey) {
registerRemote(recipient?.pubkey);
}
for (const decryptor of ordered) {
for (const remotePubkey of remoteCandidates) {
try {
const plaintext = await decryptor.decrypt(remotePubkey, ciphertext, {
event,
stage: "content",
remotePubkey,
});
const attemptDecryption = async (decryptor, remotePubkey) => {
try {
const plaintext = await decryptor.decrypt(remotePubkey, ciphertext, {
event,
stage: "content",
remotePubkey,
});
if (typeof plaintext === "string") {
const resolvedScheme =
normalizeScheme(hints.algorithms?.[0]) ||
normalizeScheme(decryptor.scheme) ||
"";
return buildDecryptResult({
ok: true,
event,
message: {
...cloneEvent(event),
content: plaintext,
},
plaintext,
recipients,
senderPubkey,
actorPubkey,
decryptor,
scheme: resolvedScheme,
});
}
} catch (error) {
errors.push({
scheme: decryptor.scheme || "",
source: decryptor.source || "",
stage: "content",
remotePubkey,
error,
if (typeof plaintext === "string") {
const resolvedScheme =
normalizeScheme(hints.algorithms?.[0]) ||
normalizeScheme(decryptor.scheme) ||
"";
return buildDecryptResult({
ok: true,
event,
message: {
...cloneEvent(event),
content: plaintext,
},
plaintext,
recipients,
senderPubkey,
actorPubkey,
decryptor,
scheme: resolvedScheme,
});
}
throw new Error("Decrypted content was not a valid string.");
} catch (error) {
throw {
scheme: decryptor.scheme || "",
source: decryptor.source || "",
stage: "content",
remotePubkey,
error,
};
}
};
const attempts = [];
for (const decryptor of ordered) {
for (const remotePubkey of remoteCandidates) {
attempts.push(attemptDecryption(decryptor, remotePubkey));
}
}
return buildDecryptResult({
ok: false,
event,
actorPubkey,
errors,
});
try {
return await Promise.any(attempts);
} catch (aggregateError) {
const aggregatedErrors = aggregateError.errors || [];
errors.push(...aggregatedErrors);
return buildDecryptResult({
ok: false,
event,
actorPubkey,
errors,
});
}
}
export async function decryptDM(event, context = {}) {