add error for circular references while serializing

This commit is contained in:
Tobias Koppers 2018-10-17 14:04:38 +02:00
parent 6c172166e3
commit b93ba710df
1 changed files with 11 additions and 0 deletions

View File

@ -168,6 +168,7 @@ class ObjectMiddleware extends SerializerMiddleware {
};
let currentPosTypeLookup = 0;
const objectTypeLookup = new Map();
const cycleStack = new Set();
const process = item => {
// check if we can emit a reference
const ref = referenceable.get(item);
@ -176,6 +177,14 @@ class ObjectMiddleware extends SerializerMiddleware {
return;
}
if (typeof item === "object" && item !== null) {
if (cycleStack.has(item)) {
throw new Error(
`Circular references can't be serialized (${Array.from(cycleStack)
.concat([item])
.map(obj => obj.constructor.name)
.join(" -> ")})`
);
}
const { request, name, serializer } = ObjectMiddleware.getSerializerFor(
item
);
@ -188,11 +197,13 @@ class ObjectMiddleware extends SerializerMiddleware {
} else {
result.push(ESCAPE, currentPosTypeLookup - lastIndex);
}
cycleStack.add(item);
serializer.serialize(item, {
write(value) {
process(value);
}
});
cycleStack.delete(item);
result.push(ESCAPE, ESCAPE_END_OBJECT);
addReferenceable(item);
} else if (typeof item === "string") {