feat: refactoring project

This commit is contained in:
Carlos
2024-11-23 14:56:07 -05:00
parent f0c2a50c18
commit 1c6db5818d
2351 changed files with 39323 additions and 60326 deletions

View File

@@ -137,8 +137,9 @@ jsTypes.set(TypeError, new ErrorObjectSerializer(TypeError));
// If in a sandboxed environment (e. g. jest), this escapes the sandbox and registers
// real Object and Array types to. These types may occur in the wild too, e. g. when
// using Structured Clone in postMessage.
// eslint-disable-next-line n/exports-style
if (exports.constructor !== Object) {
// eslint-disable-next-line jsdoc/check-types
// eslint-disable-next-line jsdoc/check-types, n/exports-style
const Obj = /** @type {typeof Object} */ (exports.constructor);
const Fn = /** @type {typeof Function} */ (Obj.constructor);
for (const [type, config] of Array.from(jsTypes)) {
@@ -185,6 +186,7 @@ class ObjectMiddleware extends SerializerMiddleware {
this.extendContext = extendContext;
this._hashFunction = hashFunction;
}
/**
* @param {RegExp} regExp RegExp for which the request is tested
* @param {function(string): boolean} loader loader to load the request, returns true when successful
@@ -202,7 +204,7 @@ class ObjectMiddleware extends SerializerMiddleware {
* @returns {void}
*/
static register(Constructor, request, name, serializer) {
const key = request + "/" + name;
const key = `${request}/${name}`;
if (serializers.has(Constructor)) {
throw new Error(
@@ -267,7 +269,7 @@ class ObjectMiddleware extends SerializerMiddleware {
* @returns {ObjectSerializer} serializer
*/
static getDeserializerFor(request, name) {
const key = request + "/" + name;
const key = `${request}/${name}`;
const serializer = serializerInversed.get(key);
if (serializer === undefined) {
@@ -279,11 +281,11 @@ class ObjectMiddleware extends SerializerMiddleware {
/**
* @param {string} request request
* @param {TODO} name name
* @returns {ObjectSerializer} serializer
* @param {string} name name
* @returns {ObjectSerializer | undefined} serializer
*/
static _getDeserializerForWithoutError(request, name) {
const key = request + "/" + name;
const key = `${request}/${name}`;
const serializer = serializerInversed.get(key);
return serializer;
}
@@ -302,6 +304,10 @@ class ObjectMiddleware extends SerializerMiddleware {
referenceable.set(item, currentPos++);
};
let bufferDedupeMap = new Map();
/**
* @param {Buffer} buf buffer
* @returns {Buffer} deduped buffer
*/
const dedupeBuffer = buf => {
const len = buf.length;
const entry = bufferDedupeMap.get(len);
@@ -316,17 +322,16 @@ class ObjectMiddleware extends SerializerMiddleware {
}
bufferDedupeMap.set(len, [entry, buf]);
return buf;
} else {
const hash = toHash(entry, this._hashFunction);
const newMap = new Map();
newMap.set(hash, entry);
bufferDedupeMap.set(len, newMap);
const hashBuf = toHash(buf, this._hashFunction);
if (hash === hashBuf) {
return entry;
}
return buf;
}
const hash = toHash(entry, this._hashFunction);
const newMap = new Map();
newMap.set(hash, entry);
bufferDedupeMap.set(len, newMap);
const hashBuf = toHash(buf, this._hashFunction);
if (hash === hashBuf) {
return entry;
}
return buf;
} else if (Array.isArray(entry)) {
if (entry.length < 16) {
for (const item of entry) {
@@ -336,32 +341,29 @@ class ObjectMiddleware extends SerializerMiddleware {
}
entry.push(buf);
return buf;
} else {
const newMap = new Map();
const hash = toHash(buf, this._hashFunction);
let found;
for (const item of entry) {
const itemHash = toHash(item, this._hashFunction);
newMap.set(itemHash, item);
if (found === undefined && itemHash === hash) found = item;
}
bufferDedupeMap.set(len, newMap);
if (found === undefined) {
newMap.set(hash, buf);
return buf;
} else {
return found;
}
}
} else {
const newMap = new Map();
const hash = toHash(buf, this._hashFunction);
const item = entry.get(hash);
if (item !== undefined) {
return item;
let found;
for (const item of entry) {
const itemHash = toHash(item, this._hashFunction);
newMap.set(itemHash, item);
if (found === undefined && itemHash === hash) found = item;
}
entry.set(hash, buf);
return buf;
bufferDedupeMap.set(len, newMap);
if (found === undefined) {
newMap.set(hash, buf);
return buf;
}
return found;
}
const hash = toHash(buf, this._hashFunction);
const item = entry.get(hash);
if (item !== undefined) {
return item;
}
entry.set(hash, buf);
return buf;
};
let currentPosTypeLookup = 0;
let objectTypeLookup = new Map();
@@ -385,7 +387,7 @@ class ObjectMiddleware extends SerializerMiddleware {
if (request) {
return `${request}${name ? `.${name}` : ""}`;
}
} catch (e) {
} catch (_err) {
// ignore -> fallback
}
if (typeof item === "object" && item !== null) {
@@ -408,27 +410,29 @@ class ObjectMiddleware extends SerializerMiddleware {
}
try {
return `${item}`;
} catch (e) {
return `(${e.message})`;
} catch (err) {
return `(${err.message})`;
}
})
.join(" -> ");
};
/** @type {WeakSet<Error>} */
let hasDebugInfoAttached;
let ctx = {
write(value, key) {
try {
process(value);
} catch (e) {
if (e !== NOT_SERIALIZABLE) {
} catch (err) {
if (err !== NOT_SERIALIZABLE) {
if (hasDebugInfoAttached === undefined)
hasDebugInfoAttached = new WeakSet();
if (!hasDebugInfoAttached.has(e)) {
e.message += `\nwhile serializing ${stackToString(value)}`;
hasDebugInfoAttached.add(e);
if (!hasDebugInfoAttached.has(/** @type {Error} */ (err))) {
/** @type {Error} */
(err).message += `\nwhile serializing ${stackToString(value)}`;
hasDebugInfoAttached.add(/** @type {Error} */ (err));
}
}
throw e;
throw err;
}
},
setCircularReference(ref) {
@@ -491,7 +495,7 @@ class ObjectMiddleware extends SerializerMiddleware {
if (cycleStack.has(item)) {
throw new Error(
`This is a circular references. To serialize circular references use 'setCircularReference' somewhere in the circle during serialize and deserialize.`
"This is a circular references. To serialize circular references use 'setCircularReference' somewhere in the circle during serialize and deserialize."
);
}
@@ -542,7 +546,7 @@ class ObjectMiddleware extends SerializerMiddleware {
result.push(item);
} else if (typeof item === "function") {
if (!SerializerMiddleware.isLazy(item))
throw new Error("Unexpected function " + item);
throw new Error(`Unexpected function ${item}`);
/** @type {SerializedType} */
const serializedData =
SerializerMiddleware.getLazySerializedValue(item);
@@ -573,10 +577,10 @@ class ObjectMiddleware extends SerializerMiddleware {
process(item);
}
return result;
} catch (e) {
if (e === NOT_SERIALIZABLE) return null;
} catch (err) {
if (err === NOT_SERIALIZABLE) return null;
throw e;
throw err;
} finally {
// Get rid of these references to avoid leaking memory
// This happens because the optimized code v8 generates
@@ -588,7 +592,8 @@ class ObjectMiddleware extends SerializerMiddleware {
bufferDedupeMap =
objectTypeLookup =
ctx =
undefined;
/** @type {EXPECTED_ANY} */
(undefined);
}
}
@@ -637,7 +642,7 @@ class ObjectMiddleware extends SerializerMiddleware {
if (nextItem === ESCAPE_ESCAPE_VALUE) {
return ESCAPE;
} else if (nextItem === ESCAPE_UNDEFINED) {
return undefined;
// Nothing
} else if (nextItem === ESCAPE_END_OBJECT) {
throw new Error(
`Unexpected end of object at position ${currentDataPos - 1}`
@@ -659,7 +664,7 @@ class ObjectMiddleware extends SerializerMiddleware {
`at position ${currentDataPos - 1}`
);
}
const name = read();
const name = /** @type {string} */ (read());
serializer = ObjectMiddleware._getDeserializerForWithoutError(
request,
@@ -670,11 +675,9 @@ class ObjectMiddleware extends SerializerMiddleware {
if (request && !loadedRequests.has(request)) {
let loaded = false;
for (const [regExp, loader] of loaders) {
if (regExp.test(request)) {
if (loader(request)) {
loaded = true;
break;
}
if (regExp.test(request) && loader(request)) {
loaded = true;
break;
}
}
if (!loaded) {
@@ -725,7 +728,8 @@ class ObjectMiddleware extends SerializerMiddleware {
: serializerEntry[1].name
? `${serializerEntry[1].request} ${serializerEntry[1].name}`
: serializerEntry[1].request;
err.message += `\n(during deserialization of ${name})`;
/** @type {Error} */
(err).message += `\n(during deserialization of ${name})`;
throw err;
}
}
@@ -759,7 +763,13 @@ class ObjectMiddleware extends SerializerMiddleware {
// This happens because the optimized code v8 generates
// is optimized for our "ctx.read" method so it will reference
// it from e. g. Dependency.prototype.deserialize -(IC)-> ctx.read
result = referenceable = data = objectTypeLookup = ctx = undefined;
result =
referenceable =
data =
objectTypeLookup =
ctx =
/** @type {EXPECTED_ANY} */
(undefined);
}
}
}