@cepseudo/engine 1.0.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 (55) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +209 -0
  3. package/dist/component_types.d.ts +92 -0
  4. package/dist/component_types.d.ts.map +1 -0
  5. package/dist/component_types.js +93 -0
  6. package/dist/component_types.js.map +1 -0
  7. package/dist/digital_twin_engine.d.ts +390 -0
  8. package/dist/digital_twin_engine.d.ts.map +1 -0
  9. package/dist/digital_twin_engine.js +1200 -0
  10. package/dist/digital_twin_engine.js.map +1 -0
  11. package/dist/endpoints.d.ts +45 -0
  12. package/dist/endpoints.d.ts.map +1 -0
  13. package/dist/endpoints.js +87 -0
  14. package/dist/endpoints.js.map +1 -0
  15. package/dist/error_handler.d.ts +20 -0
  16. package/dist/error_handler.d.ts.map +1 -0
  17. package/dist/error_handler.js +68 -0
  18. package/dist/error_handler.js.map +1 -0
  19. package/dist/global_assets_handler.d.ts +63 -0
  20. package/dist/global_assets_handler.d.ts.map +1 -0
  21. package/dist/global_assets_handler.js +127 -0
  22. package/dist/global_assets_handler.js.map +1 -0
  23. package/dist/graceful_shutdown.d.ts +44 -0
  24. package/dist/graceful_shutdown.d.ts.map +1 -0
  25. package/dist/graceful_shutdown.js +79 -0
  26. package/dist/graceful_shutdown.js.map +1 -0
  27. package/dist/health.d.ts +112 -0
  28. package/dist/health.d.ts.map +1 -0
  29. package/dist/health.js +190 -0
  30. package/dist/health.js.map +1 -0
  31. package/dist/index.d.ts +19 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +25 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/initializer.d.ts +62 -0
  36. package/dist/initializer.d.ts.map +1 -0
  37. package/dist/initializer.js +110 -0
  38. package/dist/initializer.js.map +1 -0
  39. package/dist/loader/component_loader.d.ts +133 -0
  40. package/dist/loader/component_loader.d.ts.map +1 -0
  41. package/dist/loader/component_loader.js +340 -0
  42. package/dist/loader/component_loader.js.map +1 -0
  43. package/dist/openapi/generator.d.ts +93 -0
  44. package/dist/openapi/generator.d.ts.map +1 -0
  45. package/dist/openapi/generator.js +293 -0
  46. package/dist/openapi/generator.js.map +1 -0
  47. package/dist/queue_manager.d.ts +87 -0
  48. package/dist/queue_manager.d.ts.map +1 -0
  49. package/dist/queue_manager.js +196 -0
  50. package/dist/queue_manager.js.map +1 -0
  51. package/dist/scheduler.d.ts +29 -0
  52. package/dist/scheduler.d.ts.map +1 -0
  53. package/dist/scheduler.js +375 -0
  54. package/dist/scheduler.js.map +1 -0
  55. package/package.json +78 -0
