96 lines
2.7 KiB
JavaScript

// Store to manage any dynamic properties set
const state = {}
const config = {
RED: null
}
/**
* Checks if a Client/Socket ID has been assigned to this message,
* If so, do not store this in our centralised datastore
* @param {*} msg
* @returns
*/
function canSaveInStore (base, node, msg) {
const checks = []
if (msg) {
// core check
if (base.acceptsClientConfig.includes(node.type)) {
// we are in a node type that allows for definition of specific clients,
if (msg._client?.socketId) {
// and a client has been defined
checks.push(false)
} else {
// whilst this node does allow for constraints, none were defined in this message
checks.push(true)
}
}
// plugin checks
// loop over plugins and check if any have defined a custom isValidConnection function
// if so, use that to determine if the connection is valid
for (const plugin of config.RED.plugins.getByType('node-red-dashboard-2')) {
if (plugin.hooks?.onCanSaveInStore) {
checks.push(plugin.hooks.onCanSaveInStore(msg))
}
}
}
return checks.length === 0 || !checks.includes(false)
}
const getters = {
RED () {
return config.RED
},
// given a widget id, return all dynamically set properties
all (id) {
return state[id]
},
// given a widget id, return a specific dynamically set property
property (id, property) {
if (Object.prototype.hasOwnProperty.call(state, id)) {
return state[id][property]
} else {
return undefined
}
}
}
const setters = {
// map the instance of Node-RED to this module
setConfig (RED) {
config.RED = RED
},
/**
*
* @param {*} base - associated ui-base node
* @param {*} node - the Node-RED node object we're storing state for
* @param {*} msg - the full received msg (allows us to check for credentials/socketid constraints)
* @param {*} prop - the property we are setting on the node
* @param {*} value - the value we are setting
*/
set (base, node, msg, prop, value) {
if (canSaveInStore(base, node, msg)) {
if (!state[node.id]) {
state[node.id] = {}
}
state[node.id][prop] = value
}
},
// remove data associated to a given widget
reset (id) {
delete state[id]
}
}
module.exports = {
getAll: getters.all,
getProperty: getters.property,
RED: getters.RED,
setConfig: setters.setConfig,
set: setters.set,
reset: setters.reset
}