From 5d2e776ecf68129d27e904a7796f50f26c8edea9 Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Fri, 29 Jan 2021 15:37:27 +0100 Subject: [PATCH] Repair error caused by mutation of a set mid-iteration --- packages/core/src/runtime/dataflow.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/core/src/runtime/dataflow.ts b/packages/core/src/runtime/dataflow.ts index 0ca22df..fef04d7 100644 --- a/packages/core/src/runtime/dataflow.ts +++ b/packages/core/src/runtime/dataflow.ts @@ -75,6 +75,12 @@ export class Graph { subjectObjects.forEach((oid: ObjectId) => MapSet.del(this.edgesForward, oid, subjectId)); } + observersOf(objectId: ObjectId): Array { + const subjects = this.edgesForward.get(objectId); + if (subjects === void 0) return []; + return Array.from(subjects); + } + repairDamage(repairNode: (subjectId: SubjectId) => void) { let repairedThisRound = new FlexSet(this.objectIdCanonicalizer); while (true) { @@ -92,8 +98,7 @@ export class Graph { if (workSet.size === 0) break; workSet.forEach(objectId => { - const subjects = this.edgesForward.get(objectId) ?? [] as Array; - subjects.forEach((subjectId: SubjectId) => { + this.observersOf(objectId).forEach((subjectId: SubjectId) => { this.forgetSubject(subjectId); this.withSubject(subjectId, () => repairNode(subjectId)); });