xypriss 4.0.0 → 4.1.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/dist/cjs/src/config.js +57 -31
- package/dist/cjs/src/config.js.map +1 -1
- package/dist/cjs/src/file-upload.js +5 -4
- package/dist/cjs/src/file-upload.js.map +1 -1
- package/dist/cjs/src/index.js +1 -1
- package/dist/cjs/src/plugins/api/PluginAPI.js +135 -0
- package/dist/cjs/src/plugins/api/PluginAPI.js.map +1 -0
- package/dist/cjs/src/plugins/core/PluginManager.js +266 -0
- package/dist/cjs/src/plugins/core/PluginManager.js.map +1 -0
- package/dist/cjs/src/server/FastServer.js +28 -15
- package/dist/cjs/src/server/FastServer.js.map +1 -1
- package/dist/cjs/src/server/ServerFactory.js +29 -24
- package/dist/cjs/src/server/ServerFactory.js.map +1 -1
- package/dist/cjs/src/server/components/fastapi/FileUploadManager.js +3 -2
- package/dist/cjs/src/server/components/fastapi/FileUploadManager.js.map +1 -1
- package/dist/cjs/src/server/components/fastapi/console/ConsoleInterceptor.js +74 -22
- package/dist/cjs/src/server/components/fastapi/console/ConsoleInterceptor.js.map +1 -1
- package/dist/cjs/src/server/components/fastapi/console/types.js +0 -1
- package/dist/cjs/src/server/components/fastapi/console/types.js.map +1 -1
- package/dist/cjs/src/server/const/default.js +75 -0
- package/dist/cjs/src/server/const/default.js.map +1 -1
- package/dist/cjs/src/server/handlers/NotFoundHandler.js +1 -1
- package/dist/esm/src/config.js +57 -31
- package/dist/esm/src/config.js.map +1 -1
- package/dist/esm/src/file-upload.js +3 -2
- package/dist/esm/src/file-upload.js.map +1 -1
- package/dist/esm/src/index.js +1 -1
- package/dist/esm/src/plugins/api/PluginAPI.js +131 -0
- package/dist/esm/src/plugins/api/PluginAPI.js.map +1 -0
- package/dist/esm/src/plugins/core/PluginManager.js +264 -0
- package/dist/esm/src/plugins/core/PluginManager.js.map +1 -0
- package/dist/esm/src/server/FastServer.js +28 -15
- package/dist/esm/src/server/FastServer.js.map +1 -1
- package/dist/esm/src/server/ServerFactory.js +28 -23
- package/dist/esm/src/server/ServerFactory.js.map +1 -1
- package/dist/esm/src/server/components/fastapi/FileUploadManager.js +3 -2
- package/dist/esm/src/server/components/fastapi/FileUploadManager.js.map +1 -1
- package/dist/esm/src/server/components/fastapi/console/ConsoleInterceptor.js +74 -22
- package/dist/esm/src/server/components/fastapi/console/ConsoleInterceptor.js.map +1 -1
- package/dist/esm/src/server/components/fastapi/console/types.js +0 -1
- package/dist/esm/src/server/components/fastapi/console/types.js.map +1 -1
- package/dist/esm/src/server/const/default.js +75 -0
- package/dist/esm/src/server/const/default.js.map +1 -1
- package/dist/esm/src/server/handlers/NotFoundHandler.js +1 -1
- package/dist/index.d.ts +112 -109
- package/package.json +2 -1
- package/dist/cjs/src/plugins/core/PluginAPI.js +0 -80
- package/dist/cjs/src/plugins/core/PluginAPI.js.map +0 -1
- package/dist/cjs/src/server/utils/ConfigLoader.js +0 -306
- package/dist/cjs/src/server/utils/ConfigLoader.js.map +0 -1
- package/dist/esm/src/plugins/core/PluginAPI.js +0 -78
- package/dist/esm/src/plugins/core/PluginAPI.js.map +0 -1
- package/dist/esm/src/server/utils/ConfigLoader.js +0 -283
- package/dist/esm/src/server/utils/ConfigLoader.js.map +0 -1
package/dist/cjs/src/config.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var _default = require('./server/const/default.js');
|
|
4
|
+
|
|
3
5
|
/**
|
|
4
6
|
* XyPriss Configuration Manager
|
|
5
7
|
*
|
|
@@ -10,6 +12,10 @@
|
|
|
10
12
|
* in modular structures where accessing `app.configs` directly might
|
|
11
13
|
* cause initialization timing issues.
|
|
12
14
|
*
|
|
15
|
+
* **IMPORTANT**: This is the SINGLE SOURCE OF TRUTH for all XyPriss configurations.
|
|
16
|
+
* All components should use `Configs.get()` to access configuration values
|
|
17
|
+
* instead of copying values during initialization.
|
|
18
|
+
*
|
|
13
19
|
* @example
|
|
14
20
|
* ```typescript
|
|
15
21
|
* import { Configs } from 'xypriss';
|
|
@@ -28,7 +34,7 @@
|
|
|
28
34
|
* // Get entire config
|
|
29
35
|
* const allConfigs = Configs.getAll();
|
|
30
36
|
*
|
|
31
|
-
* // Update specific config
|
|
37
|
+
* // Update specific config (updates the source of truth)
|
|
32
38
|
* Configs.update('fileUpload', { maxFileSize: 10 * 1024 * 1024 });
|
|
33
39
|
* ```
|
|
34
40
|
*/
|
|
@@ -39,10 +45,12 @@
|
|
|
39
45
|
class ConfigurationManager {
|
|
40
46
|
/**
|
|
41
47
|
* Private constructor to enforce singleton pattern
|
|
48
|
+
* Initializes with default configuration
|
|
42
49
|
*/
|
|
43
50
|
constructor() {
|
|
44
|
-
this.config = {};
|
|
45
51
|
this.initialized = false;
|
|
52
|
+
// Initialize with default configuration
|
|
53
|
+
this.config = { ..._default.DEFAULT_OPTIONS };
|
|
46
54
|
}
|
|
47
55
|
/**
|
|
48
56
|
* Get the singleton instance
|
|
@@ -55,7 +63,7 @@ class ConfigurationManager {
|
|
|
55
63
|
}
|
|
56
64
|
/**
|
|
57
65
|
* Set the entire configuration
|
|
58
|
-
* @param config - Server configuration options
|
|
66
|
+
* @param config - XP Server configuration options
|
|
59
67
|
*/
|
|
60
68
|
static set(config) {
|
|
61
69
|
const instance = ConfigurationManager.getInstance();
|
|
@@ -73,50 +81,68 @@ class ConfigurationManager {
|
|
|
73
81
|
}
|
|
74
82
|
/**
|
|
75
83
|
* Get the entire configuration object
|
|
76
|
-
* @returns Complete
|
|
84
|
+
* @returns Complete XyPriss Server Configuration (XPSC)
|
|
77
85
|
*/
|
|
78
86
|
static getAll() {
|
|
79
87
|
const instance = ConfigurationManager.getInstance();
|
|
80
88
|
return { ...instance.config };
|
|
81
89
|
}
|
|
82
90
|
/**
|
|
83
|
-
* Update a specific configuration section
|
|
91
|
+
* Update a specific XyPriss configuration section (deep merge)
|
|
84
92
|
* @param key - Configuration key to update
|
|
85
|
-
* @param value -
|
|
93
|
+
* @param value - Partial value to merge with existing configuration
|
|
86
94
|
*/
|
|
87
95
|
static update(key, value) {
|
|
88
96
|
const instance = ConfigurationManager.getInstance();
|
|
89
|
-
instance.config[key]
|
|
97
|
+
const currentValue = instance.config[key];
|
|
98
|
+
// Deep merge the new value with the existing value
|
|
99
|
+
if (typeof currentValue === "object" &&
|
|
100
|
+
currentValue !== null &&
|
|
101
|
+
!Array.isArray(currentValue)) {
|
|
102
|
+
instance.config[key] = {
|
|
103
|
+
...currentValue,
|
|
104
|
+
...value,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
// For non-object values, just replace
|
|
109
|
+
instance.config[key] = value;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Deep merge helper function
|
|
114
|
+
* @param target - Target object
|
|
115
|
+
* @param source - Source object to merge
|
|
116
|
+
* @returns Merged object
|
|
117
|
+
*/
|
|
118
|
+
static deepMerge(target, source) {
|
|
119
|
+
const result = { ...target };
|
|
120
|
+
for (const key in source) {
|
|
121
|
+
const sourceValue = source[key];
|
|
122
|
+
const targetValue = result[key];
|
|
123
|
+
if (sourceValue &&
|
|
124
|
+
typeof sourceValue === "object" &&
|
|
125
|
+
!Array.isArray(sourceValue) &&
|
|
126
|
+
targetValue &&
|
|
127
|
+
typeof targetValue === "object" &&
|
|
128
|
+
!Array.isArray(targetValue)) {
|
|
129
|
+
// Recursively merge nested objects
|
|
130
|
+
result[key] = ConfigurationManager.deepMerge(targetValue, sourceValue);
|
|
131
|
+
}
|
|
132
|
+
else if (sourceValue !== undefined) {
|
|
133
|
+
// Replace value (including arrays and primitives)
|
|
134
|
+
result[key] = sourceValue;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return result;
|
|
90
138
|
}
|
|
91
139
|
/**
|
|
92
|
-
* Merge configuration with existing config
|
|
140
|
+
* Merge configuration with existing config (deep merge)
|
|
93
141
|
* @param config - Partial configuration to merge
|
|
94
142
|
*/
|
|
95
143
|
static merge(config) {
|
|
96
144
|
const instance = ConfigurationManager.getInstance();
|
|
97
|
-
instance.config =
|
|
98
|
-
...instance.config,
|
|
99
|
-
...config,
|
|
100
|
-
// Deep merge for nested objects
|
|
101
|
-
server: { ...instance.config.server, ...config.server },
|
|
102
|
-
cache: { ...instance.config.cache, ...config.cache },
|
|
103
|
-
security: { ...instance.config.security, ...config.security },
|
|
104
|
-
performance: {
|
|
105
|
-
...instance.config.performance,
|
|
106
|
-
...config.performance,
|
|
107
|
-
},
|
|
108
|
-
fileUpload: { ...instance.config.fileUpload, ...config.fileUpload },
|
|
109
|
-
monitoring: { ...instance.config.monitoring, ...config.monitoring },
|
|
110
|
-
cluster: { ...instance.config.cluster, ...config.cluster },
|
|
111
|
-
multiServer: {
|
|
112
|
-
...instance.config.multiServer,
|
|
113
|
-
...config.multiServer,
|
|
114
|
-
},
|
|
115
|
-
requestManagement: {
|
|
116
|
-
...instance.config.requestManagement,
|
|
117
|
-
...config.requestManagement,
|
|
118
|
-
},
|
|
119
|
-
};
|
|
145
|
+
instance.config = ConfigurationManager.deepMerge(instance.config, config);
|
|
120
146
|
instance.initialized = true;
|
|
121
147
|
}
|
|
122
148
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sources":["../../../src/config.ts"],"sourcesContent":[null],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.js","sources":["../../../src/config.ts"],"sourcesContent":[null],"names":["DEFAULT_OPTIONS"],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
var FileUploadManager = require('./server/components/fastapi/FileUploadManager.js');
|
|
4
4
|
var Logger = require('../shared/logger/Logger.js');
|
|
5
|
+
var config = require('./config.js');
|
|
5
6
|
var FiUp = require('./FiUp.js');
|
|
6
7
|
|
|
7
8
|
/**
|
|
@@ -56,17 +57,17 @@ class FileUploadAPI {
|
|
|
56
57
|
* ```
|
|
57
58
|
*/
|
|
58
59
|
async initialize(configManager) {
|
|
59
|
-
if (this.initialized) {
|
|
60
|
+
if (this.initialized || config.Configs.get("fileUpload")?.enabled === false) {
|
|
60
61
|
return; // Already initialized
|
|
61
62
|
}
|
|
62
63
|
// Access config internally from the Configs singleton
|
|
63
|
-
const config = configManager.get("fileUpload");
|
|
64
|
-
if (!config) {
|
|
64
|
+
const config$1 = configManager.get("fileUpload");
|
|
65
|
+
if (!config$1) {
|
|
65
66
|
throw new Error("FileUpload configuration not found. Please set fileUpload config in createServer() options or use Configs.set()");
|
|
66
67
|
}
|
|
67
68
|
try {
|
|
68
69
|
this.logger.debug("server", "Initializing FileUploadAPI...");
|
|
69
|
-
this.manager = new FileUploadManager.FileUploadManager(
|
|
70
|
+
this.manager = new FileUploadManager.FileUploadManager(this.logger);
|
|
70
71
|
await this.manager.initialize();
|
|
71
72
|
this.initialized = true;
|
|
72
73
|
this.logger.debug("server", `FileUploadAPI initialized, enabled: ${this.manager.isEnabled()}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-upload.js","sources":["../../../src/file-upload.ts"],"sourcesContent":[null],"names":["Logger","FileUploadManager"],"mappings":"
|
|
1
|
+
{"version":3,"file":"file-upload.js","sources":["../../../src/file-upload.ts"],"sourcesContent":[null],"names":["Logger","Configs","config","FileUploadManager"],"mappings":"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"}
|
package/dist/cjs/src/index.js
CHANGED
|
@@ -9,7 +9,7 @@ var securityMiddleware = require('./middleware/security-middleware.js');
|
|
|
9
9
|
var performanceMonitor = require('./server/optimization/performance-monitor.js');
|
|
10
10
|
var config = require('./config.js');
|
|
11
11
|
var index = require('./plugins/modules/index.js');
|
|
12
|
-
var PluginAPI = require('./plugins/
|
|
12
|
+
var PluginAPI = require('./plugins/api/PluginAPI.js');
|
|
13
13
|
var quickStart = require('./quick-start.js');
|
|
14
14
|
var trustProxy = require('./server/utils/trustProxy.js');
|
|
15
15
|
var safeJsonMiddleware = require('./middleware/safe-json-middleware.js');
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Plugin API
|
|
5
|
+
* Public API for plugin management as documented in PLUGIN_SYSTEM_GUIDE.md
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Global plugin manager instance
|
|
9
|
+
* This will be set by the server when it's created
|
|
10
|
+
*/
|
|
11
|
+
let globalPluginManager = null;
|
|
12
|
+
/**
|
|
13
|
+
* Pending plugins registered before server creation
|
|
14
|
+
*/
|
|
15
|
+
const pendingPlugins = [];
|
|
16
|
+
/**
|
|
17
|
+
* Set the global plugin manager
|
|
18
|
+
* @internal - Used by the server factory
|
|
19
|
+
*/
|
|
20
|
+
function setGlobalPluginManager(manager) {
|
|
21
|
+
globalPluginManager = manager;
|
|
22
|
+
// Register all pending plugins
|
|
23
|
+
for (const { plugin, config } of pendingPlugins) {
|
|
24
|
+
manager.register(plugin, config);
|
|
25
|
+
}
|
|
26
|
+
// Clear pending queue
|
|
27
|
+
pendingPlugins.length = 0;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get the global plugin manager
|
|
31
|
+
* @internal
|
|
32
|
+
*/
|
|
33
|
+
function getGlobalPluginManager() {
|
|
34
|
+
return globalPluginManager;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Plugin API
|
|
38
|
+
* Provides imperative methods for plugin management
|
|
39
|
+
*/
|
|
40
|
+
const Plugin = {
|
|
41
|
+
/**
|
|
42
|
+
* Register a plugin imperatively
|
|
43
|
+
* @param plugin - Plugin instance or creator function
|
|
44
|
+
* @param config - Optional configuration
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```typescript
|
|
48
|
+
* Plugin.register({
|
|
49
|
+
* name: "my-plugin",
|
|
50
|
+
* version: "1.0.0",
|
|
51
|
+
* onServerStart: () => console.log("Started!")
|
|
52
|
+
* });
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
register(plugin, config) {
|
|
56
|
+
const manager = getGlobalPluginManager();
|
|
57
|
+
if (manager) {
|
|
58
|
+
// Server is already created, register immediately
|
|
59
|
+
manager.register(plugin, config);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
// Server not created yet, add to pending queue
|
|
63
|
+
pendingPlugins.push({ plugin, config });
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
/**
|
|
67
|
+
* Get a registered plugin by name
|
|
68
|
+
* @param name - Plugin name
|
|
69
|
+
* @returns Plugin instance or undefined if not found
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```typescript
|
|
73
|
+
* const plugin = Plugin.get("my-plugin");
|
|
74
|
+
* if (plugin) {
|
|
75
|
+
* console.log(`Found plugin: ${plugin.name}@${plugin.version}`);
|
|
76
|
+
* }
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
get(name) {
|
|
80
|
+
const manager = getGlobalPluginManager();
|
|
81
|
+
if (!manager) {
|
|
82
|
+
throw new Error("Plugin system not initialized. Create a server instance first.");
|
|
83
|
+
}
|
|
84
|
+
return manager.getPlugin(name);
|
|
85
|
+
},
|
|
86
|
+
/**
|
|
87
|
+
* Create a plugin (helper method)
|
|
88
|
+
* This is just a type-safe identity function that helps with TypeScript inference
|
|
89
|
+
* @param plugin - Plugin definition
|
|
90
|
+
* @returns The same plugin instance
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* ```typescript
|
|
94
|
+
* const myPlugin = Plugin.create({
|
|
95
|
+
* name: "my-plugin",
|
|
96
|
+
* version: "1.0.0",
|
|
97
|
+
* onServerStart: (server) => {
|
|
98
|
+
* console.log("Plugin started!");
|
|
99
|
+
* }
|
|
100
|
+
* });
|
|
101
|
+
* ```
|
|
102
|
+
*/
|
|
103
|
+
create(plugin) {
|
|
104
|
+
return plugin;
|
|
105
|
+
},
|
|
106
|
+
/**
|
|
107
|
+
* Create a plugin factory function
|
|
108
|
+
* Useful for creating reusable plugins with configuration
|
|
109
|
+
* @param creator - Function that creates a plugin from config
|
|
110
|
+
* @returns Plugin creator function
|
|
111
|
+
*
|
|
112
|
+
* @example
|
|
113
|
+
* ```typescript
|
|
114
|
+
* const createMyPlugin = Plugin.factory((config: { apiKey: string }) => ({
|
|
115
|
+
* name: "my-plugin",
|
|
116
|
+
* version: "1.0.0",
|
|
117
|
+
* onServerStart: (server) => {
|
|
118
|
+
* server.apiKey = config.apiKey;
|
|
119
|
+
* }
|
|
120
|
+
* }));
|
|
121
|
+
*
|
|
122
|
+
* // Use it
|
|
123
|
+
* const plugin = createMyPlugin({ apiKey: "secret" });
|
|
124
|
+
* Plugin.register(plugin);
|
|
125
|
+
* ```
|
|
126
|
+
*/
|
|
127
|
+
factory(creator) {
|
|
128
|
+
return creator;
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
exports.Plugin = Plugin;
|
|
133
|
+
exports.getGlobalPluginManager = getGlobalPluginManager;
|
|
134
|
+
exports.setGlobalPluginManager = setGlobalPluginManager;
|
|
135
|
+
//# sourceMappingURL=PluginAPI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PluginAPI.js","sources":["../../../../../src/plugins/api/PluginAPI.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAAA;;;AAGG;AAKH;;;AAGG;AACH,IAAI,mBAAmB,GAAyB,IAAI,CAAC;AAErD;;AAEG;AACH,MAAM,cAAc,GAGf,EAAE,CAAC;AAER;;;AAGG;AACG,SAAU,sBAAsB,CAAC,OAAsB,EAAA;IACzD,mBAAmB,GAAG,OAAO,CAAC;;IAG9B,KAAK,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,cAAc,EAAE;AAC7C,QAAA,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACpC;;AAGD,IAAA,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;AAC9B,CAAC;AAED;;;AAGG;SACa,sBAAsB,GAAA;AAClC,IAAA,OAAO,mBAAmB,CAAC;AAC/B,CAAC;AAED;;;AAGG;AACU,MAAA,MAAM,GAAG;AAClB;;;;;;;;;;;;;AAaG;IACH,QAAQ,CAAC,MAAqC,EAAE,MAAY,EAAA;AACxD,QAAA,MAAM,OAAO,GAAG,sBAAsB,EAAE,CAAC;QAEzC,IAAI,OAAO,EAAE;;AAET,YAAA,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;SACpC;aAAM;;YAEH,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;SAC3C;KACJ;AAED;;;;;;;;;;;;AAYG;AACH,IAAA,GAAG,CAAC,IAAY,EAAA;AACZ,QAAA,MAAM,OAAO,GAAG,sBAAsB,EAAE,CAAC;QAEzC,IAAI,CAAC,OAAO,EAAE;AACV,YAAA,MAAM,IAAI,KAAK,CACX,gEAAgE,CACnE,CAAC;SACL;AAED,QAAA,OAAO,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;KAClC;AAED;;;;;;;;;;;;;;;;AAgBG;AACH,IAAA,MAAM,CAAC,MAAqB,EAAA;AACxB,QAAA,OAAO,MAAM,CAAC;KACjB;AAED;;;;;;;;;;;;;;;;;;;;AAoBG;AACH,IAAA,OAAO,CACH,OAA2C,EAAA;AAE3C,QAAA,OAAO,OAAwB,CAAC;KACnC;;;;;;;"}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var Logger = require('../../../shared/logger/Logger.js');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Plugin Manager
|
|
7
|
+
* Manages plugin registration, lifecycle, and execution
|
|
8
|
+
*/
|
|
9
|
+
class PluginManager {
|
|
10
|
+
constructor(server) {
|
|
11
|
+
this.plugins = new Map();
|
|
12
|
+
this.pluginOrder = [];
|
|
13
|
+
this.initialized = false;
|
|
14
|
+
this.server = server;
|
|
15
|
+
this.logger = new Logger.Logger();
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Register a plugin
|
|
19
|
+
*/
|
|
20
|
+
register(plugin, config) {
|
|
21
|
+
// If it's a function, call it to get the plugin
|
|
22
|
+
const pluginInstance = typeof plugin === "function" ? plugin(config) : plugin;
|
|
23
|
+
// Validate plugin
|
|
24
|
+
if (!pluginInstance.name || !pluginInstance.version) {
|
|
25
|
+
throw new Error("Plugin must have name and version");
|
|
26
|
+
}
|
|
27
|
+
// Check for duplicates
|
|
28
|
+
if (this.plugins.has(pluginInstance.name)) {
|
|
29
|
+
this.logger.warn("plugins", `Plugin '${pluginInstance.name}' already registered, skipping`);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
// Store plugin
|
|
33
|
+
this.plugins.set(pluginInstance.name, pluginInstance);
|
|
34
|
+
// Call onRegister hook
|
|
35
|
+
if (pluginInstance.onRegister) {
|
|
36
|
+
pluginInstance.onRegister(this.server, config);
|
|
37
|
+
}
|
|
38
|
+
this.logger.info("plugins", `Registered plugin: xypriss::ext/${pluginInstance.name}@${pluginInstance.version}`);
|
|
39
|
+
// If already initialized, fully initialize this plugin immediately
|
|
40
|
+
if (this.initialized) {
|
|
41
|
+
// Resolve dependencies for this plugin
|
|
42
|
+
this.resolveDependencies();
|
|
43
|
+
// Register routes for this plugin
|
|
44
|
+
if (pluginInstance.registerRoutes) {
|
|
45
|
+
try {
|
|
46
|
+
pluginInstance.registerRoutes(this.server.app);
|
|
47
|
+
this.logger.debug("plugins", `Registered routes for late plugin: ${pluginInstance.name}`);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
this.logger.error("plugins", `Error registering routes for ${pluginInstance.name}:`, error);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Apply middleware for this plugin
|
|
54
|
+
if (pluginInstance.middleware || pluginInstance.onRequest) {
|
|
55
|
+
pluginInstance.middlewarePriority || "normal";
|
|
56
|
+
const middleware = [];
|
|
57
|
+
if (pluginInstance.middleware) {
|
|
58
|
+
const mw = Array.isArray(pluginInstance.middleware)
|
|
59
|
+
? pluginInstance.middleware
|
|
60
|
+
: [pluginInstance.middleware];
|
|
61
|
+
middleware.push(...mw);
|
|
62
|
+
}
|
|
63
|
+
if (pluginInstance.onRequest) {
|
|
64
|
+
middleware.push(pluginInstance.onRequest.bind(pluginInstance));
|
|
65
|
+
}
|
|
66
|
+
// Apply middleware based on priority
|
|
67
|
+
middleware.forEach((mw) => this.server.app.use(mw));
|
|
68
|
+
this.logger.debug("plugins", `Applied middleware for late plugin: ${pluginInstance.name}`);
|
|
69
|
+
}
|
|
70
|
+
// Call onServerStart hook
|
|
71
|
+
if (pluginInstance.onServerStart) {
|
|
72
|
+
Promise.resolve(pluginInstance.onServerStart(this.server)).catch((error) => {
|
|
73
|
+
this.logger.error("plugins", `Error in ${pluginInstance.name}.onServerStart:`, error);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
// Call onServerReady hook if server is ready
|
|
77
|
+
if (pluginInstance.onServerReady) {
|
|
78
|
+
Promise.resolve(pluginInstance.onServerReady(this.server)).catch((error) => {
|
|
79
|
+
this.logger.error("plugins", `Error in ${pluginInstance.name}.onServerReady:`, error);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Initialize all plugins (resolve dependencies and set execution order)
|
|
86
|
+
*/
|
|
87
|
+
async initialize() {
|
|
88
|
+
this.resolveDependencies();
|
|
89
|
+
this.initialized = true; // Set before calling hooks so late-registered plugins are detected
|
|
90
|
+
await this.executeHook("onServerStart");
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Execute a lifecycle hook on all plugins
|
|
94
|
+
*/
|
|
95
|
+
async executeHook(hookName, ...args) {
|
|
96
|
+
for (const pluginName of this.pluginOrder) {
|
|
97
|
+
const plugin = this.plugins.get(pluginName);
|
|
98
|
+
if (plugin && typeof plugin[hookName] === "function") {
|
|
99
|
+
try {
|
|
100
|
+
await plugin[hookName](...args);
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
this.logger.error("plugins", `Error in ${pluginName}.${hookName}:`, error);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Register routes from all plugins
|
|
110
|
+
*/
|
|
111
|
+
registerRoutes(app) {
|
|
112
|
+
for (const pluginName of this.pluginOrder) {
|
|
113
|
+
const plugin = this.plugins.get(pluginName);
|
|
114
|
+
if (plugin?.registerRoutes) {
|
|
115
|
+
try {
|
|
116
|
+
plugin.registerRoutes(app);
|
|
117
|
+
this.logger.debug("plugins", `Registered routes for: ${pluginName}`);
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
this.logger.error("plugins", `Error registering routes for ${pluginName}:`, error);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Apply middleware from all plugins
|
|
127
|
+
*/
|
|
128
|
+
applyMiddleware(app) {
|
|
129
|
+
const priorities = { first: [], normal: [], last: [] };
|
|
130
|
+
for (const pluginName of this.pluginOrder) {
|
|
131
|
+
const plugin = this.plugins.get(pluginName);
|
|
132
|
+
if (plugin?.middleware) {
|
|
133
|
+
const priority = plugin.middlewarePriority || "normal";
|
|
134
|
+
const middleware = Array.isArray(plugin.middleware)
|
|
135
|
+
? plugin.middleware
|
|
136
|
+
: [plugin.middleware];
|
|
137
|
+
priorities[priority].push(...middleware);
|
|
138
|
+
}
|
|
139
|
+
// Add onRequest as middleware
|
|
140
|
+
if (plugin?.onRequest) {
|
|
141
|
+
priorities.normal.push(plugin.onRequest.bind(plugin));
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// Apply in order: first, normal, last
|
|
145
|
+
[...priorities.first, ...priorities.normal, ...priorities.last].forEach((mw) => app.use(mw));
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Apply error handlers from all plugins
|
|
149
|
+
* Wraps route methods to catch errors and call plugin error handlers
|
|
150
|
+
*/
|
|
151
|
+
applyErrorHandlers(app) {
|
|
152
|
+
const errorPlugins = Array.from(this.plugins.values()).filter((p) => p.onError);
|
|
153
|
+
if (errorPlugins.length === 0) {
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
// Store original route methods
|
|
157
|
+
const originalGet = app.get?.bind(app);
|
|
158
|
+
const originalPost = app.post?.bind(app);
|
|
159
|
+
const originalPut = app.put?.bind(app);
|
|
160
|
+
const originalDelete = app.delete?.bind(app);
|
|
161
|
+
const originalPatch = app.patch?.bind(app);
|
|
162
|
+
// Helper to wrap handlers with error catching
|
|
163
|
+
const wrapHandler = (handler) => {
|
|
164
|
+
return async (req, res, next) => {
|
|
165
|
+
try {
|
|
166
|
+
const result = handler(req, res, next);
|
|
167
|
+
if (result && typeof result.catch === "function") {
|
|
168
|
+
await result;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
for (const plugin of errorPlugins) {
|
|
173
|
+
try {
|
|
174
|
+
await plugin.onError(error, req, res, next);
|
|
175
|
+
}
|
|
176
|
+
catch (handlerError) {
|
|
177
|
+
this.logger.error("plugins", `Error in ${plugin.name}.onError:`, handlerError);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
if (!res.headersSent) {
|
|
181
|
+
res.status(500).json({
|
|
182
|
+
error: "Internal Server Error",
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
};
|
|
188
|
+
// Wrap route methods
|
|
189
|
+
if (originalGet) {
|
|
190
|
+
app.get = function (path, ...handlers) {
|
|
191
|
+
return originalGet(path, ...handlers.map(wrapHandler));
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
if (originalPost) {
|
|
195
|
+
app.post = function (path, ...handlers) {
|
|
196
|
+
return originalPost(path, ...handlers.map(wrapHandler));
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
if (originalPut) {
|
|
200
|
+
app.put = function (path, ...handlers) {
|
|
201
|
+
return originalPut(path, ...handlers.map(wrapHandler));
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
if (originalDelete) {
|
|
205
|
+
app.delete = function (path, ...handlers) {
|
|
206
|
+
return originalDelete(path, ...handlers.map(wrapHandler));
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
if (originalPatch) {
|
|
210
|
+
app.patch = function (path, ...handlers) {
|
|
211
|
+
return originalPatch(path, ...handlers.map(wrapHandler));
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
this.logger.info("plugins", `Error handlers applied for ${errorPlugins.length} plugin(s)`);
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Get a plugin by name
|
|
218
|
+
*/
|
|
219
|
+
getPlugin(name) {
|
|
220
|
+
return this.plugins.get(name);
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Resolve dependencies and determine execution order
|
|
224
|
+
*/
|
|
225
|
+
resolveDependencies() {
|
|
226
|
+
const visited = new Set();
|
|
227
|
+
const temp = new Set();
|
|
228
|
+
const order = [];
|
|
229
|
+
const visit = (name) => {
|
|
230
|
+
if (temp.has(name)) {
|
|
231
|
+
throw new Error(`Circular dependency detected: ${name}`);
|
|
232
|
+
}
|
|
233
|
+
if (visited.has(name)) {
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
temp.add(name);
|
|
237
|
+
const plugin = this.plugins.get(name);
|
|
238
|
+
if (plugin?.dependencies) {
|
|
239
|
+
for (const dep of plugin.dependencies) {
|
|
240
|
+
if (!this.plugins.has(dep)) {
|
|
241
|
+
throw new Error(`Plugin '${name}' depends on '${dep}' which is not registered`);
|
|
242
|
+
}
|
|
243
|
+
visit(dep);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
temp.delete(name);
|
|
247
|
+
visited.add(name);
|
|
248
|
+
order.push(name);
|
|
249
|
+
};
|
|
250
|
+
// Visit all plugins
|
|
251
|
+
for (const name of this.plugins.keys()) {
|
|
252
|
+
visit(name);
|
|
253
|
+
}
|
|
254
|
+
this.pluginOrder = order;
|
|
255
|
+
this.logger.debug("plugins", "Plugin execution order:", order);
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Shutdown all plugins
|
|
259
|
+
*/
|
|
260
|
+
async shutdown() {
|
|
261
|
+
await this.executeHook("onServerStop");
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
exports.PluginManager = PluginManager;
|
|
266
|
+
//# sourceMappingURL=PluginManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PluginManager.js","sources":["../../../../../src/plugins/core/PluginManager.ts"],"sourcesContent":[null],"names":["Logger"],"mappings":"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"}
|