Verwendung eines COM-Proxys

Verwendung eines COM-Proxys

Wenn man fehlerhafte Schreibweisen nicht erst  in der Verwendung einer geschachtelten Funktion finden möchte (Wichtiges zur Verwendung von COM-Objekten), kann man Proxys verwenden. Technisch betrachtet bekommt jedes COM-Objekt als __proto__ ein Proxy-Objekt. Dieses generiert in seinem get-Handler einen Fehler, falls eine Property angesprochen wird, die weder im COM-Objekt noch in der JavaScript-Klasse Object vorhanden ist.
Der Pseudo-Code dazu lautet wie folgt:

Code

let PropertyChecker = new Proxy({}, {     get(target, propKey, receiver) {         if (!(propKey in target)) {             throw new ReferenceError('Unknown property: '+propKey);         }         return Reflect.get(target, propKey, receiver);     } }); FSO.__proto__ = PropertyChecker;

In diesem Fall wird ein Fehler generiert, wenn eine nicht vorhandene Property lesend angesprochen wird. Damit ändert die Verwendung des Proxys nun die Fehlermeldung, insbesondere die gemeldete Fehlerstelle:

Code

rc.settings.UseProxy = true;   const WSH = new rc.com.ActiveXObject("WScript.Shell"); rc.console.log("WSH.CurrentDirectory => " + WSH.CurrentDirectory); try {     rc.console.log("WSH.currentDirectory => " + WSH.currentDirectory); } catch (e) {     rc.console.log(e); }

Output

WSH.CurrentDirectory => D:\dvp\AS1010\kern-module\oxv8\oxv8test Error: Property 'currentDirectory' is not defined

Ob ein Proxy verwendet wird oder nicht, kann in oxv8.cfg per UseProxy = 0/1 eingestellt werden:

[Params] UseProxy = 1 ProxyAllowedNames = toJSON;Symbol.toPrimitive;Symbol.iterator

Außerdem kann diese Einstellung innerhalb des Skripts ebenfalls durch rc.settings.UseProxy = true/false; übersteuert bzw. geändert werden.

Dabei wird bei allen nicht existierenden Propertys dieses COM-Objekts ein Fehler generiert. Manche Bibliotheken (inkl. v8 selbst) prüfen das Vorhandensein von bestimmten Propertys per get anstatt per has, z. B. if (o.x == undefined){...} anstatt if (o.has(x)) {...}. Das führt zu Problemen, weil in diesem Fall eine unerwünschte Ausnahme aus dem Proxy geworfen wird. Dies geschieht beispielsweise in JSON.stringify(o): Hier wird (mit get) geprüft, ob o.toJSON vorhanden ist. Deswegen sollten in oxv8.cfg per ProxyAllowedNames = ... solche Propertys aus der Prüfung ausgeschlossen werden. Dieses wäre allerdings lediglich bei der Verwendung der COM-Objekte in Fremdbibliotheken zu erwarten, daher sollte durch diese Erleichterung bei der Fehlerbehandlung normalerweise keine Spezialbehandlung der Liste von erlaubten Proxy-Namen nötig sein.