Merge pull request #2025 from PR0M3TH3AN/perf-batch-delete-parallel-publish-14322040273726865832

⚡ Parallelize publishing in batch delete
This commit is contained in:
thePR0M3TH3AN authored and GitHub committed 2026-01-31 15:03:02 -05:00
commit a432d3d4c0
1 file changed
+54 -40
+54 -40
View File
@@ -6737,7 +6737,13 @@ export class NostrClient {
}
const chunkSize = 100;
for (let index = 0; index < identifierRecords.length; index += chunkSize) {
const publishPromises = [];
for (
let index = 0;
index < identifierRecords.length;
index += chunkSize
) {
const chunk = identifierRecords.slice(index, index + chunkSize);
const eventIds = chunk
.filter((record) => record.type === "e")
@@ -6757,50 +6763,58 @@ export class NostrClient {
});
const signedDelete = await queueSignEvent(signer, deleteEvent);
const publishResults = await publishEventToRelays(
this.pool,
this.relays,
signedDelete,
);
const publishSummary = summarizePublishResults(publishResults);
publishSummary.accepted.forEach(({ url }) =>
devLogger.log(`Delete event published to ${url}`),
);
const publishPromise = (async () => {
const publishResults = await publishEventToRelays(
this.pool,
this.relays,
signedDelete,
);
const publishSummary = summarizePublishResults(publishResults);
if (publishSummary.failed.length) {
publishSummary.failed.forEach(({ url, error: relayError }) => {
const reason =
relayError instanceof Error
? relayError.message
: relayError
? String(relayError)
: "publish failed";
userLogger.warn(
`[nostr] Delete event not accepted by ${url}: ${reason}`,
relayError,
);
});
}
publishSummary.accepted.forEach(({ url }) =>
devLogger.log(`Delete event published to ${url}`)
);
if (signedDelete?.id) {
this.rawEvents.set(signedDelete.id, signedDelete);
}
if (publishSummary.failed.length) {
publishSummary.failed.forEach(({ url, error: relayError }) => {
const reason =
relayError instanceof Error
? relayError.message
: relayError
? String(relayError)
: "publish failed";
userLogger.warn(
`[nostr] Delete event not accepted by ${url}: ${reason}`,
relayError
);
});
}
deleteSummaries.push({
event: signedDelete,
publishResults,
summary: publishSummary,
identifiers: {
events: chunk
.filter((record) => record.type === "e")
.map((record) => record.value),
addresses: chunk
.filter((record) => record.type === "a")
.map((record) => record.value),
},
});
if (signedDelete?.id) {
this.rawEvents.set(signedDelete.id, signedDelete);
}
return {
event: signedDelete,
publishResults,
summary: publishSummary,
identifiers: {
events: chunk
.filter((record) => record.type === "e")
.map((record) => record.value),
addresses: chunk
.filter((record) => record.type === "a")
.map((record) => record.value),
},
};
})();
publishPromises.push(publishPromise);
}
const chunkResults = await Promise.all(publishPromises);
deleteSummaries.push(...chunkResults);
}
this.saveLocalData("delete-events", { immediate: true });