@morojs/moro 1.7.0 → 1.7.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.
@@ -0,0 +1,359 @@
1
+ /**
2
+ * Standardized API Response Helpers
3
+ *
4
+ * These helpers ensure consistent response formats across your API.
5
+ * They are zero-overhead (just return plain objects) and optimized
6
+ * for the framework's fast-path JSON serialization.
7
+ *
8
+ * @module ResponseHelpers
9
+ */
10
+ /**
11
+ * Create a standardized success response
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * app.get('/users', async (req, res) => {
16
+ * const users = await getUsers();
17
+ * return success(users);
18
+ * });
19
+ *
20
+ * // With message
21
+ * app.post('/users', async (req, res) => {
22
+ * const user = await createUser(req.body);
23
+ * return success(user, 'User created successfully');
24
+ * });
25
+ * ```
26
+ */
27
+ export function success(data, message) {
28
+ const response = {
29
+ success: true,
30
+ data,
31
+ };
32
+ if (message !== undefined) {
33
+ response.message = message;
34
+ }
35
+ return response;
36
+ }
37
+ /**
38
+ * Create a standardized error response
39
+ *
40
+ * @example
41
+ * ```typescript
42
+ * app.get('/users/:id', async (req, res) => {
43
+ * const user = await getUser(req.params.id);
44
+ * if (!user) {
45
+ * return res.status(404).json(
46
+ * error('User not found', 'USER_NOT_FOUND')
47
+ * );
48
+ * }
49
+ * return success(user);
50
+ * });
51
+ * ```
52
+ */
53
+ export function error(errorMessage, code, message) {
54
+ const response = {
55
+ success: false,
56
+ error: errorMessage,
57
+ };
58
+ if (code !== undefined) {
59
+ response.code = code;
60
+ }
61
+ if (message !== undefined) {
62
+ response.message = message;
63
+ }
64
+ return response;
65
+ }
66
+ /**
67
+ * Create a validation error response
68
+ *
69
+ * @example
70
+ * ```typescript
71
+ * app.post('/users', async (req, res) => {
72
+ * const validationErrors = validateUser(req.body);
73
+ * if (validationErrors.length > 0) {
74
+ * return res.status(400).json(
75
+ * validationError(validationErrors)
76
+ * );
77
+ * }
78
+ * // ... create user
79
+ * });
80
+ * ```
81
+ */
82
+ export function validationError(details, message) {
83
+ return {
84
+ success: false,
85
+ error: 'Validation failed',
86
+ code: 'VALIDATION_ERROR',
87
+ message: message || 'One or more fields failed validation',
88
+ details,
89
+ };
90
+ }
91
+ /**
92
+ * Create an unauthorized error response
93
+ *
94
+ * @example
95
+ * ```typescript
96
+ * app.get('/admin', async (req, res) => {
97
+ * if (!req.user) {
98
+ * return res.status(401).json(unauthorized());
99
+ * }
100
+ * return success(adminData);
101
+ * });
102
+ * ```
103
+ */
104
+ export function unauthorized(message = 'Authentication required') {
105
+ return {
106
+ success: false,
107
+ error: 'Unauthorized',
108
+ code: 'UNAUTHORIZED',
109
+ message,
110
+ };
111
+ }
112
+ /**
113
+ * Create a forbidden error response
114
+ *
115
+ * @example
116
+ * ```typescript
117
+ * app.delete('/users/:id', async (req, res) => {
118
+ * if (!req.user.roles.includes('admin')) {
119
+ * return res.status(403).json(forbidden());
120
+ * }
121
+ * await deleteUser(req.params.id);
122
+ * return success({ deleted: true });
123
+ * });
124
+ * ```
125
+ */
126
+ export function forbidden(message = 'Insufficient permissions') {
127
+ return {
128
+ success: false,
129
+ error: 'Forbidden',
130
+ code: 'FORBIDDEN',
131
+ message,
132
+ };
133
+ }
134
+ /**
135
+ * Create a not found error response
136
+ *
137
+ * @example
138
+ * ```typescript
139
+ * app.get('/users/:id', async (req, res) => {
140
+ * const user = await getUser(req.params.id);
141
+ * if (!user) {
142
+ * return res.status(404).json(notFound('User'));
143
+ * }
144
+ * return success(user);
145
+ * });
146
+ * ```
147
+ */
148
+ export function notFound(resource = 'Resource') {
149
+ return {
150
+ success: false,
151
+ error: 'Not Found',
152
+ code: 'NOT_FOUND',
153
+ message: `${resource} not found`,
154
+ };
155
+ }
156
+ /**
157
+ * Create a conflict error response (e.g., duplicate entry)
158
+ *
159
+ * @example
160
+ * ```typescript
161
+ * app.post('/users', async (req, res) => {
162
+ * const existing = await getUserByEmail(req.body.email);
163
+ * if (existing) {
164
+ * return res.status(409).json(
165
+ * conflict('Email already in use')
166
+ * );
167
+ * }
168
+ * const user = await createUser(req.body);
169
+ * return success(user);
170
+ * });
171
+ * ```
172
+ */
173
+ export function conflict(message) {
174
+ return {
175
+ success: false,
176
+ error: 'Conflict',
177
+ code: 'CONFLICT',
178
+ message,
179
+ };
180
+ }
181
+ /**
182
+ * Create a bad request error response
183
+ *
184
+ * @example
185
+ * ```typescript
186
+ * app.post('/upload', async (req, res) => {
187
+ * if (!req.files?.file) {
188
+ * return res.status(400).json(
189
+ * badRequest('File is required')
190
+ * );
191
+ * }
192
+ * // ... process file
193
+ * });
194
+ * ```
195
+ */
196
+ export function badRequest(message = 'Invalid request') {
197
+ return {
198
+ success: false,
199
+ error: 'Bad Request',
200
+ code: 'BAD_REQUEST',
201
+ message,
202
+ };
203
+ }
204
+ /**
205
+ * Create an internal server error response
206
+ *
207
+ * @example
208
+ * ```typescript
209
+ * app.get('/data', async (req, res) => {
210
+ * try {
211
+ * const data = await fetchData();
212
+ * return success(data);
213
+ * } catch (err) {
214
+ * return res.status(500).json(
215
+ * internalError('Failed to fetch data')
216
+ * );
217
+ * }
218
+ * });
219
+ * ```
220
+ */
221
+ export function internalError(message = 'Internal server error') {
222
+ return {
223
+ success: false,
224
+ error: 'Internal Server Error',
225
+ code: 'INTERNAL_ERROR',
226
+ message,
227
+ };
228
+ }
229
+ /**
230
+ * Create a rate limit exceeded error response
231
+ *
232
+ * @example
233
+ * ```typescript
234
+ * app.post('/api/send', async (req, res) => {
235
+ * const limited = await checkRateLimit(req.ip);
236
+ * if (limited) {
237
+ * return res.status(429).json(
238
+ * rateLimited(60) // 60 seconds retry
239
+ * );
240
+ * }
241
+ * // ... process request
242
+ * });
243
+ * ```
244
+ */
245
+ export function rateLimited(retryAfter) {
246
+ const response = {
247
+ success: false,
248
+ error: 'Too Many Requests',
249
+ code: 'RATE_LIMITED',
250
+ message: 'Rate limit exceeded',
251
+ };
252
+ if (retryAfter !== undefined) {
253
+ response.details = { retryAfter };
254
+ }
255
+ return response;
256
+ }
257
+ /**
258
+ * Standardized response helper object for convenient imports
259
+ *
260
+ * @example
261
+ * ```typescript
262
+ * import { response } from '@morojs/moro';
263
+ *
264
+ * app.get('/users', async (req, res) => {
265
+ * const users = await getUsers();
266
+ * return response.success(users);
267
+ * });
268
+ *
269
+ * app.get('/users/:id', async (req, res) => {
270
+ * const user = await getUser(req.params.id);
271
+ * if (!user) {
272
+ * return res.status(404).json(response.notFound('User'));
273
+ * }
274
+ * return response.success(user);
275
+ * });
276
+ * ```
277
+ */
278
+ export const response = {
279
+ success,
280
+ error,
281
+ validationError,
282
+ unauthorized,
283
+ forbidden,
284
+ notFound,
285
+ conflict,
286
+ badRequest,
287
+ internalError,
288
+ rateLimited,
289
+ };
290
+ /**
291
+ * Type-safe response builder for complex scenarios
292
+ *
293
+ * @example
294
+ * ```typescript
295
+ * import { ResponseBuilder } from '@morojs/moro';
296
+ *
297
+ * app.get('/users', async (req, res) => {
298
+ * const users = await getUsers();
299
+ * return ResponseBuilder.success(users)
300
+ * .message('Successfully retrieved users')
301
+ * .build();
302
+ * });
303
+ * ```
304
+ */
305
+ export class ResponseBuilder {
306
+ response = {};
307
+ constructor() { }
308
+ /**
309
+ * Start building a success response
310
+ */
311
+ static success(data) {
312
+ const builder = new ResponseBuilder();
313
+ builder.response = {
314
+ success: true,
315
+ data,
316
+ };
317
+ return builder;
318
+ }
319
+ /**
320
+ * Start building an error response
321
+ */
322
+ static error(errorMessage, code) {
323
+ const builder = new ResponseBuilder();
324
+ builder.response = {
325
+ success: false,
326
+ error: errorMessage,
327
+ code,
328
+ };
329
+ return builder;
330
+ }
331
+ /**
332
+ * Add a message to the response
333
+ */
334
+ message(msg) {
335
+ this.response.message = msg;
336
+ return this;
337
+ }
338
+ /**
339
+ * Add details to the response
340
+ */
341
+ details(details) {
342
+ this.response.details = details;
343
+ return this;
344
+ }
345
+ /**
346
+ * Add a code to error response
347
+ */
348
+ code(code) {
349
+ this.response.code = code;
350
+ return this;
351
+ }
352
+ /**
353
+ * Build and return the final response
354
+ */
355
+ build() {
356
+ return this.response;
357
+ }
358
+ }
359
+ //# sourceMappingURL=response-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-helpers.js","sourceRoot":"","sources":["../../../src/core/utilities/response-helpers.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -11,7 +11,8 @@ export { MoroHttpServer, UWebSocketsHttpServer } from './core/http/index.js';
11
11
  export { builtInMiddleware, simpleMiddleware } from './core/middleware/built-in/index.js';
