UNPKG

@radzztnzx/rbail

Version:

Pro Bails based by Whiskeysockets, Modified by RadzzOffc

106 lines 3.93 kB
import PQueue from 'p-queue'; /** * Manages pre-key operations with proper concurrency control */ export class PreKeyManager { constructor(store, logger) { this.store = store; this.logger = logger; this.queues = new Map(); } /** * Get or create a queue for a specific key type */ getQueue(keyType) { if (!this.queues.has(keyType)) { this.queues.set(keyType, new PQueue({ concurrency: 1 })); } return this.queues.get(keyType); } /** * Process pre-key operations (updates and deletions) */ async processOperations(data, keyType, transactionCache, mutations, isInTransaction) { const keyData = data[keyType]; if (!keyData) return; return this.getQueue(keyType).add(async () => { // Ensure structures exist transactionCache[keyType] = transactionCache[keyType] || {}; mutations[keyType] = mutations[keyType] || {}; // Separate deletions from updates const deletions = []; const updates = {}; for (const keyId in keyData) { if (keyData[keyId] === null) { deletions.push(keyId); } else { updates[keyId] = keyData[keyId]; } } // Process updates (no validation needed) if (Object.keys(updates).length > 0) { Object.assign(transactionCache[keyType], updates); Object.assign(mutations[keyType], updates); } // Process deletions with validation if (deletions.length > 0) { await this.processDeletions(keyType, deletions, transactionCache, mutations, isInTransaction); } }); } /** * Process deletions with validation */ async processDeletions(keyType, ids, transactionCache, mutations, isInTransaction) { if (isInTransaction) { // In transaction, only allow deletion if key exists in cache for (const keyId of ids) { if (transactionCache[keyType]?.[keyId]) { transactionCache[keyType][keyId] = null; mutations[keyType][keyId] = null; } else { this.logger.warn(`Skipping deletion of non-existent ${keyType} in transaction: ${keyId}`); } } } else { // Outside transaction, validate against store const existingKeys = await this.store.get(keyType, ids); for (const keyId of ids) { if (existingKeys[keyId]) { transactionCache[keyType][keyId] = null; mutations[keyType][keyId] = null; } else { this.logger.warn(`Skipping deletion of non-existent ${keyType}: ${keyId}`); } } } } /** * Validate and process pre-key deletions outside transactions */ async validateDeletions(data, keyType) { const keyData = data[keyType]; if (!keyData) return; return this.getQueue(keyType).add(async () => { // Find all deletion requests const deletionIds = Object.keys(keyData).filter(id => keyData[id] === null); if (deletionIds.length === 0) return; // Validate deletions const existingKeys = await this.store.get(keyType, deletionIds); for (const keyId of deletionIds) { if (!existingKeys[keyId]) { this.logger.warn(`Skipping deletion of non-existent ${keyType}: ${keyId}`); delete data[keyType][keyId]; } } }); } } //# sourceMappingURL=pre-key-manager.js.map