@theotherwillembotha/node-red-plugincore 0.0.50
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/LICENSE +15 -0
- package/README.md +190 -0
- package/build/GenerateNodes.d.ts +2 -0
- package/build/GenerateNodes.d.ts.map +1 -0
- package/build/GenerateNodes.js +36 -0
- package/build/Nodes.html +1729 -0
- package/build/Nodes.js +32 -0
- package/build/Plugins.js +74 -0
- package/build/core/NodeConstructor.d.ts +188 -0
- package/build/core/NodeConstructor.d.ts.map +1 -0
- package/build/core/NodeConstructor.js +679 -0
- package/build/core/NodeGenerator.d.ts +37 -0
- package/build/core/NodeGenerator.d.ts.map +1 -0
- package/build/core/NodeGenerator.js +300 -0
- package/build/core/Utils.d.ts +7 -0
- package/build/core/Utils.d.ts.map +1 -0
- package/build/core/Utils.js +19 -0
- package/build/core/logger/LoggerDecorator.d.ts +2 -0
- package/build/core/logger/LoggerDecorator.d.ts.map +1 -0
- package/build/core/logger/LoggerDecorator.js +93 -0
- package/build/core/logger/node/ConsoleLoggerConfigNode.d.ts +16 -0
- package/build/core/logger/node/ConsoleLoggerConfigNode.d.ts.map +1 -0
- package/build/core/logger/node/ConsoleLoggerConfigNode.html +131 -0
- package/build/core/logger/node/ConsoleLoggerConfigNode.js +47 -0
- package/build/core/logger/node/LoggerConfigNode.d.ts +30 -0
- package/build/core/logger/node/LoggerConfigNode.d.ts.map +1 -0
- package/build/core/logger/node/LoggerConfigNode.html +307 -0
- package/build/core/logger/node/LoggerConfigNode.js +60 -0
- package/build/core/logger/node/LokiLoggerConfigNode.d.ts +20 -0
- package/build/core/logger/node/LokiLoggerConfigNode.d.ts.map +1 -0
- package/build/core/logger/node/LokiLoggerConfigNode.html +153 -0
- package/build/core/logger/node/LokiLoggerConfigNode.js +52 -0
- package/build/core/logger/node/RestLoggerConfigNode.d.ts +24 -0
- package/build/core/logger/node/RestLoggerConfigNode.d.ts.map +1 -0
- package/build/core/logger/node/RestLoggerConfigNode.html +209 -0
- package/build/core/logger/node/RestLoggerConfigNode.js +57 -0
- package/build/core/logger/service/LoggerService.d.ts +88 -0
- package/build/core/logger/service/LoggerService.d.ts.map +1 -0
- package/build/core/logger/service/LoggerService.js +204 -0
- package/build/core/logger/service/LoggerServiceTypes.d.ts +24 -0
- package/build/core/logger/service/LoggerServiceTypes.d.ts.map +1 -0
- package/build/core/logger/service/LoggerServiceTypes.js +30 -0
- package/build/core/logger/template/LoggerTemplate.d.ts +11 -0
- package/build/core/logger/template/LoggerTemplate.d.ts.map +1 -0
- package/build/core/logger/template/LoggerTemplate.html +328 -0
- package/build/core/logger/template/LoggerTemplate.js +12 -0
- package/build/core/metrics/MetricsDecorator.d.ts +40 -0
- package/build/core/metrics/MetricsDecorator.d.ts.map +1 -0
- package/build/core/metrics/MetricsDecorator.js +166 -0
- package/build/core/metrics/node/CounterMetricConfigNode.d.ts +16 -0
- package/build/core/metrics/node/CounterMetricConfigNode.d.ts.map +1 -0
- package/build/core/metrics/node/CounterMetricConfigNode.html +48 -0
- package/build/core/metrics/node/CounterMetricConfigNode.js +61 -0
- package/build/core/metrics/node/GaugeMetricConfigNode.d.ts +17 -0
- package/build/core/metrics/node/GaugeMetricConfigNode.d.ts.map +1 -0
- package/build/core/metrics/node/GaugeMetricConfigNode.html +48 -0
- package/build/core/metrics/node/GaugeMetricConfigNode.js +61 -0
- package/build/core/metrics/node/MetricsConfigNode.d.ts +14 -0
- package/build/core/metrics/node/MetricsConfigNode.d.ts.map +1 -0
- package/build/core/metrics/node/MetricsConfigNode.html +21 -0
- package/build/core/metrics/node/MetricsConfigNode.js +56 -0
- package/build/core/metrics/node/TimerMetricConfigNode.d.ts +28 -0
- package/build/core/metrics/node/TimerMetricConfigNode.d.ts.map +1 -0
- package/build/core/metrics/node/TimerMetricConfigNode.html +190 -0
- package/build/core/metrics/node/TimerMetricConfigNode.js +101 -0
- package/build/core/metrics/service/MetricsService.d.ts +187 -0
- package/build/core/metrics/service/MetricsService.d.ts.map +1 -0
- package/build/core/metrics/service/MetricsService.js +385 -0
- package/build/core/metrics/template/CounterMetricTemplate.d.ts +5 -0
- package/build/core/metrics/template/CounterMetricTemplate.d.ts.map +1 -0
- package/build/core/metrics/template/CounterMetricTemplate.html +40 -0
- package/build/core/metrics/template/CounterMetricTemplate.js +12 -0
- package/build/core/metrics/template/GaugeMetricTemplate.d.ts +5 -0
- package/build/core/metrics/template/GaugeMetricTemplate.d.ts.map +1 -0
- package/build/core/metrics/template/GaugeMetricTemplate.html +39 -0
- package/build/core/metrics/template/GaugeMetricTemplate.js +12 -0
- package/build/core/metrics/template/MetricsTemplate.d.ts +8 -0
- package/build/core/metrics/template/MetricsTemplate.d.ts.map +1 -0
- package/build/core/metrics/template/MetricsTemplate.html +54 -0
- package/build/core/metrics/template/MetricsTemplate.js +12 -0
- package/build/core/metrics/template/TimerMetricTemplate.d.ts +5 -0
- package/build/core/metrics/template/TimerMetricTemplate.d.ts.map +1 -0
- package/build/core/metrics/template/TimerMetricTemplate.html +39 -0
- package/build/core/metrics/template/TimerMetricTemplate.js +12 -0
- package/build/core/other/InputDecorator.d.ts +3 -0
- package/build/core/other/InputDecorator.d.ts.map +1 -0
- package/build/core/other/InputDecorator.js +43 -0
- package/build/core/other/service/InputService.d.ts +16 -0
- package/build/core/other/service/InputService.d.ts.map +1 -0
- package/build/core/other/service/InputService.js +31 -0
- package/build/core/other/service/SettingsService.d.ts +25 -0
- package/build/core/other/service/SettingsService.d.ts.map +1 -0
- package/build/core/other/service/SettingsService.js +74 -0
- package/build/core/other/template/BasicTemplate.d.ts +5 -0
- package/build/core/other/template/BasicTemplate.d.ts.map +1 -0
- package/build/core/other/template/BasicTemplate.html +76 -0
- package/build/core/other/template/BasicTemplate.js +11 -0
- package/build/core/other/template/SettingsTemplate.d.ts +5 -0
- package/build/core/other/template/SettingsTemplate.d.ts.map +1 -0
- package/build/core/other/template/SettingsTemplate.html +128 -0
- package/build/core/other/template/SettingsTemplate.js +11 -0
- package/build/core/tagging/NodeDescriptionDecorator.d.ts +17 -0
- package/build/core/tagging/NodeDescriptionDecorator.d.ts.map +1 -0
- package/build/core/tagging/NodeDescriptionDecorator.js +25 -0
- package/build/core/tagging/service/NodeTypeService.d.ts +15 -0
- package/build/core/tagging/service/NodeTypeService.d.ts.map +1 -0
- package/build/core/tagging/service/NodeTypeService.js +47 -0
- package/build/core/webhook/WebhookDecorator.d.ts +3 -0
- package/build/core/webhook/WebhookDecorator.d.ts.map +1 -0
- package/build/core/webhook/WebhookDecorator.js +45 -0
- package/build/core/webhook/node/WebhookServerConfigNode.d.ts +16 -0
- package/build/core/webhook/node/WebhookServerConfigNode.d.ts.map +1 -0
- package/build/core/webhook/node/WebhookServerConfigNode.html +61 -0
- package/build/core/webhook/node/WebhookServerConfigNode.js +40 -0
- package/build/core/webhook/service/ReverseProxyTypeService.d.ts +29 -0
- package/build/core/webhook/service/ReverseProxyTypeService.d.ts.map +1 -0
- package/build/core/webhook/service/ReverseProxyTypeService.js +24 -0
- package/build/core/webhook/service/WebhookServerService.d.ts +52 -0
- package/build/core/webhook/service/WebhookServerService.d.ts.map +1 -0
- package/build/core/webhook/service/WebhookServerService.js +146 -0
- package/build/core/webhook/template/WebhookTemplate.d.ts +22 -0
- package/build/core/webhook/template/WebhookTemplate.d.ts.map +1 -0
- package/build/core/webhook/template/WebhookTemplate.html +434 -0
- package/build/core/webhook/template/WebhookTemplate.js +12 -0
- package/build/index.d.ts +33 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +55 -0
- package/package.json +67 -0
- package/src/GenerateNodes.ts +42 -0
- package/src/core/NodeConstructor.ts +889 -0
- package/src/core/NodeGenerator.ts +331 -0
- package/src/core/Utils.ts +19 -0
- package/src/core/logger/LoggerDecorator.ts +105 -0
- package/src/core/logger/node/ConsoleLoggerConfigNode.html +131 -0
- package/src/core/logger/node/ConsoleLoggerConfigNode.ts +46 -0
- package/src/core/logger/node/LoggerConfigNode.html +307 -0
- package/src/core/logger/node/LoggerConfigNode.ts +95 -0
- package/src/core/logger/node/LokiLoggerConfigNode.html +153 -0
- package/src/core/logger/node/LokiLoggerConfigNode.ts +58 -0
- package/src/core/logger/node/RestLoggerConfigNode.html +209 -0
- package/src/core/logger/node/RestLoggerConfigNode.ts +67 -0
- package/src/core/logger/service/LoggerService.ts +317 -0
- package/src/core/logger/service/LoggerServiceTypes.ts +26 -0
- package/src/core/logger/template/LoggerTemplate.html +328 -0
- package/src/core/logger/template/LoggerTemplate.ts +23 -0
- package/src/core/metrics/MetricsDecorator.ts +227 -0
- package/src/core/metrics/node/CounterMetricConfigNode.html +48 -0
- package/src/core/metrics/node/CounterMetricConfigNode.ts +62 -0
- package/src/core/metrics/node/GaugeMetricConfigNode.html +48 -0
- package/src/core/metrics/node/GaugeMetricConfigNode.ts +62 -0
- package/src/core/metrics/node/MetricsConfigNode.html +21 -0
- package/src/core/metrics/node/MetricsConfigNode.ts +55 -0
- package/src/core/metrics/node/TimerMetricConfigNode.html +190 -0
- package/src/core/metrics/node/TimerMetricConfigNode.ts +118 -0
- package/src/core/metrics/service/MetricsService.ts +560 -0
- package/src/core/metrics/template/CounterMetricTemplate.html +40 -0
- package/src/core/metrics/template/CounterMetricTemplate.ts +15 -0
- package/src/core/metrics/template/GaugeMetricTemplate.html +39 -0
- package/src/core/metrics/template/GaugeMetricTemplate.ts +15 -0
- package/src/core/metrics/template/MetricsTemplate.html +54 -0
- package/src/core/metrics/template/MetricsTemplate.ts +18 -0
- package/src/core/metrics/template/TimerMetricTemplate.html +39 -0
- package/src/core/metrics/template/TimerMetricTemplate.ts +14 -0
- package/src/core/other/InputDecorator.ts +57 -0
- package/src/core/other/service/InputService.ts +36 -0
- package/src/core/other/service/SettingsService.ts +103 -0
- package/src/core/other/template/BasicTemplate.html +76 -0
- package/src/core/other/template/BasicTemplate.ts +15 -0
- package/src/core/other/template/SettingsTemplate.html +128 -0
- package/src/core/other/template/SettingsTemplate.ts +17 -0
- package/src/core/tagging/NodeDescriptionDecorator.ts +39 -0
- package/src/core/tagging/service/NodeTypeService.ts +67 -0
- package/src/core/webhook/WebhookDecorator.ts +70 -0
- package/src/core/webhook/node/WebhookServerConfigNode.html +61 -0
- package/src/core/webhook/node/WebhookServerConfigNode.ts +38 -0
- package/src/core/webhook/service/ReverseProxyTypeService.ts +46 -0
- package/src/core/webhook/service/WebhookServerService.ts +211 -0
- package/src/core/webhook/template/WebhookTemplate.html +434 -0
- package/src/core/webhook/template/WebhookTemplate.ts +36 -0
- package/src/index.ts +47 -0
|
@@ -0,0 +1,209 @@
|
|
|
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("est_url", {})
|
|
10
|
+
.addDefault("est_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 for="node-config-input-name"><i class="fa fa-tag"></i> Name</label>
|
|
92
|
+
<input type="text" id="node-config-input-name" />
|
|
93
|
+
</div>
|
|
94
|
+
|
|
95
|
+
<div class="form-row">
|
|
96
|
+
<label for="node-config-input-level"><i class="fa fa-tag"></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 for="node-config-input-rest_url"><i class="fa fa-tag"></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></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 for="node-config-input-rest_auth_type"><i class="fa fa-tag"></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 for="node-config-input-rest_auth_basic_username"><i class="fa fa-tag"></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 for="node-config-input-rest_auth_basic_password"><i class="fa fa-tag"></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 for="node-config-input-rest_auth_apikey_mechanism"><i class="fa fa-tag"></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 for="node-config-input-rest_auth_apikey_name"><i class="fa fa-tag"></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 for="node-config-input-rest_auth_apikey_value"><i class="fa fa-tag"></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 for="node-config-input-templateEditor"><i class="fa fa-tag"></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
|
+
Configuration node for the Logger Integration
|
|
145
|
+
|
|
146
|
+
## Inputs
|
|
147
|
+
: *name* (string) : The common name for the logger Configuration
|
|
148
|
+
: *level* (level) : The logging level - debug, info, warning, error
|
|
149
|
+
: *platform*(string) : The common name for the logger Configuration
|
|
150
|
+
: *template*(mustache) : A template for the log messages.
|
|
151
|
+
|
|
152
|
+
## Logger platform
|
|
153
|
+
Currently supported logging platforms
|
|
154
|
+
|
|
155
|
+
### Console
|
|
156
|
+
The log message will be printed out to stdio
|
|
157
|
+
|
|
158
|
+
### Http / Https
|
|
159
|
+
Publish the message to an http endpoint using a http / https POST command.
|
|
160
|
+
|
|
161
|
+
: *url* (url) : The endpoint for the url where requests are to be posted to.
|
|
162
|
+
: *ignore ssl errors* (boolean) : If enabled, the invalid ssl certificates will be ignored.
|
|
163
|
+
: *authentication* (auth method) : what auth method should be used for the http request. (none, basic, api key)
|
|
164
|
+
|
|
165
|
+
#### Authentication
|
|
166
|
+
##### Basic
|
|
167
|
+
Provides basic authentication using the Authorization header
|
|
168
|
+
|
|
169
|
+
: *username* (string) : the username used for basic authentication
|
|
170
|
+
: *password* (string) : the password used for basic authentication
|
|
171
|
+
|
|
172
|
+
##### APIKey
|
|
173
|
+
Provides authentication using a matrix parameter, header or query parameter and an apikey
|
|
174
|
+
|
|
175
|
+
: *mechanism* (mechanism) : the mechanism that will be used for transmitting the key (header, queryparam, matrixparam)
|
|
176
|
+
: *apikey name* (string) : the name of the key used for api authentication. (path variable or query param name)
|
|
177
|
+
: *apikey value*(string) : the value of the api key that will be transmitted. (beware of special characters)
|
|
178
|
+
|
|
179
|
+
### Loki
|
|
180
|
+
Publish the message to a loki endpoint.
|
|
181
|
+
|
|
182
|
+
: *host* (string) : the host and port\ of the loki instance that it being logged to
|
|
183
|
+
: *tenant* (string) : the tenant id that will be used to log to
|
|
184
|
+
: *username* (string) : the username for the loki instance.
|
|
185
|
+
: *authtoken* (string) : the authtoken for the loki instance.
|
|
186
|
+
|
|
187
|
+
# Mustache Templating
|
|
188
|
+
Mustache / Handlebars are used for building up the logged message payloads that are sent to the logging backend.
|
|
189
|
+
The resultant message will be interpreted as a string, meaning care should be taken in the event that a string representation of a json object is built.
|
|
190
|
+
|
|
191
|
+
### Provided Properties
|
|
192
|
+
A couple of values are provided to the logging context by default.
|
|
193
|
+
|
|
194
|
+
: *msg* (object) : an object containing the payload or message that should be parsed through the template.
|
|
195
|
+
: *currentTime* (object) : a string containing the current time in ISO8601 format
|
|
196
|
+
|
|
197
|
+
### Mustache Helpers
|
|
198
|
+
In addition to the provided properties, some "helpers" have also been provided to assist in serialization.
|
|
199
|
+
|
|
200
|
+
: *json* (helper) : converts a json object to a string using the JSON.stringify method.
|
|
201
|
+
|
|
202
|
+
## Examples
|
|
203
|
+
- {{{json msg}}} - serializes the the msg object to json format.
|
|
204
|
+
|
|
205
|
+
# References
|
|
206
|
+
- [Mustache - Wikipedia](https://en.wikipedia.org/wiki/Mustache_(template_system))
|
|
207
|
+
- [Mustache - Playground](https://jgonggrijp.gitlab.io/wontache/playground.html)
|
|
208
|
+
</script>
|
|
209
|
+
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
|
|
2
|
+
import { Node } from "node-red";
|
|
3
|
+
import { ConfigNode, ConfigNodeConfig, NodeDescriptor } from "../../NodeConstructor"
|
|
4
|
+
import { NewLogger, Log, LoggerRegistration, LoggerService, RestLoggerConfig } from "../service/LoggerService"
|
|
5
|
+
import { SourceUtility } from "../../NodeGenerator";
|
|
6
|
+
import { ApiKeyMechanismType, Level, PlatformType, RestAuthType } from "../service/LoggerServiceTypes";
|
|
7
|
+
import { NodeDescription } from "../../tagging/NodeDescriptionDecorator";
|
|
8
|
+
|
|
9
|
+
interface RestLoggerConfigNodeConfig extends ConfigNodeConfig {
|
|
10
|
+
|
|
11
|
+
id: string;
|
|
12
|
+
platform: PlatformType;
|
|
13
|
+
level:Level;
|
|
14
|
+
template:string;
|
|
15
|
+
|
|
16
|
+
rest_url: string;
|
|
17
|
+
rest_auth_type: RestAuthType;
|
|
18
|
+
rest_auth_basic_username:string;
|
|
19
|
+
rest_auth_basic_password:string;
|
|
20
|
+
rest_auth_apikey_mechanism:ApiKeyMechanismType;
|
|
21
|
+
rest_auth_apikey_name:string;
|
|
22
|
+
rest_auth_apikey_value:string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
@NodeDescription({
|
|
26
|
+
id:"RestLoggerConfigNode",
|
|
27
|
+
name:"Console Logger",
|
|
28
|
+
group:"config",
|
|
29
|
+
sourceFile:SourceUtility.getSourcePath("/build/", "/src/") + "RestLoggerConfigNode.html",
|
|
30
|
+
package: "@theotherwillembotha/node-red-plugincore",
|
|
31
|
+
dependencies:[ LoggerService ],
|
|
32
|
+
tags: [ "LoggerType" ]
|
|
33
|
+
})
|
|
34
|
+
export class RestLoggerConfigNode extends ConfigNode<RestLoggerConfigNodeConfig> {
|
|
35
|
+
|
|
36
|
+
private _logger!: NewLogger<any>;
|
|
37
|
+
|
|
38
|
+
constructor(node: Node, config: RestLoggerConfigNodeConfig){
|
|
39
|
+
super(node, config);
|
|
40
|
+
let _this = this;
|
|
41
|
+
|
|
42
|
+
// instantiate the logger.
|
|
43
|
+
let loggerConfig:any;
|
|
44
|
+
|
|
45
|
+
if(config.platform === PlatformType.rest){
|
|
46
|
+
loggerConfig = {
|
|
47
|
+
id:this.id(),
|
|
48
|
+
type:PlatformType.rest,
|
|
49
|
+
template:config.template,
|
|
50
|
+
level:config.level,
|
|
51
|
+
url: config.rest_url,
|
|
52
|
+
auth_type: config.rest_auth_type,
|
|
53
|
+
auth_basic_username:config.rest_auth_basic_username,
|
|
54
|
+
auth_basic_password:config.rest_auth_basic_password,
|
|
55
|
+
auth_apikey_mechanism:config.rest_auth_apikey_mechanism,
|
|
56
|
+
auth_apikey_name:config.rest_auth_apikey_name,
|
|
57
|
+
auth_apikey_value:config.rest_auth_apikey_value,
|
|
58
|
+
} as RestLoggerConfig;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
this._logger = LoggerService.get(loggerConfig);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
public registerLogger(registration:LoggerRegistration):Log {
|
|
65
|
+
return this._logger.register(registration)
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
|
|
2
|
+
import {BaseService, ServiceDescriptor } from "../../NodeConstructor";
|
|
3
|
+
import { NodeAPI, NodeAPISettingsWithData } from "node-red";
|
|
4
|
+
import Handlebars from "handlebars";
|
|
5
|
+
import { createLogger, format, transports } from "winston";
|
|
6
|
+
import LokiTransport from "winston-loki";
|
|
7
|
+
import { URLRecord, parseURL } from 'whatwg-url';
|
|
8
|
+
import { LoggerConfigNode } from "../node/LoggerConfigNode";
|
|
9
|
+
import { LoggerTemplate } from "../template/LoggerTemplate";
|
|
10
|
+
var network = require('network');
|
|
11
|
+
import deepEqual from "deep-equal";
|
|
12
|
+
import { HttpTransportOptions } from "winston/lib/winston/transports";
|
|
13
|
+
import { ApiKeyMechanismType, Level, PlatformType, RestAuthType } from "./LoggerServiceTypes";
|
|
14
|
+
|
|
15
|
+
// helper for serializing json objects inside handlebars tags.
|
|
16
|
+
// you can then convert it like this: {{{json myobject}}}
|
|
17
|
+
Handlebars.registerHelper('json', function(context) {
|
|
18
|
+
return JSON.stringify(context);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
type TagMap = {
|
|
22
|
+
instance: string;
|
|
23
|
+
flow: string;
|
|
24
|
+
node: string;
|
|
25
|
+
type: string;
|
|
26
|
+
id: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export type Log = {
|
|
30
|
+
log(message:{[key:string]:any}|string):void;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export class LogImplementation implements Log {
|
|
34
|
+
|
|
35
|
+
private root: NewLogger<any>;
|
|
36
|
+
private config:LoggerRegistration;
|
|
37
|
+
private template?:HandlebarsTemplateDelegate<any>;
|
|
38
|
+
private tagMap:TagMap;
|
|
39
|
+
|
|
40
|
+
constructor(root:NewLogger<any>, config:LoggerRegistration){
|
|
41
|
+
this.root = root;
|
|
42
|
+
this.config = config;
|
|
43
|
+
this.template = (config.override && config.template) ? Handlebars.compile(config.template) : undefined;
|
|
44
|
+
this.tagMap = {
|
|
45
|
+
instance:LoggerService.instanceID,
|
|
46
|
+
flow:config.flow,
|
|
47
|
+
node:config.name,
|
|
48
|
+
type:config.type,
|
|
49
|
+
id:config.id,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
public log(message:{[key:string]:any}|string){
|
|
54
|
+
// enrich the logged content with additional properties.
|
|
55
|
+
let content = {
|
|
56
|
+
currentTime: new Date().toISOString(),
|
|
57
|
+
msg: message,
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// send typ the logger.
|
|
61
|
+
this.root.log(this, content);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
public serialize(content:{[key:string]:any}) {
|
|
65
|
+
return !!this.template ? this.template(content) : this.root.serialize(content);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
public getTags() {
|
|
69
|
+
return this.tagMap;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export interface BaseLoggerConfig {
|
|
74
|
+
id:string;
|
|
75
|
+
type:PlatformType;
|
|
76
|
+
level: Level;
|
|
77
|
+
template:string;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export abstract class NewLogger<ConfigType extends BaseLoggerConfig> {
|
|
81
|
+
private _config: ConfigType;
|
|
82
|
+
private template: HandlebarsTemplateDelegate<string>;
|
|
83
|
+
|
|
84
|
+
constructor(config:ConfigType){
|
|
85
|
+
this._config = config;
|
|
86
|
+
this.template = Handlebars.compile(config.template);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
public log(reference:LogImplementation, content:{[key:string]:any}) {
|
|
90
|
+
try{
|
|
91
|
+
// step 1, attempt to serialize the content.
|
|
92
|
+
let serializedContent = reference.serialize(content);
|
|
93
|
+
|
|
94
|
+
// step 2, get the tags.
|
|
95
|
+
let tags = reference.getTags();
|
|
96
|
+
|
|
97
|
+
// step 3. write to the logger.
|
|
98
|
+
this.writeToLog(serializedContent, tags);
|
|
99
|
+
}
|
|
100
|
+
catch(exception){
|
|
101
|
+
console.log((exception as any).message);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
public register(registration:LoggerRegistration):Log{
|
|
106
|
+
return new LogImplementation(this, registration);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
public serialize(content: any) {
|
|
110
|
+
return this.template(content);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
public config():ConfigType {
|
|
114
|
+
return this._config;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
protected abstract writeToLog(serializedContent: string, tags: TagMap):void;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export interface ConsoleLoggerConfig extends BaseLoggerConfig {
|
|
121
|
+
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
class ConsoleLogger extends NewLogger<ConsoleLoggerConfig> {
|
|
125
|
+
|
|
126
|
+
constructor(config:ConsoleLoggerConfig){
|
|
127
|
+
super(config);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
protected writeToLog(serializedContent: string, tags: TagMap): void {
|
|
131
|
+
console.log(tags, serializedContent);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
export interface LokiLoggerConfig extends BaseLoggerConfig{
|
|
136
|
+
type:PlatformType.loki;
|
|
137
|
+
host:string;
|
|
138
|
+
userid?:string;
|
|
139
|
+
authtoken?:string;
|
|
140
|
+
tenantID?:string;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
class LokiLogger extends NewLogger<LokiLoggerConfig>{
|
|
144
|
+
logger: any;
|
|
145
|
+
|
|
146
|
+
constructor(config:LokiLoggerConfig){
|
|
147
|
+
super(config);
|
|
148
|
+
|
|
149
|
+
let transportConfig = {
|
|
150
|
+
host: config.host,
|
|
151
|
+
json: true,
|
|
152
|
+
format: format.json(),
|
|
153
|
+
headers: {
|
|
154
|
+
"X-Scope-OrgID": (config.tenantID) ? config.tenantID : undefined
|
|
155
|
+
},
|
|
156
|
+
replaceTimestamp: true,
|
|
157
|
+
onConnectionError: (err:unknown) => console.error(err),
|
|
158
|
+
basicAuth: (config.userid && config.authtoken)
|
|
159
|
+
? `${config.userid}:${config.authtoken}`
|
|
160
|
+
: undefined
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
this.logger = createLogger({
|
|
164
|
+
level: this.config().level.toString().toLowerCase(),
|
|
165
|
+
format: format.json(),
|
|
166
|
+
defaultMeta: {},
|
|
167
|
+
transports: [
|
|
168
|
+
new LokiTransport(transportConfig),
|
|
169
|
+
],
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
protected writeToLog(serializedContent: string, tags: TagMap): void {
|
|
174
|
+
this.logger.log({message:serializedContent, level:this.logger.level, labels:tags});
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export interface RestLoggerConfig extends BaseLoggerConfig{
|
|
179
|
+
type:PlatformType.rest;
|
|
180
|
+
url: string;
|
|
181
|
+
ignoresslerror:boolean;
|
|
182
|
+
auth_type: RestAuthType;
|
|
183
|
+
auth_basic_username:string;
|
|
184
|
+
auth_basic_password:string;
|
|
185
|
+
auth_apikey_mechanism:ApiKeyMechanismType;
|
|
186
|
+
auth_apikey_name:string;
|
|
187
|
+
auth_apikey_value:string;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
class RestLogger extends NewLogger<RestLoggerConfig>{
|
|
191
|
+
logger: any;
|
|
192
|
+
|
|
193
|
+
constructor(config:RestLoggerConfig){
|
|
194
|
+
super(config);
|
|
195
|
+
|
|
196
|
+
let hosturl:URLRecord|null = parseURL(config.url);
|
|
197
|
+
|
|
198
|
+
if(!hosturl){
|
|
199
|
+
throw Error("could not parse url: " + config.url);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
let httpOptions:{[key:string]:any} = {}
|
|
203
|
+
|
|
204
|
+
let httpParams:HttpTransportOptions = {
|
|
205
|
+
host:hosturl.host?.toString(),
|
|
206
|
+
path:"/" + (hosturl.path ? [...hosturl.path].join("/") : "") + (hosturl.query ? ("?" + hosturl.query) : ""),
|
|
207
|
+
port:(hosturl.port) ? hosturl.port : undefined,
|
|
208
|
+
ssl:hosturl.scheme.toLowerCase() === "https",
|
|
209
|
+
headers: {},
|
|
210
|
+
};
|
|
211
|
+
(httpParams as any).options = httpOptions;
|
|
212
|
+
|
|
213
|
+
if(config.ignoresslerror){
|
|
214
|
+
httpOptions.rejectUnauthorized = false;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
if(config.auth_type === RestAuthType.none){}
|
|
218
|
+
|
|
219
|
+
if(config.auth_type === RestAuthType.basic){
|
|
220
|
+
httpParams.auth = {
|
|
221
|
+
username: config.auth_basic_username,
|
|
222
|
+
password: config.auth_basic_password
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
if(config.auth_type === RestAuthType.apikey){
|
|
226
|
+
if(config.auth_apikey_mechanism === ApiKeyMechanismType.header) {
|
|
227
|
+
(httpParams.headers as any)[config.auth_apikey_name] = config.auth_apikey_value;
|
|
228
|
+
}
|
|
229
|
+
if(config.auth_apikey_mechanism === ApiKeyMechanismType.matrixparam) {
|
|
230
|
+
httpParams.path = httpParams.path?.replace(`:${config.auth_apikey_name}`, config.auth_apikey_value);
|
|
231
|
+
}
|
|
232
|
+
if(config.auth_apikey_mechanism === ApiKeyMechanismType.queryparam) {
|
|
233
|
+
httpParams.path = httpParams.path + (httpParams.path?.includes("?") ? "&" : "?") + config.auth_apikey_name + "=" + config.auth_apikey_value;
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
this.logger = createLogger({
|
|
238
|
+
level: config.level.toString().toLowerCase(),
|
|
239
|
+
format: format.json(),
|
|
240
|
+
defaultMeta: {},
|
|
241
|
+
transports: [
|
|
242
|
+
new transports.Http(httpParams),
|
|
243
|
+
],
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
protected writeToLog(serializedContent: string, tags: TagMap): void {
|
|
248
|
+
this.logger.log({level:this.logger.level, message:serializedContent, labels:tags});
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
let LoggerTypes:{[key:string]:any} = {
|
|
253
|
+
console: ConsoleLogger,
|
|
254
|
+
loki: LokiLogger,
|
|
255
|
+
rest: RestLogger
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
export class LoggerService extends BaseService {
|
|
259
|
+
|
|
260
|
+
public static instanceID:string;
|
|
261
|
+
|
|
262
|
+
private static loggers:{[key:string]:NewLogger<BaseLoggerConfig>} = {};
|
|
263
|
+
private red!: NodeAPI<NodeAPISettingsWithData>;
|
|
264
|
+
|
|
265
|
+
constructor(){
|
|
266
|
+
super("logger")
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
public init(red: NodeAPI<NodeAPISettingsWithData>): void | Promise<void> {
|
|
270
|
+
this.red = red;
|
|
271
|
+
|
|
272
|
+
return new Promise<void>((resolve) => {
|
|
273
|
+
network.get_active_interface((err:any, obj:any) => {
|
|
274
|
+
LoggerService.instanceID = obj.ip_address;
|
|
275
|
+
});
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
public deinit(red: NodeAPI<NodeAPISettingsWithData>): void | Promise<void> {}
|
|
280
|
+
|
|
281
|
+
public static get <ConfigType extends BaseLoggerConfig>(config:ConfigType): NewLogger<ConfigType>{
|
|
282
|
+
|
|
283
|
+
let logger:NewLogger<ConfigType> = this.loggers[config.id] as NewLogger<ConfigType>;
|
|
284
|
+
|
|
285
|
+
if(logger){
|
|
286
|
+
if(!deepEqual(config, logger.config())){
|
|
287
|
+
this.loggers[config.id] = (logger = new (LoggerTypes[config.type])(config));
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
else{
|
|
291
|
+
this.loggers[config.id] = (logger = new (LoggerTypes[config.type])(config));
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
return logger;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
static override getServiceDescriptor():ServiceDescriptor {
|
|
298
|
+
return new ServiceDescriptor(
|
|
299
|
+
"@theotherwillembotha/loggerservice",
|
|
300
|
+
"LoggerService",
|
|
301
|
+
"services-plugin",
|
|
302
|
+
"@theotherwillembotha/node-red-plugincore",
|
|
303
|
+
LoggerService,
|
|
304
|
+
[LoggerConfigNode, LoggerTemplate]
|
|
305
|
+
);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
export type LoggerRegistration = {
|
|
310
|
+
id:string;
|
|
311
|
+
flow:string;
|
|
312
|
+
type:string;
|
|
313
|
+
name:string;
|
|
314
|
+
enabled:boolean;
|
|
315
|
+
template?:string;
|
|
316
|
+
override?:boolean;
|
|
317
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export enum Level{
|
|
2
|
+
DEBUG = "DEBUG",
|
|
3
|
+
INFO = "INFO",
|
|
4
|
+
WARNING = "WARNING",
|
|
5
|
+
ERROR = "ERROR"
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export enum PlatformType {
|
|
9
|
+
console = 'console',
|
|
10
|
+
rest = 'rest',
|
|
11
|
+
loki = 'loki',
|
|
12
|
+
elasticsearch = 'elasticsearch',
|
|
13
|
+
datadog = 'datadog',
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export enum RestAuthType {
|
|
17
|
+
none="none",
|
|
18
|
+
basic="basic",
|
|
19
|
+
apikey="apikey",
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export enum ApiKeyMechanismType {
|
|
23
|
+
header="header",
|
|
24
|
+
queryparam="queryparam",
|
|
25
|
+
matrixparam="matrixparam",
|
|
26
|
+
}
|