12
12
  export { WebSocketManager, ServiceRegistry } from './core/networking/index.js';
13
13
  export type { ServiceInfo, ServiceDiscoveryOptions } from './core/networking/service-discovery.js';
14
- export { Container, FunctionalContainer, ServiceScope, ServiceLifecycle, withLogging, withCaching, withRetry, withTimeout, CircuitBreaker, HookManager, HOOK_EVENTS, middleware, isPackageAvailable, resolveUserPackage, createUserRequire, } from './core/utilities/index.js';
14
+ export { Container, FunctionalContainer, ServiceScope, ServiceLifecycle, withLogging, withCaching, withRetry, withTimeout, CircuitBreaker, HookManager, HOOK_EVENTS, middleware, isPackageAvailable, resolveUserPackage, createUserRequire, response, ResponseBuilder, } from './core/utilities/index.js';
15
+ export type { ApiSuccessResponse, ApiErrorResponse, ApiResponse, ResponseValidationErrorDetail, } from './core/utilities/index.js';
15
16
  export { MoroEventBus } from './core/events/index.js';
16
17
  export type { EventContext, EventPayload, EventBusOptions, ModuleEventBus, GlobalEventBus, EventMetrics, SystemEvents, EventHandler, } from './types/events.js';
17
18
  export { createFrameworkLogger, logger } from './core/logger/index.js';
