@morojs/moro 1.5.2 → 1.5.4
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/auth/morojs-adapter.js +23 -12
- package/dist/core/auth/morojs-adapter.js.map +1 -1
- package/dist/core/http/http-server.js +12 -8
- package/dist/core/http/http-server.js.map +1 -1
- package/dist/core/logger/filters.js +12 -4
- package/dist/core/logger/filters.js.map +1 -1
- package/dist/core/logger/logger.d.ts +44 -0
- package/dist/core/logger/logger.js +550 -60
- package/dist/core/logger/logger.js.map +1 -1
- package/dist/core/middleware/built-in/request-logger.js +4 -2
- package/dist/core/middleware/built-in/request-logger.js.map +1 -1
- package/dist/core/modules/auto-discovery.d.ts +1 -0
- package/dist/core/modules/auto-discovery.js +9 -5
- package/dist/core/modules/auto-discovery.js.map +1 -1
- package/dist/core/modules/modules.d.ts +1 -0
- package/dist/core/modules/modules.js +8 -2
- package/dist/core/modules/modules.js.map +1 -1
- package/dist/core/networking/adapters/ws-adapter.d.ts +1 -0
- package/dist/core/networking/adapters/ws-adapter.js +3 -1
- package/dist/core/networking/adapters/ws-adapter.js.map +1 -1
- package/dist/core/networking/service-discovery.d.ts +1 -0
- package/dist/core/networking/service-discovery.js +23 -11
- package/dist/core/networking/service-discovery.js.map +1 -1
- package/dist/types/logger.d.ts +3 -0
- package/package.json +6 -2
- package/src/core/auth/morojs-adapter.ts +25 -12
- package/src/core/database/README.md +26 -16
- package/src/core/http/http-server.ts +15 -12
- package/src/core/logger/filters.ts +12 -4
- package/src/core/logger/logger.ts +616 -63
- package/src/core/middleware/built-in/request-logger.ts +6 -2
- package/src/core/modules/auto-discovery.ts +13 -5
- package/src/core/modules/modules.ts +9 -5
- package/src/core/networking/adapters/ws-adapter.ts +3 -1
- package/src/core/networking/service-discovery.ts +23 -9
- package/src/types/logger.ts +3 -0
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
// Simple request logging middleware
|
|
2
|
+
import { createFrameworkLogger } from '../../logger';
|
|
3
|
+
|
|
4
|
+
const logger = createFrameworkLogger('RequestLogger');
|
|
5
|
+
|
|
2
6
|
export const requestLogger = async (context: any): Promise<void> => {
|
|
3
7
|
const startTime = Date.now();
|
|
4
8
|
|
|
5
|
-
|
|
9
|
+
logger.info(`${context.request?.method} ${context.request?.path}`, 'RequestLogger');
|
|
6
10
|
|
|
7
11
|
// Log completion after response
|
|
8
12
|
context.onComplete = () => {
|
|
9
13
|
const duration = Date.now() - startTime;
|
|
10
|
-
|
|
14
|
+
logger.info(`Request completed in ${duration}ms`, 'RequestLogger');
|
|
11
15
|
};
|
|
12
16
|
};
|
|
@@ -3,10 +3,12 @@ import { readdirSync, statSync } from 'fs';
|
|
|
3
3
|
import { join, extname } from 'path';
|
|
4
4
|
import { ModuleConfig } from '../../types/module';
|
|
5
5
|
import { DiscoveryOptions } from '../../types/discovery';
|
|
6
|
+
import { createFrameworkLogger } from '../logger';
|
|
6
7
|
|
|
7
8
|
export class ModuleDiscovery {
|
|
8
9
|
private baseDir: string;
|
|
9
10
|
private options: DiscoveryOptions;
|
|
11
|
+
private discoveryLogger = createFrameworkLogger('MODULE_DISCOVERY');
|
|
10
12
|
|
|
11
13
|
constructor(baseDir: string = process.cwd(), options: DiscoveryOptions = {}) {
|
|
12
14
|
this.baseDir = baseDir;
|
|
@@ -28,12 +30,14 @@ export class ModuleDiscovery {
|
|
|
28
30
|
const module = await this.loadModule(modulePath);
|
|
29
31
|
if (module) {
|
|
30
32
|
modules.push(module);
|
|
31
|
-
|
|
33
|
+
this.discoveryLogger.info(
|
|
32
34
|
`Auto-discovered module: ${module.name}@${module.version} from ${modulePath}`
|
|
33
35
|
);
|
|
34
36
|
}
|
|
35
37
|
} catch (error) {
|
|
36
|
-
|
|
38
|
+
this.discoveryLogger.warn(`Failed to load module from ${modulePath}`, 'MODULE_DISCOVERY', {
|
|
39
|
+
error: error instanceof Error ? error.message : String(error),
|
|
40
|
+
});
|
|
37
41
|
}
|
|
38
42
|
}
|
|
39
43
|
|
|
@@ -63,7 +67,9 @@ export class ModuleDiscovery {
|
|
|
63
67
|
const module = await this.loadModule(indexPath);
|
|
64
68
|
if (module) {
|
|
65
69
|
modules.push(module);
|
|
66
|
-
|
|
70
|
+
this.discoveryLogger.info(
|
|
71
|
+
`Auto-discovered module directory: ${module.name} from ${item}/`
|
|
72
|
+
);
|
|
67
73
|
}
|
|
68
74
|
}
|
|
69
75
|
} catch {
|
|
@@ -77,7 +83,9 @@ export class ModuleDiscovery {
|
|
|
77
83
|
const module = await this.loadModule(altPath);
|
|
78
84
|
if (module) {
|
|
79
85
|
modules.push(module);
|
|
80
|
-
|
|
86
|
+
this.discoveryLogger.info(
|
|
87
|
+
`Auto-discovered module: ${module.name} from ${item}/${alt}`
|
|
88
|
+
);
|
|
81
89
|
break;
|
|
82
90
|
}
|
|
83
91
|
}
|
|
@@ -177,7 +185,7 @@ export class ModuleDiscovery {
|
|
|
177
185
|
modulePaths.forEach(path => {
|
|
178
186
|
try {
|
|
179
187
|
fs.watchFile(path, async () => {
|
|
180
|
-
|
|
188
|
+
this.discoveryLogger.info(`Module file changed: ${path}`);
|
|
181
189
|
const modules = await this.discoverModules();
|
|
182
190
|
callback(modules);
|
|
183
191
|
});
|
|
@@ -4,6 +4,7 @@ import path from 'path';
|
|
|
4
4
|
import { Container } from '../utilities';
|
|
5
5
|
import { ModuleConfig } from '../../types/module';
|
|
6
6
|
import { ModuleDefinition, ModuleRoute, ModuleSocket } from '../../types/module';
|
|
7
|
+
import { createFrameworkLogger } from '../logger';
|
|
7
8
|
|
|
8
9
|
// Module Definition Function
|
|
9
10
|
export function defineModule(definition: ModuleDefinition): ModuleConfig {
|
|
@@ -66,6 +67,8 @@ export function defineModule(definition: ModuleDefinition): ModuleConfig {
|
|
|
66
67
|
|
|
67
68
|
// Module Loader Class
|
|
68
69
|
export class ModuleLoader {
|
|
70
|
+
private moduleLogger = createFrameworkLogger('MODULE_LOADER');
|
|
71
|
+
|
|
69
72
|
constructor(private container: Container) {}
|
|
70
73
|
|
|
71
74
|
async discoverModules(directory: string): Promise<ModuleConfig[]> {
|
|
@@ -91,15 +94,16 @@ export class ModuleLoader {
|
|
|
91
94
|
}
|
|
92
95
|
}
|
|
93
96
|
} catch (error) {
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
);
|
|
97
|
+
this.moduleLogger.warn(`Could not load module from ${modulePath}`, 'MODULE_LOADER', {
|
|
98
|
+
error: error instanceof Error ? error.message : String(error),
|
|
99
|
+
});
|
|
98
100
|
}
|
|
99
101
|
}
|
|
100
102
|
}
|
|
101
103
|
} catch (error) {
|
|
102
|
-
|
|
104
|
+
this.moduleLogger.error('Failed to discover modules', 'MODULE_LOADER', {
|
|
105
|
+
error: error instanceof Error ? error.message : String(error),
|
|
106
|
+
});
|
|
103
107
|
}
|
|
104
108
|
|
|
105
109
|
return modules;
|
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
WebSocketEmitter,
|
|
10
10
|
WebSocketMiddleware,
|
|
11
11
|
} from '../websocket-adapter';
|
|
12
|
+
import { createFrameworkLogger } from '../../logger';
|
|
12
13
|
|
|
13
14
|
/**
|
|
14
15
|
* Native WebSocket adapter using the 'ws' library
|
|
@@ -18,6 +19,7 @@ export class WSAdapter implements WebSocketAdapter {
|
|
|
18
19
|
private wss: any; // WebSocket server instance
|
|
19
20
|
private namespaces = new Map<string, WSNamespaceWrapper>();
|
|
20
21
|
private connections = new Map<string, WSConnectionWrapper>();
|
|
22
|
+
private wsLogger = createFrameworkLogger('WEBSOCKET_ADAPTER');
|
|
21
23
|
private customIdGenerator?: () => string;
|
|
22
24
|
private connectionCounter = 0;
|
|
23
25
|
|
|
@@ -98,7 +100,7 @@ export class WSAdapter implements WebSocketAdapter {
|
|
|
98
100
|
// ws library handles compression at the browser level
|
|
99
101
|
// This is a no-op but kept for interface compatibility
|
|
100
102
|
if (enabled) {
|
|
101
|
-
|
|
103
|
+
this.wsLogger.warn('Compression is handled automatically by the ws library and browsers');
|
|
102
104
|
}
|
|
103
105
|
}
|
|
104
106
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// Service Discovery Client for Microservices
|
|
2
2
|
// Supports Consul, Kubernetes, and in-memory registry
|
|
3
|
+
import { createFrameworkLogger } from '../logger';
|
|
3
4
|
|
|
4
5
|
export interface ServiceInfo {
|
|
5
6
|
name: string;
|
|
@@ -23,6 +24,7 @@ export class ServiceRegistry {
|
|
|
23
24
|
private services = new Map<string, ServiceInfo[]>();
|
|
24
25
|
private options: ServiceDiscoveryOptions;
|
|
25
26
|
private healthCheckInterval?: NodeJS.Timeout;
|
|
27
|
+
private serviceLogger = createFrameworkLogger('SERVICE_DISCOVERY');
|
|
26
28
|
|
|
27
29
|
constructor(options: ServiceDiscoveryOptions) {
|
|
28
30
|
this.options = options;
|
|
@@ -44,7 +46,7 @@ export class ServiceRegistry {
|
|
|
44
46
|
break;
|
|
45
47
|
}
|
|
46
48
|
|
|
47
|
-
|
|
49
|
+
this.serviceLogger.info(`Service registered: ${name}@${service.host}:${service.port}`);
|
|
48
50
|
}
|
|
49
51
|
|
|
50
52
|
async discover(serviceName: string): Promise<ServiceInfo[]> {
|
|
@@ -73,7 +75,7 @@ export class ServiceRegistry {
|
|
|
73
75
|
break;
|
|
74
76
|
}
|
|
75
77
|
|
|
76
|
-
|
|
78
|
+
this.serviceLogger.info(`Service deregistered: ${serviceName}`);
|
|
77
79
|
}
|
|
78
80
|
|
|
79
81
|
// In-memory registry methods
|
|
@@ -121,7 +123,9 @@ export class ServiceRegistry {
|
|
|
121
123
|
throw new Error(`Consul registration failed: ${response.statusText}`);
|
|
122
124
|
}
|
|
123
125
|
} catch (error) {
|
|
124
|
-
|
|
126
|
+
this.serviceLogger.error('Failed to register with Consul', 'SERVICE_DISCOVERY', {
|
|
127
|
+
error: error instanceof Error ? error.message : String(error),
|
|
128
|
+
});
|
|
125
129
|
// Fallback to in-memory
|
|
126
130
|
this.registerInMemory(service);
|
|
127
131
|
}
|
|
@@ -150,7 +154,9 @@ export class ServiceRegistry {
|
|
|
150
154
|
metadata: entry.Service.Meta,
|
|
151
155
|
}));
|
|
152
156
|
} catch (error) {
|
|
153
|
-
|
|
157
|
+
this.serviceLogger.error('Failed to discover from Consul', 'SERVICE_DISCOVERY', {
|
|
158
|
+
error: error instanceof Error ? error.message : String(error),
|
|
159
|
+
});
|
|
154
160
|
return this.discoverFromMemory(serviceName);
|
|
155
161
|
}
|
|
156
162
|
}
|
|
@@ -163,7 +169,9 @@ export class ServiceRegistry {
|
|
|
163
169
|
method: 'PUT',
|
|
164
170
|
});
|
|
165
171
|
} catch (error) {
|
|
166
|
-
|
|
172
|
+
this.serviceLogger.error('Failed to deregister from Consul', 'SERVICE_DISCOVERY', {
|
|
173
|
+
error: error instanceof Error ? error.message : String(error),
|
|
174
|
+
});
|
|
167
175
|
}
|
|
168
176
|
}
|
|
169
177
|
|
|
@@ -171,7 +179,7 @@ export class ServiceRegistry {
|
|
|
171
179
|
private async registerWithKubernetes(service: ServiceInfo): Promise<void> {
|
|
172
180
|
// In Kubernetes, services are registered via Service/Endpoints resources
|
|
173
181
|
// This would typically be handled by the K8s API, not application code
|
|
174
|
-
|
|
182
|
+
this.serviceLogger.info(`K8s service registration: ${service.name} (handled by Kubernetes)`);
|
|
175
183
|
|
|
176
184
|
// Fallback to in-memory for local development
|
|
177
185
|
this.registerInMemory(service);
|
|
@@ -196,7 +204,9 @@ export class ServiceRegistry {
|
|
|
196
204
|
},
|
|
197
205
|
];
|
|
198
206
|
} catch (error) {
|
|
199
|
-
|
|
207
|
+
this.serviceLogger.error('Failed to discover from Kubernetes', 'SERVICE_DISCOVERY', {
|
|
208
|
+
error: error instanceof Error ? error.message : String(error),
|
|
209
|
+
});
|
|
200
210
|
return this.discoverFromMemory(serviceName);
|
|
201
211
|
}
|
|
202
212
|
}
|
|
@@ -224,12 +234,16 @@ export class ServiceRegistry {
|
|
|
224
234
|
);
|
|
225
235
|
|
|
226
236
|
if (!response.ok) {
|
|
227
|
-
|
|
237
|
+
this.serviceLogger.warn(
|
|
238
|
+
`Health check failed for ${serviceName}: ${response.statusText}`
|
|
239
|
+
);
|
|
228
240
|
// Remove unhealthy service
|
|
229
241
|
this.removeUnhealthyService(serviceName, service);
|
|
230
242
|
}
|
|
231
243
|
} catch (error) {
|
|
232
|
-
|
|
244
|
+
this.serviceLogger.warn(`Health check failed for ${serviceName}`, 'SERVICE_DISCOVERY', {
|
|
245
|
+
error: error instanceof Error ? error.message : String(error),
|
|
246
|
+
});
|
|
233
247
|
this.removeUnhealthyService(serviceName, service);
|
|
234
248
|
}
|
|
235
249
|
}
|
package/src/types/logger.ts
CHANGED
|
@@ -30,6 +30,7 @@ export interface LoggerOptions {
|
|
|
30
30
|
outputs?: LogOutput[];
|
|
31
31
|
filters?: LogFilter[];
|
|
32
32
|
maxEntries?: number;
|
|
33
|
+
maxBufferSize?: number;
|
|
33
34
|
}
|
|
34
35
|
|
|
35
36
|
export interface LogOutput {
|
|
@@ -78,6 +79,7 @@ export interface LogMetrics {
|
|
|
78
79
|
averageLogRate: number;
|
|
79
80
|
errorRate: number;
|
|
80
81
|
memoryUsage: number;
|
|
82
|
+
outputErrors?: Record<string, number>;
|
|
81
83
|
}
|
|
82
84
|
|
|
83
85
|
export interface ColorScheme {
|
|
@@ -90,4 +92,5 @@ export interface ColorScheme {
|
|
|
90
92
|
context: string;
|
|
91
93
|
metadata: string;
|
|
92
94
|
performance: string;
|
|
95
|
+
reset: string;
|
|
93
96
|
}
|