xypriss 1.3.7 → 2.0.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 (88) hide show
  1. package/README.md +219 -31
  2. package/dist/cjs/mods/security/src/components/cache/index.js +0 -72
  3. package/dist/cjs/mods/security/src/components/cache/index.js.map +1 -1
  4. package/dist/cjs/mods/security/src/index.js +0 -3
  5. package/dist/cjs/mods/security/src/index.js.map +1 -1
  6. package/dist/cjs/shared/logger/Logger.js +2 -0
  7. package/dist/cjs/shared/logger/Logger.js.map +1 -1
  8. package/dist/cjs/src/index.js +55 -61
  9. package/dist/cjs/src/index.js.map +1 -1
  10. package/dist/cjs/src/middleware/XyPrissMiddlewareAPI.js +281 -0
  11. package/dist/cjs/src/middleware/XyPrissMiddlewareAPI.js.map +1 -0
  12. package/dist/cjs/src/middleware/built-in/index.js +325 -0
  13. package/dist/cjs/src/middleware/built-in/index.js.map +1 -0
  14. package/dist/cjs/src/plugins/modules/builtin/ResponseTimePlugin.js +1 -1
  15. package/dist/cjs/src/plugins/modules/builtin/ResponseTimePlugin.js.map +1 -1
  16. package/dist/cjs/src/quick-start.js +0 -4
  17. package/dist/cjs/src/quick-start.js.map +1 -1
  18. package/dist/cjs/src/server/FastServer.js +53 -411
  19. package/dist/cjs/src/server/FastServer.js.map +1 -1
  20. package/dist/cjs/src/server/ServerFactory.js +7 -62
  21. package/dist/cjs/src/server/ServerFactory.js.map +1 -1
  22. package/dist/cjs/src/server/components/fastapi/ClusterManagerComponent.js +1 -1
  23. package/dist/cjs/src/server/components/fastapi/PerformanceManager.js +1 -1
  24. package/dist/cjs/src/server/components/fastapi/PerformanceManager.js.map +1 -1
  25. package/dist/cjs/src/server/components/fastapi/RouteManager.js +0 -82
  26. package/dist/cjs/src/server/components/fastapi/RouteManager.js.map +1 -1
  27. package/dist/cjs/src/server/components/lifecycle/ServerLifecycleManager.js +384 -0
  28. package/dist/cjs/src/server/components/lifecycle/ServerLifecycleManager.js.map +1 -0
  29. package/dist/cjs/src/server/const/default.js +0 -8
  30. package/dist/cjs/src/server/const/default.js.map +1 -1
  31. package/dist/cjs/src/server/core/HttpServer.js +500 -0
  32. package/dist/cjs/src/server/core/HttpServer.js.map +1 -0
  33. package/dist/cjs/src/server/core/XyprissApp.js +412 -0
  34. package/dist/cjs/src/server/core/XyprissApp.js.map +1 -0
  35. package/dist/cjs/src/server/middleware/MiddlewareManager.js +146 -0
  36. package/dist/cjs/src/server/middleware/MiddlewareManager.js.map +1 -0
  37. package/dist/cjs/src/server/routing/Router.js +341 -0
  38. package/dist/cjs/src/server/routing/Router.js.map +1 -0
  39. package/dist/cjs/src/server/utils/PortManager.js +1 -0
  40. package/dist/cjs/src/server/utils/PortManager.js.map +1 -1
  41. package/dist/cjs/src/server/utils/es_modules.js +3 -2
  42. package/dist/cjs/src/server/utils/es_modules.js.map +1 -1
  43. package/dist/cjs/src/server/utils/forceClosePort.js +294 -88
  44. package/dist/cjs/src/server/utils/forceClosePort.js.map +1 -1
  45. package/dist/esm/mods/security/src/components/cache/index.js +1 -70
  46. package/dist/esm/mods/security/src/components/cache/index.js.map +1 -1
  47. package/dist/esm/mods/security/src/index.js +1 -1
  48. package/dist/esm/shared/logger/Logger.js +2 -0
  49. package/dist/esm/shared/logger/Logger.js.map +1 -1
  50. package/dist/esm/src/index.js +41 -11
  51. package/dist/esm/src/index.js.map +1 -1
  52. package/dist/esm/src/middleware/XyPrissMiddlewareAPI.js +279 -0
  53. package/dist/esm/src/middleware/XyPrissMiddlewareAPI.js.map +1 -0
  54. package/dist/esm/src/middleware/built-in/index.js +323 -0
  55. package/dist/esm/src/middleware/built-in/index.js.map +1 -0
  56. package/dist/esm/src/plugins/modules/builtin/ResponseTimePlugin.js +1 -1
  57. package/dist/esm/src/plugins/modules/builtin/ResponseTimePlugin.js.map +1 -1
  58. package/dist/esm/src/quick-start.js +0 -4
  59. package/dist/esm/src/quick-start.js.map +1 -1
  60. package/dist/esm/src/server/FastServer.js +53 -411
  61. package/dist/esm/src/server/FastServer.js.map +1 -1
  62. package/dist/esm/src/server/ServerFactory.js +8 -59
  63. package/dist/esm/src/server/ServerFactory.js.map +1 -1
  64. package/dist/esm/src/server/components/fastapi/ClusterManagerComponent.js +1 -1
  65. package/dist/esm/src/server/components/fastapi/PerformanceManager.js +1 -1
  66. package/dist/esm/src/server/components/fastapi/PerformanceManager.js.map +1 -1
  67. package/dist/esm/src/server/components/fastapi/RouteManager.js +0 -82
  68. package/dist/esm/src/server/components/fastapi/RouteManager.js.map +1 -1
  69. package/dist/esm/src/server/components/lifecycle/ServerLifecycleManager.js +382 -0
  70. package/dist/esm/src/server/components/lifecycle/ServerLifecycleManager.js.map +1 -0
  71. package/dist/esm/src/server/const/default.js +0 -8
  72. package/dist/esm/src/server/const/default.js.map +1 -1
  73. package/dist/esm/src/server/core/HttpServer.js +498 -0
  74. package/dist/esm/src/server/core/HttpServer.js.map +1 -0
  75. package/dist/esm/src/server/core/XyprissApp.js +410 -0
  76. package/dist/esm/src/server/core/XyprissApp.js.map +1 -0
  77. package/dist/esm/src/server/middleware/MiddlewareManager.js +144 -0
  78. package/dist/esm/src/server/middleware/MiddlewareManager.js.map +1 -0
  79. package/dist/esm/src/server/routing/Router.js +339 -0
  80. package/dist/esm/src/server/routing/Router.js.map +1 -0
  81. package/dist/esm/src/server/utils/PortManager.js +1 -0
  82. package/dist/esm/src/server/utils/PortManager.js.map +1 -1
  83. package/dist/esm/src/server/utils/es_modules.js +3 -3
  84. package/dist/esm/src/server/utils/es_modules.js.map +1 -1
  85. package/dist/esm/src/server/utils/forceClosePort.js +294 -88
  86. package/dist/esm/src/server/utils/forceClosePort.js.map +1 -1
  87. package/dist/index.d.ts +2166 -4273
  88. package/package.json +31 -19
