@node-red/runtime 3.1.3 → 3.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/flows/Flow.js CHANGED
@@ -485,7 +485,7 @@ class Flow {
485
485
  }
486
486
  if (!key.startsWith("$parent.")) {
487
487
  if (this._env.hasOwnProperty(key)) {
488
- return this._env[key]
488
+ return (Object.hasOwn(this._env[key], 'value') && this._env[key].__clone__) ? clone(this._env[key].value) : this._env[key]
489
489
  }
490
490
  } else {
491
491
  key = key.substring(8);
@@ -41,7 +41,7 @@ class Group {
41
41
  }
42
42
  if (!key.startsWith("$parent.")) {
43
43
  if (this._env.hasOwnProperty(key)) {
44
- return this._env[key]
44
+ return (Object.hasOwn(this._env[key], 'value') && this._env[key].__clone__) ? clone(this._env[key].value) : this._env[key]
45
45
  }
46
46
  } else {
47
47
  key = key.substring(8);
@@ -212,6 +212,7 @@ class Subflow extends Flow {
212
212
  var subflowInstanceConfig = {
213
213
  id: this.subflowInstance.id,
214
214
  type: this.subflowInstance.type,
215
+ g: this.subflowInstance.g,
215
216
  z: this.subflowInstance.z,
216
217
  name: this.subflowInstance.name,
217
218
  wires: [],
@@ -375,7 +376,7 @@ class Subflow extends Flow {
375
376
  }
376
377
  if (!key.startsWith("$parent.")) {
377
378
  if (this._env.hasOwnProperty(key)) {
378
- return this._env[key]
379
+ return (Object.hasOwn(this._env[key], 'value') && this._env[key].__clone__) ? clone(this._env[key].value) : this._env[key]
379
380
  }
380
381
  } else {
381
382
  key = key.substring(8);
@@ -374,7 +374,12 @@ async function start(type,diff,muteLog,isDeploy) {
374
374
  // A modified-type deploy means restarting things that have changed
375
375
 
376
376
  // Update the global flow
377
- activeFlows['global'].update(activeFlowConfig,activeFlowConfig);
377
+ if (activeFlows['global']) {
378
+ activeFlows['global'].update(activeFlowConfig,activeFlowConfig);
379
+ } else {
380
+ log.debug("red/nodes/flows.start : starting flow : global");
381
+ activeFlows['global'] = Flow.create(flowAPI,activeFlowConfig);
382
+ }
378
383
  for (id in activeFlowConfig.flows) {
379
384
  if (activeFlowConfig.flows.hasOwnProperty(id)) {
380
385
  if (!activeFlowConfig.flows[id].disabled) {
package/lib/flows/util.js CHANGED
@@ -102,6 +102,9 @@ async function evaluateEnvProperties(flow, env, credentials) {
102
102
  pendingEvaluations.push(new Promise((resolve, _) => {
103
103
  redUtil.evaluateNodeProperty(value, 'jsonata', {_flow: flow}, null, (err, result) => {
104
104
  if (!err) {
105
+ if (typeof result === 'object') {
106
+ result = { value: result, __clone__: true}
107
+ }
105
108
  evaluatedEnv[name] = result
106
109
  }
107
110
  resolve()
@@ -109,6 +112,9 @@ async function evaluateEnvProperties(flow, env, credentials) {
109
112
  }))
110
113
  } else {
111
114
  value = redUtil.evaluateNodeProperty(value, type, {_flow: flow}, null, null);
115
+ if (typeof value === 'object') {
116
+ value = { value: value, __clone__: true}
117
+ }
112
118
  }
113
119
  evaluatedEnv[name] = value
114
120
  }
@@ -138,8 +144,13 @@ async function evaluateEnvProperties(flow, env, credentials) {
138
144
  }
139
145
  }}, null, null);
140
146
  }
147
+ if (typeof value === 'object' && !value.__clone__) {
148
+ value = { value: value, __clone__: true}
149
+ }
141
150
  evaluatedEnv[name] = value
151
+
142
152
  }
153
+ // console.log(evaluatedEnv)
143
154
 
144
155
  return evaluatedEnv
145
156
  }
package/lib/index.js CHANGED
@@ -27,6 +27,7 @@ var express = require("express");
27
27
  var path = require('path');
28
28
  var fs = require("fs");
29
29
  var os = require("os");
30
+ const crypto = require("crypto")
30
31
 
31
32
  const {log,i18n,events,exec,util,hooks} = require("@node-red/util");
32
33
 
@@ -51,7 +52,7 @@ var adminApi = {
51
52
  var nodeApp;
52
53
  var adminApp;
53
54
  var server;
54
-
55
+ let userSettings;
55
56
 
56
57
  /**
57
58
  * Initialise the runtime module.
@@ -61,8 +62,9 @@ var server;
61
62
  * better abstracted.
62
63
  * @memberof @node-red/runtime
63
64
  */
64
- function init(userSettings,httpServer,_adminApi) {
65
+ function init(_userSettings,httpServer,_adminApi) {
65
66
  server = httpServer;
67
+ userSettings = _userSettings
66
68
 
67
69
  if (server && server.on) {
68
70
  // Add a listener to the upgrade event so that we can properly timeout connection
@@ -134,7 +136,12 @@ function start() {
134
136
  .then(function() { return settings.load(storage)})
135
137
  .then(function() { return library.init(runtime)})
136
138
  .then(function() {
137
-
139
+ if (settings.available()) {
140
+ if (settings.get('instanceId') === undefined) {
141
+ settings.set('instanceId', crypto.randomBytes(8).toString('hex'))
142
+ }
143
+ userSettings.instanceId = settings.get('instanceId') || ''
144
+ }
138
145
  if (log.metric()) {
139
146
  runtimeMetricInterval = setInterval(function() {
140
147
  reportMetrics();
@@ -384,10 +384,27 @@ var api = module.exports = {
384
384
  }
385
385
  }
386
386
  } else if (nodeType === "global-config") {
387
- if (JSON.stringify(savedCredentials.map) !== JSON.stringify(newCreds.map)) {
388
- savedCredentials.map = newCreds.map;
389
- dirty = true;
390
- }
387
+ const existingCredentialKeys = Object.keys(savedCredentials?.map || [])
388
+ const newCredentialKeys = Object.keys(newCreds?.map || [])
389
+ existingCredentialKeys.forEach(key => {
390
+ if (!newCreds.map?.[key]) {
391
+ // This key doesn't exist in the new credentials list - remove
392
+ delete savedCredentials.map[key]
393
+ delete savedCredentials.map[`has_${key}`]
394
+ dirty = true
395
+ }
396
+ })
397
+ newCredentialKeys.forEach(key => {
398
+ if (!/^has_/.test(key)) {
399
+ if (!savedCredentials.map?.[key] || newCreds.map[key] !== '__PWRD__') {
400
+ // This key either doesn't exist in current saved, or the
401
+ // value has been changed
402
+ savedCredentials.map[key] = newCreds.map[key]
403
+ savedCredentials.map[`has_${key}`] = newCreds.map[`has_${key}`]
404
+ dirty = true
405
+ }
406
+ }
407
+ })
391
408
  } else {
392
409
  var dashedType = nodeType.replace(/\s+/g, '-');
393
410
  var definition = credentialsDef[dashedType];
@@ -0,0 +1,195 @@
1
+ {
2
+ "runtime": {
3
+ "welcome": "Bienvenid@ a Node-RED",
4
+ "version": "__component__ versión: __version__",
5
+ "unsupported_version": "Versión no soportada de __component__. Requiere: __requires__ Encontrado: __version__",
6
+ "paths": {
7
+ "settings": "Fichero de Ajustes : __path__",
8
+ "httpStatic": "HTTP Estático : __path__"
9
+ }
10
+ },
11
+ "server": {
12
+ "loading": "Cargando paleta de nodos",
13
+ "palette-editor": {
14
+ "disabled": "Editor de paletas desactivado : ajustes de usuario",
15
+ "npm-not-found": "Editor de paletas desactivado : comando npm no encontrado",
16
+ "npm-too-old": "Editor de paletas desactivado : versión npm demasiado vieja. Requiere npm >= 3.x"
17
+ },
18
+ "errors": "Fallo al registrar __count__ tipo de nodo.",
19
+ "errors_plural": "Fallo al registrar __count__ tipos de nodo.",
20
+ "errors-help": "Ejecutar con -v para más detalles",
21
+ "missing-modules": "Faltan módulos de nodos:",
22
+ "node-version-mismatch": "El nodo de módulo no puede cargarse en esta versión. Requiere: __version__ ",
23
+ "set-has-no-types": "Establece no tiene ningún tipo. nombre: '__name__', módulo: '__module__', fichero: '__file__'",
24
+ "type-already-registered": "'__type__' ya registrado por módulo __module__",
25
+ "removing-modules": "Eliminando módulos de la configuración",
26
+ "added-types": "Tipos de nodos añadidos:",
27
+ "removed-types": "Tipos de nodos eliminados:",
28
+ "install": {
29
+ "invalid": "Nombre de módulo no válido",
30
+ "installing": "Instalando módulo: __name__, versión: __version__",
31
+ "installed": "Módulo instalado: __name__",
32
+ "install-failed": "Error de instalación",
33
+ "install-failed-long": "Fallo en la instalación del módulo __name__:",
34
+ "install-failed-not-found": "$t(server.install.install-failed-long) módulo no encontrado",
35
+ "install-failed-name": "$t(server.install.install-failed-long) nombre de módulo inválido: __name__",
36
+ "install-failed-url": "$t(server.install.install-failed-long) URL inválida: __url__",
37
+ "post-install-error": "Error ejecutando código 'postInstall':",
38
+ "upgrading": "Actualizando módulo: __name__ a la versión: __version__",
39
+ "upgraded": "Módulo actualizado: __name__. Reinicia Node-RED para utilizar la nueva versión",
40
+ "upgrade-failed-not-found": "$t(server.install.install-failed-long) versión no encontrada",
41
+ "uninstalling": "Desinstalando el módulo: __name__",
42
+ "uninstall-failed": "Error de desinstalación",
43
+ "uninstall-failed-long": "Error en la desinstalación del módulo __name__:",
44
+ "uninstalled": "Desinstalando módulo: __name__",
45
+ "old-ext-mod-dir-warning": "\n\n---------------------------------------------------------------------\nDirectorio de módulos externos Node-RED 1.3 detectado:\n __oldDir__\nEste directorio ya no se utiliza. Los módulos externos serán reinstalado en tu directorio de usuario Node-RED:__newDir__\nBorra el antiguo directorio externalModules para eliminar este mensaje.\n---------------------------------------------------------------------\n"
46
+ },
47
+ "deprecatedOption": "__old__ está en DESUSO. Utiliza __new__",
48
+ "unable-to-listen": "No se puede escuchar __listenpath__",
49
+ "port-in-use": "Error: puerto en uso",
50
+ "uncaught-exception": "Excepción no detectada:",
51
+ "admin-ui-disabled": "IU de administrador deshabilitado",
52
+ "now-running": "El servidor está funcionando en __listenpath__",
53
+ "failed-to-start": "No se pudo iniciar el servidor:",
54
+ "headless-mode": "Ejecutando en modo sin interfaz",
55
+ "httpadminauth-deprecated": "httpAdminAuth está en DESUSO. Utiliza adminAuth",
56
+ "https": {
57
+ "refresh-interval": "Actualizando la configuración HTTPS cada __interval__ horas",
58
+ "settings-refreshed": "La configuración HTTPS del servidor se ha actualizado",
59
+ "refresh-failed": "No se pudo actualizar la configuración HTTPS: __message__",
60
+ "nodejs-version": "httpsRefreshInterval requiere Node.js 11 o superior",
61
+ "function-required": "httpsRefreshInterval requiere que la propiedad HTTPS sea una función"
62
+ }
63
+ },
64
+ "api": {
65
+ "flows": {
66
+ "error-save": "Error al guardar flujos: __message__",
67
+ "error-reload": "Error al recargar flujos: __message__"
68
+ },
69
+ "library": {
70
+ "error-load-entry": "Error al cargar la entrada de la librería '__path__': __message__",
71
+ "error-save-entry": "Error al guardar la entrada de la librería '__path__': __message__",
72
+ "error-load-flow": "Error al cargar el flujo '__path__': __message__",
73
+ "error-save-flow": "Error al guardar el flujo '__path__': __message__"
74
+ },
75
+ "nodes": {
76
+ "enabled": "Tipos de nodo habilitados:",
77
+ "disabled": "Tipos de nodo deshabilitados:",
78
+ "error-enable": "Fallo al habilitar nodo:"
79
+ }
80
+ },
81
+ "comms": {
82
+ "error": "Error del canal de comunicación: __message__",
83
+ "error-server": "Error del servidor de comunicación: __message__",
84
+ "error-send": "Error de envío de comunicación: __message__"
85
+ },
86
+ "settings": {
87
+ "user-not-available": "No se puede guardar la configuración del usuario: __message__",
88
+ "not-available": "Ajustes no disponibles",
89
+ "property-read-only": "La propiedad '__prop__' es de sólo lectura",
90
+ "readonly-mode": "Ejecución en modo de sólo lectura. Los cambios no se guardarán."
91
+ },
92
+ "library": {
93
+ "unknownLibrary": "Librería desconocida: __library__",
94
+ "unknownType": "Tipo de librería desconocida: __type__",
95
+ "readOnly": "La librería __library__ es de sólo lectura",
96
+ "failedToInit": "Error al inicializar la librería __library__: __error__",
97
+ "invalidProperty": "Propiedad inválida __prop__: '__value__'"
98
+ },
99
+ "nodes": {
100
+ "credentials": {
101
+ "error": "Error al cargar las credenciales: __message__",
102
+ "error-saving": "Error al guardar credenciales: __message__",
103
+ "not-registered": "El tipo de credencial '__type__' no está registrado",
104
+ "system-key-warning": "\n\n---------------------------------------------------------------------\nTu archivo de credenciales de flujo se cifra utilizando una clave generada por el sistema. Si la clave generada por el sistema se pierde por cualquier motivo, tu archivo de credenciales no será recuperable, tendrás que borrarlo y volver a introducir tus credenciales. Node-RED volverá a cifrar tu archivo de credenciales utilizando la clave elegida la próxima vez que instancias un cambio.\n---------------------------------------------------------------------\n",
105
+ "unencrypted": "Usando credenciales no encriptadas",
106
+ "encryptedNotFound": "Credenciales encriptadas no encontradas"
107
+ },
108
+ "flows": {
109
+ "safe-mode": "Flujos detenidos en modo seguro. Instancia para iniciar",
110
+ "registered-missing": "Falta tipo registrado: __type__",
111
+ "error": "Error al cargar flujos: __message__",
112
+ "starting-modified-nodes": "Iniciando nodos modificados",
113
+ "starting-modified-flows": "Iniciando flujos modificados",
114
+ "starting-flows": "Iniciando flujos",
115
+ "started-modified-nodes": "Nodos modificados iniciados",
116
+ "started-modified-flows": "Flujos modificados iniciados",
117
+ "started-flows": "Flujos iniciados",
118
+ "stopping-modified-nodes": "Detención de nodos modificados",
119
+ "stopping-modified-flows": "Detención de flujos modificados",
120
+ "stopping-flows": "Flujos detenidos",
121
+ "stopped-modified-nodes": "Nodos modificados detenidos",
122
+ "stopped-modified-flows": "Flujos modificados detenidos",
123
+ "stopped-flows": "Flujos detenidos",
124
+ "stopped": "Detenido",
125
+ "stopping-error": "Error al detener el nodo: __message__",
126
+ "updated-flows": "Flujos actualizados",
127
+ "added-flow": "Añadiendo flujo: __label__",
128
+ "updated-flow": "Flujo actualizado: __label__",
129
+ "removed-flow": "Flujo eliminado: __label__",
130
+ "missing-types": "Esperando a que se registren los tipos que faltan:",
131
+ "missing-type-provided": " - __type__ (proporcionado por el módulo npm __module__)",
132
+ "missing-type-install-1": "Para instalar cualquiera de estos módulos que faltan, ejecuta:",
133
+ "missing-type-install-2": "en el directorio:"
134
+ },
135
+ "flow": {
136
+ "unknown-type": "Tipo desconocido: __type__",
137
+ "missing-types": "tipos que faltan",
138
+ "error-loop": "El mensaje superó el número máximo de capturas",
139
+ "non-message-returned": "El nodo intentó enviar un mensaje del tipo __type__"
140
+ },
141
+ "index": {
142
+ "unrecognised-id": "id no reconocido: __id__",
143
+ "type-in-use": "Tipo en uso: __msg__",
144
+ "unrecognised-module": "Módulo no reconocido: __module__"
145
+ },
146
+ "registry": {
147
+ "localfilesystem": {
148
+ "module-not-found": "No se puede encontrar el módulo '__module__'"
149
+ }
150
+ }
151
+ },
152
+ "storage": {
153
+ "index": {
154
+ "forbidden-flow-name": "nombre de flujo prohibido"
155
+ },
156
+ "localfilesystem": {
157
+ "user-dir": "Directorio de usuario : __path__",
158
+ "flows-file": "Archivo de flujos : __path__",
159
+ "create": "Creando nuevo archivo __type__",
160
+ "empty": "El archivo __type__ existente está vacío",
161
+ "invalid": "El archivo __type__ existente no es un JSON válido",
162
+ "restore": "Restaurando copia de seguridad de archivo __type__ : __path__",
163
+ "restore-fail": "Error al restaurar la copia de seguridad del archivo __type__ : __message__",
164
+ "fsync-fail": "Fallo en el volcado del archivo __path__ al disco : __message__",
165
+ "warn_name": "Nombre de archivo de flujos indefinido. Generando usando nombre de servidor",
166
+ "projects": {
167
+ "changing-project": "Configuración del proyecto activo : __project__",
168
+ "active-project": "Proyecto activo : __project__",
169
+ "projects-directory": "Directorio de proyectos: __projectsDirectory__",
170
+ "project-not-found": "Proyecto no encontrado : __project__",
171
+ "no-active-project": "No hay proyecto activo: se utiliza el archivo de flujos por defecto",
172
+ "disabled": "Proyectos desactivados : editorTheme.projects.enabled=false",
173
+ "disabledNoFlag": "Proyectos desactivados : establece editorTheme.projects.enabled=true a habilitado",
174
+ "git-not-found": "Proyectos desactivados : comando git no encontrado",
175
+ "git-version-old": "Proyectos desactivados : git __version__ no soportada. Requiere 2.x",
176
+ "summary": "Un Proyecto Node-RED",
177
+ "readme": "### Acerca de\n\nEste es el archivo README.md de tu proyecto. Ayuda a los usuarios a entender qué hace tu proyecto, cómo usarlo y cualquier otra cosa que necesiten saber."
178
+ }
179
+ }
180
+ },
181
+ "context": {
182
+ "log-store-init": "Almacén de contexto : '__name__' [__info__]",
183
+ "error-loading-module": "Error al cargar el almacén de contexto: __message__",
184
+ "error-loading-module2": "Error al cargar el almacén de contexto '__module__': __message__",
185
+ "error-module-not-defined": "Falta la opción 'module' en el almacén de contexto '__storage__'.",
186
+ "error-invalid-module-name": "Nombre de almacén de contexto no válido: '__name__'",
187
+ "error-invalid-default-module": "Almacén de contexto por defecto desconocido: '__storage__'",
188
+ "unknown-store": "Se ha especificado un almacén de contexto desconocido '__name__'. Usando almacén por defecto.",
189
+ "localfilesystem": {
190
+ "invalid-json": "JSON no válido en el archivo de contexto '__file__'",
191
+ "error-circular": "El contexto __scope__ contiene una referencia circular que no se puede mantener",
192
+ "error-write": "Error al escribir el contexto: __message__"
193
+ }
194
+ }
195
+ }
@@ -26,8 +26,8 @@
26
26
  "removed-types": "Types de noeuds supprimés :",
27
27
  "install": {
28
28
  "invalid": "Nom de module invalide",
29
- "installing": "Installation du module : __nom__, version : __version__",
30
- "installed": "Module installé : __nom__",
29
+ "installing": "Installation du module : __name__, version : __version__",
30
+ "installed": "Module installé : __name__",
31
31
  "install-failed": "L'installation a échoué",
32
32
  "install-failed-long": "L'installation du module __name__ a échoué :",
33
33
  "install-failed-not-found": "Module $t(server.install.install-failed-long) introuvable",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@node-red/runtime",
3
- "version": "3.1.3",
3
+ "version": "3.1.4",
4
4
  "license": "Apache-2.0",
5
5
  "main": "./lib/index.js",
6
6
  "repository": {
@@ -16,8 +16,8 @@
16
16
  }
17
17
  ],
18
18
  "dependencies": {
19
- "@node-red/registry": "3.1.3",
20
- "@node-red/util": "3.1.3",
19
+ "@node-red/registry": "3.1.4",
20
+ "@node-red/util": "3.1.4",
21
21
  "async-mutex": "0.4.0",
22
22
  "clone": "2.1.2",
23
23
  "express": "4.18.2",