digitaltwin-core 0.1.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 +125 -0
- package/dist/components/assets_manager.d.ts +384 -0
- package/dist/components/assets_manager.d.ts.map +1 -0
- package/dist/components/assets_manager.js +637 -0
- package/dist/components/assets_manager.js.map +1 -0
- package/dist/components/collector.d.ts +62 -0
- package/dist/components/collector.d.ts.map +1 -0
- package/dist/components/collector.js +80 -0
- package/dist/components/collector.js.map +1 -0
- package/dist/components/global_assets_handler.d.ts +63 -0
- package/dist/components/global_assets_handler.d.ts.map +1 -0
- package/dist/components/global_assets_handler.js +127 -0
- package/dist/components/global_assets_handler.js.map +1 -0
- package/dist/components/handler.d.ts +33 -0
- package/dist/components/handler.d.ts.map +1 -0
- package/dist/components/handler.js +27 -0
- package/dist/components/handler.js.map +1 -0
- package/dist/components/harvester.d.ts +54 -0
- package/dist/components/harvester.d.ts.map +1 -0
- package/dist/components/harvester.js +253 -0
- package/dist/components/harvester.js.map +1 -0
- package/dist/components/index.d.ts +8 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +6 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/interfaces.d.ts +18 -0
- package/dist/components/interfaces.d.ts.map +1 -0
- package/dist/components/interfaces.js +2 -0
- package/dist/components/interfaces.js.map +1 -0
- package/dist/components/types.d.ts +47 -0
- package/dist/components/types.d.ts.map +1 -0
- package/dist/components/types.js +2 -0
- package/dist/components/types.js.map +1 -0
- package/dist/database/adapters/knex_database_adapter.d.ts +47 -0
- package/dist/database/adapters/knex_database_adapter.d.ts.map +1 -0
- package/dist/database/adapters/knex_database_adapter.js +180 -0
- package/dist/database/adapters/knex_database_adapter.js.map +1 -0
- package/dist/database/database_adapter.d.ts +92 -0
- package/dist/database/database_adapter.d.ts.map +1 -0
- package/dist/database/database_adapter.js +6 -0
- package/dist/database/database_adapter.js.map +1 -0
- package/dist/engine/digital_twin_engine.d.ts +237 -0
- package/dist/engine/digital_twin_engine.d.ts.map +1 -0
- package/dist/engine/digital_twin_engine.js +574 -0
- package/dist/engine/digital_twin_engine.js.map +1 -0
- package/dist/engine/endpoints.d.ts +7 -0
- package/dist/engine/endpoints.d.ts.map +1 -0
- package/dist/engine/endpoints.js +18 -0
- package/dist/engine/endpoints.js.map +1 -0
- package/dist/engine/events.d.ts +13 -0
- package/dist/engine/events.d.ts.map +1 -0
- package/dist/engine/events.js +11 -0
- package/dist/engine/events.js.map +1 -0
- package/dist/engine/initializer.d.ts +8 -0
- package/dist/engine/initializer.d.ts.map +1 -0
- package/dist/engine/initializer.js +23 -0
- package/dist/engine/initializer.js.map +1 -0
- package/dist/engine/queue_manager.d.ts +78 -0
- package/dist/engine/queue_manager.d.ts.map +1 -0
- package/dist/engine/queue_manager.js +167 -0
- package/dist/engine/queue_manager.js.map +1 -0
- package/dist/engine/scheduler.d.ts +30 -0
- package/dist/engine/scheduler.d.ts.map +1 -0
- package/dist/engine/scheduler.js +378 -0
- package/dist/engine/scheduler.js.map +1 -0
- package/dist/env/env.d.ts +25 -0
- package/dist/env/env.d.ts.map +1 -0
- package/dist/env/env.js +55 -0
- package/dist/env/env.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/storage/adapters/local_storage_service.d.ts +29 -0
- package/dist/storage/adapters/local_storage_service.d.ts.map +1 -0
- package/dist/storage/adapters/local_storage_service.js +50 -0
- package/dist/storage/adapters/local_storage_service.js.map +1 -0
- package/dist/storage/adapters/ovh_storage_service.d.ts +32 -0
- package/dist/storage/adapters/ovh_storage_service.d.ts.map +1 -0
- package/dist/storage/adapters/ovh_storage_service.js +70 -0
- package/dist/storage/adapters/ovh_storage_service.js.map +1 -0
- package/dist/storage/storage_factory.d.ts +14 -0
- package/dist/storage/storage_factory.d.ts.map +1 -0
- package/dist/storage/storage_factory.js +36 -0
- package/dist/storage/storage_factory.js.map +1 -0
- package/dist/storage/storage_service.d.ts +26 -0
- package/dist/storage/storage_service.d.ts.map +1 -0
- package/dist/storage/storage_service.js +7 -0
- package/dist/storage/storage_service.js.map +1 -0
- package/dist/types/data_record.d.ts +17 -0
- package/dist/types/data_record.d.ts.map +1 -0
- package/dist/types/data_record.js +2 -0
- package/dist/types/data_record.js.map +1 -0
- package/dist/utils/logger.d.ts +17 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +35 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/map_to_data_record.d.ts +10 -0
- package/dist/utils/map_to_data_record.d.ts.map +1 -0
- package/dist/utils/map_to_data_record.js +21 -0
- package/dist/utils/map_to_data_record.js.map +1 -0
- package/dist/utils/servable_endpoint.d.ts +6 -0
- package/dist/utils/servable_endpoint.d.ts.map +1 -0
- package/dist/utils/servable_endpoint.js +15 -0
- package/dist/utils/servable_endpoint.js.map +1 -0
- package/package.json +95 -0
|
@@ -0,0 +1,574 @@
|
|
|
1
|
+
import express from 'ultimate-express';
|
|
2
|
+
import { initializeComponents, initializeAssetsManagers } from './initializer.js';
|
|
3
|
+
import { exposeEndpoints } from './endpoints.js';
|
|
4
|
+
import { scheduleComponents } from './scheduler.js';
|
|
5
|
+
import { LogLevel } from "../utils/logger.js";
|
|
6
|
+
import { QueueManager } from './queue_manager.js';
|
|
7
|
+
/**
|
|
8
|
+
* Digital Twin Engine - Core orchestrator for collectors, harvesters, and handlers
|
|
9
|
+
*
|
|
10
|
+
* The engine manages the lifecycle of all components, sets up queues for processing,
|
|
11
|
+
* exposes HTTP endpoints, and handles the overall coordination of the digital twin system.
|
|
12
|
+
*
|
|
13
|
+
* @class DigitalTwinEngine
|
|
14
|
+
* @example
|
|
15
|
+
* ```TypeScript
|
|
16
|
+
* import { DigitalTwinEngine } from './digital_twin_engine.js'
|
|
17
|
+
* import { StorageServiceFactory } from '../storage/storage_factory.js'
|
|
18
|
+
* import { KnexDatabaseAdapter } from '../database/adapters/knex_database_adapter.js'
|
|
19
|
+
*
|
|
20
|
+
* const storage = StorageServiceFactory.create()
|
|
21
|
+
* const database = new KnexDatabaseAdapter({ client: 'sqlite3', connection: ':memory:' }, storage)
|
|
22
|
+
*
|
|
23
|
+
* const engine = new DigitalTwinEngine({
|
|
24
|
+
* storage,
|
|
25
|
+
* database,
|
|
26
|
+
* collectors: [myCollector],
|
|
27
|
+
* server: { port: 3000 }
|
|
28
|
+
* })
|
|
29
|
+
*
|
|
30
|
+
* await engine.start()
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export class DigitalTwinEngine {
|
|
34
|
+
#collectors;
|
|
35
|
+
#harvesters;
|
|
36
|
+
#handlers;
|
|
37
|
+
#assetsManagers;
|
|
38
|
+
#storage;
|
|
39
|
+
#database;
|
|
40
|
+
#app;
|
|
41
|
+
#router;
|
|
42
|
+
#options;
|
|
43
|
+
#queueManager;
|
|
44
|
+
#server;
|
|
45
|
+
#workers = [];
|
|
46
|
+
/** Get all active components (collectors and harvesters) */
|
|
47
|
+
get #activeComponents() {
|
|
48
|
+
return [...this.#collectors, ...this.#harvesters];
|
|
49
|
+
}
|
|
50
|
+
/** Get all components (collectors + harvesters + handlers + assetsManagers) */
|
|
51
|
+
get #allComponents() {
|
|
52
|
+
return [...this.#collectors, ...this.#harvesters, ...this.#handlers, ...this.#assetsManagers];
|
|
53
|
+
}
|
|
54
|
+
/** Check if multi-queue mode is enabled */
|
|
55
|
+
get #isMultiQueueEnabled() {
|
|
56
|
+
return this.#options.queues?.multiQueue ?? true;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Creates a new Digital Twin Engine instance
|
|
60
|
+
*
|
|
61
|
+
* @param {EngineOptions} options - Configuration options for the engine
|
|
62
|
+
* @throws {Error} If required options (storage, database) are missing
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* ```TypeScript
|
|
66
|
+
* const engine = new DigitalTwinEngine({
|
|
67
|
+
* storage: myStorageService,
|
|
68
|
+
* database: myDatabaseAdapter,
|
|
69
|
+
* collectors: [collector1, collector2],
|
|
70
|
+
* server: { port: 4000, host: 'localhost' }
|
|
71
|
+
* })
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
constructor(options) {
|
|
75
|
+
this.#options = this.#applyDefaults(options);
|
|
76
|
+
this.#collectors = this.#options.collectors;
|
|
77
|
+
this.#harvesters = this.#options.harvesters;
|
|
78
|
+
this.#handlers = this.#options.handlers;
|
|
79
|
+
this.#assetsManagers = this.#options.assetsManagers;
|
|
80
|
+
this.#storage = this.#options.storage;
|
|
81
|
+
this.#database = this.#options.database;
|
|
82
|
+
this.#app = express();
|
|
83
|
+
this.#router = express.Router();
|
|
84
|
+
this.#queueManager = this.#createQueueManager();
|
|
85
|
+
}
|
|
86
|
+
#applyDefaults(options) {
|
|
87
|
+
return {
|
|
88
|
+
collectors: [],
|
|
89
|
+
harvesters: [],
|
|
90
|
+
handlers: [],
|
|
91
|
+
assetsManagers: [],
|
|
92
|
+
server: {
|
|
93
|
+
port: 3000,
|
|
94
|
+
host: '0.0.0.0',
|
|
95
|
+
...options.server
|
|
96
|
+
},
|
|
97
|
+
queues: {
|
|
98
|
+
multiQueue: true,
|
|
99
|
+
workers: {
|
|
100
|
+
collectors: 1,
|
|
101
|
+
harvesters: 1,
|
|
102
|
+
...options.queues?.workers
|
|
103
|
+
},
|
|
104
|
+
...options.queues
|
|
105
|
+
},
|
|
106
|
+
logging: {
|
|
107
|
+
level: LogLevel.INFO,
|
|
108
|
+
format: 'text',
|
|
109
|
+
...options.logging
|
|
110
|
+
},
|
|
111
|
+
dryRun: false,
|
|
112
|
+
...options
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
#createQueueManager() {
|
|
116
|
+
// Only create queue manager if we have collectors or harvesters
|
|
117
|
+
if (this.#collectors.length === 0 && this.#harvesters.length === 0) {
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
return new QueueManager({
|
|
121
|
+
redis: this.#options.redis,
|
|
122
|
+
collectorWorkers: this.#options.queues?.workers?.collectors,
|
|
123
|
+
harvesterWorkers: this.#options.queues?.workers?.harvesters,
|
|
124
|
+
queueOptions: this.#options.queues?.options
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Setup monitoring endpoints for queue statistics
|
|
129
|
+
* @private
|
|
130
|
+
*/
|
|
131
|
+
#setupMonitoringEndpoints() {
|
|
132
|
+
this.#router.get('/api/queues/stats', async (req, res) => {
|
|
133
|
+
if (this.#queueManager) {
|
|
134
|
+
const stats = await this.#queueManager.getQueueStats();
|
|
135
|
+
res.json(stats);
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
res.json({
|
|
139
|
+
collectors: { status: 'No collectors configured' },
|
|
140
|
+
harvesters: { status: 'No harvesters configured' }
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Starts the Digital Twin Engine
|
|
147
|
+
*
|
|
148
|
+
* This method:
|
|
149
|
+
* 1. Initializes all registered components (collectors, harvesters, handlers)
|
|
150
|
+
* 2. Set up HTTP endpoints for component access
|
|
151
|
+
* 3. Configures and starts background job queues
|
|
152
|
+
* 4. Starts the HTTP server
|
|
153
|
+
* 5. Exposes queue monitoring endpoints
|
|
154
|
+
*
|
|
155
|
+
* @async
|
|
156
|
+
* @returns {Promise<void>}
|
|
157
|
+
*
|
|
158
|
+
* @example
|
|
159
|
+
* ```TypeScript
|
|
160
|
+
* await engine.start()
|
|
161
|
+
* console.log('Engine is running!')
|
|
162
|
+
* ```
|
|
163
|
+
*/
|
|
164
|
+
async start() {
|
|
165
|
+
const isDryRun = this.#options.dryRun ?? false;
|
|
166
|
+
if (isDryRun) {
|
|
167
|
+
console.log('🧪 Starting in DRY RUN mode - no data will be persisted');
|
|
168
|
+
// In dry run, just validate everything without creating tables
|
|
169
|
+
const validationResult = await this.validateConfiguration();
|
|
170
|
+
if (!validationResult.valid) {
|
|
171
|
+
throw new Error(`Validation failed:\n${validationResult.engineErrors.join('\n')}`);
|
|
172
|
+
}
|
|
173
|
+
console.log('✅ Dry run completed successfully - all components are valid');
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
// Normal startup - initialize components and create tables if needed
|
|
177
|
+
await initializeComponents(this.#activeComponents, this.#database, this.#storage);
|
|
178
|
+
// Initialize assets managers and create their tables if needed
|
|
179
|
+
await initializeAssetsManagers(this.#assetsManagers, this.#database, this.#storage);
|
|
180
|
+
// Initialize handlers (inject dependencies if needed)
|
|
181
|
+
for (const handler of this.#handlers) {
|
|
182
|
+
if ('setDependencies' in handler && typeof handler.setDependencies === 'function') {
|
|
183
|
+
handler.setDependencies(this.#database, this.#storage);
|
|
184
|
+
}
|
|
185
|
+
// If it's a GlobalAssetsHandler, inject the AssetsManager instances
|
|
186
|
+
if ('setAssetsManagers' in handler && typeof handler.setAssetsManagers === 'function') {
|
|
187
|
+
handler.setAssetsManagers(this.#assetsManagers);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
await exposeEndpoints(this.#router, this.#allComponents);
|
|
191
|
+
// Setup component scheduling with queue manager (only if we have active components)
|
|
192
|
+
if (this.#activeComponents.length > 0 && this.#queueManager) {
|
|
193
|
+
this.#workers = await scheduleComponents(this.#activeComponents, this.#queueManager, this.#isMultiQueueEnabled);
|
|
194
|
+
}
|
|
195
|
+
this.#setupMonitoringEndpoints();
|
|
196
|
+
this.#app.use(this.#router);
|
|
197
|
+
const { port, host = '0.0.0.0' } = this.#options.server;
|
|
198
|
+
this.#server = this.#app.listen(port, host, () => {
|
|
199
|
+
if (process.env.NODE_ENV !== 'test') {
|
|
200
|
+
console.log(`Digital Twin Engine started on ${host}:${port}`);
|
|
201
|
+
console.log(`Multi-queue mode: ${this.#isMultiQueueEnabled}`);
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Get the server port
|
|
207
|
+
*
|
|
208
|
+
* @returns {number | undefined} The server port or undefined if not started
|
|
209
|
+
*
|
|
210
|
+
* @example
|
|
211
|
+
* ```TypeScript
|
|
212
|
+
* const port = engine.getPort()
|
|
213
|
+
* console.log(`Server running on port ${port}`)
|
|
214
|
+
* ```
|
|
215
|
+
*/
|
|
216
|
+
getPort() {
|
|
217
|
+
if (!this.#server)
|
|
218
|
+
return undefined;
|
|
219
|
+
const address = this.#server.address();
|
|
220
|
+
if (typeof address === 'object' && address !== null) {
|
|
221
|
+
return address.port;
|
|
222
|
+
}
|
|
223
|
+
return undefined;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Stops the Digital Twin Engine gracefully
|
|
227
|
+
*
|
|
228
|
+
* This method:
|
|
229
|
+
* 1. Closes HTTP server
|
|
230
|
+
* 2. Closes all queue connections
|
|
231
|
+
* 3. Stops background workers
|
|
232
|
+
* 4. Clean up resources
|
|
233
|
+
*
|
|
234
|
+
* @async
|
|
235
|
+
* @returns {Promise<void>}
|
|
236
|
+
*
|
|
237
|
+
* @example
|
|
238
|
+
* ```TypeScript
|
|
239
|
+
* await engine.stop()
|
|
240
|
+
* console.log('Engine stopped gracefully')
|
|
241
|
+
* ```
|
|
242
|
+
*/
|
|
243
|
+
async stop() {
|
|
244
|
+
// Close HTTP server first
|
|
245
|
+
if (this.#server) {
|
|
246
|
+
await new Promise((resolve, reject) => {
|
|
247
|
+
this.#server.close((err) => {
|
|
248
|
+
if (err)
|
|
249
|
+
reject(err);
|
|
250
|
+
else
|
|
251
|
+
resolve();
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
// Close all workers first with timeout
|
|
256
|
+
await Promise.all(this.#workers.map(worker => Promise.race([
|
|
257
|
+
worker.close(),
|
|
258
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Worker close timeout')), 2000))
|
|
259
|
+
]).catch(async () => {
|
|
260
|
+
// Force close if timeout
|
|
261
|
+
try {
|
|
262
|
+
await worker.disconnect();
|
|
263
|
+
}
|
|
264
|
+
catch (error) {
|
|
265
|
+
// Ignore disconnect errors
|
|
266
|
+
}
|
|
267
|
+
})));
|
|
268
|
+
// Close queue connections (only if we have a queue manager)
|
|
269
|
+
if (this.#queueManager) {
|
|
270
|
+
await this.#queueManager.close();
|
|
271
|
+
}
|
|
272
|
+
if (process.env.NODE_ENV !== 'test') {
|
|
273
|
+
console.log('Digital Twin Engine stopped gracefully');
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Validate the engine configuration and all components
|
|
278
|
+
*
|
|
279
|
+
* This method checks that all components are properly configured and can be initialized
|
|
280
|
+
* without actually creating tables or starting the server.
|
|
281
|
+
*
|
|
282
|
+
* @returns {Promise<ValidationResult>} Comprehensive validation results
|
|
283
|
+
*
|
|
284
|
+
* @example
|
|
285
|
+
* ```typescript
|
|
286
|
+
* const result = await engine.validateConfiguration()
|
|
287
|
+
* if (!result.valid) {
|
|
288
|
+
* console.error('Validation errors:', result.engineErrors)
|
|
289
|
+
* }
|
|
290
|
+
* ```
|
|
291
|
+
*/
|
|
292
|
+
async validateConfiguration() {
|
|
293
|
+
const componentResults = [];
|
|
294
|
+
const engineErrors = [];
|
|
295
|
+
// Validate collectors
|
|
296
|
+
for (const collector of this.#collectors) {
|
|
297
|
+
componentResults.push(await this.#validateComponent(collector, 'collector'));
|
|
298
|
+
}
|
|
299
|
+
// Validate harvesters
|
|
300
|
+
for (const harvester of this.#harvesters) {
|
|
301
|
+
componentResults.push(await this.#validateComponent(harvester, 'harvester'));
|
|
302
|
+
}
|
|
303
|
+
// Validate handlers
|
|
304
|
+
for (const handler of this.#handlers) {
|
|
305
|
+
componentResults.push(await this.#validateComponent(handler, 'handler'));
|
|
306
|
+
}
|
|
307
|
+
// Validate assets managers
|
|
308
|
+
for (const assetsManager of this.#assetsManagers) {
|
|
309
|
+
componentResults.push(await this.#validateComponent(assetsManager, 'assets_manager'));
|
|
310
|
+
}
|
|
311
|
+
// Validate engine-level configuration
|
|
312
|
+
try {
|
|
313
|
+
if (!this.#storage) {
|
|
314
|
+
engineErrors.push('Storage service is required');
|
|
315
|
+
}
|
|
316
|
+
if (!this.#database) {
|
|
317
|
+
engineErrors.push('Database adapter is required');
|
|
318
|
+
}
|
|
319
|
+
// Test storage connection
|
|
320
|
+
if (this.#storage && typeof this.#storage.save === 'function') {
|
|
321
|
+
// Storage validation passed
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
engineErrors.push('Storage service does not implement required methods');
|
|
325
|
+
}
|
|
326
|
+
// Test database connection
|
|
327
|
+
if (this.#database && typeof this.#database.save === 'function') {
|
|
328
|
+
// Database validation passed
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
engineErrors.push('Database adapter does not implement required methods');
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
catch (error) {
|
|
335
|
+
engineErrors.push(`Engine configuration error: ${error instanceof Error ? error.message : String(error)}`);
|
|
336
|
+
}
|
|
337
|
+
// Calculate summary
|
|
338
|
+
const validComponents = componentResults.filter(c => c.valid).length;
|
|
339
|
+
const totalWarnings = componentResults.reduce((acc, c) => acc + c.warnings.length, 0);
|
|
340
|
+
const result = {
|
|
341
|
+
valid: componentResults.every(c => c.valid) && engineErrors.length === 0,
|
|
342
|
+
components: componentResults,
|
|
343
|
+
engineErrors,
|
|
344
|
+
summary: {
|
|
345
|
+
total: componentResults.length,
|
|
346
|
+
valid: validComponents,
|
|
347
|
+
invalid: componentResults.length - validComponents,
|
|
348
|
+
warnings: totalWarnings
|
|
349
|
+
}
|
|
350
|
+
};
|
|
351
|
+
return result;
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Test all components by running their core methods without persistence
|
|
355
|
+
*
|
|
356
|
+
* @returns {Promise<ComponentValidationResult[]>} Test results for each component
|
|
357
|
+
*
|
|
358
|
+
* @example
|
|
359
|
+
* ```typescript
|
|
360
|
+
* const results = await engine.testComponents()
|
|
361
|
+
* results.forEach(result => {
|
|
362
|
+
* console.log(`${result.name}: ${result.valid ? '✅' : '❌'}`)
|
|
363
|
+
* })
|
|
364
|
+
* ```
|
|
365
|
+
*/
|
|
366
|
+
async testComponents() {
|
|
367
|
+
const results = [];
|
|
368
|
+
// Test collectors
|
|
369
|
+
for (const collector of this.#collectors) {
|
|
370
|
+
const result = await this.#testCollector(collector);
|
|
371
|
+
results.push(result);
|
|
372
|
+
}
|
|
373
|
+
// Test harvesters
|
|
374
|
+
for (const harvester of this.#harvesters) {
|
|
375
|
+
const result = await this.#testHarvester(harvester);
|
|
376
|
+
results.push(result);
|
|
377
|
+
}
|
|
378
|
+
// Test handlers
|
|
379
|
+
for (const handler of this.#handlers) {
|
|
380
|
+
const result = await this.#testHandler(handler);
|
|
381
|
+
results.push(result);
|
|
382
|
+
}
|
|
383
|
+
// Test assets managers
|
|
384
|
+
for (const assetsManager of this.#assetsManagers) {
|
|
385
|
+
const result = await this.#testAssetsManager(assetsManager);
|
|
386
|
+
results.push(result);
|
|
387
|
+
}
|
|
388
|
+
return results;
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Validate a single component
|
|
392
|
+
*/
|
|
393
|
+
async #validateComponent(component, type) {
|
|
394
|
+
const errors = [];
|
|
395
|
+
const warnings = [];
|
|
396
|
+
try {
|
|
397
|
+
// Check if component has required methods
|
|
398
|
+
if (typeof component.getConfiguration !== 'function') {
|
|
399
|
+
errors.push('Component must implement getConfiguration() method');
|
|
400
|
+
}
|
|
401
|
+
const config = component.getConfiguration();
|
|
402
|
+
// Validate configuration
|
|
403
|
+
if (!config.name) {
|
|
404
|
+
errors.push('Component configuration must have a name');
|
|
405
|
+
}
|
|
406
|
+
if (!config.description) {
|
|
407
|
+
warnings.push('Component configuration should have a description');
|
|
408
|
+
}
|
|
409
|
+
// Type-specific validation
|
|
410
|
+
if (type === 'collector' || type === 'harvester') {
|
|
411
|
+
const activeComponent = component;
|
|
412
|
+
if (typeof activeComponent.setDependencies !== 'function') {
|
|
413
|
+
errors.push('Active components must implement setDependencies() method');
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
if (type === 'collector') {
|
|
417
|
+
const collector = component;
|
|
418
|
+
if (typeof collector.collect !== 'function') {
|
|
419
|
+
errors.push('Collector must implement collect() method');
|
|
420
|
+
}
|
|
421
|
+
if (typeof collector.getSchedule !== 'function') {
|
|
422
|
+
errors.push('Collector must implement getSchedule() method');
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
if (type === 'harvester') {
|
|
426
|
+
const harvester = component;
|
|
427
|
+
if (typeof harvester.harvest !== 'function') {
|
|
428
|
+
errors.push('Harvester must implement harvest() method');
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
if (type === 'assets_manager') {
|
|
432
|
+
const assetsManager = component;
|
|
433
|
+
if (typeof assetsManager.uploadAsset !== 'function') {
|
|
434
|
+
errors.push('AssetsManager must implement uploadAsset() method');
|
|
435
|
+
}
|
|
436
|
+
if (typeof assetsManager.getAllAssets !== 'function') {
|
|
437
|
+
errors.push('AssetsManager must implement getAllAssets() method');
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
catch (error) {
|
|
442
|
+
errors.push(`Validation error: ${error instanceof Error ? error.message : String(error)}`);
|
|
443
|
+
}
|
|
444
|
+
return {
|
|
445
|
+
name: component.getConfiguration?.()?.name || 'unknown',
|
|
446
|
+
type,
|
|
447
|
+
valid: errors.length === 0,
|
|
448
|
+
errors,
|
|
449
|
+
warnings
|
|
450
|
+
};
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* Test a collector by running its collect method
|
|
454
|
+
*/
|
|
455
|
+
async #testCollector(collector) {
|
|
456
|
+
const errors = [];
|
|
457
|
+
const warnings = [];
|
|
458
|
+
const config = collector.getConfiguration();
|
|
459
|
+
try {
|
|
460
|
+
// Test the collect method
|
|
461
|
+
const result = await collector.collect();
|
|
462
|
+
if (!Buffer.isBuffer(result)) {
|
|
463
|
+
errors.push('collect() method must return a Buffer');
|
|
464
|
+
}
|
|
465
|
+
if (result.length === 0) {
|
|
466
|
+
warnings.push('collect() method returned empty buffer');
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
catch (error) {
|
|
470
|
+
errors.push(`collect() method failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
471
|
+
}
|
|
472
|
+
return {
|
|
473
|
+
name: config.name,
|
|
474
|
+
type: 'collector',
|
|
475
|
+
valid: errors.length === 0,
|
|
476
|
+
errors,
|
|
477
|
+
warnings
|
|
478
|
+
};
|
|
479
|
+
}
|
|
480
|
+
/**
|
|
481
|
+
* Test a harvester (more complex as it needs mock data)
|
|
482
|
+
*/
|
|
483
|
+
async #testHarvester(harvester) {
|
|
484
|
+
const errors = [];
|
|
485
|
+
const warnings = [];
|
|
486
|
+
const config = harvester.getConfiguration();
|
|
487
|
+
try {
|
|
488
|
+
// Create mock data for testing
|
|
489
|
+
const mockData = {
|
|
490
|
+
id: 1,
|
|
491
|
+
name: 'test',
|
|
492
|
+
date: new Date(),
|
|
493
|
+
contentType: 'application/json',
|
|
494
|
+
url: 'test://url',
|
|
495
|
+
data: async () => Buffer.from('{"test": true}')
|
|
496
|
+
};
|
|
497
|
+
// Test the harvest method
|
|
498
|
+
const result = await harvester.harvest(mockData, {});
|
|
499
|
+
if (!Buffer.isBuffer(result)) {
|
|
500
|
+
errors.push('harvest() method must return a Buffer');
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
catch (error) {
|
|
504
|
+
errors.push(`harvest() method failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
505
|
+
}
|
|
506
|
+
return {
|
|
507
|
+
name: config.name,
|
|
508
|
+
type: 'harvester',
|
|
509
|
+
valid: errors.length === 0,
|
|
510
|
+
errors,
|
|
511
|
+
warnings
|
|
512
|
+
};
|
|
513
|
+
}
|
|
514
|
+
/**
|
|
515
|
+
* Test a handler
|
|
516
|
+
*/
|
|
517
|
+
async #testHandler(handler) {
|
|
518
|
+
const errors = [];
|
|
519
|
+
const warnings = [];
|
|
520
|
+
const config = handler.getConfiguration();
|
|
521
|
+
try {
|
|
522
|
+
// Handlers are mostly validated through their endpoint configuration
|
|
523
|
+
if (typeof handler.getEndpoints === 'function') {
|
|
524
|
+
const endpoints = handler.getEndpoints();
|
|
525
|
+
if (!Array.isArray(endpoints)) {
|
|
526
|
+
errors.push('getEndpoints() must return an array');
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
catch (error) {
|
|
531
|
+
errors.push(`Handler test failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
532
|
+
}
|
|
533
|
+
return {
|
|
534
|
+
name: config.name,
|
|
535
|
+
type: 'handler',
|
|
536
|
+
valid: errors.length === 0,
|
|
537
|
+
errors,
|
|
538
|
+
warnings
|
|
539
|
+
};
|
|
540
|
+
}
|
|
541
|
+
/**
|
|
542
|
+
* Test an assets manager
|
|
543
|
+
*/
|
|
544
|
+
async #testAssetsManager(assetsManager) {
|
|
545
|
+
const errors = [];
|
|
546
|
+
const warnings = [];
|
|
547
|
+
const config = assetsManager.getConfiguration();
|
|
548
|
+
try {
|
|
549
|
+
// Test configuration
|
|
550
|
+
if (!config.contentType) {
|
|
551
|
+
errors.push('AssetsManager configuration must have a contentType');
|
|
552
|
+
}
|
|
553
|
+
// In dry run mode, we can't test actual upload/download without dependencies
|
|
554
|
+
// Just validate that the methods exist and are callable
|
|
555
|
+
if (typeof assetsManager.getEndpoints === 'function') {
|
|
556
|
+
const endpoints = assetsManager.getEndpoints();
|
|
557
|
+
if (!Array.isArray(endpoints)) {
|
|
558
|
+
errors.push('getEndpoints() must return an array');
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
catch (error) {
|
|
563
|
+
errors.push(`AssetsManager test failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
564
|
+
}
|
|
565
|
+
return {
|
|
566
|
+
name: config.name,
|
|
567
|
+
type: 'assets_manager',
|
|
568
|
+
valid: errors.length === 0,
|
|
569
|
+
errors,
|
|
570
|
+
warnings
|
|
571
|
+
};
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
//# sourceMappingURL=digital_twin_engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"digital_twin_engine.js","sourceRoot":"","sources":["../../src/engine/digital_twin_engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Router } from 'ultimate-express';
|
|
2
|
+
import { Collector } from '../components/collector.js';
|
|
3
|
+
import { Harvester } from '../components/harvester.js';
|
|
4
|
+
import { Handler } from '../components/handler.js';
|
|
5
|
+
export type HttpMethod = 'get' | 'post' | 'put' | 'delete' | 'patch';
|
|
6
|
+
export declare function exposeEndpoints(router: Router, servables: Array<Collector | Harvester | Handler>): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=endpoints.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endpoints.d.ts","sourceRoot":"","sources":["../../src/engine/endpoints.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AAGlD,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAA;AAYpE,wBAAsB,eAAe,CACjC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,KAAK,CAAC,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC,GAClD,OAAO,CAAC,IAAI,CAAC,CAef"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export async function exposeEndpoints(router, servables) {
|
|
2
|
+
for (const servable of servables) {
|
|
3
|
+
const endpoints = servable.getEndpoints();
|
|
4
|
+
for (const ep of endpoints) {
|
|
5
|
+
const method = ep.method.toLowerCase();
|
|
6
|
+
if (typeof router[method] === 'function') {
|
|
7
|
+
router[method](ep.path, async (req, res) => {
|
|
8
|
+
const result = await ep.handler(req.params, req.body);
|
|
9
|
+
res.status(result.status).header(result.headers || {}).send(result.content);
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
throw new Error(`Unsupported HTTP method: ${ep.method}`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=endpoints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endpoints.js","sourceRoot":"","sources":["../../src/engine/endpoints.ts"],"names":[],"mappings":"AAkBA,MAAM,CAAC,KAAK,UAAU,eAAe,CACjC,MAAc,EACd,SAAiD;IAEjD,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAe,QAAQ,CAAC,YAAY,EAAE,CAAA;QACrD,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,EAAgB,CAAA;YACpD,IAAI,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC;gBACvC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,EAAE;oBAC1D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;oBACrD,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;gBAC/E,CAAC,CAAC,CAAA;YACN,CAAC;iBAAM,CAAC;gBACJ,MAAM,IAAI,KAAK,CAAC,4BAA4B,EAAE,CAAC,MAAM,EAAE,CAAC,CAAA;YAC5D,CAAC;QACL,CAAC;IACL,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
export interface ComponentEvent {
|
|
3
|
+
type: 'collector:completed' | 'harvester:completed';
|
|
4
|
+
componentName: string;
|
|
5
|
+
timestamp: Date;
|
|
6
|
+
data?: any;
|
|
7
|
+
}
|
|
8
|
+
export declare class EngineEventBus extends EventEmitter {
|
|
9
|
+
emit(event: string, data: ComponentEvent): boolean;
|
|
10
|
+
on(event: string, listener: (data: ComponentEvent) => void): this;
|
|
11
|
+
}
|
|
12
|
+
export declare const engineEventBus: EngineEventBus;
|
|
13
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/engine/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AAErC,MAAM,WAAW,cAAc;IAC3B,IAAI,EAAE,qBAAqB,GAAG,qBAAqB,CAAA;IACnD,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,IAAI,CAAA;IACf,IAAI,CAAC,EAAE,GAAG,CAAA;CACb;AAED,qBAAa,cAAe,SAAQ,YAAY;IAC5C,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,OAAO;IAIlD,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,GAAG,IAAI;CAGpE;AAED,eAAO,MAAM,cAAc,gBAAuB,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { EventEmitter } from 'events';
|
|
2
|
+
export class EngineEventBus extends EventEmitter {
|
|
3
|
+
emit(event, data) {
|
|
4
|
+
return super.emit(event, data);
|
|
5
|
+
}
|
|
6
|
+
on(event, listener) {
|
|
7
|
+
return super.on(event, listener);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export const engineEventBus = new EngineEventBus();
|
|
11
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/engine/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AASrC,MAAM,OAAO,cAAe,SAAQ,YAAY;IAC5C,IAAI,CAAC,KAAa,EAAE,IAAoB;QACpC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;IAClC,CAAC;IAED,EAAE,CAAC,KAAa,EAAE,QAAwC;QACtD,OAAO,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;IACpC,CAAC;CACJ;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,cAAc,EAAE,CAAA"}
|