fixed some race conditions.

This commit is contained in:
Michael Mainguy 2024-06-11 16:16:57 -05:00
parent bb9c3ec396
commit 648876c06b
5 changed files with 46 additions and 16 deletions

View File

@ -117,11 +117,14 @@ export class DiagramManager {
this._diagramObjects.delete(event.entity.id); this._diagramObjects.delete(event.entity.id);
break; break;
case DiagramEventType.MODIFY: case DiagramEventType.MODIFY:
console.log(event); this._logger.debug(event);
//diagramObject = this._diagramObjects.get(event.entity.id); //diagramObject = this._diagramObjects.get(event.entity.id);
if (diagramObject && event.entity.text) { if (diagramObject && event.entity.text && event.entity.text != diagramObject.text) {
diagramObject.text = event.entity.text; diagramObject.text = event.entity.text;
} else {
this._logger.warn('Skipping text update for', event);
} }
if (event.entity.position) { if (event.entity.position) {
//diagramObject.position = event.entity.position; //diagramObject.position = event.entity.position;
} }

View File

@ -23,7 +23,7 @@ export class DiagramMenuManager {
private readonly _inputTextView: InputTextView; private readonly _inputTextView: InputTextView;
private readonly _scene: Scene; private readonly _scene: Scene;
private _cameraMenu: CameraMenu; private _cameraMenu: CameraMenu;
private logger = log.getLogger('DiagramMenuManager'); private _logger = log.getLogger('DiagramMenuManager');
private _connectionPreview: ConnectionPreview; private _connectionPreview: ConnectionPreview;
constructor(notifier: Observable<DiagramEvent>, controllers: Controllers, config: AppConfig) { constructor(notifier: Observable<DiagramEvent>, controllers: Controllers, config: AppConfig) {
@ -35,7 +35,8 @@ export class DiagramMenuManager {
this.configMenu = new ConfigMenu(config); this.configMenu = new ConfigMenu(config);
this._inputTextView.onTextObservable.add((evt) => { this._inputTextView.onTextObservable.add((evt) => {
this.notifyAll({type: DiagramEventType.MODIFY, entity: {id: evt.id, text: evt.text}}); const event = {type: DiagramEventType.MODIFY, entity: {id: evt.id, text: evt.text}}
this._notifier.notifyObservers(event, DiagramEventObserverMask.FROM_DB);
}); });
this.toolbox = new Toolbox(); this.toolbox = new Toolbox();
this.scaleMenu = new ScaleMenu2(this._notifier); this.scaleMenu = new ScaleMenu2(this._notifier);
@ -90,7 +91,7 @@ export class DiagramMenuManager {
public createClickMenu(mesh: AbstractMesh, input: WebXRInputSource): ClickMenu { public createClickMenu(mesh: AbstractMesh, input: WebXRInputSource): ClickMenu {
const clickMenu = new ClickMenu(mesh); const clickMenu = new ClickMenu(mesh);
clickMenu.onClickMenuObservable.add((evt: ActionEvent) => { clickMenu.onClickMenuObservable.add((evt: ActionEvent) => {
console.log(evt); this._logger.debug(evt);
switch (evt.source.id) { switch (evt.source.id) {
case "remove": case "remove":
this.notifyAll({type: DiagramEventType.REMOVE, entity: {id: clickMenu.mesh.id}}); this.notifyAll({type: DiagramEventType.REMOVE, entity: {id: clickMenu.mesh.id}});
@ -108,7 +109,7 @@ export class DiagramMenuManager {
this.scaleMenu.hide(); this.scaleMenu.hide();
break; break;
} }
console.log(evt); this._logger.debug(evt);
}, -1, false, this, false); }, -1, false, this, false);

View File

@ -35,6 +35,7 @@ export class DiagramObject {
private _label: AbstractMesh; private _label: AbstractMesh;
private _meshesPresent: boolean = false; private _meshesPresent: boolean = false;
private _positionHash: string; private _positionHash: string;
private _disposed: boolean = false;
private _fromMesh: AbstractMesh; private _fromMesh: AbstractMesh;
private _toMesh: AbstractMesh; private _toMesh: AbstractMesh;
private _meshRemovedObserver: Observer<AbstractMesh>; private _meshRemovedObserver: Observer<AbstractMesh>;
@ -110,9 +111,18 @@ export class DiagramObject {
if (this._label) { if (this._label) {
this._label.dispose(); this._label.dispose();
} }
if (this._diagramEntity.text != value) {
this._eventObservable.notifyObservers({
type: DiagramEventType.MODIFY,
entity: this._diagramEntity
}, DiagramEventObserverMask.TO_DB);
}
this._diagramEntity.text = value;
this._label = createLabel(value); this._label = createLabel(value);
this._label.parent = this._baseTransform; this._label.parent = this._baseTransform;
this.updateLabelPosition(); this.updateLabelPosition();
} }
public updateLabelPosition() { public updateLabelPosition() {
@ -255,20 +265,25 @@ export class DiagramObject {
} }
public dispose() { public dispose() {
if (this._disposed) {
this._logger.warn('DiagramObject dispose called for ', this._diagramEntity?.id, ' but it is already disposed');
return;
}
this._logger.debug('DiagramObject dispose called for ', this._diagramEntity?.id) this._logger.debug('DiagramObject dispose called for ', this._diagramEntity?.id)
this._scene?.onAfterRenderObservable.remove(this._sceneObserver); this._scene?.onAfterRenderObservable.remove(this._sceneObserver);
this._sceneObserver = null; this._sceneObserver = null;
this._mesh?.setParent(null); this._mesh?.setParent(null);
this._mesh?.dispose(true, false); this._mesh?.dispose(true, false);
this._mesh = null; this._mesh = null;
this._label?.dispose(); this._label?.dispose(false, true);
this._label = null; this._label = null;
this._baseTransform?.dispose(); this._baseTransform?.dispose(false);
this._diagramEntity = null; this._diagramEntity = null;
this._scene = null; this._scene = null;
this._fromMesh = null; this._fromMesh = null;
this._toMesh = null; this._toMesh = null;
this._scene?.onMeshRemovedObservable.remove(this._meshRemovedObserver); this._scene?.onMeshRemovedObservable.remove(this._meshRemovedObserver);
this._disposed = true;
} }
private updateConnection() { private updateConnection() {

View File

@ -3,6 +3,7 @@ import {DiagramEntity} from "../../diagram/types/diagramEntity";
import {Observable} from "@babylonjs/core"; import {Observable} from "@babylonjs/core";
import {UserModelType} from "../../users/userTypes"; import {UserModelType} from "../../users/userTypes";
import {Encryption} from "../encryption"; import {Encryption} from "../encryption";
import {DiagramEventObserverMask} from "../../diagram/types/diagramEventObserverMask";
export async function syncDoc(info: any, onDBRemoveObservable: Observable<DiagramEntity>, onDBUpdateObservable: Observable<DiagramEntity>, export async function syncDoc(info: any, onDBRemoveObservable: Observable<DiagramEntity>, onDBUpdateObservable: Observable<DiagramEntity>,
onUserObservable: Observable<UserModelType>, onUserObservable: Observable<UserModelType>,
@ -26,9 +27,12 @@ export async function syncDoc(info: any, onDBRemoveObservable: Observable<Diagra
logger.debug(decrypted); logger.debug(decrypted);
if (doc._deleted) { if (doc._deleted) {
logger.debug('Delete', doc); logger.debug('Delete', doc);
onDBRemoveObservable.notifyObservers({id: doc._id, template: decrypted.template}, 1); onDBRemoveObservable.notifyObservers({
id: doc._id,
template: decrypted.template
}, DiagramEventObserverMask.FROM_DB);
} else { } else {
onDBUpdateObservable.notifyObservers(decrypted, 1); onDBUpdateObservable.notifyObservers(decrypted, DiagramEventObserverMask.FROM_DB);
} }
} }
} else { } else {
@ -38,9 +42,12 @@ export async function syncDoc(info: any, onDBRemoveObservable: Observable<Diagra
logger.debug(doc); logger.debug(doc);
if (doc._deleted) { if (doc._deleted) {
logger.debug('Delete', doc); logger.debug('Delete', doc);
onDBRemoveObservable.notifyObservers({id: doc._id, template: doc.template}, 1); onDBRemoveObservable.notifyObservers({
id: doc._id,
template: doc.template
}, DiagramEventObserverMask.FROM_DB);
} else { } else {
onDBUpdateObservable.notifyObservers(doc, 1); onDBUpdateObservable.notifyObservers(doc, DiagramEventObserverMask.FROM_DB);
} }
} }
} }

View File

@ -109,9 +109,11 @@ export class PouchdbPersistenceManager {
await this._encryption.setPassword(this._encKey); await this._encryption.setPassword(this._encKey);
} }
try { try {
const doc = await this.db.get(entity.id); const doc = await this.db.get(entity.id, {conflicts: true, include_docs: true});
if (doc && doc._conflicts) {
this._logger.warn('CONFLICTS!', doc._conflicts);
}
if (this._encKey) { if (this._encKey) {
await this._encryption.encryptObject(entity); await this._encryption.encryptObject(entity);
const newDoc = { const newDoc = {
_id: doc._id, _id: doc._id,
@ -121,8 +123,10 @@ export class PouchdbPersistenceManager {
this.db.put(newDoc) this.db.put(newDoc)
} else { } else {
if (doc) { if (doc) {
const newDoc = {...doc, ...entity}; const newDoc = {_id: doc._id, _rev: doc._rev, ...entity};
this.db.put(newDoc); this.db.put(newDoc);
} else {
this.db.put({_id: entity.id, ...entity});
} }
} }
@ -137,7 +141,7 @@ export class PouchdbPersistenceManager {
} }
this.db.put(newDoc); this.db.put(newDoc);
} else { } else {
const newEntity = {...entity, _id: entity.id}; const newEntity = {_id: entity.id, ...entity};
this.db.put(newEntity); this.db.put(newEntity);
} }
} catch (err2) { } catch (err2) {