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.
86 lines
2.2 KiB
86 lines
2.2 KiB
"use strict"; |
|
|
|
// Returns "Type(value) is Object" in ES terminology. |
|
function isObject(value) { |
|
return typeof value === "object" && value !== null || typeof value === "function"; |
|
} |
|
|
|
function getReferenceToBytes(bufferSource) { |
|
// Node.js' Buffer does not allow subclassing for now, so we can get away with a prototype object check for perf. |
|
if (Object.getPrototypeOf(bufferSource) === Buffer.prototype) { |
|
return bufferSource; |
|
} |
|
if (bufferSource instanceof ArrayBuffer) { |
|
return Buffer.from(bufferSource); |
|
} |
|
return Buffer.from(bufferSource.buffer, bufferSource.byteOffset, bufferSource.byteLength); |
|
} |
|
|
|
function getCopyToBytes(bufferSource) { |
|
return Buffer.from(getReferenceToBytes(bufferSource)); |
|
} |
|
|
|
function mixin(target, source) { |
|
const keys = Object.getOwnPropertyNames(source); |
|
for (let i = 0; i < keys.length; ++i) { |
|
if (keys[i] in target) { |
|
continue; |
|
} |
|
|
|
Object.defineProperty(target, keys[i], Object.getOwnPropertyDescriptor(source, keys[i])); |
|
} |
|
} |
|
|
|
const wrapperSymbol = Symbol("wrapper"); |
|
const implSymbol = Symbol("impl"); |
|
const sameObjectCaches = Symbol("SameObject caches"); |
|
|
|
function getSameObject(wrapper, prop, creator) { |
|
if (!wrapper[sameObjectCaches]) { |
|
wrapper[sameObjectCaches] = Object.create(null); |
|
} |
|
|
|
if (prop in wrapper[sameObjectCaches]) { |
|
return wrapper[sameObjectCaches][prop]; |
|
} |
|
|
|
wrapper[sameObjectCaches][prop] = creator(); |
|
return wrapper[sameObjectCaches][prop]; |
|
} |
|
|
|
function wrapperForImpl(impl) { |
|
return impl ? impl[wrapperSymbol] : null; |
|
} |
|
|
|
function implForWrapper(wrapper) { |
|
return wrapper ? wrapper[implSymbol] : null; |
|
} |
|
|
|
function tryWrapperForImpl(impl) { |
|
const wrapper = wrapperForImpl(impl); |
|
return wrapper ? wrapper : impl; |
|
} |
|
|
|
function tryImplForWrapper(wrapper) { |
|
const impl = implForWrapper(wrapper); |
|
return impl ? impl : wrapper; |
|
} |
|
|
|
const iterInternalSymbol = Symbol("internal"); |
|
const IteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]())); |
|
|
|
module.exports = exports = { |
|
isObject, |
|
getReferenceToBytes, |
|
getCopyToBytes, |
|
mixin, |
|
wrapperSymbol, |
|
implSymbol, |
|
getSameObject, |
|
wrapperForImpl, |
|
implForWrapper, |
|
tryWrapperForImpl, |
|
tryImplForWrapper, |
|
iterInternalSymbol, |
|
IteratorPrototype |
|
};
|
|
|