changed fetch publickeys to a queue

This commit is contained in:
PhilReact 2024-12-31 05:55:48 +02:00
parent 262bbf169e
commit c68351e096

View File

@ -2,6 +2,7 @@ import { getBaseApi } from "../background";
import { createSymmetricKeyAndNonce, decryptGroupData, encryptDataGroup, objectToBase64 } from "../qdn/encryption/group-encryption"; import { createSymmetricKeyAndNonce, decryptGroupData, encryptDataGroup, objectToBase64 } from "../qdn/encryption/group-encryption";
import { publishData } from "../qdn/publish/pubish"; import { publishData } from "../qdn/publish/pubish";
import { getData } from "../utils/chromeStorage"; import { getData } from "../utils/chromeStorage";
import { RequestQueueWithPromise } from "../utils/queue/queue";
const apiEndpoints = [ const apiEndpoints = [
"https://api.qortal.org", "https://api.qortal.org",
@ -13,6 +14,7 @@ const apiEndpoints = [
"https://apinode3.qortalnodes.live", "https://apinode3.qortalnodes.live",
"https://apinode4.qortalnodes.live", "https://apinode4.qortalnodes.live",
]; ];
export const requestQueueGetPublicKeys = new RequestQueueWithPromise(10);
async function findUsableApi() { async function findUsableApi() {
for (const endpoint of apiEndpoints) { for (const endpoint of apiEndpoints) {
@ -65,44 +67,51 @@ async function getKeyPair() {
throw new Error("Wallet not authenticated"); throw new Error("Wallet not authenticated");
} }
} }
const getPublicKeys = async (groupNumber: number) => { const getPublicKeys = async (groupNumber: number) => {
const validApi = await getBaseApi() const validApi = await getBaseApi();
const response = await fetch(`${validApi}/groups/members/${groupNumber}?limit=0`); const response = await fetch(`${validApi}/groups/members/${groupNumber}?limit=0`);
const groupData = await response.json(); const groupData = await response.json();
let members: any = []; if (groupData && Array.isArray(groupData.members)) {
if (groupData && Array.isArray(groupData?.members)) { // Use the request queue for fetching public keys
for (const member of groupData.members) { const memberPromises = groupData.members
if (member.member) { .filter((member) => member.member)
.map((member) =>
requestQueueGetPublicKeys.enqueue(async () => {
const resAddress = await fetch(`${validApi}/addresses/${member.member}`); const resAddress = await fetch(`${validApi}/addresses/${member.member}`);
const resData = await resAddress.json(); const resData = await resAddress.json();
const publicKey = resData.publicKey; return resData.publicKey;
members.push(publicKey) })
} );
}
}
return members const members = await Promise.all(memberPromises);
} return members;
}
export const getPublicKeysByAddress = async (admins) => { return [];
const validApi = await getBaseApi() };
export const getPublicKeysByAddress = async (admins: string[]) => {
const validApi = await getBaseApi();
let members: any = []; if (Array.isArray(admins)) {
if (Array.isArray(admins)) { // Use the request queue to limit concurrent fetches
for (const address of admins) { const memberPromises = admins
if (address) { .filter((address) => address) // Ensure the address is valid
.map((address) =>
requestQueueGetPublicKeys.enqueue(async () => {
const resAddress = await fetch(`${validApi}/addresses/${address}`); const resAddress = await fetch(`${validApi}/addresses/${address}`);
const resData = await resAddress.json(); const resData = await resAddress.json();
const publicKey = resData.publicKey; return resData.publicKey;
members.push(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}: { export const encryptAndPublishSymmetricKeyGroupChatForAdmins = async ({groupId, previousData, admins}: {