digitaltwin-core 0.14.2 → 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 (227) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +494 -359
  3. package/dist/auth/apisix_parser.d.ts +141 -0
  4. package/dist/auth/apisix_parser.d.ts.map +1 -0
  5. package/dist/auth/apisix_parser.js +161 -0
  6. package/dist/auth/apisix_parser.js.map +1 -0
  7. package/dist/auth/auth_config.d.ts +126 -0
  8. package/dist/auth/auth_config.d.ts.map +1 -0
  9. package/dist/auth/auth_config.js +169 -0
  10. package/dist/auth/auth_config.js.map +1 -0
  11. package/dist/auth/auth_provider.d.ts +118 -0
  12. package/dist/auth/auth_provider.d.ts.map +1 -0
  13. package/dist/auth/auth_provider.js +8 -0
  14. package/dist/auth/auth_provider.js.map +1 -0
  15. package/dist/auth/auth_provider_factory.d.ts +91 -0
  16. package/dist/auth/auth_provider_factory.d.ts.map +1 -0
  17. package/dist/auth/auth_provider_factory.js +146 -0
  18. package/dist/auth/auth_provider_factory.js.map +1 -0
  19. package/dist/auth/index.d.ts +8 -0
  20. package/dist/auth/index.d.ts.map +1 -0
  21. package/dist/auth/index.js +7 -0
  22. package/dist/auth/index.js.map +1 -0
  23. package/dist/auth/providers/gateway_auth_provider.d.ts +78 -0
  24. package/dist/auth/providers/gateway_auth_provider.d.ts.map +1 -0
  25. package/dist/auth/providers/gateway_auth_provider.js +109 -0
  26. package/dist/auth/providers/gateway_auth_provider.js.map +1 -0
  27. package/dist/auth/providers/index.d.ts +4 -0
  28. package/dist/auth/providers/index.d.ts.map +1 -0
  29. package/dist/auth/providers/index.js +4 -0
  30. package/dist/auth/providers/index.js.map +1 -0
  31. package/dist/auth/providers/jwt_auth_provider.d.ts +91 -0
  32. package/dist/auth/providers/jwt_auth_provider.d.ts.map +1 -0
  33. package/dist/auth/providers/jwt_auth_provider.js +204 -0
  34. package/dist/auth/providers/jwt_auth_provider.js.map +1 -0
  35. package/dist/auth/providers/no_auth_provider.d.ts +61 -0
  36. package/dist/auth/providers/no_auth_provider.d.ts.map +1 -0
  37. package/dist/auth/providers/no_auth_provider.js +76 -0
  38. package/dist/auth/providers/no_auth_provider.js.map +1 -0
  39. package/dist/auth/types.d.ts +100 -0
  40. package/dist/auth/types.d.ts.map +1 -0
  41. package/dist/auth/types.js +2 -0
  42. package/dist/auth/types.js.map +1 -0
  43. package/dist/auth/user_service.d.ts +86 -0
  44. package/dist/auth/user_service.d.ts.map +1 -0
  45. package/dist/auth/user_service.js +237 -0
  46. package/dist/auth/user_service.js.map +1 -0
  47. package/dist/components/assets_manager.d.ts +662 -0
  48. package/dist/components/assets_manager.d.ts.map +1 -0
  49. package/dist/components/assets_manager.js +1537 -0
  50. package/dist/components/assets_manager.js.map +1 -0
  51. package/dist/components/async_upload.d.ts +20 -0
  52. package/dist/components/async_upload.d.ts.map +1 -0
  53. package/dist/components/async_upload.js +10 -0
  54. package/dist/components/async_upload.js.map +1 -0
  55. package/dist/components/collector.d.ts +203 -0
  56. package/dist/components/collector.d.ts.map +1 -0
  57. package/dist/components/collector.js +214 -0
  58. package/dist/components/collector.js.map +1 -0
  59. package/dist/components/custom_table_manager.d.ts +503 -0
  60. package/dist/components/custom_table_manager.d.ts.map +1 -0
  61. package/dist/components/custom_table_manager.js +1023 -0
  62. package/dist/components/custom_table_manager.js.map +1 -0
  63. package/dist/components/global_assets_handler.d.ts +63 -0
  64. package/dist/components/global_assets_handler.d.ts.map +1 -0
  65. package/dist/components/global_assets_handler.js +127 -0
  66. package/dist/components/global_assets_handler.js.map +1 -0
  67. package/dist/components/handler.d.ts +104 -0
  68. package/dist/components/handler.d.ts.map +1 -0
  69. package/dist/components/handler.js +110 -0
  70. package/dist/components/handler.js.map +1 -0
  71. package/dist/components/harvester.d.ts +182 -0
  72. package/dist/components/harvester.d.ts.map +1 -0
  73. package/dist/components/harvester.js +406 -0
  74. package/dist/components/harvester.js.map +1 -0
  75. package/dist/components/index.d.ts +11 -0
  76. package/dist/components/index.d.ts.map +1 -0
  77. package/dist/components/index.js +9 -0
  78. package/dist/components/index.js.map +1 -0
  79. package/dist/components/interfaces.d.ts +126 -0
  80. package/dist/components/interfaces.d.ts.map +1 -0
  81. package/dist/components/interfaces.js +8 -0
  82. package/dist/components/interfaces.js.map +1 -0
  83. package/dist/components/map_manager.d.ts +61 -0
  84. package/dist/components/map_manager.d.ts.map +1 -0
  85. package/dist/components/map_manager.js +242 -0
  86. package/dist/components/map_manager.js.map +1 -0
  87. package/dist/components/tileset_manager.d.ts +125 -0
  88. package/dist/components/tileset_manager.d.ts.map +1 -0
  89. package/dist/components/tileset_manager.js +623 -0
  90. package/dist/components/tileset_manager.js.map +1 -0
  91. package/dist/components/types.d.ts +226 -0
  92. package/dist/components/types.d.ts.map +1 -0
  93. package/dist/components/types.js +8 -0
  94. package/dist/components/types.js.map +1 -0
  95. package/dist/database/adapters/knex_database_adapter.d.ts +97 -0
  96. package/dist/database/adapters/knex_database_adapter.d.ts.map +1 -0
  97. package/dist/database/adapters/knex_database_adapter.js +729 -0
  98. package/dist/database/adapters/knex_database_adapter.js.map +1 -0
  99. package/dist/database/database_adapter.d.ts +262 -0
  100. package/dist/database/database_adapter.d.ts.map +1 -0
  101. package/dist/database/database_adapter.js +46 -0
  102. package/dist/database/database_adapter.js.map +1 -0
  103. package/dist/engine/digital_twin_engine.d.ts +295 -0
  104. package/dist/engine/digital_twin_engine.d.ts.map +1 -0
  105. package/dist/engine/digital_twin_engine.js +907 -0
  106. package/dist/engine/digital_twin_engine.js.map +1 -0
  107. package/dist/engine/endpoints.d.ts +47 -0
  108. package/dist/engine/endpoints.d.ts.map +1 -0
  109. package/dist/engine/endpoints.js +88 -0
  110. package/dist/engine/endpoints.js.map +1 -0
  111. package/dist/engine/error_handler.d.ts +20 -0
  112. package/dist/engine/error_handler.d.ts.map +1 -0
  113. package/dist/engine/error_handler.js +69 -0
  114. package/dist/engine/error_handler.js.map +1 -0
  115. package/dist/engine/events.d.ts +93 -0
  116. package/dist/engine/events.d.ts.map +1 -0
  117. package/dist/engine/events.js +71 -0
  118. package/dist/engine/events.js.map +1 -0
  119. package/dist/engine/health.d.ts +112 -0
  120. package/dist/engine/health.d.ts.map +1 -0
  121. package/dist/engine/health.js +190 -0
  122. package/dist/engine/health.js.map +1 -0
  123. package/dist/engine/initializer.d.ts +62 -0
  124. package/dist/engine/initializer.d.ts.map +1 -0
  125. package/dist/engine/initializer.js +108 -0
  126. package/dist/engine/initializer.js.map +1 -0
  127. package/dist/engine/queue_manager.d.ts +87 -0
  128. package/dist/engine/queue_manager.d.ts.map +1 -0
  129. package/dist/engine/queue_manager.js +196 -0
  130. package/dist/engine/queue_manager.js.map +1 -0
  131. package/dist/engine/scheduler.d.ts +30 -0
  132. package/dist/engine/scheduler.d.ts.map +1 -0
  133. package/dist/engine/scheduler.js +378 -0
  134. package/dist/engine/scheduler.js.map +1 -0
  135. package/dist/engine/upload_processor.d.ts +36 -0
  136. package/dist/engine/upload_processor.d.ts.map +1 -0
  137. package/dist/engine/upload_processor.js +113 -0
  138. package/dist/engine/upload_processor.js.map +1 -0
  139. package/dist/env/env.d.ts +134 -0
  140. package/dist/env/env.d.ts.map +1 -0
  141. package/dist/env/env.js +177 -0
  142. package/dist/env/env.js.map +1 -0
  143. package/dist/errors/index.d.ts +94 -0
  144. package/dist/errors/index.d.ts.map +1 -0
  145. package/dist/errors/index.js +149 -0
  146. package/dist/errors/index.js.map +1 -0
  147. package/dist/index.d.ts +55 -0
  148. package/dist/index.d.ts.map +1 -0
  149. package/dist/index.js +65 -0
  150. package/dist/index.js.map +1 -0
  151. package/dist/openapi/generator.d.ts +93 -0
  152. package/dist/openapi/generator.d.ts.map +1 -0
  153. package/dist/openapi/generator.js +293 -0
  154. package/dist/openapi/generator.js.map +1 -0
  155. package/dist/openapi/index.d.ts +9 -0
  156. package/dist/openapi/index.d.ts.map +1 -0
  157. package/dist/openapi/index.js +9 -0
  158. package/dist/openapi/index.js.map +1 -0
  159. package/dist/openapi/types.d.ts +182 -0
  160. package/dist/openapi/types.d.ts.map +1 -0
  161. package/dist/openapi/types.js +16 -0
  162. package/dist/openapi/types.js.map +1 -0
  163. package/dist/storage/adapters/local_storage_service.d.ts +57 -0
  164. package/dist/storage/adapters/local_storage_service.d.ts.map +1 -0
  165. package/dist/storage/adapters/local_storage_service.js +132 -0
  166. package/dist/storage/adapters/local_storage_service.js.map +1 -0
  167. package/dist/storage/adapters/ovh_storage_service.d.ts +72 -0
  168. package/dist/storage/adapters/ovh_storage_service.d.ts.map +1 -0
  169. package/dist/storage/adapters/ovh_storage_service.js +205 -0
  170. package/dist/storage/adapters/ovh_storage_service.js.map +1 -0
  171. package/dist/storage/storage_factory.d.ts +14 -0
  172. package/dist/storage/storage_factory.d.ts.map +1 -0
  173. package/dist/storage/storage_factory.js +43 -0
  174. package/dist/storage/storage_factory.js.map +1 -0
  175. package/dist/storage/storage_service.d.ts +163 -0
  176. package/dist/storage/storage_service.d.ts.map +1 -0
  177. package/dist/storage/storage_service.js +58 -0
  178. package/dist/storage/storage_service.js.map +1 -0
  179. package/dist/types/data_record.d.ts +123 -0
  180. package/dist/types/data_record.d.ts.map +1 -0
  181. package/dist/types/data_record.js +8 -0
  182. package/dist/types/data_record.js.map +1 -0
  183. package/dist/utils/graceful_shutdown.d.ts +44 -0
  184. package/dist/utils/graceful_shutdown.d.ts.map +1 -0
  185. package/dist/utils/graceful_shutdown.js +79 -0
  186. package/dist/utils/graceful_shutdown.js.map +1 -0
  187. package/dist/utils/http_responses.d.ts +175 -0
  188. package/dist/utils/http_responses.d.ts.map +1 -0
  189. package/dist/utils/http_responses.js +216 -0
  190. package/dist/utils/http_responses.js.map +1 -0
  191. package/dist/utils/index.d.ts +8 -0
  192. package/dist/utils/index.d.ts.map +1 -0
  193. package/dist/utils/index.js +6 -0
  194. package/dist/utils/index.js.map +1 -0
  195. package/dist/utils/logger.d.ts +74 -0
  196. package/dist/utils/logger.d.ts.map +1 -0
  197. package/dist/utils/logger.js +92 -0
  198. package/dist/utils/logger.js.map +1 -0
  199. package/dist/utils/map_to_data_record.d.ts +10 -0
  200. package/dist/utils/map_to_data_record.d.ts.map +1 -0
  201. package/dist/utils/map_to_data_record.js +36 -0
  202. package/dist/utils/map_to_data_record.js.map +1 -0
  203. package/dist/utils/safe_async.d.ts +50 -0
  204. package/dist/utils/safe_async.d.ts.map +1 -0
  205. package/dist/utils/safe_async.js +90 -0
  206. package/dist/utils/safe_async.js.map +1 -0
  207. package/dist/utils/servable_endpoint.d.ts +63 -0
  208. package/dist/utils/servable_endpoint.d.ts.map +1 -0
  209. package/dist/utils/servable_endpoint.js +67 -0
  210. package/dist/utils/servable_endpoint.js.map +1 -0
  211. package/dist/utils/zip_utils.d.ts +66 -0
  212. package/dist/utils/zip_utils.d.ts.map +1 -0
  213. package/dist/utils/zip_utils.js +169 -0
  214. package/dist/utils/zip_utils.js.map +1 -0
  215. package/dist/validation/index.d.ts +3 -0
  216. package/dist/validation/index.d.ts.map +1 -0
  217. package/dist/validation/index.js +7 -0
  218. package/dist/validation/index.js.map +1 -0
  219. package/dist/validation/schemas.d.ts +273 -0
  220. package/dist/validation/schemas.d.ts.map +1 -0
  221. package/dist/validation/schemas.js +82 -0
  222. package/dist/validation/schemas.js.map +1 -0
  223. package/dist/validation/validate.d.ts +49 -0
  224. package/dist/validation/validate.d.ts.map +1 -0
  225. package/dist/validation/validate.js +110 -0
  226. package/dist/validation/validate.js.map +1 -0
  227. package/package.json +23 -13
