This app provides monitoring and information features for the common freifunk user and the technical stuff of a freifunk community.
Code base is taken from a TUM Practical Course project and added here to see if Freifunk Altdorf can use it.
https://www.freifunk-altdorf.de
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.3 KiB
64 lines
1.3 KiB
/** |
|
* Copyright (c) 2018-present, Facebook, Inc. |
|
* |
|
* This source code is licensed under the MIT license found in the |
|
* LICENSE file in the root directory of this source tree. |
|
* |
|
* @flow |
|
* @format |
|
*/ |
|
|
|
'use strict'; |
|
|
|
import type {CacheStore} from 'metro-cache'; |
|
|
|
class Cache<T> { |
|
_stores: $ReadOnlyArray<CacheStore<T>>; |
|
|
|
_hits: WeakMap<Buffer, CacheStore<T>>; |
|
|
|
constructor(stores: $ReadOnlyArray<CacheStore<T>>) { |
|
this._hits = new WeakMap(); |
|
this._stores = stores; |
|
} |
|
|
|
async get(key: Buffer): Promise<?T> { |
|
const stores = this._stores; |
|
const length = stores.length; |
|
|
|
for (let i = 0; i < length; i++) { |
|
let value = stores[i].get(key); |
|
|
|
if (value instanceof Promise) { |
|
value = await value; |
|
} |
|
|
|
if (value != null) { |
|
this._hits.set(key, stores[i]); |
|
|
|
return value; |
|
} |
|
} |
|
|
|
return null; |
|
} |
|
|
|
set(key: Buffer, value: T): void { |
|
const stores = this._stores; |
|
const stop = this._hits.get(key); |
|
const length = stores.length; |
|
const promises = []; |
|
|
|
for (let i = 0; i < length && stores[i] !== stop; i++) { |
|
promises.push(stores[i].set(key, value)); |
|
} |
|
|
|
Promise.all(promises).catch(err => { |
|
process.nextTick(() => { |
|
throw err; |
|
}); |
|
}); |
|
} |
|
} |
|
|
|
module.exports = Cache;
|
|
|