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,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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=interfaces.js.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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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"}