Skip to content

Commit ef8ff3b

Browse files
committed
* (Apollon77) make sure userdata objects/states are not overwritten on createState
1 parent 80f612a commit ef8ff3b

File tree

2 files changed

+32
-57
lines changed

2 files changed

+32
-57
lines changed

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ And then call "npm run build".
3636

3737
## Changelog
3838

39+
### __WORK IN PROGRESS__
40+
* (Apollon77) make sure userdata objects/states are not overwritten on createState
41+
3942
### 4.6.19 (2020-07-26)
4043
* (Apollon77) Prevent wrong errors when setting "null" values for states
4144
* (Apollon77) Prevent potential crash when no typings could be found (Sentry IOBROKER-JAVASCRIPT-2T)

lib/sandbox.js

Lines changed: 29 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1829,75 +1829,47 @@ function sandBox(script, name, verbose, debug, context) {
18291829

18301830
sandbox.verbose && sandbox.log('createState(name=' + name + ', initValue=' + initValue + ', forceCreation=' + forceCreation + ', common=' + JSON.stringify(common) + ', native=' + JSON.stringify(native) + ')', 'debug');
18311831

1832-
adapter.getObject(name, function (err, obj) {
1832+
let id = adapter.namespace + '.' + name;
1833+
if (name.match(/^javascript\.\d+\./) || name.startsWith('0_userdata.0.')) {
1834+
id = name;
1835+
}
1836+
adapter.getForeignObject(id, function (err, obj) {
18331837
if (err || !obj || forceCreation) {
18341838
// todo: store object in objects to have this object directly after callback
18351839
// create new one
1836-
if (name.match(/^javascript\.\d+\./) || name.startsWith('0_userdata.0.')) {
1837-
adapter.setForeignObject(name, {
1838-
common: common,
1839-
native: native,
1840-
type: 'state'
1841-
}, function (err) {
1842-
err && adapter.log.warn('Cannot set object "' + name + '": ' + err);
1843-
1844-
if (initValue !== undefined) {
1845-
if (isObject(initValue) && initValue.ack !== undefined) {
1846-
adapter.setForeignState(name, initValue, callback);
1847-
} else {
1848-
adapter.setForeignState(name, initValue, true, callback);
1849-
}
1850-
} else if (!forceCreation) {
1851-
adapter.setForeignState(name, null, true, callback);
1840+
adapter.setForeignObject(id, {
1841+
common: common,
1842+
native: native,
1843+
type: 'state'
1844+
}, function (err) {
1845+
err && adapter.log.warn('Cannot set object "' + id + '": ' + err);
1846+
1847+
if (initValue !== undefined) {
1848+
if (isObject(initValue) && initValue.ack !== undefined) {
1849+
adapter.setForeignState(id, initValue, callback);
18521850
} else {
1853-
if (typeof callback === 'function') {
1854-
try {
1855-
callback.call(sandbox, name);
1856-
} catch (e) {
1857-
errorInCallback(e); //adapter.log.error('Error in callback: ' + e)
1858-
}
1859-
}
1851+
adapter.setForeignState(id, initValue, true, callback);
18601852
}
1861-
});
1862-
} else {
1863-
adapter.setObject(name, {
1864-
common: common,
1865-
native: native,
1866-
type: 'state'
1867-
}, function (err) {
1868-
err && adapter.log.warn('Cannot set object "' + name + '": ' + err);
1869-
1870-
if (initValue !== undefined) {
1871-
if (isObject(initValue) && initValue.ack !== undefined) {
1872-
adapter.setState(name, initValue, callback);
1873-
} else {
1874-
adapter.setState(name, initValue, true, callback);
1875-
}
1876-
} else if (!forceCreation) {
1877-
adapter.setState(name, null, true, callback);
1878-
} else {
1879-
if (typeof callback === 'function') {
1880-
try {
1881-
callback.call(sandbox, name);
1882-
} catch (e) {
1883-
errorInCallback(e); //adapter.log.error('Error in callback: ' + e)
1884-
}
1853+
} else if (!forceCreation) {
1854+
adapter.setForeignState(id, null, true, callback);
1855+
} else {
1856+
if (typeof callback === 'function') {
1857+
try {
1858+
callback.call(sandbox, id);
1859+
} catch (e) {
1860+
errorInCallback(e); //adapter.log.error('Error in callback: ' + e)
18851861
}
18861862
}
1887-
});
1888-
}
1889-
} else {
1890-
if (!adapter.config.subscribe && !states[name] && states[adapter.namespace + '.' + name] === undefined) {
1891-
if (!name.startsWith(adapter.namespace)) {
1892-
states[adapter.namespace + '.' + name] = {val: null, ack: true};
1893-
} else {
1894-
states[name] = {val: null, ack: true};
18951863
}
1864+
});
1865+
} else {
1866+
if (!adapter.config.subscribe && !states[id] && states[adapter.namespace + '.' + id] === undefined) {
1867+
states[id] = {val: null, ack: true};
18961868
}
18971869
// state yet exists
18981870
if (typeof callback === 'function') {
18991871
try {
1900-
callback.call(sandbox, name);
1872+
callback.call(sandbox, id);
19011873
} catch (e) {
19021874
errorInCallback(e); //adapter.log.error('Error in callback: ' + e)
19031875
}

0 commit comments

Comments
 (0)