@theotherwillembotha/node-red-cluster 0.4.4 → 0.4.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/build/Nodes.js +179 -110
  2. package/build/Plugins.js +179 -110
  3. package/package.json +2 -2
package/build/Nodes.js CHANGED
@@ -8877,102 +8877,6 @@ var require_MetricsTemplate = __commonJS({
8877
8877
  }
8878
8878
  });
8879
8879
 
8880
- // ../nodered_plugincore/build/core/configfragment/service/ConfigFragmentService.js
8881
- var require_ConfigFragmentService = __commonJS({
8882
- "../nodered_plugincore/build/core/configfragment/service/ConfigFragmentService.js"(exports2) {
8883
- "use strict";
8884
- var __decorate = exports2 && exports2.__decorate || function(decorators, target, key, desc) {
8885
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
8886
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
8887
- 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;
8888
- return c > 3 && r && Object.defineProperty(target, key, r), r;
8889
- };
8890
- var __metadata = exports2 && exports2.__metadata || function(k, v) {
8891
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
8892
- };
8893
- var ConfigFragmentService_1;
8894
- Object.defineProperty(exports2, "__esModule", { value: true });
8895
- exports2.ConfigFragmentService = void 0;
8896
- var NodeConstructor_1 = require_NodeConstructor();
8897
- var ServiceDescriptionDecorator_1 = require_ServiceDescriptionDecorator();
8898
- var ConfigFragmentService = ConfigFragmentService_1 = class ConfigFragmentService extends NodeConstructor_1.BaseService {
8899
- // Global-backed registry so fragments registered across bundle boundaries are visible.
8900
- static get _fragments() {
8901
- if (!global.__plugincore_config_fragments__) {
8902
- global.__plugincore_config_fragments__ = [];
8903
- }
8904
- return global.__plugincore_config_fragments__;
8905
- }
8906
- constructor() {
8907
- super("configfragments");
8908
- }
8909
- init(red) {
8910
- red.httpAdmin.get("/configfragment/:section/:providerType", red.auth.needsPermission("inject.write"), (request, response) => {
8911
- const { section, providerType } = request.params;
8912
- const fragment = ConfigFragmentService_1._fragments.find((f) => f.section === section && f.providerType === providerType);
8913
- if (fragment) {
8914
- response.type("text/html").send(fragment.html);
8915
- } else {
8916
- response.status(404).send("");
8917
- }
8918
- });
8919
- return Promise.resolve();
8920
- }
8921
- deinit(red) {
8922
- return Promise.resolve();
8923
- }
8924
- /**
8925
- * Register a config fragment. Called by provider plugins during their service init().
8926
- * Provider plugins own both sides of the contract: the HTML fragment that collects
8927
- * the configuration AND the server-side factory that deserializes it.
8928
- */
8929
- static registerFragment(registration) {
8930
- const existing = ConfigFragmentService_1._fragments.find((f) => f.section === registration.section && f.providerType === registration.providerType);
8931
- if (!existing) {
8932
- ConfigFragmentService_1._fragments.push(registration);
8933
- }
8934
- }
8935
- };
8936
- exports2.ConfigFragmentService = ConfigFragmentService;
8937
- exports2.ConfigFragmentService = ConfigFragmentService = ConfigFragmentService_1 = __decorate([
8938
- (0, ServiceDescriptionDecorator_1.ServiceDescription)({
8939
- id: "@theotherwillembotha/configfragmentservice",
8940
- sourceFile: "@theotherwillembotha/node-red-plugincore"
8941
- }),
8942
- __metadata("design:paramtypes", [])
8943
- ], ConfigFragmentService);
8944
- }
8945
- });
8946
-
8947
- // ../nodered_plugincore/build/core/configfragment/template/ConfigFragmentTemplate.js
8948
- var require_ConfigFragmentTemplate = __commonJS({
8949
- "../nodered_plugincore/build/core/configfragment/template/ConfigFragmentTemplate.js"(exports2) {
8950
- "use strict";
8951
- var __decorate = exports2 && exports2.__decorate || function(decorators, target, key, desc) {
8952
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
8953
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
8954
- 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;
8955
- return c > 3 && r && Object.defineProperty(target, key, r), r;
8956
- };
8957
- Object.defineProperty(exports2, "__esModule", { value: true });
8958
- exports2.ConfigFragmentTemplate = void 0;
8959
- var NodeGenerator_1 = require_NodeGenerator();
8960
- var NodeConstructor_1 = require_NodeConstructor();
8961
- var TemplateDescriptionDecorator_1 = require_TemplateDescriptionDecorator();
8962
- var ConfigFragmentService_1 = require_ConfigFragmentService();
8963
- var ConfigFragmentTemplate = class ConfigFragmentTemplate extends NodeConstructor_1.Template {
8964
- };
8965
- exports2.ConfigFragmentTemplate = ConfigFragmentTemplate;
8966
- exports2.ConfigFragmentTemplate = ConfigFragmentTemplate = __decorate([
8967
- (0, TemplateDescriptionDecorator_1.TemplateDescription)({
8968
- name: "configfragment",
8969
- templateFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "ConfigFragmentTemplate.html",
8970
- dependencies: [ConfigFragmentService_1.ConfigFragmentService]
8971
- })
8972
- ], ConfigFragmentTemplate);
8973
- }
8974
- });
8975
-
8976
8880
  // ../nodered_plugincore/build/core/metrics/template/CounterMetricTemplate.js
