@superdangerous/app-framework 4.9.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/LICENSE +21 -0
- package/README.md +652 -0
- package/dist/api/logsRouter.d.ts +20 -0
- package/dist/api/logsRouter.d.ts.map +1 -0
- package/dist/api/logsRouter.js +515 -0
- package/dist/api/logsRouter.js.map +1 -0
- package/dist/cli/dev-server.d.ts +7 -0
- package/dist/cli/dev-server.d.ts.map +1 -0
- package/dist/cli/dev-server.js +640 -0
- package/dist/cli/dev-server.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +26 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/StandardServer.d.ts +129 -0
- package/dist/core/StandardServer.d.ts.map +1 -0
- package/dist/core/StandardServer.js +453 -0
- package/dist/core/StandardServer.js.map +1 -0
- package/dist/core/apiResponse.d.ts +69 -0
- package/dist/core/apiResponse.d.ts.map +1 -0
- package/dist/core/apiResponse.js +127 -0
- package/dist/core/apiResponse.js.map +1 -0
- package/dist/core/healthCheck.d.ts +160 -0
- package/dist/core/healthCheck.d.ts.map +1 -0
- package/dist/core/healthCheck.js +398 -0
- package/dist/core/healthCheck.js.map +1 -0
- package/dist/core/index.d.ts +40 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +40 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/logger.d.ts +117 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +826 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/portUtils.d.ts +71 -0
- package/dist/core/portUtils.d.ts.map +1 -0
- package/dist/core/portUtils.js +240 -0
- package/dist/core/portUtils.js.map +1 -0
- package/dist/core/storageService.d.ts +119 -0
- package/dist/core/storageService.d.ts.map +1 -0
- package/dist/core/storageService.js +405 -0
- package/dist/core/storageService.js.map +1 -0
- package/dist/desktop/bundler.d.ts +40 -0
- package/dist/desktop/bundler.d.ts.map +1 -0
- package/dist/desktop/bundler.js +176 -0
- package/dist/desktop/bundler.js.map +1 -0
- package/dist/desktop/index.d.ts +25 -0
- package/dist/desktop/index.d.ts.map +1 -0
- package/dist/desktop/index.js +15 -0
- package/dist/desktop/index.js.map +1 -0
- package/dist/desktop/native-modules.d.ts +66 -0
- package/dist/desktop/native-modules.d.ts.map +1 -0
- package/dist/desktop/native-modules.js +200 -0
- package/dist/desktop/native-modules.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/logging/LogCategories.d.ts +87 -0
- package/dist/logging/LogCategories.d.ts.map +1 -0
- package/dist/logging/LogCategories.js +205 -0
- package/dist/logging/LogCategories.js.map +1 -0
- package/dist/middleware/aiErrorHandler.d.ts +31 -0
- package/dist/middleware/aiErrorHandler.d.ts.map +1 -0
- package/dist/middleware/aiErrorHandler.js +181 -0
- package/dist/middleware/aiErrorHandler.js.map +1 -0
- package/dist/middleware/auth.d.ts +101 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +230 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/cors.d.ts +56 -0
- package/dist/middleware/cors.d.ts.map +1 -0
- package/dist/middleware/cors.js +123 -0
- package/dist/middleware/cors.js.map +1 -0
- package/dist/middleware/errorHandler.d.ts +13 -0
- package/dist/middleware/errorHandler.d.ts.map +1 -0
- package/dist/middleware/errorHandler.js +85 -0
- package/dist/middleware/errorHandler.js.map +1 -0
- package/dist/middleware/fileUpload.d.ts +62 -0
- package/dist/middleware/fileUpload.d.ts.map +1 -0
- package/dist/middleware/fileUpload.js +175 -0
- package/dist/middleware/fileUpload.js.map +1 -0
- package/dist/middleware/health.d.ts +48 -0
- package/dist/middleware/health.d.ts.map +1 -0
- package/dist/middleware/health.js +143 -0
- package/dist/middleware/health.js.map +1 -0
- package/dist/middleware/index.d.ts +20 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +18 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/openapi.d.ts +64 -0
- package/dist/middleware/openapi.d.ts.map +1 -0
- package/dist/middleware/openapi.js +258 -0
- package/dist/middleware/openapi.js.map +1 -0
- package/dist/middleware/requestLogging.d.ts +22 -0
- package/dist/middleware/requestLogging.d.ts.map +1 -0
- package/dist/middleware/requestLogging.js +61 -0
- package/dist/middleware/requestLogging.js.map +1 -0
- package/dist/middleware/session.d.ts +84 -0
- package/dist/middleware/session.d.ts.map +1 -0
- package/dist/middleware/session.js +189 -0
- package/dist/middleware/session.js.map +1 -0
- package/dist/middleware/validation.d.ts +1337 -0
- package/dist/middleware/validation.d.ts.map +1 -0
- package/dist/middleware/validation.js +483 -0
- package/dist/middleware/validation.js.map +1 -0
- package/dist/services/aiService.d.ts +180 -0
- package/dist/services/aiService.d.ts.map +1 -0
- package/dist/services/aiService.js +547 -0
- package/dist/services/aiService.js.map +1 -0
- package/dist/services/conversationStorage.d.ts +38 -0
- package/dist/services/conversationStorage.d.ts.map +1 -0
- package/dist/services/conversationStorage.js +158 -0
- package/dist/services/conversationStorage.js.map +1 -0
- package/dist/services/crossPlatformBuffer.d.ts +84 -0
- package/dist/services/crossPlatformBuffer.d.ts.map +1 -0
- package/dist/services/crossPlatformBuffer.js +246 -0
- package/dist/services/crossPlatformBuffer.js.map +1 -0
- package/dist/services/index.d.ts +17 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +18 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/networkService.d.ts +81 -0
- package/dist/services/networkService.d.ts.map +1 -0
- package/dist/services/networkService.js +268 -0
- package/dist/services/networkService.js.map +1 -0
- package/dist/services/queueService.d.ts +112 -0
- package/dist/services/queueService.d.ts.map +1 -0
- package/dist/services/queueService.js +338 -0
- package/dist/services/queueService.js.map +1 -0
- package/dist/services/settingsService.d.ts +135 -0
- package/dist/services/settingsService.d.ts.map +1 -0
- package/dist/services/settingsService.js +425 -0
- package/dist/services/settingsService.js.map +1 -0
- package/dist/services/systemMonitor.d.ts +208 -0
- package/dist/services/systemMonitor.d.ts.map +1 -0
- package/dist/services/systemMonitor.js +693 -0
- package/dist/services/systemMonitor.js.map +1 -0
- package/dist/services/updateService.d.ts +78 -0
- package/dist/services/updateService.d.ts.map +1 -0
- package/dist/services/updateService.js +252 -0
- package/dist/services/updateService.js.map +1 -0
- package/dist/services/websocketEvents.d.ts +372 -0
- package/dist/services/websocketEvents.d.ts.map +1 -0
- package/dist/services/websocketEvents.js +338 -0
- package/dist/services/websocketEvents.js.map +1 -0
- package/dist/services/websocketServer.d.ts +80 -0
- package/dist/services/websocketServer.d.ts.map +1 -0
- package/dist/services/websocketServer.js +299 -0
- package/dist/services/websocketServer.js.map +1 -0
- package/dist/settings/SettingsSchema.d.ts +151 -0
- package/dist/settings/SettingsSchema.d.ts.map +1 -0
- package/dist/settings/SettingsSchema.js +424 -0
- package/dist/settings/SettingsSchema.js.map +1 -0
- package/dist/testing/TestServer.d.ts +69 -0
- package/dist/testing/TestServer.d.ts.map +1 -0
- package/dist/testing/TestServer.js +250 -0
- package/dist/testing/TestServer.js.map +1 -0
- package/dist/types/index.d.ts +137 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/appPaths.d.ts +74 -0
- package/dist/utils/appPaths.d.ts.map +1 -0
- package/dist/utils/appPaths.js +162 -0
- package/dist/utils/appPaths.js.map +1 -0
- package/dist/utils/fs-utils.d.ts +50 -0
- package/dist/utils/fs-utils.d.ts.map +1 -0
- package/dist/utils/fs-utils.js +114 -0
- package/dist/utils/fs-utils.js.map +1 -0
- package/dist/utils/index.d.ts +12 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +10 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/standardConfig.d.ts +61 -0
- package/dist/utils/standardConfig.d.ts.map +1 -0
- package/dist/utils/standardConfig.js +109 -0
- package/dist/utils/standardConfig.js.map +1 -0
- package/dist/utils/startupBanner.d.ts +34 -0
- package/dist/utils/startupBanner.d.ts.map +1 -0
- package/dist/utils/startupBanner.js +169 -0
- package/dist/utils/startupBanner.js.map +1 -0
- package/dist/utils/startupLogger.d.ts +45 -0
- package/dist/utils/startupLogger.d.ts.map +1 -0
- package/dist/utils/startupLogger.js +200 -0
- package/dist/utils/startupLogger.js.map +1 -0
- package/package.json +151 -0
- package/src/api/logsRouter.ts +600 -0
- package/src/cli/dev-server.ts +803 -0
- package/src/cli/index.ts +31 -0
- package/src/core/StandardServer.ts +587 -0
- package/src/core/apiResponse.ts +202 -0
- package/src/core/healthCheck.ts +565 -0
- package/src/core/index.ts +80 -0
- package/src/core/logger.ts +1092 -0
- package/src/core/portUtils.ts +319 -0
- package/src/core/storageService.ts +595 -0
- package/src/desktop/bundler.ts +271 -0
- package/src/desktop/index.ts +18 -0
- package/src/desktop/native-modules.ts +289 -0
- package/src/index.ts +142 -0
- package/src/logging/LogCategories.ts +302 -0
- package/src/middleware/aiErrorHandler.ts +278 -0
- package/src/middleware/auth.ts +329 -0
- package/src/middleware/cors.ts +187 -0
- package/src/middleware/errorHandler.ts +103 -0
- package/src/middleware/fileUpload.ts +252 -0
- package/src/middleware/health.ts +206 -0
- package/src/middleware/index.ts +71 -0
- package/src/middleware/openapi.ts +305 -0
- package/src/middleware/requestLogging.ts +92 -0
- package/src/middleware/session.ts +238 -0
- package/src/middleware/validation.ts +603 -0
- package/src/services/aiService.ts +789 -0
- package/src/services/conversationStorage.ts +232 -0
- package/src/services/crossPlatformBuffer.ts +341 -0
- package/src/services/index.ts +47 -0
- package/src/services/networkService.ts +351 -0
- package/src/services/queueService.ts +446 -0
- package/src/services/settingsService.ts +549 -0
- package/src/services/systemMonitor.ts +936 -0
- package/src/services/updateService.ts +334 -0
- package/src/services/websocketEvents.ts +409 -0
- package/src/services/websocketServer.ts +394 -0
- package/src/settings/SettingsSchema.ts +664 -0
- package/src/testing/TestServer.ts +312 -0
- package/src/types/index.ts +154 -0
- package/src/utils/appPaths.ts +196 -0
- package/src/utils/fs-utils.ts +130 -0
- package/src/utils/index.ts +15 -0
- package/src/utils/standardConfig.ts +178 -0
- package/src/utils/startupBanner.ts +287 -0
- package/src/utils/startupLogger.ts +268 -0
- package/ui/dist/index.d.mts +1221 -0
- package/ui/dist/index.d.ts +1221 -0
- package/ui/dist/index.js +73 -0
- package/ui/dist/index.js.map +1 -0
- package/ui/dist/index.mjs +73 -0
- package/ui/dist/index.mjs.map +1 -0
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication Middleware
|
|
3
|
+
* Generic authentication utilities for Express applications
|
|
4
|
+
*/
|
|
5
|
+
import { createLogger } from "../core/index.js";
|
|
6
|
+
let logger; // Will be initialized when needed
|
|
7
|
+
function ensureLogger() {
|
|
8
|
+
if (!logger) {
|
|
9
|
+
logger = createLogger("AuthMiddleware");
|
|
10
|
+
}
|
|
11
|
+
return logger;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Creates authentication middleware with configuration
|
|
15
|
+
*/
|
|
16
|
+
export function createAuthMiddleware(config = {}) {
|
|
17
|
+
const { loginPath = "/login", apiPrefix = "/api/", excludePaths = [], onUnauthorized, } = config;
|
|
18
|
+
return function requireAuth(req, res, next) {
|
|
19
|
+
// Check if path is excluded
|
|
20
|
+
if (excludePaths.some((path) => req.path.startsWith(path))) {
|
|
21
|
+
return next();
|
|
22
|
+
}
|
|
23
|
+
// Check if user is authenticated
|
|
24
|
+
if (req.session && req.session.authenticated) {
|
|
25
|
+
// Attach user to request
|
|
26
|
+
req.user = {
|
|
27
|
+
id: req.session.userId || "",
|
|
28
|
+
username: req.session.username || "",
|
|
29
|
+
roles: req.session.roles || [],
|
|
30
|
+
};
|
|
31
|
+
return next();
|
|
32
|
+
}
|
|
33
|
+
// Handle unauthorized access
|
|
34
|
+
if (onUnauthorized) {
|
|
35
|
+
return onUnauthorized(req, res);
|
|
36
|
+
}
|
|
37
|
+
// Default behavior
|
|
38
|
+
if (req.path.startsWith(apiPrefix)) {
|
|
39
|
+
// For API routes, return JSON error
|
|
40
|
+
res.status(401).json({
|
|
41
|
+
success: false,
|
|
42
|
+
error: "Authentication required",
|
|
43
|
+
message: "Please log in to access this resource",
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
// For web routes, redirect to login
|
|
48
|
+
res.redirect(loginPath);
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export function createLoginHandler(authService) {
|
|
53
|
+
return async (req, res) => {
|
|
54
|
+
try {
|
|
55
|
+
const { username, password } = req.body;
|
|
56
|
+
if (!username || !password) {
|
|
57
|
+
res.status(400).json({
|
|
58
|
+
success: false,
|
|
59
|
+
error: "Missing credentials",
|
|
60
|
+
message: "Username and password are required",
|
|
61
|
+
});
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const result = await authService.validateCredentials({
|
|
65
|
+
username,
|
|
66
|
+
password,
|
|
67
|
+
});
|
|
68
|
+
if (result.valid && result.user) {
|
|
69
|
+
// Set session
|
|
70
|
+
req.session.authenticated = true;
|
|
71
|
+
req.session.username = result.user.username;
|
|
72
|
+
req.session.userId = result.user.id;
|
|
73
|
+
req.session.roles = result.user.roles;
|
|
74
|
+
ensureLogger().info(`User logged in: ${username}`);
|
|
75
|
+
res.json({
|
|
76
|
+
success: true,
|
|
77
|
+
user: {
|
|
78
|
+
username: result.user.username,
|
|
79
|
+
roles: result.user.roles,
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
ensureLogger().warn(`Failed login attempt for user: ${username}`);
|
|
85
|
+
res.status(401).json({
|
|
86
|
+
success: false,
|
|
87
|
+
error: "Invalid credentials",
|
|
88
|
+
message: result.error || "Invalid username or password",
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch (_error) {
|
|
93
|
+
ensureLogger().error("Login error:", _error);
|
|
94
|
+
res.status(500).json({
|
|
95
|
+
success: false,
|
|
96
|
+
error: "Login failed",
|
|
97
|
+
message: "An error occurred during login",
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Logout handler factory
|
|
104
|
+
*/
|
|
105
|
+
export function createLogoutHandler() {
|
|
106
|
+
return (req, res) => {
|
|
107
|
+
const username = req.session?.username;
|
|
108
|
+
req.session.destroy((err) => {
|
|
109
|
+
if (err) {
|
|
110
|
+
ensureLogger().error("Error destroying session:", err);
|
|
111
|
+
res.status(500).json({
|
|
112
|
+
success: false,
|
|
113
|
+
error: "Logout failed",
|
|
114
|
+
});
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
if (username) {
|
|
118
|
+
ensureLogger().info(`User logged out: ${username}`);
|
|
119
|
+
}
|
|
120
|
+
res.json({ success: true });
|
|
121
|
+
});
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Auth check handler
|
|
126
|
+
*/
|
|
127
|
+
export function createAuthCheckHandler() {
|
|
128
|
+
return (req, res) => {
|
|
129
|
+
if (req.session?.authenticated) {
|
|
130
|
+
res.json({
|
|
131
|
+
authenticated: true,
|
|
132
|
+
user: {
|
|
133
|
+
username: req.session.username,
|
|
134
|
+
roles: req.session.roles,
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
res.status(401).json({
|
|
140
|
+
authenticated: false,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Role-based access control middleware
|
|
147
|
+
*/
|
|
148
|
+
export function requireRole(roles) {
|
|
149
|
+
const requiredRoles = Array.isArray(roles) ? roles : [roles];
|
|
150
|
+
return (req, res, next) => {
|
|
151
|
+
if (!req.user) {
|
|
152
|
+
res.status(401).json({
|
|
153
|
+
success: false,
|
|
154
|
+
error: "Authentication required",
|
|
155
|
+
});
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
const userRoles = req.user.roles || [];
|
|
159
|
+
const hasRole = requiredRoles.some((role) => userRoles.includes(role));
|
|
160
|
+
if (!hasRole) {
|
|
161
|
+
res.status(403).json({
|
|
162
|
+
success: false,
|
|
163
|
+
error: "Insufficient permissions",
|
|
164
|
+
message: `This action requires one of the following roles: ${requiredRoles.join(", ")}`,
|
|
165
|
+
});
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
next();
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Simple in-memory auth service for development
|
|
173
|
+
*/
|
|
174
|
+
export class SimpleAuthService {
|
|
175
|
+
users;
|
|
176
|
+
constructor(users = []) {
|
|
177
|
+
this.users = new Map();
|
|
178
|
+
// Add default admin user if no users provided
|
|
179
|
+
if (users.length === 0) {
|
|
180
|
+
users = [
|
|
181
|
+
{
|
|
182
|
+
username: "admin",
|
|
183
|
+
password: "admin",
|
|
184
|
+
id: "admin-1",
|
|
185
|
+
roles: ["admin"],
|
|
186
|
+
},
|
|
187
|
+
];
|
|
188
|
+
}
|
|
189
|
+
users.forEach((user) => {
|
|
190
|
+
this.users.set(user.username, {
|
|
191
|
+
password: user.password,
|
|
192
|
+
id: user.id || `user-${user.username}`,
|
|
193
|
+
roles: user.roles,
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
async validateCredentials(credentials) {
|
|
198
|
+
const user = this.users.get(credentials.username);
|
|
199
|
+
if (!user || user.password !== credentials.password) {
|
|
200
|
+
return {
|
|
201
|
+
valid: false,
|
|
202
|
+
error: "Invalid username or password",
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
return {
|
|
206
|
+
valid: true,
|
|
207
|
+
user: {
|
|
208
|
+
id: user.id,
|
|
209
|
+
username: credentials.username,
|
|
210
|
+
roles: user.roles,
|
|
211
|
+
},
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
addUser(username, password, roles) {
|
|
215
|
+
this.users.set(username, {
|
|
216
|
+
password,
|
|
217
|
+
id: `user-${username}`,
|
|
218
|
+
roles,
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
export default {
|
|
223
|
+
createAuthMiddleware,
|
|
224
|
+
createLoginHandler,
|
|
225
|
+
createLogoutHandler,
|
|
226
|
+
createAuthCheckHandler,
|
|
227
|
+
requireRole,
|
|
228
|
+
SimpleAuthService,
|
|
229
|
+
};
|
|
230
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,IAAI,MAAW,CAAC,CAAC,kCAAkC;AAEnD,SAAS,YAAY;IACnB,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,YAAY,CAAC,gBAAgB,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAiCD;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAqB,EAAE;IAC1D,MAAM,EACJ,SAAS,GAAG,QAAQ,EACpB,SAAS,GAAG,OAAO,EACnB,YAAY,GAAG,EAAE,EACjB,cAAc,GACf,GAAG,MAAM,CAAC;IAEX,OAAO,SAAS,WAAW,CACzB,GAAY,EACZ,GAAa,EACb,IAAkB;QAElB,4BAA4B;QAC5B,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAC3D,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QAED,iCAAiC;QACjC,IAAI,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;YAC7C,yBAAyB;YACzB,GAAG,CAAC,IAAI,GAAG;gBACT,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE;gBAC5B,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE;gBACpC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;aAC/B,CAAC;YACF,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QAED,6BAA6B;QAC7B,IAAI,cAAc,EAAE,CAAC;YACnB,OAAO,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAClC,CAAC;QAED,mBAAmB;QACnB,IAAI,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACnC,oCAAoC;YACpC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,yBAAyB;gBAChC,OAAO,EAAE,uCAAuC;aACjD,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,oCAAoC;YACpC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAsBD,MAAM,UAAU,kBAAkB,CAAC,WAAwB;IACzD,OAAO,KAAK,EAAE,GAAY,EAAE,GAAa,EAAiB,EAAE;QAC1D,IAAI,CAAC;YACH,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;YAExC,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC3B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,qBAAqB;oBAC5B,OAAO,EAAE,oCAAoC;iBAC9C,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,mBAAmB,CAAC;gBACnD,QAAQ;gBACR,QAAQ;aACT,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;gBAChC,cAAc;gBACd,GAAG,CAAC,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;gBACjC,GAAG,CAAC,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAC5C,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpC,GAAG,CAAC,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;gBAEtC,YAAY,EAAE,CAAC,IAAI,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;gBAEnD,GAAG,CAAC,IAAI,CAAC;oBACP,OAAO,EAAE,IAAI;oBACb,IAAI,EAAE;wBACJ,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ;wBAC9B,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK;qBACzB;iBACF,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,YAAY,EAAE,CAAC,IAAI,CAAC,kCAAkC,QAAQ,EAAE,CAAC,CAAC;gBAClE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,qBAAqB;oBAC5B,OAAO,EAAE,MAAM,CAAC,KAAK,IAAI,8BAA8B;iBACxD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,MAAW,EAAE,CAAC;YACrB,YAAY,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;YAC7C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,cAAc;gBACrB,OAAO,EAAE,gCAAgC;aAC1C,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB;IACjC,OAAO,CAAC,GAAY,EAAE,GAAa,EAAQ,EAAE;QAC3C,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC;QAEvC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAQ,EAAE,EAAE;YAC/B,IAAI,GAAG,EAAE,CAAC;gBACR,YAAY,EAAE,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAC;gBACvD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,eAAe;iBACvB,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,IAAI,QAAQ,EAAE,CAAC;gBACb,YAAY,EAAE,CAAC,IAAI,CAAC,oBAAoB,QAAQ,EAAE,CAAC,CAAC;YACtD,CAAC;YAED,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO,CAAC,GAAY,EAAE,GAAa,EAAQ,EAAE;QAC3C,IAAI,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,CAAC;YAC/B,GAAG,CAAC,IAAI,CAAC;gBACP,aAAa,EAAE,IAAI;gBACnB,IAAI,EAAE;oBACJ,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ;oBAC9B,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK;iBACzB;aACF,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,aAAa,EAAE,KAAK;aACrB,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAAwB;IAClD,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAE7D,OAAO,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAQ,EAAE;QAC/D,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACd,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,yBAAyB;aACjC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAEvE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,0BAA0B;gBACjC,OAAO,EAAE,oDAAoD,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aACxF,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,IAAI,EAAE,CAAC;IACT,CAAC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,iBAAiB;IACpB,KAAK,CAGX;IAEF,YACE,QAKK,EAAE;QAEP,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC;QAEvB,8CAA8C;QAC9C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,KAAK,GAAG;gBACN;oBACE,QAAQ,EAAE,OAAO;oBACjB,QAAQ,EAAE,OAAO;oBACjB,EAAE,EAAE,SAAS;oBACb,KAAK,EAAE,CAAC,OAAO,CAAC;iBACjB;aACF,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACrB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE;gBAC5B,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,EAAE,EAAE,IAAI,CAAC,EAAE,IAAI,QAAQ,IAAI,CAAC,QAAQ,EAAE;gBACtC,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,WAA6B;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAElD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,WAAW,CAAC,QAAQ,EAAE,CAAC;YACpD,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,8BAA8B;aACtC,CAAC;QACJ,CAAC;QAED,OAAO;YACL,KAAK,EAAE,IAAI;YACX,IAAI,EAAE;gBACJ,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,QAAQ,EAAE,WAAW,CAAC,QAAQ;gBAC9B,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB;SACF,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,QAAgB,EAAE,QAAgB,EAAE,KAAgB;QAC1D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE;YACvB,QAAQ;YACR,EAAE,EAAE,QAAQ,QAAQ,EAAE;YACtB,KAAK;SACN,CAAC,CAAC;IACL,CAAC;CACF;AAED,eAAe;IACb,oBAAoB;IACpB,kBAAkB;IAClB,mBAAmB;IACnB,sBAAsB;IACtB,WAAW;IACX,iBAAiB;CAClB,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dynamic CORS Middleware
|
|
3
|
+
* Intelligently handles CORS based on environment and configuration
|
|
4
|
+
*/
|
|
5
|
+
import cors from "cors";
|
|
6
|
+
export interface DynamicCorsOptions {
|
|
7
|
+
/**
|
|
8
|
+
* Explicitly allowed origins (optional)
|
|
9
|
+
*/
|
|
10
|
+
allowedOrigins?: string[];
|
|
11
|
+
/**
|
|
12
|
+
* Port ranges to automatically allow in development
|
|
13
|
+
*/
|
|
14
|
+
devPortRanges?: Array<{
|
|
15
|
+
start: number;
|
|
16
|
+
end: number;
|
|
17
|
+
}>;
|
|
18
|
+
/**
|
|
19
|
+
* Common development ports to always allow
|
|
20
|
+
*/
|
|
21
|
+
commonDevPorts?: number[];
|
|
22
|
+
/**
|
|
23
|
+
* Whether to allow credentials
|
|
24
|
+
*/
|
|
25
|
+
credentials?: boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Custom origin validator function
|
|
28
|
+
*/
|
|
29
|
+
customValidator?: (origin: string) => boolean;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Creates dynamic CORS middleware that intelligently handles origins
|
|
33
|
+
*/
|
|
34
|
+
export declare function createDynamicCors(options?: DynamicCorsOptions): (req: cors.CorsRequest, res: {
|
|
35
|
+
statusCode?: number | undefined;
|
|
36
|
+
setHeader(key: string, value: string): any;
|
|
37
|
+
end(): any;
|
|
38
|
+
}, next: (err?: any) => any) => void;
|
|
39
|
+
/**
|
|
40
|
+
* Simple CORS middleware for production with specific domains
|
|
41
|
+
*/
|
|
42
|
+
export declare function createProductionCors(allowedDomains: string[]): (req: cors.CorsRequest, res: {
|
|
43
|
+
statusCode?: number | undefined;
|
|
44
|
+
setHeader(key: string, value: string): any;
|
|
45
|
+
end(): any;
|
|
46
|
+
}, next: (err?: any) => any) => void;
|
|
47
|
+
/**
|
|
48
|
+
* Permissive CORS for development
|
|
49
|
+
*/
|
|
50
|
+
export declare function createDevCors(): (req: cors.CorsRequest, res: {
|
|
51
|
+
statusCode?: number | undefined;
|
|
52
|
+
setHeader(key: string, value: string): any;
|
|
53
|
+
end(): any;
|
|
54
|
+
}, next: (err?: any) => any) => void;
|
|
55
|
+
export default createDynamicCors;
|
|
56
|
+
//# sourceMappingURL=cors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cors.d.ts","sourceRoot":"","sources":["../../src/middleware/cors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AAKxB,MAAM,WAAW,kBAAkB;IACjC;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAE1B;;OAEG;IACH,aAAa,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAEtD;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAE1B;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB;;OAEG;IACH,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;CAC/C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,kBAAuB;cAoB5C,CAAC;;;aAGP,CAAC,uBAqFhB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,MAAM,EAAE;cA7FvC,CAAC;;;aAGP,CAAC,uBA+GhB;AAED;;GAEG;AACH,wBAAgB,aAAa;cAvHP,CAAC;;;aAGP,CAAC,uBAyHhB;AAED,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dynamic CORS Middleware
|
|
3
|
+
* Intelligently handles CORS based on environment and configuration
|
|
4
|
+
*/
|
|
5
|
+
import cors from "cors";
|
|
6
|
+
import { createLogger } from "../core/logger.js";
|
|
7
|
+
const logger = createLogger("CORS");
|
|
8
|
+
/**
|
|
9
|
+
* Creates dynamic CORS middleware that intelligently handles origins
|
|
10
|
+
*/
|
|
11
|
+
export function createDynamicCors(options = {}) {
|
|
12
|
+
const { allowedOrigins = [], devPortRanges = [
|
|
13
|
+
{ start: 3000, end: 3010 },
|
|
14
|
+
{ start: 5170, end: 5180 },
|
|
15
|
+
{ start: 8080, end: 8090 },
|
|
16
|
+
], commonDevPorts = [3000, 3001, 5173, 5174, 5175, 8080, 8081], credentials = true, customValidator, } = options;
|
|
17
|
+
// Build allowed origins list for development
|
|
18
|
+
const buildDevOrigins = () => {
|
|
19
|
+
const origins = new Set();
|
|
20
|
+
// Add explicitly allowed origins
|
|
21
|
+
allowedOrigins.forEach((origin) => origins.add(origin));
|
|
22
|
+
// Add common development ports
|
|
23
|
+
commonDevPorts.forEach((port) => {
|
|
24
|
+
origins.add(`http://localhost:${port}`);
|
|
25
|
+
origins.add(`http://127.0.0.1:${port}`);
|
|
26
|
+
});
|
|
27
|
+
// Add port ranges
|
|
28
|
+
devPortRanges.forEach((range) => {
|
|
29
|
+
for (let port = range.start; port <= range.end; port++) {
|
|
30
|
+
origins.add(`http://localhost:${port}`);
|
|
31
|
+
origins.add(`http://127.0.0.1:${port}`);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
return Array.from(origins);
|
|
35
|
+
};
|
|
36
|
+
// CORS origin function
|
|
37
|
+
const originFunction = (origin, callback) => {
|
|
38
|
+
// Allow requests with no origin (same-origin, Postman, etc.)
|
|
39
|
+
if (!origin) {
|
|
40
|
+
return callback(null, true);
|
|
41
|
+
}
|
|
42
|
+
// Production mode
|
|
43
|
+
if (process.env.NODE_ENV === "production") {
|
|
44
|
+
// Check against explicit allowed origins
|
|
45
|
+
if (allowedOrigins.length > 0 && allowedOrigins.includes(origin)) {
|
|
46
|
+
return callback(null, true);
|
|
47
|
+
}
|
|
48
|
+
// Check custom validator
|
|
49
|
+
if (customValidator && customValidator(origin)) {
|
|
50
|
+
return callback(null, true);
|
|
51
|
+
}
|
|
52
|
+
// Check if origin matches the app's domain
|
|
53
|
+
const appDomain = process.env.APP_DOMAIN || process.env.PRODUCTION_URL;
|
|
54
|
+
if (appDomain && origin.includes(appDomain)) {
|
|
55
|
+
return callback(null, true);
|
|
56
|
+
}
|
|
57
|
+
// Reject by default in production
|
|
58
|
+
logger.warn(`CORS rejected origin in production: ${origin}`);
|
|
59
|
+
return callback(new Error("Not allowed by CORS"));
|
|
60
|
+
}
|
|
61
|
+
// Development mode - be more permissive
|
|
62
|
+
const devOrigins = buildDevOrigins();
|
|
63
|
+
// Check if origin matches any development origin
|
|
64
|
+
if (devOrigins.some((allowed) => origin.startsWith(allowed))) {
|
|
65
|
+
return callback(null, true);
|
|
66
|
+
}
|
|
67
|
+
// Check if it's any localhost/127.0.0.1 origin
|
|
68
|
+
if (origin.includes("localhost") || origin.includes("127.0.0.1")) {
|
|
69
|
+
logger.debug(`Allowing localhost origin: ${origin}`);
|
|
70
|
+
return callback(null, true);
|
|
71
|
+
}
|
|
72
|
+
// Check custom validator
|
|
73
|
+
if (customValidator && customValidator(origin)) {
|
|
74
|
+
return callback(null, true);
|
|
75
|
+
}
|
|
76
|
+
// Log and allow in development (with warning)
|
|
77
|
+
logger.warn(`CORS: Allowing unrecognized origin in development: ${origin}`);
|
|
78
|
+
return callback(null, true);
|
|
79
|
+
};
|
|
80
|
+
// Create and return configured CORS middleware
|
|
81
|
+
const corsMiddleware = cors({
|
|
82
|
+
origin: originFunction,
|
|
83
|
+
credentials,
|
|
84
|
+
methods: ["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"],
|
|
85
|
+
allowedHeaders: ["Content-Type", "Authorization", "X-Requested-With"],
|
|
86
|
+
exposedHeaders: ["X-Total-Count", "X-Page-Count"],
|
|
87
|
+
maxAge: 86400, // 24 hours
|
|
88
|
+
});
|
|
89
|
+
// Attach the origin function for testing purposes
|
|
90
|
+
corsMiddleware._originFunction = originFunction;
|
|
91
|
+
return corsMiddleware;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Simple CORS middleware for production with specific domains
|
|
95
|
+
*/
|
|
96
|
+
export function createProductionCors(allowedDomains) {
|
|
97
|
+
const originFunction = (origin, callback) => {
|
|
98
|
+
if (!origin || allowedDomains.includes(origin)) {
|
|
99
|
+
callback(null, true);
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
callback(new Error("Not allowed by CORS"));
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
const corsMiddleware = cors({
|
|
106
|
+
origin: originFunction,
|
|
107
|
+
credentials: true,
|
|
108
|
+
});
|
|
109
|
+
// Attach for testing
|
|
110
|
+
corsMiddleware._originFunction = originFunction;
|
|
111
|
+
return corsMiddleware;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Permissive CORS for development
|
|
115
|
+
*/
|
|
116
|
+
export function createDevCors() {
|
|
117
|
+
return createDynamicCors({
|
|
118
|
+
allowedOrigins: [],
|
|
119
|
+
credentials: true,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
export default createDynamicCors;
|
|
123
|
+
//# sourceMappingURL=cors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cors.js","sourceRoot":"","sources":["../../src/middleware/cors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error Handling Middleware
|
|
3
|
+
*/
|
|
4
|
+
import { Request, Response, NextFunction } from "express";
|
|
5
|
+
export declare class AppError extends Error {
|
|
6
|
+
readonly statusCode: number;
|
|
7
|
+
readonly isOperational: boolean;
|
|
8
|
+
constructor(message: string, statusCode?: number, isOperational?: boolean);
|
|
9
|
+
}
|
|
10
|
+
export declare function notFoundHandler(req: Request, res: Response): void;
|
|
11
|
+
export declare function errorHandler(err: any, req: Request, res: Response, _next: NextFunction): void;
|
|
12
|
+
export declare function asyncHandler(fn: (req: Request, res: Response, next: NextFunction) => any): (req: Request, res: Response, next: NextFunction) => void;
|
|
13
|
+
//# sourceMappingURL=errorHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorHandler.d.ts","sourceRoot":"","sources":["../../src/middleware/errorHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAM1D,qBAAa,QAAS,SAAQ,KAAK;IACjC,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,SAAgB,aAAa,EAAE,OAAO,CAAC;gBAGrC,OAAO,EAAE,MAAM,EACf,UAAU,GAAE,MAAY,EACxB,aAAa,GAAE,OAAc;CAQhC;AAGD,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,QAQ1D;AAGD,wBAAgB,YAAY,CAC1B,GAAG,EAAE,GAAG,EACR,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,EACb,KAAK,EAAE,YAAY,QAkDpB;AAGD,wBAAgB,YAAY,CAC1B,EAAE,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,KAAK,GAAG,IAEpD,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,UAGxD"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error Handling Middleware
|
|
3
|
+
*/
|
|
4
|
+
import { createLogger } from "../core/index.js";
|
|
5
|
+
const logger = createLogger("ErrorHandler");
|
|
6
|
+
// Custom error class
|
|
7
|
+
export class AppError extends Error {
|
|
8
|
+
statusCode;
|
|
9
|
+
isOperational;
|
|
10
|
+
constructor(message, statusCode = 500, isOperational = true) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.statusCode = statusCode;
|
|
13
|
+
this.isOperational = isOperational;
|
|
14
|
+
Error.captureStackTrace(this, this.constructor);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
// 404 Not Found handler
|
|
18
|
+
export function notFoundHandler(req, res) {
|
|
19
|
+
res.status(404).json({
|
|
20
|
+
success: false,
|
|
21
|
+
error: "Not Found",
|
|
22
|
+
message: `Cannot ${req.method} ${req.path}`,
|
|
23
|
+
path: req.path,
|
|
24
|
+
method: req.method,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
// Global error handler
|
|
28
|
+
export function errorHandler(err, req, res, _next) {
|
|
29
|
+
// Default to 500 server error
|
|
30
|
+
let statusCode = err.statusCode || 500;
|
|
31
|
+
let message = err.message || "Internal Server Error";
|
|
32
|
+
// Log the error
|
|
33
|
+
if (statusCode >= 500) {
|
|
34
|
+
logger.error("Server error", {
|
|
35
|
+
error: err,
|
|
36
|
+
request: {
|
|
37
|
+
method: req.method,
|
|
38
|
+
path: req.path,
|
|
39
|
+
query: req.query,
|
|
40
|
+
body: req.body,
|
|
41
|
+
headers: req.headers,
|
|
42
|
+
},
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
logger.warn("Client error", {
|
|
47
|
+
statusCode,
|
|
48
|
+
message,
|
|
49
|
+
path: req.path,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
// Handle specific error types
|
|
53
|
+
if (err.name === "ValidationError") {
|
|
54
|
+
statusCode = 400;
|
|
55
|
+
message = "Validation failed";
|
|
56
|
+
}
|
|
57
|
+
else if (err.name === "UnauthorizedError") {
|
|
58
|
+
statusCode = 401;
|
|
59
|
+
message = "Unauthorized";
|
|
60
|
+
}
|
|
61
|
+
else if (err.name === "JsonWebTokenError") {
|
|
62
|
+
statusCode = 401;
|
|
63
|
+
message = "Invalid token";
|
|
64
|
+
}
|
|
65
|
+
else if (err.name === "TokenExpiredError") {
|
|
66
|
+
statusCode = 401;
|
|
67
|
+
message = "Token expired";
|
|
68
|
+
}
|
|
69
|
+
// Send error response
|
|
70
|
+
res.status(statusCode).json({
|
|
71
|
+
success: false,
|
|
72
|
+
error: message,
|
|
73
|
+
...(process.env.NODE_ENV === "development" && {
|
|
74
|
+
stack: err.stack,
|
|
75
|
+
details: err,
|
|
76
|
+
}),
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
// Async handler wrapper to catch errors in async routes
|
|
80
|
+
export function asyncHandler(fn) {
|
|
81
|
+
return (req, res, next) => {
|
|
82
|
+
Promise.resolve(fn(req, res, next)).catch(next);
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=errorHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errorHandler.js","sourceRoot":"","sources":["../../src/middleware/errorHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File Upload Middleware
|
|
3
|
+
* Simple file upload handling for Express
|
|
4
|
+
*/
|
|
5
|
+
import { Request, Response, NextFunction } from "express";
|
|
6
|
+
export interface FileUploadConfig {
|
|
7
|
+
destination?: string;
|
|
8
|
+
maxSize?: number;
|
|
9
|
+
allowedTypes?: string[];
|
|
10
|
+
fieldName?: string;
|
|
11
|
+
multiple?: boolean;
|
|
12
|
+
maxCount?: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Create file upload middleware
|
|
16
|
+
*/
|
|
17
|
+
export declare function createFileUpload(config?: FileUploadConfig): (req: Request, res: Response, next: NextFunction) => Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Parse form data middleware (for mixed file/data uploads)
|
|
20
|
+
*/
|
|
21
|
+
export declare function parseFormData(fields?: string[]): import("express").RequestHandler<import("express-serve-static-core").ParamsDictionary, any, any, import("qs").ParsedQs, Record<string, any>>;
|
|
22
|
+
/**
|
|
23
|
+
* Download file helper
|
|
24
|
+
*/
|
|
25
|
+
export declare function sendFile(filePath: string, filename?: string): (_req: Request, res: Response) => void;
|
|
26
|
+
/**
|
|
27
|
+
* Express middleware to clean old temp files periodically
|
|
28
|
+
*/
|
|
29
|
+
export declare function createTempCleaner(tempDir?: string, maxAge?: number, // 24 hours
|
|
30
|
+
interval?: number): (_req: Request, _res: Response, next: NextFunction) => void;
|
|
31
|
+
declare global {
|
|
32
|
+
namespace Express {
|
|
33
|
+
interface Request {
|
|
34
|
+
uploadedFile?: {
|
|
35
|
+
originalName: string;
|
|
36
|
+
filename: string;
|
|
37
|
+
path: string;
|
|
38
|
+
size: number;
|
|
39
|
+
mimetype?: string;
|
|
40
|
+
extension: string;
|
|
41
|
+
hash?: string;
|
|
42
|
+
};
|
|
43
|
+
uploadedFiles?: Array<{
|
|
44
|
+
originalName: string;
|
|
45
|
+
filename: string;
|
|
46
|
+
path: string;
|
|
47
|
+
size: number;
|
|
48
|
+
mimetype?: string;
|
|
49
|
+
extension: string;
|
|
50
|
+
hash?: string;
|
|
51
|
+
}>;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
declare const _default: {
|
|
56
|
+
createFileUpload: typeof createFileUpload;
|
|
57
|
+
parseFormData: typeof parseFormData;
|
|
58
|
+
sendFile: typeof sendFile;
|
|
59
|
+
createTempCleaner: typeof createTempCleaner;
|
|
60
|
+
};
|
|
61
|
+
export default _default;
|
|
62
|
+
//# sourceMappingURL=fileUpload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileUpload.d.ts","sourceRoot":"","sources":["../../src/middleware/fileUpload.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAe1D,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,GAAE,gBAAqB,IAsC1D,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,MAAM,YAAY,KACjB,OAAO,CAAC,IAAI,CAAC,CAwFjB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,GAAE,MAAM,EAAO,gJAGlD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,IAClD,MAAM,OAAO,EAAE,KAAK,QAAQ,UAgBrC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,GAAE,MAAiB,EAC1B,MAAM,GAAE,MAA4B,EAAE,WAAW;AACjD,QAAQ,GAAE,MAAuB,IAiBzB,MAAM,OAAO,EAAE,MAAM,QAAQ,EAAE,MAAM,YAAY,UAC1D;AAGD,OAAO,CAAC,MAAM,CAAC;IAEb,UAAU,OAAO,CAAC;QAChB,UAAU,OAAO;YACf,YAAY,CAAC,EAAE;gBACb,YAAY,EAAE,MAAM,CAAC;gBACrB,QAAQ,EAAE,MAAM,CAAC;gBACjB,IAAI,EAAE,MAAM,CAAC;gBACb,IAAI,EAAE,MAAM,CAAC;gBACb,QAAQ,CAAC,EAAE,MAAM,CAAC;gBAClB,SAAS,EAAE,MAAM,CAAC;gBAClB,IAAI,CAAC,EAAE,MAAM,CAAC;aACf,CAAC;YACF,aAAa,CAAC,EAAE,KAAK,CAAC;gBACpB,YAAY,EAAE,MAAM,CAAC;gBACrB,QAAQ,EAAE,MAAM,CAAC;gBACjB,IAAI,EAAE,MAAM,CAAC;gBACb,IAAI,EAAE,MAAM,CAAC;gBACb,QAAQ,CAAC,EAAE,MAAM,CAAC;gBAClB,SAAS,EAAE,MAAM,CAAC;gBAClB,IAAI,CAAC,EAAE,MAAM,CAAC;aACf,CAAC,CAAC;SACJ;KACF;CACF;;;;;;;AAED,wBAKE"}
|