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.
Files changed (107) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +125 -0
  3. package/dist/components/assets_manager.d.ts +384 -0
  4. package/dist/components/assets_manager.d.ts.map +1 -0
  5. package/dist/components/assets_manager.js +637 -0
  6. package/dist/components/assets_manager.js.map +1 -0
  7. package/dist/components/collector.d.ts +62 -0
  8. package/dist/components/collector.d.ts.map +1 -0
  9. package/dist/components/collector.js +80 -0
  10. package/dist/components/collector.js.map +1 -0
  11. package/dist/components/global_assets_handler.d.ts +63 -0
  12. package/dist/components/global_assets_handler.d.ts.map +1 -0
  13. package/dist/components/global_assets_handler.js +127 -0
  14. package/dist/components/global_assets_handler.js.map +1 -0
  15. package/dist/components/handler.d.ts +33 -0
  16. package/dist/components/handler.d.ts.map +1 -0
  17. package/dist/components/handler.js +27 -0
  18. package/dist/components/handler.js.map +1 -0
  19. package/dist/components/harvester.d.ts +54 -0
  20. package/dist/components/harvester.d.ts.map +1 -0
  21. package/dist/components/harvester.js +253 -0
  22. package/dist/components/harvester.js.map +1 -0
  23. package/dist/components/index.d.ts +8 -0
  24. package/dist/components/index.d.ts.map +1 -0
  25. package/dist/components/index.js +6 -0
  26. package/dist/components/index.js.map +1 -0
  27. package/dist/components/interfaces.d.ts +18 -0
  28. package/dist/components/interfaces.d.ts.map +1 -0
  29. package/dist/components/interfaces.js +2 -0
  30. package/dist/components/interfaces.js.map +1 -0
  31. package/dist/components/types.d.ts +47 -0
  32. package/dist/components/types.d.ts.map +1 -0
  33. package/dist/components/types.js +2 -0
  34. package/dist/components/types.js.map +1 -0
  35. package/dist/database/adapters/knex_database_adapter.d.ts +47 -0
  36. package/dist/database/adapters/knex_database_adapter.d.ts.map +1 -0
  37. package/dist/database/adapters/knex_database_adapter.js +180 -0
  38. package/dist/database/adapters/knex_database_adapter.js.map +1 -0
  39. package/dist/database/database_adapter.d.ts +92 -0
  40. package/dist/database/database_adapter.d.ts.map +1 -0
  41. package/dist/database/database_adapter.js +6 -0
  42. package/dist/database/database_adapter.js.map +1 -0
  43. package/dist/engine/digital_twin_engine.d.ts +237 -0
  44. package/dist/engine/digital_twin_engine.d.ts.map +1 -0
  45. package/dist/engine/digital_twin_engine.js +574 -0
  46. package/dist/engine/digital_twin_engine.js.map +1 -0
  47. package/dist/engine/endpoints.d.ts +7 -0
  48. package/dist/engine/endpoints.d.ts.map +1 -0
  49. package/dist/engine/endpoints.js +18 -0
  50. package/dist/engine/endpoints.js.map +1 -0
  51. package/dist/engine/events.d.ts +13 -0
  52. package/dist/engine/events.d.ts.map +1 -0
  53. package/dist/engine/events.js +11 -0
  54. package/dist/engine/events.js.map +1 -0
  55. package/dist/engine/initializer.d.ts +8 -0
  56. package/dist/engine/initializer.d.ts.map +1 -0
  57. package/dist/engine/initializer.js +23 -0
  58. package/dist/engine/initializer.js.map +1 -0
  59. package/dist/engine/queue_manager.d.ts +78 -0
  60. package/dist/engine/queue_manager.d.ts.map +1 -0
  61. package/dist/engine/queue_manager.js +167 -0
  62. package/dist/engine/queue_manager.js.map +1 -0
  63. package/dist/engine/scheduler.d.ts +30 -0
  64. package/dist/engine/scheduler.d.ts.map +1 -0
  65. package/dist/engine/scheduler.js +378 -0
  66. package/dist/engine/scheduler.js.map +1 -0
  67. package/dist/env/env.d.ts +25 -0
  68. package/dist/env/env.d.ts.map +1 -0
  69. package/dist/env/env.js +55 -0
  70. package/dist/env/env.js.map +1 -0
  71. package/dist/index.d.ts +23 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +31 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/storage/adapters/local_storage_service.d.ts +29 -0
  76. package/dist/storage/adapters/local_storage_service.d.ts.map +1 -0
  77. package/dist/storage/adapters/local_storage_service.js +50 -0
  78. package/dist/storage/adapters/local_storage_service.js.map +1 -0
  79. package/dist/storage/adapters/ovh_storage_service.d.ts +32 -0
  80. package/dist/storage/adapters/ovh_storage_service.d.ts.map +1 -0
  81. package/dist/storage/adapters/ovh_storage_service.js +70 -0
  82. package/dist/storage/adapters/ovh_storage_service.js.map +1 -0
  83. package/dist/storage/storage_factory.d.ts +14 -0
  84. package/dist/storage/storage_factory.d.ts.map +1 -0
  85. package/dist/storage/storage_factory.js +36 -0
  86. package/dist/storage/storage_factory.js.map +1 -0
  87. package/dist/storage/storage_service.d.ts +26 -0
  88. package/dist/storage/storage_service.d.ts.map +1 -0
  89. package/dist/storage/storage_service.js +7 -0
  90. package/dist/storage/storage_service.js.map +1 -0
  91. package/dist/types/data_record.d.ts +17 -0
  92. package/dist/types/data_record.d.ts.map +1 -0
  93. package/dist/types/data_record.js +2 -0
  94. package/dist/types/data_record.js.map +1 -0
  95. package/dist/utils/logger.d.ts +17 -0
  96. package/dist/utils/logger.d.ts.map +1 -0
  97. package/dist/utils/logger.js +35 -0
  98. package/dist/utils/logger.js.map +1 -0
  99. package/dist/utils/map_to_data_record.d.ts +10 -0
  100. package/dist/utils/map_to_data_record.d.ts.map +1 -0
  101. package/dist/utils/map_to_data_record.js +21 -0
  102. package/dist/utils/map_to_data_record.js.map +1 -0
  103. package/dist/utils/servable_endpoint.d.ts +6 -0
  104. package/dist/utils/servable_endpoint.d.ts.map +1 -0
  105. package/dist/utils/servable_endpoint.js +15 -0
  106. package/dist/utils/servable_endpoint.js.map +1 -0
  107. 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"}