@theotherwillembotha/node-red-plugincore 0.1.0 → 0.3.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.
Files changed (167) hide show
  1. package/README.md +616 -220
  2. package/build/GenerateNodes.js +9 -33
  3. package/build/Nodes.html +2 -1505
  4. package/build/Nodes.js +5 -19
  5. package/build/Plugins.html +11 -0
  6. package/build/Plugins.js +17 -12
  7. package/build/core/NodeConstructor.d.ts +12 -16
  8. package/build/core/NodeConstructor.d.ts.map +1 -1
  9. package/build/core/NodeConstructor.js +125 -185
  10. package/build/core/NodeGenerator.d.ts +3 -1
  11. package/build/core/NodeGenerator.d.ts.map +1 -1
  12. package/build/core/NodeGenerator.js +139 -43
  13. package/build/core/NodeManagerRuntime.d.ts +44 -0
  14. package/build/core/NodeManagerRuntime.d.ts.map +1 -0
  15. package/build/core/NodeManagerRuntime.js +140 -0
  16. package/build/core/Utils.d.ts.map +1 -1
  17. package/build/core/logger/service/LoggerService.d.ts +8 -6
  18. package/build/core/logger/service/LoggerService.d.ts.map +1 -1
  19. package/build/core/logger/service/LoggerService.js +101 -23
  20. package/build/core/logger/template/LoggerTemplate.d.ts +1 -2
  21. package/build/core/logger/template/LoggerTemplate.d.ts.map +1 -1
  22. package/build/core/logger/template/LoggerTemplate.js +18 -5
  23. package/build/core/metrics/MetricsDecorator.d.ts +1 -2
  24. package/build/core/metrics/MetricsDecorator.d.ts.map +1 -1
  25. package/build/core/metrics/MetricsDecorator.js +89 -116
  26. package/build/core/metrics/node/CounterMetricConfigNode.d.ts.map +1 -1
  27. package/build/core/metrics/node/CounterMetricConfigNode.js +4 -5
  28. package/build/core/metrics/node/GaugeMetricConfigNode.d.ts.map +1 -1
  29. package/build/core/metrics/node/GaugeMetricConfigNode.js +5 -6
  30. package/build/core/metrics/node/MetricsConfigNode.d.ts +19 -9
  31. package/build/core/metrics/node/MetricsConfigNode.d.ts.map +1 -1
  32. package/build/core/metrics/node/MetricsConfigNode.js +14 -45
  33. package/build/core/metrics/node/TimerMetricConfigNode.d.ts.map +1 -1
  34. package/build/core/metrics/node/TimerMetricConfigNode.js +11 -17
  35. package/build/core/metrics/service/MetricsService.d.ts +110 -114
  36. package/build/core/metrics/service/MetricsService.d.ts.map +1 -1
  37. package/build/core/metrics/service/MetricsService.js +122 -339
  38. package/build/core/metrics/template/CounterMetricTemplate.d.ts +1 -2
  39. package/build/core/metrics/template/CounterMetricTemplate.d.ts.map +1 -1
  40. package/build/core/metrics/template/CounterMetricTemplate.js +16 -5
  41. package/build/core/metrics/template/GaugeMetricTemplate.d.ts +1 -2
  42. package/build/core/metrics/template/GaugeMetricTemplate.d.ts.map +1 -1
  43. package/build/core/metrics/template/GaugeMetricTemplate.js +16 -5
  44. package/build/core/metrics/template/MetricsTemplate.d.ts +1 -2
  45. package/build/core/metrics/template/MetricsTemplate.d.ts.map +1 -1
  46. package/build/core/metrics/template/MetricsTemplate.js +18 -6
  47. package/build/core/metrics/template/TimerMetricTemplate.d.ts +1 -2
  48. package/build/core/metrics/template/TimerMetricTemplate.d.ts.map +1 -1
  49. package/build/core/metrics/template/TimerMetricTemplate.js +16 -5
  50. package/build/core/other/node/DelegatedConfigReferenceNode.d.ts +1 -1
  51. package/build/core/other/node/DelegatedConfigReferenceNode.d.ts.map +1 -1
  52. package/build/core/other/node/DelegatedConfigReferenceNode.js +1 -1
  53. package/build/core/other/service/InputService.d.ts.map +1 -1
  54. package/build/core/other/service/SettingsService.d.ts +1 -2
  55. package/build/core/other/service/SettingsService.d.ts.map +1 -1
  56. package/build/core/other/service/SettingsService.js +19 -5
  57. package/build/core/other/template/BasicTemplate.d.ts +1 -2
  58. package/build/core/other/template/BasicTemplate.d.ts.map +1 -1
  59. package/build/core/other/template/BasicTemplate.js +15 -5
  60. package/build/core/other/template/SettingsTemplate.d.ts +1 -2
  61. package/build/core/other/template/SettingsTemplate.d.ts.map +1 -1
  62. package/build/core/other/template/SettingsTemplate.js +17 -5
  63. package/build/core/state/node/InternalStateConfigNode.d.ts +16 -0
  64. package/build/core/state/node/InternalStateConfigNode.d.ts.map +1 -0
  65. package/build/core/state/node/InternalStateConfigNode.js +89 -0
  66. package/build/core/state/node/StateConfigNode.d.ts +24 -0
  67. package/build/core/state/node/StateConfigNode.d.ts.map +1 -0
  68. package/build/core/state/node/StateConfigNode.js +22 -0
  69. package/build/core/state/service/StateService.d.ts +34 -0
  70. package/build/core/state/service/StateService.d.ts.map +1 -0
  71. package/build/core/state/service/StateService.js +201 -0
  72. package/build/core/state/template/StateTemplate.d.ts +7 -0
  73. package/build/core/state/template/StateTemplate.d.ts.map +1 -0
  74. package/build/core/state/template/StateTemplate.js +25 -0
  75. package/build/core/tagging/ServiceDescriptionDecorator.d.ts +10 -0
  76. package/build/core/tagging/ServiceDescriptionDecorator.d.ts.map +1 -0
  77. package/build/core/tagging/ServiceDescriptionDecorator.js +10 -0
  78. package/build/core/tagging/TemplateDescriptionDecorator.d.ts +8 -0
  79. package/build/core/tagging/TemplateDescriptionDecorator.d.ts.map +1 -0
  80. package/build/core/tagging/TemplateDescriptionDecorator.js +10 -0
  81. package/build/core/tagging/service/NodeTypeService.d.ts +1 -2
  82. package/build/core/tagging/service/NodeTypeService.d.ts.map +1 -1
  83. package/build/core/tagging/service/NodeTypeService.js +19 -5
  84. package/build/core/ui/template/ScriptEditorTemplate.d.ts +1 -2
  85. package/build/core/ui/template/ScriptEditorTemplate.d.ts.map +1 -1
  86. package/build/core/ui/template/ScriptEditorTemplate.js +15 -5
  87. package/build/core/ui/template/UIHelperTemplate.d.ts +1 -2
  88. package/build/core/ui/template/UIHelperTemplate.d.ts.map +1 -1
  89. package/build/core/ui/template/UIHelperTemplate.js +15 -5
  90. package/build/core/webhook/node/WebhookServerConfigNode.d.ts.map +1 -1
  91. package/build/core/webhook/service/ReverseProxyTypeService.d.ts.map +1 -1
  92. package/build/core/webhook/service/WebhookServerService.d.ts +3 -4
  93. package/build/core/webhook/service/WebhookServerService.d.ts.map +1 -1
  94. package/build/core/webhook/service/WebhookServerService.js +48 -18
  95. package/build/core/webhook/template/WebhookTemplate.d.ts +1 -2
  96. package/build/core/webhook/template/WebhookTemplate.d.ts.map +1 -1
  97. package/build/core/webhook/template/WebhookTemplate.js +19 -6
  98. package/build/index.d.ts +6 -2
  99. package/build/index.d.ts.map +1 -1
  100. package/build/index.js +7 -2
  101. package/build/runtime/NodeManagerRuntime.js +140 -0
  102. package/documentation/CounterMetricConfigNode.png +0 -0
  103. package/documentation/GaugeMetricConfigNode.png +0 -0
  104. package/documentation/LoggerTemplate.png +0 -0
  105. package/documentation/MetricsTemplate.png +0 -0
  106. package/documentation/StateTemplate.png +0 -0
  107. package/documentation/TimerMetricConfigNode_histogram.png +0 -0
  108. package/documentation/TimerMetricConfigNode_summary.png +0 -0
  109. package/documentation/WebhookServerConfigNode.png +0 -0
  110. package/documentation/WebhookTemplate.png +0 -0
  111. package/package.json +4 -11
  112. package/src/GenerateNodes.ts +10 -40
  113. package/src/core/NodeConstructor.ts +150 -228
  114. package/src/core/NodeGenerator.ts +156 -47
  115. package/src/core/NodeManagerRuntime.ts +179 -0
  116. package/src/core/logger/service/LoggerService.ts +60 -32
  117. package/src/core/logger/template/LoggerTemplate.html +11 -6
  118. package/src/core/logger/template/LoggerTemplate.ts +9 -11
  119. package/src/core/metrics/MetricsDecorator.ts +140 -168
  120. package/src/core/metrics/node/CounterMetricConfigNode.ts +20 -20
  121. package/src/core/metrics/node/GaugeMetricConfigNode.ts +24 -25
  122. package/src/core/metrics/node/MetricsConfigNode.ts +29 -48
  123. package/src/core/metrics/node/TimerMetricConfigNode.ts +50 -59
  124. package/src/core/metrics/service/MetricsService.ts +214 -489
  125. package/src/core/metrics/template/CounterMetricTemplate.html +0 -1
  126. package/src/core/metrics/template/CounterMetricTemplate.ts +8 -11
  127. package/src/core/metrics/template/GaugeMetricTemplate.html +1 -1
  128. package/src/core/metrics/template/GaugeMetricTemplate.ts +8 -11
  129. package/src/core/metrics/template/MetricsTemplate.html +132 -13
  130. package/src/core/metrics/template/MetricsTemplate.ts +9 -10
  131. package/src/core/metrics/template/TimerMetricTemplate.ts +8 -10
  132. package/src/core/other/node/DelegatedConfigReferenceNode.ts +1 -1
  133. package/src/core/other/service/SettingsService.ts +6 -10
  134. package/src/core/other/template/BasicTemplate.html +1 -1
  135. package/src/core/other/template/BasicTemplate.ts +6 -11
  136. package/src/core/other/template/SettingsTemplate.ts +8 -13
  137. package/src/core/state/node/InternalStateConfigNode.html +77 -0
  138. package/src/core/state/node/InternalStateConfigNode.ts +102 -0
  139. package/src/core/state/node/StateConfigNode.ts +29 -0
  140. package/src/core/state/service/StateService.ts +180 -0
  141. package/src/core/state/template/StateTemplate.html +244 -0
  142. package/src/core/state/template/StateTemplate.ts +18 -0
  143. package/src/core/tagging/ServiceDescriptionDecorator.ts +23 -0
  144. package/src/core/tagging/TemplateDescriptionDecorator.ts +19 -0
  145. package/src/core/tagging/service/NodeTypeService.ts +6 -11
  146. package/src/core/ui/template/ScriptEditorTemplate.ts +6 -10
  147. package/src/core/ui/template/UIHelperTemplate.html +41 -26
  148. package/src/core/ui/template/UIHelperTemplate.ts +6 -10
  149. package/src/core/webhook/service/WebhookServerService.ts +39 -23
  150. package/src/core/webhook/template/WebhookTemplate.html +28 -35
  151. package/src/core/webhook/template/WebhookTemplate.ts +10 -12
  152. package/src/index.ts +8 -2
  153. package/build/core/logger/node/ConsoleLoggerConfigNode.d.ts +0 -20
  154. package/build/core/logger/node/ConsoleLoggerConfigNode.d.ts.map +0 -1
  155. package/build/core/logger/node/ConsoleLoggerConfigNode.js +0 -62
  156. package/build/core/logger/node/RestLoggerConfigNode.d.ts +0 -40
  157. package/build/core/logger/node/RestLoggerConfigNode.d.ts.map +0 -1
  158. package/build/core/logger/node/RestLoggerConfigNode.js +0 -128
  159. package/documentation/ConsoleLoggerConfigNode.png +0 -0
  160. package/documentation/MetricsConfigNode.png +0 -0
  161. package/documentation/RestLoggerConfigNode.png +0 -0
  162. package/documentation/TimerMetricConfigNode.png +0 -0
  163. package/documentation/WebhookNode.png +0 -0
  164. package/src/core/logger/node/ConsoleLoggerConfigNode.html +0 -90
  165. package/src/core/logger/node/ConsoleLoggerConfigNode.ts +0 -71
  166. package/src/core/logger/node/RestLoggerConfigNode.html +0 -183
  167. package/src/core/logger/node/RestLoggerConfigNode.ts +0 -170
