| 194 | * @param {Number} [reserverdOperations] - number of decrypt operations initially used |
| 195 | */ |
| 196 | export async function set({key, password, reservedOperations = 0}) { |
| 197 | // primary key fingerprint is main key of cache |
| 198 | const primaryKeyFpr = key.getFingerprint(); |
| 199 | let entry; |
| 200 | let newEntry; |
| 201 | if (await cache.has(primaryKeyFpr)) { |
| 202 | entry = await cache.get(primaryKeyFpr); |
| 203 | // update remaining number of operations |
| 204 | entry.operations -= reservedOperations; |
| 205 | clearInterval(entry.tlTimer); |
| 206 | } else { |
| 207 | entry = {key, password}; |
| 208 | newEntry = true; |
| 209 | // set max. number of operations |
| 210 | entry.operations = Math.max(0, RATE_LIMIT - reservedOperations); |
| 211 | } |
| 212 | // clear after time limit rate has been reached |
| 213 | entry.tlOperations = Math.max(0, TIME_LIMIT_RATE - reservedOperations); |
| 214 | entry.tlTimer = setInterval(() => { |
| 215 | entry.tlOperations = TIME_LIMIT_RATE; |
| 216 | }, TIME_LIMIT * 60 * 1000); |
| 217 | await cache.set(primaryKeyFpr, entry, newEntry); |
| 218 | } |
| 219 | |
| 220 | /** |
| 221 | * Get number of decryptable session keys |