package/dist/index.js CHANGED
@@ -11,7 +11,9 @@ export { builtInMiddleware, simpleMiddleware } from './core/middleware/built-in/
11
11
  // Networking System
12
12
  export { WebSocketManager, ServiceRegistry } from './core/networking/index.js';
13
13
  // Utilities and Container System
14
- export { Container, FunctionalContainer, ServiceScope, ServiceLifecycle, withLogging, withCaching, withRetry, withTimeout, CircuitBreaker, HookManager, HOOK_EVENTS, middleware, isPackageAvailable, resolveUserPackage, createUserRequire, } from './core/utilities/index.js';
14
+ export { Container, FunctionalContainer, ServiceScope, ServiceLifecycle, withLogging, withCaching, withRetry, withTimeout, CircuitBreaker, HookManager, HOOK_EVENTS, middleware, isPackageAvailable, resolveUserPackage, createUserRequire,
15
+ // Standardized Response Helpers (namespace object only)
16
+ response, ResponseBuilder, } from './core/utilities/index.js';
15
17
  // Event System
16
18
  export { MoroEventBus } from './core/events/index.js';
17
19
  // Logger System
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/moro.js CHANGED
@@ -1460,17 +1460,27 @@ export class Moro extends EventEmitter {
1460
1460
  // Close the core framework with timeout
1461
1461
  if (this.coreFramework && this.coreFramework.httpServer) {
1462
1462
  try {
1463
- await Promise.race([
1464
- new Promise(resolve => {
1465
- this.coreFramework.httpServer.close(() => {
1466
- resolve();
1467
- });
1468
- }),
1469
- new Promise(resolve => {
1470
- const timer = setTimeout(resolve, 2000); // 2 second timeout
1471
- timer.unref(); // Don't keep process alive
1472
- }),
1473
- ]);
1463
+ const httpServer = this.coreFramework.httpServer;
1464
+ const server = httpServer.getServer?.() || httpServer.getApp?.();
1465
+ // Only wait for close if the server is actually listening
1466
+ const isListening = server?.listening || server?.address?.() !== null;
1467
+ if (isListening) {
1468
+ await Promise.race([
1469
+ new Promise(resolve => {
1470
+ httpServer.close(() => {
1471
+ resolve();
1472
+ });
1473
+ }),
1474
+ new Promise(resolve => {
1475
+ const timer = setTimeout(resolve, 2000); // 2 second timeout
1476
+ timer.unref(); // Don't keep process alive
1477
+ }),
1478
+ ]);
1479
+ }
1480
+ else {
1481
+ // Server was never started, just skip close
1482
+ this.logger.debug('HTTP server was never started, skipping close');
1483
+ }
1474
1484
  }
1475
1485
  catch {
1476
1486
  // Force close if graceful close fails