@theotherwillembotha/node-red-plugincore 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +616 -220
- package/build/GenerateNodes.js +3 -6
- package/build/Nodes.html +3 -1504
- package/build/Nodes.js +5 -15
- package/build/Plugins.html +227 -0
- package/build/Plugins.js +18 -8
- package/build/core/NodeConstructor.d.ts +9 -16
- package/build/core/NodeConstructor.d.ts.map +1 -1
- package/build/core/NodeConstructor.js +109 -146
- package/build/core/NodeGenerator.d.ts.map +1 -1
- package/build/core/NodeGenerator.js +79 -28
- package/build/core/NodeManagerRuntime.d.ts +44 -0
- package/build/core/NodeManagerRuntime.d.ts.map +1 -0
- package/build/core/NodeManagerRuntime.js +140 -0
- package/build/core/Utils.d.ts.map +1 -1
- package/build/core/logger/service/LoggerService.d.ts +6 -5
- package/build/core/logger/service/LoggerService.d.ts.map +1 -1
- package/build/core/logger/service/LoggerService.js +51 -20
- package/build/core/logger/template/LoggerTemplate.d.ts.map +1 -1
- package/build/core/metrics/MetricsDecorator.d.ts +1 -2
- package/build/core/metrics/MetricsDecorator.d.ts.map +1 -1
- package/build/core/metrics/MetricsDecorator.js +89 -116
- package/build/core/metrics/node/CounterMetricConfigNode.d.ts.map +1 -1
- package/build/core/metrics/node/CounterMetricConfigNode.js +4 -5
- package/build/core/metrics/node/GaugeMetricConfigNode.d.ts.map +1 -1
- package/build/core/metrics/node/GaugeMetricConfigNode.js +5 -6
- package/build/core/metrics/node/MetricsConfigNode.d.ts +19 -9
- package/build/core/metrics/node/MetricsConfigNode.d.ts.map +1 -1
- package/build/core/metrics/node/MetricsConfigNode.js +14 -45
- package/build/core/metrics/node/TimerMetricConfigNode.d.ts.map +1 -1
- package/build/core/metrics/node/TimerMetricConfigNode.js +11 -17
- package/build/core/metrics/service/MetricsService.d.ts +110 -114
- package/build/core/metrics/service/MetricsService.d.ts.map +1 -1
- package/build/core/metrics/service/MetricsService.js +122 -339
- package/build/core/metrics/template/CounterMetricTemplate.d.ts.map +1 -1
- package/build/core/metrics/template/GaugeMetricTemplate.d.ts.map +1 -1
- package/build/core/metrics/template/MetricsTemplate.d.ts.map +1 -1
- package/build/core/metrics/template/MetricsTemplate.js +1 -2
- package/build/core/metrics/template/TimerMetricTemplate.d.ts.map +1 -1
- package/build/core/other/node/DelegatedConfigReferenceNode.d.ts +1 -1
- package/build/core/other/node/DelegatedConfigReferenceNode.d.ts.map +1 -1
- package/build/core/other/node/DelegatedConfigReferenceNode.js +1 -1
- package/build/core/other/service/InputService.d.ts.map +1 -1
- package/build/core/other/service/SettingsService.d.ts +1 -2
- package/build/core/other/service/SettingsService.d.ts.map +1 -1
- package/build/core/other/service/SettingsService.js +19 -5
- package/build/core/other/template/BasicTemplate.d.ts.map +1 -1
- package/build/core/other/template/SettingsTemplate.d.ts.map +1 -1
- package/build/core/state/node/InternalStateConfigNode.d.ts +16 -0
- package/build/core/state/node/InternalStateConfigNode.d.ts.map +1 -0
- package/build/core/state/node/InternalStateConfigNode.js +89 -0
- package/build/core/state/node/StateConfigNode.d.ts +24 -0
- package/build/core/state/node/StateConfigNode.d.ts.map +1 -0
- package/build/core/state/node/StateConfigNode.js +22 -0
- package/build/core/state/service/StateService.d.ts +34 -0
- package/build/core/state/service/StateService.d.ts.map +1 -0
- package/build/core/state/service/StateService.js +201 -0
- package/build/core/state/template/StateTemplate.d.ts +8 -0
- package/build/core/state/template/StateTemplate.d.ts.map +1 -0
- package/build/core/state/template/StateTemplate.js +11 -0
- package/build/core/tagging/ServiceDescriptionDecorator.d.ts +10 -0
- package/build/core/tagging/ServiceDescriptionDecorator.d.ts.map +1 -0
- package/build/core/tagging/ServiceDescriptionDecorator.js +10 -0
- package/build/core/tagging/service/NodeTypeService.d.ts +1 -2
- package/build/core/tagging/service/NodeTypeService.d.ts.map +1 -1
- package/build/core/tagging/service/NodeTypeService.js +19 -5
- package/build/core/ui/template/ScriptEditorTemplate.d.ts.map +1 -1
- package/build/core/ui/template/UIHelperTemplate.d.ts.map +1 -1
- package/build/core/webhook/node/WebhookServerConfigNode.d.ts.map +1 -1
- package/build/core/webhook/service/ReverseProxyTypeService.d.ts.map +1 -1
- package/build/core/webhook/service/WebhookServerService.d.ts +3 -4
- package/build/core/webhook/service/WebhookServerService.d.ts.map +1 -1
- package/build/core/webhook/service/WebhookServerService.js +48 -18
- package/build/core/webhook/template/WebhookTemplate.d.ts.map +1 -1
- package/build/index.d.ts +5 -2
- package/build/index.d.ts.map +1 -1
- package/build/index.js +6 -2
- package/build/runtime/NodeManagerRuntime.js +140 -0
- package/documentation/CounterMetricConfigNode.png +0 -0
- package/documentation/GaugeMetricConfigNode.png +0 -0
- package/documentation/LoggerTemplate.png +0 -0
- package/documentation/MetricsTemplate.png +0 -0
- package/documentation/StateTemplate.png +0 -0
- package/documentation/TimerMetricConfigNode_histogram.png +0 -0
- package/documentation/TimerMetricConfigNode_summary.png +0 -0
- package/documentation/WebhookServerConfigNode.png +0 -0
- package/documentation/WebhookTemplate.png +0 -0
- package/package.json +4 -10
- package/src/GenerateNodes.ts +7 -11
- package/src/core/NodeConstructor.ts +130 -186
- package/src/core/NodeGenerator.ts +88 -33
- package/src/core/NodeManagerRuntime.ts +179 -0
- package/src/core/logger/service/LoggerService.ts +39 -26
- package/src/core/logger/template/LoggerTemplate.html +11 -6
- package/src/core/metrics/MetricsDecorator.ts +140 -168
- package/src/core/metrics/node/CounterMetricConfigNode.ts +20 -20
- package/src/core/metrics/node/GaugeMetricConfigNode.ts +24 -25
- package/src/core/metrics/node/MetricsConfigNode.ts +29 -48
- package/src/core/metrics/node/TimerMetricConfigNode.ts +50 -59
- package/src/core/metrics/service/MetricsService.ts +214 -489
- package/src/core/metrics/template/CounterMetricTemplate.html +0 -1
- package/src/core/metrics/template/GaugeMetricTemplate.html +1 -1
- package/src/core/metrics/template/MetricsTemplate.html +132 -13
- package/src/core/metrics/template/MetricsTemplate.ts +3 -4
- package/src/core/other/node/DelegatedConfigReferenceNode.ts +1 -1
- package/src/core/other/service/SettingsService.ts +6 -10
- package/src/core/other/template/BasicTemplate.html +1 -1
- package/src/core/state/node/InternalStateConfigNode.html +77 -0
- package/src/core/state/node/InternalStateConfigNode.ts +102 -0
- package/src/core/state/node/StateConfigNode.ts +29 -0
- package/src/core/state/service/StateService.ts +180 -0
- package/src/core/state/template/StateTemplate.html +244 -0
- package/src/core/state/template/StateTemplate.ts +17 -0
- package/src/core/tagging/ServiceDescriptionDecorator.ts +23 -0
- package/src/core/tagging/service/NodeTypeService.ts +6 -11
- package/src/core/ui/template/UIHelperTemplate.html +41 -26
- package/src/core/webhook/service/WebhookServerService.ts +39 -23
- package/src/core/webhook/template/WebhookTemplate.html +28 -35
- package/src/index.ts +7 -2
- package/build/core/logger/node/ConsoleLoggerConfigNode.d.ts +0 -20
- package/build/core/logger/node/ConsoleLoggerConfigNode.d.ts.map +0 -1
- package/build/core/logger/node/ConsoleLoggerConfigNode.js +0 -62
- package/build/core/logger/node/RestLoggerConfigNode.d.ts +0 -40
- package/build/core/logger/node/RestLoggerConfigNode.d.ts.map +0 -1
- package/build/core/logger/node/RestLoggerConfigNode.js +0 -128
- package/documentation/ConsoleLoggerConfigNode.png +0 -0
- package/documentation/MetricsConfigNode.png +0 -0
- package/documentation/RestLoggerConfigNode.png +0 -0
- package/documentation/TimerMetricConfigNode.png +0 -0
- package/documentation/WebhookNode.png +0 -0
- package/src/core/logger/node/ConsoleLoggerConfigNode.html +0 -90
- package/src/core/logger/node/ConsoleLoggerConfigNode.ts +0 -71
- package/src/core/logger/node/RestLoggerConfigNode.html +0 -183
- package/src/core/logger/node/RestLoggerConfigNode.ts +0 -170
|
@@ -1,15 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var
|
|
3
|
-
|
|
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);
|
|
4
10
|
};
|
|
5
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
12
|
exports.WebhookServerService = exports.WebhookServer = exports.EndpointMethodType = void 0;
|
|
7
13
|
const NodeConstructor_1 = require("../../NodeConstructor");
|
|
14
|
+
const ServiceDescriptionDecorator_1 = require("../../tagging/ServiceDescriptionDecorator");
|
|
8
15
|
const WebhookServerConfigNode_1 = require("../node/WebhookServerConfigNode");
|
|
9
16
|
const WebhookTemplate_1 = require("../template/WebhookTemplate");
|
|
10
|
-
const express_1 = __importDefault(require("express"));
|
|
11
17
|
const LoggerService_1 = require("../../logger/service/LoggerService");
|
|
12
|
-
|
|
18
|
+
function getExpress() { return require('express'); }
|
|
19
|
+
function getBodyParser() { return require('body-parser'); }
|
|
13
20
|
var EndpointMethodType;
|
|
14
21
|
(function (EndpointMethodType) {
|
|
15
22
|
EndpointMethodType["GET"] = "GET";
|
|
@@ -18,8 +25,8 @@ var EndpointMethodType;
|
|
|
18
25
|
class WebhookServer {
|
|
19
26
|
constructor(config) {
|
|
20
27
|
this._config = config;
|
|
21
|
-
this._app = (
|
|
22
|
-
this._app.use(
|
|
28
|
+
this._app = getExpress()();
|
|
29
|
+
this._app.use(getBodyParser().json({ type: "application/json", limit: '50mb' }));
|
|
23
30
|
this._listener = this._app.listen(this._config.port, '0.0.0.0');
|
|
24
31
|
}
|
|
25
32
|
attach(endpoint, callback) {
|
|
@@ -78,13 +85,22 @@ class WebhookServer {
|
|
|
78
85
|
});
|
|
79
86
|
});
|
|
80
87
|
}
|
|
88
|
+
close() {
|
|
89
|
+
this._listener.close();
|
|
90
|
+
}
|
|
81
91
|
config() {
|
|
82
92
|
return this._config;
|
|
83
93
|
}
|
|
84
94
|
}
|
|
85
95
|
exports.WebhookServer = WebhookServer;
|
|
86
|
-
|
|
87
|
-
|
|
96
|
+
// Stored on global so all bundled copies share the same server registry.
|
|
97
|
+
const _GLOBAL_WEBHOOKSERVERS_KEY = '__plugincore_webhookservers__';
|
|
98
|
+
function getWebhookServersStore() {
|
|
99
|
+
if (!global[_GLOBAL_WEBHOOKSERVERS_KEY])
|
|
100
|
+
global[_GLOBAL_WEBHOOKSERVERS_KEY] = {};
|
|
101
|
+
return global[_GLOBAL_WEBHOOKSERVERS_KEY];
|
|
102
|
+
}
|
|
103
|
+
let WebhookServerService = class WebhookServerService extends NodeConstructor_1.BaseService {
|
|
88
104
|
constructor() {
|
|
89
105
|
super("wehbookserver");
|
|
90
106
|
}
|
|
@@ -98,8 +114,9 @@ class WebhookServerService extends NodeConstructor_1.BaseService {
|
|
|
98
114
|
let removedServers = [];
|
|
99
115
|
let addedServers = [];
|
|
100
116
|
let webhookServerNodes = flowDeployment.flows.filter(node => node.type === "WebhookServerConfigNode");
|
|
117
|
+
const store = getWebhookServersStore();
|
|
101
118
|
// find all the nodes that have been removed or changed.
|
|
102
|
-
Object.entries(
|
|
119
|
+
Object.entries(store).forEach(([key, serverService]) => {
|
|
103
120
|
let webhookServerNode = webhookServerNodes.find(node => node.id === key);
|
|
104
121
|
let serverServiceConfig = serverService.config();
|
|
105
122
|
// compare the properties.
|
|
@@ -121,21 +138,34 @@ class WebhookServerService extends NodeConstructor_1.BaseService {
|
|
|
121
138
|
});
|
|
122
139
|
// find all the servers that have been added.
|
|
123
140
|
webhookServerNodes
|
|
124
|
-
.filter(node => !
|
|
141
|
+
.filter(node => !store[node.id])
|
|
125
142
|
.forEach(node => addedServers.push(node));
|
|
126
|
-
//
|
|
127
|
-
|
|
143
|
+
// Close and remove servers that have been deleted or whose config changed.
|
|
144
|
+
removedServers.forEach(removedConfig => {
|
|
145
|
+
const server = store[removedConfig.id];
|
|
146
|
+
if (server) {
|
|
147
|
+
server.close();
|
|
148
|
+
delete store[removedConfig.id];
|
|
149
|
+
console.log(`Closed webhook server on port ${removedConfig.port}`);
|
|
150
|
+
}
|
|
151
|
+
});
|
|
128
152
|
}
|
|
129
153
|
static get(config) {
|
|
130
|
-
|
|
154
|
+
const store = getWebhookServersStore();
|
|
155
|
+
let server = store[config.id];
|
|
131
156
|
if (!server) {
|
|
132
|
-
|
|
157
|
+
store[config.id] = server = new WebhookServer(config);
|
|
133
158
|
console.log(`Creating webhook server on port ${config.port}`);
|
|
134
159
|
}
|
|
135
160
|
return server;
|
|
136
161
|
}
|
|
137
|
-
|
|
138
|
-
return new NodeConstructor_1.ServiceDescriptor("@theotherwillembotha/webhookserverservice", "WebhookServerService", "services-plugin", "@theotherwillembotha/node-red-plugincore", WebhookServerService, [WebhookServerConfigNode_1.WebhookServerConfigNode, WebhookTemplate_1.WebhookTemplate]);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
162
|
+
};
|
|
141
163
|
exports.WebhookServerService = WebhookServerService;
|
|
164
|
+
exports.WebhookServerService = WebhookServerService = __decorate([
|
|
165
|
+
(0, ServiceDescriptionDecorator_1.ServiceDescription)({
|
|
166
|
+
id: "@theotherwillembotha/webhookserverservice",
|
|
167
|
+
sourceFile: "@theotherwillembotha/node-red-plugincore",
|
|
168
|
+
dependencies: [WebhookServerConfigNode_1.WebhookServerConfigNode, WebhookTemplate_1.WebhookTemplate]
|
|
169
|
+
}),
|
|
170
|
+
__metadata("design:paramtypes", [])
|
|
171
|
+
], WebhookServerService);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebhookTemplate.d.ts","sourceRoot":"","sources":["../../../../src/core/webhook/template/WebhookTemplate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAGpF,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAEvF,MAAM,WAAW,qBAAsB,SAAQ,cAAc;IACzD,OAAO,EAAC,MAAM,CAAC;IACf,WAAW,EAAC,MAAM,CAAC;IACnB,WAAW,EAAC,YAAY,CAAC;IACzB,0BAA0B,EAAC,MAAM,CAAC;IAClC,0BAA0B,EAAC,MAAM,CAAC;IAClC,4BAA4B,EAAC,mBAAmB,CAAC;IACjD,sBAAsB,EAAC,MAAM,CAAC;IAC9B,wBAAwB,EAAC,MAAM,CAAC;IAEhC,sBAAsB,EAAC,OAAO,CAAC;IAC/B,0BAA0B,EAAC,sBAAsB,EAAE,CAAC;CACvD;AAED,MAAM,MAAM,sBAAsB,GAAG;IACjC,KAAK,EAAC,MAAM,CAAC;IACb,UAAU,EAAC,MAAM,CAAA;CACpB,CAAA;AAED,qBAAa,eAAgB,SAAQ,QAAQ;IAEzC,MAAM,CAAC,qBAAqB,IAAI,kBAAkB;
|
|
1
|
+
{"version":3,"file":"WebhookTemplate.d.ts","sourceRoot":"","sources":["../../../../src/core/webhook/template/WebhookTemplate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAGpF,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAEvF,MAAM,WAAW,qBAAsB,SAAQ,cAAc;IACzD,OAAO,EAAC,MAAM,CAAC;IACf,WAAW,EAAC,MAAM,CAAC;IACnB,WAAW,EAAC,YAAY,CAAC;IACzB,0BAA0B,EAAC,MAAM,CAAC;IAClC,0BAA0B,EAAC,MAAM,CAAC;IAClC,4BAA4B,EAAC,mBAAmB,CAAC;IACjD,sBAAsB,EAAC,MAAM,CAAC;IAC9B,wBAAwB,EAAC,MAAM,CAAC;IAEhC,sBAAsB,EAAC,OAAO,CAAC;IAC/B,0BAA0B,EAAC,sBAAsB,EAAE,CAAC;CACvD;AAED,MAAM,MAAM,sBAAsB,GAAG;IACjC,KAAK,EAAC,MAAM,CAAC;IACb,UAAU,EAAC,MAAM,CAAA;CACpB,CAAA;AAED,qBAAa,eAAgB,SAAQ,QAAQ;IAEzC,MAAM,CAAC,qBAAqB,IAAI,kBAAkB,CAKjD;CACJ"}
|
package/build/index.d.ts
CHANGED
|
@@ -2,8 +2,6 @@ export * from "./core/Utils";
|
|
|
2
2
|
export * from "./core/NodeGenerator";
|
|
3
3
|
export * from "./core/NodeConstructor";
|
|
4
4
|
export * from "./core/logger/service/LoggerService";
|
|
5
|
-
export * from "./core/logger/node/ConsoleLoggerConfigNode";
|
|
6
|
-
export * from "./core/logger/node/RestLoggerConfigNode";
|
|
7
5
|
export * from "./core/logger/template/LoggerTemplate";
|
|
8
6
|
export * from "./core/metrics/service/MetricsService";
|
|
9
7
|
export * from "./core/metrics/template/MetricsTemplate";
|
|
@@ -14,8 +12,13 @@ export * from "./core/metrics/node/CounterMetricConfigNode";
|
|
|
14
12
|
export * from "./core/metrics/node/GaugeMetricConfigNode";
|
|
15
13
|
export * from "./core/metrics/node/TimerMetricConfigNode";
|
|
16
14
|
export * from "./core/metrics/template/TimerMetricTemplate";
|
|
15
|
+
export * from "./core/state/service/StateService";
|
|
16
|
+
export * from "./core/state/node/StateConfigNode";
|
|
17
|
+
export * from "./core/state/node/InternalStateConfigNode";
|
|
18
|
+
export * from "./core/state/template/StateTemplate";
|
|
17
19
|
export * from "./core/tagging/service/NodeTypeService";
|
|
18
20
|
export * from "./core/tagging/NodeDescriptionDecorator";
|
|
21
|
+
export * from "./core/tagging/ServiceDescriptionDecorator";
|
|
19
22
|
export * from "./core/ui/template/UIHelperTemplate";
|
|
20
23
|
export * from "./core/ui/template/ScriptEditorTemplate";
|
|
21
24
|
export * from "./core/other/node/DelegatedConfigReferenceNode";
|
package/build/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AAGvC,cAAc,qCAAqC,CAAC;AACpD,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AAGvC,cAAc,qCAAqC,CAAC;AACpD,cAAc,uCAAuC,CAAC;AAItD,cAAc,uCAAuC,CAAC;AACtD,cAAc,yCAAyC,CAAC;AACxD,cAAc,+CAA+C,CAAC;AAC9D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,uCAAuC,CAAC;AACtD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,6CAA6C,CAAC;AAG5D,cAAc,mCAAmC,CAAC;AAClD,cAAc,mCAAmC,CAAC;AAClD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,qCAAqC,CAAC;AAGpD,cAAc,wCAAwC,CAAC;AACvD,cAAc,yCAAyC,CAAC;AACxD,cAAc,4CAA4C,CAAC;AAG3D,cAAc,qCAAqC,CAAC;AACpD,cAAc,yCAAyC,CAAC;AAGxD,cAAc,gDAAgD,CAAC;AAC/D,cAAc,mCAAmC,CAAC;AAClD,cAAc,sCAAsC,CAAC;AACrD,cAAc,qCAAqC,CAAC;AACpD,cAAc,wCAAwC,CAAC;AAGvD,cAAc,yCAAyC,CAAC;AACxD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,6CAA6C,CAAC;AAG5D,cAAc,gDAAgD,CAAC;AAG/D,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC"}
|
package/build/index.js
CHANGED
|
@@ -19,8 +19,6 @@ __exportStar(require("./core/NodeGenerator"), exports);
|
|
|
19
19
|
__exportStar(require("./core/NodeConstructor"), exports);
|
|
20
20
|
// LOGGER
|
|
21
21
|
__exportStar(require("./core/logger/service/LoggerService"), exports);
|
|
22
|
-
__exportStar(require("./core/logger/node/ConsoleLoggerConfigNode"), exports);
|
|
23
|
-
__exportStar(require("./core/logger/node/RestLoggerConfigNode"), exports);
|
|
24
22
|
__exportStar(require("./core/logger/template/LoggerTemplate"), exports);
|
|
25
23
|
// METRICS
|
|
26
24
|
__exportStar(require("./core/metrics/service/MetricsService"), exports);
|
|
@@ -32,9 +30,15 @@ __exportStar(require("./core/metrics/node/CounterMetricConfigNode"), exports);
|
|
|
32
30
|
__exportStar(require("./core/metrics/node/GaugeMetricConfigNode"), exports);
|
|
33
31
|
__exportStar(require("./core/metrics/node/TimerMetricConfigNode"), exports);
|
|
34
32
|
__exportStar(require("./core/metrics/template/TimerMetricTemplate"), exports);
|
|
33
|
+
// STATE
|
|
34
|
+
__exportStar(require("./core/state/service/StateService"), exports);
|
|
35
|
+
__exportStar(require("./core/state/node/StateConfigNode"), exports);
|
|
36
|
+
__exportStar(require("./core/state/node/InternalStateConfigNode"), exports);
|
|
37
|
+
__exportStar(require("./core/state/template/StateTemplate"), exports);
|
|
35
38
|
// TAGGING
|
|
36
39
|
__exportStar(require("./core/tagging/service/NodeTypeService"), exports);
|
|
37
40
|
__exportStar(require("./core/tagging/NodeDescriptionDecorator"), exports);
|
|
41
|
+
__exportStar(require("./core/tagging/ServiceDescriptionDecorator"), exports);
|
|
38
42
|
// UI
|
|
39
43
|
__exportStar(require("./core/ui/template/UIHelperTemplate"), exports);
|
|
40
44
|
__exportStar(require("./core/ui/template/ScriptEditorTemplate"), exports);
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* NodeManagerRuntime.ts
|
|
4
|
+
*
|
|
5
|
+
* STANDALONE - zero imports from the rest of plugincore.
|
|
6
|
+
*
|
|
7
|
+
* This file is compiled and copied into every plugin's build output so that
|
|
8
|
+
* plugins are self-contained and do not require plugincore to be separately
|
|
9
|
+
* installed in the user's Node-RED environment.
|
|
10
|
+
*
|
|
11
|
+
* When multiple plugins are deployed, each ships its own copy of this file.
|
|
12
|
+
* The first plugin to load registers its NodeManager and nodes; subsequent
|
|
13
|
+
* copies operate independently on their own node types with no conflict.
|
|
14
|
+
*
|
|
15
|
+
* POST_CONSTRUCT_KEY is intentionally a plain string (not a Symbol) so that
|
|
16
|
+
* the decorators (from plugincore's NodeConstructor, loaded via the plugin's
|
|
17
|
+
* dependency on plugincore) and this runtime file (a separate module instance)
|
|
18
|
+
* resolve to the same property key on node instances.
|
|
19
|
+
*/
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
exports.NodeManager = exports.POST_CONSTRUCT_KEY = exports.NODEMANAGER_API_VERSION = void 0;
|
|
22
|
+
exports.runPostConstructInitializers = runPostConstructInitializers;
|
|
23
|
+
// ─── API version ────────────────────────────────────────────────────────────
|
|
24
|
+
// Semver of the NodeManager API contract - independent of plugincore's package
|
|
25
|
+
// version. Bump when the contract changes; plugins can read this to warn users
|
|
26
|
+
// that they were built against a different NodeManager version.
|
|
27
|
+
exports.NODEMANAGER_API_VERSION = "1.0.0";
|
|
28
|
+
// ─── Shared key for post-construct initializer lists ────────────────────────
|
|
29
|
+
// Must be a plain string so it resolves identically across module instances.
|
|
30
|
+
exports.POST_CONSTRUCT_KEY = '__plugincore_postConstructInitializers__';
|
|
31
|
+
// ─── Post-construct initializer runner ───────────────────────────────────────
|
|
32
|
+
function runPostConstructInitializers(instance) {
|
|
33
|
+
const initializers = instance[exports.POST_CONSTRUCT_KEY];
|
|
34
|
+
if (!initializers || initializers.length === 0)
|
|
35
|
+
return;
|
|
36
|
+
const className = instance.constructor.name;
|
|
37
|
+
initializers.forEach((init, index) => {
|
|
38
|
+
try {
|
|
39
|
+
init(instance);
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
console.error(`Post-construct initialization failed:\n` +
|
|
43
|
+
` Class: ${className}\n` +
|
|
44
|
+
` Initializer: ${index + 1}/${initializers.length}\n` +
|
|
45
|
+
` Error: ${error instanceof Error ? error.message : String(error)}`);
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
delete instance[exports.POST_CONSTRUCT_KEY];
|
|
50
|
+
}
|
|
51
|
+
// ─── NodeManager ─────────────────────────────────────────────────────────────
|
|
52
|
+
// RED is stored on `global` rather than as a static class field so that all
|
|
53
|
+
// module instances of NodeManagerRuntime (the local copy bundled into Nodes.js
|
|
54
|
+
// and the copy bundled via plugincore's NodeConstructor) share the same value.
|
|
55
|
+
// Without this, esbuild's two separate inline copies would have independent
|
|
56
|
+
// static fields and the one used by decorators would never see RED being set.
|
|
57
|
+
const _GLOBAL_RED_KEY = '__plugincore_NodeManager_RED__';
|
|
58
|
+
// ─── Global node-type registration guard ─────────────────────────────────────
|
|
59
|
+
// When multiple self-contained plugins are installed they each bundle plugincore
|
|
60
|
+
// inline and each try to call RED.nodes.registerType for the same shared
|
|
61
|
+
// infrastructure node types (ConsoleLoggerConfigNode, RestLoggerConfigNode, etc.).
|
|
62
|
+
// Node-RED rejects duplicate registrations with a warning and the second
|
|
63
|
+
// plugin's Nodes.js fails to load. This global set tracks which types have
|
|
64
|
+
// already been registered so subsequent plugins silently skip them.
|
|
65
|
+
const _GLOBAL_REGISTERED_NODES_KEY = '__plugincore_registered_nodes__';
|
|
66
|
+
function getRegisteredNodes() {
|
|
67
|
+
if (!global[_GLOBAL_REGISTERED_NODES_KEY]) {
|
|
68
|
+
global[_GLOBAL_REGISTERED_NODES_KEY] = new Set();
|
|
69
|
+
}
|
|
70
|
+
return global[_GLOBAL_REGISTERED_NODES_KEY];
|
|
71
|
+
}
|
|
72
|
+
class NodeManager {
|
|
73
|
+
constructor(RED) {
|
|
74
|
+
this.typeBacklog = [];
|
|
75
|
+
global[_GLOBAL_RED_KEY] = RED;
|
|
76
|
+
const nodeTypeServiceId = "@theotherwillembotha/nodetypeservice";
|
|
77
|
+
const nodeTypeServiceListener = (pluginID) => {
|
|
78
|
+
if (pluginID === nodeTypeServiceId) {
|
|
79
|
+
RED.events.off('plugin.instantiated', nodeTypeServiceListener);
|
|
80
|
+
this.nodeTypeService = RED.plugins.get(nodeTypeServiceId).instance;
|
|
81
|
+
for (const nodeType of this.typeBacklog) {
|
|
82
|
+
for (const tag of nodeType.getNodeDescriptor().tags()) {
|
|
83
|
+
this.nodeTypeService.registerNodeType(tag, nodeType);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
this.typeBacklog = [];
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
this.nodeTypeService = RED.plugins.get(nodeTypeServiceId)?.instance;
|
|
90
|
+
if (!this.nodeTypeService) {
|
|
91
|
+
RED.events.on('plugin.instantiated', nodeTypeServiceListener);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
static get RED() {
|
|
95
|
+
return global[_GLOBAL_RED_KEY];
|
|
96
|
+
}
|
|
97
|
+
registerNodeType(typeName, type) {
|
|
98
|
+
if (!type) {
|
|
99
|
+
console.error(`[NodeManager v${exports.NODEMANAGER_API_VERSION}] Type "${typeName}" is undefined. ` +
|
|
100
|
+
`Ensure it is exported and included in GenerateNodes.`);
|
|
101
|
+
return this;
|
|
102
|
+
}
|
|
103
|
+
const registeredNodes = getRegisteredNodes();
|
|
104
|
+
if (registeredNodes.has(typeName)) {
|
|
105
|
+
// Already registered by another plugin - skip to avoid Node-RED duplicate-registration error.
|
|
106
|
+
return this;
|
|
107
|
+
}
|
|
108
|
+
registeredNodes.add(typeName);
|
|
109
|
+
const nodeConstructor = function (config) {
|
|
110
|
+
try {
|
|
111
|
+
NodeManager.RED.nodes.createNode(this, config);
|
|
112
|
+
const node = new type(this, config);
|
|
113
|
+
runPostConstructInitializers(node);
|
|
114
|
+
if (node.onInit) {
|
|
115
|
+
node.onInit();
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
console.error(`[NodeManager v${exports.NODEMANAGER_API_VERSION}] Failed to construct node "${typeName}":`, error);
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
try {
|
|
123
|
+
NodeManager.RED.nodes.registerType(typeName, nodeConstructor, { settings: {} });
|
|
124
|
+
const nodeDescription = type.getNodeDescriptor();
|
|
125
|
+
if (this.nodeTypeService) {
|
|
126
|
+
for (const tag of nodeDescription.tags()) {
|
|
127
|
+
this.nodeTypeService.registerNodeType(tag, type);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
this.typeBacklog.push(type);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
console.error(`[NodeManager v${exports.NODEMANAGER_API_VERSION}] Failed to register node type "${typeName}":`, error);
|
|
136
|
+
}
|
|
137
|
+
return this;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
exports.NodeManager = NodeManager;
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@theotherwillembotha/node-red-plugincore",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "A core framework for building production-grade Node-RED plugins, with built-in support for structured logging, metrics, and webhook ingestion.",
|
|
5
5
|
"author": "Willem Botha (@theotherwillembotha)",
|
|
6
6
|
"license": "ISC",
|
|
@@ -47,27 +47,21 @@
|
|
|
47
47
|
"nodered": ">=4.0.0"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
|
-
"@types/deep-equal": "^1.0.4",
|
|
51
50
|
"@types/js-beautify": "^1.14.3",
|
|
52
51
|
"@types/jsdom": "^28.0.3",
|
|
53
52
|
"@types/markdown-it": "^14.1.2",
|
|
54
|
-
"@types/node": "^
|
|
55
|
-
"@types/node-red": "~1.3.5"
|
|
56
|
-
"@types/whatwg-url": "^13.0.0"
|
|
53
|
+
"@types/node": "^26.1.1",
|
|
54
|
+
"@types/node-red": "~1.3.5"
|
|
57
55
|
},
|
|
58
56
|
"dependencies": {
|
|
59
57
|
"body-parser": "^2.2.0",
|
|
60
|
-
"deep-equal": "^2.2.3",
|
|
61
58
|
"express": "^5.1.0",
|
|
62
59
|
"handlebars": "^4.7.8",
|
|
63
60
|
"js-beautify": "^1.15.4",
|
|
64
61
|
"jsdom": "^29.1.1",
|
|
65
62
|
"markdown-it": "^14.1.0",
|
|
66
63
|
"network": "^0.7.0",
|
|
67
|
-
"
|
|
68
|
-
"reflect-metadata": "^0.2.2",
|
|
69
|
-
"whatwg-url": "^16.0.1",
|
|
70
|
-
"winston": "^3.17.0"
|
|
64
|
+
"reflect-metadata": "^0.2.2"
|
|
71
65
|
},
|
|
72
66
|
"node-red": {
|
|
73
67
|
"version": ">=4.0.0",
|
package/src/GenerateNodes.ts
CHANGED
|
@@ -1,21 +1,22 @@
|
|
|
1
1
|
|
|
2
2
|
import { DelegatedConfigReferenceNode } from "./core/other/node/DelegatedConfigReferenceNode.js";
|
|
3
3
|
import { NodeTypeService } from "./core/tagging/service/NodeTypeService.js";
|
|
4
|
-
import { NodeGenerator, SettingsService, BasicTemplate, SettingsTemplate, TimerMetricTemplate,
|
|
4
|
+
import { NodeGenerator, SettingsService, BasicTemplate, SettingsTemplate, TimerMetricTemplate, UIHelperTemplate, ScriptEditorTemplate } from "./index.js"
|
|
5
5
|
import { WebhookServerConfigNode, WebhookServerService, WebhookTemplate, } from "./index.js"
|
|
6
6
|
|
|
7
7
|
import {LoggerService, LoggerTemplate } from "./index.js";
|
|
8
8
|
|
|
9
9
|
import { MetricsService, MetricsTemplate, CounterMetricTemplate, GaugeMetricTemplate} from "./index.js";
|
|
10
|
-
import {
|
|
10
|
+
import { StateService, StateTemplate, InternalStateConfigNode } from "./index.js";
|
|
11
11
|
|
|
12
12
|
new NodeGenerator("./src/core/")
|
|
13
13
|
// services.
|
|
14
14
|
.registerService(LoggerService)
|
|
15
15
|
.registerService(MetricsService)
|
|
16
16
|
.registerService(SettingsService)
|
|
17
|
-
.registerService(WebhookServerService)
|
|
17
|
+
.registerService(WebhookServerService)
|
|
18
18
|
.registerService(NodeTypeService)
|
|
19
|
+
.registerService(StateService)
|
|
19
20
|
|
|
20
21
|
// templates.
|
|
21
22
|
.registerTemplate(BasicTemplate)
|
|
@@ -28,19 +29,14 @@ new NodeGenerator("./src/core/")
|
|
|
28
29
|
.registerTemplate(WebhookTemplate)
|
|
29
30
|
.registerTemplate(UIHelperTemplate)
|
|
30
31
|
.registerTemplate(ScriptEditorTemplate)
|
|
32
|
+
.registerTemplate(StateTemplate)
|
|
31
33
|
|
|
32
34
|
// nodes
|
|
33
35
|
.registerNode(DelegatedConfigReferenceNode)
|
|
34
|
-
.registerNode(ConsoleLoggerConfigNode)
|
|
35
|
-
.registerNode(RestLoggerConfigNode)
|
|
36
|
-
|
|
37
|
-
.registerNode(MetricsConfigNode)
|
|
38
|
-
.registerNode(CounterMetricConfigNode)
|
|
39
|
-
.registerNode(GaugeMetricConfigNode)
|
|
40
|
-
.registerNode(TimerMetricConfigNode)
|
|
41
36
|
.registerNode(WebhookServerConfigNode)
|
|
37
|
+
.registerNode(InternalStateConfigNode)
|
|
42
38
|
|
|
43
39
|
// done.
|
|
44
40
|
.generate("./build/Nodes", "./build/Plugins");
|
|
45
41
|
|
|
46
|
-
process.exit(0);
|
|
42
|
+
process.exit(0);
|