1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- // 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
- }
|