@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,183 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
<script type="text/javascript" template-section="onCompose">
|
|
3
|
-
node
|
|
4
|
-
.addDefault("name", {value:"Logger Example", required:true})
|
|
5
|
-
.addDefault("template", {value:`message:{{msg}}`, required:true})
|
|
6
|
-
.addDefault("level", {value:"info", required:true})
|
|
7
|
-
|
|
8
|
-
// platform rest:
|
|
9
|
-
.addDefault("rest_url", {})
|
|
10
|
-
.addDefault("rest_ignoresslerror", {})
|
|
11
|
-
.addDefault("rest_auth_type", {})
|
|
12
|
-
.addDefault("rest_auth_basic_username", {})
|
|
13
|
-
.addDefault("rest_auth_basic_password", {})
|
|
14
|
-
.addDefault("rest_auth_apikey_mechanism", {})
|
|
15
|
-
.addDefault("rest_auth_apikey_name", {})
|
|
16
|
-
.addDefault("rest_auth_apikey_value", {})
|
|
17
|
-
|
|
18
|
-
.setPaletteLabel("Rest Logger Config Node")
|
|
19
|
-
.setLabel(function() {return this.name })
|
|
20
|
-
|
|
21
|
-
</script>
|
|
22
|
-
|
|
23
|
-
<script type="text/javascript" template-section="onIncludeEditPrepare">
|
|
24
|
-
{
|
|
25
|
-
let node = this;
|
|
26
|
-
|
|
27
|
-
let showSelectedRestAuthMethod = (value) => {
|
|
28
|
-
$("#LoggerConfig")
|
|
29
|
-
.find(".platform.platform-rest").first()
|
|
30
|
-
.find(".platform-rest-auth")
|
|
31
|
-
.each((i, t) => {
|
|
32
|
-
t = $(t);
|
|
33
|
-
if(t.hasClass(`auth-${value}`)){ t.show(); }
|
|
34
|
-
else { t.hide(); }
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
let levelSelection = $("#node-config-input-level");
|
|
39
|
-
levelSelection.typedInput({type:"level", types:[{
|
|
40
|
-
value: "level",
|
|
41
|
-
options: [
|
|
42
|
-
{ value: "DEBUG", label: "debug"},
|
|
43
|
-
{ value: "INFO", label: "info"},
|
|
44
|
-
{ value: "WARNING", label: "warning"},
|
|
45
|
-
{ value: "ERROR", label: "error"},
|
|
46
|
-
]
|
|
47
|
-
}]});
|
|
48
|
-
|
|
49
|
-
let platformRestAuthType = $("#node-config-input-rest_auth_type");
|
|
50
|
-
platformRestAuthType.typedInput({type:"authtype", types:[{
|
|
51
|
-
value: "authtype",
|
|
52
|
-
options: [
|
|
53
|
-
{ value: "none", label: "None"},
|
|
54
|
-
{ value: "basic", label: "Basic"},
|
|
55
|
-
{ value: "apikey", label: "ApiKey"}
|
|
56
|
-
]
|
|
57
|
-
}]});
|
|
58
|
-
platformRestAuthType.on("change", () => showSelectedRestAuthMethod(platformRestAuthType.val()));
|
|
59
|
-
|
|
60
|
-
let apiKeyMechanism = $("#node-config-input-rest_auth_apikey_mechanism");
|
|
61
|
-
apiKeyMechanism.typedInput({type:"apikeymechansim", types:[{
|
|
62
|
-
value: "apikeymechansim",
|
|
63
|
-
options: [
|
|
64
|
-
{ value: "header", label: "Header"},
|
|
65
|
-
{ value: "queryparam", label: "Query Param"},
|
|
66
|
-
{ value: "matrixparam", label: "Matrix Param"}
|
|
67
|
-
]
|
|
68
|
-
}]});
|
|
69
|
-
|
|
70
|
-
this.editor = RED.editor.createEditor({
|
|
71
|
-
id: 'node-config-input-templateEditor',
|
|
72
|
-
mode: 'ace/mode/handlebars',
|
|
73
|
-
value: this.template
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
</script>
|
|
77
|
-
|
|
78
|
-
<script type="text/javascript" template-section="onIncludeEditSave">
|
|
79
|
-
{
|
|
80
|
-
let node = this;
|
|
81
|
-
this.template = this.editor.getValue();
|
|
82
|
-
this.editor.destroy();
|
|
83
|
-
delete this.editor;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
</script>
|
|
87
|
-
|
|
88
|
-
<script type="text/html" template-section="onIncludeEditForm">
|
|
89
|
-
<div id="LoggerConfig">
|
|
90
|
-
<div class="form-row">
|
|
91
|
-
<label class="towb_editorlabel" for="node-config-input-name"><i class="fa fa-font"></i> Name</label>
|
|
92
|
-
<input type="text" id="node-config-input-name" />
|
|
93
|
-
</div>
|
|
94
|
-
|
|
95
|
-
<div class="form-row">
|
|
96
|
-
<label class="towb_editorlabel" for="node-config-input-level"><i class="fa fa-signal"></i> Level</label>
|
|
97
|
-
<input type="text" id="node-config-input-level" />
|
|
98
|
-
</div>
|
|
99
|
-
|
|
100
|
-
<div class="platform platform-rest">
|
|
101
|
-
<div class="form-row">
|
|
102
|
-
<label class="towb_editorlabel" for="node-config-input-rest_url"><i class="fa fa-link"></i> URL</label>
|
|
103
|
-
<input class="platform-rest-input required" type="text" id="node-config-input-rest_url" />
|
|
104
|
-
</div>
|
|
105
|
-
<div class="form-row">
|
|
106
|
-
<label class="towb_editorlabel"></label>
|
|
107
|
-
<input type="checkbox" id="node-config-input-rest_ignoresslerror" style="width:20px; margin-right:5px;" />
|
|
108
|
-
<label style="width:auto" for="node-config-input-rest_ignoresslerror"><span>Ignore Invalid SSL certificates</span></label>
|
|
109
|
-
</div>
|
|
110
|
-
<div class="form-row">
|
|
111
|
-
<label class="towb_editorlabel" for="node-config-input-rest_auth_type"><i class="fa fa-lock"></i> Authentication</label>
|
|
112
|
-
<input class="platform-rest-input required" type="text" id="node-config-input-rest_auth_type" />
|
|
113
|
-
</div>
|
|
114
|
-
<div class="form-row platform-rest-auth auth-basic">
|
|
115
|
-
<label class="towb_editorlabel" for="node-config-input-rest_auth_basic_username"><i class="fa fa-user"></i> Username</label>
|
|
116
|
-
<input class="platform-rest-input" type="text" id="node-config-input-rest_auth_basic_username" />
|
|
117
|
-
</div>
|
|
118
|
-
<div class="form-row platform-rest-auth auth-basic">
|
|
119
|
-
<label class="towb_editorlabel" for="node-config-input-rest_auth_basic_password"><i class="fa fa-key"></i> Password</label>
|
|
120
|
-
<input class="platform-rest-input" type="password" id="node-config-input-rest_auth_basic_password" />
|
|
121
|
-
</div>
|
|
122
|
-
<div class="form-row platform-rest-auth auth-apikey">
|
|
123
|
-
<label class="towb_editorlabel" for="node-config-input-rest_auth_apikey_mechanism"><i class="fa fa-exchange"></i> Mechanism</label>
|
|
124
|
-
<input class="platform-rest-input" type="text" id="node-config-input-rest_auth_apikey_mechanism" />
|
|
125
|
-
</div>
|
|
126
|
-
<div class="form-row platform-rest-auth auth-apikey">
|
|
127
|
-
<label class="towb_editorlabel" for="node-config-input-rest_auth_apikey_name"><i class="fa fa-id-badge"></i> APIKey name</label>
|
|
128
|
-
<input class="platform-rest-input" type="text" id="node-config-input-rest_auth_apikey_name" />
|
|
129
|
-
</div>
|
|
130
|
-
<div class="form-row platform-rest-auth auth-apikey">
|
|
131
|
-
<label class="towb_editorlabel" for="node-config-input-rest_auth_apikey_value"><i class="fa fa-lock"></i> APIKey value</label>
|
|
132
|
-
<input class="platform-rest-input" type="text" id="node-config-input-rest_auth_apikey_value" />
|
|
133
|
-
</div>
|
|
134
|
-
</div>
|
|
135
|
-
|
|
136
|
-
<div class="form-row">
|
|
137
|
-
<label class="towb_editorlabel" for="node-config-input-templateEditor"><i class="fa fa-code"></i> Template</label>
|
|
138
|
-
<div style="height: 250px; min-height:150px;" class="node-text-editor" id="node-config-input-templateEditor"></div>
|
|
139
|
-
</div>
|
|
140
|
-
</div>
|
|
141
|
-
</script>
|
|
142
|
-
|
|
143
|
-
<script type="text/markdown" template-section="onIncludeDocumentation">
|
|
144
|
-
Posts log messages to an HTTP or HTTPS endpoint as a JSON payload.
|
|
145
|
-
|
|
146
|
-
### Properties
|
|
147
|
-
: *name* (string) : A descriptive name for this logger configuration.
|
|
148
|
-
: *level* (level) : The minimum log level. Messages below this threshold are suppressed. Options: DEBUG, INFO, WARNING, ERROR.
|
|
149
|
-
: *url* (url) : The endpoint that log messages will be POSTed to.
|
|
150
|
-
: *ignore SSL errors* (boolean) : When enabled, invalid SSL certificates are accepted.
|
|
151
|
-
: *authentication* (select) : The authentication strategy applied to each request. Options: None, Basic, ApiKey.
|
|
152
|
-
: *template* (mustache) : A Mustache/Handlebars template that formats the log message body.
|
|
153
|
-
|
|
154
|
-
### Authentication
|
|
155
|
-
#### Basic
|
|
156
|
-
Authenticates using the HTTP `Authorization` header (RFC 7617).
|
|
157
|
-
: *username* (string) : The username credential.
|
|
158
|
-
: *password* (string) : The password credential.
|
|
159
|
-
|
|
160
|
-
#### ApiKey
|
|
161
|
-
Authenticates by injecting a key/value pair into the request.
|
|
162
|
-
: *mechanism* (select) : Where the key is injected — Header, Query Param, or Matrix Param.
|
|
163
|
-
: *APIKey name* (string) : The name of the key (e.g. `x-api-key`).
|
|
164
|
-
: *APIKey value* (string) : The value of the key.
|
|
165
|
-
|
|
166
|
-
### Mustache Templating
|
|
167
|
-
Mustache/Handlebars templates build the message string POSTed to the endpoint.
|
|
168
|
-
|
|
169
|
-
#### Provided Properties
|
|
170
|
-
: *msg* (object) : The Node-RED message object passed through the node.
|
|
171
|
-
: *currentTime* (string) : The current time in ISO 8601 format.
|
|
172
|
-
|
|
173
|
-
#### Helpers
|
|
174
|
-
: *json* (helper) : Serialises an object to a JSON string using `JSON.stringify`.
|
|
175
|
-
|
|
176
|
-
#### Examples
|
|
177
|
-
- `{{{json msg}}}` — serialises the full message object as JSON.
|
|
178
|
-
|
|
179
|
-
#### References
|
|
180
|
-
- [Mustache — Wikipedia](https://en.wikipedia.org/wiki/Mustache_(template_system))
|
|
181
|
-
- [Mustache — Playground](https://jgonggrijp.gitlab.io/wontache/playground.html)
|
|
182
|
-
</script>
|
|
183
|
-
|
|
@@ -1,128 +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.RestLoggerConfigNode = void 0;
|
|
13
|
-
const LoggerService_1 = require("../service/LoggerService");
|
|
14
|
-
const NodeGenerator_1 = require("../../NodeGenerator");
|
|
15
|
-
const LoggerService_2 = require("../service/LoggerService");
|
|
16
|
-
const NodeDescriptionDecorator_1 = require("../../tagging/NodeDescriptionDecorator");
|
|
17
|
-
const whatwg_url_1 = require("whatwg-url");
|
|
18
|
-
const winston_1 = require("winston");
|
|
19
|
-
let RestLoggerConfigNode = class RestLoggerConfigNode extends LoggerService_1.LoggerConfigNode {
|
|
20
|
-
constructor(node, config) {
|
|
21
|
-
super(node, config);
|
|
22
|
-
let _this = this;
|
|
23
|
-
// instantiate the logger.
|
|
24
|
-
let loggerConfig = {
|
|
25
|
-
id: this.id(),
|
|
26
|
-
type: "REST",
|
|
27
|
-
level: config.level,
|
|
28
|
-
template: config.template,
|
|
29
|
-
// additional properties.
|
|
30
|
-
url: config.rest_url,
|
|
31
|
-
ignoresslerror: config.rest_ignoresslerror,
|
|
32
|
-
auth_type: config.rest_auth_type,
|
|
33
|
-
auth_basic_username: config.rest_auth_basic_username,
|
|
34
|
-
auth_basic_password: config.rest_auth_basic_password,
|
|
35
|
-
auth_apikey_mechanism: config.rest_auth_apikey_mechanism,
|
|
36
|
-
auth_apikey_name: config.rest_auth_apikey_name,
|
|
37
|
-
auth_apikey_value: config.rest_auth_apikey_value,
|
|
38
|
-
};
|
|
39
|
-
this._logger = new RestLogger(loggerConfig);
|
|
40
|
-
}
|
|
41
|
-
logger() {
|
|
42
|
-
return this._logger;
|
|
43
|
-
}
|
|
44
|
-
};
|
|
45
|
-
exports.RestLoggerConfigNode = RestLoggerConfigNode;
|
|
46
|
-
exports.RestLoggerConfigNode = RestLoggerConfigNode = __decorate([
|
|
47
|
-
(0, NodeDescriptionDecorator_1.NodeDescription)({
|
|
48
|
-
id: "RestLoggerConfigNode",
|
|
49
|
-
name: "Rest Endpoint Logger",
|
|
50
|
-
group: "config",
|
|
51
|
-
sourceFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "RestLoggerConfigNode.html",
|
|
52
|
-
package: "@theotherwillembotha/node-red-plugincore",
|
|
53
|
-
dependencies: [LoggerService_1.LoggerService],
|
|
54
|
-
tags: ["LoggerType"]
|
|
55
|
-
}),
|
|
56
|
-
__metadata("design:paramtypes", [Object, Object])
|
|
57
|
-
], RestLoggerConfigNode);
|
|
58
|
-
class RestLogger extends LoggerService_1.AbstractLogger {
|
|
59
|
-
constructor(config) {
|
|
60
|
-
super(config);
|
|
61
|
-
// get the url.
|
|
62
|
-
let hosturl = (0, whatwg_url_1.parseURL)(config.url);
|
|
63
|
-
if (!hosturl) {
|
|
64
|
-
throw Error("could not parse url: " + config.url);
|
|
65
|
-
}
|
|
66
|
-
// get the options
|
|
67
|
-
let httpOptions = {};
|
|
68
|
-
// get the params.
|
|
69
|
-
let httpParams = {
|
|
70
|
-
host: hosturl.host?.toString(),
|
|
71
|
-
path: "/" + (hosturl.path ? [...hosturl.path].join("/") : "") + (hosturl.query ? ("?" + hosturl.query) : ""),
|
|
72
|
-
port: (hosturl.port) ? hosturl.port : undefined,
|
|
73
|
-
ssl: hosturl.scheme.toLowerCase() === "https",
|
|
74
|
-
headers: {},
|
|
75
|
-
};
|
|
76
|
-
httpParams.options = httpOptions;
|
|
77
|
-
// add the ignore ssl error flag if need be.
|
|
78
|
-
if (config.ignoresslerror) {
|
|
79
|
-
httpOptions.rejectUnauthorized = false;
|
|
80
|
-
}
|
|
81
|
-
// configure "none" authentication.
|
|
82
|
-
if (config.auth_type === LoggerService_2.RestAuthType.none) { }
|
|
83
|
-
// configure "basic" authentication.
|
|
84
|
-
if (config.auth_type === LoggerService_2.RestAuthType.basic) {
|
|
85
|
-
httpParams.auth = {
|
|
86
|
-
username: config.auth_basic_username,
|
|
87
|
-
password: config.auth_basic_password
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
// configure "apikey" authentication.
|
|
91
|
-
if (config.auth_type === LoggerService_2.RestAuthType.apikey) {
|
|
92
|
-
if (config.auth_apikey_mechanism === LoggerService_2.ApiKeyMechanismType.header) {
|
|
93
|
-
httpParams.headers[config.auth_apikey_name] = config.auth_apikey_value;
|
|
94
|
-
}
|
|
95
|
-
if (config.auth_apikey_mechanism === LoggerService_2.ApiKeyMechanismType.matrixparam) {
|
|
96
|
-
httpParams.path = httpParams.path?.replace(`:${config.auth_apikey_name}`, config.auth_apikey_value);
|
|
97
|
-
}
|
|
98
|
-
if (config.auth_apikey_mechanism === LoggerService_2.ApiKeyMechanismType.queryparam) {
|
|
99
|
-
httpParams.path = httpParams.path + (httpParams.path?.includes("?") ? "&" : "?") + config.auth_apikey_name + "=" + config.auth_apikey_value;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
;
|
|
103
|
-
this.winston = (0, winston_1.createLogger)({
|
|
104
|
-
level: config.level.toString().toLowerCase(),
|
|
105
|
-
format: winston_1.format.json(),
|
|
106
|
-
defaultMeta: {},
|
|
107
|
-
transports: [
|
|
108
|
-
new winston_1.transports.Http(httpParams),
|
|
109
|
-
],
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
createLogger(config) {
|
|
113
|
-
return new RestAppender(config, this.winston);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
class RestAppender extends LoggerService_1.Log {
|
|
117
|
-
constructor(config, winston) {
|
|
118
|
-
super(config);
|
|
119
|
-
this.winston = winston;
|
|
120
|
-
}
|
|
121
|
-
writeToLog(level, message, tags) {
|
|
122
|
-
this.winston.log({
|
|
123
|
-
level: level,
|
|
124
|
-
message: message,
|
|
125
|
-
labels: tags
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
}
|
|
@@ -1,331 +0,0 @@
|
|
|
1
|
-
<div template-section="onIncludeOnce">
|
|
2
|
-
<style>
|
|
3
|
-
.editorgroupborder {
|
|
4
|
-
border-width:1px;
|
|
5
|
-
border-style:solid;
|
|
6
|
-
border-color:lightgray;
|
|
7
|
-
padding: 3px;
|
|
8
|
-
margin-top: 2px;
|
|
9
|
-
margin-bottom: 2px;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
.editorsectionheading {
|
|
13
|
-
font-weight: 600;
|
|
14
|
-
margin-bottom:1px !important;
|
|
15
|
-
margin-top:6px !important;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
.nomargin {
|
|
19
|
-
margin-bottom:1px !important;
|
|
20
|
-
margin-top:1px !important;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
.slidecontainer {
|
|
24
|
-
width: 100%;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
.slider {
|
|
28
|
-
-webkit-appearance: none;
|
|
29
|
-
appearance: none;
|
|
30
|
-
width: 100%;
|
|
31
|
-
height: 25px;
|
|
32
|
-
background: #d3d3d3;
|
|
33
|
-
outline: none;
|
|
34
|
-
opacity: 0.7;
|
|
35
|
-
-webkit-transition: .2s;
|
|
36
|
-
transition: opacity .2s;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
.slider:hover {
|
|
40
|
-
opacity: 1;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
.slider::-webkit-slider-thumb {
|
|
44
|
-
-webkit-appearance: none;
|
|
45
|
-
appearance: none;
|
|
46
|
-
width: 25px;
|
|
47
|
-
height: 25px;
|
|
48
|
-
background: #04AA6D;
|
|
49
|
-
cursor: pointer;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
.slider::-moz-range-thumb {
|
|
53
|
-
width: 25px;
|
|
54
|
-
height: 25px;
|
|
55
|
-
background: #04AA6D;
|
|
56
|
-
cursor: pointer;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
.towb_editorlabel {
|
|
60
|
-
width: 120px !important;
|
|
61
|
-
}
|
|
62
|
-
.towb_editorfield {
|
|
63
|
-
width: 70% !important;
|
|
64
|
-
}
|
|
65
|
-
.towb_editorfield_short {
|
|
66
|
-
width: 30% !important;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
</style>
|
|
70
|
-
|
|
71
|
-
<script type="text/javascript">
|
|
72
|
-
|
|
73
|
-
// CSS
|
|
74
|
-
dropdownStyles = `
|
|
75
|
-
.loggertype-dropdown {
|
|
76
|
-
position: absolute;
|
|
77
|
-
background: white;
|
|
78
|
-
border: 1px solid #ccc;
|
|
79
|
-
border-radius: 4px;
|
|
80
|
-
box-shadow: 0 2px 8px rgba(0,0,0,0.15);
|
|
81
|
-
max-height: 150px;
|
|
82
|
-
overflow-y: auto;
|
|
83
|
-
z-index: 1000;
|
|
84
|
-
min-width: 150px;
|
|
85
|
-
}
|
|
86
|
-
.loggertype-dropdown .dropdown-item {
|
|
87
|
-
padding: 6px 12px;
|
|
88
|
-
cursor: pointer;
|
|
89
|
-
}
|
|
90
|
-
.loggertype-dropdown .dropdown-item:hover {
|
|
91
|
-
background: #f0f0f0;
|
|
92
|
-
}
|
|
93
|
-
`;
|
|
94
|
-
$('<style>').text(dropdownStyles).appendTo('head');
|
|
95
|
-
|
|
96
|
-
</script>
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
</div>
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
<script type="text/javascript" template-section="onCompose">
|
|
103
|
-
node
|
|
104
|
-
.addDefault("logEnabled", { value:false, required:true})
|
|
105
|
-
.addDefault("logger", { required:false, value:'', type:"DelegatedConfigReferenceNode"})
|
|
106
|
-
.addDefault("logTemplateOverrideEnabled", {value:false})
|
|
107
|
-
.addDefault("logTemplateOverride", {value:"message:{{msg}}"})
|
|
108
|
-
</script>
|
|
109
|
-
|
|
110
|
-
<script type="text/javascript" template-section="onIncludeEditPrepare">
|
|
111
|
-
let node = this;
|
|
112
|
-
|
|
113
|
-
// controls.
|
|
114
|
-
let logEnabled = $("#{{defaults.logEnabled}}");
|
|
115
|
-
let logTemplateEnabled = $("#{{defaults.logTemplateOverrideEnabled}}");
|
|
116
|
-
let logTemplateEnabledSection = $("#section_logTemplateOverrideEnabled");
|
|
117
|
-
let logEnabledSection = $("#section_logEnabled");
|
|
118
|
-
|
|
119
|
-
// functions.
|
|
120
|
-
let getLoggerTypes = async function(){
|
|
121
|
-
let types = [];
|
|
122
|
-
await $.ajax({
|
|
123
|
-
url: "nodetypeservice/find?tag=LoggerType",
|
|
124
|
-
type: "GET",
|
|
125
|
-
contentType: "application/json; charset=utf-8",
|
|
126
|
-
data:JSON.stringify({id:node.id}),
|
|
127
|
-
success: (response) => {
|
|
128
|
-
types = response;
|
|
129
|
-
},
|
|
130
|
-
error: (jqXHR, textStatus, errorThrown) => {
|
|
131
|
-
console.log(jqXHR, textStatus, errorThrown);
|
|
132
|
-
},
|
|
133
|
-
});
|
|
134
|
-
return types;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
let getLoggers = async () => {
|
|
138
|
-
let loggers = [];
|
|
139
|
-
|
|
140
|
-
// get the list of types again.
|
|
141
|
-
let loggerTypes = (await getLoggerTypes()).map(type => type.id);
|
|
142
|
-
|
|
143
|
-
// add all of the known loggers.
|
|
144
|
-
RED.nodes.eachConfig(cfg => {
|
|
145
|
-
if(loggerTypes.includes(cfg.type)){
|
|
146
|
-
loggers.push({id:cfg.id, name:cfg.label(), type:cfg.type});
|
|
147
|
-
}
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
return loggers;
|
|
151
|
-
};
|
|
152
|
-
|
|
153
|
-
let updateLoggerSelectorList = async () => {
|
|
154
|
-
loggerSelector.empty();
|
|
155
|
-
(await getLoggers()).forEach(logger => {
|
|
156
|
-
$('<option value="' + logger.id + '">' + logger.name + '</option>').appendTo(loggerSelector);
|
|
157
|
-
});
|
|
158
|
-
$('<option value="_ADD_">none</option>').appendTo(loggerSelector);
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
logEnabled.on('change', function() {
|
|
162
|
-
if(logEnabled.prop("checked")){
|
|
163
|
-
logEnabledSection.show();
|
|
164
|
-
node._def.defaults.logger.required = true;
|
|
165
|
-
}
|
|
166
|
-
else{
|
|
167
|
-
logEnabledSection.hide()
|
|
168
|
-
node._def.defaults.logger.required = false;
|
|
169
|
-
}
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
logTemplateEnabled.on('change', function() {
|
|
173
|
-
if(logTemplateEnabled.prop("checked")){
|
|
174
|
-
logTemplateEnabledSection.show();
|
|
175
|
-
node._def.defaults.logTemplateOverride.required = true;
|
|
176
|
-
}
|
|
177
|
-
else{
|
|
178
|
-
logTemplateEnabledSection.hide()
|
|
179
|
-
node._def.defaults.logTemplateOverride.required = false;
|
|
180
|
-
}
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
node.logTemplateOverrideEditor = RED.editor.createEditor({
|
|
184
|
-
id: 'node-input-logTemplateOverrideEditor',
|
|
185
|
-
mode: 'ace/mode/handlebars',
|
|
186
|
-
value: node.logTemplateOverride
|
|
187
|
-
});
|
|
188
|
-
|
|
189
|
-
let loggerSelector = $("#logger-selector");
|
|
190
|
-
let loggerEditButton = $("#logger-edit-btn");
|
|
191
|
-
let loggerAddButton = $("#logger-add-btn");
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
loggerEditButton.on('click', async function(event){
|
|
195
|
-
event.stopPropagation();
|
|
196
|
-
if(loggerEditButton.hasClass("disabled")){
|
|
197
|
-
return;
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
// figure out what type of logger this is.
|
|
201
|
-
let selectedLogger = (await getLoggers()).find(logger => logger.id === loggerSelector.val());
|
|
202
|
-
RED.editor.editConfig("#logger-selector", selectedLogger.type, selectedLogger.id);
|
|
203
|
-
});
|
|
204
|
-
|
|
205
|
-
loggerAddButton.on('click', function(event) {
|
|
206
|
-
event.stopPropagation();
|
|
207
|
-
let $btn = $(event.target);
|
|
208
|
-
|
|
209
|
-
// Remove any existing dropdown
|
|
210
|
-
$('.loggertype-dropdown').remove();
|
|
211
|
-
|
|
212
|
-
getLoggerTypes().then(loggerTypes => {
|
|
213
|
-
let $dropdown = $('<div class="loggertype-dropdown red-ui-editor"></div>');
|
|
214
|
-
|
|
215
|
-
loggerTypes.forEach(loggerType => {
|
|
216
|
-
$('<div class="dropdown-item"></div>')
|
|
217
|
-
.text(loggerType.name)
|
|
218
|
-
.data('value', loggerType.id)
|
|
219
|
-
.css({
|
|
220
|
-
padding: '4px 8px',
|
|
221
|
-
cursor: 'pointer'
|
|
222
|
-
})
|
|
223
|
-
.appendTo($dropdown);
|
|
224
|
-
});
|
|
225
|
-
|
|
226
|
-
// Append first so outerWidth() is measurable, then position so the
|
|
227
|
-
// right edge of the dropdown aligns with the right edge of the button.
|
|
228
|
-
$('body').append($dropdown);
|
|
229
|
-
$dropdown.css({
|
|
230
|
-
top: $btn.offset().top + $btn.outerHeight(),
|
|
231
|
-
left: $btn.offset().left + $btn.outerWidth() - $dropdown.outerWidth()
|
|
232
|
-
});
|
|
233
|
-
|
|
234
|
-
$(document).on('mousedown.dropdown', function(e) {
|
|
235
|
-
if (!$(e.target).closest('.loggertype-dropdown').length) {
|
|
236
|
-
$dropdown.remove();
|
|
237
|
-
$(document).off('mousedown.dropdown'); // Clean up the listener
|
|
238
|
-
}
|
|
239
|
-
});
|
|
240
|
-
|
|
241
|
-
// Handle item selection
|
|
242
|
-
$dropdown.on('click', '.dropdown-item', function(e) {
|
|
243
|
-
e.stopPropagation();
|
|
244
|
-
const selectedValue = $(this).data('value');
|
|
245
|
-
const selectedText = $(this).text();
|
|
246
|
-
|
|
247
|
-
// Do whatever you need with the selection
|
|
248
|
-
console.log('Selected:', selectedValue, selectedText);
|
|
249
|
-
$dropdown.remove();
|
|
250
|
-
RED.editor.editConfig("#logger-selector", selectedValue, "_ADD_");
|
|
251
|
-
});
|
|
252
|
-
})
|
|
253
|
-
});
|
|
254
|
-
|
|
255
|
-
loggerSelector.on("focus", updateLoggerSelectorList);
|
|
256
|
-
loggerSelector.on('change', function(event) {
|
|
257
|
-
if("_ADD_" === loggerSelector.val()){
|
|
258
|
-
loggerEditButton.addClass("disabled")
|
|
259
|
-
}
|
|
260
|
-
else{
|
|
261
|
-
loggerEditButton.removeClass("disabled")
|
|
262
|
-
}
|
|
263
|
-
});
|
|
264
|
-
|
|
265
|
-
// lastly, make sure that we set the correct value on the logger selector.
|
|
266
|
-
updateLoggerSelectorList().then(() => {
|
|
267
|
-
loggerSelector.val(node.logger);
|
|
268
|
-
loggerSelector.trigger('change');
|
|
269
|
-
});
|
|
270
|
-
|
|
271
|
-
</script>
|
|
272
|
-
|
|
273
|
-
<script type="text/javascript" template-section="onIncludeEditSave">
|
|
274
|
-
node = this;
|
|
275
|
-
var selectedLogger = $("#logger-selector").val();
|
|
276
|
-
node.logger = (selectedLogger && selectedLogger !== "_ADD_") ? selectedLogger : '';
|
|
277
|
-
node.logTemplateOverride = node.logTemplateOverrideEditor.getValue();
|
|
278
|
-
node.logTemplateOverrideEditor.destroy();
|
|
279
|
-
delete node.logTemplateOverrideEditor;
|
|
280
|
-
</script>
|
|
281
|
-
|
|
282
|
-
<script type="text/html" template-section="onIncludeEditForm">
|
|
283
|
-
<div id="section_loggerconfig" >
|
|
284
|
-
<div class="form-row editorsectionheading">
|
|
285
|
-
<i class="w-16 fa fa-eye"></i> <span>Logging</span>
|
|
286
|
-
</div>
|
|
287
|
-
<div class="editorgroupborder">
|
|
288
|
-
<div class="form-row nomargin logEnableCheck">
|
|
289
|
-
<input type="checkbox" id="{{defaults.logEnabled}}" placeholder="logEnabled" value="false" style="margin:8px 0 10px 102px; width:20px;">
|
|
290
|
-
<label style="width:auto" for="{{defaults.logEnabled}}"><span>Enable Logging</span></label>
|
|
291
|
-
</div>
|
|
292
|
-
|
|
293
|
-
<div id="section_logEnabled">
|
|
294
|
-
<div class="form-row nomargin">
|
|
295
|
-
<label for="logger-selector">Logger</label>
|
|
296
|
-
<div style="width: 70%; display: inline-flex;">
|
|
297
|
-
<select id="logger-selector" style="flex-grow: 1;" class="">
|
|
298
|
-
<option value="_ADD_">none</option>
|
|
299
|
-
</select>
|
|
300
|
-
<a id="logger-edit-btn" class="red-ui-button disabled" style="margin-left: 10px;">
|
|
301
|
-
<i class="fa fa-pencil"></i>
|
|
302
|
-
</a>
|
|
303
|
-
<a id="logger-add-btn" class="red-ui-button" style="margin-left: 10px;">
|
|
304
|
-
<i class="fa fa-plus"></i>
|
|
305
|
-
</a>
|
|
306
|
-
</div>
|
|
307
|
-
</div>
|
|
308
|
-
|
|
309
|
-
<div class="form-row nomargin">
|
|
310
|
-
<input type="checkbox" id="{{defaults.logTemplateOverrideEnabled}}" placeholder="" value="false" style="margin:8px 0 10px 102px; width:20px;">
|
|
311
|
-
<label style="width:auto" for="{{defaults.logTemplateOverrideEnabled}}"><span>Override Template</span></label>
|
|
312
|
-
</div>
|
|
313
|
-
|
|
314
|
-
<div id="section_logTemplateOverrideEnabled">
|
|
315
|
-
<div class="form-row">
|
|
316
|
-
<label class="towb_editorlabel" for="node-input-logTemplateOverrideEditor"><i class="fa fa-code"></i> Template</label>
|
|
317
|
-
<div style="height: 250px; min-height:150px;" class="node-text-editor" id="node-input-logTemplateOverrideEditor"></div>
|
|
318
|
-
</div>
|
|
319
|
-
</div>
|
|
320
|
-
</div>
|
|
321
|
-
</div>
|
|
322
|
-
</div>
|
|
323
|
-
</script>
|
|
324
|
-
|
|
325
|
-
<script type="text/markdown" template-section="onIncludeDocumentation">
|
|
326
|
-
### Logging
|
|
327
|
-
: *enable logging* (boolean) : if checked, then the node will produce logging output to the specified logger.
|
|
328
|
-
: *logger* (logconfig) : the endppoint that the node will log events to.
|
|
329
|
-
: *override template* (logconfig) : if checked, a custom logging template can be provided for the log message.
|
|
330
|
-
: *logger template* (mustache) : a template in mustache format to generate a message for logging purposes (see LoggerConfig node for more information)
|
|
331
|
-
</script>
|