@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,15 +1,9 @@
1
1
 
2
- import {BaseService, ServiceDescriptor } from "../../NodeConstructor";
3
- import { NodeAPI, NodeAPISettingsWithData } from "node-red";
2
+ import {BaseService, ServiceDescriptor, ConfigNodeConfig, ConfigNode } from "../../NodeConstructor";
3
+ import { NodeAPI, NodeAPISettingsWithData, Node } from "node-red";
4
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 { LoggerTemplate } from "../template/LoggerTemplate";
5
+ import { LoggerTemplate, LoggerTemplateConfig } from "../template/LoggerTemplate";
9
6
  var network = require('network');
10
- import deepEqual from "deep-equal";
11
- import { HttpTransportOptions } from "winston/lib/winston/transports";
12
- import { ApiKeyMechanismType, Level, PlatformType, RestAuthType } from "./LoggerServiceTypes";
13
7
 
14
8
  // helper for serializing json objects inside handlebars tags.
15
9
  // you can then convert it like this: {{{json myobject}}}
@@ -17,248 +11,108 @@ Handlebars.registerHelper('json', function(context) {
17
11
  return JSON.stringify(context);
18
12
  });
19
13
 
20
- type TagMap = {
21
- instance: string;
22
- flow: string;
23
- node: string;
24
- type: string;
25
- id: string;
14
+ export enum Level{
15
+ DEBUG = "DEBUG",
16
+ INFO = "INFO",
17
+ WARNING = "WARNING",
18
+ ERROR = "ERROR"
26
19
  }
27
20
 
28
- export type Log = {
29
- log(message:{[key:string]:any}|string):void;
21
+ export enum RestAuthType {
22
+ none="none",
23
+ basic="basic",
24
+ apikey="apikey",
30
25
  }
31
26
 
32
- export class LogImplementation implements Log {
33
-
34
- private root: NewLogger<any>;
35
- private config:LoggerRegistration;
36
- private template?:HandlebarsTemplateDelegate<any>;
37
- private tagMap:TagMap;
38
-
39
- constructor(root:NewLogger<any>, config:LoggerRegistration){
40
- this.root = root;
41
- this.config = config;
42
- this.template = (config.override && config.template) ? Handlebars.compile(config.template) : undefined;
43
- this.tagMap = {
44
- instance:LoggerService.instanceID,
45
- flow:config.flow,
46
- node:config.name,
47
- type:config.type,
48
- id:config.id,
49
- };
50
- }
51
-
52
- public log(message:{[key:string]:any}|string){
53
- // enrich the logged content with additional properties.
54
- let content = {
55
- currentTime: new Date().toISOString(),
56
- msg: message,
57
- }
58
-
59
- // send typ the logger.
60
- this.root.log(this, content);
61
- }
62
-
63
- public serialize(content:{[key:string]:any}) {
64
- return !!this.template ? this.template(content) : this.root.serialize(content);
65
- }
66
-
67
- public getTags() {
68
- return this.tagMap;
69
- }
27
+ export enum ApiKeyMechanismType {
28
+ header="header",
29
+ queryparam="queryparam",
30
+ matrixparam="matrixparam",
70
31
  }
71
32
 
72
- export interface BaseLoggerConfig {
73
- id:string;
74
- type:PlatformType;
75
- level: Level;
76
- template:string;
33
+ export type TagMap = {
34
+ id: string;
35
+ node: string;
36
+ type: string;
37
+ flow: string;
38
+ instance: string;
77
39
  }
78
40
 
79
- export abstract class NewLogger<ConfigType extends BaseLoggerConfig> {
80
- private _config: ConfigType;
81
- private template: HandlebarsTemplateDelegate<string>;
41
+ export abstract class Log {
42
+ private _config: LoggerTemplateConfig;
43
+ private template: HandlebarsTemplateDelegate<any>;
44
+ private tags:TagMap;
82
45
 
83
- constructor(config:ConfigType){
46
+ protected constructor(config:LoggerTemplateConfig){
84
47
  this._config = config;
85
48
  this.template = Handlebars.compile(config.template);
86
- }
87
-
88
- public log(reference:LogImplementation, content:{[key:string]:any}) {
89
- try{
90
- // step 1, attempt to serialize the content.
91
- let serializedContent = reference.serialize(content);
92
-
93
- // step 2, get the tags.
94
- let tags = reference.getTags();
95
-
96
- // step 3. write to the logger.
97
- this.writeToLog(serializedContent, tags);
49
+ this.tags = {
50
+ id: config.id,
51
+ node: config.name,
52
+ type: config.type,
53
+ flow: config.flow,
54
+ instance: LoggerService.instanceID
98
55
  }
99
- catch(exception){
100
- console.log((exception as any).message);
101
- }
102
- }
103
-
104
- public register(registration:LoggerRegistration):Log{
105
- return new LogImplementation(this, registration);
106
56
  }
107
57
 
108
- public serialize(content: any) {
109
- return this.template(content);
110
- }
111
-
112
- public config():ConfigType {
58
+ protected config():LoggerTemplateConfig{
113
59
  return this._config;
114
60
  }
115
61
 
116
- protected abstract writeToLog(serializedContent: string, tags: TagMap):void;
117
- }
118
-
119
- export interface ConsoleLoggerConfig extends BaseLoggerConfig {
120
-
121
- }
122
-
123
- class ConsoleLogger extends NewLogger<ConsoleLoggerConfig> {
124
-
125
- constructor(config:ConsoleLoggerConfig){
126
- super(config);
127
- }
128
-
129
- protected writeToLog(serializedContent: string, tags: TagMap): void {
130
- console.log(tags, serializedContent);
131
- }
132
- }
133
-
134
- export interface LokiLoggerConfig extends BaseLoggerConfig{
135
- type:PlatformType.loki;
136
- host:string;
137
- userid?:string;
138
- authtoken?:string;
139
- tenantid?:string;
140
- }
141
-
142
- class LokiLogger extends NewLogger<LokiLoggerConfig>{
143
- logger: any;
62
+ public log(payload:{[key:string]:any}|string):void{
63
+ try{
64
+ // step 1. serialize the payload using the template engine.
65
+ let message = (payload instanceof String) ? payload as string : this.template({msg:payload});
144
66
 
145
- constructor(config:LokiLoggerConfig){
146
- super(config);
147
-
148
- let transportConfig = {
149
- host: config.host,
150
- json: true,
151
- format: format.json(),
152
- headers: {
153
- "X-Scope-OrgID": (config.tenantid) ? config.tenantid : undefined
154
- },
155
- replaceTimestamp: true,
156
- onConnectionError: (err:unknown) => console.error(err),
157
- basicAuth: (config.userid && config.authtoken)
158
- ? `${config.userid}:${config.authtoken}`
159
- : undefined
67
+ // step 2. write to the log appender.
68
+ this.writeToLog(this.config().level, message, this.tags);
69
+ }
70
+ catch(e){
71
+ console.log(e);
160
72
  }
161
-
162
- this.logger = createLogger({
163
- level: this.config().level.toString().toLowerCase(),
164
- format: format.json(),
165
- defaultMeta: {},
166
- transports: [
167
- new LokiTransport(transportConfig),
168
- ],
169
- });
170
- }
171
-
172
- protected writeToLog(serializedContent: string, tags: TagMap): void {
173
- this.logger.log({message:serializedContent, level:this.logger.level, labels:tags});
174
73
  }
74
+
75
+ protected abstract writeToLog(level:string, message:string, tags:{[key:string]:string|boolean|number}):void;
175
76
  }
176
77
 
177
- export interface RestLoggerConfig extends BaseLoggerConfig{
178
- type:PlatformType.rest;
179
- url: string;
180
- ignoresslerror:boolean;
181
- auth_type: RestAuthType;
182
- auth_basic_username:string;
183
- auth_basic_password:string;
184
- auth_apikey_mechanism:ApiKeyMechanismType;
185
- auth_apikey_name:string;
186
- auth_apikey_value:string;
78
+ export type BaseLoggerConfig = {
79
+ id:string;
80
+ type:string;
81
+ level: Level;
82
+ template:string;
187
83
  }
188
84
 
189
- class RestLogger extends NewLogger<RestLoggerConfig>{
190
- logger: any;
191
-
192
- constructor(config:RestLoggerConfig){
193
- super(config);
194
-
195
- let hosturl:URLRecord|null = parseURL(config.url);
85
+ export abstract class AbstractLogger<BaseLoggerConfig>{
196
86
 
197
- if(!hosturl){
198
- throw Error("could not parse url: " + config.url);
199
- }
200
-
201
- let httpOptions:{[key:string]:any} = {}
202
-
203
- let httpParams:HttpTransportOptions = {
204
- host:hosturl.host?.toString(),
205
- path:"/" + (hosturl.path ? [...hosturl.path].join("/") : "") + (hosturl.query ? ("?" + hosturl.query) : ""),
206
- port:(hosturl.port) ? hosturl.port : undefined,
207
- ssl:hosturl.scheme.toLowerCase() === "https",
208
- headers: {},
209
- };
210
- (httpParams as any).options = httpOptions;
211
-
212
- if(config.ignoresslerror){
213
- httpOptions.rejectUnauthorized = false;
214
- }
87
+ private _config: BaseLoggerConfig;
88
+ private _appenders:{[key:string]:Log} = {};
89
+
90
+ constructor(config:BaseLoggerConfig){
91
+ this._config = config;
92
+ }
215
93
 
216
- if(config.auth_type === RestAuthType.none){}
94
+ public config():BaseLoggerConfig{
95
+ return this._config;
96
+ }
217
97
 
218
- if(config.auth_type === RestAuthType.basic){
219
- httpParams.auth = {
220
- username: config.auth_basic_username,
221
- password: config.auth_basic_password
222
- }
98
+ public registerTemplate(config: LoggerTemplateConfig): Log{
99
+ let appender:Log = this._appenders[config.id];
100
+ if(appender){
101
+ return appender;
223
102
  }
224
- if(config.auth_type === RestAuthType.apikey){
225
- if(config.auth_apikey_mechanism === ApiKeyMechanismType.header) {
226
- (httpParams.headers as any)[config.auth_apikey_name] = config.auth_apikey_value;
227
- }
228
- if(config.auth_apikey_mechanism === ApiKeyMechanismType.matrixparam) {
229
- httpParams.path = httpParams.path?.replace(`:${config.auth_apikey_name}`, config.auth_apikey_value);
230
- }
231
- if(config.auth_apikey_mechanism === ApiKeyMechanismType.queryparam) {
232
- httpParams.path = httpParams.path + (httpParams.path?.includes("?") ? "&" : "?") + config.auth_apikey_name + "=" + config.auth_apikey_value;
233
- }
234
- };
235
-
236
- this.logger = createLogger({
237
- level: config.level.toString().toLowerCase(),
238
- format: format.json(),
239
- defaultMeta: {},
240
- transports: [
241
- new transports.Http(httpParams),
242
- ],
243
- });
244
- }
103
+
104
+ let _this = this;
245
105
 
246
- protected writeToLog(serializedContent: string, tags: TagMap): void {
247
- this.logger.log({level:this.logger.level, message:serializedContent, labels:tags});
106
+ this._appenders[config.id] = appender = this.createLogger(config);
107
+ return appender;
248
108
  }
249
- }
250
109
 
251
- let LoggerTypes:{[key:string]:any} = {
252
- console: ConsoleLogger,
253
- loki: LokiLogger,
254
- rest: RestLogger
110
+ protected abstract createLogger(config: LoggerTemplateConfig):Log;
255
111
  }
256
112
 
257
113
  export class LoggerService extends BaseService {
258
114
 
259
115
  public static instanceID:string;
260
-
261
- private static loggers:{[key:string]:NewLogger<BaseLoggerConfig>} = {};
262
116
  private red!: NodeAPI<NodeAPISettingsWithData>;
263
117
 
264
118
  constructor(){
@@ -277,22 +131,6 @@ export class LoggerService extends BaseService {
277
131
 
278
132
  public deinit(red: NodeAPI<NodeAPISettingsWithData>): void | Promise<void> {}
279
133
 
280
- public static get <ConfigType extends BaseLoggerConfig>(config:ConfigType): NewLogger<ConfigType>{
281
-
282
- let logger:NewLogger<ConfigType> = this.loggers[config.id] as NewLogger<ConfigType>;
283
-
284
- if(logger){
285
- if(!deepEqual(config, logger.config())){
286
- this.loggers[config.id] = (logger = new (LoggerTypes[config.type])(config));
287
- }
288
- }
289
- else{
290
- this.loggers[config.id] = (logger = new (LoggerTypes[config.type])(config));
291
- }
292
-
293
- return logger;
294
- }
295
-
296
134
  static override getServiceDescriptor():ServiceDescriptor {
297
135
  return new ServiceDescriptor(
298
136
  "@theotherwillembotha/loggerservice",
@@ -305,12 +143,38 @@ export class LoggerService extends BaseService {
305
143
  }
306
144
  }
307
145
 
308
- export type LoggerRegistration = {
309
- id:string;
310
- flow:string;
311
- type:string;
312
- name:string;
313
- enabled:boolean;
314
- template?:string;
315
- override?:boolean;
146
+ export type LoggerConfigNodeConfig = ConfigNodeConfig & BaseLoggerConfig & {}
147
+
148
+ export abstract class LoggerConfigNode<CNC extends LoggerConfigNodeConfig, LoggerType extends AbstractLogger<BaseLoggerConfig>> extends ConfigNode<CNC> {
149
+
150
+ protected constructor(node:Node, config: CNC){
151
+ super(node, config);
152
+ }
153
+
154
+ protected abstract logger():LoggerType;
155
+
156
+ public registerTemplate(config: LoggerTemplateConfig): Log {
157
+ return this.logger().registerTemplate(config);
158
+ }
316
159
  }
160
+
161
+ export class DoNothingAppender extends Log{
162
+
163
+ private static instance:DoNothingAppender = new DoNothingAppender();
164
+
165
+ static get(): any {
166
+ return DoNothingAppender.instance;
167
+ }
168
+
169
+ private constructor(){
170
+ super({flow:"",id:"", level:"", name:"", template:"", type:""});
171
+ }
172
+
173
+ public log(payload:{[key:string]:any}|string):void{
174
+ // do nothing.
175
+ }
176
+
177
+ protected writeToLog(level:string, message: string, tags: { [key: string]: string | boolean | number; }): void {
178
+ // do nothing.
179
+ }
180
+ }
@@ -1,13 +1,23 @@
1
1
  import { SourceUtility } from "../../NodeGenerator";
2
2
  import { BaseNodeConfig, Template, TemplateDescriptor } from "../../NodeConstructor"
3
3
 
4
- export interface LoggerTemplateConfig extends BaseNodeConfig{
4
+ // TODO: we need to prefix logger teplate properties with logtemplate_
5
+ export interface LoggerTemplateNodeConfig extends BaseNodeConfig{
5
6
  logEnabled:boolean,
6
7
  logger:string,
7
8
  logTemplateOverrideEnabled:boolean,
8
9
  logTemplateOverride:string;
9
10
  }
10
11
 
12
+ export type LoggerTemplateConfig = {
13
+ id:string;
14
+ flow:string;
15
+ type:string;
16
+ name:string;
17
+ template:string;
18
+ level:string;
19
+ }
20
+
11
21
  export class LoggerTemplate extends Template {
12
22
 
13
23
 
@@ -1,4 +1,4 @@
1
- import { RestAuthType } from "../logger/service/LoggerServiceTypes";
1
+ import { RestAuthType } from "../logger/service/LoggerService";
2
2
  import { BaseNode, createPostConstructDecorator, NodeManager } from "../NodeConstructor";
3
3
  import { ProxyManagerClient } from "./service/ReverseProxyTypeService";
4
4
  import { ApiKeyAuthenticationConfig, BasicAuthenticationConfig, EndpointConfig, EndpointMethodType, NoAuthenticationConfig, WebhookServer } from "./service/WebhookServerService";
@@ -45,8 +45,6 @@ const Webhook = createPostConstructDecorator<WebhookConfig>('Webhook')
45
45
  let proxyClient = reverseProxyNode.client() as ProxyManagerClient;
46
46
 
47
47
  console.log("List of known hosts: ", await proxyClient.getHosts());
48
-
49
-
50
48
  //console.log("ADD REVERSE PROXY:" + proxy.proxy + " to " + node.id(), proxyClient);
51
49
  }
52
50
  catch(e){
@@ -24,10 +24,6 @@ export interface ProxyManagerClient {
24
24
  getHosts():Promise<Partial<HostEntry>[]>;
25
25
  }
26
26
 
27
- export abstract class ReverseProxyClient {
28
-
29
- }
30
-
31
27
  export type HostEntry = {
32
28
  id:number,
33
29
  domainNames:string[],
@@ -5,7 +5,7 @@ import { WebhookServerConfigNode } from "../node/WebhookServerConfigNode";
5
5
  import { WebhookTemplate } from "../template/WebhookTemplate";
6
6
  import express, {Express, Request, Response} from "express";
7
7
  import { Server } from "http";
8
- import { ApiKeyMechanismType, RestAuthType } from "../../logger/service/LoggerServiceTypes";
8
+ import { ApiKeyMechanismType, RestAuthType } from "../../logger/service/LoggerService";
9
9
 
10
10
  var bodyParser = require('body-parser');
11
11
 
@@ -1,7 +1,7 @@
1
1
  import { BaseNodeConfig, Template, TemplateDescriptor } from "../../NodeConstructor"
2
2
  import { WebhookServerConfigNode } from "../node/WebhookServerConfigNode";
3
3
  import { SourceUtility } from "../../NodeGenerator";
4
- import { ApiKeyMechanismType, RestAuthType } from "../../logger/service/LoggerServiceTypes";
4
+ import { RestAuthType, ApiKeyMechanismType } from "../../logger/service/LoggerService";
5
5
 
6
6
  export interface WebhookTemplateConfig extends BaseNodeConfig{
7
7
  webhook:string,
package/src/index.ts CHANGED
@@ -4,10 +4,10 @@ export * from "./core/NodeConstructor";
4
4
 
5
5
  // LOGGER
6
6
  export * from "./core/logger/service/LoggerService";
7
- export * from "./core/logger/template/LoggerTemplate";
8
7
  export * from "./core/logger/node/ConsoleLoggerConfigNode";
9
8
  export * from "./core/logger/node/RestLoggerConfigNode";
10
- export * from "./core/logger/node/LokiLoggerConfigNode";
9
+ export * from "./core/logger/template/LoggerTemplate";
10
+
11
11
 
12
12
  // METRICS
13
13
  export * from "./core/metrics/service/MetricsService";
@@ -1,20 +0,0 @@
1
- import { Node } from "node-red";
2
- import { ConfigNode, ConfigNodeConfig } from "../../NodeConstructor";
3
- import { Log, LoggerRegistration } from "../service/LoggerService";
4
- import { Level } from "../service/LoggerServiceTypes";
5
- interface LokiLoggerConfigNodeConfig extends ConfigNodeConfig {
6
- id: string;
7
- level: Level;
8
- template: string;
9
- loki_host: string;
10
- loki_userid?: string;
11
- loki_authtoken?: string;
12
- loki_tenantid?: string;
13
- }
14
- export declare class LokiLoggerConfigNode extends ConfigNode<LokiLoggerConfigNodeConfig> {
15
- private _logger;
16
- constructor(node: Node, config: LokiLoggerConfigNodeConfig);
17
- registerLogger(registration: LoggerRegistration): Log;
18
- }
19
- export {};
20
- //# sourceMappingURL=LokiLoggerConfigNode.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LokiLoggerConfigNode.d.ts","sourceRoot":"","sources":["../../../../src/core/logger/node/LokiLoggerConfigNode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACpE,OAAO,EAAa,GAAG,EAAE,kBAAkB,EAAiB,MAAM,0BAA0B,CAAA;AAE5F,OAAO,EAAE,KAAK,EAAgB,MAAM,+BAA+B,CAAC;AAGpE,UAAU,0BAA2B,SAAQ,gBAAgB;IAEzD,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAC,KAAK,CAAC;IACZ,QAAQ,EAAC,MAAM,CAAC;IAEhB,SAAS,EAAC,MAAM,CAAC;IACjB,WAAW,CAAC,EAAC,MAAM,CAAC;IACpB,cAAc,CAAC,EAAC,MAAM,CAAC;IACvB,aAAa,CAAC,EAAC,MAAM,CAAA;CACxB;AAED,qBASa,oBAAqB,SAAQ,UAAU,CAAC,0BAA0B,CAAC;IAE5E,OAAO,CAAC,OAAO,CAAkB;gBAErB,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,0BAA0B;IAqBnD,cAAc,CAAC,YAAY,EAAC,kBAAkB,GAAE,GAAG;CAG7D"}
@@ -1,117 +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
- .addDefault("loki_host", {})
9
- .addDefault("loki_tenantid", {})
10
- .addDefault("loki_userid", {})
11
- .addDefault("loki_authtoken", {})
12
-
13
- .setPaletteLabel("Loki Logger Config Node")
14
- .setLabel(function() {return this.name })
15
- </script>
16
-
17
- <script type="text/javascript" template-section="onIncludeEditPrepare">
18
- {
19
- let node = this;
20
-
21
- let levelSelection = $("#node-config-input-level");
22
- levelSelection.typedInput({type:"level", types:[{
23
- value: "level",
24
- options: [
25
- { value: "DEBUG", label: "debug"},
26
- { value: "INFO", label: "info"},
27
- { value: "WARNING", label: "warning"},
28
- { value: "ERROR", label: "error"},
29
- ]
30
- }]});
31
-
32
- this.editor = RED.editor.createEditor({
33
- id: 'node-config-input-templateEditor',
34
- mode: 'ace/mode/handlebars',
35
- value: this.template
36
- });
37
- }
38
- </script>
39
-
40
- <script type="text/javascript" template-section="onIncludeEditSave">
41
- {
42
- let node = this;
43
-
44
- this.template = this.editor.getValue();
45
- this.editor.destroy();
46
- delete this.editor;
47
- }
48
-
49
- </script>
50
-
51
- <script type="text/html" template-section="onIncludeEditForm">
52
- <div id="LoggerConfig">
53
- <div class="form-row">
54
- <label class="towb_editorlabel" for="node-config-input-name"><i class="fa fa-font"></i> Name</label>
55
- <input type="text" id="node-config-input-name" />
56
- </div>
57
-
58
- <div class="form-row">
59
- <label class="towb_editorlabel" for="node-config-input-level"><i class="fa fa-signal"></i> Level</label>
60
- <input type="text" id="node-config-input-level" />
61
- </div>
62
-
63
- <div class="form-row">
64
- <label class="towb_editorlabel" for="node-config-input-loki_host"><i class="fa fa-server"></i> Host</label>
65
- <input class="required" type="text" id="node-config-input-loki_host" />
66
- </div>
67
- <div class="form-row">
68
- <label class="towb_editorlabel" for="node-config-input-loki_tenantid"><i class="fa fa-building-o"></i> Tenant ID</label>
69
- <input class="" type="text" id="node-config-input-loki_tenantid" />
70
- </div>
71
- <div class="form-row">
72
- <label class="towb_editorlabel" for="node-config-input-loki_userid"><i class="fa fa-user"></i> Username</label>
73
- <input class="" type="text" id="node-config-input-loki_userid" />
74
- </div>
75
- <div class="form-row">
76
- <label class="towb_editorlabel" for="node-config-input-loki_authtoken"><i class="fa fa-key"></i> Auth Token</label>
77
- <input class="" type="password" id="node-config-input-loki_authtoken" />
78
- </div>
79
-
80
- <div class="form-row">
81
- <label class="towb_editorlabel" for="node-config-input-templateEditor"><i class="fa fa-code"></i> Template</label>
82
- <div style="height: 250px; min-height:150px;" class="node-text-editor" id="node-config-input-templateEditor"></div>
83
- </div>
84
- </div>
85
- </script>
86
-
87
- <script type="text/markdown" template-section="onIncludeDocumentation">
88
- Pushes log messages to a Grafana Loki instance using the Loki HTTP API.
89
-
90
- ### Properties
91
- : *name* (string) : A descriptive name for this logger configuration.
92
- : *level* (level) : The minimum log level. Messages below this threshold are suppressed. Options: DEBUG, INFO, WARNING, ERROR.
93
- : *host* (string) : The base URL of the Loki instance, including port (e.g. `http://localhost:3100`).
94
- : *tenant ID* (string) : The tenant identifier for multi-tenant Loki deployments (`X-Scope-OrgID` header). Leave blank for single-tenant deployments.
95
- : *username* (string) : Username for Loki authentication.
96
- : *auth token* (string) : Authentication token or password for Loki.
97
- : *template* (mustache) : A Mustache/Handlebars template that formats the log message body.
98
-
99
- ### Mustache Templating
100
- Mustache/Handlebars templates build the message string pushed to Loki.
101
-
102
- #### Provided Properties
103
- : *msg* (object) : The Node-RED message object passed through the node.
104
- : *currentTime* (string) : The current time in ISO 8601 format.
105
-
106
- #### Helpers
107
- : *json* (helper) : Serialises an object to a JSON string using `JSON.stringify`.
108
-
109
- #### Examples
110
- - `{{{json msg}}}` — serialises the full message object as JSON.
111
-
112
- #### References
113
- - [Grafana Loki — HTTP API](https://grafana.com/docs/loki/latest/reference/loki-http-api/)
114
- - [Mustache — Wikipedia](https://en.wikipedia.org/wiki/Mustache_(template_system))
115
- - [Mustache — Playground](https://jgonggrijp.gitlab.io/wontache/playground.html)
116
- </script>
117
-