feat(plugins): handle granular disk and partition invalidation in Mercure listener

main
Juan Manuel Bardallo 2026-10-26 13:56:51 +01:00
parent fb437fd8a9
commit 0cba5933e4
1 changed files with 42 additions and 9 deletions

View File

@ -143,16 +143,49 @@ export class PluginService {
const disk = data.disk ?? data.disk_number ?? data.diskNumber;
const part = data.partition ?? data.partition_number ?? data.partitionNumber;
if (data.clientId !== undefined && data.clientId !== null) {
this.setPluginStatus(data.plugin, String(data.clientId), data.status);
if (disk !== undefined && disk !== null && part !== undefined && part !== null) {
this.setPartitionPluginStatus(data.plugin, String(data.clientId), Number(disk), Number(part), data.status);
const clearEntriesForPrefix = (prefix: string) => {
for (const key of Array.from(this.clientPluginStatusMap.keys())) {
if (key.startsWith(prefix)) {
this.clientPluginStatusMap.delete(key);
}
}
}
if (data.clientUuid) {
this.setPluginStatus(data.plugin, data.clientUuid, data.status);
if (disk !== undefined && disk !== null && part !== undefined && part !== null) {
this.setPartitionPluginStatus(data.plugin, data.clientUuid, Number(disk), Number(part), data.status);
};
if (data.status === 'NONE') {
if (data.clientId !== undefined && data.clientId !== null) {
const idStr = String(data.clientId);
if (disk !== undefined && disk !== null && part !== undefined && part !== null) {
this.clientPluginStatusMap.delete(this.getPartitionStatusKey(data.plugin, idStr, Number(disk), Number(part)));
} else if (disk !== undefined && disk !== null) {
clearEntriesForPrefix(`${data.plugin}:${idStr}:${disk}:`);
} else {
this.clientPluginStatusMap.delete(this.getStatusKey(data.plugin, idStr));
clearEntriesForPrefix(`${data.plugin}:${idStr}:`);
}
}
if (data.clientUuid) {
const uuidStr = data.clientUuid;
if (disk !== undefined && disk !== null && part !== undefined && part !== null) {
this.clientPluginStatusMap.delete(this.getPartitionStatusKey(data.plugin, uuidStr, Number(disk), Number(part)));
} else if (disk !== undefined && disk !== null) {
clearEntriesForPrefix(`${data.plugin}:${uuidStr}:${disk}:`);
} else {
this.clientPluginStatusMap.delete(this.getStatusKey(data.plugin, uuidStr));
clearEntriesForPrefix(`${data.plugin}:${uuidStr}:`);
}
}
} else {
if (data.clientId !== undefined && data.clientId !== null) {
this.setPluginStatus(data.plugin, String(data.clientId), data.status);
if (disk !== undefined && disk !== null && part !== undefined && part !== null) {
this.setPartitionPluginStatus(data.plugin, String(data.clientId), Number(disk), Number(part), data.status);
}
}
if (data.clientUuid) {
this.setPluginStatus(data.plugin, data.clientUuid, data.status);
if (disk !== undefined && disk !== null && part !== undefined && part !== null) {
this.setPartitionPluginStatus(data.plugin, data.clientUuid, Number(disk), Number(part), data.status);
}
}
}
}