@@ -0,0 +1,406 @@
1
+ import { StorageError } from '../errors/index.js';
2
+ import { Logger } from '../utils/logger.js';
3
+ /**
4
+ * Utility class for parsing harvester source range configurations.
5
+ *
6
+ * Handles conversion of various source range formats (time-based like '1h', '30m'
7
+ * or count-based like '100') into structured date ranges for data retrieval.
8
+ *
9
+ * @example
10
+ * ```typescript
11
+ * // Parse time-based range: get data from last hour
12
+ * const result = SourceRangeParser.parseSourceRange(new Date(), '1h');
13
+ *
14
+ * // Parse count-based range: get last 50 records
15
+ * const result = SourceRangeParser.parseSourceRange(new Date(), 50);
16
+ * ```
17
+ */
18
+ class SourceRangeParser {
19
+ static { this.ZERO_DATE = new Date('1970-01-01T00:00:00Z'); }
20
+ /**
21
+ * Gets the zero date used as fallback for empty datasets.
22
+ *
23
+ * @returns Unix epoch date (1970-01-01T00:00:00Z)
24
+ */
25
+ static get zeroDate() {
26
+ return new Date(this.ZERO_DATE);
27
+ }
28
+ /**
29
+ * Parses source range configuration into a structured result.
30
+ *
31
+ * @param latestDate - The latest date in the existing data
32
+ * @param sourceRange - Range specification (e.g., '1h', '30m', '7d', or number for count)
33
+ * @returns Parsed range result with start/end dates or record limit
34
+ *
35
+ * @throws {Error} When source range format is invalid
36
+ */
37
+ static parseSourceRange(latestDate, sourceRange) {
38
+ if (!sourceRange) {
39
+ return { startDate: latestDate, limit: 1 };
40
+ }
41
+ // If it's a number or numeric string (limit mode)
42
+ if (typeof sourceRange === 'number' || /^\d+$/.test(sourceRange)) {
43
+ return { startDate: latestDate, limit: Number(sourceRange) };
44
+ }
45
+ const sourceRangeStr = sourceRange.toString();
46
+ let value;
47
+ let unit;
48
+ // Parse time-based ranges
49
+ if (sourceRangeStr.includes('d')) {
50
+ value = parseInt(sourceRangeStr.replace('d', ''));
51
+ unit = 'days';
52
+ }
53
+ else if (sourceRangeStr.includes('h')) {
54
+ value = parseInt(sourceRangeStr.replace('h', ''));
55
+ unit = 'hours';
56
+ }
57
+ else if (sourceRangeStr.includes('m')) {
58
+ value = parseInt(sourceRangeStr.replace('m', ''));
59
+ unit = 'minutes';
60
+ }
61
+ else if (sourceRangeStr.includes('s')) {
62
+ value = parseInt(sourceRangeStr.replace('s', ''));
63
+ unit = 'seconds';
64
+ }
65
+ else {
66
+ throw new Error(`Invalid source range format: ${sourceRange}`);
67
+ }
68
+ // For time-based ranges, start from latestDate and go forward
69
+ const startDate = latestDate;
70
+ const endDate = this.addTime(startDate, value, unit);
71
+ return { startDate, endDate };
72
+ }
73
+ /**
74
+ * Adds time to a date based on the specified unit.
75
+ *
76
+ * @param date - Base date to add time to
77
+ * @param value - Amount of time to add
78
+ * @param unit - Time unit ('days', 'hours', 'minutes', 'seconds')
79
+ * @returns New date with added time
80
+ */
81
+ static addTime(date, value, unit) {
82
+ const result = new Date(date);
83
+ switch (unit) {
84
+ case 'days':
85
+ result.setDate(result.getDate() + value);
86
+ break;
87
+ case 'hours':
88
+ result.setHours(result.getHours() + value);
89
+ break;
90
+ case 'minutes':
91
+ result.setMinutes(result.getMinutes() + value);
92
+ break;
93
+ case 'seconds':
94
+ result.setSeconds(result.getSeconds() + value);
95
+ break;
96
+ }
97
+ return result;
98
+ }
99
+ }
100
+ /**
101
+ * Abstract base class for data harvesting components.
102
+ *
103
+ * Harvesters process and analyze data that has been collected by Collectors,
104
+ * applying transformations, aggregations, or other data processing operations.
105
+ * They can be triggered by new source data or run on a schedule.
106
+ *
107
+ * Key features:
108
+ * - Process existing collected data with configurable ranges
109
+ * - Support both time-based and count-based data retrieval
110
+ * - Can be triggered by source data changes or scheduled execution
111
+ * - Provide HTTP endpoints for accessing processed results
112
+ *
113
+ * @example
114
+ * ```typescript
115
+ * class TrafficAnalysisHarvester extends Harvester {
116
+ * getUserConfiguration() {
117
+ * return {
118
+ * name: 'traffic-analysis',
119
+ * type: 'harvester',
120
+ * source: 'traffic-collector',
121
+ * source_range: '1h', // Process last hour of data
122
+ * schedule: '0 *\/15 * * * *' // Run every 15 minutes
123
+ * };
124
+ * }
125
+ *
126
+ * async harvest(data: DataRecord[]): Promise<DataRecord[]> {
127
+ * // Process traffic data and return analysis results
128
+ * return this.analyzeTrafficPatterns(data);
129
+ * }
130
+ * }
131
+ * ```
132
+ */
133
+ export class Harvester {
134
+ /**
135
+ * Injects database and storage dependencies into the harvester.
136
+ *
137
+ * Called during component initialization to provide access to
138
+ * data storage and file operations.
139
+ *
140
+ * @param db - Database adapter for reading source data
141
+ * @param storage - Storage service for file operations
142
+ */
143
+ setDependencies(db, storage) {
144
+ this.db = db;
145
+ this.storage = storage;
146
+ }
147
+ /**
148
+ * Returns the complete harvester configuration with defaults applied.
149
+ *
150
+ * Merges user configuration with sensible defaults for optional settings.
151
+ * This final configuration is used by the engine and scheduler.
152
+ *
153
+ * @returns Complete configuration with all defaults applied
154
+ */
155
+ getConfiguration() {
156
+ if (this._configCache) {
157
+ return this._configCache;
158
+ }
159
+ const userConfig = this.getUserConfiguration();
160
+ // Apply defaults first, then user config
161
+ const defaults = {
162
+ triggerMode: 'on-source',
163
+ source_range: 1,
164
+ multiple_results: false,
165
+ source_range_min: false,
166
+ debounceMs: 1000,
167
+ dependencies: [],
168
+ dependenciesLimit: []
169
+ };
170
+ this._configCache = {
171
+ ...defaults,
172
+ ...userConfig
173
+ };
174
+ return this._configCache;
175
+ }
176
+ /**
177
+ * Returns the cron schedule for this harvester.
178
+ *
179
+ * For 'on-source' trigger mode, returns empty string (no schedule).
180
+ * For 'scheduled' mode, uses the provided schedule or defaults to every minute.
181
+ *
182
+ * @returns Cron expression string or empty string for source-triggered mode
183
+ */
184
+ getSchedule() {
185
+ const config = this.getConfiguration();
186
+ if (config.triggerMode === 'on-source') {
187
+ return '';
188
+ }
189
+ // Default to every minute instead of every second
190
+ return '0 * * * * *';
191
+ }
192
+ /**
193
+ * Main execution method for the harvester.
194
+ *
195
+ * Orchestrates the harvesting process by:
196
+ * 1. Determining the date range for data retrieval
197
+ * 2. Fetching source and dependency data
198
+ * 3. Calling the harvest method with the data
199
+ * 4. Storing the results in the database
200
+ *
201
+ * @returns True if harvesting was successful, false if no data to process
202
+ *
203
+ * @throws {Error} When source component is not specified
204
+ * @throws {Error} When data processing fails
205
+ */
206
+ async run() {
207
+ const config = this.getConfiguration();
208
+ const logger = new Logger(`Harvester:${config.name}`);
209
+ if (!config.source) {
210
+ throw new Error(`Harvester ${config.name} must specify a source component`);
211
+ }
212
+ try {
213
+ // Get the latest harvested date
214
+ const latestHarvestedRecord = await this.db.getLatestByName(config.name);
215
+ // Calculate the starting point for harvesting
216
+ let latestDate;
217
+ if (!latestHarvestedRecord) {
218
+ // First run - get first source record and start from one second before
219
+ const firstSourceRecord = await this.db.getFirstByName(config.source);
220
+ if (!firstSourceRecord) {
221
+ return false;
222
+ }
223
+ latestDate = new Date(firstSourceRecord.date.getTime() - 1000);
224
+ }
225
+ else {
226
+ latestDate = latestHarvestedRecord.date;
227
+ }
228
+ // Parse source range
229
+ const { startDate, endDate, limit } = SourceRangeParser.parseSourceRange(latestDate, config.source_range);
230
+ // Get source data based on range
231
+ const sourceData = await this.getSourceData(config.source, startDate, endDate, limit);
232
+ if (!sourceData || sourceData.length === 0) {
233
+ return false;
234
+ }
235
+ // Check if we have enough data (strict mode)
236
+ if (limit && config.source_range_min && sourceData.length < limit) {
237
+ return false;
238
+ }
239
+ // Calculate storage date
240
+ const storageDate = endDate || sourceData[sourceData.length - 1].date;
241
+ // Prepare source data for harvesting
242
+ const sourceForHarvesting = limit === 1 && !endDate ? sourceData[0] : sourceData;
243
+ // Get dependencies data
244
+ const dependenciesData = await this.getDependenciesData(config.dependencies || [], config.dependenciesLimit || [], storageDate);
245
+ // Execute harvesting
246
+ const result = await this.harvest(sourceForHarvesting, dependenciesData);
247
+ // Store results
248
+ await this.storeResults(config, result, sourceData, storageDate);
249
+ return true;
250
+ }
251
+ catch (error) {
252
+ logger.error(`Harvester execution failed: ${error instanceof Error ? error.message : String(error)}`, {
253
+ harvesterName: config.name,
254
+ source: config.source,
255
+ stack: error instanceof Error ? error.stack : undefined
256
+ });
257
+ throw new StorageError(`Harvester ${config.name} execution failed: ${error instanceof Error ? error.message : String(error)}`, { harvesterName: config.name, source: config.source });
258
+ }
259
+ }
260
+ /**
261
+ * HTTP endpoints
262
+ */
263
+ getEndpoints() {
264
+ return [
265
+ {
266
+ method: 'get',
267
+ path: `/${this.getConfiguration().endpoint}`,
268
+ handler: this.retrieve.bind(this),
269
+ responseType: this.getConfiguration().contentType
270
+ }
271
+ ];
272
+ }
273
+ /**
274
+ * Retrieve latest harvested data
275
+ */
276
+ async retrieve() {
277
+ const config = this.getConfiguration();
278
+ const record = await this.db.getLatestByName(config.name);
279
+ if (!record) {
280
+ return {
281
+ status: 404,
282
+ content: 'No data available'
283
+ };
284
+ }
285
+ const blob = await record.data();
286
+ return {
287
+ status: 200,
288
+ content: blob,
289
+ headers: { 'Content-Type': record.contentType }
290
+ };
291
+ }
292
+ /**
293
+ * Get source data within the specified range
294
+ */
295
+ async getSourceData(sourceName, startDate, endDate, limit) {
296
+ let sourceData;
297
+ if (endDate) {
298
+ // Time-based range: get records between startDate and endDate
299
+ sourceData = await this.db.getByDateRange(sourceName, startDate, endDate, limit);
300
+ }
301
+ else if (limit) {
302
+ // Count-based: get records after startDate with limit
303
+ sourceData = await this.db.getAfterDate(sourceName, startDate, limit);
304
+ }
305
+ else {
306
+ // Default: get latest record after startDate
307
+ sourceData = await this.db.getAfterDate(sourceName, startDate, 1);
308
+ }
309
+ return sourceData;
310
+ }
311
+ /**
312
+ * Get data from dependent components
313
+ */
314
+ async getDependenciesData(dependencies, dependenciesLimit, storageDate) {
315
+ const dependenciesData = {};
316
+ for (let i = 0; i < dependencies.length; i++) {
317
+ const dependency = dependencies[i];
318
+ const limit = dependenciesLimit[i] || 1;
319
+ if (limit === 1) {
320
+ // Get single latest record before storage date
321
+ const dependencyRecord = await this.db.getLatestBefore(dependency, storageDate);
322
+ dependenciesData[dependency] = dependencyRecord || null;
323
+ }
324
+ else {
325
+ // Get multiple latest records before storage date
326
+ const dependencyRecords = await this.db.getLatestRecordsBefore(dependency, storageDate, limit);
327
+ dependenciesData[dependency] = dependencyRecords.length > 0 ? dependencyRecords : null;
328
+ }
329
+ }
330
+ return dependenciesData;
331
+ }
332
+ /**
333
+ * Store harvesting results
334
+ */
335
+ async storeResults(config, result, sourceData, storageDate) {
336
+ if (config.multiple_results && Array.isArray(result) && Array.isArray(sourceData)) {
337
+ // Store each result with its corresponding source date
338
+ for (let i = 0; i < result.length; i++) {
339
+ const item = result[i];
340
+ const source = sourceData[i];
341
+ const url = await this.storage.save(item, config.name);
342
+ await this.db.save({
343
+ name: config.name,
344
+ type: config.contentType,
345
+ url,
346
+ date: source.date
347
+ });
348
+ }
349
+ }
350
+ else {
351
+ // Store single result
352
+ const buffer = Array.isArray(result) ? result[0] : result;
353
+ const url = await this.storage.save(buffer, config.name);
354
+ await this.db.save({
355
+ name: config.name,
356
+ type: config.contentType,
357
+ url,
358
+ date: storageDate
359
+ });
360
+ }
361
+ }
362
+ /**
363
+ * Returns the OpenAPI specification for this harvester's endpoints.
364
+ *
365
+ * Generates documentation for the GET endpoint that retrieves harvested data.
366
+ * Can be overridden by subclasses for more detailed specifications.
367
+ *
368
+ * @returns {OpenAPIComponentSpec} OpenAPI paths, tags, and schemas for this harvester
369
+ */
370
+ getOpenAPISpec() {
371
+ const config = this.getConfiguration();
372
+ const path = `/${config.endpoint}`;
373
+ const tagName = config.tags?.[0] || config.name;
374
+ return {
375
+ paths: {
376
+ [path]: {
377
+ get: {
378
+ summary: `Get ${config.name} harvested data`,
379
+ description: config.description,
380
+ tags: [tagName],
381
+ responses: {
382
+ '200': {
383
+ description: 'Latest harvested data',
384
+ content: {
385
+ [config.contentType]: {
386
+ schema: { type: 'object' }
387
+ }
388
+ }
389
+ },
390
+ '404': {
391
+ description: 'No data available'
392
+ }
393
+ }
394
+ }
395
+ }
396
+ },
397
+ tags: [
398
+ {
399
+ name: tagName,
400
+ description: config.description
401
+ }
402
+ ]
403
+ };
404
+ }
405
+ }
406
+ //# 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,11 @@
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 { TilesetManager, type TilesetMetadataRow } from './tileset_manager.js';
6
+ export { MapManager, type MapLayerMetadataRow } from './map_manager.js';
7
+ export { GlobalAssetsHandler } from './global_assets_handler.js';
8
+ export { CustomTableManager, type CustomTableRecord, type QueryValidationOptions, type CustomTableComponent } from './custom_table_manager.js';
9
+ export { Component, Servable } from './interfaces.js';
10
+ export { ComponentConfiguration, AssetsConfiguration, DataResponse, StoreConfiguration, type EndpointDefinition } from './types.js';
11
+ //# 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,EACH,aAAa,EACb,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EAC1B,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,cAAc,EAAE,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAC9E,OAAO,EAAE,UAAU,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,EACH,kBAAkB,EAClB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EAC5B,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EACH,sBAAsB,EACtB,mBAAmB,EACnB,YAAY,EACZ,kBAAkB,EAClB,KAAK,kBAAkB,EAC1B,MAAM,YAAY,CAAA"}
@@ -0,0 +1,9 @@
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 { TilesetManager } from './tileset_manager.js';
6
+ export { MapManager } from './map_manager.js';
7
+ export { GlobalAssetsHandler } from './global_assets_handler.js';
8
+ export { CustomTableManager } from './custom_table_manager.js';
9
+ //# 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,EACH,aAAa,EAIhB,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,cAAc,EAA2B,MAAM,sBAAsB,CAAA;AAC9E,OAAO,EAAE,UAAU,EAA4B,MAAM,kBAAkB,CAAA;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAChE,OAAO,EACH,kBAAkB,EAIrB,MAAM,2BAA2B,CAAA"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * @fileoverview Core interfaces defining the contract for digital twin components
3
+ *
4
+ * These interfaces establish the foundation for component architecture, scheduling,
5
+ * and HTTP endpoint serving capabilities within the digital twin ecosystem.
6
+ */
7
+ import type { ComponentConfiguration } from './types.js';
8
+ import type { HttpMethod } from '../engine/endpoints.js';
9
+ /**
10
+ * Base interface for all digital twin components.
11
+ *
12
+ * Components are the fundamental building blocks of a digital twin system,
13
+ * each responsible for a specific aspect of data management or processing.
14
+ *
15
+ * @template T - The type of configuration object this component uses
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * class MyCollector implements Component<MyCollectorConfig> {
20
+ * getConfiguration(): MyCollectorConfig {
21
+ * return { name: 'my-collector', interval: 5000 };
22
+ * }
23
+ * }
24
+ * ```
25
+ */
26
+ export interface Component<T extends ComponentConfiguration = ComponentConfiguration> {
27
+ /**
28
+ * Returns the configuration object for this component.
29
+ *
30
+ * The configuration contains metadata about the component such as its name,
31
+ * type, scheduling information, and component-specific settings.
32
+ *
33
+ * @returns The component's configuration object
34
+ */
35
+ getConfiguration(): T;
36
+ }
37
+ /**
38
+ * Interface for components that can be scheduled to run periodically.
39
+ *
40
+ * Components implementing this interface can be automatically executed
41
+ * by the digital twin engine's scheduler based on a cron expression.
42
+ *
43
+ * @example
44
+ * ```typescript
45
+ * class DataCollector implements ScheduleRunnable {
46
+ * async run(): Promise<void> {
47
+ * // Collect and process data
48
+ * console.log('Collecting data...');
49
+ * }
50
+ *
51
+ * getSchedule(): string {
52
+ * return '0 *.5 * * * *'; // Every 5 minutes
53
+ * }
54
+ * }
55
+ * ```
56
+ */
57
+ export interface ScheduleRunnable {
58
+ /**
59
+ * Executes the component's main functionality.
60
+ *
61
+ * This method is called automatically by the scheduler according to
62
+ * the schedule returned by getSchedule(). Implementations should handle
63
+ * errors appropriately and return a promise that resolves when the
64
+ * operation is complete.
65
+ *
66
+ * @returns A promise that resolves when the run operation completes
67
+ */
68
+ run(): Promise<unknown>;
69
+ /**
70
+ * Returns the cron expression defining when this component should run.
71
+ *
72
+ * The schedule follows standard cron syntax (second minute hour day month dayOfWeek).
73
+ *
74
+ * @returns A cron expression string (e.g., '0 *.5 * * * *' for every 5 minutes)
75
+ */
76
+ getSchedule(): string;
77
+ }
78
+ /**
79
+ * Interface for components that can expose HTTP endpoints.
80
+ *
81
+ * Components implementing this interface can serve HTTP requests,
82
+ * allowing external systems to interact with the digital twin's data
83
+ * and functionality through REST APIs.
84
+ *
85
+ * @example
86
+ * ```typescript
87
+ * class DataProvider implements Servable {
88
+ * getEndpoints() {
89
+ * return [
90
+ * {
91
+ * method: 'GET',
92
+ * path: '/api/data',
93
+ * handler: this.getData.bind(this),
94
+ * responseType: 'application/json'
95
+ * }
96
+ * ];
97
+ * }
98
+ *
99
+ * private async getData() {
100
+ * return { data: 'example' };
101
+ * }
102
+ * }
103
+ * ```
104
+ */
105
+ export interface Servable {
106
+ /**
107
+ * Returns an array of HTTP endpoints this component exposes.
108
+ *
109
+ * Each endpoint defines the HTTP method, URL path, handler function,
110
+ * and optional response content type. The digital twin engine will
111
+ * automatically register these endpoints with the HTTP server.
112
+ *
113
+ * @returns Array of endpoint definitions
114
+ */
115
+ getEndpoints(): Array<{
116
+ /** HTTP method for this endpoint (GET, POST, PUT, DELETE, etc.) */
117
+ method: HttpMethod;
118
+ /** URL path for this endpoint (e.g., '/api/data') */
119
+ path: string;
120
+ /** Function to handle requests to this endpoint */
121
+ handler: (...args: any[]) => any;
122
+ /** Optional response content type (defaults to 'application/json') */
123
+ responseType?: string;
124
+ }>;
125
+ }
126
+ //# sourceMappingURL=interfaces.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/components/interfaces.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAExD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,sBAAsB,GAAG,sBAAsB;IAChF;;;;;;;OAOG;IACH,gBAAgB,IAAI,CAAC,CAAA;CACxB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,WAAW,gBAAgB;IAC7B;;;;;;;;;OASG;IACH,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;IAEvB;;;;;;OAMG;IACH,WAAW,IAAI,MAAM,CAAA;CACxB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,WAAW,QAAQ;IACrB;;;;;;;;OAQG;IACH,YAAY,IAAI,KAAK,CAAC;QAClB,mEAAmE;QACnE,MAAM,EAAE,UAAU,CAAA;QAClB,qDAAqD;QACrD,IAAI,EAAE,MAAM,CAAA;QACZ,mDAAmD;QACnD,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAA;QAChC,sEAAsE;QACtE,YAAY,CAAC,EAAE,MAAM,CAAA;KACxB,CAAC,CAAA;CACL"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @fileoverview Core interfaces defining the contract for digital twin components
3
+ *
4
+ * These interfaces establish the foundation for component architecture, scheduling,
5
+ * and HTTP endpoint serving capabilities within the digital twin ecosystem.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=interfaces.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/components/interfaces.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,61 @@
1
+ import { AssetsManager } from './assets_manager.js';
2
+ import type { DataResponse } from './types.js';
3
+ /**
4
+ * Extended metadata for map layer assets
5
+ */
6
+ export interface MapLayerMetadataRow {
7
+ id?: number;
8
+ name: string;
9
+ type: string;
10
+ url: string;
11
+ date: Date;
12
+ description: string;
13
+ source: string;
14
+ owner_id: number | null;
15
+ filename: string;
16
+ layer_type?: string;
17
+ layer_name?: string;
18
+ geometry_type?: string;
19
+ properties_count?: number;
20
+ }
21
+ /**
22
+ * Specialized Assets Manager for handling map layer data.
23
+ *
24
+ * Extends the base AssetsManager with specialized logic for:
25
+ * - Processing JSON layer objects containing map data
26
+ * - Extracting and analyzing layer metadata
27
+ * - Storing layer-specific information
28
+ *
29
+ * Inherits all CRUD endpoints from AssetsManager:
30
+ * - GET /{name} - List all layers
31
+ * - POST /{name}/upload - Upload layer data (overridden)
32
+ * - GET /{name}/:id - Get layer data
33
+ * - PUT /{name}/:id - Update layer metadata
34
+ * - DELETE /{name}/:id - Delete layer
35
+ * - GET /{name}/:id/download - Download layer data
36
+ */
37
+ export declare abstract class MapManager extends AssetsManager {
38
+ /**
39
+ * Override the upload handler to process JSON layer objects instead of files.
40
+ *
41
+ * Processes the layer data:
42
+ * 1. Validates the layer object structure
43
+ * 2. Extracts layer-specific metadata
44
+ * 3. Stores the layer data as JSON
45
+ *
46
+ * @param req - HTTP request with layer JSON data
47
+ * @returns DataResponse with upload result
48
+ */
49
+ handleUpload(req: any): Promise<DataResponse>;
50
+ /**
51
+ * Analyze layer content to extract metadata
52
+ * @param layer - The layer object to analyze
53
+ * @returns Layer metadata information
54
+ */
55
+ private analyzeLayerContent;
56
+ /**
57
+ * Override retrieve to include layer-specific metadata in the response
58
+ */
59
+ retrieve(): Promise<DataResponse>;
60
+ }
61
+ //# sourceMappingURL=map_manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"map_manager.d.ts","sourceRoot":"","sources":["../../src/components/map_manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAG9C;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,IAAI,CAAA;IACV,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,QAAQ,EAAE,MAAM,CAAA;IAEhB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAED;;;;;;;;;;;;;;;GAeG;AACH,8BAAsB,UAAW,SAAQ,aAAa;IAClD;;;;;;;;;;OAUG;IACG,YAAY,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC;IA+HnD;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IA+D3B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,YAAY,CAAC;CAwC1C"}