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,253 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility class for handling source range parsing
|
|
3
|
+
*/
|
|
4
|
+
class SourceRangeParser {
|
|
5
|
+
static { this.ZERO_DATE = new Date('1970-01-01T00:00:00Z'); }
|
|
6
|
+
static parseSourceRange(latestDate, sourceRange) {
|
|
7
|
+
if (!sourceRange) {
|
|
8
|
+
return { startDate: latestDate, limit: 1 };
|
|
9
|
+
}
|
|
10
|
+
// If it's a number or numeric string (limit mode)
|
|
11
|
+
if (typeof sourceRange === 'number' || /^\d+$/.test(sourceRange)) {
|
|
12
|
+
return { startDate: latestDate, limit: Number(sourceRange) };
|
|
13
|
+
}
|
|
14
|
+
const sourceRangeStr = sourceRange.toString();
|
|
15
|
+
let value;
|
|
16
|
+
let unit;
|
|
17
|
+
// Parse time-based ranges
|
|
18
|
+
if (sourceRangeStr.includes('d')) {
|
|
19
|
+
value = parseInt(sourceRangeStr.replace('d', ''));
|
|
20
|
+
unit = 'days';
|
|
21
|
+
}
|
|
22
|
+
else if (sourceRangeStr.includes('h')) {
|
|
23
|
+
value = parseInt(sourceRangeStr.replace('h', ''));
|
|
24
|
+
unit = 'hours';
|
|
25
|
+
}
|
|
26
|
+
else if (sourceRangeStr.includes('m')) {
|
|
27
|
+
value = parseInt(sourceRangeStr.replace('m', ''));
|
|
28
|
+
unit = 'minutes';
|
|
29
|
+
}
|
|
30
|
+
else if (sourceRangeStr.includes('s')) {
|
|
31
|
+
value = parseInt(sourceRangeStr.replace('s', ''));
|
|
32
|
+
unit = 'seconds';
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
throw new Error(`Invalid source range format: ${sourceRange}`);
|
|
36
|
+
}
|
|
37
|
+
// For time-based ranges, start from latestDate and go forward
|
|
38
|
+
const startDate = latestDate;
|
|
39
|
+
const endDate = this.addTime(startDate, value, unit);
|
|
40
|
+
return { startDate, endDate };
|
|
41
|
+
}
|
|
42
|
+
static addTime(date, value, unit) {
|
|
43
|
+
const result = new Date(date);
|
|
44
|
+
switch (unit) {
|
|
45
|
+
case 'days':
|
|
46
|
+
result.setDate(result.getDate() + value);
|
|
47
|
+
break;
|
|
48
|
+
case 'hours':
|
|
49
|
+
result.setHours(result.getHours() + value);
|
|
50
|
+
break;
|
|
51
|
+
case 'minutes':
|
|
52
|
+
result.setMinutes(result.getMinutes() + value);
|
|
53
|
+
break;
|
|
54
|
+
case 'seconds':
|
|
55
|
+
result.setSeconds(result.getSeconds() + value);
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
static get zeroDate() {
|
|
61
|
+
return new Date(this.ZERO_DATE);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Abstract Harvester class for processing collected data
|
|
66
|
+
*/
|
|
67
|
+
export class Harvester {
|
|
68
|
+
setDependencies(db, storage) {
|
|
69
|
+
this.db = db;
|
|
70
|
+
this.storage = storage;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Override to make schedule optional based on trigger mode
|
|
74
|
+
*/
|
|
75
|
+
getSchedule() {
|
|
76
|
+
const config = this.getConfiguration();
|
|
77
|
+
if (config.triggerMode === 'on-source') {
|
|
78
|
+
return '';
|
|
79
|
+
}
|
|
80
|
+
// Default to every minute instead of every second
|
|
81
|
+
return '0 * * * * *';
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Main execution method - NOUVELLE VERSION SIMPLIFIÉE
|
|
85
|
+
*/
|
|
86
|
+
async run() {
|
|
87
|
+
const config = this.getConfiguration();
|
|
88
|
+
if (!config.source) {
|
|
89
|
+
throw new Error(`Harvester ${config.name} must specify a source component`);
|
|
90
|
+
}
|
|
91
|
+
try {
|
|
92
|
+
// Get the latest harvested date
|
|
93
|
+
const latestHarvestedRecord = await this.db.getLatestByName(config.name);
|
|
94
|
+
// Calculate the starting point for harvesting
|
|
95
|
+
let latestDate;
|
|
96
|
+
if (!latestHarvestedRecord) {
|
|
97
|
+
// First run - get first source record and start from one second before
|
|
98
|
+
const firstSourceRecord = await this.db.getFirstByName(config.source);
|
|
99
|
+
if (!firstSourceRecord) {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
latestDate = new Date(firstSourceRecord.date.getTime() - 1000);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
latestDate = latestHarvestedRecord.date;
|
|
106
|
+
}
|
|
107
|
+
// Parse source range
|
|
108
|
+
const { startDate, endDate, limit } = SourceRangeParser.parseSourceRange(latestDate, config.source_range);
|
|
109
|
+
// Get source data based on range
|
|
110
|
+
const sourceData = await this.getSourceData(config.source, startDate, endDate, limit);
|
|
111
|
+
if (!sourceData || sourceData.length === 0) {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
// Check if we have enough data (strict mode)
|
|
115
|
+
if (limit && config.source_range_min && sourceData.length < limit) {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
// Calculate storage date
|
|
119
|
+
const storageDate = endDate || sourceData[sourceData.length - 1].date;
|
|
120
|
+
// Prepare source data for harvesting
|
|
121
|
+
const sourceForHarvesting = (limit === 1 && !endDate) ? sourceData[0] : sourceData;
|
|
122
|
+
// Get dependencies data
|
|
123
|
+
const dependenciesData = await this.getDependenciesData(config.dependencies || [], config.dependenciesLimit || [], storageDate);
|
|
124
|
+
// Execute harvesting
|
|
125
|
+
const result = await this.harvest(sourceForHarvesting, dependenciesData);
|
|
126
|
+
// Store results
|
|
127
|
+
await this.storeResults(config, result, sourceData, storageDate);
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
throw error;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Get source data within the specified range
|
|
136
|
+
*/
|
|
137
|
+
async getSourceData(sourceName, startDate, endDate, limit) {
|
|
138
|
+
try {
|
|
139
|
+
let sourceData;
|
|
140
|
+
if (endDate) {
|
|
141
|
+
// Time-based range: get records between startDate and endDate
|
|
142
|
+
sourceData = await this.db.getByDateRange(sourceName, startDate, endDate, limit);
|
|
143
|
+
}
|
|
144
|
+
else if (limit) {
|
|
145
|
+
// Count-based: get records after startDate with limit
|
|
146
|
+
sourceData = await this.db.getAfterDate(sourceName, startDate, limit);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
// Default: get latest record after startDate
|
|
150
|
+
sourceData = await this.db.getAfterDate(sourceName, startDate, 1);
|
|
151
|
+
}
|
|
152
|
+
return sourceData;
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
throw error;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Get data from dependent components
|
|
160
|
+
*/
|
|
161
|
+
async getDependenciesData(dependencies, dependenciesLimit, storageDate) {
|
|
162
|
+
const dependenciesData = {};
|
|
163
|
+
for (let i = 0; i < dependencies.length; i++) {
|
|
164
|
+
const dependency = dependencies[i];
|
|
165
|
+
const limit = dependenciesLimit[i] || 1;
|
|
166
|
+
try {
|
|
167
|
+
if (limit === 1) {
|
|
168
|
+
// Get single latest record before storage date
|
|
169
|
+
const dependencyRecord = await this.db.getLatestBefore(dependency, storageDate);
|
|
170
|
+
if (!dependencyRecord) {
|
|
171
|
+
throw new Error(`Dependency ${dependency} not found before ${storageDate.toISOString()}`);
|
|
172
|
+
}
|
|
173
|
+
dependenciesData[dependency] = dependencyRecord;
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
// Get multiple latest records before storage date
|
|
177
|
+
const dependencyRecords = await this.db.getLatestRecordsBefore(dependency, storageDate, limit);
|
|
178
|
+
if (dependencyRecords.length === 0) {
|
|
179
|
+
throw new Error(`No records found for dependency ${dependency} before ${storageDate.toISOString()}`);
|
|
180
|
+
}
|
|
181
|
+
dependenciesData[dependency] = dependencyRecords;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
throw error;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return dependenciesData;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Store harvesting results
|
|
192
|
+
*/
|
|
193
|
+
async storeResults(config, result, sourceData, storageDate) {
|
|
194
|
+
if (config.multiple_results && Array.isArray(result) && Array.isArray(sourceData)) {
|
|
195
|
+
// Store each result with its corresponding source date
|
|
196
|
+
for (let i = 0; i < result.length; i++) {
|
|
197
|
+
const item = result[i];
|
|
198
|
+
const source = sourceData[i];
|
|
199
|
+
const url = await this.storage.save(item, config.name);
|
|
200
|
+
await this.db.save({
|
|
201
|
+
name: config.name,
|
|
202
|
+
type: config.contentType,
|
|
203
|
+
url,
|
|
204
|
+
date: source.date,
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
// Store single result
|
|
210
|
+
const buffer = Array.isArray(result) ? result[0] : result;
|
|
211
|
+
const url = await this.storage.save(buffer, config.name);
|
|
212
|
+
await this.db.save({
|
|
213
|
+
name: config.name,
|
|
214
|
+
type: config.contentType,
|
|
215
|
+
url,
|
|
216
|
+
date: storageDate,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* HTTP endpoints
|
|
222
|
+
*/
|
|
223
|
+
getEndpoints() {
|
|
224
|
+
return [
|
|
225
|
+
{
|
|
226
|
+
method: 'get',
|
|
227
|
+
path: `/${this.getConfiguration().endpoint}`,
|
|
228
|
+
handler: this.retrieve.bind(this),
|
|
229
|
+
responseType: this.getConfiguration().contentType,
|
|
230
|
+
},
|
|
231
|
+
];
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Retrieve latest harvested data
|
|
235
|
+
*/
|
|
236
|
+
async retrieve() {
|
|
237
|
+
const config = this.getConfiguration();
|
|
238
|
+
const record = await this.db.getLatestByName(config.name);
|
|
239
|
+
if (!record) {
|
|
240
|
+
return {
|
|
241
|
+
status: 404,
|
|
242
|
+
content: 'No data available',
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
const blob = await record.data();
|
|
246
|
+
return {
|
|
247
|
+
status: 200,
|
|
248
|
+
content: blob,
|
|
249
|
+
headers: { 'Content-Type': record.contentType },
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=harvester.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harvester.js","sourceRoot":"","sources":["../../src/components/harvester.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { Collector } from './collector.js';
|
|
2
|
+
export { Harvester } from './harvester.js';
|
|
3
|
+
export { Handler } from './handler.js';
|
|
4
|
+
export { AssetsManager, type AssetMetadataRow, type CreateAssetRequest, type UpdateAssetRequest } from './assets_manager.js';
|
|
5
|
+
export { GlobalAssetsHandler } from './global_assets_handler.js';
|
|
6
|
+
export { Component, Servable } from './interfaces.js';
|
|
7
|
+
export { ComponentConfiguration, AssetsConfiguration, DataResponse } from './types.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,KAAK,gBAAgB,EAAE,KAAK,kBAAkB,EAAE,KAAK,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAC5H,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { Collector } from './collector.js';
|
|
2
|
+
export { Harvester } from './harvester.js';
|
|
3
|
+
export { Handler } from './handler.js';
|
|
4
|
+
export { AssetsManager } from './assets_manager.js';
|
|
5
|
+
export { GlobalAssetsHandler } from './global_assets_handler.js';
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,aAAa,EAA2E,MAAM,qBAAqB,CAAA;AAC5H,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ComponentConfiguration } from "./types.js";
|
|
2
|
+
import { HttpMethod } from "../engine/endpoints.js";
|
|
3
|
+
export interface Component<T extends ComponentConfiguration = ComponentConfiguration> {
|
|
4
|
+
getConfiguration(): T;
|
|
5
|
+
}
|
|
6
|
+
export interface ScheduleRunnable {
|
|
7
|
+
run(): Promise<unknown>;
|
|
8
|
+
getSchedule(): string;
|
|
9
|
+
}
|
|
10
|
+
export interface Servable {
|
|
11
|
+
getEndpoints(): Array<{
|
|
12
|
+
method: HttpMethod;
|
|
13
|
+
path: string;
|
|
14
|
+
handler: (...args: any[]) => any;
|
|
15
|
+
responseType?: string;
|
|
16
|
+
}>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=interfaces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/components/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,sBAAsB,EAAC,MAAM,YAAY,CAAC;AAClD,OAAO,EAAC,UAAU,EAAC,MAAM,wBAAwB,CAAC;AAElD,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,sBAAsB,GAAG,sBAAsB;IAChF,gBAAgB,IAAI,CAAC,CAAA;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC7B,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;IACvB,WAAW,IAAI,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,QAAQ;IACrB,YAAY,IAAI,KAAK,CAAC;QAClB,MAAM,EAAE,UAAU,CAAA;QAClB,IAAI,EAAE,MAAM,CAAA;QACZ,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAA;QAChC,YAAY,CAAC,EAAE,MAAM,CAAA;KACxB,CAAC,CAAA;CACL"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/components/interfaces.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export interface ComponentConfiguration {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
contentType: string;
|
|
5
|
+
tags?: string[];
|
|
6
|
+
}
|
|
7
|
+
export interface CollectorConfiguration extends ComponentConfiguration {
|
|
8
|
+
endpoint: string;
|
|
9
|
+
}
|
|
10
|
+
export interface HarvesterConfiguration extends ComponentConfiguration {
|
|
11
|
+
/** Source range definition (e.g., "3d", "6h", "30m", "120s", or number for limit) */
|
|
12
|
+
source_range?: string | number;
|
|
13
|
+
/** If true, requires exact limit to be met before processing */
|
|
14
|
+
source_range_min: boolean;
|
|
15
|
+
/** If true, stores multiple results instead of single result */
|
|
16
|
+
multiple_results: boolean;
|
|
17
|
+
/** HTTP endpoint path */
|
|
18
|
+
endpoint: string;
|
|
19
|
+
/** Source component name to harvest from */
|
|
20
|
+
source?: string;
|
|
21
|
+
/** List of dependent component names */
|
|
22
|
+
dependencies?: string[];
|
|
23
|
+
/** Limits for each dependency (corresponds to dependencies array) */
|
|
24
|
+
dependenciesLimit?: number[];
|
|
25
|
+
/**
|
|
26
|
+
* Trigger mode for the harvester
|
|
27
|
+
* - 'schedule': Uses cron schedule from getSchedule()
|
|
28
|
+
* - 'on-source': Triggered after source collector runs
|
|
29
|
+
* - 'both': Both scheduled and on-source triggers
|
|
30
|
+
*/
|
|
31
|
+
triggerMode?: 'schedule' | 'on-source' | 'both';
|
|
32
|
+
/**
|
|
33
|
+
* Optional debounce in ms for on-source triggers
|
|
34
|
+
* Prevents multiple rapid executions
|
|
35
|
+
*/
|
|
36
|
+
debounceMs?: number;
|
|
37
|
+
}
|
|
38
|
+
export interface AssetsConfiguration extends ComponentConfiguration {
|
|
39
|
+
/** HTTP endpoint path */
|
|
40
|
+
endpoint: string;
|
|
41
|
+
}
|
|
42
|
+
export interface DataResponse {
|
|
43
|
+
status: number;
|
|
44
|
+
content: Buffer | string;
|
|
45
|
+
headers?: Record<string, string>;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/components/types.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,sBAAsB;IACnC,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;CAClB;AAED,MAAM,WAAW,sBAAuB,SAAQ,sBAAsB;IAClE,QAAQ,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,sBAAuB,SAAQ,sBAAsB;IAClE,qFAAqF;IACrF,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;IAE9B,gEAAgE;IAChE,gBAAgB,EAAE,OAAO,CAAA;IAEzB,gEAAgE;IAChE,gBAAgB,EAAE,OAAO,CAAA;IAEzB,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAA;IAEhB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf,wCAAwC;IACxC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IAEvB,qEAAqE;IACrE,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;IAE5B;;;;;OAKG;IACH,WAAW,CAAC,EAAE,UAAU,GAAG,WAAW,GAAG,MAAM,CAAA;IAE/C;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,mBAAoB,SAAQ,sBAAsB;IAC/D,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,YAAY;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,GAAG,MAAM,CAAA;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACnC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/components/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Knex } from 'knex';
|
|
2
|
+
import { DatabaseAdapter, MetadataRow } from '../database_adapter.js';
|
|
3
|
+
import { DataRecord } from '../../types/data_record.js';
|
|
4
|
+
import { StorageService } from '../../storage/storage_service.js';
|
|
5
|
+
export interface PostgreSQLConfig {
|
|
6
|
+
host: string;
|
|
7
|
+
port?: number;
|
|
8
|
+
user: string;
|
|
9
|
+
password: string;
|
|
10
|
+
database: string;
|
|
11
|
+
ssl?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export interface SQLiteConfig {
|
|
14
|
+
filename: string;
|
|
15
|
+
client?: 'sqlite3' | 'better-sqlite3';
|
|
16
|
+
enableForeignKeys?: boolean;
|
|
17
|
+
busyTimeout?: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Knex-based implementation with extended querying capabilities.
|
|
21
|
+
*/
|
|
22
|
+
export declare class KnexDatabaseAdapter extends DatabaseAdapter {
|
|
23
|
+
#private;
|
|
24
|
+
constructor(config: Knex.Config, storage: StorageService, tableName?: string);
|
|
25
|
+
/**
|
|
26
|
+
* Create a KnexDatabaseAdapter for PostgreSQL with simplified configuration
|
|
27
|
+
*/
|
|
28
|
+
static forPostgreSQL(pgConfig: PostgreSQLConfig, storage: StorageService, tableName?: string): KnexDatabaseAdapter;
|
|
29
|
+
/**
|
|
30
|
+
* Create a KnexDatabaseAdapter for SQLite with simplified configuration
|
|
31
|
+
*/
|
|
32
|
+
static forSQLite(sqliteConfig: SQLiteConfig, storage: StorageService, tableName?: string): KnexDatabaseAdapter;
|
|
33
|
+
save(meta: MetadataRow): Promise<DataRecord>;
|
|
34
|
+
delete(id: string): Promise<void>;
|
|
35
|
+
getById(id: string): Promise<DataRecord | undefined>;
|
|
36
|
+
getLatestByName(name: string): Promise<DataRecord | undefined>;
|
|
37
|
+
doesTableExists(name: string): Promise<boolean>;
|
|
38
|
+
createTable(name: string): Promise<void>;
|
|
39
|
+
getFirstByName(name: string): Promise<DataRecord | undefined>;
|
|
40
|
+
getByDateRange(name: string, startDate: Date, endDate?: Date, limit?: number): Promise<DataRecord[]>;
|
|
41
|
+
getAfterDate(name: string, afterDate: Date, limit?: number): Promise<DataRecord[]>;
|
|
42
|
+
getLatestBefore(name: string, beforeDate: Date): Promise<DataRecord | undefined>;
|
|
43
|
+
getLatestRecordsBefore(name: string, beforeDate: Date, limit: number): Promise<DataRecord[]>;
|
|
44
|
+
hasRecordsAfterDate(name: string, afterDate: Date): Promise<boolean>;
|
|
45
|
+
countByDateRange(name: string, startDate: Date, endDate?: Date): Promise<number>;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=knex_database_adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knex_database_adapter.d.ts","sourceRoot":"","sources":["../../../src/database/adapters/knex_database_adapter.ts"],"names":[],"mappings":"AAAA,OAAa,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AACjC,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAA;AAGjE,MAAM,WAAW,gBAAgB;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,GAAG,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,YAAY;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,SAAS,GAAG,gBAAgB,CAAA;IACrC,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAA;CACvB;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,eAAe;;gBAMhD,MAAM,EAAE,IAAI,CAAC,MAAM,EACnB,OAAO,EAAE,cAAc,EACvB,SAAS,GAAE,MAAqB;IAQpC;;OAEG;IACH,MAAM,CAAC,aAAa,CAChB,QAAQ,EAAE,gBAAgB,EAC1B,OAAO,EAAE,cAAc,EACvB,SAAS,GAAE,MAAqB,GACjC,mBAAmB;IAgBtB;;OAEG;IACH,MAAM,CAAC,SAAS,CACZ,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,cAAc,EACvB,SAAS,GAAE,MAAqB,GACjC,mBAAmB;IAgChB,IAAI,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IAY5C,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAKpD,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAQ9D,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI/C,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBxC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAQ7D,cAAc,CAChB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,IAAI,EACf,OAAO,CAAC,EAAE,IAAI,EACd,KAAK,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,EAAE,CAAC;IAmBlB,YAAY,CACd,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,IAAI,EACf,KAAK,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,EAAE,CAAC;IAclB,eAAe,CACjB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,IAAI,GACjB,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAS5B,sBAAsB,CACxB,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,IAAI,EAChB,KAAK,EAAE,MAAM,GACd,OAAO,CAAC,UAAU,EAAE,CAAC;IAUlB,mBAAmB,CACrB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,IAAI,GAChB,OAAO,CAAC,OAAO,CAAC;IAUb,gBAAgB,CAClB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,IAAI,EACf,OAAO,CAAC,EAAE,IAAI,GACf,OAAO,CAAC,MAAM,CAAC;CAYrB"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import knex from 'knex';
|
|
2
|
+
import { DatabaseAdapter } from '../database_adapter.js';
|
|
3
|
+
import { mapToDataRecord } from "../../utils/map_to_data_record.js";
|
|
4
|
+
/**
|
|
5
|
+
* Knex-based implementation with extended querying capabilities.
|
|
6
|
+
*/
|
|
7
|
+
export class KnexDatabaseAdapter extends DatabaseAdapter {
|
|
8
|
+
#knex;
|
|
9
|
+
#storage;
|
|
10
|
+
#tableName;
|
|
11
|
+
constructor(config, storage, tableName = 'data_index') {
|
|
12
|
+
super();
|
|
13
|
+
this.#knex = knex(config);
|
|
14
|
+
this.#storage = storage;
|
|
15
|
+
this.#tableName = tableName;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Create a KnexDatabaseAdapter for PostgreSQL with simplified configuration
|
|
19
|
+
*/
|
|
20
|
+
static forPostgreSQL(pgConfig, storage, tableName = 'data_index') {
|
|
21
|
+
const knexConfig = {
|
|
22
|
+
client: 'pg',
|
|
23
|
+
connection: {
|
|
24
|
+
host: pgConfig.host,
|
|
25
|
+
port: pgConfig.port || 5432,
|
|
26
|
+
user: pgConfig.user,
|
|
27
|
+
password: pgConfig.password,
|
|
28
|
+
database: pgConfig.database,
|
|
29
|
+
ssl: pgConfig.ssl || false
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
return new KnexDatabaseAdapter(knexConfig, storage, tableName);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Create a KnexDatabaseAdapter for SQLite with simplified configuration
|
|
36
|
+
*/
|
|
37
|
+
static forSQLite(sqliteConfig, storage, tableName = 'data_index') {
|
|
38
|
+
const client = sqliteConfig.client || 'sqlite3';
|
|
39
|
+
const knexConfig = {
|
|
40
|
+
client,
|
|
41
|
+
connection: {
|
|
42
|
+
filename: sqliteConfig.filename
|
|
43
|
+
},
|
|
44
|
+
pool: {
|
|
45
|
+
afterCreate: (conn, cb) => {
|
|
46
|
+
if (sqliteConfig.enableForeignKeys !== false) {
|
|
47
|
+
// Both sqlite3 and better-sqlite3 support PRAGMA
|
|
48
|
+
if (client === 'better-sqlite3') {
|
|
49
|
+
conn.pragma('foreign_keys = ON');
|
|
50
|
+
cb();
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
conn.run('PRAGMA foreign_keys = ON', cb);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
cb();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
acquireConnectionTimeout: sqliteConfig.busyTimeout || 60000,
|
|
62
|
+
useNullAsDefault: true
|
|
63
|
+
};
|
|
64
|
+
return new KnexDatabaseAdapter(knexConfig, storage, tableName);
|
|
65
|
+
}
|
|
66
|
+
// ========== Basic methods ==========
|
|
67
|
+
async save(meta) {
|
|
68
|
+
await this.#knex(this.#tableName).insert({
|
|
69
|
+
id: meta.id,
|
|
70
|
+
name: meta.name,
|
|
71
|
+
type: meta.type,
|
|
72
|
+
url: meta.url,
|
|
73
|
+
date: meta.date.toISOString(),
|
|
74
|
+
});
|
|
75
|
+
return mapToDataRecord(meta, this.#storage);
|
|
76
|
+
}
|
|
77
|
+
async delete(id) {
|
|
78
|
+
await this.#knex(this.#tableName).where({ id }).delete();
|
|
79
|
+
}
|
|
80
|
+
async getById(id) {
|
|
81
|
+
const row = await this.#knex(this.#tableName).where({ id }).first();
|
|
82
|
+
return row ? mapToDataRecord(row, this.#storage) : undefined;
|
|
83
|
+
}
|
|
84
|
+
async getLatestByName(name) {
|
|
85
|
+
const row = await this.#knex(this.#tableName)
|
|
86
|
+
.where({ name })
|
|
87
|
+
.orderBy('date', 'desc')
|
|
88
|
+
.first();
|
|
89
|
+
return row ? mapToDataRecord(row, this.#storage) : undefined;
|
|
90
|
+
}
|
|
91
|
+
async doesTableExists(name) {
|
|
92
|
+
return this.#knex.schema.hasTable(name);
|
|
93
|
+
}
|
|
94
|
+
async createTable(name) {
|
|
95
|
+
await this.#knex.schema.createTable(name, (table) => {
|
|
96
|
+
table.increments('id').primary();
|
|
97
|
+
table.string('name').notNullable();
|
|
98
|
+
table.string('type').notNullable();
|
|
99
|
+
table.string('url').notNullable();
|
|
100
|
+
table.datetime('date').notNullable();
|
|
101
|
+
// Asset-specific fields (optional, for AssetsManager components)
|
|
102
|
+
table.text('description').nullable();
|
|
103
|
+
table.string('source').nullable();
|
|
104
|
+
table.string('owner_id').nullable();
|
|
105
|
+
table.string('filename').nullable();
|
|
106
|
+
// Indexes for performance
|
|
107
|
+
table.index('name');
|
|
108
|
+
table.index('date');
|
|
109
|
+
table.index(['name', 'date']);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
// ========== Extended methods ==========
|
|
113
|
+
async getFirstByName(name) {
|
|
114
|
+
const row = await this.#knex(this.#tableName)
|
|
115
|
+
.where({ name })
|
|
116
|
+
.orderBy('date', 'asc')
|
|
117
|
+
.first();
|
|
118
|
+
return row ? mapToDataRecord(row, this.#storage) : undefined;
|
|
119
|
+
}
|
|
120
|
+
async getByDateRange(name, startDate, endDate, limit) {
|
|
121
|
+
let query = this.#knex(this.#tableName)
|
|
122
|
+
.where({ name })
|
|
123
|
+
.where('date', '>=', startDate.toISOString());
|
|
124
|
+
if (endDate) {
|
|
125
|
+
query = query.where('date', '<', endDate.toISOString());
|
|
126
|
+
}
|
|
127
|
+
query = query.orderBy('date', 'asc');
|
|
128
|
+
if (limit) {
|
|
129
|
+
query = query.limit(limit);
|
|
130
|
+
}
|
|
131
|
+
const rows = await query;
|
|
132
|
+
return rows.map(row => mapToDataRecord(row, this.#storage));
|
|
133
|
+
}
|
|
134
|
+
async getAfterDate(name, afterDate, limit) {
|
|
135
|
+
let query = this.#knex(this.#tableName)
|
|
136
|
+
.where({ name })
|
|
137
|
+
.where('date', '>', afterDate.toISOString())
|
|
138
|
+
.orderBy('date', 'asc');
|
|
139
|
+
if (limit) {
|
|
140
|
+
query = query.limit(limit);
|
|
141
|
+
}
|
|
142
|
+
const rows = await query;
|
|
143
|
+
return rows.map(row => mapToDataRecord(row, this.#storage));
|
|
144
|
+
}
|
|
145
|
+
async getLatestBefore(name, beforeDate) {
|
|
146
|
+
const row = await this.#knex(this.#tableName)
|
|
147
|
+
.where({ name })
|
|
148
|
+
.where('date', '<', beforeDate.toISOString())
|
|
149
|
+
.orderBy('date', 'desc')
|
|
150
|
+
.first();
|
|
151
|
+
return row ? mapToDataRecord(row, this.#storage) : undefined;
|
|
152
|
+
}
|
|
153
|
+
async getLatestRecordsBefore(name, beforeDate, limit) {
|
|
154
|
+
const rows = await this.#knex(this.#tableName)
|
|
155
|
+
.where({ name })
|
|
156
|
+
.where('date', '<', beforeDate.toISOString())
|
|
157
|
+
.orderBy('date', 'desc')
|
|
158
|
+
.limit(limit);
|
|
159
|
+
return rows.map(row => mapToDataRecord(row, this.#storage));
|
|
160
|
+
}
|
|
161
|
+
async hasRecordsAfterDate(name, afterDate) {
|
|
162
|
+
const result = await this.#knex(this.#tableName)
|
|
163
|
+
.where({ name })
|
|
164
|
+
.where('date', '>', afterDate.toISOString())
|
|
165
|
+
.count('* as count')
|
|
166
|
+
.first();
|
|
167
|
+
return Number(result?.count) > 0;
|
|
168
|
+
}
|
|
169
|
+
async countByDateRange(name, startDate, endDate) {
|
|
170
|
+
let query = this.#knex(this.#tableName)
|
|
171
|
+
.where({ name })
|
|
172
|
+
.where('date', '>=', startDate.toISOString());
|
|
173
|
+
if (endDate) {
|
|
174
|
+
query = query.where('date', '<', endDate.toISOString());
|
|
175
|
+
}
|
|
176
|
+
const result = await query.count('* as count').first();
|
|
177
|
+
return Number(result?.count) || 0;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=knex_database_adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"knex_database_adapter.js","sourceRoot":"","sources":["../../../src/database/adapters/knex_database_adapter.ts"],"names":[],"mappings":"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"}
|