@@ -1 +1 @@
1
- {"version":3,"file":"TimerMetricTemplate.d.ts","sourceRoot":"","sources":["../../../../src/core/metrics/template/TimerMetricTemplate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAG,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAGrE,qBAAa,mBAAoB,SAAQ,QAAQ;WAE/B,qBAAqB,IAAI,kBAAkB;CAO5D"}
1
+ {"version":3,"file":"TimerMetricTemplate.d.ts","sourceRoot":"","sources":["../../../../src/core/metrics/template/TimerMetricTemplate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAIhD,qBAKa,mBAAoB,SAAQ,QAAQ;CAChD"}
@@ -1,12 +1,23 @@
1
1
  "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ 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;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
2
8
  Object.defineProperty(exports, "__esModule", { value: true });
3
9
  exports.TimerMetricTemplate = void 0;
4
10
  const NodeGenerator_1 = require("../../NodeGenerator");
5
11
  const NodeConstructor_1 = require("../../NodeConstructor");
12
+ const TemplateDescriptionDecorator_1 = require("../../tagging/TemplateDescriptionDecorator");
6
13
  const TimerMetricConfigNode_1 = require("../node/TimerMetricConfigNode");
7
- class TimerMetricTemplate extends NodeConstructor_1.Template {
8
- static getTemplateDescriptor() {
9
- return new NodeConstructor_1.TemplateDescriptor("timermetric", TimerMetricTemplate, NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "TimerMetricTemplate.html", [TimerMetricConfigNode_1.TimerMetricConfigNode]);
10
- }
11
- }
14
+ let TimerMetricTemplate = class TimerMetricTemplate extends NodeConstructor_1.Template {
15
+ };
12
16
  exports.TimerMetricTemplate = TimerMetricTemplate;
17
+ exports.TimerMetricTemplate = TimerMetricTemplate = __decorate([
18
+ (0, TemplateDescriptionDecorator_1.TemplateDescription)({
19
+ name: "timermetric",
20
+ templateFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "TimerMetricTemplate.html",
21
+ dependencies: [TimerMetricConfigNode_1.TimerMetricConfigNode],
22
+ })
23
+ ], TimerMetricTemplate);
@@ -1,5 +1,5 @@
1
1
  /**
2
- * DelegatedConfigReferenceNode a framework-internal sentinel type.
2
+ * DelegatedConfigReferenceNode - a framework-internal sentinel type.
3
3
  *
4
4
  * PROBLEM
5
5
  * Node-RED's reference counter (the usage count shown on config nodes in the
@@ -1 +1 @@
1
- {"version":3,"file":"DelegatedConfigReferenceNode.d.ts","sourceRoot":"","sources":["../../../../src/core/other/node/DelegatedConfigReferenceNode.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAIpE,UAAU,kCAAmC,SAAQ,gBAAgB;CAAG;AAExE,qBAOa,4BAA6B,SAAQ,UAAU,CAAC,kCAAkC,CAAC;gBAEhF,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,kCAAkC;CAGrE"}
1
+ {"version":3,"file":"DelegatedConfigReferenceNode.d.ts","sourceRoot":"","sources":["../../../../src/core/other/node/DelegatedConfigReferenceNode.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAIpE,UAAU,kCAAmC,SAAQ,gBAAgB;CAAG;AAExE,qBAOa,4BAA6B,SAAQ,UAAU,CAAC,kCAAkC,CAAC;IAE5F,YAAY,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,kCAAkC,EAEjE;CACJ"}
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  /**
3
- * DelegatedConfigReferenceNode a framework-internal sentinel type.
3
+ * DelegatedConfigReferenceNode - a framework-internal sentinel type.
4
4
  *
5
5
  * PROBLEM
6
6
  * Node-RED's reference counter (the usage count shown on config nodes in the
@@ -1 +1 @@
1
- {"version":3,"file":"InputService.d.ts","sourceRoot":"","sources":["../../../../src/core/other/service/InputService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE3E,qBAAa,KAAK;gBACF,IAAI,EAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,EAAC,WAAW,EAAE,OAAO,EAAC,CAAC,OAAO,EAAC,GAAG,EAAE,YAAY,EAAC,CAAC,KAAK,EAAC,GAAG,KAAK,IAAI,KAAK,IAAI;CAWjI;AAED,qBAAa,YAAY;IACrB,OAAO;IAEP,MAAM,CAAC,MAAM,CAAC,IAAI,EAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,EAAC,WAAW,EAAE,OAAO,EAAC,CAAC,OAAO,EAAC,GAAG,EAAE,YAAY,EAAC,QAAQ,KAAK,IAAI,GAAE,KAAK;CAG/H;AAED,MAAM,WAAW,WAAY,SAAQ,cAAc;CAElD;AAED,8BAAsB,YAAY;aACd,OAAO,CAAC,OAAO,EAAC,GAAG,EAAE,YAAY,EAAC,QAAQ,GAAE,IAAI;CACnE;AAED,qBAAa,aAAc,SAAQ,QAAQ;CAE1C"}
1
+ {"version":3,"file":"InputService.d.ts","sourceRoot":"","sources":["../../../../src/core/other/service/InputService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAE3E,qBAAa,KAAK;IACd,YAAY,IAAI,EAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,EAAC,WAAW,EAAE,OAAO,EAAC,CAAC,OAAO,EAAC,GAAG,EAAE,YAAY,EAAC,CAAC,KAAK,EAAC,GAAG,KAAK,IAAI,KAAK,IAAI,EAU7H;CACJ;AAED,qBAAa,YAAY;IACrB,OAAO,eAAgB;IAEvB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,EAAC,WAAW,EAAE,OAAO,EAAC,CAAC,OAAO,EAAC,GAAG,EAAE,YAAY,EAAC,QAAQ,KAAK,IAAI,GAAE,KAAK,CAE3H;CACJ;AAED,MAAM,WAAW,WAAY,SAAQ,cAAc;CAElD;AAED,8BAAsB,YAAY;IAC9B,SAAgB,OAAO,CAAC,OAAO,EAAC,GAAG,EAAE,YAAY,EAAC,QAAQ,GAAE,IAAI,CAAC;CACpE;AAED,qBAAa,aAAc,SAAQ,QAAQ;CAE1C"}
@@ -1,11 +1,10 @@
1
- import { BaseNode, BaseNodeConfig, BaseService, ServiceDescriptor } from "../../NodeConstructor";
1
+ import { BaseNode, BaseNodeConfig, BaseService } from "../../NodeConstructor";
2
2
  import { NodeAPI, NodeAPISettingsWithData } from "node-red";
3
3
  export declare class SettingsService extends BaseService {
4
4
  static create(node: BaseNode<BaseNodeConfig>, config: SettingsConfig): Settings;
5
5
  constructor();
6
6
  init(red: NodeAPI<NodeAPISettingsWithData>): void;
7
7
  deinit(red: NodeAPI<NodeAPISettingsWithData>): void;
8
- static getServiceDescriptor(): ServiceDescriptor;
9
8
  }
10
9
  export declare class Settings {
11
10
  private _settings;
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsService.d.ts","sourceRoot":"","sources":["../../../../src/core/other/service/SettingsService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAe,iBAAiB,EAAC,MAAM,uBAAuB,CAAA;AAC3G,OAAO,EAAQ,OAAO,EAAW,uBAAuB,EAAC,MAAM,UAAU,CAAC;AAE1E,qBAAa,eAAgB,SAAQ,WAAW;IAE5C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,EAAC,cAAc,GAAG,QAAQ;;IAetE,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAAG,IAAI;IAgBjD,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAAG,IAAI;WAM1C,oBAAoB,IAAG,iBAAiB;CAS3D;AAED,qBAAa,QAAQ;IAEjB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,OAAO,CAAK;gBAER,QAAQ,EAAC,cAAc,EAAE,MAAM,EAAC,cAAc;IAU1D,KAAK,CAAC,GAAG,EAAC,MAAM,GAAE,GAAG;IAIrB,MAAM,IAAG,GAAG;IAIZ,MAAM,CAAC,GAAG,EAAC,MAAM,EAAE,KAAK,EAAC,GAAG;IAI5B,SAAS,CAAC,KAAK,EAAC,GAAG;IAKnB,UAAU,IAAG,OAAO;IAIpB,OAAO;IAKP,MAAM;CAIT;AAED,MAAM,WAAW,cAAe,SAAQ,cAAc;IAClD,iBAAiB,EAAC,MAAM,CAAA;CAC3B"}
1
+ {"version":3,"file":"SettingsService.d.ts","sourceRoot":"","sources":["../../../../src/core/other/service/SettingsService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAc,MAAM,uBAAuB,CAAA;AAExF,OAAO,EAAQ,OAAO,EAAW,uBAAuB,EAAC,MAAM,UAAU,CAAC;AAE1E,qBAIa,eAAgB,SAAQ,WAAW;IAE5C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,EAAC,cAAc,GAAG,QAAQ,CAS5E;IAED,cAEC;IAEM,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAAG,IAAI,CAcvD;IAEM,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAAG,IAAI,CAIzD;CAEJ;AAED,qBAAa,QAAQ;IAEjB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,OAAO,CAAK;IAEpB,YAAY,QAAQ,EAAC,cAAc,EAAE,MAAM,EAAC,cAAc,EAQzD;IAED,KAAK,CAAC,GAAG,EAAC,MAAM,GAAE,GAAG,CAEpB;IAED,MAAM,IAAG,GAAG,CAEX;IAED,MAAM,CAAC,GAAG,EAAC,MAAM,EAAE,KAAK,EAAC,GAAG,QAE3B;IAED,SAAS,CAAC,KAAK,EAAC,GAAG,QAElB;IAGD,UAAU,IAAG,OAAO,CAEnB;IAED,OAAO,SAGN;IAED,MAAM,SAGL;CACJ;AAED,MAAM,WAAW,cAAe,SAAQ,cAAc;IAClD,iBAAiB,EAAC,MAAM,CAAA;CAC3B"}
@@ -1,8 +1,18 @@
1
1
  "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ 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;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
2
11
  Object.defineProperty(exports, "__esModule", { value: true });
3
12
  exports.Settings = exports.SettingsService = void 0;
4
13
  const NodeConstructor_1 = require("../../NodeConstructor");
5
- class SettingsService extends NodeConstructor_1.BaseService {
14
+ const ServiceDescriptionDecorator_1 = require("../../tagging/ServiceDescriptionDecorator");
15
+ let SettingsService = class SettingsService extends NodeConstructor_1.BaseService {
6
16
  static create(node, config) {
7
17
  // load the settings from the settings file.
8
18
  let settings = NodeConstructor_1.NodeManager.RED.settings.get("NodeSettings_" + config.id);
@@ -32,11 +42,15 @@ class SettingsService extends NodeConstructor_1.BaseService {
32
42
  response.status(404);
33
43
  });
34
44
  }
35
- static getServiceDescriptor() {
36
- return new NodeConstructor_1.ServiceDescriptor("@theotherwillembotha/settingsservice", "SettingsService", "services-plugin", "@theotherwillembotha/node-red-plugincore", SettingsService);
37
- }
38
- }
45
+ };
39
46
  exports.SettingsService = SettingsService;
47
+ exports.SettingsService = SettingsService = __decorate([
48
+ (0, ServiceDescriptionDecorator_1.ServiceDescription)({
49
+ id: "@theotherwillembotha/settingsservice",
50
+ sourceFile: "@theotherwillembotha/node-red-plugincore"
51
+ }),
52
+ __metadata("design:paramtypes", [])
53
+ ], SettingsService);
40
54
  class Settings {
41
55
  constructor(settings, config) {
42
56
  this._settings = settings;
@@ -1,5 +1,4 @@
1
- import { Template, TemplateDescriptor } from "../../NodeConstructor";
1
+ import { Template } from "../../NodeConstructor";
2
2
  export declare class BasicTemplate extends Template {
3
- static getTemplateDescriptor(): TemplateDescriptor;
4
3
  }
5
4
  //# sourceMappingURL=BasicTemplate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BasicTemplate.d.ts","sourceRoot":"","sources":["../../../../src/core/other/template/BasicTemplate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAGpE,qBAAa,aAAc,SAAQ,QAAQ;WAE3B,qBAAqB,IAAI,kBAAkB;CAQ1D"}
1
+ {"version":3,"file":"BasicTemplate.d.ts","sourceRoot":"","sources":["../../../../src/core/other/template/BasicTemplate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAIhD,qBAIa,aAAc,SAAQ,QAAQ;CAC1C"}
@@ -1,11 +1,21 @@
1
1
  "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ 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;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
2
8
  Object.defineProperty(exports, "__esModule", { value: true });
3
9
  exports.BasicTemplate = void 0;
4
10
  const NodeConstructor_1 = require("../../NodeConstructor");
5
11
  const NodeGenerator_1 = require("../../NodeGenerator");
6
- class BasicTemplate extends NodeConstructor_1.Template {
7
- static getTemplateDescriptor() {
8
- return new NodeConstructor_1.TemplateDescriptor("basic", BasicTemplate, NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "BasicTemplate.html", []);
9
- }
10
- }
12
+ const TemplateDescriptionDecorator_1 = require("../../tagging/TemplateDescriptionDecorator");
13
+ let BasicTemplate = class BasicTemplate extends NodeConstructor_1.Template {
14
+ };
11
15
  exports.BasicTemplate = BasicTemplate;
16
+ exports.BasicTemplate = BasicTemplate = __decorate([
17
+ (0, TemplateDescriptionDecorator_1.TemplateDescription)({
18
+ name: "basic",
19
+ templateFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "BasicTemplate.html",
20
+ })
21
+ ], BasicTemplate);
@@ -1,5 +1,4 @@
1
- import { Template, TemplateDescriptor } from "../../NodeConstructor";
1
+ import { Template } from "../../NodeConstructor";
2
2
  export declare class SettingsTemplate extends Template {
3
- static getTemplateDescriptor(): TemplateDescriptor;
4
3
  }
5
4
  //# sourceMappingURL=SettingsTemplate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsTemplate.d.ts","sourceRoot":"","sources":["../../../../src/core/other/template/SettingsTemplate.ts"],"names":[],"mappings":"AACA,OAAO,EAAyC,QAAQ,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAG3G,qBAAa,gBAAiB,SAAQ,QAAQ;WAI5B,qBAAqB,IAAI,kBAAkB;CAQ5D"}
1
+ {"version":3,"file":"SettingsTemplate.d.ts","sourceRoot":"","sources":["../../../../src/core/other/template/SettingsTemplate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAKhD,qBAKa,gBAAiB,SAAQ,QAAQ;CAC7C"}
@@ -1,11 +1,23 @@
1
1
  "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ 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;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
2
8
  Object.defineProperty(exports, "__esModule", { value: true });
3
9
  exports.SettingsTemplate = void 0;
4
10
  const NodeConstructor_1 = require("../../NodeConstructor");
5
11
  const NodeGenerator_1 = require("../../NodeGenerator");
6
- class SettingsTemplate extends NodeConstructor_1.Template {
7
- static getTemplateDescriptor() {
8
- return new NodeConstructor_1.TemplateDescriptor("settings", SettingsTemplate, NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "SettingsTemplate.html", []);
9
- }
10
- }
12
+ const TemplateDescriptionDecorator_1 = require("../../tagging/TemplateDescriptionDecorator");
13
+ const SettingsService_1 = require("../service/SettingsService");
14
+ let SettingsTemplate = class SettingsTemplate extends NodeConstructor_1.Template {
15
+ };
11
16
  exports.SettingsTemplate = SettingsTemplate;
17
+ exports.SettingsTemplate = SettingsTemplate = __decorate([
18
+ (0, TemplateDescriptionDecorator_1.TemplateDescription)({
19
+ name: "settings",
20
+ templateFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "SettingsTemplate.html",
21
+ dependencies: [SettingsService_1.SettingsService],
22
+ })
23
+ ], SettingsTemplate);
@@ -0,0 +1,16 @@
1
+ import { Node } from "node-red";
2
+ import { ConfigNodeConfig } from "../../NodeConstructor";
3
+ import { StateHandle } from "../service/StateService";
4
+ import { StateConfigNode } from "./StateConfigNode";
5
+ interface InternalStateConfigNodeConfig extends ConfigNodeConfig {
6
+ survivesRedeploy: boolean;
7
+ survivesRestart: boolean;
8
+ }
9
+ export declare class InternalStateConfigNode extends StateConfigNode {
10
+ private _survivesRedeploy;
11
+ private _survivesRestart;
12
+ constructor(node: Node, config: InternalStateConfigNodeConfig);
13
+ createHandle(): StateHandle;
14
+ }
15
+ export {};
16
+ //# sourceMappingURL=InternalStateConfigNode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InternalStateConfigNode.d.ts","sourceRoot":"","sources":["../../../../src/core/state/node/InternalStateConfigNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD,OAAO,EAAgB,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,UAAU,6BAA8B,SAAQ,gBAAgB;IAC5D,gBAAgB,EAAE,OAAO,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;CAC5B;AA4DD,qBASa,uBAAwB,SAAQ,eAAe;IACxD,OAAO,CAAC,iBAAiB,CAAU;IACnC,OAAO,CAAC,gBAAgB,CAAU;IAElC,YAAY,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,6BAA6B,EAS5D;IAEM,YAAY,IAAI,WAAW,CAMjC;CACJ"}
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ 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;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.InternalStateConfigNode = void 0;
13
+ const NodeDescriptionDecorator_1 = require("../../tagging/NodeDescriptionDecorator");
14
+ const NodeGenerator_1 = require("../../NodeGenerator");
15
+ const StateService_1 = require("../service/StateService");
16
+ const StateConfigNode_1 = require("./StateConfigNode");
17
+ class InternalStateHandle {
18
+ constructor(nodeId, survivesRedeploy, survivesRestart) {
19
+ this._callback = null;
20
+ this._nodeId = nodeId;
21
+ this._survivesRedeploy = survivesRedeploy;
22
+ this._survivesRestart = survivesRestart;
23
+ this._init();
24
+ }
25
+ _init() {
26
+ // On process restart, memory is empty. If this node survives restarts, load from file.
27
+ if (this._survivesRestart && StateService_1.StateService.getMemory(this._nodeId) === null) {
28
+ const fileValue = StateService_1.StateService.readFile(this._nodeId);
29
+ if (fileValue !== null) {
30
+ StateService_1.StateService.setMemory(this._nodeId, fileValue);
31
+ }
32
+ }
33
+ // Default state seeding is the consumer node's responsibility - call set() after get() returns null.
34
+ }
35
+ _read() {
36
+ return StateService_1.StateService.getMemory(this._nodeId);
37
+ }
38
+ _write(value) {
39
+ StateService_1.StateService.setMemory(this._nodeId, value);
40
+ if (this._survivesRestart) {
41
+ StateService_1.StateService.writeFile(this._nodeId, value);
42
+ }
43
+ }
44
+ get() {
45
+ return Promise.resolve(this._read());
46
+ }
47
+ set(stateName) {
48
+ this._write(stateName);
49
+ StateService_1.StateService.notifySubscribers(this._nodeId, stateName);
50
+ return Promise.resolve();
51
+ }
52
+ subscribe(callback) {
53
+ this._callback = callback;
54
+ StateService_1.StateService.addSubscriber(this._nodeId, callback);
55
+ }
56
+ unsubscribe() {
57
+ if (this._callback) {
58
+ StateService_1.StateService.removeSubscriber(this._nodeId, this._callback);
59
+ this._callback = null;
60
+ }
61
+ }
62
+ }
63
+ let InternalStateConfigNode = class InternalStateConfigNode extends StateConfigNode_1.StateConfigNode {
64
+ constructor(node, config) {
65
+ super(node, config);
66
+ this._survivesRedeploy = config.survivesRedeploy ?? false;
67
+ this._survivesRestart = config.survivesRestart ?? false;
68
+ StateService_1.StateService.registerConfig(config.id, {
69
+ survivesRedeploy: this._survivesRedeploy,
70
+ survivesRestart: this._survivesRestart,
71
+ });
72
+ }
73
+ createHandle() {
74
+ return new InternalStateHandle(this.id(), this._survivesRedeploy, this._survivesRestart);
75
+ }
76
+ };
77
+ exports.InternalStateConfigNode = InternalStateConfigNode;
78
+ exports.InternalStateConfigNode = InternalStateConfigNode = __decorate([
79
+ (0, NodeDescriptionDecorator_1.NodeDescription)({
80
+ id: "InternalStateConfigNode",
81
+ name: "Internal State Config Node",
82
+ group: "config",
83
+ sourceFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "InternalStateConfigNode.html",
84
+ package: "@theotherwillembotha/node-red-plugincore",
85
+ dependencies: [StateService_1.StateService],
86
+ tags: ["StateProvider"]
87
+ }),
88
+ __metadata("design:paramtypes", [Object, Object])
89
+ ], InternalStateConfigNode);
@@ -0,0 +1,24 @@
1
+ import { Node } from "node-red";
2
+ import { ConfigNode, ConfigNodeConfig } from "../../NodeConstructor";
3
+ import { StateHandle } from "../service/StateService";
4
+ /**
5
+ * Abstract base for all state provider config nodes.
6
+ *
7
+ * Concrete implementations (e.g. InternalStateConfigNode, ZookeeperStateConfigNode) extend this
8
+ * class, decorate with @NodeDescription + tags: ["StateProvider"], and implement createHandle()
9
+ * to return their backend-specific StateHandle.
10
+ *
11
+ * This class is intentionally NOT decorated with @NodeDescription - it is never registered as a
12
+ * Node-RED node type directly. Only concrete subclasses are registered.
13
+ */
14
+ export declare abstract class StateConfigNode extends ConfigNode<ConfigNodeConfig> {
15
+ constructor(node: Node, config: ConfigNodeConfig);
16
+ /**
17
+ * Creates a new StateHandle for a consumer node.
18
+ * Called once per consumer that references this config node.
19
+ * Each handle maintains its own subscriber slot, so multiple consumers
20
+ * can independently subscribe and unsubscribe without interfering.
21
+ */
22
+ abstract createHandle(): StateHandle;
23
+ }
24
+ //# sourceMappingURL=StateConfigNode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StateConfigNode.d.ts","sourceRoot":"","sources":["../../../../src/core/state/node/StateConfigNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,WAAW,EAAgB,MAAM,yBAAyB,CAAC;AAEpE;;;;;;;;;GASG;AACH,8BAAsB,eAAgB,SAAQ,UAAU,CAAC,gBAAgB,CAAC;IAEtE,YAAY,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAG/C;IAED;;;;;OAKG;IACH,SAAgB,YAAY,IAAI,WAAW,CAAC;CAC/C"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StateConfigNode = void 0;
4
+ const NodeConstructor_1 = require("../../NodeConstructor");
5
+ const StateService_1 = require("../service/StateService");
6
+ /**
7
+ * Abstract base for all state provider config nodes.
8
+ *
9
+ * Concrete implementations (e.g. InternalStateConfigNode, ZookeeperStateConfigNode) extend this
10
+ * class, decorate with @NodeDescription + tags: ["StateProvider"], and implement createHandle()
11
+ * to return their backend-specific StateHandle.
12
+ *
13
+ * This class is intentionally NOT decorated with @NodeDescription - it is never registered as a
14
+ * Node-RED node type directly. Only concrete subclasses are registered.
15
+ */
16
+ class StateConfigNode extends NodeConstructor_1.ConfigNode {
17
+ constructor(node, config) {
18
+ super(node, config);
19
+ StateService_1.StateService.registerFactory(config.id, () => this.createHandle());
20
+ }
21
+ }
22
+ exports.StateConfigNode = StateConfigNode;
@@ -0,0 +1,34 @@
1
+ import { BaseService, FlowDeployment } from "../../NodeConstructor";
2
+ import { NodeAPI, NodeAPISettingsWithData } from "node-red";
3
+ export interface StateHandle {
4
+ get(): Promise<string | null>;
5
+ set(stateName: string): Promise<void>;
6
+ subscribe(callback: (stateName: string) => void): void;
7
+ unsubscribe(): void;
8
+ }
9
+ export declare class DoNothingStateHandle implements StateHandle {
10
+ get(): Promise<string | null>;
11
+ set(_stateName: string): Promise<void>;
12
+ subscribe(_callback: (stateName: string) => void): void;
13
+ unsubscribe(): void;
14
+ }
15
+ export declare class StateService extends BaseService {
16
+ constructor();
17
+ init(red: NodeAPI<NodeAPISettingsWithData>): void;
18
+ deinit(_red: NodeAPI<NodeAPISettingsWithData>): void;
19
+ onDeploy(deployment: FlowDeployment): Promise<void>;
20
+ static registerFactory(nodeId: string, factory: () => StateHandle): void;
21
+ static registerConfig(nodeId: string, config: {
22
+ survivesRedeploy: boolean;
23
+ survivesRestart: boolean;
24
+ }): void;
25
+ static createHandle(stateReference: string): StateHandle;
26
+ static getMemory(nodeId: string): string | null;
27
+ static setMemory(nodeId: string, value: string): void;
28
+ static readFile(nodeId: string): string | null;
29
+ static writeFile(nodeId: string, value: string): void;
30
+ static addSubscriber(nodeId: string, callback: (s: string) => void): void;
31
+ static removeSubscriber(nodeId: string, callback: (s: string) => void): void;
32
+ static notifySubscribers(nodeId: string, value: string): void;
33
+ }
34
+ //# sourceMappingURL=StateService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StateService.d.ts","sourceRoot":"","sources":["../../../../src/core/state/service/StateService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEpE,OAAO,EAAE,OAAO,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAQ5D,MAAM,WAAW,WAAW;IACxB,GAAG,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC9B,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,SAAS,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IACvD,WAAW,IAAI,IAAI,CAAC;CACvB;AAED,qBAAa,oBAAqB,YAAW,WAAW;IAC7C,GAAG,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAkC;IAC/D,GAAG,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAA8B;IACpE,SAAS,CAAC,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAG;IAC1D,WAAW,IAAI,IAAI,CAAG;CAChC;AAgDD,qBAMa,YAAa,SAAQ,WAAW;IAEzC,cAEC;IAEM,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAAG,IAAI,CAEvD;IAEM,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAAG,IAAI,CAAG;IAEjD,QAAQ,CAAC,UAAU,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAsB/D;IAID,OAAc,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,WAAW,GAAG,IAAI,CAE9E;IAED,OAAc,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE;QAAE,gBAAgB,EAAE,OAAO,CAAC;QAAC,eAAe,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAElH;IAID,OAAc,YAAY,CAAC,cAAc,EAAE,MAAM,GAAG,WAAW,CAI9D;IAID,OAAc,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAErD;IAED,OAAc,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAE3D;IAID,OAAc,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAUpD;IAED,OAAc,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAM3D;IAID,OAAc,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAI/E;IAED,OAAc,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAElF;IAED,OAAc,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAInE;CACJ"}
@@ -0,0 +1,201 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ 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;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __metadata = (this && this.__metadata) || function (k, v) {
42
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
+ };
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.StateService = exports.DoNothingStateHandle = void 0;
46
+ const NodeConstructor_1 = require("../../NodeConstructor");
47
+ const ServiceDescriptionDecorator_1 = require("../../tagging/ServiceDescriptionDecorator");
48
+ const fs = __importStar(require("fs"));
49
+ const path = __importStar(require("path"));
50
+ class DoNothingStateHandle {
51
+ get() { return Promise.resolve(null); }
52
+ set(_stateName) { return Promise.resolve(); }
53
+ subscribe(_callback) { }
54
+ unsubscribe() { }
55
+ }
56
+ exports.DoNothingStateHandle = DoNothingStateHandle;
57
+ // (StateReference removed - stateEnabled is no longer optional; consumers pass the ID directly)
58
+ // ******************************************************* //
59
+ // Global Store Keys //
60
+ // ******************************************************* //
61
+ const _GLOBAL_STATE_MEMORY_KEY = '__plugincore_internalstate_memory__';
62
+ const _GLOBAL_STATE_SUBS_KEY = '__plugincore_internalstate_subscribers__';
63
+ const _GLOBAL_STATE_FACTORIES_KEY = '__plugincore_state_factories__';
64
+ const _GLOBAL_STATE_CONFIG_KEY = '__plugincore_state_config__';
65
+ const _GLOBAL_STATE_USERDIR_KEY = '__plugincore_state_userDir__';
66
+ function getMemoryStore() {
67
+ if (!global[_GLOBAL_STATE_MEMORY_KEY])
68
+ global[_GLOBAL_STATE_MEMORY_KEY] = new Map();
69
+ return global[_GLOBAL_STATE_MEMORY_KEY];
70
+ }
71
+ function getSubscriberStore() {
72
+ if (!global[_GLOBAL_STATE_SUBS_KEY])
73
+ global[_GLOBAL_STATE_SUBS_KEY] = new Map();
74
+ return global[_GLOBAL_STATE_SUBS_KEY];
75
+ }
76
+ function getFactoryStore() {
77
+ if (!global[_GLOBAL_STATE_FACTORIES_KEY])
78
+ global[_GLOBAL_STATE_FACTORIES_KEY] = new Map();
79
+ return global[_GLOBAL_STATE_FACTORIES_KEY];
80
+ }
81
+ function getConfigStore() {
82
+ if (!global[_GLOBAL_STATE_CONFIG_KEY])
83
+ global[_GLOBAL_STATE_CONFIG_KEY] = new Map();
84
+ return global[_GLOBAL_STATE_CONFIG_KEY];
85
+ }
86
+ function getUserDir() {
87
+ return global[_GLOBAL_STATE_USERDIR_KEY];
88
+ }
89
+ function stateFilePath(nodeId) {
90
+ const userDir = getUserDir();
91
+ if (!userDir)
92
+ return null;
93
+ return path.join(userDir, 'internalstate', nodeId + '.json');
94
+ }
95
+ // ******************************************************* //
96
+ // StateService //
97
+ // ******************************************************* //
98
+ let StateService = class StateService extends NodeConstructor_1.BaseService {
99
+ constructor() {
100
+ super("StateService");
101
+ }
102
+ init(red) {
103
+ global[_GLOBAL_STATE_USERDIR_KEY] = red.settings.userDir;
104
+ }
105
+ deinit(_red) { }
106
+ async onDeploy(deployment) {
107
+ const flowIds = new Set(deployment.flows.map(e => e.id));
108
+ const factories = getFactoryStore();
109
+ const configs = getConfigStore();
110
+ const memory = getMemoryStore();
111
+ // Remove factories for config nodes no longer in the flow.
112
+ factories.forEach((_, nodeId) => {
113
+ if (!flowIds.has(nodeId))
114
+ factories.delete(nodeId);
115
+ });
116
+ // Clear memory for state config nodes that are gone or do not survive redeploy.
117
+ configs.forEach((cfg, nodeId) => {
118
+ if (!flowIds.has(nodeId)) {
119
+ memory.delete(nodeId);
120
+ configs.delete(nodeId);
121
+ }
122
+ else if (!cfg.survivesRedeploy && !cfg.survivesRestart) {
123
+ memory.delete(nodeId);
124
+ }
125
+ });
126
+ return Promise.resolve();
127
+ }
128
+ // ---- Factory registration (called by StateConfigNode subclasses) ----
129
+ static registerFactory(nodeId, factory) {
130
+ getFactoryStore().set(nodeId, factory);
131
+ }
132
+ static registerConfig(nodeId, config) {
133
+ getConfigStore().set(nodeId, config);
134
+ }
135
+ // ---- Handle creation (called by consumer nodes) ----
136
+ static createHandle(stateReference) {
137
+ if (!stateReference)
138
+ return new DoNothingStateHandle();
139
+ const factory = getFactoryStore().get(stateReference);
140
+ return factory ? factory() : new DoNothingStateHandle();
141
+ }
142
+ // ---- Memory store (used by InternalStateHandle) ----
143
+ static getMemory(nodeId) {
144
+ return getMemoryStore().get(nodeId) ?? null;
145
+ }
146
+ static setMemory(nodeId, value) {
147
+ getMemoryStore().set(nodeId, value);
148
+ }
149
+ // ---- File store (used by InternalStateHandle) ----
150
+ static readFile(nodeId) {
151
+ const filePath = stateFilePath(nodeId);
152
+ if (!filePath)
153
+ return null;
154
+ try {
155
+ if (!fs.existsSync(filePath))
156
+ return null;
157
+ const content = fs.readFileSync(filePath, 'utf8');
158
+ return JSON.parse(content).value ?? null;
159
+ }
160
+ catch {
161
+ return null;
162
+ }
163
+ }
164
+ static writeFile(nodeId, value) {
165
+ const filePath = stateFilePath(nodeId);
166
+ if (!filePath)
167
+ return;
168
+ const dir = path.dirname(filePath);
169
+ if (!fs.existsSync(dir))
170
+ fs.mkdirSync(dir, { recursive: true });
171
+ fs.writeFileSync(filePath, JSON.stringify({ value }), 'utf8');
172
+ }
173
+ // ---- Subscriber management (used by InternalStateHandle) ----
174
+ static addSubscriber(nodeId, callback) {
175
+ const store = getSubscriberStore();
176
+ if (!store.has(nodeId))
177
+ store.set(nodeId, new Set());
178
+ store.get(nodeId).add(callback);
179
+ }
180
+ static removeSubscriber(nodeId, callback) {
181
+ getSubscriberStore().get(nodeId)?.delete(callback);
182
+ }
183
+ static notifySubscribers(nodeId, value) {
184
+ getSubscriberStore().get(nodeId)?.forEach(cb => {
185
+ try {
186
+ cb(value);
187
+ }
188
+ catch { }
189
+ });
190
+ }
191
+ };
192
+ exports.StateService = StateService;
193
+ exports.StateService = StateService = __decorate([
194
+ (0, ServiceDescriptionDecorator_1.ServiceDescription)({
195
+ id: "@theotherwillembotha/stateservice",
196
+ name: "StateService",
197
+ type: "integration-plugin",
198
+ sourceFile: "@theotherwillembotha/node-red-plugincore",
199
+ }),
200
+ __metadata("design:paramtypes", [])
201
+ ], StateService);
@@ -0,0 +1,7 @@
1
+ import { BaseNodeConfig, Template } from "../../NodeConstructor";
2
+ export interface StateTemplateConfig extends BaseNodeConfig {
3
+ stateReference: string;
4
+ }
5
+ export declare class StateTemplate extends Template {
6
+ }
7
+ //# sourceMappingURL=StateTemplate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StateTemplate.d.ts","sourceRoot":"","sources":["../../../../src/core/state/template/StateTemplate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAMjE,MAAM,WAAW,mBAAoB,SAAQ,cAAc;IACvD,cAAc,EAAE,MAAM,CAAC;CAC1B;AAED,qBAKa,aAAc,SAAQ,QAAQ;CAC1C"}