174 lines
6.3 KiB
JavaScript
174 lines
6.3 KiB
JavaScript
|
'use strict';
|
||
|
const cacheObjectEnums = {};
|
||
|
let inited = false;
|
||
|
|
||
|
function getObjectEnumsSync(context, idObj, enumIds, enumNames) {
|
||
|
if (!enumIds) enumIds = [];
|
||
|
if (!enumNames) enumNames = [];
|
||
|
|
||
|
if (cacheObjectEnums[idObj]) {
|
||
|
for (let j = 0; j < cacheObjectEnums[idObj].enumIds.length; j++) {
|
||
|
if (enumIds.indexOf(cacheObjectEnums[idObj].enumIds[j]) === -1) enumIds.push(cacheObjectEnums[idObj].enumIds[j]);
|
||
|
}
|
||
|
for (let j = 0; j < cacheObjectEnums[idObj].enumNames.length; j++) {
|
||
|
if (enumNames.indexOf(cacheObjectEnums[idObj].enumNames[j]) === -1) enumNames.push(cacheObjectEnums[idObj].enumNames[j]);
|
||
|
}
|
||
|
return {enumIds: enumIds, enumNames: enumNames};
|
||
|
}
|
||
|
|
||
|
|
||
|
for (let i = 0, l = context.enums.length; i < l; i++) {
|
||
|
if (context.objects[context.enums[i]] &&
|
||
|
context.objects[context.enums[i]].common &&
|
||
|
context.objects[context.enums[i]].common.members &&
|
||
|
context.objects[context.enums[i]].common.members.indexOf(idObj) !== -1) {
|
||
|
if (enumIds.indexOf(context.enums[i]) === -1) enumIds.push(context.enums[i]);
|
||
|
if (enumNames.indexOf(context.objects[context.enums[i]].common.name) === -1) enumNames.push(context.objects[context.enums[i]].common.name);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (context.objects[idObj]) {
|
||
|
const pos = idObj.lastIndexOf('.');
|
||
|
if (pos !== -1) {
|
||
|
const parent = idObj.substring(0, pos);
|
||
|
if (parent && context.objects[parent]) {
|
||
|
return getObjectEnumsSync(context, parent, enumIds, enumNames);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
cacheObjectEnums[idObj] = {enumIds: enumIds, enumNames: enumNames};
|
||
|
return cacheObjectEnums[idObj];
|
||
|
}
|
||
|
|
||
|
function doGetter(obj, name, ret) {
|
||
|
//adapter.log.debug('getter: ' + name + ' returns ' + ret);
|
||
|
Object.defineProperty(obj, name, {value: ret});
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
function EventObj(id, state, oldState) {
|
||
|
if (!(this instanceof EventObj)) return new EventObj(id, state, oldState);
|
||
|
this.id = id;
|
||
|
this.newState = {
|
||
|
val: state.val,
|
||
|
ts: state.ts,
|
||
|
ack: state.ack,
|
||
|
lc: state.lc,
|
||
|
from: state.from
|
||
|
};
|
||
|
//if (oldState === undefined) oldState = {};
|
||
|
if (!oldState) {
|
||
|
this.oldState = {
|
||
|
val: undefined,
|
||
|
ts: undefined,
|
||
|
ack: undefined,
|
||
|
lc: undefined,
|
||
|
from: undefined
|
||
|
};
|
||
|
} else {
|
||
|
this.oldState = {
|
||
|
val: oldState.val,
|
||
|
ts: oldState.ts,
|
||
|
ack: oldState.ack,
|
||
|
lc: oldState.lc,
|
||
|
from: oldState.from
|
||
|
};
|
||
|
}
|
||
|
this.state = this.newState;
|
||
|
}
|
||
|
|
||
|
function createEventObject(context, id, state, oldState) {
|
||
|
if (!inited) {
|
||
|
inited = true;
|
||
|
const eventObjectProperties = {
|
||
|
common: {
|
||
|
get: function () {
|
||
|
const ret = context.objects[this.id] ? context.objects[this.id].common : {};
|
||
|
return doGetter(this, 'common', ret);
|
||
|
},
|
||
|
configurable: true
|
||
|
},
|
||
|
native: {
|
||
|
get: function () {
|
||
|
const ret = context.objects[this.id] ? context.objects[this.id].native : {};
|
||
|
return doGetter(this, 'native', ret);
|
||
|
},
|
||
|
configurable: true
|
||
|
},
|
||
|
name: {
|
||
|
get: function () {
|
||
|
const ret = this.common ? this.common.name : null;
|
||
|
return doGetter(this, 'name', ret);
|
||
|
},
|
||
|
configurable: true
|
||
|
},
|
||
|
channelId: {
|
||
|
get: function () {
|
||
|
const ret = this.id.replace (/\.*[^.]+$/, '');
|
||
|
return doGetter(this, 'channelId', context.objects[ret] ? ret : null);
|
||
|
},
|
||
|
configurable: true
|
||
|
},
|
||
|
channelName: {
|
||
|
get: function () {
|
||
|
const channelId = this.channelId;
|
||
|
const ret = channelId && context.objects[channelId].common ? context.objects[channelId].common.name : null;
|
||
|
return doGetter(this, 'channelName', ret);
|
||
|
},
|
||
|
configurable: true
|
||
|
},
|
||
|
deviceId: {
|
||
|
get: function () {
|
||
|
let deviceId;
|
||
|
const channelId = this.channelId;
|
||
|
if (!channelId || !(deviceId = channelId.replace (/\.*[^.]+$/, '')) || !context.objects[deviceId]) {
|
||
|
Object.defineProperty(this, 'deviceName', { value: null });
|
||
|
return doGetter(this, 'deviceId', null);
|
||
|
}
|
||
|
return doGetter(this, 'deviceId', deviceId);
|
||
|
},
|
||
|
configurable: true
|
||
|
},
|
||
|
deviceName: {
|
||
|
get: function () {
|
||
|
const deviceId = this.deviceId;
|
||
|
const ret = deviceId && context.objects[deviceId].common ? context.objects[deviceId].common.name : null;
|
||
|
return doGetter(this, 'deviceName', ret);
|
||
|
},
|
||
|
configurable: true
|
||
|
},
|
||
|
enumIds: {
|
||
|
get: function () {
|
||
|
if (!context.isEnums) return undefined;
|
||
|
let enumIds = {};
|
||
|
let enumNames = {};
|
||
|
getObjectEnumsSync(context, this.id, enumIds, enumNames);
|
||
|
Object.defineProperty(this, 'enumNames', {value: enumNames});
|
||
|
return doGetter(this, 'enumIds', enumIds);
|
||
|
},
|
||
|
configurable: true
|
||
|
},
|
||
|
enumNames: {
|
||
|
get: function () {
|
||
|
if (!context.isEnums) return undefined;
|
||
|
let enumIds = {};
|
||
|
let enumNames = {};
|
||
|
getObjectEnumsSync(context, this.id, enumIds, enumNames);
|
||
|
Object.defineProperty(this, 'enumIds', {value: enumIds});
|
||
|
return doGetter(this, 'enumNames', enumNames);
|
||
|
},
|
||
|
configurable: true
|
||
|
}
|
||
|
};
|
||
|
Object.defineProperties(EventObj.prototype, eventObjectProperties);
|
||
|
inited = true;
|
||
|
}
|
||
|
|
||
|
return new EventObj(id, state, oldState);
|
||
|
}
|
||
|
|
||
|
module.exports = {
|
||
|
createEventObject,
|
||
|
getObjectEnumsSync
|
||
|
};
|