123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- const data = {}
-
- const config = {
- RED: null
- }
-
- /**
- * Checks if a Client/Socket ID has been assigned to this message,
- * and whether the node type is being scoped to a specific client.
- * If so, do not store this in our centralised datastore
- * @param {*} msg
- * @returns
- */
- function canSaveInStore (base, node, msg) {
- // gets a list of node types that allow for client configuration/limits
- const constrained = base.acceptsClientConfig
-
- const checks = []
-
- if (constrained.includes(node.type)) {
- // core check
- if (msg._client?.socketId) {
- // we are in a node type that allows for definition of specific clients,
- // and a client has been defined
- checks.push(false)
- }
- // 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 the latest msg received
- msg (id) {
- return config.RED.util.cloneMessage(data[id])
- }
- }
-
- const setters = {
- // map the instance of Node-RED to this module
- setConfig (RED) {
- config.RED = RED
- },
- // remove data associated to a given widget
- clear (id) {
- delete data[id]
- },
- /**
- *
- * @param {*} base - the ui-base node associated with this widget
- * @param {*} node - the UI node for which we are storing data
- * @param {*} msg - the msg to be stored
- */
- save (base, node, msg) {
- if (Array.isArray(msg)) {
- /// need to check msg by msg
- const filtered = []
- for (const m of msg) {
- if (canSaveInStore(base, node, m)) {
- filtered.push(config.RED.util.cloneMessage(m))
- }
- }
- data[node.id] = filtered
- } else {
- if (canSaveInStore(base, node, msg)) {
- data[node.id] = config.RED.util.cloneMessage(msg)
- }
- }
- },
- // given a widget id, and msg, store in an array of history of values
- // useful for charting widgets
- append (base, node, msg) {
- if (canSaveInStore(base, node, msg)) {
- if (!data[node.id]) {
- data[node.id] = []
- }
- data[node.id].push(config.RED.util.cloneMessage(msg))
- }
- }
- }
-
- module.exports = {
- get: getters.msg,
- RED: getters.RED,
- setConfig: setters.setConfig,
- save: setters.save,
- append: setters.append,
- clear: setters.clear
- }
|