digitaltwin-core 0.11.2 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/async_upload.d.ts +20 -0
- package/dist/components/async_upload.d.ts.map +1 -0
- package/dist/components/async_upload.js +10 -0
- package/dist/components/async_upload.js.map +1 -0
- package/dist/components/custom_table_manager.d.ts.map +1 -1
- package/dist/components/custom_table_manager.js +16 -14
- package/dist/components/custom_table_manager.js.map +1 -1
- package/dist/components/tileset_manager.d.ts +35 -9
- package/dist/components/tileset_manager.d.ts.map +1 -1
- package/dist/components/tileset_manager.js +233 -84
- package/dist/components/tileset_manager.js.map +1 -1
- package/dist/components/types.d.ts +2 -0
- package/dist/components/types.d.ts.map +1 -1
- package/dist/database/adapters/knex_database_adapter.d.ts.map +1 -1
- package/dist/database/adapters/knex_database_adapter.js +38 -0
- package/dist/database/adapters/knex_database_adapter.js.map +1 -1
- package/dist/engine/digital_twin_engine.d.ts.map +1 -1
- package/dist/engine/digital_twin_engine.js +51 -4
- package/dist/engine/digital_twin_engine.js.map +1 -1
- package/dist/engine/queue_manager.d.ts +8 -0
- package/dist/engine/queue_manager.d.ts.map +1 -1
- package/dist/engine/queue_manager.js +30 -4
- package/dist/engine/queue_manager.js.map +1 -1
- package/dist/engine/upload_processor.d.ts +66 -0
- package/dist/engine/upload_processor.d.ts.map +1 -0
- package/dist/engine/upload_processor.js +142 -0
- package/dist/engine/upload_processor.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/storage/adapters/ovh_storage_service.d.ts +6 -0
- package/dist/storage/adapters/ovh_storage_service.d.ts.map +1 -1
- package/dist/storage/adapters/ovh_storage_service.js +32 -1
- package/dist/storage/adapters/ovh_storage_service.js.map +1 -1
- package/dist/storage/storage_service.d.ts +19 -0
- package/dist/storage/storage_service.d.ts.map +1 -1
- package/dist/storage/storage_service.js +22 -0
- package/dist/storage/storage_service.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
// src/engine/upload_processor.ts
|
|
2
|
+
import { Worker } from 'bullmq';
|
|
3
|
+
import { extractAndStoreArchive } from '../utils/zip_utils.js';
|
|
4
|
+
import fs from 'fs/promises';
|
|
5
|
+
/**
|
|
6
|
+
* Processes async upload jobs (tileset extraction, large file processing)
|
|
7
|
+
*
|
|
8
|
+
* This processor handles long-running upload tasks that would otherwise
|
|
9
|
+
* timeout the HTTP request. Jobs are queued and processed in the background.
|
|
10
|
+
*/
|
|
11
|
+
export class UploadProcessor {
|
|
12
|
+
constructor(storage, db) {
|
|
13
|
+
this.worker = null;
|
|
14
|
+
this.storage = storage;
|
|
15
|
+
this.db = db;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Start the upload processor worker
|
|
19
|
+
*/
|
|
20
|
+
start(connection) {
|
|
21
|
+
this.worker = new Worker('dt-uploads', async (job) => {
|
|
22
|
+
return this.processJob(job);
|
|
23
|
+
}, {
|
|
24
|
+
connection,
|
|
25
|
+
concurrency: 2, // Process 2 uploads in parallel
|
|
26
|
+
limiter: {
|
|
27
|
+
max: 5,
|
|
28
|
+
duration: 60000 // Max 5 jobs per minute to avoid overwhelming OVH
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
this.worker.on('completed', job => {
|
|
32
|
+
console.log(`[UploadProcessor] Job ${job.id} completed`);
|
|
33
|
+
});
|
|
34
|
+
this.worker.on('failed', (job, err) => {
|
|
35
|
+
console.error(`[UploadProcessor] Job ${job?.id} failed:`, err.message);
|
|
36
|
+
});
|
|
37
|
+
this.worker.on('progress', (job, progress) => {
|
|
38
|
+
console.log(`[UploadProcessor] Job ${job.id} progress: ${progress}%`);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Stop the worker gracefully
|
|
43
|
+
*/
|
|
44
|
+
async stop() {
|
|
45
|
+
if (this.worker) {
|
|
46
|
+
await this.worker.close();
|
|
47
|
+
this.worker = null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Process a single upload job
|
|
52
|
+
*/
|
|
53
|
+
async processJob(job) {
|
|
54
|
+
const { data } = job;
|
|
55
|
+
if (data.type === 'tileset') {
|
|
56
|
+
await this.processTilesetUpload(job);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
throw new Error(`Unknown upload job type: ${data.type}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Process tileset upload: extract ZIP and upload files to storage
|
|
64
|
+
*/
|
|
65
|
+
async processTilesetUpload(job) {
|
|
66
|
+
const { recordId, tempFilePath, componentName } = job.data;
|
|
67
|
+
try {
|
|
68
|
+
// Update status to processing
|
|
69
|
+
await this.updateRecordStatus(recordId, componentName, 'processing');
|
|
70
|
+
await job.updateProgress(10);
|
|
71
|
+
// Read ZIP file
|
|
72
|
+
let zipBuffer;
|
|
73
|
+
try {
|
|
74
|
+
zipBuffer = await fs.readFile(tempFilePath);
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
throw new Error(`Failed to read temp file: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
78
|
+
}
|
|
79
|
+
await job.updateProgress(20);
|
|
80
|
+
// Generate unique ID for this tileset
|
|
81
|
+
const tilesetId = Date.now().toString();
|
|
82
|
+
const basePath = `${componentName}/${tilesetId}`;
|
|
83
|
+
// Extract and store all files
|
|
84
|
+
const extractResult = await extractAndStoreArchive(zipBuffer, this.storage, basePath);
|
|
85
|
+
await job.updateProgress(80);
|
|
86
|
+
// Validate tileset.json was found
|
|
87
|
+
if (!extractResult.root_file) {
|
|
88
|
+
// Clean up stored files using batch delete
|
|
89
|
+
if (extractResult.files.length > 0) {
|
|
90
|
+
const filePaths = extractResult.files.map(file => file.path);
|
|
91
|
+
await this.storage.deleteBatch(filePaths);
|
|
92
|
+
}
|
|
93
|
+
throw new Error('Invalid tileset: no tileset.json found in the ZIP archive');
|
|
94
|
+
}
|
|
95
|
+
// Update database record with results
|
|
96
|
+
await this.updateRecordComplete(recordId, componentName, {
|
|
97
|
+
url: basePath,
|
|
98
|
+
file_index: {
|
|
99
|
+
files: extractResult.files,
|
|
100
|
+
root_file: extractResult.root_file
|
|
101
|
+
},
|
|
102
|
+
status: 'completed'
|
|
103
|
+
});
|
|
104
|
+
await job.updateProgress(90);
|
|
105
|
+
// Clean up temp file
|
|
106
|
+
await fs.unlink(tempFilePath).catch(() => { });
|
|
107
|
+
await job.updateProgress(100);
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
// Update status to failed
|
|
111
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
|
112
|
+
await this.updateRecordStatus(recordId, componentName, 'failed', errorMessage);
|
|
113
|
+
// Clean up temp file even on error
|
|
114
|
+
await fs.unlink(tempFilePath).catch(() => { });
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Update record status in database
|
|
120
|
+
*/
|
|
121
|
+
async updateRecordStatus(id, tableName, status, errorMessage) {
|
|
122
|
+
const updateData = {
|
|
123
|
+
upload_status: status,
|
|
124
|
+
updated_at: new Date()
|
|
125
|
+
};
|
|
126
|
+
if (errorMessage) {
|
|
127
|
+
updateData.upload_error = errorMessage;
|
|
128
|
+
}
|
|
129
|
+
await this.db.updateById(tableName, id, updateData);
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Update record with completion data
|
|
133
|
+
*/
|
|
134
|
+
async updateRecordComplete(id, tableName, data) {
|
|
135
|
+
await this.db.updateById(tableName, id, {
|
|
136
|
+
...data,
|
|
137
|
+
upload_status: 'completed',
|
|
138
|
+
updated_at: new Date()
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=upload_processor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload_processor.js","sourceRoot":"","sources":["../../src/engine/upload_processor.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -23,6 +23,7 @@ export { AssetsManager } from './components/assets_manager.js';
|
|
|
23
23
|
export { GlobalAssetsHandler } from './components/global_assets_handler.js';
|
|
24
24
|
export { CustomTableManager, type CustomTableRecord, type QueryValidationOptions } from './components/custom_table_manager.js';
|
|
25
25
|
export { TilesetManager } from './components/tileset_manager.js';
|
|
26
|
+
export { type AsyncUploadable, isAsyncUploadable } from './components/async_upload.js';
|
|
26
27
|
export { StorageService } from './storage/storage_service.js';
|
|
27
28
|
export { LocalStorageService } from './storage/adapters/local_storage_service.js';
|
|
28
29
|
export { OvhS3StorageService } from './storage/adapters/ovh_storage_service.js';
|
|
@@ -39,6 +40,7 @@ export { servableEndpoint } from './utils/servable_endpoint.js';
|
|
|
39
40
|
export { HttpStatus, jsonResponse, successResponse, errorResponse, badRequestResponse, unauthorizedResponse, forbiddenResponse, notFoundResponse, textResponse, fileResponse, multiStatusResponse } from './utils/http_responses.js';
|
|
40
41
|
export type { HttpStatusCode } from './utils/http_responses.js';
|
|
41
42
|
export { QueueManager } from './engine/queue_manager.js';
|
|
43
|
+
export { UploadProcessor, type TilesetUploadJobData, type UploadJobData, type UploadStatus } from './engine/upload_processor.js';
|
|
42
44
|
export { initializeComponents } from './engine/initializer.js';
|
|
43
45
|
export * from './engine/events.js';
|
|
44
46
|
export * from './engine/endpoints.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAGnE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAA;AAC3E,OAAO,EACH,kBAAkB,EAClB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC9B,MAAM,sCAAsC,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAGnE,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAA;AAC3E,OAAO,EACH,kBAAkB,EAClB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC9B,MAAM,sCAAsC,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAChE,OAAO,EAAE,KAAK,eAAe,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAGtF,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAA;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,2CAA2C,CAAA;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AAGpE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,8CAA8C,CAAA;AAGlH,cAAc,uBAAuB,CAAA;AACrC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,wBAAwB,CAAA;AAGtC,cAAc,iBAAiB,CAAA;AAG/B,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAC/D,OAAO,EACH,UAAU,EACV,YAAY,EACZ,eAAe,EACf,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACtB,MAAM,2BAA2B,CAAA;AAClC,YAAY,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAG/D,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,EACH,eAAe,EACf,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAClB,KAAK,YAAY,EACpB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAC9D,cAAc,oBAAoB,CAAA;AAClC,cAAc,uBAAuB,CAAA;AAGrC,cAAc,oBAAoB,CAAA;AAElC,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -25,6 +25,7 @@ export { AssetsManager } from './components/assets_manager.js';
|
|
|
25
25
|
export { GlobalAssetsHandler } from './components/global_assets_handler.js';
|
|
26
26
|
export { CustomTableManager } from './components/custom_table_manager.js';
|
|
27
27
|
export { TilesetManager } from './components/tileset_manager.js';
|
|
28
|
+
export { isAsyncUploadable } from './components/async_upload.js';
|
|
28
29
|
// Storage Services
|
|
29
30
|
export { StorageService } from './storage/storage_service.js';
|
|
30
31
|
export { LocalStorageService } from './storage/adapters/local_storage_service.js';
|
|
@@ -46,6 +47,7 @@ export { servableEndpoint } from './utils/servable_endpoint.js';
|
|
|
46
47
|
export { HttpStatus, jsonResponse, successResponse, errorResponse, badRequestResponse, unauthorizedResponse, forbiddenResponse, notFoundResponse, textResponse, fileResponse, multiStatusResponse } from './utils/http_responses.js';
|
|
47
48
|
// Engine Components
|
|
48
49
|
export { QueueManager } from './engine/queue_manager.js';
|
|
50
|
+
export { UploadProcessor } from './engine/upload_processor.js';
|
|
49
51
|
export { initializeComponents } from './engine/initializer.js';
|
|
50
52
|
export * from './engine/events.js';
|
|
51
53
|
export * from './engine/endpoints.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,cAAc;AACd,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAEnE,kBAAkB;AAClB,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAA;AAC3E,OAAO,EACH,kBAAkB,EAGrB,MAAM,sCAAsC,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,cAAc;AACd,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAEnE,kBAAkB;AAClB,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAA;AAC3E,OAAO,EACH,kBAAkB,EAGrB,MAAM,sCAAsC,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAChE,OAAO,EAAwB,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAEtF,mBAAmB;AACnB,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAA;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,2CAA2C,CAAA;AAC/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AAEpE,oBAAoB;AACpB,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,EAAE,mBAAmB,EAAkC,MAAM,8CAA8C,CAAA;AAElH,uBAAuB;AACvB,cAAc,uBAAuB,CAAA;AACrC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,wBAAwB,CAAA;AAEtC,iBAAiB;AACjB,cAAc,iBAAiB,CAAA;AAE/B,YAAY;AACZ,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAC/D,OAAO,EACH,UAAU,EACV,YAAY,EACZ,eAAe,EACf,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACtB,MAAM,2BAA2B,CAAA;AAGlC,oBAAoB;AACpB,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACxD,OAAO,EACH,eAAe,EAIlB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAC9D,cAAc,oBAAoB,CAAA;AAClC,cAAc,uBAAuB,CAAA;AAErC,mCAAmC;AACnC,cAAc,oBAAoB,CAAA;AAElC,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAA"}
|
|
@@ -36,5 +36,11 @@ export declare class OvhS3StorageService extends StorageService {
|
|
|
36
36
|
* @returns The same relative path that was provided
|
|
37
37
|
*/
|
|
38
38
|
saveWithPath(buffer: Buffer, relativePath: string): Promise<string>;
|
|
39
|
+
/**
|
|
40
|
+
* Deletes multiple objects in batch using S3 DeleteObjects API.
|
|
41
|
+
* Much faster than individual deletes - can delete up to 1000 objects per request.
|
|
42
|
+
* @param paths - Array of object keys to delete
|
|
43
|
+
*/
|
|
44
|
+
deleteBatch(paths: string[]): Promise<void>;
|
|
39
45
|
}
|
|
40
46
|
//# sourceMappingURL=ovh_storage_service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ovh_storage_service.d.ts","sourceRoot":"","sources":["../../../src/storage/adapters/ovh_storage_service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ovh_storage_service.d.ts","sourceRoot":"","sources":["../../../src/storage/adapters/ovh_storage_service.ts"],"names":[],"mappings":"AAWA,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;;gBAIvC,MAAM,EAAE,WAAW;IAc/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;;;;;;OAMG;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;CAkCpD"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* OVH Object Storage implementation of StorageService
|
|
3
3
|
* via S3-compatible API using @aws-sdk/client-s3
|
|
4
4
|
*/
|
|
5
|
-
import { S3Client, PutObjectCommand, GetObjectCommand, DeleteObjectCommand } from '@aws-sdk/client-s3';
|
|
5
|
+
import { S3Client, PutObjectCommand, GetObjectCommand, DeleteObjectCommand, DeleteObjectsCommand } from '@aws-sdk/client-s3';
|
|
6
6
|
import { StorageService } from '../storage_service.js';
|
|
7
7
|
export class OvhS3StorageService extends StorageService {
|
|
8
8
|
#s3;
|
|
@@ -82,5 +82,36 @@ export class OvhS3StorageService extends StorageService {
|
|
|
82
82
|
}));
|
|
83
83
|
return relativePath;
|
|
84
84
|
}
|
|
85
|
+
/**
|
|
86
|
+
* Deletes multiple objects in batch using S3 DeleteObjects API.
|
|
87
|
+
* Much faster than individual deletes - can delete up to 1000 objects per request.
|
|
88
|
+
* @param paths - Array of object keys to delete
|
|
89
|
+
*/
|
|
90
|
+
async deleteBatch(paths) {
|
|
91
|
+
if (paths.length === 0)
|
|
92
|
+
return;
|
|
93
|
+
// S3 DeleteObjects supports max 1000 objects per request
|
|
94
|
+
const BATCH_SIZE = 1000;
|
|
95
|
+
const batches = [];
|
|
96
|
+
for (let i = 0; i < paths.length; i += BATCH_SIZE) {
|
|
97
|
+
batches.push(paths.slice(i, i + BATCH_SIZE));
|
|
98
|
+
}
|
|
99
|
+
// Process batches in parallel (but limit concurrency to avoid overwhelming the API)
|
|
100
|
+
const MAX_CONCURRENT = 5;
|
|
101
|
+
for (let i = 0; i < batches.length; i += MAX_CONCURRENT) {
|
|
102
|
+
const concurrentBatches = batches.slice(i, i + MAX_CONCURRENT);
|
|
103
|
+
await Promise.all(concurrentBatches.map(batch => this.#s3
|
|
104
|
+
.send(new DeleteObjectsCommand({
|
|
105
|
+
Bucket: this.#bucket,
|
|
106
|
+
Delete: {
|
|
107
|
+
Objects: batch.map(key => ({ Key: key })),
|
|
108
|
+
Quiet: true // Don't return info about each deleted object
|
|
109
|
+
}
|
|
110
|
+
}))
|
|
111
|
+
.catch(() => {
|
|
112
|
+
// Ignore batch delete errors - files may already be deleted
|
|
113
|
+
})));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
85
116
|
}
|
|
86
117
|
//# sourceMappingURL=ovh_storage_service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ovh_storage_service.js","sourceRoot":"","sources":["../../../src/storage/adapters/ovh_storage_service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,
|
|
1
|
+
{"version":3,"file":"ovh_storage_service.js","sourceRoot":"","sources":["../../../src/storage/adapters/ovh_storage_service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EACH,QAAQ,EACR,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACvB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAWtD,MAAM,OAAO,mBAAoB,SAAQ,cAAc;IACnD,GAAG,CAAU;IACJ,OAAO,CAAQ;IAExB,YAAY,MAAmB;QAC3B,KAAK,EAAE,CAAA;QACP,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAA;QAC5B,IAAI,CAAC,GAAG,GAAG,IAAI,QAAQ,CAAC;YACpB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,KAAK;YAC9B,WAAW,EAAE;gBACT,WAAW,EAAE,MAAM,CAAC,SAAS;gBAC7B,eAAe,EAAE,MAAM,CAAC,SAAS;aACpC;YACD,cAAc,EAAE,KAAK;SACxB,CAAC,CAAA;IACN,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,IAAI,CAAC,MAAc,EAAE,aAAqB,EAAE,SAAkB;QAChE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;QACtB,MAAM,SAAS,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;QACzD,MAAM,GAAG,GAAG,GAAG,aAAa,IAAI,SAAS,IAAI,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAA;QAE3F,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CACf,IAAI,gBAAgB,CAAC;YACjB,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,GAAG,EAAE,GAAG;YACR,IAAI,EAAE,MAAM;YACZ,GAAG,EAAE,SAAS;SACjB,CAAC,CACL,CAAA;QAED,OAAO,GAAG,CAAA;IACd,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,YAAoB;QAC/B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAC3B,IAAI,gBAAgB,CAAC;YACjB,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,GAAG,EAAE,YAAY;SACpB,CAAC,CACL,CAAA;QAED,MAAM,MAAM,GAAa,EAAE,CAAA;QAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,IAAgB,CAAA;QAEnC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;QACnC,CAAC;QAED,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAChC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM,CAAC,YAAoB;QAC7B,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CACf,IAAI,mBAAmB,CAAC;YACpB,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,GAAG,EAAE,YAAY;SACpB,CAAC,CACL,CAAA;IACL,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,YAAY,CAAC,MAAc,EAAE,YAAoB;QACnD,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CACf,IAAI,gBAAgB,CAAC;YACjB,MAAM,EAAE,IAAI,CAAC,OAAO;YACpB,GAAG,EAAE,YAAY;YACjB,IAAI,EAAE,MAAM;YACZ,GAAG,EAAE,SAAS;SACjB,CAAC,CACL,CAAA;QAED,OAAO,YAAY,CAAA;IACvB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,WAAW,CAAC,KAAe;QAC7B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QAE9B,yDAAyD;QACzD,MAAM,UAAU,GAAG,IAAI,CAAA;QACvB,MAAM,OAAO,GAAe,EAAE,CAAA;QAE9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,UAAU,EAAE,CAAC;YAChD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC,CAAA;QAChD,CAAC;QAED,oFAAoF;QACpF,MAAM,cAAc,GAAG,CAAC,CAAA;QACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,cAAc,EAAE,CAAC;YACtD,MAAM,iBAAiB,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,CAAA;YAC9D,MAAM,OAAO,CAAC,GAAG,CACb,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAC1B,IAAI,CAAC,GAAG;iBACH,IAAI,CACD,IAAI,oBAAoB,CAAC;gBACrB,MAAM,EAAE,IAAI,CAAC,OAAO;gBACpB,MAAM,EAAE;oBACJ,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;oBACzC,KAAK,EAAE,IAAI,CAAC,8CAA8C;iBAC7D;aACJ,CAAC,CACL;iBACA,KAAK,CAAC,GAAG,EAAE;gBACR,4DAA4D;YAChE,CAAC,CAAC,CACT,CACJ,CAAA;QACL,CAAC;IACL,CAAC;CACJ"}
|
|
@@ -104,5 +104,24 @@ export declare abstract class StorageService {
|
|
|
104
104
|
* ```
|
|
105
105
|
*/
|
|
106
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>;
|
|
107
126
|
}
|
|
108
127
|
//# sourceMappingURL=storage_service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
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;CAIpD"}
|
|
@@ -28,5 +28,27 @@
|
|
|
28
28
|
* ```
|
|
29
29
|
*/
|
|
30
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
|
+
}
|
|
31
53
|
}
|
|
32
54
|
//# sourceMappingURL=storage_service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage_service.js","sourceRoot":"","sources":["../../src/storage/storage_service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,OAAgB,cAAc;
|
|
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;CACJ"}
|