A number of fixes in sandbox and declaration processing
This commit is contained in:
1 parent
3b987cc0cc
commit
f9c5272ce0
5 files changed
+107
-119
No files matched your search
+59
-70
@@ -132,34 +132,33 @@ function declare(path, timestamps, values) {
|
||||
|
||||
let parsedPath = common.parsePath(path);
|
||||
|
||||
sandbox.declarations[path] = sandbox.declarations[path] || [parsedPath, 1, {}, null, {}];
|
||||
let declaration = [parsedPath, 1];
|
||||
|
||||
let attrs = {};
|
||||
for (let attrName in timestamps) {
|
||||
if (attrName === "path") {
|
||||
if (timestamps.path > sandbox.declarations[path][1])
|
||||
sandbox.declarations[path][1] = timestamps.path;
|
||||
}
|
||||
else {
|
||||
attrs[attrName] = 1;
|
||||
if (!(timestamps[attrName] <= sandbox.declarations[path][2][attrName]))
|
||||
sandbox.declarations[path][2][attrName] = timestamps[attrName];
|
||||
}
|
||||
}
|
||||
|
||||
if (values) {
|
||||
for (let attrName in values) {
|
||||
if (timestamps)
|
||||
for (let attrName in timestamps)
|
||||
if (attrName === "path")
|
||||
sandbox.declarations[path][3] = values.path;
|
||||
declaration[1] = timestamps.path;
|
||||
else {
|
||||
attrs[attrName] = 1;
|
||||
if (attrName === 'value' && !Array.isArray(values[attrName]))
|
||||
sandbox.declarations[path][4].value = [values[attrName]];
|
||||
else
|
||||
sandbox.declarations[path][4].value = values[attrName];
|
||||
declaration[2] = declaration[2] || {};
|
||||
declaration[2][attrName] = timestamps[attrName];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (values)
|
||||
for (let attrName in values)
|
||||
if (attrName === "path")
|
||||
declaration[3] = values.path;
|
||||
else {
|
||||
attrs[attrName] = 1;
|
||||
declaration[4] = declaration[4] || {};
|
||||
if (attrName === "value" && !Array.isArray(values.value))
|
||||
declaration[4].value = [values.value];
|
||||
else
|
||||
declaration[4][attrName] = values[attrName];
|
||||
}
|
||||
|
||||
sandbox.declarations.push(declaration);
|
||||
|
||||
return new ParameterWrapper(parsedPath, Object.keys(attrs));
|
||||
}
|
||||
@@ -212,7 +211,7 @@ function run(script, globals, timestamp, deviceData, extensionsCache, startRevis
|
||||
sandbox.revision = startRevision;
|
||||
sandbox.maxRevision = maxRevision;
|
||||
sandbox.uncommitted = false;
|
||||
sandbox.declarations = {};
|
||||
sandbox.declarations = [];
|
||||
sandbox.extensions = {};
|
||||
sandbox.clear = null;
|
||||
|
||||
@@ -222,59 +221,49 @@ function run(script, globals, timestamp, deviceData, extensionsCache, startRevis
|
||||
for (let n in globals)
|
||||
sandbox.context[n] = globals[n];
|
||||
|
||||
let ret, status;
|
||||
|
||||
try {
|
||||
let ret = script.runInContext(sandbox.context, {displayErrors: false});
|
||||
|
||||
let declarations = [];
|
||||
for (let p in sandbox.declarations)
|
||||
declarations.push(sandbox.declarations[p]);
|
||||
|
||||
let counter = 1;
|
||||
for (let key in sandbox.extensions) {
|
||||
++ counter;
|
||||
extensions.run(sandbox.extensions[key], function(err, res) {
|
||||
sandbox.extensionsCache[key] = res;
|
||||
if (-- counter === 0)
|
||||
return callback(null, sandbox.clear, declarations, true, ret);
|
||||
});
|
||||
}
|
||||
if (-- counter === 0)
|
||||
return callback(null, sandbox.clear, declarations, true, ret);
|
||||
ret = script.runInContext(sandbox.context, {displayErrors: false});
|
||||
status = 0;
|
||||
}
|
||||
catch (err) {
|
||||
if (err === COMMIT) {
|
||||
let declarations = [];
|
||||
for (let p in sandbox.declarations)
|
||||
declarations.push(sandbox.declarations[p]);
|
||||
|
||||
let counter = 1;
|
||||
for (let key in sandbox.extensions) {
|
||||
++ counter;
|
||||
extensions.run(sandbox.extensions[key], function(err, res) {
|
||||
sandbox.extensionsCache[key] = res;
|
||||
if (-- counter === 0)
|
||||
return callback(null, sandbox.clear, declarations, false);
|
||||
});
|
||||
}
|
||||
if (-- counter === 0)
|
||||
return callback(null, sandbox.clear, declarations, false);
|
||||
}
|
||||
else if (err === EXT) {
|
||||
let counter = 1;
|
||||
for (let key in sandbox.extensions) {
|
||||
++ counter;
|
||||
extensions.run(sandbox.extensions[key], function(err, res) {
|
||||
sandbox.extensionsCache[key] = res;
|
||||
if (-- counter === 0)
|
||||
return run(script, globals, timestamp, deviceData, extensionsCache, startRevision, maxRevision, callback);
|
||||
});
|
||||
}
|
||||
if (-- counter === 0)
|
||||
return run(script, globals, timestamp, deviceData, extensionsCache, startRevision, maxRevision, callback);
|
||||
}
|
||||
if (err === COMMIT)
|
||||
status = 1;
|
||||
else if (err === EXT)
|
||||
status = 2;
|
||||
else
|
||||
return callback(err);
|
||||
}
|
||||
|
||||
let ext = sandbox.extensions;
|
||||
let decs = sandbox.declarations;
|
||||
let clr = sandbox.clear;
|
||||
let extCache = sandbox.extensionsCache;
|
||||
let args = arguments;
|
||||
|
||||
let counter = 1;
|
||||
for (let key in sandbox.extensions) {
|
||||
++ counter;
|
||||
extensions.run(sandbox.extensions[key], function(err, res) {
|
||||
if (err && counter > 0) {
|
||||
counter = 0;
|
||||
return callback(err);
|
||||
}
|
||||
extCache[key] = res;
|
||||
if (-- counter === 0)
|
||||
if (status === 2)
|
||||
return run.apply(null, args);
|
||||
else
|
||||
return callback(null, clr, decs, status === 0, ret);
|
||||
});
|
||||
}
|
||||
|
||||
if (-- counter === 0)
|
||||
if (status === 2)
|
||||
return run.apply(null, args);
|
||||
else
|
||||
return callback(null, clr, decs, status === 0, ret);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in new issue
Block a user