digitaltwin-core 0.13.3 → 0.14.1
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/package.json +101 -106
- package/dist/auth/apisix_parser.d.ts +0 -146
- package/dist/auth/apisix_parser.d.ts.map +0 -1
- package/dist/auth/apisix_parser.js +0 -185
- package/dist/auth/apisix_parser.js.map +0 -1
- package/dist/auth/auth_config.d.ts +0 -126
- package/dist/auth/auth_config.d.ts.map +0 -1
- package/dist/auth/auth_config.js +0 -169
- package/dist/auth/auth_config.js.map +0 -1
- package/dist/auth/index.d.ts +0 -5
- package/dist/auth/index.d.ts.map +0 -1
- package/dist/auth/index.js +0 -4
- package/dist/auth/index.js.map +0 -1
- package/dist/auth/types.d.ts +0 -100
- package/dist/auth/types.d.ts.map +0 -1
- package/dist/auth/types.js +0 -2
- package/dist/auth/types.js.map +0 -1
- package/dist/auth/user_service.d.ts +0 -86
- package/dist/auth/user_service.d.ts.map +0 -1
- package/dist/auth/user_service.js +0 -237
- package/dist/auth/user_service.js.map +0 -1
- package/dist/components/assets_manager.d.ts +0 -662
- package/dist/components/assets_manager.d.ts.map +0 -1
- package/dist/components/assets_manager.js +0 -1529
- package/dist/components/assets_manager.js.map +0 -1
- package/dist/components/async_upload.d.ts +0 -20
- package/dist/components/async_upload.d.ts.map +0 -1
- package/dist/components/async_upload.js +0 -10
- package/dist/components/async_upload.js.map +0 -1
- package/dist/components/collector.d.ts +0 -203
- package/dist/components/collector.d.ts.map +0 -1
- package/dist/components/collector.js +0 -202
- package/dist/components/collector.js.map +0 -1
- package/dist/components/custom_table_manager.d.ts +0 -503
- package/dist/components/custom_table_manager.d.ts.map +0 -1
- package/dist/components/custom_table_manager.js +0 -1052
- package/dist/components/custom_table_manager.js.map +0 -1
- package/dist/components/global_assets_handler.d.ts +0 -63
- package/dist/components/global_assets_handler.d.ts.map +0 -1
- package/dist/components/global_assets_handler.js +0 -127
- package/dist/components/global_assets_handler.js.map +0 -1
- package/dist/components/handler.d.ts +0 -104
- package/dist/components/handler.d.ts.map +0 -1
- package/dist/components/handler.js +0 -110
- package/dist/components/handler.js.map +0 -1
- package/dist/components/harvester.d.ts +0 -182
- package/dist/components/harvester.d.ts.map +0 -1
- package/dist/components/harvester.js +0 -393
- package/dist/components/harvester.js.map +0 -1
- package/dist/components/index.d.ts +0 -11
- package/dist/components/index.d.ts.map +0 -1
- package/dist/components/index.js +0 -9
- package/dist/components/index.js.map +0 -1
- package/dist/components/interfaces.d.ts +0 -126
- package/dist/components/interfaces.d.ts.map +0 -1
- package/dist/components/interfaces.js +0 -8
- package/dist/components/interfaces.js.map +0 -1
- package/dist/components/map_manager.d.ts +0 -61
- package/dist/components/map_manager.d.ts.map +0 -1
- package/dist/components/map_manager.js +0 -242
- package/dist/components/map_manager.js.map +0 -1
- package/dist/components/tileset_manager.d.ts +0 -125
- package/dist/components/tileset_manager.d.ts.map +0 -1
- package/dist/components/tileset_manager.js +0 -618
- package/dist/components/tileset_manager.js.map +0 -1
- package/dist/components/types.d.ts +0 -226
- package/dist/components/types.d.ts.map +0 -1
- package/dist/components/types.js +0 -8
- package/dist/components/types.js.map +0 -1
- package/dist/database/adapters/knex_database_adapter.d.ts +0 -92
- package/dist/database/adapters/knex_database_adapter.d.ts.map +0 -1
- package/dist/database/adapters/knex_database_adapter.js +0 -647
- package/dist/database/adapters/knex_database_adapter.js.map +0 -1
- package/dist/database/database_adapter.d.ts +0 -251
- package/dist/database/database_adapter.d.ts.map +0 -1
- package/dist/database/database_adapter.js +0 -46
- package/dist/database/database_adapter.js.map +0 -1
- package/dist/engine/digital_twin_engine.d.ts +0 -253
- package/dist/engine/digital_twin_engine.d.ts.map +0 -1
- package/dist/engine/digital_twin_engine.js +0 -790
- package/dist/engine/digital_twin_engine.js.map +0 -1
- package/dist/engine/endpoints.d.ts +0 -47
- package/dist/engine/endpoints.d.ts.map +0 -1
- package/dist/engine/endpoints.js +0 -56
- package/dist/engine/endpoints.js.map +0 -1
- package/dist/engine/events.d.ts +0 -93
- package/dist/engine/events.d.ts.map +0 -1
- package/dist/engine/events.js +0 -71
- package/dist/engine/events.js.map +0 -1
- package/dist/engine/initializer.d.ts +0 -62
- package/dist/engine/initializer.d.ts.map +0 -1
- package/dist/engine/initializer.js +0 -108
- package/dist/engine/initializer.js.map +0 -1
- package/dist/engine/queue_manager.d.ts +0 -87
- package/dist/engine/queue_manager.d.ts.map +0 -1
- package/dist/engine/queue_manager.js +0 -196
- package/dist/engine/queue_manager.js.map +0 -1
- package/dist/engine/scheduler.d.ts +0 -30
- package/dist/engine/scheduler.d.ts.map +0 -1
- package/dist/engine/scheduler.js +0 -370
- package/dist/engine/scheduler.js.map +0 -1
- package/dist/engine/upload_processor.d.ts +0 -36
- package/dist/engine/upload_processor.d.ts.map +0 -1
- package/dist/engine/upload_processor.js +0 -101
- package/dist/engine/upload_processor.js.map +0 -1
- package/dist/env/env.d.ts +0 -134
- package/dist/env/env.d.ts.map +0 -1
- package/dist/env/env.js +0 -177
- package/dist/env/env.js.map +0 -1
- package/dist/index.d.ts +0 -49
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -57
- package/dist/index.js.map +0 -1
- package/dist/openapi/generator.d.ts +0 -93
- package/dist/openapi/generator.d.ts.map +0 -1
- package/dist/openapi/generator.js +0 -293
- package/dist/openapi/generator.js.map +0 -1
- package/dist/openapi/index.d.ts +0 -9
- package/dist/openapi/index.d.ts.map +0 -1
- package/dist/openapi/index.js +0 -9
- package/dist/openapi/index.js.map +0 -1
- package/dist/openapi/types.d.ts +0 -182
- package/dist/openapi/types.d.ts.map +0 -1
- package/dist/openapi/types.js +0 -16
- package/dist/openapi/types.js.map +0 -1
- package/dist/storage/adapters/local_storage_service.d.ts +0 -51
- package/dist/storage/adapters/local_storage_service.d.ts.map +0 -1
- package/dist/storage/adapters/local_storage_service.js +0 -110
- package/dist/storage/adapters/local_storage_service.js.map +0 -1
- package/dist/storage/adapters/ovh_storage_service.d.ts +0 -61
- package/dist/storage/adapters/ovh_storage_service.d.ts.map +0 -1
- package/dist/storage/adapters/ovh_storage_service.js +0 -172
- package/dist/storage/adapters/ovh_storage_service.js.map +0 -1
- package/dist/storage/storage_factory.d.ts +0 -14
- package/dist/storage/storage_factory.d.ts.map +0 -1
- package/dist/storage/storage_factory.js +0 -36
- package/dist/storage/storage_factory.js.map +0 -1
- package/dist/storage/storage_service.d.ts +0 -163
- package/dist/storage/storage_service.d.ts.map +0 -1
- package/dist/storage/storage_service.js +0 -54
- package/dist/storage/storage_service.js.map +0 -1
- package/dist/types/data_record.d.ts +0 -123
- package/dist/types/data_record.d.ts.map +0 -1
- package/dist/types/data_record.js +0 -8
- package/dist/types/data_record.js.map +0 -1
- package/dist/utils/http_responses.d.ts +0 -155
- package/dist/utils/http_responses.d.ts.map +0 -1
- package/dist/utils/http_responses.js +0 -190
- package/dist/utils/http_responses.js.map +0 -1
- package/dist/utils/index.d.ts +0 -8
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -6
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -74
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js +0 -92
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/map_to_data_record.d.ts +0 -10
- package/dist/utils/map_to_data_record.d.ts.map +0 -1
- package/dist/utils/map_to_data_record.js +0 -36
- package/dist/utils/map_to_data_record.js.map +0 -1
- package/dist/utils/servable_endpoint.d.ts +0 -63
- package/dist/utils/servable_endpoint.d.ts.map +0 -1
- package/dist/utils/servable_endpoint.js +0 -67
- package/dist/utils/servable_endpoint.js.map +0 -1
- package/dist/utils/zip_utils.d.ts +0 -66
- package/dist/utils/zip_utils.d.ts.map +0 -1
- package/dist/utils/zip_utils.js +0 -169
- package/dist/utils/zip_utils.js.map +0 -1
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
import { StorageService } from '../storage_service.js';
|
|
2
|
-
import fs from 'fs/promises';
|
|
3
|
-
import path from 'path';
|
|
4
|
-
/**
|
|
5
|
-
* Local filesystem-based implementation of the StorageService.
|
|
6
|
-
* Saves files in a configured folder using a timestamp as filename.
|
|
7
|
-
*/
|
|
8
|
-
export class LocalStorageService extends StorageService {
|
|
9
|
-
constructor(baseDir = 'data') {
|
|
10
|
-
super();
|
|
11
|
-
this.baseDir = baseDir;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Saves the given buffer to disk under a unique filename.
|
|
15
|
-
* @param buffer - Content to save
|
|
16
|
-
* @param collectorName - Name of the collector (used for folder)
|
|
17
|
-
* @param extension - Optional file extension (e.g. 'json', 'txt')
|
|
18
|
-
* @returns Relative path to the saved file
|
|
19
|
-
*/
|
|
20
|
-
async save(buffer, collectorName, extension) {
|
|
21
|
-
const now = new Date();
|
|
22
|
-
const timestamp = now.toISOString().replace(/[:.]/g, '-');
|
|
23
|
-
const folder = collectorName || 'default';
|
|
24
|
-
const filename = extension ? `${timestamp}.${extension}` : timestamp;
|
|
25
|
-
const dirPath = path.join(this.baseDir, folder);
|
|
26
|
-
const filePath = path.join(dirPath, filename);
|
|
27
|
-
await fs.mkdir(dirPath, { recursive: true });
|
|
28
|
-
await fs.writeFile(filePath, buffer);
|
|
29
|
-
// return relative path (e.g., 'mycollector/2025-07-07T15-45-22-456Z.json')
|
|
30
|
-
return path.join(folder, filename);
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Retrieves a file as buffer using its relative path.
|
|
34
|
-
* @param relativePath - Filename previously returned by `save`
|
|
35
|
-
* @returns File content as Buffer
|
|
36
|
-
*/
|
|
37
|
-
async retrieve(relativePath) {
|
|
38
|
-
const filePath = path.join(this.baseDir, relativePath);
|
|
39
|
-
return fs.readFile(filePath);
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Deletes a stored file.
|
|
43
|
-
* @param relativePath - Filename previously returned by `save`
|
|
44
|
-
*/
|
|
45
|
-
async delete(relativePath) {
|
|
46
|
-
const filePath = path.join(this.baseDir, relativePath);
|
|
47
|
-
await fs.rm(filePath, { force: true });
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Saves the given buffer to disk at a specific path (preserves filename).
|
|
51
|
-
* Unlike save(), this method does not auto-generate a timestamp filename.
|
|
52
|
-
* @param buffer - Content to save
|
|
53
|
-
* @param relativePath - Full relative path including filename (e.g., 'tilesets/123/tileset.json')
|
|
54
|
-
* @returns The same relative path that was provided
|
|
55
|
-
*/
|
|
56
|
-
async saveWithPath(buffer, relativePath) {
|
|
57
|
-
const filePath = path.join(this.baseDir, relativePath);
|
|
58
|
-
const dirPath = path.dirname(filePath);
|
|
59
|
-
await fs.mkdir(dirPath, { recursive: true });
|
|
60
|
-
await fs.writeFile(filePath, buffer);
|
|
61
|
-
return relativePath;
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Returns a local file path for the stored file.
|
|
65
|
-
* Note: For local storage, this returns a relative file path, not an HTTP URL.
|
|
66
|
-
* In production, use a cloud storage service (OVH, S3) for public URLs.
|
|
67
|
-
* @param relativePath - The storage path of the file
|
|
68
|
-
* @returns The file path (relative to baseDir)
|
|
69
|
-
*/
|
|
70
|
-
getPublicUrl(relativePath) {
|
|
71
|
-
// For local storage, return the file path
|
|
72
|
-
// In a real deployment, you'd need Express static serving or similar
|
|
73
|
-
return path.join(this.baseDir, relativePath);
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Deletes all files under a given prefix (folder).
|
|
77
|
-
* @param prefix - The folder/prefix to delete (e.g., 'tilesets/123')
|
|
78
|
-
* @returns Number of files deleted
|
|
79
|
-
*/
|
|
80
|
-
async deleteByPrefix(prefix) {
|
|
81
|
-
const folderPath = path.join(this.baseDir, prefix);
|
|
82
|
-
try {
|
|
83
|
-
// Check if folder exists
|
|
84
|
-
await fs.access(folderPath);
|
|
85
|
-
// Count files before deletion
|
|
86
|
-
const countFiles = async (dir) => {
|
|
87
|
-
let count = 0;
|
|
88
|
-
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
89
|
-
for (const entry of entries) {
|
|
90
|
-
if (entry.isDirectory()) {
|
|
91
|
-
count += await countFiles(path.join(dir, entry.name));
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
count++;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
return count;
|
|
98
|
-
};
|
|
99
|
-
const fileCount = await countFiles(folderPath);
|
|
100
|
-
// Delete folder recursively
|
|
101
|
-
await fs.rm(folderPath, { recursive: true, force: true });
|
|
102
|
-
return fileCount;
|
|
103
|
-
}
|
|
104
|
-
catch {
|
|
105
|
-
// Folder doesn't exist
|
|
106
|
-
return 0;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
//# sourceMappingURL=local_storage_service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"local_storage_service.js","sourceRoot":"","sources":["../../../src/storage/adapters/local_storage_service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { StorageService } from '../storage_service.js';
|
|
2
|
-
export interface OvhS3Config {
|
|
3
|
-
accessKey: string;
|
|
4
|
-
secretKey: string;
|
|
5
|
-
endpoint: string;
|
|
6
|
-
region?: string;
|
|
7
|
-
bucket: string;
|
|
8
|
-
}
|
|
9
|
-
export declare class OvhS3StorageService extends StorageService {
|
|
10
|
-
#private;
|
|
11
|
-
constructor(config: OvhS3Config);
|
|
12
|
-
/**
|
|
13
|
-
* Uploads a file to the OVH S3-compatible object storage.
|
|
14
|
-
* @param buffer - File contents to upload
|
|
15
|
-
* @param collectorName - Folder/prefix to store under
|
|
16
|
-
* @param extension - Optional file extension (e.g. 'json')
|
|
17
|
-
* @returns The relative path (key) of the stored object
|
|
18
|
-
*/
|
|
19
|
-
save(buffer: Buffer, collectorName: string, extension?: string): Promise<string>;
|
|
20
|
-
/**
|
|
21
|
-
* Downloads and returns a stored object as a Buffer.
|
|
22
|
-
* @param relativePath - The key/path of the object to retrieve
|
|
23
|
-
* @returns The object contents as a Buffer
|
|
24
|
-
*/
|
|
25
|
-
retrieve(relativePath: string): Promise<Buffer>;
|
|
26
|
-
/**
|
|
27
|
-
* Deletes an object from the storage bucket.
|
|
28
|
-
* @param relativePath - The key/path of the object to delete
|
|
29
|
-
*/
|
|
30
|
-
delete(relativePath: string): Promise<void>;
|
|
31
|
-
/**
|
|
32
|
-
* Uploads a file to OVH S3 at a specific path (preserves filename).
|
|
33
|
-
* Unlike save(), this method does not auto-generate a timestamp filename.
|
|
34
|
-
* Files are uploaded with public-read ACL for direct access (e.g., Cesium tilesets).
|
|
35
|
-
* @param buffer - File contents to upload
|
|
36
|
-
* @param relativePath - Full relative path including filename (e.g., 'tilesets/123/tileset.json')
|
|
37
|
-
* @returns The same relative path that was provided
|
|
38
|
-
*/
|
|
39
|
-
saveWithPath(buffer: Buffer, relativePath: string): Promise<string>;
|
|
40
|
-
/**
|
|
41
|
-
* Deletes multiple objects in batch using S3 DeleteObjects API.
|
|
42
|
-
* Much faster than individual deletes - can delete up to 1000 objects per request.
|
|
43
|
-
* @param paths - Array of object keys to delete
|
|
44
|
-
*/
|
|
45
|
-
deleteBatch(paths: string[]): Promise<void>;
|
|
46
|
-
/**
|
|
47
|
-
* Returns the public URL for a stored file.
|
|
48
|
-
* Constructs the OVH S3 public URL format: https://{bucket}.{endpoint_host}/{key}
|
|
49
|
-
* @param relativePath - The storage path/key of the file
|
|
50
|
-
* @returns The public URL to access the file directly
|
|
51
|
-
*/
|
|
52
|
-
getPublicUrl(relativePath: string): string;
|
|
53
|
-
/**
|
|
54
|
-
* Deletes all objects under a given prefix (folder).
|
|
55
|
-
* Lists objects by prefix and deletes them in batches for performance.
|
|
56
|
-
* @param prefix - The folder/prefix to delete (e.g., 'tilesets/123')
|
|
57
|
-
* @returns Number of files deleted
|
|
58
|
-
*/
|
|
59
|
-
deleteByPrefix(prefix: string): Promise<number>;
|
|
60
|
-
}
|
|
61
|
-
//# sourceMappingURL=ovh_storage_service.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ovh_storage_service.d.ts","sourceRoot":"","sources":["../../../src/storage/adapters/ovh_storage_service.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAGtD,MAAM,WAAW,WAAW;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;CACjB;AAED,qBAAa,mBAAoB,SAAQ,cAAc;;gBAKvC,MAAM,EAAE,WAAW;IAkB/B;;;;;;OAMG;IACG,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBtF;;;;OAIG;IACG,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkBrD;;;OAGG;IACG,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASjD;;;;;;;OAOG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAazE;;;;OAIG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAmCjD;;;;;OAKG;IACH,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IAO1C;;;;;OAKG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAyCxD"}
|
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* OVH Object Storage implementation of StorageService
|
|
3
|
-
* via S3-compatible API using @aws-sdk/client-s3
|
|
4
|
-
*/
|
|
5
|
-
import { S3Client, PutObjectCommand, GetObjectCommand, DeleteObjectCommand, DeleteObjectsCommand, ListObjectsV2Command, ObjectCannedACL } from '@aws-sdk/client-s3';
|
|
6
|
-
import { StorageService } from '../storage_service.js';
|
|
7
|
-
export class OvhS3StorageService extends StorageService {
|
|
8
|
-
#s3;
|
|
9
|
-
#bucket;
|
|
10
|
-
#endpoint;
|
|
11
|
-
constructor(config) {
|
|
12
|
-
super();
|
|
13
|
-
this.#bucket = config.bucket;
|
|
14
|
-
this.#endpoint = config.endpoint;
|
|
15
|
-
this.#s3 = new S3Client({
|
|
16
|
-
endpoint: config.endpoint,
|
|
17
|
-
region: config.region ?? 'gra',
|
|
18
|
-
credentials: {
|
|
19
|
-
accessKeyId: config.accessKey,
|
|
20
|
-
secretAccessKey: config.secretKey
|
|
21
|
-
},
|
|
22
|
-
forcePathStyle: false,
|
|
23
|
-
// Match Python boto3 config for OVH compatibility
|
|
24
|
-
requestChecksumCalculation: 'WHEN_REQUIRED',
|
|
25
|
-
responseChecksumValidation: 'WHEN_REQUIRED'
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Uploads a file to the OVH S3-compatible object storage.
|
|
30
|
-
* @param buffer - File contents to upload
|
|
31
|
-
* @param collectorName - Folder/prefix to store under
|
|
32
|
-
* @param extension - Optional file extension (e.g. 'json')
|
|
33
|
-
* @returns The relative path (key) of the stored object
|
|
34
|
-
*/
|
|
35
|
-
async save(buffer, collectorName, extension) {
|
|
36
|
-
const now = new Date();
|
|
37
|
-
const timestamp = now.toISOString().replace(/[:.]/g, '-');
|
|
38
|
-
const key = `${collectorName || 'default'}/${timestamp}${extension ? '.' + extension : ''}`;
|
|
39
|
-
await this.#s3.send(new PutObjectCommand({
|
|
40
|
-
Bucket: this.#bucket,
|
|
41
|
-
Key: key,
|
|
42
|
-
Body: buffer,
|
|
43
|
-
ACL: ObjectCannedACL.private
|
|
44
|
-
}));
|
|
45
|
-
return key;
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Downloads and returns a stored object as a Buffer.
|
|
49
|
-
* @param relativePath - The key/path of the object to retrieve
|
|
50
|
-
* @returns The object contents as a Buffer
|
|
51
|
-
*/
|
|
52
|
-
async retrieve(relativePath) {
|
|
53
|
-
const res = await this.#s3.send(new GetObjectCommand({
|
|
54
|
-
Bucket: this.#bucket,
|
|
55
|
-
Key: relativePath
|
|
56
|
-
}));
|
|
57
|
-
const chunks = [];
|
|
58
|
-
const stream = res.Body;
|
|
59
|
-
for await (const chunk of stream) {
|
|
60
|
-
chunks.push(Buffer.from(chunk));
|
|
61
|
-
}
|
|
62
|
-
return Buffer.concat(chunks);
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Deletes an object from the storage bucket.
|
|
66
|
-
* @param relativePath - The key/path of the object to delete
|
|
67
|
-
*/
|
|
68
|
-
async delete(relativePath) {
|
|
69
|
-
await this.#s3.send(new DeleteObjectCommand({
|
|
70
|
-
Bucket: this.#bucket,
|
|
71
|
-
Key: relativePath
|
|
72
|
-
}));
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Uploads a file to OVH S3 at a specific path (preserves filename).
|
|
76
|
-
* Unlike save(), this method does not auto-generate a timestamp filename.
|
|
77
|
-
* Files are uploaded with public-read ACL for direct access (e.g., Cesium tilesets).
|
|
78
|
-
* @param buffer - File contents to upload
|
|
79
|
-
* @param relativePath - Full relative path including filename (e.g., 'tilesets/123/tileset.json')
|
|
80
|
-
* @returns The same relative path that was provided
|
|
81
|
-
*/
|
|
82
|
-
async saveWithPath(buffer, relativePath) {
|
|
83
|
-
await this.#s3.send(new PutObjectCommand({
|
|
84
|
-
Bucket: this.#bucket,
|
|
85
|
-
Key: relativePath,
|
|
86
|
-
Body: buffer,
|
|
87
|
-
ACL: ObjectCannedACL.public_read
|
|
88
|
-
}));
|
|
89
|
-
return relativePath;
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Deletes multiple objects in batch using S3 DeleteObjects API.
|
|
93
|
-
* Much faster than individual deletes - can delete up to 1000 objects per request.
|
|
94
|
-
* @param paths - Array of object keys to delete
|
|
95
|
-
*/
|
|
96
|
-
async deleteBatch(paths) {
|
|
97
|
-
if (paths.length === 0)
|
|
98
|
-
return;
|
|
99
|
-
// S3 DeleteObjects supports max 1000 objects per request
|
|
100
|
-
const BATCH_SIZE = 1000;
|
|
101
|
-
const batches = [];
|
|
102
|
-
for (let i = 0; i < paths.length; i += BATCH_SIZE) {
|
|
103
|
-
batches.push(paths.slice(i, i + BATCH_SIZE));
|
|
104
|
-
}
|
|
105
|
-
// Process batches in parallel (but limit concurrency to avoid overwhelming the API)
|
|
106
|
-
const MAX_CONCURRENT = 5;
|
|
107
|
-
for (let i = 0; i < batches.length; i += MAX_CONCURRENT) {
|
|
108
|
-
const concurrentBatches = batches.slice(i, i + MAX_CONCURRENT);
|
|
109
|
-
await Promise.all(concurrentBatches.map(batch => this.#s3
|
|
110
|
-
.send(new DeleteObjectsCommand({
|
|
111
|
-
Bucket: this.#bucket,
|
|
112
|
-
Delete: {
|
|
113
|
-
Objects: batch.map(key => ({ Key: key })),
|
|
114
|
-
Quiet: true // Don't return info about each deleted object
|
|
115
|
-
}
|
|
116
|
-
}))
|
|
117
|
-
.catch(() => {
|
|
118
|
-
// Ignore batch delete errors - files may already be deleted
|
|
119
|
-
})));
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Returns the public URL for a stored file.
|
|
124
|
-
* Constructs the OVH S3 public URL format: https://{bucket}.{endpoint_host}/{key}
|
|
125
|
-
* @param relativePath - The storage path/key of the file
|
|
126
|
-
* @returns The public URL to access the file directly
|
|
127
|
-
*/
|
|
128
|
-
getPublicUrl(relativePath) {
|
|
129
|
-
// Extract host from endpoint (e.g., 'https://s3.gra.io.cloud.ovh.net' -> 's3.gra.io.cloud.ovh.net')
|
|
130
|
-
const endpointHost = this.#endpoint.replace(/^https?:\/\//, '');
|
|
131
|
-
// OVH S3 URL format: https://{bucket}.{endpoint_host}/{key}
|
|
132
|
-
return `https://${this.#bucket}.${endpointHost}/${relativePath}`;
|
|
133
|
-
}
|
|
134
|
-
/**
|
|
135
|
-
* Deletes all objects under a given prefix (folder).
|
|
136
|
-
* Lists objects by prefix and deletes them in batches for performance.
|
|
137
|
-
* @param prefix - The folder/prefix to delete (e.g., 'tilesets/123')
|
|
138
|
-
* @returns Number of files deleted
|
|
139
|
-
*/
|
|
140
|
-
async deleteByPrefix(prefix) {
|
|
141
|
-
let totalDeleted = 0;
|
|
142
|
-
let continuationToken;
|
|
143
|
-
// Ensure prefix ends with '/' to avoid partial matches
|
|
144
|
-
const normalizedPrefix = prefix.endsWith('/') ? prefix : `${prefix}/`;
|
|
145
|
-
do {
|
|
146
|
-
// List objects with prefix (max 1000 per request)
|
|
147
|
-
const listResponse = await this.#s3.send(new ListObjectsV2Command({
|
|
148
|
-
Bucket: this.#bucket,
|
|
149
|
-
Prefix: normalizedPrefix,
|
|
150
|
-
ContinuationToken: continuationToken
|
|
151
|
-
}));
|
|
152
|
-
const objects = listResponse.Contents || [];
|
|
153
|
-
if (objects.length === 0)
|
|
154
|
-
break;
|
|
155
|
-
// Delete objects in batch
|
|
156
|
-
const keys = objects.map(obj => obj.Key).filter((key) => !!key);
|
|
157
|
-
if (keys.length > 0) {
|
|
158
|
-
await this.#s3.send(new DeleteObjectsCommand({
|
|
159
|
-
Bucket: this.#bucket,
|
|
160
|
-
Delete: {
|
|
161
|
-
Objects: keys.map(key => ({ Key: key })),
|
|
162
|
-
Quiet: true
|
|
163
|
-
}
|
|
164
|
-
}));
|
|
165
|
-
totalDeleted += keys.length;
|
|
166
|
-
}
|
|
167
|
-
continuationToken = listResponse.NextContinuationToken;
|
|
168
|
-
} while (continuationToken);
|
|
169
|
-
return totalDeleted;
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
//# sourceMappingURL=ovh_storage_service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ovh_storage_service.js","sourceRoot":"","sources":["../../../src/storage/adapters/ovh_storage_service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { StorageService } from './storage_service.js';
|
|
2
|
-
export declare class StorageServiceFactory {
|
|
3
|
-
/**
|
|
4
|
-
* Creates and returns an instance of StorageService
|
|
5
|
-
* based on the STORAGE_CONFIG environment variable.
|
|
6
|
-
*
|
|
7
|
-
* - 'local': returns a LocalStorageService
|
|
8
|
-
* - 'ovh': returns an OvhS3StorageService
|
|
9
|
-
*
|
|
10
|
-
* @throws Error if STORAGE_CONFIG is not supported
|
|
11
|
-
*/
|
|
12
|
-
static create(): StorageService;
|
|
13
|
-
}
|
|
14
|
-
//# sourceMappingURL=storage_factory.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"storage_factory.d.ts","sourceRoot":"","sources":["../../src/storage/storage_factory.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAE1D,qBAAa,qBAAqB;IAC9B;;;;;;;;OAQG;IACH,MAAM,CAAC,MAAM,IAAI,cAAc;CAoBlC"}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Factory class for creating the appropriate StorageService
|
|
3
|
-
* implementation based on environment configuration.
|
|
4
|
-
*/
|
|
5
|
-
import { Env } from '../env/env.js';
|
|
6
|
-
import { OvhS3StorageService } from './adapters/ovh_storage_service.js';
|
|
7
|
-
import { LocalStorageService } from './adapters/local_storage_service.js';
|
|
8
|
-
export class StorageServiceFactory {
|
|
9
|
-
/**
|
|
10
|
-
* Creates and returns an instance of StorageService
|
|
11
|
-
* based on the STORAGE_CONFIG environment variable.
|
|
12
|
-
*
|
|
13
|
-
* - 'local': returns a LocalStorageService
|
|
14
|
-
* - 'ovh': returns an OvhS3StorageService
|
|
15
|
-
*
|
|
16
|
-
* @throws Error if STORAGE_CONFIG is not supported
|
|
17
|
-
*/
|
|
18
|
-
static create() {
|
|
19
|
-
const env = Env.config;
|
|
20
|
-
switch (env.STORAGE_CONFIG) {
|
|
21
|
-
case 'local':
|
|
22
|
-
return new LocalStorageService(env.LOCAL_STORAGE_DIR || 'data');
|
|
23
|
-
case 'ovh':
|
|
24
|
-
return new OvhS3StorageService({
|
|
25
|
-
accessKey: env.OVH_ACCESS_KEY,
|
|
26
|
-
secretKey: env.OVH_SECRET_KEY,
|
|
27
|
-
endpoint: env.OVH_ENDPOINT,
|
|
28
|
-
bucket: env.OVH_BUCKET,
|
|
29
|
-
region: env.OVH_REGION ?? 'gra'
|
|
30
|
-
});
|
|
31
|
-
default:
|
|
32
|
-
throw new Error(`Unsupported STORAGE_CONFIG: ${env.STORAGE_CONFIG}`);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
//# sourceMappingURL=storage_factory.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"storage_factory.js","sourceRoot":"","sources":["../../src/storage/storage_factory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAA;AACnC,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAA;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAA;AAGzE,MAAM,OAAO,qBAAqB;IAC9B;;;;;;;;OAQG;IACH,MAAM,CAAC,MAAM;QACT,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAA;QAEtB,QAAQ,GAAG,CAAC,cAAc,EAAE,CAAC;YACzB,KAAK,OAAO;gBACR,OAAO,IAAI,mBAAmB,CAAC,GAAG,CAAC,iBAAiB,IAAI,MAAM,CAAC,CAAA;YAEnE,KAAK,KAAK;gBACN,OAAO,IAAI,mBAAmB,CAAC;oBAC3B,SAAS,EAAE,GAAG,CAAC,cAAc;oBAC7B,SAAS,EAAE,GAAG,CAAC,cAAc;oBAC7B,QAAQ,EAAE,GAAG,CAAC,YAAY;oBAC1B,MAAM,EAAE,GAAG,CAAC,UAAU;oBACtB,MAAM,EAAE,GAAG,CAAC,UAAU,IAAI,KAAK;iBAClC,CAAC,CAAA;YAEN;gBACI,MAAM,IAAI,KAAK,CAAC,+BAA+B,GAAG,CAAC,cAAc,EAAE,CAAC,CAAA;QAC5E,CAAC;IACL,CAAC;CACJ"}
|
|
@@ -1,163 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Abstract base class for storage service implementations.
|
|
3
|
-
*
|
|
4
|
-
* Defines the contract for persisting and retrieving binary data in the Digital Twin framework.
|
|
5
|
-
* Concrete implementations provide storage backends like local filesystem, AWS S3, Azure Blob, etc.
|
|
6
|
-
*
|
|
7
|
-
* @abstract
|
|
8
|
-
* @class StorageService
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* ```typescript
|
|
12
|
-
* // Implement for specific storage backend
|
|
13
|
-
* class S3StorageService extends StorageService {
|
|
14
|
-
* async save(buffer: Buffer, collectorName: string, extension?: string): Promise<string> {
|
|
15
|
-
* // Upload to S3 bucket
|
|
16
|
-
* return 's3://bucket/path/to/file'
|
|
17
|
-
* }
|
|
18
|
-
*
|
|
19
|
-
* async retrieve(path: string): Promise<Buffer> {
|
|
20
|
-
* // Download from S3
|
|
21
|
-
* return buffer
|
|
22
|
-
* }
|
|
23
|
-
*
|
|
24
|
-
* async delete(path: string): Promise<void> {
|
|
25
|
-
* // Delete from S3
|
|
26
|
-
* }
|
|
27
|
-
* }
|
|
28
|
-
* ```
|
|
29
|
-
*/
|
|
30
|
-
export declare abstract class StorageService {
|
|
31
|
-
/**
|
|
32
|
-
* Persists binary data and returns a unique identifier for retrieval.
|
|
33
|
-
*
|
|
34
|
-
* The storage implementation should ensure the returned path/URL is unique
|
|
35
|
-
* and can be used later to retrieve the exact same data.
|
|
36
|
-
*
|
|
37
|
-
* @abstract
|
|
38
|
-
* @param {Buffer} buffer - Binary data to store
|
|
39
|
-
* @param {string} collectorName - Component name for organizing storage (used as folder/prefix)
|
|
40
|
-
* @param {string} extension - Optional file extension for proper content handling
|
|
41
|
-
* @returns {Promise<string>} Unique storage identifier (path, URL, or key)
|
|
42
|
-
* @throws {Error} When storage operation fails
|
|
43
|
-
*
|
|
44
|
-
* @example
|
|
45
|
-
* ```typescript
|
|
46
|
-
* const buffer = Buffer.from('{"temperature": 23.5}')
|
|
47
|
-
* const path = await storage.save(buffer, 'weather-sensor', 'json')
|
|
48
|
-
* // Returns: '/storage/weather-sensor/2024-01-15_14-30-00.json'
|
|
49
|
-
* ```
|
|
50
|
-
*/
|
|
51
|
-
abstract save(buffer: Buffer, collectorName: string, extension?: string): Promise<string>;
|
|
52
|
-
/**
|
|
53
|
-
* Retrieves previously stored binary data.
|
|
54
|
-
*
|
|
55
|
-
* Uses the identifier returned by save() to fetch the original data.
|
|
56
|
-
*
|
|
57
|
-
* @abstract
|
|
58
|
-
* @param {string} path - Storage identifier from save() operation
|
|
59
|
-
* @returns {Promise<Buffer>} The original binary data
|
|
60
|
-
* @throws {Error} When file doesn't exist or retrieval fails
|
|
61
|
-
*
|
|
62
|
-
* @example
|
|
63
|
-
* ```typescript
|
|
64
|
-
* const path = '/storage/weather-sensor/2024-01-15_14-30-00.json'
|
|
65
|
-
* const data = await storage.retrieve(path)
|
|
66
|
-
* const json = JSON.parse(data.toString())
|
|
67
|
-
* ```
|
|
68
|
-
*/
|
|
69
|
-
abstract retrieve(path: string): Promise<Buffer>;
|
|
70
|
-
/**
|
|
71
|
-
* Removes stored data permanently.
|
|
72
|
-
*
|
|
73
|
-
* Deletes the data associated with the given storage identifier.
|
|
74
|
-
*
|
|
75
|
-
* @abstract
|
|
76
|
-
* @param {string} path - Storage identifier from save() operation
|
|
77
|
-
* @returns {Promise<void>}
|
|
78
|
-
* @throws {Error} When deletion fails or path doesn't exist
|
|
79
|
-
*
|
|
80
|
-
* @example
|
|
81
|
-
* ```typescript
|
|
82
|
-
* const path = '/storage/weather-sensor/old-data.json'
|
|
83
|
-
* await storage.delete(path)
|
|
84
|
-
* ```
|
|
85
|
-
*/
|
|
86
|
-
abstract delete(path: string): Promise<void>;
|
|
87
|
-
/**
|
|
88
|
-
* Persists binary data at a specific path (no auto-generated filename).
|
|
89
|
-
*
|
|
90
|
-
* Unlike save(), this method stores the file at the exact path specified,
|
|
91
|
-
* preserving the original filename and directory structure.
|
|
92
|
-
* Useful for extracting archives where file paths must be preserved.
|
|
93
|
-
*
|
|
94
|
-
* @param {Buffer} buffer - Binary data to store
|
|
95
|
-
* @param {string} relativePath - Full relative path including filename (e.g., 'tilesets/123/tileset.json')
|
|
96
|
-
* @returns {Promise<string>} The same path that was provided (for consistency)
|
|
97
|
-
* @throws {Error} When storage operation fails
|
|
98
|
-
*
|
|
99
|
-
* @example
|
|
100
|
-
* ```typescript
|
|
101
|
-
* const buffer = Buffer.from('{"asset": {"version": "1.0"}}')
|
|
102
|
-
* const path = await storage.saveWithPath(buffer, 'tilesets/123/tileset.json')
|
|
103
|
-
* // Returns: 'tilesets/123/tileset.json'
|
|
104
|
-
* ```
|
|
105
|
-
*/
|
|
106
|
-
abstract saveWithPath(buffer: Buffer, relativePath: string): Promise<string>;
|
|
107
|
-
/**
|
|
108
|
-
* Deletes multiple files in batch for better performance.
|
|
109
|
-
*
|
|
110
|
-
* Default implementation calls delete() sequentially, but storage backends
|
|
111
|
-
* can override this with optimized bulk delete operations (e.g., S3 DeleteObjects).
|
|
112
|
-
*
|
|
113
|
-
* @param {string[]} paths - Array of storage identifiers to delete
|
|
114
|
-
* @returns {Promise<void>}
|
|
115
|
-
*
|
|
116
|
-
* @example
|
|
117
|
-
* ```typescript
|
|
118
|
-
* await storage.deleteBatch([
|
|
119
|
-
* 'tilesets/123/tileset.json',
|
|
120
|
-
* 'tilesets/123/tile_0.b3dm',
|
|
121
|
-
* 'tilesets/123/tile_1.b3dm'
|
|
122
|
-
* ])
|
|
123
|
-
* ```
|
|
124
|
-
*/
|
|
125
|
-
deleteBatch(paths: string[]): Promise<void>;
|
|
126
|
-
/**
|
|
127
|
-
* Returns the public URL for a stored file.
|
|
128
|
-
*
|
|
129
|
-
* For cloud storage (S3, OVH, Azure), this returns the direct HTTP URL.
|
|
130
|
-
* For local storage, this may return a relative path or throw an error.
|
|
131
|
-
*
|
|
132
|
-
* @abstract
|
|
133
|
-
* @param {string} relativePath - The storage path/key of the file
|
|
134
|
-
* @returns {string} The public URL to access the file directly
|
|
135
|
-
*
|
|
136
|
-
* @example
|
|
137
|
-
* ```typescript
|
|
138
|
-
* const url = storage.getPublicUrl('tilesets/123/tileset.json')
|
|
139
|
-
* // Returns: 'https://bucket.s3.region.cloud.ovh.net/tilesets/123/tileset.json'
|
|
140
|
-
* ```
|
|
141
|
-
*/
|
|
142
|
-
abstract getPublicUrl(relativePath: string): string;
|
|
143
|
-
/**
|
|
144
|
-
* Deletes all files under a given prefix/folder.
|
|
145
|
-
*
|
|
146
|
-
* This is more efficient than deleteBatch() when you don't know all file paths,
|
|
147
|
-
* as it lists objects by prefix and deletes them in bulk.
|
|
148
|
-
* Useful for deleting entire tilesets or component data.
|
|
149
|
-
*
|
|
150
|
-
* @abstract
|
|
151
|
-
* @param {string} prefix - The folder/prefix to delete (e.g., 'tilesets/123')
|
|
152
|
-
* @returns {Promise<number>} Number of files deleted
|
|
153
|
-
*
|
|
154
|
-
* @example
|
|
155
|
-
* ```typescript
|
|
156
|
-
* const count = await storage.deleteByPrefix('tilesets/123')
|
|
157
|
-
* // Deletes all files starting with 'tilesets/123/'
|
|
158
|
-
* console.log(`Deleted ${count} files`)
|
|
159
|
-
* ```
|
|
160
|
-
*/
|
|
161
|
-
abstract deleteByPrefix(prefix: string): Promise<number>;
|
|
162
|
-
}
|
|
163
|
-
//# sourceMappingURL=storage_service.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"storage_service.d.ts","sourceRoot":"","sources":["../../src/storage/storage_service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,8BAAsB,cAAc;IAChC;;;;;;;;;;;;;;;;;;;OAmBG;IACH,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAEzF;;;;;;;;;;;;;;;;OAgBG;IACH,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAEhD;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAE5C;;;;;;;;;;;;;;;;;;OAkBG;IACH,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAE5E;;;;;;;;;;;;;;;;;OAiBG;IACG,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjD;;;;;;;;;;;;;;;OAeG;IACH,QAAQ,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM;IAEnD;;;;;;;;;;;;;;;;;OAiBG;IACH,QAAQ,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAC3D"}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Abstract base class for storage service implementations.
|
|
3
|
-
*
|
|
4
|
-
* Defines the contract for persisting and retrieving binary data in the Digital Twin framework.
|
|
5
|
-
* Concrete implementations provide storage backends like local filesystem, AWS S3, Azure Blob, etc.
|
|
6
|
-
*
|
|
7
|
-
* @abstract
|
|
8
|
-
* @class StorageService
|
|
9
|
-
*
|
|
10
|
-
* @example
|
|
11
|
-
* ```typescript
|
|
12
|
-
* // Implement for specific storage backend
|
|
13
|
-
* class S3StorageService extends StorageService {
|
|
14
|
-
* async save(buffer: Buffer, collectorName: string, extension?: string): Promise<string> {
|
|
15
|
-
* // Upload to S3 bucket
|
|
16
|
-
* return 's3://bucket/path/to/file'
|
|
17
|
-
* }
|
|
18
|
-
*
|
|
19
|
-
* async retrieve(path: string): Promise<Buffer> {
|
|
20
|
-
* // Download from S3
|
|
21
|
-
* return buffer
|
|
22
|
-
* }
|
|
23
|
-
*
|
|
24
|
-
* async delete(path: string): Promise<void> {
|
|
25
|
-
* // Delete from S3
|
|
26
|
-
* }
|
|
27
|
-
* }
|
|
28
|
-
* ```
|
|
29
|
-
*/
|
|
30
|
-
export class StorageService {
|
|
31
|
-
/**
|
|
32
|
-
* Deletes multiple files in batch for better performance.
|
|
33
|
-
*
|
|
34
|
-
* Default implementation calls delete() sequentially, but storage backends
|
|
35
|
-
* can override this with optimized bulk delete operations (e.g., S3 DeleteObjects).
|
|
36
|
-
*
|
|
37
|
-
* @param {string[]} paths - Array of storage identifiers to delete
|
|
38
|
-
* @returns {Promise<void>}
|
|
39
|
-
*
|
|
40
|
-
* @example
|
|
41
|
-
* ```typescript
|
|
42
|
-
* await storage.deleteBatch([
|
|
43
|
-
* 'tilesets/123/tileset.json',
|
|
44
|
-
* 'tilesets/123/tile_0.b3dm',
|
|
45
|
-
* 'tilesets/123/tile_1.b3dm'
|
|
46
|
-
* ])
|
|
47
|
-
* ```
|
|
48
|
-
*/
|
|
49
|
-
async deleteBatch(paths) {
|
|
50
|
-
// Default sequential implementation - subclasses can override with bulk operations
|
|
51
|
-
await Promise.all(paths.map(path => this.delete(path).catch(() => { })));
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
//# sourceMappingURL=storage_service.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"storage_service.js","sourceRoot":"","sources":["../../src/storage/storage_service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,OAAgB,cAAc;IAiFhC;;;;;;;;;;;;;;;;;OAiBG;IACH,KAAK,CAAC,WAAW,CAAC,KAAe;QAC7B,mFAAmF;QACnF,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAC3E,CAAC;CAuCJ"}
|