From e961cba329474937ef76b22e150fbc7c64b06518 Mon Sep 17 00:00:00 2001 From: CanadaHonk Date: Wed, 5 Apr 2023 15:33:32 +0100 Subject: [PATCH] ipc/expose: rewrite to use proxy instead of eval definers --- src/lib/ipc.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/lib/ipc.js b/src/lib/ipc.js index ecc8a51..b931177 100644 --- a/src/lib/ipc.js +++ b/src/lib/ipc.js @@ -131,6 +131,12 @@ Gluon.ipc.on('backend store write', ({ key, value }) => { else _store[key] = value; }); +Gluon.ipc = new Proxy(Gluon.ipc, { + get(target, key) { + return target[key] ?? ((...args) => Gluon.ipc.send('exposed ' + key, args)); + } +}); + window.Gluon = Gluon; delete window._gluonSend; @@ -204,22 +210,17 @@ delete window._gluonSend; const makeExposeKey = key => 'exposed ' + key; const expose = (key, func) => { - if (typeof func !== 'function') return new Error('Invalid arguments (expected key and function)'); + if (typeof func !== 'function') throw new Error('Invalid arguments (expected string, function)'); if (logIPC) log('IPC: expose', key); const exposeKey = makeExposeKey(key); API.on(exposeKey, args => func(...args)); // handle IPC events - evalInWindow(`Gluon.ipc['${key}'] = (...args) => Gluon.ipc.send('${exposeKey}', args)`); // add wrapper func to window }; const unexpose = key => { const exposeKey = makeExposeKey(key); - - const existed = API.removeListener(exposeKey); // returns false if type isn't registered/active - if (!existed) return; - - evalInWindow(`delete Gluon.ipc['${key}']`); // remove wrapper func from window + API.removeListener(exposeKey); }; API.expose = (...args) => {