@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.
- package/README.md +616 -217
- package/build/GenerateNodes.js +3 -6
- package/build/Nodes.html +3 -1502
- package/build/Nodes.js +5 -15
- package/build/Plugins.html +227 -0
- package/build/Plugins.js +18 -9
- package/build/core/NodeConstructor.d.ts +10 -16
- package/build/core/NodeConstructor.d.ts.map +1 -1
- package/build/core/NodeConstructor.js +112 -156
- package/build/core/NodeGenerator.d.ts.map +1 -1
- package/build/core/NodeGenerator.js +79 -29
- package/build/core/NodeManagerRuntime.d.ts +44 -0
- package/build/core/NodeManagerRuntime.d.ts.map +1 -0
- package/build/core/NodeManagerRuntime.js +140 -0
- package/build/core/Utils.d.ts.map +1 -1
- package/build/core/logger/service/LoggerService.d.ts +6 -5
- package/build/core/logger/service/LoggerService.d.ts.map +1 -1
- package/build/core/logger/service/LoggerService.js +51 -20
- package/build/core/logger/template/LoggerTemplate.d.ts.map +1 -1
- package/build/core/metrics/MetricsDecorator.d.ts +1 -2
- package/build/core/metrics/MetricsDecorator.d.ts.map +1 -1
- package/build/core/metrics/MetricsDecorator.js +89 -116
- package/build/core/metrics/node/CounterMetricConfigNode.d.ts.map +1 -1
- package/build/core/metrics/node/CounterMetricConfigNode.js +4 -5
- package/build/core/metrics/node/GaugeMetricConfigNode.d.ts.map +1 -1
- package/build/core/metrics/node/GaugeMetricConfigNode.js +5 -6
- package/build/core/metrics/node/MetricsConfigNode.d.ts +19 -9
- package/build/core/metrics/node/MetricsConfigNode.d.ts.map +1 -1
- package/build/core/metrics/node/MetricsConfigNode.js +14 -45
- package/build/core/metrics/node/TimerMetricConfigNode.d.ts.map +1 -1
- package/build/core/metrics/node/TimerMetricConfigNode.js +11 -17
- package/build/core/metrics/service/MetricsService.d.ts +110 -114
- package/build/core/metrics/service/MetricsService.d.ts.map +1 -1
- package/build/core/metrics/service/MetricsService.js +122 -339
- package/build/core/metrics/template/CounterMetricTemplate.d.ts.map +1 -1
- package/build/core/metrics/template/GaugeMetricTemplate.d.ts.map +1 -1
- package/build/core/metrics/template/MetricsTemplate.d.ts.map +1 -1
- package/build/core/metrics/template/MetricsTemplate.js +1 -2
- package/build/core/metrics/template/TimerMetricTemplate.d.ts.map +1 -1
- package/build/core/other/node/DelegatedConfigReferenceNode.d.ts +1 -1
- package/build/core/other/node/DelegatedConfigReferenceNode.d.ts.map +1 -1
- package/build/core/other/node/DelegatedConfigReferenceNode.js +1 -1
- package/build/core/other/service/InputService.d.ts.map +1 -1
- package/build/core/other/service/SettingsService.d.ts +1 -2
- package/build/core/other/service/SettingsService.d.ts.map +1 -1
- package/build/core/other/service/SettingsService.js +19 -5
- package/build/core/other/template/BasicTemplate.d.ts.map +1 -1
- package/build/core/other/template/SettingsTemplate.d.ts.map +1 -1
- package/build/core/state/node/InternalStateConfigNode.d.ts +16 -0
- package/build/core/state/node/InternalStateConfigNode.d.ts.map +1 -0
- package/build/core/state/node/InternalStateConfigNode.js +89 -0
- package/build/core/state/node/StateConfigNode.d.ts +24 -0
- package/build/core/state/node/StateConfigNode.d.ts.map +1 -0
- package/build/core/state/node/StateConfigNode.js +22 -0
- package/build/core/state/service/StateService.d.ts +34 -0
- package/build/core/state/service/StateService.d.ts.map +1 -0
- package/build/core/state/service/StateService.js +201 -0
- package/build/core/state/template/StateTemplate.d.ts +8 -0
- package/build/core/state/template/StateTemplate.d.ts.map +1 -0
- package/build/core/state/template/StateTemplate.js +11 -0
- package/build/core/tagging/ServiceDescriptionDecorator.d.ts +10 -0
- package/build/core/tagging/ServiceDescriptionDecorator.d.ts.map +1 -0
- package/build/core/tagging/ServiceDescriptionDecorator.js +10 -0
- package/build/core/tagging/service/NodeTypeService.d.ts +1 -2
- package/build/core/tagging/service/NodeTypeService.d.ts.map +1 -1
- package/build/core/tagging/service/NodeTypeService.js +19 -5
- package/build/core/ui/template/ScriptEditorTemplate.d.ts.map +1 -1
- package/build/core/ui/template/UIHelperTemplate.d.ts.map +1 -1
- package/build/core/webhook/WebhookDecorator.d.ts.map +1 -1
- package/build/core/webhook/WebhookDecorator.js +43 -6
- package/build/core/webhook/node/WebhookServerConfigNode.d.ts.map +1 -1
- package/build/core/webhook/service/ReverseProxyTypeService.d.ts +1 -0
- package/build/core/webhook/service/ReverseProxyTypeService.d.ts.map +1 -1
- package/build/core/webhook/service/WebhookServerService.d.ts +3 -4
- package/build/core/webhook/service/WebhookServerService.d.ts.map +1 -1
- package/build/core/webhook/service/WebhookServerService.js +48 -23
- package/build/core/webhook/template/WebhookTemplate.d.ts.map +1 -1
- package/build/index.d.ts +5 -2
- package/build/index.d.ts.map +1 -1
- package/build/index.js +6 -2
- package/build/runtime/NodeManagerRuntime.js +140 -0
- package/documentation/CounterMetricConfigNode.png +0 -0
- package/documentation/GaugeMetricConfigNode.png +0 -0
- package/documentation/LoggerTemplate.png +0 -0
- package/documentation/MetricsTemplate.png +0 -0
- package/documentation/StateTemplate.png +0 -0
- package/documentation/TimerMetricConfigNode_histogram.png +0 -0
- package/documentation/TimerMetricConfigNode_summary.png +0 -0
- package/documentation/WebhookServerConfigNode.png +0 -0
- package/documentation/WebhookTemplate.png +0 -0
- package/package.json +5 -12
- package/src/GenerateNodes.ts +7 -11
- package/src/core/NodeConstructor.ts +134 -197
- package/src/core/NodeGenerator.ts +88 -34
- package/src/core/NodeManagerRuntime.ts +179 -0
- package/src/core/logger/service/LoggerService.ts +39 -26
- package/src/core/logger/template/LoggerTemplate.html +13 -8
- package/src/core/metrics/MetricsDecorator.ts +140 -168
- package/src/core/metrics/node/CounterMetricConfigNode.ts +20 -20
- package/src/core/metrics/node/GaugeMetricConfigNode.ts +24 -25
- package/src/core/metrics/node/MetricsConfigNode.ts +29 -48
- package/src/core/metrics/node/TimerMetricConfigNode.html +2 -2
- package/src/core/metrics/node/TimerMetricConfigNode.ts +50 -59
- package/src/core/metrics/service/MetricsService.ts +214 -489
- package/src/core/metrics/template/CounterMetricTemplate.html +0 -1
- package/src/core/metrics/template/GaugeMetricTemplate.html +1 -1
- package/src/core/metrics/template/MetricsTemplate.html +132 -13
- package/src/core/metrics/template/MetricsTemplate.ts +3 -4
- package/src/core/other/node/DelegatedConfigReferenceNode.ts +1 -1
- package/src/core/other/service/SettingsService.ts +6 -10
- package/src/core/other/template/BasicTemplate.html +5 -2
- package/src/core/state/node/InternalStateConfigNode.html +77 -0
- package/src/core/state/node/InternalStateConfigNode.ts +102 -0
- package/src/core/state/node/StateConfigNode.ts +29 -0
- package/src/core/state/service/StateService.ts +180 -0
- package/src/core/state/template/StateTemplate.html +244 -0
- package/src/core/state/template/StateTemplate.ts +17 -0
- package/src/core/tagging/ServiceDescriptionDecorator.ts +23 -0
- package/src/core/tagging/service/NodeTypeService.ts +6 -11
- package/src/core/ui/template/UIHelperTemplate.html +41 -26
- package/src/core/webhook/WebhookDecorator.ts +53 -10
- package/src/core/webhook/service/ReverseProxyTypeService.ts +1 -0
- package/src/core/webhook/service/WebhookServerService.ts +39 -28
- package/src/core/webhook/template/WebhookTemplate.html +29 -36
- package/src/index.ts +7 -2
- package/build/core/logger/node/ConsoleLoggerConfigNode.d.ts +0 -20
- package/build/core/logger/node/ConsoleLoggerConfigNode.d.ts.map +0 -1
- package/build/core/logger/node/ConsoleLoggerConfigNode.html +0 -90
- package/build/core/logger/node/ConsoleLoggerConfigNode.js +0 -62
- package/build/core/logger/node/RestLoggerConfigNode.d.ts +0 -40
- package/build/core/logger/node/RestLoggerConfigNode.d.ts.map +0 -1
- package/build/core/logger/node/RestLoggerConfigNode.html +0 -183
- package/build/core/logger/node/RestLoggerConfigNode.js +0 -128
- package/build/core/logger/template/LoggerTemplate.html +0 -331
- package/build/core/metrics/node/CounterMetricConfigNode.html +0 -48
- package/build/core/metrics/node/GaugeMetricConfigNode.html +0 -48
- package/build/core/metrics/node/MetricsConfigNode.html +0 -21
- package/build/core/metrics/node/TimerMetricConfigNode.html +0 -190
- package/build/core/metrics/template/CounterMetricTemplate.html +0 -40
- package/build/core/metrics/template/GaugeMetricTemplate.html +0 -39
- package/build/core/metrics/template/MetricsTemplate.html +0 -54
- package/build/core/metrics/template/TimerMetricTemplate.html +0 -39
- package/build/core/other/node/DelegatedConfigReferenceNode.html +0 -1
- package/build/core/other/template/BasicTemplate.html +0 -76
- package/build/core/other/template/SettingsTemplate.html +0 -128
- package/build/core/ui/template/ScriptEditorTemplate.html +0 -50
- package/build/core/ui/template/UIHelperTemplate.html +0 -229
- package/build/core/webhook/node/WebhookServerConfigNode.html +0 -61
- package/build/core/webhook/template/WebhookTemplate.html +0 -442
- package/documentation/ConsoleLoggerConfigNode.png +0 -0
- package/documentation/MetricsConfigNode.png +0 -0
- package/documentation/RestLoggerConfigNode.png +0 -0
- package/documentation/TimerMetricConfigNode.png +0 -0
- package/documentation/WebhookNode.png +0 -0
- package/src/core/logger/node/ConsoleLoggerConfigNode.html +0 -90
- package/src/core/logger/node/ConsoleLoggerConfigNode.ts +0 -71
- package/src/core/logger/node/RestLoggerConfigNode.html +0 -183
- package/src/core/logger/node/RestLoggerConfigNode.ts +0 -170
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
|
|
2
|
-
import {BaseService, FlowDeployment
|
|
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
|
|
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
|
-
|
|
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 =
|
|
50
|
-
this._app.use(
|
|
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
|
-
|
|
120
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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 => !
|
|
198
|
+
.filter(node => !store[node.id])
|
|
186
199
|
.forEach(node => addedServers.push(node));
|
|
187
200
|
|
|
188
|
-
//
|
|
189
|
-
|
|
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
|
-
|
|
213
|
+
const store = getWebhookServersStore();
|
|
214
|
+
let server = store[config.id];
|
|
194
215
|
if(!server){
|
|
195
|
-
|
|
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:"
|
|
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-
|
|
167
|
-
<div style='width:auto; margin-right:5%; display:inline-
|
|
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
|
-
|
|
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
|
-
|
|
314
|
-
|
|
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
|
|
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
|
|
399
|
-
<
|
|
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
|
|
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
|
|
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"}
|