@theotherwillembotha/node-red-plugincore 0.0.55 → 0.2.0

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.
Files changed (158) hide show
  1. package/README.md +616 -217
  2. package/build/GenerateNodes.js +3 -6
  3. package/build/Nodes.html +3 -1502
  4. package/build/Nodes.js +5 -15
  5. package/build/Plugins.html +227 -0
  6. package/build/Plugins.js +18 -9
  7. package/build/core/NodeConstructor.d.ts +10 -16
  8. package/build/core/NodeConstructor.d.ts.map +1 -1
  9. package/build/core/NodeConstructor.js +112 -156
  10. package/build/core/NodeGenerator.d.ts.map +1 -1
  11. package/build/core/NodeGenerator.js +79 -29
  12. package/build/core/NodeManagerRuntime.d.ts +44 -0
  13. package/build/core/NodeManagerRuntime.d.ts.map +1 -0
  14. package/build/core/NodeManagerRuntime.js +140 -0
  15. package/build/core/Utils.d.ts.map +1 -1
  16. package/build/core/logger/service/LoggerService.d.ts +6 -5
  17. package/build/core/logger/service/LoggerService.d.ts.map +1 -1
  18. package/build/core/logger/service/LoggerService.js +51 -20
  19. package/build/core/logger/template/LoggerTemplate.d.ts.map +1 -1
  20. package/build/core/metrics/MetricsDecorator.d.ts +1 -2
  21. package/build/core/metrics/MetricsDecorator.d.ts.map +1 -1
  22. package/build/core/metrics/MetricsDecorator.js +89 -116
  23. package/build/core/metrics/node/CounterMetricConfigNode.d.ts.map +1 -1
  24. package/build/core/metrics/node/CounterMetricConfigNode.js +4 -5
  25. package/build/core/metrics/node/GaugeMetricConfigNode.d.ts.map +1 -1
  26. package/build/core/metrics/node/GaugeMetricConfigNode.js +5 -6
  27. package/build/core/metrics/node/MetricsConfigNode.d.ts +19 -9
  28. package/build/core/metrics/node/MetricsConfigNode.d.ts.map +1 -1
  29. package/build/core/metrics/node/MetricsConfigNode.js +14 -45
  30. package/build/core/metrics/node/TimerMetricConfigNode.d.ts.map +1 -1
  31. package/build/core/metrics/node/TimerMetricConfigNode.js +11 -17
  32. package/build/core/metrics/service/MetricsService.d.ts +110 -114
  33. package/build/core/metrics/service/MetricsService.d.ts.map +1 -1
  34. package/build/core/metrics/service/MetricsService.js +122 -339
  35. package/build/core/metrics/template/CounterMetricTemplate.d.ts.map +1 -1
  36. package/build/core/metrics/template/GaugeMetricTemplate.d.ts.map +1 -1
  37. package/build/core/metrics/template/MetricsTemplate.d.ts.map +1 -1
  38. package/build/core/metrics/template/MetricsTemplate.js +1 -2
  39. package/build/core/metrics/template/TimerMetricTemplate.d.ts.map +1 -1
  40. package/build/core/other/node/DelegatedConfigReferenceNode.d.ts +1 -1
  41. package/build/core/other/node/DelegatedConfigReferenceNode.d.ts.map +1 -1
  42. package/build/core/other/node/DelegatedConfigReferenceNode.js +1 -1
  43. package/build/core/other/service/InputService.d.ts.map +1 -1
  44. package/build/core/other/service/SettingsService.d.ts +1 -2
  45. package/build/core/other/service/SettingsService.d.ts.map +1 -1
  46. package/build/core/other/service/SettingsService.js +19 -5
  47. package/build/core/other/template/BasicTemplate.d.ts.map +1 -1
  48. package/build/core/other/template/SettingsTemplate.d.ts.map +1 -1
  49. package/build/core/state/node/InternalStateConfigNode.d.ts +16 -0
  50. package/build/core/state/node/InternalStateConfigNode.d.ts.map +1 -0
  51. package/build/core/state/node/InternalStateConfigNode.js +89 -0
  52. package/build/core/state/node/StateConfigNode.d.ts +24 -0
  53. package/build/core/state/node/StateConfigNode.d.ts.map +1 -0
  54. package/build/core/state/node/StateConfigNode.js +22 -0
  55. package/build/core/state/service/StateService.d.ts +34 -0
  56. package/build/core/state/service/StateService.d.ts.map +1 -0
  57. package/build/core/state/service/StateService.js +201 -0
  58. package/build/core/state/template/StateTemplate.d.ts +8 -0
  59. package/build/core/state/template/StateTemplate.d.ts.map +1 -0
  60. package/build/core/state/template/StateTemplate.js +11 -0
  61. package/build/core/tagging/ServiceDescriptionDecorator.d.ts +10 -0
  62. package/build/core/tagging/ServiceDescriptionDecorator.d.ts.map +1 -0
  63. package/build/core/tagging/ServiceDescriptionDecorator.js +10 -0
  64. package/build/core/tagging/service/NodeTypeService.d.ts +1 -2
  65. package/build/core/tagging/service/NodeTypeService.d.ts.map +1 -1
  66. package/build/core/tagging/service/NodeTypeService.js +19 -5
  67. package/build/core/ui/template/ScriptEditorTemplate.d.ts.map +1 -1
  68. package/build/core/ui/template/UIHelperTemplate.d.ts.map +1 -1
  69. package/build/core/webhook/WebhookDecorator.d.ts.map +1 -1
  70. package/build/core/webhook/WebhookDecorator.js +43 -6
  71. package/build/core/webhook/node/WebhookServerConfigNode.d.ts.map +1 -1
  72. package/build/core/webhook/service/ReverseProxyTypeService.d.ts +1 -0
  73. package/build/core/webhook/service/ReverseProxyTypeService.d.ts.map +1 -1
  74. package/build/core/webhook/service/WebhookServerService.d.ts +3 -4
  75. package/build/core/webhook/service/WebhookServerService.d.ts.map +1 -1
  76. package/build/core/webhook/service/WebhookServerService.js +48 -23
  77. package/build/core/webhook/template/WebhookTemplate.d.ts.map +1 -1
  78. package/build/index.d.ts +5 -2
  79. package/build/index.d.ts.map +1 -1
  80. package/build/index.js +6 -2
  81. package/build/runtime/NodeManagerRuntime.js +140 -0
  82. package/documentation/CounterMetricConfigNode.png +0 -0
  83. package/documentation/GaugeMetricConfigNode.png +0 -0
  84. package/documentation/LoggerTemplate.png +0 -0
  85. package/documentation/MetricsTemplate.png +0 -0
  86. package/documentation/StateTemplate.png +0 -0
  87. package/documentation/TimerMetricConfigNode_histogram.png +0 -0
  88. package/documentation/TimerMetricConfigNode_summary.png +0 -0
  89. package/documentation/WebhookServerConfigNode.png +0 -0
  90. package/documentation/WebhookTemplate.png +0 -0
  91. package/package.json +5 -12
  92. package/src/GenerateNodes.ts +7 -11
  93. package/src/core/NodeConstructor.ts +134 -197
  94. package/src/core/NodeGenerator.ts +88 -34
  95. package/src/core/NodeManagerRuntime.ts +179 -0
  96. package/src/core/logger/service/LoggerService.ts +39 -26
  97. package/src/core/logger/template/LoggerTemplate.html +13 -8
  98. package/src/core/metrics/MetricsDecorator.ts +140 -168
  99. package/src/core/metrics/node/CounterMetricConfigNode.ts +20 -20
  100. package/src/core/metrics/node/GaugeMetricConfigNode.ts +24 -25
  101. package/src/core/metrics/node/MetricsConfigNode.ts +29 -48
  102. package/src/core/metrics/node/TimerMetricConfigNode.html +2 -2
  103. package/src/core/metrics/node/TimerMetricConfigNode.ts +50 -59
  104. package/src/core/metrics/service/MetricsService.ts +214 -489
  105. package/src/core/metrics/template/CounterMetricTemplate.html +0 -1
  106. package/src/core/metrics/template/GaugeMetricTemplate.html +1 -1
  107. package/src/core/metrics/template/MetricsTemplate.html +132 -13
  108. package/src/core/metrics/template/MetricsTemplate.ts +3 -4
  109. package/src/core/other/node/DelegatedConfigReferenceNode.ts +1 -1
  110. package/src/core/other/service/SettingsService.ts +6 -10
  111. package/src/core/other/template/BasicTemplate.html +5 -2
  112. package/src/core/state/node/InternalStateConfigNode.html +77 -0
  113. package/src/core/state/node/InternalStateConfigNode.ts +102 -0
  114. package/src/core/state/node/StateConfigNode.ts +29 -0
  115. package/src/core/state/service/StateService.ts +180 -0
  116. package/src/core/state/template/StateTemplate.html +244 -0
  117. package/src/core/state/template/StateTemplate.ts +17 -0
  118. package/src/core/tagging/ServiceDescriptionDecorator.ts +23 -0
  119. package/src/core/tagging/service/NodeTypeService.ts +6 -11
  120. package/src/core/ui/template/UIHelperTemplate.html +41 -26
  121. package/src/core/webhook/WebhookDecorator.ts +53 -10
  122. package/src/core/webhook/service/ReverseProxyTypeService.ts +1 -0
  123. package/src/core/webhook/service/WebhookServerService.ts +39 -28
  124. package/src/core/webhook/template/WebhookTemplate.html +29 -36
  125. package/src/index.ts +7 -2
  126. package/build/core/logger/node/ConsoleLoggerConfigNode.d.ts +0 -20
  127. package/build/core/logger/node/ConsoleLoggerConfigNode.d.ts.map +0 -1
  128. package/build/core/logger/node/ConsoleLoggerConfigNode.html +0 -90
  129. package/build/core/logger/node/ConsoleLoggerConfigNode.js +0 -62
  130. package/build/core/logger/node/RestLoggerConfigNode.d.ts +0 -40
  131. package/build/core/logger/node/RestLoggerConfigNode.d.ts.map +0 -1
  132. package/build/core/logger/node/RestLoggerConfigNode.html +0 -183
  133. package/build/core/logger/node/RestLoggerConfigNode.js +0 -128
  134. package/build/core/logger/template/LoggerTemplate.html +0 -331
  135. package/build/core/metrics/node/CounterMetricConfigNode.html +0 -48
  136. package/build/core/metrics/node/GaugeMetricConfigNode.html +0 -48
  137. package/build/core/metrics/node/MetricsConfigNode.html +0 -21
  138. package/build/core/metrics/node/TimerMetricConfigNode.html +0 -190
  139. package/build/core/metrics/template/CounterMetricTemplate.html +0 -40
  140. package/build/core/metrics/template/GaugeMetricTemplate.html +0 -39
  141. package/build/core/metrics/template/MetricsTemplate.html +0 -54
  142. package/build/core/metrics/template/TimerMetricTemplate.html +0 -39
  143. package/build/core/other/node/DelegatedConfigReferenceNode.html +0 -1
  144. package/build/core/other/template/BasicTemplate.html +0 -76
  145. package/build/core/other/template/SettingsTemplate.html +0 -128
  146. package/build/core/ui/template/ScriptEditorTemplate.html +0 -50
  147. package/build/core/ui/template/UIHelperTemplate.html +0 -229
  148. package/build/core/webhook/node/WebhookServerConfigNode.html +0 -61
  149. package/build/core/webhook/template/WebhookTemplate.html +0 -442
  150. package/documentation/ConsoleLoggerConfigNode.png +0 -0
  151. package/documentation/MetricsConfigNode.png +0 -0
  152. package/documentation/RestLoggerConfigNode.png +0 -0
  153. package/documentation/TimerMetricConfigNode.png +0 -0
  154. package/documentation/WebhookNode.png +0 -0
  155. package/src/core/logger/node/ConsoleLoggerConfigNode.html +0 -90
  156. package/src/core/logger/node/ConsoleLoggerConfigNode.ts +0 -71
  157. package/src/core/logger/node/RestLoggerConfigNode.html +0 -183
  158. package/src/core/logger/node/RestLoggerConfigNode.ts +0 -170
