@theotherwillembotha/node-red-plugincore 0.0.55 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/README.md +616 -217
  2. package/build/GenerateNodes.js +3 -6
  3. package/build/Nodes.html +3 -1502
  4. package/build/Nodes.js +5 -15
  5. package/build/Plugins.html +227 -0
  6. package/build/Plugins.js +18 -9
  7. package/build/core/NodeConstructor.d.ts +10 -16
  8. package/build/core/NodeConstructor.d.ts.map +1 -1
  9. package/build/core/NodeConstructor.js +112 -156
  10. package/build/core/NodeGenerator.d.ts.map +1 -1
  11. package/build/core/NodeGenerator.js +79 -29
  12. package/build/core/NodeManagerRuntime.d.ts +44 -0
  13. package/build/core/NodeManagerRuntime.d.ts.map +1 -0
  14. package/build/core/NodeManagerRuntime.js +140 -0
  15. package/build/core/Utils.d.ts.map +1 -1
  16. package/build/core/logger/service/LoggerService.d.ts +6 -5
  17. package/build/core/logger/service/LoggerService.d.ts.map +1 -1
  18. package/build/core/logger/service/LoggerService.js +51 -20
  19. package/build/core/logger/template/LoggerTemplate.d.ts.map +1 -1
  20. package/build/core/metrics/MetricsDecorator.d.ts +1 -2
  21. package/build/core/metrics/MetricsDecorator.d.ts.map +1 -1
  22. package/build/core/metrics/MetricsDecorator.js +89 -116
  23. package/build/core/metrics/node/CounterMetricConfigNode.d.ts.map +1 -1
  24. package/build/core/metrics/node/CounterMetricConfigNode.js +4 -5
  25. package/build/core/metrics/node/GaugeMetricConfigNode.d.ts.map +1 -1
  26. package/build/core/metrics/node/GaugeMetricConfigNode.js +5 -6
  27. package/build/core/metrics/node/MetricsConfigNode.d.ts +19 -9
  28. package/build/core/metrics/node/MetricsConfigNode.d.ts.map +1 -1
  29. package/build/core/metrics/node/MetricsConfigNode.js +14 -45
  30. package/build/core/metrics/node/TimerMetricConfigNode.d.ts.map +1 -1
  31. package/build/core/metrics/node/TimerMetricConfigNode.js +11 -17
  32. package/build/core/metrics/service/MetricsService.d.ts +110 -114
  33. package/build/core/metrics/service/MetricsService.d.ts.map +1 -1
  34. package/build/core/metrics/service/MetricsService.js +122 -339
  35. package/build/core/metrics/template/CounterMetricTemplate.d.ts.map +1 -1
  36. package/build/core/metrics/template/GaugeMetricTemplate.d.ts.map +1 -1
  37. package/build/core/metrics/template/MetricsTemplate.d.ts.map +1 -1
  38. package/build/core/metrics/template/MetricsTemplate.js +1 -2
  39. package/build/core/metrics/template/TimerMetricTemplate.d.ts.map +1 -1
  40. package/build/core/other/node/DelegatedConfigReferenceNode.d.ts +1 -1
  41. package/build/core/other/node/DelegatedConfigReferenceNode.d.ts.map +1 -1
  42. package/build/core/other/node/DelegatedConfigReferenceNode.js +1 -1
  43. package/build/core/other/service/InputService.d.ts.map +1 -1
  44. package/build/core/other/service/SettingsService.d.ts +1 -2
  45. package/build/core/other/service/SettingsService.d.ts.map +1 -1
  46. package/build/core/other/service/SettingsService.js +19 -5
  47. package/build/core/other/template/BasicTemplate.d.ts.map +1 -1
  48. package/build/core/other/template/SettingsTemplate.d.ts.map +1 -1
  49. package/build/core/state/node/InternalStateConfigNode.d.ts +16 -0
  50. package/build/core/state/node/InternalStateConfigNode.d.ts.map +1 -0
  51. package/build/core/state/node/InternalStateConfigNode.js +89 -0
  52. package/build/core/state/node/StateConfigNode.d.ts +24 -0
  53. package/build/core/state/node/StateConfigNode.d.ts.map +1 -0
  54. package/build/core/state/node/StateConfigNode.js +22 -0
  55. package/build/core/state/service/StateService.d.ts +34 -0
  56. package/build/core/state/service/StateService.d.ts.map +1 -0
  57. package/build/core/state/service/StateService.js +201 -0
  58. package/build/core/state/template/StateTemplate.d.ts +8 -0
  59. package/build/core/state/template/StateTemplate.d.ts.map +1 -0
  60. package/build/core/state/template/StateTemplate.js +11 -0
  61. package/build/core/tagging/ServiceDescriptionDecorator.d.ts +10 -0
  62. package/build/core/tagging/ServiceDescriptionDecorator.d.ts.map +1 -0
  63. package/build/core/tagging/ServiceDescriptionDecorator.js +10 -0
  64. package/build/core/tagging/service/NodeTypeService.d.ts +1 -2
  65. package/build/core/tagging/service/NodeTypeService.d.ts.map +1 -1
  66. package/build/core/tagging/service/NodeTypeService.js +19 -5
  67. package/build/core/ui/template/ScriptEditorTemplate.d.ts.map +1 -1
  68. package/build/core/ui/template/UIHelperTemplate.d.ts.map +1 -1
  69. package/build/core/webhook/WebhookDecorator.d.ts.map +1 -1
  70. package/build/core/webhook/WebhookDecorator.js +43 -6
  71. package/build/core/webhook/node/WebhookServerConfigNode.d.ts.map +1 -1
  72. package/build/core/webhook/service/ReverseProxyTypeService.d.ts +1 -0
  73. package/build/core/webhook/service/ReverseProxyTypeService.d.ts.map +1 -1
  74. package/build/core/webhook/service/WebhookServerService.d.ts +3 -4
  75. package/build/core/webhook/service/WebhookServerService.d.ts.map +1 -1
  76. package/build/core/webhook/service/WebhookServerService.js +48 -23
  77. package/build/core/webhook/template/WebhookTemplate.d.ts.map +1 -1
  78. package/build/index.d.ts +5 -2
  79. package/build/index.d.ts.map +1 -1
  80. package/build/index.js +6 -2
  81. package/build/runtime/NodeManagerRuntime.js +140 -0
  82. package/documentation/CounterMetricConfigNode.png +0 -0
  83. package/documentation/GaugeMetricConfigNode.png +0 -0
  84. package/documentation/LoggerTemplate.png +0 -0
  85. package/documentation/MetricsTemplate.png +0 -0
  86. package/documentation/StateTemplate.png +0 -0
  87. package/documentation/TimerMetricConfigNode_histogram.png +0 -0
  88. package/documentation/TimerMetricConfigNode_summary.png +0 -0
  89. package/documentation/WebhookServerConfigNode.png +0 -0
  90. package/documentation/WebhookTemplate.png +0 -0
  91. package/package.json +5 -12
  92. package/src/GenerateNodes.ts +7 -11
  93. package/src/core/NodeConstructor.ts +134 -197
  94. package/src/core/NodeGenerator.ts +88 -34
  95. package/src/core/NodeManagerRuntime.ts +179 -0
  96. package/src/core/logger/service/LoggerService.ts +39 -26
  97. package/src/core/logger/template/LoggerTemplate.html +13 -8
  98. package/src/core/metrics/MetricsDecorator.ts +140 -168
  99. package/src/core/metrics/node/CounterMetricConfigNode.ts +20 -20
  100. package/src/core/metrics/node/GaugeMetricConfigNode.ts +24 -25
  101. package/src/core/metrics/node/MetricsConfigNode.ts +29 -48
  102. package/src/core/metrics/node/TimerMetricConfigNode.html +2 -2
  103. package/src/core/metrics/node/TimerMetricConfigNode.ts +50 -59
  104. package/src/core/metrics/service/MetricsService.ts +214 -489
  105. package/src/core/metrics/template/CounterMetricTemplate.html +0 -1
  106. package/src/core/metrics/template/GaugeMetricTemplate.html +1 -1
  107. package/src/core/metrics/template/MetricsTemplate.html +132 -13
  108. package/src/core/metrics/template/MetricsTemplate.ts +3 -4
  109. package/src/core/other/node/DelegatedConfigReferenceNode.ts +1 -1
  110. package/src/core/other/service/SettingsService.ts +6 -10
  111. package/src/core/other/template/BasicTemplate.html +5 -2
  112. package/src/core/state/node/InternalStateConfigNode.html +77 -0
  113. package/src/core/state/node/InternalStateConfigNode.ts +102 -0
  114. package/src/core/state/node/StateConfigNode.ts +29 -0
  115. package/src/core/state/service/StateService.ts +180 -0
  116. package/src/core/state/template/StateTemplate.html +244 -0
  117. package/src/core/state/template/StateTemplate.ts +17 -0
  118. package/src/core/tagging/ServiceDescriptionDecorator.ts +23 -0
  119. package/src/core/tagging/service/NodeTypeService.ts +6 -11
  120. package/src/core/ui/template/UIHelperTemplate.html +41 -26
  121. package/src/core/webhook/WebhookDecorator.ts +53 -10
  122. package/src/core/webhook/service/ReverseProxyTypeService.ts +1 -0
  123. package/src/core/webhook/service/WebhookServerService.ts +39 -28
  124. package/src/core/webhook/template/WebhookTemplate.html +29 -36
  125. package/src/index.ts +7 -2
  126. package/build/core/logger/node/ConsoleLoggerConfigNode.d.ts +0 -20
  127. package/build/core/logger/node/ConsoleLoggerConfigNode.d.ts.map +0 -1
  128. package/build/core/logger/node/ConsoleLoggerConfigNode.html +0 -90
  129. package/build/core/logger/node/ConsoleLoggerConfigNode.js +0 -62
  130. package/build/core/logger/node/RestLoggerConfigNode.d.ts +0 -40
  131. package/build/core/logger/node/RestLoggerConfigNode.d.ts.map +0 -1
  132. package/build/core/logger/node/RestLoggerConfigNode.html +0 -183
  133. package/build/core/logger/node/RestLoggerConfigNode.js +0 -128
  134. package/build/core/logger/template/LoggerTemplate.html +0 -331
  135. package/build/core/metrics/node/CounterMetricConfigNode.html +0 -48
  136. package/build/core/metrics/node/GaugeMetricConfigNode.html +0 -48
  137. package/build/core/metrics/node/MetricsConfigNode.html +0 -21
  138. package/build/core/metrics/node/TimerMetricConfigNode.html +0 -190
  139. package/build/core/metrics/template/CounterMetricTemplate.html +0 -40
  140. package/build/core/metrics/template/GaugeMetricTemplate.html +0 -39
  141. package/build/core/metrics/template/MetricsTemplate.html +0 -54
  142. package/build/core/metrics/template/TimerMetricTemplate.html +0 -39
  143. package/build/core/other/node/DelegatedConfigReferenceNode.html +0 -1
  144. package/build/core/other/template/BasicTemplate.html +0 -76
  145. package/build/core/other/template/SettingsTemplate.html +0 -128
  146. package/build/core/ui/template/ScriptEditorTemplate.html +0 -50
  147. package/build/core/ui/template/UIHelperTemplate.html +0 -229
  148. package/build/core/webhook/node/WebhookServerConfigNode.html +0 -61
  149. package/build/core/webhook/template/WebhookTemplate.html +0 -442
  150. package/documentation/ConsoleLoggerConfigNode.png +0 -0
  151. package/documentation/MetricsConfigNode.png +0 -0
  152. package/documentation/RestLoggerConfigNode.png +0 -0
  153. package/documentation/TimerMetricConfigNode.png +0 -0
  154. package/documentation/WebhookNode.png +0 -0
  155. package/src/core/logger/node/ConsoleLoggerConfigNode.html +0 -90
  156. package/src/core/logger/node/ConsoleLoggerConfigNode.ts +0 -71
  157. package/src/core/logger/node/RestLoggerConfigNode.html +0 -183
  158. package/src/core/logger/node/RestLoggerConfigNode.ts +0 -170
@@ -1,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>