diff --git a/lib/sandbox.js b/lib/sandbox.js index d91224b..6a59d29 100644 --- a/lib/sandbox.js +++ b/lib/sandbox.js @@ -39,6 +39,28 @@ const context = vm.createContext(); let state; +const runningExtensions = new WeakMap(); +function runExtension(sessionContext, key, extCall, callback) { + let re = runningExtensions.get(sessionContext); + if (!re) { + re = {}; + runningExtensions.set(sessionContext, re); + } + + if (re[key]) { + re[key].push(callback); + } + else { + re[key] = [callback]; + extensions.run(extCall, function(err, fault, res) { + if (!err && !fault) + sessionContext.extensionsCache[key] = res; + for (let c of re[key]) + c(err, fault); + delete re[key]; + }); + } +} class SandboxDate { constructor() { @@ -340,13 +362,12 @@ function run(script, globals, sessionContext, startRevision, maxRevision, callba let counter = 3; for (let key of Object.keys(_state.extensions)) { counter += 2; - extensions.run(_state.extensions[key], function(err, fault, res) { + runExtension(_state.sessionContext, key, _state.extensions[key], function(err, fault) { if (err || fault) { if (counter & 1) callback(err, fault); return counter = 0; } - _state.sessionContext.extensionsCache[key] = res; if ((counter -= 2) === 1) if (status === 2) return run.apply(null, args);