@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.
- package/dist/core/http/http-server.js +133 -0
- package/dist/core/http/http-server.js.map +1 -1
- package/dist/core/http/http2-server.js +133 -0
- package/dist/core/http/http2-server.js.map +1 -1
- package/dist/core/http/uws-http-server.js +133 -0
- package/dist/core/http/uws-http-server.js.map +1 -1
- package/dist/core/queue/adapters/memory-adapter.js +4 -0
- package/dist/core/queue/adapters/memory-adapter.js.map +1 -1
- package/dist/core/utilities/index.d.ts +2 -0
- package/dist/core/utilities/index.js +2 -0
- package/dist/core/utilities/index.js.map +1 -1
- package/dist/core/utilities/response-helpers.d.ts +280 -0
- package/dist/core/utilities/response-helpers.js +359 -0
- package/dist/core/utilities/response-helpers.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/moro.js +21 -11
- package/dist/moro.js.map +1 -1
- package/dist/types/http.d.ts +21 -0
- package/package.json +5 -5
|
@@ -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,
|
|
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":"AAAA,sCAAsC;AACtC,OAAO,EACL,IAAI,EACJ,IAAI,IAAI,QAAQ,EAChB,SAAS,EACT,aAAa,EACb,aAAa,EACb,eAAe,EACf,eAAe,GAChB,MAAM,WAAW,CAAC;AAwBnB,qCAAqC;AACrC,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAEjF,0CAA0C;AAC1C,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,0CAA0C,CAAC;AAU3E,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,wBAAwB,EACxB,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,yBAAyB,CAAC;AAUjC,eAAe;AACf,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAE1F,oBAAoB;AACpB,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAG/E,iCAAiC;AACjC,OAAO,EACL,SAAS,EACT,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,SAAS,EACT,WAAW,EACX,cAAc,EACd,WAAW,EACX,WAAW,EACX,UAAU,EACV,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,OAAO,EACL,IAAI,EACJ,IAAI,IAAI,QAAQ,EAChB,SAAS,EACT,aAAa,EACb,aAAa,EACb,eAAe,EACf,eAAe,GAChB,MAAM,WAAW,CAAC;AAwBnB,qCAAqC;AACrC,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAEjF,0CAA0C;AAC1C,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,0CAA0C,CAAC;AAU3E,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,wBAAwB,EACxB,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,yBAAyB,CAAC;AAUjC,eAAe;AACf,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAE1F,oBAAoB;AACpB,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAG/E,iCAAiC;AACjC,OAAO,EACL,SAAS,EACT,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,SAAS,EACT,WAAW,EACX,cAAc,EACd,WAAW,EACX,WAAW,EACX,UAAU,EACV,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB;AACjB,wDAAwD;AACxD,QAAQ,EACR,eAAe,GAChB,MAAM,2BAA2B,CAAC;AAUnC,eAAe;AACf,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAYtD,gBAAgB;AAChB,OAAO,EAAE,qBAAqB,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAEvE,8BAA8B;AAC9B,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,EAAE,MAAM,4BAA4B,CAAC;AAe9F,OAAO,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,IAAI,eAAe,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEhG,gBAAgB;AAChB,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,6BAA6B,GAC9B,MAAM,yBAAyB,CAAC;AAcjC,8BAA8B;AAC9B,OAAO,EACL,eAAe,EACf,SAAS,EACT,kBAAkB,GACnB,MAAM,qCAAqC,CAAC;AAE7C,6BAA6B;AAC7B,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,EAAE,yBAAyB,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAa7F,uBAAuB;AACvB,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,yBAAyB,EACzB,iCAAiC,GAClC,MAAM,sBAAsB,CAAC;AAG9B,0BAA0B;AAC1B,OAAO,EACL,SAAS,EACT,kBAAkB,EAClB,SAAS,EACT,WAAW,EACX,UAAU,EACV,aAAa,EACb,YAAY,EACZ,SAAS,EACT,cAAc,EACd,MAAM,EACN,cAAc,GACf,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,WAAW,GACZ,MAAM,wBAAwB,CAAC;AA6BhC,OAAO,EAAE,gBAAgB,EAAE,MAAM,+CAA+C,CAAC;AAEjF,wEAAwE;AACxE,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,sBAAsB,EACtB,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,+CAA+C,CAAC;AAEvD,aAAa;AACb,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,UAAU,EACV,aAAa,EACb,cAAc,EACd,aAAa,EACb,YAAY,EACZ,SAAS,EACT,SAAS,GACV,MAAM,sBAAsB,CAAC;AAmB9B,oBAAoB;AACpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAc/D,WAAW;AACX,cAAc,oDAAoD,CAAC;AACnE,cAAc,kDAAkD,CAAC;AACjE,cAAc,mCAAmC,CAAC;AAqClD,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAE9D,kBAAkB;AAClB,OAAO,EACL,QAAQ,EACR,qBAAqB,EACrB,eAAe,EACf,wBAAwB,EACxB,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,YAAY,EACZ,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAoB9B,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EACL,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,UAAU,EACV,aAAa,GACd,MAAM,+BAA+B,CAAC"}
|
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
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
|
|
1468
|
-
|
|
1469
|
-
|
|
1470
|
-
|
|
1471
|
-
|
|
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
|