import Global from '../api/Global'; type EventHandler = (callbackId:string, args:any[]) => void; function createEventHandlers(arg:any, eventHandler:EventHandler) { if (Array.isArray(arg)) { for (let i = 0; i < arg.length; i++) { arg[i] = createEventHandlers(arg[i], eventHandler); } return arg; } else if (typeof arg === 'string' && arg.indexOf('___plugin_event_') === 0) { const callbackId = arg; return async (...args:any[]) => { const result = await eventHandler(callbackId, args); return result; }; } else if (arg === null || arg === undefined) { return arg; } else if (typeof arg === 'object') { for (const n in arg) { arg[n] = createEventHandlers(arg[n], eventHandler); } } return arg; } export default async function executeSandboxCall(pluginId:string, sandbox:Global, path:string, args:any[], eventHandler:EventHandler) { const pathFragments = path.split('.'); let parent:any = null; let fn:any = sandbox; if (!fn) throw new Error(`No sandbox for plugin ${pluginId}`); // Sanity check as normally cannot happen for (const pathFragment of pathFragments) { parent = fn; fn = fn[pathFragment]; if (!fn) throw new Error(`Property or method "${pathFragment}" does not exist in "${path}"`); } const convertedArgs = createEventHandlers(args, eventHandler); return fn.apply(parent, convertedArgs); }