From b0c940b8e3e278a6bb63dc429d44429a29440b48 Mon Sep 17 00:00:00 2001 From: PhilReact Date: Tue, 31 Dec 2024 05:55:58 +0200 Subject: [PATCH] changed fetch publickeys to a queue --- src/backgroundFunctions/encryption.ts | 68 +++++++++++++++------------ 1 file changed, 39 insertions(+), 29 deletions(-) diff --git a/src/backgroundFunctions/encryption.ts b/src/backgroundFunctions/encryption.ts index c30caac..1e3bdf1 100644 --- a/src/backgroundFunctions/encryption.ts +++ b/src/backgroundFunctions/encryption.ts @@ -1,6 +1,7 @@ import { getBaseApi, getKeyPair } from "../background"; import { createSymmetricKeyAndNonce, decryptGroupData, encryptDataGroup, objectToBase64 } from "../qdn/encryption/group-encryption"; import { publishData } from "../qdn/publish/pubish"; +import { RequestQueueWithPromise } from "../utils/queue/queue"; const apiEndpoints = [ "https://api.qortal.org", @@ -13,6 +14,8 @@ const apiEndpoints = [ "https://apinode4.qortalnodes.live", ]; +export const requestQueueGetPublicKeys = new RequestQueueWithPromise(10); + async function findUsableApi() { for (const endpoint of apiEndpoints) { try { @@ -64,43 +67,50 @@ export async function getNameInfo() { // } // } const getPublicKeys = async (groupNumber: number) => { - const validApi = await getBaseApi() - const response = await fetch(`${validApi}/groups/members/${groupNumber}?limit=0`); - const groupData = await response.json(); + const validApi = await getBaseApi(); + const response = await fetch(`${validApi}/groups/members/${groupNumber}?limit=0`); + const groupData = await response.json(); - let members: any = []; - if (groupData && Array.isArray(groupData?.members)) { - for (const member of groupData.members) { - if (member.member) { - const resAddress = await fetch(`${validApi}/addresses/${member.member}`); - const resData = await resAddress.json(); - const publicKey = resData.publicKey; - members.push(publicKey) - } - } - } + if (groupData && Array.isArray(groupData.members)) { + // Use the request queue for fetching public keys + const memberPromises = groupData.members + .filter((member) => member.member) + .map((member) => + requestQueueGetPublicKeys.enqueue(async () => { + const resAddress = await fetch(`${validApi}/addresses/${member.member}`); + const resData = await resAddress.json(); + return resData.publicKey; + }) + ); - return members + const members = await Promise.all(memberPromises); + return members; } - export const getPublicKeysByAddress = async (admins) => { - const validApi = await getBaseApi() + return []; +}; +export const getPublicKeysByAddress = async (admins: string[]) => { + const validApi = await getBaseApi(); - let members: any = []; - if (Array.isArray(admins)) { - for (const address of admins) { - if (address) { - const resAddress = await fetch(`${validApi}/addresses/${address}`); - const resData = await resAddress.json(); - const publicKey = resData.publicKey; - members.push(publicKey) - } - } - } + if (Array.isArray(admins)) { + // Use the request queue to limit concurrent fetches + const memberPromises = admins + .filter((address) => address) // Ensure the address is valid + .map((address) => + requestQueueGetPublicKeys.enqueue(async () => { + const resAddress = await fetch(`${validApi}/addresses/${address}`); + const resData = await resAddress.json(); + return resData.publicKey; + }) + ); - return members + const members = await Promise.all(memberPromises); + return members; } + + return []; // Return empty array if admins is not an array +}; export const encryptAndPublishSymmetricKeyGroupChatForAdmins = async ({groupId, previousData, admins}: { groupId: number, previousData: Object,