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.
65 lines
1.7 KiB
65 lines
1.7 KiB
/** |
|
* Copyright (c) 2013-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. |
|
* |
|
* @providesModule defineLazyObjectProperty |
|
* @flow |
|
*/ |
|
|
|
'use strict'; |
|
|
|
/** |
|
* Defines a lazily evaluated property on the supplied `object`. |
|
*/ |
|
function defineLazyObjectProperty<T>( |
|
object: Object, |
|
name: string, |
|
descriptor: { |
|
get: () => T, |
|
enumerable?: boolean, |
|
writable?: boolean, |
|
}, |
|
): void { |
|
const {get} = descriptor; |
|
const enumerable = descriptor.enumerable !== false; |
|
const writable = descriptor.writable !== false; |
|
|
|
let value; |
|
let valueSet = false; |
|
function getValue(): T { |
|
// WORKAROUND: A weird infinite loop occurs where calling `getValue` calls |
|
// `setValue` which calls `Object.defineProperty` which somehow triggers |
|
// `getValue` again. Adding `valueSet` breaks this loop. |
|
if (!valueSet) { |
|
// Calling `get()` here can trigger an infinite loop if it fails to |
|
// remove the getter on the property, which can happen when executing |
|
// JS in a V8 context. `valueSet = true` will break this loop, and |
|
// sets the value of the property to undefined, until the code in `get()` |
|
// finishes, at which point the property is set to the correct value. |
|
valueSet = true; |
|
setValue(get()); |
|
} |
|
return value; |
|
} |
|
function setValue(newValue: T): void { |
|
value = newValue; |
|
valueSet = true; |
|
Object.defineProperty(object, name, { |
|
value: newValue, |
|
configurable: true, |
|
enumerable, |
|
writable, |
|
}); |
|
} |
|
|
|
Object.defineProperty(object, name, { |
|
get: getValue, |
|
set: setValue, |
|
configurable: true, |
|
enumerable, |
|
}); |
|
} |
|
|
|
module.exports = defineLazyObjectProperty;
|
|
|