Prevent redundant extension calls
This commit is contained in:
1 parent
52bec5b46f
commit
445b01e895
1 file changed
+23
-2
+23
-2
@@ -39,6 +39,28 @@ const context = vm.createContext();
|
|||||||
|
|
||||||
let state;
|
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 {
|
class SandboxDate {
|
||||||
constructor() {
|
constructor() {
|
||||||
@@ -340,13 +362,12 @@ function run(script, globals, sessionContext, startRevision, maxRevision, callba
|
|||||||
let counter = 3;
|
let counter = 3;
|
||||||
for (let key of Object.keys(_state.extensions)) {
|
for (let key of Object.keys(_state.extensions)) {
|
||||||
counter += 2;
|
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 (err || fault) {
|
||||||
if (counter & 1)
|
if (counter & 1)
|
||||||
callback(err, fault);
|
callback(err, fault);
|
||||||
return counter = 0;
|
return counter = 0;
|
||||||
}
|
}
|
||||||
_state.sessionContext.extensionsCache[key] = res;
|
|
||||||
if ((counter -= 2) === 1)
|
if ((counter -= 2) === 1)
|
||||||
if (status === 2)
|
if (status === 2)
|
||||||
return run.apply(null, args);
|
return run.apply(null, args);
|
||||||
|
|||||||
Reference in new issue
Block a user