@oas-tools/oas-telemetry 0.7.1 → 0.8.0-alpha.1
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/.env.example +17 -3
- package/README.md +1 -2
- package/dist/cjs/config/bootConfig.cjs +16 -14
- package/dist/cjs/config/config.cjs +120 -125
- package/dist/cjs/config/config.types.cjs +1 -4
- package/dist/cjs/docs/openapi.yaml +158 -4
- package/dist/cjs/index.cjs +27 -30
- package/dist/cjs/routesManager.cjs +62 -70
- package/dist/cjs/telemetry/custom-implementations/exporters/DiskLogExporter.cjs +121 -0
- package/dist/cjs/telemetry/custom-implementations/exporters/DiskMetricExporter.cjs +101 -0
- package/dist/cjs/telemetry/custom-implementations/exporters/DiskTraceExporter.cjs +103 -0
- package/dist/cjs/telemetry/custom-implementations/exporters/InMemoryDbLogExporter.cjs +194 -190
- package/dist/cjs/telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.cjs +147 -99
- package/dist/cjs/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.cjs +143 -116
- package/dist/cjs/telemetry/custom-implementations/exporters/MultiMetricExporter.cjs +57 -0
- package/dist/cjs/telemetry/custom-implementations/instrumentations/logsInstrumentation.cjs +92 -0
- package/dist/cjs/telemetry/custom-implementations/metrics/tsdb/Chunk.cjs +159 -0
- package/dist/cjs/telemetry/custom-implementations/metrics/tsdb/Series.cjs +168 -0
- package/dist/cjs/telemetry/custom-implementations/metrics/tsdb/SeriesRegistry.cjs +392 -0
- package/dist/cjs/telemetry/custom-implementations/metrics/tsdb/types.cjs +2 -0
- package/dist/cjs/telemetry/custom-implementations/metrics/tsdb/utils.cjs +77 -0
- package/dist/cjs/telemetry/custom-implementations/processors/dynamicMultiLogProcessor.cjs +65 -63
- package/dist/cjs/telemetry/custom-implementations/processors/dynamicMultiSpanProcessor.cjs +63 -62
- package/dist/cjs/telemetry/custom-implementations/utils/circular.cjs +47 -47
- package/dist/cjs/telemetry/custom-implementations/wrappers.cjs +209 -138
- package/dist/cjs/telemetry/initializeTelemetry.cjs +35 -91
- package/dist/cjs/telemetry/persistence/DiskImporter.cjs +85 -0
- package/dist/cjs/telemetry/persistence/DiskUtils.cjs +61 -0
- package/dist/cjs/telemetry/persistence/DiskWriter.cjs +66 -0
- package/dist/cjs/telemetry/telemetryConfigurator.cjs +139 -72
- package/dist/cjs/telemetry/telemetryRegistry.cjs +45 -31
- package/dist/cjs/tlm-ai/agent.cjs +49 -64
- package/dist/cjs/tlm-ai/aiController.cjs +54 -76
- package/dist/cjs/tlm-ai/aiRoutes.cjs +17 -20
- package/dist/cjs/tlm-ai/aiService.cjs +91 -95
- package/dist/cjs/tlm-ai/tools.cjs +177 -174
- package/dist/cjs/tlm-auth/authController.cjs +80 -123
- package/dist/cjs/tlm-auth/authMiddleware.cjs +25 -30
- package/dist/cjs/tlm-auth/authRoutes.cjs +11 -14
- package/dist/cjs/tlm-log/logController.cjs +135 -116
- package/dist/cjs/tlm-log/logRoutes.cjs +19 -20
- package/dist/cjs/tlm-log/logService.cjs +29 -0
- package/dist/cjs/tlm-metric/metricsController.cjs +154 -122
- package/dist/cjs/tlm-metric/metricsRoutes.cjs +22 -20
- package/dist/cjs/tlm-metric/metricsService.cjs +26 -0
- package/dist/cjs/tlm-plugin/pluginController.cjs +128 -140
- package/dist/cjs/tlm-plugin/pluginProcess.cjs +89 -94
- package/dist/cjs/tlm-plugin/pluginRoutes.cjs +11 -14
- package/dist/cjs/tlm-plugin/pluginService.cjs +73 -74
- package/dist/cjs/tlm-trace/traceController.cjs +140 -123
- package/dist/cjs/tlm-trace/traceRoutes.cjs +19 -20
- package/dist/cjs/tlm-trace/traceService.cjs +29 -0
- package/dist/cjs/tlm-ui/uiRoutes.cjs +63 -32
- package/dist/cjs/tlm-util/utilController.cjs +68 -70
- package/dist/cjs/tlm-util/utilRoutes.cjs +51 -63
- package/dist/cjs/types/index.cjs +2 -5
- package/dist/cjs/utils/logger.cjs +38 -43
- package/dist/cjs/utils/regexUtils.cjs +22 -22
- package/dist/esm/config/bootConfig.js +5 -2
- package/dist/esm/config/config.js +9 -2
- package/dist/esm/docs/openapi.yaml +158 -4
- package/dist/esm/index.js +9 -8
- package/dist/esm/routesManager.js +6 -10
- package/dist/esm/telemetry/custom-implementations/exporters/DiskLogExporter.js +114 -0
- package/dist/esm/telemetry/custom-implementations/exporters/DiskMetricExporter.js +94 -0
- package/dist/esm/telemetry/custom-implementations/exporters/DiskTraceExporter.js +96 -0
- package/dist/esm/telemetry/custom-implementations/exporters/InMemoryDbLogExporter.js +38 -7
- package/dist/esm/telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.js +107 -48
- package/dist/esm/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.js +60 -29
- package/dist/esm/telemetry/custom-implementations/exporters/MultiMetricExporter.js +53 -0
- package/dist/esm/telemetry/custom-implementations/instrumentations/logsInstrumentation.js +85 -0
- package/dist/esm/telemetry/custom-implementations/metrics/tsdb/Chunk.js +155 -0
- package/dist/esm/telemetry/custom-implementations/metrics/tsdb/Series.js +164 -0
- package/dist/esm/telemetry/custom-implementations/metrics/tsdb/SeriesRegistry.js +385 -0
- package/dist/esm/telemetry/custom-implementations/metrics/tsdb/types.js +1 -0
- package/dist/esm/telemetry/custom-implementations/metrics/tsdb/utils.js +74 -0
- package/dist/esm/telemetry/custom-implementations/processors/dynamicMultiLogProcessor.js +2 -1
- package/dist/esm/telemetry/custom-implementations/processors/dynamicMultiSpanProcessor.js +1 -1
- package/dist/esm/telemetry/custom-implementations/wrappers.js +77 -6
- package/dist/esm/telemetry/initializeTelemetry.js +27 -69
- package/dist/esm/telemetry/persistence/DiskImporter.js +78 -0
- package/dist/esm/telemetry/persistence/DiskUtils.js +51 -0
- package/dist/esm/telemetry/persistence/DiskWriter.js +59 -0
- package/dist/esm/telemetry/telemetryConfigurator.js +110 -39
- package/dist/esm/telemetry/telemetryRegistry.js +12 -1
- package/dist/esm/tlm-ai/agent.js +5 -3
- package/dist/esm/tlm-ai/aiController.js +3 -3
- package/dist/esm/tlm-ai/aiService.js +6 -2
- package/dist/esm/tlm-ai/tools.js +5 -9
- package/dist/esm/tlm-auth/authController.js +3 -2
- package/dist/esm/tlm-log/logController.js +62 -18
- package/dist/esm/tlm-log/logRoutes.js +3 -1
- package/dist/esm/tlm-log/logService.js +25 -0
- package/dist/esm/tlm-metric/metricsController.js +116 -50
- package/dist/esm/tlm-metric/metricsRoutes.js +8 -3
- package/dist/esm/tlm-metric/metricsService.js +22 -0
- package/dist/esm/tlm-plugin/pluginController.js +6 -11
- package/dist/esm/tlm-plugin/pluginService.js +2 -4
- package/dist/esm/tlm-trace/traceController.js +87 -36
- package/dist/esm/tlm-trace/traceRoutes.js +3 -1
- package/dist/esm/tlm-trace/traceService.js +25 -0
- package/dist/esm/tlm-ui/uiRoutes.js +5 -5
- package/dist/esm/tlm-util/utilController.js +3 -9
- package/dist/esm/tlm-util/utilRoutes.js +2 -2
- package/dist/types/config/bootConfig.d.ts +3 -0
- package/dist/types/config/config.d.ts +48 -7
- package/dist/types/config/config.types.d.ts +7 -0
- package/dist/types/index.d.ts +2 -3
- package/dist/types/telemetry/custom-implementations/exporters/DiskLogExporter.d.ts +24 -0
- package/dist/types/telemetry/custom-implementations/exporters/DiskMetricExporter.d.ts +23 -0
- package/dist/types/telemetry/custom-implementations/exporters/DiskTraceExporter.d.ts +23 -0
- package/dist/types/telemetry/custom-implementations/exporters/InMemoryDbLogExporter.d.ts +3 -1
- package/dist/types/telemetry/custom-implementations/exporters/InMemoryDbMetricExporter.d.ts +56 -15
- package/dist/types/telemetry/custom-implementations/exporters/InMemoryDbSpanExporter.d.ts +8 -4
- package/dist/types/telemetry/custom-implementations/exporters/MultiMetricExporter.d.ts +9 -0
- package/dist/types/telemetry/custom-implementations/instrumentations/logsInstrumentation.d.ts +23 -0
- package/dist/types/telemetry/custom-implementations/metrics/tsdb/Chunk.d.ts +49 -0
- package/dist/types/telemetry/custom-implementations/metrics/tsdb/Series.d.ts +67 -0
- package/dist/types/telemetry/custom-implementations/metrics/tsdb/SeriesRegistry.d.ts +69 -0
- package/dist/types/telemetry/custom-implementations/metrics/tsdb/types.d.ts +68 -0
- package/dist/types/telemetry/custom-implementations/metrics/tsdb/utils.d.ts +21 -0
- package/dist/types/telemetry/custom-implementations/processors/dynamicMultiLogProcessor.d.ts +2 -2
- package/dist/types/telemetry/custom-implementations/wrappers.d.ts +2 -1
- package/dist/types/telemetry/persistence/DiskImporter.d.ts +17 -0
- package/dist/types/telemetry/persistence/DiskUtils.d.ts +11 -0
- package/dist/types/telemetry/persistence/DiskWriter.d.ts +21 -0
- package/dist/types/telemetry/telemetryConfigurator.d.ts +1 -1
- package/dist/types/telemetry/telemetryRegistry.d.ts +8 -0
- package/dist/types/tlm-ai/agent.d.ts +1 -1
- package/dist/types/tlm-ai/aiService.d.ts +1 -1
- package/dist/types/tlm-log/logController.d.ts +2 -0
- package/dist/types/tlm-log/logService.d.ts +4 -0
- package/dist/types/tlm-metric/metricsController.d.ts +11 -2
- package/dist/types/tlm-metric/metricsService.d.ts +6 -0
- package/dist/types/tlm-trace/traceController.d.ts +9 -7
- package/dist/types/tlm-trace/traceService.d.ts +4 -0
- package/dist/types/types/index.d.ts +2 -2
- package/dist/ui/assets/{ApiDocsPage-C_VVPPHa.js → ApiDocsPage-DTCgVbW2.js} +2 -2
- package/dist/ui/assets/CollapsibleCard-lWgfsaAn.js +1 -0
- package/dist/ui/assets/DevToolsPage-DEhf8CBy.js +1 -0
- package/dist/ui/assets/LandingPage-CfEHCDxY.js +6 -0
- package/dist/ui/assets/LogsPage-DFDKRuGH.js +1 -0
- package/dist/ui/assets/{NotFoundPage-B3quk3P1.js → NotFoundPage-DCy0DcV7.js} +1 -1
- package/dist/ui/assets/PluginCreatePage-BawZ5_-h.js +50 -0
- package/dist/ui/assets/PluginPage-D3FmgU7d.js +27 -0
- package/dist/ui/assets/TraceSpansPage-D0_L45Rb.js +6 -0
- package/dist/ui/assets/VirtualizedListPanel-q605n9He.js +16 -0
- package/dist/ui/assets/alert-DBAFshSi.js +1133 -0
- package/dist/ui/assets/badge-DGNBtnxU.js +1 -0
- package/dist/ui/assets/{chevron-down-CPsvsmqj.js → chevron-down-CFEqYzGC.js} +1 -1
- package/dist/ui/assets/{chevron-up-Df9jMo1X.js → chevron-up-lDnFwAJq.js} +1 -1
- package/dist/ui/assets/{circle-alert-DOPQPvU8.js → circle-alert-BpYUuRs7.js} +1 -1
- package/dist/ui/assets/dialog-1dRyI6SC.js +15 -0
- package/dist/ui/assets/index-C7RfU6hR.js +1 -0
- package/dist/ui/assets/index-C9dDYIpd.js +305 -0
- package/dist/ui/assets/index-D6f1KjWV.css +1 -0
- package/dist/ui/assets/info-CuJQWoBU.js +6 -0
- package/dist/ui/assets/{input-Dzvg_ZEZ.js → input-BLXaar0X.js} +1 -1
- package/dist/ui/assets/label-DfAcltsl.js +1 -0
- package/dist/ui/assets/{loader-circle-CrvlRy5o.js → loader-circle-B7oLyPsi.js} +1 -1
- package/dist/ui/assets/{loginPage-qa4V-B70.js → loginPage-DswZvOJ-.js} +1 -1
- package/dist/ui/assets/metrics-page-BhtXrfUW.js +31 -0
- package/dist/ui/assets/metrics-page-D1GxaB_c.css +1 -0
- package/dist/ui/assets/popover-IDker85U.js +11 -0
- package/dist/ui/assets/select-B8y5IidE.js +6 -0
- package/dist/ui/assets/separator-B6EzrxYY.js +6 -0
- package/dist/ui/assets/severityOptions-DtCsaAZK.js +11 -0
- package/dist/ui/assets/square-pen-D_oecB1x.js +6 -0
- package/dist/ui/assets/switch-Dqo0XkRD.js +1 -0
- package/dist/ui/assets/trace-DJq1miYa.js +1 -0
- package/dist/ui/assets/upload-prIohEdY.js +11 -0
- package/dist/ui/assets/{utilService-DNyqzwj0.js → utilService-C8TJKLqs.js} +1 -1
- package/dist/ui/assets/wand-sparkles-OgXuzsSx.js +6 -0
- package/dist/ui/index.html +2 -2
- package/package.json +44 -49
- package/dist/ui/assets/CollapsibleCard-B3KR_8mL.js +0 -1
- package/dist/ui/assets/DevToolsPage-OyZcDcmw.js +0 -1
- package/dist/ui/assets/LandingPage-CppFBA6K.js +0 -6
- package/dist/ui/assets/LogsPage-9Fq8GArS.js +0 -26
- package/dist/ui/assets/PluginCreatePage-X_aCH4t4.js +0 -50
- package/dist/ui/assets/PluginPage-DMDSihrZ.js +0 -27
- package/dist/ui/assets/alert-jQ9HCPIf.js +0 -1133
- package/dist/ui/assets/badge-CNq0-mH5.js +0 -1
- package/dist/ui/assets/card-DFAwwhN3.js +0 -1
- package/dist/ui/assets/index-BkD6DijD.js +0 -15
- package/dist/ui/assets/index-CERGVYZK.js +0 -292
- package/dist/ui/assets/index-CSIPf9qw.css +0 -1
- package/dist/ui/assets/label-DuVnkZ4q.js +0 -1
- package/dist/ui/assets/select-DhS8YUtJ.js +0 -1
- package/dist/ui/assets/separator-isK4chBP.js +0 -6
- package/dist/ui/assets/severityOptions-O38dSOfk.js +0 -11
- package/dist/ui/assets/switch-Z3mImG9n.js +0 -1
- package/dist/ui/assets/tabs-_77MUUQe.js +0 -16
- package/dist/ui/assets/upload-C1LT4Gkb.js +0 -16
|
@@ -1,157 +1,145 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
});
|
|
6
|
-
exports.
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
const _excluded = ["process"];
|
|
14
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
15
|
-
function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
|
|
16
|
-
function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.deletePlugin = exports.deactivatePlugin = exports.activatePlugin = exports.registerPlugin = exports.listPlugins = void 0;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const child_process_1 = require("child_process");
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const logger_js_1 = __importDefault(require("../utils/logger.cjs"));
|
|
11
|
+
const pluginService_js_1 = require("./pluginService.cjs");
|
|
12
|
+
const url_1 = require("url");
|
|
17
13
|
const listPlugins = (req, res) => {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
rest = _objectWithoutProperties(_ref, _excluded);
|
|
24
|
-
return rest;
|
|
25
|
-
});
|
|
26
|
-
res.send({
|
|
27
|
-
pluginsCount: plugins.length,
|
|
28
|
-
plugins
|
|
29
|
-
});
|
|
14
|
+
const plugins = pluginService_js_1.pluginService.getPlugins().map(({ process, ...rest }) => rest);
|
|
15
|
+
res.send({
|
|
16
|
+
pluginsCount: plugins.length,
|
|
17
|
+
plugins,
|
|
18
|
+
});
|
|
30
19
|
};
|
|
31
20
|
exports.listPlugins = listPlugins;
|
|
32
21
|
const registerPlugin = async (req, res) => {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
22
|
+
const pluginResource = req.body;
|
|
23
|
+
logger_js_1.default.debug(`Plugin Registration Request: ${JSON.stringify(req.body, null, 2)}...`);
|
|
24
|
+
// Validate id
|
|
25
|
+
if (!pluginResource.id || typeof pluginResource.id !== "string") {
|
|
26
|
+
res.status(400).send("Plugin id must be provided and must be a string");
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
// Check duplicate
|
|
30
|
+
if (pluginService_js_1.pluginService.getPlugins().find((p) => p.id === pluginResource.id)) {
|
|
31
|
+
res.status(400).send(`Plugin with id "${pluginResource.id}" already exists.`);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
// Validate inputs
|
|
35
|
+
if (!pluginResource.url && !pluginResource.code) {
|
|
36
|
+
res.status(400).send("Plugin code or URL must be provided");
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
if (!pluginResource.moduleFormat) {
|
|
40
|
+
res.status(400).send("Plugin moduleFormat must be provided (cjs|esm)");
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
// Fetch code
|
|
44
|
+
let pluginCode;
|
|
45
|
+
try {
|
|
46
|
+
if (pluginResource.code) {
|
|
47
|
+
pluginCode = pluginResource.code;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
console.log(pluginResource.url);
|
|
51
|
+
const response = await axios_1.default.get(pluginResource.url);
|
|
52
|
+
pluginCode = response.data;
|
|
53
|
+
}
|
|
54
|
+
pluginResource.sourceCode = pluginCode;
|
|
63
55
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
if (!pluginCode) {
|
|
70
|
-
res.status(400).send("Plugin code could not be loaded");
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
const isCjs = typeof __filename !== "undefined" && typeof __dirname !== "undefined";
|
|
74
|
-
const __filenameUniversal = isCjs ? __filename : (0, _url.fileURLToPath)(require('url').pathToFileURL(__filename).toString());
|
|
75
|
-
const __dirnameUniversal = isCjs ? __dirname : _path.default.dirname(__filenameUniversal);
|
|
76
|
-
const pluginProcessFile = isCjs ? "pluginProcess.cjs" : "pluginProcess.js";
|
|
77
|
-
const child = (0, _child_process.fork)(_path.default.resolve(__dirnameUniversal, pluginProcessFile), [], {
|
|
78
|
-
stdio: ["pipe", "pipe", "pipe", "ipc"]
|
|
79
|
-
});
|
|
80
|
-
child.stdout?.on("data", data => {
|
|
81
|
-
_logger.default.info(`[Plugin ${pluginResource.id}] STDOUT: ${data.toString().trim()}`);
|
|
82
|
-
});
|
|
83
|
-
child.stderr?.on("data", data => {
|
|
84
|
-
_logger.default.error(`[Plugin ${pluginResource.id}] STDERR: ${data.toString().trim()}`);
|
|
85
|
-
});
|
|
86
|
-
child.on("message", msg => {
|
|
87
|
-
if (msg.event === "loaded") {
|
|
88
|
-
pluginResource.name = msg.name;
|
|
89
|
-
pluginResource.active = true;
|
|
90
|
-
pluginResource.process = child;
|
|
91
|
-
_pluginService.pluginService.pushPlugin(pluginResource);
|
|
92
|
-
res.status(201).send(`Plugin ${msg.name} registered`);
|
|
93
|
-
} else if (msg.event === "error") {
|
|
94
|
-
res.status(400).send(`Error loading plugin: ${msg.error}`);
|
|
56
|
+
catch (err) {
|
|
57
|
+
res.status(400).send(`Error fetching plugin code: ${err}`);
|
|
58
|
+
return;
|
|
95
59
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
60
|
+
if (!pluginCode) {
|
|
61
|
+
res.status(400).send("Plugin code could not be loaded");
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const isCjs = typeof __filename !== "undefined" && typeof __dirname !== "undefined";
|
|
65
|
+
// @ts-ignore -- import.meta no existe en el build CJS
|
|
66
|
+
const currentDirectory = isCjs ? __dirname : path_1.default.dirname((0, url_1.fileURLToPath)(__filename));
|
|
67
|
+
const pluginProcessFile = isCjs
|
|
68
|
+
? "pluginProcess.cjs"
|
|
69
|
+
: "pluginProcess.cjs";
|
|
70
|
+
const child = (0, child_process_1.fork)(path_1.default.resolve(currentDirectory, pluginProcessFile), [], {
|
|
71
|
+
stdio: ["pipe", "pipe", "pipe", "ipc"],
|
|
72
|
+
});
|
|
73
|
+
child.stdout?.on("data", (data) => {
|
|
74
|
+
logger_js_1.default.info(`[Plugin ${pluginResource.id}] STDOUT: ${data.toString().trim()}`);
|
|
75
|
+
});
|
|
76
|
+
child.stderr?.on("data", (data) => {
|
|
77
|
+
logger_js_1.default.error(`[Plugin ${pluginResource.id}] STDERR: ${data.toString().trim()}`);
|
|
78
|
+
});
|
|
79
|
+
child.on("message", (msg) => {
|
|
80
|
+
if (msg.event === "loaded") {
|
|
81
|
+
pluginResource.name = msg.name;
|
|
82
|
+
pluginResource.active = true;
|
|
83
|
+
pluginResource.process = child;
|
|
84
|
+
pluginService_js_1.pluginService.pushPlugin(pluginResource);
|
|
85
|
+
res.status(201).send(`Plugin ${msg.name} registered`);
|
|
86
|
+
}
|
|
87
|
+
else if (msg.event === "error") {
|
|
88
|
+
res.status(400).send(`Error loading plugin: ${msg.error}`);
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
child.on("exit", (code) => {
|
|
92
|
+
pluginResource.active = false;
|
|
93
|
+
pluginResource.process = undefined;
|
|
94
|
+
logger_js_1.default.warn(`Plugin ${pluginResource.id} exited (code: ${code})`);
|
|
95
|
+
});
|
|
96
|
+
child.on("disconnect", () => {
|
|
97
|
+
pluginResource.active = false;
|
|
98
|
+
pluginResource.process = undefined;
|
|
99
|
+
logger_js_1.default.warn(`Plugin ${pluginResource.id} disconnected`);
|
|
100
|
+
});
|
|
101
|
+
child.on("error", (err) => {
|
|
102
|
+
pluginResource.active = false;
|
|
103
|
+
pluginResource.process = undefined;
|
|
104
|
+
logger_js_1.default.error(`Plugin ${pluginResource.id} error: ${err.message}`);
|
|
105
|
+
});
|
|
106
|
+
// Send data to child
|
|
107
|
+
child.send({
|
|
108
|
+
type: "load",
|
|
109
|
+
pluginResource,
|
|
110
|
+
});
|
|
117
111
|
};
|
|
118
112
|
exports.registerPlugin = registerPlugin;
|
|
119
113
|
const activatePlugin = (req, res) => {
|
|
120
|
-
|
|
121
|
-
id
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
_pluginService.pluginService.activatePlugin(id);
|
|
129
|
-
res.status(200).send(`Plugin "${id}" activated.`);
|
|
114
|
+
const id = req.params.id;
|
|
115
|
+
const plugin = pluginService_js_1.pluginService.getPlugins().find((p) => p.id === id);
|
|
116
|
+
if (!plugin) {
|
|
117
|
+
res.status(404).send(`Plugin with id "${id}" not found.`);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
pluginService_js_1.pluginService.activatePlugin(id);
|
|
121
|
+
res.status(200).send(`Plugin "${id}" activated.`);
|
|
130
122
|
};
|
|
131
123
|
exports.activatePlugin = activatePlugin;
|
|
132
124
|
const deactivatePlugin = (req, res) => {
|
|
133
|
-
|
|
134
|
-
id
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
_pluginService.pluginService.deactivatePlugin(id); // This only sets active to false
|
|
142
|
-
res.status(200).send(`Plugin "${id}" deactivated.`);
|
|
125
|
+
const id = req.params.id;
|
|
126
|
+
const plugin = pluginService_js_1.pluginService.getPlugins().find((p) => p.id === id);
|
|
127
|
+
if (!plugin) {
|
|
128
|
+
res.status(404).send(`Plugin with id "${id}" not found.`);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
pluginService_js_1.pluginService.deactivatePlugin(id); // This only sets active to false
|
|
132
|
+
res.status(200).send(`Plugin "${id}" deactivated.`);
|
|
143
133
|
};
|
|
144
134
|
exports.deactivatePlugin = deactivatePlugin;
|
|
145
135
|
const deletePlugin = (req, res) => {
|
|
146
|
-
|
|
147
|
-
id
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
_pluginService.pluginService.deletePlugin(id); // kills child inside service
|
|
155
|
-
res.status(200).send(`Plugin "${id}" deleted.`);
|
|
136
|
+
const id = req.params.id;
|
|
137
|
+
const plugin = pluginService_js_1.pluginService.getPlugins().find((p) => p.id === id);
|
|
138
|
+
if (!plugin) {
|
|
139
|
+
res.status(404).send(`Plugin with id "${id}" not found.`);
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
pluginService_js_1.pluginService.deletePlugin(id); // kills child inside service
|
|
143
|
+
res.status(200).send(`Plugin "${id}" deleted.`);
|
|
156
144
|
};
|
|
157
|
-
exports.deletePlugin = deletePlugin;
|
|
145
|
+
exports.deletePlugin = deletePlugin;
|
|
@@ -1,110 +1,105 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
var _importFromString = require("import-from-string");
|
|
4
|
-
var _dynamicInstaller = require("dynamic-installer");
|
|
5
2
|
// pluginProcess.js
|
|
6
3
|
// Runs inside a child process, isolated from the main app
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
5
|
// @ts-expect-error no types
|
|
8
|
-
|
|
6
|
+
const import_from_string_1 = require("import-from-string");
|
|
7
|
+
const dynamic_installer_1 = require("dynamic-installer");
|
|
9
8
|
let plugin;
|
|
10
9
|
const log = (...args) => {
|
|
11
|
-
|
|
10
|
+
console.log(`[PluginProcess:${process.pid}]`, ...args);
|
|
12
11
|
};
|
|
13
|
-
process.on("message", async msg => {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
12
|
+
process.on("message", async (msg) => {
|
|
13
|
+
if (msg.type === "load") {
|
|
14
|
+
try {
|
|
15
|
+
const pluginResource = normalizePluginResource(msg.pluginResource);
|
|
16
|
+
if (pluginResource.install && Array.isArray(pluginResource.install.dependencies) && pluginResource.install.dependencies.length > 0) {
|
|
17
|
+
log("Installing dependencies for plugin: " + pluginResource.name);
|
|
18
|
+
const dependenciesStatus = await (0, dynamic_installer_1.installDependencies)(pluginResource.install);
|
|
19
|
+
console.dir(dependenciesStatus);
|
|
20
|
+
if (!dependenciesStatus.success) {
|
|
21
|
+
const detailsFailed = dependenciesStatus.details.filter(detail => detail.success === false);
|
|
22
|
+
if (pluginResource.install.ignoreErrors === true) {
|
|
23
|
+
log(`Warning: Error installing dependencies: ${JSON.stringify(detailsFailed)}. Continuing as ignoreErrors is true.`);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
process.send?.({ event: "error", error: `Error installing dependencies: ${JSON.stringify(detailsFailed)}` });
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
let module;
|
|
32
|
+
if (pluginResource?.moduleFormat?.toLowerCase() === "esm") {
|
|
33
|
+
module = await (0, import_from_string_1.importFromString)(pluginResource.sourceCode);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
module = await (0, import_from_string_1.requireFromString)(pluginResource.sourceCode);
|
|
37
|
+
}
|
|
38
|
+
plugin = module.default?.plugin ?? module.plugin;
|
|
39
|
+
if (!plugin)
|
|
40
|
+
throw new Error("Plugin must export a valid 'plugin' object");
|
|
41
|
+
for (const fn of ["load", "isConfigured"]) {
|
|
42
|
+
if (typeof plugin[fn] !== "function") {
|
|
43
|
+
throw new Error(`Plugin is missing required function "${fn}"`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
await plugin.load(pluginResource.config);
|
|
47
|
+
if (!plugin.isConfigured()) {
|
|
48
|
+
throw new Error("Plugin could not be configured");
|
|
49
|
+
}
|
|
50
|
+
process.send?.({ event: "loaded", name: pluginResource.name || pluginResource.id || "unknown" });
|
|
32
51
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
module = await (0, _importFromString.importFromString)(pluginResource.sourceCode);
|
|
37
|
-
} else {
|
|
38
|
-
module = await (0, _importFromString.requireFromString)(pluginResource.sourceCode);
|
|
39
|
-
}
|
|
40
|
-
plugin = module.default?.plugin ?? module.plugin;
|
|
41
|
-
if (!plugin) throw new Error("Plugin must export a valid 'plugin' object");
|
|
42
|
-
for (const fn of ["load", "isConfigured"]) {
|
|
43
|
-
if (typeof plugin[fn] !== "function") {
|
|
44
|
-
throw new Error(`Plugin is missing required function "${fn}"`);
|
|
52
|
+
catch (err) {
|
|
53
|
+
process.send?.({ event: "error", error: err.message });
|
|
54
|
+
process.exit(1);
|
|
45
55
|
}
|
|
46
|
-
}
|
|
47
|
-
await plugin.load(pluginResource.config);
|
|
48
|
-
if (!plugin.isConfigured()) {
|
|
49
|
-
throw new Error("Plugin could not be configured");
|
|
50
|
-
}
|
|
51
|
-
process.send?.({
|
|
52
|
-
event: "loaded",
|
|
53
|
-
name: pluginResource.name || pluginResource.id || "unknown"
|
|
54
|
-
});
|
|
55
|
-
} catch (err) {
|
|
56
|
-
process.send?.({
|
|
57
|
-
event: "error",
|
|
58
|
-
error: err.message
|
|
59
|
-
});
|
|
60
|
-
process.exit(1);
|
|
61
56
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
57
|
+
// Forward log/metric/trace calls
|
|
58
|
+
if (msg.type === "newLog" && plugin?.newLog) {
|
|
59
|
+
plugin.newLog(msg.payload);
|
|
60
|
+
}
|
|
61
|
+
if (msg.type === "newMetric" && plugin?.newMetric) {
|
|
62
|
+
plugin.newMetric(msg.payload);
|
|
63
|
+
}
|
|
64
|
+
if (msg.type === "newTrace" && plugin?.newTrace) {
|
|
65
|
+
plugin.newTrace(msg.payload);
|
|
66
|
+
}
|
|
67
|
+
if (msg.type === "unload") {
|
|
68
|
+
if (plugin && typeof plugin.unload === "function") {
|
|
69
|
+
await plugin.unload();
|
|
70
|
+
}
|
|
71
|
+
process.send?.({ event: "unloaded" });
|
|
72
|
+
process.exit(0);
|
|
76
73
|
}
|
|
77
|
-
process.send?.({
|
|
78
|
-
event: "unloaded"
|
|
79
|
-
});
|
|
80
|
-
process.exit(0);
|
|
81
|
-
}
|
|
82
74
|
});
|
|
83
75
|
function normalizePluginResource(raw) {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
76
|
+
let resource = raw;
|
|
77
|
+
// case: received as stringified JSON
|
|
78
|
+
if (typeof raw === "string") {
|
|
79
|
+
try {
|
|
80
|
+
resource = JSON.parse(raw);
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
throw new Error("Invalid pluginResource JSON: " + err.message);
|
|
84
|
+
}
|
|
91
85
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
86
|
+
// normalize install
|
|
87
|
+
if (typeof resource.install === "string") {
|
|
88
|
+
try {
|
|
89
|
+
resource.install = JSON.parse(resource.install);
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
throw new Error("Invalid install JSON: " + err.message);
|
|
93
|
+
}
|
|
99
94
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
95
|
+
// normalize config
|
|
96
|
+
if (typeof resource.config === "string") {
|
|
97
|
+
try {
|
|
98
|
+
resource.config = JSON.parse(resource.config);
|
|
99
|
+
}
|
|
100
|
+
catch (err) {
|
|
101
|
+
throw new Error("Invalid config JSON: " + err.message);
|
|
102
|
+
}
|
|
107
103
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
}
|
|
104
|
+
return resource;
|
|
105
|
+
}
|
|
@@ -1,18 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.getPluginRoutes = void 0;
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
const express_1 = require("express");
|
|
5
|
+
const pluginController_js_1 = require("./pluginController.cjs");
|
|
9
6
|
const getPluginRoutes = () => {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
7
|
+
const router = (0, express_1.Router)();
|
|
8
|
+
router.get('/', pluginController_js_1.listPlugins);
|
|
9
|
+
router.post('/', pluginController_js_1.registerPlugin);
|
|
10
|
+
router.post('/:id/activate', pluginController_js_1.activatePlugin);
|
|
11
|
+
router.post('/:id/deactivate', pluginController_js_1.deactivatePlugin);
|
|
12
|
+
router.delete('/:id', pluginController_js_1.deletePlugin);
|
|
13
|
+
return router;
|
|
17
14
|
};
|
|
18
|
-
exports.getPluginRoutes = getPluginRoutes;
|
|
15
|
+
exports.getPluginRoutes = getPluginRoutes;
|