@@ -1,13 +1,15 @@
1
1
 
2
- import {BaseService, FlowDeployment, ServiceDescriptor } from "../../NodeConstructor";
2
+ import {BaseService, FlowDeployment} from "../../NodeConstructor";
3
+ import { ServiceDescription } from "../../tagging/ServiceDescriptionDecorator";
3
4
  import { NodeAPI, NodeAPISettingsWithData } from "node-red";
4
5
  import { WebhookServerConfigNode } from "../node/WebhookServerConfigNode";
5
6
  import { WebhookTemplate } from "../template/WebhookTemplate";
6
- import express, {Express, Request, Response} from "express";
7
+ import type { Express, Request, Response } from "express";
7
8
  import { Server } from "http";
8
9
  import { ApiKeyMechanismType, RestAuthType } from "../../logger/service/LoggerService";
9
10
 
10
- var bodyParser = require('body-parser');
11
+ function getExpress(): any { return require('express'); }
12
+ function getBodyParser(): any { return require('body-parser'); }
11
13
 
12
14
  export enum EndpointMethodType {
13
15
  GET = "GET",
@@ -46,8 +48,8 @@ export class WebhookServer {
46
48
  public constructor(config:WebhookServerConfig){
47
49
  this._config = config;
48
50
 
49
- this._app = express();
50
- this._app.use(bodyParser.json({type: "application/json", limit: '50mb'}));
51
+ this._app = getExpress()();
52
+ this._app.use(getBodyParser().json({type: "application/json", limit: '50mb'}));
51
53
  this._listener = this._app.listen(this._config.port, '0.0.0.0');
52
54
  }
53
55
 
@@ -95,7 +97,6 @@ export class WebhookServer {
95
97
  this._app.post(endpoint.path, handlerChain);
96
98
  }
97
99
 
98
- console.log("added endpoint to " + endpoint.path);
99
100
  }
100
101
 
101
102
  public detach(configuration:EndpointConfig){
@@ -116,8 +117,10 @@ export class WebhookServer {
116
117
  })
117
118
  });