8977
8881
  var require_CounterMetricTemplate = __commonJS({
8978
8882
  "../nodered_plugincore/build/core/metrics/template/CounterMetricTemplate.js"(exports2) {
@@ -8991,7 +8895,6 @@ var require_CounterMetricTemplate = __commonJS({
8991
8895
  var BasicTemplate_1 = require_BasicTemplate();
8992
8896
  var MetricsService_1 = require_MetricsService();
8993
8897
  var DelegatedConfigReferenceNode_1 = require_DelegatedConfigReferenceNode();
8994
- var ConfigFragmentTemplate_1 = require_ConfigFragmentTemplate();
8995
8898
  var CounterMetricTemplate = class CounterMetricTemplate extends NodeConstructor_1.Template {
8996
8899
  };
8997
8900
  exports2.CounterMetricTemplate = CounterMetricTemplate;
@@ -8999,7 +8902,7 @@ var require_CounterMetricTemplate = __commonJS({
8999
8902
  (0, TemplateDescriptionDecorator_1.TemplateDescription)({
9000
8903
  name: "countermetric",
9001
8904
  templateFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "CounterMetricTemplate.html",
9002
- dependencies: [BasicTemplate_1.BasicTemplate, DelegatedConfigReferenceNode_1.DelegatedConfigReferenceNode, MetricsService_1.MetricsService, ConfigFragmentTemplate_1.ConfigFragmentTemplate]
8905
+ dependencies: [BasicTemplate_1.BasicTemplate, DelegatedConfigReferenceNode_1.DelegatedConfigReferenceNode, MetricsService_1.MetricsService]
9003
8906
  })
9004
8907
  ], CounterMetricTemplate);
9005
8908
  }
@@ -9023,7 +8926,6 @@ var require_GaugeMetricTemplate = __commonJS({
9023
8926
  var BasicTemplate_1 = require_BasicTemplate();
9024
8927
  var MetricsService_1 = require_MetricsService();
9025
8928
  var DelegatedConfigReferenceNode_1 = require_DelegatedConfigReferenceNode();
9026
- var ConfigFragmentTemplate_1 = require_ConfigFragmentTemplate();
9027
8929
  var GaugeMetricTemplate = class GaugeMetricTemplate extends NodeConstructor_1.Template {
9028
8930
  };
9029
8931
  exports2.GaugeMetricTemplate = GaugeMetricTemplate;
@@ -9031,7 +8933,7 @@ var require_GaugeMetricTemplate = __commonJS({
9031
8933
  (0, TemplateDescriptionDecorator_1.TemplateDescription)({
9032
8934
  name: "gaugemetric",
9033
8935
  templateFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "GaugeMetricTemplate.html",
9034
- dependencies: [BasicTemplate_1.BasicTemplate, DelegatedConfigReferenceNode_1.DelegatedConfigReferenceNode, MetricsService_1.MetricsService, ConfigFragmentTemplate_1.ConfigFragmentTemplate]
8936
+ dependencies: [BasicTemplate_1.BasicTemplate, DelegatedConfigReferenceNode_1.DelegatedConfigReferenceNode, MetricsService_1.MetricsService]
9035
8937
  })
9036
8938
  ], GaugeMetricTemplate);
9037
8939
  }
@@ -9076,7 +8978,6 @@ var require_TimerMetricTemplate = __commonJS({
9076
8978
  var BasicTemplate_1 = require_BasicTemplate();
9077
8979
  var MetricsService_1 = require_MetricsService();
9078
8980
  var DelegatedConfigReferenceNode_1 = require_DelegatedConfigReferenceNode();
9079
- var ConfigFragmentTemplate_1 = require_ConfigFragmentTemplate();
9080
8981
  var TimerMetricTemplate = class TimerMetricTemplate extends NodeConstructor_1.Template {
9081
8982
  };
9082
8983
  exports2.TimerMetricTemplate = TimerMetricTemplate;
@@ -9084,7 +8985,7 @@ var require_TimerMetricTemplate = __commonJS({
9084
8985
  (0, TemplateDescriptionDecorator_1.TemplateDescription)({
9085
8986
  name: "timermetric",
9086
8987
  templateFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "TimerMetricTemplate.html",
9087
- dependencies: [BasicTemplate_1.BasicTemplate, DelegatedConfigReferenceNode_1.DelegatedConfigReferenceNode, MetricsService_1.MetricsService, ConfigFragmentTemplate_1.ConfigFragmentTemplate]
8988
+ dependencies: [BasicTemplate_1.BasicTemplate, DelegatedConfigReferenceNode_1.DelegatedConfigReferenceNode, MetricsService_1.MetricsService]
9088
8989
  })
9089
8990
  ], TimerMetricTemplate);
9090
8991
  }
@@ -9162,8 +9063,10 @@ var require_StateService = __commonJS({
9162
9063
  var _GLOBAL_STATE_MEMORY_KEY = "__plugincore_internalstate_memory__";
9163
9064
  var _GLOBAL_STATE_SUBS_KEY = "__plugincore_internalstate_subscribers__";
9164
9065
  var _GLOBAL_STATE_FACTORIES_KEY = "__plugincore_state_factories__";
9066
+ var _GLOBAL_STATE_TYPE_FACTORIES_KEY = "__plugincore_state_type_factories__";
9165
9067
  var _GLOBAL_STATE_CONFIG_KEY = "__plugincore_state_config__";
9166
9068
  var _GLOBAL_STATE_USERDIR_KEY = "__plugincore_state_userDir__";
9069
+ var _GLOBAL_STATE_RED_KEY = "__plugincore_state_red__";
9167
9070
  function getMemoryStore() {
9168
9071
  if (!global[_GLOBAL_STATE_MEMORY_KEY])
9169
9072
  global[_GLOBAL_STATE_MEMORY_KEY] = /* @__PURE__ */ new Map();
@@ -9179,6 +9082,11 @@ var require_StateService = __commonJS({
9179
9082
  global[_GLOBAL_STATE_FACTORIES_KEY] = /* @__PURE__ */ new Map();
9180
9083
  return global[_GLOBAL_STATE_FACTORIES_KEY];
9181
9084
  }
9085
+ function getTypeFactoryStore() {
9086
+ if (!global[_GLOBAL_STATE_TYPE_FACTORIES_KEY])
9087
+ global[_GLOBAL_STATE_TYPE_FACTORIES_KEY] = /* @__PURE__ */ new Map();
9088
+ return global[_GLOBAL_STATE_TYPE_FACTORIES_KEY];
9089
+ }
9182
9090
  function getConfigStore() {
9183
9091
  if (!global[_GLOBAL_STATE_CONFIG_KEY])
9184
9092
  global[_GLOBAL_STATE_CONFIG_KEY] = /* @__PURE__ */ new Map();
@@ -9199,6 +9107,7 @@ var require_StateService = __commonJS({
9199
9107
  }
9200
9108
  init(red) {
9201
9109
  global[_GLOBAL_STATE_USERDIR_KEY] = red.settings.userDir;
9110
+ global[_GLOBAL_STATE_RED_KEY] = red;
9202
9111
  }
9203
9112
  deinit(_red) {
9204
9113
  }
@@ -9228,6 +9137,10 @@ var require_StateService = __commonJS({
9228
9137
  static registerConfig(nodeId, config) {
9229
9138
  getConfigStore().set(nodeId, config);
9230
9139
  }
9140
+ // ---- Type-based factory registration (called by provider modules at load time) ----
9141
+ static registerTypeFactory(typeName, factory) {
9142
+ getTypeFactoryStore().set(typeName, factory);
9143
+ }
9231
9144
  // ---- Handle creation (called by consumer nodes) ----
9232
9145
  static createHandle(stateReference) {
9233
9146
  if (!stateReference)
@@ -9235,6 +9148,19 @@ var require_StateService = __commonJS({
9235
9148
  const factory = getFactoryStore().get(stateReference);
9236
9149
  return factory ? factory() : new DoNothingStateHandle();
9237
9150
  }
9151
+ static createHandleFromRef(stateReference, providerConfig, ownerId) {
9152
+ if (!stateReference)
9153
+ return new DoNothingStateHandle();
9154
+ const red = global[_GLOBAL_STATE_RED_KEY];
9155
+ if (!red)
9156
+ return new DoNothingStateHandle();
9157
+ const providerNode = red.nodes.getNode(stateReference);
9158
+ if (!providerNode)
9159
+ return new DoNothingStateHandle();
9160
+ const providerType = providerNode.type;
9161
+ const factory = getTypeFactoryStore().get(providerType);
9162
+ return factory ? factory(ownerId, providerConfig || {}, stateReference) : new DoNothingStateHandle();
9163
+ }
9238
9164
  // ---- Memory store (used by InternalStateHandle) ----
9239
9165
  static getMemory(nodeId) {
9240
9166
  return getMemoryStore().get(nodeId) ?? null;
@@ -9315,6 +9241,73 @@ var require_StateConfigNode = __commonJS({
9315
9241
  }
9316
9242
  });
9317
9243
 
9244
+ // ../nodered_plugincore/build/core/configfragment/service/ConfigFragmentService.js
9245
+ var require_ConfigFragmentService = __commonJS({
9246
+ "../nodered_plugincore/build/core/configfragment/service/ConfigFragmentService.js"(exports2) {
9247
+ "use strict";
9248
+ var __decorate = exports2 && exports2.__decorate || function(decorators, target, key, desc) {
9249
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
9250
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
9251
+ 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;
9252
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
9253
+ };
9254
+ var __metadata = exports2 && exports2.__metadata || function(k, v) {
9255
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9256
+ };
9257
+ var ConfigFragmentService_1;
9258
+ Object.defineProperty(exports2, "__esModule", { value: true });
9259
+ exports2.ConfigFragmentService = void 0;
9260
+ var NodeConstructor_1 = require_NodeConstructor();
9261
+ var ServiceDescriptionDecorator_1 = require_ServiceDescriptionDecorator();
9262
+ var ConfigFragmentService = ConfigFragmentService_1 = class ConfigFragmentService extends NodeConstructor_1.BaseService {
9263
+ // Global-backed registry so fragments registered across bundle boundaries are visible.
9264
+ static get _fragments() {
9265
+ if (!global.__plugincore_config_fragments__) {
9266
+ global.__plugincore_config_fragments__ = [];
9267
+ }
9268
+ return global.__plugincore_config_fragments__;
9269
+ }
9270
+ constructor() {
9271
+ super("configfragments");
9272
+ }
9273
+ init(red) {
9274
+ red.httpAdmin.get("/configfragment/:section/:providerType", red.auth.needsPermission("inject.write"), (request, response) => {
9275
+ const { section, providerType } = request.params;
9276
+ const fragment = ConfigFragmentService_1._fragments.find((f) => f.section === section && f.providerType === providerType);
9277
+ if (fragment) {
9278
+ response.type("text/html").send(fragment.html);
9279
+ } else {
9280
+ response.status(404).send("");
9281
+ }
9282
+ });
9283
+ return Promise.resolve();
9284
+ }
9285
+ deinit(red) {
9286
+ return Promise.resolve();
9287
+ }
9288
+ /**
9289
+ * Register a config fragment. Called by provider plugins during their service init().
9290
+ * Provider plugins own both sides of the contract: the HTML fragment that collects
9291
+ * the configuration AND the server-side factory that deserializes it.
9292
+ */
9293
+ static registerFragment(registration) {
9294
+ const existing = ConfigFragmentService_1._fragments.find((f) => f.section === registration.section && f.providerType === registration.providerType);
9295
+ if (!existing) {
9296
+ ConfigFragmentService_1._fragments.push(registration);
9297
+ }
9298
+ }
9299
+ };
9300
+ exports2.ConfigFragmentService = ConfigFragmentService;
9301
+ exports2.ConfigFragmentService = ConfigFragmentService = ConfigFragmentService_1 = __decorate([
9302
+ (0, ServiceDescriptionDecorator_1.ServiceDescription)({
9303
+ id: "@theotherwillembotha/configfragmentservice",
9304
+ sourceFile: "@theotherwillembotha/node-red-plugincore"
9305
+ }),
9306
+ __metadata("design:paramtypes", [])
9307
+ ], ConfigFragmentService);
9308
+ }
9309
+ });
9310
+
9318
9311
  // ../nodered_plugincore/build/core/state/node/InternalStateConfigNode.js
9319
9312
  var require_InternalStateConfigNode = __commonJS({
9320
9313
  "../nodered_plugincore/build/core/state/node/InternalStateConfigNode.js"(exports2) {
@@ -9334,6 +9327,7 @@ var require_InternalStateConfigNode = __commonJS({
9334
9327
  var NodeGenerator_1 = require_NodeGenerator();
9335
9328
  var StateService_1 = require_StateService();
9336
9329
  var StateConfigNode_1 = require_StateConfigNode();
9330
+ var ConfigFragmentService_1 = require_ConfigFragmentService();
9337
9331
  var InternalStateHandle = class {
9338
9332
  constructor(nodeId, survivesRedeploy, survivesRestart) {
9339
9333
  this._callback = null;
@@ -9381,15 +9375,9 @@ var require_InternalStateConfigNode = __commonJS({
9381
9375
  var InternalStateConfigNode = class InternalStateConfigNode extends StateConfigNode_1.StateConfigNode {
9382
9376
  constructor(node, config) {
9383
9377
  super(node, config);
9384
- this._survivesRedeploy = config.survivesRedeploy ?? false;
9385
- this._survivesRestart = config.survivesRestart ?? false;
9386
- StateService_1.StateService.registerConfig(config.id, {
9387
- survivesRedeploy: this._survivesRedeploy,
9388
- survivesRestart: this._survivesRestart
9389
- });
9390
9378
  }
9391
9379
  createHandle() {
9392
- return new InternalStateHandle(this.id(), this._survivesRedeploy, this._survivesRestart);
9380
+ return new InternalStateHandle(this.id(), false, false);
9393
9381
  }
9394
9382
  };
9395
9383
  exports2.InternalStateConfigNode = InternalStateConfigNode;
@@ -9405,6 +9393,57 @@ var require_InternalStateConfigNode = __commonJS({
9405
9393
  }),
9406
9394
  __metadata("design:paramtypes", [Object, Object])
9407
9395
  ], InternalStateConfigNode);
9396
+ StateService_1.StateService.registerTypeFactory("InternalStateConfigNode", (ownerId, config, _providerRef) => {
9397
+ const survivesRedeploy = config.survivesRedeploy ?? false;
9398
+ const survivesRestart = config.survivesRestart ?? false;
9399
+ StateService_1.StateService.registerConfig(ownerId, { survivesRedeploy, survivesRestart });
9400
+ return new InternalStateHandle(ownerId, survivesRedeploy, survivesRestart);
9401
+ });
9402
+ var INTERNAL_STATE_FRAGMENT_HTML = `
9403
+ <script type="application/json" fragment-section="metaData">
9404
+ { "label": "Persistence" }
9405
+ </script>
9406
+
9407
+ <script type="text/html" fragment-section="onForm">
9408
+ <div class="form-row nomargin">
9409
+ <label class="towb_editorlabel">&nbsp;</label>
9410
+ <input class="towb_checkbox" type="checkbox" id="fragment-survivesRedeploy" />
9411
+ <label class="towb_checkboxlabel" for="fragment-survivesRedeploy">Survives redeploy</label>
9412
+ </div>
9413
+ <div class="form-row nomargin">
9414
+ <label class="towb_editorlabel">&nbsp;</label>
9415
+ <input class="towb_checkbox" type="checkbox" id="fragment-survivesRestart" />
9416
+ <label class="towb_checkboxlabel" for="fragment-survivesRestart">Survives restart <span style="color:#aaa; font-size:0.85em;">(also writes to disk)</span></label>
9417
+ </div>
9418
+ </script>
9419
+
9420
+ <script type="text/javascript" fragment-section="onLoad">
9421
+ var $c = $(container);
9422
+ $c.find("#fragment-survivesRedeploy").prop("checked", config.survivesRedeploy || false);
9423
+ $c.find("#fragment-survivesRestart").prop("checked", config.survivesRestart || false);
9424
+
9425
+ $c.find("#fragment-survivesRestart").on("change", function() {
9426
+ if ($(this).prop("checked")) {
9427
+ $c.find("#fragment-survivesRedeploy").prop("checked", true).prop("disabled", true);
9428
+ } else {
9429
+ $c.find("#fragment-survivesRedeploy").prop("disabled", false);
9430
+ }
9431
+ }).trigger("change");
9432
+ </script>
9433
+
9434
+ <script type="text/javascript" fragment-section="onSave">
9435
+ var $c = $(container);
9436
+ return {
9437
+ survivesRedeploy: $c.find("#fragment-survivesRedeploy").prop("checked"),
9438
+ survivesRestart: $c.find("#fragment-survivesRestart").prop("checked")
9439
+ };
9440
+ </script>
9441
+ `;
9442
+ ConfigFragmentService_1.ConfigFragmentService.registerFragment({
9443
+ section: "StateConfig",
9444
+ providerType: "InternalStateConfigNode",
9445
+ html: INTERNAL_STATE_FRAGMENT_HTML
9446
+ });
9408
9447
  }
9409
9448
  });
9410
9449
 
@@ -9423,6 +9462,7 @@ var require_StateTemplate = __commonJS({
9423
9462
  var NodeGenerator_1 = require_NodeGenerator();
9424
9463
  var NodeConstructor_1 = require_NodeConstructor();
9425
9464
  var TemplateDescriptionDecorator_1 = require_TemplateDescriptionDecorator();
9465
+ var BasicTemplate_1 = require_BasicTemplate();
9426
9466
  var DelegatedConfigReferenceNode_1 = require_DelegatedConfigReferenceNode();
9427
9467
  var InternalStateConfigNode_1 = require_InternalStateConfigNode();
9428
9468
  var StateService_1 = require_StateService();
@@ -9433,7 +9473,7 @@ var require_StateTemplate = __commonJS({
9433
9473
  (0, TemplateDescriptionDecorator_1.TemplateDescription)({
9434
9474
  name: "state",
9435
9475
  templateFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "StateTemplate.html",
9436
- dependencies: [DelegatedConfigReferenceNode_1.DelegatedConfigReferenceNode, InternalStateConfigNode_1.InternalStateConfigNode, StateService_1.StateService]
9476
+ dependencies: [BasicTemplate_1.BasicTemplate, DelegatedConfigReferenceNode_1.DelegatedConfigReferenceNode, InternalStateConfigNode_1.InternalStateConfigNode, StateService_1.StateService]
9437
9477
  })
9438
9478
  ], StateTemplate);
9439
9479
  }
@@ -9632,6 +9672,35 @@ var require_InputService = __commonJS({
9632
9672
  }
9633
9673
  });
9634
9674
 
9675
+ // ../nodered_plugincore/build/core/configfragment/template/ConfigFragmentTemplate.js
9676
+ var require_ConfigFragmentTemplate = __commonJS({
9677
+ "../nodered_plugincore/build/core/configfragment/template/ConfigFragmentTemplate.js"(exports2) {
9678
+ "use strict";
9679
+ var __decorate = exports2 && exports2.__decorate || function(decorators, target, key, desc) {
9680
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
9681
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
9682
+ 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;
9683
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
9684
+ };
9685
+ Object.defineProperty(exports2, "__esModule", { value: true });
9686
+ exports2.ConfigFragmentTemplate = void 0;
9687
+ var NodeGenerator_1 = require_NodeGenerator();
9688
+ var NodeConstructor_1 = require_NodeConstructor();
9689
+ var TemplateDescriptionDecorator_1 = require_TemplateDescriptionDecorator();
9690
+ var ConfigFragmentService_1 = require_ConfigFragmentService();
9691
+ var ConfigFragmentTemplate = class ConfigFragmentTemplate extends NodeConstructor_1.Template {
9692
+ };
9693
+ exports2.ConfigFragmentTemplate = ConfigFragmentTemplate;
9694
+ exports2.ConfigFragmentTemplate = ConfigFragmentTemplate = __decorate([
9695
+ (0, TemplateDescriptionDecorator_1.TemplateDescription)({
9696
+ name: "configfragment",
9697
+ templateFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "ConfigFragmentTemplate.html",
9698
+ dependencies: [ConfigFragmentService_1.ConfigFragmentService]
9699
+ })
9700
+ ], ConfigFragmentTemplate);
9701
+ }
9702
+ });
9703
+
9635
9704
  // ../nodered_plugincore/node_modules/ms/index.js
9636
9705
  var require_ms = __commonJS({
9637
9706
  "../nodered_plugincore/node_modules/ms/index.js"(exports2, module2) {
package/build/Plugins.js CHANGED
@@ -8877,102 +8877,6 @@ var require_MetricsTemplate = __commonJS({
8877
8877
  }
8878
8878
  });
8879
8879
 
8880
- // ../nodered_plugincore/build/core/configfragment/service/ConfigFragmentService.js
8881
- var require_ConfigFragmentService = __commonJS({
8882
- "../nodered_plugincore/build/core/configfragment/service/ConfigFragmentService.js"(exports2) {
8883
- "use strict";
8884
- var __decorate = exports2 && exports2.__decorate || function(decorators, target, key, desc) {
8885
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
8886
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
8887
- 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;
8888
- return c > 3 && r && Object.defineProperty(target, key, r), r;
8889
- };
8890
- var __metadata = exports2 && exports2.__metadata || function(k, v) {
8891
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
8892
- };
8893
- var ConfigFragmentService_1;
8894
- Object.defineProperty(exports2, "__esModule", { value: true });
8895
- exports2.ConfigFragmentService = void 0;
8896
- var NodeConstructor_1 = require_NodeConstructor();
8897
- var ServiceDescriptionDecorator_1 = require_ServiceDescriptionDecorator();
8898
- var ConfigFragmentService = ConfigFragmentService_1 = class ConfigFragmentService extends NodeConstructor_1.BaseService {
8899
- // Global-backed registry so fragments registered across bundle boundaries are visible.
8900
- static get _fragments() {
8901
- if (!global.__plugincore_config_fragments__) {
8902
- global.__plugincore_config_fragments__ = [];
8903
- }
8904
- return global.__plugincore_config_fragments__;
8905
- }
8906
- constructor() {
8907
- super("configfragments");
8908
- }
8909
- init(red) {
8910
- red.httpAdmin.get("/configfragment/:section/:providerType", red.auth.needsPermission("inject.write"), (request, response) => {
8911
- const { section, providerType } = request.params;
8912
- const fragment = ConfigFragmentService_1._fragments.find((f) => f.section === section && f.providerType === providerType);
8913
- if (fragment) {
8914
- response.type("text/html").send(fragment.html);
8915
- } else {
8916
- response.status(404).send("");
8917
- }
8918
- });
8919
- return Promise.resolve();
8920
- }
8921
- deinit(red) {
8922
- return Promise.resolve();
8923
- }
8924
- /**
8925
- * Register a config fragment. Called by provider plugins during their service init().
8926
- * Provider plugins own both sides of the contract: the HTML fragment that collects
8927
- * the configuration AND the server-side factory that deserializes it.
8928
- */
8929
- static registerFragment(registration) {
8930
- const existing = ConfigFragmentService_1._fragments.find((f) => f.section === registration.section && f.providerType === registration.providerType);
8931
- if (!existing) {
8932
- ConfigFragmentService_1._fragments.push(registration);
8933
- }
8934
- }
8935
- };
8936
- exports2.ConfigFragmentService = ConfigFragmentService;
8937
- exports2.ConfigFragmentService = ConfigFragmentService = ConfigFragmentService_1 = __decorate([
8938
- (0, ServiceDescriptionDecorator_1.ServiceDescription)({
8939
- id: "@theotherwillembotha/configfragmentservice",
8940
- sourceFile: "@theotherwillembotha/node-red-plugincore"
8941
- }),
8942
- __metadata("design:paramtypes", [])
8943
- ], ConfigFragmentService);
8944
- }
8945
- });
8946
-
8947
- // ../nodered_plugincore/build/core/configfragment/template/ConfigFragmentTemplate.js
8948
- var require_ConfigFragmentTemplate = __commonJS({
8949
- "../nodered_plugincore/build/core/configfragment/template/ConfigFragmentTemplate.js"(exports2) {
8950
- "use strict";
8951
- var __decorate = exports2 && exports2.__decorate || function(decorators, target, key, desc) {
8952
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
8953
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
8954
- 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;
8955
- return c > 3 && r && Object.defineProperty(target, key, r), r;
8956
- };
8957
- Object.defineProperty(exports2, "__esModule", { value: true });
8958
- exports2.ConfigFragmentTemplate = void 0;
8959
- var NodeGenerator_1 = require_NodeGenerator();
8960
- var NodeConstructor_1 = require_NodeConstructor();
8961
- var TemplateDescriptionDecorator_1 = require_TemplateDescriptionDecorator();
8962
- var ConfigFragmentService_1 = require_ConfigFragmentService();
8963
- var ConfigFragmentTemplate = class ConfigFragmentTemplate extends NodeConstructor_1.Template {
8964
- };
8965
- exports2.ConfigFragmentTemplate = ConfigFragmentTemplate;
8966
- exports2.ConfigFragmentTemplate = ConfigFragmentTemplate = __decorate([
8967
- (0, TemplateDescriptionDecorator_1.TemplateDescription)({
8968
- name: "configfragment",
8969
- templateFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "ConfigFragmentTemplate.html",
8970
- dependencies: [ConfigFragmentService_1.ConfigFragmentService]
8971
- })
8972
- ], ConfigFragmentTemplate);
8973
- }
8974
- });
8975
-
8976
8880
  // ../nodered_plugincore/build/core/metrics/template/CounterMetricTemplate.js
8977
8881
  var require_CounterMetricTemplate = __commonJS({
8978
8882
  "../nodered_plugincore/build/core/metrics/template/CounterMetricTemplate.js"(exports2) {
@@ -8991,7 +8895,6 @@ var require_CounterMetricTemplate = __commonJS({
8991
8895
  var BasicTemplate_1 = require_BasicTemplate();
8992
8896
  var MetricsService_1 = require_MetricsService();
8993
8897
  var DelegatedConfigReferenceNode_1 = require_DelegatedConfigReferenceNode();
8994
- var ConfigFragmentTemplate_1 = require_ConfigFragmentTemplate();
8995
8898
  var CounterMetricTemplate = class CounterMetricTemplate extends NodeConstructor_1.Template {
8996
8899
  };
8997
8900
  exports2.CounterMetricTemplate = CounterMetricTemplate;
@@ -8999,7 +8902,7 @@ var require_CounterMetricTemplate = __commonJS({
8999
8902
  (0, TemplateDescriptionDecorator_1.TemplateDescription)({
9000
8903
  name: "countermetric",
9001
8904
  templateFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "CounterMetricTemplate.html",
9002
- dependencies: [BasicTemplate_1.BasicTemplate, DelegatedConfigReferenceNode_1.DelegatedConfigReferenceNode, MetricsService_1.MetricsService, ConfigFragmentTemplate_1.ConfigFragmentTemplate]
8905
+ dependencies: [BasicTemplate_1.BasicTemplate, DelegatedConfigReferenceNode_1.DelegatedConfigReferenceNode, MetricsService_1.MetricsService]
9003
8906
  })
9004
8907
  ], CounterMetricTemplate);
9005
8908
  }
@@ -9023,7 +8926,6 @@ var require_GaugeMetricTemplate = __commonJS({
9023
8926
  var BasicTemplate_1 = require_BasicTemplate();
9024
8927
  var MetricsService_1 = require_MetricsService();
9025
8928
  var DelegatedConfigReferenceNode_1 = require_DelegatedConfigReferenceNode();
9026
- var ConfigFragmentTemplate_1 = require_ConfigFragmentTemplate();
9027
8929
  var GaugeMetricTemplate = class GaugeMetricTemplate extends NodeConstructor_1.Template {
9028
8930
  };
9029
8931
  exports2.GaugeMetricTemplate = GaugeMetricTemplate;
@@ -9031,7 +8933,7 @@ var require_GaugeMetricTemplate = __commonJS({
9031
8933
  (0, TemplateDescriptionDecorator_1.TemplateDescription)({
9032
8934
  name: "gaugemetric",
9033
8935
  templateFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "GaugeMetricTemplate.html",
9034
- dependencies: [BasicTemplate_1.BasicTemplate, DelegatedConfigReferenceNode_1.DelegatedConfigReferenceNode, MetricsService_1.MetricsService, ConfigFragmentTemplate_1.ConfigFragmentTemplate]
8936
+ dependencies: [BasicTemplate_1.BasicTemplate, DelegatedConfigReferenceNode_1.DelegatedConfigReferenceNode, MetricsService_1.MetricsService]
9035
8937
  })
9036
8938
  ], GaugeMetricTemplate);
9037
8939
  }
@@ -9076,7 +8978,6 @@ var require_TimerMetricTemplate = __commonJS({
9076
8978
  var BasicTemplate_1 = require_BasicTemplate();
9077
8979
  var MetricsService_1 = require_MetricsService();
9078
8980
  var DelegatedConfigReferenceNode_1 = require_DelegatedConfigReferenceNode();
9079
- var ConfigFragmentTemplate_1 = require_ConfigFragmentTemplate();
9080
8981
  var TimerMetricTemplate = class TimerMetricTemplate extends NodeConstructor_1.Template {
9081
8982
  };
9082
8983
  exports2.TimerMetricTemplate = TimerMetricTemplate;
@@ -9084,7 +8985,7 @@ var require_TimerMetricTemplate = __commonJS({
9084
8985
  (0, TemplateDescriptionDecorator_1.TemplateDescription)({
9085
8986
  name: "timermetric",
9086
8987
  templateFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "TimerMetricTemplate.html",
9087
- dependencies: [BasicTemplate_1.BasicTemplate, DelegatedConfigReferenceNode_1.DelegatedConfigReferenceNode, MetricsService_1.MetricsService, ConfigFragmentTemplate_1.ConfigFragmentTemplate]
8988
+ dependencies: [BasicTemplate_1.BasicTemplate, DelegatedConfigReferenceNode_1.DelegatedConfigReferenceNode, MetricsService_1.MetricsService]
9088
8989
  })
9089
8990
  ], TimerMetricTemplate);
9090
8991
  }
@@ -9162,8 +9063,10 @@ var require_StateService = __commonJS({
9162
9063
  var _GLOBAL_STATE_MEMORY_KEY = "__plugincore_internalstate_memory__";
9163
9064
  var _GLOBAL_STATE_SUBS_KEY = "__plugincore_internalstate_subscribers__";
9164
9065
  var _GLOBAL_STATE_FACTORIES_KEY = "__plugincore_state_factories__";
9066
+ var _GLOBAL_STATE_TYPE_FACTORIES_KEY = "__plugincore_state_type_factories__";
9165
9067
  var _GLOBAL_STATE_CONFIG_KEY = "__plugincore_state_config__";
9166
9068
  var _GLOBAL_STATE_USERDIR_KEY = "__plugincore_state_userDir__";
9069
+ var _GLOBAL_STATE_RED_KEY = "__plugincore_state_red__";
9167
9070
  function getMemoryStore() {
9168
9071
  if (!global[_GLOBAL_STATE_MEMORY_KEY])
9169
9072
  global[_GLOBAL_STATE_MEMORY_KEY] = /* @__PURE__ */ new Map();
@@ -9179,6 +9082,11 @@ var require_StateService = __commonJS({
9179
9082
  global[_GLOBAL_STATE_FACTORIES_KEY] = /* @__PURE__ */ new Map();
9180
9083
  return global[_GLOBAL_STATE_FACTORIES_KEY];
9181
9084
  }
9085
+ function getTypeFactoryStore() {
9086
+ if (!global[_GLOBAL_STATE_TYPE_FACTORIES_KEY])
9087
+ global[_GLOBAL_STATE_TYPE_FACTORIES_KEY] = /* @__PURE__ */ new Map();
9088
+ return global[_GLOBAL_STATE_TYPE_FACTORIES_KEY];
9089
+ }
9182
9090
  function getConfigStore() {
9183
9091
  if (!global[_GLOBAL_STATE_CONFIG_KEY])
9184
9092
  global[_GLOBAL_STATE_CONFIG_KEY] = /* @__PURE__ */ new Map();
@@ -9199,6 +9107,7 @@ var require_StateService = __commonJS({
9199
9107
  }
9200
9108
  init(red) {
9201
9109
  global[_GLOBAL_STATE_USERDIR_KEY] = red.settings.userDir;
9110
+ global[_GLOBAL_STATE_RED_KEY] = red;
9202
9111
  }
9203
9112
  deinit(_red) {
9204
9113
  }
@@ -9228,6 +9137,10 @@ var require_StateService = __commonJS({
9228
9137
  static registerConfig(nodeId, config) {
9229
9138
  getConfigStore().set(nodeId, config);
9230
9139
  }
9140
+ // ---- Type-based factory registration (called by provider modules at load time) ----
9141
+ static registerTypeFactory(typeName, factory) {
9142
+ getTypeFactoryStore().set(typeName, factory);
9143
+ }
9231
9144
  // ---- Handle creation (called by consumer nodes) ----
9232
9145
  static createHandle(stateReference) {
9233
9146
  if (!stateReference)
@@ -9235,6 +9148,19 @@ var require_StateService = __commonJS({
9235
9148
  const factory = getFactoryStore().get(stateReference);
9236
9149
  return factory ? factory() : new DoNothingStateHandle();
9237
9150
  }
9151
+ static createHandleFromRef(stateReference, providerConfig, ownerId) {
9152
+ if (!stateReference)
9153
+ return new DoNothingStateHandle();
9154
+ const red = global[_GLOBAL_STATE_RED_KEY];
9155
+ if (!red)
9156
+ return new DoNothingStateHandle();
9157
+ const providerNode = red.nodes.getNode(stateReference);
9158
+ if (!providerNode)
9159
+ return new DoNothingStateHandle();
9160
+ const providerType = providerNode.type;
9161
+ const factory = getTypeFactoryStore().get(providerType);
9162
+ return factory ? factory(ownerId, providerConfig || {}, stateReference) : new DoNothingStateHandle();
9163
+ }
9238
9164
  // ---- Memory store (used by InternalStateHandle) ----
9239
9165
  static getMemory(nodeId) {
9240
9166
  return getMemoryStore().get(nodeId) ?? null;
@@ -9315,6 +9241,73 @@ var require_StateConfigNode = __commonJS({
9315
9241
  }
9316
9242
  });
9317
9243
 
9244
+ // ../nodered_plugincore/build/core/configfragment/service/ConfigFragmentService.js
9245
+ var require_ConfigFragmentService = __commonJS({
9246
+ "../nodered_plugincore/build/core/configfragment/service/ConfigFragmentService.js"(exports2) {
9247
+ "use strict";
9248
+ var __decorate = exports2 && exports2.__decorate || function(decorators, target, key, desc) {
9249
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
9250
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
9251
+ 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;
9252
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
9253
+ };
9254
+ var __metadata = exports2 && exports2.__metadata || function(k, v) {
9255
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9256
+ };
9257
+ var ConfigFragmentService_1;
9258
+ Object.defineProperty(exports2, "__esModule", { value: true });
9259
+ exports2.ConfigFragmentService = void 0;
9260
+ var NodeConstructor_1 = require_NodeConstructor();
9261
+ var ServiceDescriptionDecorator_1 = require_ServiceDescriptionDecorator();
9262
+ var ConfigFragmentService = ConfigFragmentService_1 = class ConfigFragmentService extends NodeConstructor_1.BaseService {
9263
+ // Global-backed registry so fragments registered across bundle boundaries are visible.
9264
+ static get _fragments() {
9265
+ if (!global.__plugincore_config_fragments__) {
9266
+ global.__plugincore_config_fragments__ = [];
9267
+ }
9268
+ return global.__plugincore_config_fragments__;
9269
+ }
9270
+ constructor() {
9271
+ super("configfragments");
9272
+ }
9273
+ init(red) {
9274
+ red.httpAdmin.get("/configfragment/:section/:providerType", red.auth.needsPermission("inject.write"), (request, response) => {
9275
+ const { section, providerType } = request.params;
9276
+ const fragment = ConfigFragmentService_1._fragments.find((f) => f.section === section && f.providerType === providerType);
9277
+ if (fragment) {
9278
+ response.type("text/html").send(fragment.html);
9279
+ } else {
9280
+ response.status(404).send("");
9281
+ }
9282
+ });
9283
+ return Promise.resolve();
9284
+ }
9285
+ deinit(red) {
9286
+ return Promise.resolve();
9287
+ }
9288
+ /**
9289
+ * Register a config fragment. Called by provider plugins during their service init().
9290
+ * Provider plugins own both sides of the contract: the HTML fragment that collects
9291
+ * the configuration AND the server-side factory that deserializes it.
9292
+ */
9293
+ static registerFragment(registration) {
9294
+ const existing = ConfigFragmentService_1._fragments.find((f) => f.section === registration.section && f.providerType === registration.providerType);
9295
+ if (!existing) {
9296
+ ConfigFragmentService_1._fragments.push(registration);
9297
+ }
9298
+ }
9299
+ };
9300
+ exports2.ConfigFragmentService = ConfigFragmentService;
9301
+ exports2.ConfigFragmentService = ConfigFragmentService = ConfigFragmentService_1 = __decorate([
9302
+ (0, ServiceDescriptionDecorator_1.ServiceDescription)({
9303
+ id: "@theotherwillembotha/configfragmentservice",
9304
+ sourceFile: "@theotherwillembotha/node-red-plugincore"
9305
+ }),
9306
+ __metadata("design:paramtypes", [])
9307
+ ], ConfigFragmentService);
9308
+ }
9309
+ });
9310
+
9318
9311
  // ../nodered_plugincore/build/core/state/node/InternalStateConfigNode.js
9319
9312
  var require_InternalStateConfigNode = __commonJS({
9320
9313
  "../nodered_plugincore/build/core/state/node/InternalStateConfigNode.js"(exports2) {
@@ -9334,6 +9327,7 @@ var require_InternalStateConfigNode = __commonJS({
9334
9327
  var NodeGenerator_1 = require_NodeGenerator();
9335
9328
  var StateService_1 = require_StateService();
9336
9329
  var StateConfigNode_1 = require_StateConfigNode();
9330
+ var ConfigFragmentService_1 = require_ConfigFragmentService();
9337
9331
  var InternalStateHandle = class {
9338
9332
  constructor(nodeId, survivesRedeploy, survivesRestart) {
9339
9333
  this._callback = null;
@@ -9381,15 +9375,9 @@ var require_InternalStateConfigNode = __commonJS({
9381
9375
  var InternalStateConfigNode = class InternalStateConfigNode extends StateConfigNode_1.StateConfigNode {
9382
9376
  constructor(node, config) {
9383
9377
  super(node, config);
9384
- this._survivesRedeploy = config.survivesRedeploy ?? false;
9385
- this._survivesRestart = config.survivesRestart ?? false;
9386
- StateService_1.StateService.registerConfig(config.id, {
9387
- survivesRedeploy: this._survivesRedeploy,
9388
- survivesRestart: this._survivesRestart
9389
- });
9390
9378
  }
9391
9379
  createHandle() {
9392
- return new InternalStateHandle(this.id(), this._survivesRedeploy, this._survivesRestart);
9380
+ return new InternalStateHandle(this.id(), false, false);
9393
9381
  }
9394
9382
  };
9395
9383
  exports2.InternalStateConfigNode = InternalStateConfigNode;
@@ -9405,6 +9393,57 @@ var require_InternalStateConfigNode = __commonJS({
9405
9393
  }),
9406
9394
  __metadata("design:paramtypes", [Object, Object])
9407
9395
  ], InternalStateConfigNode);
9396
+ StateService_1.StateService.registerTypeFactory("InternalStateConfigNode", (ownerId, config, _providerRef) => {
9397
+ const survivesRedeploy = config.survivesRedeploy ?? false;
9398
+ const survivesRestart = config.survivesRestart ?? false;
9399
+ StateService_1.StateService.registerConfig(ownerId, { survivesRedeploy, survivesRestart });
9400
+ return new InternalStateHandle(ownerId, survivesRedeploy, survivesRestart);
9401
+ });
9402
+ var INTERNAL_STATE_FRAGMENT_HTML = `
9403
+ <script type="application/json" fragment-section="metaData">
9404
+ { "label": "Persistence" }
9405
+ </script>
9406
+
9407
+ <script type="text/html" fragment-section="onForm">
9408
+ <div class="form-row nomargin">
9409
+ <label class="towb_editorlabel">&nbsp;</label>
9410
+ <input class="towb_checkbox" type="checkbox" id="fragment-survivesRedeploy" />
9411
+ <label class="towb_checkboxlabel" for="fragment-survivesRedeploy">Survives redeploy</label>
9412
+ </div>
9413
+ <div class="form-row nomargin">
9414
+ <label class="towb_editorlabel">&nbsp;</label>
9415
+ <input class="towb_checkbox" type="checkbox" id="fragment-survivesRestart" />
9416
+ <label class="towb_checkboxlabel" for="fragment-survivesRestart">Survives restart <span style="color:#aaa; font-size:0.85em;">(also writes to disk)</span></label>
9417
+ </div>
9418
+ </script>
9419
+
9420
+ <script type="text/javascript" fragment-section="onLoad">
9421
+ var $c = $(container);
9422
+ $c.find("#fragment-survivesRedeploy").prop("checked", config.survivesRedeploy || false);
9423
+ $c.find("#fragment-survivesRestart").prop("checked", config.survivesRestart || false);
9424
+
9425
+ $c.find("#fragment-survivesRestart").on("change", function() {
9426
+ if ($(this).prop("checked")) {
9427
+ $c.find("#fragment-survivesRedeploy").prop("checked", true).prop("disabled", true);
9428
+ } else {
9429
+ $c.find("#fragment-survivesRedeploy").prop("disabled", false);
9430
+ }
9431
+ }).trigger("change");
9432
+ </script>
9433
+
9434
+ <script type="text/javascript" fragment-section="onSave">
9435
+ var $c = $(container);
9436
+ return {
9437
+ survivesRedeploy: $c.find("#fragment-survivesRedeploy").prop("checked"),
9438
+ survivesRestart: $c.find("#fragment-survivesRestart").prop("checked")
9439
+ };
9440
+ </script>
9441
+ `;
9442
+ ConfigFragmentService_1.ConfigFragmentService.registerFragment({
9443
+ section: "StateConfig",
9444
+ providerType: "InternalStateConfigNode",
9445
+ html: INTERNAL_STATE_FRAGMENT_HTML
9446
+ });
9408
9447
  }
9409
9448
  });
9410
9449
 
@@ -9423,6 +9462,7 @@ var require_StateTemplate = __commonJS({
9423
9462
  var NodeGenerator_1 = require_NodeGenerator();
9424
9463
  var NodeConstructor_1 = require_NodeConstructor();
9425
9464
  var TemplateDescriptionDecorator_1 = require_TemplateDescriptionDecorator();
9465
+ var BasicTemplate_1 = require_BasicTemplate();
9426
9466
  var DelegatedConfigReferenceNode_1 = require_DelegatedConfigReferenceNode();
9427
9467
  var InternalStateConfigNode_1 = require_InternalStateConfigNode();
9428
9468
  var StateService_1 = require_StateService();
@@ -9433,7 +9473,7 @@ var require_StateTemplate = __commonJS({
9433
9473
  (0, TemplateDescriptionDecorator_1.TemplateDescription)({
9434
9474
  name: "state",
9435
9475
  templateFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "StateTemplate.html",
9436
- dependencies: [DelegatedConfigReferenceNode_1.DelegatedConfigReferenceNode, InternalStateConfigNode_1.InternalStateConfigNode, StateService_1.StateService]
9476
+ dependencies: [BasicTemplate_1.BasicTemplate, DelegatedConfigReferenceNode_1.DelegatedConfigReferenceNode, InternalStateConfigNode_1.InternalStateConfigNode, StateService_1.StateService]
9437
9477
  })
9438
9478
  ], StateTemplate);
9439
9479
  }
@@ -9632,6 +9672,35 @@ var require_InputService = __commonJS({
9632
9672
  }
9633
9673
  });
9634
9674
 
9675
+ // ../nodered_plugincore/build/core/configfragment/template/ConfigFragmentTemplate.js
9676
+ var require_ConfigFragmentTemplate = __commonJS({
9677
+ "../nodered_plugincore/build/core/configfragment/template/ConfigFragmentTemplate.js"(exports2) {
9678
+ "use strict";
9679
+ var __decorate = exports2 && exports2.__decorate || function(decorators, target, key, desc) {
9680
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
9681
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
9682
+ 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;
9683
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
9684
+ };
9685
+ Object.defineProperty(exports2, "__esModule", { value: true });
9686
+ exports2.ConfigFragmentTemplate = void 0;
9687
+ var NodeGenerator_1 = require_NodeGenerator();
9688
+ var NodeConstructor_1 = require_NodeConstructor();
9689
+ var TemplateDescriptionDecorator_1 = require_TemplateDescriptionDecorator();
9690
+ var ConfigFragmentService_1 = require_ConfigFragmentService();
9691
+ var ConfigFragmentTemplate = class ConfigFragmentTemplate extends NodeConstructor_1.Template {
9692
+ };
9693
+ exports2.ConfigFragmentTemplate = ConfigFragmentTemplate;
9694
+ exports2.ConfigFragmentTemplate = ConfigFragmentTemplate = __decorate([
9695
+ (0, TemplateDescriptionDecorator_1.TemplateDescription)({
9696
+ name: "configfragment",
9697
+ templateFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "ConfigFragmentTemplate.html",
9698
+ dependencies: [ConfigFragmentService_1.ConfigFragmentService]
9699
+ })
9700
+ ], ConfigFragmentTemplate);
9701
+ }
9702
+ });
9703
+
9635
9704
  // ../nodered_plugincore/node_modules/ms/index.js
9636
9705
  var require_ms = __commonJS({
9637
9706
  "../nodered_plugincore/node_modules/ms/index.js"(exports2, module2) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@theotherwillembotha/node-red-cluster",
3
- "version": "0.4.4",
3
+ "version": "0.4.5",
4
4
  "description": "Node-RED clustering plugin - connect multiple Node-RED instances into a coordinated cluster using NATS JetStream for message transport and NATS KV for shared state.",
5
5
  "main": "./build/index.js",
6
6
  "exports": "./build/index.js",
@@ -46,7 +46,7 @@
46
46
  "@nats-io/kv": "^3.4.0",
47
47
  "@nats-io/nats-core": "^3.4.0",
48
48
  "@nats-io/transport-node": "^3.4.0",
49
- "@theotherwillembotha/node-red-plugincore": "^0.4.4"
49
+ "@theotherwillembotha/node-red-plugincore": "^0.4.5"
50
50
  },
51
51
  "devDependencies": {
52
52
  "@theotherwillembotha/node-red-plugincore": "../nodered_plugincore",