Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 2 additions & 6 deletions src/record/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,6 @@ function record<T = eventWithTime>(
) {
// we've got a user initiated event so first we need to apply
// all DOM changes that have been buffering during paused state
mutationBuffer.emit();
mutationBuffer.unfreeze();
}

Expand Down Expand Up @@ -182,7 +181,7 @@ function record<T = eventWithTime>(
);

let wasFrozen = mutationBuffer.isFrozen();
mutationBuffer.freeze(); // don't allow any mirror modifications during snapshotting
mutationBuffer.lock(); // don't allow any mirror modifications during snapshotting
const [node, idNodeMap] = snapshot(document, {
blockClass,
blockSelector,
Expand Down Expand Up @@ -221,10 +220,7 @@ function record<T = eventWithTime>(
},
}),
);
if (!wasFrozen) {
mutationBuffer.emit(); // emit anything queued up now
mutationBuffer.unfreeze();
}
mutationBuffer.unlock(); // generate & emit any mutations that happened during snapshotting, as can now apply against the newly built mirror
}

try {
Expand Down
19 changes: 16 additions & 3 deletions src/record/mutation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -173,20 +173,33 @@ export default class MutationBuffer {

public unfreeze() {
this.frozen = false;
this.emit();
}

public isFrozen() {
return this.frozen;
}

public lock() {
this.locked = true;
}

public unlock() {
this.locked = false;
this.emit();
}

public processMutations = (mutations: mutationRecord[]) => {
mutations.forEach(this.processMutation);
if (!this.frozen) {
this.emit();
}
this.emit();
};

public emit = () => {

if (this.frozen || this.locked) {
return;
}

// delay any modification of the mirror until this function
// so that the mirror for takeFullSnapshot doesn't get mutated while it's event is being processed

Expand Down
2 changes: 2 additions & 0 deletions typings/record/mutation.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@ export default class MutationBuffer {
freeze(): void;
unfreeze(): void;
isFrozen(): boolean;
lock(): void;
unlock(): void;
processMutations: (mutations: mutationRecord[]) => void;
emit: () => void;
private processMutation;
Expand Down