audit
This commit is contained in:
@@ -129,4 +129,32 @@ function enqueueSend(channel, ...args) {
|
||||
return next;
|
||||
}
|
||||
|
||||
module.exports = { enqueueRename, enqueueMove, enqueueSend };
|
||||
// Delete a channel only after every in-flight send/rename/move on it has drained.
|
||||
// Chains on both renameChains and sendChains so "pending send in-flight, delete
|
||||
// racing it" can no longer hit Discord's unknown-channel 10003.
|
||||
function enqueueDelete(channel) {
|
||||
if (!channel || typeof channel.delete !== 'function') {
|
||||
return Promise.reject(new Error('enqueueDelete: invalid channel'));
|
||||
}
|
||||
const renameEntry = renameChains.get(channel.id);
|
||||
const prevRename = renameEntry ? renameEntry.chain : Promise.resolve();
|
||||
const prevSend = sendChains.get(channel.id) || Promise.resolve();
|
||||
|
||||
const next = Promise.all([
|
||||
prevRename.catch(() => {}),
|
||||
prevSend.catch(() => {})
|
||||
]).then(() => channel.delete().catch(() => {}));
|
||||
|
||||
if (renameEntry) renameEntry.chain = next;
|
||||
sendChains.set(channel.id, next);
|
||||
|
||||
next.finally(() => {
|
||||
if (renameEntry && renameChains.get(channel.id) === renameEntry && renameEntry.chain === next) {
|
||||
renameChains.delete(channel.id);
|
||||
}
|
||||
if (sendChains.get(channel.id) === next) sendChains.delete(channel.id);
|
||||
});
|
||||
return next;
|
||||
}
|
||||
|
||||
module.exports = { enqueueRename, enqueueMove, enqueueSend, enqueueDelete };
|
||||
|
||||
Reference in New Issue
Block a user