@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.
- package/LICENSE +21 -0
- package/README.md +209 -0
- package/dist/component_types.d.ts +92 -0
- package/dist/component_types.d.ts.map +1 -0
- package/dist/component_types.js +93 -0
- package/dist/component_types.js.map +1 -0
- package/dist/digital_twin_engine.d.ts +390 -0
- package/dist/digital_twin_engine.d.ts.map +1 -0
- package/dist/digital_twin_engine.js +1200 -0
- package/dist/digital_twin_engine.js.map +1 -0
- package/dist/endpoints.d.ts +45 -0
- package/dist/endpoints.d.ts.map +1 -0
- package/dist/endpoints.js +87 -0
- package/dist/endpoints.js.map +1 -0
- package/dist/error_handler.d.ts +20 -0
- package/dist/error_handler.d.ts.map +1 -0
- package/dist/error_handler.js +68 -0
- package/dist/error_handler.js.map +1 -0
- package/dist/global_assets_handler.d.ts +63 -0
- package/dist/global_assets_handler.d.ts.map +1 -0
- package/dist/global_assets_handler.js +127 -0
- package/dist/global_assets_handler.js.map +1 -0
- package/dist/graceful_shutdown.d.ts +44 -0
- package/dist/graceful_shutdown.d.ts.map +1 -0
- package/dist/graceful_shutdown.js +79 -0
- package/dist/graceful_shutdown.js.map +1 -0
- package/dist/health.d.ts +112 -0
- package/dist/health.d.ts.map +1 -0
- package/dist/health.js +190 -0
- package/dist/health.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/initializer.d.ts +62 -0
- package/dist/initializer.d.ts.map +1 -0
- package/dist/initializer.js +110 -0
- package/dist/initializer.js.map +1 -0
- package/dist/loader/component_loader.d.ts +133 -0
- package/dist/loader/component_loader.d.ts.map +1 -0
- package/dist/loader/component_loader.js +340 -0
- package/dist/loader/component_loader.js.map +1 -0
- package/dist/openapi/generator.d.ts +93 -0
- package/dist/openapi/generator.d.ts.map +1 -0
- package/dist/openapi/generator.js +293 -0
- package/dist/openapi/generator.js.map +1 -0
- package/dist/queue_manager.d.ts +87 -0
- package/dist/queue_manager.d.ts.map +1 -0
- package/dist/queue_manager.js +196 -0
- package/dist/queue_manager.js.map +1 -0
- package/dist/scheduler.d.ts +29 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +375 -0
- package/dist/scheduler.js.map +1 -0
- 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
|
+
}
|