@theotherwillembotha/node-red-whatsapp 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/Nodes.js CHANGED
@@ -7739,6 +7739,10 @@ var require_NodeConstructor = __commonJS({
7739
7739
  if (Array.isArray(value)) {
7740
7740
  return `[${value.map((t) => this.serializeProperty(t)).join(", ")}]`;
7741
7741
  }
7742
+ if (value === null) {
7743
+ return "null";
7744
+ }
7745
+ return JSON.stringify(value);
7742
7746
  }
7743
7747
  }
7744
7748
  throw new Error(`no serializeProperty handler for ${typeof value}, ${value}`);
@@ -8592,16 +8596,19 @@ var require_MetricsService = __commonJS({
8592
8596
  constructor(config) {
8593
8597
  this._config = config;
8594
8598
  this._labels = {
8595
- flow: config.node.flow,
8596
- type: config.node.type,
8597
- name: config.node.name,
8598
- id: config.node.id,
8599
- metric: config.metricname
8599
+ type: config.type,
8600
+ id: config.id,
8601
+ metric: config.metric,
8602
+ flow: config.flow,
8603
+ name: config.name
8600
8604
  };
8601
8605
  }
8602
8606
  labels() {
8603
8607
  return this._labels;
8604
8608
  }
8609
+ static labelNames() {
8610
+ return ["flow", "type", "name", "id", "metric"];
8611
+ }
8605
8612
  config() {
8606
8613
  return this._config;
8607
8614
  }
@@ -8650,6 +8657,8 @@ var require_MetricsService = __commonJS({
8650
8657
  var DoNothingHistogramMetric = class {
8651
8658
  observe(_value) {
8652
8659
  }
8660
+ reset() {
8661
+ }
8653
8662
  subscribe(_node, _callback) {
8654
8663
  }
8655
8664
  unsubscribe(_node) {
@@ -8664,6 +8673,8 @@ var require_MetricsService = __commonJS({
8664
8673
  var DoNothingSummaryMetric = class {
8665
8674
  observe(_value) {
8666
8675
  }
8676
+ reset() {
8677
+ }
8667
8678
  subscribe(_node, _callback) {
8668
8679
  }
8669
8680
  unsubscribe(_node) {
@@ -8688,6 +8699,32 @@ var require_MetricsService = __commonJS({
8688
8699
  console.warn(`[PluginCore] MetricsContainer: Summary is not supported by this provider.`);
8689
8700
  return new DoNothingSummaryMetric();
8690
8701
  }
8702
+ /**
8703
+ * Factory method for timer metrics. Called by flow nodes with the common
8704
+ * metric config and provider-specific fragment data from the ConfigFragment UI.
8705
+ * Providers override this to interpret their own fragment data and create the
8706
+ * appropriate histogram or summary metric.
8707
+ */
8708
+ createTimer(metricConfig, fragmentData) {
8709
+ console.warn(`[PluginCore] MetricsContainer: createTimer is not supported by this provider.`);
8710
+ return new DoNothingHistogramMetric();
8711
+ }
8712
+ /**
8713
+ * Factory method for counter metrics. Called by flow nodes with the common
8714
+ * metric config and provider-specific fragment data from the ConfigFragment UI.
8715
+ */
8716
+ createCounter(metricConfig, fragmentData) {
8717
+ console.warn(`[PluginCore] MetricsContainer: createCounter is not supported by this provider.`);
8718
+ return new DoNothingCounterMetric();
8719
+ }
8720
+ /**
8721
+ * Factory method for gauge metrics. Called by flow nodes with the common
8722
+ * metric config and provider-specific fragment data from the ConfigFragment UI.
8723
+ */
8724
+ createGauge(metricConfig, fragmentData) {
8725
+ console.warn(`[PluginCore] MetricsContainer: createGauge is not supported by this provider.`);
8726
+ return new DoNothingGaugeMetric();
8727
+ }
8691
8728
  };
8692
8729
  exports2.MetricsContainer = MetricsContainer;
8693
8730
  var DoNothingMetricsContainer = class extends MetricsContainer {
@@ -8711,6 +8748,15 @@ var require_MetricsService = __commonJS({
8711
8748
  summary(_config) {
8712
8749
  return new DoNothingSummaryMetric();
8713
8750
  }
8751
+ createTimer(_metricConfig, _fragmentData) {
8752
+ return new DoNothingHistogramMetric();
8753
+ }
8754
+ createCounter(_metricConfig, _fragmentData) {
8755
+ return new DoNothingCounterMetric();
8756
+ }
8757
+ createGauge(_metricConfig, _fragmentData) {
8758
+ return new DoNothingGaugeMetric();
8759
+ }
8714
8760
  };
8715
8761
  exports2.DoNothingMetricsContainer = DoNothingMetricsContainer;
8716
8762
  var _GLOBAL_METRICS_KEY = "__plugincore_metrics__";
@@ -8796,9 +8842,9 @@ var require_MetricsTemplate = __commonJS({
8796
8842
  }
8797
8843
  });
8798
8844
 
8799
- // ../nodered_plugincore/build/core/metrics/node/CounterMetricConfigNode.js
8800
- var require_CounterMetricConfigNode = __commonJS({
8801
- "../nodered_plugincore/build/core/metrics/node/CounterMetricConfigNode.js"(exports2) {
8845
+ // ../nodered_plugincore/build/core/configfragment/service/ConfigFragmentService.js
8846
+ var require_ConfigFragmentService = __commonJS({
8847
+ "../nodered_plugincore/build/core/configfragment/service/ConfigFragmentService.js"(exports2) {
8802
8848
  "use strict";
8803
8849
  var __decorate = exports2 && exports2.__decorate || function(decorators, target, key, desc) {
8804
8850
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -8809,62 +8855,63 @@ var require_CounterMetricConfigNode = __commonJS({
8809
8855
  var __metadata = exports2 && exports2.__metadata || function(k, v) {
8810
8856
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
8811
8857
  };
8858
+ var ConfigFragmentService_1;
8812
8859
  Object.defineProperty(exports2, "__esModule", { value: true });
8813
- exports2.CounterMetricConfigNode = void 0;
8860
+ exports2.ConfigFragmentService = void 0;
8814
8861
  var NodeConstructor_1 = require_NodeConstructor();
8815
- var MetricsService_1 = require_MetricsService();
8816
- var NodeGenerator_1 = require_NodeGenerator();
8817
- var MetricsTemplate_1 = require_MetricsTemplate();
8818
- var NodeDescriptionDecorator_1 = require_NodeDescriptionDecorator();
8819
- var CounterMetricConfigNode = class CounterMetricConfigNode extends NodeConstructor_1.ConfigNode {
8820
- constructor(node, config) {
8821
- super(node, config);
8822
- const refNode = config.metricsEnabled && config.metricsReference ? NodeConstructor_1.NodeManager.RED.nodes.getNode(config.metricsReference) : null;
8823
- this._metrics = refNode ? refNode.node().metrics() : new MetricsService_1.DoNothingMetricsContainer();
8824
- const counterConfig = {
8825
- metricname: config.name,
8826
- metricdescription: config.description,
8827
- node: {
8828
- id: this.id(),
8829
- name: this.name(),
8830
- flow: this.flow(),
8831
- type: this.type()
8832
- }
8833
- };
8834
- this._counter = this._metrics.counter(counterConfig);
8835
- if (config.reset) {
8836
- this._counter.reset();
8862
+ var ServiceDescriptionDecorator_1 = require_ServiceDescriptionDecorator();
8863
+ var ConfigFragmentService = ConfigFragmentService_1 = class ConfigFragmentService extends NodeConstructor_1.BaseService {
8864
+ // Global-backed registry so fragments registered across bundle boundaries are visible.
8865
+ static get _fragments() {
8866
+ if (!global.__plugincore_config_fragments__) {
8867
+ global.__plugincore_config_fragments__ = [];
8837
8868
  }
8869
+ return global.__plugincore_config_fragments__;
8838
8870
  }
8839
- metrics() {
8840
- return this._metrics;
8871
+ constructor() {
8872
+ super("configfragments");
8873
+ }
8874
+ init(red) {
8875
+ red.httpAdmin.get("/configfragment/:section/:providerType", red.auth.needsPermission("inject.write"), (request, response) => {
8876
+ const { section, providerType } = request.params;
8877
+ const fragment = ConfigFragmentService_1._fragments.find((f) => f.section === section && f.providerType === providerType);
8878
+ if (fragment) {
8879
+ response.type("text/html").send(fragment.html);
8880
+ } else {
8881
+ response.status(404).send("");
8882
+ }
8883
+ });
8884
+ return Promise.resolve();
8841
8885
  }
8842
- counter() {
8843
- return this._counter;
8886
+ deinit(red) {
8887
+ return Promise.resolve();
8888
+ }
8889
+ /**
8890
+ * Register a config fragment. Called by provider plugins during their service init().
8891
+ * Provider plugins own both sides of the contract: the HTML fragment that collects
8892
+ * the configuration AND the server-side factory that deserializes it.
8893
+ */
8894
+ static registerFragment(registration) {
8895
+ const existing = ConfigFragmentService_1._fragments.find((f) => f.section === registration.section && f.providerType === registration.providerType);
8896
+ if (!existing) {
8897
+ ConfigFragmentService_1._fragments.push(registration);
8898
+ }
8844
8899
  }
8845
8900
  };
8846
- exports2.CounterMetricConfigNode = CounterMetricConfigNode;
8847
- exports2.CounterMetricConfigNode = CounterMetricConfigNode = __decorate([
8848
- (0, NodeDescriptionDecorator_1.NodeDescription)({
8849
- id: "CounterMetricConfigNode",
8850
- name: "Counter Metric Config Node",
8851
- group: "config",
8852
- sourceFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "CounterMetricConfigNode.html",
8853
- package: "@theotherwillembotha/node-red-plugincore",
8854
- templates: [
8855
- { template: MetricsTemplate_1.MetricsTemplate, config: {} }
8856
- ],
8857
- dependencies: [MetricsService_1.MetricsService],
8858
- tags: ["MetricType"]
8901
+ exports2.ConfigFragmentService = ConfigFragmentService;
8902
+ exports2.ConfigFragmentService = ConfigFragmentService = ConfigFragmentService_1 = __decorate([
8903
+ (0, ServiceDescriptionDecorator_1.ServiceDescription)({
8904
+ id: "@theotherwillembotha/configfragmentservice",
8905
+ sourceFile: "@theotherwillembotha/node-red-plugincore"
8859
8906
  }),
8860
- __metadata("design:paramtypes", [Object, Object])
8861
- ], CounterMetricConfigNode);
8907
+ __metadata("design:paramtypes", [])
8908
+ ], ConfigFragmentService);
8862
8909
  }
8863
8910
  });
8864
8911
 
8865
- // ../nodered_plugincore/build/core/metrics/template/CounterMetricTemplate.js
8866
- var require_CounterMetricTemplate = __commonJS({
8867
- "../nodered_plugincore/build/core/metrics/template/CounterMetricTemplate.js"(exports2) {
8912
+ // ../nodered_plugincore/build/core/configfragment/template/ConfigFragmentTemplate.js
8913
+ var require_ConfigFragmentTemplate = __commonJS({
8914
+ "../nodered_plugincore/build/core/configfragment/template/ConfigFragmentTemplate.js"(exports2) {
8868
8915
  "use strict";
8869
8916
  var __decorate = exports2 && exports2.__decorate || function(decorators, target, key, desc) {
8870
8917
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -8873,27 +8920,27 @@ var require_CounterMetricTemplate = __commonJS({
8873
8920
  return c > 3 && r && Object.defineProperty(target, key, r), r;
8874
8921
  };
8875
8922
  Object.defineProperty(exports2, "__esModule", { value: true });
8876
- exports2.CounterMetricTemplate = void 0;
8923
+ exports2.ConfigFragmentTemplate = void 0;
8877
8924
  var NodeGenerator_1 = require_NodeGenerator();
8878
8925
  var NodeConstructor_1 = require_NodeConstructor();
8879
8926
  var TemplateDescriptionDecorator_1 = require_TemplateDescriptionDecorator();
8880
- var CounterMetricConfigNode_1 = require_CounterMetricConfigNode();
8881
- var CounterMetricTemplate = class CounterMetricTemplate extends NodeConstructor_1.Template {
8927
+ var ConfigFragmentService_1 = require_ConfigFragmentService();
8928
+ var ConfigFragmentTemplate = class ConfigFragmentTemplate extends NodeConstructor_1.Template {
8882
8929
  };
8883
- exports2.CounterMetricTemplate = CounterMetricTemplate;
8884
- exports2.CounterMetricTemplate = CounterMetricTemplate = __decorate([
8930
+ exports2.ConfigFragmentTemplate = ConfigFragmentTemplate;
8931
+ exports2.ConfigFragmentTemplate = ConfigFragmentTemplate = __decorate([
8885
8932
  (0, TemplateDescriptionDecorator_1.TemplateDescription)({
8886
- name: "countermetric",
8887
- templateFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "CounterMetricTemplate.html",
8888
- dependencies: [CounterMetricConfigNode_1.CounterMetricConfigNode]
8933
+ name: "configfragment",
8934
+ templateFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "ConfigFragmentTemplate.html",
8935
+ dependencies: [ConfigFragmentService_1.ConfigFragmentService]
8889
8936
  })
8890
- ], CounterMetricTemplate);
8937
+ ], ConfigFragmentTemplate);
8891
8938
  }
8892
8939
  });
8893
8940
 
8894
- // ../nodered_plugincore/build/core/metrics/node/GaugeMetricConfigNode.js
8895
- var require_GaugeMetricConfigNode = __commonJS({
8896
- "../nodered_plugincore/build/core/metrics/node/GaugeMetricConfigNode.js"(exports2) {
8941
+ // ../nodered_plugincore/build/core/metrics/template/CounterMetricTemplate.js
8942
+ var require_CounterMetricTemplate = __commonJS({
8943
+ "../nodered_plugincore/build/core/metrics/template/CounterMetricTemplate.js"(exports2) {
8897
8944
  "use strict";
8898
8945
  var __decorate = exports2 && exports2.__decorate || function(decorators, target, key, desc) {
8899
8946
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -8901,59 +8948,24 @@ var require_GaugeMetricConfigNode = __commonJS({
8901
8948
  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;
8902
8949
  return c > 3 && r && Object.defineProperty(target, key, r), r;
8903
8950
  };
8904
- var __metadata = exports2 && exports2.__metadata || function(k, v) {
8905
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
8906
- };
8907
8951
  Object.defineProperty(exports2, "__esModule", { value: true });
8908
- exports2.GaugeMetricConfigNode = void 0;
8952
+ exports2.CounterMetricTemplate = void 0;
8953
+ var NodeGenerator_1 = require_NodeGenerator();
8909
8954
  var NodeConstructor_1 = require_NodeConstructor();
8955
+ var TemplateDescriptionDecorator_1 = require_TemplateDescriptionDecorator();
8910
8956
  var MetricsService_1 = require_MetricsService();
8911
- var NodeGenerator_1 = require_NodeGenerator();
8912
- var MetricsTemplate_1 = require_MetricsTemplate();
8913
- var NodeDescriptionDecorator_1 = require_NodeDescriptionDecorator();
8914
- var GaugeMetricConfigNode = class GaugeMetricConfigNode extends NodeConstructor_1.ConfigNode {
8915
- constructor(node, config) {
8916
- super(node, config);
8917
- const refNode = config.metricsEnabled && config.metricsReference ? NodeConstructor_1.NodeManager.RED.nodes.getNode(config.metricsReference) : null;
8918
- this._metrics = refNode ? refNode.node().metrics() : new MetricsService_1.DoNothingMetricsContainer();
8919
- const gaugeConfig = {
8920
- metricname: config.name,
8921
- metricdescription: config.description,
8922
- node: {
8923
- id: this.id(),
8924
- flow: this.flow(),
8925
- type: this.type(),
8926
- name: this.name()
8927
- }
8928
- };
8929
- this._gauge = this._metrics.gauge(gaugeConfig);
8930
- if (config.reset) {
8931
- this._gauge.reset();
8932
- }
8933
- }
8934
- metrics() {
8935
- return this._metrics;
8936
- }
8937
- gauge() {
8938
- return this._gauge;
8939
- }
8957
+ var DelegatedConfigReferenceNode_1 = require_DelegatedConfigReferenceNode();
8958
+ var ConfigFragmentTemplate_1 = require_ConfigFragmentTemplate();
8959
+ var CounterMetricTemplate = class CounterMetricTemplate extends NodeConstructor_1.Template {
8940
8960
  };
8941
- exports2.GaugeMetricConfigNode = GaugeMetricConfigNode;
8942
- exports2.GaugeMetricConfigNode = GaugeMetricConfigNode = __decorate([
8943
- (0, NodeDescriptionDecorator_1.NodeDescription)({
8944
- id: "GaugeMetricConfigNode",
8945
- name: "Gauge Metric Config Node",
8946
- group: "config",
8947
- sourceFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "GaugeMetricConfigNode.html",
8948
- package: "@theotherwillembotha/node-red-plugincore",
8949
- templates: [
8950
- { template: MetricsTemplate_1.MetricsTemplate, config: {} }
8951
- ],
8952
- dependencies: [MetricsService_1.MetricsService],
8953
- tags: ["Core", "Metric"]
8954
- }),
8955
- __metadata("design:paramtypes", [Object, Object])
8956
- ], GaugeMetricConfigNode);
8961
+ exports2.CounterMetricTemplate = CounterMetricTemplate;
8962
+ exports2.CounterMetricTemplate = CounterMetricTemplate = __decorate([
8963
+ (0, TemplateDescriptionDecorator_1.TemplateDescription)({
8964
+ name: "countermetric",
8965
+ templateFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "CounterMetricTemplate.html",
8966
+ dependencies: [DelegatedConfigReferenceNode_1.DelegatedConfigReferenceNode, MetricsService_1.MetricsService, ConfigFragmentTemplate_1.ConfigFragmentTemplate]
8967
+ })
8968
+ ], CounterMetricTemplate);
8957
8969
  }
8958
8970
  });
8959
8971
 
@@ -8972,7 +8984,9 @@ var require_GaugeMetricTemplate = __commonJS({
8972
8984
  var NodeGenerator_1 = require_NodeGenerator();
8973
8985
  var NodeConstructor_1 = require_NodeConstructor();
8974
8986
  var TemplateDescriptionDecorator_1 = require_TemplateDescriptionDecorator();
8975
- var GaugeMetricConfigNode_1 = require_GaugeMetricConfigNode();
8987
+ var MetricsService_1 = require_MetricsService();
8988
+ var DelegatedConfigReferenceNode_1 = require_DelegatedConfigReferenceNode();
8989
+ var ConfigFragmentTemplate_1 = require_ConfigFragmentTemplate();
8976
8990
  var GaugeMetricTemplate = class GaugeMetricTemplate extends NodeConstructor_1.Template {
8977
8991
  };
8978
8992
  exports2.GaugeMetricTemplate = GaugeMetricTemplate;
@@ -8980,7 +8994,7 @@ var require_GaugeMetricTemplate = __commonJS({
8980
8994
  (0, TemplateDescriptionDecorator_1.TemplateDescription)({
8981
8995
  name: "gaugemetric",
8982
8996
  templateFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "GaugeMetricTemplate.html",
8983
- dependencies: [GaugeMetricConfigNode_1.GaugeMetricConfigNode]
8997
+ dependencies: [DelegatedConfigReferenceNode_1.DelegatedConfigReferenceNode, MetricsService_1.MetricsService, ConfigFragmentTemplate_1.ConfigFragmentTemplate]
8984
8998
  })
8985
8999
  ], GaugeMetricTemplate);
8986
9000
  }
@@ -9000,253 +9014,10 @@ var require_MetricsConfigNode = __commonJS({
9000
9014
  MetricsService_1.MetricsService.register(config.id, { id: config.id }, () => this.createContainer({ id: config.id }));
9001
9015
  }
9002
9016
  metrics() {
9003
- return MetricsService_1.MetricsService.get({ metricsEnabled: true, metricsReference: this.id() });
9004
- }
9005
- };
9006
- exports2.MetricsConfigNode = MetricsConfigNode;
9007
- }
9008
- });
9009
-
9010
- // ../nodered_plugincore/build/core/metrics/MetricsDecorator.js
9011
- var require_MetricsDecorator = __commonJS({
9012
- "../nodered_plugincore/build/core/metrics/MetricsDecorator.js"(exports2) {
9013
- "use strict";
9014
- Object.defineProperty(exports2, "__esModule", { value: true });
9015
- exports2.MetricCollectorType = exports2.MetricType = void 0;
9016
- exports2.Metrics = Metrics;
9017
- var NodeConstructor_1 = require_NodeConstructor();
9018
- var MetricsService_1 = require_MetricsService();
9019
- var MetricType;
9020
- (function(MetricType2) {
9021
- MetricType2["Counter"] = "Counter";
9022
- MetricType2["Timer"] = "Timer";
9023
- MetricType2["Gauge"] = "Gauge";
9024
- })(MetricType || (exports2.MetricType = MetricType = {}));
9025
- var MetricCollectorType;
9026
- (function(MetricCollectorType2) {
9027
- MetricCollectorType2["histogram"] = "histogram";
9028
- MetricCollectorType2["summary"] = "summary";
9029
- })(MetricCollectorType || (exports2.MetricCollectorType = MetricCollectorType = {}));
9030
- function resolveMetric(node, metricsConfig, _metrics) {
9031
- const nde = {
9032
- id: node.id(),
9033
- name: node.name(),
9034
- flow: node.flow(),
9035
- type: node.type()
9036
- };
9037
- if (metricsConfig.type === MetricType.Counter) {
9038
- if (!_metrics.supports(MetricsService_1.MetricCapability.Counter)) {
9039
- console.warn(`[PluginCore] @Metrics Counter requested by node "${node.name()}" (${node.type()}) but the selected provider does not support Counter. Using DoNothing.`);
9040
- }
9041
- const counterConfig = {
9042
- metricname: metricsConfig.name,
9043
- metricdescription: metricsConfig.description,
9044
- node: nde
9045
- };
9046
- return _metrics.counter(counterConfig);
9047
- }
9048
- if (metricsConfig.type === MetricType.Gauge) {
9049
- if (!_metrics.supports(MetricsService_1.MetricCapability.Gauge)) {
9050
- console.warn(`[PluginCore] @Metrics Gauge requested by node "${node.name()}" (${node.type()}) but the selected provider does not support Gauge. Using DoNothing.`);
9051
- }
9052
- const gaugeConfig = {
9053
- metricname: metricsConfig.name,
9054
- metricdescription: metricsConfig.description,
9055
- node: nde
9056
- };
9057
- return _metrics.gauge(gaugeConfig);
9058
- }
9059
- if (metricsConfig.type === MetricType.Timer) {
9060
- if (metricsConfig.collector === MetricCollectorType.histogram) {
9061
- if (!_metrics.supports(MetricsService_1.MetricCapability.Histogram)) {
9062
- console.warn(`[PluginCore] @Metrics Histogram requested by node "${node.name()}" (${node.type()}) but the selected provider does not support Histogram. Using DoNothing.`);
9063
- }
9064
- if (metricsConfig.buckettype === MetricsService_1.BucketType.default) {
9065
- const histogramConfig = {
9066
- metricname: metricsConfig.name,
9067
- metricdescription: metricsConfig.description,
9068
- buckettype: metricsConfig.buckettype,
9069
- bucketconfig: {},
9070
- node: nde
9071
- };
9072
- return _metrics.histogram(histogramConfig);
9073
- }
9074
- }
9075
- if (metricsConfig.collector === MetricCollectorType.summary) {
9076
- if (!_metrics.supports(MetricsService_1.MetricCapability.Summary)) {
9077
- console.warn(`[PluginCore] @Metrics Summary requested by node "${node.name()}" (${node.type()}) but the selected provider does not support Summary. Using DoNothing.`);
9078
- }
9079
- }
9080
- }
9081
- console.error("[PluginCore] @Metrics: no factory matched for config", metricsConfig);
9082
- return void 0;
9083
- }
9084
- function resolveContainer(metricsReference) {
9085
- if (!metricsReference)
9086
- return new MetricsService_1.DoNothingMetricsContainer();
9087
- const refNode = NodeConstructor_1.NodeManager.RED.nodes.getNode(metricsReference);
9088
- return refNode ? refNode.node().metrics() : new MetricsService_1.DoNothingMetricsContainer();
9089
- }
9090
- function dudForType(metricsConfig) {
9091
- if (metricsConfig.type === MetricType.Counter)
9092
- return new MetricsService_1.DoNothingCounterMetric();
9093
- if (metricsConfig.type === MetricType.Gauge)
9094
- return new MetricsService_1.DoNothingGaugeMetric();
9095
- if (metricsConfig.type === MetricType.Timer) {
9096
- if (metricsConfig.collector === MetricCollectorType.histogram)
9097
- return new MetricsService_1.DoNothingHistogramMetric();
9098
- if (metricsConfig.collector === MetricCollectorType.summary)
9099
- return new MetricsService_1.DoNothingSummaryMetric();
9100
- }
9101
- return void 0;
9102
- }
9103
- function Metrics(metricsConfig) {
9104
- return function(target, propertyKey) {
9105
- if (typeof propertyKey === "string") {
9106
- const valueSymbol = Symbol(`_${String(propertyKey)}_value`);
9107
- Object.defineProperty(target, propertyKey, {
9108
- get: function() {
9109
- if (this[valueSymbol])
9110
- return this[valueSymbol];
9111
- const node = this;
9112
- const config = node.config();
9113
- if (config.metricsEnabled) {
9114
- const _metrics = resolveContainer(config.metricsReference);
9115
- this[valueSymbol] = resolveMetric(node, metricsConfig, _metrics);
9116
- } else {
9117
- this[valueSymbol] = dudForType(metricsConfig);
9118
- }
9119
- return this[valueSymbol];
9120
- },
9121
- enumerable: true,
9122
- configurable: false
9123
- });
9124
- } else {
9125
- let property = propertyKey;
9126
- property.addInitializer(function() {
9127
- const node = this;
9128
- const valueSymbol = Symbol(`_${String(property.name)}_value`);
9129
- Object.defineProperty(node, property.name, {
9130
- get: function() {
9131
- if (this[valueSymbol])
9132
- return this[valueSymbol];
9133
- const config = node.config();
9134
- if (config.metricsEnabled) {
9135
- const _metrics = resolveContainer(config.metricsReference);
9136
- this[valueSymbol] = resolveMetric(node, metricsConfig, _metrics);
9137
- } else {
9138
- this[valueSymbol] = dudForType(metricsConfig);
9139
- }
9140
- return this[valueSymbol];
9141
- },
9142
- enumerable: true,
9143
- configurable: false
9144
- });
9145
- });
9146
- }
9147
- };
9148
- }
9149
- }
9150
- });
9151
-
9152
- // ../nodered_plugincore/build/core/metrics/node/TimerMetricConfigNode.js
9153
- var require_TimerMetricConfigNode = __commonJS({
9154
- "../nodered_plugincore/build/core/metrics/node/TimerMetricConfigNode.js"(exports2) {
9155
- "use strict";
9156
- var __decorate = exports2 && exports2.__decorate || function(decorators, target, key, desc) {
9157
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
9158
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
9159
- 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;
9160
- return c > 3 && r && Object.defineProperty(target, key, r), r;
9161
- };
9162
- var __metadata = exports2 && exports2.__metadata || function(k, v) {
9163
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9164
- };
9165
- Object.defineProperty(exports2, "__esModule", { value: true });
9166
- exports2.TimerMetricConfigNode = void 0;
9167
- var NodeConstructor_1 = require_NodeConstructor();
9168
- var MetricsService_1 = require_MetricsService();
9169
- var NodeGenerator_1 = require_NodeGenerator();
9170
- var MetricsTemplate_1 = require_MetricsTemplate();
9171
- var MetricsDecorator_1 = require_MetricsDecorator();
9172
- var NodeDescriptionDecorator_1 = require_NodeDescriptionDecorator();
9173
- var TimerMetricConfigNode = class TimerMetricConfigNode extends NodeConstructor_1.ConfigNode {
9174
- constructor(node, config) {
9175
- super(node, config);
9176
- const refNode = config.metricsEnabled && config.metricsReference ? NodeConstructor_1.NodeManager.RED.nodes.getNode(config.metricsReference) : null;
9177
- this._metrics = refNode ? refNode.node().metrics() : new MetricsService_1.DoNothingMetricsContainer();
9178
- const bucketConfig = {};
9179
- switch (config.buckettype) {
9180
- case MetricsService_1.BucketType.manual:
9181
- bucketConfig.intervals = config.buckettype_manual_intervals.split(",").map((i) => Number.parseFloat(i.trim()));
9182
- break;
9183
- case MetricsService_1.BucketType.linear:
9184
- bucketConfig.start = config.buckettype_linear_start;
9185
- bucketConfig.interval = config.buckettype_linear_interval;
9186
- bucketConfig.count = config.buckettype_linear_count;
9187
- break;
9188
- case MetricsService_1.BucketType.exponential:
9189
- bucketConfig.start = config.buckettype_exponential_start;
9190
- bucketConfig.factor = config.buckettype_exponential_factor;
9191
- bucketConfig.count = config.buckettype_exponential_count;
9192
- break;
9193
- default:
9194
- break;
9195
- }
9196
- if (config.metricType === MetricsDecorator_1.MetricCollectorType.histogram) {
9197
- const timerConfig = {
9198
- node: {
9199
- id: this.id(),
9200
- name: this.name(),
9201
- flow: this.flow(),
9202
- type: this.type()
9203
- },
9204
- buckettype: config.buckettype,
9205
- bucketconfig: bucketConfig,
9206
- metricname: config.name,
9207
- metricdescription: config.description
9208
- };
9209
- this._timer = this._metrics.histogram(timerConfig);
9210
- }
9211
- if (config.metricType === MetricsDecorator_1.MetricCollectorType.summary) {
9212
- const timerConfig = {
9213
- node: {
9214
- id: this.id(),
9215
- name: this.name(),
9216
- flow: this.flow(),
9217
- type: this.type()
9218
- },
9219
- percentileType: config.percentiletype,
9220
- percentileConfig: config.percentiletype_manual_intervals,
9221
- metricname: config.name,
9222
- metricdescription: config.description
9223
- };
9224
- this._timer = this._metrics.summary(timerConfig);
9225
- }
9226
- }
9227
- metrics() {
9228
- return this._metrics;
9229
- }
9230
- timer() {
9231
- return this._timer;
9232
- }
9233
- };
9234
- exports2.TimerMetricConfigNode = TimerMetricConfigNode;
9235
- exports2.TimerMetricConfigNode = TimerMetricConfigNode = __decorate([
9236
- (0, NodeDescriptionDecorator_1.NodeDescription)({
9237
- id: "TimerMetricConfigNode",
9238
- name: "Timer Metric Config Node",
9239
- group: "config",
9240
- sourceFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "TimerMetricConfigNode.html",
9241
- package: "@theotherwillembotha/node-red-plugincore",
9242
- templates: [
9243
- { template: MetricsTemplate_1.MetricsTemplate, config: { isConfigNode: true } }
9244
- ],
9245
- dependencies: [MetricsService_1.MetricsService],
9246
- tags: ["Core", "Metric"]
9247
- }),
9248
- __metadata("design:paramtypes", [Object, Object])
9249
- ], TimerMetricConfigNode);
9017
+ return MetricsService_1.MetricsService.get({ metricsEnabled: true, metricsReference: this.id() });
9018
+ }
9019
+ };
9020
+ exports2.MetricsConfigNode = MetricsConfigNode;
9250
9021
  }
9251
9022
  });
9252
9023
 
@@ -9265,7 +9036,9 @@ var require_TimerMetricTemplate = __commonJS({
9265
9036
  var NodeGenerator_1 = require_NodeGenerator();
9266
9037
  var NodeConstructor_1 = require_NodeConstructor();
9267
9038
  var TemplateDescriptionDecorator_1 = require_TemplateDescriptionDecorator();
9268
- var TimerMetricConfigNode_1 = require_TimerMetricConfigNode();
9039
+ var MetricsService_1 = require_MetricsService();
9040
+ var DelegatedConfigReferenceNode_1 = require_DelegatedConfigReferenceNode();
9041
+ var ConfigFragmentTemplate_1 = require_ConfigFragmentTemplate();
9269
9042
  var TimerMetricTemplate = class TimerMetricTemplate extends NodeConstructor_1.Template {
9270
9043
  };
9271
9044
  exports2.TimerMetricTemplate = TimerMetricTemplate;
@@ -9273,7 +9046,7 @@ var require_TimerMetricTemplate = __commonJS({
9273
9046
  (0, TemplateDescriptionDecorator_1.TemplateDescription)({
9274
9047
  name: "timermetric",
9275
9048
  templateFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "TimerMetricTemplate.html",
9276
- dependencies: [TimerMetricConfigNode_1.TimerMetricConfigNode]
9049
+ dependencies: [DelegatedConfigReferenceNode_1.DelegatedConfigReferenceNode, MetricsService_1.MetricsService, ConfigFragmentTemplate_1.ConfigFragmentTemplate]
9277
9050
  })
9278
9051
  ], TimerMetricTemplate);
9279
9052
  }
@@ -9724,16 +9497,53 @@ var require_UIHelperTemplate = __commonJS({
9724
9497
  var require_ScriptEditorTemplate = __commonJS({
9725
9498
  "../nodered_plugincore/build/core/ui/template/ScriptEditorTemplate.js"(exports2) {
9726
9499
  "use strict";
9500
+ var __createBinding = exports2 && exports2.__createBinding || (Object.create ? (function(o, m, k, k2) {
9501
+ if (k2 === void 0) k2 = k;
9502
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9503
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9504
+ desc = { enumerable: true, get: function() {
9505
+ return m[k];
9506
+ } };
9507
+ }
9508
+ Object.defineProperty(o, k2, desc);
9509
+ }) : (function(o, m, k, k2) {
9510
+ if (k2 === void 0) k2 = k;
9511
+ o[k2] = m[k];
9512
+ }));
9513
+ var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? (function(o, v) {
9514
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
9515
+ }) : function(o, v) {
9516
+ o["default"] = v;
9517
+ });
9727
9518
  var __decorate = exports2 && exports2.__decorate || function(decorators, target, key, desc) {
9728
9519
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
9729
9520
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
9730
9521
  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;
9731
9522
  return c > 3 && r && Object.defineProperty(target, key, r), r;
9732
9523
  };
9524
+ var __importStar = exports2 && exports2.__importStar || /* @__PURE__ */ (function() {
9525
+ var ownKeys = function(o) {
9526
+ ownKeys = Object.getOwnPropertyNames || function(o2) {
9527
+ var ar = [];
9528
+ for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k;
9529
+ return ar;
9530
+ };
9531
+ return ownKeys(o);
9532
+ };
9533
+ return function(mod) {
9534
+ if (mod && mod.__esModule) return mod;
9535
+ var result = {};
9536
+ if (mod != null) {
9537
+ for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
9538
+ }
9539
+ __setModuleDefault(result, mod);
9540
+ return result;
9541
+ };
9542
+ })();
9733
9543
  Object.defineProperty(exports2, "__esModule", { value: true });
9734
9544
  exports2.ScriptEditorTemplate = void 0;
9545
+ var path = __importStar(require("path"));
9735
9546
  var NodeConstructor_1 = require_NodeConstructor();
9736
- var NodeGenerator_1 = require_NodeGenerator();
9737
9547
  var TemplateDescriptionDecorator_1 = require_TemplateDescriptionDecorator();
9738
9548
  var ScriptEditorTemplate = class ScriptEditorTemplate extends NodeConstructor_1.Template {
9739
9549
  };
@@ -9741,7 +9551,7 @@ var require_ScriptEditorTemplate = __commonJS({
9741
9551
  exports2.ScriptEditorTemplate = ScriptEditorTemplate = __decorate([
9742
9552
  (0, TemplateDescriptionDecorator_1.TemplateDescription)({
9743
9553
  name: "script-editor",
9744
- templateFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "ScriptEditorTemplate.html"
9554
+ templateFile: path.join(__dirname, "ScriptEditorTemplate.html")
9745
9555
  })
9746
9556
  ], ScriptEditorTemplate);
9747
9557
  }
@@ -9784,93 +9594,6 @@ var require_InputService = __commonJS({
9784
9594
  }
9785
9595
  });
9786
9596
 
9787
- // ../nodered_plugincore/build/core/other/service/SettingsService.js
9788
- var require_SettingsService = __commonJS({
9789
- "../nodered_plugincore/build/core/other/service/SettingsService.js"(exports2) {
9790
- "use strict";
9791
- var __decorate = exports2 && exports2.__decorate || function(decorators, target, key, desc) {
9792
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
9793
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
9794
- 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;
9795
- return c > 3 && r && Object.defineProperty(target, key, r), r;
9796
- };
9797
- var __metadata = exports2 && exports2.__metadata || function(k, v) {
9798
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9799
- };
9800
- Object.defineProperty(exports2, "__esModule", { value: true });
9801
- exports2.Settings = exports2.SettingsService = void 0;
9802
- var NodeConstructor_1 = require_NodeConstructor();
9803
- var ServiceDescriptionDecorator_1 = require_ServiceDescriptionDecorator();
9804
- var SettingsService = class SettingsService extends NodeConstructor_1.BaseService {
9805
- static create(node, config) {
9806
- let settings = NodeConstructor_1.NodeManager.RED.settings.get("NodeSettings_" + config.id);
9807
- if (settings === void 0) {
9808
- settings = {};
9809
- }
9810
- return new Settings(settings, config);
9811
- }
9812
- constructor() {
9813
- super("SettingsService");
9814
- }
9815
- init(red) {
9816
- red.httpAdmin.post("/utils/getNodeSettings", red.auth.needsPermission("inject.write"), async function(request, response) {
9817
- let config = request.body;
9818
- let settings = red.settings.get("NodeSettings_" + config.nodeId);
9819
- response.send({
9820
- status: "ok",
9821
- settings
9822
- });
9823
- });
9824
- }
9825
- deinit(red) {
9826
- red.httpAdmin.post("/utils/getNodeSettings", red.auth.needsPermission("inject.write"), async function(request, response) {
9827
- response.status(404);
9828
- });
9829
- }
9830
- };
9831
- exports2.SettingsService = SettingsService;
9832
- exports2.SettingsService = SettingsService = __decorate([
9833
- (0, ServiceDescriptionDecorator_1.ServiceDescription)({
9834
- id: "@theotherwillembotha/settingsservice",
9835
- sourceFile: "@theotherwillembotha/node-red-plugincore"
9836
- }),
9837
- __metadata("design:paramtypes", [])
9838
- ], SettingsService);
9839
- var Settings = class {
9840
- constructor(settings, config) {
9841
- this._settings = settings;
9842
- this._config = config;
9843
- if (!this.hasChanged()) {
9844
- Object.keys(this._settings).forEach((key) => this._config[key] = this._settings[key]);
9845
- }
9846
- }
9847
- value(key) {
9848
- return this._settings[key];
9849
- }
9850
- values() {
9851
- return this._settings;
9852
- }
9853
- update(key, value) {
9854
- this._settings[key] = value;
9855
- }
9856
- updateAll(value) {
9857
- this._settings = value;
9858
- }
9859
- // the settings are considdered changed if the settingsTimestamp value is different;
9860
- hasChanged() {
9861
- return this._settings.settingsTimestamp !== this._config.settingsTimestamp;
9862
- }
9863
- persist() {
9864
- NodeConstructor_1.NodeManager.RED.settings.set("NodeSettings_" + this._config.id, this._settings);
9865
- }
9866
- delete() {
9867
- NodeConstructor_1.NodeManager.RED.settings.delete("NodeSettings_" + this._config.id);
9868
- }
9869
- };
9870
- exports2.Settings = Settings;
9871
- }
9872
- });
9873
-
9874
9597
  // ../nodered_plugincore/build/core/other/template/BasicTemplate.js
9875
9598
  var require_BasicTemplate = __commonJS({
9876
9599
  "../nodered_plugincore/build/core/other/template/BasicTemplate.js"(exports2) {
@@ -9898,35 +9621,6 @@ var require_BasicTemplate = __commonJS({
9898
9621
  }
9899
9622
  });
9900
9623
 
9901
- // ../nodered_plugincore/build/core/other/template/SettingsTemplate.js
9902
- var require_SettingsTemplate = __commonJS({
9903
- "../nodered_plugincore/build/core/other/template/SettingsTemplate.js"(exports2) {
9904
- "use strict";
9905
- var __decorate = exports2 && exports2.__decorate || function(decorators, target, key, desc) {
9906
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
9907
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
9908
- 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;
9909
- return c > 3 && r && Object.defineProperty(target, key, r), r;
9910
- };
9911
- Object.defineProperty(exports2, "__esModule", { value: true });
9912
- exports2.SettingsTemplate = void 0;
9913
- var NodeConstructor_1 = require_NodeConstructor();
9914
- var NodeGenerator_1 = require_NodeGenerator();
9915
- var TemplateDescriptionDecorator_1 = require_TemplateDescriptionDecorator();
9916
- var SettingsService_1 = require_SettingsService();
9917
- var SettingsTemplate = class SettingsTemplate extends NodeConstructor_1.Template {
9918
- };
9919
- exports2.SettingsTemplate = SettingsTemplate;
9920
- exports2.SettingsTemplate = SettingsTemplate = __decorate([
9921
- (0, TemplateDescriptionDecorator_1.TemplateDescription)({
9922
- name: "settings",
9923
- templateFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "SettingsTemplate.html",
9924
- dependencies: [SettingsService_1.SettingsService]
9925
- })
9926
- ], SettingsTemplate);
9927
- }
9928
- });
9929
-
9930
9624
  // ../nodered_plugincore/node_modules/ms/index.js
9931
9625
  var require_ms = __commonJS({
9932
9626
  "../nodered_plugincore/node_modules/ms/index.js"(exports2, module2) {
@@ -34003,6 +33697,148 @@ var require_LoggerDecorator = __commonJS({
34003
33697
  }
34004
33698
  });
34005
33699
 
33700
+ // ../nodered_plugincore/build/core/metrics/MetricsDecorator.js
33701
+ var require_MetricsDecorator = __commonJS({
33702
+ "../nodered_plugincore/build/core/metrics/MetricsDecorator.js"(exports2) {
33703
+ "use strict";
33704
+ Object.defineProperty(exports2, "__esModule", { value: true });
33705
+ exports2.MetricCollectorType = exports2.MetricType = void 0;
33706
+ exports2.Metrics = Metrics;
33707
+ var NodeConstructor_1 = require_NodeConstructor();
33708
+ var MetricsService_1 = require_MetricsService();
33709
+ var MetricType;
33710
+ (function(MetricType2) {
33711
+ MetricType2["Counter"] = "Counter";
33712
+ MetricType2["Timer"] = "Timer";
33713
+ MetricType2["Gauge"] = "Gauge";
33714
+ })(MetricType || (exports2.MetricType = MetricType = {}));
33715
+ var MetricCollectorType;
33716
+ (function(MetricCollectorType2) {
33717
+ MetricCollectorType2["histogram"] = "histogram";
33718
+ MetricCollectorType2["summary"] = "summary";
33719
+ })(MetricCollectorType || (exports2.MetricCollectorType = MetricCollectorType = {}));
33720
+ function resolveMetric(node, metricsConfig, _metrics) {
33721
+ const baseConfig = {
33722
+ id: `${node.id()}_${metricsConfig.name}`,
33723
+ flow: node.flow(),
33724
+ name: node.name(),
33725
+ description: metricsConfig.description || void 0
33726
+ };
33727
+ if (metricsConfig.type === MetricType.Counter) {
33728
+ if (!_metrics.supports(MetricsService_1.MetricCapability.Counter)) {
33729
+ console.warn(`[PluginCore] @Metrics Counter requested by node "${node.name()}" (${node.type()}) but the selected provider does not support Counter. Using DoNothing.`);
33730
+ }
33731
+ const counterConfig = {
33732
+ ...baseConfig,
33733
+ type: node.type(),
33734
+ metric: metricsConfig.name
33735
+ };
33736
+ return _metrics.counter(counterConfig);
33737
+ }
33738
+ if (metricsConfig.type === MetricType.Gauge) {
33739
+ if (!_metrics.supports(MetricsService_1.MetricCapability.Gauge)) {
33740
+ console.warn(`[PluginCore] @Metrics Gauge requested by node "${node.name()}" (${node.type()}) but the selected provider does not support Gauge. Using DoNothing.`);
33741
+ }
33742
+ const gaugeConfig = {
33743
+ ...baseConfig,
33744
+ type: node.type(),
33745
+ metric: metricsConfig.name
33746
+ };
33747
+ return _metrics.gauge(gaugeConfig);
33748
+ }
33749
+ if (metricsConfig.type === MetricType.Timer) {
33750
+ if (metricsConfig.collector === MetricCollectorType.histogram) {
33751
+ if (!_metrics.supports(MetricsService_1.MetricCapability.Histogram)) {
33752
+ console.warn(`[PluginCore] @Metrics Histogram requested by node "${node.name()}" (${node.type()}) but the selected provider does not support Histogram. Using DoNothing.`);
33753
+ }
33754
+ if (metricsConfig.buckettype === MetricsService_1.BucketType.default) {
33755
+ const histogramConfig = {
33756
+ ...baseConfig,
33757
+ type: node.type(),
33758
+ metric: metricsConfig.name,
33759
+ buckettype: metricsConfig.buckettype,
33760
+ bucketconfig: {}
33761
+ };
33762
+ return _metrics.histogram(histogramConfig);
33763
+ }
33764
+ }
33765
+ if (metricsConfig.collector === MetricCollectorType.summary) {
33766
+ if (!_metrics.supports(MetricsService_1.MetricCapability.Summary)) {
33767
+ console.warn(`[PluginCore] @Metrics Summary requested by node "${node.name()}" (${node.type()}) but the selected provider does not support Summary. Using DoNothing.`);
33768
+ }
33769
+ }
33770
+ }
33771
+ console.error("[PluginCore] @Metrics: no factory matched for config", metricsConfig);
33772
+ return void 0;
33773
+ }
33774
+ function resolveContainer(metricsReference) {
33775
+ if (!metricsReference)
33776
+ return new MetricsService_1.DoNothingMetricsContainer();
33777
+ const refNode = NodeConstructor_1.NodeManager.RED.nodes.getNode(metricsReference);
33778
+ return refNode ? refNode.node().metrics() : new MetricsService_1.DoNothingMetricsContainer();
33779
+ }
33780
+ function dudForType(metricsConfig) {
33781
+ if (metricsConfig.type === MetricType.Counter)
33782
+ return new MetricsService_1.DoNothingCounterMetric();
33783
+ if (metricsConfig.type === MetricType.Gauge)
33784
+ return new MetricsService_1.DoNothingGaugeMetric();
33785
+ if (metricsConfig.type === MetricType.Timer) {
33786
+ if (metricsConfig.collector === MetricCollectorType.histogram)
33787
+ return new MetricsService_1.DoNothingHistogramMetric();
33788
+ if (metricsConfig.collector === MetricCollectorType.summary)
33789
+ return new MetricsService_1.DoNothingSummaryMetric();
33790
+ }
33791
+ return void 0;
33792
+ }
33793
+ function Metrics(metricsConfig) {
33794
+ return function(target, propertyKey) {
33795
+ if (typeof propertyKey === "string") {
33796
+ const valueSymbol = Symbol(`_${String(propertyKey)}_value`);
33797
+ Object.defineProperty(target, propertyKey, {
33798
+ get: function() {
33799
+ if (this[valueSymbol])
33800
+ return this[valueSymbol];
33801
+ const node = this;
33802
+ const config = node.config();
33803
+ if (config.metricsEnabled) {
33804
+ const _metrics = resolveContainer(config.metricsReference);
33805
+ this[valueSymbol] = resolveMetric(node, metricsConfig, _metrics);
33806
+ } else {
33807
+ this[valueSymbol] = dudForType(metricsConfig);
33808
+ }
33809
+ return this[valueSymbol];
33810
+ },
33811
+ enumerable: true,
33812
+ configurable: false
33813
+ });
33814
+ } else {
33815
+ let property = propertyKey;
33816
+ property.addInitializer(function() {
33817
+ const node = this;
33818
+ const valueSymbol = Symbol(`_${String(property.name)}_value`);
33819
+ Object.defineProperty(node, property.name, {
33820
+ get: function() {
33821
+ if (this[valueSymbol])
33822
+ return this[valueSymbol];
33823
+ const config = node.config();
33824
+ if (config.metricsEnabled) {
33825
+ const _metrics = resolveContainer(config.metricsReference);
33826
+ this[valueSymbol] = resolveMetric(node, metricsConfig, _metrics);
33827
+ } else {
33828
+ this[valueSymbol] = dudForType(metricsConfig);
33829
+ }
33830
+ return this[valueSymbol];
33831
+ },
33832
+ enumerable: true,
33833
+ configurable: false
33834
+ });
33835
+ });
33836
+ }
33837
+ };
33838
+ }
33839
+ }
33840
+ });
33841
+
34006
33842
  // ../nodered_plugincore/build/core/webhook/WebhookDecorator.js
34007
33843
  var require_WebhookDecorator = __commonJS({
34008
33844
  "../nodered_plugincore/build/core/webhook/WebhookDecorator.js"(exports2) {
@@ -34017,6 +33853,72 @@ var require_WebhookDecorator = __commonJS({
34017
33853
  var NodeConstructor_1 = require_NodeConstructor();
34018
33854
  var ReverseProxyTypeService_1 = require_ReverseProxyTypeService();
34019
33855
  var managedProxyHosts = /* @__PURE__ */ new Map();
33856
+ var PROXY_RETRY_ATTEMPTS = 5;
33857
+ var PROXY_RETRY_INTERVAL_MS = 2e3;
33858
+ function delay(ms) {
33859
+ return new Promise((resolve) => setTimeout(resolve, ms));
33860
+ }
33861
+ function resolveProxyNode(proxyId) {
33862
+ let rawNode = NodeConstructor_1.NodeManager.RED.nodes.getNode(proxyId);
33863
+ return rawNode ? rawNode.node() : null;
33864
+ }
33865
+ async function resolveProxyNodeWithRetry(proxyId) {
33866
+ for (let attempt = 1; attempt <= PROXY_RETRY_ATTEMPTS; attempt++) {
33867
+ let resolved = resolveProxyNode(proxyId);
33868
+ if (resolved)
33869
+ return resolved;
33870
+ if (attempt < PROXY_RETRY_ATTEMPTS) {
33871
+ console.warn(`Reverse proxy config node "${proxyId}" not available yet (attempt ${attempt}/${PROXY_RETRY_ATTEMPTS}), retrying in ${PROXY_RETRY_INTERVAL_MS}ms...`);
33872
+ await delay(PROXY_RETRY_INTERVAL_MS);
33873
+ }
33874
+ }
33875
+ console.error(`Reverse proxy config node "${proxyId}" not available after ${PROXY_RETRY_ATTEMPTS} attempts \u2014 giving up.`);
33876
+ return null;
33877
+ }
33878
+ async function setupReverseProxies(nodeConfig, webhookServer) {
33879
+ let targetPort = webhookServer.config().port;
33880
+ let targetHost = os_1.default.hostname();
33881
+ let nodeId = nodeConfig.id;
33882
+ let newlyManaged = [];
33883
+ await Promise.all(nodeConfig.reverseProxies_connections.map(async (proxy) => {
33884
+ try {
33885
+ let reverseProxyNode = await resolveProxyNodeWithRetry(proxy.proxy);
33886
+ if (!reverseProxyNode)
33887
+ return;
33888
+ let proxyClient = reverseProxyNode.client();
33889
+ let hosts = await proxyClient.getHosts();
33890
+ let matchingHost = hosts.find((h) => h.domainNames?.includes(proxy.domainname));
33891
+ if (!matchingHost) {
33892
+ await proxyClient.updateHost({ domainNames: [proxy.domainname], forwardHost: targetHost, forwardPort: targetPort, scheme: ReverseProxyTypeService_1.HTTPScheme.HTTP });
33893
+ let updatedHosts = await proxyClient.getHosts();
33894
+ matchingHost = updatedHosts.find((h) => h.domainNames?.includes(proxy.domainname));
33895
+ } else if (matchingHost.forwardHost !== targetHost || matchingHost.forwardPort !== targetPort) {
33896
+ await proxyClient.updateHost({ id: matchingHost.id, forwardHost: targetHost, forwardPort: targetPort, scheme: ReverseProxyTypeService_1.HTTPScheme.HTTP });
33897
+ }
33898
+ if (matchingHost?.id !== void 0) {
33899
+ newlyManaged.push({ proxyNodeId: proxy.proxy, hostId: matchingHost.id });
33900
+ }
33901
+ } catch (e) {
33902
+ console.error(e);
33903
+ }
33904
+ }));
33905
+ let previouslyManaged = managedProxyHosts.get(nodeId) ?? [];
33906
+ let newHostIds = new Set(newlyManaged.map((m) => m.hostId));
33907
+ await Promise.all(previouslyManaged.filter((m) => !newHostIds.has(m.hostId)).map(async (stale) => {
33908
+ try {
33909
+ let reverseProxyNode = resolveProxyNode(stale.proxyNodeId);
33910
+ if (!reverseProxyNode) {
33911
+ console.warn(`Stale reverse proxy config node "${stale.proxyNodeId}" not found \u2014 skipping cleanup.`);
33912
+ return;
33913
+ }
33914
+ let proxyClient = reverseProxyNode.client();
33915
+ await proxyClient.deleteHost(stale.hostId);
33916
+ } catch (e) {
33917
+ console.error(e);
33918
+ }
33919
+ }));
33920
+ managedProxyHosts.set(nodeId, newlyManaged);
33921
+ }
34020
33922
  var Webhook = (0, NodeConstructor_1.createPostConstructDecorator)("Webhook").withInitLogic(async (instance, propertyKey, webhookconfig) => {
34021
33923
  let node = instance;
34022
33924
  let nodeConfig = node.config();
@@ -34029,42 +33931,7 @@ var require_WebhookDecorator = __commonJS({
34029
33931
  let webhookServer = NodeConstructor_1.NodeManager.RED.nodes.getNode(nodeConfig.webhook).node().server();
34030
33932
  webhookServer.attach(endpointConfig, (request, respponse) => instance[propertyKey](request, respponse));
34031
33933
  if (nodeConfig.reverseProxies_enabled) {
34032
- let targetPort = webhookServer.config().port;
34033
- let targetHost = os_1.default.hostname();
34034
- let nodeId = nodeConfig.id;
34035
- let newlyManaged = [];
34036
- await Promise.all(nodeConfig.reverseProxies_connections.map(async (proxy) => {
34037
- try {
34038
- let reverseProxyNode = NodeConstructor_1.NodeManager.RED.nodes.getNode(proxy.proxy).node();
34039
- let proxyClient = reverseProxyNode.client();
34040
- let hosts = await proxyClient.getHosts();
34041
- let matchingHost = hosts.find((h) => h.domainNames?.includes(proxy.domainname));
34042
- if (!matchingHost) {
34043
- await proxyClient.updateHost({ domainNames: [proxy.domainname], forwardHost: targetHost, forwardPort: targetPort, scheme: ReverseProxyTypeService_1.HTTPScheme.HTTP });
34044
- let updatedHosts = await proxyClient.getHosts();
34045
- matchingHost = updatedHosts.find((h) => h.domainNames?.includes(proxy.domainname));
34046
- } else if (matchingHost.forwardHost !== targetHost || matchingHost.forwardPort !== targetPort) {
34047
- await proxyClient.updateHost({ id: matchingHost.id, forwardHost: targetHost, forwardPort: targetPort, scheme: ReverseProxyTypeService_1.HTTPScheme.HTTP });
34048
- }
34049
- if (matchingHost?.id !== void 0) {
34050
- newlyManaged.push({ proxyNodeId: proxy.proxy, hostId: matchingHost.id });
34051
- }
34052
- } catch (e) {
34053
- console.error(e);
34054
- }
34055
- }));
34056
- let previouslyManaged = managedProxyHosts.get(nodeId) ?? [];
34057
- let newHostIds = new Set(newlyManaged.map((m) => m.hostId));
34058
- await Promise.all(previouslyManaged.filter((m) => !newHostIds.has(m.hostId)).map(async (stale) => {
34059
- try {
34060
- let reverseProxyNode = NodeConstructor_1.NodeManager.RED.nodes.getNode(stale.proxyNodeId).node();
34061
- let proxyClient = reverseProxyNode.client();
34062
- await proxyClient.deleteHost(stale.hostId);
34063
- } catch (e) {
34064
- console.error(e);
34065
- }
34066
- }));
34067
- managedProxyHosts.set(nodeId, newlyManaged);
33934
+ setupReverseProxies(nodeConfig, webhookServer);
34068
33935
  }
34069
33936
  node.node().on("close", () => {
34070
33937
  webhookServer.detach(endpointConfig);
@@ -34141,9 +34008,6 @@ var require_build = __commonJS({
34141
34008
  __exportStar(require_CounterMetricTemplate(), exports2);
34142
34009
  __exportStar(require_GaugeMetricTemplate(), exports2);
34143
34010
  __exportStar(require_MetricsConfigNode(), exports2);
34144
- __exportStar(require_CounterMetricConfigNode(), exports2);
34145
- __exportStar(require_GaugeMetricConfigNode(), exports2);
34146
- __exportStar(require_TimerMetricConfigNode(), exports2);
34147
34011
  __exportStar(require_TimerMetricTemplate(), exports2);
34148
34012
  __exportStar(require_StateService(), exports2);
34149
34013
  __exportStar(require_StateConfigNode(), exports2);
@@ -34157,9 +34021,9 @@ var require_build = __commonJS({
34157
34021
  __exportStar(require_ScriptEditorTemplate(), exports2);
34158
34022
  __exportStar(require_DelegatedConfigReferenceNode(), exports2);
34159
34023
  __exportStar(require_InputService(), exports2);
34160
- __exportStar(require_SettingsService(), exports2);
34161
34024
  __exportStar(require_BasicTemplate(), exports2);
34162
- __exportStar(require_SettingsTemplate(), exports2);
34025
+ __exportStar(require_ConfigFragmentService(), exports2);
34026
+ __exportStar(require_ConfigFragmentTemplate(), exports2);
34163
34027
  __exportStar(require_WebhookTemplate(), exports2);
34164
34028
  __exportStar(require_WebhookServerConfigNode(), exports2);
34165
34029
  __exportStar(require_WebhookServerService(), exports2);