118
119
 
119
- console.log("ROUTES REMOVED!");
120
- this._app.router.stack.forEach(route => console.log("KNOWN ROUTE", route, route.route?.path, (route.route as any).methods.post));
120
+ }
121
+
122
+ public close(): void {
123
+ this._listener.close();
121
124
  }
122
125
 
123
126
  public config():WebhookServerConfig {
@@ -132,9 +135,19 @@ export type WebhookServerConfig = {
132
135
  externalPort:number;
133
136
  }
134
137
 
135
- export class WebhookServerService extends BaseService {
138
+ // Stored on global so all bundled copies share the same server registry.
139
+ const _GLOBAL_WEBHOOKSERVERS_KEY = '__plugincore_webhookservers__';
140
+ function getWebhookServersStore(): {[key:string]:WebhookServer} {
141
+ if (!(global as any)[_GLOBAL_WEBHOOKSERVERS_KEY]) (global as any)[_GLOBAL_WEBHOOKSERVERS_KEY] = {};
142
+ return (global as any)[_GLOBAL_WEBHOOKSERVERS_KEY];
143
+ }
136
144
 
137
- private static webhookServers:{[key:string]:WebhookServer} = {};
145
+ @ServiceDescription({
146
+ id: "@theotherwillembotha/webhookserverservice",
147
+ sourceFile: "@theotherwillembotha/node-red-plugincore",
148
+ dependencies: [WebhookServerConfigNode, WebhookTemplate]
149
+ })
150
+ export class WebhookServerService extends BaseService {
138
151
 
139
152
  constructor(){
140
153
  super("wehbookserver")
@@ -154,14 +167,15 @@ export class WebhookServerService extends BaseService {
154
167
 
155
168
  let webhookServerNodes = flowDeployment.flows.filter(node => node.type === "WebhookServerConfigNode") as any as WebhookServerConfig[];
156
169
 
170
+ const store = getWebhookServersStore();
171
+
157
172
  // find all the nodes that have been removed or changed.
158
- Object.entries(WebhookServerService.webhookServers).forEach(([key, serverService]) => {
173
+ Object.entries(store).forEach(([key, serverService]) => {
159
174
  let webhookServerNode = webhookServerNodes.find(node => node.id === key);
160
175
  let serverServiceConfig = serverService.config();
161
176
  // compare the properties.
162
177
  if(!webhookServerNode){
163
178
  // the node has been removed: TODO: alert the listeners that it has been removed.
164
- console.log("Webhook Service Removed", serverServiceConfig)
165
179
  removedServers.push(serverServiceConfig);
166
180
  }
167
181
  else{
@@ -173,7 +187,6 @@ export class WebhookServerService extends BaseService {
173
187
 
174
188
  if(serviceChanged){
175
189
  // TODO: notify the subscribers that the server has chaned.
176
- console.log("Notify the subscribers WebhookServer has changed.", serverServiceConfig, webhookServerNode);
177
190
  removedServers.push(serverServiceConfig);
178
191
  addedServers.push(webhookServerNode);
179
192
  }
@@ -182,30 +195,28 @@ export class WebhookServerService extends BaseService {
182
195
 
183
196
  // find all the servers that have been added.
184
197
  webhookServerNodes
185
- .filter(node => !WebhookServerService.webhookServers[node.id])
198
+ .filter(node => !store[node.id])
186
199
  .forEach(node => addedServers.push(node));
187
200
 
188
- //console.log("REMOVED SERVERS:", removedServers);
189
- //console.log("ADDED SERVERS:", addedServers);
201
+ // Close and remove servers that have been deleted or whose config changed.
202
+ removedServers.forEach(removedConfig => {
203
+ const server = store[removedConfig.id];
204
+ if (server) {
205
+ server.close();
206
+ delete store[removedConfig.id];
207
+ console.log(`Closed webhook server on port ${removedConfig.port}`);
208
+ }
209
+ });
190
210
  }
191
211
 
192
212
  public static get (config:WebhookServerConfig): WebhookServer{
193
- let server = (this.webhookServers[config.id]);
213
+ const store = getWebhookServersStore();
214
+ let server = store[config.id];
194
215
  if(!server){
195
- this.webhookServers[config.id] = server = new WebhookServer(config);
216
+ store[config.id] = server = new WebhookServer(config);
196
217
  console.log(`Creating webhook server on port ${config.port}`);
197
218
  }
198
219
  return server;
199
220
  }
200
221
 
201
- static override getServiceDescriptor():ServiceDescriptor {
202
- return new ServiceDescriptor(
203
- "@theotherwillembotha/webhookserverservice",
204
- "WebhookServerService",
205
- "services-plugin",
206
- "@theotherwillembotha/node-red-plugincore",
207
- WebhookServerService,
208
- [WebhookServerConfigNode, WebhookTemplate]
209
- );
210
- }
211
222
  }
@@ -11,7 +11,7 @@ node
11
11
  .addDefault('webhookAuth_apikey_key', {value:"x-api-key", required:false})
12
12
  .addDefault('webhookAuth_apikey_value', {value:"testkey", required:false})
13
13
  .addDefault('reverseProxies_enabled', {required:false})
14
- .addDefault('reverseProxies_connections', { type:"ReverseProxyType[]", maxInstances:10})
14
+ .addDefault('reverseProxies_connections', { type:"DelegatedConfigReferenceNode", list:true, maxInstances:10})
15
15
  </script>
16
16
 
17
17
  <div template-section="onIncludeOnce">
@@ -45,8 +45,6 @@ node
45
45
  </div>
46
46
 
47
47
  <script type="text/javascript" template-section="onIncludeEditPrepare">
48
- {
49
- let node = this;
50
48
 
51
49
  let showSelectedAutnetication = function(value){
52
50
  let webhookConfig = $("#section_webhookconfig");
@@ -133,12 +131,6 @@ node
133
131
  return types;
134
132
  }
135
133
 
136
- getProxyTypes().then(types => {
137
- if(types.length === 0){
138
- $("#section_reverseproxy_feature").hide();
139
- }
140
- });
141
-
142
134
  let getProxies = async () => {
143
135
  let proxies = [];
144
136
 
@@ -163,8 +155,8 @@ node
163
155
  scrollOnAdd: true,
164
156
  addButton: 'Add ProxyHost',
165
157
  header: $('<div>').append($.parseHTML(`
166
- <div style='width:30%; margin-left:5%; display:inline-grid;'>Proxy</div>
167
- <div style='width:auto; margin-right:5%; display:inline-grid;'>Domain Name</div>
158
+ <div style='width:30%; margin-left:5%; display:inline-block;'>Proxy</div>
159
+ <div style='width:auto; margin-right:5%; display:inline-block;'>Domain Name</div>
168
160
  `)
169
161
  ),
170
162
  buttons: [
@@ -265,15 +257,14 @@ node
265
257
 
266
258
  addItem: async function(container, i, proxy){
267
259
  let row = $('<div/>', {
268
- class: 'form-row',
269
- style: 'display: flex; margin-bottom: 0;'
260
+ style: 'display: flex; align-items: center; width: 100%; margin-bottom: 2px; box-sizing: border-box;'
270
261
  }).appendTo(container);
271
262
 
272
263
  let proxyColumn = $('<select/>', {
273
264
  type: 'text',
274
265
  name: i,
275
266
  required: true,
276
- style: 'margin-left: 5px; margin-bottom: 0;',
267
+ style: 'flex: 1; min-width: 0; margin-left: 5px; margin-bottom: 0;',
277
268
  class: 'proxy-proxy'
278
269
  }).appendTo(row);
279
270
 
@@ -295,7 +286,7 @@ node
295
286
  type: 'text',
296
287
  name: i,
297
288
  required: true,
298
- style: 'margin-left: 5px; margin-bottom: 0;',
289
+ style: 'flex: 1; min-width: 0; margin-left: 5px; margin-bottom: 0;',
299
290
  class: 'proxy-domainname'
300
291
  }).appendTo(row)
301
292
  domainnameColumn.val(proxy.domainname);
@@ -310,15 +301,19 @@ node
310
301
  $('.proxy-dropdown').remove();
311
302
  });
312
303
 
313
- this.reverseProxies_connections = (this.reverseProxies_connections) ? this.reverseProxies_connections : [];
314
- reverseProxyList.editableList('addItems', this.reverseProxies_connections);
315
- }
304
+ // Show the reverse proxy section only if at least one provider type is registered.
305
+ // The editableList is initialised above (while the section is still hidden) so that
306
+ // its wide toolbar buttons never participate in the tray's initial layout calculation.
307
+ getProxyTypes().then(types => {
308
+ if(types.length === 0) return;
309
+ $("#section_reverseproxy_feature").show();
310
+ let savedConnections = this.reverseProxies_connections || [];
311
+ reverseProxyList.editableList('addItems', savedConnections);
312
+ });
313
+
316
314
  </script>
317
315
 
318
316
  <script type="text/javascript" template-section="onIncludeEditSave">
319
- {
320
- let node = this;
321
-
322
317
  // pulling the values from the reverseproxy table.
323
318
  let connectionList = $("#reverseproxylist_table").editableList('items');
324
319
  node.reverseProxies_connections = [];
@@ -330,7 +325,6 @@ node
330
325
  });
331
326
 
332
327
  console.log(node.reverseProxies_connections);
333
- }
334
328
  </script>
335
329
 
336
330
  <script type="text/html" template-section="onIncludeEditForm">
@@ -340,7 +334,7 @@ node
340
334
  </div>
341
335
 
342
336
  <div class="editorgroupborder">
343
- <div class="form-row nomargin">
337
+ <div class="form-row">
344
338
  <label class="towb_editorlabel" for="{{defaults.webhook}}"><i class="fa fa-server"></i> Server</label>
345
339
  <input id="{{defaults.webhook}}" placeholder="webhook" />
346
340
  </div>
@@ -387,20 +381,19 @@ node
387
381
  </div>
388
382
  </div>
389
383
 
390
- <div id="section_reverseproxy_feature">
391
- <div class="form-row">
392
- <label>Reverse Proxy</label>
393
- <input type="checkbox" id="{{defaults.reverseProxies_enabled}}" style="width:20px; margin-right:5px;" />
394
- <label style="width:auto" for="{{defaults.reverseProxies_enabled}}"><span>Enable Reverse Proxy</span></label>
395
- </div>
396
- <div id="section_webhookconfig_reverseproxy" style="display:none">
384
+ <div id="section_reverseproxy_feature" style="display:none">
397
385
  <div class="form-row">
398
- <label></label>
399
- <ol id="reverseproxylist_table" class="theotherwillembotha-compact-table"></ol>
386
+ <label>Reverse Proxy</label>
387
+ <input type="checkbox" id="{{defaults.reverseProxies_enabled}}" style="width:20px; margin-right:5px;" />
388
+ <label style="width:auto" for="{{defaults.reverseProxies_enabled}}"><span>Enable Reverse Proxy</span></label>
389
+ </div>
390
+ <div id="section_webhookconfig_reverseproxy" style="display:none">
391
+ <div class="form-row">
392
+ <label></label>
393
+ <ol id="reverseproxylist_table" class="theotherwillembotha-compact-table"></ol>
394
+ </div>
400
395
  </div>
401
396
  </div>
402
- </div>
403
-
404
397
 
405
398
  </div>
406
399
  </div>
@@ -427,10 +420,10 @@ Validates the `Authorization` header on each incoming request against a username
427
420
  : *password* (string) : the password expected in the `Authorization` header
428
421
 
429
422
  - API Key:
430
- Validates a key/value pair carried in the request. Only the `Header` mechanism is currently supported the key is read from a named request header and compared against the configured value. Requests that do not supply the correct key receive a `401` response.
423
+ Validates a key/value pair carried in the request. Only the `Header` mechanism is currently supported - the key is read from a named request header and compared against the configured value. Requests that do not supply the correct key receive a `401` response.
431
424
  : *mechanism* (mechanism) : the transport mechanism for the key. Currently supported: `Header`
432
425
  : *key name* (string) : the name of the request header carrying the key (e.g. `x-api-key`)
433
- : *key value* (string) : the expected value requests not matching this value are rejected
426
+ : *key value* (string) : the expected value - requests not matching this value are rejected
434
427
 
435
428
  ### Reverse Proxy
436
429
  When *enable reverse proxy* is checked, the webhook endpoint is registered with one or more reverse proxy services installed in Node-RED. Reverse proxy types are discovered automatically from any plugin that registers a service tagged `ReverseProxyType` (e.g. an Nginx Proxy Manager integration). Each row in the list maps the internal webhook server to a public-facing domain.
package/src/index.ts CHANGED
@@ -4,8 +4,6 @@ export * from "./core/NodeConstructor";
4
4
 
5
5
  // LOGGER
6
6
  export * from "./core/logger/service/LoggerService";
7
- export * from "./core/logger/node/ConsoleLoggerConfigNode";
8
- export * from "./core/logger/node/RestLoggerConfigNode";
9
7
  export * from "./core/logger/template/LoggerTemplate";
10
8
 
11
9
 
@@ -20,9 +18,16 @@ export * from "./core/metrics/node/GaugeMetricConfigNode";
20
18
  export * from "./core/metrics/node/TimerMetricConfigNode";
21
19
  export * from "./core/metrics/template/TimerMetricTemplate";
22
20
 
21
+ // STATE
22
+ export * from "./core/state/service/StateService";
23
+ export * from "./core/state/node/StateConfigNode";
24
+ export * from "./core/state/node/InternalStateConfigNode";
25
+ export * from "./core/state/template/StateTemplate";
26
+
23
27
  // TAGGING
24
28
  export * from "./core/tagging/service/NodeTypeService";
25
29
  export * from "./core/tagging/NodeDescriptionDecorator";
30
+ export * from "./core/tagging/ServiceDescriptionDecorator";
26
31
 
27
32
  // UI
28
33
  export * from "./core/ui/template/UIHelperTemplate";
@@ -1,20 +0,0 @@
1
- import { Node } from "node-red";
2
- import { LoggerConfigNodeConfig, BaseLoggerConfig, AbstractLogger, LoggerConfigNode, Log, Level } from "../service/LoggerService";
3
- import { LoggerTemplateConfig } from "../template/LoggerTemplate";
4
- interface ConsoleLoggerConfigNodeConfig extends LoggerConfigNodeConfig {
5
- level: Level;
6
- template: string;
7
- }
8
- export declare class ConsoleLoggerConfigNode extends LoggerConfigNode<ConsoleLoggerConfigNodeConfig, ConsoleLogger> {
9
- private _logger;
10
- constructor(node: Node, config: ConsoleLoggerConfigNodeConfig);
11
- protected logger(): ConsoleLogger;
12
- }
13
- export interface ConsoleLoggerConfig extends BaseLoggerConfig {
14
- }
15
- declare class ConsoleLogger extends AbstractLogger<ConsoleLoggerConfig> {
16
- constructor(config: ConsoleLoggerConfig);
17
- protected createLogger(config: LoggerTemplateConfig): Log;
18
- }
19
- export {};
20
- //# sourceMappingURL=ConsoleLoggerConfigNode.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ConsoleLoggerConfigNode.d.ts","sourceRoot":"","sources":["../../../../src/core/logger/node/ConsoleLoggerConfigNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAiB,sBAAsB,EAAE,gBAAgB,EAAE,cAAc,EAAU,gBAAgB,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAA;AAGxJ,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAElE,UAAU,6BAA8B,SAAQ,sBAAsB;IAClE,KAAK,EAAC,KAAK,CAAC;IACZ,QAAQ,EAAC,MAAM,CAAC;CACnB;AAED,qBASa,uBAAwB,SAAQ,gBAAgB,CAAC,6BAA6B,EAAE,aAAa,CAAC;IAEvG,OAAO,CAAC,OAAO,CAAiB;gBAEpB,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,6BAA6B;IAgB7D,SAAS,CAAC,MAAM,IAAG,aAAa;CAGnC;AAED,MAAM,WAAW,mBAAoB,SAAQ,gBAAgB;CAE5D;AAED,cAAM,aAAc,SAAQ,cAAc,CAAC,mBAAmB,CAAC;gBAE/C,MAAM,EAAC,mBAAmB;IAItC,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,oBAAoB,GAAG,GAAG;CAG5D"}
@@ -1,90 +0,0 @@
1
-
2
- <script type="text/javascript" template-section="onCompose">
3
- node
4
- .addDefault("name", {value:"Logger Example", required:true})
5
- .addDefault("platform", {value:"rest", required:true})
6
- .addDefault("template", {value:`message:{{msg}}`, required:true})
7
- .addDefault("level", {value:"info", required:true})
8
- .setPaletteLabel("Console Logger Config Node")
9
- .setLabel(function() {return this.name })
10
- </script>
11
-
12
- <script type="text/javascript" template-section="onIncludeEditPrepare">
13
- {
14
- let node = this;
15
-
16
- let levelSelection = $("#node-config-input-level");
17
- levelSelection.typedInput({type:"level", types:[{
18
- value: "level",
19
- options: [
20
- { value: "DEBUG", label: "debug"},
21
- { value: "INFO", label: "info"},
22
- { value: "WARNING", label: "warning"},
23
- { value: "ERROR", label: "error"},
24
- ]
25
- }]});
26
-
27
- this.editor = RED.editor.createEditor({
28
- id: 'node-config-input-templateEditor',
29
- mode: 'ace/mode/handlebars',
30
- value: this.template
31
- });
32
- }
33
- </script>
34
-
35
- <script type="text/javascript" template-section="onIncludeEditSave">
36
- {
37
- let node = this;
38
-
39
- this.template = this.editor.getValue();
40
- this.editor.destroy();
41
- delete this.editor;
42
- }
43
-
44
- </script>
45
-
46
- <script type="text/html" template-section="onIncludeEditForm">
47
- <div id="LoggerConfig">
48
- <div class="form-row">
49
- <label class="towb_editorlabel" for="node-config-input-name"><i class="fa fa-font"></i> Name</label>
50
- <input type="text" id="node-config-input-name" />
51
- </div>
52
-
53
- <div class="form-row">
54
- <label class="towb_editorlabel" for="node-config-input-level"><i class="fa fa-signal"></i> Level</label>
55
- <input type="text" id="node-config-input-level" />
56
- </div>
57
-
58
- <div class="form-row">
59
- <label class="towb_editorlabel" for="node-config-input-templateEditor"><i class="fa fa-code"></i> Template</label>
60
- <div style="height: 250px; min-height:150px;" class="node-text-editor" id="node-config-input-templateEditor"></div>
61
- </div>
62
- </div>
63
- </script>
64
-
65
- <script type="text/markdown" template-section="onIncludeDocumentation">
66
- Writes log output to the Node-RED runtime console (stdout). Suitable for local development and containerised environments where stdout is captured.
67
-
68
- ### Properties
69
- : *name* (string) : A descriptive name for this logger configuration.
70
- : *level* (level) : The minimum log level. Messages below this threshold are suppressed. Options: DEBUG, INFO, WARNING, ERROR.
71
- : *template* (mustache) : A Mustache/Handlebars template that formats the log message body.
72
-
73
- ### Mustache Templating
74
- Mustache/Handlebars templates build the message string written to the console.
75
-
76
- #### Provided Properties
77
- : *msg* (object) : The Node-RED message object passed through the node.
78
- : *currentTime* (string) : The current time in ISO 8601 format.
79
-
80
- #### Helpers
81
- : *json* (helper) : Serialises an object to a JSON string using `JSON.stringify`.
82
-
83
- #### Examples
84
- - `{{{json msg}}}` — serialises the full message object as JSON.
85
-
86
- #### References
87
- - [Mustache — Wikipedia](https://en.wikipedia.org/wiki/Mustache_(template_system))
88
- - [Mustache — Playground](https://jgonggrijp.gitlab.io/wontache/playground.html)
89
- </script>
90
-
@@ -1,62 +0,0 @@
1
- "use strict";
2
- var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
- return c > 3 && r && Object.defineProperty(target, key, r), r;
7
- };
8
- var __metadata = (this && this.__metadata) || function (k, v) {
9
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.ConsoleLoggerConfigNode = void 0;
13
- const LoggerService_1 = require("../service/LoggerService");
14
- const NodeGenerator_1 = require("../../NodeGenerator");
15
- const NodeDescriptionDecorator_1 = require("../../tagging/NodeDescriptionDecorator");
16
- let ConsoleLoggerConfigNode = class ConsoleLoggerConfigNode extends LoggerService_1.LoggerConfigNode {
17
- constructor(node, config) {
18
- super(node, config);
19
- let _this = this;
20
- // create logger config
21
- let loggerConfig = {
22
- id: this.id(),
23
- type: "CONSOLE",
24
- level: config.level,
25
- template: config.template,
26
- };
27
- // create logger instance:
28
- this._logger = new ConsoleLogger(loggerConfig);
29
- }
30
- logger() {
31
- return this._logger;
32
- }
33
- };
34
- exports.ConsoleLoggerConfigNode = ConsoleLoggerConfigNode;
35
- exports.ConsoleLoggerConfigNode = ConsoleLoggerConfigNode = __decorate([
36
- (0, NodeDescriptionDecorator_1.NodeDescription)({
37
- id: "ConsoleLoggerConfigNode",
38
- name: "Console Logger",
39
- group: "config",
40
- sourceFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "ConsoleLoggerConfigNode.html",
41
- package: "@theotherwillembotha/node-red-plugincore",
42
- dependencies: [LoggerService_1.LoggerService],
43
- tags: ["LoggerType"]
44
- }),
45
- __metadata("design:paramtypes", [Object, Object])
46
- ], ConsoleLoggerConfigNode);
47
- class ConsoleLogger extends LoggerService_1.AbstractLogger {
48
- constructor(config) {
49
- super(config);
50
- }
51
- createLogger(config) {
52
- return new ConsoleAppender(config);
53
- }
54
- }
55
- class ConsoleAppender extends LoggerService_1.Log {
56
- constructor(config) {
57
- super(config);
58
- }
59
- writeToLog(level, message, tags) {
60
- console.log(new Date().toISOString(), this.config().id, level, tags, message);
61
- }
62
- }
@@ -1,40 +0,0 @@
1
- import { Node } from "node-red";
2
- import { ConfigNodeConfig } from "../../NodeConstructor";
3
- import { LoggerConfigNode, AbstractLogger, BaseLoggerConfig, Log } from "../service/LoggerService";
4
- import { ApiKeyMechanismType, Level, RestAuthType } from "../service/LoggerService";
5
- import { LoggerTemplateConfig } from "../template/LoggerTemplate";
6
- interface RestLoggerConfigNodeConfig extends ConfigNodeConfig {
7
- id: string;
8
- level: Level;
9
- template: string;
10
- rest_url: string;
11
- rest_ignoresslerror: boolean;
12
- rest_auth_type: RestAuthType;
13
- rest_auth_basic_username: string;
14
- rest_auth_basic_password: string;
15
- rest_auth_apikey_mechanism: ApiKeyMechanismType;
16
- rest_auth_apikey_name: string;
17
- rest_auth_apikey_value: string;
18
- }
19
- export declare class RestLoggerConfigNode extends LoggerConfigNode<RestLoggerConfigNodeConfig, RestLogger> {
20
- private _logger;
21
- constructor(node: Node, config: RestLoggerConfigNodeConfig);
22
- protected logger(): RestLogger;
23
- }
24
- declare class RestLogger extends AbstractLogger<RestLoggerConfig> {
25
- private winston;
26
- constructor(config: RestLoggerConfig);
27
- protected createLogger(config: LoggerTemplateConfig): Log;
28
- }
29
- interface RestLoggerConfig extends BaseLoggerConfig {
30
- url: string;
31
- ignoresslerror: boolean;
32
- auth_type: RestAuthType;
33
- auth_basic_username: string;
34
- auth_basic_password: string;
35
- auth_apikey_mechanism: ApiKeyMechanismType;
36
- auth_apikey_name: string;
37
- auth_apikey_value: string;
38
- }
39
- export {};
40
- //# sourceMappingURL=RestLoggerConfigNode.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RestLoggerConfigNode.d.ts","sourceRoot":"","sources":["../../../../src/core/logger/node/RestLoggerConfigNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAC,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAiB,gBAAgB,EAAE,cAAc,EAAE,gBAAgB,EAAU,GAAG,EAAE,MAAM,0BAA0B,CAAA;AAEzH,OAAO,EAAE,mBAAmB,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAEpF,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAKlE,UAAU,0BAA2B,SAAQ,gBAAgB;IAEzD,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAC,KAAK,CAAC;IACZ,QAAQ,EAAC,MAAM,CAAC;IAEhB,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAC,OAAO,CAAC;IAC5B,cAAc,EAAE,YAAY,CAAC;IAC7B,wBAAwB,EAAC,MAAM,CAAC;IAChC,wBAAwB,EAAC,MAAM,CAAC;IAChC,0BAA0B,EAAC,mBAAmB,CAAC;IAC/C,qBAAqB,EAAC,MAAM,CAAC;IAC7B,sBAAsB,EAAC,MAAM,CAAC;CACjC;AAED,qBASa,oBAAqB,SAAQ,gBAAgB,CAAC,0BAA0B,EAAE,UAAU,CAAC;IAE9F,OAAO,CAAC,OAAO,CAAc;gBAEjB,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,0BAA0B;IAyB1D,SAAS,CAAC,MAAM,IAAG,UAAU;CAGhC;AAED,cAAM,UAAW,SAAQ,cAAc,CAAC,gBAAgB,CAAC;IAErD,OAAO,CAAC,OAAO,CAAQ;gBAEX,MAAM,EAAC,gBAAgB;IA8DnC,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,oBAAoB,GAAG,GAAG;CAG5D;AAoBD,UAAU,gBAAiB,SAAQ,gBAAgB;IAC/C,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAC,OAAO,CAAC;IACvB,SAAS,EAAE,YAAY,CAAC;IACxB,mBAAmB,EAAC,MAAM,CAAC;IAC3B,mBAAmB,EAAC,MAAM,CAAC;IAC3B,qBAAqB,EAAC,mBAAmB,CAAC;IAC1C,gBAAgB,EAAC,MAAM,CAAC;IACxB,iBAAiB,EAAC,MAAM,CAAC;CAC5B"}