@@ -0,0 +1,375 @@
1
+ import { Collector, Harvester } from '@cepseudo/components';
2
+ import { Worker } from 'bullmq';
3
+ import { Logger, LogLevel, engineEventBus } from '@cepseudo/shared';
4
+ import debounce from 'lodash/debounce.js';
5
+ /**
6
+ * Worker configuration constants
7
+ */
8
+ const WORKER_CONFIG = {
9
+ COLLECTOR: {
10
+ concurrency: 5,
11
+ limiter: { max: 10, duration: 60000 }
12
+ },
13
+ HARVESTER: {
14
+ concurrency: 3,
15
+ limiter: { max: 20, duration: 60000 }
16
+ },
17
+ PRIORITY: {
18
+ concurrency: 1 // One priority task at a time
19
+ },
20
+ SINGLE_QUEUE: {
21
+ concurrency: (componentCount) => Math.max(componentCount, 1)
22
+ }
23
+ };
24
+ /**
25
+ * Default job options for event-triggered harvesters
26
+ */
27
+ const EVENT_JOB_OPTIONS = {
28
+ removeOnComplete: true,
29
+ attempts: 3,
30
+ backoff: { type: 'exponential', delay: 1000 }
31
+ };
32
+ /**
33
+ * Component Scheduler - Manages scheduling and execution of collectors and harvesters
34
+ *
35
+ * The scheduler supports two modes:
36
+ * - Multi-queue mode: Separate queues for collectors, harvesters, and priority jobs
37
+ * - Single-queue mode: All components share one queue (legacy mode)
38
+ *
39
+ * @class ComponentScheduler
40
+ */
41
+ class ComponentScheduler {
42
+ /**
43
+ * Creates a new Component Scheduler instance
44
+ * @param components - Array of components to schedule
45
+ * @param queueManager - Queue manager instance
46
+ * @param multiQueue - Whether to use multi-queue mode
47
+ * @param logLevel - Log level for the scheduler (optional)
48
+ */
49
+ constructor(components, queueManager, multiQueue = true, logLevel) {
50
+ this.componentMap = {};
51
+ this.debouncedTriggers = {};
52
+ this.components = components;
53
+ this.queueManager = queueManager;
54
+ this.multiQueue = multiQueue;
55
+ this.logger = new Logger('DigitalTwin', logLevel ?? (process.env.NODE_ENV === 'test' ? LogLevel.SILENT : LogLevel.INFO));
56
+ this.#buildComponentMap();
57
+ }
58
+ /**
59
+ * Schedules all components and creates workers
60
+ * @returns Array of created workers
61
+ */
62
+ async schedule() {
63
+ this.#setupEventListeners();
64
+ if (this.multiQueue) {
65
+ return this.#scheduleMultiQueue();
66
+ }
67
+ else {
68
+ return this.#scheduleSingleQueue();
69
+ }
70
+ }
71
+ /**
72
+ * Builds a map of component names to component instances
73
+ * @private
74
+ */
75
+ #buildComponentMap() {
76
+ for (const comp of this.components) {
77
+ const config = comp.getConfiguration();
78
+ this.componentMap[config.name] = comp;
79
+ }
80
+ }
81
+ /**
82
+ * Sets up event listeners for harvesters with on-source trigger
83
+ * @private
84
+ */
85
+ #setupEventListeners() {
86
+ this.#setupHarvesterTriggers();
87
+ this.#setupCollectorEventListener();
88
+ }
89
+ /**
90
+ * Creates debounced trigger functions for event-driven harvesters
91
+ * @private
92
+ */
93
+ #setupHarvesterTriggers() {
94
+ for (const comp of this.components) {
95
+ if (!(comp instanceof Harvester))
96
+ continue;
97
+ const config = comp.getConfiguration();
98
+ if (!this.#shouldSetupEventTrigger(config))
99
+ continue;
100
+ const triggerFunction = this.#createTriggerFunction(config);
101
+ const debounceMs = config.debounceMs || 1000;
102
+ this.debouncedTriggers[config.name] = debounce(triggerFunction, debounceMs);
103
+ }
104
+ }
105
+ /**
106
+ * Checks if a harvester should have event trigger setup
107
+ * @private
108
+ */
109
+ #shouldSetupEventTrigger(config) {
110
+ return config.triggerMode === 'on-source' || config.triggerMode === 'both';
111
+ }
112
+ /**
113
+ * Creates a trigger function for a harvester
114
+ * @private
115
+ */
116
+ #createTriggerFunction(config) {
117
+ return async () => {
118
+ const queue = this.multiQueue ? this.queueManager.harvesterQueue : this.queueManager.collectorQueue;
119
+ await queue.add(config.name, {
120
+ type: 'harvester',
121
+ triggeredBy: 'source-event',
122
+ source: config.source
123
+ }, EVENT_JOB_OPTIONS);
124
+ this.logger.debug(`Triggered harvester ${config.name} from source event`);
125
+ };
126
+ }
127
+ /**
128
+ * Sets up listener for collector completion events
129
+ * @private
130
+ */
131
+ #setupCollectorEventListener() {
132
+ engineEventBus.on('component:event', async (event) => {
133
+ if (event.type !== 'collector:completed')
134
+ return;
135
+ this.logger.debug(`Received collector:completed event from ${event.componentName}`);
136
+ try {
137
+ await this.#triggerDependentHarvesters(event.componentName);
138
+ }
139
+ catch (error) {
140
+ this.logger.error(`Failed to trigger harvesters for ${event.componentName}: ${error instanceof Error ? error.message : String(error)}`, {
141
+ componentName: event.componentName,
142
+ stack: error instanceof Error ? error.stack : undefined
143
+ });
144
+ }
145
+ });
146
+ }
147
+ /**
148
+ * Triggers harvesters that depend on a completed collector
149
+ * @private
150
+ */
151
+ async #triggerDependentHarvesters(collectorName) {
152
+ for (const comp of this.components) {
153
+ if (!(comp instanceof Harvester))
154
+ continue;
155
+ const config = comp.getConfiguration();
156
+ if (config.source === collectorName && this.debouncedTriggers[config.name]) {
157
+ this.logger.debug(`Triggering harvester "${config.name}" from "${collectorName}"`);
158
+ this.debouncedTriggers[config.name]();
159
+ }
160
+ }
161
+ }
162
+ /**
163
+ * Schedules components in multi-queue mode
164
+ * @private
165
+ */
166
+ async #scheduleMultiQueue() {
167
+ await this.#scheduleCollectors();
168
+ await this.#scheduleHarvesters();
169
+ return [this.#createCollectorWorker(), this.#createHarvesterWorker(), this.#createPriorityWorker()];
170
+ }
171
+ /**
172
+ * Schedules all collectors in multi-queue mode
173
+ * @private
174
+ */
175
+ async #scheduleCollectors() {
176
+ const collectors = this.components.filter((comp) => comp instanceof Collector);
177
+ for (const collector of collectors) {
178
+ const config = collector.getConfiguration();
179
+ const schedule = collector.getSchedule();
180
+ await this.queueManager.collectorQueue.upsertJobScheduler(config.name, { pattern: schedule }, {
181
+ name: config.name,
182
+ data: { type: 'collector', triggeredBy: 'schedule' }
183
+ });
184
+ this.logger.info(`Collector "${config.name}" scheduled: ${schedule}`);
185
+ }
186
+ }
187
+ /**
188
+ * Schedules harvesters (only those not exclusively on-source) in multi-queue mode
189
+ * @private
190
+ */
191
+ async #scheduleHarvesters() {
192
+ const harvesters = this.components.filter((comp) => comp instanceof Harvester);
193
+ for (const harvester of harvesters) {
194
+ const config = harvester.getConfiguration();
195
+ const schedule = harvester.getSchedule();
196
+ if (schedule && config.triggerMode !== 'on-source') {
197
+ await this.queueManager.harvesterQueue.upsertJobScheduler(config.name, { pattern: schedule }, {
198
+ name: config.name,
199
+ data: { type: 'harvester', triggeredBy: 'schedule' }
200
+ });
201
+ this.logger.info(`Harvester "${config.name}" scheduled: ${schedule}`);
202
+ }
203
+ }
204
+ }
205
+ /**
206
+ * Creates collector worker for multi-queue mode
207
+ * @private
208
+ */
209
+ #createCollectorWorker() {
210
+ return new Worker('dt-collectors', async (job) => this.#processCollectorJob(job), {
211
+ connection: this.queueManager.collectorQueue.opts.connection,
212
+ concurrency: WORKER_CONFIG.COLLECTOR.concurrency,
213
+ limiter: WORKER_CONFIG.COLLECTOR.limiter
214
+ });
215
+ }
216
+ /**
217
+ * Creates harvester worker for multi-queue mode
218
+ * @private
219
+ */
220
+ #createHarvesterWorker() {
221
+ return new Worker('dt-harvesters', async (job) => this.#processHarvesterJob(job), {
222
+ connection: this.queueManager.harvesterQueue.opts.connection,
223
+ concurrency: WORKER_CONFIG.HARVESTER.concurrency,
224
+ limiter: WORKER_CONFIG.HARVESTER.limiter
225
+ });
226
+ }
227
+ /**
228
+ * Creates priority worker for multi-queue mode
229
+ * @private
230
+ */
231
+ #createPriorityWorker() {
232
+ return new Worker('dt-priority', async (job) => this.#processPriorityJob(job), {
233
+ connection: this.queueManager.priorityQueue.opts.connection,
234
+ concurrency: WORKER_CONFIG.PRIORITY.concurrency
235
+ });
236
+ }
237
+ /**
238
+ * Processes a collector job
239
+ * @private
240
+ */
241
+ async #processCollectorJob(job) {
242
+ const comp = this.componentMap[job.name];
243
+ if (!comp)
244
+ return undefined;
245
+ this.logger.debug(`Running collector: ${job.name}`);
246
+ try {
247
+ const result = await comp.run();
248
+ return {
249
+ success: true,
250
+ bytes: result?.length ?? 0,
251
+ timestamp: new Date().toISOString()
252
+ };
253
+ }
254
+ catch (error) {
255
+ this.logger.error(`Collector ${job.name} failed:`, error);
256
+ throw error;
257
+ }
258
+ }
259
+ /**
260
+ * Processes a harvester job
261
+ * @private
262
+ */
263
+ async #processHarvesterJob(job) {
264
+ const comp = this.componentMap[job.name];
265
+ if (!comp)
266
+ return undefined;
267
+ this.logger.debug(`Running harvester: ${job.name} (${job.data.triggeredBy})`);
268
+ try {
269
+ const result = await comp.run();
270
+ // Emit harvester completion event
271
+ engineEventBus.emit('component:event', {
272
+ type: 'harvester:completed',
273
+ componentName: comp.getConfiguration().name,
274
+ timestamp: new Date(),
275
+ data: { success: result }
276
+ });
277
+ return {
278
+ success: Boolean(result),
279
+ timestamp: new Date().toISOString()
280
+ };
281
+ }
282
+ catch (error) {
283
+ this.logger.error(`Harvester ${job.name} failed:`, error);
284
+ throw error;
285
+ }
286
+ }
287
+ /**
288
+ * Processes a priority job
289
+ * @private
290
+ */
291
+ async #processPriorityJob(job) {
292
+ const comp = this.componentMap[job.name];
293
+ if (!comp)
294
+ return undefined;
295
+ this.logger.debug(`Running priority job: ${job.name}`);
296
+ const result = await comp.run();
297
+ return { success: true, result, timestamp: new Date().toISOString() };
298
+ }
299
+ /**
300
+ * Schedules components in single-queue mode (legacy)
301
+ * @private
302
+ */
303
+ async #scheduleSingleQueue() {
304
+ this.logger.warn('Single-queue mode (not recommended for production)');
305
+ const singleQueue = this.queueManager.collectorQueue;
306
+ await this.#scheduleAllComponentsInSingleQueue(singleQueue);
307
+ const worker = new Worker(singleQueue.name, async (job) => this.#processSingleQueueJob(job), {
308
+ connection: singleQueue.opts.connection,
309
+ concurrency: WORKER_CONFIG.SINGLE_QUEUE.concurrency(this.components.length)
310
+ });
311
+ return [worker];
312
+ }
313
+ /**
314
+ * Schedules all components in single queue
315
+ * @private
316
+ */
317
+ async #scheduleAllComponentsInSingleQueue(singleQueue) {
318
+ for (const comp of this.components) {
319
+ const config = comp.getConfiguration();
320
+ const schedule = comp.getSchedule();
321
+ const shouldSchedule = comp instanceof Harvester
322
+ ? schedule && comp.getConfiguration().triggerMode !== 'on-source'
323
+ : schedule !== null;
324
+ if (shouldSchedule) {
325
+ await singleQueue.upsertJobScheduler(config.name, { pattern: schedule }, {
326
+ name: config.name,
327
+ data: {
328
+ type: comp instanceof Collector ? 'collector' : 'harvester',
329
+ triggeredBy: 'schedule'
330
+ }
331
+ });
332
+ }
333
+ }
334
+ }
335
+ /**
336
+ * Processes a job in single-queue mode
337
+ * @private
338
+ */
339
+ async #processSingleQueueJob(job) {
340
+ const comp = this.componentMap[job.name];
341
+ if (!comp)
342
+ return undefined;
343
+ this.logger.debug(`Running ${job.data.type}: ${job.name}`);
344
+ const result = await comp.run();
345
+ return { success: true, result, timestamp: new Date().toISOString() };
346
+ }
347
+ }
348
+ /**
349
+ * Schedules components for execution using the queue manager
350
+ *
351
+ * This function creates a scheduler instance and sets up:
352
+ * - Job scheduling based on component schedules
353
+ * - Event-driven harvester triggers
354
+ * - Workers for processing jobs
355
+ *
356
+ * @param components - Array of components to schedule
357
+ * @param queueManager - Queue manager instance
358
+ * @param multiQueue - Whether to use multi-queue mode (default: true)
359
+ * @param logLevel - Log level for the scheduler (optional)
360
+ * @returns Promise that resolves to array of created workers
361
+ *
362
+ * @example
363
+ * ```typescript
364
+ * const workers = await scheduleComponents(
365
+ * [collector1, harvester1],
366
+ * queueManager,
367
+ * true
368
+ * )
369
+ * ```
370
+ */
371
+ export async function scheduleComponents(components, queueManager, multiQueue = true, logLevel) {
372
+ const scheduler = new ComponentScheduler(components, queueManager, multiQueue, logLevel);
373
+ return scheduler.schedule();
374
+ }
375
+ //# sourceMappingURL=scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,78 @@
1
+ {
2
+ "name": "@cepseudo/engine",
3
+ "version": "1.0.0",
4
+ "description": "Core engine for Digital Twin framework (Engine, Scheduler, Queues, Loader, OpenAPI)",
5
+ "license": "MIT",
6
+ "author": "Axel Hoffmann",
7
+ "type": "module",
8
+ "main": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "import": "./dist/index.js",
13
+ "types": "./dist/index.d.ts"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist/",
18
+ "README.md",
19
+ "LICENSE"
20
+ ],
21
+ "scripts": {
22
+ "build": "tsc",
23
+ "dev": "tsc --watch",
24
+ "clean": "rimraf dist tsconfig.tsbuildinfo",
25
+ "test": "node -r ./bin/set-test-env.cjs --import ts-node-maintained/register/esm --enable-source-maps bin/test.ts",
26
+ "lint": "eslint src tests --no-error-on-unmatched-pattern",
27
+ "lint:fix": "eslint src tests --fix --no-error-on-unmatched-pattern"
28
+ },
29
+ "engines": {
30
+ "node": ">=20.0.0"
31
+ },
32
+ "dependencies": {
33
+ "@cepseudo/shared": "workspace:*",
34
+ "@cepseudo/database": "workspace:*",
35
+ "@cepseudo/storage": "workspace:*",
36
+ "@cepseudo/auth": "workspace:*",
37
+ "@cepseudo/assets": "workspace:*",
38
+ "@cepseudo/components": "workspace:*",
39
+ "bullmq": "^5.56.5",
40
+ "compression": "^1.7.5",
41
+ "cors": "^2.8.5",
42
+ "ioredis": "^5.6.1",
43
+ "lodash": "^4.17.23",
44
+ "multer": "^2.0.2",
45
+ "ultimate-express": "^2.0.9"
46
+ },
47
+ "devDependencies": {
48
+ "@japa/assert": "^4.1.0",
49
+ "@japa/runner": "^4.3.0",
50
+ "@testcontainers/redis": "^11.3.1",
51
+ "@types/compression": "^1.7.5",
52
+ "@types/cors": "^2.8.19",
53
+ "@types/lodash": "^4.17.20",
54
+ "@types/multer": "^2.0.0",
55
+ "testcontainers": "^11.3.1",
56
+ "ts-node-maintained": "^10.9.5"
57
+ },
58
+ "repository": {
59
+ "type": "git",
60
+ "url": "git+https://github.com/CePseudoBE/digitaltwin.git",
61
+ "directory": "packages/engine"
62
+ },
63
+ "keywords": [
64
+ "digitaltwin",
65
+ "engine",
66
+ "scheduler",
67
+ "bullmq",
68
+ "openapi",
69
+ "health-check"
70
+ ],
71
+ "bugs": {
72
+ "url": "https://github.com/CePseudoBE/digitaltwin/issues"
73
+ },
74
+ "homepage": "https://github.com/CePseudoBE/digitaltwin#readme",
75
+ "publishConfig": {
76
+ "access": "public"
77
+ }
78
+ }