@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/Plugins.js CHANGED
@@ -7637,6 +7637,10 @@ var require_NodeConstructor = __commonJS({
7637
7637
  if (Array.isArray(value)) {
7638
7638
  return `[${value.map((t) => this.serializeProperty(t)).join(", ")}]`;
7639
7639
  }
7640
+ if (value === null) {
7641
+ return "null";
7642
+ }
7643
+ return JSON.stringify(value);
7640
7644
  }
7641
7645
  }
7642
7646
  throw new Error(`no serializeProperty handler for ${typeof value}, ${value}`);
@@ -8490,16 +8494,19 @@ var require_MetricsService = __commonJS({
8490
8494
  constructor(config) {
8491
8495
  this._config = config;
8492
8496
  this._labels = {
8493
- flow: config.node.flow,
8494
- type: config.node.type,
8495
- name: config.node.name,
8496
- id: config.node.id,
8497
- metric: config.metricname
8497
+ type: config.type,
8498
+ id: config.id,
8499
+ metric: config.metric,
8500
+ flow: config.flow,
8501
+ name: config.name
8498
8502
  };
8499
8503
  }
8500
8504
  labels() {
8501
8505
  return this._labels;
8502
8506
  }
8507
+ static labelNames() {
8508
+ return ["flow", "type", "name", "id", "metric"];
8509
+ }
8503
8510
  config() {
8504
8511
  return this._config;
8505
8512
  }
@@ -8548,6 +8555,8 @@ var require_MetricsService = __commonJS({
8548
8555
  var DoNothingHistogramMetric = class {
8549
8556
  observe(_value) {
8550
8557
  }
8558
+ reset() {
8559
+ }
8551
8560
  subscribe(_node, _callback) {
8552
8561
  }
8553
8562
  unsubscribe(_node) {
@@ -8562,6 +8571,8 @@ var require_MetricsService = __commonJS({
8562
8571
  var DoNothingSummaryMetric = class {
8563
8572
  observe(_value) {
8564
8573
  }
8574
+ reset() {
8575
+ }
8565
8576
  subscribe(_node, _callback) {
8566
8577
  }
8567
8578
  unsubscribe(_node) {
@@ -8586,6 +8597,32 @@ var require_MetricsService = __commonJS({
8586
8597
  console.warn(`[PluginCore] MetricsContainer: Summary is not supported by this provider.`);
8587
8598
  return new DoNothingSummaryMetric();
8588
8599
  }
8600
+ /**
8601
+ * Factory method for timer metrics. Called by flow nodes with the common
8602
+ * metric config and provider-specific fragment data from the ConfigFragment UI.
8603
+ * Providers override this to interpret their own fragment data and create the
8604
+ * appropriate histogram or summary metric.
8605
+ */
8606
+ createTimer(metricConfig, fragmentData) {
8607
+ console.warn(`[PluginCore] MetricsContainer: createTimer is not supported by this provider.`);
8608
+ return new DoNothingHistogramMetric();
8609
+ }
8610
+ /**
8611
+ * Factory method for counter metrics. Called by flow nodes with the common
8612
+ * metric config and provider-specific fragment data from the ConfigFragment UI.
8613
+ */
8614
+ createCounter(metricConfig, fragmentData) {
8615
+ console.warn(`[PluginCore] MetricsContainer: createCounter is not supported by this provider.`);
8616
+ return new DoNothingCounterMetric();
8617
+ }
8618
+ /**
8619
+ * Factory method for gauge metrics. Called by flow nodes with the common
8620
+ * metric config and provider-specific fragment data from the ConfigFragment UI.
8621
+ */
8622
+ createGauge(metricConfig, fragmentData) {
8623
+ console.warn(`[PluginCore] MetricsContainer: createGauge is not supported by this provider.`);
8624
+ return new DoNothingGaugeMetric();
8625
+ }
8589
8626
  };
8590
8627
  exports2.MetricsContainer = MetricsContainer;
8591
8628
  var DoNothingMetricsContainer = class extends MetricsContainer {
@@ -8609,6 +8646,15 @@ var require_MetricsService = __commonJS({
8609
8646
  summary(_config) {
8610
8647
  return new DoNothingSummaryMetric();
8611
8648
  }
8649
+ createTimer(_metricConfig, _fragmentData) {
8650
+ return new DoNothingHistogramMetric();
8651
+ }
8652
+ createCounter(_metricConfig, _fragmentData) {
8653
+ return new DoNothingCounterMetric();
8654
+ }
8655
+ createGauge(_metricConfig, _fragmentData) {
8656
+ return new DoNothingGaugeMetric();
8657
+ }
8612
8658
  };
8613
8659
  exports2.DoNothingMetricsContainer = DoNothingMetricsContainer;
8614
8660
  var _GLOBAL_METRICS_KEY = "__plugincore_metrics__";
@@ -8694,9 +8740,9 @@ var require_MetricsTemplate = __commonJS({
8694
8740
  }
8695
8741
  });
8696
8742
 
8697
- // ../nodered_plugincore/build/core/metrics/node/CounterMetricConfigNode.js
8698
- var require_CounterMetricConfigNode = __commonJS({
8699
- "../nodered_plugincore/build/core/metrics/node/CounterMetricConfigNode.js"(exports2) {
8743
+ // ../nodered_plugincore/build/core/configfragment/service/ConfigFragmentService.js
8744
+ var require_ConfigFragmentService = __commonJS({
8745
+ "../nodered_plugincore/build/core/configfragment/service/ConfigFragmentService.js"(exports2) {
8700
8746
  "use strict";
8701
8747
  var __decorate = exports2 && exports2.__decorate || function(decorators, target, key, desc) {
8702
8748
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -8707,62 +8753,63 @@ var require_CounterMetricConfigNode = __commonJS({
8707
8753
  var __metadata = exports2 && exports2.__metadata || function(k, v) {
8708
8754
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
8709
8755
  };
8756
+ var ConfigFragmentService_1;
8710
8757
  Object.defineProperty(exports2, "__esModule", { value: true });
8711
- exports2.CounterMetricConfigNode = void 0;
8758
+ exports2.ConfigFragmentService = void 0;
8712
8759
  var NodeConstructor_1 = require_NodeConstructor();
8713
- var MetricsService_1 = require_MetricsService();
8714
- var NodeGenerator_1 = require_NodeGenerator();
8715
- var MetricsTemplate_1 = require_MetricsTemplate();
8716
- var NodeDescriptionDecorator_1 = require_NodeDescriptionDecorator();
8717
- var CounterMetricConfigNode = class CounterMetricConfigNode extends NodeConstructor_1.ConfigNode {
8718
- constructor(node, config) {
8719
- super(node, config);
8720
- const refNode = config.metricsEnabled && config.metricsReference ? NodeConstructor_1.NodeManager.RED.nodes.getNode(config.metricsReference) : null;
8721
- this._metrics = refNode ? refNode.node().metrics() : new MetricsService_1.DoNothingMetricsContainer();
8722
- const counterConfig = {
8723
- metricname: config.name,
8724
- metricdescription: config.description,
8725
- node: {
8726
- id: this.id(),
8727
- name: this.name(),
8728
- flow: this.flow(),
8729
- type: this.type()
8730
- }
8731
- };
8732
- this._counter = this._metrics.counter(counterConfig);
8733
- if (config.reset) {
8734
- this._counter.reset();
8760
+ var ServiceDescriptionDecorator_1 = require_ServiceDescriptionDecorator();
8761
+ var ConfigFragmentService = ConfigFragmentService_1 = class ConfigFragmentService extends NodeConstructor_1.BaseService {
8762
+ // Global-backed registry so fragments registered across bundle boundaries are visible.
8763
+ static get _fragments() {
8764
+ if (!global.__plugincore_config_fragments__) {
8765
+ global.__plugincore_config_fragments__ = [];
8735
8766
  }
8767
+ return global.__plugincore_config_fragments__;
8736
8768
  }
8737
- metrics() {
8738
- return this._metrics;
8769
+ constructor() {
8770
+ super("configfragments");
8771
+ }
8772
+ init(red) {
8773
+ red.httpAdmin.get("/configfragment/:section/:providerType", red.auth.needsPermission("inject.write"), (request, response) => {
8774
+ const { section, providerType } = request.params;
8775
+ const fragment = ConfigFragmentService_1._fragments.find((f) => f.section === section && f.providerType === providerType);
8776
+ if (fragment) {
8777
+ response.type("text/html").send(fragment.html);
8778
+ } else {
8779
+ response.status(404).send("");
8780
+ }
8781
+ });
8782
+ return Promise.resolve();
8739
8783
  }
8740
- counter() {
8741
- return this._counter;
8784
+ deinit(red) {
8785
+ return Promise.resolve();
8786
+ }
8787
+ /**
8788
+ * Register a config fragment. Called by provider plugins during their service init().
8789
+ * Provider plugins own both sides of the contract: the HTML fragment that collects
8790
+ * the configuration AND the server-side factory that deserializes it.
8791
+ */
8792
+ static registerFragment(registration) {
8793
+ const existing = ConfigFragmentService_1._fragments.find((f) => f.section === registration.section && f.providerType === registration.providerType);
8794
+ if (!existing) {
8795
+ ConfigFragmentService_1._fragments.push(registration);
8796
+ }
8742
8797
  }
8743
8798
  };
8744
- exports2.CounterMetricConfigNode = CounterMetricConfigNode;
8745
- exports2.CounterMetricConfigNode = CounterMetricConfigNode = __decorate([
8746
- (0, NodeDescriptionDecorator_1.NodeDescription)({
8747
- id: "CounterMetricConfigNode",
8748
- name: "Counter Metric Config Node",
8749
- group: "config",
8750
- sourceFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "CounterMetricConfigNode.html",
8751
- package: "@theotherwillembotha/node-red-plugincore",
8752
- templates: [
8753
- { template: MetricsTemplate_1.MetricsTemplate, config: {} }
8754
- ],
8755
- dependencies: [MetricsService_1.MetricsService],
8756
- tags: ["MetricType"]
8799
+ exports2.ConfigFragmentService = ConfigFragmentService;
8800
+ exports2.ConfigFragmentService = ConfigFragmentService = ConfigFragmentService_1 = __decorate([
8801
+ (0, ServiceDescriptionDecorator_1.ServiceDescription)({
8802
+ id: "@theotherwillembotha/configfragmentservice",
8803
+ sourceFile: "@theotherwillembotha/node-red-plugincore"
8757
8804
  }),
8758
- __metadata("design:paramtypes", [Object, Object])
8759
- ], CounterMetricConfigNode);
8805
+ __metadata("design:paramtypes", [])
8806
+ ], ConfigFragmentService);
8760
8807
  }
8761
8808
  });
8762
8809
 
8763
- // ../nodered_plugincore/build/core/metrics/template/CounterMetricTemplate.js
8764
- var require_CounterMetricTemplate = __commonJS({
8765
- "../nodered_plugincore/build/core/metrics/template/CounterMetricTemplate.js"(exports2) {
8810
+ // ../nodered_plugincore/build/core/configfragment/template/ConfigFragmentTemplate.js
8811
+ var require_ConfigFragmentTemplate = __commonJS({
8812
+ "../nodered_plugincore/build/core/configfragment/template/ConfigFragmentTemplate.js"(exports2) {
8766
8813
  "use strict";
8767
8814
  var __decorate = exports2 && exports2.__decorate || function(decorators, target, key, desc) {
8768
8815
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -8771,27 +8818,27 @@ var require_CounterMetricTemplate = __commonJS({
8771
8818
  return c > 3 && r && Object.defineProperty(target, key, r), r;
8772
8819
  };
8773
8820
  Object.defineProperty(exports2, "__esModule", { value: true });
8774
- exports2.CounterMetricTemplate = void 0;
8821
+ exports2.ConfigFragmentTemplate = void 0;
8775
8822
  var NodeGenerator_1 = require_NodeGenerator();
8776
8823
  var NodeConstructor_1 = require_NodeConstructor();
8777
8824
  var TemplateDescriptionDecorator_1 = require_TemplateDescriptionDecorator();
8778
- var CounterMetricConfigNode_1 = require_CounterMetricConfigNode();
8779
- var CounterMetricTemplate = class CounterMetricTemplate extends NodeConstructor_1.Template {
8825
+ var ConfigFragmentService_1 = require_ConfigFragmentService();
8826
+ var ConfigFragmentTemplate = class ConfigFragmentTemplate extends NodeConstructor_1.Template {
8780
8827
  };
8781
- exports2.CounterMetricTemplate = CounterMetricTemplate;
8782
- exports2.CounterMetricTemplate = CounterMetricTemplate = __decorate([
8828
+ exports2.ConfigFragmentTemplate = ConfigFragmentTemplate;
8829
+ exports2.ConfigFragmentTemplate = ConfigFragmentTemplate = __decorate([
8783
8830
  (0, TemplateDescriptionDecorator_1.TemplateDescription)({
8784
- name: "countermetric",
8785
- templateFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "CounterMetricTemplate.html",
8786
- dependencies: [CounterMetricConfigNode_1.CounterMetricConfigNode]
8831
+ name: "configfragment",
8832
+ templateFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "ConfigFragmentTemplate.html",
8833
+ dependencies: [ConfigFragmentService_1.ConfigFragmentService]
8787
8834
  })
8788
- ], CounterMetricTemplate);
8835
+ ], ConfigFragmentTemplate);
8789
8836
  }
8790
8837
  });
8791
8838
 
8792
- // ../nodered_plugincore/build/core/metrics/node/GaugeMetricConfigNode.js
8793
- var require_GaugeMetricConfigNode = __commonJS({
8794
- "../nodered_plugincore/build/core/metrics/node/GaugeMetricConfigNode.js"(exports2) {
8839
+ // ../nodered_plugincore/build/core/metrics/template/CounterMetricTemplate.js
8840
+ var require_CounterMetricTemplate = __commonJS({
8841
+ "../nodered_plugincore/build/core/metrics/template/CounterMetricTemplate.js"(exports2) {
8795
8842
  "use strict";
8796
8843
  var __decorate = exports2 && exports2.__decorate || function(decorators, target, key, desc) {
8797
8844
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -8799,59 +8846,24 @@ var require_GaugeMetricConfigNode = __commonJS({
8799
8846
  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;
8800
8847
  return c > 3 && r && Object.defineProperty(target, key, r), r;
8801
8848
  };
8802
- var __metadata = exports2 && exports2.__metadata || function(k, v) {
8803
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
8804
- };
8805
8849
  Object.defineProperty(exports2, "__esModule", { value: true });
8806
- exports2.GaugeMetricConfigNode = void 0;
8850
+ exports2.CounterMetricTemplate = void 0;
8851
+ var NodeGenerator_1 = require_NodeGenerator();
8807
8852
  var NodeConstructor_1 = require_NodeConstructor();
8853
+ var TemplateDescriptionDecorator_1 = require_TemplateDescriptionDecorator();
8808
8854
  var MetricsService_1 = require_MetricsService();
8809
- var NodeGenerator_1 = require_NodeGenerator();
8810
- var MetricsTemplate_1 = require_MetricsTemplate();
8811
- var NodeDescriptionDecorator_1 = require_NodeDescriptionDecorator();
8812
- var GaugeMetricConfigNode = class GaugeMetricConfigNode extends NodeConstructor_1.ConfigNode {
8813
- constructor(node, config) {
8814
- super(node, config);
8815
- const refNode = config.metricsEnabled && config.metricsReference ? NodeConstructor_1.NodeManager.RED.nodes.getNode(config.metricsReference) : null;
8816
- this._metrics = refNode ? refNode.node().metrics() : new MetricsService_1.DoNothingMetricsContainer();
8817
- const gaugeConfig = {
8818
- metricname: config.name,
8819
- metricdescription: config.description,
8820
- node: {
8821
- id: this.id(),
8822
- flow: this.flow(),
8823
- type: this.type(),
8824
- name: this.name()
8825
- }
8826
- };
8827
- this._gauge = this._metrics.gauge(gaugeConfig);
8828
- if (config.reset) {
8829
- this._gauge.reset();
8830
- }
8831
- }
8832
- metrics() {
8833
- return this._metrics;
8834
- }
8835
- gauge() {
8836
- return this._gauge;
8837
- }
8855
+ var DelegatedConfigReferenceNode_1 = require_DelegatedConfigReferenceNode();
8856
+ var ConfigFragmentTemplate_1 = require_ConfigFragmentTemplate();
8857
+ var CounterMetricTemplate = class CounterMetricTemplate extends NodeConstructor_1.Template {
8838
8858
  };
8839
- exports2.GaugeMetricConfigNode = GaugeMetricConfigNode;
8840
- exports2.GaugeMetricConfigNode = GaugeMetricConfigNode = __decorate([
8841
- (0, NodeDescriptionDecorator_1.NodeDescription)({
8842
- id: "GaugeMetricConfigNode",
8843
- name: "Gauge Metric Config Node",
8844
- group: "config",
8845
- sourceFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "GaugeMetricConfigNode.html",
8846
- package: "@theotherwillembotha/node-red-plugincore",
8847
- templates: [
8848
- { template: MetricsTemplate_1.MetricsTemplate, config: {} }
8849
- ],
8850
- dependencies: [MetricsService_1.MetricsService],
8851
- tags: ["Core", "Metric"]
8852
- }),
8853
- __metadata("design:paramtypes", [Object, Object])
8854
- ], GaugeMetricConfigNode);
8859
+ exports2.CounterMetricTemplate = CounterMetricTemplate;
8860
+ exports2.CounterMetricTemplate = CounterMetricTemplate = __decorate([
8861
+ (0, TemplateDescriptionDecorator_1.TemplateDescription)({
8862
+ name: "countermetric",
8863
+ templateFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "CounterMetricTemplate.html",
8864
+ dependencies: [DelegatedConfigReferenceNode_1.DelegatedConfigReferenceNode, MetricsService_1.MetricsService, ConfigFragmentTemplate_1.ConfigFragmentTemplate]
8865
+ })
8866
+ ], CounterMetricTemplate);
8855
8867
  }
8856
8868
  });
8857
8869
 
@@ -8870,7 +8882,9 @@ var require_GaugeMetricTemplate = __commonJS({
8870
8882
  var NodeGenerator_1 = require_NodeGenerator();
8871
8883
  var NodeConstructor_1 = require_NodeConstructor();
8872
8884
  var TemplateDescriptionDecorator_1 = require_TemplateDescriptionDecorator();
8873
- var GaugeMetricConfigNode_1 = require_GaugeMetricConfigNode();
8885
+ var MetricsService_1 = require_MetricsService();
8886
+ var DelegatedConfigReferenceNode_1 = require_DelegatedConfigReferenceNode();
8887
+ var ConfigFragmentTemplate_1 = require_ConfigFragmentTemplate();
8874
8888
  var GaugeMetricTemplate = class GaugeMetricTemplate extends NodeConstructor_1.Template {
8875
8889
  };
8876
8890
  exports2.GaugeMetricTemplate = GaugeMetricTemplate;
@@ -8878,7 +8892,7 @@ var require_GaugeMetricTemplate = __commonJS({
8878
8892
  (0, TemplateDescriptionDecorator_1.TemplateDescription)({
8879
8893
  name: "gaugemetric",
8880
8894
  templateFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "GaugeMetricTemplate.html",
8881
- dependencies: [GaugeMetricConfigNode_1.GaugeMetricConfigNode]
8895
+ dependencies: [DelegatedConfigReferenceNode_1.DelegatedConfigReferenceNode, MetricsService_1.MetricsService, ConfigFragmentTemplate_1.ConfigFragmentTemplate]
8882
8896
  })
8883
8897
  ], GaugeMetricTemplate);
8884
8898
  }
@@ -8898,253 +8912,10 @@ var require_MetricsConfigNode = __commonJS({
8898
8912
  MetricsService_1.MetricsService.register(config.id, { id: config.id }, () => this.createContainer({ id: config.id }));
8899
8913
  }
8900
8914
  metrics() {
8901
- return MetricsService_1.MetricsService.get({ metricsEnabled: true, metricsReference: this.id() });
8902
- }
8903
- };
8904
- exports2.MetricsConfigNode = MetricsConfigNode;
8905
- }
8906
- });
8907
-
8908
- // ../nodered_plugincore/build/core/metrics/MetricsDecorator.js
8909
- var require_MetricsDecorator = __commonJS({
8910
- "../nodered_plugincore/build/core/metrics/MetricsDecorator.js"(exports2) {
8911
- "use strict";
8912
- Object.defineProperty(exports2, "__esModule", { value: true });
8913
- exports2.MetricCollectorType = exports2.MetricType = void 0;
8914
- exports2.Metrics = Metrics;
8915
- var NodeConstructor_1 = require_NodeConstructor();
8916
- var MetricsService_1 = require_MetricsService();
8917
- var MetricType;
8918
- (function(MetricType2) {
8919
- MetricType2["Counter"] = "Counter";
8920
- MetricType2["Timer"] = "Timer";
8921
- MetricType2["Gauge"] = "Gauge";
8922
- })(MetricType || (exports2.MetricType = MetricType = {}));
8923
- var MetricCollectorType;
8924
- (function(MetricCollectorType2) {
8925
- MetricCollectorType2["histogram"] = "histogram";
8926
- MetricCollectorType2["summary"] = "summary";
8927
- })(MetricCollectorType || (exports2.MetricCollectorType = MetricCollectorType = {}));
8928
- function resolveMetric(node, metricsConfig, _metrics) {
8929
- const nde = {
8930
- id: node.id(),
8931
- name: node.name(),
8932
- flow: node.flow(),
8933
- type: node.type()
8934
- };
8935
- if (metricsConfig.type === MetricType.Counter) {
8936
- if (!_metrics.supports(MetricsService_1.MetricCapability.Counter)) {
8937
- console.warn(`[PluginCore] @Metrics Counter requested by node "${node.name()}" (${node.type()}) but the selected provider does not support Counter. Using DoNothing.`);
8938
- }
8939
- const counterConfig = {
8940
- metricname: metricsConfig.name,
8941
- metricdescription: metricsConfig.description,
8942
- node: nde
8943
- };
8944
- return _metrics.counter(counterConfig);
8945
- }
8946
- if (metricsConfig.type === MetricType.Gauge) {
8947
- if (!_metrics.supports(MetricsService_1.MetricCapability.Gauge)) {
8948
- console.warn(`[PluginCore] @Metrics Gauge requested by node "${node.name()}" (${node.type()}) but the selected provider does not support Gauge. Using DoNothing.`);
8949
- }
8950
- const gaugeConfig = {
8951
- metricname: metricsConfig.name,
8952
- metricdescription: metricsConfig.description,
8953
- node: nde
8954
- };
8955
- return _metrics.gauge(gaugeConfig);
8956
- }
8957
- if (metricsConfig.type === MetricType.Timer) {
8958
- if (metricsConfig.collector === MetricCollectorType.histogram) {
8959
- if (!_metrics.supports(MetricsService_1.MetricCapability.Histogram)) {
8960
- console.warn(`[PluginCore] @Metrics Histogram requested by node "${node.name()}" (${node.type()}) but the selected provider does not support Histogram. Using DoNothing.`);
8961
- }
8962
- if (metricsConfig.buckettype === MetricsService_1.BucketType.default) {
8963
- const histogramConfig = {
8964
- metricname: metricsConfig.name,
8965
- metricdescription: metricsConfig.description,
8966
- buckettype: metricsConfig.buckettype,
8967
- bucketconfig: {},
8968
- node: nde
8969
- };
8970
- return _metrics.histogram(histogramConfig);
8971
- }
8972
- }
8973
- if (metricsConfig.collector === MetricCollectorType.summary) {
8974
- if (!_metrics.supports(MetricsService_1.MetricCapability.Summary)) {
8975
- console.warn(`[PluginCore] @Metrics Summary requested by node "${node.name()}" (${node.type()}) but the selected provider does not support Summary. Using DoNothing.`);
8976
- }
8977
- }
8978
- }
8979
- console.error("[PluginCore] @Metrics: no factory matched for config", metricsConfig);
8980
- return void 0;
8981
- }
8982
- function resolveContainer(metricsReference) {
8983
- if (!metricsReference)
8984
- return new MetricsService_1.DoNothingMetricsContainer();
8985
- const refNode = NodeConstructor_1.NodeManager.RED.nodes.getNode(metricsReference);
8986
- return refNode ? refNode.node().metrics() : new MetricsService_1.DoNothingMetricsContainer();
8987
- }
8988
- function dudForType(metricsConfig) {
8989
- if (metricsConfig.type === MetricType.Counter)
8990
- return new MetricsService_1.DoNothingCounterMetric();
8991
- if (metricsConfig.type === MetricType.Gauge)
8992
- return new MetricsService_1.DoNothingGaugeMetric();
8993
- if (metricsConfig.type === MetricType.Timer) {
8994
- if (metricsConfig.collector === MetricCollectorType.histogram)
8995
- return new MetricsService_1.DoNothingHistogramMetric();
8996
- if (metricsConfig.collector === MetricCollectorType.summary)
8997
- return new MetricsService_1.DoNothingSummaryMetric();
8998
- }
8999
- return void 0;
9000
- }
9001
- function Metrics(metricsConfig) {
9002
- return function(target, propertyKey) {
9003
- if (typeof propertyKey === "string") {
9004
- const valueSymbol = Symbol(`_${String(propertyKey)}_value`);
9005
- Object.defineProperty(target, propertyKey, {
9006
- get: function() {
9007
- if (this[valueSymbol])
9008
- return this[valueSymbol];
9009
- const node = this;
9010
- const config = node.config();
9011
- if (config.metricsEnabled) {
9012
- const _metrics = resolveContainer(config.metricsReference);
9013
- this[valueSymbol] = resolveMetric(node, metricsConfig, _metrics);
9014
- } else {
9015
- this[valueSymbol] = dudForType(metricsConfig);
9016
- }
9017
- return this[valueSymbol];
9018
- },
9019
- enumerable: true,
9020
- configurable: false
9021
- });
9022
- } else {
9023
- let property = propertyKey;
9024
- property.addInitializer(function() {
9025
- const node = this;
9026
- const valueSymbol = Symbol(`_${String(property.name)}_value`);
9027
- Object.defineProperty(node, property.name, {
9028
- get: function() {
9029
- if (this[valueSymbol])
9030
- return this[valueSymbol];
9031
- const config = node.config();
9032
- if (config.metricsEnabled) {
9033
- const _metrics = resolveContainer(config.metricsReference);
9034
- this[valueSymbol] = resolveMetric(node, metricsConfig, _metrics);
9035
- } else {
9036
- this[valueSymbol] = dudForType(metricsConfig);
9037
- }
9038
- return this[valueSymbol];
9039
- },
9040
- enumerable: true,
9041
- configurable: false
9042
- });
9043
- });
9044
- }
9045
- };
9046
- }
9047
- }
9048
- });
9049
-
9050
- // ../nodered_plugincore/build/core/metrics/node/TimerMetricConfigNode.js
9051
- var require_TimerMetricConfigNode = __commonJS({
9052
- "../nodered_plugincore/build/core/metrics/node/TimerMetricConfigNode.js"(exports2) {
9053
- "use strict";
9054
- var __decorate = exports2 && exports2.__decorate || function(decorators, target, key, desc) {
9055
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
9056
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
9057
- 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;
9058
- return c > 3 && r && Object.defineProperty(target, key, r), r;
9059
- };
9060
- var __metadata = exports2 && exports2.__metadata || function(k, v) {
9061
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9062
- };
9063
- Object.defineProperty(exports2, "__esModule", { value: true });
9064
- exports2.TimerMetricConfigNode = void 0;
9065
- var NodeConstructor_1 = require_NodeConstructor();
9066
- var MetricsService_1 = require_MetricsService();
9067
- var NodeGenerator_1 = require_NodeGenerator();
9068
- var MetricsTemplate_1 = require_MetricsTemplate();
9069
- var MetricsDecorator_1 = require_MetricsDecorator();
9070
- var NodeDescriptionDecorator_1 = require_NodeDescriptionDecorator();
9071
- var TimerMetricConfigNode = class TimerMetricConfigNode extends NodeConstructor_1.ConfigNode {
9072
- constructor(node, config) {
9073
- super(node, config);
9074
- const refNode = config.metricsEnabled && config.metricsReference ? NodeConstructor_1.NodeManager.RED.nodes.getNode(config.metricsReference) : null;
9075
- this._metrics = refNode ? refNode.node().metrics() : new MetricsService_1.DoNothingMetricsContainer();
9076
- const bucketConfig = {};
9077
- switch (config.buckettype) {
9078
- case MetricsService_1.BucketType.manual:
9079
- bucketConfig.intervals = config.buckettype_manual_intervals.split(",").map((i) => Number.parseFloat(i.trim()));
9080
- break;
9081
- case MetricsService_1.BucketType.linear:
9082
- bucketConfig.start = config.buckettype_linear_start;
9083
- bucketConfig.interval = config.buckettype_linear_interval;
9084
- bucketConfig.count = config.buckettype_linear_count;
9085
- break;
9086
- case MetricsService_1.BucketType.exponential:
9087
- bucketConfig.start = config.buckettype_exponential_start;
9088
- bucketConfig.factor = config.buckettype_exponential_factor;
9089
- bucketConfig.count = config.buckettype_exponential_count;
9090
- break;
9091
- default:
9092
- break;
9093
- }
9094
- if (config.metricType === MetricsDecorator_1.MetricCollectorType.histogram) {
9095
- const timerConfig = {
9096
- node: {
9097
- id: this.id(),
9098
- name: this.name(),
9099
- flow: this.flow(),
9100
- type: this.type()
9101
- },
9102
- buckettype: config.buckettype,
9103
- bucketconfig: bucketConfig,
9104
- metricname: config.name,
9105
- metricdescription: config.description
9106
- };
9107
- this._timer = this._metrics.histogram(timerConfig);
9108
- }
9109
- if (config.metricType === MetricsDecorator_1.MetricCollectorType.summary) {
9110
- const timerConfig = {
9111
- node: {
9112
- id: this.id(),
9113
- name: this.name(),
9114
- flow: this.flow(),
9115
- type: this.type()
9116
- },
9117
- percentileType: config.percentiletype,
9118
- percentileConfig: config.percentiletype_manual_intervals,
9119
- metricname: config.name,
9120
- metricdescription: config.description
9121
- };
9122
- this._timer = this._metrics.summary(timerConfig);
9123
- }
9124
- }
9125
- metrics() {
9126
- return this._metrics;
9127
- }
9128
- timer() {
9129
- return this._timer;
9130
- }
9131
- };
9132
- exports2.TimerMetricConfigNode = TimerMetricConfigNode;
9133
- exports2.TimerMetricConfigNode = TimerMetricConfigNode = __decorate([
9134
- (0, NodeDescriptionDecorator_1.NodeDescription)({
9135
- id: "TimerMetricConfigNode",
9136
- name: "Timer Metric Config Node",
9137
- group: "config",
9138
- sourceFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "TimerMetricConfigNode.html",
9139
- package: "@theotherwillembotha/node-red-plugincore",
9140
- templates: [
9141
- { template: MetricsTemplate_1.MetricsTemplate, config: { isConfigNode: true } }
9142
- ],
9143
- dependencies: [MetricsService_1.MetricsService],
9144
- tags: ["Core", "Metric"]
9145
- }),
9146
- __metadata("design:paramtypes", [Object, Object])
9147
- ], TimerMetricConfigNode);
8915
+ return MetricsService_1.MetricsService.get({ metricsEnabled: true, metricsReference: this.id() });
8916
+ }
8917
+ };
8918
+ exports2.MetricsConfigNode = MetricsConfigNode;
9148
8919
  }
9149
8920
  });
9150
8921
 
@@ -9163,7 +8934,9 @@ var require_TimerMetricTemplate = __commonJS({
9163
8934
  var NodeGenerator_1 = require_NodeGenerator();
9164
8935
  var NodeConstructor_1 = require_NodeConstructor();
9165
8936
  var TemplateDescriptionDecorator_1 = require_TemplateDescriptionDecorator();
9166
- var TimerMetricConfigNode_1 = require_TimerMetricConfigNode();
8937
+ var MetricsService_1 = require_MetricsService();
8938
+ var DelegatedConfigReferenceNode_1 = require_DelegatedConfigReferenceNode();
8939
+ var ConfigFragmentTemplate_1 = require_ConfigFragmentTemplate();
9167
8940
  var TimerMetricTemplate = class TimerMetricTemplate extends NodeConstructor_1.Template {
9168
8941
  };
9169
8942
  exports2.TimerMetricTemplate = TimerMetricTemplate;
@@ -9171,7 +8944,7 @@ var require_TimerMetricTemplate = __commonJS({
9171
8944
  (0, TemplateDescriptionDecorator_1.TemplateDescription)({
9172
8945
  name: "timermetric",
9173
8946
  templateFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "TimerMetricTemplate.html",
9174
- dependencies: [TimerMetricConfigNode_1.TimerMetricConfigNode]
8947
+ dependencies: [DelegatedConfigReferenceNode_1.DelegatedConfigReferenceNode, MetricsService_1.MetricsService, ConfigFragmentTemplate_1.ConfigFragmentTemplate]
9175
8948
  })
9176
8949
  ], TimerMetricTemplate);
9177
8950
  }
@@ -9622,16 +9395,53 @@ var require_UIHelperTemplate = __commonJS({
9622
9395
  var require_ScriptEditorTemplate = __commonJS({
9623
9396
  "../nodered_plugincore/build/core/ui/template/ScriptEditorTemplate.js"(exports2) {
9624
9397
  "use strict";
9398
+ var __createBinding = exports2 && exports2.__createBinding || (Object.create ? (function(o, m, k, k2) {
9399
+ if (k2 === void 0) k2 = k;
9400
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9401
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9402
+ desc = { enumerable: true, get: function() {
9403
+ return m[k];
9404
+ } };
9405
+ }
9406
+ Object.defineProperty(o, k2, desc);
9407
+ }) : (function(o, m, k, k2) {
9408
+ if (k2 === void 0) k2 = k;
9409
+ o[k2] = m[k];
9410
+ }));
9411
+ var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? (function(o, v) {
9412
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
9413
+ }) : function(o, v) {
9414
+ o["default"] = v;
9415
+ });
9625
9416
  var __decorate = exports2 && exports2.__decorate || function(decorators, target, key, desc) {
9626
9417
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
9627
9418
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
9628
9419
  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;
9629
9420
  return c > 3 && r && Object.defineProperty(target, key, r), r;
9630
9421
  };
9422
+ var __importStar = exports2 && exports2.__importStar || /* @__PURE__ */ (function() {
9423
+ var ownKeys = function(o) {
9424
+ ownKeys = Object.getOwnPropertyNames || function(o2) {
9425
+ var ar = [];
9426
+ for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k;
9427
+ return ar;
9428
+ };
9429
+ return ownKeys(o);
9430
+ };
9431
+ return function(mod) {
9432
+ if (mod && mod.__esModule) return mod;
9433
+ var result = {};
9434
+ if (mod != null) {
9435
+ for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
9436
+ }
9437
+ __setModuleDefault(result, mod);
9438
+ return result;
9439
+ };
9440
+ })();
9631
9441
  Object.defineProperty(exports2, "__esModule", { value: true });
9632
9442
  exports2.ScriptEditorTemplate = void 0;
9443
+ var path = __importStar(require("path"));
9633
9444
  var NodeConstructor_1 = require_NodeConstructor();
9634
- var NodeGenerator_1 = require_NodeGenerator();
9635
9445
  var TemplateDescriptionDecorator_1 = require_TemplateDescriptionDecorator();
9636
9446
  var ScriptEditorTemplate = class ScriptEditorTemplate extends NodeConstructor_1.Template {
9637
9447
  };
@@ -9639,7 +9449,7 @@ var require_ScriptEditorTemplate = __commonJS({
9639
9449
  exports2.ScriptEditorTemplate = ScriptEditorTemplate = __decorate([
9640
9450
  (0, TemplateDescriptionDecorator_1.TemplateDescription)({
9641
9451
  name: "script-editor",
9642
- templateFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "ScriptEditorTemplate.html"
9452
+ templateFile: path.join(__dirname, "ScriptEditorTemplate.html")
9643
9453
  })
9644
9454
  ], ScriptEditorTemplate);
9645
9455
  }
@@ -9682,93 +9492,6 @@ var require_InputService = __commonJS({
9682
9492
  }
9683
9493
  });
9684
9494
 
9685
- // ../nodered_plugincore/build/core/other/service/SettingsService.js
9686
- var require_SettingsService = __commonJS({
9687
- "../nodered_plugincore/build/core/other/service/SettingsService.js"(exports2) {
9688
- "use strict";
9689
- var __decorate = exports2 && exports2.__decorate || function(decorators, target, key, desc) {
9690
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
9691
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
9692
- 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;
9693
- return c > 3 && r && Object.defineProperty(target, key, r), r;
9694
- };
9695
- var __metadata = exports2 && exports2.__metadata || function(k, v) {
9696
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9697
- };
9698
- Object.defineProperty(exports2, "__esModule", { value: true });
9699
- exports2.Settings = exports2.SettingsService = void 0;
9700
- var NodeConstructor_1 = require_NodeConstructor();
9701
- var ServiceDescriptionDecorator_1 = require_ServiceDescriptionDecorator();
9702
- var SettingsService = class SettingsService extends NodeConstructor_1.BaseService {
9703
- static create(node, config) {
9704
- let settings = NodeConstructor_1.NodeManager.RED.settings.get("NodeSettings_" + config.id);
9705
- if (settings === void 0) {
9706
- settings = {};
9707
- }
9708
- return new Settings(settings, config);
9709
- }
9710
- constructor() {
9711
- super("SettingsService");
9712
- }
9713
- init(red) {
9714
- red.httpAdmin.post("/utils/getNodeSettings", red.auth.needsPermission("inject.write"), async function(request, response) {
9715
- let config = request.body;
9716
- let settings = red.settings.get("NodeSettings_" + config.nodeId);
9717
- response.send({
9718
- status: "ok",
9719
- settings
9720
- });
9721
- });
9722
- }
9723
- deinit(red) {
9724
- red.httpAdmin.post("/utils/getNodeSettings", red.auth.needsPermission("inject.write"), async function(request, response) {
9725
- response.status(404);
9726
- });
9727
- }
9728
- };
9729
- exports2.SettingsService = SettingsService;
9730
- exports2.SettingsService = SettingsService = __decorate([
9731
- (0, ServiceDescriptionDecorator_1.ServiceDescription)({
9732
- id: "@theotherwillembotha/settingsservice",
9733
- sourceFile: "@theotherwillembotha/node-red-plugincore"
9734
- }),
9735
- __metadata("design:paramtypes", [])
9736
- ], SettingsService);
9737
- var Settings = class {
9738
- constructor(settings, config) {
9739
- this._settings = settings;
9740
- this._config = config;
9741
- if (!this.hasChanged()) {
9742
- Object.keys(this._settings).forEach((key) => this._config[key] = this._settings[key]);
9743
- }
9744
- }
9745
- value(key) {
9746
- return this._settings[key];
9747
- }
9748
- values() {
9749
- return this._settings;
9750
- }
9751
- update(key, value) {
9752
- this._settings[key] = value;
9753
- }
9754
- updateAll(value) {
9755
- this._settings = value;
9756
- }
9757
- // the settings are considdered changed if the settingsTimestamp value is different;
9758
- hasChanged() {
9759
- return this._settings.settingsTimestamp !== this._config.settingsTimestamp;
9760
- }
9761
- persist() {
9762
- NodeConstructor_1.NodeManager.RED.settings.set("NodeSettings_" + this._config.id, this._settings);
9763
- }
9764
- delete() {
9765
- NodeConstructor_1.NodeManager.RED.settings.delete("NodeSettings_" + this._config.id);
9766
- }
9767
- };
9768
- exports2.Settings = Settings;
9769
- }
9770
- });
9771
-
9772
9495
  // ../nodered_plugincore/build/core/other/template/BasicTemplate.js
9773
9496
  var require_BasicTemplate = __commonJS({
9774
9497
  "../nodered_plugincore/build/core/other/template/BasicTemplate.js"(exports2) {
@@ -9796,35 +9519,6 @@ var require_BasicTemplate = __commonJS({
9796
9519
  }
9797
9520
  });
9798
9521
 
9799
- // ../nodered_plugincore/build/core/other/template/SettingsTemplate.js
9800
- var require_SettingsTemplate = __commonJS({
9801
- "../nodered_plugincore/build/core/other/template/SettingsTemplate.js"(exports2) {
9802
- "use strict";
9803
- var __decorate = exports2 && exports2.__decorate || function(decorators, target, key, desc) {
9804
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
9805
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
9806
- 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;
9807
- return c > 3 && r && Object.defineProperty(target, key, r), r;
9808
- };
9809
- Object.defineProperty(exports2, "__esModule", { value: true });
9810
- exports2.SettingsTemplate = void 0;
9811
- var NodeConstructor_1 = require_NodeConstructor();
9812
- var NodeGenerator_1 = require_NodeGenerator();
9813
- var TemplateDescriptionDecorator_1 = require_TemplateDescriptionDecorator();
9814
- var SettingsService_1 = require_SettingsService();
9815
- var SettingsTemplate = class SettingsTemplate extends NodeConstructor_1.Template {
9816
- };
9817
- exports2.SettingsTemplate = SettingsTemplate;
9818
- exports2.SettingsTemplate = SettingsTemplate = __decorate([
9819
- (0, TemplateDescriptionDecorator_1.TemplateDescription)({
9820
- name: "settings",
9821
- templateFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "SettingsTemplate.html",
9822
- dependencies: [SettingsService_1.SettingsService]
9823
- })
9824
- ], SettingsTemplate);
9825
- }
9826
- });
9827
-
9828
9522
  // ../nodered_plugincore/node_modules/ms/index.js
9829
9523
  var require_ms = __commonJS({
9830
9524
  "../nodered_plugincore/node_modules/ms/index.js"(exports2, module2) {
@@ -33901,6 +33595,148 @@ var require_LoggerDecorator = __commonJS({
33901
33595
  }
33902
33596
  });
33903
33597
 
33598
+ // ../nodered_plugincore/build/core/metrics/MetricsDecorator.js
33599
+ var require_MetricsDecorator = __commonJS({
33600
+ "../nodered_plugincore/build/core/metrics/MetricsDecorator.js"(exports2) {
33601
+ "use strict";
33602
+ Object.defineProperty(exports2, "__esModule", { value: true });
33603
+ exports2.MetricCollectorType = exports2.MetricType = void 0;
33604
+ exports2.Metrics = Metrics;
33605
+ var NodeConstructor_1 = require_NodeConstructor();
33606
+ var MetricsService_1 = require_MetricsService();
33607
+ var MetricType;
33608
+ (function(MetricType2) {
33609
+ MetricType2["Counter"] = "Counter";
33610
+ MetricType2["Timer"] = "Timer";
33611
+ MetricType2["Gauge"] = "Gauge";
33612
+ })(MetricType || (exports2.MetricType = MetricType = {}));
33613
+ var MetricCollectorType;
33614
+ (function(MetricCollectorType2) {
33615
+ MetricCollectorType2["histogram"] = "histogram";
33616
+ MetricCollectorType2["summary"] = "summary";
33617
+ })(MetricCollectorType || (exports2.MetricCollectorType = MetricCollectorType = {}));
33618
+ function resolveMetric(node, metricsConfig, _metrics) {
33619
+ const baseConfig = {
33620
+ id: `${node.id()}_${metricsConfig.name}`,
33621
+ flow: node.flow(),
33622
+ name: node.name(),
33623
+ description: metricsConfig.description || void 0
33624
+ };
33625
+ if (metricsConfig.type === MetricType.Counter) {
33626
+ if (!_metrics.supports(MetricsService_1.MetricCapability.Counter)) {
33627
+ console.warn(`[PluginCore] @Metrics Counter requested by node "${node.name()}" (${node.type()}) but the selected provider does not support Counter. Using DoNothing.`);
33628
+ }
33629
+ const counterConfig = {
33630
+ ...baseConfig,
33631
+ type: node.type(),
33632
+ metric: metricsConfig.name
33633
+ };
33634
+ return _metrics.counter(counterConfig);
33635
+ }
33636
+ if (metricsConfig.type === MetricType.Gauge) {
33637
+ if (!_metrics.supports(MetricsService_1.MetricCapability.Gauge)) {
33638
+ console.warn(`[PluginCore] @Metrics Gauge requested by node "${node.name()}" (${node.type()}) but the selected provider does not support Gauge. Using DoNothing.`);
33639
+ }
33640
+ const gaugeConfig = {
33641
+ ...baseConfig,
33642
+ type: node.type(),
33643
+ metric: metricsConfig.name
33644
+ };
33645
+ return _metrics.gauge(gaugeConfig);
33646
+ }
33647
+ if (metricsConfig.type === MetricType.Timer) {
33648
+ if (metricsConfig.collector === MetricCollectorType.histogram) {
33649
+ if (!_metrics.supports(MetricsService_1.MetricCapability.Histogram)) {
33650
+ console.warn(`[PluginCore] @Metrics Histogram requested by node "${node.name()}" (${node.type()}) but the selected provider does not support Histogram. Using DoNothing.`);
33651
+ }
33652
+ if (metricsConfig.buckettype === MetricsService_1.BucketType.default) {
33653
+ const histogramConfig = {
33654
+ ...baseConfig,
33655
+ type: node.type(),
33656
+ metric: metricsConfig.name,
33657
+ buckettype: metricsConfig.buckettype,
33658
+ bucketconfig: {}
33659
+ };
33660
+ return _metrics.histogram(histogramConfig);
33661
+ }
33662
+ }
33663
+ if (metricsConfig.collector === MetricCollectorType.summary) {
33664
+ if (!_metrics.supports(MetricsService_1.MetricCapability.Summary)) {
33665
+ console.warn(`[PluginCore] @Metrics Summary requested by node "${node.name()}" (${node.type()}) but the selected provider does not support Summary. Using DoNothing.`);
33666
+ }
33667
+ }
33668
+ }
33669
+ console.error("[PluginCore] @Metrics: no factory matched for config", metricsConfig);
33670
+ return void 0;
33671
+ }
33672
+ function resolveContainer(metricsReference) {
33673
+ if (!metricsReference)
33674
+ return new MetricsService_1.DoNothingMetricsContainer();
33675
+ const refNode = NodeConstructor_1.NodeManager.RED.nodes.getNode(metricsReference);
33676
+ return refNode ? refNode.node().metrics() : new MetricsService_1.DoNothingMetricsContainer();
33677
+ }
33678
+ function dudForType(metricsConfig) {
33679
+ if (metricsConfig.type === MetricType.Counter)
33680
+ return new MetricsService_1.DoNothingCounterMetric();
33681
+ if (metricsConfig.type === MetricType.Gauge)
33682
+ return new MetricsService_1.DoNothingGaugeMetric();
33683
+ if (metricsConfig.type === MetricType.Timer) {
33684
+ if (metricsConfig.collector === MetricCollectorType.histogram)
33685
+ return new MetricsService_1.DoNothingHistogramMetric();
33686
+ if (metricsConfig.collector === MetricCollectorType.summary)
33687
+ return new MetricsService_1.DoNothingSummaryMetric();
33688
+ }
33689
+ return void 0;
33690
+ }
33691
+ function Metrics(metricsConfig) {
33692
+ return function(target, propertyKey) {
33693
+ if (typeof propertyKey === "string") {
33694
+ const valueSymbol = Symbol(`_${String(propertyKey)}_value`);
33695
+ Object.defineProperty(target, propertyKey, {
33696
+ get: function() {
33697
+ if (this[valueSymbol])
33698
+ return this[valueSymbol];
33699
+ const node = this;
33700
+ const config = node.config();
33701
+ if (config.metricsEnabled) {
33702
+ const _metrics = resolveContainer(config.metricsReference);
33703
+ this[valueSymbol] = resolveMetric(node, metricsConfig, _metrics);
33704
+ } else {
33705
+ this[valueSymbol] = dudForType(metricsConfig);
33706
+ }
33707
+ return this[valueSymbol];
33708
+ },
33709
+ enumerable: true,
33710
+ configurable: false
33711
+ });
33712
+ } else {
33713
+ let property = propertyKey;
33714
+ property.addInitializer(function() {
33715
+ const node = this;
33716
+ const valueSymbol = Symbol(`_${String(property.name)}_value`);
33717
+ Object.defineProperty(node, property.name, {
33718
+ get: function() {
33719
+ if (this[valueSymbol])
33720
+ return this[valueSymbol];
33721
+ const config = node.config();
33722
+ if (config.metricsEnabled) {
33723
+ const _metrics = resolveContainer(config.metricsReference);
33724
+ this[valueSymbol] = resolveMetric(node, metricsConfig, _metrics);
33725
+ } else {
33726
+ this[valueSymbol] = dudForType(metricsConfig);
33727
+ }
33728
+ return this[valueSymbol];
33729
+ },
33730
+ enumerable: true,
33731
+ configurable: false
33732
+ });
33733
+ });
33734
+ }
33735
+ };
33736
+ }
33737
+ }
33738
+ });
33739
+
33904
33740
  // ../nodered_plugincore/build/core/webhook/WebhookDecorator.js
33905
33741
  var require_WebhookDecorator = __commonJS({
33906
33742
  "../nodered_plugincore/build/core/webhook/WebhookDecorator.js"(exports2) {
@@ -33915,6 +33751,72 @@ var require_WebhookDecorator = __commonJS({
33915
33751
  var NodeConstructor_1 = require_NodeConstructor();
33916
33752
  var ReverseProxyTypeService_1 = require_ReverseProxyTypeService();
33917
33753
  var managedProxyHosts = /* @__PURE__ */ new Map();
33754
+ var PROXY_RETRY_ATTEMPTS = 5;
33755
+ var PROXY_RETRY_INTERVAL_MS = 2e3;
33756
+ function delay(ms) {
33757
+ return new Promise((resolve) => setTimeout(resolve, ms));
33758
+ }
33759
+ function resolveProxyNode(proxyId) {
33760
+ let rawNode = NodeConstructor_1.NodeManager.RED.nodes.getNode(proxyId);
33761
+ return rawNode ? rawNode.node() : null;
33762
+ }
33763
+ async function resolveProxyNodeWithRetry(proxyId) {
33764
+ for (let attempt = 1; attempt <= PROXY_RETRY_ATTEMPTS; attempt++) {
33765
+ let resolved = resolveProxyNode(proxyId);
33766
+ if (resolved)
33767
+ return resolved;
33768
+ if (attempt < PROXY_RETRY_ATTEMPTS) {
33769
+ console.warn(`Reverse proxy config node "${proxyId}" not available yet (attempt ${attempt}/${PROXY_RETRY_ATTEMPTS}), retrying in ${PROXY_RETRY_INTERVAL_MS}ms...`);
33770
+ await delay(PROXY_RETRY_INTERVAL_MS);
33771
+ }
33772
+ }
33773
+ console.error(`Reverse proxy config node "${proxyId}" not available after ${PROXY_RETRY_ATTEMPTS} attempts \u2014 giving up.`);
33774
+ return null;
33775
+ }
33776
+ async function setupReverseProxies(nodeConfig, webhookServer) {
33777
+ let targetPort = webhookServer.config().port;
33778
+ let targetHost = os_1.default.hostname();
33779
+ let nodeId = nodeConfig.id;
33780
+ let newlyManaged = [];
33781
+ await Promise.all(nodeConfig.reverseProxies_connections.map(async (proxy) => {
33782
+ try {
33783
+ let reverseProxyNode = await resolveProxyNodeWithRetry(proxy.proxy);
33784
+ if (!reverseProxyNode)
33785
+ return;
33786
+ let proxyClient = reverseProxyNode.client();
33787
+ let hosts = await proxyClient.getHosts();
33788
+ let matchingHost = hosts.find((h) => h.domainNames?.includes(proxy.domainname));
33789
+ if (!matchingHost) {
33790
+ await proxyClient.updateHost({ domainNames: [proxy.domainname], forwardHost: targetHost, forwardPort: targetPort, scheme: ReverseProxyTypeService_1.HTTPScheme.HTTP });
33791
+ let updatedHosts = await proxyClient.getHosts();
33792
+ matchingHost = updatedHosts.find((h) => h.domainNames?.includes(proxy.domainname));
33793
+ } else if (matchingHost.forwardHost !== targetHost || matchingHost.forwardPort !== targetPort) {
33794
+ await proxyClient.updateHost({ id: matchingHost.id, forwardHost: targetHost, forwardPort: targetPort, scheme: ReverseProxyTypeService_1.HTTPScheme.HTTP });
33795
+ }
33796
+ if (matchingHost?.id !== void 0) {
33797
+ newlyManaged.push({ proxyNodeId: proxy.proxy, hostId: matchingHost.id });
33798
+ }
33799
+ } catch (e) {
33800
+ console.error(e);
33801
+ }
33802
+ }));
33803
+ let previouslyManaged = managedProxyHosts.get(nodeId) ?? [];
33804
+ let newHostIds = new Set(newlyManaged.map((m) => m.hostId));
33805
+ await Promise.all(previouslyManaged.filter((m) => !newHostIds.has(m.hostId)).map(async (stale) => {
33806
+ try {
33807
+ let reverseProxyNode = resolveProxyNode(stale.proxyNodeId);
33808
+ if (!reverseProxyNode) {
33809
+ console.warn(`Stale reverse proxy config node "${stale.proxyNodeId}" not found \u2014 skipping cleanup.`);
33810
+ return;
33811
+ }
33812
+ let proxyClient = reverseProxyNode.client();
33813
+ await proxyClient.deleteHost(stale.hostId);
33814
+ } catch (e) {
33815
+ console.error(e);
33816
+ }
33817
+ }));
33818
+ managedProxyHosts.set(nodeId, newlyManaged);
33819
+ }
33918
33820
  var Webhook = (0, NodeConstructor_1.createPostConstructDecorator)("Webhook").withInitLogic(async (instance, propertyKey, webhookconfig) => {
33919
33821
  let node = instance;
33920
33822
  let nodeConfig = node.config();
@@ -33927,42 +33829,7 @@ var require_WebhookDecorator = __commonJS({
33927
33829
  let webhookServer = NodeConstructor_1.NodeManager.RED.nodes.getNode(nodeConfig.webhook).node().server();
33928
33830
  webhookServer.attach(endpointConfig, (request, respponse) => instance[propertyKey](request, respponse));
33929
33831
  if (nodeConfig.reverseProxies_enabled) {
33930
- let targetPort = webhookServer.config().port;
33931
- let targetHost = os_1.default.hostname();
33932
- let nodeId = nodeConfig.id;
33933
- let newlyManaged = [];
33934
- await Promise.all(nodeConfig.reverseProxies_connections.map(async (proxy) => {
33935
- try {
33936
- let reverseProxyNode = NodeConstructor_1.NodeManager.RED.nodes.getNode(proxy.proxy).node();
33937
- let proxyClient = reverseProxyNode.client();
33938
- let hosts = await proxyClient.getHosts();
33939
- let matchingHost = hosts.find((h) => h.domainNames?.includes(proxy.domainname));
33940
- if (!matchingHost) {
33941
- await proxyClient.updateHost({ domainNames: [proxy.domainname], forwardHost: targetHost, forwardPort: targetPort, scheme: ReverseProxyTypeService_1.HTTPScheme.HTTP });
33942
- let updatedHosts = await proxyClient.getHosts();
33943
- matchingHost = updatedHosts.find((h) => h.domainNames?.includes(proxy.domainname));
33944
- } else if (matchingHost.forwardHost !== targetHost || matchingHost.forwardPort !== targetPort) {
33945
- await proxyClient.updateHost({ id: matchingHost.id, forwardHost: targetHost, forwardPort: targetPort, scheme: ReverseProxyTypeService_1.HTTPScheme.HTTP });
33946
- }
33947
- if (matchingHost?.id !== void 0) {
33948
- newlyManaged.push({ proxyNodeId: proxy.proxy, hostId: matchingHost.id });
33949
- }
33950
- } catch (e) {
33951
- console.error(e);
33952
- }
33953
- }));
33954
- let previouslyManaged = managedProxyHosts.get(nodeId) ?? [];
33955
- let newHostIds = new Set(newlyManaged.map((m) => m.hostId));
33956
- await Promise.all(previouslyManaged.filter((m) => !newHostIds.has(m.hostId)).map(async (stale) => {
33957
- try {
33958
- let reverseProxyNode = NodeConstructor_1.NodeManager.RED.nodes.getNode(stale.proxyNodeId).node();
33959
- let proxyClient = reverseProxyNode.client();
33960
- await proxyClient.deleteHost(stale.hostId);
33961
- } catch (e) {
33962
- console.error(e);
33963
- }
33964
- }));
33965
- managedProxyHosts.set(nodeId, newlyManaged);
33832
+ setupReverseProxies(nodeConfig, webhookServer);
33966
33833
  }
33967
33834
  node.node().on("close", () => {
33968
33835
  webhookServer.detach(endpointConfig);
@@ -34039,9 +33906,6 @@ var require_build = __commonJS({
34039
33906
  __exportStar(require_CounterMetricTemplate(), exports2);
34040
33907
  __exportStar(require_GaugeMetricTemplate(), exports2);
34041
33908
  __exportStar(require_MetricsConfigNode(), exports2);
34042
- __exportStar(require_CounterMetricConfigNode(), exports2);
34043
- __exportStar(require_GaugeMetricConfigNode(), exports2);
34044
- __exportStar(require_TimerMetricConfigNode(), exports2);
34045
33909
  __exportStar(require_TimerMetricTemplate(), exports2);
34046
33910
  __exportStar(require_StateService(), exports2);
34047
33911
  __exportStar(require_StateConfigNode(), exports2);
@@ -34055,9 +33919,9 @@ var require_build = __commonJS({
34055
33919
  __exportStar(require_ScriptEditorTemplate(), exports2);
34056
33920
  __exportStar(require_DelegatedConfigReferenceNode(), exports2);
34057
33921
  __exportStar(require_InputService(), exports2);
34058
- __exportStar(require_SettingsService(), exports2);
34059
33922
  __exportStar(require_BasicTemplate(), exports2);
34060
- __exportStar(require_SettingsTemplate(), exports2);
33923
+ __exportStar(require_ConfigFragmentService(), exports2);
33924
+ __exportStar(require_ConfigFragmentTemplate(), exports2);
34061
33925
  __exportStar(require_WebhookTemplate(), exports2);
34062
33926
  __exportStar(require_WebhookServerConfigNode(), exports2);
34063
33927
  __exportStar(require_WebhookServerService(), exports2);