@theotherwillembotha/node-red-plugincore 0.0.53 → 0.0.55

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 (63) hide show
  1. package/README.md +62 -8
  2. package/build/GenerateNodes.js +0 -1
  3. package/build/Nodes.html +0 -141
  4. package/build/Nodes.js +0 -2
  5. package/build/Plugins.js +2 -2
  6. package/build/core/NodeConstructor.d.ts +1 -0
  7. package/build/core/NodeConstructor.d.ts.map +1 -1
  8. package/build/core/NodeConstructor.js +5 -2
  9. package/build/core/NodeGenerator.js +9 -9
  10. package/build/core/logger/LoggerDecorator.d.ts.map +1 -1
  11. package/build/core/logger/LoggerDecorator.js +34 -38
  12. package/build/core/logger/node/ConsoleLoggerConfigNode.d.ts +11 -7
  13. package/build/core/logger/node/ConsoleLoggerConfigNode.d.ts.map +1 -1
  14. package/build/core/logger/node/ConsoleLoggerConfigNode.js +24 -9
  15. package/build/core/logger/node/RestLoggerConfigNode.d.ts +22 -6
  16. package/build/core/logger/node/RestLoggerConfigNode.d.ts.map +1 -1
  17. package/build/core/logger/node/RestLoggerConfigNode.js +93 -22
  18. package/build/core/logger/service/LoggerService.d.ts +59 -68
  19. package/build/core/logger/service/LoggerService.d.ts.map +1 -1
  20. package/build/core/logger/service/LoggerService.js +76 -155
  21. package/build/core/logger/template/LoggerTemplate.d.ts +9 -1
  22. package/build/core/logger/template/LoggerTemplate.d.ts.map +1 -1
  23. package/build/core/metrics/service/MetricsService.js +1 -1
  24. package/build/core/webhook/WebhookDecorator.d.ts.map +1 -1
  25. package/build/core/webhook/WebhookDecorator.js +4 -4
  26. package/build/core/webhook/service/ReverseProxyTypeService.d.ts +0 -2
  27. package/build/core/webhook/service/ReverseProxyTypeService.d.ts.map +1 -1
  28. package/build/core/webhook/service/ReverseProxyTypeService.js +1 -4
  29. package/build/core/webhook/service/WebhookServerService.d.ts +1 -1
  30. package/build/core/webhook/service/WebhookServerService.d.ts.map +1 -1
  31. package/build/core/webhook/service/WebhookServerService.js +6 -6
  32. package/build/core/webhook/template/WebhookTemplate.d.ts +1 -1
  33. package/build/core/webhook/template/WebhookTemplate.d.ts.map +1 -1
  34. package/build/index.d.ts +1 -2
  35. package/build/index.d.ts.map +1 -1
  36. package/build/index.js +1 -2
  37. package/build/resources/editorLanguageExtension.js +1 -1
  38. package/package.json +5 -3
  39. package/resources/editorLanguageExtension.js +1 -1
  40. package/src/GenerateNodes.ts +2 -2
  41. package/src/core/NodeConstructor.ts +5 -1
  42. package/src/core/NodeGenerator.ts +2 -2
  43. package/src/core/logger/LoggerDecorator.ts +56 -53
  44. package/src/core/logger/node/ConsoleLoggerConfigNode.ts +39 -14
  45. package/src/core/logger/node/RestLoggerConfigNode.ts +128 -25
  46. package/src/core/logger/service/LoggerService.ts +103 -239
  47. package/src/core/logger/template/LoggerTemplate.ts +11 -1
  48. package/src/core/webhook/WebhookDecorator.ts +1 -3
  49. package/src/core/webhook/service/ReverseProxyTypeService.ts +0 -4
  50. package/src/core/webhook/service/WebhookServerService.ts +1 -1
  51. package/src/core/webhook/template/WebhookTemplate.ts +1 -1
  52. package/src/index.ts +2 -2
  53. package/build/core/logger/node/LokiLoggerConfigNode.d.ts +0 -20
  54. package/build/core/logger/node/LokiLoggerConfigNode.d.ts.map +0 -1
  55. package/build/core/logger/node/LokiLoggerConfigNode.html +0 -117
  56. package/build/core/logger/node/LokiLoggerConfigNode.js +0 -52
  57. package/build/core/logger/service/LoggerServiceTypes.d.ts +0 -24
  58. package/build/core/logger/service/LoggerServiceTypes.d.ts.map +0 -1
  59. package/build/core/logger/service/LoggerServiceTypes.js +0 -30
  60. package/documentation/LokiLoggerConfigNode.png +0 -0
  61. package/src/core/logger/node/LokiLoggerConfigNode.html +0 -117
  62. package/src/core/logger/node/LokiLoggerConfigNode.ts +0 -58
  63. package/src/core/logger/service/LoggerServiceTypes.ts +0 -26
