Skip to content

Commit 99d4382

Browse files
authored
Merge pull request #33 from Kitware/fix-handler-set
Fix issues related to the JS proxy and properties - fix(setter): fix bool assignment in proxy handler.set (closes #23) - chore(refactor): reuse toString and toJSON methods - fix(proxy): enhance userData handling in createVtkObjectProxy (closes #24) - fix(proxy): add deleteObject method to handle vtk object destruction
2 parents 674f538 + 3dc1fe5 commit 99d4382

1 file changed

Lines changed: 37 additions & 28 deletions

File tree

src/core/proxy.js

Lines changed: 37 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,14 @@ export function createVtkObjectProxy(
4343

4444
// Create methods
4545
const observerTags = [];
46+
function deleteObject() {
47+
const result = wasm.destroy(vtkId);
48+
if (result) {
49+
const removedProxy = idToRef.delete(vtkId);
50+
vtkProxyCache.delete(removedProxy);
51+
}
52+
return result;
53+
}
4654
function set(props) {
4755
return wasm.set(vtkId, wrapMethods.decorateKwargs(toCxxKeys(props)));
4856
}
@@ -63,6 +71,13 @@ export function createVtkObjectProxy(
6371
unObserve(observerTags.pop());
6472
}
6573
}
74+
function toString() {
75+
return wasm.printObjectToString(vtkId);
76+
}
77+
78+
function toJSON() {
79+
return toJsKeys(wasm.get(vtkId));
80+
}
6681
const propGetters = createPropGetter(wasm, wrapMethods, vtkId);
6782
const propSetters = createPropSetter(wasm, wrapMethods, vtkId);
6883

@@ -74,23 +89,22 @@ export function createVtkObjectProxy(
7489
obj: { Id: vtkId },
7590
set,
7691
observe,
92+
toJSON,
93+
toString,
7794
unObserve,
7895
unObserveAll,
96+
userData: {},
7997
};
8098
const vtkProxy = new Proxy(target, {
8199
get(target, prop, resolver) {
82-
if (prop === "then") {
83-
return resolver;
100+
if (target[prop] !== undefined) {
101+
return target[prop];
84102
}
85-
if (prop === "toString") {
86-
return () => {
87-
return wasm.printObjectToString(vtkId);
88-
}
103+
if (target.userData[prop] !== undefined) {
104+
return target.userData[prop];
89105
}
90-
if (prop === "toJSON") {
91-
return () => {
92-
return toJsKeys(wasm.get(vtkId));
93-
}
106+
if (prop === "then") {
107+
return resolver;
94108
}
95109
if (prop === "state") {
96110
if (!wasm.get) {
@@ -101,34 +115,29 @@ export function createVtkObjectProxy(
101115
return toJsKeys(wasm.get(vtkId));
102116
}
103117
if (prop === "delete") {
104-
const result = wasm.destroy(vtkId);
105-
if (result) {
106-
const removedProxy = idToRef.delete(vtkId);
107-
vtkProxyCache.delete(removedProxy);
108-
}
109-
return result;
118+
return deleteObject;
110119
}
111120
if (propGetters[prop]) {
112121
return propGetters[prop]();
113122
}
114-
if (!target[prop]) {
115-
// console.log("register method", prop, toCxxName(prop));
116-
target[prop] = async (...args) =>
117-
wrapMethods.decorateResult(
118-
await wasm.invoke(
119-
vtkId,
120-
toCxxName(prop),
121-
wrapMethods.decorateArgs(args),
122-
),
123-
);
124-
}
123+
// ideally we should have a json structure to check available methods
124+
target[prop] = async (...args) =>
125+
wrapMethods.decorateResult(
126+
await wasm.invoke(
127+
vtkId,
128+
toCxxName(prop),
129+
wrapMethods.decorateArgs(args),
130+
),
131+
);
125132
return target[prop];
126133
},
127134
set(target, property, value) {
128135
if (propSetters[property]) {
129136
propSetters[property](value);
137+
} else {
138+
target.userData[property] = value;
130139
}
131-
return value;
140+
return true;
132141
},
133142
});
134143

0 commit comments

Comments
 (0)