@@ -1,123 +1,329 @@
1
1
  import { Logger } from '../../../shared/logger/Logger.js';
2
+ import { exec } from 'child_process';
3
+ import { promisify } from 'util';
2
4
 
3
5
  class Port {
4
6
  constructor(port) {
5
- this.port = port;
7
+ this.MAX_RETRIES = 3;
8
+ this.RETRY_DELAY = 500;
9
+ this.PORT_FREE_WAIT = 1000;
10
+ this.port = this._validatePort(port);
6
11
  this.logger = Logger.getInstance();
12
+ this.execAsync = promisify(exec);
7
13
  }
8
14
  /**
9
15
  * Attempt to forcefully close/free up the specified port
10
- * @param port - The port number to force close
11
16
  * @returns Promise<boolean> - true if successful, false if failed
12
17
  */
13
18
  async forceClosePort() {
14
19
  try {
15
20
  this.logger.debug("server", `Attempting to force close port ${this.port}...`);
16
- // Import required modules
17
- const { exec } = require("child_process");
18
- const { promisify } = require("util");
19
- const execAsync = promisify(exec);
20
- // Platform-specific port closing logic
21
- if (process.platform === "win32") {
22
- // Windows: Find and kill process using the port
23
- try {
24
- const { stdout } = await execAsync(`netstat -ano | findstr :${this.port}`);
25
- const lines = stdout
26
- .split("\n")
27
- .filter((line) => line.trim());
28
- for (const line of lines) {
29
- const parts = line.trim().split(/\s+/);
30
- if (parts.length >= 5) {
31
- const pid = parts[4];
32
- if (pid && pid !== "0") {
33
- try {
34
- await execAsync(`taskkill /F /PID ${pid}`);
35
- this.logger.info("server", `Forcefully closed process ${pid} using port ${this.port}`);
36
- }
37
- catch (killError) {
38
- // Handle race condition - process may have already exited
39
- if (killError.message.includes("n'a pas pu être arrêté") ||
40
- killError.message.includes("could not be terminated") ||
41
- killError.message.includes("No such process")) {
42
- this.logger.info("server", `Process ${pid} using port ${this.port} had already exited`);
43
- }
44
- else {
45
- this.logger.warn("server", `Failed to kill process ${pid}: ${killError.message}`);
46
- }
47
- }
48
- }
49
- }
21
+ // Check if port is actually in use
22
+ const portCheck = await this._checkPortStatus();
23
+ if (!portCheck.isInUse) {
24
+ this.logger.info("server", `Port ${this.port} is already free`);
25
+ return true;
26
+ }
27
+ // Kill processes using the port
28
+ const success = await this._killPortProcesses(portCheck.processes);
29
+ if (!success) {
30
+ return false;
31
+ }
32
+ // Wait for port to be freed
33
+ await this._waitForPortFree();
34
+ // Final verification
35
+ const finalCheck = await this._verifyPortIsFree();
36
+ if (finalCheck) {
37
+ this.logger.info("server", `Port ${this.port} is now free`);
38
+ return true;
39
+ }
40
+ else {
41
+ this.logger.warn("server", `Port ${this.port} may still be in use after cleanup attempt`);
42
+ return false;
43
+ }
44
+ }
45
+ catch (error) {
46
+ this.logger.error("server", `Error force closing port ${this.port}:`, error.message);
47
+ return false;
48
+ }
49
+ }
50
+ /**
51
+ * Validates that the port number is within valid range
52
+ * @param port - The port number to validate
53
+ * @returns The validated port number
54
+ * @throws Error if port is invalid
55
+ */
56
+ _validatePort(port) {
57
+ if (!Number.isInteger(port) || port < 1 || port > 65535) {
58
+ throw new Error(`Invalid port number: ${port}. Port must be between 1 and 65535.`);
59
+ }
60
+ return port;
61
+ }
62
+ /**
63
+ * Checks the current status of the port
64
+ * @returns Promise<PortCheckResult> - Information about port usage
65
+ */
66
+ async _checkPortStatus() {
67
+ try {
68
+ const processes = await this._getPortProcesses();
69
+ return {
70
+ isInUse: processes.length > 0,
71
+ processes,
72
+ };
73
+ }
74
+ catch (error) {
75
+ this.logger.debug("server", `Error checking port status: ${error.message}`);
76
+ return { isInUse: false, processes: [] };
77
+ }
78
+ }
79
+ /**
80
+ * Gets list of processes using the port
81
+ * @returns Promise<PortProcess[]> - Array of processes using the port
82
+ */
83
+ async _getPortProcesses() {
84
+ if (process.platform === "win32") {
85
+ return this._getWindowsPortProcesses();
86
+ }
87
+ else {
88
+ return this._getUnixPortProcesses();
89
+ }
90
+ }
91
+ /**
92
+ * Gets processes using the port on Windows
93
+ * @returns Promise<PortProcess[]> - Array of Windows processes
94
+ */
95
+ async _getWindowsPortProcesses() {
96
+ const processes = [];
97
+ try {
98
+ const { stdout } = await this._executeWithRetry(`netstat -ano | findstr :${this.port}`);
99
+ const lines = stdout.split("\n").filter((line) => line.trim());
100
+ for (const line of lines) {
101
+ const parts = line.trim().split(/\s+/);
102
+ if (parts.length >= 5) {
103
+ const localAddress = parts[1];
104
+ const protocol = parts[0];
105
+ const state = parts[3];
106
+ const pid = parts[4];
107
+ // Ensure this is exactly our port (not a port that contains our port number)
108
+ if (this._isExactPortMatch(localAddress, this.port) &&
109
+ pid &&
110
+ pid !== "0") {
111
+ processes.push({ pid, protocol, state });
50
112
  }
51
113
  }
52
- catch (error) {
53
- this.logger.warn("server", `Failed to close port ${this.port} on Windows: ${error.message}`);
54
- return false;
114
+ }
115
+ }
116
+ catch (error) {
117
+ this.logger.debug("server", `Windows netstat command failed: ${error.message}`);
118
+ }
119
+ return processes;
120
+ }
121
+ /**
122
+ * Gets processes using the port on Unix-like systems
123
+ * @returns Promise<PortProcess[]> - Array of Unix processes
124
+ */
125
+ async _getUnixPortProcesses() {
126
+ const processes = [];
127
+ try {
128
+ const { stdout } = await this._executeWithRetry(`lsof -ti:${this.port}`);
129
+ const pids = stdout
130
+ .trim()
131
+ .split("\n")
132
+ .filter((pid) => pid && pid.trim());
133
+ for (const pid of pids) {
134
+ if (pid.trim()) {
135
+ // Get additional process info
136
+ try {
137
+ const { stdout: processInfo } = await this.execAsync(`lsof -p ${pid.trim()} | grep :${this.port}`);
138
+ const protocol = this._extractProtocolFromLsof(processInfo);
139
+ processes.push({ pid: pid.trim(), protocol });
140
+ }
141
+ catch {
142
+ // Fallback if detailed info fails
143
+ processes.push({
144
+ pid: pid.trim(),
145
+ protocol: "unknown",
146
+ });
147
+ }
55
148
  }
56
149
  }
150
+ }
151
+ catch (error) {
152
+ this.logger.debug("server", `Unix lsof command failed: ${error.message}`);
153
+ }
154
+ return processes;
155
+ }
156
+ /**
157
+ * Kills all processes using the port
158
+ * @param processes - Array of processes to kill
159
+ * @returns Promise<boolean> - true if all processes were handled successfully
160
+ */
161
+ async _killPortProcesses(processes) {
162
+ let allSuccessful = true;
163
+ for (const process of processes) {
164
+ const success = await this._killSingleProcess(process);
165
+ if (!success) {
166
+ allSuccessful = false;
167
+ }
168
+ }
169
+ return allSuccessful;
170
+ }
171
+ /**
172
+ * Kills a single process
173
+ * @param process - The process to kill
174
+ * @returns Promise<boolean> - true if successful or process no longer exists
175
+ */
176
+ async _killSingleProcess(process) {
177
+ try {
178
+ this.logger.debug("server", `Attempting to kill process ${process.pid} (${process.protocol}) using port ${this.port}`);
179
+ if (globalThis.process.platform === "win32") {
180
+ await this._executeWithRetry(`taskkill /F /PID ${process.pid}`);
181
+ }
57
182
  else {
58
- // Unix/Linux/macOS: Find and kill process using the port
183
+ // Try graceful kill first, then force kill
59
184
  try {
60
- const { stdout } = await execAsync(`lsof -ti:${this.port}`);
61
- const pids = stdout
62
- .trim()
63
- .split("\n")
64
- .filter((pid) => pid);
65
- for (const pid of pids) {
66
- if (pid) {
67
- try {
68
- await execAsync(`kill -9 ${pid}`);
69
- this.logger.info("server", `Forcefully closed process ${pid} using port ${this.port}`);
70
- }
71
- catch (killError) {
72
- // Handle race condition - process may have already exited
73
- if (killError.message.includes("No such process") ||
74
- killError.message.includes("Operation not permitted")) {
75
- this.logger.info("server", `Process ${pid} using port ${this.port} had already exited or is protected`);
76
- }
77
- else {
78
- this.logger.warn("server", `Failed to kill process ${pid}: ${killError.message}`);
79
- }
80
- }
81
- }
185
+ await this._executeWithRetry(`kill ${process.pid}`);
186
+ await new Promise((resolve) => setTimeout(resolve, 500));
187
+ // Check if process still exists
188
+ const stillExists = await this._processExists(process.pid);
189
+ if (stillExists) {
190
+ await this._executeWithRetry(`kill -9 ${process.pid}`);
82
191
  }
83
192
  }
84
- catch (error) {
85
- this.logger.warn("server", `Failed to close port ${this.port} on Unix: ${error.message}`);
86
- return false;
193
+ catch {
194
+ // Fallback to force kill
195
+ await this._executeWithRetry(`kill -9 ${process.pid}`);
87
196
  }
88
197
  }
89
- // Wait a moment for the port to be freed
90
- await new Promise((resolve) => setTimeout(resolve, 1000));
91
- // Verify the port is now free
198
+ this.logger.info("server", `Successfully killed process ${process.pid} using port ${this.port}`);
199
+ return true;
200
+ }
201
+ catch (error) {
202
+ // Handle common scenarios where process is already gone or protected
203
+ if (this._isProcessAlreadyGoneError(error.message)) {
204
+ this.logger.info("server", `Process ${process.pid} using port ${this.port} had already exited`);
205
+ return true;
206
+ }
207
+ else if (this._isProcessProtectedError(error.message)) {
208
+ this.logger.warn("server", `Process ${process.pid} is protected and cannot be killed`);
209
+ return false;
210
+ }
211
+ else {
212
+ this.logger.warn("server", `Failed to kill process ${process.pid}: ${error.message}`);
213
+ return false;
214
+ }
215
+ }
216
+ }
217
+ /**
218
+ * Executes a command with retry logic
219
+ * @param command - Command to execute
220
+ * @returns Promise with command result
221
+ */
222
+ async _executeWithRetry(command) {
223
+ let lastError;
224
+ for (let attempt = 1; attempt <= this.MAX_RETRIES; attempt++) {
92
225
  try {
93
- if (process.platform === "win32") {
94
- const { stdout } = await execAsync(`netstat -ano | findstr :${this.port}`);
95
- if (!stdout.trim()) {
96
- this.logger.info("server", `Port ${this.port} is now free`);
97
- return true;
98
- }
99
- }
100
- else {
101
- const { stdout } = await execAsync(`lsof -ti:${this.port}`);
102
- if (!stdout.trim()) {
103
- this.logger.info("server", `Port ${this.port} is now free`);
104
- return true;
105
- }
226
+ return await this.execAsync(command);
227
+ }
228
+ catch (error) {
229
+ lastError = error;
230
+ if (attempt < this.MAX_RETRIES) {
231
+ this.logger.debug("server", `Command failed (attempt ${attempt}/${this.MAX_RETRIES}), retrying: ${command}`);
232
+ await new Promise((resolve) => setTimeout(resolve, this.RETRY_DELAY));
106
233
  }
107
234
  }
108
- catch (verifyError) {
109
- // If the command fails, it likely means no process is using the port
110
- this.logger.info("server", `Port ${this.port} appears to be free`);
111
- return true;
235
+ }
236
+ throw lastError;
237
+ }
238
+ /**
239
+ * Waits for the port to be freed
240
+ */
241
+ async _waitForPortFree() {
242
+ await new Promise((resolve) => setTimeout(resolve, this.PORT_FREE_WAIT));
243
+ }
244
+ /**
245
+ * Verifies that the port is now free
246
+ * @returns Promise<boolean> - true if port is free
247
+ */
248
+ async _verifyPortIsFree() {
249
+ try {
250
+ const portCheck = await this._checkPortStatus();
251
+ return !portCheck.isInUse;
252
+ }
253
+ catch (error) {
254
+ // If check fails, assume port is free (commands typically fail when nothing is using the port)
255
+ return true;
256
+ }
257
+ }
258
+ /**
259
+ * Checks if a process still exists
260
+ * @param pid - Process ID to check
261
+ * @returns Promise<boolean> - true if process exists
262
+ */
263
+ async _processExists(pid) {
264
+ try {
265
+ if (process.platform === "win32") {
266
+ await this.execAsync(`tasklist /FI "PID eq ${pid}" | findstr ${pid}`);
267
+ }
268
+ else {
269
+ await this.execAsync(`kill -0 ${pid}`);
112
270
  }
113
- this.logger.info("server", `Successfully processed port ${this.port} closure request`);
114
271
  return true;
115
272
  }
116
- catch (error) {
117
- this.logger.error("server", `Error force closing port ${this.port}:`, error.message);
273
+ catch {
118
274
  return false;
119
275
  }
120
276
  }
277
+ /**
278
+ * Checks if the address exactly matches our port
279
+ * @param address - Network address string (e.g., "0.0.0.0:3000")
280
+ * @param port - Port number to match
281
+ * @returns boolean - true if exact match
282
+ */
283
+ _isExactPortMatch(address, port) {
284
+ const portPattern = new RegExp(`:${port}$`);
285
+ return portPattern.test(address);
286
+ }
287
+ /**
288
+ * Extracts protocol information from lsof output
289
+ * @param lsofOutput - Output from lsof command
290
+ * @returns string - Protocol type
291
+ */
292
+ _extractProtocolFromLsof(lsofOutput) {
293
+ if (lsofOutput.includes("TCP"))
294
+ return "TCP";
295
+ if (lsofOutput.includes("UDP"))
296
+ return "UDP";
297
+ return "unknown";
298
+ }
299
+ /**
300
+ * Determines if error indicates process is already gone
301
+ * @param errorMessage - Error message to check
302
+ * @returns boolean - true if process no longer exists
303
+ */
304
+ _isProcessAlreadyGoneError(errorMessage) {
305
+ const goneIndicators = [
306
+ "n'a pas pu être arrêté",
307
+ "could not be terminated",
308
+ "No such process",
309
+ "not found",
310
+ "ERROR: The process",
311
+ ];
312
+ return goneIndicators.some((indicator) => errorMessage.toLowerCase().includes(indicator.toLowerCase()));
313
+ }
314
+ /**
315
+ * Determines if error indicates process is protected
316
+ * @param errorMessage - Error message to check
317
+ * @returns boolean - true if process is protected
318
+ */
319
+ _isProcessProtectedError(errorMessage) {
320
+ const protectedIndicators = [
321
+ "Operation not permitted",
322
+ "Access denied",
323
+ "insufficient privilege",
324
+ ];
325
+ return protectedIndicators.some((indicator) => errorMessage.toLowerCase().includes(indicator.toLowerCase()));
326
+ }
121
327
  }
122
328
 
123
329
  export { Port };
@@ -1 +1 @@
1
- {"version":3,"file":"forceClosePort.js","sources":["../../../../../src/server/utils/forceClosePort.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"forceClosePort.js","sources":["../../../../../src/server/utils/forceClosePort.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}