@@ -1,7 +1,6 @@
1
1
  import { BaseNode, NodeManager } from "../NodeConstructor";
2
- import { Log, LoggerRegistration } from "./service/LoggerService";
3
- import { LoggerTemplateConfig } from "./template/LoggerTemplate";
4
-
2
+ import { AbstractLogger, Log, BaseLoggerConfig, DoNothingAppender, LoggerConfigNode, LoggerConfigNodeConfig } from "./service/LoggerService";
3
+ import { LoggerTemplateConfig, LoggerTemplateNodeConfig } from "./template/LoggerTemplate";
5
4
 
6
5
  export function Logger(debug?:string):Function {
7
6
 
@@ -10,41 +9,43 @@ export function Logger(debug?:string):Function {
10
9
  // if the type is a string, then its probably defined in the local (core) module.
11
10
  if(typeof propertyKey === "string"){
12
11
  const valueSymbol = Symbol(`_${String(propertyKey)}_value`);
12
+
13
+ //console.log("BINDING:", "target", target, "propertyKey", propertyKey );
13
14
 
14
15
  Object.defineProperty(target, propertyKey, {
15
16
  get: function() {
17
+
18
+ //console.log("setting logger on node " + this.name() + " (localized)");
16
19
 
17
20
  if(!this[valueSymbol]){
18
- let node = this as BaseNode<LoggerTemplateConfig>;
19
- //console.log("setting logger on node " + node.name() + " (localized)");
20
- let config = node.config();
21
- let logger;
22
21
 
23
- if(config.logEnabled){
24
- let registration:LoggerRegistration = {
22
+ try{
23
+ let node = this as BaseNode<LoggerTemplateNodeConfig>;
24
+ let config = node.config();
25
+
26
+ if(!config.logEnabled){
27
+ return this[valueSymbol] = DoNothingAppender.get();
28
+ }
29
+
30
+ // get the logger config node.
31
+ let loggerConfigNode:LoggerConfigNode<LoggerConfigNodeConfig, AbstractLogger<BaseLoggerConfig>> =(NodeManager.RED.nodes.getNode(config.logger) as any).node();
32
+
33
+ let loggerTemplateConfig:LoggerTemplateConfig = {
25
34
  id:config.id,
26
35
  flow:node.flow(),
27
36
  type:node.type(),
28
37
  name:node.name(),
29
- enabled:config.logEnabled,
30
- override:config.logTemplateOverrideEnabled,
31
- template:config.logTemplateOverride
38
+ level:loggerConfigNode.config().level,
39
+ template: (config.logTemplateOverrideEnabled) ? config.logTemplateOverride : loggerConfigNode.config().template,
32
40
  };
33
-
41
+
34
42
  // get a reference to the loggerService.
35
- try{
36
- logger = (NodeManager.RED.nodes.getNode(config.logger) as any).node().registerLogger(registration) as Log;
37
- }
38
- catch(e){
39
- console.log("failed getting logger ", config.logger, e);
40
- logger = { log(){} };
41
- }
43
+ return this[valueSymbol] = loggerConfigNode.registerTemplate(loggerTemplateConfig);
42
44
  }
43
- else{
44
- logger = { log(){} };
45
+ catch(e){
46
+ console.log(`failed getting logger "${this?.config()?.logger}"`, e);
47
+ return this[valueSymbol] = DoNothingAppender.get();
45
48
  }
46
-
47
- this[valueSymbol] = logger;
48
49
  }
49
50
  return this[valueSymbol];
50
51
  },
@@ -55,43 +56,45 @@ export function Logger(debug?:string):Function {
55
56
  }
56
57
  else{
57
58
  let property = propertyKey as any;
58
- //property.addInitializer(() => {
59
- property.addInitializer(function(this:BaseNode<LoggerTemplateConfig>){
60
- let node = this as BaseNode<LoggerTemplateConfig>
59
+
60
+ property.addInitializer(function(this:BaseNode<LoggerTemplateNodeConfig>){
61
+ let node = this as BaseNode<LoggerTemplateNodeConfig>
61
62
  const valueSymbol = Symbol(`_${String(property.name)}_value`);
63
+
64
+ //console.log("ADDING INITIALIZER:", "node", node, "property.name", property.name );
65
+
62
66
  Object.defineProperty(node, property.name, {
63
67
  get: function() {
68
+
69
+ //console.log("setting logger on node " + node.name()+ " (externalized)");
64
70
 
65
71
  if(!this[valueSymbol]){
66
- //console.log("setting logger on node " + node.name()+ " (externalized)");
72
+ try{
67
73
  let config = node.config();
68
- let logger;
69
-
70
- if(config.logEnabled){
71
- let registration:LoggerRegistration = {
72
- id:config.id,
73
- flow:node.flow(),
74
- type:node.type(),
75
- name:node.name(),
76
- enabled:config.logEnabled,
77
- override:config.logTemplateOverrideEnabled,
78
- template:config.logTemplateOverride
79
- };
80
-
81
- // get a reference to the loggerService.
82
- try{
83
- logger = (NodeManager.RED.nodes.getNode(config.logger) as any).node().registerLogger(registration) as Log;
84
- }
85
- catch(e){
86
- console.log("failed getting logger ", config.logger, e);
87
- logger = { log(){} };
88
- }
89
- }
90
- else{
91
- logger = { log(){} };
74
+
75
+ if(!config.logEnabled){
76
+ return this[valueSymbol] = DoNothingAppender.get();
92
77
  }
93
78
 
94
- this[valueSymbol] = logger;
79
+ // get the logger config node.
80
+ let loggerConfigNode:LoggerConfigNode<LoggerConfigNodeConfig, AbstractLogger<BaseLoggerConfig>> =(NodeManager.RED.nodes.getNode(config.logger) as any).node();
81
+
82
+ let loggerTemplateConfig:LoggerTemplateConfig = {
83
+ id:config.id,
84
+ flow:node.flow(),
85
+ type:node.type(),
86
+ name:node.name(),
87
+ level: loggerConfigNode?.config().level ?? 'info',
88
+ template: (config.logTemplateOverrideEnabled) ? config.logTemplateOverride : (loggerConfigNode?.config().template ?? 'message:{{msg}}'),
89
+ };
90
+
91
+ // get a reference to the loggerService.
92
+ return this[valueSymbol] = loggerConfigNode.registerTemplate(loggerTemplateConfig);
93
+ }
94
+ catch(e){
95
+ console.log("failed getting logger ", e);
96
+ return this[valueSymbol] = DoNothingAppender.get();
97
+ }
95
98
  }
96
99
  return this[valueSymbol];
97
100
  },
@@ -1,13 +1,11 @@
1
1
 
2
2
  import { Node } from "node-red";
3
- import { ConfigNode, ConfigNodeConfig } from "../../NodeConstructor"
4
- import { NewLogger, Log, LoggerRegistration, LoggerService } from "../service/LoggerService"
3
+ import { LoggerService, LoggerConfigNodeConfig, BaseLoggerConfig, AbstractLogger, TagMap, LoggerConfigNode, Log, Level } from "../service/LoggerService"
5
4
  import { SourceUtility } from "../../NodeGenerator";
6
- import { Level, PlatformType } from "../service/LoggerServiceTypes";
7
5
  import { NodeDescription } from "../../tagging/NodeDescriptionDecorator";
6
+ import { LoggerTemplateConfig } from "../template/LoggerTemplate";
8
7
 
9
- interface ConsoleLoggerConfigNodeConfig extends ConfigNodeConfig {
10
- id: string;
8
+ interface ConsoleLoggerConfigNodeConfig extends LoggerConfigNodeConfig {
11
9
  level:Level;
12
10
  template:string;
13
11
  }
@@ -21,26 +19,53 @@ interface ConsoleLoggerConfigNodeConfig extends ConfigNodeConfig {
21
19
  dependencies:[ LoggerService ],
22
20
  tags: [ "LoggerType" ]
23
21
  })
24
- export class ConsoleLoggerConfigNode extends ConfigNode<ConsoleLoggerConfigNodeConfig> {
22
+ export class ConsoleLoggerConfigNode extends LoggerConfigNode<ConsoleLoggerConfigNodeConfig, ConsoleLogger> {
25
23
 
26
- private _logger!: NewLogger<any>;
24
+ private _logger!: ConsoleLogger;
27
25
 
28
26
  constructor(node: Node, config: ConsoleLoggerConfigNodeConfig){
29
27
  super(node, config);
30
28
  let _this = this;
31
29
 
32
- // instantiate the logger.
33
- let loggerConfig = {
30
+ // create logger config
31
+ let loggerConfig:ConsoleLoggerConfig = {
34
32
  id:this.id(),
35
- type:PlatformType.console,
36
- template:config.template,
33
+ type:"CONSOLE",
37
34
  level:config.level,
35
+ template:config.template,
38
36
  }
39
37
 
40
- this._logger = LoggerService.get(loggerConfig);
38
+ // create logger instance:
39
+ this._logger = new ConsoleLogger(loggerConfig);
41
40
  }
42
41
 
43
- public registerLogger(registration:LoggerRegistration):Log {
44
- return this._logger.register(registration)
42
+ protected logger():ConsoleLogger{
43
+ return this._logger;
45
44
  }
46
45
  }
46
+
47
+ export interface ConsoleLoggerConfig extends BaseLoggerConfig {
48
+ // no additional values.
49
+ }
50
+
51
+ class ConsoleLogger extends AbstractLogger<ConsoleLoggerConfig> {
52
+
53
+ constructor(config:ConsoleLoggerConfig){
54
+ super(config);
55
+ }
56
+
57
+ protected createLogger(config: LoggerTemplateConfig): Log {
58
+ return new ConsoleAppender(config);
59
+ }
60
+ }
61
+
62
+ class ConsoleAppender extends Log {
63
+
64
+ constructor(config:LoggerTemplateConfig){
65
+ super(config);
66
+ }
67
+
68
+ protected writeToLog(level:string, message: string, tags: { [key: string]: string | boolean | number; }): void {
69
+ console.log(new Date().toISOString(), this.config().id, level, tags, message)
70
+ }
71
+ }
@@ -1,19 +1,23 @@
1
1
 
2
2
  import { Node } from "node-red";
3
- import { ConfigNode, ConfigNodeConfig, NodeDescriptor } from "../../NodeConstructor"
4
- import { NewLogger, Log, LoggerRegistration, LoggerService, RestLoggerConfig } from "../service/LoggerService"
3
+ import {ConfigNodeConfig } from "../../NodeConstructor"
4
+ import { LoggerService, LoggerConfigNode, AbstractLogger, BaseLoggerConfig, TagMap, Log } from "../service/LoggerService"
5
5
  import { SourceUtility } from "../../NodeGenerator";
6
- import { ApiKeyMechanismType, Level, PlatformType, RestAuthType } from "../service/LoggerServiceTypes";
6
+ import { ApiKeyMechanismType, Level, RestAuthType } from "../service/LoggerService";
7
7
  import { NodeDescription } from "../../tagging/NodeDescriptionDecorator";
8
+ import { LoggerTemplateConfig } from "../template/LoggerTemplate";
9
+ import { parseURL, URLRecord } from "whatwg-url";
10
+ import { HttpTransportOptions } from "winston/lib/winston/transports";
11
+ import { createLogger, format, transports, Logger } from "winston";
8
12
 
9
13
  interface RestLoggerConfigNodeConfig extends ConfigNodeConfig {
10
14
 
11
15
  id: string;
12
- platform: PlatformType;
13
16
  level:Level;
14
17
  template:string;
15
18
 
16
19
  rest_url: string;
20
+ rest_ignoresslerror:boolean;
17
21
  rest_auth_type: RestAuthType;
18
22
  rest_auth_basic_username:string;
19
23
  rest_auth_basic_password:string;
@@ -31,37 +35,136 @@ interface RestLoggerConfigNodeConfig extends ConfigNodeConfig {
31
35
  dependencies:[ LoggerService ],
32
36
  tags: [ "LoggerType" ]
33
37
  })
34
- export class RestLoggerConfigNode extends ConfigNode<RestLoggerConfigNodeConfig> {
38
+ export class RestLoggerConfigNode extends LoggerConfigNode<RestLoggerConfigNodeConfig, RestLogger> {
35
39
 
36
- private _logger!: NewLogger<any>;
40
+ private _logger!: RestLogger;
37
41
 
38
42
  constructor(node: Node, config: RestLoggerConfigNodeConfig){
39
43
  super(node, config);
40
44
  let _this = this;
41
45
 
42
46
  // 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;
47
+ let loggerConfig:RestLoggerConfig = {
48
+ id:this.id(),
49
+ type:"REST",
50
+ level:config.level,
51
+ template:config.template,
52
+
53
+ // additional properties.
54
+ url: config.rest_url,
55
+ ignoresslerror:config.rest_ignoresslerror,
56
+ auth_type: config.rest_auth_type,
57
+ auth_basic_username:config.rest_auth_basic_username,
58
+ auth_basic_password:config.rest_auth_basic_password,
59
+ auth_apikey_mechanism:config.rest_auth_apikey_mechanism,
60
+ auth_apikey_name:config.rest_auth_apikey_name,
61
+ auth_apikey_value:config.rest_auth_apikey_value,
62
+ };
63
+
64
+ this._logger = new RestLogger(loggerConfig);
65
+ }
66
+
67
+ protected logger():RestLogger{
68
+ return this._logger;
69
+ }
70
+ }
71
+
72
+ class RestLogger extends AbstractLogger<RestLoggerConfig> {
73
+
74
+ private winston:Logger;
75
+
76
+ constructor(config:RestLoggerConfig){
77
+ super(config);
78
+
79
+ // get the url.
80
+ let hosturl:URLRecord|null = parseURL(config.url);
81
+ if(!hosturl){
82
+ throw Error("could not parse url: " + config.url);
83
+ }
84
+
85
+ // get the options
86
+ let httpOptions:{[key:string]:any} = {}
87
+
88
+ // get the params.
89
+ let httpParams:HttpTransportOptions = {
90
+ host:hosturl.host?.toString(),
91
+ path:"/" + (hosturl.path ? [...hosturl.path].join("/") : "") + (hosturl.query ? ("?" + hosturl.query) : ""),
92
+ port:(hosturl.port) ? hosturl.port : undefined,
93
+ ssl:hosturl.scheme.toLowerCase() === "https",
94
+ headers: {},
95
+ };
96
+ (httpParams as any).options = httpOptions;
97
+
98
+ // add the ignore ssl error flag if need be.
99
+ if(config.ignoresslerror){
100
+ httpOptions.rejectUnauthorized = false;
59
101
  }
60
102
 
61
- this._logger = LoggerService.get(loggerConfig);
103
+ // configure "none" authentication.
104
+ if(config.auth_type === RestAuthType.none){}
105
+
106
+
107
+ // configure "basic" authentication.
108
+ if(config.auth_type === RestAuthType.basic){
109
+ httpParams.auth = {
110
+ username: config.auth_basic_username,
111
+ password: config.auth_basic_password
112
+ }
113
+ }
114
+
115
+ // configure "apikey" authentication.
116
+ if(config.auth_type === RestAuthType.apikey){
117
+ if(config.auth_apikey_mechanism === ApiKeyMechanismType.header) {
118
+ (httpParams.headers as any)[config.auth_apikey_name] = config.auth_apikey_value;
119
+ }
120
+ if(config.auth_apikey_mechanism === ApiKeyMechanismType.matrixparam) {
121
+ httpParams.path = httpParams.path?.replace(`:${config.auth_apikey_name}`, config.auth_apikey_value);
122
+ }
123
+ if(config.auth_apikey_mechanism === ApiKeyMechanismType.queryparam) {
124
+ httpParams.path = httpParams.path + (httpParams.path?.includes("?") ? "&" : "?") + config.auth_apikey_name + "=" + config.auth_apikey_value;
125
+ }
126
+ };
127
+
128
+ this.winston = createLogger({
129
+ level: config.level.toString().toLowerCase(),
130
+ format: format.json(),
131
+ defaultMeta: {},
132
+ transports: [
133
+ new transports.Http(httpParams),
134
+ ],
135
+ });
136
+ }
137
+
138
+ protected createLogger(config: LoggerTemplateConfig): Log {
139
+ return new RestAppender(config, this.winston);
140
+ }
141
+ }
142
+
143
+ class RestAppender extends Log {
144
+ private winston: Logger;
145
+
146
+ constructor(config:LoggerTemplateConfig, winston:Logger){
147
+ super(config);
148
+ this.winston = winston;
62
149
  }
63
150
 
64
- public registerLogger(registration:LoggerRegistration):Log {
65
- return this._logger.register(registration)
151
+ protected writeToLog(level:string, message: string, tags: { [key: string]: string | boolean | number; }): void {
152
+ this.winston.log({
153
+ level:level,
154
+ message:message,
155
+ labels:tags
156
+ });
66
157
  }
158
+
67
159
  }
160
+
161
+ interface RestLoggerConfig extends BaseLoggerConfig {
162
+ url: string;
163
+ ignoresslerror:boolean;
164
+ auth_type: RestAuthType;
165
+ auth_basic_username:string;
166
+ auth_basic_password:string;
167
+ auth_apikey_mechanism:ApiKeyMechanismType;
168
+ auth_apikey_name:string;
169
+ auth_apikey_value:string;
170
+ }